diff options
1274 files changed, 172706 insertions, 44887 deletions
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index e7e88e95d7..7ac048b24a 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -15,6 +15,7 @@ SCsub @godotengine/buildsystem /core/ @godotengine/core /core/crypto/ @godotengine/network /core/debugger/ @godotengine/debugger +/core/extension/ @godotengine/gdextension /core/input/ @godotengine/input # Doc @@ -110,11 +111,9 @@ doc_classes/* @godotengine/documentation /modules/xatlas_unwrap/ @godotengine/rendering ## Scripting -/modules/gdnative/ @godotengine/gdnative /modules/gdscript/ @godotengine/gdscript /modules/jsonrpc/ @godotengine/gdscript -/modules/mono/ @godotengine/mono -/modules/visual_script/ @godotengine/visualscript +/modules/mono/ @godotengine/dotnet ## Text /modules/freetype/ @godotengine/buildsystem diff --git a/.github/actions/godot-build/action.yml b/.github/actions/godot-build/action.yml index 75f3d9ab37..377480b123 100644 --- a/.github/actions/godot-build/action.yml +++ b/.github/actions/godot-build/action.yml @@ -2,16 +2,13 @@ name: Build Godot description: Build Godot with the provided options. inputs: target: - description: The scons target (debug/release_debug/release). - default: "debug" - tools: - description: If tools are to be built. - default: false + description: Build target (editor, template_release, template_debug). + default: "editor" tests: - description: If tests are to be built. + description: Unit tests. default: false platform: - description: The Godot platform to build. + description: Target platform. required: false sconsflags: default: "" @@ -33,7 +30,7 @@ runs: SCONS_CACHE: ${{ inputs.scons-cache }} SCONS_CACHE_LIMIT: ${{ inputs.scons-cache-limit }} run: | - echo "Building with flags:" ${{ env.SCONSFLAGS }} - if ! ${{ inputs.tools }}; then rm -rf editor; fi # Ensure we don't include editor code. - scons p=${{ inputs.platform }} target=${{ inputs.target }} tools=${{ inputs.tools }} tests=${{ inputs.tests }} ${{ env.SCONSFLAGS }} + echo "Building with flags:" platform=${{ inputs.platform }} target=${{ inputs.target }} tests=${{ inputs.tests }} ${{ env.SCONSFLAGS }} + if [ "${{ inputs.target }}" != "editor" ]; then rm -rf editor; fi # Ensure we don't include editor code. + scons platform=${{ inputs.platform }} target=${{ inputs.target }} tests=${{ inputs.tests }} ${{ env.SCONSFLAGS }} ls -l bin/ diff --git a/.github/workflows/android_builds.yml b/.github/workflows/android_builds.yml index 4f54f6629e..ed4ef01012 100644 --- a/.github/workflows/android_builds.yml +++ b/.github/workflows/android_builds.yml @@ -14,7 +14,7 @@ concurrency: jobs: android-template: runs-on: "ubuntu-20.04" - name: Template (target=release, tools=no) + name: Template (target=template_release) steps: - uses: actions/checkout@v3 @@ -44,8 +44,7 @@ jobs: with: sconsflags: ${{ env.SCONSFLAGS }} arch=arm32 platform: android - target: release - tools: false + target: template_release tests: false - name: Compilation (arm64) @@ -53,8 +52,7 @@ jobs: with: sconsflags: ${{ env.SCONSFLAGS }} arch=arm64 platform: android - target: release - tools: false + target: template_release tests: false - name: Generate Godot templates diff --git a/.github/workflows/ios_builds.yml b/.github/workflows/ios_builds.yml index bc00fad569..0ea7a4ccc3 100644 --- a/.github/workflows/ios_builds.yml +++ b/.github/workflows/ios_builds.yml @@ -14,7 +14,7 @@ concurrency: jobs: ios-template: runs-on: "macos-latest" - name: Template (target=release, tools=no) + name: Template (target=template_release) steps: - uses: actions/checkout@v3 @@ -31,8 +31,7 @@ jobs: with: sconsflags: ${{ env.SCONSFLAGS }} platform: ios - target: release - tools: false + target: template_release tests: false - name: Upload artifact diff --git a/.github/workflows/linux_builds.yml b/.github/workflows/linux_builds.yml index 2e8bd101e5..b0ed71a7b5 100644 --- a/.github/workflows/linux_builds.yml +++ b/.github/workflows/linux_builds.yml @@ -7,7 +7,7 @@ env: GODOT_BASE_BRANCH: master SCONSFLAGS: verbose=yes warnings=extra werror=yes module_text_server_fb_enabled=yes DOTNET_NOLOGO: true - DOTNET_CLI_TELEMETRY_OPTOUT: false + DOTNET_CLI_TELEMETRY_OPTOUT: true concurrency: group: ci-${{github.actor}}-${{github.head_ref || github.run_number}}-${{github.ref}}-linux @@ -21,57 +21,52 @@ jobs: fail-fast: false matrix: include: - - name: Editor w Mono (target=release_debug, tools=yes, tests=yes) + - name: Editor w/ Mono (target=editor) cache-name: linux-editor-mono - target: release_debug - tools: true + target: editor tests: false # Disabled due freeze caused by mix Mono build and CI sconsflags: module_mono_enabled=yes doc-test: true - bin: "./bin/godot.linuxbsd.opt.tools.x86_64.mono" + bin: "./bin/godot.linuxbsd.editor.x86_64.mono" build-mono: true proj-conv: true artifact: true - - name: Editor with doubles and GCC sanitizers (target=debug, tools=yes, float=64, tests=yes, use_asan=yes, use_ubsan=yes, linker=gold) + - name: Editor with doubles and GCC sanitizers (target=editor, tests=yes, dev_build=yes, float=64, use_asan=yes, use_ubsan=yes, linker=gold) cache-name: linux-editor-double-sanitizers - target: debug - tools: true + target: editor tests: true - sconsflags: float=64 use_asan=yes use_ubsan=yes linker=gold + sconsflags: dev_build=yes float=64 use_asan=yes use_ubsan=yes linker=gold proj-test: true # 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: true - bin: "./bin/godot.linuxbsd.double.tools.x86_64.san" + bin: "./bin/godot.linuxbsd.editor.dev.double.x86_64.san" build-mono: false # Skip 2GiB artifact speeding up action. artifact: false - - name: Editor with clang sanitizers (target=debug, tools=yes, use_asan=yes, use_ubsan=yes, use_llvm=yes, linker=lld) + - name: Editor with clang sanitizers (target=editor, tests=yes, dev_build=yes, use_asan=yes, use_ubsan=yes, use_llvm=yes, linker=lld) cache-name: linux-editor-llvm-sanitizers - target: debug - tools: true + target: editor tests: true - sconsflags: use_asan=yes use_ubsan=yes use_llvm=yes linker=lld - bin: "./bin/godot.linuxbsd.tools.x86_64.llvm.san" + 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" build-mono: false # Skip 2GiB artifact speeding up action. artifact: false - - name: Template w/ Mono (target=release, tools=no) + - name: Template w/ Mono (target=template_release) cache-name: linux-template-mono - target: release - tools: false + target: template_release tests: false - sconsflags: module_mono_enabled=yes debug_symbols=no + sconsflags: module_mono_enabled=yes build-mono: false artifact: true - - name: Minimal Template (target=release, tools=no, everything disabled) + - name: Minimal template (target=template_release, everything disabled) cache-name: linux-template-minimal - target: release - tools: false + target: template_release tests: false sconsflags: modules_enabled_by_default=no disable_3d=yes disable_advanced_gui=yes deprecated=no minizip=no artifact: true @@ -113,7 +108,6 @@ jobs: sconsflags: ${{ env.SCONSFLAGS }} ${{ matrix.sconsflags }} platform: linuxbsd target: ${{ matrix.target }} - tools: ${{ matrix.tools }} tests: ${{ matrix.tests }} - name: Generate C# glue @@ -221,7 +215,7 @@ jobs: if: ${{ matrix.godot-cpp-test }} run: | cd godot-cpp/test - scons target=${{ matrix.target }} + scons target=debug cd ../.. - name: Prepare artifact diff --git a/.github/workflows/macos_builds.yml b/.github/workflows/macos_builds.yml index be1fb8de85..dd3db3270b 100644 --- a/.github/workflows/macos_builds.yml +++ b/.github/workflows/macos_builds.yml @@ -19,17 +19,15 @@ jobs: fail-fast: false matrix: include: - - name: Editor (target=release_debug, tools=yes, tests=yes) + - name: Editor (target=editor, tests=yes) cache-name: macos-editor - target: release_debug - tools: true + target: editor tests: true - bin: "./bin/godot.macos.opt.tools.x86_64" + bin: "./bin/godot.macos.editor.x86_64" - - name: Template (target=release, tools=no) + - name: Template (target=template_release) cache-name: macos-template - target: release - tools: false + target: template_release tests: false sconsflags: debug_symbols=no @@ -55,7 +53,6 @@ jobs: sconsflags: ${{ env.SCONSFLAGS }} platform: macos target: ${{ matrix.target }} - tools: ${{ matrix.tools }} tests: ${{ matrix.tests }} # Execute unit tests for the editor diff --git a/.github/workflows/static_checks.yml b/.github/workflows/static_checks.yml index 5b4de06e9e..d8951ddb78 100644 --- a/.github/workflows/static_checks.yml +++ b/.github/workflows/static_checks.yml @@ -27,7 +27,7 @@ jobs: sudo apt-get install -qq dos2unix recode clang-format-13 libxml2-utils python3-pip moreutils sudo update-alternatives --remove-all clang-format || true sudo update-alternatives --install /usr/bin/clang-format clang-format /usr/bin/clang-format-13 100 - sudo pip3 install black==22.3.0 pygments pytest + sudo pip3 install black==22.3.0 pygments pytest==7.1.2 mypy==0.971 - name: File formatting checks (file_format.sh) run: | @@ -41,6 +41,10 @@ jobs: run: | bash ./misc/scripts/black_format.sh + - name: Python scripts static analysis (mypy_check.sh) + run: | + bash ./misc/scripts/mypy_check.sh + - name: Python builders checks via pytest (pytest_builders.sh) run: | bash ./misc/scripts/pytest_builders.sh diff --git a/.github/workflows/web_builds.yml b/.github/workflows/web_builds.yml index b3fb87ed7e..f684b838e1 100644 --- a/.github/workflows/web_builds.yml +++ b/.github/workflows/web_builds.yml @@ -6,7 +6,7 @@ env: # Only used for the cache key. Increment version to force clean build. GODOT_BASE_BRANCH: master SCONSFLAGS: verbose=yes warnings=extra werror=yes debug_symbols=no - EM_VERSION: 3.1.20 + EM_VERSION: 3.1.18 EM_CACHE_FOLDER: "emsdk-cache" concurrency: @@ -16,7 +16,7 @@ concurrency: jobs: web-template: runs-on: "ubuntu-20.04" - name: Template (target=release, tools=no) + name: Template (target=template_release) steps: - uses: actions/checkout@v3 @@ -43,8 +43,7 @@ jobs: with: sconsflags: ${{ env.SCONSFLAGS }} platform: web - target: release - tools: false + target: template_release tests: false - name: Upload artifact diff --git a/.github/workflows/windows_builds.yml b/.github/workflows/windows_builds.yml index 9033e1ab1d..b35c811763 100644 --- a/.github/workflows/windows_builds.yml +++ b/.github/workflows/windows_builds.yml @@ -22,19 +22,17 @@ jobs: fail-fast: false matrix: include: - - name: Editor (target=release_debug, tools=yes, tests=yes) + - name: Editor (target=editor, tests=yes) cache-name: windows-editor - target: release_debug - tools: true + target: editor tests: true # Skip debug symbols, they're way too big with MSVC. sconsflags: debug_symbols=no - bin: "./bin/godot.windows.opt.tools.x86_64.exe" + bin: "./bin/godot.windows.editor.x86_64.exe" - - name: Template (target=release, tools=no) + - name: Template (target=template_release, tools=no) cache-name: windows-template - target: release - tools: false + target: template_release tests: false sconsflags: debug_symbols=no @@ -57,7 +55,6 @@ jobs: sconsflags: ${{ env.SCONSFLAGS }} ${{ matrix.sconsflags }} platform: windows target: ${{ matrix.target }} - tools: ${{ matrix.tools }} tests: ${{ matrix.tests }} # Execute unit tests for the editor @@ -102,6 +102,7 @@ Mateo Kuruk Miccino <mateomiccino@gmail.com> Max Hilbrunner <m.hilbrunner@gmail.com> Max Hilbrunner <m.hilbrunner@gmail.com> <mhilbrunner@users.noreply.github.com> Michael Alexsander <michaelalexsander@protonmail.com> +Micky <micheledevita2@gmail.com> <66727710+Mickeon@users.noreply.github.com> Nathan Franke <natfra@pm.me> <nathanwfranke@gmail.com> Nathan Lovato <nathan@gdquest.com> Nathan Warden <nathan@nathanwarden.com> <nathanwardenlee@icloud.com> diff --git a/AUTHORS.md b/AUTHORS.md index a409a1cea5..6f6ac48db2 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -34,6 +34,7 @@ name is available. Alket Rexhepi (alketii) Andrea Catania (AndreaCatania) Andrii Doroshenko (Xrayez) + Andy Maloney (asmaloney) Andy Moss (MillionOstrich) Angad Kambli (angad-k) Anilforextra (AnilBK) @@ -165,9 +166,12 @@ name is available. Max Hilbrunner (mhilbrunner) merumelu Meru Patel (Janglee123) + MewPurPur Michael Alexsander (YeldhamDev) MichaÅ‚ IwaÅ„czuk (iwek7) MichiRecRoom (LikeLakers2) + Micky (Mickeon) + MinusKube Morris "Tabor" Arroad (mortarroad) mrezai Muhammad Huri (CakHuri) @@ -201,6 +205,7 @@ name is available. Raphael2048 Raul Santos (raulsntos) Ray Koopa (RayKoopa) + RedMser Rémi Verschelde (akien-mga) Rhody Lugo (rraallvv) Ricardo Buring (rburing) @@ -31,11 +31,11 @@ generous deed immortalized in the next stable release of Godot Engine. Basically Games Brandon Lamb Bri - Daniel Kaplan Garry Newman Gordon MacPherson Hunter Dickson Isaiah smith + Keepsake Games <https://keepsake.games> Kenney <https://kenney.nl> Kitcat490 Kyle Szklenski @@ -52,7 +52,6 @@ generous deed immortalized in the next stable release of Godot Engine. Andrew Bowen Andrew Dunai anti666 - Chris Bolton Christian Baune Christopher Montesano Christopher Shifflett @@ -63,6 +62,7 @@ generous deed immortalized in the next stable release of Godot Engine. Edward Flick Florian Neumann GameDev.net + Greg M. Krsak Hein-Pieter van Braam Jonah Stich Justin Arnold @@ -90,6 +90,7 @@ generous deed immortalized in the next stable release of Godot Engine. Stephan Lanfermann Steve Thomas Krampl + Tim Yuen Violin Iliev VladimÃr Chvátil @@ -98,6 +99,7 @@ generous deed immortalized in the next stable release of Godot Engine. Acheron Adam Brown albinaask + Allen Pestaluky Arisaka Mayuki Asher Glick Barugon @@ -124,6 +126,7 @@ generous deed immortalized in the next stable release of Godot Engine. Mateo Navarrete Mathieu Matthew Hillier + Mert Kasar Officine Pixel S.n.c. Pedro Silva Retro Village @@ -145,12 +148,14 @@ generous deed immortalized in the next stable release of Godot Engine. Victor Xeno Coliseum + 23BLUENINJA Adam Mill Adam Nakonieczny Adam Nelson Adam Stankiewicz - Adrian Adamiak Alexander Erlemann + Alexandre VALIN + Alexej Kowalew Alex Khayrullin alice gambrell Alo Mis @@ -159,14 +164,12 @@ generous deed immortalized in the next stable release of Godot Engine. Andriy Antanas Paskauskas Antoni Batchelli - Arch Henderson III Arthur S. Muszynski BasicIncomePlz Brandon Hawkinson BrizzleBrip c64cosmin Cameron Connolly - Charles Gray Charlie Whitfield Chris Petrich Chris Serino @@ -174,9 +177,9 @@ generous deed immortalized in the next stable release of Godot Engine. Craig Scarborough Craig Smith Cristopher + CT CzechBlueBear - DagobertDick - Daniel Hernández Alcojor + Daniel Reed Daniel Tebbutt Darrian Little David Thomason @@ -184,38 +187,42 @@ generous deed immortalized in the next stable release of Godot Engine. Dennis Belfrage Dimitri Nüscheler Donn Eddy + Duncan Eric Brand - Eric Churches Eugenio Hugo Salgüero Jáñez Felix Winterhalter flesk foxydevloper Fransiska + FroggEater Gabrielius VaiÅ¡kÅ«nas + Garpur Gary Hulst Geoffroy Warin George Venizelos - gisora GlassBrick GrayDwarf Guilherme Felipe de C. G. da Silva + Guillaume Pham Ngoc Harry Tumber Harvey Fong Heath Hayes Horváth-Lázár Péter Hu Hund Hunter Barabas + ihereou + illuxxium Jaap Marsman Jamal Bencharki James Couzens - Jared Jared White + Jason Yundt Jean-Sébastien Ross Jennifer Wilcox Jesús Chicharro + Jihun Moon Joel Fivat Johnathan Kupferer - John Duplechain John Stinson Josef Stumpfegger Jose Manuel Muñoz Perez @@ -240,6 +247,7 @@ generous deed immortalized in the next stable release of Godot Engine. Liam Smyth LoparPanda Luca Vazzano + LyaaaaaGames MadScientistCarl Marcus Dobler Marcus Richter @@ -255,12 +263,11 @@ generous deed immortalized in the next stable release of Godot Engine. Michael Dürwald Michael Policastro MikadoSC - Mike Barbee nate etan - Nicolás Carrasco Nikita Blizniuk Oliver Dick Oscar Campos + Otis Clark Paul Hocker Paul Von Zimmerman Pedro @@ -286,6 +293,7 @@ generous deed immortalized in the next stable release of Godot Engine. Ryan Breaker Ryan Miller Ryan Scott + "Sage Automatic Systems, LLC" Samuel Hummerstone Samuel Judd schroedinger's possum @@ -311,12 +319,12 @@ generous deed immortalized in the next stable release of Godot Engine. toto bibi Troy Kinsella Turntsnaco + UltyX Valryia Vincent Cloutier VoidPointer Winston Wojciech Chojnacki - xzibiting Yifan Lai Yuancheng Zhang @@ -337,7 +345,6 @@ generous deed immortalized in the next stable release of Godot Engine. Aidan O'Flannagain Aki Mimoto Akio Yamazaki - Alaksandr SuÅ¡a Alan Beauchamp Albert Gyulgazyan Alberto Salazar Muñoz @@ -378,8 +385,8 @@ generous deed immortalized in the next stable release of Godot Engine. Beau Seymour Behzad Ghaffari Benedikt - Ben Ridley Ben Vercammen + Ben Visness Bernd Jänichen Bernhard Werner Bill Thibault @@ -391,7 +398,9 @@ generous deed immortalized in the next stable release of Godot Engine. Bram Brian Brian Ford + Brigham Keys Bronson Zgeb + bugcaptor Burney Waring Caleb Gartner Caleb Makela @@ -412,6 +421,7 @@ generous deed immortalized in the next stable release of Godot Engine. Christoffer Dahlblom Christophe Gagnier Christoph Woinke + codedius Codex404 Cody Parker Conall O @@ -419,7 +429,7 @@ generous deed immortalized in the next stable release of Godot Engine. Corchari Corey W Craig Post - CT + CrispyPin Cullen Canejo cynwav Dakota Watkins @@ -439,8 +449,10 @@ generous deed immortalized in the next stable release of Godot Engine. Dmytro Korchynskyi Dominik Wetzel Don B + Donovan Hutcheon Douglas Plumley Dragontrapper + dragoon Dr Ewan Murray Ducky Duobix @@ -460,6 +472,7 @@ generous deed immortalized in the next stable release of Godot Engine. Erika Sanders Erkki Seppälä Ewan Holmes + EZL games Faisal Alkubaisi Fault Boy fby @@ -470,19 +483,19 @@ generous deed immortalized in the next stable release of Godot Engine. Filip Lundby Frank FrostMarble + fumangy Game Endeavor - Garett Bass Gary Thomas gebba George Marques - Gon Shibayama Green Fox + Gregory Campbell Greyson Richey Grid Grominet - Guillaume Pham Ngoc Guldoman Guo Hongci + Hans Jorgensen Haplo Hayden Foley Heribert Hirth @@ -491,9 +504,11 @@ generous deed immortalized in the next stable release of Godot Engine. Ian Williams IndustrialRobot Inki Crow + Interstice iveks Jacob D Jaguar + JAJAJA JA Jake D Jako Danar James @@ -503,12 +518,12 @@ generous deed immortalized in the next stable release of Godot Engine. James Thomas Jamie Massey Janis Skuja + JanPaul Bergeson Jan Vetulani JARKKO PARVIAINEN Jason Bolton Jason Evans Jason Uechi - Jason Yundt Jeff Hungerford Jeffrey Berube Jennifer Graves @@ -518,8 +533,8 @@ generous deed immortalized in the next stable release of Godot Engine. Joe Hurdle Joe Klemmer John Anders Stav + John Barlex John Bruce - Johnny Deepman Jonas Jonas Arndt Jonas Bernemann @@ -529,19 +544,17 @@ generous deed immortalized in the next stable release of Godot Engine. Jonathan Bieber Jonathan Ellis Jonathan G - Jonathan Turner Jon Oakes Jon Sully Jordan West Jordy Goodridge Jorge Antunes Jose Francisco 'Yiro' Vera Girona - José Gabriel González Joseph Catrambone Josh P + Josh Segall Josh Taylor Joshua Heidrich - Joshua Segall Juanfran Juan Maggi Juan Uys @@ -552,7 +565,6 @@ generous deed immortalized in the next stable release of Godot Engine. Justin Spedding KaDokta Kalydi Balázs - Karol Wojtasiuk (Drakonter) Katsuomi Kobayashi Keedong Park Keegan Scott @@ -566,12 +578,12 @@ generous deed immortalized in the next stable release of Godot Engine. killaQueen Kodera Software Kolandrious - Kquona Kristian Nygaard Jensen KsyTek Games kycho Kyle Burnett Kyle Jacobs + Kyle Szklenski Lasse le Dous Laurent CHEA Laurent Dethoor @@ -589,6 +601,7 @@ generous deed immortalized in the next stable release of Godot Engine. Luigi Renna Luis Gaemperle Luis M + Lukas Komischke Luke Kasz Major Haul Malcolm @@ -605,6 +618,7 @@ generous deed immortalized in the next stable release of Godot Engine. Martin LiÅ¡ka Martin Trbola Martin Zabinski + MatÄ›j Drábek Matt Edwards Matthew Booe Maverick @@ -612,15 +626,15 @@ generous deed immortalized in the next stable release of Godot Engine. Maxime Santerre Maxwell McStuffings + Melchor Morales Melissa Mears Merlyn Morgan-Graham - Mert Kasar Metal Demon 2000 mhilbrunner Michael Michael Haney Michael Morrison - MichaÅ‚ Skwarek + Michal Skwarek Mikael Nordenberg Mikail Freitas Mikayla @@ -628,7 +642,6 @@ generous deed immortalized in the next stable release of Godot Engine. Mike Copley Miss Mitchell J. Wagner - Mitchell White MJacred ModularMind Molinghu @@ -654,6 +667,7 @@ generous deed immortalized in the next stable release of Godot Engine. Nicolò Brigadoi Calamari Nils Nordmark Nima Farid + Noah Shomette Noel Billig Noesis obscuresteel @@ -663,24 +677,31 @@ generous deed immortalized in the next stable release of Godot Engine. oscar1000108 Oscar Domingo Panagiotis Xynos + Parth Patel Pascal Patrick Indermühle Patrickm Patrick Nafarrete Patrick Wuttke Paul Gieske + Paul Mozet PaweÅ‚ Kowal PaweÅ‚ Åyczkowski + Pedro Henrique Martins Garcia Peter Höglund Philip Ludington (MrPhil) Pierre Caye + Pille Pixel Archipel pj Point08 + Portponky Preethi Vaidyanathan PsycHead Puntigames pwab + Quincy Quincy + Quinn Morrison RackBar Dingum Rafa Laguna Ragnar Pettersson @@ -716,10 +737,10 @@ generous deed immortalized in the next stable release of Godot Engine. Sebastian Michailidis SeongWan Kim Sessamekesh - Seth Drebitko SeungJong k Shaidak Shane + Shane Lillie Shane Spoor Silver1063 simdee @@ -736,12 +757,12 @@ generous deed immortalized in the next stable release of Godot Engine. Soheib El-Harrache Solene Waked Sophie Winter - Space Hedgehog Sparky Squidgy Squirrel Stéphane Roussel Stephen Rice + Stephen Schlie Steven Drovie summerblind Sung soo Choi @@ -751,7 +772,6 @@ generous deed immortalized in the next stable release of Godot Engine. Tarch Techwizz Terry - The Domis4 Theodore Lindsey TheVoiceInMyHead TheWint @@ -774,22 +794,22 @@ generous deed immortalized in the next stable release of Godot Engine. Tom Webster Torgeir Lilleskog Torsten Crass - TQQQ + travis f w Travis O'Brien Trent Skinner tril zerobyte Tryggve Sollid Turgut Temucin - tweedle + Tweedle Dim Tycho Tyler Stafos Ukko K. - UltyX Uther v01tech Vaida Vaughan Ling VikFro + Vincent Barkmann Vincent Foulon Vitaliy Sapronenko Vi Watch @@ -800,16 +820,13 @@ generous deed immortalized in the next stable release of Godot Engine. William Bodin William Edwards William F Siqueira - Windvis Woonki Moon Wyatt Goodin Xananax Yan Shi - yust - Zach H. Zekim Zher Huei Lee - è•æƒŸå… + ケルベãƒã‚¹ è²´å® å°æ¾ éƒæ™¨ç…œ @@ -73,5 +73,4 @@ for more information. [](https://www.codetriage.com/godotengine/godot) [](https://hosted.weblate.org/engage/godot-engine/?utm_source=widget) -[](https://lgtm.com/projects/g/godotengine/godot/alerts) [](https://www.tickgit.com/browse?repo=github.com/godotengine/godot) diff --git a/SConstruct b/SConstruct index f7504f72e1..646f41839d 100644 --- a/SConstruct +++ b/SConstruct @@ -57,7 +57,7 @@ import glsl_builders import gles3_builders from platform_methods import architectures, architecture_aliases -if methods.get_cmdline_bool("tools", True): +if ARGUMENTS.get("target", "editor") == "editor": _helper_module("editor.editor_builders", "editor/editor_builders.py") _helper_module("editor.template_builders", "editor/template_builders.py") @@ -164,27 +164,33 @@ opts = Variables(customs, ARGUMENTS) # Target build options opts.Add("platform", "Target platform (%s)" % ("|".join(platform_list),), "") opts.Add("p", "Platform (alias for 'platform')", "") -opts.Add(BoolVariable("tools", "Build the tools (a.k.a. the Godot editor)", True)) -opts.Add(EnumVariable("target", "Compilation target", "debug", ("debug", "release_debug", "release"))) +opts.Add(EnumVariable("target", "Compilation target", "editor", ("editor", "template_release", "template_debug"))) opts.Add(EnumVariable("arch", "CPU architecture", "auto", ["auto"] + architectures, architecture_aliases)) -opts.Add(EnumVariable("float", "Floating-point precision", "32", ("32", "64"))) -opts.Add(EnumVariable("optimize", "Optimization type", "speed", ("speed", "size", "none"))) +opts.Add(BoolVariable("dev_build", "Developer build with dev-only debugging code (DEV_ENABLED)", False)) +opts.Add( + EnumVariable( + "optimize", "Optimization level", "speed_trace", ("none", "custom", "debug", "speed", "speed_trace", "size") + ) +) +opts.Add(BoolVariable("debug_symbols", "Build with debugging symbols", True)) +opts.Add(BoolVariable("separate_debug_symbols", "Extract debugging symbols to a separate file", False)) +opts.Add(EnumVariable("lto", "Link-time optimization (production builds)", "none", ("none", "auto", "thin", "full"))) opts.Add(BoolVariable("production", "Set defaults to build Godot for use in production", False)) -opts.Add(EnumVariable("lto", "Link-time optimization (for production buids)", "none", ("none", "thin", "full"))) # Components opts.Add(BoolVariable("deprecated", "Enable compatibility code for deprecated and removed features", True)) +opts.Add(EnumVariable("float", "Floating-point precision", "32", ("32", "64"))) opts.Add(BoolVariable("minizip", "Enable ZIP archive support using minizip", True)) opts.Add(BoolVariable("xaudio2", "Enable the XAudio2 audio driver", False)) opts.Add(BoolVariable("vulkan", "Enable the vulkan video driver", True)) opts.Add(BoolVariable("opengl3", "Enable the OpenGL/GLES3 video driver", True)) 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("custom_modules", "A list of comma-separated directory paths containing custom modules to build.", "") opts.Add(BoolVariable("custom_modules_recursive", "Detect custom modules recursively for each specified path.", True)) -opts.Add(BoolVariable("use_volk", "Use the volk library to load the Vulkan loader dynamically", True)) # Advanced options -opts.Add(BoolVariable("dev", "If yes, alias for verbose=yes warnings=extra werror=yes", False)) +opts.Add(BoolVariable("dev_mode", "Alias for dev options: verbose=yes warnings=extra werror=yes tests=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("compiledb", "Generate compilation DB (`compile_commands.json`) for external tools", False)) @@ -376,23 +382,49 @@ env_base.Prepend(CPPPATH=["#"]) env_base.platform_exporters = platform_exporters env_base.platform_apis = platform_apis -# Build type defines - more platform-specific ones can be in detect.py. -if env_base["target"] == "release_debug" or env_base["target"] == "debug": +# Configuration of build targets: +# - Editor or template +# - Debug features (DEBUG_ENABLED code) +# - Dev only code (DEV_ENABLED code) +# - Optimization level +# - Debug symbols for crash traces / debuggers + +env_base.editor_build = env_base["target"] == "editor" +env_base.dev_build = env_base["dev_build"] +env_base.debug_features = env_base["target"] in ["editor", "template_debug"] + +if env_base.dev_build: + opt_level = "none" +elif env_base.debug_features: + opt_level = "speed_trace" +else: # Release + opt_level = "speed" + +env_base["optimize"] = ARGUMENTS.get("optimize", opt_level) +env_base["debug_symbols"] = methods.get_cmdline_bool("debug_symbols", env_base.dev_build) + +if env_base.editor_build: + env_base.Append(CPPDEFINES=["TOOLS_ENABLED"]) + +if env_base.debug_features: # DEBUG_ENABLED enables debugging *features* and debug-only code, which is intended # to give *users* extra debugging information for their game development. env_base.Append(CPPDEFINES=["DEBUG_ENABLED"]) -if env_base["target"] == "debug": +if env_base.dev_build: # DEV_ENABLED enables *engine developer* code which should only be compiled for those # working on the engine itself. env_base.Append(CPPDEFINES=["DEV_ENABLED"]) +else: + # Disable assert() for production targets (only used in thirdparty code). + env_base.Append(CPPDEFINES=["NDEBUG"]) # SCons speed optimization controlled by the `fast_unsafe` option, which provide # more than 10 s speed up for incremental rebuilds. # Unsafe as they reduce the certainty of rebuilding all changed files, so it's # enabled by default for `debug` builds, and can be overridden from command line. # Ref: https://github.com/SCons/scons/wiki/GoFastButton -if methods.get_cmdline_bool("fast_unsafe", env_base["target"] == "debug"): +if methods.get_cmdline_bool("fast_unsafe", env_base.dev_build): # Renamed to `content-timestamp` in SCons >= 4.2, keeping MD5 for compat. env_base.Decider("MD5-timestamp") env_base.SetOption("implicit_cache", 1) @@ -460,19 +492,74 @@ if selected_platform in platform_list: env["LINKFLAGS"] = "" env.Append(LINKFLAGS=str(LINKFLAGS).split()) - # Platform specific flags + # Platform specific flags. + # These can sometimes override default options. flag_list = platform_flags[selected_platform] for f in flag_list: if not (f[0] in ARGUMENTS) or ARGUMENTS[f[0]] == "auto": # Allow command line to override platform flags env[f[0]] = f[1] - # Must happen after the flags' definition, so that they can be used by platform detect + # 'dev_mode' and 'production' are aliases to set default options if they haven't been + # set manually by the user. + # These need to be checked *after* platform specific flags so that different + # default values can be set (e.g. to keep LTO off for `production` on some platforms). + if env["dev_mode"]: + env["verbose"] = methods.get_cmdline_bool("verbose", True) + env["warnings"] = ARGUMENTS.get("warnings", "extra") + env["werror"] = methods.get_cmdline_bool("werror", True) + env["tests"] = methods.get_cmdline_bool("tests", 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") + + # Must happen after the flags' definition, as configure is when most flags + # are actually handled to change compile options, etc. detect.configure(env) - print( - 'Building for platform "%s", architecture "%s", %s, target "%s".' - % (selected_platform, env["arch"], "editor" if env["tools"] else "template", env["target"]) - ) + print(f'Building for platform "{selected_platform}", architecture "{env["arch"]}", target "{env["target"]}".') + if env.dev_build: + print("NOTE: Developer build, with debug optimization level and debug symbols (unless overridden).") + + # Set optimize and debug_symbols flags. + # "custom" means do nothing and let users set their own optimization flags. + # Needs to happen after configure to have `env.msvc` defined. + if env.msvc: + if env["debug_symbols"]: + env.Append(CCFLAGS=["/Zi", "/FS"]) + env.Append(LINKFLAGS=["/DEBUG:FULL"]) + + if env["optimize"] == "speed" or env["optimize"] == "speed_trace": + env.Append(CCFLAGS=["/O2"]) + env.Append(LINKFLAGS=["/OPT:REF"]) + elif env["optimize"] == "size": + env.Append(CCFLAGS=["/O1"]) + env.Append(LINKFLAGS=["/OPT:REF"]) + elif env["optimize"] == "debug" or env["optimize"] == "none": + env.Append(CCFLAGS=["/Od"]) + else: + if env["debug_symbols"]: + if env.dev_build: + env.Append(CCFLAGS=["-g3"]) + else: + env.Append(CCFLAGS=["-g2"]) + + if env["optimize"] == "speed": + env.Append(CCFLAGS=["-O3"]) + # `-O2` is friendlier to debuggers than `-O3`, leading to better crash backtraces. + elif env["optimize"] == "speed_trace": + env.Append(CCFLAGS=["-O2"]) + elif env["optimize"] == "size": + env.Append(CCFLAGS=["-Os"]) + elif env["optimize"] == "debug": + env.Append(CCFLAGS=["-Og"]) + elif env["optimize"] == "none": + env.Append(CCFLAGS=["-O0"]) + + # Needs to happen after configure to handle "auto". + if env["lto"] != "none": + print("Using LTO: " + env["lto"]) # Set our C and C++ standard requirements. # C++17 is required as we need guaranteed copy elision as per GH-36436. @@ -488,37 +575,6 @@ if selected_platform in platform_list: # We apply it to CCFLAGS (both C and C++ code) in case it impacts C features. env.Prepend(CCFLAGS=["/std:c++17"]) - # 'dev' and 'production' are aliases to set default options if they haven't been set - # manually by the user. - if env["dev"]: - env["verbose"] = methods.get_cmdline_bool("verbose", True) - env["warnings"] = ARGUMENTS.get("warnings", "extra") - env["werror"] = methods.get_cmdline_bool("werror", True) - if env["tools"]: - env["tests"] = methods.get_cmdline_bool("tests", True) - if env["production"]: - env["use_static_cpp"] = methods.get_cmdline_bool("use_static_cpp", True) - env["lto"] = ARGUMENTS.get("lto", "full") - env["debug_symbols"] = methods.get_cmdline_bool("debug_symbols", False) - if not env["tools"] and env["target"] == "debug": - print( - "WARNING: Requested `production` build with `tools=no target=debug`, " - "this will give you a full debug template (use `target=release_debug` " - "for an optimized template with debug features)." - ) - if env.msvc: - print( - "WARNING: For `production` Windows builds, you should use MinGW with GCC " - "or Clang instead of Visual Studio, as they can better optimize the " - "GDScript VM in a very significant way. MSVC LTO also doesn't work " - "reliably for our use case." - "If you want to use MSVC nevertheless for production builds, set " - "`debug_symbols=no lto=none` instead of the `production=yes` option." - ) - Exit(255) - if env["lto"] != "none": - print("Using LTO: " + env["lto"]) - # Enforce our minimal compiler version requirements cc_version = methods.get_compiler_version(env) or { "major": None, @@ -663,33 +719,13 @@ if selected_platform in platform_list: else: suffix = "." + selected_platform + suffix += "." + env["target"] + if env.dev_build: + suffix += ".dev" + if env_base["float"] == "64": suffix += ".double" - if env["target"] == "release": - if env["tools"]: - print("ERROR: The editor can only be built with `target=debug` or `target=release_debug`.") - print(" Use `tools=no target=release` to build a release export template.") - Exit(255) - suffix += ".opt" - env.Append(CPPDEFINES=["NDEBUG"]) - elif env["target"] == "release_debug": - if env["tools"]: - suffix += ".opt.tools" - else: - suffix += ".opt.debug" - else: - if env["tools"]: - print( - "Note: Building a debug binary (which will run slowly). Use `target=release_debug` to build an optimized release binary." - ) - suffix += ".tools" - else: - print( - "Note: Building a debug binary (which will run slowly). Use `target=release` to build an optimized release binary." - ) - suffix += ".debug" - suffix += "." + env["arch"] suffix += env.extra_suffix @@ -737,7 +773,7 @@ if selected_platform in platform_list: env.module_list = modules_enabled methods.sort_module_list(env) - methods.update_version(env.module_version_string) + methods.generate_version_header(env.module_version_string) env["PROGSUFFIX"] = suffix + env.module_version_string + env["PROGSUFFIX"] env["OBJSUFFIX"] = suffix + env["OBJSUFFIX"] @@ -754,9 +790,6 @@ if selected_platform in platform_list: env["LIBSUFFIX"] = suffix + env["LIBSUFFIX"] env["SHLIBSUFFIX"] = suffix + env["SHLIBSUFFIX"] - if env["tools"]: - env.Append(CPPDEFINES=["TOOLS_ENABLED"]) - disabled_classes = [] if env["build_feature_profile"] != "": @@ -778,19 +811,16 @@ if selected_platform in platform_list: methods.write_disabled_classes(disabled_classes) if env["disable_3d"]: - if env["tools"]: - print( - "Build option 'disable_3d=yes' cannot be used with 'tools=yes' (editor), " - "only with 'tools=no' (export template)." - ) + if env.editor_build: + print("Build option 'disable_3d=yes' cannot be used for editor builds, but only for export templates.") Exit(255) else: env.Append(CPPDEFINES=["_3D_DISABLED"]) if env["disable_advanced_gui"]: - if env["tools"]: + if env.editor_build: print( - "Build option 'disable_advanced_gui=yes' cannot be used with 'tools=yes' (editor), " - "only with 'tools=no' (export template)." + "Build option 'disable_advanced_gui=yes' cannot be used for editor builds, " + "but only for export templates." ) Exit(255) else: @@ -848,7 +878,7 @@ if selected_platform in platform_list: SConscript("core/SCsub") SConscript("servers/SCsub") SConscript("scene/SCsub") - if env["tools"]: + if env.editor_build: SConscript("editor/SCsub") SConscript("drivers/SCsub") diff --git a/core/SCsub b/core/SCsub index d4462fa546..43deff3ad5 100644 --- a/core/SCsub +++ b/core/SCsub @@ -85,7 +85,7 @@ if env["builtin_zlib"]: env_thirdparty.Prepend(CPPPATH=[thirdparty_zlib_dir]) # Needs to be available in main env too env.Prepend(CPPPATH=[thirdparty_zlib_dir]) - if env["target"] == "debug": + if env.dev_build: env_thirdparty.Append(CPPDEFINES=["ZLIB_DEBUG"]) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_zlib_sources) diff --git a/core/config/engine.cpp b/core/config/engine.cpp index cf9697be07..21e910be5b 100644 --- a/core/config/engine.cpp +++ b/core/config/engine.cpp @@ -59,12 +59,12 @@ double Engine::get_physics_jitter_fix() const { return physics_jitter_fix; } -void Engine::set_target_fps(int p_fps) { - _target_fps = p_fps > 0 ? p_fps : 0; +void Engine::set_max_fps(int p_fps) { + _max_fps = p_fps > 0 ? p_fps : 0; } -int Engine::get_target_fps() const { - return _target_fps; +int Engine::get_max_fps() const { + return _max_fps; } uint64_t Engine::get_frames_drawn() { diff --git a/core/config/engine.h b/core/config/engine.h index 121fd4d541..21517e46b7 100644 --- a/core/config/engine.h +++ b/core/config/engine.h @@ -60,7 +60,7 @@ private: int ips = 60; double physics_jitter_fix = 0.5; double _fps = 1; - int _target_fps = 0; + int _max_fps = 0; double _time_scale = 1.0; uint64_t _physics_frames = 0; double _physics_interpolation_fraction = 0.0f; @@ -96,8 +96,8 @@ public: void set_physics_jitter_fix(double p_threshold); double get_physics_jitter_fix() const; - virtual void set_target_fps(int p_fps); - virtual int get_target_fps() const; + virtual void set_max_fps(int p_fps); + virtual int get_max_fps() const; virtual double get_frames_per_second() const { return _fps; } diff --git a/core/config/project_settings.cpp b/core/config/project_settings.cpp index 6275502378..4d19a93991 100644 --- a/core/config/project_settings.cpp +++ b/core/config/project_settings.cpp @@ -101,10 +101,15 @@ const PackedStringArray ProjectSettings::_get_supported_features() { features.append(VERSION_BRANCH "." _MKSTR(VERSION_PATCH)); features.append(VERSION_FULL_CONFIG); features.append(VERSION_FULL_BUILD); - // For now, assume Vulkan is always supported. - // This should be removed if it's possible to build the editor without Vulkan. - features.append("Vulkan Clustered"); - features.append("Vulkan Mobile"); + +#ifdef VULKAN_ENABLED + features.append("Forward Plus"); + features.append("Mobile"); +#endif + +#ifdef GLES3_ENABLED + features.append("GL Compatibility"); +#endif return features; } @@ -114,6 +119,10 @@ const PackedStringArray ProjectSettings::get_unsupported_features(const PackedSt PackedStringArray supported_features = singleton->_get_supported_features(); for (int i = 0; i < p_project_features.size(); i++) { if (!supported_features.has(p_project_features[i])) { + // Temporary compatibility code to ease upgrade to 4.0 beta 2+. + if (p_project_features[i].begins_with("Vulkan")) { + continue; + } unsupported_features.append(p_project_features[i]); } } @@ -909,7 +918,7 @@ Error ProjectSettings::save_custom(const String &p_path, const CustomMap &p_cust project_features = ProjectSettings::get_required_features(); } // Check the rendering API. - const String rendering_api = has_setting("rendering/quality/driver/driver_name") ? (String)get_setting("rendering/quality/driver/driver_name") : String(); + const String rendering_api = has_setting("rendering/renderer/rendering_method") ? (String)get_setting("rendering/renderer/rendering_method") : String(); if (!rendering_api.is_empty()) { // Add the rendering API as a project feature if it doesn't already exist. if (!project_features.has(rendering_api)) { @@ -1139,6 +1148,7 @@ void ProjectSettings::_bind_methods() { ClassDB::bind_method(D_METHOD("get_order", "name"), &ProjectSettings::get_order); ClassDB::bind_method(D_METHOD("set_initial_value", "name", "value"), &ProjectSettings::set_initial_value); ClassDB::bind_method(D_METHOD("add_property_info", "hint"), &ProjectSettings::_add_property_info_bind); + ClassDB::bind_method(D_METHOD("set_restart_if_changed", "name", "restart"), &ProjectSettings::set_restart_if_changed); ClassDB::bind_method(D_METHOD("clear", "name"), &ProjectSettings::clear); ClassDB::bind_method(D_METHOD("localize_path", "path"), &ProjectSettings::localize_path); ClassDB::bind_method(D_METHOD("globalize_path", "path"), &ProjectSettings::globalize_path); @@ -1201,10 +1211,16 @@ ProjectSettings::ProjectSettings() { GLOBAL_DEF_BASIC("display/window/size/viewport_height", 648); custom_prop_info["display/window/size/viewport_height"] = PropertyInfo(Variant::INT, "display/window/size/viewport_height", PROPERTY_HINT_RANGE, "0,4320,1,or_greater"); // 8K resolution + GLOBAL_DEF_BASIC("display/window/size/mode", 0); + custom_prop_info["display/window/size/mode"] = PropertyInfo(Variant::INT, "display/window/size/mode", PROPERTY_HINT_ENUM, "Windowed,Minimized,Maximized,Fullscreen,Exclusive Fullscreen"); + GLOBAL_DEF_BASIC("display/window/size/resizable", true); GLOBAL_DEF_BASIC("display/window/size/borderless", false); - GLOBAL_DEF_BASIC("display/window/size/fullscreen", false); GLOBAL_DEF("display/window/size/always_on_top", false); + GLOBAL_DEF("display/window/size/transparent", false); + GLOBAL_DEF("display/window/size/extend_to_title", false); + GLOBAL_DEF("display/window/size/no_focus", false); + GLOBAL_DEF("display/window/size/window_width_override", 0); custom_prop_info["display/window/size/window_width_override"] = PropertyInfo(Variant::INT, "display/window/size/window_width_override", PROPERTY_HINT_RANGE, "0,7680,1,or_greater"); // 8K resolution GLOBAL_DEF("display/window/size/window_height_override", 0); diff --git a/core/config/project_settings.h b/core/config/project_settings.h index a9af63ee39..960dfe0395 100644 --- a/core/config/project_settings.h +++ b/core/config/project_settings.h @@ -45,9 +45,10 @@ public: static const String PROJECT_DATA_DIR_NAME_SUFFIX; enum { - //properties that are not for built in values begin from this value, so builtin ones are displayed first + // Properties that are not for built in values begin from this value, so builtin ones are displayed first. NO_BUILTIN_ORDER_BASE = 1 << 16 }; + #ifdef TOOLS_ENABLED const static PackedStringArray get_required_features(); const static PackedStringArray get_unsupported_features(const PackedStringArray &p_project_features); diff --git a/core/core_bind.cpp b/core/core_bind.cpp index 9daf58cb71..7496ba1979 100644 --- a/core/core_bind.cpp +++ b/core/core_bind.cpp @@ -253,6 +253,10 @@ Error OS::shell_open(String p_uri) { return ::OS::get_singleton()->shell_open(p_uri); } +String OS::read_string_from_stdin(bool p_block) { + return ::OS::get_singleton()->get_stdin_string(true); +} + int OS::execute(const String &p_path, const Vector<String> &p_arguments, Array r_output, bool p_read_stderr, bool p_open_console) { List<String> args; for (int i = 0; i < p_arguments.size(); i++) { @@ -322,6 +326,14 @@ String OS::get_name() const { return ::OS::get_singleton()->get_name(); } +String OS::get_distribution_name() const { + return ::OS::get_singleton()->get_distribution_name(); +} + +String OS::get_version() const { + return ::OS::get_singleton()->get_version(); +} + Vector<String> OS::get_cmdline_args() { List<String> cmdline = ::OS::get_singleton()->get_cmdline_args(); Vector<String> cmdlinev; @@ -417,10 +429,6 @@ void OS::delay_msec(int p_msec) const { ::OS::get_singleton()->delay_usec(int64_t(p_msec) * 1000); } -bool OS::can_use_threads() const { - return ::OS::get_singleton()->can_use_threads(); -} - bool OS::is_userfs_persistent() const { return ::OS::get_singleton()->is_userfs_persistent(); } @@ -522,6 +530,7 @@ void OS::_bind_methods() { ClassDB::bind_method(D_METHOD("get_system_fonts"), &OS::get_system_fonts); ClassDB::bind_method(D_METHOD("get_system_font_path", "font_name", "bold", "italic"), &OS::get_system_font_path, DEFVAL(false), DEFVAL(false)); ClassDB::bind_method(D_METHOD("get_executable_path"), &OS::get_executable_path); + ClassDB::bind_method(D_METHOD("read_string_from_stdin", "block"), &OS::read_string_from_stdin, DEFVAL(true)); 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("create_process", "path", "arguments", "open_console"), &OS::create_process, DEFVAL(false)); ClassDB::bind_method(D_METHOD("create_instance", "arguments"), &OS::create_instance); @@ -535,6 +544,8 @@ void OS::_bind_methods() { ClassDB::bind_method(D_METHOD("has_environment", "variable"), &OS::has_environment); ClassDB::bind_method(D_METHOD("get_name"), &OS::get_name); + ClassDB::bind_method(D_METHOD("get_distribution_name"), &OS::get_distribution_name); + ClassDB::bind_method(D_METHOD("get_version"), &OS::get_version); ClassDB::bind_method(D_METHOD("get_cmdline_args"), &OS::get_cmdline_args); ClassDB::bind_method(D_METHOD("get_cmdline_user_args"), &OS::get_cmdline_user_args); @@ -551,8 +562,6 @@ void OS::_bind_methods() { ClassDB::bind_method(D_METHOD("is_userfs_persistent"), &OS::is_userfs_persistent); ClassDB::bind_method(D_METHOD("is_stdout_verbose"), &OS::is_stdout_verbose); - ClassDB::bind_method(D_METHOD("can_use_threads"), &OS::can_use_threads); - ClassDB::bind_method(D_METHOD("is_debug_build"), &OS::is_debug_build); ClassDB::bind_method(D_METHOD("get_static_memory_usage"), &OS::get_static_memory_usage); @@ -699,6 +708,17 @@ Vector<Point2> Geometry2D::convex_hull(const Vector<Point2> &p_points) { return ::Geometry2D::convex_hull(p_points); } +TypedArray<PackedVector2Array> Geometry2D::decompose_polygon_in_convex(const Vector<Vector2> &p_polygon) { + Vector<Vector<Point2>> decomp = ::Geometry2D::decompose_polygon_in_convex(p_polygon); + + TypedArray<PackedVector2Array> ret; + + for (int i = 0; i < decomp.size(); ++i) { + ret.push_back(decomp[i]); + } + return ret; +} + TypedArray<PackedVector2Array> Geometry2D::merge_polygons(const Vector<Vector2> &p_polygon_a, const Vector<Vector2> &p_polygon_b) { Vector<Vector<Point2>> polys = ::Geometry2D::merge_polygons(p_polygon_a, p_polygon_b); @@ -800,14 +820,13 @@ Dictionary Geometry2D::make_atlas(const Vector<Size2> &p_rects) { ::Geometry2D::make_atlas(rects, result, size); - Size2 r_size = size; Vector<Point2> r_result; for (int i = 0; i < result.size(); i++) { r_result.push_back(result[i]); } ret["points"] = r_result; - ret["size"] = r_size; + ret["size"] = size; return ret; } @@ -831,6 +850,7 @@ void Geometry2D::_bind_methods() { ClassDB::bind_method(D_METHOD("triangulate_polygon", "polygon"), &Geometry2D::triangulate_polygon); ClassDB::bind_method(D_METHOD("triangulate_delaunay", "points"), &Geometry2D::triangulate_delaunay); ClassDB::bind_method(D_METHOD("convex_hull", "points"), &Geometry2D::convex_hull); + ClassDB::bind_method(D_METHOD("decompose_polygon_in_convex", "polygon"), &Geometry2D::decompose_polygon_in_convex); ClassDB::bind_method(D_METHOD("merge_polygons", "polygon_a", "polygon_b"), &Geometry2D::merge_polygons); ClassDB::bind_method(D_METHOD("clip_polygons", "polygon_a", "polygon_b"), &Geometry2D::clip_polygons); @@ -982,636 +1002,6 @@ void Geometry3D::_bind_methods() { ClassDB::bind_method(D_METHOD("clip_polygon", "points", "plane"), &Geometry3D::clip_polygon); } -////// File ////// - -Error File::open_encrypted(const String &p_path, ModeFlags p_mode_flags, const Vector<uint8_t> &p_key) { - Error err = open(p_path, p_mode_flags); - if (err) { - return err; - } - - Ref<FileAccessEncrypted> fae; - fae.instantiate(); - err = fae->open_and_parse(f, p_key, (p_mode_flags == WRITE) ? FileAccessEncrypted::MODE_WRITE_AES256 : FileAccessEncrypted::MODE_READ); - if (err) { - close(); - return err; - } - f = fae; - return OK; -} - -Error File::open_encrypted_pass(const String &p_path, ModeFlags p_mode_flags, const String &p_pass) { - Error err = open(p_path, p_mode_flags); - if (err) { - return err; - } - - Ref<FileAccessEncrypted> fae; - fae.instantiate(); - err = fae->open_and_parse_password(f, p_pass, (p_mode_flags == WRITE) ? FileAccessEncrypted::MODE_WRITE_AES256 : FileAccessEncrypted::MODE_READ); - if (err) { - close(); - return err; - } - - f = fae; - return OK; -} - -Error File::open_compressed(const String &p_path, ModeFlags p_mode_flags, CompressionMode p_compress_mode) { - Ref<FileAccessCompressed> fac; - fac.instantiate(); - fac->configure("GCPF", (Compression::Mode)p_compress_mode); - - Error err = fac->_open(p_path, p_mode_flags); - - if (err) { - return err; - } - - f = fac; - return OK; -} - -Error File::open(const String &p_path, ModeFlags p_mode_flags) { - Error err; - f = FileAccess::open(p_path, p_mode_flags, &err); - if (f.is_valid()) { - f->set_big_endian(big_endian); - } - return err; -} - -void File::flush() { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before flushing."); - f->flush(); -} - -void File::close() { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened."); - f.unref(); -} - -bool File::is_open() const { - return f != nullptr; -} - -String File::get_path() const { - ERR_FAIL_COND_V_MSG(f.is_null(), "", "File must be opened before use, or is lacking read-write permission."); - return f->get_path(); -} - -String File::get_path_absolute() const { - ERR_FAIL_COND_V_MSG(f.is_null(), "", "File must be opened before use, or is lacking read-write permission."); - return f->get_path_absolute(); -} - -void File::seek(int64_t p_position) { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use, or is lacking read-write permission."); - ERR_FAIL_COND_MSG(p_position < 0, "Seek position must be a positive integer."); - f->seek(p_position); -} - -void File::seek_end(int64_t p_position) { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use, or is lacking read-write permission."); - f->seek_end(p_position); -} - -uint64_t File::get_position() const { - ERR_FAIL_COND_V_MSG(f.is_null(), 0, "File must be opened before use, or is lacking read-write permission."); - return f->get_position(); -} - -uint64_t File::get_length() const { - ERR_FAIL_COND_V_MSG(f.is_null(), 0, "File must be opened before use, or is lacking read-write permission."); - return f->get_length(); -} - -bool File::eof_reached() const { - ERR_FAIL_COND_V_MSG(f.is_null(), false, "File must be opened before use, or is lacking read-write permission."); - return f->eof_reached(); -} - -uint8_t File::get_8() const { - ERR_FAIL_COND_V_MSG(f.is_null(), 0, "File must be opened before use, or is lacking read-write permission."); - return f->get_8(); -} - -uint16_t File::get_16() const { - ERR_FAIL_COND_V_MSG(f.is_null(), 0, "File must be opened before use, or is lacking read-write permission."); - return f->get_16(); -} - -uint32_t File::get_32() const { - ERR_FAIL_COND_V_MSG(f.is_null(), 0, "File must be opened before use, or is lacking read-write permission."); - return f->get_32(); -} - -uint64_t File::get_64() const { - ERR_FAIL_COND_V_MSG(f.is_null(), 0, "File must be opened before use, or is lacking read-write permission."); - return f->get_64(); -} - -float File::get_float() const { - ERR_FAIL_COND_V_MSG(f.is_null(), 0, "File must be opened before use, or is lacking read-write permission."); - return f->get_float(); -} - -double File::get_double() const { - ERR_FAIL_COND_V_MSG(f.is_null(), 0, "File must be opened before use, or is lacking read-write permission."); - return f->get_double(); -} - -real_t File::get_real() const { - ERR_FAIL_COND_V_MSG(f.is_null(), 0, "File must be opened before use, or is lacking read-write permission."); - return f->get_real(); -} - -Vector<uint8_t> File::get_buffer(int64_t p_length) const { - Vector<uint8_t> data; - ERR_FAIL_COND_V_MSG(f.is_null(), data, "File must be opened before use, or is lacking read-write permission."); - - ERR_FAIL_COND_V_MSG(p_length < 0, data, "Length of buffer cannot be smaller than 0."); - if (p_length == 0) { - return data; - } - - Error err = data.resize(p_length); - 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 = f->get_buffer(&w[0], p_length); - - if (len < p_length) { - data.resize(len); - } - - return data; -} - -String File::get_as_text(bool p_skip_cr) const { - ERR_FAIL_COND_V_MSG(f.is_null(), String(), "File must be opened before use, or is lacking read-write permission."); - - uint64_t original_pos = f->get_position(); - const_cast<FileAccess *>(*f)->seek(0); - - String text = f->get_as_utf8_string(p_skip_cr); - - const_cast<FileAccess *>(*f)->seek(original_pos); - - return text; -} - -String File::get_md5(const String &p_path) const { - return FileAccess::get_md5(p_path); -} - -String File::get_sha256(const String &p_path) const { - return FileAccess::get_sha256(p_path); -} - -String File::get_line() const { - ERR_FAIL_COND_V_MSG(f.is_null(), String(), "File must be opened before use, or is lacking read-write permission."); - return f->get_line(); -} - -Vector<String> File::get_csv_line(const String &p_delim) const { - ERR_FAIL_COND_V_MSG(f.is_null(), Vector<String>(), "File must be opened before use, or is lacking read-write permission."); - return f->get_csv_line(p_delim); -} - -/**< use this for files WRITTEN in _big_ endian machines (i.e. amiga/mac) - * It's not about the current CPU type but file formats. - * These flags get reset to false (little endian) on each open - */ - -void File::set_big_endian(bool p_big_endian) { - big_endian = p_big_endian; - if (f.is_valid()) { - f->set_big_endian(p_big_endian); - } -} - -bool File::is_big_endian() { - return big_endian; -} - -Error File::get_error() const { - if (f.is_null()) { - return ERR_UNCONFIGURED; - } - return f->get_error(); -} - -void File::store_8(uint8_t p_dest) { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use, or is lacking read-write permission."); - - f->store_8(p_dest); -} - -void File::store_16(uint16_t p_dest) { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use, or is lacking read-write permission."); - - f->store_16(p_dest); -} - -void File::store_32(uint32_t p_dest) { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use, or is lacking read-write permission."); - - f->store_32(p_dest); -} - -void File::store_64(uint64_t p_dest) { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use, or is lacking read-write permission."); - - f->store_64(p_dest); -} - -void File::store_float(float p_dest) { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use, or is lacking read-write permission."); - - f->store_float(p_dest); -} - -void File::store_double(double p_dest) { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use, or is lacking read-write permission."); - - f->store_double(p_dest); -} - -void File::store_real(real_t p_real) { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use, or is lacking read-write permission."); - - f->store_real(p_real); -} - -void File::store_string(const String &p_string) { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use, or is lacking read-write permission."); - - f->store_string(p_string); -} - -void File::store_pascal_string(const String &p_string) { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use, or is lacking read-write permission."); - - f->store_pascal_string(p_string); -} - -String File::get_pascal_string() { - ERR_FAIL_COND_V_MSG(f.is_null(), "", "File must be opened before use, or is lacking read-write permission."); - - return f->get_pascal_string(); -} - -void File::store_line(const String &p_string) { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use, or is lacking read-write permission."); - f->store_line(p_string); -} - -void File::store_csv_line(const Vector<String> &p_values, const String &p_delim) { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use, or is lacking read-write permission."); - f->store_csv_line(p_values, p_delim); -} - -void File::store_buffer(const Vector<uint8_t> &p_buffer) { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use, or is lacking read-write permission."); - - uint64_t len = p_buffer.size(); - if (len == 0) { - return; - } - - const uint8_t *r = p_buffer.ptr(); - - f->store_buffer(&r[0], len); -} - -bool File::file_exists(const String &p_name) { - return FileAccess::exists(p_name); -} - -void File::store_var(const Variant &p_var, bool p_full_objects) { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use, or is lacking read-write permission."); - int len; - Error err = encode_variant(p_var, nullptr, len, p_full_objects); - ERR_FAIL_COND_MSG(err != OK, "Error when trying to encode Variant."); - - Vector<uint8_t> buff; - buff.resize(len); - - uint8_t *w = buff.ptrw(); - err = encode_variant(p_var, &w[0], len, p_full_objects); - ERR_FAIL_COND_MSG(err != OK, "Error when trying to encode Variant."); - - store_32(len); - store_buffer(buff); -} - -Variant File::get_var(bool p_allow_objects) const { - ERR_FAIL_COND_V_MSG(f.is_null(), Variant(), "File must be opened before use, or is lacking read-write permission."); - uint32_t len = get_32(); - Vector<uint8_t> buff = get_buffer(len); - ERR_FAIL_COND_V((uint32_t)buff.size() != len, Variant()); - - const uint8_t *r = buff.ptr(); - - Variant v; - Error err = decode_variant(v, &r[0], len, nullptr, p_allow_objects); - ERR_FAIL_COND_V_MSG(err != OK, Variant(), "Error when trying to encode Variant."); - - return v; -} - -uint64_t File::get_modified_time(const String &p_file) const { - return FileAccess::get_modified_time(p_file); -} - -void File::_bind_methods() { - ClassDB::bind_method(D_METHOD("open_encrypted", "path", "mode_flags", "key"), &File::open_encrypted); - ClassDB::bind_method(D_METHOD("open_encrypted_with_pass", "path", "mode_flags", "pass"), &File::open_encrypted_pass); - ClassDB::bind_method(D_METHOD("open_compressed", "path", "mode_flags", "compression_mode"), &File::open_compressed, DEFVAL(0)); - - ClassDB::bind_method(D_METHOD("open", "path", "flags"), &File::open); - ClassDB::bind_method(D_METHOD("flush"), &File::flush); - ClassDB::bind_method(D_METHOD("close"), &File::close); - ClassDB::bind_method(D_METHOD("get_path"), &File::get_path); - ClassDB::bind_method(D_METHOD("get_path_absolute"), &File::get_path_absolute); - ClassDB::bind_method(D_METHOD("is_open"), &File::is_open); - ClassDB::bind_method(D_METHOD("seek", "position"), &File::seek); - ClassDB::bind_method(D_METHOD("seek_end", "position"), &File::seek_end, DEFVAL(0)); - ClassDB::bind_method(D_METHOD("get_position"), &File::get_position); - ClassDB::bind_method(D_METHOD("get_length"), &File::get_length); - ClassDB::bind_method(D_METHOD("eof_reached"), &File::eof_reached); - ClassDB::bind_method(D_METHOD("get_8"), &File::get_8); - ClassDB::bind_method(D_METHOD("get_16"), &File::get_16); - ClassDB::bind_method(D_METHOD("get_32"), &File::get_32); - ClassDB::bind_method(D_METHOD("get_64"), &File::get_64); - ClassDB::bind_method(D_METHOD("get_float"), &File::get_float); - ClassDB::bind_method(D_METHOD("get_double"), &File::get_double); - ClassDB::bind_method(D_METHOD("get_real"), &File::get_real); - ClassDB::bind_method(D_METHOD("get_buffer", "length"), &File::get_buffer); - ClassDB::bind_method(D_METHOD("get_line"), &File::get_line); - ClassDB::bind_method(D_METHOD("get_csv_line", "delim"), &File::get_csv_line, DEFVAL(",")); - ClassDB::bind_method(D_METHOD("get_as_text", "skip_cr"), &File::get_as_text, DEFVAL(false)); - ClassDB::bind_method(D_METHOD("get_md5", "path"), &File::get_md5); - ClassDB::bind_method(D_METHOD("get_sha256", "path"), &File::get_sha256); - ClassDB::bind_method(D_METHOD("is_big_endian"), &File::is_big_endian); - ClassDB::bind_method(D_METHOD("set_big_endian", "big_endian"), &File::set_big_endian); - ClassDB::bind_method(D_METHOD("get_error"), &File::get_error); - ClassDB::bind_method(D_METHOD("get_var", "allow_objects"), &File::get_var, DEFVAL(false)); - - ClassDB::bind_method(D_METHOD("store_8", "value"), &File::store_8); - ClassDB::bind_method(D_METHOD("store_16", "value"), &File::store_16); - ClassDB::bind_method(D_METHOD("store_32", "value"), &File::store_32); - ClassDB::bind_method(D_METHOD("store_64", "value"), &File::store_64); - ClassDB::bind_method(D_METHOD("store_float", "value"), &File::store_float); - ClassDB::bind_method(D_METHOD("store_double", "value"), &File::store_double); - ClassDB::bind_method(D_METHOD("store_real", "value"), &File::store_real); - ClassDB::bind_method(D_METHOD("store_buffer", "buffer"), &File::store_buffer); - ClassDB::bind_method(D_METHOD("store_line", "line"), &File::store_line); - ClassDB::bind_method(D_METHOD("store_csv_line", "values", "delim"), &File::store_csv_line, DEFVAL(",")); - ClassDB::bind_method(D_METHOD("store_string", "string"), &File::store_string); - ClassDB::bind_method(D_METHOD("store_var", "value", "full_objects"), &File::store_var, DEFVAL(false)); - - ClassDB::bind_method(D_METHOD("store_pascal_string", "string"), &File::store_pascal_string); - ClassDB::bind_method(D_METHOD("get_pascal_string"), &File::get_pascal_string); - - ClassDB::bind_static_method("File", D_METHOD("file_exists", "path"), &File::file_exists); - ClassDB::bind_method(D_METHOD("get_modified_time", "file"), &File::get_modified_time); - - ADD_PROPERTY(PropertyInfo(Variant::BOOL, "big_endian"), "set_big_endian", "is_big_endian"); - - BIND_ENUM_CONSTANT(READ); - BIND_ENUM_CONSTANT(WRITE); - BIND_ENUM_CONSTANT(READ_WRITE); - BIND_ENUM_CONSTANT(WRITE_READ); - - BIND_ENUM_CONSTANT(COMPRESSION_FASTLZ); - BIND_ENUM_CONSTANT(COMPRESSION_DEFLATE); - BIND_ENUM_CONSTANT(COMPRESSION_ZSTD); - BIND_ENUM_CONSTANT(COMPRESSION_GZIP); -} - -////// Directory ////// - -Error Directory::open(const String &p_path) { - Error err; - Ref<DirAccess> alt = DirAccess::open(p_path, &err); - if (alt.is_null()) { - return err; - } - d = alt; - dir_open = true; - - return OK; -} - -bool Directory::is_open() const { - return d.is_valid() && dir_open; -} - -Error Directory::list_dir_begin() { - ERR_FAIL_COND_V_MSG(!is_open(), ERR_UNCONFIGURED, "Directory must be opened before use."); - return d->list_dir_begin(); -} - -String Directory::get_next() { - ERR_FAIL_COND_V_MSG(!is_open(), "", "Directory must be opened before use."); - - String next = d->get_next(); - while (!next.is_empty() && ((!include_navigational && (next == "." || next == "..")) || (!include_hidden && d->current_is_hidden()))) { - next = d->get_next(); - } - return next; -} - -bool Directory::current_is_dir() const { - ERR_FAIL_COND_V_MSG(!is_open(), false, "Directory must be opened before use."); - return d->current_is_dir(); -} - -void Directory::list_dir_end() { - ERR_FAIL_COND_MSG(!is_open(), "Directory must be opened before use."); - d->list_dir_end(); -} - -PackedStringArray Directory::get_files() { - return _get_contents(false); -} - -PackedStringArray Directory::get_directories() { - return _get_contents(true); -} - -PackedStringArray Directory::_get_contents(bool p_directories) { - PackedStringArray ret; - ERR_FAIL_COND_V_MSG(!is_open(), ret, "Directory must be opened before use."); - - list_dir_begin(); - String s = get_next(); - while (!s.is_empty()) { - if (current_is_dir() == p_directories) { - ret.append(s); - } - s = get_next(); - } - - ret.sort(); - return ret; -} - -void Directory::set_include_navigational(bool p_enable) { - include_navigational = p_enable; -} - -bool Directory::get_include_navigational() const { - return include_navigational; -} - -void Directory::set_include_hidden(bool p_enable) { - include_hidden = p_enable; -} - -bool Directory::get_include_hidden() const { - return include_hidden; -} - -int Directory::get_drive_count() { - ERR_FAIL_COND_V_MSG(!is_open(), 0, "Directory must be opened before use."); - return d->get_drive_count(); -} - -String Directory::get_drive(int p_drive) { - ERR_FAIL_COND_V_MSG(!is_open(), "", "Directory must be opened before use."); - return d->get_drive(p_drive); -} - -int Directory::get_current_drive() { - ERR_FAIL_COND_V_MSG(!is_open(), 0, "Directory must be opened before use."); - return d->get_current_drive(); -} - -Error Directory::change_dir(String p_dir) { - ERR_FAIL_COND_V_MSG(d.is_null(), ERR_UNCONFIGURED, "Directory is not configured properly."); - Error err = d->change_dir(p_dir); - - if (err != OK) { - return err; - } - dir_open = true; - - return OK; -} - -String Directory::get_current_dir() { - ERR_FAIL_COND_V_MSG(!is_open(), "", "Directory must be opened before use."); - return d->get_current_dir(); -} - -Error Directory::make_dir(String p_dir) { - ERR_FAIL_COND_V_MSG(d.is_null(), ERR_UNCONFIGURED, "Directory is not configured properly."); - if (!p_dir.is_relative_path()) { - Ref<DirAccess> da = DirAccess::create_for_path(p_dir); - return da->make_dir(p_dir); - } - return d->make_dir(p_dir); -} - -Error Directory::make_dir_recursive(String p_dir) { - ERR_FAIL_COND_V_MSG(d.is_null(), ERR_UNCONFIGURED, "Directory is not configured properly."); - if (!p_dir.is_relative_path()) { - Ref<DirAccess> da = DirAccess::create_for_path(p_dir); - return da->make_dir_recursive(p_dir); - } - return d->make_dir_recursive(p_dir); -} - -bool Directory::file_exists(String p_file) { - ERR_FAIL_COND_V_MSG(d.is_null(), false, "Directory is not configured properly."); - if (!p_file.is_relative_path()) { - return FileAccess::exists(p_file); - } - return d->file_exists(p_file); -} - -bool Directory::dir_exists(String p_dir) { - ERR_FAIL_COND_V_MSG(d.is_null(), false, "Directory is not configured properly."); - if (!p_dir.is_relative_path()) { - return DirAccess::exists(p_dir); - } - return d->dir_exists(p_dir); -} - -uint64_t Directory::get_space_left() { - ERR_FAIL_COND_V_MSG(d.is_null(), 0, "Directory must be opened before use."); - return d->get_space_left() / 1024 * 1024; // Truncate to closest MiB. -} - -Error Directory::copy(String p_from, String p_to) { - ERR_FAIL_COND_V_MSG(!is_open(), ERR_UNCONFIGURED, "Directory must be opened before use."); - return d->copy(p_from, p_to); -} - -Error Directory::rename(String p_from, String p_to) { - ERR_FAIL_COND_V_MSG(!is_open(), ERR_UNCONFIGURED, "Directory must be opened before use."); - ERR_FAIL_COND_V_MSG(p_from.is_empty() || p_from == "." || p_from == "..", ERR_INVALID_PARAMETER, "Invalid path to rename."); - - if (!p_from.is_relative_path()) { - Ref<DirAccess> da = DirAccess::create_for_path(p_from); - ERR_FAIL_COND_V_MSG(!da->file_exists(p_from) && !da->dir_exists(p_from), ERR_DOES_NOT_EXIST, "File or directory does not exist."); - return da->rename(p_from, p_to); - } - - ERR_FAIL_COND_V_MSG(!d->file_exists(p_from) && !d->dir_exists(p_from), ERR_DOES_NOT_EXIST, "File or directory does not exist."); - return d->rename(p_from, p_to); -} - -Error Directory::remove(String p_name) { - ERR_FAIL_COND_V_MSG(!is_open(), ERR_UNCONFIGURED, "Directory must be opened before use."); - if (!p_name.is_relative_path()) { - Ref<DirAccess> da = DirAccess::create_for_path(p_name); - return da->remove(p_name); - } - - return d->remove(p_name); -} - -void Directory::_bind_methods() { - ClassDB::bind_method(D_METHOD("open", "path"), &Directory::open); - ClassDB::bind_method(D_METHOD("list_dir_begin"), &Directory::list_dir_begin, DEFVAL(false), DEFVAL(false)); - ClassDB::bind_method(D_METHOD("get_next"), &Directory::get_next); - ClassDB::bind_method(D_METHOD("current_is_dir"), &Directory::current_is_dir); - ClassDB::bind_method(D_METHOD("list_dir_end"), &Directory::list_dir_end); - ClassDB::bind_method(D_METHOD("get_files"), &Directory::get_files); - ClassDB::bind_method(D_METHOD("get_directories"), &Directory::get_directories); - ClassDB::bind_method(D_METHOD("get_drive_count"), &Directory::get_drive_count); - ClassDB::bind_method(D_METHOD("get_drive", "idx"), &Directory::get_drive); - ClassDB::bind_method(D_METHOD("get_current_drive"), &Directory::get_current_drive); - ClassDB::bind_method(D_METHOD("change_dir", "todir"), &Directory::change_dir); - ClassDB::bind_method(D_METHOD("get_current_dir"), &Directory::get_current_dir); - ClassDB::bind_method(D_METHOD("make_dir", "path"), &Directory::make_dir); - ClassDB::bind_method(D_METHOD("make_dir_recursive", "path"), &Directory::make_dir_recursive); - ClassDB::bind_method(D_METHOD("file_exists", "path"), &Directory::file_exists); - ClassDB::bind_method(D_METHOD("dir_exists", "path"), &Directory::dir_exists); - ClassDB::bind_method(D_METHOD("get_space_left"), &Directory::get_space_left); - ClassDB::bind_method(D_METHOD("copy", "from", "to"), &Directory::copy); - ClassDB::bind_method(D_METHOD("rename", "from", "to"), &Directory::rename); - ClassDB::bind_method(D_METHOD("remove", "path"), &Directory::remove); - - ClassDB::bind_method(D_METHOD("set_include_navigational", "enable"), &Directory::set_include_navigational); - ClassDB::bind_method(D_METHOD("get_include_navigational"), &Directory::get_include_navigational); - ClassDB::bind_method(D_METHOD("set_include_hidden", "enable"), &Directory::set_include_hidden); - ClassDB::bind_method(D_METHOD("get_include_hidden"), &Directory::get_include_hidden); - - ADD_PROPERTY(PropertyInfo(Variant::BOOL, "include_navigational"), "set_include_navigational", "get_include_navigational"); - ADD_PROPERTY(PropertyInfo(Variant::BOOL, "include_hidden"), "set_include_hidden", "get_include_hidden"); -} - -Directory::Directory() { - d = DirAccess::create(DirAccess::ACCESS_RESOURCES); -} - ////// Marshalls ////// Marshalls *Marshalls::singleton = nullptr; @@ -2093,12 +1483,12 @@ double Engine::get_physics_interpolation_fraction() const { return ::Engine::get_singleton()->get_physics_interpolation_fraction(); } -void Engine::set_target_fps(int p_fps) { - ::Engine::get_singleton()->set_target_fps(p_fps); +void Engine::set_max_fps(int p_fps) { + ::Engine::get_singleton()->set_max_fps(p_fps); } -int Engine::get_target_fps() const { - return ::Engine::get_singleton()->get_target_fps(); +int Engine::get_max_fps() const { + return ::Engine::get_singleton()->get_max_fps(); } double Engine::get_frames_per_second() const { @@ -2235,8 +1625,8 @@ void Engine::_bind_methods() { ClassDB::bind_method(D_METHOD("set_physics_jitter_fix", "physics_jitter_fix"), &Engine::set_physics_jitter_fix); ClassDB::bind_method(D_METHOD("get_physics_jitter_fix"), &Engine::get_physics_jitter_fix); ClassDB::bind_method(D_METHOD("get_physics_interpolation_fraction"), &Engine::get_physics_interpolation_fraction); - ClassDB::bind_method(D_METHOD("set_target_fps", "target_fps"), &Engine::set_target_fps); - ClassDB::bind_method(D_METHOD("get_target_fps"), &Engine::get_target_fps); + ClassDB::bind_method(D_METHOD("set_max_fps", "max_fps"), &Engine::set_max_fps); + ClassDB::bind_method(D_METHOD("get_max_fps"), &Engine::get_max_fps); ClassDB::bind_method(D_METHOD("set_time_scale", "time_scale"), &Engine::set_time_scale); ClassDB::bind_method(D_METHOD("get_time_scale"), &Engine::get_time_scale); @@ -2279,7 +1669,7 @@ void Engine::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "print_error_messages"), "set_print_error_messages", "is_printing_error_messages"); ADD_PROPERTY(PropertyInfo(Variant::INT, "physics_ticks_per_second"), "set_physics_ticks_per_second", "get_physics_ticks_per_second"); - ADD_PROPERTY(PropertyInfo(Variant::INT, "target_fps"), "set_target_fps", "get_target_fps"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "max_fps"), "set_max_fps", "get_max_fps"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "time_scale"), "set_time_scale", "get_time_scale"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "physics_jitter_fix"), "set_physics_jitter_fix", "get_physics_jitter_fix"); } diff --git a/core/core_bind.h b/core/core_bind.h index cd382d2915..9261698076 100644 --- a/core/core_bind.h +++ b/core/core_bind.h @@ -32,9 +32,6 @@ #define CORE_BIND_H #include "core/debugger/engine_profiler.h" -#include "core/io/compression.h" -#include "core/io/dir_access.h" -#include "core/io/file_access.h" #include "core/io/image.h" #include "core/io/resource_loader.h" #include "core/io/resource_saver.h" @@ -175,6 +172,7 @@ public: Vector<String> get_system_fonts() const; String get_system_font_path(const String &p_font_name, bool p_bold = false, bool p_italic = false) const; String get_executable_path() const; + String read_string_from_stdin(bool p_block = true); int execute(const String &p_path, const Vector<String> &p_arguments, Array r_output = Array(), bool p_read_stderr = false, bool p_open_console = false); int create_process(const String &p_path, const Vector<String> &p_arguments, bool p_open_console = false); int create_instance(const Vector<String> &p_arguments); @@ -193,6 +191,8 @@ public: bool set_environment(const String &p_var, const String &p_value) const; String get_name() const; + String get_distribution_name() const; + String get_version() const; Vector<String> get_cmdline_args(); Vector<String> get_cmdline_user_args(); @@ -219,8 +219,6 @@ public: uint64_t get_ticks_msec() const; uint64_t get_ticks_usec() const; - bool can_use_threads() const; - bool is_userfs_persistent() const; bool is_stdout_verbose() const; @@ -287,6 +285,7 @@ public: Vector<int> triangulate_polygon(const Vector<Vector2> &p_polygon); Vector<int> triangulate_delaunay(const Vector<Vector2> &p_points); Vector<Point2> convex_hull(const Vector<Point2> &p_points); + TypedArray<PackedVector2Array> decompose_polygon_in_convex(const Vector<Vector2> &p_polygon); enum PolyBooleanOperation { OPERATION_UNION, @@ -353,156 +352,6 @@ public: Geometry3D() { singleton = this; } }; -class File : public RefCounted { - GDCLASS(File, RefCounted); - - Ref<FileAccess> f; - bool big_endian = false; - -protected: - static void _bind_methods(); - -public: - enum ModeFlags { - READ = 1, - WRITE = 2, - READ_WRITE = 3, - WRITE_READ = 7, - }; - - enum CompressionMode { - COMPRESSION_FASTLZ = Compression::MODE_FASTLZ, - COMPRESSION_DEFLATE = Compression::MODE_DEFLATE, - COMPRESSION_ZSTD = Compression::MODE_ZSTD, - COMPRESSION_GZIP = Compression::MODE_GZIP - }; - - Error open_encrypted(const String &p_path, ModeFlags p_mode_flags, const Vector<uint8_t> &p_key); - Error open_encrypted_pass(const String &p_path, ModeFlags p_mode_flags, const String &p_pass); - Error open_compressed(const String &p_path, ModeFlags p_mode_flags, CompressionMode p_compress_mode = COMPRESSION_FASTLZ); - - Error open(const String &p_path, ModeFlags p_mode_flags); // open a file. - void flush(); // Flush a file (write its buffer to disk). - void close(); // Close a file. - bool is_open() const; // True when file is open. - - String get_path() const; // Returns the path for the current open file. - String get_path_absolute() const; // Returns the absolute path for the current open file. - - void seek(int64_t p_position); // Seek to a given position. - void seek_end(int64_t p_position = 0); // Seek from the end of file. - uint64_t get_position() const; // Get position in the file. - uint64_t get_length() const; // Get size of the file. - - bool eof_reached() const; // Reading passed EOF. - - uint8_t get_8() const; // Get a byte. - uint16_t get_16() const; // Get 16 bits uint. - uint32_t get_32() const; // Get 32 bits uint. - uint64_t get_64() const; // Get 64 bits uint. - - float get_float() const; - double get_double() const; - real_t get_real() const; - - Variant get_var(bool p_allow_objects = false) const; - - Vector<uint8_t> get_buffer(int64_t p_length) const; // Get an array of bytes. - String get_line() const; - Vector<String> get_csv_line(const String &p_delim = ",") const; - String get_as_text(bool p_skip_cr = false) const; - String get_md5(const String &p_path) const; - String get_sha256(const String &p_path) const; - - /* - * Use this for files WRITTEN in _big_ endian machines (ie, amiga/mac). - * It's not about the current CPU type but file formats. - * This flag gets reset to `false` (little endian) on each open. - */ - void set_big_endian(bool p_big_endian); - bool is_big_endian(); - - Error get_error() const; // Get last error. - - void store_8(uint8_t p_dest); // Store a byte. - void store_16(uint16_t p_dest); // Store 16 bits uint. - void store_32(uint32_t p_dest); // Store 32 bits uint. - void store_64(uint64_t p_dest); // Store 64 bits uint. - - void store_float(float p_dest); - void store_double(double p_dest); - void store_real(real_t p_real); - - void store_string(const String &p_string); - void store_line(const String &p_string); - void store_csv_line(const Vector<String> &p_values, const String &p_delim = ","); - - virtual void store_pascal_string(const String &p_string); - virtual String get_pascal_string(); - - void store_buffer(const Vector<uint8_t> &p_buffer); // Store an array of bytes. - - void store_var(const Variant &p_var, bool p_full_objects = false); - - static bool file_exists(const String &p_name); // Return true if a file exists. - - uint64_t get_modified_time(const String &p_file) const; - - File() {} -}; - -class Directory : public RefCounted { - GDCLASS(Directory, RefCounted); - Ref<DirAccess> d; - - bool dir_open = false; - bool include_navigational = false; - bool include_hidden = false; - -protected: - static void _bind_methods(); - -public: - Error open(const String &p_path); - - bool is_open() const; - - Error list_dir_begin(); - String get_next(); - bool current_is_dir() const; - void list_dir_end(); - - PackedStringArray get_files(); - PackedStringArray get_directories(); - PackedStringArray _get_contents(bool p_directories); - - void set_include_navigational(bool p_enable); - bool get_include_navigational() const; - void set_include_hidden(bool p_enable); - bool get_include_hidden() const; - - int get_drive_count(); - String get_drive(int p_drive); - int get_current_drive(); - - Error change_dir(String p_dir); // Can be relative or absolute, return false on success. - String get_current_dir(); // Return current dir location. - - Error make_dir(String p_dir); - Error make_dir_recursive(String p_dir); - - bool file_exists(String p_file); - bool dir_exists(String p_dir); - - uint64_t get_space_left(); - - Error copy(String p_from, String p_to); - Error rename(String p_from, String p_to); - Error remove(String p_name); - - Directory(); -}; - class Marshalls : public Object { GDCLASS(Marshalls, Object); @@ -639,8 +488,8 @@ public: double get_physics_jitter_fix() const; double get_physics_interpolation_fraction() const; - void set_target_fps(int p_fps); - int get_target_fps() const; + void set_max_fps(int p_fps); + int get_max_fps() const; double get_frames_per_second() const; uint64_t get_physics_frames() const; @@ -736,9 +585,6 @@ VARIANT_ENUM_CAST(core_bind::Geometry2D::PolyBooleanOperation); VARIANT_ENUM_CAST(core_bind::Geometry2D::PolyJoinType); VARIANT_ENUM_CAST(core_bind::Geometry2D::PolyEndType); -VARIANT_ENUM_CAST(core_bind::File::ModeFlags); -VARIANT_ENUM_CAST(core_bind::File::CompressionMode); - VARIANT_ENUM_CAST(core_bind::Thread::Priority); #endif // CORE_BIND_H diff --git a/core/core_builders.py b/core/core_builders.py index b07daa80ae..b0a3b85d58 100644 --- a/core/core_builders.py +++ b/core/core_builders.py @@ -2,6 +2,7 @@ All such functions are invoked in a subprocess on Windows to prevent build flakiness. """ +import zlib from platform_methods import subprocess_main @@ -33,7 +34,6 @@ def make_certs_header(target, source, env): g = open(dst, "w", encoding="utf-8") buf = f.read() decomp_size = len(buf) - import zlib # Use maximum zlib compression level to further reduce file size # (at the cost of initial build times). @@ -208,7 +208,7 @@ def make_license_header(target, source, env): from collections import OrderedDict - projects = OrderedDict() + projects: dict = OrderedDict() license_list = [] with open(src_copyright, "r", encoding="utf-8") as copyright_file: @@ -230,7 +230,7 @@ def make_license_header(target, source, env): part = {} reader.next_line() - data_list = [] + data_list: list = [] for project in iter(projects.values()): for part in project: part["file_index"] = len(data_list) diff --git a/core/core_constants.cpp b/core/core_constants.cpp index 2f8b28363b..c784d87c87 100644 --- a/core/core_constants.cpp +++ b/core/core_constants.cpp @@ -646,6 +646,7 @@ void register_global_constants() { BIND_CORE_ENUM_CONSTANT(PROPERTY_USAGE_DEFERRED_SET_RESOURCE); BIND_CORE_ENUM_CONSTANT(PROPERTY_USAGE_EDITOR_INSTANTIATE_OBJECT); BIND_CORE_ENUM_CONSTANT(PROPERTY_USAGE_EDITOR_BASIC_SETTING); + BIND_CORE_ENUM_CONSTANT(PROPERTY_USAGE_READ_ONLY); BIND_CORE_ENUM_CONSTANT(PROPERTY_USAGE_ARRAY); BIND_CORE_ENUM_CONSTANT(PROPERTY_USAGE_DEFAULT); diff --git a/core/debugger/remote_debugger_peer.cpp b/core/debugger/remote_debugger_peer.cpp index e9362b4ea4..525362ec7c 100644 --- a/core/debugger/remote_debugger_peer.cpp +++ b/core/debugger/remote_debugger_peer.cpp @@ -79,10 +79,8 @@ RemoteDebuggerPeerTCP::RemoteDebuggerPeerTCP(Ref<StreamPeerTCP> p_tcp) { tcp_client = p_tcp; if (tcp_client.is_valid()) { // Attaching to an already connected stream. connected = true; -#ifndef NO_THREADS running = true; thread.start(_thread_func, this); -#endif } else { tcp_client.instantiate(); } @@ -183,10 +181,8 @@ Error RemoteDebuggerPeerTCP::connect_to_host(const String &p_host, uint16_t p_po return FAILED; } connected = true; -#ifndef NO_THREADS running = true; thread.start(_thread_func, this); -#endif return OK; } @@ -208,9 +204,7 @@ void RemoteDebuggerPeerTCP::_thread_func(void *p_ud) { } void RemoteDebuggerPeerTCP::poll() { -#ifdef NO_THREADS - _poll(); -#endif + // Nothing to do, polling is done in thread. } void RemoteDebuggerPeerTCP::_poll() { diff --git a/core/debugger/remote_debugger_peer.h b/core/debugger/remote_debugger_peer.h index 473fd8d712..2ab641d537 100644 --- a/core/debugger/remote_debugger_peer.h +++ b/core/debugger/remote_debugger_peer.h @@ -43,12 +43,12 @@ protected: public: virtual bool is_peer_connected() = 0; + virtual int get_max_message_size() const = 0; virtual bool has_message() = 0; virtual Error put_message(const Array &p_arr) = 0; virtual Array get_message() = 0; virtual void close() = 0; virtual void poll() = 0; - virtual int get_max_message_size() const = 0; virtual bool can_block() const { return true; } // If blocking io is allowed on main thread (debug). RemoteDebuggerPeer(); @@ -81,12 +81,12 @@ public: Error connect_to_host(const String &p_host, uint16_t p_port); - void poll() override; bool is_peer_connected() override; + int get_max_message_size() const override; bool has_message() override; - Array get_message() override; Error put_message(const Array &p_arr) override; - int get_max_message_size() const override; + Array get_message() override; + void poll() override; void close() override; RemoteDebuggerPeerTCP(Ref<StreamPeerTCP> p_stream = Ref<StreamPeerTCP>()); diff --git a/core/doc_data.h b/core/doc_data.h index 1d8d2483e0..bb356f027e 100644 --- a/core/doc_data.h +++ b/core/doc_data.h @@ -32,7 +32,6 @@ #define DOC_DATA_H #include "core/io/xml_parser.h" -#include "core/templates/rb_map.h" #include "core/variant/variant.h" struct ScriptMemberInfo { @@ -66,6 +65,8 @@ public: String return_enum; String qualifiers; String description; + bool is_deprecated = false; + bool is_experimental = false; Vector<ArgumentDoc> arguments; Vector<int> errors_returned; bool operator<(const MethodDoc &p_method) const { @@ -105,6 +106,8 @@ public: String enumeration; bool is_bitfield = false; String description; + bool is_deprecated = false; + bool is_experimental = false; bool operator<(const ConstantDoc &p_const) const { return name < p_const.name; } @@ -126,6 +129,8 @@ public: String default_value; bool overridden = false; String overrides; + bool is_deprecated = false; + bool is_experimental = false; bool operator<(const PropertyDoc &p_prop) const { return name < p_prop.name; } @@ -167,6 +172,8 @@ public: Vector<PropertyDoc> properties; Vector<MethodDoc> annotations; Vector<ThemeItemDoc> theme_properties; + bool is_deprecated = false; + bool is_experimental = false; bool is_script_doc = false; String script_path; bool operator<(const ClassDoc &p_class) const { diff --git a/core/extension/extension_api_dump.cpp b/core/extension/extension_api_dump.cpp index 5cf951a93c..e6e0fff266 100644 --- a/core/extension/extension_api_dump.cpp +++ b/core/extension/extension_api_dump.cpp @@ -46,6 +46,9 @@ static String get_type_name(const PropertyInfo &p_info) { return p_info.hint_string + "*"; } } + 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::INT && (p_info.usage & (PROPERTY_USAGE_CLASS_IS_ENUM))) { return String("enum::") + String(p_info.class_name); } @@ -215,7 +218,7 @@ Dictionary NativeExtensionAPIDump::generate_extension_api() { String name = t == Variant::VARIANT_MAX ? String("Variant") : Variant::get_type_name(t); Dictionary d2; d2["name"] = name; - uint32_t size; + uint32_t size = 0; switch (i) { case 0: size = type_size_array[j].size_32_bits_real_float; @@ -330,7 +333,7 @@ Dictionary NativeExtensionAPIDump::generate_extension_api() { last_type = t; } Dictionary d3; - uint32_t offset; + uint32_t offset = 0; switch (i) { case 0: offset = member_offset_array[idx].offset_32_bits_real_float; @@ -462,7 +465,7 @@ Dictionary NativeExtensionAPIDump::generate_extension_api() { d["indexing_return_type"] = index_type == Variant::NIL ? String("Variant") : Variant::get_type_name(index_type); } - d["is_keyed"] = Variant::ValidatedKeyedSetter(type); + d["is_keyed"] = Variant::is_keyed(type); { //members diff --git a/core/extension/gdnative_interface.cpp b/core/extension/gdnative_interface.cpp index ef0b590030..193fcb8916 100644 --- a/core/extension/gdnative_interface.cpp +++ b/core/extension/gdnative_interface.cpp @@ -251,27 +251,6 @@ static GDNativeBool gdnative_variant_booleanize(const GDNativeVariantPtr p_self) return self->booleanize(); } -static void gdnative_variant_sub(const GDNativeVariantPtr p_a, const GDNativeVariantPtr p_b, GDNativeVariantPtr r_dst) { - const Variant *a = (const Variant *)p_a; - const Variant *b = (const Variant *)p_b; - memnew_placement(r_dst, Variant); - Variant::sub(*a, *b, *(Variant *)r_dst); -} - -static void gdnative_variant_blend(const GDNativeVariantPtr p_a, const GDNativeVariantPtr p_b, float p_c, GDNativeVariantPtr r_dst) { - const Variant *a = (const Variant *)p_a; - const Variant *b = (const Variant *)p_b; - memnew_placement(r_dst, Variant); - Variant::blend(*a, *b, p_c, *(Variant *)r_dst); -} - -static void gdnative_variant_interpolate(const GDNativeVariantPtr p_a, const GDNativeVariantPtr p_b, float p_c, GDNativeVariantPtr r_dst) { - const Variant *a = (const Variant *)p_a; - const Variant *b = (const Variant *)p_b; - memnew_placement(r_dst, Variant); - Variant::interpolate(*a, *b, p_c, *(Variant *)r_dst); -} - static void gdnative_variant_duplicate(const GDNativeVariantPtr p_self, GDNativeVariantPtr r_ret, GDNativeBool p_deep) { const Variant *self = (const Variant *)p_self; memnew_placement(r_ret, Variant(self->duplicate(p_deep))); @@ -580,7 +559,7 @@ static void gdnative_string_new_with_utf32_chars(GDNativeStringPtr r_dest, const static void gdnative_string_new_with_wide_chars(GDNativeStringPtr r_dest, const wchar_t *p_contents) { String *dest = (String *)r_dest; - if (sizeof(wchar_t) == 2) { + if constexpr (sizeof(wchar_t) == 2) { // wchar_t is 16 bit, parse. memnew_placement(dest, String); dest->parse_utf16((const char16_t *)p_contents); @@ -617,7 +596,7 @@ static void gdnative_string_new_with_utf32_chars_and_len(GDNativeStringPtr r_des static void gdnative_string_new_with_wide_chars_and_len(GDNativeStringPtr r_dest, const wchar_t *p_contents, const GDNativeInt p_size) { String *dest = (String *)r_dest; - if (sizeof(wchar_t) == 2) { + if constexpr (sizeof(wchar_t) == 2) { // wchar_t is 16 bit, parse. memnew_placement(dest, String); dest->parse_utf16((const char16_t *)p_contents, p_size); @@ -676,7 +655,7 @@ static GDNativeInt gdnative_string_to_utf32_chars(const GDNativeStringPtr p_self return len; } static GDNativeInt gdnative_string_to_wide_chars(const GDNativeStringPtr p_self, wchar_t *r_text, GDNativeInt p_max_write_length) { - if (sizeof(wchar_t) == 4) { + if constexpr (sizeof(wchar_t) == 4) { return gdnative_string_to_utf32_chars(p_self, (char32_t *)r_text, p_max_write_length); } else { return gdnative_string_to_utf16_chars(p_self, (char16_t *)r_text, p_max_write_length); @@ -905,7 +884,7 @@ static GDNativeMethodBindPtr gdnative_classdb_get_method_bind(const char *p_clas MethodBind *mb = ClassDB::get_method(StringName(p_classname), StringName(p_methodname)); ERR_FAIL_COND_V(!mb, nullptr); if (mb->get_hash() != p_hash) { - ERR_PRINT_ONCE("Hash mismatch for method '" + String(p_classname) + "." + String(p_methodname) + "'."); + ERR_PRINT("Hash mismatch for method '" + String(p_classname) + "." + String(p_methodname) + "'."); return nullptr; } // MethodBind *mb = ClassDB::get_method("Node", "get_name"); @@ -970,9 +949,6 @@ void gdnative_setup_interface(GDNativeInterface *p_interface) { gdni.variant_recursive_hash = gdnative_variant_recursive_hash; gdni.variant_hash_compare = gdnative_variant_hash_compare; gdni.variant_booleanize = gdnative_variant_booleanize; - gdni.variant_sub = gdnative_variant_sub; - gdni.variant_blend = gdnative_variant_blend; - gdni.variant_interpolate = gdnative_variant_interpolate; gdni.variant_duplicate = gdnative_variant_duplicate; gdni.variant_stringify = gdnative_variant_stringify; diff --git a/core/extension/gdnative_interface.h b/core/extension/gdnative_interface.h index cb2adcb562..39378d8261 100644 --- a/core/extension/gdnative_interface.h +++ b/core/extension/gdnative_interface.h @@ -427,9 +427,6 @@ typedef struct { GDNativeInt (*variant_recursive_hash)(const GDNativeVariantPtr p_self, GDNativeInt p_recursion_count); GDNativeBool (*variant_hash_compare)(const GDNativeVariantPtr p_self, const GDNativeVariantPtr p_other); GDNativeBool (*variant_booleanize)(const GDNativeVariantPtr p_self); - void (*variant_sub)(const GDNativeVariantPtr p_a, const GDNativeVariantPtr p_b, GDNativeVariantPtr r_dst); - void (*variant_blend)(const GDNativeVariantPtr p_a, const GDNativeVariantPtr p_b, float p_c, GDNativeVariantPtr r_dst); - void (*variant_interpolate)(const GDNativeVariantPtr p_a, const GDNativeVariantPtr p_b, float p_c, GDNativeVariantPtr r_dst); void (*variant_duplicate)(const GDNativeVariantPtr p_self, GDNativeVariantPtr r_ret, GDNativeBool p_deep); void (*variant_stringify)(const GDNativeVariantPtr p_self, GDNativeStringPtr r_ret); diff --git a/core/extension/make_wrappers.py b/core/extension/make_wrappers.py index 862d313fba..1e4634ad2c 100644 --- a/core/extension/make_wrappers.py +++ b/core/extension/make_wrappers.py @@ -1,4 +1,60 @@ -proto = """ +proto_mod = """ +#define MODBIND$VER($RETTYPE m_name$ARG) \\ +virtual $RETVAL _##m_name($FUNCARGS) $CONST; \\ +_FORCE_INLINE_ virtual $RETVAL m_name($FUNCARGS) $CONST override { \\ + $RETX _##m_name($CALLARGS);\\ +} +""" + + +def generate_mod_version(argcount, const=False, returns=False): + s = proto_mod + sproto = str(argcount) + method_info = "" + if returns: + sproto += "R" + s = s.replace("$RETTYPE", "m_ret, ") + s = s.replace("$RETVAL", "m_ret") + s = s.replace("$RETX", "return") + + else: + s = s.replace("$RETTYPE", "") + s = s.replace("$RETVAL", "void") + s = s.replace("$RETX", "") + + if const: + sproto += "C" + s = s.replace("$CONST", "const") + else: + s = s.replace("$CONST", "") + + s = s.replace("$VER", sproto) + argtext = "" + funcargs = "" + callargs = "" + + for i in range(argcount): + if i > 0: + funcargs += ", " + callargs += ", " + + argtext += ", m_type" + str(i + 1) + funcargs += "m_type" + str(i + 1) + " arg" + str(i + 1) + callargs += "arg" + str(i + 1) + + if argcount: + s = s.replace("$ARG", argtext) + s = s.replace("$FUNCARGS", funcargs) + s = s.replace("$CALLARGS", callargs) + else: + s = s.replace("$ARG", "") + s = s.replace("$FUNCARGS", funcargs) + s = s.replace("$CALLARGS", callargs) + + return s + + +proto_ex = """ #define EXBIND$VER($RETTYPE m_name$ARG) \\ GDVIRTUAL$VER($RETTYPE_##m_name$ARG)\\ virtual $RETVAL m_name($FUNCARGS) $CONST override { \\ @@ -9,8 +65,8 @@ virtual $RETVAL m_name($FUNCARGS) $CONST override { \\ """ -def generate_version(argcount, const=False, returns=False): - s = proto +def generate_ex_version(argcount, const=False, returns=False): + s = proto_ex sproto = str(argcount) method_info = "" if returns: @@ -63,25 +119,28 @@ def generate_version(argcount, const=False, returns=False): def run(target, source, env): - max_versions = 12 txt = """ #ifndef GDEXTENSION_WRAPPERS_GEN_H #define GDEXTENSION_WRAPPERS_GEN_H - - """ for i in range(max_versions + 1): + txt += "\n/* Extension Wrapper " + str(i) + " Arguments */\n" + txt += generate_ex_version(i, False, False) + txt += generate_ex_version(i, False, True) + txt += generate_ex_version(i, True, False) + txt += generate_ex_version(i, True, True) - txt += "/* " + str(i) + " Arguments */\n\n" - txt += generate_version(i, False, False) - txt += generate_version(i, False, True) - txt += generate_version(i, True, False) - txt += generate_version(i, True, True) + for i in range(max_versions + 1): + txt += "\n/* Module Wrapper " + str(i) + " Arguments */\n" + txt += generate_mod_version(i, False, False) + txt += generate_mod_version(i, False, True) + txt += generate_mod_version(i, True, False) + txt += generate_mod_version(i, True, True) - txt += "#endif" + txt += "\n#endif\n" with open(target[0], "w") as f: f.write(txt) diff --git a/core/input/gamecontrollerdb.txt b/core/input/gamecontrollerdb.txt index 5ae3b2c799..774d1be6b5 100644 --- a/core/input/gamecontrollerdb.txt +++ b/core/input/gamecontrollerdb.txt @@ -21,6 +21,7 @@ 03000000c82d00000090000000000000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00001251000000000000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00001151000000000000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000150000000000000,8BitDo M30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a5,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000151000000000000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a2,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a5,start:b11,x:b3,y:b4,platform:Windows, 03000000c82d00000650000000000000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows, 03000000c82d00005106000000000000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,guide:b2,leftshoulder:b8,lefttrigger:b9,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows, @@ -68,6 +69,7 @@ 03000000c82d00000121000000000000,8BitDo SN30 Pro for Android,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, 03000000c82d00000260000000000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000261000000000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00001330000000000000,8BitDo Ultimate Wireless,a:b0,b:b1,x:b3,y:b4,back:b10,guide:b12,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b8,righttrigger:b9,paddle1:b23,paddle2:b19,platform:Windows, 03000000a00500003232000000000000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, 03000000c82d00001890000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00003032000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, @@ -367,6 +369,7 @@ 030000002a0600001024000000000000,Matricom,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows, 030000009f000000adbb000000000000,MaxJoypad Virtual Controller,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, 03000000250900000128000000000000,Mayflash Arcade Stick,a:b1,b:b2,back:b8,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b5,y:b6,platform:Windows, +03000000242f00003700000000000000,Mayflash F101,a:b1,b:b2,back:b8,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, 03000000790000003018000000000000,Mayflash F300 Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, 03000000242f00003900000000000000,Mayflash F300 Elite Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 03000000790000004418000000000000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Windows, @@ -439,6 +442,7 @@ 03000000790000002201000000000000,PC Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, 030000006f0e00008501000000000000,PDP Fightpad Pro,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b0,platform:Windows, 030000006f0e00000901000000000000,PDP Versus Fighting,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000008f0e00004100000000000000,PlaySega,a:b1,b:b0,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b8,x:b4,y:b3,platform:Windows, 03000000e30500009605000000000000,PlayStation Adapter,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, 030000004c050000da0c000000000000,PlayStation Classic Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, 03000000632500002306000000000000,PlayStation Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows, @@ -463,6 +467,7 @@ 03000000666600006706000000000000,PS2 Controller,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Windows, 030000006b1400000303000000000000,PS2 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, 030000009d0d00001330000000000000,PS2 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000151a00006222000000000000,PS2 Dual Plus Adapter,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, 03000000120a00000100000000000000,PS3 Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, 03000000120c00001307000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 03000000120c00001cf1000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, @@ -735,11 +740,14 @@ 03000000341a00000608000000000000,Xeox,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, 03000000450c00002043000000000000,Xeox SL6556BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, 030000006f0e00000300000000000000,XGear,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Windows, -03000000172700004431000000000000,XiaoMi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a7,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000172700004431000000000000,Xiaomi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a7,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000bc2000005060000000000000,Xiaomi XMGP01YM,a:b0,b:b1,x:b3,y:b4,back:b10,guide:b12,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,-lefty:-a1,+lefty:+a2,rightx:a3,-righty:-a4,+righty:+a5,lefttrigger:b8,righttrigger:b9,platform:Windows, +03000000172700003350000000000000,Xiaomi XMGP01YM,a:b0,b:b1,x:b3,y:b4,back:b10,guide:b12,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,platform:Windows, 03000000786901006e70000000000000,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, 030000007d0400000340000000000000,Xterminator Digital Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:-a4,lefttrigger:+a4,leftx:a0,lefty:a1,paddle1:b7,paddle2:b6,rightshoulder:b5,rightstick:b9,righttrigger:b2,rightx:a3,righty:a5,start:b8,x:b3,y:b4,platform:Windows, 03000000790000004f18000000000000,ZDT Android Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000120c00000500000000000000,Zeroplus Adapter,a:b2,b:b1,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b0,righttrigger:b5,rightx:a3,righty:a2,start:b8,x:b3,y:b0,platform:Windows, 03000000120c0000101e000000000000,Zeroplus P4 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, # Mac OS X @@ -1045,11 +1053,11 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 05000000050b00000045000040000000,ASUS Gamepad,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Linux, 03000000050b00000579000011010000,ASUS ROG Kunai 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b36,paddle1:b52,paddle2:b53,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 05000000050b00000679000000010000,ASUS ROG Kunai 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b21,paddle1:b22,paddle2:b23,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -03000000503200000110000000000000,Atari Classic Controller,a:b0,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,x:b1,platform:Linux, -03000000503200000110000011010000,Atari Classic Controller,a:b0,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,x:b1,platform:Linux, -05000000503200000110000000000000,Atari Classic Controller,a:b0,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,x:b1,platform:Linux, -05000000503200000110000044010000,Atari Classic Controller,a:b0,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,x:b1,platform:Linux, -05000000503200000110000046010000,Atari Classic Controller,a:b0,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,x:b1,platform:Linux, +03000000503200000110000000000000,Atari Classic Controller,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,platform:Linux, +03000000503200000110000011010000,Atari Classic Controller,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,platform:Linux, +05000000503200000110000000000000,Atari Classic Controller,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,platform:Linux, +05000000503200000110000044010000,Atari Classic Controller,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,platform:Linux, +05000000503200000110000046010000,Atari Classic Controller,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,platform:Linux, 03000000503200000210000000000000,Atari Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a4,rightx:a2,righty:a3,start:b8,x:b2,y:b3,platform:Linux, 03000000503200000210000011010000,Atari Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux, 05000000503200000210000000000000,Atari Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux, diff --git a/core/input/godotcontrollerdb.txt b/core/input/godotcontrollerdb.txt index b2a6160c6c..e11099f380 100644 --- a/core/input/godotcontrollerdb.txt +++ b/core/input/godotcontrollerdb.txt @@ -32,6 +32,7 @@ Linux046dc216,046d-c216-Logitech Logitech Dual Action,a:b1,b:b2,y:b3,x:b0,start: Linux20d6a713,Bensussen Deutsch & Associates Inc.(BDA) NSW Wired controller,a:b1,b:b2,y:b3,x:b0,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:-a5,dpleft:-a4,dpdown:+a5,dpright:+a4,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Web Linux054c05c4,Sony Computer Entertainment Wireless Controller,a:b0,b:b1,y:b2,x:b3,start:b9,back:b8,leftstick:b11,rightstick:b12,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 Linux18d19400,18d1-9400-Google LLC Stadia Controller rev. A,a:b0,b:b1,y:b3,x:b2,start:b7,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:-a7,dpleft:-a6,dpdown:+a7,dpright:+a6,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,platform:Web +Linux054c0268,054c-0268-Sony PLAYSTATION(R)3 Controller,a:b0,b:b1,y:b2,x:b3,start:b9,back:b8,leftstick:b11,rightstick:b12,leftshoulder:b4,rightshoulder:b5,dpup:b13,dpleft:b15,dpdown:b14,dpright:b16,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Web # UWP __UWP_GAMEPAD__,Xbox Controller,a:b2,b:b3,x:b4,y:b5,start:b0,back:b1,leftstick:b12,rightstick:b13,leftshoulder:b10,rightshoulder:b11,dpup:b6,dpdown:b7,dpleft:b8,dpright:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,platform:UWP, diff --git a/core/input/input_builders.py b/core/input/input_builders.py index 16f125ff38..a7729c9af2 100644 --- a/core/input/input_builders.py +++ b/core/input/input_builders.py @@ -16,7 +16,7 @@ def make_default_controller_mappings(target, source, env): g.write('#include "core/input/default_controller_mappings.h"\n') # ensure mappings have a consistent order - platform_mappings = OrderedDict() + platform_mappings: dict = OrderedDict() for src_path in source: with open(src_path, "r") as f: # read mapping file and skip header diff --git a/core/input/input_event.cpp b/core/input/input_event.cpp index 596b704732..712fc68c93 100644 --- a/core/input/input_event.cpp +++ b/core/input/input_event.cpp @@ -1325,7 +1325,7 @@ bool InputEventAction::is_match(const Ref<InputEvent> &p_event, bool p_exact_mat return false; } - return p_event->is_action(action); + return p_event->is_action(action, p_exact_match); } bool InputEventAction::is_action(const StringName &p_action) const { diff --git a/core/io/dir_access.cpp b/core/io/dir_access.cpp index bed41b8d89..79e7fa16e3 100644 --- a/core/io/dir_access.cpp +++ b/core/io/dir_access.cpp @@ -36,6 +36,8 @@ #include "core/os/os.h" #include "core/templates/local_vector.h" +thread_local Error DirAccess::last_dir_open_error = OK; + String DirAccess::_get_root_path() const { switch (_access_type) { case ACCESS_RESOURCES: @@ -249,6 +251,61 @@ Ref<DirAccess> DirAccess::open(const String &p_path, Error *r_error) { return da; } +Ref<DirAccess> DirAccess::_open(const String &p_path) { + Error err = OK; + Ref<DirAccess> da = open(p_path, &err); + last_dir_open_error = err; + if (err) { + return Ref<DirAccess>(); + } + return da; +} + +int DirAccess::_get_drive_count() { + Ref<DirAccess> d = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); + return d->get_drive_count(); +} + +String DirAccess::get_drive_name(int p_idx) { + Ref<DirAccess> d = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); + return d->get_drive(p_idx); +} + +Error DirAccess::make_dir_absolute(const String &p_dir) { + Ref<DirAccess> d = DirAccess::create_for_path(p_dir); + return d->make_dir(p_dir); +} + +Error DirAccess::make_dir_recursive_absolute(const String &p_dir) { + Ref<DirAccess> d = DirAccess::create_for_path(p_dir); + return d->make_dir_recursive(p_dir); +} + +bool DirAccess::dir_exists_absolute(const String &p_dir) { + Ref<DirAccess> d = DirAccess::create_for_path(p_dir); + return d->dir_exists(p_dir); +} + +Error DirAccess::copy_absolute(const String &p_from, const String &p_to, int p_chmod_flags) { + Ref<DirAccess> d = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); + // Support copying from res:// to user:// etc. + String from = ProjectSettings::get_singleton()->globalize_path(p_from); + String to = ProjectSettings::get_singleton()->globalize_path(p_to); + return d->copy(from, to, p_chmod_flags); +} + +Error DirAccess::rename_absolute(const String &p_from, const String &p_to) { + Ref<DirAccess> d = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); + String from = ProjectSettings::get_singleton()->globalize_path(p_from); + String to = ProjectSettings::get_singleton()->globalize_path(p_to); + return d->rename(from, to); +} + +Error DirAccess::remove_absolute(const String &p_path) { + Ref<DirAccess> d = DirAccess::create_for_path(p_path); + return d->remove(p_path); +} + Ref<DirAccess> DirAccess::create(AccessType p_access) { Ref<DirAccess> da = create_func[p_access] ? create_func[p_access]() : nullptr; if (da.is_valid()) { @@ -266,6 +323,10 @@ Ref<DirAccess> DirAccess::create(AccessType p_access) { return da; } +Error DirAccess::get_open_error() { + return last_dir_open_error; +} + String DirAccess::get_full_path(const String &p_path, AccessType p_access) { Ref<DirAccess> d = DirAccess::create(p_access); if (d.is_null()) { @@ -424,3 +485,104 @@ bool DirAccess::exists(String p_dir) { Ref<DirAccess> da = DirAccess::create_for_path(p_dir); return da->change_dir(p_dir) == OK; } + +PackedStringArray DirAccess::get_files() { + return _get_contents(false); +} + +PackedStringArray DirAccess::get_files_at(const String &p_path) { + Ref<DirAccess> da = DirAccess::open(p_path); + ERR_FAIL_COND_V_MSG(da.is_null(), PackedStringArray(), vformat("Couldn't open directory at path \"%s\".", p_path)); + return da->get_files(); +} + +PackedStringArray DirAccess::get_directories() { + return _get_contents(true); +} + +PackedStringArray DirAccess::get_directories_at(const String &p_path) { + Ref<DirAccess> da = DirAccess::open(p_path); + ERR_FAIL_COND_V_MSG(da.is_null(), PackedStringArray(), vformat("Couldn't open directory at path \"%s\".", p_path)); + return da->get_directories(); +} + +PackedStringArray DirAccess::_get_contents(bool p_directories) { + PackedStringArray ret; + + list_dir_begin(); + String s = _get_next(); + while (!s.is_empty()) { + if (current_is_dir() == p_directories) { + ret.append(s); + } + s = _get_next(); + } + + ret.sort(); + return ret; +} + +String DirAccess::_get_next() { + String next = get_next(); + while (!next.is_empty() && ((!include_navigational && (next == "." || next == "..")) || (!include_hidden && current_is_hidden()))) { + next = get_next(); + } + return next; +} + +void DirAccess::set_include_navigational(bool p_enable) { + include_navigational = p_enable; +} + +bool DirAccess::get_include_navigational() const { + return include_navigational; +} + +void DirAccess::set_include_hidden(bool p_enable) { + include_hidden = p_enable; +} + +bool DirAccess::get_include_hidden() const { + return include_hidden; +} + +void DirAccess::_bind_methods() { + ClassDB::bind_static_method("DirAccess", D_METHOD("open", "path"), &DirAccess::_open); + ClassDB::bind_static_method("DirAccess", D_METHOD("get_open_error"), &DirAccess::get_open_error); + + ClassDB::bind_method(D_METHOD("list_dir_begin"), &DirAccess::list_dir_begin, DEFVAL(false), DEFVAL(false)); + ClassDB::bind_method(D_METHOD("get_next"), &DirAccess::_get_next); + ClassDB::bind_method(D_METHOD("current_is_dir"), &DirAccess::current_is_dir); + ClassDB::bind_method(D_METHOD("list_dir_end"), &DirAccess::list_dir_end); + ClassDB::bind_method(D_METHOD("get_files"), &DirAccess::get_files); + ClassDB::bind_static_method("DirAccess", D_METHOD("get_files_at", "path"), &DirAccess::get_files_at); + ClassDB::bind_method(D_METHOD("get_directories"), &DirAccess::get_directories); + ClassDB::bind_static_method("DirAccess", D_METHOD("get_directories_at", "path"), &DirAccess::get_directories_at); + ClassDB::bind_static_method("DirAccess", D_METHOD("get_drive_count"), &DirAccess::_get_drive_count); + ClassDB::bind_static_method("DirAccess", D_METHOD("get_drive_name", "idx"), &DirAccess::get_drive_name); + ClassDB::bind_method(D_METHOD("get_current_drive"), &DirAccess::get_current_drive); + ClassDB::bind_method(D_METHOD("change_dir", "to_dir"), &DirAccess::change_dir); + ClassDB::bind_method(D_METHOD("get_current_dir", "include_drive"), &DirAccess::get_current_dir, DEFVAL(true)); + ClassDB::bind_method(D_METHOD("make_dir", "path"), &DirAccess::make_dir); + ClassDB::bind_static_method("DirAccess", D_METHOD("make_dir_absolute", "path"), &DirAccess::make_dir_absolute); + ClassDB::bind_method(D_METHOD("make_dir_recursive", "path"), &DirAccess::make_dir_recursive); + ClassDB::bind_static_method("DirAccess", D_METHOD("make_dir_recursive_absolute", "path"), &DirAccess::make_dir_recursive_absolute); + ClassDB::bind_method(D_METHOD("file_exists", "path"), &DirAccess::file_exists); + ClassDB::bind_method(D_METHOD("dir_exists", "path"), &DirAccess::dir_exists); + ClassDB::bind_static_method("DirAccess", D_METHOD("dir_exists_absolute", "path"), &DirAccess::dir_exists_absolute); + ClassDB::bind_method(D_METHOD("get_space_left"), &DirAccess::get_space_left); + ClassDB::bind_method(D_METHOD("copy", "from", "to", "chmod_flags"), &DirAccess::copy, DEFVAL(-1)); + ClassDB::bind_static_method("DirAccess", D_METHOD("copy_absolute", "from", "to", "chmod_flags"), &DirAccess::copy_absolute, DEFVAL(-1)); + ClassDB::bind_method(D_METHOD("rename", "from", "to"), &DirAccess::rename); + ClassDB::bind_static_method("DirAccess", D_METHOD("rename_absolute", "from", "to"), &DirAccess::rename_absolute); + ClassDB::bind_method(D_METHOD("remove", "path"), &DirAccess::remove); + ClassDB::bind_static_method("DirAccess", D_METHOD("remove_absolute", "path"), &DirAccess::remove_absolute); + + ClassDB::bind_method(D_METHOD("set_include_navigational", "enable"), &DirAccess::set_include_navigational); + ClassDB::bind_method(D_METHOD("get_include_navigational"), &DirAccess::get_include_navigational); + ClassDB::bind_method(D_METHOD("set_include_hidden", "enable"), &DirAccess::set_include_hidden); + ClassDB::bind_method(D_METHOD("get_include_hidden"), &DirAccess::get_include_hidden); + + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "include_navigational"), "set_include_navigational", "get_include_navigational"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "include_hidden"), "set_include_hidden", "get_include_hidden"); +} diff --git a/core/io/dir_access.h b/core/io/dir_access.h index 2469c2a080..bd24214e73 100644 --- a/core/io/dir_access.h +++ b/core/io/dir_access.h @@ -37,6 +37,8 @@ //@ TODO, excellent candidate for THREAD_SAFE MACRO, should go through all these and add THREAD_SAFE where it applies class DirAccess : public RefCounted { + GDCLASS(DirAccess, RefCounted); + public: enum AccessType { ACCESS_RESOURCES, @@ -50,10 +52,18 @@ public: private: AccessType _access_type = ACCESS_FILESYSTEM; static CreateFunc create_func[ACCESS_MAX]; ///< set this to instance a filesystem object + static Ref<DirAccess> _open(const String &p_path); Error _copy_dir(Ref<DirAccess> &p_target_da, String p_to, int p_chmod_flags, bool p_copy_links); + PackedStringArray _get_contents(bool p_directories); + + thread_local static Error last_dir_open_error; + bool include_navigational = false; + bool include_hidden = false; protected: + static void _bind_methods(); + String _get_root_path() const; virtual String _get_root_string() const; @@ -118,6 +128,7 @@ public: static Ref<DirAccess> create_for_path(const String &p_path); static Ref<DirAccess> create(AccessType p_access); + static Error get_open_error(); template <class T> static void make_default(AccessType p_access) { @@ -126,6 +137,28 @@ public: static Ref<DirAccess> open(const String &p_path, Error *r_error = nullptr); + static int _get_drive_count(); + static String get_drive_name(int p_idx); + + static Error make_dir_absolute(const String &p_dir); + static Error make_dir_recursive_absolute(const String &p_dir); + static bool dir_exists_absolute(const String &p_dir); + + static Error copy_absolute(const String &p_from, const String &p_to, int p_chmod_flags = -1); + static Error rename_absolute(const String &p_from, const String &p_to); + static Error remove_absolute(const String &p_path); + + PackedStringArray get_files(); + static PackedStringArray get_files_at(const String &p_path); + PackedStringArray get_directories(); + static PackedStringArray get_directories_at(const String &p_path); + String _get_next(); + + void set_include_navigational(bool p_enable); + bool get_include_navigational() const; + void set_include_hidden(bool p_enable); + bool get_include_hidden() const; + DirAccess() {} virtual ~DirAccess() {} }; diff --git a/core/io/file_access.cpp b/core/io/file_access.cpp index 72c00bd678..cb25564342 100644 --- a/core/io/file_access.cpp +++ b/core/io/file_access.cpp @@ -32,6 +32,8 @@ #include "core/config/project_settings.h" #include "core/crypto/crypto_core.h" +#include "core/io/file_access_compressed.h" +#include "core/io/file_access_encrypted.h" #include "core/io/file_access_pack.h" #include "core/io/marshalls.h" #include "core/os/os.h" @@ -41,6 +43,7 @@ FileAccess::CreateFunc FileAccess::create_func[ACCESS_MAX] = { nullptr, nullptr FileAccess::FileCloseFailNotify FileAccess::close_fail_notify = nullptr; bool FileAccess::backup_save = false; +thread_local Error FileAccess::last_file_open_error = OK; Ref<FileAccess> FileAccess::create(AccessType p_access) { ERR_FAIL_INDEX_V(p_access, ACCESS_MAX, nullptr); @@ -81,7 +84,7 @@ Ref<FileAccess> FileAccess::create_for_path(const String &p_path) { } Error FileAccess::reopen(const String &p_path, int p_mode_flags) { - return _open(p_path, p_mode_flags); + return open_internal(p_path, p_mode_flags); } Ref<FileAccess> FileAccess::open(const String &p_path, int p_mode_flags, Error *r_error) { @@ -99,7 +102,7 @@ Ref<FileAccess> FileAccess::open(const String &p_path, int p_mode_flags, Error * } ret = create_for_path(p_path); - Error err = ret->_open(p_path, p_mode_flags); + Error err = ret->open_internal(p_path, p_mode_flags); if (r_error) { *r_error = err; @@ -111,6 +114,66 @@ Ref<FileAccess> FileAccess::open(const String &p_path, int p_mode_flags, Error * return ret; } +Ref<FileAccess> FileAccess::_open(const String &p_path, ModeFlags p_mode_flags) { + Error err = OK; + Ref<FileAccess> fa = open(p_path, p_mode_flags, &err); + last_file_open_error = err; + if (err) { + return Ref<FileAccess>(); + } + return fa; +} + +Ref<FileAccess> FileAccess::open_encrypted(const String &p_path, ModeFlags p_mode_flags, const Vector<uint8_t> &p_key) { + Ref<FileAccess> fa = _open(p_path, p_mode_flags); + if (fa.is_null()) { + return fa; + } + + Ref<FileAccessEncrypted> fae; + fae.instantiate(); + Error err = fae->open_and_parse(fa, p_key, (p_mode_flags == WRITE) ? FileAccessEncrypted::MODE_WRITE_AES256 : FileAccessEncrypted::MODE_READ); + if (err) { + last_file_open_error = err; + return Ref<FileAccess>(); + } + return fae; +} + +Ref<FileAccess> FileAccess::open_encrypted_pass(const String &p_path, ModeFlags p_mode_flags, const String &p_pass) { + Ref<FileAccess> fa = _open(p_path, p_mode_flags); + if (fa.is_null()) { + return fa; + } + + Ref<FileAccessEncrypted> fae; + fae.instantiate(); + Error err = fae->open_and_parse_password(fa, p_pass, (p_mode_flags == WRITE) ? FileAccessEncrypted::MODE_WRITE_AES256 : FileAccessEncrypted::MODE_READ); + if (err) { + last_file_open_error = err; + return Ref<FileAccess>(); + } + return fae; +} + +Ref<FileAccess> FileAccess::open_compressed(const String &p_path, ModeFlags p_mode_flags, CompressionMode p_compress_mode) { + Ref<FileAccessCompressed> fac; + fac.instantiate(); + fac->configure("GCPF", (Compression::Mode)p_compress_mode); + Error err = fac->open_internal(p_path, p_mode_flags); + + if (err) { + last_file_open_error = err; + return Ref<FileAccess>(); + } + + return fac; +} + +Error FileAccess::get_open_error() { + return last_file_open_error; +} + FileAccess::CreateFunc FileAccess::get_create_func(AccessType p_access) { return create_func[p_access]; } @@ -227,6 +290,20 @@ real_t FileAccess::get_real() const { } } +Variant FileAccess::get_var(bool p_allow_objects) const { + uint32_t len = get_32(); + Vector<uint8_t> buff = _get_buffer(len); + ERR_FAIL_COND_V((uint32_t)buff.size() != len, Variant()); + + const uint8_t *r = buff.ptr(); + + Variant v; + Error err = decode_variant(v, &r[0], len, nullptr, p_allow_objects); + ERR_FAIL_COND_V_MSG(err != OK, Variant(), "Error when trying to encode Variant."); + + return v; +} + double FileAccess::get_double() const { MarshallDouble m; m.l = get_64(); @@ -370,6 +447,17 @@ Vector<String> FileAccess::get_csv_line(const String &p_delim) const { return strings; } +String FileAccess::get_as_text(bool p_skip_cr) const { + uint64_t original_pos = get_position(); + const_cast<FileAccess *>(this)->seek(0); + + String text = get_as_utf8_string(p_skip_cr); + + const_cast<FileAccess *>(this)->seek(original_pos); + + 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); @@ -381,6 +469,27 @@ uint64_t FileAccess::get_buffer(uint8_t *p_dst, uint64_t p_length) const { return i; } +Vector<uint8_t> FileAccess::_get_buffer(int64_t p_length) const { + Vector<uint8_t> data; + + ERR_FAIL_COND_V_MSG(p_length < 0, data, "Length of buffer cannot be smaller than 0."); + if (p_length == 0) { + return data; + } + + Error err = data.resize(p_length); + 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); + + if (len < p_length) { + data.resize(len); + } + + return data; +} + String FileAccess::get_as_utf8_string(bool p_skip_cr) const { Vector<uint8_t> sourcef; uint64_t len = get_length(); @@ -439,7 +548,7 @@ void FileAccess::store_64(uint64_t p_dest) { } void FileAccess::store_real(real_t p_real) { - if (sizeof(real_t) == 4) { + if constexpr (sizeof(real_t) == 4) { store_float(p_real); } else { store_double(p_real); @@ -554,6 +663,33 @@ void FileAccess::store_buffer(const uint8_t *p_src, uint64_t p_length) { } } +void FileAccess::_store_buffer(const Vector<uint8_t> &p_buffer) { + uint64_t len = p_buffer.size(); + if (len == 0) { + return; + } + + const uint8_t *r = p_buffer.ptr(); + + store_buffer(&r[0], len); +} + +void FileAccess::store_var(const Variant &p_var, bool p_full_objects) { + int len; + Error err = encode_variant(p_var, nullptr, len, p_full_objects); + ERR_FAIL_COND_MSG(err != OK, "Error when trying to encode Variant."); + + Vector<uint8_t> buff; + buff.resize(len); + + uint8_t *w = buff.ptrw(); + err = encode_variant(p_var, &w[0], len, p_full_objects); + ERR_FAIL_COND_MSG(err != OK, "Error when trying to encode Variant."); + + store_32(len); + _store_buffer(buff); +} + Vector<uint8_t> FileAccess::get_file_as_array(const String &p_path, Error *r_error) { Ref<FileAccess> f = FileAccess::open(p_path, READ, r_error); if (f.is_null()) { @@ -666,3 +802,69 @@ String FileAccess::get_sha256(const String &p_file) { return String::hex_encode_buffer(hash, 32); } + +void FileAccess::_bind_methods() { + ClassDB::bind_static_method("FileAccess", D_METHOD("open", "path", "flags"), &FileAccess::_open); + ClassDB::bind_static_method("FileAccess", D_METHOD("open_encrypted", "path", "mode_flags", "key"), &FileAccess::open_encrypted); + ClassDB::bind_static_method("FileAccess", D_METHOD("open_encrypted_with_pass", "path", "mode_flags", "pass"), &FileAccess::open_encrypted_pass); + ClassDB::bind_static_method("FileAccess", D_METHOD("open_compressed", "path", "mode_flags", "compression_mode"), &FileAccess::open_compressed, DEFVAL(0)); + ClassDB::bind_static_method("FileAccess", D_METHOD("get_open_error"), &FileAccess::get_open_error); + + ClassDB::bind_method(D_METHOD("flush"), &FileAccess::flush); + ClassDB::bind_method(D_METHOD("get_path"), &FileAccess::get_path); + ClassDB::bind_method(D_METHOD("get_path_absolute"), &FileAccess::get_path_absolute); + ClassDB::bind_method(D_METHOD("is_open"), &FileAccess::is_open); + ClassDB::bind_method(D_METHOD("seek", "position"), &FileAccess::seek); + ClassDB::bind_method(D_METHOD("seek_end", "position"), &FileAccess::seek_end, DEFVAL(0)); + ClassDB::bind_method(D_METHOD("get_position"), &FileAccess::get_position); + ClassDB::bind_method(D_METHOD("get_length"), &FileAccess::get_length); + ClassDB::bind_method(D_METHOD("eof_reached"), &FileAccess::eof_reached); + ClassDB::bind_method(D_METHOD("get_8"), &FileAccess::get_8); + ClassDB::bind_method(D_METHOD("get_16"), &FileAccess::get_16); + ClassDB::bind_method(D_METHOD("get_32"), &FileAccess::get_32); + ClassDB::bind_method(D_METHOD("get_64"), &FileAccess::get_64); + ClassDB::bind_method(D_METHOD("get_float"), &FileAccess::get_float); + ClassDB::bind_method(D_METHOD("get_double"), &FileAccess::get_double); + ClassDB::bind_method(D_METHOD("get_real"), &FileAccess::get_real); + ClassDB::bind_method(D_METHOD("get_buffer", "length"), &FileAccess::_get_buffer); + ClassDB::bind_method(D_METHOD("get_line"), &FileAccess::get_line); + ClassDB::bind_method(D_METHOD("get_csv_line", "delim"), &FileAccess::get_csv_line, DEFVAL(",")); + ClassDB::bind_method(D_METHOD("get_as_text", "skip_cr"), &FileAccess::get_as_text, DEFVAL(false)); + ClassDB::bind_static_method("FileAccess", D_METHOD("get_md5", "path"), &FileAccess::get_md5); + ClassDB::bind_static_method("FileAccess", D_METHOD("get_sha256", "path"), &FileAccess::get_sha256); + ClassDB::bind_method(D_METHOD("is_big_endian"), &FileAccess::is_big_endian); + ClassDB::bind_method(D_METHOD("set_big_endian", "big_endian"), &FileAccess::set_big_endian); + ClassDB::bind_method(D_METHOD("get_error"), &FileAccess::get_error); + ClassDB::bind_method(D_METHOD("get_var", "allow_objects"), &FileAccess::get_var, DEFVAL(false)); + + ClassDB::bind_method(D_METHOD("store_8", "value"), &FileAccess::store_8); + ClassDB::bind_method(D_METHOD("store_16", "value"), &FileAccess::store_16); + ClassDB::bind_method(D_METHOD("store_32", "value"), &FileAccess::store_32); + ClassDB::bind_method(D_METHOD("store_64", "value"), &FileAccess::store_64); + ClassDB::bind_method(D_METHOD("store_float", "value"), &FileAccess::store_float); + ClassDB::bind_method(D_METHOD("store_double", "value"), &FileAccess::store_double); + ClassDB::bind_method(D_METHOD("store_real", "value"), &FileAccess::store_real); + ClassDB::bind_method(D_METHOD("store_buffer", "buffer"), &FileAccess::_store_buffer); + ClassDB::bind_method(D_METHOD("store_line", "line"), &FileAccess::store_line); + ClassDB::bind_method(D_METHOD("store_csv_line", "values", "delim"), &FileAccess::store_csv_line, DEFVAL(",")); + ClassDB::bind_method(D_METHOD("store_string", "string"), &FileAccess::store_string); + ClassDB::bind_method(D_METHOD("store_var", "value", "full_objects"), &FileAccess::store_var, DEFVAL(false)); + + ClassDB::bind_method(D_METHOD("store_pascal_string", "string"), &FileAccess::store_pascal_string); + ClassDB::bind_method(D_METHOD("get_pascal_string"), &FileAccess::get_pascal_string); + + ClassDB::bind_static_method("FileAccess", D_METHOD("file_exists", "path"), &FileAccess::exists); + ClassDB::bind_static_method("FileAccess", D_METHOD("get_modified_time", "file"), &FileAccess::get_modified_time); + + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "big_endian"), "set_big_endian", "is_big_endian"); + + BIND_ENUM_CONSTANT(READ); + BIND_ENUM_CONSTANT(WRITE); + BIND_ENUM_CONSTANT(READ_WRITE); + BIND_ENUM_CONSTANT(WRITE_READ); + + BIND_ENUM_CONSTANT(COMPRESSION_FASTLZ); + BIND_ENUM_CONSTANT(COMPRESSION_DEFLATE); + BIND_ENUM_CONSTANT(COMPRESSION_ZSTD); + BIND_ENUM_CONSTANT(COMPRESSION_GZIP); +} diff --git a/core/io/file_access.h b/core/io/file_access.h index fc0eb95d44..8ca44306a0 100644 --- a/core/io/file_access.h +++ b/core/io/file_access.h @@ -31,6 +31,7 @@ #ifndef FILE_ACCESS_H #define FILE_ACCESS_H +#include "core/io/compression.h" #include "core/math/math_defs.h" #include "core/object/ref_counted.h" #include "core/os/memory.h" @@ -42,6 +43,8 @@ */ class FileAccess : public RefCounted { + GDCLASS(FileAccess, RefCounted); + public: enum AccessType { ACCESS_RESOURCES, @@ -50,6 +53,20 @@ public: ACCESS_MAX }; + enum ModeFlags { + READ = 1, + WRITE = 2, + READ_WRITE = 3, + WRITE_READ = 7, + }; + + enum CompressionMode { + COMPRESSION_FASTLZ = Compression::MODE_FASTLZ, + COMPRESSION_DEFLATE = Compression::MODE_DEFLATE, + COMPRESSION_ZSTD = Compression::MODE_ZSTD, + COMPRESSION_GZIP = Compression::MODE_GZIP + }; + typedef void (*FileCloseFailNotify)(const String &); typedef Ref<FileAccess> (*CreateFunc)(); @@ -60,15 +77,19 @@ public: virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) = 0; protected: + static void _bind_methods(); + AccessType get_access_type() const; String fix_path(const String &p_path) const; - virtual Error _open(const String &p_path, int p_mode_flags) = 0; ///< open a file + virtual Error open_internal(const String &p_path, int p_mode_flags) = 0; ///< open a file virtual uint64_t _get_modified_time(const String &p_file) = 0; + virtual void _set_access_type(AccessType p_access); static FileCloseFailNotify close_fail_notify; private: static bool backup_save; + thread_local static Error last_file_open_error; AccessType _access_type = ACCESS_FILESYSTEM; static CreateFunc create_func[ACCESS_MAX]; /** default file access creation function for a platform */ @@ -77,18 +98,11 @@ private: return memnew(T); } + static Ref<FileAccess> _open(const String &p_path, ModeFlags p_mode_flags); + public: static void set_file_close_fail_notify_callback(FileCloseFailNotify p_cbk) { close_fail_notify = p_cbk; } - virtual void _set_access_type(AccessType p_access); - - enum ModeFlags { - READ = 1, - WRITE = 2, - READ_WRITE = 3, - WRITE_READ = 7, - }; - virtual bool is_open() const = 0; ///< true when file is open virtual String get_path() const { return ""; } /// returns the path for the current open file @@ -110,10 +124,14 @@ public: virtual double get_double() const; virtual real_t get_real() const; + 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 + Vector<uint8_t> _get_buffer(int64_t p_length) const; virtual String get_line() const; virtual String get_token() const; virtual Vector<String> get_csv_line(const String &p_delim = ",") const; + String get_as_text(bool p_skip_cr = false) const; virtual String get_as_utf8_string(bool p_skip_cr = false) const; /** @@ -144,6 +162,9 @@ public: virtual String get_pascal_string(); virtual void store_buffer(const uint8_t *p_src, uint64_t p_length); ///< store an array of bytes + void _store_buffer(const Vector<uint8_t> &p_buffer); + + void store_var(const Variant &p_var, bool p_full_objects = false); virtual bool file_exists(const String &p_name) = 0; ///< return true if a file exists @@ -152,6 +173,12 @@ public: static Ref<FileAccess> create(AccessType p_access); /// Create a file access (for the current platform) this is the only portable way of accessing files. static Ref<FileAccess> create_for_path(const String &p_path); static Ref<FileAccess> open(const String &p_path, int p_mode_flags, Error *r_error = nullptr); /// Create a file access (for the current platform) this is the only portable way of accessing files. + + static Ref<FileAccess> open_encrypted(const String &p_path, ModeFlags p_mode_flags, const Vector<uint8_t> &p_key); + static Ref<FileAccess> open_encrypted_pass(const String &p_path, ModeFlags p_mode_flags, const String &p_pass); + static Ref<FileAccess> open_compressed(const String &p_path, ModeFlags p_mode_flags, CompressionMode p_compress_mode = COMPRESSION_FASTLZ); + static Error get_open_error(); + static CreateFunc get_create_func(AccessType p_access); static bool exists(const String &p_name); ///< return true if a file exists static uint64_t get_modified_time(const String &p_file); @@ -177,4 +204,7 @@ public: virtual ~FileAccess() {} }; +VARIANT_ENUM_CAST(FileAccess::CompressionMode); +VARIANT_ENUM_CAST(FileAccess::ModeFlags); + #endif // FILE_ACCESS_H diff --git a/core/io/file_access_compressed.cpp b/core/io/file_access_compressed.cpp index 1d0a718166..d2c8a88269 100644 --- a/core/io/file_access_compressed.cpp +++ b/core/io/file_access_compressed.cpp @@ -95,7 +95,7 @@ Error FileAccessCompressed::open_after_magic(Ref<FileAccess> p_base) { return ret == -1 ? ERR_FILE_CORRUPT : OK; } -Error FileAccessCompressed::_open(const String &p_path, int p_mode_flags) { +Error FileAccessCompressed::open_internal(const String &p_path, int p_mode_flags) { ERR_FAIL_COND_V(p_mode_flags == READ_WRITE, ERR_UNAVAILABLE); _close(); diff --git a/core/io/file_access_compressed.h b/core/io/file_access_compressed.h index e41491a92c..ee114c2c65 100644 --- a/core/io/file_access_compressed.h +++ b/core/io/file_access_compressed.h @@ -70,7 +70,7 @@ public: Error open_after_magic(Ref<FileAccess> p_base); - virtual Error _open(const String &p_path, int p_mode_flags) override; ///< open a file + virtual Error open_internal(const String &p_path, int p_mode_flags) override; ///< open a file virtual bool is_open() const override; ///< true when file is open virtual void seek(uint64_t p_position) override; ///< seek to a given position diff --git a/core/io/file_access_encrypted.cpp b/core/io/file_access_encrypted.cpp index d1b014a0be..be502dacd9 100644 --- a/core/io/file_access_encrypted.cpp +++ b/core/io/file_access_encrypted.cpp @@ -111,7 +111,7 @@ Error FileAccessEncrypted::open_and_parse_password(Ref<FileAccess> p_base, const return open_and_parse(p_base, key, p_mode); } -Error FileAccessEncrypted::_open(const String &p_path, int p_mode_flags) { +Error FileAccessEncrypted::open_internal(const String &p_path, int p_mode_flags) { return OK; } diff --git a/core/io/file_access_encrypted.h b/core/io/file_access_encrypted.h index 6200f87a7a..6b4588841d 100644 --- a/core/io/file_access_encrypted.h +++ b/core/io/file_access_encrypted.h @@ -60,7 +60,7 @@ public: Error open_and_parse(Ref<FileAccess> p_base, const Vector<uint8_t> &p_key, Mode p_mode, bool p_with_magic = true); Error open_and_parse_password(Ref<FileAccess> p_base, const String &p_key, Mode p_mode); - virtual Error _open(const String &p_path, int p_mode_flags) override; ///< open a file + virtual Error open_internal(const String &p_path, int p_mode_flags) override; ///< open a file virtual bool is_open() const override; ///< true when file is open virtual String get_path() const override; /// returns the path for the current open file diff --git a/core/io/file_access_memory.cpp b/core/io/file_access_memory.cpp index 499d001234..21ded4247f 100644 --- a/core/io/file_access_memory.cpp +++ b/core/io/file_access_memory.cpp @@ -78,7 +78,7 @@ Error FileAccessMemory::open_custom(const uint8_t *p_data, uint64_t p_len) { return OK; } -Error FileAccessMemory::_open(const String &p_path, int p_mode_flags) { +Error FileAccessMemory::open_internal(const String &p_path, int p_mode_flags) { ERR_FAIL_COND_V(!files, ERR_FILE_NOT_FOUND); String name = fix_path(p_path); diff --git a/core/io/file_access_memory.h b/core/io/file_access_memory.h index f2bd2aa832..b1f408eb98 100644 --- a/core/io/file_access_memory.h +++ b/core/io/file_access_memory.h @@ -45,7 +45,7 @@ public: static void cleanup(); virtual Error open_custom(const uint8_t *p_data, uint64_t p_len); ///< open a file - virtual Error _open(const String &p_path, int p_mode_flags) override; ///< open a file + virtual Error open_internal(const String &p_path, int p_mode_flags) override; ///< open a file virtual bool is_open() const override; ///< true when file is open virtual void seek(uint64_t p_position) override; ///< seek to a given position diff --git a/core/io/file_access_network.cpp b/core/io/file_access_network.cpp index 1365b4b593..13730518bf 100644 --- a/core/io/file_access_network.cpp +++ b/core/io/file_access_network.cpp @@ -252,7 +252,7 @@ void FileAccessNetwork::_respond(uint64_t p_len, Error p_status) { pages.resize(pc); } -Error FileAccessNetwork::_open(const String &p_path, int p_mode_flags) { +Error FileAccessNetwork::open_internal(const String &p_path, int p_mode_flags) { ERR_FAIL_COND_V(p_mode_flags != READ, ERR_UNAVAILABLE); _close(); diff --git a/core/io/file_access_network.h b/core/io/file_access_network.h index ceadc715a1..ee92d3b9db 100644 --- a/core/io/file_access_network.h +++ b/core/io/file_access_network.h @@ -132,7 +132,7 @@ public: RESPONSE_GET_MODTIME, }; - virtual Error _open(const String &p_path, int p_mode_flags) override; ///< open a file + virtual Error open_internal(const String &p_path, int p_mode_flags) override; ///< open a file virtual bool is_open() const override; ///< true when file is open virtual void seek(uint64_t p_position) override; ///< seek to a given position diff --git a/core/io/file_access_pack.cpp b/core/io/file_access_pack.cpp index adae0db0f4..dfcce30ab5 100644 --- a/core/io/file_access_pack.cpp +++ b/core/io/file_access_pack.cpp @@ -259,7 +259,7 @@ Ref<FileAccess> PackedSourcePCK::get_file(const String &p_path, PackedData::Pack ////////////////////////////////////////////////////////////////// -Error FileAccessPack::_open(const String &p_path, int p_mode_flags) { +Error FileAccessPack::open_internal(const String &p_path, int p_mode_flags) { ERR_FAIL_V(ERR_UNAVAILABLE); return ERR_UNAVAILABLE; } diff --git a/core/io/file_access_pack.h b/core/io/file_access_pack.h index 023758ac0f..4b9b49a161 100644 --- a/core/io/file_access_pack.h +++ b/core/io/file_access_pack.h @@ -148,7 +148,7 @@ class FileAccessPack : public FileAccess { uint64_t off; Ref<FileAccess> f; - virtual Error _open(const String &p_path, int p_mode_flags) override; + virtual Error open_internal(const String &p_path, int p_mode_flags) override; virtual uint64_t _get_modified_time(const String &p_file) override { return 0; } virtual uint32_t _get_unix_permissions(const String &p_file) override { return 0; } virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override { return FAILED; } diff --git a/core/io/file_access_zip.cpp b/core/io/file_access_zip.cpp index 17f2335a8e..72503851c1 100644 --- a/core/io/file_access_zip.cpp +++ b/core/io/file_access_zip.cpp @@ -234,7 +234,7 @@ ZipArchive::~ZipArchive() { packages.clear(); } -Error FileAccessZip::_open(const String &p_path, int p_mode_flags) { +Error FileAccessZip::open_internal(const String &p_path, int p_mode_flags) { _close(); ERR_FAIL_COND_V(p_mode_flags & FileAccess::WRITE, FAILED); @@ -337,7 +337,7 @@ bool FileAccessZip::file_exists(const String &p_name) { } FileAccessZip::FileAccessZip(const String &p_path, const PackedData::PackedFile &p_file) { - _open(p_path, FileAccess::READ); + open_internal(p_path, FileAccess::READ); } FileAccessZip::~FileAccessZip() { diff --git a/core/io/file_access_zip.h b/core/io/file_access_zip.h index 74a48192f3..6d61b9a291 100644 --- a/core/io/file_access_zip.h +++ b/core/io/file_access_zip.h @@ -85,7 +85,7 @@ class FileAccessZip : public FileAccess { void _close(); public: - virtual Error _open(const String &p_path, int p_mode_flags) override; ///< open a file + virtual Error open_internal(const String &p_path, int p_mode_flags) override; ///< open a file virtual bool is_open() const override; ///< true when file is open virtual void seek(uint64_t p_position) override; ///< seek to a given position diff --git a/core/io/image.cpp b/core/io/image.cpp index 812bfa8263..56c05bf042 100644 --- a/core/io/image.cpp +++ b/core/io/image.cpp @@ -444,7 +444,7 @@ static void _convert(int p_width, int p_height, const uint8_t *p_src, uint8_t *p uint8_t rgba[4] = { 0, 0, 0, 255 }; - if (read_gray) { + if constexpr (read_gray) { rgba[0] = rofs[0]; rgba[1] = rofs[0]; rgba[2] = rofs[0]; @@ -454,11 +454,11 @@ static void _convert(int p_width, int p_height, const uint8_t *p_src, uint8_t *p } } - if (read_alpha || write_alpha) { + if constexpr (read_alpha || write_alpha) { rgba[3] = read_alpha ? rofs[read_bytes] : 255; } - if (write_gray) { + if constexpr (write_gray) { //TODO: not correct grayscale, should use fixed point version of actual weights wofs[0] = uint8_t((uint16_t(rgba[0]) + uint16_t(rgba[1]) + uint16_t(rgba[2])) / 3); } else { @@ -467,7 +467,7 @@ static void _convert(int p_width, int p_height, const uint8_t *p_src, uint8_t *p } } - if (write_alpha) { + if constexpr (write_alpha) { wofs[write_bytes] = rgba[3]; } } @@ -640,7 +640,7 @@ static void _scale_cubic(const uint8_t *__restrict p_src, uint8_t *__restrict p_ double xfac = (double)width / p_dst_width; double yfac = (double)height / p_dst_height; // coordinates of source points and coefficients - double ox, oy, dx, dy, k1, k2; + double ox, oy, dx, dy; int ox1, oy1, ox2, oy2; // destination pixel values // width and height decreased by 1 @@ -671,7 +671,7 @@ static void _scale_cubic(const uint8_t *__restrict p_src, uint8_t *__restrict p_ for (int n = -1; n < 3; n++) { // get Y coefficient - k1 = _bicubic_interp_kernel(dy - (double)n); + [[maybe_unused]] double k1 = _bicubic_interp_kernel(dy - (double)n); oy2 = oy1 + n; if (oy2 < 0) { @@ -683,7 +683,7 @@ static void _scale_cubic(const uint8_t *__restrict p_src, uint8_t *__restrict p_ for (int m = -1; m < 3; m++) { // get X coefficient - k2 = k1 * _bicubic_interp_kernel((double)m - dx); + [[maybe_unused]] double k2 = k1 * _bicubic_interp_kernel((double)m - dx); ox2 = ox1 + m; if (ox2 < 0) { @@ -697,7 +697,7 @@ static void _scale_cubic(const uint8_t *__restrict p_src, uint8_t *__restrict p_ const T *__restrict p = ((T *)p_src) + (oy2 * p_src_width + ox2) * CC; for (int i = 0; i < CC; i++) { - if (sizeof(T) == 2) { //half float + if constexpr (sizeof(T) == 2) { //half float color[i] = Math::half_to_float(p[i]); } else { color[i] += p[i] * k2; @@ -707,9 +707,9 @@ static void _scale_cubic(const uint8_t *__restrict p_src, uint8_t *__restrict p_ } for (int i = 0; i < CC; i++) { - if (sizeof(T) == 1) { //byte + if constexpr (sizeof(T) == 1) { //byte dst[i] = CLAMP(Math::fast_ftoi(color[i]), 0, 255); - } else if (sizeof(T) == 2) { //half float + } else if constexpr (sizeof(T) == 2) { //half float dst[i] = Math::make_half_float(color[i]); } else { dst[i] = color[i]; @@ -758,7 +758,7 @@ static void _scale_bilinear(const uint8_t *__restrict p_src, uint8_t *__restrict src_xofs_right *= CC; for (uint32_t l = 0; l < CC; l++) { - if (sizeof(T) == 1) { //uint8 + if constexpr (sizeof(T) == 1) { //uint8 uint32_t p00 = p_src[y_ofs_up + src_xofs_left + l] << FRAC_BITS; uint32_t p10 = p_src[y_ofs_up + src_xofs_right + l] << FRAC_BITS; uint32_t p01 = p_src[y_ofs_down + src_xofs_left + l] << FRAC_BITS; @@ -769,7 +769,7 @@ static void _scale_bilinear(const uint8_t *__restrict p_src, uint8_t *__restrict uint32_t interp = interp_up + (((interp_down - interp_up) * src_yofs_frac) >> FRAC_BITS); interp >>= FRAC_BITS; p_dst[i * p_dst_width * CC + j * CC + l] = uint8_t(interp); - } else if (sizeof(T) == 2) { //half float + } else if constexpr (sizeof(T) == 2) { //half float float xofs_frac = float(src_xofs_frac) / (1 << FRAC_BITS); float yofs_frac = float(src_yofs_frac) / (1 << FRAC_BITS); @@ -786,7 +786,7 @@ static void _scale_bilinear(const uint8_t *__restrict p_src, uint8_t *__restrict float interp = interp_up + ((interp_down - interp_up) * yofs_frac); dst[i * p_dst_width * CC + j * CC + l] = Math::make_half_float(interp); - } else if (sizeof(T) == 4) { //float + } else if constexpr (sizeof(T) == 4) { //float float xofs_frac = float(src_xofs_frac) / (1 << FRAC_BITS); float yofs_frac = float(src_yofs_frac) / (1 << FRAC_BITS); @@ -877,7 +877,7 @@ static void _scale_lanczos(const uint8_t *__restrict p_src, uint8_t *__restrict const T *__restrict src_data = ((const T *)p_src) + (buffer_y * src_width + target_x) * CC; for (uint32_t i = 0; i < CC; i++) { - if (sizeof(T) == 2) { //half float + if constexpr (sizeof(T) == 2) { //half float pixel[i] += Math::half_to_float(src_data[i]) * lanczos_val; } else { pixel[i] += src_data[i] * lanczos_val; @@ -934,9 +934,9 @@ static void _scale_lanczos(const uint8_t *__restrict p_src, uint8_t *__restrict for (uint32_t i = 0; i < CC; i++) { pixel[i] /= weight; - if (sizeof(T) == 1) { //byte + if constexpr (sizeof(T) == 1) { //byte dst_data[i] = CLAMP(Math::fast_ftoi(pixel[i]), 0, 255); - } else if (sizeof(T) == 2) { //half float + } else if constexpr (sizeof(T) == 2) { //half float dst_data[i] = Math::make_half_float(pixel[i]); } else { // float dst_data[i] = pixel[i]; diff --git a/core/io/image_loader.cpp b/core/io/image_loader.cpp index d09697b951..d6854666c0 100644 --- a/core/io/image_loader.cpp +++ b/core/io/image_loader.cpp @@ -32,6 +32,12 @@ #include "core/string/print_string.h" +void ImageFormatLoader::_bind_methods() { + BIND_BITFIELD_FLAG(FLAG_NONE); + BIND_BITFIELD_FLAG(FLAG_FORCE_LINEAR); + BIND_BITFIELD_FLAG(FLAG_CONVERT_COLORS); +} + bool ImageFormatLoader::recognize(const String &p_extension) const { List<String> extensions; get_recognized_extensions(&extensions); @@ -44,7 +50,39 @@ bool ImageFormatLoader::recognize(const String &p_extension) const { return false; } -Error ImageLoader::load_image(String p_file, Ref<Image> p_image, Ref<FileAccess> p_custom, uint32_t p_flags, float p_scale) { +Error ImageFormatLoaderExtension::load_image(Ref<Image> p_image, Ref<FileAccess> p_fileaccess, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale) { + Error err; + if (GDVIRTUAL_CALL(_load_image, p_image, p_fileaccess, p_flags, p_scale, err)) { + return err; + } + return ERR_UNAVAILABLE; +} + +void ImageFormatLoaderExtension::get_recognized_extensions(List<String> *p_extension) const { + PackedStringArray ext; + if (GDVIRTUAL_CALL(_get_recognized_extensions, ext)) { + for (int i = 0; i < ext.size(); i++) { + p_extension->push_back(ext[i]); + } + } +} + +void ImageFormatLoaderExtension::add_format_loader() { + ImageLoader::add_image_format_loader(this); +} + +void ImageFormatLoaderExtension::remove_format_loader() { + ImageLoader::remove_image_format_loader(this); +} + +void ImageFormatLoaderExtension::_bind_methods() { + GDVIRTUAL_BIND(_get_recognized_extensions); + GDVIRTUAL_BIND(_load_image, "image", "fileaccess", "flags", "scale"); + ClassDB::bind_method(D_METHOD("add_format_loader"), &ImageFormatLoaderExtension::add_format_loader); + ClassDB::bind_method(D_METHOD("remove_format_loader"), &ImageFormatLoaderExtension::remove_format_loader); +} + +Error ImageLoader::load_image(String p_file, Ref<Image> p_image, Ref<FileAccess> p_custom, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale) { ERR_FAIL_COND_V_MSG(p_image.is_null(), ERR_INVALID_PARAMETER, "It's not a reference to a valid Image object."); Ref<FileAccess> f = p_custom; @@ -60,7 +98,7 @@ Error ImageLoader::load_image(String p_file, Ref<Image> p_image, Ref<FileAccess> if (!loader[i]->recognize(extension)) { continue; } - Error err = loader[i]->load_image(p_image, f, p_flags, p_scale); + Error err = loader.write[i]->load_image(p_image, f, p_flags, p_scale); if (err != OK) { ERR_PRINT("Error loading image: " + p_file); } @@ -79,7 +117,7 @@ void ImageLoader::get_recognized_extensions(List<String> *p_extensions) { } } -ImageFormatLoader *ImageLoader::recognize(const String &p_extension) { +Ref<ImageFormatLoader> ImageLoader::recognize(const String &p_extension) { for (int i = 0; i < loader.size(); i++) { if (loader[i]->recognize(p_extension)) { return loader[i]; @@ -89,17 +127,17 @@ ImageFormatLoader *ImageLoader::recognize(const String &p_extension) { return nullptr; } -Vector<ImageFormatLoader *> ImageLoader::loader; +Vector<Ref<ImageFormatLoader>> ImageLoader::loader; -void ImageLoader::add_image_format_loader(ImageFormatLoader *p_loader) { +void ImageLoader::add_image_format_loader(Ref<ImageFormatLoader> p_loader) { loader.push_back(p_loader); } -void ImageLoader::remove_image_format_loader(ImageFormatLoader *p_loader) { +void ImageLoader::remove_image_format_loader(Ref<ImageFormatLoader> p_loader) { loader.erase(p_loader); } -const Vector<ImageFormatLoader *> &ImageLoader::get_image_format_loaders() { +const Vector<Ref<ImageFormatLoader>> &ImageLoader::get_image_format_loaders() { return loader; } @@ -152,7 +190,7 @@ Ref<Resource> ResourceFormatLoaderImage::load(const String &p_path, const String Ref<Image> image; image.instantiate(); - Error err = ImageLoader::loader[idx]->load_image(image, f); + Error err = ImageLoader::loader.write[idx]->load_image(image, f); if (err != OK) { if (r_error) { diff --git a/core/io/image_loader.h b/core/io/image_loader.h index cb64d2310e..f70fdf22aa 100644 --- a/core/io/image_loader.h +++ b/core/io/image_loader.h @@ -31,46 +31,74 @@ #ifndef IMAGE_LOADER_H #define IMAGE_LOADER_H +#include "core/core_bind.h" #include "core/io/file_access.h" #include "core/io/image.h" #include "core/io/resource_loader.h" +#include "core/object/gdvirtual.gen.inc" #include "core/string/ustring.h" #include "core/templates/list.h" +#include "core/variant/binder_common.h" class ImageLoader; -class ImageFormatLoader { +class ImageFormatLoader : public RefCounted { + GDCLASS(ImageFormatLoader, RefCounted); + friend class ImageLoader; friend class ResourceFormatLoaderImage; -protected: - virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> p_fileaccess, uint32_t p_flags = (uint32_t)FLAG_NONE, float p_scale = 1.0) = 0; - virtual void get_recognized_extensions(List<String> *p_extensions) const = 0; - bool recognize(const String &p_extension) const; - public: enum LoaderFlags { FLAG_NONE = 0, FLAG_FORCE_LINEAR = 1, + FLAG_CONVERT_COLORS = 2, }; +protected: + static void _bind_methods(); + + virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> p_fileaccess, BitField<ImageFormatLoader::LoaderFlags> p_flags = FLAG_NONE, float p_scale = 1.0) = 0; + virtual void get_recognized_extensions(List<String> *p_extensions) const = 0; + bool recognize(const String &p_extension) const; + +public: virtual ~ImageFormatLoader() {} }; +VARIANT_BITFIELD_CAST(ImageFormatLoader::LoaderFlags); + +class ImageFormatLoaderExtension : public ImageFormatLoader { + GDCLASS(ImageFormatLoaderExtension, ImageFormatLoader); + +protected: + static void _bind_methods(); + +public: + virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> p_fileaccess, BitField<ImageFormatLoader::LoaderFlags> p_flags = FLAG_NONE, float p_scale = 1.0) override; + virtual void get_recognized_extensions(List<String> *p_extensions) const override; + + void add_format_loader(); + void remove_format_loader(); + + GDVIRTUAL0RC(PackedStringArray, _get_recognized_extensions); + GDVIRTUAL4R(Error, _load_image, Ref<Image>, Ref<FileAccess>, BitField<ImageFormatLoader::LoaderFlags>, float); +}; + class ImageLoader { - static Vector<ImageFormatLoader *> loader; + static Vector<Ref<ImageFormatLoader>> loader; friend class ResourceFormatLoaderImage; protected: public: - static Error load_image(String p_file, Ref<Image> p_image, Ref<FileAccess> p_custom = Ref<FileAccess>(), uint32_t p_flags = (uint32_t)ImageFormatLoader::FLAG_NONE, float p_scale = 1.0); + static Error load_image(String p_file, Ref<Image> p_image, Ref<FileAccess> p_custom = Ref<FileAccess>(), BitField<ImageFormatLoader::LoaderFlags> p_flags = ImageFormatLoader::FLAG_NONE, float p_scale = 1.0); static void get_recognized_extensions(List<String> *p_extensions); - static ImageFormatLoader *recognize(const String &p_extension); + static Ref<ImageFormatLoader> recognize(const String &p_extension); - static void add_image_format_loader(ImageFormatLoader *p_loader); - static void remove_image_format_loader(ImageFormatLoader *p_loader); + static void add_image_format_loader(Ref<ImageFormatLoader> p_loader); + static void remove_image_format_loader(Ref<ImageFormatLoader> p_loader); - static const Vector<ImageFormatLoader *> &get_image_format_loaders(); + static const Vector<Ref<ImageFormatLoader>> &get_image_format_loaders(); static void cleanup(); }; diff --git a/core/io/json.cpp b/core/io/json.cpp index 91500ff3d5..7e267d35d4 100644 --- a/core/io/json.cpp +++ b/core/io/json.cpp @@ -56,6 +56,8 @@ String JSON::_make_indent(const String &p_indent, int p_size) { } String JSON::_stringify(const Variant &p_var, const String &p_indent, int p_cur_indent, bool p_sort_keys, HashSet<const void *> &p_markers, bool p_full_precision) { + ERR_FAIL_COND_V_MSG(p_cur_indent > Variant::MAX_RECURSION_DEPTH, "...", "JSON structure is too deep. Bailing."); + String colon = ":"; String end_statement = ""; @@ -357,17 +359,22 @@ Error JSON::_get_token(const char32_t *p_str, int &index, int p_len, Token &r_to return ERR_PARSE_ERROR; } -Error JSON::_parse_value(Variant &value, Token &token, const char32_t *p_str, int &index, int p_len, int &line, String &r_err_str) { +Error JSON::_parse_value(Variant &value, Token &token, const char32_t *p_str, int &index, int p_len, int &line, int p_depth, String &r_err_str) { + if (p_depth > Variant::MAX_RECURSION_DEPTH) { + r_err_str = "JSON structure is too deep. Bailing."; + return ERR_OUT_OF_MEMORY; + } + if (token.type == TK_CURLY_BRACKET_OPEN) { Dictionary d; - Error err = _parse_object(d, p_str, index, p_len, line, r_err_str); + Error err = _parse_object(d, p_str, index, p_len, line, p_depth + 1, r_err_str); if (err) { return err; } value = d; } else if (token.type == TK_BRACKET_OPEN) { Array a; - Error err = _parse_array(a, p_str, index, p_len, line, r_err_str); + Error err = _parse_array(a, p_str, index, p_len, line, p_depth + 1, r_err_str); if (err) { return err; } @@ -396,7 +403,7 @@ Error JSON::_parse_value(Variant &value, Token &token, const char32_t *p_str, in return OK; } -Error JSON::_parse_array(Array &array, const char32_t *p_str, int &index, int p_len, int &line, String &r_err_str) { +Error JSON::_parse_array(Array &array, const char32_t *p_str, int &index, int p_len, int &line, int p_depth, String &r_err_str) { Token token; bool need_comma = false; @@ -421,7 +428,7 @@ Error JSON::_parse_array(Array &array, const char32_t *p_str, int &index, int p_ } Variant v; - err = _parse_value(v, token, p_str, index, p_len, line, r_err_str); + err = _parse_value(v, token, p_str, index, p_len, line, p_depth, r_err_str); if (err) { return err; } @@ -434,7 +441,7 @@ Error JSON::_parse_array(Array &array, const char32_t *p_str, int &index, int p_ return ERR_PARSE_ERROR; } -Error JSON::_parse_object(Dictionary &object, const char32_t *p_str, int &index, int p_len, int &line, String &r_err_str) { +Error JSON::_parse_object(Dictionary &object, const char32_t *p_str, int &index, int p_len, int &line, int p_depth, String &r_err_str) { bool at_key = true; String key; Token token; @@ -483,7 +490,7 @@ Error JSON::_parse_object(Dictionary &object, const char32_t *p_str, int &index, } Variant v; - err = _parse_value(v, token, p_str, index, p_len, line, r_err_str); + err = _parse_value(v, token, p_str, index, p_len, line, p_depth, r_err_str); if (err) { return err; } @@ -497,6 +504,10 @@ Error JSON::_parse_object(Dictionary &object, const char32_t *p_str, int &index, return ERR_PARSE_ERROR; } +void JSON::set_data(const Variant &p_data) { + data = p_data; +} + Error JSON::_parse_string(const String &p_json, Variant &r_ret, String &r_err_str, int &r_err_line) { const char32_t *str = p_json.ptr(); int idx = 0; @@ -510,7 +521,7 @@ Error JSON::_parse_string(const String &p_json, Variant &r_ret, String &r_err_st return err; } - err = _parse_value(r_ret, token, str, idx, len, r_err_line, r_err_str); + err = _parse_value(r_ret, token, str, idx, len, r_err_line, 0, r_err_str); // Check if EOF is reached // or it's a type of the next token. @@ -557,6 +568,88 @@ void JSON::_bind_methods() { ClassDB::bind_method(D_METHOD("parse", "json_string"), &JSON::parse); ClassDB::bind_method(D_METHOD("get_data"), &JSON::get_data); + ClassDB::bind_method(D_METHOD("set_data", "data"), &JSON::set_data); ClassDB::bind_method(D_METHOD("get_error_line"), &JSON::get_error_line); ClassDB::bind_method(D_METHOD("get_error_message"), &JSON::get_error_message); + + 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. +} + +//// + +//////////// + +Ref<Resource> ResourceFormatLoaderJSON::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) { + if (r_error) { + *r_error = ERR_FILE_CANT_OPEN; + } + + if (!FileAccess::exists(p_path)) { + *r_error = ERR_FILE_NOT_FOUND; + return Ref<Resource>(); + } + + Ref<JSON> json; + json.instantiate(); + + Error err = json->parse(FileAccess::get_file_as_string(p_path)); + if (err != OK) { + if (r_error) { + *r_error = err; + } + ERR_PRINT("Error parsing JSON file at '" + p_path + "', on line " + itos(json->get_error_line()) + ": " + json->get_error_message()); + return Ref<Resource>(); + } + + if (r_error) { + *r_error = OK; + } + + return json; +} + +void ResourceFormatLoaderJSON::get_recognized_extensions(List<String> *p_extensions) const { + p_extensions->push_back("json"); +} + +bool ResourceFormatLoaderJSON::handles_type(const String &p_type) const { + return (p_type == "JSON"); +} + +String ResourceFormatLoaderJSON::get_resource_type(const String &p_path) const { + String el = p_path.get_extension().to_lower(); + if (el == "json") { + return "JSON"; + } + return ""; +} + +Error ResourceFormatSaverJSON::save(const Ref<Resource> &p_resource, const String &p_path, uint32_t p_flags) { + Ref<JSON> json = p_resource; + ERR_FAIL_COND_V(json.is_null(), ERR_INVALID_PARAMETER); + + String source = JSON::stringify(json->get_data(), "\t", false, true); + + Error err; + Ref<FileAccess> file = FileAccess::open(p_path, FileAccess::WRITE, &err); + + ERR_FAIL_COND_V_MSG(err, err, "Cannot save json '" + p_path + "'."); + + file->store_string(source); + if (file->get_error() != OK && file->get_error() != ERR_FILE_EOF) { + return ERR_CANT_CREATE; + } + + return OK; +} + +void ResourceFormatSaverJSON::get_recognized_extensions(const Ref<Resource> &p_resource, List<String> *p_extensions) const { + Ref<JSON> json = p_resource; + if (json.is_valid()) { + p_extensions->push_back("json"); + } +} + +bool ResourceFormatSaverJSON::recognize(const Ref<Resource> &p_resource) const { + return p_resource->get_class_name() == "JSON"; //only json, not inherited } diff --git a/core/io/json.h b/core/io/json.h index 840b1cc08a..829a5f922b 100644 --- a/core/io/json.h +++ b/core/io/json.h @@ -31,7 +31,9 @@ #ifndef JSON_H #define JSON_H -#include "core/object/ref_counted.h" +#include "core/io/resource.h" +#include "core/io/resource_loader.h" +#include "core/io/resource_saver.h" #include "core/variant/variant.h" class JSON : public RefCounted { @@ -72,9 +74,9 @@ class JSON : public RefCounted { static String _make_indent(const String &p_indent, int p_size); static String _stringify(const Variant &p_var, const String &p_indent, int p_cur_indent, bool p_sort_keys, HashSet<const void *> &p_markers, bool p_full_precision = false); static Error _get_token(const char32_t *p_str, int &index, int p_len, Token &r_token, int &line, String &r_err_str); - static Error _parse_value(Variant &value, Token &token, const char32_t *p_str, int &index, int p_len, int &line, String &r_err_str); - static Error _parse_array(Array &array, const char32_t *p_str, int &index, int p_len, int &line, String &r_err_str); - static Error _parse_object(Dictionary &object, const char32_t *p_str, int &index, int p_len, int &line, String &r_err_str); + static Error _parse_value(Variant &value, Token &token, const char32_t *p_str, int &index, int p_len, int &line, int p_depth, String &r_err_str); + static Error _parse_array(Array &array, const char32_t *p_str, int &index, int p_len, int &line, int p_depth, String &r_err_str); + static Error _parse_object(Dictionary &object, const char32_t *p_str, int &index, int p_len, int &line, int p_depth, String &r_err_str); static Error _parse_string(const String &p_json, Variant &r_ret, String &r_err_str, int &r_err_line); protected: @@ -86,8 +88,24 @@ public: static Variant parse_string(const String &p_json_string); inline Variant get_data() const { return data; } + 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; } }; +class ResourceFormatLoaderJSON : public ResourceFormatLoader { +public: + virtual Ref<Resource> 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); + virtual void get_recognized_extensions(List<String> *p_extensions) const; + virtual bool handles_type(const String &p_type) const; + virtual String get_resource_type(const String &p_path) const; +}; + +class ResourceFormatSaverJSON : public ResourceFormatSaver { +public: + virtual Error save(const Ref<Resource> &p_resource, const String &p_path, uint32_t p_flags = 0); + virtual void get_recognized_extensions(const Ref<Resource> &p_resource, List<String> *p_extensions) const; + virtual bool recognize(const Ref<Resource> &p_resource) const; +}; + #endif // JSON_H diff --git a/core/io/resource.cpp b/core/io/resource.cpp index d117f86f39..ab30fb1ca3 100644 --- a/core/io/resource.cpp +++ b/core/io/resource.cpp @@ -93,15 +93,14 @@ String Resource::get_path() const { String Resource::generate_scene_unique_id() { // Generate a unique enough hash, but still user-readable. // If it's not unique it does not matter because the saver will try again. - OS::Date date = OS::get_singleton()->get_date(); - OS::Time time = OS::get_singleton()->get_time(); + OS::DateTime dt = OS::get_singleton()->get_datetime(); uint32_t hash = hash_murmur3_one_32(OS::get_singleton()->get_ticks_usec()); - hash = hash_murmur3_one_32(date.year, hash); - hash = hash_murmur3_one_32(date.month, hash); - hash = hash_murmur3_one_32(date.day, hash); - hash = hash_murmur3_one_32(time.hour, hash); - hash = hash_murmur3_one_32(time.minute, hash); - hash = hash_murmur3_one_32(time.second, hash); + hash = hash_murmur3_one_32(dt.year, hash); + hash = hash_murmur3_one_32(dt.month, hash); + hash = hash_murmur3_one_32(dt.day, hash); + hash = hash_murmur3_one_32(dt.hour, hash); + hash = hash_murmur3_one_32(dt.minute, hash); + hash = hash_murmur3_one_32(dt.second, hash); hash = hash_murmur3_one_32(Math::rand(), hash); static constexpr uint32_t characters = 5; @@ -490,7 +489,7 @@ bool ResourceCache::has(const String &p_path) { Resource **res = resources.getptr(p_path); - if (res && (*res)->reference_get_count() == 0) { + 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); diff --git a/core/io/resource_format_binary.cpp b/core/io/resource_format_binary.cpp index 4f1204fc48..36fa77626e 100644 --- a/core/io/resource_format_binary.cpp +++ b/core/io/resource_format_binary.cpp @@ -107,7 +107,7 @@ void ResourceLoaderBinary::_advance_padding(uint32_t p_len) { static Error read_reals(real_t *dst, Ref<FileAccess> &f, size_t count) { if (f->real_is_double) { - if (sizeof(real_t) == 8) { + if constexpr (sizeof(real_t) == 8) { // Ideal case with double-precision f->get_buffer((uint8_t *)dst, count * sizeof(double)); #ifdef BIG_ENDIAN_ENABLED @@ -118,7 +118,7 @@ static Error read_reals(real_t *dst, Ref<FileAccess> &f, size_t count) { } } #endif - } else if (sizeof(real_t) == 4) { + } else if constexpr (sizeof(real_t) == 4) { // May be slower, but this is for compatibility. Eventually the data should be converted. for (size_t i = 0; i < count; ++i) { dst[i] = f->get_double(); @@ -127,7 +127,7 @@ static Error read_reals(real_t *dst, Ref<FileAccess> &f, size_t count) { ERR_FAIL_V_MSG(ERR_UNAVAILABLE, "real_t size is neither 4 nor 8!"); } } else { - if (sizeof(real_t) == 4) { + if constexpr (sizeof(real_t) == 4) { // Ideal case with float-precision f->get_buffer((uint8_t *)dst, count * sizeof(float)); #ifdef BIG_ENDIAN_ENABLED @@ -138,7 +138,7 @@ static Error read_reals(real_t *dst, Ref<FileAccess> &f, size_t count) { } } #endif - } else if (sizeof(real_t) == 8) { + } else if constexpr (sizeof(real_t) == 8) { for (size_t i = 0; i < count; ++i) { dst[i] = f->get_float(); } @@ -1206,7 +1206,7 @@ Error ResourceFormatLoaderBinary::rename_dependencies(const String &p_path, cons Ref<FileAccessCompressed> facw; facw.instantiate(); facw->configure("RSCC"); - err = facw->_open(p_path + ".depren", FileAccess::WRITE); + err = facw->open_internal(p_path + ".depren", FileAccess::WRITE); ERR_FAIL_COND_V_MSG(err, ERR_FILE_CORRUPT, "Cannot create file '" + p_path + ".depren'."); fw = facw; @@ -1986,7 +1986,7 @@ Error ResourceFormatSaverBinaryInstance::save(const String &p_path, const Ref<Re fac.instantiate(); fac->configure("RSCC"); f = fac; - err = fac->_open(p_path, FileAccess::WRITE); + err = fac->open_internal(p_path, FileAccess::WRITE); } else { f = FileAccess::open(p_path, FileAccess::WRITE, &err); } diff --git a/core/io/resource_importer.cpp b/core/io/resource_importer.cpp index aa7f96a047..d923522317 100644 --- a/core/io/resource_importer.cpp +++ b/core/io/resource_importer.cpp @@ -108,6 +108,15 @@ Error ResourceFormatImporter::_get_path_and_type(const String &p_path, PathAndTy } } +#ifdef TOOLS_ENABLED + if (r_path_and_type.metadata && !r_path_and_type.path.is_empty()) { + Dictionary metadata = r_path_and_type.metadata; + if (metadata.has("has_editor_variant")) { + r_path_and_type.path = r_path_and_type.path.get_basename() + ".editor." + r_path_and_type.path.get_extension(); + } + } +#endif + if (r_path_and_type.path.is_empty() || r_path_and_type.type.is_empty()) { return ERR_FILE_CORRUPT; } diff --git a/core/io/resource_uid.cpp b/core/io/resource_uid.cpp index 5324c5dd84..ed5ce3b911 100644 --- a/core/io/resource_uid.cpp +++ b/core/io/resource_uid.cpp @@ -113,7 +113,12 @@ void ResourceUID::set_id(ID p_id, const String &p_path) { MutexLock l(mutex); ERR_FAIL_COND(!unique_ids.has(p_id)); CharString cs = p_path.utf8(); - if (strcmp(cs.ptr(), unique_ids[p_id].cs.ptr()) != 0) { + const char *update_ptr = cs.ptr(); + const char *cached_ptr = unique_ids[p_id].cs.ptr(); + if (update_ptr == nullptr && cached_ptr == nullptr) { + return; // Both are empty strings. + } + if ((update_ptr == nullptr) != (cached_ptr == nullptr) || strcmp(update_ptr, cached_ptr) != 0) { unique_ids[p_id].cs = cs; unique_ids[p_id].saved_to_cache = false; //changed changed = true; diff --git a/core/io/stream_peer_gzip.cpp b/core/io/stream_peer_gzip.cpp new file mode 100644 index 0000000000..ca8be2d62e --- /dev/null +++ b/core/io/stream_peer_gzip.cpp @@ -0,0 +1,209 @@ +/*************************************************************************/ +/* stream_peer_gzip.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* 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 "core/io/stream_peer_gzip.h" + +#include "core/io/zip_io.h" +#include <zlib.h> + +void StreamPeerGZIP::_bind_methods() { + ClassDB::bind_method(D_METHOD("start_compression", "use_deflate", "buffer_size"), &StreamPeerGZIP::start_compression, DEFVAL(false), DEFVAL(65535)); + ClassDB::bind_method(D_METHOD("start_decompression", "use_deflate", "buffer_size"), &StreamPeerGZIP::start_decompression, DEFVAL(false), DEFVAL(65535)); + ClassDB::bind_method(D_METHOD("finish"), &StreamPeerGZIP::finish); + ClassDB::bind_method(D_METHOD("clear"), &StreamPeerGZIP::clear); +} + +StreamPeerGZIP::StreamPeerGZIP() { +} + +StreamPeerGZIP::~StreamPeerGZIP() { + _close(); +} + +void StreamPeerGZIP::_close() { + if (ctx) { + z_stream *strm = (z_stream *)ctx; + if (compressing) { + deflateEnd(strm); + } else { + inflateEnd(strm); + } + memfree(strm); + ctx = nullptr; + } +} + +void StreamPeerGZIP::clear() { + _close(); + rb.clear(); + buffer.clear(); +} + +Error StreamPeerGZIP::start_compression(bool p_is_deflate, int buffer_size) { + return _start(true, p_is_deflate, buffer_size); +} + +Error StreamPeerGZIP::start_decompression(bool p_is_deflate, int buffer_size) { + return _start(false, p_is_deflate, buffer_size); +} + +Error StreamPeerGZIP::_start(bool p_compress, bool p_is_deflate, int buffer_size) { + ERR_FAIL_COND_V(ctx != nullptr, ERR_ALREADY_IN_USE); + clear(); + compressing = p_compress; + rb.resize(nearest_shift(buffer_size - 1)); + buffer.resize(1024); + + // Create ctx. + ctx = memalloc(sizeof(z_stream)); + z_stream &strm = *(z_stream *)ctx; + strm.next_in = Z_NULL; + strm.avail_in = 0; + strm.zalloc = zipio_alloc; + strm.zfree = zipio_free; + strm.opaque = Z_NULL; + int window_bits = p_is_deflate ? 15 : (15 + 16); + int err = Z_OK; + int level = Z_DEFAULT_COMPRESSION; + if (compressing) { + err = deflateInit2(&strm, level, Z_DEFLATED, window_bits, 8, Z_DEFAULT_STRATEGY); + } else { + err = inflateInit2(&strm, window_bits); + } + ERR_FAIL_COND_V(err != Z_OK, FAILED); + return OK; +} + +Error StreamPeerGZIP::_process(uint8_t *p_dst, int p_dst_size, const uint8_t *p_src, int p_src_size, int &r_consumed, int &r_out, bool p_close) { + ERR_FAIL_COND_V(!ctx, ERR_UNCONFIGURED); + z_stream &strm = *(z_stream *)ctx; + strm.avail_in = p_src_size; + strm.avail_out = p_dst_size; + strm.next_in = (Bytef *)p_src; + strm.next_out = (Bytef *)p_dst; + int flush = p_close ? Z_FINISH : Z_NO_FLUSH; + if (compressing) { + int err = deflate(&strm, flush); + ERR_FAIL_COND_V(err != (p_close ? Z_STREAM_END : Z_OK), FAILED); + } else { + int err = inflate(&strm, flush); + ERR_FAIL_COND_V(err != Z_OK && err != Z_STREAM_END, FAILED); + } + r_out = p_dst_size - strm.avail_out; + r_consumed = p_src_size - strm.avail_in; + return OK; +} + +Error StreamPeerGZIP::put_data(const uint8_t *p_data, int p_bytes) { + int wrote = 0; + Error err = put_partial_data(p_data, p_bytes, wrote); + if (err != OK) { + return err; + } + ERR_FAIL_COND_V(p_bytes != wrote, ERR_OUT_OF_MEMORY); + return OK; +} + +Error StreamPeerGZIP::put_partial_data(const uint8_t *p_data, int p_bytes, int &r_sent) { + ERR_FAIL_COND_V(!ctx, ERR_UNCONFIGURED); + ERR_FAIL_COND_V(p_bytes < 0, ERR_INVALID_PARAMETER); + + // Ensure we have enough space in temporary buffer. + if (buffer.size() < p_bytes) { + buffer.resize(p_bytes); + } + + r_sent = 0; + while (r_sent < p_bytes && rb.space_left() > 1024) { // Keep the ring buffer size meaningful. + int sent = 0; + int to_write = 0; + // Compress or decompress + Error err = _process(buffer.ptrw(), MIN(buffer.size(), rb.space_left()), p_data + r_sent, p_bytes - r_sent, sent, to_write); + if (err != OK) { + return err; + } + // When decompressing, we might need to do another round. + r_sent += sent; + + // We can't write more than this buffer is full. + if (sent == 0 && to_write == 0) { + return OK; + } + if (to_write) { + // Copy to ring buffer. + int wrote = rb.write(buffer.ptr(), to_write); + ERR_FAIL_COND_V(wrote != to_write, ERR_BUG); + } + } + return OK; +} + +Error StreamPeerGZIP::get_data(uint8_t *p_buffer, int p_bytes) { + int received = 0; + Error err = get_partial_data(p_buffer, p_bytes, received); + if (err != OK) { + return err; + } + ERR_FAIL_COND_V(p_bytes != received, ERR_UNAVAILABLE); + return OK; +} + +Error StreamPeerGZIP::get_partial_data(uint8_t *p_buffer, int p_bytes, int &r_received) { + ERR_FAIL_COND_V(p_bytes < 0, ERR_INVALID_PARAMETER); + + r_received = MIN(p_bytes, rb.data_left()); + if (r_received == 0) { + return OK; + } + int received = rb.read(p_buffer, r_received); + ERR_FAIL_COND_V(received != r_received, ERR_BUG); + return OK; +} + +int StreamPeerGZIP::get_available_bytes() const { + return rb.data_left(); +} + +Error StreamPeerGZIP::finish() { + ERR_FAIL_COND_V(!ctx || !compressing, ERR_UNAVAILABLE); + // Ensure we have enough space in temporary buffer. + if (buffer.size() < 1024) { + buffer.resize(1024); // 1024 should be more than enough. + } + int consumed = 0; + int to_write = 0; + Error err = _process(buffer.ptrw(), 1024, nullptr, 0, consumed, to_write, true); // compress + if (err != OK) { + return err; + } + int wrote = rb.write(buffer.ptr(), to_write); + ERR_FAIL_COND_V(wrote != to_write, ERR_OUT_OF_MEMORY); + return OK; +} diff --git a/core/io/stream_peer_gzip.h b/core/io/stream_peer_gzip.h new file mode 100644 index 0000000000..5bafdbca9b --- /dev/null +++ b/core/io/stream_peer_gzip.h @@ -0,0 +1,76 @@ +/*************************************************************************/ +/* stream_peer_gzip.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* 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 STREAM_PEER_GZIP_H +#define STREAM_PEER_GZIP_H + +#include "core/io/stream_peer.h" + +#include "core/core_bind.h" +#include "core/io/compression.h" +#include "core/templates/ring_buffer.h" + +class StreamPeerGZIP : public StreamPeer { + GDCLASS(StreamPeerGZIP, StreamPeer); + +private: + void *ctx = nullptr; // Will hold our z_stream instance. + bool compressing = true; + + RingBuffer<uint8_t> rb; + Vector<uint8_t> buffer; + + Error _process(uint8_t *p_dst, int p_dst_size, const uint8_t *p_src, int p_src_size, int &r_consumed, int &r_out, bool p_close = false); + void _close(); + Error _start(bool p_compress, bool p_is_deflate, int buffer_size = 65535); + +protected: + static void _bind_methods(); + +public: + Error start_compression(bool p_is_deflate, int buffer_size = 65535); + Error start_decompression(bool p_is_deflate, int buffer_size = 65535); + + Error finish(); + void clear(); + + virtual Error put_data(const uint8_t *p_data, int p_bytes) override; + virtual Error put_partial_data(const uint8_t *p_data, int p_bytes, int &r_sent) override; + + virtual Error get_data(uint8_t *p_buffer, int p_bytes) override; + virtual Error get_partial_data(uint8_t *p_buffer, int p_bytes, int &r_received) override; + + virtual int get_available_bytes() const override; + + StreamPeerGZIP(); + ~StreamPeerGZIP(); +}; + +#endif // STREAM_PEER_GZIP_H diff --git a/core/io/xml_parser.cpp b/core/io/xml_parser.cpp index 154b55f5e7..abae48fdd8 100644 --- a/core/io/xml_parser.cpp +++ b/core/io/xml_parser.cpp @@ -137,7 +137,7 @@ bool XMLParser::_parse_cdata() { next_char(); } - if (cDataEnd) { + if (!cDataEnd) { cDataEnd = P; } node_name = String::utf8(cDataBegin, (int)(cDataEnd - cDataBegin)); diff --git a/core/math/a_star_grid_2d.cpp b/core/math/a_star_grid_2d.cpp index 23d7e379ee..c30acf32bb 100644 --- a/core/math/a_star_grid_2d.cpp +++ b/core/math/a_star_grid_2d.cpp @@ -30,16 +30,18 @@ #include "a_star_grid_2d.h" -static real_t heuristic_manhattan(const Vector2i &p_from, const Vector2i &p_to) { +#include "core/variant/typed_array.h" + +static real_t heuristic_euclidian(const Vector2i &p_from, const Vector2i &p_to) { real_t dx = (real_t)ABS(p_to.x - p_from.x); real_t dy = (real_t)ABS(p_to.y - p_from.y); - return dx + dy; + return (real_t)Math::sqrt(dx * dx + dy * dy); } -static real_t heuristic_euclidian(const Vector2i &p_from, const Vector2i &p_to) { +static real_t heuristic_manhattan(const Vector2i &p_from, const Vector2i &p_to) { real_t dx = (real_t)ABS(p_to.x - p_from.x); real_t dy = (real_t)ABS(p_to.y - p_from.y); - return (real_t)Math::sqrt(dx * dx + dy * dy); + return dx + dy; } static real_t heuristic_octile(const Vector2i &p_from, const Vector2i &p_to) { @@ -55,7 +57,7 @@ static real_t heuristic_chebyshev(const Vector2i &p_from, const Vector2i &p_to) return MAX(dx, dy); } -static real_t (*heuristics[AStarGrid2D::HEURISTIC_MAX])(const Vector2i &, const Vector2i &) = { heuristic_manhattan, heuristic_euclidian, heuristic_octile, heuristic_chebyshev }; +static real_t (*heuristics[AStarGrid2D::HEURISTIC_MAX])(const Vector2i &, const Vector2i &) = { heuristic_euclidian, heuristic_manhattan, heuristic_octile, heuristic_chebyshev }; void AStarGrid2D::set_size(const Size2i &p_size) { ERR_FAIL_COND(p_size.x < 0 || p_size.y < 0); @@ -492,17 +494,17 @@ Vector<Vector2> AStarGrid2D::get_point_path(const Vector2i &p_from_id, const Vec return path; } -Vector<Vector2> AStarGrid2D::get_id_path(const Vector2i &p_from_id, const Vector2i &p_to_id) { - ERR_FAIL_COND_V_MSG(dirty, Vector<Vector2>(), "Grid is not initialized. Call the update method."); - ERR_FAIL_COND_V_MSG(!is_in_boundsv(p_from_id), Vector<Vector2>(), vformat("Can't get id path. Point out of bounds (%s/%s, %s/%s)", p_from_id.x, size.width, p_from_id.y, size.height)); - ERR_FAIL_COND_V_MSG(!is_in_boundsv(p_to_id), Vector<Vector2>(), vformat("Can't get id path. Point out of bounds (%s/%s, %s/%s)", p_to_id.x, size.width, p_to_id.y, size.height)); +TypedArray<Vector2i> AStarGrid2D::get_id_path(const Vector2i &p_from_id, const Vector2i &p_to_id) { + ERR_FAIL_COND_V_MSG(dirty, TypedArray<Vector2i>(), "Grid is not initialized. Call the update method."); + ERR_FAIL_COND_V_MSG(!is_in_boundsv(p_from_id), TypedArray<Vector2i>(), vformat("Can't get id path. Point out of bounds (%s/%s, %s/%s)", p_from_id.x, size.width, p_from_id.y, size.height)); + ERR_FAIL_COND_V_MSG(!is_in_boundsv(p_to_id), TypedArray<Vector2i>(), vformat("Can't get id path. Point out of bounds (%s/%s, %s/%s)", p_to_id.x, size.width, p_to_id.y, size.height)); Point *a = _get_point(p_from_id.x, p_from_id.y); Point *b = _get_point(p_to_id.x, p_to_id.y); if (a == b) { - Vector<Vector2> ret; - ret.push_back(Vector2((float)a->id.x, (float)a->id.y)); + TypedArray<Vector2i> ret; + ret.push_back(a); return ret; } @@ -511,7 +513,7 @@ Vector<Vector2> AStarGrid2D::get_id_path(const Vector2i &p_from_id, const Vector bool found_route = _solve(begin_point, end_point); if (!found_route) { - return Vector<Vector2>(); + return TypedArray<Vector2i>(); } Point *p = end_point; @@ -521,20 +523,18 @@ Vector<Vector2> AStarGrid2D::get_id_path(const Vector2i &p_from_id, const Vector p = p->prev_point; } - Vector<Vector2> path; + TypedArray<Vector2i> path; path.resize(pc); { - Vector2 *w = path.ptrw(); - p = end_point; int64_t idx = pc - 1; while (p != begin_point) { - w[idx--] = Vector2((float)p->id.x, (float)p->id.y); + path[idx--] = p->id; p = p->prev_point; } - w[0] = p->id; + path[0] = p->id; } return path; @@ -572,7 +572,7 @@ void AStarGrid2D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "cell_size"), "set_cell_size", "get_cell_size"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "jumping_enabled"), "set_jumping_enabled", "is_jumping_enabled"); - ADD_PROPERTY(PropertyInfo(Variant::INT, "default_heuristic", PROPERTY_HINT_ENUM, "Manhattan,Euclidean,Octile,Chebyshev,Max"), "set_default_heuristic", "get_default_heuristic"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "default_heuristic", PROPERTY_HINT_ENUM, "Euclidean,Manhattan,Octile,Chebyshev,Max"), "set_default_heuristic", "get_default_heuristic"); ADD_PROPERTY(PropertyInfo(Variant::INT, "diagonal_mode", PROPERTY_HINT_ENUM, "Never,Always,At Least One Walkable,Only If No Obstacles,Max"), "set_diagonal_mode", "get_diagonal_mode"); BIND_ENUM_CONSTANT(HEURISTIC_EUCLIDEAN); diff --git a/core/math/a_star_grid_2d.h b/core/math/a_star_grid_2d.h index bf6363aa01..1002f18738 100644 --- a/core/math/a_star_grid_2d.h +++ b/core/math/a_star_grid_2d.h @@ -169,7 +169,7 @@ public: void clear(); Vector<Vector2> get_point_path(const Vector2i &p_from, const Vector2i &p_to); - Vector<Vector2> get_id_path(const Vector2i &p_from, const Vector2i &p_to); + TypedArray<Vector2i> get_id_path(const Vector2i &p_from, const Vector2i &p_to); }; VARIANT_ENUM_CAST(AStarGrid2D::DiagonalMode); diff --git a/core/math/basis.cpp b/core/math/basis.cpp index 0eb6320ac6..4b163409ce 100644 --- a/core/math/basis.cpp +++ b/core/math/basis.cpp @@ -754,29 +754,28 @@ void Basis::get_axis_angle(Vector3 &r_axis, real_t &r_angle) const { #ifdef MATH_CHECKS ERR_FAIL_COND(!is_rotation()); #endif -*/ - real_t angle, x, y, z; // variables for result - real_t angle_epsilon = 0.1; // margin to distinguish between 0 and 180 degrees - - if ((Math::abs(rows[1][0] - rows[0][1]) < CMP_EPSILON) && (Math::abs(rows[2][0] - rows[0][2]) < CMP_EPSILON) && (Math::abs(rows[2][1] - rows[1][2]) < CMP_EPSILON)) { - // singularity found - // first check for identity matrix which must have +1 for all terms - // in leading diagonal and zero in other terms - if ((Math::abs(rows[1][0] + rows[0][1]) < angle_epsilon) && (Math::abs(rows[2][0] + rows[0][2]) < angle_epsilon) && (Math::abs(rows[2][1] + rows[1][2]) < angle_epsilon) && (Math::abs(rows[0][0] + rows[1][1] + rows[2][2] - 3) < angle_epsilon)) { - // this singularity is identity matrix so angle = 0 + */ + + // https://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm + real_t x, y, z; // Variables for result. + if (Math::is_zero_approx(rows[0][1] - rows[1][0]) && Math::is_zero_approx(rows[0][2] - rows[2][0]) && Math::is_zero_approx(rows[1][2] - rows[2][1])) { + // Singularity found. + // First check for identity matrix which must have +1 for all terms in leading diagonal and zero in other terms. + if (is_diagonal() && (Math::abs(rows[0][0] + rows[1][1] + rows[2][2] - 3) < 3 * CMP_EPSILON)) { + // This singularity is identity matrix so angle = 0. r_axis = Vector3(0, 1, 0); r_angle = 0; return; } - // otherwise this singularity is angle = 180 - angle = Math_PI; + // Otherwise this singularity is angle = 180. real_t xx = (rows[0][0] + 1) / 2; real_t yy = (rows[1][1] + 1) / 2; real_t zz = (rows[2][2] + 1) / 2; - real_t xy = (rows[1][0] + rows[0][1]) / 4; - real_t xz = (rows[2][0] + rows[0][2]) / 4; - real_t yz = (rows[2][1] + rows[1][2]) / 4; - if ((xx > yy) && (xx > zz)) { // rows[0][0] is the largest diagonal term + real_t xy = (rows[0][1] + rows[1][0]) / 4; + real_t xz = (rows[0][2] + rows[2][0]) / 4; + real_t yz = (rows[1][2] + rows[2][1]) / 4; + + if ((xx > yy) && (xx > zz)) { // rows[0][0] is the largest diagonal term. if (xx < CMP_EPSILON) { x = 0; y = Math_SQRT12; @@ -786,7 +785,7 @@ void Basis::get_axis_angle(Vector3 &r_axis, real_t &r_angle) const { y = xy / x; z = xz / x; } - } else if (yy > zz) { // rows[1][1] is the largest diagonal term + } else if (yy > zz) { // rows[1][1] is the largest diagonal term. if (yy < CMP_EPSILON) { x = Math_SQRT12; y = 0; @@ -796,7 +795,7 @@ void Basis::get_axis_angle(Vector3 &r_axis, real_t &r_angle) const { x = xy / y; z = yz / y; } - } else { // rows[2][2] is the largest diagonal term so base result on this + } else { // rows[2][2] is the largest diagonal term so base result on this. if (zz < CMP_EPSILON) { x = Math_SQRT12; y = Math_SQRT12; @@ -808,22 +807,24 @@ void Basis::get_axis_angle(Vector3 &r_axis, real_t &r_angle) const { } } r_axis = Vector3(x, y, z); - r_angle = angle; + r_angle = Math_PI; return; } - // as we have reached here there are no singularities so we can handle normally - real_t s = Math::sqrt((rows[1][2] - rows[2][1]) * (rows[1][2] - rows[2][1]) + (rows[2][0] - rows[0][2]) * (rows[2][0] - rows[0][2]) + (rows[0][1] - rows[1][0]) * (rows[0][1] - rows[1][0])); // s=|axis||sin(angle)|, used to normalise + // As we have reached here there are no singularities so we can handle normally. + double s = Math::sqrt((rows[2][1] - rows[1][2]) * (rows[2][1] - rows[1][2]) + (rows[0][2] - rows[2][0]) * (rows[0][2] - rows[2][0]) + (rows[1][0] - rows[0][1]) * (rows[1][0] - rows[0][1])); // Used to normalise. - angle = Math::acos((rows[0][0] + rows[1][1] + rows[2][2] - 1) / 2); - if (angle < 0) { - s = -s; + if (Math::abs(s) < CMP_EPSILON) { + // Prevent divide by zero, should not happen if matrix is orthogonal and should be caught by singularity test above. + s = 1; } + x = (rows[2][1] - rows[1][2]) / s; y = (rows[0][2] - rows[2][0]) / s; z = (rows[1][0] - rows[0][1]) / s; r_axis = Vector3(x, y, z); - r_angle = angle; + // CLAMP to avoid NaN if the value passed to acos is not in [0,1]. + r_angle = Math::acos(CLAMP((rows[0][0] + rows[1][1] + rows[2][2] - 1) / 2, (real_t)0.0, (real_t)1.0)); } void Basis::set_quaternion(const Quaternion &p_quaternion) { diff --git a/core/math/bvh_abb.h b/core/math/bvh_abb.h index 8a44f1c4da..699f7de604 100644 --- a/core/math/bvh_abb.h +++ b/core/math/bvh_abb.h @@ -251,7 +251,9 @@ struct BVH_ABB { void expand(real_t p_change) { POINT change; - change.set_all(p_change); + for (int axis = 0; axis < POINT::AXIS_COUNT; ++axis) { + change[axis] = p_change; + } grow(change); } @@ -262,7 +264,9 @@ struct BVH_ABB { } void set_to_max_opposite_extents() { - neg_max.set_all(FLT_MAX); + for (int axis = 0; axis < POINT::AXIS_COUNT; ++axis) { + neg_max[axis] = FLT_MAX; + } min = neg_max; } diff --git a/core/math/bvh_split.inc b/core/math/bvh_split.inc index ff07166d4a..180bbfb511 100644 --- a/core/math/bvh_split.inc +++ b/core/math/bvh_split.inc @@ -13,7 +13,7 @@ void _split_inform_references(uint32_t p_node_id) { void _split_leaf_sort_groups_simple(int &num_a, int &num_b, uint16_t *group_a, uint16_t *group_b, const BVHABB_CLASS *temp_bounds, const BVHABB_CLASS full_bound) { // special case for low leaf sizes .. should static compile out - if (MAX_ITEMS < 4) { + if constexpr (MAX_ITEMS < 4) { uint32_t ind = group_a[0]; // add to b @@ -34,7 +34,7 @@ void _split_leaf_sort_groups_simple(int &num_a, int &num_b, uint16_t *group_a, u order[POINT::AXIS_COUNT - 1] = size.max_axis_index(); static_assert(POINT::AXIS_COUNT <= 3, "BVH POINT::AXIS_COUNT has unexpected size"); - if (POINT::AXIS_COUNT == 3) { + if constexpr (POINT::AXIS_COUNT == 3) { order[1] = 3 - (order[0] + order[2]); } diff --git a/core/math/bvh_structs.inc b/core/math/bvh_structs.inc index 58c8f0479a..06f6e5d05d 100644 --- a/core/math/bvh_structs.inc +++ b/core/math/bvh_structs.inc @@ -100,7 +100,11 @@ public: num_items++; return id; } +#ifdef DEV_ENABLED return -1; +#else + ERR_FAIL_V_MSG(0, "BVH request_item error."); +#endif } }; diff --git a/core/math/bvh_tree.h b/core/math/bvh_tree.h index cdb2bb4413..8291394b31 100644 --- a/core/math/bvh_tree.h +++ b/core/math/bvh_tree.h @@ -235,7 +235,7 @@ private: // no need to keep back references for children at the moment - uint32_t sibling_id; // always a node id, as tnode is never a leaf + uint32_t sibling_id = 0; // always a node id, as tnode is never a leaf bool sibling_present = false; // if there are more children, or this is the root node, don't try and delete diff --git a/core/math/convex_hull.h b/core/math/convex_hull.h index bd86fe0eba..cc41a794bd 100644 --- a/core/math/convex_hull.h +++ b/core/math/convex_hull.h @@ -28,6 +28,9 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ +#ifndef CONVEX_HULL_H +#define CONVEX_HULL_H + /* Copyright (c) 2011 Ole Kniemeyer, MAXON, www.maxon.net This software is provided 'as-is', without any express or implied warranty. @@ -40,9 +43,6 @@ subject to the following restrictions: 3. This notice may not be removed or altered from any source distribution. */ -#ifndef CONVEX_HULL_H -#define CONVEX_HULL_H - #include "core/math/geometry_3d.h" #include "core/math/vector3.h" #include "core/templates/local_vector.h" diff --git a/core/math/math_fieldwise.cpp b/core/math/math_fieldwise.cpp index 208f89f449..726a2aeb97 100644 --- a/core/math/math_fieldwise.cpp +++ b/core/math/math_fieldwise.cpp @@ -56,6 +56,15 @@ Variant fieldwise_assign(const Variant &p_target, const Variant &p_source, const return target; } + case Variant::VECTOR2I: { + SETUP_TYPE(Vector2i) + + /**/ TRY_TRANSFER_FIELD("x", x) + else TRY_TRANSFER_FIELD("y", y) + + return target; + } + case Variant::RECT2: { SETUP_TYPE(Rect2) @@ -67,6 +76,17 @@ Variant fieldwise_assign(const Variant &p_target, const Variant &p_source, const return target; } + case Variant::RECT2I: { + SETUP_TYPE(Rect2i) + + /**/ TRY_TRANSFER_FIELD("x", position.x) + else TRY_TRANSFER_FIELD("y", position.y) + else TRY_TRANSFER_FIELD("w", size.x) + else TRY_TRANSFER_FIELD("h", size.y) + + return target; + } + case Variant::VECTOR3: { SETUP_TYPE(Vector3) @@ -76,6 +96,7 @@ Variant fieldwise_assign(const Variant &p_target, const Variant &p_source, const return target; } + case Variant::VECTOR3I: { SETUP_TYPE(Vector3i) @@ -85,6 +106,7 @@ Variant fieldwise_assign(const Variant &p_target, const Variant &p_source, const return target; } + case Variant::VECTOR4: { SETUP_TYPE(Vector4) @@ -95,6 +117,7 @@ Variant fieldwise_assign(const Variant &p_target, const Variant &p_source, const return target; } + case Variant::VECTOR4I: { SETUP_TYPE(Vector4i) @@ -106,7 +129,6 @@ Variant fieldwise_assign(const Variant &p_target, const Variant &p_source, const return target; } - case Variant::PLANE: { SETUP_TYPE(Plane) @@ -190,6 +212,29 @@ Variant fieldwise_assign(const Variant &p_target, const Variant &p_source, const return target; } + case Variant::PROJECTION: { + SETUP_TYPE(Projection) + + /**/ TRY_TRANSFER_FIELD("xx", matrix[0].x) + else TRY_TRANSFER_FIELD("xy", matrix[0].y) + else TRY_TRANSFER_FIELD("xz", matrix[0].z) + else TRY_TRANSFER_FIELD("xw", matrix[0].w) + else TRY_TRANSFER_FIELD("yx", matrix[1].x) + else TRY_TRANSFER_FIELD("yy", matrix[1].y) + else TRY_TRANSFER_FIELD("yz", matrix[1].z) + else TRY_TRANSFER_FIELD("yw", matrix[1].w) + else TRY_TRANSFER_FIELD("zx", matrix[2].x) + else TRY_TRANSFER_FIELD("zy", matrix[2].y) + else TRY_TRANSFER_FIELD("zz", matrix[2].z) + else TRY_TRANSFER_FIELD("zw", matrix[2].w) + else TRY_TRANSFER_FIELD("xo", matrix[3].x) + else TRY_TRANSFER_FIELD("yo", matrix[3].y) + else TRY_TRANSFER_FIELD("zo", matrix[3].z) + else TRY_TRANSFER_FIELD("wo", matrix[3].w) + + return target; + } + default: { ERR_FAIL_V(p_target); } diff --git a/core/math/math_funcs.h b/core/math/math_funcs.h index 656fc9f798..7fa674a23d 100644 --- a/core/math/math_funcs.h +++ b/core/math/math_funcs.h @@ -267,6 +267,7 @@ public: return cubic_interpolate(from_rot, to_rot, pre_rot, post_rot, p_weight); } + static _ALWAYS_INLINE_ float cubic_interpolate_angle(float p_from, float p_to, float p_pre, float p_post, float p_weight) { float from_rot = fmod(p_from, (float)Math_TAU); @@ -293,6 +294,7 @@ public: double b2 = Math::lerp(a2, a3, p_post_t == 0 ? 1.0 : t / p_post_t); return Math::lerp(b1, b2, p_to_t == 0 ? 0.5 : t / p_to_t); } + static _ALWAYS_INLINE_ float cubic_interpolate_in_time(float p_from, float p_to, float p_pre, float p_post, float p_weight, float p_to_t, float p_pre_t, float p_post_t) { /* Barry-Goldman method */ @@ -320,6 +322,7 @@ public: return cubic_interpolate_in_time(from_rot, to_rot, pre_rot, post_rot, p_weight, p_to_t, p_pre_t, p_post_t); } + static _ALWAYS_INLINE_ float cubic_interpolate_angle_in_time(float p_from, float p_to, float p_pre, float p_post, float p_weight, float p_to_t, float p_pre_t, float p_post_t) { float from_rot = fmod(p_from, (float)Math_TAU); @@ -346,6 +349,7 @@ public: return p_start * omt3 + p_control_1 * omt2 * p_t * 3.0 + p_control_2 * omt * t2 * 3.0 + p_end * t3; } + static _ALWAYS_INLINE_ float bezier_interpolate(float p_start, float p_control_1, float p_control_2, float p_end, float p_t) { /* Formula from Wikipedia article on Bezier curves. */ float omt = (1.0f - p_t); @@ -368,11 +372,19 @@ public: return p_from + distance * p_weight; } - static _ALWAYS_INLINE_ double inverse_lerp(double p_from, double p_to, double p_value) { return (p_value - p_from) / (p_to - p_from); } - static _ALWAYS_INLINE_ float inverse_lerp(float p_from, float p_to, float p_value) { return (p_value - p_from) / (p_to - p_from); } + static _ALWAYS_INLINE_ double inverse_lerp(double p_from, double p_to, double p_value) { + return (p_value - p_from) / (p_to - p_from); + } + static _ALWAYS_INLINE_ float inverse_lerp(float p_from, float p_to, float p_value) { + return (p_value - p_from) / (p_to - p_from); + } - static _ALWAYS_INLINE_ double remap(double p_value, double p_istart, double p_istop, double p_ostart, double p_ostop) { return Math::lerp(p_ostart, p_ostop, Math::inverse_lerp(p_istart, p_istop, p_value)); } - static _ALWAYS_INLINE_ float remap(float p_value, float p_istart, float p_istop, float p_ostart, float p_ostop) { return Math::lerp(p_ostart, p_ostop, Math::inverse_lerp(p_istart, p_istop, p_value)); } + static _ALWAYS_INLINE_ double remap(double p_value, double p_istart, double p_istop, double p_ostart, double p_ostop) { + return Math::lerp(p_ostart, p_ostop, Math::inverse_lerp(p_istart, p_istop, p_value)); + } + static _ALWAYS_INLINE_ float remap(float p_value, float p_istart, float p_istop, float p_ostart, float p_ostop) { + return Math::lerp(p_ostart, p_ostop, Math::inverse_lerp(p_istart, p_istop, p_value)); + } static _ALWAYS_INLINE_ double smoothstep(double p_from, double p_to, double p_s) { if (is_equal_approx(p_from, p_to)) { @@ -388,14 +400,26 @@ public: float s = CLAMP((p_s - p_from) / (p_to - p_from), 0.0f, 1.0f); return s * s * (3.0f - 2.0f * s); } - static _ALWAYS_INLINE_ double move_toward(double p_from, double p_to, double p_delta) { return abs(p_to - p_from) <= p_delta ? p_to : p_from + SIGN(p_to - p_from) * p_delta; } - static _ALWAYS_INLINE_ float move_toward(float p_from, float p_to, float p_delta) { return abs(p_to - p_from) <= p_delta ? p_to : p_from + SIGN(p_to - p_from) * p_delta; } + static _ALWAYS_INLINE_ double move_toward(double p_from, double p_to, double p_delta) { + return abs(p_to - p_from) <= p_delta ? p_to : p_from + SIGN(p_to - p_from) * p_delta; + } + static _ALWAYS_INLINE_ float move_toward(float p_from, float p_to, float p_delta) { + return abs(p_to - p_from) <= p_delta ? p_to : p_from + SIGN(p_to - p_from) * p_delta; + } - static _ALWAYS_INLINE_ double linear_to_db(double p_linear) { return Math::log(p_linear) * 8.6858896380650365530225783783321; } - static _ALWAYS_INLINE_ float linear_to_db(float p_linear) { return Math::log(p_linear) * (float)8.6858896380650365530225783783321; } + static _ALWAYS_INLINE_ double linear_to_db(double p_linear) { + return Math::log(p_linear) * 8.6858896380650365530225783783321; + } + static _ALWAYS_INLINE_ float linear_to_db(float p_linear) { + return Math::log(p_linear) * (float)8.6858896380650365530225783783321; + } - static _ALWAYS_INLINE_ double db_to_linear(double p_db) { return Math::exp(p_db * 0.11512925464970228420089957273422); } - static _ALWAYS_INLINE_ float db_to_linear(float p_db) { return Math::exp(p_db * (float)0.11512925464970228420089957273422); } + static _ALWAYS_INLINE_ double db_to_linear(double p_db) { + return Math::exp(p_db * 0.11512925464970228420089957273422); + } + static _ALWAYS_INLINE_ float db_to_linear(float p_db) { + return Math::exp(p_db * (float)0.11512925464970228420089957273422); + } static _ALWAYS_INLINE_ double round(double p_val) { return ::round(p_val); } static _ALWAYS_INLINE_ float round(float p_val) { return ::roundf(p_val); } diff --git a/core/math/vector2.h b/core/math/vector2.h index 9441f84087..75364f72f0 100644 --- a/core/math/vector2.h +++ b/core/math/vector2.h @@ -69,10 +69,6 @@ struct _NO_DISCARD_ Vector2 { return coord[p_idx]; } - _FORCE_INLINE_ void set_all(const real_t p_value) { - x = y = p_value; - } - _FORCE_INLINE_ Vector2::Axis min_axis_index() const { return x < y ? Vector2::AXIS_X : Vector2::AXIS_Y; } diff --git a/core/math/vector2i.h b/core/math/vector2i.h index 0245900a3b..e131bdea94 100644 --- a/core/math/vector2i.h +++ b/core/math/vector2i.h @@ -38,6 +38,8 @@ class String; struct Vector2; struct _NO_DISCARD_ Vector2i { + static const int AXIS_COUNT = 2; + enum Axis { AXIS_X, AXIS_Y, diff --git a/core/math/vector3.cpp b/core/math/vector3.cpp index 4db45fe798..55ba509144 100644 --- a/core/math/vector3.cpp +++ b/core/math/vector3.cpp @@ -45,16 +45,6 @@ Vector3 Vector3::rotated(const Vector3 &p_axis, const real_t p_angle) const { return r; } -void Vector3::set_axis(const int p_axis, const real_t p_value) { - ERR_FAIL_INDEX(p_axis, 3); - coord[p_axis] = p_value; -} - -real_t Vector3::get_axis(const int p_axis) const { - ERR_FAIL_INDEX_V(p_axis, 3, 0); - return operator[](p_axis); -} - Vector3 Vector3::clamp(const Vector3 &p_min, const Vector3 &p_max) const { return Vector3( CLAMP(x, p_min.x, p_max.x), diff --git a/core/math/vector3.h b/core/math/vector3.h index 3944afa92e..62e810fb4d 100644 --- a/core/math/vector3.h +++ b/core/math/vector3.h @@ -68,13 +68,6 @@ struct _NO_DISCARD_ Vector3 { return coord[p_axis]; } - void set_axis(const int p_axis, const real_t p_value); - real_t get_axis(const int p_axis) const; - - _FORCE_INLINE_ void set_all(const real_t p_value) { - x = y = z = p_value; - } - _FORCE_INLINE_ Vector3::Axis min_axis_index() const { return x < y ? (x < z ? Vector3::AXIS_X : Vector3::AXIS_Z) : (y < z ? Vector3::AXIS_Y : Vector3::AXIS_Z); } diff --git a/core/math/vector3i.cpp b/core/math/vector3i.cpp index b8e74ea6d2..b248f35035 100644 --- a/core/math/vector3i.cpp +++ b/core/math/vector3i.cpp @@ -33,16 +33,6 @@ #include "core/math/vector3.h" #include "core/string/ustring.h" -void Vector3i::set_axis(const int p_axis, const int32_t p_value) { - ERR_FAIL_INDEX(p_axis, 3); - coord[p_axis] = p_value; -} - -int32_t Vector3i::get_axis(const int p_axis) const { - ERR_FAIL_INDEX_V(p_axis, 3, 0); - return operator[](p_axis); -} - Vector3i::Axis Vector3i::min_axis_index() const { return x < y ? (x < z ? Vector3i::AXIS_X : Vector3i::AXIS_Z) : (y < z ? Vector3i::AXIS_Y : Vector3i::AXIS_Z); } diff --git a/core/math/vector3i.h b/core/math/vector3i.h index 825ce40318..710fd96376 100644 --- a/core/math/vector3i.h +++ b/core/math/vector3i.h @@ -38,6 +38,8 @@ class String; struct Vector3; struct _NO_DISCARD_ Vector3i { + static const int AXIS_COUNT = 3; + enum Axis { AXIS_X, AXIS_Y, @@ -64,9 +66,6 @@ struct _NO_DISCARD_ Vector3i { return coord[p_axis]; } - void set_axis(const int p_axis, const int32_t p_value); - int32_t get_axis(const int p_axis) const; - Vector3i::Axis min_axis_index() const; Vector3i::Axis max_axis_index() const; diff --git a/core/math/vector4.cpp b/core/math/vector4.cpp index 3c25f454a3..55e51834df 100644 --- a/core/math/vector4.cpp +++ b/core/math/vector4.cpp @@ -33,16 +33,6 @@ #include "core/math/basis.h" #include "core/string/print_string.h" -void Vector4::set_axis(const int p_axis, const real_t p_value) { - ERR_FAIL_INDEX(p_axis, 4); - components[p_axis] = p_value; -} - -real_t Vector4::get_axis(const int p_axis) const { - ERR_FAIL_INDEX_V(p_axis, 4, 0); - return operator[](p_axis); -} - Vector4::Axis Vector4::min_axis_index() const { uint32_t min_index = 0; real_t min_value = x; diff --git a/core/math/vector4.h b/core/math/vector4.h index f964264108..426c473e13 100644 --- a/core/math/vector4.h +++ b/core/math/vector4.h @@ -37,6 +37,8 @@ #include "core/string/ustring.h" struct _NO_DISCARD_ Vector4 { + static const int AXIS_COUNT = 4; + enum Axis { AXIS_X, AXIS_Y, @@ -63,11 +65,6 @@ struct _NO_DISCARD_ Vector4 { return components[p_axis]; } - _FORCE_INLINE_ void set_all(const real_t p_value); - - void set_axis(const int p_axis, const real_t p_value); - real_t get_axis(const int p_axis) const; - Vector4::Axis min_axis_index() const; Vector4::Axis max_axis_index() const; @@ -148,10 +145,6 @@ struct _NO_DISCARD_ Vector4 { } }; -void Vector4::set_all(const real_t p_value) { - x = y = z = p_value; -} - real_t Vector4::dot(const Vector4 &p_vec4) const { return x * p_vec4.x + y * p_vec4.y + z * p_vec4.z + w * p_vec4.w; } diff --git a/core/math/vector4i.cpp b/core/math/vector4i.cpp index a89b802675..77f6fbd5b7 100644 --- a/core/math/vector4i.cpp +++ b/core/math/vector4i.cpp @@ -33,16 +33,6 @@ #include "core/math/vector4.h" #include "core/string/ustring.h" -void Vector4i::set_axis(const int p_axis, const int32_t p_value) { - ERR_FAIL_INDEX(p_axis, 4); - coord[p_axis] = p_value; -} - -int32_t Vector4i::get_axis(const int p_axis) const { - ERR_FAIL_INDEX_V(p_axis, 4, 0); - return operator[](p_axis); -} - Vector4i::Axis Vector4i::min_axis_index() const { uint32_t min_index = 0; int32_t min_value = x; diff --git a/core/math/vector4i.h b/core/math/vector4i.h index d08e40d754..a32414bb18 100644 --- a/core/math/vector4i.h +++ b/core/math/vector4i.h @@ -38,6 +38,8 @@ class String; struct Vector4; struct _NO_DISCARD_ Vector4i { + static const int AXIS_COUNT = 4; + enum Axis { AXIS_X, AXIS_Y, @@ -66,9 +68,6 @@ struct _NO_DISCARD_ Vector4i { return coord[p_axis]; } - void set_axis(const int p_axis, const int32_t p_value); - int32_t get_axis(const int p_axis) const; - Vector4i::Axis min_axis_index() const; Vector4i::Axis max_axis_index() const; diff --git a/core/object/make_virtuals.py b/core/object/make_virtuals.py index c18d70d9f6..326a9277ff 100644 --- a/core/object/make_virtuals.py +++ b/core/object/make_virtuals.py @@ -5,11 +5,11 @@ mutable bool _gdvirtual_##m_name##_initialized = false;\\ mutable GDNativeExtensionClassCallVirtual _gdvirtual_##m_name = nullptr;\\ template<bool required>\\ _FORCE_INLINE_ bool _gdvirtual_##m_name##_call($CALLARGS) $CONST { \\ - ScriptInstance *script_instance = ((Object*)(this))->get_script_instance();\\ - if (script_instance) {\\ + ScriptInstance *_script_instance = ((Object*)(this))->get_script_instance();\\ + if (_script_instance) {\\ Callable::CallError ce; \\ $CALLSIARGS\\ - $CALLSIBEGINscript_instance->callp(_gdvirtual_##m_name##_sn, $CALLSIARGPASS, ce);\\ + $CALLSIBEGIN_script_instance->callp(_gdvirtual_##m_name##_sn, $CALLSIARGPASS, ce);\\ if (ce.error == Callable::CallError::CALL_OK) {\\ $CALLSIRET\\ return true;\\ @@ -35,9 +35,9 @@ _FORCE_INLINE_ bool _gdvirtual_##m_name##_call($CALLARGS) $CONST { \\ return false;\\ }\\ _FORCE_INLINE_ bool _gdvirtual_##m_name##_overridden() const { \\ - ScriptInstance *script_instance = ((Object*)(this))->get_script_instance();\\ - if (script_instance) {\\ - return script_instance->has_method(_gdvirtual_##m_name##_sn);\\ + ScriptInstance *_script_instance = ((Object*)(this))->get_script_instance();\\ + if (_script_instance) {\\ + return _script_instance->has_method(_gdvirtual_##m_name##_sn);\\ }\\ if (unlikely(_get_extension() && !_gdvirtual_##m_name##_initialized)) {\\ _gdvirtual_##m_name = (_get_extension() && _get_extension()->get_virtual) ? _get_extension()->get_virtual(_get_extension()->class_userdata, #m_name) : (GDNativeExtensionClassCallVirtual) nullptr;\\ diff --git a/core/object/method_bind.h b/core/object/method_bind.h index d60550c899..0d3e40f709 100644 --- a/core/object/method_bind.h +++ b/core/object/method_bind.h @@ -241,9 +241,17 @@ class MethodBindVarArgTR : public MethodBindVarArgBase<MethodBindVarArgTR<T, R>, friend class MethodBindVarArgBase<MethodBindVarArgTR<T, R>, T, R, true>; public: +#if defined(SANITIZERS_ENABLED) && defined(__GNUC__) && !defined(__clang__) + // Workaround GH-66343 raised only with UBSAN, seems to be a false positive. +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif virtual Variant call(Object *p_object, const Variant **p_args, int p_arg_count, Callable::CallError &r_error) override { return (static_cast<T *>(p_object)->*MethodBindVarArgBase<MethodBindVarArgTR<T, R>, T, R, true>::method)(p_args, p_arg_count, r_error); } +#if defined(SANITIZERS_ENABLED) && defined(__GNUC__) && !defined(__clang__) +#pragma GCC diagnostic pop +#endif MethodBindVarArgTR( R (T::*p_method)(const Variant **, int, Callable::CallError &), diff --git a/core/object/object.h b/core/object/object.h index 8ade5a204a..33a5afc9aa 100644 --- a/core/object/object.h +++ b/core/object/object.h @@ -733,34 +733,12 @@ public: template <class T> static T *cast_to(Object *p_object) { -#ifndef NO_SAFE_CAST return dynamic_cast<T *>(p_object); -#else - if (!p_object) { - return nullptr; - } - if (p_object->is_class_ptr(T::get_class_ptr_static())) { - return static_cast<T *>(p_object); - } else { - return nullptr; - } -#endif } template <class T> static const T *cast_to(const Object *p_object) { -#ifndef NO_SAFE_CAST return dynamic_cast<const T *>(p_object); -#else - if (!p_object) { - return nullptr; - } - if (p_object->is_class_ptr(T::get_class_ptr_static())) { - return static_cast<const T *>(p_object); - } else { - return nullptr; - } -#endif } enum { diff --git a/core/object/ref_counted.cpp b/core/object/ref_counted.cpp index cac2400744..50467d795d 100644 --- a/core/object/ref_counted.cpp +++ b/core/object/ref_counted.cpp @@ -48,9 +48,10 @@ void RefCounted::_bind_methods() { ClassDB::bind_method(D_METHOD("init_ref"), &RefCounted::init_ref); ClassDB::bind_method(D_METHOD("reference"), &RefCounted::reference); ClassDB::bind_method(D_METHOD("unreference"), &RefCounted::unreference); + ClassDB::bind_method(D_METHOD("get_reference_count"), &RefCounted::get_reference_count); } -int RefCounted::reference_get_count() const { +int RefCounted::get_reference_count() const { return refcount.get(); } diff --git a/core/object/ref_counted.h b/core/object/ref_counted.h index bd06a84bd8..71790fb825 100644 --- a/core/object/ref_counted.h +++ b/core/object/ref_counted.h @@ -47,7 +47,7 @@ public: bool init_ref(); bool reference(); // returns false if refcount is at zero and didn't get increased bool unreference(); - int reference_get_count() const; + int get_reference_count() const; RefCounted(); ~RefCounted() {} diff --git a/core/object/undo_redo.cpp b/core/object/undo_redo.cpp index d3c48853f1..aa66e86bc0 100644 --- a/core/object/undo_redo.cpp +++ b/core/object/undo_redo.cpp @@ -126,27 +126,28 @@ void UndoRedo::create_action(const String &p_name, MergeMode p_mode) { force_keep_in_merge_ends = false; } -void UndoRedo::add_do_methodp(Object *p_object, const StringName &p_method, const Variant **p_args, int p_argcount) { - ERR_FAIL_COND(p_object == nullptr); +void UndoRedo::add_do_method(const Callable &p_callable) { + ERR_FAIL_COND(p_callable.is_null()); ERR_FAIL_COND(action_level <= 0); ERR_FAIL_COND((current_action + 1) >= actions.size()); + + Object *object = p_callable.get_object(); + ERR_FAIL_NULL(object); + Operation do_op; - do_op.object = p_object->get_instance_id(); - if (Object::cast_to<RefCounted>(p_object)) { - do_op.ref = Ref<RefCounted>(Object::cast_to<RefCounted>(p_object)); + do_op.callable = p_callable; + do_op.object = p_callable.get_object_id(); + if (Object::cast_to<RefCounted>(object)) { + do_op.ref = Ref<RefCounted>(Object::cast_to<RefCounted>(object)); } - do_op.type = Operation::TYPE_METHOD; - do_op.name = p_method; + do_op.name = p_callable.get_method(); - for (int i = 0; i < p_argcount; i++) { - do_op.args.push_back(*p_args[i]); - } actions.write[current_action + 1].do_ops.push_back(do_op); } -void UndoRedo::add_undo_methodp(Object *p_object, const StringName &p_method, const Variant **p_args, int p_argcount) { - ERR_FAIL_COND(p_object == nullptr); +void UndoRedo::add_undo_method(const Callable &p_callable) { + ERR_FAIL_COND(p_callable.is_null()); ERR_FAIL_COND(action_level <= 0); ERR_FAIL_COND((current_action + 1) >= actions.size()); @@ -155,19 +156,19 @@ void UndoRedo::add_undo_methodp(Object *p_object, const StringName &p_method, co return; } + Object *object = p_callable.get_object(); + ERR_FAIL_NULL(object); + Operation undo_op; - undo_op.object = p_object->get_instance_id(); - if (Object::cast_to<RefCounted>(p_object)) { - undo_op.ref = Ref<RefCounted>(Object::cast_to<RefCounted>(p_object)); + undo_op.callable = p_callable; + undo_op.object = p_callable.get_object_id(); + if (Object::cast_to<RefCounted>(object)) { + undo_op.ref = Ref<RefCounted>(Object::cast_to<RefCounted>(object)); } - undo_op.type = Operation::TYPE_METHOD; undo_op.force_keep_in_merge_ends = force_keep_in_merge_ends; - undo_op.name = p_method; + undo_op.name = p_callable.get_method(); - for (int i = 0; i < p_argcount; i++) { - undo_op.args.push_back(*p_args[i]); - } actions.write[current_action + 1].undo_ops.push_back(undo_op); } @@ -183,7 +184,7 @@ void UndoRedo::add_do_property(Object *p_object, const StringName &p_property, c do_op.type = Operation::TYPE_PROPERTY; do_op.name = p_property; - do_op.args.push_back(p_value); + do_op.value = p_value; actions.write[current_action + 1].do_ops.push_back(do_op); } @@ -206,7 +207,7 @@ void UndoRedo::add_undo_property(Object *p_object, const StringName &p_property, undo_op.type = Operation::TYPE_PROPERTY; undo_op.force_keep_in_merge_ends = force_keep_in_merge_ends; undo_op.name = p_property; - undo_op.args.push_back(p_value); + undo_op.value = p_value; actions.write[current_action + 1].undo_ops.push_back(undo_op); } @@ -312,33 +313,42 @@ void UndoRedo::_process_operation_list(List<Operation>::Element *E) { switch (op.type) { case Operation::TYPE_METHOD: { - int argc = op.args.size(); - Vector<const Variant *> argptrs; - argptrs.resize(argc); - - for (int i = 0; i < argc; i++) { - argptrs.write[i] = &op.args[i]; - } - Callable::CallError ce; - obj->callp(op.name, (const Variant **)argptrs.ptr(), argc, ce); + Variant ret; + op.callable.callp(nullptr, 0, ret, ce); if (ce.error != Callable::CallError::CALL_OK) { - ERR_PRINT("Error calling UndoRedo method operation '" + String(op.name) + "': " + Variant::get_call_error_text(obj, op.name, (const Variant **)argptrs.ptr(), argc, ce)); + ERR_PRINT("Error calling UndoRedo method operation '" + String(op.name) + "': " + Variant::get_call_error_text(obj, op.name, nullptr, 0, ce)); } #ifdef TOOLS_ENABLED Resource *res = Object::cast_to<Resource>(obj); if (res) { res->set_edited(true); } - #endif if (method_callback) { - method_callback(method_callback_ud, obj, op.name, (const Variant **)argptrs.ptr(), argc); + Vector<Variant> binds; + if (op.callable.is_custom()) { + CallableCustomBind *ccb = dynamic_cast<CallableCustomBind *>(op.callable.get_custom()); + if (ccb) { + binds = ccb->get_binds(); + } + } + + if (binds.is_empty()) { + method_callback(method_callback_ud, obj, op.name, nullptr, 0); + } else { + const Variant **args = (const Variant **)alloca(sizeof(const Variant **) * binds.size()); + for (int i = 0; i < binds.size(); i++) { + args[i] = (const Variant *)&binds[i]; + } + + method_callback(method_callback_ud, obj, op.name, args, binds.size()); + } } } break; case Operation::TYPE_PROPERTY: { - obj->set(op.name, op.args[0]); + obj->set(op.name, op.value); #ifdef TOOLS_ENABLED Resource *res = Object::cast_to<Resource>(obj); if (res) { @@ -346,7 +356,7 @@ void UndoRedo::_process_operation_list(List<Operation>::Element *E) { } #endif if (property_callback) { - property_callback(prop_callback_ud, obj, op.name, op.args[0]); + property_callback(prop_callback_ud, obj, op.name, op.value); } } break; case Operation::TYPE_REFERENCE: { @@ -444,87 +454,13 @@ UndoRedo::~UndoRedo() { clear_history(); } -void UndoRedo::_add_do_method(const Variant **p_args, int p_argcount, Callable::CallError &r_error) { - if (p_argcount < 2) { - r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS; - r_error.argument = 0; - return; - } - - if (p_args[0]->get_type() != Variant::OBJECT) { - r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT; - r_error.argument = 0; - r_error.expected = Variant::OBJECT; - return; - } - - if (p_args[1]->get_type() != Variant::STRING_NAME && p_args[1]->get_type() != Variant::STRING) { - r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT; - r_error.argument = 1; - r_error.expected = Variant::STRING_NAME; - return; - } - - r_error.error = Callable::CallError::CALL_OK; - - Object *object = *p_args[0]; - StringName method = *p_args[1]; - - add_do_methodp(object, method, p_args + 2, p_argcount - 2); -} - -void UndoRedo::_add_undo_method(const Variant **p_args, int p_argcount, Callable::CallError &r_error) { - if (p_argcount < 2) { - r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS; - r_error.argument = 0; - return; - } - - if (p_args[0]->get_type() != Variant::OBJECT) { - r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT; - r_error.argument = 0; - r_error.expected = Variant::OBJECT; - return; - } - - if (p_args[1]->get_type() != Variant::STRING_NAME && p_args[1]->get_type() != Variant::STRING) { - r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT; - r_error.argument = 1; - r_error.expected = Variant::STRING_NAME; - return; - } - - r_error.error = Callable::CallError::CALL_OK; - - Object *object = *p_args[0]; - StringName method = *p_args[1]; - - add_undo_methodp(object, method, p_args + 2, p_argcount - 2); -} - void UndoRedo::_bind_methods() { ClassDB::bind_method(D_METHOD("create_action", "name", "merge_mode"), &UndoRedo::create_action, DEFVAL(MERGE_DISABLE)); ClassDB::bind_method(D_METHOD("commit_action", "execute"), &UndoRedo::commit_action, DEFVAL(true)); ClassDB::bind_method(D_METHOD("is_committing_action"), &UndoRedo::is_committing_action); - { - MethodInfo mi; - mi.name = "add_do_method"; - mi.arguments.push_back(PropertyInfo(Variant::OBJECT, "object")); - mi.arguments.push_back(PropertyInfo(Variant::STRING_NAME, "method")); - - ClassDB::bind_vararg_method(METHOD_FLAGS_DEFAULT, "add_do_method", &UndoRedo::_add_do_method, mi, varray(), false); - } - - { - MethodInfo mi; - mi.name = "add_undo_method"; - mi.arguments.push_back(PropertyInfo(Variant::OBJECT, "object")); - mi.arguments.push_back(PropertyInfo(Variant::STRING_NAME, "method")); - - ClassDB::bind_vararg_method(METHOD_FLAGS_DEFAULT, "add_undo_method", &UndoRedo::_add_undo_method, mi, varray(), false); - } - + ClassDB::bind_method(D_METHOD("add_do_method", "callable"), &UndoRedo::add_do_method); + ClassDB::bind_method(D_METHOD("add_undo_method", "callable"), &UndoRedo::add_undo_method); ClassDB::bind_method(D_METHOD("add_do_property", "object", "property", "value"), &UndoRedo::add_do_property); ClassDB::bind_method(D_METHOD("add_undo_property", "object", "property", "value"), &UndoRedo::add_undo_property); ClassDB::bind_method(D_METHOD("add_do_reference", "object"), &UndoRedo::add_do_reference); diff --git a/core/object/undo_redo.h b/core/object/undo_redo.h index 63cf3e5cbe..c7c58697c3 100644 --- a/core/object/undo_redo.h +++ b/core/object/undo_redo.h @@ -46,8 +46,6 @@ public: }; typedef void (*CommitNotifyCallback)(void *p_ud, const String &p_name); - void _add_do_method(const Variant **p_args, int p_argcount, Callable::CallError &r_error); - void _add_undo_method(const Variant **p_args, int p_argcount, Callable::CallError &r_error); typedef void (*MethodNotifyCallback)(void *p_ud, Object *p_base, const StringName &p_name, const Variant **p_args, int p_argcount); typedef void (*PropertyNotifyCallback)(void *p_ud, Object *p_base, const StringName &p_property, const Variant &p_value); @@ -58,14 +56,14 @@ private: TYPE_METHOD, TYPE_PROPERTY, TYPE_REFERENCE - }; + } type; - Type type; bool force_keep_in_merge_ends; Ref<RefCounted> ref; ObjectID object; StringName name; - Vector<Variant> args; + Callable callable; + Variant value; void delete_reference(); }; @@ -106,30 +104,8 @@ protected: public: void create_action(const String &p_name = "", MergeMode p_mode = MERGE_DISABLE); - void add_do_methodp(Object *p_object, const StringName &p_method, const Variant **p_args, int p_argcount); - void add_undo_methodp(Object *p_object, const StringName &p_method, const Variant **p_args, int p_argcount); - - template <typename... VarArgs> - void add_do_method(Object *p_object, const StringName &p_method, VarArgs... p_args) { - Variant args[sizeof...(p_args) + 1] = { p_args..., Variant() }; // +1 makes sure zero sized arrays are also supported. - const Variant *argptrs[sizeof...(p_args) + 1]; - for (uint32_t i = 0; i < sizeof...(p_args); i++) { - argptrs[i] = &args[i]; - } - - add_do_methodp(p_object, p_method, sizeof...(p_args) == 0 ? nullptr : (const Variant **)argptrs, sizeof...(p_args)); - } - template <typename... VarArgs> - void add_undo_method(Object *p_object, const StringName &p_method, VarArgs... p_args) { - Variant args[sizeof...(p_args) + 1] = { p_args..., Variant() }; // +1 makes sure zero sized arrays are also supported. - const Variant *argptrs[sizeof...(p_args) + 1]; - for (uint32_t i = 0; i < sizeof...(p_args); i++) { - argptrs[i] = &args[i]; - } - - add_undo_methodp(p_object, p_method, sizeof...(p_args) == 0 ? nullptr : (const Variant **)argptrs, sizeof...(p_args)); - } - + void add_do_method(const Callable &p_callable); + void add_undo_method(const Callable &p_callable); void add_do_property(Object *p_object, const StringName &p_property, const Variant &p_value); void add_undo_property(Object *p_object, const StringName &p_property, const Variant &p_value); void add_do_reference(Object *p_object); diff --git a/core/object/worker_thread_pool.cpp b/core/object/worker_thread_pool.cpp index c770515b9e..9b3dc6833e 100644 --- a/core/object/worker_thread_pool.cpp +++ b/core/object/worker_thread_pool.cpp @@ -395,7 +395,7 @@ void WorkerThreadPool::wait_for_group_task_completion(GroupID p_group) { uint32_t finished_users = group->finished.increment(); // fetch happens before inc, so increment later. if (finished_users == max_users) { - // All tasks using this group are gone (finished before the group), so clear the gorup too. + // All tasks using this group are gone (finished before the group), so clear the group too. task_mutex.lock(); group_allocator.free(group); task_mutex.unlock(); diff --git a/core/os/mutex.cpp b/core/os/mutex.cpp index 1d4400bfc1..512db1737a 100644 --- a/core/os/mutex.cpp +++ b/core/os/mutex.cpp @@ -40,11 +40,7 @@ void _global_unlock() { _global_mutex.unlock(); } -#ifndef NO_THREADS - template class MutexImpl<std::recursive_mutex>; template class MutexImpl<std::mutex>; template class MutexLock<MutexImpl<std::recursive_mutex>>; template class MutexLock<MutexImpl<std::mutex>>; - -#endif diff --git a/core/os/mutex.h b/core/os/mutex.h index a51248807b..eb58418bd6 100644 --- a/core/os/mutex.h +++ b/core/os/mutex.h @@ -34,8 +34,6 @@ #include "core/error/error_list.h" #include "core/typedefs.h" -#if !defined(NO_THREADS) - #include <mutex> template <class StdMutexT> @@ -79,29 +77,4 @@ extern template class MutexImpl<std::mutex>; extern template class MutexLock<MutexImpl<std::recursive_mutex>>; extern template class MutexLock<MutexImpl<std::mutex>>; -#else - -class FakeMutex { - FakeMutex() {} -}; - -template <class MutexT> -class MutexImpl { -public: - _ALWAYS_INLINE_ void lock() const {} - _ALWAYS_INLINE_ void unlock() const {} - _ALWAYS_INLINE_ Error try_lock() const { return OK; } -}; - -template <class MutexT> -class MutexLock { -public: - explicit MutexLock(const MutexT &p_mutex) {} -}; - -using Mutex = MutexImpl<FakeMutex>; -using BinaryMutex = MutexImpl<FakeMutex>; // Non-recursive, handle with care - -#endif // !NO_THREADS - #endif // MUTEX_H diff --git a/core/os/os.cpp b/core/os/os.cpp index 526b31ae7e..72d68893f3 100644 --- a/core/os/os.cpp +++ b/core/os/os.cpp @@ -54,10 +54,6 @@ double OS::get_unix_time() const { return 0; } -void OS::debug_break() { - // something -} - void OS::_set_logger(CompositeLogger *p_logger) { if (_logger) { memdelete(_logger); @@ -332,14 +328,6 @@ String OS::get_processor_name() const { return ""; } -bool OS::can_use_threads() const { -#ifdef NO_THREADS - return false; -#else - return true; -#endif -} - void OS::set_has_server_feature_callback(HasServerFeatureCallback p_callback) { has_server_feature_callback = p_callback; } @@ -523,10 +511,10 @@ void OS::add_frame_delay(bool p_can_draw) { if (is_in_low_processor_usage_mode() || !p_can_draw) { dynamic_delay = get_low_processor_usage_mode_sleep_usec(); } - const int target_fps = Engine::get_singleton()->get_target_fps(); - if (target_fps > 0 && !Engine::get_singleton()->is_editor_hint()) { + const int max_fps = Engine::get_singleton()->get_max_fps(); + if (max_fps > 0 && !Engine::get_singleton()->is_editor_hint()) { // Override the low processor usage mode sleep delay if the target FPS is lower. - dynamic_delay = MAX(dynamic_delay, (uint64_t)(1000000 / target_fps)); + dynamic_delay = MAX(dynamic_delay, (uint64_t)(1000000 / max_fps)); } if (dynamic_delay > 0) { diff --git a/core/os/os.h b/core/os/os.h index 0e8a2d0398..1a5e45968d 100644 --- a/core/os/os.h +++ b/core/os/os.h @@ -69,6 +69,7 @@ class OS { // so we can retrieve the rendering drivers available int _display_driver_id = -1; String _current_rendering_driver_name; + String _current_rendering_method; protected: void _set_logger(CompositeLogger *p_logger); @@ -98,6 +99,8 @@ protected: virtual void initialize_joypads() = 0; void set_current_rendering_driver_name(String p_driver_name) { _current_rendering_driver_name = p_driver_name; } + void set_current_rendering_method(String p_name) { _current_rendering_method = p_name; } + void set_display_driver_id(int p_display_driver_id) { _display_driver_id = p_display_driver_id; } virtual void set_main_loop(MainLoop *p_main_loop) = 0; @@ -116,6 +119,8 @@ public: static OS *get_singleton(); String get_current_rendering_driver_name() const { return _current_rendering_driver_name; } + String get_current_rendering_method() const { return _current_rendering_method; } + int get_display_driver_id() const { return _display_driver_id; } void print_error(const char *p_function, const char *p_file, int p_line, const char *p_code, const char *p_rationale, bool p_editor_notify = false, Logger::ErrorType p_type = Logger::ERR_ERROR); @@ -161,6 +166,8 @@ public: virtual bool set_environment(const String &p_var, const String &p_value) const = 0; virtual String get_name() const = 0; + virtual String get_distribution_name() const = 0; + virtual String get_version() const = 0; virtual List<String> get_cmdline_args() const { return _cmdline; } virtual List<String> get_cmdline_user_args() const { return _user_args; } virtual List<String> get_cmdline_platform_args() const { return List<String>(); } @@ -202,18 +209,15 @@ public: MONTH_DECEMBER, }; - struct Date { + struct DateTime { int64_t year; Month month; uint8_t day; Weekday weekday; - bool dst; - }; - - struct Time { uint8_t hour; uint8_t minute; uint8_t second; + bool dst; }; struct TimeZoneInfo { @@ -221,8 +225,7 @@ public: String name; }; - virtual Date get_date(bool p_utc = false) const = 0; - virtual Time get_time(bool p_utc = false) const = 0; + virtual DateTime get_datetime(bool utc = false) const = 0; virtual TimeZoneInfo get_time_zone_info() const = 0; virtual double get_unix_time() const; @@ -284,8 +287,6 @@ public: virtual Error move_to_trash(const String &p_path) { return FAILED; } - virtual void debug_break(); - virtual int get_exit_code() const; // `set_exit_code` should only be used from `SceneTree` (or from a similar // level, e.g. from the `Main::start` if leaving without creating a `SceneTree`). @@ -298,8 +299,6 @@ public: virtual String get_unique_id() const; - virtual bool can_use_threads() const; - bool has_feature(const String &p_feature); void set_has_server_feature_callback(HasServerFeatureCallback p_callback); diff --git a/core/os/pool_allocator.cpp b/core/os/pool_allocator.cpp index f622e2c7c5..e7f2cff7c5 100644 --- a/core/os/pool_allocator.cpp +++ b/core/os/pool_allocator.cpp @@ -35,8 +35,6 @@ #include "core/os/os.h" #include "core/string/print_string.h" -#include <assert.h> - #define COMPACT_CHUNK(m_entry, m_to_pos) \ do { \ void *_dst = &((unsigned char *)pool)[m_to_pos]; \ @@ -169,11 +167,6 @@ bool PoolAllocator::find_entry_index(EntryIndicesPos *p_map_pos, const Entry *p_ PoolAllocator::ID PoolAllocator::alloc(int p_size) { ERR_FAIL_COND_V(p_size < 1, POOL_ALLOCATOR_INVALID_ID); -#ifdef DEBUG_ENABLED - if (p_size > free_mem) { - OS::get_singleton()->debug_break(); - } -#endif ERR_FAIL_COND_V(p_size > free_mem, POOL_ALLOCATOR_INVALID_ID); mt_lock(); @@ -482,7 +475,6 @@ void *PoolAllocator::get(ID p_mem) { ERR_FAIL_COND_V(!e, nullptr); } if (e->lock == 0) { - //assert(0); mt_unlock(); ERR_PRINT("e->lock == 0"); return nullptr; diff --git a/core/os/rw_lock.h b/core/os/rw_lock.h index a046f474ea..d3206547c7 100644 --- a/core/os/rw_lock.h +++ b/core/os/rw_lock.h @@ -33,8 +33,6 @@ #include "core/error/error_list.h" -#if !defined(NO_THREADS) - #include <shared_mutex> class RWLock { @@ -72,21 +70,6 @@ public: } }; -#else - -class RWLock { -public: - void read_lock() const {} - void read_unlock() const {} - Error read_try_lock() const { return OK; } - - void write_lock() {} - void write_unlock() {} - Error write_try_lock() { return OK; } -}; - -#endif - class RWLockRead { const RWLock &lock; diff --git a/core/os/semaphore.h b/core/os/semaphore.h index 72df52dd34..1a93d3ee2c 100644 --- a/core/os/semaphore.h +++ b/core/os/semaphore.h @@ -34,8 +34,6 @@ #include "core/error/error_list.h" #include "core/typedefs.h" -#if !defined(NO_THREADS) - #include <condition_variable> #include <mutex> @@ -70,15 +68,4 @@ public: } }; -#else - -class Semaphore { -public: - _ALWAYS_INLINE_ void post() const {} - _ALWAYS_INLINE_ void wait() const {} - _ALWAYS_INLINE_ bool try_wait() const { return true; } -}; - -#endif - #endif // SEMAPHORE_H diff --git a/core/os/thread.cpp b/core/os/thread.cpp index c8072b7280..e8ebb4597f 100644 --- a/core/os/thread.cpp +++ b/core/os/thread.cpp @@ -34,9 +34,6 @@ #include "thread.h" #include "core/object/script_language.h" - -#if !defined(NO_THREADS) - #include "core/templates/safe_refcount.h" Error (*Thread::set_name_func)(const String &) = nullptr; @@ -128,5 +125,4 @@ Thread::~Thread() { } } -#endif #endif // PLATFORM_THREAD_OVERRIDE diff --git a/core/os/thread.h b/core/os/thread.h index 0fb283e224..7462ec17fb 100644 --- a/core/os/thread.h +++ b/core/os/thread.h @@ -35,15 +35,14 @@ #ifdef PLATFORM_THREAD_OVERRIDE #include "platform_thread.h" #else + #ifndef THREAD_H #define THREAD_H +#include "core/templates/safe_refcount.h" #include "core/typedefs.h" -#if !defined(NO_THREADS) -#include "core/templates/safe_refcount.h" #include <thread> -#endif class String; @@ -65,7 +64,6 @@ public: }; private: -#if !defined(NO_THREADS) friend class Main; static ID main_thread_id; @@ -82,7 +80,6 @@ private: static void (*set_priority_func)(Thread::Priority); static void (*init_func)(); static void (*term_func)(); -#endif public: static void _set_platform_funcs( @@ -91,7 +88,6 @@ public: void (*p_init_func)() = nullptr, void (*p_term_func)() = nullptr); -#if !defined(NO_THREADS) _FORCE_INLINE_ ID get_id() const { return id; } // get the ID of the caller thread _FORCE_INLINE_ static ID get_caller_id() { return caller_id; } @@ -107,19 +103,6 @@ public: Thread(); ~Thread(); -#else - _FORCE_INLINE_ ID get_id() const { return 0; } - // get the ID of the caller thread - _FORCE_INLINE_ static ID get_caller_id() { return 0; } - // get the ID of the main thread - _FORCE_INLINE_ static ID get_main_id() { return 0; } - - static Error set_name(const String &p_name) { return ERR_UNAVAILABLE; } - - void start(Thread::Callback p_callback, void *p_user, const Settings &p_settings = Settings()) {} - bool is_started() const { return false; } - void wait_to_finish() {} -#endif }; #endif // THREAD_H diff --git a/core/os/threaded_array_processor.h b/core/os/threaded_array_processor.h index 935fc7a360..95a2253f14 100644 --- a/core/os/threaded_array_processor.h +++ b/core/os/threaded_array_processor.h @@ -49,8 +49,6 @@ struct ThreadArrayProcessData { } }; -#ifndef NO_THREADS - template <class T> void process_array_thread(void *ud) { T &data = *(T *)ud; @@ -86,21 +84,4 @@ void thread_process_array(uint32_t p_elements, C *p_instance, M p_method, U p_us memdelete_arr(threads); } -#else - -template <class C, class M, class U> -void thread_process_array(uint32_t p_elements, C *p_instance, M p_method, U p_userdata) { - ThreadArrayProcessData<C, U> data; - data.method = p_method; - data.instance = p_instance; - data.userdata = p_userdata; - data.index.set(0); - data.elements = p_elements; - for (uint32_t i = 0; i < p_elements; i++) { - data.process(i); - } -} - -#endif - #endif // THREADED_ARRAY_PROCESSOR_H diff --git a/core/os/time.cpp b/core/os/time.cpp index a30e2a906b..a3c2c99b4c 100644 --- a/core/os/time.cpp +++ b/core/os/time.cpp @@ -324,63 +324,60 @@ String Time::get_offset_string_from_offset_minutes(int64_t p_offset_minutes) con } Dictionary Time::get_datetime_dict_from_system(bool p_utc) const { - OS::Date date = OS::get_singleton()->get_date(p_utc); - OS::Time time = OS::get_singleton()->get_time(p_utc); + OS::DateTime dt = OS::get_singleton()->get_datetime(p_utc); Dictionary datetime; - datetime[YEAR_KEY] = date.year; - datetime[MONTH_KEY] = (uint8_t)date.month; - datetime[DAY_KEY] = date.day; - datetime[WEEKDAY_KEY] = (uint8_t)date.weekday; - datetime[DST_KEY] = date.dst; - datetime[HOUR_KEY] = time.hour; - datetime[MINUTE_KEY] = time.minute; - datetime[SECOND_KEY] = time.second; + datetime[YEAR_KEY] = dt.year; + datetime[MONTH_KEY] = (uint8_t)dt.month; + datetime[DAY_KEY] = dt.day; + datetime[WEEKDAY_KEY] = (uint8_t)dt.weekday; + datetime[HOUR_KEY] = dt.hour; + datetime[MINUTE_KEY] = dt.minute; + datetime[SECOND_KEY] = dt.second; + datetime[DST_KEY] = dt.dst; return datetime; } Dictionary Time::get_date_dict_from_system(bool p_utc) const { - OS::Date date = OS::get_singleton()->get_date(p_utc); + OS::DateTime dt = OS::get_singleton()->get_datetime(p_utc); Dictionary date_dictionary; - date_dictionary[YEAR_KEY] = date.year; - date_dictionary[MONTH_KEY] = (uint8_t)date.month; - date_dictionary[DAY_KEY] = date.day; - date_dictionary[WEEKDAY_KEY] = (uint8_t)date.weekday; - date_dictionary[DST_KEY] = date.dst; + date_dictionary[YEAR_KEY] = dt.year; + date_dictionary[MONTH_KEY] = (uint8_t)dt.month; + date_dictionary[DAY_KEY] = dt.day; + date_dictionary[WEEKDAY_KEY] = (uint8_t)dt.weekday; return date_dictionary; } Dictionary Time::get_time_dict_from_system(bool p_utc) const { - OS::Time time = OS::get_singleton()->get_time(p_utc); + OS::DateTime dt = OS::get_singleton()->get_datetime(p_utc); Dictionary time_dictionary; - time_dictionary[HOUR_KEY] = time.hour; - time_dictionary[MINUTE_KEY] = time.minute; - time_dictionary[SECOND_KEY] = time.second; + time_dictionary[HOUR_KEY] = dt.hour; + time_dictionary[MINUTE_KEY] = dt.minute; + time_dictionary[SECOND_KEY] = dt.second; return time_dictionary; } String Time::get_datetime_string_from_system(bool p_utc, bool p_use_space) const { - OS::Date date = OS::get_singleton()->get_date(p_utc); - OS::Time time = OS::get_singleton()->get_time(p_utc); + OS::DateTime dt = OS::get_singleton()->get_datetime(p_utc); // vformat only supports up to 6 arguments, so we need to split this up into 2 parts. - String timestamp = vformat("%04d-%02d-%02d", date.year, (uint8_t)date.month, date.day); + String timestamp = vformat("%04d-%02d-%02d", dt.year, (uint8_t)dt.month, dt.day); if (p_use_space) { - timestamp = vformat("%s %02d:%02d:%02d", timestamp, time.hour, time.minute, time.second); + timestamp = vformat("%s %02d:%02d:%02d", timestamp, dt.hour, dt.minute, dt.second); } else { - timestamp = vformat("%sT%02d:%02d:%02d", timestamp, time.hour, time.minute, time.second); + timestamp = vformat("%sT%02d:%02d:%02d", timestamp, dt.hour, dt.minute, dt.second); } return timestamp; } String Time::get_date_string_from_system(bool p_utc) const { - OS::Date date = OS::get_singleton()->get_date(p_utc); + OS::DateTime dt = OS::get_singleton()->get_datetime(p_utc); // Android is picky about the types passed to make Variant, so we need a cast. - return vformat("%04d-%02d-%02d", date.year, (uint8_t)date.month, date.day); + return vformat("%04d-%02d-%02d", dt.year, (uint8_t)dt.month, dt.day); } String Time::get_time_string_from_system(bool p_utc) const { - OS::Time time = OS::get_singleton()->get_time(p_utc); - return vformat("%02d:%02d:%02d", time.hour, time.minute, time.second); + OS::DateTime dt = OS::get_singleton()->get_datetime(p_utc); + return vformat("%02d:%02d:%02d", dt.hour, dt.minute, dt.second); } Dictionary Time::get_time_zone_from_system() const { diff --git a/core/register_core_types.cpp b/core/register_core_types.cpp index 6650d9be23..2e144a4c9a 100644 --- a/core/register_core_types.cpp +++ b/core/register_core_types.cpp @@ -44,6 +44,7 @@ #include "core/input/input_map.h" #include "core/input/shortcut.h" #include "core/io/config_file.h" +#include "core/io/dir_access.h" #include "core/io/dtls_server.h" #include "core/io/http_client.h" #include "core/io/image_loader.h" @@ -58,6 +59,7 @@ #include "core/io/resource_format_binary.h" #include "core/io/resource_importer.h" #include "core/io/resource_uid.h" +#include "core/io/stream_peer_gzip.h" #include "core/io/stream_peer_tls.h" #include "core/io/tcp_server.h" #include "core/io/translation_loader_po.h" @@ -87,6 +89,8 @@ static Ref<TranslationLoaderPO> resource_format_po; static Ref<ResourceFormatSaverCrypto> resource_format_saver_crypto; static Ref<ResourceFormatLoaderCrypto> resource_format_loader_crypto; static Ref<NativeExtensionResourceLoader> resource_loader_native_extension; +static Ref<ResourceFormatSaverJSON> resource_saver_json; +static Ref<ResourceFormatLoaderJSON> resource_loader_json; static core_bind::ResourceLoader *_resource_loader = nullptr; static core_bind::ResourceSaver *_resource_saver = nullptr; @@ -182,6 +186,7 @@ void register_core_types() { GDREGISTER_ABSTRACT_CLASS(StreamPeer); GDREGISTER_CLASS(StreamPeerExtension); GDREGISTER_CLASS(StreamPeerBuffer); + GDREGISTER_CLASS(StreamPeerGZIP); GDREGISTER_CLASS(StreamPeerTCP); GDREGISTER_CLASS(TCPServer); @@ -211,6 +216,12 @@ void register_core_types() { resource_format_loader_crypto.instantiate(); ResourceLoader::add_resource_format_loader(resource_format_loader_crypto); + resource_loader_json.instantiate(); + ResourceLoader::add_resource_format_loader(resource_loader_json); + + resource_saver_json.instantiate(); + ResourceSaver::add_resource_format_saver(resource_saver_json); + GDREGISTER_CLASS(MainLoop); GDREGISTER_CLASS(Translation); GDREGISTER_CLASS(OptimizedTranslation); @@ -220,8 +231,8 @@ void register_core_types() { GDREGISTER_CLASS(ResourceFormatLoader); GDREGISTER_CLASS(ResourceFormatSaver); - GDREGISTER_CLASS(core_bind::File); - GDREGISTER_CLASS(core_bind::Directory); + GDREGISTER_ABSTRACT_CLASS(FileAccess); + GDREGISTER_ABSTRACT_CLASS(DirAccess); GDREGISTER_CLASS(core_bind::Thread); GDREGISTER_CLASS(core_bind::Mutex); GDREGISTER_CLASS(core_bind::Semaphore); @@ -241,6 +252,8 @@ void register_core_types() { GDREGISTER_CLASS(EncodedObjectAsID); GDREGISTER_CLASS(RandomNumberGenerator); + GDREGISTER_ABSTRACT_CLASS(ImageFormatLoader); + GDREGISTER_CLASS(ImageFormatLoaderExtension); GDREGISTER_ABSTRACT_CLASS(ResourceImporter); GDREGISTER_CLASS(NativeExtension); @@ -387,6 +400,12 @@ void unregister_core_types() { ResourceLoader::remove_resource_format_loader(resource_format_loader_crypto); resource_format_loader_crypto.unref(); + ResourceSaver::remove_resource_format_saver(resource_saver_json); + resource_saver_json.unref(); + + ResourceLoader::remove_resource_format_loader(resource_loader_json); + resource_loader_json.unref(); + if (ip) { memdelete(ip); } diff --git a/core/string/locales.h b/core/string/locales.h index 32d6608ec2..0ccb17a436 100644 --- a/core/string/locales.h +++ b/core/string/locales.h @@ -1072,6 +1072,7 @@ static const char *script_list[][2] = { { "Jurchen", "Jurc" }, { "Kayah Li", "Kali" }, { "Katakana", "Kana" }, + { "Kawi", "Kawi" }, { "Kharoshthi", "Khar" }, { "Khmer", "Khmr" }, { "Khojki", "Khoj" }, @@ -1110,6 +1111,7 @@ static const char *script_list[][2] = { { "Meitei Mayek", "Mtei" }, { "Multani", "Mult" }, { "Myanmar (Burmese)", "Mymr" }, + { "​Nag Mundari", "Nagm" }, { "Nandinagari", "Nand" }, { "Old North Arabian", "Narb" }, { "Nabataean", "Nbat" }, diff --git a/core/string/ustring.cpp b/core/string/ustring.cpp index d8b93998af..6218c21cde 100644 --- a/core/string/ustring.cpp +++ b/core/string/ustring.cpp @@ -2624,10 +2624,11 @@ double String::to_float() const { uint32_t String::hash(const char *p_cstr) { uint32_t hashv = 5381; - uint32_t c; + uint32_t c = *p_cstr++; - while ((c = *p_cstr++)) { + while (c) { hashv = ((hashv << 5) + hashv) + c; /* hash * 33 + c */ + c = *p_cstr++; } return hashv; @@ -2653,10 +2654,11 @@ uint32_t String::hash(const wchar_t *p_cstr, int p_len) { uint32_t String::hash(const wchar_t *p_cstr) { uint32_t hashv = 5381; - uint32_t c; + uint32_t c = *p_cstr++; - while ((c = *p_cstr++)) { + while (c) { hashv = ((hashv << 5) + hashv) + c; /* hash * 33 + c */ + c = *p_cstr++; } return hashv; @@ -2673,10 +2675,11 @@ uint32_t String::hash(const char32_t *p_cstr, int p_len) { uint32_t String::hash(const char32_t *p_cstr) { uint32_t hashv = 5381; - uint32_t c; + uint32_t c = *p_cstr++; - while ((c = *p_cstr++)) { + while (c) { hashv = ((hashv << 5) + hashv) + c; /* hash * 33 + c */ + c = *p_cstr++; } return hashv; @@ -2687,10 +2690,11 @@ uint32_t String::hash() const { const char32_t *chr = get_data(); uint32_t hashv = 5381; - uint32_t c; + uint32_t c = *chr++; - while ((c = *chr++)) { + while (c) { hashv = ((hashv << 5) + hashv) + c; /* hash * 33 + c */ + c = *chr++; } return hashv; @@ -2701,10 +2705,11 @@ uint64_t String::hash64() const { const char32_t *chr = get_data(); uint64_t hashv = 5381; - uint64_t c; + uint64_t c = *chr++; - while ((c = *chr++)) { + while (c) { hashv = ((hashv << 5) + hashv) + c; /* hash * 33 + c */ + c = *chr++; } return hashv; @@ -4646,15 +4651,18 @@ String String::sprintf(const Array &values, bool *error) const { double value = values[value_index]; bool is_negative = (value < 0); String str = String::num(ABS(value), min_decimals); + bool not_numeric = isinf(value) || isnan(value); // Pad decimals out. - str = str.pad_decimals(min_decimals); + if (!not_numeric) { + str = str.pad_decimals(min_decimals); + } int initial_len = str.length(); // Padding. Leave room for sign later if required. int pad_chars_count = (is_negative || show_sign) ? min_chars - 1 : min_chars; - String pad_char = pad_with_zeros ? String("0") : String(" "); + String pad_char = (pad_with_zeros && !not_numeric) ? String("0") : String(" "); // Never pad NaN or inf with zeros if (left_justified) { str = str.rpad(pad_chars_count, pad_char); } else { @@ -4704,14 +4712,19 @@ String String::sprintf(const Array &values, bool *error) const { String str = "("; for (int i = 0; i < count; i++) { double val = vec[i]; + String number_str = String::num(ABS(val), min_decimals); + bool not_numeric = isinf(val) || isnan(val); + // Pad decimals out. - String number_str = String::num(ABS(val), min_decimals).pad_decimals(min_decimals); + if (!not_numeric) { + number_str = number_str.pad_decimals(min_decimals); + } int initial_len = number_str.length(); // Padding. Leave room for sign later if required. int pad_chars_count = val < 0 ? min_chars - 1 : min_chars; - String pad_char = pad_with_zeros ? String("0") : String(" "); + String pad_char = (pad_with_zeros && !not_numeric) ? String("0") : String(" "); // Never pad NaN or inf with zeros if (left_justified) { number_str = number_str.rpad(pad_chars_count, pad_char); } else { diff --git a/core/string/ustring.h b/core/string/ustring.h index b8ae3c2392..4b6568a502 100644 --- a/core/string/ustring.h +++ b/core/string/ustring.h @@ -28,11 +28,11 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -// Note: _GODOT suffix added to avoid conflict with ICU header with the same guard. - #ifndef USTRING_GODOT_H #define USTRING_GODOT_H +// Note: _GODOT suffix added to header guard to avoid conflict with ICU header. + #include "core/string/char_utils.h" #include "core/templates/cowdata.h" #include "core/templates/vector.h" diff --git a/core/templates/cowdata.h b/core/templates/cowdata.h index f98b2308c9..1482e3eef1 100644 --- a/core/templates/cowdata.h +++ b/core/templates/cowdata.h @@ -46,9 +46,7 @@ class CharString; template <class T, class V> class VMap; -#if !defined(NO_THREADS) SAFE_NUMERIC_TYPE_PUN_GUARANTEES(uint32_t) -#endif // Silence a false positive warning (see GH-52119). #if defined(__GNUC__) && !defined(__clang__) diff --git a/core/templates/hashfuncs.h b/core/templates/hashfuncs.h index d85cdf7adc..456a7b01ed 100644 --- a/core/templates/hashfuncs.h +++ b/core/templates/hashfuncs.h @@ -61,10 +61,11 @@ static _FORCE_INLINE_ uint32_t hash_djb2(const char *p_cstr) { const unsigned char *chr = (const unsigned char *)p_cstr; uint32_t hash = 5381; - uint32_t c; + uint32_t c = *chr++; - while ((c = *chr++)) { + while (c) { hash = ((hash << 5) + hash) ^ c; /* hash * 33 ^ c */ + c = *chr++; } return hash; diff --git a/core/templates/local_vector.h b/core/templates/local_vector.h index 49690f2373..dc93acc8ab 100644 --- a/core/templates/local_vector.h +++ b/core/templates/local_vector.h @@ -68,7 +68,7 @@ public: CRASH_COND_MSG(!data, "Out of memory"); } - if (!std::is_trivially_constructible<T>::value && !force_trivial) { + if constexpr (!std::is_trivially_constructible<T>::value && !force_trivial) { memnew_placement(&data[count++], T(p_elem)); } else { data[count++] = p_elem; @@ -81,7 +81,7 @@ public: for (U i = p_index; i < count; i++) { data[i] = data[i + 1]; } - if (!std::is_trivially_destructible<T>::value && !force_trivial) { + if constexpr (!std::is_trivially_destructible<T>::value && !force_trivial) { data[count].~T(); } } @@ -94,7 +94,7 @@ public: if (count > p_index) { data[p_index] = data[count]; } - if (!std::is_trivially_destructible<T>::value && !force_trivial) { + if constexpr (!std::is_trivially_destructible<T>::value && !force_trivial) { data[count].~T(); } } @@ -135,7 +135,7 @@ public: _FORCE_INLINE_ U size() const { return count; } void resize(U p_size) { if (p_size < count) { - if (!std::is_trivially_destructible<T>::value && !force_trivial) { + if constexpr (!std::is_trivially_destructible<T>::value && !force_trivial) { for (U i = p_size; i < count; i++) { data[i].~T(); } @@ -152,7 +152,7 @@ public: data = (T *)memrealloc(data, capacity * sizeof(T)); CRASH_COND_MSG(!data, "Out of memory"); } - if (!std::is_trivially_constructible<T>::value && !force_trivial) { + if constexpr (!std::is_trivially_constructible<T>::value && !force_trivial) { for (U i = count; i < p_size; i++) { memnew_placement(&data[i], T); } diff --git a/core/templates/paged_array.h b/core/templates/paged_array.h index f1ede556e6..2992dd463e 100644 --- a/core/templates/paged_array.h +++ b/core/templates/paged_array.h @@ -268,7 +268,7 @@ public: uint32_t remainder = count & page_size_mask; T *remainder_page = nullptr; - uint32_t remainder_page_id; + uint32_t remainder_page_id = 0; if (remainder > 0) { uint32_t last_page = _get_pages_in_use() - 1; diff --git a/core/templates/pooled_list.h b/core/templates/pooled_list.h index f13156b292..2b67da87ba 100644 --- a/core/templates/pooled_list.h +++ b/core/templates/pooled_list.h @@ -28,7 +28,8 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#pragma once +#ifndef POOLED_LIST_H +#define POOLED_LIST_H // Simple template to provide a pool with O(1) allocate and free. // The freelist could alternatively be a linked list placed within the unused elements @@ -111,7 +112,7 @@ public: list.resize(r_id + 1); static_assert((!zero_on_first_request) || (__is_pod(T)), "zero_on_first_request requires trivial type"); - if (zero_on_first_request && __is_pod(T)) { + if constexpr (zero_on_first_request && __is_pod(T)) { list[r_id] = {}; } @@ -206,3 +207,5 @@ private: LocalVector<U, U> _active_map; LocalVector<U, U> _active_list; }; + +#endif // POOLED_LIST_H diff --git a/core/templates/rid_owner.h b/core/templates/rid_owner.h index 320faebe98..a83ffa575f 100644 --- a/core/templates/rid_owner.h +++ b/core/templates/rid_owner.h @@ -335,15 +335,8 @@ public: ~RID_Alloc() { if (alloc_count) { - if (description) { - print_error("ERROR: " + itos(alloc_count) + " RID allocations of type '" + description + "' were leaked at exit."); - } else { -#ifdef NO_SAFE_CAST - print_error("ERROR: " + itos(alloc_count) + " RID allocations of type 'unknown' were leaked at exit."); -#else - print_error("ERROR: " + itos(alloc_count) + " RID allocations of type '" + typeid(T).name() + "' were leaked at exit."); -#endif - } + print_error(vformat("ERROR: %d RID allocations of type '%s' were leaked at exit.", + alloc_count, description ? description : typeid(T).name())); for (size_t i = 0; i < max_alloc; i++) { uint64_t validator = validator_chunks[i / elements_in_chunk][i % elements_in_chunk]; diff --git a/core/templates/safe_list.h b/core/templates/safe_list.h index e850f3bd5e..95e8ca1a14 100644 --- a/core/templates/safe_list.h +++ b/core/templates/safe_list.h @@ -33,11 +33,9 @@ #include "core/os/memory.h" #include "core/typedefs.h" -#include <functional> - -#if !defined(NO_THREADS) #include <atomic> +#include <functional> #include <type_traits> // Design goals for these classes: @@ -239,159 +237,4 @@ public: } }; -#else // NO_THREADS - -// Effectively the same structure without the atomics. It's probably possible to simplify it but the semantics shouldn't differ greatly. -template <class T, class A = DefaultAllocator> -class SafeList { - struct SafeListNode { - SafeListNode *next = nullptr; - - // If the node is logically deleted, this pointer will typically point to the previous list item in time that was also logically deleted. - SafeListNode *graveyard_next = nullptr; - - std::function<void(T)> deletion_fn = [](T t) { return; }; - - T val; - }; - - SafeListNode *head = nullptr; - SafeListNode *graveyard_head = nullptr; - - unsigned int active_iterator_count = 0; - -public: - class Iterator { - friend class SafeList; - - SafeListNode *cursor = nullptr; - SafeList *list = nullptr; - - public: - Iterator(SafeListNode *p_cursor, SafeList *p_list) : - cursor(p_cursor), list(p_list) { - list->active_iterator_count++; - } - - ~Iterator() { - list->active_iterator_count--; - } - - T &operator*() { - return cursor->val; - } - - Iterator &operator++() { - cursor = cursor->next; - return *this; - } - - // These two operators are mostly useful for comparisons to nullptr. - bool operator==(const void *p_other) const { - return cursor == p_other; - } - - bool operator!=(const void *p_other) const { - return cursor != p_other; - } - - // These two allow easy range-based for loops. - bool operator==(const Iterator &p_other) const { - return cursor == p_other.cursor; - } - - bool operator!=(const Iterator &p_other) const { - return cursor != p_other.cursor; - } - }; - -public: - // Calling this will cause an allocation. - void insert(T p_value) { - SafeListNode *new_node = memnew_allocator(SafeListNode, A); - new_node->val = p_value; - new_node->next = head; - head = new_node; - } - - Iterator find(T p_value) { - for (Iterator it = begin(); it != end(); ++it) { - if (*it == p_value) { - return it; - } - } - return end(); - } - - void erase(T p_value, std::function<void(T)> p_deletion_fn) { - erase(find(p_value), p_deletion_fn); - } - - void erase(T p_value) { - erase(find(p_value), [](T t) { return; }); - } - - void erase(Iterator p_iterator, std::function<void(T)> p_deletion_fn) { - p_iterator.cursor->deletion_fn = p_deletion_fn; - erase(p_iterator); - } - - void erase(Iterator p_iterator) { - Iterator prev = begin(); - for (; prev != end(); ++prev) { - if (prev.cursor && prev.cursor->next == p_iterator.cursor) { - break; - } - } - if (prev == end()) { - // Not in the list, nothing to do. - return; - } - // First, remove the node from the list. - prev.cursor->next = p_iterator.cursor->next; - - // Then queue it for deletion by putting it in the node graveyard. Don't touch `next` because an iterator might still be pointing at this node. - p_iterator.cursor->graveyard_next = graveyard_head; - graveyard_head = p_iterator.cursor; - } - - Iterator begin() { - return Iterator(head, this); - } - - Iterator end() { - return Iterator(nullptr, this); - } - - // Calling this will cause zero to many deallocations. - bool maybe_cleanup() { - SafeListNode *cursor = graveyard_head; - if (active_iterator_count != 0) { - // It's not safe to clean up with an active iterator, because that iterator could be pointing to an element that we want to delete. - return false; - } - graveyard_head = nullptr; - // Our graveyard list is now unreachable by any active iterators, detached from the main graveyard head and ready for deletion. - while (cursor) { - SafeListNode *tmp = cursor; - cursor = cursor->next; - tmp->deletion_fn(tmp->val); - memdelete_allocator<SafeListNode, A>(tmp); - } - return true; - } - - ~SafeList() { -#ifdef DEBUG_ENABLED - if (!maybe_cleanup()) { - ERR_PRINT("There are still iterators around when destructing a SafeList. Memory will be leaked. This is a bug."); - } -#else - maybe_cleanup(); -#endif - } -}; - -#endif - #endif // SAFE_LIST_H diff --git a/core/templates/safe_refcount.h b/core/templates/safe_refcount.h index 1f6551762e..c4ffe5ca02 100644 --- a/core/templates/safe_refcount.h +++ b/core/templates/safe_refcount.h @@ -33,8 +33,6 @@ #include "core/typedefs.h" -#if !defined(NO_THREADS) - #include <atomic> #include <type_traits> @@ -191,141 +189,4 @@ public: } }; -#else - -template <class T> -class SafeNumeric { -protected: - T value; - -public: - _ALWAYS_INLINE_ void set(T p_value) { - value = p_value; - } - - _ALWAYS_INLINE_ T get() const { - return value; - } - - _ALWAYS_INLINE_ T increment() { - return ++value; - } - - _ALWAYS_INLINE_ T postincrement() { - return value++; - } - - _ALWAYS_INLINE_ T decrement() { - return --value; - } - - _ALWAYS_INLINE_ T postdecrement() { - return value--; - } - - _ALWAYS_INLINE_ T add(T p_value) { - return value += p_value; - } - - _ALWAYS_INLINE_ T postadd(T p_value) { - T old = value; - value += p_value; - return old; - } - - _ALWAYS_INLINE_ T sub(T p_value) { - return value -= p_value; - } - - _ALWAYS_INLINE_ T postsub(T p_value) { - T old = value; - value -= p_value; - return old; - } - - _ALWAYS_INLINE_ T exchange_if_greater(T p_value) { - if (value < p_value) { - value = p_value; - } - return value; - } - - _ALWAYS_INLINE_ T conditional_increment() { - if (value == 0) { - return 0; - } else { - return ++value; - } - } - - _ALWAYS_INLINE_ explicit SafeNumeric<T>(T p_value = static_cast<T>(0)) : - value(p_value) { - } -}; - -class SafeFlag { -protected: - bool flag; - -public: - _ALWAYS_INLINE_ bool is_set() const { - return flag; - } - - _ALWAYS_INLINE_ void set() { - flag = true; - } - - _ALWAYS_INLINE_ void clear() { - flag = false; - } - - _ALWAYS_INLINE_ void set_to(bool p_value) { - flag = p_value; - } - - _ALWAYS_INLINE_ explicit SafeFlag(bool p_value = false) : - flag(p_value) {} -}; - -class SafeRefCount { - uint32_t count = 0; - -public: - _ALWAYS_INLINE_ bool ref() { // true on success - if (count != 0) { - ++count; - return true; - } else { - return false; - } - } - - _ALWAYS_INLINE_ uint32_t refval() { // none-zero on success - if (count != 0) { - return ++count; - } else { - return 0; - } - } - - _ALWAYS_INLINE_ bool unref() { // true if must be disposed of - return --count == 0; - } - - _ALWAYS_INLINE_ uint32_t unrefval() { // 0 if must be disposed of - return --count; - } - - _ALWAYS_INLINE_ uint32_t get() const { - return count; - } - - _ALWAYS_INLINE_ void init(uint32_t p_value = 1) { - count = p_value; - } -}; - -#endif - #endif // SAFE_REFCOUNT_H diff --git a/core/variant/array.h b/core/variant/array.h index c007376734..3d9a794969 100644 --- a/core/variant/array.h +++ b/core/variant/array.h @@ -47,7 +47,6 @@ class Array { void _unref() const; protected: - Array(const Array &p_base, uint32_t p_type, const StringName &p_class_name, const Variant &p_script); bool _assign(const Array &p_array); public: @@ -131,6 +130,7 @@ public: void set_read_only(bool p_enable); bool is_read_only() const; + Array(const Array &p_base, uint32_t p_type, const StringName &p_class_name, const Variant &p_script); Array(const Array &p_from); Array(); ~Array(); diff --git a/core/variant/callable.cpp b/core/variant/callable.cpp index 28efb43fc5..b35e2f004b 100644 --- a/core/variant/callable.cpp +++ b/core/variant/callable.cpp @@ -63,6 +63,21 @@ void Callable::callp(const Variant **p_arguments, int p_argcount, Variant &r_ret } } +Variant Callable::callv(const Array &p_arguments) const { + int argcount = p_arguments.size(); + const Variant **argptrs = nullptr; + if (argcount) { + argptrs = (const Variant **)alloca(sizeof(Variant *) * argcount); + for (int i = 0; i < argcount; i++) { + argptrs[i] = &p_arguments[i]; + } + } + CallError ce; + Variant ret; + callp(argptrs, argcount, ret, ce); + return ret; +} + Error Callable::rpcp(int p_id, const Variant **p_arguments, int p_argcount, CallError &r_call_error) const { if (is_null()) { r_call_error.error = CallError::CALL_ERROR_INSTANCE_IS_NULL; diff --git a/core/variant/callable.h b/core/variant/callable.h index 1f1c983eb3..0305dc55c3 100644 --- a/core/variant/callable.h +++ b/core/variant/callable.h @@ -71,6 +71,7 @@ public: void callp(const Variant **p_arguments, int p_argcount, Variant &r_return_value, CallError &r_call_error) const; void call_deferredp(const Variant **p_arguments, int p_argcount) const; + Variant callv(const Array &p_arguments) const; Error rpcp(int p_id, const Variant **p_arguments, int p_argcount, CallError &r_call_error) const; diff --git a/core/variant/type_info.h b/core/variant/type_info.h index 7372c60754..e355053296 100644 --- a/core/variant/type_info.h +++ b/core/variant/type_info.h @@ -276,7 +276,7 @@ inline String enum_qualified_name_to_class_info_name(const String &p_qualified_n template <typename T> inline StringName __constant_get_enum_name(T param, const String &p_constant) { - if (GetTypeInfo<T>::VARIANT_TYPE == Variant::NIL) { + if constexpr (GetTypeInfo<T>::VARIANT_TYPE == Variant::NIL) { ERR_PRINT("Missing VARIANT_ENUM_CAST for constant's enum: " + p_constant); } return GetTypeInfo<T>::get_class_info().class_name; @@ -284,14 +284,14 @@ inline StringName __constant_get_enum_name(T param, const String &p_constant) { template <class T> class BitField { - uint32_t value = 0; + int64_t value = 0; public: _FORCE_INLINE_ void set_flag(T p_flag) { value |= p_flag; } _FORCE_INLINE_ bool has_flag(T p_flag) const { return value & p_flag; } _FORCE_INLINE_ void clear_flag(T p_flag) { return value &= ~p_flag; } - _FORCE_INLINE_ BitField(uint32_t p_value) { value = p_value; } - _FORCE_INLINE_ operator uint32_t() const { return value; } + _FORCE_INLINE_ BitField(int64_t p_value) { value = p_value; } + _FORCE_INLINE_ operator int64_t() const { return value; } _FORCE_INLINE_ operator Variant() const { return value; } }; diff --git a/core/variant/variant.cpp b/core/variant/variant.cpp index b280fc9fe3..f24ffeb1a9 100644 --- a/core/variant/variant.cpp +++ b/core/variant/variant.cpp @@ -3727,36 +3727,6 @@ String Variant::get_callable_error_text(const Callable &p_callable, const Varian return get_call_error_text(p_callable.get_object(), p_callable.get_method(), p_argptrs, p_argcount, ce); } -String vformat(const String &p_text, const Variant &p1, const Variant &p2, const Variant &p3, const Variant &p4, const Variant &p5) { - Array args; - if (p1.get_type() != Variant::NIL) { - args.push_back(p1); - - if (p2.get_type() != Variant::NIL) { - args.push_back(p2); - - if (p3.get_type() != Variant::NIL) { - args.push_back(p3); - - if (p4.get_type() != Variant::NIL) { - args.push_back(p4); - - if (p5.get_type() != Variant::NIL) { - args.push_back(p5); - } - } - } - } - } - - bool error = false; - String fmt = p_text.sprintf(args, &error); - - ERR_FAIL_COND_V_MSG(error, String(), fmt); - - return fmt; -} - void Variant::register_types() { _register_variant_operators(); _register_variant_methods(); diff --git a/core/variant/variant.h b/core/variant/variant.h index 212f94a9a8..b0738e7d44 100644 --- a/core/variant/variant.h +++ b/core/variant/variant.h @@ -552,9 +552,6 @@ public: void zero(); Variant duplicate(bool p_deep = false) const; Variant recursive_duplicate(bool p_deep, int recursion_count) const; - static void blend(const Variant &a, const Variant &b, float c, Variant &r_dst); - static void interpolate(const Variant &a, const Variant &b, float c, Variant &r_dst); - static void sub(const Variant &a, const Variant &b, Variant &r_dst); /* Built-In Methods */ @@ -807,7 +804,22 @@ const Variant::ObjData &Variant::_get_obj() const { return *reinterpret_cast<const ObjData *>(&_data._mem[0]); } -String vformat(const String &p_text, const Variant &p1 = Variant(), const Variant &p2 = Variant(), const Variant &p3 = Variant(), const Variant &p4 = Variant(), const Variant &p5 = Variant()); +template <typename... VarArgs> +String vformat(const String &p_text, const VarArgs... p_args) { + Variant args[sizeof...(p_args) + 1] = { p_args..., Variant() }; // +1 makes sure zero sized arrays are also supported. + Array args_array; + args_array.resize(sizeof...(p_args)); + for (uint32_t i = 0; i < sizeof...(p_args); i++) { + args_array[i] = args[i]; + } + + bool error = false; + String fmt = p_text.sprintf(args_array, &error); + + ERR_FAIL_COND_V_MSG(error, String(), fmt); + + return fmt; +} template <typename... VarArgs> Callable Callable::bind(VarArgs... p_args) { diff --git a/core/variant/variant_call.cpp b/core/variant/variant_call.cpp index f09885b325..1831f7b72a 100644 --- a/core/variant/variant_call.cpp +++ b/core/variant/variant_call.cpp @@ -1859,6 +1859,7 @@ static void _register_variant_builtin_methods() { /* Callable */ + bind_method(Callable, callv, sarray("arguments"), varray()); bind_method(Callable, is_null, sarray(), varray()); bind_method(Callable, is_custom, sarray(), varray()); bind_method(Callable, is_standard, sarray(), varray()); @@ -2065,6 +2066,14 @@ static void _register_variant_builtin_methods() { bind_method(Array, all, sarray("method"), varray()); bind_method(Array, max, sarray(), varray()); bind_method(Array, min, sarray(), varray()); + bind_method(Array, typed_assign, sarray("array"), varray()); + bind_method(Array, set_typed, sarray("type", "class_name", "script"), varray()); + bind_method(Array, is_typed, sarray(), varray()); + bind_method(Array, get_typed_builtin, sarray(), varray()); + bind_method(Array, get_typed_class_name, sarray(), varray()); + bind_method(Array, get_typed_script, sarray(), varray()); + bind_method(Array, set_read_only, sarray("enable"), varray()); + bind_method(Array, is_read_only, sarray(), varray()); /* Byte Array */ bind_method(PackedByteArray, size, sarray(), varray()); diff --git a/core/variant/variant_construct.cpp b/core/variant/variant_construct.cpp index d048f45737..3b88dc11ca 100644 --- a/core/variant/variant_construct.cpp +++ b/core/variant/variant_construct.cpp @@ -200,6 +200,7 @@ void Variant::_register_variant_constructors() { add_constructor<VariantConstructNoArgs<Array>>(sarray()); add_constructor<VariantConstructor<Array, Array>>(sarray("from")); + add_constructor<VariantConstructorTypedArray>(sarray("base", "type", "class_name", "script")); add_constructor<VariantConstructorToArray<PackedByteArray>>(sarray("from")); add_constructor<VariantConstructorToArray<PackedInt32Array>>(sarray("from")); add_constructor<VariantConstructorToArray<PackedInt64Array>>(sarray("from")); diff --git a/core/variant/variant_construct.h b/core/variant/variant_construct.h index 58a0f34c1e..34d228f4d2 100644 --- a/core/variant/variant_construct.h +++ b/core/variant/variant_construct.h @@ -336,6 +336,82 @@ public: } }; +class VariantConstructorTypedArray { +public: + static void construct(Variant &r_ret, const Variant **p_args, Callable::CallError &r_error) { + if (p_args[0]->get_type() != Variant::ARRAY) { + r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT; + r_error.argument = 0; + r_error.expected = Variant::ARRAY; + return; + } + + if (p_args[1]->get_type() != Variant::INT) { + r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT; + r_error.argument = 1; + r_error.expected = Variant::INT; + return; + } + + if (p_args[2]->get_type() != Variant::STRING_NAME) { + r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT; + r_error.argument = 2; + r_error.expected = Variant::STRING_NAME; + return; + } + + const Array &base_arr = *VariantGetInternalPtr<Array>::get_ptr(p_args[0]); + const uint32_t type = p_args[1]->operator uint32_t(); + const StringName &class_name = *VariantGetInternalPtr<StringName>::get_ptr(p_args[2]); + r_ret = Array(base_arr, type, class_name, *p_args[3]); + } + + static inline void validated_construct(Variant *r_ret, const Variant **p_args) { + const Array &base_arr = *VariantGetInternalPtr<Array>::get_ptr(p_args[0]); + const uint32_t type = p_args[1]->operator uint32_t(); + const StringName &class_name = *VariantGetInternalPtr<StringName>::get_ptr(p_args[2]); + *r_ret = Array(base_arr, type, class_name, *p_args[3]); + } + + static void ptr_construct(void *base, const void **p_args) { + const Array &base_arr = PtrToArg<Array>::convert(p_args[0]); + const uint32_t type = PtrToArg<uint32_t>::convert(p_args[1]); + const StringName &class_name = PtrToArg<StringName>::convert(p_args[2]); + const Variant &script = PtrToArg<Variant>::convert(p_args[3]); + Array dst_arr = Array(base_arr, type, class_name, script); + + PtrConstruct<Array>::construct(dst_arr, base); + } + + static int get_argument_count() { + return 4; + } + + static Variant::Type get_argument_type(int p_arg) { + switch (p_arg) { + case 0: { + return Variant::ARRAY; + } break; + case 1: { + return Variant::INT; + } break; + case 2: { + return Variant::STRING_NAME; + } break; + case 3: { + return Variant::NIL; + } break; + default: { + return Variant::NIL; + } break; + } + } + + static Variant::Type get_base_type() { + return Variant::ARRAY; + } +}; + template <class T> class VariantConstructorToArray { public: diff --git a/core/variant/variant_setget.cpp b/core/variant/variant_setget.cpp index 57b953f7f0..ff67b187ef 100644 --- a/core/variant/variant_setget.cpp +++ b/core/variant/variant_setget.cpp @@ -1911,572 +1911,6 @@ Variant Variant::recursive_duplicate(bool p_deep, int recursion_count) const { } } -void Variant::sub(const Variant &a, const Variant &b, Variant &r_dst) { - if (a.type != b.type) { - return; - } - - switch (a.type) { - case NIL: { - r_dst = Variant(); - } - return; - case INT: { - int64_t va = a._data._int; - int64_t vb = b._data._int; - r_dst = int(va - vb); - } - return; - case FLOAT: { - double ra = a._data._float; - double rb = b._data._float; - r_dst = ra - rb; - } - return; - case VECTOR2: { - r_dst = *reinterpret_cast<const Vector2 *>(a._data._mem) - *reinterpret_cast<const Vector2 *>(b._data._mem); - } - return; - case VECTOR2I: { - int32_t vax = reinterpret_cast<const Vector2i *>(a._data._mem)->x; - int32_t vbx = reinterpret_cast<const Vector2i *>(b._data._mem)->x; - int32_t vay = reinterpret_cast<const Vector2i *>(a._data._mem)->y; - int32_t vby = reinterpret_cast<const Vector2i *>(b._data._mem)->y; - r_dst = Vector2i(int32_t(vax - vbx), int32_t(vay - vby)); - } - return; - case RECT2: { - const Rect2 *ra = reinterpret_cast<const Rect2 *>(a._data._mem); - const Rect2 *rb = reinterpret_cast<const Rect2 *>(b._data._mem); - r_dst = Rect2(ra->position - rb->position, ra->size - rb->size); - } - return; - case RECT2I: { - const Rect2i *ra = reinterpret_cast<const Rect2i *>(a._data._mem); - const Rect2i *rb = reinterpret_cast<const Rect2i *>(b._data._mem); - - int32_t vax = ra->position.x; - int32_t vay = ra->position.y; - int32_t vbx = ra->size.x; - int32_t vby = ra->size.y; - int32_t vcx = rb->position.x; - int32_t vcy = rb->position.y; - int32_t vdx = rb->size.x; - int32_t vdy = rb->size.y; - - r_dst = Rect2i(int32_t(vax - vbx), int32_t(vay - vby), int32_t(vcx - vdx), int32_t(vcy - vdy)); - } - return; - case VECTOR3: { - r_dst = *reinterpret_cast<const Vector3 *>(a._data._mem) - *reinterpret_cast<const Vector3 *>(b._data._mem); - } - return; - case VECTOR3I: { - int32_t vax = reinterpret_cast<const Vector3i *>(a._data._mem)->x; - int32_t vbx = reinterpret_cast<const Vector3i *>(b._data._mem)->x; - int32_t vay = reinterpret_cast<const Vector3i *>(a._data._mem)->y; - int32_t vby = reinterpret_cast<const Vector3i *>(b._data._mem)->y; - int32_t vaz = reinterpret_cast<const Vector3i *>(a._data._mem)->z; - int32_t vbz = reinterpret_cast<const Vector3i *>(b._data._mem)->z; - r_dst = Vector3i(int32_t(vax - vbx), int32_t(vay - vby), int32_t(vaz - vbz)); - } - return; - case AABB: { - const ::AABB *ra = reinterpret_cast<const ::AABB *>(a._data._mem); - const ::AABB *rb = reinterpret_cast<const ::AABB *>(b._data._mem); - r_dst = ::AABB(ra->position - rb->position, ra->size - rb->size); - } - return; - case QUATERNION: { - Quaternion empty_rot; - const Quaternion *qa = reinterpret_cast<const Quaternion *>(a._data._mem); - const Quaternion *qb = reinterpret_cast<const Quaternion *>(b._data._mem); - r_dst = (*qb).inverse() * *qa; - } - return; - case COLOR: { - const Color *ca = reinterpret_cast<const Color *>(a._data._mem); - const Color *cb = reinterpret_cast<const Color *>(b._data._mem); - float new_r = ca->r - cb->r; - float new_g = ca->g - cb->g; - float new_b = ca->b - cb->b; - float new_a = ca->a - cb->a; - new_r = new_r > 1.0 ? 1.0 : new_r; - new_g = new_g > 1.0 ? 1.0 : new_g; - new_b = new_b > 1.0 ? 1.0 : new_b; - new_a = new_a > 1.0 ? 1.0 : new_a; - r_dst = Color(new_r, new_g, new_b, new_a); - } - return; - default: { - r_dst = a; - } - return; - } -} - -void Variant::blend(const Variant &a, const Variant &b, float c, Variant &r_dst) { - if (a.type != b.type) { - if (a.is_num() && b.is_num()) { - real_t va = a; - real_t vb = b; - r_dst = va + vb * c; - } else { - r_dst = a; - } - return; - } - - switch (a.type) { - case NIL: { - r_dst = Variant(); - } - return; - case INT: { - int64_t va = a._data._int; - int64_t vb = b._data._int; - r_dst = int(va + vb * c + 0.5); - } - return; - case FLOAT: { - double ra = a._data._float; - double rb = b._data._float; - r_dst = ra + rb * c; - } - return; - case VECTOR2: { - r_dst = *reinterpret_cast<const Vector2 *>(a._data._mem) + *reinterpret_cast<const Vector2 *>(b._data._mem) * c; - } - return; - case VECTOR2I: { - int32_t vax = reinterpret_cast<const Vector2i *>(a._data._mem)->x; - int32_t vbx = reinterpret_cast<const Vector2i *>(b._data._mem)->x; - int32_t vay = reinterpret_cast<const Vector2i *>(a._data._mem)->y; - int32_t vby = reinterpret_cast<const Vector2i *>(b._data._mem)->y; - r_dst = Vector2i(int32_t(vax + vbx * c + 0.5), int32_t(vay + vby * c + 0.5)); - } - return; - case RECT2: { - const Rect2 *ra = reinterpret_cast<const Rect2 *>(a._data._mem); - const Rect2 *rb = reinterpret_cast<const Rect2 *>(b._data._mem); - r_dst = Rect2(ra->position + rb->position * c, ra->size + rb->size * c); - } - return; - case RECT2I: { - const Rect2i *ra = reinterpret_cast<const Rect2i *>(a._data._mem); - const Rect2i *rb = reinterpret_cast<const Rect2i *>(b._data._mem); - - int32_t vax = ra->position.x; - int32_t vay = ra->position.y; - int32_t vbx = ra->size.x; - int32_t vby = ra->size.y; - int32_t vcx = rb->position.x; - int32_t vcy = rb->position.y; - int32_t vdx = rb->size.x; - int32_t vdy = rb->size.y; - - r_dst = Rect2i(int32_t(vax + vbx * c + 0.5), int32_t(vay + vby * c + 0.5), int32_t(vcx + vdx * c + 0.5), int32_t(vcy + vdy * c + 0.5)); - } - return; - case VECTOR3: { - r_dst = *reinterpret_cast<const Vector3 *>(a._data._mem) + *reinterpret_cast<const Vector3 *>(b._data._mem) * c; - } - return; - case VECTOR3I: { - int32_t vax = reinterpret_cast<const Vector3i *>(a._data._mem)->x; - int32_t vbx = reinterpret_cast<const Vector3i *>(b._data._mem)->x; - int32_t vay = reinterpret_cast<const Vector3i *>(a._data._mem)->y; - int32_t vby = reinterpret_cast<const Vector3i *>(b._data._mem)->y; - int32_t vaz = reinterpret_cast<const Vector3i *>(a._data._mem)->z; - int32_t vbz = reinterpret_cast<const Vector3i *>(b._data._mem)->z; - r_dst = Vector3i(int32_t(vax + vbx * c + 0.5), int32_t(vay + vby * c + 0.5), int32_t(vaz + vbz * c + 0.5)); - } - return; - case AABB: { - const ::AABB *ra = reinterpret_cast<const ::AABB *>(a._data._mem); - const ::AABB *rb = reinterpret_cast<const ::AABB *>(b._data._mem); - r_dst = ::AABB(ra->position + rb->position * c, ra->size + rb->size * c); - } - return; - case QUATERNION: { - Quaternion empty_rot; - const Quaternion *qa = reinterpret_cast<const Quaternion *>(a._data._mem); - const Quaternion *qb = reinterpret_cast<const Quaternion *>(b._data._mem); - r_dst = *qa * empty_rot.slerp(*qb, c); - } - return; - case COLOR: { - const Color *ca = reinterpret_cast<const Color *>(a._data._mem); - const Color *cb = reinterpret_cast<const Color *>(b._data._mem); - float new_r = ca->r + cb->r * c; - float new_g = ca->g + cb->g * c; - float new_b = ca->b + cb->b * c; - float new_a = ca->a + cb->a * c; - new_r = new_r > 1.0 ? 1.0 : new_r; - new_g = new_g > 1.0 ? 1.0 : new_g; - new_b = new_b > 1.0 ? 1.0 : new_b; - new_a = new_a > 1.0 ? 1.0 : new_a; - r_dst = Color(new_r, new_g, new_b, new_a); - } - return; - default: { - r_dst = c < 0.5 ? a : b; - } - return; - } -} - -void Variant::interpolate(const Variant &a, const Variant &b, float c, Variant &r_dst) { - if (a.type != b.type) { - if (a.is_num() && b.is_num()) { - //not as efficient but.. - real_t va = a; - real_t vb = b; - r_dst = va + (vb - va) * c; - - } else { - r_dst = a; - } - return; - } - - switch (a.type) { - case NIL: { - r_dst = Variant(); - } - return; - case BOOL: { - r_dst = a; - } - return; - case INT: { - int64_t va = a._data._int; - int64_t vb = b._data._int; - r_dst = int(va + (vb - va) * c); - } - return; - case FLOAT: { - real_t va = a._data._float; - real_t vb = b._data._float; - r_dst = va + (vb - va) * c; - } - return; - case STRING: { - //this is pretty funny and bizarre, but artists like to use it for typewriter effects - String sa = *reinterpret_cast<const String *>(a._data._mem); - String sb = *reinterpret_cast<const String *>(b._data._mem); - String dst; - int sa_len = sa.length(); - int sb_len = sb.length(); - int csize = sa_len + (sb_len - sa_len) * c; - if (csize == 0) { - r_dst = ""; - return; - } - dst.resize(csize + 1); - dst[csize] = 0; - int split = csize / 2; - - for (int i = 0; i < csize; i++) { - char32_t chr = ' '; - - if (i < split) { - if (i < sa.length()) { - chr = sa[i]; - } else if (i < sb.length()) { - chr = sb[i]; - } - - } else { - if (i < sb.length()) { - chr = sb[i]; - } else if (i < sa.length()) { - chr = sa[i]; - } - } - - dst[i] = chr; - } - - r_dst = dst; - } - return; - case VECTOR2: { - r_dst = reinterpret_cast<const Vector2 *>(a._data._mem)->lerp(*reinterpret_cast<const Vector2 *>(b._data._mem), c); - } - return; - case VECTOR2I: { - int32_t vax = reinterpret_cast<const Vector2i *>(a._data._mem)->x; - int32_t vbx = reinterpret_cast<const Vector2i *>(b._data._mem)->x; - int32_t vay = reinterpret_cast<const Vector2i *>(a._data._mem)->y; - int32_t vby = reinterpret_cast<const Vector2i *>(b._data._mem)->y; - r_dst = Vector2i(int32_t(vax + vbx * c + 0.5), int32_t(vay + vby * c + 0.5)); - } - return; - - case RECT2: { - r_dst = Rect2(reinterpret_cast<const Rect2 *>(a._data._mem)->position.lerp(reinterpret_cast<const Rect2 *>(b._data._mem)->position, c), reinterpret_cast<const Rect2 *>(a._data._mem)->size.lerp(reinterpret_cast<const Rect2 *>(b._data._mem)->size, c)); - } - return; - case RECT2I: { - const Rect2i *ra = reinterpret_cast<const Rect2i *>(a._data._mem); - const Rect2i *rb = reinterpret_cast<const Rect2i *>(b._data._mem); - - int32_t vax = ra->position.x; - int32_t vay = ra->position.y; - int32_t vbx = ra->size.x; - int32_t vby = ra->size.y; - int32_t vcx = rb->position.x; - int32_t vcy = rb->position.y; - int32_t vdx = rb->size.x; - int32_t vdy = rb->size.y; - - r_dst = Rect2i(int32_t(vax + vbx * c + 0.5), int32_t(vay + vby * c + 0.5), int32_t(vcx + vdx * c + 0.5), int32_t(vcy + vdy * c + 0.5)); - } - return; - - case VECTOR3: { - r_dst = reinterpret_cast<const Vector3 *>(a._data._mem)->lerp(*reinterpret_cast<const Vector3 *>(b._data._mem), c); - } - return; - case VECTOR3I: { - int32_t vax = reinterpret_cast<const Vector3i *>(a._data._mem)->x; - int32_t vbx = reinterpret_cast<const Vector3i *>(b._data._mem)->x; - int32_t vay = reinterpret_cast<const Vector3i *>(a._data._mem)->y; - int32_t vby = reinterpret_cast<const Vector3i *>(b._data._mem)->y; - int32_t vaz = reinterpret_cast<const Vector3i *>(a._data._mem)->z; - int32_t vbz = reinterpret_cast<const Vector3i *>(b._data._mem)->z; - r_dst = Vector3i(int32_t(vax + vbx * c + 0.5), int32_t(vay + vby * c + 0.5), int32_t(vaz + vbz * c + 0.5)); - } - return; - - case TRANSFORM2D: { - r_dst = a._data._transform2d->interpolate_with(*b._data._transform2d, c); - } - return; - case PLANE: { - r_dst = a; - } - return; - case QUATERNION: { - r_dst = reinterpret_cast<const Quaternion *>(a._data._mem)->slerp(*reinterpret_cast<const Quaternion *>(b._data._mem), c); - } - return; - case AABB: { - r_dst = ::AABB(a._data._aabb->position.lerp(b._data._aabb->position, c), a._data._aabb->size.lerp(b._data._aabb->size, c)); - } - return; - case BASIS: { - r_dst = a._data._basis->lerp(*b._data._basis, c); - } - return; - case TRANSFORM3D: { - r_dst = a._data._transform3d->interpolate_with(*b._data._transform3d, c); - } - return; - case COLOR: { - r_dst = reinterpret_cast<const Color *>(a._data._mem)->lerp(*reinterpret_cast<const Color *>(b._data._mem), c); - } - return; - case STRING_NAME: { - r_dst = a; - } - return; - case NODE_PATH: { - r_dst = a; - } - return; - case RID: { - r_dst = a; - } - return; - case OBJECT: { - r_dst = a; - } - return; - case DICTIONARY: { - } - return; - case ARRAY: { - r_dst = a; - } - return; - case PACKED_BYTE_ARRAY: { - r_dst = a; - } - return; - case PACKED_INT32_ARRAY: { - const Vector<int32_t> *arr_a = &PackedArrayRef<int32_t>::get_array(a._data.packed_array); - const Vector<int32_t> *arr_b = &PackedArrayRef<int32_t>::get_array(b._data.packed_array); - int32_t sz = arr_a->size(); - if (sz == 0 || arr_b->size() != sz) { - r_dst = a; - } else { - Vector<int32_t> v; - v.resize(sz); - { - int32_t *vw = v.ptrw(); - const int32_t *ar = arr_a->ptr(); - const int32_t *br = arr_b->ptr(); - - Variant va; - for (int32_t i = 0; i < sz; i++) { - Variant::interpolate(ar[i], br[i], c, va); - vw[i] = va; - } - } - r_dst = v; - } - } - return; - case PACKED_INT64_ARRAY: { - const Vector<int64_t> *arr_a = &PackedArrayRef<int64_t>::get_array(a._data.packed_array); - const Vector<int64_t> *arr_b = &PackedArrayRef<int64_t>::get_array(b._data.packed_array); - int64_t sz = arr_a->size(); - if (sz == 0 || arr_b->size() != sz) { - r_dst = a; - } else { - Vector<int64_t> v; - v.resize(sz); - { - int64_t *vw = v.ptrw(); - const int64_t *ar = arr_a->ptr(); - const int64_t *br = arr_b->ptr(); - - Variant va; - for (int64_t i = 0; i < sz; i++) { - Variant::interpolate(ar[i], br[i], c, va); - vw[i] = va; - } - } - r_dst = v; - } - } - return; - case PACKED_FLOAT32_ARRAY: { - const Vector<float> *arr_a = &PackedArrayRef<float>::get_array(a._data.packed_array); - const Vector<float> *arr_b = &PackedArrayRef<float>::get_array(b._data.packed_array); - int sz = arr_a->size(); - if (sz == 0 || arr_b->size() != sz) { - r_dst = a; - } else { - Vector<float> v; - v.resize(sz); - { - float *vw = v.ptrw(); - const float *ar = arr_a->ptr(); - const float *br = arr_b->ptr(); - - Variant va; - for (int i = 0; i < sz; i++) { - Variant::interpolate(ar[i], br[i], c, va); - vw[i] = va; - } - } - r_dst = v; - } - } - return; - case PACKED_FLOAT64_ARRAY: { - const Vector<double> *arr_a = &PackedArrayRef<double>::get_array(a._data.packed_array); - const Vector<double> *arr_b = &PackedArrayRef<double>::get_array(b._data.packed_array); - int sz = arr_a->size(); - if (sz == 0 || arr_b->size() != sz) { - r_dst = a; - } else { - Vector<double> v; - v.resize(sz); - { - double *vw = v.ptrw(); - const double *ar = arr_a->ptr(); - const double *br = arr_b->ptr(); - - Variant va; - for (int i = 0; i < sz; i++) { - Variant::interpolate(ar[i], br[i], c, va); - vw[i] = va; - } - } - r_dst = v; - } - } - return; - case PACKED_STRING_ARRAY: { - r_dst = a; - } - return; - case PACKED_VECTOR2_ARRAY: { - const Vector<Vector2> *arr_a = &PackedArrayRef<Vector2>::get_array(a._data.packed_array); - const Vector<Vector2> *arr_b = &PackedArrayRef<Vector2>::get_array(b._data.packed_array); - int sz = arr_a->size(); - if (sz == 0 || arr_b->size() != sz) { - r_dst = a; - } else { - Vector<Vector2> v; - v.resize(sz); - { - Vector2 *vw = v.ptrw(); - const Vector2 *ar = arr_a->ptr(); - const Vector2 *br = arr_b->ptr(); - - for (int i = 0; i < sz; i++) { - vw[i] = ar[i].lerp(br[i], c); - } - } - r_dst = v; - } - } - return; - case PACKED_VECTOR3_ARRAY: { - const Vector<Vector3> *arr_a = &PackedArrayRef<Vector3>::get_array(a._data.packed_array); - const Vector<Vector3> *arr_b = &PackedArrayRef<Vector3>::get_array(b._data.packed_array); - int sz = arr_a->size(); - if (sz == 0 || arr_b->size() != sz) { - r_dst = a; - } else { - Vector<Vector3> v; - v.resize(sz); - { - Vector3 *vw = v.ptrw(); - const Vector3 *ar = arr_a->ptr(); - const Vector3 *br = arr_b->ptr(); - - for (int i = 0; i < sz; i++) { - vw[i] = ar[i].lerp(br[i], c); - } - } - r_dst = v; - } - } - return; - case PACKED_COLOR_ARRAY: { - const Vector<Color> *arr_a = &PackedArrayRef<Color>::get_array(a._data.packed_array); - const Vector<Color> *arr_b = &PackedArrayRef<Color>::get_array(b._data.packed_array); - int sz = arr_a->size(); - if (sz == 0 || arr_b->size() != sz) { - r_dst = a; - } else { - Vector<Color> v; - v.resize(sz); - { - Color *vw = v.ptrw(); - const Color *ar = arr_a->ptr(); - const Color *br = arr_b->ptr(); - - for (int i = 0; i < sz; i++) { - vw[i] = ar[i].lerp(br[i], c); - } - } - r_dst = v; - } - } - return; - default: { - r_dst = a; - } - } -} - void Variant::_register_variant_setters_getters() { register_named_setters_getters(); register_indexed_setters_getters(); diff --git a/core/variant/variant_utility.cpp b/core/variant/variant_utility.cpp index 7ff64c88f0..670b66d53e 100644 --- a/core/variant/variant_utility.cpp +++ b/core/variant/variant_utility.cpp @@ -128,8 +128,8 @@ struct VariantUtilityFunctions { return Math::floor(x); } - static inline int floori(double x) { - return int(x); + static inline int64_t floori(double x) { + return int64_t(Math::floor(x)); } static inline Variant ceil(Variant x, Callable::CallError &r_error) { @@ -161,8 +161,8 @@ struct VariantUtilityFunctions { return Math::ceil(x); } - static inline int ceili(double x) { - return int(Math::ceil(x)); + static inline int64_t ceili(double x) { + return int64_t(Math::ceil(x)); } static inline Variant round(Variant x, Callable::CallError &r_error) { @@ -194,8 +194,8 @@ struct VariantUtilityFunctions { return Math::round(x); } - static inline int roundi(double x) { - return int(Math::round(x)); + static inline int64_t roundi(double x) { + return int64_t(Math::round(x)); } static inline Variant abs(const Variant &x, Callable::CallError &r_error) { diff --git a/doc/Makefile b/doc/Makefile index ecc5e51dd6..c8bf32d6e2 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -1,4 +1,4 @@ -BASEDIR = $(CURDIR) +BASEDIR = . CLASSES = $(BASEDIR)/classes/ $(BASEDIR)/../modules/ OUTPUTDIR = $(BASEDIR)/_build TOOLSDIR = $(BASEDIR)/tools diff --git a/doc/class.xsd b/doc/class.xsd index 7681ddad3d..d29d053006 100644 --- a/doc/class.xsd +++ b/doc/class.xsd @@ -95,6 +95,8 @@ </xs:sequence> <xs:attribute type="xs:string" name="name" use="optional" /> <xs:attribute type="xs:string" name="qualifiers" use="optional" /> + <xs:attribute type="xs:boolean" name="is_deprecated" use="optional" /> + <xs:attribute type="xs:boolean" name="is_experimental" use="optional" /> </xs:complexType> </xs:element> </xs:sequence> @@ -114,6 +116,8 @@ <xs:attribute type="xs:string" name="overrides" use="optional" /> <xs:attribute type="xs:string" name="enum" use="optional" /> <xs:attribute type="xs:string" name="default" use="optional" /> + <xs:attribute type="xs:boolean" name="is_deprecated" use="optional" /> + <xs:attribute type="xs:boolean" name="is_experimental" use="optional" /> </xs:extension> </xs:simpleContent> </xs:complexType> @@ -156,6 +160,8 @@ <xs:attribute type="xs:string" name="value" /> <xs:attribute type="xs:string" name="enum" use="optional" /> <xs:attribute type="xs:boolean" name="is_bitfield" use="optional" /> + <xs:attribute type="xs:boolean" name="is_deprecated" use="optional" /> + <xs:attribute type="xs:boolean" name="is_experimental" use="optional" /> </xs:extension> </xs:simpleContent> </xs:complexType> @@ -256,6 +262,8 @@ </xs:sequence> <xs:attribute type="xs:string" name="name" /> <xs:attribute type="xs:string" name="inherits" /> + <xs:attribute type="xs:boolean" name="is_deprecated" use="optional" /> + <xs:attribute type="xs:boolean" name="is_experimental" use="optional" /> <xs:attribute type="xs:float" name="version" /> </xs:complexType> </xs:element> diff --git a/doc/classes/@GlobalScope.xml b/doc/classes/@GlobalScope.xml index 3d01c60aea..5bb10d162f 100644 --- a/doc/classes/@GlobalScope.xml +++ b/doc/classes/@GlobalScope.xml @@ -2818,6 +2818,9 @@ </constant> <constant name="PROPERTY_USAGE_EDITOR_BASIC_SETTING" value="134217728" enum="PropertyUsageFlags"> </constant> + <constant name="PROPERTY_USAGE_READ_ONLY" value="268435456" enum="PropertyUsageFlags"> + The property is read-only in the editor inspector. + </constant> <constant name="PROPERTY_USAGE_ARRAY" value="536870912" enum="PropertyUsageFlags"> </constant> <constant name="PROPERTY_USAGE_DEFAULT" value="6" enum="PropertyUsageFlags"> diff --git a/doc/classes/AESContext.xml b/doc/classes/AESContext.xml index 69cd54a79b..7f582e4be7 100644 --- a/doc/classes/AESContext.xml +++ b/doc/classes/AESContext.xml @@ -45,6 +45,7 @@ public class Example : Node { public AESContext Aes = new AESContext(); + public override void _Ready() { string key = "My secret key!!!"; // Key must be either 16 or 32 bytes. diff --git a/doc/classes/AStarGrid2D.xml b/doc/classes/AStarGrid2D.xml index 19cd9d21d7..8dde3748d7 100644 --- a/doc/classes/AStarGrid2D.xml +++ b/doc/classes/AStarGrid2D.xml @@ -6,14 +6,24 @@ <description> Compared to [AStar2D] you don't need to manually create points or connect them together. It also supports multiple type of heuristics and modes for diagonal movement. This class also provides a jumping mode which is faster to calculate than without it in the [AStar2D] class. In contrast to [AStar2D], you only need set the [member size] of the grid, optionally set the [member cell_size] and then call the [method update] method: - [codeblock] + [codeblocks] + [gdscript] var astar_grid = AStarGrid2D.new() astar_grid.size = Vector2i(32, 32) astar_grid.cell_size = Vector2(16, 16) astar_grid.update() print(astar_grid.get_id_path(Vector2i(0, 0), Vector2i(3, 4))) # prints (0, 0), (1, 1), (2, 2), (3, 3), (3, 4) print(astar_grid.get_point_path(Vector2i(0, 0), Vector2i(3, 4))) # prints (0, 0), (16, 16), (32, 32), (48, 48), (48, 64) - [/codeblock] + [/gdscript] + [csharp] + AStarGrid2D astarGrid = new AStarGrid2D(); + astarGrid.Size = new Vector2i(32, 32); + astarGrid.CellSize = new Vector2i(16, 16); + astarGrid.Update(); + GD.Print(astarGrid.GetIdPath(Vector2i.Zero, new Vector2i(3, 4))); // prints (0, 0), (1, 1), (2, 2), (3, 3), (3, 4) + GD.Print(astarGrid.GetPointPath(Vector2i.Zero, new Vector2i(3, 4))); // prints (0, 0), (16, 16), (32, 32), (48, 48), (48, 64) + [/csharp] + [/codeblocks] </description> <tutorials> </tutorials> @@ -43,7 +53,7 @@ </description> </method> <method name="get_id_path"> - <return type="PackedVector2Array" /> + <return type="Vector2i[]" /> <param index="0" name="from_id" type="Vector2i" /> <param index="1" name="to_id" type="Vector2i" /> <description> diff --git a/doc/classes/AnimatedSprite2D.xml b/doc/classes/AnimatedSprite2D.xml index b207eda27f..afbe34816a 100644 --- a/doc/classes/AnimatedSprite2D.xml +++ b/doc/classes/AnimatedSprite2D.xml @@ -5,6 +5,8 @@ </brief_description> <description> [AnimatedSprite2D] is similar to the [Sprite2D] node, except it carries multiple textures as animation frames. Animations are created using a [SpriteFrames] resource, which allows you to import image files (or a folder containing said files) to provide the animation frames for the sprite. The [SpriteFrames] resource can be configured in the editor via the SpriteFrames bottom panel. + After setting up [member frames], [method play] may be called. It's also possible to select an [member animation] and toggle [member playing], even within the editor. + To pause the current animation, call [method stop] or set [member playing] to [code]false[/code]. Alternatively, setting [member speed_scale] to [code]0[/code] also preserves the current frame's elapsed time. [b]Note:[/b] You can associate a set of normal or specular maps by creating additional [SpriteFrames] resources with a [code]_normal[/code] or [code]_specular[/code] suffix. For example, having 3 [SpriteFrames] resources [code]run[/code], [code]run_normal[/code], and [code]run_specular[/code] will make it so the [code]run[/code] animation uses normal and specular maps. </description> <tutorials> @@ -17,13 +19,14 @@ <param index="0" name="anim" type="StringName" default="&""" /> <param index="1" name="backwards" type="bool" default="false" /> <description> - Plays the animation named [param anim]. If no [param anim] is provided, the current animation is played. If [code]backwards[/code] is [code]true[/code], the animation will be played in reverse. + Plays the animation named [param anim]. If no [param anim] is provided, the current animation is played. If [param backwards] is [code]true[/code], the animation is played in reverse. </description> </method> <method name="stop"> <return type="void" /> <description> - Stops the current animation (does not reset the frame counter). + Stops the current [member animation] at the current [member frame]. + [b]Note:[/b] This method resets the current frame's elapsed time. If this behavior is undesired, consider setting [member speed_scale] to [code]0[/code], instead. </description> </method> </methods> @@ -50,10 +53,10 @@ The texture's drawing offset. </member> <member name="playing" type="bool" setter="set_playing" getter="is_playing" default="false"> - If [code]true[/code], the [member animation] is currently playing. + If [code]true[/code], the [member animation] is currently playing. Setting this property to [code]false[/code] is the equivalent of calling [method stop]. </member> <member name="speed_scale" type="float" setter="set_speed_scale" getter="get_speed_scale" default="1.0"> - The animation speed is multiplied by this value. + The animation speed is multiplied by this value. If set to a negative value, the animation is played in reverse. If set to [code]0[/code], the animation is paused, preserving the current frame's elapsed time. </member> </members> <signals> diff --git a/doc/classes/AnimatedSprite3D.xml b/doc/classes/AnimatedSprite3D.xml index 0bc5484e3a..09baf882fb 100644 --- a/doc/classes/AnimatedSprite3D.xml +++ b/doc/classes/AnimatedSprite3D.xml @@ -4,7 +4,9 @@ 2D sprite node in 3D world, that can use multiple 2D textures for animation. </brief_description> <description> - Animations are created using a [SpriteFrames] resource, which can be configured in the editor via the SpriteFrames panel. + [AnimatedSprite3D] is similar to the [Sprite3D] node, except it carries multiple textures as animation [member frames]. Animations are created using a [SpriteFrames] resource, which allows you to import image files (or a folder containing said files) to provide the animation frames for the sprite. The [SpriteFrames] resource can be configured in the editor via the SpriteFrames bottom panel. + After setting up [member frames], [method play] may be called. It's also possible to select an [member animation] and toggle [member playing], even within the editor. + To pause the current animation, call [method stop] or set [member playing] to [code]false[/code]. Alternatively, setting [member speed_scale] to [code]0[/code] also preserves the current frame's elapsed time. </description> <tutorials> <link title="2D Sprite animation (also applies to 3D)">$DOCS_URL/tutorials/2d/2d_sprite_animation.html</link> @@ -13,14 +15,16 @@ <method name="play"> <return type="void" /> <param index="0" name="anim" type="StringName" default="&""" /> + <param index="1" name="backwards" type="bool" default="false" /> <description> - Plays the animation named [param anim]. If no [param anim] is provided, the current animation is played. + Plays the animation named [param anim]. If no [param anim] is provided, the current animation is played. If [param backwards] is [code]true[/code], the animation is played in reverse. </description> </method> <method name="stop"> <return type="void" /> <description> - Stops the current animation (does not reset the frame counter). + Stops the current [member animation] at the current [member frame]. + [b]Note:[/b] This method resets the current frame's elapsed time. If this behavior is undesired, consider setting [member speed_scale] to [code]0[/code], instead. </description> </method> </methods> @@ -35,7 +39,10 @@ The [SpriteFrames] resource containing the animation(s). </member> <member name="playing" type="bool" setter="set_playing" getter="is_playing" default="false"> - If [code]true[/code], the [member animation] is currently playing. + If [code]true[/code], the [member animation] is currently playing. Setting this property to [code]false[/code] is the equivalent of calling [method stop]. + </member> + <member name="speed_scale" type="float" setter="set_speed_scale" getter="get_speed_scale" default="1.0"> + The animation speed is multiplied by this value. If set to a negative value, the animation is played in reverse. If set to [code]0[/code], the animation is paused, preserving the current frame's elapsed time. </member> </members> <signals> diff --git a/doc/classes/AnimationLibrary.xml b/doc/classes/AnimationLibrary.xml index 75fe393dbb..769b338063 100644 --- a/doc/classes/AnimationLibrary.xml +++ b/doc/classes/AnimationLibrary.xml @@ -15,7 +15,7 @@ <param index="0" name="name" type="StringName" /> <param index="1" name="animation" type="Animation" /> <description> - Adds the [param animation] to the library, accesible by the key [param name]. + Adds the [param animation] to the library, accessible by the key [param name]. </description> </method> <method name="get_animation" qualifiers="const"> diff --git a/doc/classes/AnimationNodeBlendTree.xml b/doc/classes/AnimationNodeBlendTree.xml index 4c7943ece3..2a765ac8d6 100644 --- a/doc/classes/AnimationNodeBlendTree.xml +++ b/doc/classes/AnimationNodeBlendTree.xml @@ -87,6 +87,14 @@ The global offset of all sub-nodes. </member> </members> + <signals> + <signal name="node_changed"> + <param index="0" name="node_name" type="StringName" /> + <description> + Emitted when the input port information is changed. + </description> + </signal> + </signals> <constants> <constant name="CONNECTION_OK" value="0"> The connection was successful. diff --git a/doc/classes/AnimationPlayer.xml b/doc/classes/AnimationPlayer.xml index 710dc55a4b..b7ac1ff7f8 100644 --- a/doc/classes/AnimationPlayer.xml +++ b/doc/classes/AnimationPlayer.xml @@ -5,7 +5,7 @@ </brief_description> <description> An animation player is used for general-purpose playback of [Animation] resources. It contains a dictionary of [AnimationLibrary] resources and custom blend times between animation transitions. - Some methods and properties use a single key to refence an animation directly. These keys are formatted as the key for the library, followed by a forward slash, then the key for the animation whithin the library, for example [code]"movement/run"[/code]. If the library's key is an empty string (known as the default library), the forward slash is omitted, being the same key used by the library. + Some methods and properties use a single key to reference an animation directly. These keys are formatted as the key for the library, followed by a forward slash, then the key for the animation within the library, for example [code]"movement/run"[/code]. If the library's key is an empty string (known as the default library), the forward slash is omitted, being the same key used by the library. [AnimationPlayer] is more suited than [Tween] for animations where you know the final values in advance. For example, fading a screen in and out is more easily done with an [AnimationPlayer] node thanks to the animation tools provided by the editor. That particular example can also be implemented with a [Tween], but it requires doing everything by code. Updating the target properties of animations occurs at process time. </description> @@ -170,7 +170,7 @@ <return type="void" /> <param index="0" name="name" type="StringName" /> <description> - Removes the [AnimationLibrary] assosiated with the key [param name]. + Removes the [AnimationLibrary] associated with the key [param name]. </description> </method> <method name="rename_animation_library"> @@ -268,6 +268,11 @@ [b]Note:[/b] This signal is not emitted if an animation is looping. </description> </signal> + <signal name="animation_list_changed"> + <description> + Notifies when an animation list is changed. + </description> + </signal> <signal name="animation_started"> <param index="0" name="anim_name" type="StringName" /> <description> diff --git a/doc/classes/AnimationTree.xml b/doc/classes/AnimationTree.xml index f2bf74f495..27797b00b5 100644 --- a/doc/classes/AnimationTree.xml +++ b/doc/classes/AnimationTree.xml @@ -54,6 +54,13 @@ The root animation node of this [AnimationTree]. See [AnimationNode]. </member> </members> + <signals> + <signal name="animation_player_changed"> + <description> + Emitted when the [member anim_player] is changed. + </description> + </signal> + </signals> <constants> <constant name="ANIMATION_PROCESS_PHYSICS" value="0" enum="AnimationProcessCallback"> The animations will progress during the physics frame (i.e. [method Node._physics_process]). diff --git a/doc/classes/Area2D.xml b/doc/classes/Area2D.xml index f1e40d4979..29592f133d 100644 --- a/doc/classes/Area2D.xml +++ b/doc/classes/Area2D.xml @@ -25,10 +25,24 @@ <method name="get_overlapping_bodies" qualifiers="const"> <return type="Node2D[]" /> <description> - Returns a list of intersecting [PhysicsBody2D]s. The overlapping body's [member CollisionObject2D.collision_layer] must be part of this area's [member CollisionObject2D.collision_mask] in order to be detected. + Returns a list of intersecting [PhysicsBody2D]s and [TileMap]s. The overlapping body's [member CollisionObject2D.collision_layer] must be part of this area's [member CollisionObject2D.collision_mask] in order to be detected. For performance reasons (collisions are all processed at the same time) this list is modified once during the physics step, not immediately after objects are moved. Consider using signals instead. </description> </method> + <method name="has_overlapping_areas" qualifiers="const"> + <return type="bool" /> + <description> + Returns [code]true[/code] if intersecting any [Area2D]s, otherwise returns [code]false[/code]. The overlapping area's [member CollisionObject2D.collision_layer] must be part of this area's [member CollisionObject2D.collision_mask] in order to be detected. + For performance reasons (collisions are all processed at the same time) the list of overlapping areas is modified once during the physics step, not immediately after objects are moved. Consider using signals instead. + </description> + </method> + <method name="has_overlapping_bodies" qualifiers="const"> + <return type="bool" /> + <description> + Returns [code]true[/code] if intersecting any [PhysicsBody2D]s or [TileMap]s, otherwise returns [code]false[/code]. The overlapping body's [member CollisionObject2D.collision_layer] must be part of this area's [member CollisionObject2D.collision_mask] in order to be detected. + For performance reasons (collisions are all processed at the same time) the list of overlapping bodies is modified once during the physics step, not immediately after objects are moved. Consider using signals instead. + </description> + </method> <method name="overlaps_area" qualifiers="const"> <return type="bool" /> <param index="0" name="area" type="Node" /> diff --git a/doc/classes/Area3D.xml b/doc/classes/Area3D.xml index 14081918cf..ce49be9bc1 100644 --- a/doc/classes/Area3D.xml +++ b/doc/classes/Area3D.xml @@ -23,10 +23,24 @@ <method name="get_overlapping_bodies" qualifiers="const"> <return type="Node3D[]" /> <description> - Returns a list of intersecting [PhysicsBody3D]s. The overlapping body's [member CollisionObject3D.collision_layer] must be part of this area's [member CollisionObject3D.collision_mask] in order to be detected. + Returns a list of intersecting [PhysicsBody3D]s and [GridMap]s. The overlapping body's [member CollisionObject3D.collision_layer] must be part of this area's [member CollisionObject3D.collision_mask] in order to be detected. For performance reasons (collisions are all processed at the same time) this list is modified once during the physics step, not immediately after objects are moved. Consider using signals instead. </description> </method> + <method name="has_overlapping_areas" qualifiers="const"> + <return type="bool" /> + <description> + Returns [code]true[/code] if intersecting any [Area3D]s, otherwise returns [code]false[/code]. The overlapping area's [member CollisionObject3D.collision_layer] must be part of this area's [member CollisionObject3D.collision_mask] in order to be detected. + For performance reasons (collisions are all processed at the same time) the list of overlapping areas is modified once during the physics step, not immediately after objects are moved. Consider using signals instead. + </description> + </method> + <method name="has_overlapping_bodies" qualifiers="const"> + <return type="bool" /> + <description> + Returns [code]true[/code] if intersecting any [PhysicsBody3D]s or [GridMap]s, otherwise returns [code]false[/code]. The overlapping body's [member CollisionObject3D.collision_layer] must be part of this area's [member CollisionObject3D.collision_mask] in order to be detected. + For performance reasons (collisions are all processed at the same time) the list of overlapping bodies is modified once during the physics step, not immediately after objects are moved. Consider using signals instead. + </description> + </method> <method name="overlaps_area" qualifiers="const"> <return type="bool" /> <param index="0" name="area" type="Node" /> diff --git a/doc/classes/Array.xml b/doc/classes/Array.xml index f6d926031d..d8c4b8fdb5 100644 --- a/doc/classes/Array.xml +++ b/doc/classes/Array.xml @@ -53,6 +53,15 @@ </constructor> <constructor name="Array"> <return type="Array" /> + <param index="0" name="base" type="Array" /> + <param index="1" name="type" type="int" /> + <param index="2" name="class_name" type="StringName" /> + <param index="3" name="script" type="Variant" /> + <description> + </description> + </constructor> + <constructor name="Array"> + <return type="Array" /> <param index="0" name="from" type="Array" /> <description> Constructs an [Array] as a copy of the given [Array]. @@ -303,6 +312,21 @@ [b]Note:[/b] Calling this function is not the same as writing [code]array[0][/code]. If the array is empty, accessing by index will pause project execution when running from the editor. </description> </method> + <method name="get_typed_builtin" qualifiers="const"> + <return type="int" /> + <description> + </description> + </method> + <method name="get_typed_class_name" qualifiers="const"> + <return type="StringName" /> + <description> + </description> + </method> + <method name="get_typed_script" qualifiers="const"> + <return type="Variant" /> + <description> + </description> + </method> <method name="has" qualifiers="const"> <return type="bool" /> <param index="0" name="value" type="Variant" /> @@ -366,6 +390,16 @@ Returns [code]true[/code] if the array is empty. </description> </method> + <method name="is_read_only" qualifiers="const"> + <return type="bool" /> + <description> + </description> + </method> + <method name="is_typed" qualifiers="const"> + <return type="bool" /> + <description> + </description> + </method> <method name="map" qualifiers="const"> <return type="Array" /> <param index="0" name="method" type="Callable" /> @@ -479,6 +513,20 @@ Searches the array in reverse order. Optionally, a start search index can be passed. If negative, the start index is considered relative to the end of the array. </description> </method> + <method name="set_read_only"> + <return type="void" /> + <param index="0" name="enable" type="bool" /> + <description> + </description> + </method> + <method name="set_typed"> + <return type="void" /> + <param index="0" name="type" type="int" /> + <param index="1" name="class_name" type="StringName" /> + <param index="2" name="script" type="Variant" /> + <description> + </description> + </method> <method name="shuffle"> <return type="void" /> <description> @@ -556,6 +604,12 @@ [/codeblocks] </description> </method> + <method name="typed_assign"> + <return type="bool" /> + <param index="0" name="array" type="Array" /> + <description> + </description> + </method> </methods> <operators> <operator name="operator !="> diff --git a/doc/classes/AtlasTexture.xml b/doc/classes/AtlasTexture.xml index 759acff773..4794c8ef14 100644 --- a/doc/classes/AtlasTexture.xml +++ b/doc/classes/AtlasTexture.xml @@ -1,26 +1,27 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="AtlasTexture" inherits="Texture2D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> - Crops out one part of a texture, such as a texture from a texture atlas. + A texture that crops out part of another Texture2D. </brief_description> <description> - [Texture2D] resource that crops out one part of the [member atlas] texture, defined by [member region]. The main use case is cropping out textures from a texture atlas, which is a big texture file that packs multiple smaller textures. Consists of a [Texture2D] for the [member atlas], a [member region] that defines the area of [member atlas] to use, and a [member margin] that defines the border width. - [AtlasTexture] cannot be used in an [AnimatedTexture], cannot be tiled in nodes such as [TextureRect], and does not work properly if used inside of other [AtlasTexture] resources. Multiple [AtlasTexture] resources can be used to crop multiple textures from the atlas. Using a texture atlas helps to optimize video memory costs and render calls compared to using multiple small files. + [Texture2D] resource that draws only part of its [member atlas] texture, as defined by the [member region]. An additional [member margin] can also be set, which is useful for small adjustments. + Multiple [AtlasTexture] resources can be cropped from the same [member atlas]. Packing many smaller textures into a singular large texture helps to optimize video memory costs and render calls. + [b]Note:[/b] [AtlasTexture] cannot be used in an [AnimatedTexture], and does not work properly if used inside of other [AtlasTexture] resources. </description> <tutorials> </tutorials> <members> <member name="atlas" type="Texture2D" setter="set_atlas" getter="get_atlas"> - The texture that contains the atlas. Can be any [Texture2D] subtype. + The texture that contains the atlas. Can be any type inheriting from [Texture2D]. Nesting [AtlasTexture] resources is not supported. </member> <member name="filter_clip" type="bool" setter="set_filter_clip" getter="has_filter_clip" default="false"> - If [code]true[/code], clips the area outside of the region to avoid bleeding of the surrounding texture pixels. + If [code]true[/code], the area outside of the [member region] is clipped to avoid bleeding of the surrounding texture pixels. </member> <member name="margin" type="Rect2" setter="set_margin" getter="get_margin" default="Rect2(0, 0, 0, 0)"> - The margin around the region. The [Rect2]'s [member Rect2.size] parameter ("w" and "h" in the editor) resizes the texture so it fits within the margin. + The margin around the [member region]. Useful for small adjustments. If the [member Rect2.size] of this property ("w" and "h" in the editor) is set, the drawn texture is resized to fit within the margin. </member> <member name="region" type="Rect2" setter="set_region" getter="get_region" default="Rect2(0, 0, 0, 0)"> - The AtlasTexture's used region. + The region used to draw the [member atlas]. </member> </members> </class> diff --git a/doc/classes/BaseMaterial3D.xml b/doc/classes/BaseMaterial3D.xml index ee28675d89..cbb58a3e1e 100644 --- a/doc/classes/BaseMaterial3D.xml +++ b/doc/classes/BaseMaterial3D.xml @@ -28,7 +28,7 @@ <return type="Texture2D" /> <param index="0" name="param" type="int" enum="BaseMaterial3D.TextureParam" /> <description> - Returns the [Texture] associated with the specified [enum TextureParam]. + Returns the [Texture2D] associated with the specified [enum TextureParam]. </description> </method> <method name="set_feature"> diff --git a/doc/classes/Basis.xml b/doc/classes/Basis.xml index d62f704528..6d9b679fbc 100644 --- a/doc/classes/Basis.xml +++ b/doc/classes/Basis.xml @@ -83,7 +83,7 @@ <return type="Vector3" /> <param index="0" name="order" type="int" default="2" /> <description> - Returns the basis's rotation in the form of Euler angles (in the YXZ convention: when decomposing, first Z, then X, and Y last). The returned vector contains the rotation angles in the format (X angle, Y angle, Z angle). + Returns the basis's rotation in the form of Euler angles. The Euler order depends on the [param order] parameter, by default it uses the YXZ convention: when decomposing, first Z, then X, and Y last. The returned vector contains the rotation angles in the format (X angle, Y angle, Z angle). Consider using the [method get_rotation_quaternion] method instead, which returns a [Quaternion] quaternion instead of Euler angles. </description> </method> diff --git a/doc/classes/BoneAttachment3D.xml b/doc/classes/BoneAttachment3D.xml index dc3d448621..f29525038e 100644 --- a/doc/classes/BoneAttachment3D.xml +++ b/doc/classes/BoneAttachment3D.xml @@ -16,10 +16,11 @@ Returns the [NodePath] to the external [Skeleton3D] node, if one has been set. </description> </method> - <method name="get_override_mode" qualifiers="const"> + <method name="get_override_mode" qualifiers="const" is_deprecated="true"> <return type="int" /> <description> - Returns the override mode for the BoneAttachment3D node. + Deprecated. Local pose overrides will be removed. + Returns the override mode for the BoneAttachment3D node (0=global / 1=local). </description> </method> <method name="get_override_pose" qualifiers="const"> @@ -48,11 +49,12 @@ Sets the [NodePath] to the external skeleton that the BoneAttachment3D node should use. The external [Skeleton3D] node is only used when [code]use_external_skeleton[/code] is set to [code]true[/code]. </description> </method> - <method name="set_override_mode"> + <method name="set_override_mode" is_deprecated="true"> <return type="void" /> <param index="0" name="override_mode" type="int" /> <description> - Sets the override mode for the BoneAttachment3D node. The override mode defines which of the bone poses the BoneAttachment3D node will override. + Deprecated. Local pose overrides will be removed. + Sets the override mode for the BoneAttachment3D node (0=global / 1=local). The override mode defines which of the bone poses the BoneAttachment3D node will override. </description> </method> <method name="set_override_pose"> diff --git a/doc/classes/Callable.xml b/doc/classes/Callable.xml index 1fcaf6d866..dd48ee6790 100644 --- a/doc/classes/Callable.xml +++ b/doc/classes/Callable.xml @@ -81,6 +81,13 @@ [/codeblock] </description> </method> + <method name="callv" qualifiers="const"> + <return type="Variant" /> + <param index="0" name="arguments" type="Array" /> + <description> + Calls the method represented by this [Callable]. Contrary to [method call], this method does not take a variable number of arguments but expects all arguments to be passed via a single [Array]. + </description> + </method> <method name="get_method" qualifiers="const"> <return type="StringName" /> <description> diff --git a/doc/classes/Camera2D.xml b/doc/classes/Camera2D.xml index bb78d537ad..a1d24f778d 100644 --- a/doc/classes/Camera2D.xml +++ b/doc/classes/Camera2D.xml @@ -124,6 +124,9 @@ <member name="editor_draw_screen" type="bool" setter="set_screen_drawing_enabled" getter="is_screen_drawing_enabled" default="true"> If [code]true[/code], draws the camera's screen rectangle in the editor. </member> + <member name="ignore_rotation" type="bool" setter="set_ignore_rotation" getter="is_ignoring_rotation" default="true"> + If [code]true[/code], the camera's rendered view is not affected by its [member Node2D.rotation] and [member Node2D.global_rotation]. + </member> <member name="limit_bottom" type="int" setter="set_limit" getter="get_limit" default="10000000"> Bottom scroll limit in pixels. The camera stops moving when reaching this value, but [member offset] can push the view past the limit. </member> @@ -147,9 +150,6 @@ <member name="process_callback" type="int" setter="set_process_callback" getter="get_process_callback" enum="Camera2D.Camera2DProcessCallback" default="1"> The camera's process callback. See [enum Camera2DProcessCallback]. </member> - <member name="rotating" type="bool" setter="set_rotating" getter="is_rotating" default="false"> - If [code]true[/code], the camera view rotates with the target. - </member> <member name="smoothing_enabled" type="bool" setter="set_enable_follow_smoothing" getter="is_follow_smoothing_enabled" default="false"> If [code]true[/code], the camera smoothly moves towards the target at [member smoothing_speed]. </member> diff --git a/doc/classes/CanvasItem.xml b/doc/classes/CanvasItem.xml index 70d825efac..d74f49c897 100644 --- a/doc/classes/CanvasItem.xml +++ b/doc/classes/CanvasItem.xml @@ -310,16 +310,16 @@ # If using this method in a script that redraws constantly, move the # `default_font` declaration to a member variable assigned in `_ready()` # so the Control is only created once. - var default_font = Control.new().get_font("font") - var default_font_size = Control.new().get_font_size("font_size") - draw_string(default_font, Vector2(64, 64), "Hello world", HORIZONTAL_ALIGNMENT_LEFT, -1, font_size) + var default_font = ThemeDB.fallback_font + var default_font_size = ThemeDB.fallback_font_size + draw_string(default_font, Vector2(64, 64), "Hello world", HORIZONTAL_ALIGNMENT_LEFT, -1, default_font_size) [/gdscript] [csharp] // If using this method in a script that redraws constantly, move the - // `default_font` declaration to a member variable assigned in `_ready()` + // `default_font` declaration to a member variable assigned in `_Ready()` // so the Control is only created once. - Font defaultFont = new Control().GetFont("font"); - int defaultFontSize = new Control().GetFontSize("font_size"); + Font defaultFont = ThemeDB.FallbackFont; + int defaultFontSize = ThemeDB.FallbackFontSize; DrawString(defaultFont, new Vector2(64, 64), "Hello world", HORIZONTAL_ALIGNMENT_LEFT, -1, defaultFontSize); [/csharp] [/codeblocks] diff --git a/doc/classes/CollisionShape2D.xml b/doc/classes/CollisionShape2D.xml index fa8fbd0d3e..75530370bc 100644 --- a/doc/classes/CollisionShape2D.xml +++ b/doc/classes/CollisionShape2D.xml @@ -14,6 +14,10 @@ <link title="2D Kinematic Character Demo">https://godotengine.org/asset-library/asset/113</link> </tutorials> <members> + <member name="debug_color" type="Color" setter="set_debug_color" getter="get_debug_color" default="Color(0, 0, 0, 1)"> + The collision shape debug color. + [b]Note:[/b] The default value is [member ProjectSettings.debug/shapes/collision/shape_color]. The [code]Color(0, 0, 0, 1)[/code] value documented here is a placeholder, and not the actual default debug color. + </member> <member name="disabled" type="bool" setter="set_disabled" getter="is_disabled" default="false"> A disabled collision shape has no effect in the world. This property should be changed with [method Object.set_deferred]. </member> diff --git a/doc/classes/Control.xml b/doc/classes/Control.xml index 71798d2574..bf449ade77 100644 --- a/doc/classes/Control.xml +++ b/doc/classes/Control.xml @@ -528,7 +528,7 @@ <param index="0" name="at_position" type="Vector2" default="Vector2(0, 0)" /> <description> Returns the tooltip text [param at_position] in local coordinates, which will typically appear when the cursor is resting over this control. By default, it returns [member tooltip_text]. - [b]Note:[/b] This method can be overriden to customise its behaviour. If this method returns an empty [String], no tooltip is displayed. + [b]Note:[/b] This method can be overridden to customise its behaviour. If this method returns an empty [String], no tooltip is displayed. </description> </method> <method name="grab_click_focus"> @@ -972,7 +972,7 @@ <member name="clip_contents" type="bool" setter="set_clip_contents" getter="is_clipping_contents" default="false"> Enables whether rendering of [CanvasItem] based children should be clipped to this control's rectangle. If [code]true[/code], parts of a child which would be visibly outside of this control's rectangle will not be rendered and won't receive input. </member> - <member name="custom_minimum_size" type="Vector2" setter="set_custom_minimum_size" getter="get_custom_minimum_size" default="Vector2(0, 0)"> + <member name="custom_minimum_size" type="Vector2i" setter="set_custom_minimum_size" getter="get_custom_minimum_size" default="Vector2i(0, 0)"> The minimum size of the node's bounding rectangle. If you set it to a value greater than (0, 0), the node's bounding rectangle will always have at least this size, even if its content is smaller. If it's set to (0, 0), the node sizes automatically to fit its content, be it a texture or child nodes. </member> <member name="focus_mode" type="int" setter="set_focus_mode" getter="get_focus_mode" enum="Control.FocusMode" default="0"> diff --git a/doc/classes/Cubemap.xml b/doc/classes/Cubemap.xml index 7173388027..0cdebeda95 100644 --- a/doc/classes/Cubemap.xml +++ b/doc/classes/Cubemap.xml @@ -4,9 +4,9 @@ 6-sided texture typically used in 3D rendering. </brief_description> <description> - A cubemap is a 6-sided texture typically used for faking reflections in 3D rendering. It can be used to make an object look as if it's reflecting its surroundings. This usually delivers much better performance than other reflection methods. + A cubemap is made of 6 textures organized in layers. They are typically used for faking reflections (see [ReflectionProbe]) in 3D rendering. It can be used to make an object look as if it's reflecting its surroundings. This usually delivers much better performance than other reflection methods. This resource is typically used as a uniform in custom shaders. Few core Godot methods make use of Cubemap resources. - [b]Note:[/b] Godot doesn't support using cubemaps as a [PanoramaSkyMaterial]. You can use [url=https://danilw.github.io/GLSL-howto/cubemap_to_panorama_js/cubemap_to_panorama.html]this tool[/url] to convert a cube map to an equirectangular sky map. + [b]Note:[/b] Godot doesn't support using cubemaps in a [PanoramaSkyMaterial]. You can use [url=https://danilw.github.io/GLSL-howto/cubemap_to_panorama_js/cubemap_to_panorama.html]this tool[/url] to convert a cubemap to an equirectangular sky map. </description> <tutorials> </tutorials> diff --git a/doc/classes/CubemapArray.xml b/doc/classes/CubemapArray.xml index 4fca842b5a..07e401a13d 100644 --- a/doc/classes/CubemapArray.xml +++ b/doc/classes/CubemapArray.xml @@ -1,8 +1,13 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="CubemapArray" inherits="ImageTextureLayered" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> + A single composite texture resource which consists of multiple [Cubemap]s. </brief_description> <description> + [CubemapArray]s are made of an array of [Cubemap]s. Accordingly, like [Cubemap]s they are made of multiple textures the amount of which must be divisible by 6 (one image for each face of the cube). The primary benefit of [CubemapArray]s is that they can be accessed in shader code using a single texture reference. In other words, you can pass multiple [Cubemap]s into a shader using a single [CubemapArray]. + Generally, [CubemapArray]s provide a more efficient way for storing multiple [Cubemap]s, than storing multiple [Cubemap]s themselves in an array. + Internally Godot, uses [CubemapArray]s for many effects including the [Sky], if you set [member ProjectSettings.rendering/reflections/sky_reflections/texture_array_reflections] to [code]true[/code]. + [b]Note:[/b] [CubemapArray] is not supported in the OpenGL 3 rendering backend. </description> <tutorials> </tutorials> diff --git a/doc/classes/Directory.xml b/doc/classes/DirAccess.xml index c9a9f346a5..7d1612e59c 100644 --- a/doc/classes/Directory.xml +++ b/doc/classes/DirAccess.xml @@ -1,18 +1,26 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="Directory" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="DirAccess" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> Type used to handle the filesystem. </brief_description> <description> Directory type. It is used to manage directories and their content (not restricted to the project folder). - When creating a new [Directory], it must be explicitly opened using [method open] before most methods can be used. However, [method file_exists] and [method dir_exists] can be used without opening a directory. If so, they use a path relative to [code]res://[/code]. + [DirAccess] can't be instantiated directly. Instead it is created with a static method that takes a path for which it will be opened. + Most of the methods have a static alternative that can be used without creating a [DirAccess]. Static methods only support absolute paths (including [code]res://[/code] and [code]user://[/code]). + [codeblock] + # Standard + var dir = DirAccess.open("user://levels") + dir.make_dir("world1") + # Static + DirAccess.make_dir_absolute("user://levels/world1") + [/codeblock] [b]Note:[/b] Many resources types are imported (e.g. textures or sound files), and their source asset will not be included in the exported game, as only the imported version is used. Use [ResourceLoader] to access imported resources. Here is an example on how to iterate through the files of a directory: [codeblocks] [gdscript] func dir_contents(path): - var dir = Directory.new() - if dir.open(path) == OK: + var dir = DirAccess.open(path) + if dir: dir.list_dir_begin() var file_name = dir.get_next() while file_name != "": @@ -27,8 +35,8 @@ [csharp] public void DirContents(string path) { - var dir = new Directory(); - if (dir.Open(path) == Error.Ok) + using var dir = DirAccess.Open(path); + if (dir != null) { dir.ListDirBegin(); string fileName = dir.GetNext(); @@ -59,7 +67,7 @@ <methods> <method name="change_dir"> <return type="int" enum="Error" /> - <param index="0" name="todir" type="String" /> + <param index="0" name="to_dir" type="String" /> <description> Changes the currently opened directory to the one passed as an argument. The argument can be relative to the current directory (e.g. [code]newdir[/code] or [code]../newdir[/code]), or an absolute path (e.g. [code]/tmp/newdir[/code] or [code]res://somedir/newdir[/code]). Returns one of the [enum Error] code constants ([code]OK[/code] on success). @@ -69,11 +77,22 @@ <return type="int" enum="Error" /> <param index="0" name="from" type="String" /> <param index="1" name="to" type="String" /> + <param index="2" name="chmod_flags" type="int" default="-1" /> <description> Copies the [param from] file to the [param to] destination. Both arguments should be paths to files, either relative or absolute. If the destination file exists and is not access-protected, it will be overwritten. + If [param chmod_flags] is different than [code]-1[/code], the Unix permissions for the destination path will be set to the provided value, if available on the current operating system. Returns one of the [enum Error] code constants ([code]OK[/code] on success). </description> </method> + <method name="copy_absolute" qualifiers="static"> + <return type="int" enum="Error" /> + <param index="0" name="from" type="String" /> + <param index="1" name="to" type="String" /> + <param index="2" name="chmod_flags" type="int" default="-1" /> + <description> + Static version of [method copy]. Supports only absolute paths. + </description> + </method> <method name="current_is_dir" qualifiers="const"> <return type="bool" /> <description> @@ -85,7 +104,13 @@ <param index="0" name="path" type="String" /> <description> Returns whether the target directory exists. The argument can be relative to the current directory, or an absolute path. - If the [Directory] is not open, the path is relative to [code]res://[/code]. + </description> + </method> + <method name="dir_exists_absolute" qualifiers="static"> + <return type="bool" /> + <param index="0" name="path" type="String" /> + <description> + Static version of [method dir_exists]. Supports only absolute paths. </description> </method> <method name="file_exists"> @@ -93,11 +118,12 @@ <param index="0" name="path" type="String" /> <description> Returns whether the target file exists. The argument can be relative to the current directory, or an absolute path. - If the [Directory] is not open, the path is relative to [code]res://[/code]. + For a static equivalent, use [method FileAccess.file_exists]. </description> </method> - <method name="get_current_dir"> + <method name="get_current_dir" qualifiers="const"> <return type="String" /> + <param index="0" name="include_drive" type="bool" default="true" /> <description> Returns the absolute path to the currently opened directory (e.g. [code]res://folder[/code] or [code]C:\tmp\folder[/code]). </description> @@ -105,7 +131,7 @@ <method name="get_current_drive"> <return type="int" /> <description> - Returns the currently opened directory's drive index. See [method get_drive] to convert returned index to the name of the drive. + Returns the currently opened directory's drive index. See [method get_drive_name] to convert returned index to the name of the drive. </description> </method> <method name="get_directories"> @@ -115,17 +141,15 @@ Affected by [member include_hidden] and [member include_navigational]. </description> </method> - <method name="get_drive"> - <return type="String" /> - <param index="0" name="idx" type="int" /> + <method name="get_directories_at" qualifiers="static"> + <return type="PackedStringArray" /> + <param index="0" name="path" type="String" /> <description> - On Windows, returns the name of the drive (partition) passed as an argument (e.g. [code]C:[/code]). - On macOS, returns the path to the mounted volume passed as an argument. - On Linux, returns the path to the mounted volume or GTK 3 bookmark passed as an argument. - On other platforms, or if the requested drive does not exist, the method returns an empty String. + Returns a [PackedStringArray] containing filenames of the directory contents, excluding files, at the given [param path]. The array is sorted alphabetically. + Use [method get_directories] if you want more control of what gets included. </description> </method> - <method name="get_drive_count"> + <method name="get_drive_count" qualifiers="static"> <return type="int" /> <description> On Windows, returns the number of drives (partitions) mounted on the current filesystem. @@ -134,6 +158,16 @@ On other platforms, the method returns 0. </description> </method> + <method name="get_drive_name" qualifiers="static"> + <return type="String" /> + <param index="0" name="idx" type="int" /> + <description> + On Windows, returns the name of the drive (partition) passed as an argument (e.g. [code]C:[/code]). + On macOS, returns the path to the mounted volume passed as an argument. + On Linux, returns the path to the mounted volume or GTK 3 bookmark passed as an argument. + On other platforms, or if the requested drive does not exist, the method returns an empty String. + </description> + </method> <method name="get_files"> <return type="PackedStringArray" /> <description> @@ -141,17 +175,31 @@ Affected by [member include_hidden]. </description> </method> + <method name="get_files_at" qualifiers="static"> + <return type="PackedStringArray" /> + <param index="0" name="path" type="String" /> + <description> + Returns a [PackedStringArray] containing filenames of the directory contents, excluding directories, at the given [param path]. The array is sorted alphabetically. + Use [method get_files] if you want more control of what gets included. + </description> + </method> <method name="get_next"> <return type="String" /> <description> - Returns the next element (file or directory) in the current directory (including [code].[/code] and [code]..[/code], unless [code]skip_navigational[/code] was given to [method list_dir_begin]). - The name of the file or directory is returned (and not its full path). Once the stream has been fully processed, the method returns an empty String and closes the stream automatically (i.e. [method list_dir_end] would not be mandatory in such a case). + Returns the next element (file or directory) in the current directory. + The name of the file or directory is returned (and not its full path). Once the stream has been fully processed, the method returns an empty [String] and closes the stream automatically (i.e. [method list_dir_end] would not be mandatory in such a case). + </description> + </method> + <method name="get_open_error" qualifiers="static"> + <return type="int" enum="Error" /> + <description> + Returns the result of the last [method open] call in the current thread. </description> </method> <method name="get_space_left"> <return type="int" /> <description> - On UNIX desktop systems, returns the available space on the current directory's disk. On other platforms, this information is not available and the method returns 0 or -1. + Returns the available space on the current directory's disk, in bytes. Returns [code]0[/code] if the platform-specific method to query the available space fails. </description> </method> <method name="list_dir_begin"> @@ -176,6 +224,13 @@ Returns one of the [enum Error] code constants ([code]OK[/code] on success). </description> </method> + <method name="make_dir_absolute" qualifiers="static"> + <return type="int" enum="Error" /> + <param index="0" name="path" type="String" /> + <description> + Static version of [method make_dir]. Supports only absolute paths. + </description> + </method> <method name="make_dir_recursive"> <return type="int" enum="Error" /> <param index="0" name="path" type="String" /> @@ -184,12 +239,19 @@ Returns one of the [enum Error] code constants ([code]OK[/code] on success). </description> </method> - <method name="open"> + <method name="make_dir_recursive_absolute" qualifiers="static"> <return type="int" enum="Error" /> <param index="0" name="path" type="String" /> <description> - Opens an existing directory of the filesystem. The [param path] argument can be within the project tree ([code]res://folder[/code]), the user directory ([code]user://folder[/code]) or an absolute path of the user filesystem (e.g. [code]/tmp/folder[/code] or [code]C:\tmp\folder[/code]). - Returns one of the [enum Error] code constants ([code]OK[/code] on success). + Static version of [method make_dir_recursive]. Supports only absolute paths. + </description> + </method> + <method name="open" qualifiers="static"> + <return type="DirAccess" /> + <param index="0" name="path" type="String" /> + <description> + Creates a new [DirAccess] object and opens an existing directory of the filesystem. The [param path] argument can be within the project tree ([code]res://folder[/code]), the user directory ([code]user://folder[/code]) or an absolute path of the user filesystem (e.g. [code]/tmp/folder[/code] or [code]C:\tmp\folder[/code]). + Returns [code]null[/code] if opening the directory failed. You can use [method get_open_error] to check the error that occurred. </description> </method> <method name="remove"> @@ -201,6 +263,13 @@ Returns one of the [enum Error] code constants ([code]OK[/code] on success). </description> </method> + <method name="remove_absolute" qualifiers="static"> + <return type="int" enum="Error" /> + <param index="0" name="path" type="String" /> + <description> + Static version of [method remove]. Supports only absolute paths. + </description> + </method> <method name="rename"> <return type="int" enum="Error" /> <param index="0" name="from" type="String" /> @@ -210,13 +279,21 @@ Returns one of the [enum Error] code constants ([code]OK[/code] on success). </description> </method> + <method name="rename_absolute" qualifiers="static"> + <return type="int" enum="Error" /> + <param index="0" name="from" type="String" /> + <param index="1" name="to" type="String" /> + <description> + Static version of [method rename]. Supports only absolute paths. + </description> + </method> </methods> <members> - <member name="include_hidden" type="bool" setter="set_include_hidden" getter="get_include_hidden" default="false"> + <member name="include_hidden" type="bool" setter="set_include_hidden" getter="get_include_hidden"> If [code]true[/code], hidden files are included when the navigating directory. Affects [method list_dir_begin], [method get_directories] and [method get_files]. </member> - <member name="include_navigational" type="bool" setter="set_include_navigational" getter="get_include_navigational" default="false"> + <member name="include_navigational" type="bool" setter="set_include_navigational" getter="get_include_navigational"> If [code]true[/code], [code].[/code] and [code]..[/code] are included when navigating the directory. Affects [method list_dir_begin] and [method get_directories]. </member> diff --git a/doc/classes/DisplayServer.xml b/doc/classes/DisplayServer.xml index d22d64c276..6d3f3a7362 100644 --- a/doc/classes/DisplayServer.xml +++ b/doc/classes/DisplayServer.xml @@ -1324,6 +1324,7 @@ <param index="0" name="window_id" type="int" /> <param index="1" name="parent_window_id" type="int" /> <description> + Sets window transient parent. Transient window is will be destroyed with its transient parent and displayed on top of non-exclusive full-screen parent window. Transient windows can't enter full-screen mode. </description> </method> <method name="window_set_vsync_mode"> @@ -1336,6 +1337,15 @@ Depending on the platform and used renderer, the engine will fall back to [constant VSYNC_ENABLED], if the desired mode is not supported. </description> </method> + <method name="window_set_window_buttons_offset"> + <return type="void" /> + <param index="0" name="offset" type="Vector2i" /> + <param index="1" name="window_id" type="int" default="0" /> + <description> + When [constant WINDOW_FLAG_EXTEND_TO_TITLE] flag is set, set offset to the center of the first titlebar button. + [b]Note:[/b] This flag is implemented on macOS. + </description> + </method> <method name="window_set_window_event_callback"> <return type="void" /> <param index="0" name="callback" type="Callable" /> @@ -1509,7 +1519,8 @@ Window is floating above other regular windows. This flag is ignored for full-screen windows. </constant> <constant name="WINDOW_FLAG_TRANSPARENT" value="3" enum="WindowFlags"> - Window is will be destroyed with its transient parent and displayed on top of non-exclusive full-screen parent window. Transient windows can't enter full-screen mode. + Window background can be transparent. + [b]Note:[/b] This flag has no effect if [member ProjectSettings.display/window/per_pixel_transparency/allowed] is set to [code]false[/code]. </constant> <constant name="WINDOW_FLAG_NO_FOCUS" value="4" enum="WindowFlags"> Window can't be focused. No-focus window will ignore all input, except mouse clicks. @@ -1537,6 +1548,8 @@ </constant> <constant name="WINDOW_EVENT_DPI_CHANGE" value="6" enum="WindowEvent"> </constant> + <constant name="WINDOW_EVENT_TITLEBAR_CHANGE" value="7" enum="WindowEvent"> + </constant> <constant name="VSYNC_DISABLED" value="0" enum="VSyncMode"> No vertical synchronization, which means the engine will display frames as fast as possible (tearing may be visible). </constant> diff --git a/doc/classes/EditorImportPlugin.xml b/doc/classes/EditorImportPlugin.xml index 348347c4ef..c395815117 100644 --- a/doc/classes/EditorImportPlugin.xml +++ b/doc/classes/EditorImportPlugin.xml @@ -9,7 +9,7 @@ Below is an example EditorImportPlugin that imports a [Mesh] from a file with the extension ".special" or ".spec": [codeblocks] [gdscript] - tool + @tool extends EditorImportPlugin func _get_importer_name(): @@ -44,7 +44,7 @@ # Fill the Mesh with data read in "file", left as an exercise to the reader. var filename = save_path + "." + _get_save_extension() - return ResourceSaver.save(filename, mesh) + return ResourceSaver.save(mesh, filename) [/gdscript] [csharp] using Godot; @@ -103,7 +103,7 @@ var mesh = new ArrayMesh(); // Fill the Mesh with data read in "file", left as an exercise to the reader. String filename = savePath + "." + GetSaveExtension(); - return (int)ResourceSaver.Save(filename, mesh); + return (int)ResourceSaver.Save(mesh, filename); } } [/csharp] diff --git a/doc/classes/EditorInspector.xml b/doc/classes/EditorInspector.xml index 280a7bf34a..a1a43dd5bf 100644 --- a/doc/classes/EditorInspector.xml +++ b/doc/classes/EditorInspector.xml @@ -13,6 +13,14 @@ </description> <tutorials> </tutorials> + <methods> + <method name="get_selected_path" qualifiers="const"> + <return type="String" /> + <description> + Gets the path of the currently selected property. + </description> + </method> + </methods> <members> <member name="horizontal_scroll_mode" type="int" setter="set_horizontal_scroll_mode" getter="get_horizontal_scroll_mode" overrides="ScrollContainer" enum="ScrollContainer.ScrollMode" default="0" /> </members> diff --git a/doc/classes/EditorPlugin.xml b/doc/classes/EditorPlugin.xml index 3c0d3ec6be..27cf410c15 100644 --- a/doc/classes/EditorPlugin.xml +++ b/doc/classes/EditorPlugin.xml @@ -64,8 +64,8 @@ if event is InputEventMouseMotion: # Redraw viewport when cursor is moved. update_overlays() - return true - return false + return EditorPlugin.AFTER_GUI_INPUT_STOP + return EditorPlugin.AFTER_GUI_INPUT_PASS [/gdscript] [csharp] public override void _Forward3dDrawOverViewport(Godot.Control overlay) @@ -74,15 +74,15 @@ overlay.DrawCircle(overlay.GetLocalMousePosition(), 64, Colors.White); } - public override bool _Forward3dGuiInput(Godot.Camera3D camera, InputEvent @event) + public override EditorPlugin.AfterGUIInput _Forward3dGuiInput(Godot.Camera3D camera, InputEvent @event) { if (@event is InputEventMouseMotion) { // Redraw viewport when cursor is moved. UpdateOverlays(); - return true; + return EditorPlugin.AFTER_GUI_INPUT_STOP; } - return false; + return EditorPlugin.AFTER_GUI_INPUT_PASS; [/csharp] [/codeblocks] </description> @@ -100,33 +100,33 @@ <param index="0" name="viewport_camera" type="Camera3D" /> <param index="1" name="event" type="InputEvent" /> <description> - Called when there is a root node in the current edited scene, [method _handles] is implemented and an [InputEvent] happens in the 3D viewport. Intercepts the [InputEvent], if [code]return true[/code] [EditorPlugin] consumes the [param event], otherwise forwards [param event] to other Editor classes. Example: + Called when there is a root node in the current edited scene, [method _handles] is implemented, and an [InputEvent] happens in the 3D viewport. The return value decides whether the [InputEvent] is consumed or forwarded to other [EditorPlugin]s. See [enum AfterGUIInput] for options. Example: [codeblocks] [gdscript] - # Prevents the InputEvent to reach other Editor classes. + # Prevents the InputEvent from reaching other Editor classes. func _forward_3d_gui_input(camera, event): return EditorPlugin.AFTER_GUI_INPUT_STOP [/gdscript] [csharp] - // Prevents the InputEvent to reach other Editor classes. - public override bool _Forward3dGuiInput(Camera3D camera, InputEvent @event) + // Prevents the InputEvent from reaching other Editor classes. + public override EditorPlugin.AfterGUIInput _Forward3dGuiInput(Camera3D camera, InputEvent @event) { return EditorPlugin.AFTER_GUI_INPUT_STOP; } [/csharp] [/codeblocks] - Must [code]return false[/code] in order to forward the [InputEvent] to other Editor classes. Example: + Must [code]return EditorPlugin.AFTER_GUI_INPUT_PASS[/code] in order to forward the [InputEvent] to other Editor classes. Example: [codeblocks] [gdscript] # Consumes InputEventMouseMotion and forwards other InputEvent types. func _forward_3d_gui_input(camera, event): - return event is InputEventMouseMotion + return EditorPlugin.AFTER_GUI_INPUT_STOP if event is InputEventMouseMotion else EditorPlugin.AFTER_GUI_INPUT_PASS [/gdscript] [csharp] // Consumes InputEventMouseMotion and forwards other InputEvent types. - public override bool _Forward3dGuiInput(Camera3D camera, InputEvent @event) + public override EditorPlugin.AfterGUIInput _Forward3dGuiInput(Camera3D camera, InputEvent @event) { - return @event is InputEventMouseMotion; + return @event is InputEventMouseMotion ? EditorPlugin.AFTER_GUI_INPUT_STOP : EditorPlugin.AFTER_GUI_INPUT_PASS; } [/csharp] [/codeblocks] @@ -185,12 +185,12 @@ Called when there is a root node in the current edited scene, [method _handles] is implemented and an [InputEvent] happens in the 2D viewport. Intercepts the [InputEvent], if [code]return true[/code] [EditorPlugin] consumes the [param event], otherwise forwards [param event] to other Editor classes. Example: [codeblocks] [gdscript] - # Prevents the InputEvent to reach other Editor classes. + # Prevents the InputEvent from reaching other Editor classes. func _forward_canvas_gui_input(event): return true [/gdscript] [csharp] - // Prevents the InputEvent to reach other Editor classes. + // Prevents the InputEvent from reaching other Editor classes. public override bool ForwardCanvasGuiInput(InputEvent @event) { return true; @@ -237,7 +237,7 @@ # You can use a custom icon: return preload("res://addons/my_plugin/my_plugin_icon.svg") # Or use a built-in icon: - return get_editor_interface().get_base_control().get_icon("Node", "EditorIcons") + return get_editor_interface().get_base_control().get_theme_icon("Node", "EditorIcons") [/gdscript] [csharp] public override Texture2D GetPluginIcon() @@ -245,7 +245,7 @@ // You can use a custom icon: return ResourceLoader.Load<Texture2D>("res://addons/my_plugin/my_plugin_icon.svg"); // Or use a built-in icon: - return GetEditorInterface().GetBaseControl().GetIcon("Node", "EditorIcons"); + return GetEditorInterface().GetBaseControl().GetThemeIcon("Node", "EditorIcons"); } [/csharp] [/codeblocks] @@ -755,5 +755,14 @@ <constant name="DOCK_SLOT_MAX" value="8" enum="DockSlot"> Represents the size of the [enum DockSlot] enum. </constant> + <constant name="AFTER_GUI_INPUT_PASS" value="0" enum="AfterGUIInput"> + Forwards the [InputEvent] to other EditorPlugins. + </constant> + <constant name="AFTER_GUI_INPUT_STOP" value="1" enum="AfterGUIInput"> + Prevents the [InputEvent] from reaching other Editor classes. + </constant> + <constant name="AFTER_GUI_INPUT_CUSTOM" value="2" enum="AfterGUIInput"> + Pass the [InputEvent] to other editor plugins except the main [Node3D] one. This can be used to prevent node selection changes and work with sub-gizmos instead. + </constant> </constants> </class> diff --git a/doc/classes/EditorProperty.xml b/doc/classes/EditorProperty.xml index 7bac4bf7ac..9170c449bf 100644 --- a/doc/classes/EditorProperty.xml +++ b/doc/classes/EditorProperty.xml @@ -9,6 +9,13 @@ <tutorials> </tutorials> <methods> + <method name="_set_read_only" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="read_only" type="bool" /> + <description> + Called when the read-only status of the property is changed. It may be used to change custom controls into a read-only or modifiable state. + </description> + </method> <method name="_update_property" qualifiers="virtual"> <return type="void" /> <description> diff --git a/doc/classes/EditorScenePostImport.xml b/doc/classes/EditorScenePostImport.xml index 395b094bf2..2bf2accf17 100644 --- a/doc/classes/EditorScenePostImport.xml +++ b/doc/classes/EditorScenePostImport.xml @@ -8,7 +8,7 @@ The [method _post_import] callback receives the imported scene's root node and returns the modified version of the scene. Usage example: [codeblocks] [gdscript] - tool # Needed so it runs in editor. + @tool # Needed so it runs in editor. extends EditorScenePostImport # This sample changes all node names. # Called right after the scene is imported and gets the root node. diff --git a/doc/classes/EditorScript.xml b/doc/classes/EditorScript.xml index 2ff8a7ba2a..dfc04c9cde 100644 --- a/doc/classes/EditorScript.xml +++ b/doc/classes/EditorScript.xml @@ -9,7 +9,7 @@ [b]Example script:[/b] [codeblocks] [gdscript] - tool + @tool extends EditorScript func _run(): diff --git a/doc/classes/EditorSettings.xml b/doc/classes/EditorSettings.xml index 329cd3fe63..7f3ffce9b7 100644 --- a/doc/classes/EditorSettings.xml +++ b/doc/classes/EditorSettings.xml @@ -314,8 +314,8 @@ <member name="editors/3d/navigation/navigation_scheme" type="int" setter="" getter=""> The navigation scheme to use in the 3D editor. Changing this setting will affect the mouse buttons that must be held down to perform certain operations in the 3D editor viewport. - [b]Godot[/b] Middle mouse button to orbit, [kbd]Shift + Middle mouse button[/kbd] to pan. [kbd]Mouse wheel[/kbd] to zoom. - - [b]Maya:[/b] [kbd]Alt + Left mouse buttton[/kbd] to orbit. [kbd]Middle mouse button[/kbd] to pan, [kbd]Shift + Middle mouse button[/kbd] to pan 10 times faster. [kbd]Mouse wheel[/kbd] to zoom. - - [b]Modo:[/b] [kbd]Alt + Left mouse buttton[/kbd] to orbit. [kbd]Alt + Shift + Left mouse button[/kbd] to pan. [kbd]Ctrl + Alt + Left mouse button[/kbd] to zoom. + - [b]Maya:[/b] [kbd]Alt + Left mouse button[/kbd] to orbit. [kbd]Middle mouse button[/kbd] to pan, [kbd]Shift + Middle mouse button[/kbd] to pan 10 times faster. [kbd]Mouse wheel[/kbd] to zoom. + - [b]Modo:[/b] [kbd]Alt + Left mouse button[/kbd] to orbit. [kbd]Alt + Shift + Left mouse button[/kbd] to pan. [kbd]Ctrl + Alt + Left mouse button[/kbd] to zoom. See also [member editors/3d/freelook/freelook_navigation_scheme]. [b]Note:[/b] On certain window managers on Linux, the [kbd]Alt[/kbd] key will be intercepted by the window manager when clicking a mouse button at the same time. This means Godot will not see the modifier key as being pressed. </member> @@ -405,7 +405,7 @@ If [code]true[/code], allows panning by holding down [kbd]Space[/kbd] in the 2D editor viewport (in addition to panning with the middle or right mouse buttons). If [code]false[/code], the left mouse button must be held down while holding down [kbd]Space[/kbd] to pan in the 2D editor viewport. </member> <member name="editors/panning/sub_editors_panning_scheme" type="int" setter="" getter=""> - Controls whether the mouse wheel scroll zooms or pans in subeditors. The list of affected subeditors is: animation blend tree editor, [Polygon2D] editor, tileset editor, texture region editor, visual shader editor and visual script editor. See also [member editors/panning/2d_editor_panning_scheme] and [member editors/panning/animation_editors_panning_scheme]. + Controls whether the mouse wheel scroll zooms or pans in subeditors. The list of affected subeditors is: animation blend tree editor, [Polygon2D] editor, tileset editor, texture region editor and visual shader editor. See also [member editors/panning/2d_editor_panning_scheme] and [member editors/panning/animation_editors_panning_scheme]. </member> <member name="editors/panning/warped_mouse_panning" type="bool" setter="" getter=""> If [code]true[/code], warps the mouse around the 2D viewport while panning in the 2D editor. This makes it possible to pan over a large area without having to exit panning then mouse the mouse back constantly. @@ -424,10 +424,10 @@ [b]Note:[/b] Only effective if [member editors/tiles_editor/display_grid] is [code]true[/code]. </member> <member name="editors/visual_editors/lines_curvature" type="float" setter="" getter=""> - The curvature to use for connection lines in the visual script and visual shader editors. Higher values will make connection lines appear more curved, with values above [code]0.5[/code] resulting in more "angular" turns in the middle of connection lines. + The curvature to use for connection lines in the visual shader editor. Higher values will make connection lines appear more curved, with values above [code]0.5[/code] resulting in more "angular" turns in the middle of connection lines. </member> <member name="editors/visual_editors/minimap_opacity" type="float" setter="" getter=""> - The opacity of the minimap displayed in the bottom-right corner of the visual script and visual shader editors. + The opacity of the minimap displayed in the bottom-right corner of the visual shader editor. </member> <member name="editors/visual_editors/visual_shader/port_preview_size" type="int" setter="" getter=""> The size to use for port previews in the visual shader uniforms (toggled by clicking the "eye" icon next to an output). The value is defined in pixels at 100% zoom, and will scale with zoom automatically. diff --git a/doc/classes/EditorTranslationParserPlugin.xml b/doc/classes/EditorTranslationParserPlugin.xml index d028996db8..df10c645ef 100644 --- a/doc/classes/EditorTranslationParserPlugin.xml +++ b/doc/classes/EditorTranslationParserPlugin.xml @@ -11,7 +11,7 @@ Below shows an example of a custom parser that extracts strings from a CSV file to write into a POT. [codeblocks] [gdscript] - tool + @tool extends EditorTranslationParserPlugin func _parse_file(path, msgids, msgids_context_plural): @@ -72,7 +72,7 @@ msgidsContextPlural.Add(new Godot.Collections.Array{"Only with context", "a friendly context", ""}); [/csharp] [/codeblocks] - [b]Note:[/b] If you override parsing logic for standard script types (GDScript, C#, etc.), it would be better to load the [code]path[/code] argument using [method ResourceLoader.load]. This is because built-in scripts are loaded as [Resource] type, not [File] type. + [b]Note:[/b] If you override parsing logic for standard script types (GDScript, C#, etc.), it would be better to load the [code]path[/code] argument using [method ResourceLoader.load]. This is because built-in scripts are loaded as [Resource] type, not [FileAccess] type. For example: [codeblocks] [gdscript] diff --git a/doc/classes/Engine.xml b/doc/classes/Engine.xml index 301a3e55fb..2b8663e039 100644 --- a/doc/classes/Engine.xml +++ b/doc/classes/Engine.xml @@ -14,12 +14,20 @@ <description> Returns the name of the CPU architecture the Godot binary was built for. Possible return values are [code]x86_64[/code], [code]x86_32[/code], [code]arm64[/code], [code]armv7[/code], [code]rv64[/code], [code]riscv[/code], [code]ppc64[/code], [code]ppc[/code], [code]wasm64[/code] and [code]wasm32[/code]. To detect whether the current CPU architecture is 64-bit, you can use the fact that all 64-bit architecture names have [code]64[/code] in their name: - [codeblock] + [codeblocks] + [gdscript] if "64" in Engine.get_architecture_name(): print("Running on 64-bit CPU.") else: print("Running on 32-bit CPU.") - [/codeblock] + [/gdscript] + [csharp] + if (Engine.GetArchitectureName().Contains("64")) + GD.Print("Running on 64-bit CPU."); + else + GD.Print("Running on 32-bit CPU."); + [/csharp] + [/codeblocks] [b]Note:[/b] [method get_architecture_name] does [i]not[/i] return the name of the host CPU architecture. For example, if running an x86_32 Godot binary on a x86_64 system, the returned value will be [code]x86_32[/code]. </description> </method> @@ -83,11 +91,24 @@ <description> Returns the total number of frames passed since engine initialization which is advanced on each [b]physics frame[/b]. See also [method get_process_frames]. [method get_physics_frames] can be used to run expensive logic less often without relying on a [Timer]: - [codeblock] + [codeblocks] + [gdscript] func _physics_process(_delta): if Engine.get_physics_frames() % 2 == 0: pass # Run expensive logic only once every 2 physics frames here. - [/codeblock] + [/gdscript] + [csharp] + public override void _PhysicsProcess(double delta) + { + base._PhysicsProcess(delta); + + if (Engine.GetPhysicsFrames() % 2 == 0) + { + // Run expensive logic only once every 2 physics frames here. + } + } + [/csharp] + [/codeblocks] </description> </method> <method name="get_physics_interpolation_fraction" qualifiers="const"> @@ -101,11 +122,24 @@ <description> Returns the total number of frames passed since engine initialization which is advanced on each [b]process frame[/b], regardless of whether the render loop is enabled. See also [method get_frames_drawn] and [method get_physics_frames]. [method get_process_frames] can be used to run expensive logic less often without relying on a [Timer]: - [codeblock] + [codeblocks] + [gdscript] func _process(_delta): if Engine.get_process_frames() % 2 == 0: pass # Run expensive logic only once every 2 process (render) frames here. - [/codeblock] + [/gdscript] + [csharp] + public override void _Process(double delta) + { + base._Process(delta); + + if (Engine.GetProcessFrames() % 2 == 0) + { + // Run expensive logic only once every 2 physics frames here. + } + } + [/csharp] + [/codeblocks] </description> </method> <method name="get_script_language" qualifiers="const"> @@ -182,12 +216,20 @@ <return type="bool" /> <description> Returns [code]true[/code] if the script is currently running inside the editor, [code]false[/code] otherwise. This is useful for [code]@tool[/code] scripts to conditionally draw editor helpers, or prevent accidentally running "game" code that would affect the scene state while in the editor: - [codeblock] + [codeblocks] + [gdscript] if Engine.is_editor_hint(): draw_gizmos() else: simulate_physics() - [/codeblock] + [/gdscript] + [csharp] + if (Engine.IsEditorHint()) + DrawGizmos(); + else + SimulatePhysics(); + [/csharp] + [/codeblocks] See [url=$DOCS_URL/tutorials/plugins/running_code_in_the_editor.html]Running code in the editor[/url] in the documentation for more information. [b]Note:[/b] To detect whether the script is run from an editor [i]build[/i] (e.g. when pressing [kbd]F5[/kbd]), use [method OS.has_feature] with the [code]"editor"[/code] argument instead. [code]OS.has_feature("editor")[/code] will evaluate to [code]true[/code] both when the code is running in the editor and when running the project from the editor, but it will evaluate to [code]false[/code] when the code is run from an exported project. </description> @@ -219,12 +261,20 @@ </method> </methods> <members> + <member name="max_fps" type="int" setter="set_max_fps" getter="get_max_fps" default="0"> + The maximum number of frames per second that can be rendered. A value of [code]0[/code] means "no limit". The actual number of frames per second may still be below this value if the CPU or GPU cannot keep up with the project logic and rendering. + Limiting the FPS can be useful to reduce system power consumption, which reduces heat and noise emissions (and improves battery life on mobile devices). + If [member ProjectSettings.display/window/vsync/vsync_mode] is [code]Enabled[/code] or [code]Adaptive[/code], it takes precedence and the forced FPS number cannot exceed the monitor's refresh rate. + If [member ProjectSettings.display/window/vsync/vsync_mode] is [code]Enabled[/code], on monitors with variable refresh rate enabled (G-Sync/FreeSync), using a FPS limit a few frames lower than the monitor's refresh rate will [url=https://blurbusters.com/howto-low-lag-vsync-on/]reduce input lag while avoiding tearing[/url]. + If [member ProjectSettings.display/window/vsync/vsync_mode] is [code]Disabled[/code], limiting the FPS to a high value that can be consistently reached on the system can reduce input lag compared to an uncapped framerate. Since this works by ensuring the GPU load is lower than 100%, this latency reduction is only effective in GPU-bottlenecked scenarios, not CPU-bottlenecked scenarios. + See also [member physics_ticks_per_second] and [member ProjectSettings.application/run/max_fps]. + </member> <member name="physics_jitter_fix" type="float" setter="set_physics_jitter_fix" getter="get_physics_jitter_fix" default="0.5"> Controls how much physics ticks are synchronized with real time. For 0 or less, the ticks are synchronized. Such values are recommended for network games, where clock synchronization matters. Higher values cause higher deviation of the in-game clock and real clock but smooth out framerate jitters. The default value of 0.5 should be fine for most; values above 2 could cause the game to react to dropped frames with a noticeable delay and are not recommended. [b]Note:[/b] For best results, when using a custom physics interpolation solution, the physics jitter fix should be disabled by setting [member physics_jitter_fix] to [code]0[/code]. </member> <member name="physics_ticks_per_second" type="int" setter="set_physics_ticks_per_second" getter="get_physics_ticks_per_second" default="60"> - The number of fixed iterations per second. This controls how often physics simulation and [method Node._physics_process] methods are run. This value should generally always be set to [code]60[/code] or above, as Godot doesn't interpolate the physics step. As a result, values lower than [code]60[/code] will look stuttery. This value can be increased to make input more reactive or work around collision tunneling issues, but keep in mind doing so will increase CPU usage. See also [member target_fps] and [member ProjectSettings.physics/common/physics_ticks_per_second]. + The number of fixed iterations per second. This controls how often physics simulation and [method Node._physics_process] methods are run. This value should generally always be set to [code]60[/code] or above, as Godot doesn't interpolate the physics step. As a result, values lower than [code]60[/code] will look stuttery. This value can be increased to make input more reactive or work around collision tunneling issues, but keep in mind doing so will increase CPU usage. See also [member max_fps] and [member ProjectSettings.physics/common/physics_ticks_per_second]. [b]Note:[/b] Only 8 physics ticks may be simulated per rendered frame at most. If more than 8 physics ticks have to be simulated per rendered frame to keep up with rendering, the game will appear to slow down (even if [code]delta[/code] is used consistently in physics calculations). Therefore, it is recommended not to increase [member physics_ticks_per_second] above 240. Otherwise, the game will slow down when the rendering framerate goes below 30 FPS. </member> <member name="print_error_messages" type="bool" setter="set_print_error_messages" getter="is_printing_error_messages" default="true"> @@ -232,9 +282,6 @@ [b]Warning:[/b] If you set this to [code]false[/code] anywhere in the project, important error messages may be hidden even if they are emitted from other scripts. If this is set to [code]false[/code] in a [code]@tool[/code] script, this will also impact the editor itself. Do [i]not[/i] report bugs before ensuring error messages are enabled (as they are by default). [b]Note:[/b] This property does not impact the editor's Errors tab when running a project from the editor. </member> - <member name="target_fps" type="int" setter="set_target_fps" getter="get_target_fps" default="0"> - The desired frames per second. If the hardware cannot keep up, this setting may not be respected. A value of 0 means no limit. See also [member physics_ticks_per_second] and [member ProjectSettings.debug/settings/fps/force_fps]. - </member> <member name="time_scale" type="float" setter="set_time_scale" getter="get_time_scale" default="1.0"> Controls how fast or slow the in-game clock ticks versus the real life one. It defaults to 1.0. A value of 2.0 means the game moves twice as fast as real life, whilst a value of 0.5 means the game moves at half the regular speed. </member> diff --git a/doc/classes/Environment.xml b/doc/classes/Environment.xml index 695f2cbc66..243a28e73d 100644 --- a/doc/classes/Environment.xml +++ b/doc/classes/Environment.xml @@ -86,7 +86,7 @@ This is useful to simulate [url=https://en.wikipedia.org/wiki/Aerial_perspective]aerial perspective[/url] in large scenes with low density fog. However, it is not very useful for high-density fog, as the sky will shine through. When set to [code]1.0[/code], the fog color comes completely from the [Sky]. If set to [code]0.0[/code], aerial perspective is disabled. </member> <member name="fog_density" type="float" setter="set_fog_density" getter="get_fog_density" default="0.01"> - The exponential fog density to use. Higher values result in a more dense fog. + The [i]exponential[/i] fog density to use. Higher values result in a more dense fog. Fog rendering is exponential as in real life. </member> <member name="fog_enabled" type="bool" setter="set_fog_enabled" getter="is_fog_enabled" default="false"> If [code]true[/code], fog effects are enabled. @@ -292,13 +292,15 @@ The [Color] of the volumetric fog when interacting with lights. Mist and fog have an albedo close to [code]Color(1, 1, 1, 1)[/code] while smoke has a darker albedo. </member> <member name="volumetric_fog_ambient_inject" type="float" setter="set_volumetric_fog_ambient_inject" getter="get_volumetric_fog_ambient_inject" default="0.0"> - Scales the strength of ambient light used in the volumetric fog. A value of [code]0[/code] means that ambient light will not impact the volumetric fog. + Scales the strength of ambient light used in the volumetric fog. A value of [code]0.0[/code] means that ambient light will not impact the volumetric fog. [member volumetric_fog_ambient_inject] has a small performance cost when set above [code]0.0[/code]. + [b]Note:[/b] This has no visible effect if [member volumetric_fog_density] is [code]0.0[/code] or if [member volumetric_fog_albedo] is a fully black color. </member> <member name="volumetric_fog_anisotropy" type="float" setter="set_volumetric_fog_anisotropy" getter="get_volumetric_fog_anisotropy" default="0.2"> - The direction of scattered light as it goes through the volumetric fog. A value close [code]1[/code] means almost all light is scattered forward. A value close to [code]0[/code] means light is scattered equally in all directions. A value close to [code]-1[/code] means light is scattered mostly backward. Fog and mist scatter light slightly forward, while smoke scatters light equally in all directions. + The direction of scattered light as it goes through the volumetric fog. A value close to [code]1.0[/code] means almost all light is scattered forward. A value close to [code]0.0[/code] means light is scattered equally in all directions. A value close to [code]-1.0[/code] means light is scattered mostly backward. Fog and mist scatter light slightly forward, while smoke scatters light equally in all directions. </member> <member name="volumetric_fog_density" type="float" setter="set_volumetric_fog_density" getter="get_volumetric_fog_density" default="0.05"> - The base density of the volumetric fog. Set this to the lowest density you want to have globally. + The base [i]exponential[/i] density of the volumetric fog. Set this to the lowest density you want to have globally. [FogVolume]s can be used to add to or subtract from this density in specific areas. Fog rendering is exponential as in real life. + A value of [code]0.0[/code] disables global volumetric fog while allowing [FogVolume]s to display volumetric fog in specific areas. </member> <member name="volumetric_fog_detail_spread" type="float" setter="set_volumetric_fog_detail_spread" getter="get_volumetric_fog_detail_spread" default="2.0"> The distribution of size down the length of the froxel buffer. A higher value compresses the froxels closer to the camera and places more detail closer to the camera. @@ -311,22 +313,25 @@ </member> <member name="volumetric_fog_enabled" type="bool" setter="set_volumetric_fog_enabled" getter="is_volumetric_fog_enabled" default="false"> Enables the volumetric fog effect. Volumetric fog uses a screen-aligned froxel buffer to calculate accurate volumetric scattering in the short to medium range. Volumetric fog interacts with [FogVolume]s and lights to calculate localized and global fog. Volumetric fog uses a PBR single-scattering model based on extinction, scattering, and emission which it exposes to users as density, albedo, and emission. + [b]Note:[/b] Volumetric fog is only available in the forward plus renderer. It is not available in the mobile renderer or the compatibility renderer. </member> <member name="volumetric_fog_gi_inject" type="float" setter="set_volumetric_fog_gi_inject" getter="get_volumetric_fog_gi_inject" default="1.0"> - Scales the strength of Global Illumination used in the volumetric fog. A value of [code]0.0[/code] means that Global Illumination will not impact the volumetric fog. + Scales the strength of Global Illumination used in the volumetric fog's albedo color. A value of [code]0.0[/code] means that Global Illumination will not impact the volumetric fog. [member volumetric_fog_gi_inject] has a small performance cost when set above [code]0.0[/code]. + [b]Note:[/b] This has no visible effect if [member volumetric_fog_density] is [code]0.0[/code] or if [member volumetric_fog_albedo] is a fully black color. [b]Note:[/b] Only [VoxelGI] and SDFGI ([member Environment.sdfgi_enabled]) are taken into account when using [member volumetric_fog_gi_inject]. Global illumination from [LightmapGI], [ReflectionProbe] and SSIL (see [member ssil_enabled]) will be ignored by volumetric fog. </member> <member name="volumetric_fog_length" type="float" setter="set_volumetric_fog_length" getter="get_volumetric_fog_length" default="64.0"> - The distance over which the volumetric fog is computed. Increase to compute fog over a greater range, decrease to add more detail when a long range is not needed. For best quality fog, keep this as low as possible. + The distance over which the volumetric fog is computed. Increase to compute fog over a greater range, decrease to add more detail when a long range is not needed. For best quality fog, keep this as low as possible. See also [member ProjectSettings.rendering/environment/volumetric_fog/volume_depth]. </member> <member name="volumetric_fog_sky_affect" type="float" setter="set_volumetric_fog_sky_affect" getter="get_volumetric_fog_sky_affect" default="1.0"> The factor to use when affecting the sky with volumetric fog. [code]1.0[/code] means that volumetric fog can fully obscure the sky. Lower values reduce the impact of volumetric fog on sky rendering, with [code]0.0[/code] not affecting sky rendering at all. + [b]Note:[/b] [member volumetric_fog_sky_affect] also affects [FogVolume]s, even if [member volumetric_fog_density] is [code]0.0[/code]. If you notice [FogVolume]s are disappearing when looking towards the sky, set [member volumetric_fog_sky_affect] to [code]1.0[/code]. </member> <member name="volumetric_fog_temporal_reprojection_amount" type="float" setter="set_volumetric_fog_temporal_reprojection_amount" getter="get_volumetric_fog_temporal_reprojection_amount" default="0.9"> The amount by which to blend the last frame with the current frame. A higher number results in smoother volumetric fog, but makes "ghosting" much worse. A lower value reduces ghosting but can result in the per-frame temporal jitter becoming visible. </member> <member name="volumetric_fog_temporal_reprojection_enabled" type="bool" setter="set_volumetric_fog_temporal_reprojection_enabled" getter="is_volumetric_fog_temporal_reprojection_enabled" default="true"> - Enables temporal reprojection in the volumetric fog. Temporal reprojection blends the current frame's volumetric fog with the last frame's volumetric fog to smooth out jagged edges. The performance cost is minimal, however it does lead to moving [FogVolume]s and [Light3D]s "ghosting" and leaving a trail behind them. When temporal reprojection is enabled, try to avoid moving [FogVolume]s or [Light3D]s too fast. + Enables temporal reprojection in the volumetric fog. Temporal reprojection blends the current frame's volumetric fog with the last frame's volumetric fog to smooth out jagged edges. The performance cost is minimal; however, it leads to moving [FogVolume]s and [Light3D]s "ghosting" and leaving a trail behind them. When temporal reprojection is enabled, try to avoid moving [FogVolume]s or [Light3D]s too fast. Short-lived dynamic lighting effects should have [member Light3D.light_volumetric_fog_energy] set to [code]0.0[/code] to avoid ghosting. </member> </members> <constants> diff --git a/doc/classes/File.xml b/doc/classes/FileAccess.xml index 76c6a4871c..e52f897164 100644 --- a/doc/classes/File.xml +++ b/doc/classes/FileAccess.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="File" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="FileAccess" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> Type to handle file reading and writing operations. </brief_description> @@ -9,39 +9,42 @@ [codeblocks] [gdscript] func save(content): - var file = File.new() - file.open("user://save_game.dat", File.WRITE) + var file = FileAccess.open("user://save_game.dat", FileAccess.WRITE) file.store_string(content) - file.close() func load(): - var file = File.new() - file.open("user://save_game.dat", File.READ) + var file = FileAccess.open("user://save_game.dat", FileAccess.READ) var content = file.get_as_text() - file.close() return content [/gdscript] [csharp] public void Save(string content) { - var file = new File(); - file.Open("user://save_game.dat", File.ModeFlags.Write); + using var file = FileAccess.Open("user://save_game.dat", FileAccess.ModeFlags.Write); file.StoreString(content); - file.Close(); } public string Load() { - var file = new File(); - file.Open("user://save_game.dat", File.ModeFlags.Read); + using var file = FileAccess.Open("user://save_game.dat", FileAccess.ModeFlags.Read); string content = file.GetAsText(); - file.Close(); return content; } [/csharp] [/codeblocks] In the example above, the file will be saved in the user data folder as specified in the [url=$DOCS_URL/tutorials/io/data_paths.html]Data paths[/url] documentation. - [b]Note:[/b] To access project resources once exported, it is recommended to use [ResourceLoader] instead of the [File] API, as some files are converted to engine-specific formats and their original source files might not be present in the exported PCK package. + There is no method to close a file in order to free it from use. Instead, [FileAccess] will close when it's freed, which happens when it goes out of scope or when it gets assigned with [code]null[/code]. In C# the reference must be disposed after we are done using it, this can be done with the [code]using[/code] statement or calling the [code]Dispose[/code] method directly. + [codeblocks] + [gdscript] + var file = FileAccess.open("res://something") # File is opened and locked for use. + file = null # File is closed. + [/gdscript] + [csharp] + using var file = FileAccess.Open("res://something"); // File is opened and locked for use. + // The using statement calls Dispose when going out of scope. + [/csharp] + [/codeblocks] + [b]Note:[/b] To access project resources once exported, it is recommended to use [ResourceLoader] instead of the [FileAccess] API, as some files are converted to engine-specific formats and their original source files might not be present in the exported PCK package. [b]Note:[/b] Files are automatically closed only if the process exits "normally" (such as by clicking the window manager's close button or pressing [b]Alt + F4[/b]). If you stop the project execution by pressing [b]F8[/b] while the project is running, the file won't be closed as the game process will be killed. You can work around this by calling [method flush] at regular intervals. </description> <tutorials> @@ -49,12 +52,6 @@ <link title="3D Voxel Demo">https://godotengine.org/asset-library/asset/676</link> </tutorials> <methods> - <method name="close"> - <return type="void" /> - <description> - Closes the currently opened file and prevents subsequent read/write operations. Use [method flush] to persist the data to disk without closing the file. - </description> - </method> <method name="eof_reached" qualifiers="const"> <return type="bool" /> <description> @@ -80,12 +77,13 @@ <description> Returns [code]true[/code] if the file exists in the given path. [b]Note:[/b] Many resources types are imported (e.g. textures or sound files), and their source asset will not be included in the exported game, as only the imported version is used. See [method ResourceLoader.exists] for an alternative approach that takes resource remapping into account. + For a non-static, relative equivalent, use [method DirAccess.file_exists]. </description> </method> <method name="flush"> <return type="void" /> <description> - Writes the file's buffer to disk. Flushing is automatically performed when the file is closed. This means you don't need to call [method flush] manually before closing a file using [method close]. Still, calling [method flush] can be used to ensure the data is safe even if the project crashes instead of being closed gracefully. + Writes the file's buffer to disk. Flushing is automatically performed when the file is closed. This means you don't need to call [method flush] manually before closing a file. Still, calling [method flush] can be used to ensure the data is safe even if the project crashes instead of being closed gracefully. [b]Note:[/b] Only call [method flush] when you actually need it. Otherwise, it will decrease performance due to constant disk writes. </description> </method> @@ -174,20 +172,26 @@ Text is interpreted as being UTF-8 encoded. </description> </method> - <method name="get_md5" qualifiers="const"> + <method name="get_md5" qualifiers="static"> <return type="String" /> <param index="0" name="path" type="String" /> <description> Returns an MD5 String representing the file at the given path or an empty [String] on failure. </description> </method> - <method name="get_modified_time" qualifiers="const"> + <method name="get_modified_time" qualifiers="static"> <return type="int" /> <param index="0" name="file" type="String" /> <description> Returns the last time the [param file] was modified in Unix timestamp format or returns a [String] "ERROR IN [code]file[/code]". This Unix timestamp can be converted to another format using the [Time] singleton. </description> </method> + <method name="get_open_error" qualifiers="static"> + <return type="int" enum="Error" /> + <description> + Returns the result of the last [method open] call in the current thread. + </description> + </method> <method name="get_pascal_string"> <return type="String" /> <description> @@ -219,7 +223,7 @@ Returns the next bits from the file as a floating-point number. </description> </method> - <method name="get_sha256" qualifiers="const"> + <method name="get_sha256" qualifiers="static"> <return type="String" /> <param index="0" name="path" type="String" /> <description> @@ -240,41 +244,45 @@ Returns [code]true[/code] if the file is currently opened. </description> </method> - <method name="open"> - <return type="int" enum="Error" /> + <method name="open" qualifiers="static"> + <return type="FileAccess" /> <param index="0" name="path" type="String" /> - <param index="1" name="flags" type="int" enum="File.ModeFlags" /> + <param index="1" name="flags" type="int" enum="FileAccess.ModeFlags" /> <description> - Opens the file for writing or reading, depending on the flags. + Creates a new [FileAccess] object and opens the file for writing or reading, depending on the flags. + Returns [code]null[/code] if opening the file failed. You can use [method get_open_error] to check the error that occurred. </description> </method> - <method name="open_compressed"> - <return type="int" enum="Error" /> + <method name="open_compressed" qualifiers="static"> + <return type="FileAccess" /> <param index="0" name="path" type="String" /> - <param index="1" name="mode_flags" type="int" enum="File.ModeFlags" /> - <param index="2" name="compression_mode" type="int" enum="File.CompressionMode" default="0" /> + <param index="1" name="mode_flags" type="int" enum="FileAccess.ModeFlags" /> + <param index="2" name="compression_mode" type="int" enum="FileAccess.CompressionMode" default="0" /> <description> - Opens a compressed file for reading or writing. + Creates a new [FileAccess] object and opens a compressed file for reading or writing. [b]Note:[/b] [method open_compressed] can only read files that were saved by Godot, not third-party compression formats. See [url=https://github.com/godotengine/godot/issues/28999]GitHub issue #28999[/url] for a workaround. + Returns [code]null[/code] if opening the file failed. You can use [method get_open_error] to check the error that occurred. </description> </method> - <method name="open_encrypted"> - <return type="int" enum="Error" /> + <method name="open_encrypted" qualifiers="static"> + <return type="FileAccess" /> <param index="0" name="path" type="String" /> - <param index="1" name="mode_flags" type="int" enum="File.ModeFlags" /> + <param index="1" name="mode_flags" type="int" enum="FileAccess.ModeFlags" /> <param index="2" name="key" type="PackedByteArray" /> <description> - Opens an encrypted file in write or read mode. You need to pass a binary key to encrypt/decrypt it. + Creates a new [FileAccess] object and opens an encrypted file in write or read mode. You need to pass a binary key to encrypt/decrypt it. [b]Note:[/b] The provided key must be 32 bytes long. + Returns [code]null[/code] if opening the file failed. You can use [method get_open_error] to check the error that occurred. </description> </method> - <method name="open_encrypted_with_pass"> - <return type="int" enum="Error" /> + <method name="open_encrypted_with_pass" qualifiers="static"> + <return type="FileAccess" /> <param index="0" name="path" type="String" /> - <param index="1" name="mode_flags" type="int" enum="File.ModeFlags" /> + <param index="1" name="mode_flags" type="int" enum="FileAccess.ModeFlags" /> <param index="2" name="pass" type="String" /> <description> - Opens an encrypted file in write or read mode. You need to pass a password to encrypt/decrypt it. + Creates a new [FileAccess] object and opens an encrypted file in write or read mode. You need to pass a password to encrypt/decrypt it. + Returns [code]null[/code] if opening the file failed. You can use [method get_open_error] to check the error that occurred. </description> </method> <method name="seek"> @@ -308,8 +316,7 @@ return (unsigned + MAX_15B) % MAX_16B - MAX_15B func _ready(): - var f = File.new() - f.open("user://file.dat", File.WRITE_READ) + var f = FileAccess.open("user://file.dat", FileAccess.WRITE_READ) f.store_16(-42) # This wraps around and stores 65494 (2^16 - 42). f.store_16(121) # In bounds, will store 121. f.seek(0) # Go back to start to read the stored value. @@ -321,8 +328,7 @@ [csharp] public override void _Ready() { - var f = new File(); - f.Open("user://file.dat", File.ModeFlags.WriteRead); + using var f = FileAccess.Open("user://file.dat", FileAccess.ModeFlags.WriteRead); f.Store16(unchecked((ushort)-42)); // This wraps around and stores 65494 (2^16 - 42). f.Store16(121); // In bounds, will store 121. f.Seek(0); // Go back to start to read the stored value. @@ -432,7 +438,7 @@ </method> </methods> <members> - <member name="big_endian" type="bool" setter="set_big_endian" getter="is_big_endian" default="false"> + <member name="big_endian" type="bool" setter="set_big_endian" getter="is_big_endian"> If [code]true[/code], the file is read with big-endian [url=https://en.wikipedia.org/wiki/Endianness]endianness[/url]. If [code]false[/code], the file is read with little-endian endianness. If in doubt, leave this to [code]false[/code] as most files are written with little-endian endianness. [b]Note:[/b] [member big_endian] is only about the file format, not the CPU type. The CPU endianness doesn't affect the default endianness for files written. [b]Note:[/b] This is always reset to [code]false[/code] whenever you open the file. Therefore, you must set [member big_endian] [i]after[/i] opening the file, not before. diff --git a/doc/classes/FogMaterial.xml b/doc/classes/FogMaterial.xml index e63d4ddf3e..7428d6169a 100644 --- a/doc/classes/FogMaterial.xml +++ b/doc/classes/FogMaterial.xml @@ -5,27 +5,28 @@ </brief_description> <description> A [Material] resource that can be used by [FogVolume]s to draw volumetric effects. + If you need more advanced effects, use a custom [url=$DOCS_URL/tutorials/shaders/shader_reference/fog_shader.html]fog shader[/url]. </description> <tutorials> </tutorials> <members> <member name="albedo" type="Color" setter="set_albedo" getter="get_albedo" default="Color(1, 1, 1, 1)"> - Sets the single-scattering [Color] of the [FogVolume]. Internally [member albedo] is converted into single-scattering which is additively blended with other [FogVolume]s and the [member Environment.volumetric_fog_albedo]. + The single-scattering [Color] of the [FogVolume]. Internally, [member albedo] is converted into single-scattering, which is additively blended with other [FogVolume]s and the [member Environment.volumetric_fog_albedo]. </member> <member name="density" type="float" setter="set_density" getter="get_density" default="1.0"> - Sets the density of the [FogVolume]. Denser objects are more opaque, but may suffer from under-sampling artifacts that look like stripes. + The density of the [FogVolume]. Denser objects are more opaque, but may suffer from under-sampling artifacts that look like stripes. Negative values can be used to subtract fog from other [FogVolume]s or global volumetric fog. </member> <member name="density_texture" type="Texture3D" setter="set_density_texture" getter="get_density_texture"> - Sets a 3D texture that is used to scale the [member density] of the [FogVolume]. + The 3D texture that is used to scale the [member density] of the [FogVolume]. This can be used to vary fog density within the [FogVolume] with any kind of static pattern. For animated effects, consider using a custom [url=$DOCS_URL/tutorials/shaders/shader_reference/fog_shader.html]fog shader[/url]. </member> <member name="edge_fade" type="float" setter="set_edge_fade" getter="get_edge_fade" default="0.1"> - Sets the hardness of the edges of the [FogVolume]. A higher number will result in softer edges while a lower number will result in harder edges. + The hardness of the edges of the [FogVolume]. A higher value will result in softer edges, while a lower value will result in harder edges. </member> <member name="emission" type="Color" setter="set_emission" getter="get_emission" default="Color(0, 0, 0, 1)"> - Sets the [Color] of the light emitted by the [FogVolume]. Emitted light will not cast light or shadows on other objects, but can be useful for modulating the [Color] of the [FogVolume] independently from light sources. + The [Color] of the light emitted by the [FogVolume]. Emitted light will not cast light or shadows on other objects, but can be useful for modulating the [Color] of the [FogVolume] independently from light sources. </member> <member name="height_falloff" type="float" setter="set_height_falloff" getter="get_height_falloff" default="0.0"> - Sets the rate by which the height-based fog decreases in density as height increases in world space. A high falloff will result in a sharp transition, while a low falloff will result in a smoother transition. A value of [code]0[/code] results in uniform-density fog. The height threshold is determined by the height of the associated [FogVolume]. + The rate by which the height-based fog decreases in density as height increases in world space. A high falloff will result in a sharp transition, while a low falloff will result in a smoother transition. A value of [code]0.0[/code] results in uniform-density fog. The height threshold is determined by the height of the associated [FogVolume]. </member> </members> </class> diff --git a/doc/classes/FogVolume.xml b/doc/classes/FogVolume.xml index 3f2ee3035c..d9fa2e6ebb 100644 --- a/doc/classes/FogVolume.xml +++ b/doc/classes/FogVolume.xml @@ -4,22 +4,23 @@ A node used to add local fog with the volumetric fog effect. </brief_description> <description> - [FogVolume]s are used to add localized fog into the global volumetric fog effect. + [FogVolume]s are used to add localized fog into the global volumetric fog effect. [FogVolume]s can also remove volumetric fog from specific areas if using a [FogMaterial] with a negative [member FogMaterial.density]. Performance of [FogVolume]s is directly related to their relative size on the screen and the complexity of their attached [FogMaterial]. It is best to keep [FogVolume]s relatively small and simple where possible. + [b]Note:[/b] [FogVolume]s only have a visible effect if [member Environment.volumetric_fog_enabled] is [code]true[/code]. If you don't want fog to be globally visible (but only within [FogVolume] nodes), set [member Environment.volumetric_fog_density] to [code]0.0[/code]. </description> <tutorials> </tutorials> <members> <member name="extents" type="Vector3" setter="set_extents" getter="get_extents" default="Vector3(1, 1, 1)"> - Sets the size of the [FogVolume] when [member shape] is [constant RenderingServer.FOG_VOLUME_SHAPE_ELLIPSOID], [constant RenderingServer.FOG_VOLUME_SHAPE_CONE], [constant RenderingServer.FOG_VOLUME_SHAPE_CYLINDER] or [constant RenderingServer.FOG_VOLUME_SHAPE_BOX]. + The size of the [FogVolume] when [member shape] is [constant RenderingServer.FOG_VOLUME_SHAPE_ELLIPSOID], [constant RenderingServer.FOG_VOLUME_SHAPE_CONE], [constant RenderingServer.FOG_VOLUME_SHAPE_CYLINDER] or [constant RenderingServer.FOG_VOLUME_SHAPE_BOX]. [b]Note:[/b] Thin fog volumes may appear to flicker when the camera moves or rotates. This can be alleviated by increasing [member ProjectSettings.rendering/environment/volumetric_fog/volume_depth] (at a performance cost) or by decreasing [member Environment.volumetric_fog_length] (at no performance cost, but at the cost of lower fog range). Alternatively, the [FogVolume] can be made thicker and use a lower density in the [member material]. [b]Note:[/b] If [member shape] is [constant RenderingServer.FOG_VOLUME_SHAPE_CONE] or [constant RenderingServer.FOG_VOLUME_SHAPE_CYLINDER], the cone/cylinder will be adjusted to fit within the extents. Non-uniform scaling of cone/cylinder shapes via the [member extents] property is not supported, but you can scale the [FogVolume] node instead. </member> <member name="material" type="Material" setter="set_material" getter="get_material"> - Sets the [Material] to be used by the [FogVolume]. Can be either a [FogMaterial] or a custom [ShaderMaterial]. + The [Material] used by the [FogVolume]. Can be either a built-in [FogMaterial] or a custom [ShaderMaterial]. </member> <member name="shape" type="int" setter="set_shape" getter="get_shape" enum="RenderingServer.FogVolumeShape" default="3"> - Sets the shape of the [FogVolume] to either [constant RenderingServer.FOG_VOLUME_SHAPE_ELLIPSOID], [constant RenderingServer.FOG_VOLUME_SHAPE_CONE], [constant RenderingServer.FOG_VOLUME_SHAPE_CYLINDER], [constant RenderingServer.FOG_VOLUME_SHAPE_BOX] or [constant RenderingServer.FOG_VOLUME_SHAPE_WORLD]. + The shape of the [FogVolume]. This can be set to either [constant RenderingServer.FOG_VOLUME_SHAPE_ELLIPSOID], [constant RenderingServer.FOG_VOLUME_SHAPE_CONE], [constant RenderingServer.FOG_VOLUME_SHAPE_CYLINDER], [constant RenderingServer.FOG_VOLUME_SHAPE_BOX] or [constant RenderingServer.FOG_VOLUME_SHAPE_WORLD]. </member> </members> </class> diff --git a/doc/classes/Font.xml b/doc/classes/Font.xml index ad3a16afbb..6a42b62bcf 100644 --- a/doc/classes/Font.xml +++ b/doc/classes/Font.xml @@ -228,9 +228,15 @@ <description> Returns the size of a bounding box of a single-line string, taking kerning and advance into account. See also [method get_multiline_string_size] and [method draw_string]. For example, to get the string size as displayed by a single-line Label, use: - [codeblock] + [codeblocks] + [gdscript] var string_size = $Label.get_theme_font("font").get_string_size($Label.text, HORIZONTAL_ALIGNMENT_LEFT, -1, $Label.get_theme_font_size("font_size")) - [/codeblock] + [/gdscript] + [csharp] + Label label = GetNode<Label>("Label"); + Vector2 stringSize = label.GetThemeFont("font").GetStringSize(label.Text, HorizontalAlignment.Left, -1, label.GetThemeFontSize("font_size")); + [/csharp] + [/codeblocks] [b]Note:[/b] Real height of the string is context-dependent and can be significantly different from the value returned by [method get_height]. </description> </method> diff --git a/doc/classes/Geometry2D.xml b/doc/classes/Geometry2D.xml index 392ca2cabb..0142018f1a 100644 --- a/doc/classes/Geometry2D.xml +++ b/doc/classes/Geometry2D.xml @@ -33,6 +33,13 @@ Given an array of [Vector2]s, returns the convex hull as a list of points in counterclockwise order. The last point is the same as the first one. </description> </method> + <method name="decompose_polygon_in_convex"> + <return type="PackedVector2Array[]" /> + <param index="0" name="polygon" type="PackedVector2Array" /> + <description> + Decomposes the [param polygon] into multiple convex hulls and returns an array of [PackedVector2Array]. + </description> + </method> <method name="exclude_polygons"> <return type="PackedVector2Array[]" /> <param index="0" name="polygon_a" type="PackedVector2Array" /> @@ -126,7 +133,7 @@ <return type="Dictionary" /> <param index="0" name="sizes" type="PackedVector2Array" /> <description> - Given an array of [Vector2]s representing tiles, builds an atlas. The returned dictionary has two keys: [code]points[/code] is an array of [Vector2] that specifies the positions of each tile, [code]size[/code] contains the overall size of the whole atlas as [Vector2]. + Given an array of [Vector2]s representing tiles, builds an atlas. The returned dictionary has two keys: [code]points[/code] is a [PackedVector2Array] that specifies the positions of each tile, [code]size[/code] contains the overall size of the whole atlas as [Vector2i]. </description> </method> <method name="merge_polygons"> diff --git a/doc/classes/GraphEdit.xml b/doc/classes/GraphEdit.xml index dc093acdcd..5050ce7715 100644 --- a/doc/classes/GraphEdit.xml +++ b/doc/classes/GraphEdit.xml @@ -1,37 +1,38 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="GraphEdit" inherits="Control" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> - GraphEdit is an area capable of showing various GraphNodes. It manages connection events between them. + GraphEdit is a control responsible for displaying and manipulating graph-like data using [GraphNode]s. It provides access to creation, removal, connection, and disconnection of nodes. </brief_description> <description> - GraphEdit manages the showing of GraphNodes it contains, as well as connections and disconnections between them. Signals are sent for each of these two events. Disconnection between GraphNode slots is disabled by default. - It is greatly advised to enable low-processor usage mode (see [member OS.low_processor_usage_mode]) when using GraphEdits. + GraphEdit provides tools for creation, manipulation, and display of various graphs. Its main purpose in the engine is to power the visual programming systems, such as visual shaders, but it is also available for use in user projects. + GraphEdit by itself is only an empty container, representing an infinite grid where [GraphNode]s can be placed. Each [GraphNode] represent a node in the graph, a single unit of data in the connected scheme. GraphEdit, in turn, helps to control various interactions with nodes and between nodes. When the user attempts to connect, disconnect, or close a [GraphNode], a signal is emitted in the GraphEdit, but no action is taken by default. It is the responsibility of the programmer utilizing this control to implement the necessary logic to determine how each request should be handled. + [b]Performance:[/b] It is greatly advised to enable low-processor usage mode (see [member OS.low_processor_usage_mode]) when using GraphEdits. </description> <tutorials> </tutorials> <methods> <method name="_get_connection_line" qualifiers="virtual const"> <return type="PackedVector2Array" /> - <param index="0" name="from" type="Vector2" /> - <param index="1" name="to" type="Vector2" /> + <param index="0" name="from_position" type="Vector2" /> + <param index="1" name="to_position" type="Vector2" /> <description> Virtual method which can be overridden to customize how connections are drawn. </description> </method> <method name="_is_in_input_hotzone" qualifiers="virtual"> <return type="bool" /> - <param index="0" name="graph_node" type="Object" /> - <param index="1" name="slot_index" type="int" /> + <param index="0" name="in_node" type="Object" /> + <param index="1" name="in_port" type="int" /> <param index="2" name="mouse_position" type="Vector2" /> <description> Returns whether the [param mouse_position] is in the input hot zone. - By default, a hot zone is a [Rect2] positioned such that its center is at [param graph_node].[method GraphNode.get_connection_input_position]([param slot_index]) (For output's case, call [method GraphNode.get_connection_output_position] instead). The hot zone's width is twice the Theme Property [code]port_grab_distance_horizontal[/code], and its height is twice the [code]port_grab_distance_vertical[/code]. + By default, a hot zone is a [Rect2] positioned such that its center is at [param in_node].[method GraphNode.get_connection_input_position]([param in_port]) (For output's case, call [method GraphNode.get_connection_output_position] instead). The hot zone's width is twice the Theme Property [code]port_grab_distance_horizontal[/code], and its height is twice the [code]port_grab_distance_vertical[/code]. Below is a sample code to help get started: [codeblock] - func _is_in_input_hotzone(graph_node, slot_index, mouse_position): - var slot_size : Vector2 = Vector2(get_theme_constant("port_grab_distance_horizontal"), get_theme_constant("port_grab_distance_vertical")) - var slot_pos : Vector2 = graph_node.get_position() + graph_node.get_connection_input_position(slot_index) - slot_size / 2 - var rect = Rect2(slot_pos, slot_size) + func _is_in_input_hotzone(in_node, in_port, mouse_position): + var port_size : Vector2 = Vector2(get_theme_constant("port_grab_distance_horizontal"), get_theme_constant("port_grab_distance_vertical")) + var port_pos : Vector2 = in_node.get_position() + in_node.get_connection_input_position(in_port) - port_size / 2 + var rect = Rect2(port_pos, port_size) return rect.has_point(mouse_position) [/codeblock] @@ -39,17 +40,17 @@ </method> <method name="_is_in_output_hotzone" qualifiers="virtual"> <return type="bool" /> - <param index="0" name="graph_node" type="Object" /> - <param index="1" name="slot_index" type="int" /> + <param index="0" name="in_node" type="Object" /> + <param index="1" name="in_port" type="int" /> <param index="2" name="mouse_position" type="Vector2" /> <description> Returns whether the [param mouse_position] is in the output hot zone. For more information on hot zones, see [method _is_in_input_hotzone]. Below is a sample code to help get started: [codeblock] - func _is_in_output_hotzone(graph_node, slot_index, mouse_position): - var slot_size : Vector2 = Vector2(get_theme_constant("port_grab_distance_horizontal"), get_theme_constant("port_grab_distance_vertical")) - var slot_pos : Vector2 = graph_node.get_position() + graph_node.get_connection_output_position(slot_index) - slot_size / 2 - var rect = Rect2(slot_pos, slot_size) + func _is_in_output_hotzone(in_node, in_port, mouse_position): + var port_size : Vector2 = Vector2(get_theme_constant("port_grab_distance_horizontal"), get_theme_constant("port_grab_distance_vertical")) + var port_pos : Vector2 = in_node.get_position() + in_node.get_connection_output_position(in_port) - port_size / 2 + var rect = Rect2(port_pos, port_size) return rect.has_point(mouse_position) [/codeblock] @@ -57,17 +58,17 @@ </method> <method name="_is_node_hover_valid" qualifiers="virtual"> <return type="bool" /> - <param index="0" name="from" type="StringName" /> - <param index="1" name="from_slot" type="int" /> - <param index="2" name="to" type="StringName" /> - <param index="3" name="to_slot" type="int" /> + <param index="0" name="from_node" type="StringName" /> + <param index="1" name="from_port" type="int" /> + <param index="2" name="to_node" type="StringName" /> + <param index="3" name="to_port" type="int" /> <description> This virtual method can be used to insert additional error detection while the user is dragging a connection over a valid port. Return [code]true[/code] if the connection is indeed valid or return [code]false[/code] if the connection is impossible. If the connection is impossible, no snapping to the port and thus no connection request to that port will happen. In this example a connection to same node is suppressed: [codeblocks] [gdscript] - func _is_node_hover_valid(from, from_slot, to, to_slot): + func _is_node_hover_valid(from, from_port, to, to_port): return from != to [/gdscript] [csharp] @@ -83,21 +84,22 @@ <param index="0" name="from_type" type="int" /> <param index="1" name="to_type" type="int" /> <description> - Makes possible the connection between two different slot types. The type is defined with the [method GraphNode.set_slot] method. + Allows the connection between two different port types. The port type is defined individually for the left and the right port of each slot with the [method GraphNode.set_slot] method. + See also [method is_valid_connection_type] and [method remove_valid_connection_type]. </description> </method> <method name="add_valid_left_disconnect_type"> <return type="void" /> <param index="0" name="type" type="int" /> <description> - Makes possible to disconnect nodes when dragging from the slot at the left if it has the specified type. + Allows to disconnect nodes when dragging from the left port of the [GraphNode]'s slot if it has the specified type. See also [method remove_valid_left_disconnect_type]. </description> </method> <method name="add_valid_right_disconnect_type"> <return type="void" /> <param index="0" name="type" type="int" /> <description> - Makes possible to disconnect nodes when dragging from the slot at the right if it has the specified type. + Allows to disconnect nodes when dragging from the right port of the [GraphNode]'s slot if it has the specified type. See also [method remove_valid_right_disconnect_type]. </description> </method> <method name="arrange_nodes"> @@ -114,22 +116,22 @@ </method> <method name="connect_node"> <return type="int" enum="Error" /> - <param index="0" name="from" type="StringName" /> + <param index="0" name="from_node" type="StringName" /> <param index="1" name="from_port" type="int" /> - <param index="2" name="to" type="StringName" /> + <param index="2" name="to_node" type="StringName" /> <param index="3" name="to_port" type="int" /> <description> - Create a connection between the [param from_port] slot of the [param from] GraphNode and the [param to_port] slot of the [param to] GraphNode. If the connection already exists, no connection is created. + Create a connection between the [param from_port] of the [param from_node] [GraphNode] and the [param to_port] of the [param to_node] [GraphNode]. If the connection already exists, no connection is created. </description> </method> <method name="disconnect_node"> <return type="void" /> - <param index="0" name="from" type="StringName" /> + <param index="0" name="from_node" type="StringName" /> <param index="1" name="from_port" type="int" /> - <param index="2" name="to" type="StringName" /> + <param index="2" name="to_node" type="StringName" /> <param index="3" name="to_port" type="int" /> <description> - Removes the connection between the [param from_port] slot of the [param from] GraphNode and the [param to_port] slot of the [param to] GraphNode. If the connection does not exist, no connection is removed. + Removes the connection between the [param from_port] of the [param from_node] [GraphNode] and the [param to_port] of the [param to_node] [GraphNode]. If the connection does not exist, no connection is removed. </description> </method> <method name="force_connection_drag_end"> @@ -142,10 +144,10 @@ </method> <method name="get_connection_line"> <return type="PackedVector2Array" /> - <param index="0" name="from" type="Vector2" /> - <param index="1" name="to" type="Vector2" /> + <param index="0" name="from_node" type="Vector2" /> + <param index="1" name="to_node" type="Vector2" /> <description> - Returns the points which would make up a connection between [param from] and [param to]. + Returns the points which would make up a connection between [param from_node] and [param to_node]. </description> </method> <method name="get_connection_list" qualifiers="const"> @@ -163,12 +165,12 @@ </method> <method name="is_node_connected"> <return type="bool" /> - <param index="0" name="from" type="StringName" /> + <param index="0" name="from_node" type="StringName" /> <param index="1" name="from_port" type="int" /> - <param index="2" name="to" type="StringName" /> + <param index="2" name="to_node" type="StringName" /> <param index="3" name="to_port" type="int" /> <description> - Returns [code]true[/code] if the [param from_port] slot of the [param from] GraphNode is connected to the [param to_port] slot of the [param to] GraphNode. + Returns [code]true[/code] if the [param from_port] of the [param from_node] [GraphNode] is connected to the [param to_port] of the [param to_node] [GraphNode]. </description> </method> <method name="is_valid_connection_type" qualifiers="const"> @@ -176,7 +178,8 @@ <param index="0" name="from_type" type="int" /> <param index="1" name="to_type" type="int" /> <description> - Returns whether it's possible to connect slots of the specified types. + Returns whether it's possible to make a connection between two different port types. The port type is defined individually for the left and the right port of each slot with the [method GraphNode.set_slot] method. + See also [method add_valid_connection_type] and [method remove_valid_connection_type]. </description> </method> <method name="remove_valid_connection_type"> @@ -184,32 +187,33 @@ <param index="0" name="from_type" type="int" /> <param index="1" name="to_type" type="int" /> <description> - Makes it not possible to connect between two different slot types. The type is defined with the [method GraphNode.set_slot] method. + Disallows the connection between two different port types previously allowed by [method add_valid_connection_type]. The port type is defined individually for the left and the right port of each slot with the [method GraphNode.set_slot] method. + See also [method is_valid_connection_type]. </description> </method> <method name="remove_valid_left_disconnect_type"> <return type="void" /> <param index="0" name="type" type="int" /> <description> - Removes the possibility to disconnect nodes when dragging from the slot at the left if it has the specified type. + Disallows to disconnect nodes when dragging from the left port of the [GraphNode]'s slot if it has the specified type. Use this to disable disconnection previously allowed with [method add_valid_left_disconnect_type]. </description> </method> <method name="remove_valid_right_disconnect_type"> <return type="void" /> <param index="0" name="type" type="int" /> <description> - Removes the possibility to disconnect nodes when dragging from the slot at the right if it has the specified type. + Disallows to disconnect nodes when dragging from the right port of the [GraphNode]'s slot if it has the specified type. Use this to disable disconnection previously allowed with [method add_valid_right_disconnect_type]. </description> </method> <method name="set_connection_activity"> <return type="void" /> - <param index="0" name="from" type="StringName" /> + <param index="0" name="from_node" type="StringName" /> <param index="1" name="from_port" type="int" /> - <param index="2" name="to" type="StringName" /> + <param index="2" name="to_node" type="StringName" /> <param index="3" name="to_port" type="int" /> <param index="4" name="amount" type="float" /> <description> - Sets the coloration of the connection between [param from]'s [param from_port] and [param to]'s [param to_port] with the color provided in the [theme_item activity] theme property. + Sets the coloration of the connection between [param from_node]'s [param from_port] and [param to_node]'s [param to_port] with the color provided in the [theme_item activity] theme property. </description> </method> <method name="set_selected"> @@ -287,36 +291,36 @@ </description> </signal> <signal name="connection_drag_started"> - <param index="0" name="from" type="String" /> - <param index="1" name="slot" type="int" /> + <param index="0" name="from_node" type="String" /> + <param index="1" name="from_port" type="int" /> <param index="2" name="is_output" type="bool" /> <description> Emitted at the beginning of a connection drag. </description> </signal> <signal name="connection_from_empty"> - <param index="0" name="to" type="StringName" /> - <param index="1" name="to_slot" type="int" /> + <param index="0" name="to_node" type="StringName" /> + <param index="1" name="to_port" type="int" /> <param index="2" name="release_position" type="Vector2" /> <description> - Emitted when user dragging connection from input port into empty space of the graph. + Emitted when user drags a connection from an input port into the empty space of the graph. </description> </signal> <signal name="connection_request"> - <param index="0" name="from" type="StringName" /> - <param index="1" name="from_slot" type="int" /> - <param index="2" name="to" type="StringName" /> - <param index="3" name="to_slot" type="int" /> + <param index="0" name="from_node" type="StringName" /> + <param index="1" name="from_port" type="int" /> + <param index="2" name="to_node" type="StringName" /> + <param index="3" name="to_port" type="int" /> <description> - Emitted to the GraphEdit when the connection between the [param from_slot] slot of the [param from] GraphNode and the [param to_slot] slot of the [param to] GraphNode is attempted to be created. + Emitted to the GraphEdit when the connection between the [param from_port] of the [param from_node] [GraphNode] and the [param to_port] of the [param to_node] [GraphNode] is attempted to be created. </description> </signal> <signal name="connection_to_empty"> - <param index="0" name="from" type="StringName" /> - <param index="1" name="from_slot" type="int" /> + <param index="0" name="from_node" type="StringName" /> + <param index="1" name="from_port" type="int" /> <param index="2" name="release_position" type="Vector2" /> <description> - Emitted when user dragging connection from output port into empty space of the graph. + Emitted when user drags a connection from an output port into the empty space of the graph. </description> </signal> <signal name="copy_nodes_request"> @@ -331,12 +335,12 @@ </description> </signal> <signal name="disconnection_request"> - <param index="0" name="from" type="StringName" /> - <param index="1" name="from_slot" type="int" /> - <param index="2" name="to" type="StringName" /> - <param index="3" name="to_slot" type="int" /> + <param index="0" name="from_node" type="StringName" /> + <param index="1" name="from_port" type="int" /> + <param index="2" name="to_node" type="StringName" /> + <param index="3" name="to_port" type="int" /> <description> - Emitted to the GraphEdit when the connection between [param from_slot] slot of [param from] GraphNode and [param to_slot] slot of [param to] GraphNode is attempted to be removed. + Emitted to the GraphEdit when the connection between [param from_port] of [param from_node] [GraphNode] and [param to_port] of [param to_node] [GraphNode] is attempted to be removed. </description> </signal> <signal name="duplicate_nodes_request"> diff --git a/doc/classes/GraphNode.xml b/doc/classes/GraphNode.xml index a80dd0d47f..16386ff81b 100644 --- a/doc/classes/GraphNode.xml +++ b/doc/classes/GraphNode.xml @@ -1,12 +1,13 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="GraphNode" inherits="Container" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> - A GraphNode is a container with potentially several input and output slots allowing connections between GraphNodes. Slots can have different, incompatible types. + GraphNode is a [Container] control that represents a single data unit in a [GraphEdit] graph. You can customize the number, type, and color of left- and right-side connection ports. </brief_description> <description> - A GraphNode is a container. Each GraphNode can have several input and output slots, sometimes referred to as ports, allowing connections between GraphNodes. To add a slot to GraphNode, add any [Control]-derived child node to it. - After adding at least one child to GraphNode new sections will be automatically created in the Inspector called 'Slot'. When 'Slot' is expanded you will see list with index number for each slot. You can click on each of them to expand further. - In the Inspector you can enable (show) or disable (hide) slots. By default, all slots are disabled so you may not see any slots on your GraphNode initially. You can assign a type to each slot. Only slots of the same type will be able to connect to each other. You can also assign colors to slots. A tuple of input and output slots is defined for each GUI element included in the GraphNode. Input connections are on the left and output connections are on the right side of GraphNode. Only enabled slots are counted as connections. + GraphNode allows to create nodes for a [GraphEdit] graph with customizable content based on its child [Control]s. GraphNode is a [Container] and is responsible for placing its children on screen. This works similar to [VBoxContainer]. Children, in turn, provide GraphNode with so-called slots, each of which can have a connection port on either side. This is similar to how [TabContainer] uses children to create the tabs. + Each GraphNode slot is defined by its index and can provide the node with up to two ports: one on the left, and one on the right. By convention the left port is also referred to as the input port and the right port is referred to as the output port. Each port can be enabled and configured individually, using different type and color. The type is an arbitrary value that you can define using your own considerations. The parent [GraphEdit] will receive this information on each connect and disconnect request. + Slots can be configured in the Inspector dock once you add at least one child [Control]. The properties are grouped by each slot's index in the "Slot" section. + [b]Note:[/b] While GraphNode is set up using slots and slot indices, connections are made between the ports which are enabled. Because of that [GraphEdit] uses port's index and not slot's index. You can use [method get_connection_input_slot] and [method get_connection_output_slot] to get the slot index from the port index. </description> <tutorials> </tutorials> @@ -19,16 +20,16 @@ </method> <method name="clear_slot"> <return type="void" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="slot_index" type="int" /> <description> - Disables input and output slot whose index is [param idx]. + Disables input and output slot whose index is [param slot_index]. </description> </method> <method name="get_connection_input_color"> <return type="Color" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="port" type="int" /> <description> - Returns the [Color] of the input connection [param idx]. + Returns the [Color] of the input connection [param port]. </description> </method> <method name="get_connection_input_count"> @@ -39,30 +40,37 @@ </method> <method name="get_connection_input_height"> <return type="int" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="port" type="int" /> <description> - Returns the height of the input connection [param idx]. + Returns the height of the input connection [param port]. </description> </method> <method name="get_connection_input_position"> <return type="Vector2" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="port" type="int" /> + <description> + Returns the position of the input connection [param port]. + </description> + </method> + <method name="get_connection_input_slot"> + <return type="int" /> + <param index="0" name="port" type="int" /> <description> - Returns the position of the input connection [param idx]. + Returns the corresponding slot index of the input connection [param port]. </description> </method> <method name="get_connection_input_type"> <return type="int" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="port" type="int" /> <description> - Returns the type of the input connection [param idx]. + Returns the type of the input connection [param port]. </description> </method> <method name="get_connection_output_color"> <return type="Color" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="port" type="int" /> <description> - Returns the [Color] of the output connection [param idx]. + Returns the [Color] of the output connection [param port]. </description> </method> <method name="get_connection_output_count"> @@ -73,150 +81,157 @@ </method> <method name="get_connection_output_height"> <return type="int" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="port" type="int" /> <description> - Returns the height of the output connection [param idx]. + Returns the height of the output connection [param port]. </description> </method> <method name="get_connection_output_position"> <return type="Vector2" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="port" type="int" /> + <description> + Returns the position of the output connection [param port]. + </description> + </method> + <method name="get_connection_output_slot"> + <return type="int" /> + <param index="0" name="port" type="int" /> <description> - Returns the position of the output connection [param idx]. + Returns the corresponding slot index of the output connection [param port]. </description> </method> <method name="get_connection_output_type"> <return type="int" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="port" type="int" /> <description> - Returns the type of the output connection [param idx]. + Returns the type of the output connection [param port]. </description> </method> <method name="get_slot_color_left" qualifiers="const"> <return type="Color" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="slot_index" type="int" /> <description> - Returns the left (input) [Color] of the slot [param idx]. + Returns the left (input) [Color] of the slot [param slot_index]. </description> </method> <method name="get_slot_color_right" qualifiers="const"> <return type="Color" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="slot_index" type="int" /> <description> - Returns the right (output) [Color] of the slot [param idx]. + Returns the right (output) [Color] of the slot [param slot_index]. </description> </method> <method name="get_slot_type_left" qualifiers="const"> <return type="int" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="slot_index" type="int" /> <description> - Returns the left (input) type of the slot [param idx]. + Returns the left (input) type of the slot [param slot_index]. </description> </method> <method name="get_slot_type_right" qualifiers="const"> <return type="int" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="slot_index" type="int" /> <description> - Returns the right (output) type of the slot [param idx]. + Returns the right (output) type of the slot [param slot_index]. </description> </method> <method name="is_slot_draw_stylebox" qualifiers="const"> <return type="bool" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="slot_index" type="int" /> <description> - Returns true if the background [StyleBox] of the slot [param idx] is drawn. + Returns true if the background [StyleBox] of the slot [param slot_index] is drawn. </description> </method> <method name="is_slot_enabled_left" qualifiers="const"> <return type="bool" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="slot_index" type="int" /> <description> - Returns [code]true[/code] if left (input) side of the slot [param idx] is enabled. + Returns [code]true[/code] if left (input) side of the slot [param slot_index] is enabled. </description> </method> <method name="is_slot_enabled_right" qualifiers="const"> <return type="bool" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="slot_index" type="int" /> <description> - Returns [code]true[/code] if right (output) side of the slot [param idx] is enabled. + Returns [code]true[/code] if right (output) side of the slot [param slot_index] is enabled. </description> </method> <method name="set_slot"> <return type="void" /> - <param index="0" name="idx" type="int" /> - <param index="1" name="enable_left" type="bool" /> + <param index="0" name="slot_index" type="int" /> + <param index="1" name="enable_left_port" type="bool" /> <param index="2" name="type_left" type="int" /> <param index="3" name="color_left" type="Color" /> - <param index="4" name="enable_right" type="bool" /> + <param index="4" name="enable_right_port" type="bool" /> <param index="5" name="type_right" type="int" /> <param index="6" name="color_right" type="Color" /> - <param index="7" name="custom_left" type="Texture2D" default="null" /> - <param index="8" name="custom_right" type="Texture2D" default="null" /> - <param index="9" name="enable" type="bool" default="true" /> - <description> - Sets properties of the slot with ID [param idx]. - If [param enable_left]/[param enable_right], a port will appear and the slot will be able to be connected from this side. - [param type_left]/[param type_right] is an arbitrary type of the port. Only ports with the same type values can be connected and negative values will disallow all connections to be made via user inputs. - [param color_left]/[param color_right] is the tint of the port's icon on this side. - [param custom_left]/[param custom_right] is a custom texture for this side's port. - [b]Note:[/b] This method only sets properties of the slot. To create the slot, add a [Control]-derived child to the GraphNode. - Individual properties can be set using one of the [code]set_slot_*[/code] methods. You must enable at least one side of the slot to do so. + <param index="7" name="custom_icon_left" type="Texture2D" default="null" /> + <param index="8" name="custom_icon_right" type="Texture2D" default="null" /> + <param index="9" name="draw_stylebox" type="bool" default="true" /> + <description> + Sets properties of the slot with the [param slot_index] index. + If [param enable_left_port]/[param enable_right_port] is [code]true[/code], a port will appear and the slot will be able to be connected from this side. + With [param type_left]/[param type_right] an arbitrary type can be assigned to each port. Two ports can be connected if they share the same type, or if the connection between their types is allowed in the parent [GraphEdit] (see [method GraphEdit.add_valid_connection_type]). Keep in mind that the [GraphEdit] has the final say in accepting the connection. Type compatibility simply allows the [signal GraphEdit.connection_request] signal to be emitted. + Ports can be further customized using [param color_left]/[param color_right] and [param custom_icon_left]/[param custom_icon_right]. The color parameter adds a tint to the icon. The custom icon can be used to override the default port dot. + Additionally, [param draw_stylebox] can be used to enable or disable drawing of the background stylebox for each slot. See [theme_item slot]. + Individual properties can also be set using one of the [code]set_slot_*[/code] methods. + [b]Note:[/b] This method only sets properties of the slot. To create the slot itself, add a [Control]-derived child to the GraphNode. </description> </method> <method name="set_slot_color_left"> <return type="void" /> - <param index="0" name="idx" type="int" /> - <param index="1" name="color_left" type="Color" /> + <param index="0" name="slot_index" type="int" /> + <param index="1" name="color" type="Color" /> <description> - Sets the [Color] of the left (input) side of the slot [param idx] to [param color_left]. + Sets the [Color] of the left (input) side of the slot [param slot_index] to [param color]. </description> </method> <method name="set_slot_color_right"> <return type="void" /> - <param index="0" name="idx" type="int" /> - <param index="1" name="color_right" type="Color" /> + <param index="0" name="slot_index" type="int" /> + <param index="1" name="color" type="Color" /> <description> - Sets the [Color] of the right (output) side of the slot [param idx] to [param color_right]. + Sets the [Color] of the right (output) side of the slot [param slot_index] to [param color]. </description> </method> <method name="set_slot_draw_stylebox"> <return type="void" /> - <param index="0" name="idx" type="int" /> - <param index="1" name="draw_stylebox" type="bool" /> + <param index="0" name="slot_index" type="int" /> + <param index="1" name="enable" type="bool" /> <description> - Toggles the background [StyleBox] of the slot [param idx]. + Toggles the background [StyleBox] of the slot [param slot_index]. </description> </method> <method name="set_slot_enabled_left"> <return type="void" /> - <param index="0" name="idx" type="int" /> - <param index="1" name="enable_left" type="bool" /> + <param index="0" name="slot_index" type="int" /> + <param index="1" name="enable" type="bool" /> <description> - Toggles the left (input) side of the slot [param idx]. If [param enable_left] is [code]true[/code], a port will appear on the left side and the slot will be able to be connected from this side. + Toggles the left (input) side of the slot [param slot_index]. If [param enable] is [code]true[/code], a port will appear on the left side and the slot will be able to be connected from this side. </description> </method> <method name="set_slot_enabled_right"> <return type="void" /> - <param index="0" name="idx" type="int" /> - <param index="1" name="enable_right" type="bool" /> + <param index="0" name="slot_index" type="int" /> + <param index="1" name="enable" type="bool" /> <description> - Toggles the right (output) side of the slot [param idx]. If [param enable_right] is [code]true[/code], a port will appear on the right side and the slot will be able to be connected from this side. + Toggles the right (output) side of the slot [param slot_index]. If [param enable] is [code]true[/code], a port will appear on the right side and the slot will be able to be connected from this side. </description> </method> <method name="set_slot_type_left"> <return type="void" /> - <param index="0" name="idx" type="int" /> - <param index="1" name="type_left" type="int" /> + <param index="0" name="slot_index" type="int" /> + <param index="1" name="type" type="int" /> <description> - Sets the left (input) type of the slot [param idx] to [param type_left]. If the value is negative, all connections will be disallowed to be created via user inputs. + Sets the left (input) type of the slot [param slot_index] to [param type]. If the value is negative, all connections will be disallowed to be created via user inputs. </description> </method> <method name="set_slot_type_right"> <return type="void" /> - <param index="0" name="idx" type="int" /> - <param index="1" name="type_right" type="int" /> + <param index="0" name="slot_index" type="int" /> + <param index="1" name="type" type="int" /> <description> - Sets the right (output) type of the slot [param idx] to [param type_right]. If the value is negative, all connections will be disallowed to be created via user inputs. + Sets the right (output) type of the slot [param slot_index] to [param type]. If the value is negative, all connections will be disallowed to be created via user inputs. </description> </method> </methods> diff --git a/doc/classes/HMACContext.xml b/doc/classes/HMACContext.xml index 52d4fce28f..706ee30963 100644 --- a/doc/classes/HMACContext.xml +++ b/doc/classes/HMACContext.xml @@ -32,22 +32,22 @@ public class CryptoNode : Node { private HMACContext ctx = new HMACContext(); + public override void _Ready() { - PackedByteArray key = String("supersecret").to_utf8(); - Error err = ctx.Start(HashingContext.HASH_SHA256, key); - GD.Assert(err == OK); - PackedByteArray msg1 = String("this is ").to_utf8(); - PackedByteArray msg2 = String("super duper secret").to_utf8(); + byte[] key = "supersecret".ToUTF8(); + Error err = ctx.Start(HashingContext.HashType.Sha256, key); + Debug.Assert(err == Error.Ok); + byte[] msg1 = "this is ".ToUTF8(); + byte[] msg2 = "super duper secret".ToUTF8(); err = ctx.Update(msg1); - GD.Assert(err == OK); + Debug.Assert(err == Error.Ok); err = ctx.Update(msg2); - GD.Assert(err == OK); - PackedByteArray hmac = ctx.Finish(); + Debug.Assert(err == Error.Ok); + byte[] hmac = ctx.Finish(); GD.Print(hmac.HexEncode()); } } - [/csharp] [/codeblocks] </description> diff --git a/doc/classes/ImageFormatLoader.xml b/doc/classes/ImageFormatLoader.xml new file mode 100644 index 0000000000..c6b1ec922a --- /dev/null +++ b/doc/classes/ImageFormatLoader.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="ImageFormatLoader" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> + <brief_description> + Base class to add support for specific image formats. + </brief_description> + <description> + The engine supports multiple image formats out of the box (PNG, SVG, JPEG, WebP to name a few), but you can choose to implement support for additional image formats by extending [ImageFormatLoaderExtension]. + </description> + <tutorials> + </tutorials> + <constants> + <constant name="FLAG_NONE" value="0" enum="LoaderFlags" is_bitfield="true"> + </constant> + <constant name="FLAG_FORCE_LINEAR" value="1" enum="LoaderFlags" is_bitfield="true"> + </constant> + <constant name="FLAG_CONVERT_COLORS" value="2" enum="LoaderFlags" is_bitfield="true"> + </constant> + </constants> +</class> diff --git a/doc/classes/ImageFormatLoaderExtension.xml b/doc/classes/ImageFormatLoaderExtension.xml new file mode 100644 index 0000000000..9d18ee8b84 --- /dev/null +++ b/doc/classes/ImageFormatLoaderExtension.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="ImageFormatLoaderExtension" inherits="ImageFormatLoader" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> + <brief_description> + Base class for creating [ImageFormatLoader] extensions (adding support for extra image formats). + </brief_description> + <description> + The engine supports multiple image formats out of the box (PNG, SVG, JPEG, WebP to name a few), but you can choose to implement support for additional image formats by extending this class. + Be sure to respect the documented return types and values. You should create an instance of it, and call [method add_format_loader] to register that loader during the initialization phase. + </description> + <tutorials> + </tutorials> + <methods> + <method name="_get_recognized_extensions" qualifiers="virtual const"> + <return type="PackedStringArray" /> + <description> + Returns the list of file extensions for this image format. Files with the given extensions will be treated as image file and loaded using this class. + </description> + </method> + <method name="_load_image" qualifiers="virtual"> + <return type="int" enum="Error" /> + <param index="0" name="image" type="Image" /> + <param index="1" name="fileaccess" type="FileAccess" /> + <param index="2" name="flags" type="int" enum="ImageFormatLoader.LoaderFlags" /> + <param index="3" name="scale" type="float" /> + <description> + Loads the content of [param fileaccess] into the provided [param image]. + </description> + </method> + <method name="add_format_loader"> + <return type="void" /> + <description> + Add this format loader to the engine, allowing it to recognize the file extensions returned by [method _get_recognized_extensions]. + </description> + </method> + <method name="remove_format_loader"> + <return type="void" /> + <description> + Remove this format loader from the engine. + </description> + </method> + </methods> +</class> diff --git a/doc/classes/ImageTextureLayered.xml b/doc/classes/ImageTextureLayered.xml index f5b338542b..f5786f070a 100644 --- a/doc/classes/ImageTextureLayered.xml +++ b/doc/classes/ImageTextureLayered.xml @@ -11,6 +11,8 @@ <return type="int" enum="Error" /> <param index="0" name="images" type="Image[]" /> <description> + Creates an [ImageTextureLayered] from an array of [Image]s. The first image decides the width, height, image format and mipmapping setting. The other images must have the same width, height, image format and mipmapping setting. + Each [Image] represents one [code]layer[/code]. </description> </method> <method name="update_layer"> @@ -18,6 +20,10 @@ <param index="0" name="image" type="Image" /> <param index="1" name="layer" type="int" /> <description> + Replaces the existing [Image] data at the given [code]layer[/code] with this new image. + The given [Image] must have the same width, height, image format and mipmapping setting (a [code]bool[/code] value) as the rest of the referenced images. + If the image format is unsupported, it will be decompressed and converted to a similar and supported [enum Image.Format]. + The update is immediate: synced with the draw. </description> </method> </methods> diff --git a/doc/classes/ImporterMesh.xml b/doc/classes/ImporterMesh.xml index 3c3dbe4d87..1c9655c266 100644 --- a/doc/classes/ImporterMesh.xml +++ b/doc/classes/ImporterMesh.xml @@ -43,10 +43,12 @@ <return type="void" /> <param index="0" name="normal_merge_angle" type="float" /> <param index="1" name="normal_split_angle" type="float" /> + <param index="2" name="bone_transform_array" type="Array" /> <description> Generates all lods for this ImporterMesh. [param normal_merge_angle] and [param normal_split_angle] are in degrees and used in the same way as the importer settings in [code]lods[/code]. As a good default, use 25 and 60 respectively. The number of generated lods can be accessed using [method get_surface_lod_count], and each LOD is available in [method get_surface_lod_size] and [method get_surface_lod_indices]. + [param bone_transform_array] is an [Array] which can be either empty or contain [Transform3D]s which, for each of the mesh's bone IDs, will apply mesh skinning when generating the LOD mesh variations. This is usually used to account for discrepancies in scale between the mesh itself and its skinning data. </description> </method> <method name="get_blend_shape_count" qualifiers="const"> diff --git a/doc/classes/InputEventWithModifiers.xml b/doc/classes/InputEventWithModifiers.xml index d0453156d5..c6311d780c 100644 --- a/doc/classes/InputEventWithModifiers.xml +++ b/doc/classes/InputEventWithModifiers.xml @@ -23,7 +23,7 @@ State of the [kbd]Alt[/kbd] modifier. </member> <member name="command_or_control_autoremap" type="bool" setter="set_command_or_control_autoremap" getter="is_command_or_control_autoremap" default="false"> - Automaticaly use [kbd]Meta[/kbd] ([kbd]Command[/kbd]) on macOS and [kbd]Ctrl[/kbd] on other platforms. If [code]true[/code], [member ctrl_pressed] and [member meta_pressed] cannot be set. + Automatically use [kbd]Meta[/kbd] ([kbd]Command[/kbd]) on macOS and [kbd]Ctrl[/kbd] on other platforms. If [code]true[/code], [member ctrl_pressed] and [member meta_pressed] cannot be set. </member> <member name="ctrl_pressed" type="bool" setter="set_ctrl_pressed" getter="is_ctrl_pressed" default="false"> State of the [kbd]Ctrl[/kbd] modifier. diff --git a/doc/classes/ItemList.xml b/doc/classes/ItemList.xml index 55d794ae59..844f260971 100644 --- a/doc/classes/ItemList.xml +++ b/doc/classes/ItemList.xml @@ -349,7 +349,7 @@ The width all columns will be adjusted to. A value of zero disables the adjustment, each item will have a width equal to the width of its content and the columns will have an uneven width. </member> - <member name="fixed_icon_size" type="Vector2" setter="set_fixed_icon_size" getter="get_fixed_icon_size" default="Vector2(0, 0)"> + <member name="fixed_icon_size" type="Vector2i" setter="set_fixed_icon_size" getter="get_fixed_icon_size" default="Vector2i(0, 0)"> The size all icons will be adjusted to. If either X or Y component is not greater than zero, icon size won't be affected. </member> diff --git a/doc/classes/JSON.xml b/doc/classes/JSON.xml index 46e46cc164..125d016632 100644 --- a/doc/classes/JSON.xml +++ b/doc/classes/JSON.xml @@ -6,7 +6,7 @@ <description> The [JSON] enables all data types to be converted to and from a JSON string. This useful for serializing data to save to a file or send over the network. [method stringify] is used to convert any data type into a JSON string. - [method parse] is used to convert any existing JSON data into a [Variant] that can be used within Godot. If successfully parsed, use [method get_data] to retrieve the [Variant], and use [code]typeof[/code] to check if the Variant's type is what you expect. JSON Objects are converted into a [Dictionary], but JSON data can be used to store [Array]s, numbers, [String]s and even just a boolean. + [method parse] is used to convert any existing JSON data into a [Variant] that can be used within Godot. If successfully parsed, use [member data] to retrieve the [Variant], and use [code]typeof[/code] to check if the Variant's type is what you expect. JSON Objects are converted into a [Dictionary], but JSON data can be used to store [Array]s, numbers, [String]s and even just a boolean. [b]Example[/b] [codeblock] var data_to_send = ["a", "b", "c"] @@ -16,7 +16,7 @@ # Retrieve data var error = json.parse(json_string) if error == OK: - var data_received = json.get_data() + var data_received = json.data if typeof(data_received) == TYPE_ARRAY: print(data_received) # Prints array else: @@ -28,17 +28,15 @@ [codeblock] var data = JSON.parse_string(json_string) # Returns null if parsing failed. [/codeblock] + [b]Note:[/b] Both parse methods do not fully comply with the JSON specification: + - Trailing commas in arrays or objects are ignored, instead of causing a parser error. + - New line and tab characters are accepted in string literals, and are treated like their corresponding escape sequences [code]\n[/code] and [code]\t[/code]. + - Numbers are parsed using [method String.to_float] which is generally more lax than the JSON specification. + - Certain errors, such as invalid Unicode sequences, do not cause a parser error. Instead, the string is cleansed and an error is logged to the console. </description> <tutorials> </tutorials> <methods> - <method name="get_data" qualifiers="const"> - <return type="Variant" /> - <description> - Returns the [Variant] containing the data of a successful [method parse]. - [b]Note:[/b] It will return [code]Null[/code] if the last call to parse was unsuccessful or [method parse] has not yet been called. - </description> - </method> <method name="get_error_line" qualifiers="const"> <return type="int" /> <description> @@ -56,7 +54,7 @@ <param index="0" name="json_string" type="String" /> <description> Attempts to parse the [param json_string] provided. - Returns an [enum Error]. If the parse was successful, it returns [code]OK[/code] and the result can be retrieved using [method get_data]. If unsuccessful, use [method get_error_line] and [method get_error_message] for identifying the source of the failure. + Returns an [enum Error]. If the parse was successful, it returns [code]OK[/code] and the result can be retrieved using [member data]. If unsuccessful, use [method get_error_line] and [method get_error_message] for identifying the source of the failure. Non-static variant of [method parse_string], if you want custom error handling. </description> </method> @@ -118,4 +116,9 @@ </description> </method> </methods> + <members> + <member name="data" type="Variant" setter="set_data" getter="get_data" default="null"> + Contains the parsed JSON data in [Variant] form. + </member> + </members> </class> diff --git a/doc/classes/LightmapGI.xml b/doc/classes/LightmapGI.xml index dd8c7be489..53dae1a8e6 100644 --- a/doc/classes/LightmapGI.xml +++ b/doc/classes/LightmapGI.xml @@ -17,7 +17,7 @@ <member name="bias" type="float" setter="set_bias" getter="get_bias" default="0.0005"> The bias to use when computing shadows. Increasing [member bias] can fix shadow acne on the resulting baked lightmap, but can introduce peter-panning (shadows not connecting to their casters). Real-time [Light3D] shadows are not affected by this [member bias] property. </member> - <member name="bounces" type="int" setter="set_bounces" getter="get_bounces" default="1"> + <member name="bounces" type="int" setter="set_bounces" getter="get_bounces" default="3"> Number of light bounces that are taken into account during baking. Higher values result in brighter, more realistic lighting, at the cost of longer bake times. If set to [code]0[/code], only environment lighting, direct light and emissive lighting is baked. </member> <member name="camera_attributes" type="CameraAttributes" setter="set_camera_attributes" getter="get_camera_attributes"> @@ -36,10 +36,10 @@ <member name="environment_custom_sky" type="Sky" setter="set_environment_custom_sky" getter="get_environment_custom_sky"> The sky to use as a source of environment lighting. Only effective if [member environment_mode] is [constant ENVIRONMENT_MODE_CUSTOM_SKY]. </member> - <member name="environment_mode" type="int" setter="set_environment_mode" getter="get_environment_mode" enum="LightmapGI.EnvironmentMode" default="0"> + <member name="environment_mode" type="int" setter="set_environment_mode" getter="get_environment_mode" enum="LightmapGI.EnvironmentMode" default="1"> The environment mode to use when baking lightmaps. </member> - <member name="generate_probes_subdiv" type="int" setter="set_generate_probes" getter="get_generate_probes" enum="LightmapGI.GenerateProbes" default="0"> + <member name="generate_probes_subdiv" type="int" setter="set_generate_probes" getter="get_generate_probes" enum="LightmapGI.GenerateProbes" default="2"> The level of subdivision to use when automatically generating [LightmapProbe]s for dynamic object lighting. Higher values result in more accurate indirect lighting on dynamic objects, at the cost of longer bake times and larger file sizes. [b]Note:[/b] Automatically generated [LightmapProbe]s are not visible as nodes in the Scene tree dock, and cannot be modified this way after they are generated. [b]Note:[/b] Regardless of [member generate_probes_subdiv], direct lighting on dynamic objects is always applied using [Light3D] nodes in real-time. diff --git a/doc/classes/MenuButton.xml b/doc/classes/MenuButton.xml index 1f38510e83..4d5d5a011b 100644 --- a/doc/classes/MenuButton.xml +++ b/doc/classes/MenuButton.xml @@ -25,6 +25,12 @@ If [code]true[/code], shortcuts are disabled and cannot be used to trigger the button. </description> </method> + <method name="show_popup"> + <return type="void" /> + <description> + Adjusts popup position and sizing for the [MenuButton], then shows the [PopupMenu]. Prefer this over using [code]get_popup().popup()[/code]. + </description> + </method> </methods> <members> <member name="action_mode" type="int" setter="set_action_mode" getter="get_action_mode" overrides="BaseButton" enum="BaseButton.ActionMode" default="0" /> diff --git a/doc/classes/MultiMesh.xml b/doc/classes/MultiMesh.xml index bae2335cfb..ce2b5f2584 100644 --- a/doc/classes/MultiMesh.xml +++ b/doc/classes/MultiMesh.xml @@ -1,13 +1,15 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="MultiMesh" inherits="Resource" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> - Provides high-performance mesh instancing. + Provides high-performance drawing of a mesh multiple times using GPU instancing. </brief_description> <description> MultiMesh provides low-level mesh instancing. Drawing thousands of [MeshInstance3D] nodes can be slow, since each object is submitted to the GPU then drawn individually. MultiMesh is much faster as it can draw thousands of instances with a single draw call, resulting in less API overhead. As a drawback, if the instances are too far away from each other, performance may be reduced as every single instance will always render (they are spatially indexed as one, for the whole object). Since instances may have any behavior, the AABB used for visibility must be provided by the user. + [b]Note:[/b] A MultiMesh is a single object, therefore the same maximum lights per object restriction applies. This means, that once the maximum lights are consumed by one or more instances, the rest of the MultiMesh instances will [b]not[/b] receive any lighting. + [b]Note:[/b] Blend Shapes will be ignored if used in a MultiMesh. </description> <tutorials> <link title="Animating thousands of fish with MultiMeshInstance">$DOCS_URL/tutorials/performance/vertex_animation/animating_thousands_of_fish.html</link> @@ -24,7 +26,7 @@ <return type="Color" /> <param index="0" name="instance" type="int" /> <description> - Gets a specific instance's color. + Gets a specific instance's color multiplier. </description> </method> <method name="get_instance_custom_data" qualifiers="const"> @@ -53,8 +55,8 @@ <param index="0" name="instance" type="int" /> <param index="1" name="color" type="Color" /> <description> - Sets the color of a specific instance by [i]multiplying[/i] the mesh's existing vertex colors. - For the color to take effect, ensure that [member use_colors] is [code]true[/code] on the [MultiMesh] and [member BaseMaterial3D.vertex_color_use_as_albedo] is [code]true[/code] on the material. If the color doesn't look as expected, make sure the material's albedo color is set to pure white ([code]Color(1, 1, 1)[/code]). + Sets the color of a specific instance by [i]multiplying[/i] the mesh's existing vertex colors. This allows for different color tinting per instance. + For the color to take effect, ensure that [member use_colors] is [code]true[/code] on the [MultiMesh] and [member BaseMaterial3D.vertex_color_use_as_albedo] is [code]true[/code] on the material. If you intend to set an absolute color instead of tinting, make sure the material's albedo color is set to pure white ([code]Color(1, 1, 1)[/code]). </description> </method> <method name="set_instance_custom_data"> @@ -64,6 +66,7 @@ <description> Sets custom data for a specific instance. Although [Color] is used, it is just a container for 4 floating point numbers. For the custom data to be used, ensure that [member use_custom_data] is [code]true[/code]. + This custom instance data has to be manually accessed in your custom shader using [code]INSTANCE_CUSTOM[/code]. </description> </method> <method name="set_instance_transform"> @@ -87,28 +90,33 @@ <member name="buffer" type="PackedFloat32Array" setter="set_buffer" getter="get_buffer" default="PackedFloat32Array()"> </member> <member name="color_array" type="PackedColorArray" setter="_set_color_array" getter="_get_color_array"> + See [method set_instance_color]. </member> <member name="custom_data_array" type="PackedColorArray" setter="_set_custom_data_array" getter="_get_custom_data_array"> + See [method set_instance_custom_data]. </member> <member name="instance_count" type="int" setter="set_instance_count" getter="get_instance_count" default="0"> Number of instances that will get drawn. This clears and (re)sizes the buffers. Setting data format or flags afterwards will have no effect. By default, all instances are drawn but you can limit this with [member visible_instance_count]. </member> <member name="mesh" type="Mesh" setter="set_mesh" getter="get_mesh"> - Mesh to be drawn. + [Mesh] resource to be instanced. + The looks of the individual instances can be modified using [method set_instance_color] and [method set_instance_custom_data]. </member> <member name="transform_2d_array" type="PackedVector2Array" setter="_set_transform_2d_array" getter="_get_transform_2d_array"> + See [method set_instance_transform_2d]. </member> <member name="transform_array" type="PackedVector3Array" setter="_set_transform_array" getter="_get_transform_array"> + See [method set_instance_transform]. </member> <member name="transform_format" type="int" setter="set_transform_format" getter="get_transform_format" enum="MultiMesh.TransformFormat" default="0"> Format of transform used to transform mesh, either 2D or 3D. </member> <member name="use_colors" type="bool" setter="set_use_colors" getter="is_using_colors" default="false"> - If [code]true[/code], the [MultiMesh] will use color data (see [member color_array]). + If [code]true[/code], the [MultiMesh] will use color data (see [method set_instance_color]). Can only be set when [member instance_count] is [code]0[/code] or less. This means that you need to call this method before setting the instance count, or temporarily reset it to [code]0[/code]. </member> <member name="use_custom_data" type="bool" setter="set_use_custom_data" getter="is_using_custom_data" default="false"> - If [code]true[/code], the [MultiMesh] will use custom data (see [member custom_data_array]). + If [code]true[/code], the [MultiMesh] will use custom data (see [method set_instance_custom_data]). Can only be set when [member instance_count] is [code]0[/code] or less. This means that you need to call this method before setting the instance count, or temporarily reset it to [code]0[/code]. </member> <member name="visible_instance_count" type="int" setter="set_visible_instance_count" getter="get_visible_instance_count" default="-1"> Limits the number of instances drawn, -1 draws all instances. Changing this does not change the sizes of the buffers. diff --git a/doc/classes/MultiplayerAPIExtension.xml b/doc/classes/MultiplayerAPIExtension.xml index e67970cc89..c4012a920a 100644 --- a/doc/classes/MultiplayerAPIExtension.xml +++ b/doc/classes/MultiplayerAPIExtension.xml @@ -5,7 +5,7 @@ </brief_description> <description> This class can be used to augment or replace the default [MultiplayerAPI] implementation via script or extensions. - The following example augment the default implemenation ([SceneMultiplayer]) by logging every RPC being made, and every object being configured for replication. + The following example augment the default implementation ([SceneMultiplayer]) by logging every RPC being made, and every object being configured for replication. [codeblocks] [gdscript] extends MultiplayerAPIExtension diff --git a/doc/classes/NavigationObstacle2D.xml b/doc/classes/NavigationObstacle2D.xml index 4ecdc06645..6d05e220e3 100644 --- a/doc/classes/NavigationObstacle2D.xml +++ b/doc/classes/NavigationObstacle2D.xml @@ -10,12 +10,25 @@ <tutorials> </tutorials> <methods> + <method name="get_navigation_map" qualifiers="const"> + <return type="RID" /> + <description> + Returns the [RID] of the navigation map for this NavigationObstacle node. This function returns always the map set on the NavigationObstacle node and not the map of the abstract agent on the NavigationServer. If the agent map is changed directly with the NavigationServer API the NavigationObstacle node will not be aware of the map change. Use [method set_navigation_map] to change the navigation map for the NavigationObstacle and also update the agent on the NavigationServer. + </description> + </method> <method name="get_rid" qualifiers="const"> <return type="RID" /> <description> Returns the [RID] of this obstacle on the [NavigationServer2D]. </description> </method> + <method name="set_navigation_map"> + <return type="void" /> + <param index="0" name="navigation_map" type="RID" /> + <description> + Sets the [RID] of the navigation map this NavigationObstacle node should use and also updates the [code]agent[/code] on the NavigationServer. + </description> + </method> </methods> <members> <member name="estimate_radius" type="bool" setter="set_estimate_radius" getter="is_radius_estimated" default="true"> diff --git a/doc/classes/NavigationObstacle3D.xml b/doc/classes/NavigationObstacle3D.xml index ed8af3883c..f5a0bde089 100644 --- a/doc/classes/NavigationObstacle3D.xml +++ b/doc/classes/NavigationObstacle3D.xml @@ -10,12 +10,25 @@ <tutorials> </tutorials> <methods> + <method name="get_navigation_map" qualifiers="const"> + <return type="RID" /> + <description> + Returns the [RID] of the navigation map for this NavigationObstacle node. This function returns always the map set on the NavigationObstacle node and not the map of the abstract agent on the NavigationServer. If the agent map is changed directly with the NavigationServer API the NavigationObstacle node will not be aware of the map change. Use [method set_navigation_map] to change the navigation map for the NavigationObstacle and also update the agent on the NavigationServer. + </description> + </method> <method name="get_rid" qualifiers="const"> <return type="RID" /> <description> Returns the [RID] of this obstacle on the [NavigationServer3D]. </description> </method> + <method name="set_navigation_map"> + <return type="void" /> + <param index="0" name="navigation_map" type="RID" /> + <description> + Sets the [RID] of the navigation map this NavigationObstacle node should use and also updates the [code]agent[/code] on the NavigationServer. + </description> + </method> </methods> <members> <member name="estimate_radius" type="bool" setter="set_estimate_radius" getter="is_radius_estimated" default="true"> diff --git a/doc/classes/NavigationPathQueryParameters2D.xml b/doc/classes/NavigationPathQueryParameters2D.xml new file mode 100644 index 0000000000..397ca8b713 --- /dev/null +++ b/doc/classes/NavigationPathQueryParameters2D.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="NavigationPathQueryParameters2D" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> + <brief_description> + Parameters to be sent to a 2D navigation path query. + </brief_description> + <description> + This class contains the start and target position and other parameters to be used with [method NavigationServer2D.query_path]. + </description> + <tutorials> + </tutorials> + <members> + <member name="map" type="RID" setter="set_map" getter="get_map"> + The navigation [code]map[/code] [RID] used in the path query. + </member> + <member name="navigation_layers" type="int" setter="set_navigation_layers" getter="get_navigation_layers" default="1"> + The navigation layers the query will use (as a bitmask). + </member> + <member name="path_postprocessing" type="int" setter="set_path_postprocessing" getter="get_path_postprocessing" enum="NavigationPathQueryParameters2D.PathPostProcessing" default="0"> + The path postprocessing applied to the raw path corridor found by the [member pathfinding_algorithm]. + </member> + <member name="pathfinding_algorithm" type="int" setter="set_pathfinding_algorithm" getter="get_pathfinding_algorithm" enum="NavigationPathQueryParameters2D.PathfindingAlgorithm" default="0"> + The pathfinding algorithm used in the path query. + </member> + <member name="start_position" type="Vector2" setter="set_start_position" getter="get_start_position" default="Vector2(0, 0)"> + The pathfinding start position in global coordinates. + </member> + <member name="target_position" type="Vector2" setter="set_target_position" getter="get_target_position" default="Vector2(0, 0)"> + The pathfinding target position in global coordinates. + </member> + </members> + <constants> + <constant name="PATHFINDING_ALGORITHM_ASTAR" value="0" enum="PathfindingAlgorithm"> + The path query uses the default A* pathfinding algorithm. + </constant> + <constant name="PATH_POSTPROCESSING_CORRIDORFUNNEL" value="0" enum="PathPostProcessing"> + Applies a funnel algorithm to the raw path corridor found by the pathfinding algorithm. This will result in the shortest path possible inside the path corridor. This postprocessing very much depends on the navmesh polygon layout and the created corridor. Especially tile- or gridbased layouts can face artificial corners with diagonal movement due to a jagged path corridor imposed by the cell shapes. + </constant> + <constant name="PATH_POSTPROCESSING_EDGECENTERED" value="1" enum="PathPostProcessing"> + Centers every path position in the middle of the traveled navmesh polygon edge. This creates better paths for tile- or gridbased layouts that restrict the movement to the cells center. + </constant> + </constants> +</class> diff --git a/doc/classes/NavigationPathQueryParameters3D.xml b/doc/classes/NavigationPathQueryParameters3D.xml new file mode 100644 index 0000000000..29faa5561b --- /dev/null +++ b/doc/classes/NavigationPathQueryParameters3D.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="NavigationPathQueryParameters3D" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> + <brief_description> + Parameters to be sent to a 3D navigation path query. + </brief_description> + <description> + This class contains the start and target position and other parameters to be used with [method NavigationServer3D.query_path]. + </description> + <tutorials> + </tutorials> + <members> + <member name="map" type="RID" setter="set_map" getter="get_map"> + The navigation [code]map[/code] [RID] used in the path query. + </member> + <member name="navigation_layers" type="int" setter="set_navigation_layers" getter="get_navigation_layers" default="1"> + The navigation layers the query will use (as a bitmask). + </member> + <member name="path_postprocessing" type="int" setter="set_path_postprocessing" getter="get_path_postprocessing" enum="NavigationPathQueryParameters3D.PathPostProcessing" default="0"> + The path postprocessing applied to the raw path corridor found by the [member pathfinding_algorithm]. + </member> + <member name="pathfinding_algorithm" type="int" setter="set_pathfinding_algorithm" getter="get_pathfinding_algorithm" enum="NavigationPathQueryParameters3D.PathfindingAlgorithm" default="0"> + The pathfinding algorithm used in the path query. + </member> + <member name="start_position" type="Vector3" setter="set_start_position" getter="get_start_position" default="Vector3(0, 0, 0)"> + The pathfinding start position in global coordinates. + </member> + <member name="target_position" type="Vector3" setter="set_target_position" getter="get_target_position" default="Vector3(0, 0, 0)"> + The pathfinding target position in global coordinates. + </member> + </members> + <constants> + <constant name="PATHFINDING_ALGORITHM_ASTAR" value="0" enum="PathfindingAlgorithm"> + The path query uses the default A* pathfinding algorithm. + </constant> + <constant name="PATH_POSTPROCESSING_CORRIDORFUNNEL" value="0" enum="PathPostProcessing"> + Applies a funnel algorithm to the raw path corridor found by the pathfinding algorithm. This will result in the shortest path possible inside the path corridor. This postprocessing very much depends on the navmesh polygon layout and the created corridor. Especially tile- or gridbased layouts can face artificial corners with diagonal movement due to a jagged path corridor imposed by the cell shapes. + </constant> + <constant name="PATH_POSTPROCESSING_EDGECENTERED" value="1" enum="PathPostProcessing"> + Centers every path position in the middle of the traveled navmesh polygon edge. This creates better paths for tile- or gridbased layouts that restrict the movement to the cells center. + </constant> + </constants> +</class> diff --git a/doc/classes/NavigationPathQueryResult2D.xml b/doc/classes/NavigationPathQueryResult2D.xml new file mode 100644 index 0000000000..95b90e9383 --- /dev/null +++ b/doc/classes/NavigationPathQueryResult2D.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="NavigationPathQueryResult2D" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> + <brief_description> + Result from a [NavigationPathQueryParameters2D] navigation path query. + </brief_description> + <description> + This class contains the result of a navigation path query from [method NavigationServer2D.query_path]. + </description> + <tutorials> + </tutorials> + <methods> + <method name="reset"> + <return type="void" /> + <description> + Reset the result object to its initial state. This is useful to reuse the object across multiple queries. + </description> + </method> + </methods> + <members> + <member name="path" type="PackedVector2Array" setter="set_path" getter="get_path" default="PackedVector2Array()"> + The resulting path array from the navigation query. All path array positions are in global coordinates. Without customized query parameters this is the same path as returned by [method NavigationServer2D.map_get_path]. + </member> + </members> +</class> diff --git a/doc/classes/NavigationPathQueryResult3D.xml b/doc/classes/NavigationPathQueryResult3D.xml new file mode 100644 index 0000000000..b4ca8288db --- /dev/null +++ b/doc/classes/NavigationPathQueryResult3D.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="NavigationPathQueryResult3D" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> + <brief_description> + Result from a [NavigationPathQueryParameters3D] navigation path query. + </brief_description> + <description> + This class contains the result of a navigation path query from [method NavigationServer3D.query_path]. + </description> + <tutorials> + </tutorials> + <methods> + <method name="reset"> + <return type="void" /> + <description> + Reset the result object to its initial state. This is useful to reuse the object across multiple queries. + </description> + </method> + </methods> + <members> + <member name="path" type="PackedVector3Array" setter="set_path" getter="get_path" default="PackedVector3Array()"> + The resulting path array from the navigation query. All path array positions are in global coordinates. Without customized query parameters this is the same path as returned by [method NavigationServer3D.map_get_path]. + </member> + </members> +</class> diff --git a/doc/classes/NavigationRegion2D.xml b/doc/classes/NavigationRegion2D.xml index 89f7dcb4af..0f28081201 100644 --- a/doc/classes/NavigationRegion2D.xml +++ b/doc/classes/NavigationRegion2D.xml @@ -10,6 +10,7 @@ The pathfinding cost of entering this region from another region can be controlled with the [member enter_cost] value. [b]Note:[/b] This value is not added to the path cost when the start position is already inside this region. The pathfinding cost of traveling distances inside this region can be controlled with the [member travel_cost] multiplier. + [b]Note:[/b] This node caches changes to its properties, so if you make changes to the underlying region [RID] in [NavigationServer2D], they will not be reflected in this node's properties. </description> <tutorials> </tutorials> diff --git a/doc/classes/NavigationRegion3D.xml b/doc/classes/NavigationRegion3D.xml index 87e82e7b2e..85f163b3c2 100644 --- a/doc/classes/NavigationRegion3D.xml +++ b/doc/classes/NavigationRegion3D.xml @@ -10,6 +10,7 @@ The cost of entering this region from another region can be controlled with the [member enter_cost] value. [b]Note:[/b] This value is not added to the path cost when the start position is already inside this region. The cost of traveling distances inside this region can be controlled with the [member travel_cost] multiplier. + [b]Note:[/b] This node caches changes to its properties, so if you make changes to the underlying region [RID] in [NavigationServer3D], they will not be reflected in this node's properties. </description> <tutorials> </tutorials> diff --git a/doc/classes/NavigationServer2D.xml b/doc/classes/NavigationServer2D.xml index 0874e183e4..981ab8a5e1 100644 --- a/doc/classes/NavigationServer2D.xml +++ b/doc/classes/NavigationServer2D.xml @@ -368,6 +368,14 @@ Set the map's link connection radius used to connect links to navigation polygons. </description> </method> + <method name="query_path" qualifiers="const"> + <return type="void" /> + <param index="0" name="parameters" type="NavigationPathQueryParameters2D" /> + <param index="1" name="result" type="NavigationPathQueryResult2D" /> + <description> + Queries a path in a given navigation map. Start and target position and other parameters are defined through [NavigationPathQueryParameters2D]. Updates the provided [NavigationPathQueryResult2D] result object with the path among other results requested by the query. + </description> + </method> <method name="region_create" qualifiers="const"> <return type="RID" /> <description> diff --git a/doc/classes/NavigationServer3D.xml b/doc/classes/NavigationServer3D.xml index 255f2a902c..943aa03ef7 100644 --- a/doc/classes/NavigationServer3D.xml +++ b/doc/classes/NavigationServer3D.xml @@ -410,6 +410,14 @@ [b]Note:[/b] This function is not thread safe. </description> </method> + <method name="query_path" qualifiers="const"> + <return type="void" /> + <param index="0" name="parameters" type="NavigationPathQueryParameters3D" /> + <param index="1" name="result" type="NavigationPathQueryResult3D" /> + <description> + Queries a path in a given navigation map. Start and target position and other parameters are defined through [NavigationPathQueryParameters3D]. Updates the provided [NavigationPathQueryResult3D] result object with the path among other results requested by the query. + </description> + </method> <method name="region_bake_navmesh" qualifiers="const"> <return type="void" /> <param index="0" name="mesh" type="NavigationMesh" /> diff --git a/doc/classes/Node.xml b/doc/classes/Node.xml index 92beefa5fc..d9732da3a3 100644 --- a/doc/classes/Node.xml +++ b/doc/classes/Node.xml @@ -179,9 +179,14 @@ <return type="Tween" /> <description> Creates a new [Tween] and binds it to this node. This is equivalent of doing: - [codeblock] + [codeblocks] + [gdscript] get_tree().create_tween().bind_node(self) - [/codeblock] + [/gdscript] + [csharp] + GetTree().CreateTween().BindNode(this); + [/csharp] + [/codeblocks] </description> </method> <method name="duplicate" qualifiers="const"> @@ -267,13 +272,24 @@ Returns an array listing the groups that the node is a member of. [b]Note:[/b] For performance reasons, the order of node groups is [i]not[/i] guaranteed. The order of node groups should not be relied upon as it can vary across project runs. [b]Note:[/b] The engine uses some group names internally (all starting with an underscore). To avoid conflicts with internal groups, do not add custom groups whose name starts with an underscore. To exclude internal groups while looping over [method get_groups], use the following snippet: - [codeblock] + [codeblocks] + [gdscript] # Stores the node's non-internal groups only (as an array of Strings). var non_internal_groups = [] for group in get_groups(): if not group.begins_with("_"): non_internal_groups.push_back(group) - [/codeblock] + [/gdscript] + [csharp] + // Stores the node's non-internal groups only (as a List of strings). + List<string> nonInternalGroups = new List<string>(); + foreach (string group in GetGroups()) + { + if (!group.BeginsWith("_")) + nonInternalGroups.Add(group); + } + [/csharp] + [/codeblocks] </description> </method> <method name="get_index" qualifiers="const"> @@ -514,7 +530,7 @@ <param index="0" name="child_node" type="Node" /> <param index="1" name="to_position" type="int" /> <description> - Moves a child node to a different position (order) among the other children. Since calls, signals, etc are performed by tree order, changing the order of children nodes may be useful. + Moves a child node to a different position (order) among the other children. Since calls, signals, etc are performed by tree order, changing the order of children nodes may be useful. If [param to_position] is negative, the index will be counted from the end. [b]Note:[/b] Internal children can only be moved within their expected "internal range" (see [code]internal[/code] parameter in [method add_child]). </description> </method> @@ -577,12 +593,6 @@ Queues a node for deletion at the end of the current frame. When deleted, all of its child nodes will be deleted as well. This method ensures it's safe to delete the node, contrary to [method Object.free]. Use [method Object.is_queued_for_deletion] to check whether a node will be deleted at the end of the frame. </description> </method> - <method name="remove_and_skip"> - <return type="void" /> - <description> - Removes a node and sets all its children as children of the parent node (if it exists). All event subscriptions that pass by the removed node will be unsubscribed. - </description> - </method> <method name="remove_child"> <return type="void" /> <param index="0" name="node" type="Node" /> diff --git a/doc/classes/Node3D.xml b/doc/classes/Node3D.xml index c8e2f1ac68..3df7ec931f 100644 --- a/doc/classes/Node3D.xml +++ b/doc/classes/Node3D.xml @@ -116,7 +116,7 @@ Rotates the node so that the local forward axis (-Z) points toward the [param target] position. The local up axis (+Y) points as close to the [param up] vector as possible while staying perpendicular to the local forward axis. The resulting transform is orthogonal, and the scale is preserved. Non-uniform scaling may not work correctly. The [param target] position cannot be the same as the node's position, the [param up] vector cannot be zero, and the direction from the node's position to the [param target] vector cannot be parallel to the [param up] vector. - Operations take place in global space. + Operations take place in global space, which means that the node must be in the scene tree. </description> </method> <method name="look_at_from_position"> @@ -331,6 +331,10 @@ <constant name="NOTIFICATION_VISIBILITY_CHANGED" value="43"> Node3D nodes receives this notification when their visibility changes. </constant> + <constant name="NOTIFICATION_LOCAL_TRANSFORM_CHANGED" value="44"> + Node3D nodes receives this notification when their local transform changes. This is not received when the transform of a parent node is changed. + In order for [constant NOTIFICATION_LOCAL_TRANSFORM_CHANGED] to work, users first need to ask for it, with [method set_notify_local_transform]. + </constant> <constant name="ROTATION_EDIT_MODE_EULER" value="0" enum="RotationEditMode"> </constant> <constant name="ROTATION_EDIT_MODE_QUATERNION" value="1" enum="RotationEditMode"> diff --git a/doc/classes/OS.xml b/doc/classes/OS.xml index 059766656f..bc6ac8012f 100644 --- a/doc/classes/OS.xml +++ b/doc/classes/OS.xml @@ -18,12 +18,6 @@ Displays a modal dialog box using the host OS' facilities. Execution is blocked until the dialog is closed. </description> </method> - <method name="can_use_threads" qualifiers="const"> - <return type="bool" /> - <description> - Returns [code]true[/code] if the current host platform is using multiple threads. - </description> - </method> <method name="close_midi_inputs"> <return type="void" /> <description> @@ -216,6 +210,15 @@ Not to be confused with [method get_user_data_dir], which returns the [i]project-specific[/i] user data path. </description> </method> + <method name="get_distribution_name" qualifiers="const"> + <return type="String" /> + <description> + Returns the name of the distribution for Linux and BSD platforms (e.g. Ubuntu, Manjaro, OpenBSD, etc.). + Returns the same value as [method get_name] for stock Android ROMs, but attempts to return the custom ROM name for popular Android derivatives such as LineageOS. + Returns the same value as [method get_name] for other platforms. + [b]Note:[/b] This method is not supported on the web platform. It returns an empty string. + </description> + </method> <method name="get_environment" qualifiers="const"> <return type="String" /> <param index="0" name="variable" type="String" /> @@ -430,6 +433,18 @@ Not to be confused with [method get_data_dir], which returns the [i]global[/i] (non-project-specific) user home directory. </description> </method> + <method name="get_version" qualifiers="const"> + <return type="String" /> + <description> + Returns the exact production and build version of the operating system. This is different from the branded version used in marketing. This helps to distinguish between different releases of operating systems, including minor versions, and insider and custom builds. + For Windows, the major and minor version are returned, as well as the build number. For example, the returned string can look like [code]10.0.9926[/code] for a build of Windows 10, and it can look like [code]6.1.7601[/code] for a build of Windows 7 SP1. + For rolling distributions, such as Arch Linux, an empty string is returned. + For macOS and iOS, the major and minor version are returned, as well as the patch number. + For UWP, the device family version is returned. + For Android, the SDK version and the incremental build number are returned. If it's a custom ROM, it attempts to return its version instead. + [b]Note:[/b] This method is not supported on the web platform. It returns an empty string. + </description> + </method> <method name="has_environment" qualifiers="const"> <return type="bool" /> <param index="0" name="variable" type="String" /> @@ -501,13 +516,19 @@ <return type="int" enum="Error" /> <param index="0" name="path" type="String" /> <description> - Moves the file or directory to the system's recycle bin. See also [method Directory.remove]. - The method takes only global paths, so you may need to use [method ProjectSettings.globalize_path]. Do not use it for files in [code]res://[/code] as it will not work in exported project. + Moves the file or directory to the system's recycle bin. See also [method DirAccess.remove]. + The method takes only global paths, so you may need to use [method ProjectSettings.globalize_path]. Do not use it for files in [code]res://[/code] as it will not work in exported projects. [b]Note:[/b] If the user has disabled the recycle bin on their system, the file will be permanently deleted instead. - [codeblock] + [codeblocks] + [gdscript] var file_to_remove = "user://slot1.sav" OS.move_to_trash(ProjectSettings.globalize_path(file_to_remove)) - [/codeblock] + [/gdscript] + [csharp] + var fileToRemove = "user://slot1.sav"; + OS.MoveToTrash(ProjectSettings.GlobalizePath(fileToRemove)); + [/csharp] + [/codeblocks] </description> </method> <method name="open_midi_inputs"> @@ -517,6 +538,14 @@ [b]Note:[/b] This method is implemented on Linux, macOS and Windows. </description> </method> + <method name="read_string_from_stdin"> + <return type="String" /> + <param index="0" name="block" type="bool" default="true" /> + <description> + Reads a user input string from the standard input (usually the terminal). + [b]Note:[/b] This method is implemented on Linux, macOS and Windows. Non-blocking reads are not currently supported on any platform. + </description> + </method> <method name="request_permission"> <return type="bool" /> <param index="0" name="name" type="String" /> diff --git a/doc/classes/OptionButton.xml b/doc/classes/OptionButton.xml index f10c096c1b..199535298c 100644 --- a/doc/classes/OptionButton.xml +++ b/doc/classes/OptionButton.xml @@ -190,6 +190,12 @@ Sets the tooltip of the item at index [param idx]. </description> </method> + <method name="show_popup"> + <return type="void" /> + <description> + Adjusts popup position and sizing for the [OptionButton], then shows the [PopupMenu]. Prefer this over using [code]get_popup().popup()[/code]. + </description> + </method> </methods> <members> <member name="action_mode" type="int" setter="set_action_mode" getter="get_action_mode" overrides="BaseButton" enum="BaseButton.ActionMode" default="0" /> diff --git a/doc/classes/PackedByteArray.xml b/doc/classes/PackedByteArray.xml index efb559522a..ccf012f82c 100644 --- a/doc/classes/PackedByteArray.xml +++ b/doc/classes/PackedByteArray.xml @@ -65,7 +65,7 @@ <return type="PackedByteArray" /> <param index="0" name="compression_mode" type="int" default="0" /> <description> - Returns a new [PackedByteArray] with the data compressed. Set the compression mode using one of [enum File.CompressionMode]'s constants. + Returns a new [PackedByteArray] with the data compressed. Set the compression mode using one of [enum FileAccess.CompressionMode]'s constants. </description> </method> <method name="count" qualifiers="const"> @@ -173,7 +173,7 @@ <param index="0" name="buffer_size" type="int" /> <param index="1" name="compression_mode" type="int" default="0" /> <description> - Returns a new [PackedByteArray] with the data decompressed. Set [param buffer_size] to the size of the uncompressed data. Set the compression mode using one of [enum File.CompressionMode]'s constants. + Returns a new [PackedByteArray] with the data decompressed. Set [param buffer_size] to the size of the uncompressed data. Set the compression mode using one of [enum FileAccess.CompressionMode]'s constants. </description> </method> <method name="decompress_dynamic" qualifiers="const"> @@ -181,7 +181,7 @@ <param index="0" name="max_output_size" type="int" /> <param index="1" name="compression_mode" type="int" default="0" /> <description> - Returns a new [PackedByteArray] with the data decompressed. Set the compression mode using one of [enum File.CompressionMode]'s constants. [b]This method only accepts gzip and deflate compression modes.[/b] + Returns a new [PackedByteArray] with the data decompressed. Set the compression mode using one of [enum FileAccess.CompressionMode]'s constants. [b]This method only accepts gzip and deflate compression modes.[/b] This method is potentially slower than [code]decompress[/code], as it may have to re-allocate its output buffer multiple times while decompressing, whereas [code]decompress[/code] knows it's output buffer size from the beginning. GZIP has a maximal compression ratio of 1032:1, meaning it's very possible for a small compressed payload to decompress to a potentially very large output. To guard against this, you may provide a maximum size this function is allowed to allocate in bytes via [param max_output_size]. Passing -1 will allow for unbounded output. If any positive value is passed, and the decompression exceeds that amount in bytes, then an error will be returned. </description> diff --git a/doc/classes/PackedScene.xml b/doc/classes/PackedScene.xml index 97595a6984..7ca1d5d60d 100644 --- a/doc/classes/PackedScene.xml +++ b/doc/classes/PackedScene.xml @@ -41,7 +41,7 @@ # Only `node` and `body` are now packed. var result = scene.pack(node) if result == OK: - var error = ResourceSaver.save("res://path/name.tscn", scene) # Or "user://..." + var error = ResourceSaver.save(scene, "res://path/name.tscn") # Or "user://..." if error != OK: push_error("An error occurred while saving the scene to disk.") [/gdscript] @@ -63,7 +63,7 @@ Error result = scene.Pack(node); if (result == Error.Ok) { - Error error = ResourceSaver.Save("res://path/name.tscn", scene); // Or "user://..." + Error error = ResourceSaver.Save(scene, "res://path/name.tscn"); // Or "user://..." if (error != Error.Ok) { GD.PushError("An error occurred while saving the scene to disk."); diff --git a/doc/classes/PanoramaSkyMaterial.xml b/doc/classes/PanoramaSkyMaterial.xml index 21c7f29585..0c27037f28 100644 --- a/doc/classes/PanoramaSkyMaterial.xml +++ b/doc/classes/PanoramaSkyMaterial.xml @@ -4,9 +4,9 @@ A [Material] used with [Sky] to draw a background texture. </brief_description> <description> - A resource referenced in a [Sky] that is used to draw a background. The Panorama sky material functions similar to skyboxes in other engines, except it uses an equirectangular sky map instead of a cube map. + A resource referenced in a [Sky] that is used to draw a background. The Panorama sky material functions similar to skyboxes in other engines, except it uses an equirectangular sky map instead of a cubemap. Using an HDR panorama is strongly recommended for accurate, high-quality reflections. Godot supports the Radiance HDR ([code].hdr[/code]) and OpenEXR ([code].exr[/code]) image formats for this purpose. - You can use [url=https://danilw.github.io/GLSL-howto/cubemap_to_panorama_js/cubemap_to_panorama.html]this tool[/url] to convert a cube map to an equirectangular sky map. + You can use [url=https://danilw.github.io/GLSL-howto/cubemap_to_panorama_js/cubemap_to_panorama.html]this tool[/url] to convert a cubemap to an equirectangular sky map. </description> <tutorials> </tutorials> diff --git a/doc/classes/PhysicsBody2D.xml b/doc/classes/PhysicsBody2D.xml index e8d7ac9920..59660b4de5 100644 --- a/doc/classes/PhysicsBody2D.xml +++ b/doc/classes/PhysicsBody2D.xml @@ -28,11 +28,13 @@ <param index="0" name="distance" type="Vector2" /> <param index="1" name="test_only" type="bool" default="false" /> <param index="2" name="safe_margin" type="float" default="0.08" /> + <param index="3" name="recovery_as_collision" type="bool" default="false" /> <description> Moves the body along the vector [param distance]. In order to be frame rate independent in [method Node._physics_process] or [method Node._process], [param distance] should be computed using [code]delta[/code]. Returns a [KinematicCollision2D], which contains information about the collision when stopped, or when touching another body along the motion. If [param test_only] is [code]true[/code], the body does not move but the would-be collision information is given. [param safe_margin] is the extra margin used for collision recovery (see [member CharacterBody2D.safe_margin] for more details). + If [param recovery_as_collision] is [code]true[/code], any depenetration from the recovery phase is also reported as a collision; this is used e.g. by [CharacterBody2D] for improving floor detection during floor snapping. </description> </method> <method name="remove_collision_exception_with"> @@ -48,11 +50,13 @@ <param index="1" name="distance" type="Vector2" /> <param index="2" name="collision" type="KinematicCollision2D" default="null" /> <param index="3" name="safe_margin" type="float" default="0.08" /> + <param index="4" name="recovery_as_collision" type="bool" default="false" /> <description> Checks for collisions without moving the body. In order to be frame rate independent in [method Node._physics_process] or [method Node._process], [param distance] should be computed using [code]delta[/code]. Virtually sets the node's position, scale and rotation to that of the given [Transform2D], then tries to move the body along the vector [param distance]. Returns [code]true[/code] if a collision would stop the body from moving along the whole path. [param collision] is an optional object of type [KinematicCollision2D], which contains additional information about the collision when stopped, or when touching another body along the motion. [param safe_margin] is the extra margin used for collision recovery (see [member CharacterBody2D.safe_margin] for more details). + If [param recovery_as_collision] is [code]true[/code], any depenetration from the recovery phase is also reported as a collision; this is useful for checking whether the body would [i]touch[/i] any other bodies. </description> </method> </methods> diff --git a/doc/classes/PhysicsBody3D.xml b/doc/classes/PhysicsBody3D.xml index 310671274f..bf7882a1ea 100644 --- a/doc/classes/PhysicsBody3D.xml +++ b/doc/classes/PhysicsBody3D.xml @@ -35,12 +35,14 @@ <param index="0" name="distance" type="Vector3" /> <param index="1" name="test_only" type="bool" default="false" /> <param index="2" name="safe_margin" type="float" default="0.001" /> - <param index="3" name="max_collisions" type="int" default="1" /> + <param index="3" name="recovery_as_collision" type="bool" default="false" /> + <param index="4" name="max_collisions" type="int" default="1" /> <description> Moves the body along the vector [param distance]. In order to be frame rate independent in [method Node._physics_process] or [method Node._process], [param distance] should be computed using [code]delta[/code]. The body will stop if it collides. Returns a [KinematicCollision3D], which contains information about the collision when stopped, or when touching another body along the motion. If [param test_only] is [code]true[/code], the body does not move but the would-be collision information is given. [param safe_margin] is the extra margin used for collision recovery (see [member CharacterBody3D.safe_margin] for more details). + If [param recovery_as_collision] is [code]true[/code], any depenetration from the recovery phase is also reported as a collision; this is used e.g. by [CharacterBody3D] for improving floor detection during floor snapping. [param max_collisions] allows to retrieve more than one collision result. </description> </method> @@ -65,12 +67,14 @@ <param index="1" name="distance" type="Vector3" /> <param index="2" name="collision" type="KinematicCollision3D" default="null" /> <param index="3" name="safe_margin" type="float" default="0.001" /> - <param index="4" name="max_collisions" type="int" default="1" /> + <param index="4" name="recovery_as_collision" type="bool" default="false" /> + <param index="5" name="max_collisions" type="int" default="1" /> <description> Checks for collisions without moving the body. In order to be frame rate independent in [method Node._physics_process] or [method Node._process], [param distance] should be computed using [code]delta[/code]. Virtually sets the node's position, scale and rotation to that of the given [Transform3D], then tries to move the body along the vector [param distance]. Returns [code]true[/code] if a collision would stop the body from moving along the whole path. [param collision] is an optional object of type [KinematicCollision3D], which contains additional information about the collision when stopped, or when touching another body along the motion. [param safe_margin] is the extra margin used for collision recovery (see [member CharacterBody3D.safe_margin] for more details). + If [param recovery_as_collision] is [code]true[/code], any depenetration from the recovery phase is also reported as a collision; this is useful for checking whether the body would [i]touch[/i] any other bodies. [param max_collisions] allows to retrieve more than one collision result. </description> </method> diff --git a/doc/classes/PhysicsServer2D.xml b/doc/classes/PhysicsServer2D.xml index 4b588033c0..18ac8a11df 100644 --- a/doc/classes/PhysicsServer2D.xml +++ b/doc/classes/PhysicsServer2D.xml @@ -53,6 +53,20 @@ <description> </description> </method> + <method name="area_get_collision_layer" qualifiers="const"> + <return type="int" /> + <param index="0" name="area" type="RID" /> + <description> + Returns the physics layer or layers an area belongs to. + </description> + </method> + <method name="area_get_collision_mask" qualifiers="const"> + <return type="int" /> + <param index="0" name="area" type="RID" /> + <description> + Returns the physics layer or layers an area can contact with. + </description> + </method> <method name="area_get_object_instance_id" qualifiers="const"> <return type="int" /> <param index="0" name="area" type="RID" /> diff --git a/doc/classes/PhysicsServer2DExtension.xml b/doc/classes/PhysicsServer2DExtension.xml index 4a5425bd63..9bb11e0d89 100644 --- a/doc/classes/PhysicsServer2DExtension.xml +++ b/doc/classes/PhysicsServer2DExtension.xml @@ -47,6 +47,18 @@ <description> </description> </method> + <method name="_area_get_collision_layer" qualifiers="virtual const"> + <return type="int" /> + <param index="0" name="area" type="RID" /> + <description> + </description> + </method> + <method name="_area_get_collision_mask" qualifiers="virtual const"> + <return type="int" /> + <param index="0" name="area" type="RID" /> + <description> + </description> + </method> <method name="_area_get_object_instance_id" qualifiers="virtual const"> <return type="int" /> <param index="0" name="area" type="RID" /> @@ -142,6 +154,13 @@ <description> </description> </method> + <method name="_area_set_pickable" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="area" type="RID" /> + <param index="1" name="pickable" type="bool" /> + <description> + </description> + </method> <method name="_area_set_shape" qualifiers="virtual"> <return type="void" /> <param index="0" name="area" type="RID" /> @@ -282,6 +301,19 @@ <description> </description> </method> + <method name="_body_collide_shape" qualifiers="virtual"> + <return type="bool" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="body_shape" type="int" /> + <param index="2" name="shape" type="RID" /> + <param index="3" name="shape_xform" type="Transform2D" /> + <param index="4" name="motion" type="Vector2" /> + <param index="5" name="results" type="void*" /> + <param index="6" name="result_max" type="int" /> + <param index="7" name="result_count" type="int32_t*" /> + <description> + </description> + </method> <method name="_body_create" qualifiers="virtual"> <return type="RID" /> <description> @@ -293,6 +325,12 @@ <description> </description> </method> + <method name="_body_get_collision_exceptions" qualifiers="virtual const"> + <return type="RID[]" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> <method name="_body_get_collision_layer" qualifiers="virtual const"> <return type="int" /> <param index="0" name="body" type="RID" /> @@ -323,6 +361,12 @@ <description> </description> </method> + <method name="_body_get_contacts_reported_depth_threshold" qualifiers="virtual const"> + <return type="float" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> <method name="_body_get_continuous_collision_detection_mode" qualifiers="virtual const"> <return type="int" enum="PhysicsServer2D.CCDMode" /> <param index="0" name="body" type="RID" /> @@ -461,6 +505,13 @@ <description> </description> </method> + <method name="_body_set_contacts_reported_depth_threshold" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="threshold" type="float" /> + <description> + </description> + </method> <method name="_body_set_continuous_collision_detection_mode" qualifiers="virtual"> <return type="void" /> <param index="0" name="body" type="RID" /> @@ -505,6 +556,13 @@ <description> </description> </method> + <method name="_body_set_pickable" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="pickable" type="bool" /> + <description> + </description> + </method> <method name="_body_set_shape" qualifiers="virtual"> <return type="void" /> <param index="0" name="body" type="RID" /> @@ -553,6 +611,13 @@ <description> </description> </method> + <method name="_body_set_state_sync_callback" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="callable" type="Callable" /> + <description> + </description> + </method> <method name="_body_test_motion" qualifiers="virtual const"> <return type="bool" /> <param index="0" name="body" type="RID" /> @@ -648,6 +713,13 @@ <description> </description> </method> + <method name="_joint_disable_collisions_between_bodies" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="joint" type="RID" /> + <param index="1" name="disable" type="bool" /> + <description> + </description> + </method> <method name="_joint_get_param" qualifiers="virtual const"> <return type="float" /> <param index="0" name="joint" type="RID" /> @@ -661,6 +733,12 @@ <description> </description> </method> + <method name="_joint_is_disabled_collisions_between_bodies" qualifiers="virtual const"> + <return type="bool" /> + <param index="0" name="joint" type="RID" /> + <description> + </description> + </method> <method name="_joint_make_damped_spring" qualifiers="virtual"> <return type="void" /> <param index="0" name="joint" type="RID" /> @@ -735,6 +813,26 @@ <description> </description> </method> + <method name="_shape_collide" qualifiers="virtual"> + <return type="bool" /> + <param index="0" name="shape_A" type="RID" /> + <param index="1" name="xform_A" type="Transform2D" /> + <param index="2" name="motion_A" type="Vector2" /> + <param index="3" name="shape_B" type="RID" /> + <param index="4" name="xform_B" type="Transform2D" /> + <param index="5" name="motion_B" type="Vector2" /> + <param index="6" name="results" type="void*" /> + <param index="7" name="result_max" type="int" /> + <param index="8" name="result_count" type="int32_t*" /> + <description> + </description> + </method> + <method name="_shape_get_custom_solver_bias" qualifiers="virtual const"> + <return type="float" /> + <param index="0" name="shape" type="RID" /> + <description> + </description> + </method> <method name="_shape_get_data" qualifiers="virtual const"> <return type="Variant" /> <param index="0" name="shape" type="RID" /> @@ -747,6 +845,13 @@ <description> </description> </method> + <method name="_shape_set_custom_solver_bias" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="shape" type="RID" /> + <param index="1" name="bias" type="float" /> + <description> + </description> + </method> <method name="_shape_set_data" qualifiers="virtual"> <return type="void" /> <param index="0" name="shape" type="RID" /> @@ -759,6 +864,18 @@ <description> </description> </method> + <method name="_space_get_contact_count" qualifiers="virtual const"> + <return type="int" /> + <param index="0" name="space" type="RID" /> + <description> + </description> + </method> + <method name="_space_get_contacts" qualifiers="virtual const"> + <return type="PackedVector2Array" /> + <param index="0" name="space" type="RID" /> + <description> + </description> + </method> <method name="_space_get_direct_state" qualifiers="virtual"> <return type="PhysicsDirectSpaceState2D" /> <param index="0" name="space" type="RID" /> @@ -785,6 +902,13 @@ <description> </description> </method> + <method name="_space_set_debug_contacts" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="space" type="RID" /> + <param index="1" name="max_contacts" type="int" /> + <description> + </description> + </method> <method name="_space_set_param" qualifiers="virtual"> <return type="void" /> <param index="0" name="space" type="RID" /> diff --git a/doc/classes/PhysicsServer3D.xml b/doc/classes/PhysicsServer3D.xml index da9e10c420..95f7fb69a2 100644 --- a/doc/classes/PhysicsServer3D.xml +++ b/doc/classes/PhysicsServer3D.xml @@ -40,6 +40,20 @@ Creates an [Area3D]. </description> </method> + <method name="area_get_collision_layer" qualifiers="const"> + <return type="int" /> + <param index="0" name="area" type="RID" /> + <description> + Returns the physics layer or layers an area belongs to. + </description> + </method> + <method name="area_get_collision_mask" qualifiers="const"> + <return type="int" /> + <param index="0" name="area" type="RID" /> + <description> + Returns the physics layer or layers an area can contact with. + </description> + </method> <method name="area_get_object_instance_id" qualifiers="const"> <return type="int" /> <param index="0" name="area" type="RID" /> diff --git a/doc/classes/PhysicsServer3DExtension.xml b/doc/classes/PhysicsServer3DExtension.xml index 46d3c8ae3e..1e9df54de5 100644 --- a/doc/classes/PhysicsServer3DExtension.xml +++ b/doc/classes/PhysicsServer3DExtension.xml @@ -34,6 +34,18 @@ <description> </description> </method> + <method name="_area_get_collision_layer" qualifiers="virtual const"> + <return type="int" /> + <param index="0" name="area" type="RID" /> + <description> + </description> + </method> + <method name="_area_get_collision_mask" qualifiers="virtual const"> + <return type="int" /> + <param index="0" name="area" type="RID" /> + <description> + </description> + </method> <method name="_area_get_object_instance_id" qualifiers="virtual const"> <return type="int" /> <param index="0" name="area" type="RID" /> @@ -274,6 +286,12 @@ <description> </description> </method> + <method name="_body_get_collision_exceptions" qualifiers="virtual const"> + <return type="RID[]" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> <method name="_body_get_collision_layer" qualifiers="virtual const"> <return type="int" /> <param index="0" name="body" type="RID" /> @@ -304,6 +322,12 @@ <description> </description> </method> + <method name="_body_get_contacts_reported_depth_threshold" qualifiers="virtual const"> + <return type="float" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> <method name="_body_get_direct_state" qualifiers="virtual"> <return type="PhysicsDirectBodyState3D" /> <param index="0" name="body" type="RID" /> @@ -368,6 +392,12 @@ <description> </description> </method> + <method name="_body_get_user_flags" qualifiers="virtual const"> + <return type="int" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> <method name="_body_is_axis_locked" qualifiers="virtual const"> <return type="bool" /> <param index="0" name="body" type="RID" /> @@ -457,6 +487,13 @@ <description> </description> </method> + <method name="_body_set_contacts_reported_depth_threshold" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="threshold" type="float" /> + <description> + </description> + </method> <method name="_body_set_enable_continuous_collision_detection" qualifiers="virtual"> <return type="void" /> <param index="0" name="body" type="RID" /> @@ -547,6 +584,20 @@ <description> </description> </method> + <method name="_body_set_state_sync_callback" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="callable" type="Callable" /> + <description> + </description> + </method> + <method name="_body_set_user_flags" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="flags" type="int" /> + <description> + </description> + </method> <method name="_body_test_motion" qualifiers="virtual const"> <return type="bool" /> <param index="0" name="body" type="RID" /> @@ -763,6 +814,18 @@ <description> </description> </method> + <method name="_joint_make_hinge_simple" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="joint" type="RID" /> + <param index="1" name="body_A" type="RID" /> + <param index="2" name="pivot_A" type="Vector3" /> + <param index="3" name="axis_A" type="Vector3" /> + <param index="4" name="body_B" type="RID" /> + <param index="5" name="pivot_B" type="Vector3" /> + <param index="6" name="axis_B" type="Vector3" /> + <description> + </description> + </method> <method name="_joint_make_pin" qualifiers="virtual"> <return type="void" /> <param index="0" name="joint" type="RID" /> @@ -842,18 +905,37 @@ <description> </description> </method> + <method name="_shape_get_custom_solver_bias" qualifiers="virtual const"> + <return type="float" /> + <param index="0" name="shape" type="RID" /> + <description> + </description> + </method> <method name="_shape_get_data" qualifiers="virtual const"> <return type="Variant" /> <param index="0" name="shape" type="RID" /> <description> </description> </method> + <method name="_shape_get_margin" qualifiers="virtual const"> + <return type="float" /> + <param index="0" name="shape" type="RID" /> + <description> + </description> + </method> <method name="_shape_get_type" qualifiers="virtual const"> <return type="int" enum="PhysicsServer3D.ShapeType" /> <param index="0" name="shape" type="RID" /> <description> </description> </method> + <method name="_shape_set_custom_solver_bias" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="shape" type="RID" /> + <param index="1" name="bias" type="float" /> + <description> + </description> + </method> <method name="_shape_set_data" qualifiers="virtual"> <return type="void" /> <param index="0" name="shape" type="RID" /> @@ -861,6 +943,13 @@ <description> </description> </method> + <method name="_shape_set_margin" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="shape" type="RID" /> + <param index="1" name="margin" type="float" /> + <description> + </description> + </method> <method name="_slider_joint_get_param" qualifiers="virtual const"> <return type="float" /> <param index="0" name="joint" type="RID" /> @@ -876,17 +965,250 @@ <description> </description> </method> + <method name="_soft_body_add_collision_exception" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="body_b" type="RID" /> + <description> + </description> + </method> + <method name="_soft_body_create" qualifiers="virtual"> + <return type="RID" /> + <description> + </description> + </method> <method name="_soft_body_get_bounds" qualifiers="virtual const"> <return type="AABB" /> <param index="0" name="body" type="RID" /> <description> </description> </method> + <method name="_soft_body_get_collision_exceptions" qualifiers="virtual const"> + <return type="RID[]" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> + <method name="_soft_body_get_collision_layer" qualifiers="virtual const"> + <return type="int" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> + <method name="_soft_body_get_collision_mask" qualifiers="virtual const"> + <return type="int" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> + <method name="_soft_body_get_damping_coefficient" qualifiers="virtual const"> + <return type="float" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> + <method name="_soft_body_get_drag_coefficient" qualifiers="virtual const"> + <return type="float" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> + <method name="_soft_body_get_linear_stiffness" qualifiers="virtual const"> + <return type="float" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> + <method name="_soft_body_get_point_global_position" qualifiers="virtual const"> + <return type="Vector3" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="point_index" type="int" /> + <description> + </description> + </method> + <method name="_soft_body_get_pressure_coefficient" qualifiers="virtual const"> + <return type="float" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> + <method name="_soft_body_get_simulation_precision" qualifiers="virtual const"> + <return type="int" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> + <method name="_soft_body_get_space" qualifiers="virtual const"> + <return type="RID" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> + <method name="_soft_body_get_state" qualifiers="virtual const"> + <return type="Variant" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="state" type="int" enum="PhysicsServer3D.BodyState" /> + <description> + </description> + </method> + <method name="_soft_body_get_total_mass" qualifiers="virtual const"> + <return type="float" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> + <method name="_soft_body_is_point_pinned" qualifiers="virtual const"> + <return type="bool" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="point_index" type="int" /> + <description> + </description> + </method> + <method name="_soft_body_move_point" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="point_index" type="int" /> + <param index="2" name="global_position" type="Vector3" /> + <description> + </description> + </method> + <method name="_soft_body_pin_point" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="point_index" type="int" /> + <param index="2" name="pin" type="bool" /> + <description> + </description> + </method> + <method name="_soft_body_remove_all_pinned_points" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> + <method name="_soft_body_remove_collision_exception" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="body_b" type="RID" /> + <description> + </description> + </method> + <method name="_soft_body_set_collision_layer" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="layer" type="int" /> + <description> + </description> + </method> + <method name="_soft_body_set_collision_mask" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="mask" type="int" /> + <description> + </description> + </method> + <method name="_soft_body_set_damping_coefficient" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="damping_coefficient" type="float" /> + <description> + </description> + </method> + <method name="_soft_body_set_drag_coefficient" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="drag_coefficient" type="float" /> + <description> + </description> + </method> + <method name="_soft_body_set_linear_stiffness" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="linear_stiffness" type="float" /> + <description> + </description> + </method> + <method name="_soft_body_set_mesh" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="mesh" type="RID" /> + <description> + </description> + </method> + <method name="_soft_body_set_pressure_coefficient" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="pressure_coefficient" type="float" /> + <description> + </description> + </method> + <method name="_soft_body_set_ray_pickable" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="enable" type="bool" /> + <description> + </description> + </method> + <method name="_soft_body_set_simulation_precision" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="simulation_precision" type="int" /> + <description> + </description> + </method> + <method name="_soft_body_set_space" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="space" type="RID" /> + <description> + </description> + </method> + <method name="_soft_body_set_state" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="state" type="int" enum="PhysicsServer3D.BodyState" /> + <param index="2" name="variant" type="Variant" /> + <description> + </description> + </method> + <method name="_soft_body_set_total_mass" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="total_mass" type="float" /> + <description> + </description> + </method> + <method name="_soft_body_set_transform" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="transform" type="Transform3D" /> + <description> + </description> + </method> + <method name="_soft_body_update_rendering_server" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="rendering_server_handler" type="PhysicsServer3DRenderingServerHandler" /> + <description> + </description> + </method> <method name="_space_create" qualifiers="virtual"> <return type="RID" /> <description> </description> </method> + <method name="_space_get_contact_count" qualifiers="virtual const"> + <return type="int" /> + <param index="0" name="space" type="RID" /> + <description> + </description> + </method> + <method name="_space_get_contacts" qualifiers="virtual const"> + <return type="PackedVector3Array" /> + <param index="0" name="space" type="RID" /> + <description> + </description> + </method> <method name="_space_get_direct_state" qualifiers="virtual"> <return type="PhysicsDirectSpaceState3D" /> <param index="0" name="space" type="RID" /> @@ -913,6 +1235,13 @@ <description> </description> </method> + <method name="_space_set_debug_contacts" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="space" type="RID" /> + <param index="1" name="max_contacts" type="int" /> + <description> + </description> + </method> <method name="_space_set_param" qualifiers="virtual"> <return type="void" /> <param index="0" name="space" type="RID" /> diff --git a/doc/classes/PhysicsTestMotionParameters2D.xml b/doc/classes/PhysicsTestMotionParameters2D.xml index 4f2b62f2d9..d8f96511dd 100644 --- a/doc/classes/PhysicsTestMotionParameters2D.xml +++ b/doc/classes/PhysicsTestMotionParameters2D.xml @@ -29,8 +29,8 @@ Motion vector to define the length and direction of the motion to test. </member> <member name="recovery_as_collision" type="bool" setter="set_recovery_as_collision_enabled" getter="is_recovery_as_collision_enabled" default="false"> - If set to [code]true[/code], any depenetration from the recovery phase is reported as a collision; this is used e.g. by [method CharacterBody2D.move_and_slide] for improving floor detection when floor snapping is disabled. - If set to [code]false[/code], only collisions resulting from the motion are reported; this is used e.g. by [method PhysicsBody2D.move_and_collide]. + If set to [code]true[/code], any depenetration from the recovery phase is reported as a collision; this is used e.g. by [CharacterBody2D] for improving floor detection during floor snapping. + If set to [code]false[/code], only collisions resulting from the motion are reported, which is generally the desired behaviour. </member> </members> </class> diff --git a/doc/classes/PhysicsTestMotionParameters3D.xml b/doc/classes/PhysicsTestMotionParameters3D.xml index 5b07796a10..e8f80ae131 100644 --- a/doc/classes/PhysicsTestMotionParameters3D.xml +++ b/doc/classes/PhysicsTestMotionParameters3D.xml @@ -32,8 +32,8 @@ Motion vector to define the length and direction of the motion to test. </member> <member name="recovery_as_collision" type="bool" setter="set_recovery_as_collision_enabled" getter="is_recovery_as_collision_enabled" default="false"> - If set to [code]true[/code], any depenetration from the recovery phase is reported as a collision; this is used e.g. by [method CharacterBody3D.move_and_slide] for improving floor detection when floor snapping is disabled. - If set to [code]false[/code], only collisions resulting from the motion are detected; this is used e.g. by [method PhysicsBody3D.move_and_collide]. + If set to [code]true[/code], any depenetration from the recovery phase is reported as a collision; this is used e.g. by [CharacterBody3D] for improving floor detection during floor snapping. + If set to [code]false[/code], only collisions resulting from the motion are reported, which is generally the desired behaviour. </member> </members> </class> diff --git a/doc/classes/PlaneMesh.xml b/doc/classes/PlaneMesh.xml index 564b6fe743..1dceac70b0 100644 --- a/doc/classes/PlaneMesh.xml +++ b/doc/classes/PlaneMesh.xml @@ -31,10 +31,10 @@ [PlaneMesh] will face the positive X-axis. </constant> <constant name="FACE_Y" value="1" enum="Orientation"> - [PlaneMesh] will face the positive Y-axis. This matches the behaviour of the [PlaneMesh] in Godot 3.x. + [PlaneMesh] will face the positive Y-axis. This matches the behavior of the [PlaneMesh] in Godot 3.x. </constant> <constant name="FACE_Z" value="2" enum="Orientation"> - [PlaneMesh] will face the positive Z-axis. This matches the behvaiour of the QuadMesh in Godot 3.x. + [PlaneMesh] will face the positive Z-axis. This matches the behavior of the QuadMesh in Godot 3.x. </constant> </constants> </class> diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml index 3dbf7c75e5..85bb9a64a6 100644 --- a/doc/classes/ProjectSettings.xml +++ b/doc/classes/ProjectSettings.xml @@ -159,6 +159,15 @@ Sets the order of a configuration value (influences when saved to the config file). </description> </method> + <method name="set_restart_if_changed"> + <return type="void" /> + <param index="0" name="name" type="String" /> + <param index="1" name="restart" type="bool" /> + <description> + Sets whether a setting requires restarting the editor to properly take effect. + [b]Note:[/b] This is just a hint to display to the user that the editor must be restarted for changes to take effect. Enabling [method set_restart_if_changed] does [i]not[/i] delay the setting being set when changed. + </description> + </method> <method name="set_setting"> <return type="void" /> <param index="0" name="name" type="String" /> @@ -267,6 +276,15 @@ <member name="application/run/main_scene" type="String" setter="" getter="" default=""""> Path to the main scene file that will be loaded when the project runs. </member> + <member name="application/run/max_fps" type="int" setter="" getter="" default="0"> + Maximum number of frames per second allowed. A value of [code]0[/code] means "no limit". The actual number of frames per second may still be below this value if the CPU or GPU cannot keep up with the project logic and rendering. + Limiting the FPS can be useful to reduce system power consumption, which reduces heat and noise emissions (and improves battery life on mobile devices). + If [member display/window/vsync/vsync_mode] is set to [code]Enabled[/code] or [code]Adaptive[/code], it takes precedence and the forced FPS number cannot exceed the monitor's refresh rate. + If [member display/window/vsync/vsync_mode] is [code]Enabled[/code], on monitors with variable refresh rate enabled (G-Sync/FreeSync), using a FPS limit a few frames lower than the monitor's refresh rate will [url=https://blurbusters.com/howto-low-lag-vsync-on/]reduce input lag while avoiding tearing[/url]. + If [member display/window/vsync/vsync_mode] is [code]Disabled[/code], limiting the FPS to a high value that can be consistently reached on the system can reduce input lag compared to an uncapped framerate. Since this works by ensuring the GPU load is lower than 100%, this latency reduction is only effective in GPU-bottlenecked scenarios, not CPU-bottlenecked scenarios. + See also [member physics/common/physics_ticks_per_second]. + [b]Note:[/b] This property is only read when the project starts. To change the rendering FPS cap at runtime, set [member Engine.max_fps] instead. + </member> <member name="audio/buses/channel_disable_threshold_db" type="float" setter="" getter="" default="-60.0"> Audio buses will disable automatically when sound goes below a given dB threshold for a given time. This saves CPU as effects assigned to that bus will no longer do any processing. </member> @@ -330,25 +348,25 @@ Desktop override for [member debug/file_logging/enable_file_logging], as log files are not readily accessible on mobile/Web platforms. </member> <member name="debug/file_logging/log_path" type="String" setter="" getter="" default=""user://logs/godot.log""> - Path to logs within the project. Using an [code]user://[/code] path is recommended. + Path at which to store log files for the project. Using a path under [code]user://[/code] is recommended. </member> <member name="debug/file_logging/max_log_files" type="int" setter="" getter="" default="5"> Specifies the maximum number of log files allowed (used for rotation). </member> <member name="debug/gdscript/warnings/assert_always_false" type="int" setter="" getter="" default="1"> - If [code]enabled[/code], prints a warning or an error when an [code]assert[/code] call always returns false. + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when an [code]assert[/code] call always evaluates to false. </member> <member name="debug/gdscript/warnings/assert_always_true" type="int" setter="" getter="" default="1"> - If [code]enabled[/code], prints a warning or an error when an [code]assert[/code] call always returns true. + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when an [code]assert[/code] call always evaluates to true. </member> <member name="debug/gdscript/warnings/constant_used_as_function" type="int" setter="" getter="" default="1"> - If [code]enabled[/code], prints a warning or an error when a constant is used as a function. + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when a constant is used as a function. </member> <member name="debug/gdscript/warnings/deprecated_keyword" type="int" setter="" getter="" default="1"> - If [code]enabled[/code], prints a warning or an error when deprecated keywords are used. + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when deprecated keywords are used. </member> <member name="debug/gdscript/warnings/empty_file" type="int" setter="" getter="" default="1"> - If [code]enabled[/code], prints a warning or an error when an empty file is parsed. + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when an empty file is parsed. </member> <member name="debug/gdscript/warnings/enable" type="bool" setter="" getter="" default="true"> If [code]true[/code], enables specific GDScript warnings (see [code]debug/gdscript/warnings/*[/code] settings). If [code]false[/code], disables all GDScript warnings. @@ -357,87 +375,88 @@ If [code]true[/code], scripts in the [code]res://addons[/code] folder will not generate warnings. </member> <member name="debug/gdscript/warnings/function_used_as_property" type="int" setter="" getter="" default="1"> - If [code]enabled[/code], prints a warning or an error when using a function as if it was a property. + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when using a function as if it is a property. </member> <member name="debug/gdscript/warnings/incompatible_ternary" type="int" setter="" getter="" default="1"> - If [code]enabled[/code], prints a warning or an error when a ternary operator may emit values with incompatible types. + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when a ternary operator may emit values with incompatible types. </member> <member name="debug/gdscript/warnings/int_assigned_to_enum" type="int" setter="" getter="" default="1"> - If [code]enabled[/code], prints a warning or an error when trying to assign an integer to a variable that expects an enum value. + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when trying to assign an integer to a variable that expects an enum value. </member> <member name="debug/gdscript/warnings/integer_division" type="int" setter="" getter="" default="1"> - If [code]enabled[/code], prints a warning or an error when dividing an integer by another integer (the decimal part will be discarded). + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when dividing an integer by another integer (the decimal part will be discarded). </member> <member name="debug/gdscript/warnings/narrowing_conversion" type="int" setter="" getter="" default="1"> - If [code]enabled[/code], prints a warning or an error when passing a floating-point value to a function that expects an integer (it will be converted and lose precision). + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when passing a floating-point value to a function that expects an integer (it will be converted and lose precision). </member> <member name="debug/gdscript/warnings/property_used_as_function" type="int" setter="" getter="" default="1"> - If [code]enabled[/code], prints a warning or an error when using a property as if it was a function. + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when using a property as if it is a function. </member> <member name="debug/gdscript/warnings/redundant_await" type="int" setter="" getter="" default="1"> - If [code]enabled[/code], prints a warning or an error when a function that is not a coroutine is called with await. + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when a function that is not a coroutine is called with await. </member> <member name="debug/gdscript/warnings/return_value_discarded" type="int" setter="" getter="" default="1"> - If [code]enabled[/code], prints a warning or an error when calling a function without using its return value (by assigning it to a variable or using it as a function argument). Such return values are sometimes used to denote possible errors using the [enum Error] enum. + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when calling a function without using its return value (by assigning it to a variable or using it as a function argument). Such return values are sometimes used to denote possible errors using the [enum Error] enum. </member> <member name="debug/gdscript/warnings/shadowed_global_identifier" type="int" setter="" getter="" default="1"> - If [code]enabled[/code], prints a warning or an error when defining a local or subclass member variable, signal, or enum that would have the same name as a built-in function or global class name, which possibly shadow it. + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when defining a local or member variable, signal, or enum that would have the same name as a built-in function or global class name, thus shadowing it. </member> <member name="debug/gdscript/warnings/shadowed_variable" type="int" setter="" getter="" default="1"> - If [code]enabled[/code], prints a warning or an error when defining a local or subclass member variable that would shadow a variable at an upper level (such as a member variable). + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when defining a local or member variable that would shadow a member variable that the class defines. </member> <member name="debug/gdscript/warnings/shadowed_variable_base_class" type="int" setter="" getter="" default="1"> + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when defining a local or subclass member variable that would shadow a variable that is inherited from a parent class. </member> <member name="debug/gdscript/warnings/standalone_expression" type="int" setter="" getter="" default="1"> - If [code]enabled[/code], prints a warning or an error when calling an expression that has no effect on the surrounding code, such as writing [code]2 + 2[/code] as a statement. + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when calling an expression that has no effect on the surrounding code, such as writing [code]2 + 2[/code] as a statement. </member> <member name="debug/gdscript/warnings/standalone_ternary" type="int" setter="" getter="" default="1"> - If [code]enabled[/code], prints a warning or an error when calling a ternary expression that has no effect on the surrounding code, such as writing [code]42 if active else 0[/code] as a statement. + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when calling a ternary expression that has no effect on the surrounding code, such as writing [code]42 if active else 0[/code] as a statement. </member> <member name="debug/gdscript/warnings/treat_warnings_as_errors" type="bool" setter="" getter="" default="false"> - If [code]true[/code], all warnings will be reported as if they were errors. + If [code]true[/code], all warnings will be reported as if they are errors. </member> <member name="debug/gdscript/warnings/unassigned_variable" type="int" setter="" getter="" default="1"> - If [code]enabled[/code], prints a warning or an error when using a variable that wasn't previously assigned. + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when using a variable that wasn't previously assigned. </member> <member name="debug/gdscript/warnings/unassigned_variable_op_assign" type="int" setter="" getter="" default="1"> - If [code]enabled[/code], prints a warning or an error when assigning a variable using an assignment operator like [code]+=[/code] if the variable wasn't previously assigned. + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when assigning a variable using an assignment operator like [code]+=[/code] if the variable wasn't previously assigned. </member> <member name="debug/gdscript/warnings/unreachable_code" type="int" setter="" getter="" default="1"> - If [code]enabled[/code], prints a warning or an error when unreachable code is detected (such as after a [code]return[/code] statement that will always be executed). + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when unreachable code is detected (such as after a [code]return[/code] statement that will always be executed). </member> <member name="debug/gdscript/warnings/unreachable_pattern" type="int" setter="" getter="" default="1"> - If [code]enabled[/code], prints a warning or an error when an unreachable [code]match[/code] pattern is detected. + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when an unreachable [code]match[/code] pattern is detected. </member> <member name="debug/gdscript/warnings/unsafe_call_argument" type="int" setter="" getter="" default="0"> - If [code]enabled[/code], prints a warning or an error when using an expression whose type may not be compatible with the function parameter expected. + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when using an expression whose type may not be compatible with the function parameter expected. </member> <member name="debug/gdscript/warnings/unsafe_cast" type="int" setter="" getter="" default="0"> - If [code]enabled[/code], prints a warning or an error when performing an unsafe cast. + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when performing an unsafe cast. </member> <member name="debug/gdscript/warnings/unsafe_method_access" type="int" setter="" getter="" default="0"> - If [code]enabled[/code], prints a warning or an error when calling a method whose presence is not guaranteed at compile-time in the class. + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when calling a method whose presence is not guaranteed at compile-time in the class. </member> <member name="debug/gdscript/warnings/unsafe_property_access" type="int" setter="" getter="" default="0"> - If [code]enabled[/code], prints a warning or an error when accessing a property whose presence is not guaranteed at compile-time in the class. + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when accessing a property whose presence is not guaranteed at compile-time in the class. </member> <member name="debug/gdscript/warnings/unused_local_constant" type="int" setter="" getter="" default="1"> - If [code]enabled[/code], prints a warning or an error when a local constant is never used. + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when a local constant is never used. </member> <member name="debug/gdscript/warnings/unused_parameter" type="int" setter="" getter="" default="1"> - If [code]enabled[/code], prints a warning or an error when a function parameter is never used. + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when a function parameter is never used. </member> <member name="debug/gdscript/warnings/unused_private_class_variable" type="int" setter="" getter="" default="1"> - If [code]enabled[/code], prints a warning or an error when a class variable is never used. + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when a private member variable is never used. </member> <member name="debug/gdscript/warnings/unused_signal" type="int" setter="" getter="" default="1"> - If [code]enabled[/code], prints a warning or an error when a signal is unused. + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when a signal is declared but never emitted. </member> <member name="debug/gdscript/warnings/unused_variable" type="int" setter="" getter="" default="1"> - If [code]enabled[/code], prints a warning or an error when a local variable is unused. + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when a local variable is unused. </member> <member name="debug/gdscript/warnings/void_assignment" type="int" setter="" getter="" default="1"> - If [code]enabled[/code], prints a warning or an error when assigning the result of a function that returns [code]void[/code] to a variable. + When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when assigning the result of a function that returns [code]void[/code] to a variable. </member> <member name="debug/settings/crash_handler/message" type="String" setter="" getter="" default=""Please include this when reporting the bug to the project developer.""> Message to be displayed before the backtrace when the engine crashes. By default, this message is only used in exported projects due to the editor-only override applied to this setting. @@ -445,12 +464,6 @@ <member name="debug/settings/crash_handler/message.editor" type="String" setter="" getter="" default=""Please include this when reporting the bug on: https://github.com/godotengine/godot/issues""> Editor-only override for [member debug/settings/crash_handler/message]. Does not affect exported projects in debug or release mode. </member> - <member name="debug/settings/fps/force_fps" type="int" setter="" getter="" default="0"> - Maximum number of frames per second allowed. The actual number of frames per second may still be below this value if the game is lagging. - If [member display/window/vsync/vsync_mode] is set to [code]Enabled[/code] or [code]Adaptive[/code], it takes precedence and the forced FPS number cannot exceed the monitor's refresh rate. See also [member physics/common/physics_ticks_per_second]. - This setting is therefore mostly relevant for lowering the maximum FPS below VSync, e.g. to perform non-real-time rendering of static frames, or test the project under lag conditions. - [b]Note:[/b] This property is only read when the project starts. To change the rendering FPS cap at runtime, set [member Engine.target_fps] instead. - </member> <member name="debug/settings/gdscript/max_call_stack" type="int" setter="" getter="" default="1024"> Maximum call stack allowed for debugging GDScript. </member> @@ -461,6 +474,7 @@ Print frames per second to standard output every second. </member> <member name="debug/settings/stdout/print_gpu_profile" type="bool" setter="" getter="" default="false"> + Print GPU profile information to standard output every second. This includes how long each frame takes the GPU to render on average, broken down into different steps of the render pipeline, such as CanvasItems, shadows, glow, etc. </member> <member name="debug/settings/stdout/verbose_stdout" type="bool" setter="" getter="" default="false"> Print more information to standard output when running. It displays information such as memory leaks, which scenes and resources are being loaded, etc. This can also be enabled using the [code]--verbose[/code] or [code]-v[/code] command line argument, even on an exported project. See also [method OS.is_stdout_verbose] and [method @GlobalScope.print_verbose]. @@ -562,15 +576,25 @@ Forces the main window to be borderless. [b]Note:[/b] This setting is ignored on iOS, Android, and Web. </member> - <member name="display/window/size/fullscreen" type="bool" setter="" getter="" default="false"> - Sets the main window to full screen when the project starts. Note that this is not [i]exclusive[/i] fullscreen. On Windows and Linux, a borderless window is used to emulate fullscreen. On macOS, a new desktop is used to display the running project. - Regardless of the platform, enabling fullscreen will change the window size to match the monitor's size. Therefore, make sure your project supports [url=$DOCS_URL/tutorials/rendering/multiple_resolutions.html]multiple resolutions[/url] when enabling fullscreen mode. - [b]Note:[/b] This setting is ignored on iOS, Android, and Web. + <member name="display/window/size/extend_to_title" type="bool" setter="" getter="" default="false"> + Main window content is expanded to the full size of the window. Unlike a borderless window, the frame is left intact and can be used to resize the window, and the title bar is transparent, but has minimize/maximize/close buttons. + [b]Note:[/b] This setting is implemented only on macOS. + </member> + <member name="display/window/size/mode" type="int" setter="" getter="" default="0"> + Main window mode. See [enum DisplayServer.WindowMode] for possible values and how each mode behaves. + </member> + <member name="display/window/size/no_focus" type="bool" setter="" getter="" default="false"> + Main window can't be focused. No-focus window will ignore all input, except mouse clicks. </member> <member name="display/window/size/resizable" type="bool" setter="" getter="" default="true"> Allows the window to be resizable by default. [b]Note:[/b] This setting is ignored on iOS. </member> + <member name="display/window/size/transparent" type="bool" setter="" getter="" default="false"> + Main window background can be transparent. + [b]Note:[/b] To use transparent splash screen, set [member application/boot_splash/bg_color] to [code]Color(0, 0, 0, 0)[/code]. + [b]Note:[/b] This setting has no effect if [member display/window/per_pixel_transparency/allowed] is set to [code]false[/code]. + </member> <member name="display/window/size/viewport_height" type="int" setter="" getter="" default="648"> Sets the game's main viewport height. On desktop platforms, this is also the initial window height, represented by an indigo-colored rectangle in the 2D editor. Stretch mode settings also use this as a reference when using the [code]canvas_items[/code] or [code]viewport[/code] stretch modes. See also [member display/window/size/viewport_width], [member display/window/size/window_width_override] and [member display/window/size/window_height_override]. </member> @@ -640,10 +664,22 @@ If [code]true[/code], Blender 3D scene files with the [code].blend[/code] extension will be imported by converting them to glTF 2.0. This requires configuring a path to a Blender executable in the editor settings at [code]filesystem/import/blender/blender3_path[/code]. Blender 3.0 or later is required. </member> + <member name="filesystem/import/blender/enabled.android" type="bool" setter="" getter="" default="false"> + Override for [member filesystem/import/blender/enabled] on Android where Blender can't easily be accessed from Godot. + </member> + <member name="filesystem/import/blender/enabled.web" type="bool" setter="" getter="" default="false"> + Override for [member filesystem/import/blender/enabled] on the Web where Blender can't easily be accessed from Godot. + </member> <member name="filesystem/import/fbx/enabled" type="bool" setter="" getter="" default="true"> If [code]true[/code], Autodesk FBX 3D scene files with the [code].fbx[/code] extension will be imported by converting them to glTF 2.0. This requires configuring a path to a FBX2glTF executable in the editor settings at [code]filesystem/import/fbx/fbx2gltf_path[/code]. </member> + <member name="filesystem/import/fbx/enabled.android" type="bool" setter="" getter="" default="false"> + Override for [member filesystem/import/fbx/enabled] on Android where FBX2glTF can't easily be accessed from Godot. + </member> + <member name="filesystem/import/fbx/enabled.web" type="bool" setter="" getter="" default="false"> + Override for [member filesystem/import/fbx/enabled] on the Web where FBX2glTF can't easily be accessed from Godot. + </member> <member name="gui/common/default_scroll_deadzone" type="int" setter="" getter="" default="0"> Default value for [member ScrollContainer.scroll_deadzone], which will be used for all [ScrollContainer]s unless overridden. </member> @@ -651,9 +687,10 @@ If [code]true[/code], swaps Cancel and OK buttons in dialogs on Windows and UWP to follow interface conventions. </member> <member name="gui/common/text_edit_undo_stack_max_size" type="int" setter="" getter="" default="1024"> + Maximum undo/redo history size for [TextEdit] fields. </member> <member name="gui/theme/custom" type="String" setter="" getter="" default=""""> - Path to a custom [Theme] resource file to use for the project ([code]theme[/code] or generic [code]tres[/code]/[code]res[/code] extension). + Path to a custom [Theme] resource file to use for the project ([code].theme[/code] or generic [code].tres[/code]/[code].res[/code] extension). </member> <member name="gui/theme/custom_font" type="String" setter="" getter="" default=""""> Path to a custom [Font] resource to use as default for all GUI elements of the project. @@ -678,6 +715,8 @@ Default font glyph sub-pixel positioning mode. See [member FontFile.subpixel_positioning]. </member> <member name="gui/theme/default_theme_scale" type="float" setter="" getter="" default="1.0"> + The default scale factor for [Control]s, when not overriden by a [Theme]. + [b]Note:[/b] This property is only read when the project starts. To change the default scale at runtime, set [member ThemeDB.fallback_base_scale] instead. </member> <member name="gui/theme/lcd_subpixel_layout" type="int" setter="" getter="" default="1"> LCD sub-pixel layout used for font anti-aliasing. See [enum TextServer.FontLCDSubpixelLayout]. @@ -700,8 +739,12 @@ [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_copy" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to copy a selection to the clipboard. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_cut" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to cut a selection to the clipboard. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_down" type="Dictionary" setter="" getter=""> Default [InputEventAction] to move down in the UI. @@ -712,10 +755,16 @@ [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_filedialog_refresh" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to refresh the contents of the current directory of a [FileDialog]. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_filedialog_show_hidden" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to toggle showing hidden files and directories in a [FileDialog]. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_filedialog_up_one_level" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to go up one directory in a [FileDialog]. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_focus_next" type="Dictionary" setter="" getter=""> Default [InputEventAction] to focus the next [Control] in the scene. The focus behavior can be configured via [member Control.focus_next]. @@ -726,8 +775,12 @@ [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_graph_delete" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to delete a [GraphNode] in a [GraphEdit]. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_graph_duplicate" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to duplicate a [GraphNode] in a [GraphEdit]. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_home" type="Dictionary" setter="" getter=""> Default [InputEventAction] to go to the start position of a [Control] (e.g. first item in an [ItemList] or a [Tree]), matching the behavior of [constant KEY_HOME] on typical desktop UI systems. @@ -738,6 +791,8 @@ [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_menu" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to open a context menu in a text field. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_page_down" type="Dictionary" setter="" getter=""> Default [InputEventAction] to go down a page in a [Control] (e.g. in an [ItemList] or a [Tree]), matching the behavior of [constant KEY_PAGEDOWN] on typical desktop UI systems. @@ -748,8 +803,12 @@ [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_paste" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to paste from the clipboard. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_redo" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to redo an undone action. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_right" type="Dictionary" setter="" getter=""> Default [InputEventAction] to move right in the UI. @@ -762,96 +821,172 @@ <member name="input/ui_swap_input_direction" type="Dictionary" setter="" getter=""> </member> <member name="input/ui_text_backspace" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to delete the character before the text cursor. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_text_backspace_all_to_left" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to delete [b]all[/b] text before the text cursor. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_text_backspace_all_to_left.macos" type="Dictionary" setter="" getter=""> + macOS specific override for the shortcut to delete all text before the text cursor. </member> <member name="input/ui_text_backspace_word" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to delete all characters before the cursor up until a whitespace or punctuation character. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_text_backspace_word.macos" type="Dictionary" setter="" getter=""> + macOS specific override for the shortcut to delete a word. </member> <member name="input/ui_text_caret_document_end" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to move the text cursor the the end of the text. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_text_caret_document_end.macos" type="Dictionary" setter="" getter=""> + macOS specific override for the shortcut to move the text cursor to the end of the text. </member> <member name="input/ui_text_caret_document_start" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to move the text cursor to the start of the text. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_text_caret_document_start.macos" type="Dictionary" setter="" getter=""> + macOS specific override for the shortcut to move the text cursor to the start of the text. </member> <member name="input/ui_text_caret_down" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to move the text cursor down. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_text_caret_left" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to move the text cursor left. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_text_caret_line_end" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to move the text cursor to the end of the line. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_text_caret_line_end.macos" type="Dictionary" setter="" getter=""> + macOS specific override for the shortcut to move the text cursor to the end of the line. </member> <member name="input/ui_text_caret_line_start" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to move the text cursor to the start of the line. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_text_caret_line_start.macos" type="Dictionary" setter="" getter=""> + macOS specific override for the shortcut to move the text cursor to the start of the line. </member> <member name="input/ui_text_caret_page_down" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to move the text cursor down one page. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_text_caret_page_up" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to move the text cursor up one page. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_text_caret_right" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to move the text cursor right. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_text_caret_up" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to move the text cursor up. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_text_caret_word_left" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to move the text cursor left to the next whitespace or punctuation. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_text_caret_word_left.macos" type="Dictionary" setter="" getter=""> + macOS specific override for the shortcut to move the text cursor back one word. </member> <member name="input/ui_text_caret_word_right" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to move the text cursor right to the next whitespace or punctuation. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_text_caret_word_right.macos" type="Dictionary" setter="" getter=""> + macOS specific override for the shortcut to move the text cursor forward one word. </member> <member name="input/ui_text_completion_accept" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to accept an autocompetion hint. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_text_completion_query" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to request autocompetion. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_text_completion_replace" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to accept an autocompetion hint, replacing existing text. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_text_dedent" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to unindent text. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_text_delete" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to delete the character after the text cursor. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_text_delete_all_to_right" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to delete [b]all[/b] text after the text cursor. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_text_delete_all_to_right.macos" type="Dictionary" setter="" getter=""> + macOS specific override for the shortcut to delete all text after the text cursor. </member> <member name="input/ui_text_delete_word" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to delete all characters after the cursor up until a whitespace or punctuation character. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_text_delete_word.macos" type="Dictionary" setter="" getter=""> + macOS specific override for the shortcut to delete a word after the text cursor. </member> <member name="input/ui_text_indent" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to indent the current line. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_text_newline" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to insert a new line at the position of the text cursor. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_text_newline_above" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to insert a new line before the current one. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_text_newline_blank" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to insert a new line after the current one. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_text_scroll_down" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to scroll down one line of text. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_text_scroll_down.macos" type="Dictionary" setter="" getter=""> + macOS specific override for the shortcut to scroll down one line. </member> <member name="input/ui_text_scroll_up" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to scroll up one line of text. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_text_scroll_up.macos" type="Dictionary" setter="" getter=""> + macOS specific override for the shortcut to scroll up one line. </member> <member name="input/ui_text_select_all" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to select all text. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_text_select_word_under_caret" type="Dictionary" setter="" getter=""> If no selection is currently active, selects the word currently under the caret in text fields. If a selection is currently active, deselects the current selection. [b]Note:[/b] Currently, this is only implemented in [TextEdit], not [LineEdit]. </member> <member name="input/ui_text_submit" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to submit a text field. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_text_toggle_insert_mode" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to toggle [i]instert mode[/i] in a text field. While in insert mode, inserting new text overrides the character after the cursor, unless the next character is a new line. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_undo" type="Dictionary" setter="" getter=""> + Default [InputEventAction] to undo the most recent action. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. </member> <member name="input/ui_up" type="Dictionary" setter="" getter=""> Default [InputEventAction] to move up in the UI. @@ -1641,7 +1776,7 @@ [b]Note:[/b] This property is only read when the project starts. To change the physics FPS at runtime, set [member Engine.physics_jitter_fix] instead. </member> <member name="physics/common/physics_ticks_per_second" type="int" setter="" getter="" default="60"> - The number of fixed iterations per second. This controls how often physics simulation and [method Node._physics_process] methods are run. See also [member debug/settings/fps/force_fps]. + The number of fixed iterations per second. This controls how often physics simulation and [method Node._physics_process] methods are run. See also [member application/run/max_fps]. [b]Note:[/b] This property is only read when the project starts. To change the physics FPS at runtime, set [member Engine.physics_ticks_per_second] instead. [b]Note:[/b] Only 8 physics ticks may be simulated per rendered frame at most. If more than 8 physics ticks have to be simulated per rendered frame to keep up with rendering, the game will appear to slow down (even if [code]delta[/code] is used consistently in physics calculations). Therefore, it is recommended not to increase [member physics/common/physics_ticks_per_second] above 240. Otherwise, the game will slow down when the rendering framerate goes below 30 FPS. </member> @@ -1666,6 +1801,7 @@ Another way to combat specular aliasing is to enable [member rendering/anti_aliasing/screen_space_roughness_limiter/enabled]. </member> <member name="rendering/anti_aliasing/quality/use_debanding" type="bool" setter="" getter="" default="false"> + If [code]true[/code], uses a fast post-processing dithering filter on the default screen [Viewport] to make banding significantly less visible. In some cases, the dithering pattern may be slightly noticable. Note that this will make losslessly compressed (PNG etc.) screenshots larger. </member> <member name="rendering/anti_aliasing/quality/use_taa" type="bool" setter="" getter="" default="false"> Enables Temporal Anti-Aliasing for the default screen [Viewport]. TAA works by jittering the camera and accumulating the images of the last rendered frames, motion vector rendering is used to account for camera and object motion. Enabling TAA can make the image blurrier, which is partially counteracted by automatically using a negative mipmap LOD bias (see [member rendering/textures/default_filters/texture_mipmap_bias]). @@ -1693,13 +1829,6 @@ If [code]true[/code], performs a previous depth pass before rendering 3D materials. This increases performance significantly in scenes with high overdraw, when complex materials and lighting are used. However, in scenes with few occluded surfaces, the depth prepass may reduce performance. If your game is viewed from a fixed angle that makes it easy to avoid overdraw (such as top-down or side-scrolling perspective), consider disabling the depth prepass to improve performance. This setting can be changed at run-time to optimize performance depending on the scene currently being viewed. [b]Note:[/b] Only supported when using the Vulkan Clustered backend or the OpenGL backend. When using Vulkan Mobile there is no depth prepass performed. </member> - <member name="rendering/driver/driver_name" type="String" setter="" getter="" default=""vulkan""> - The video driver to use. - [b]Note:[/b] OpenGL support is currently incomplete. Only basic rendering is supported. - [b]Note:[/b] The backend in use can be overridden at runtime via the [code]--rendering-driver[/code] command line argument. - [b]FIXME:[/b] No longer valid after DisplayServer split: - In such cases, this property is not updated, so use [code]OS.get_current_video_driver[/code] to query it at run-time. - </member> <member name="rendering/driver/threads/thread_model" type="int" setter="" getter="" default="1"> Thread model for rendering. Rendering on a thread can vastly improve performance, but synchronizing to the main thread can cause a bit more jitter. </member> @@ -1770,11 +1899,32 @@ Enables filtering of the volumetric fog effect prior to integration. This substantially blurs the fog which reduces fine details but also smooths out harsh edges and aliasing artifacts. Disable when more detail is required. </member> <member name="rendering/environment/volumetric_fog/volume_depth" type="int" setter="" getter="" default="64"> - Number of slices to use along the depth of the froxel buffer for volumetric fog. A lower number will be more efficient but may result in artifacts appearing during camera movement. + Number of slices to use along the depth of the froxel buffer for volumetric fog. A lower number will be more efficient but may result in artifacts appearing during camera movement. See also [member Environment.volumetric_fog_length]. </member> <member name="rendering/environment/volumetric_fog/volume_size" type="int" setter="" getter="" default="64"> Base size used to determine size of froxel buffer in the camera X-axis and Y-axis. The final size is scaled by the aspect ratio of the screen, so actual values may differ from what is set. Set a larger size for more detailed fog, set a smaller size for better performance. </member> + <member name="rendering/gl_compatibility/driver" type="String" setter="" getter="" default=""opengl3""> + Sets the driver to be used by the renderer when using the Compatibility renderer. This property can not be edited directly, instead, set the driver using the platform-specific overrides. + </member> + <member name="rendering/gl_compatibility/driver.android" type="String" setter="" getter="" default=""opengl3""> + Android override for [member rendering/gl_compatibility/driver]. + </member> + <member name="rendering/gl_compatibility/driver.ios" type="String" setter="" getter="" default=""opengl3""> + iOS override for [member rendering/gl_compatibility/driver]. + </member> + <member name="rendering/gl_compatibility/driver.linuxbsd" type="String" setter="" getter="" default=""opengl3""> + LinuxBSD override for [member rendering/gl_compatibility/driver]. + </member> + <member name="rendering/gl_compatibility/driver.macos" type="String" setter="" getter="" default=""opengl3""> + macOS override for [member rendering/gl_compatibility/driver]. + </member> + <member name="rendering/gl_compatibility/driver.web" type="String" setter="" getter="" default=""opengl3""> + Web override for [member rendering/gl_compatibility/driver]. + </member> + <member name="rendering/gl_compatibility/driver.windows" type="String" setter="" getter="" default=""opengl3""> + Windows override for [member rendering/gl_compatibility/driver]. + </member> <member name="rendering/global_illumination/gi/use_half_resolution" type="bool" setter="" getter="" default="false"> If [code]true[/code], renders [VoxelGI] and SDFGI ([member Environment.sdfgi_enabled]) buffers at halved resolution (e.g. 960×540 when the viewport size is 1920×1080). This improves performance significantly when VoxelGI or SDFGI is enabled, at the cost of artifacts that may be visible on polygon edges. The loss in quality becomes less noticeable as the viewport resolution increases. [LightmapGI] rendering is not affected by this setting. [b]Note:[/b] This property is only read when the project starts. To set half-resolution GI at run-time, call [method RenderingServer.gi_set_use_half_resolution] instead. @@ -1935,6 +2085,44 @@ <member name="rendering/reflections/sky_reflections/texture_array_reflections.mobile" type="bool" setter="" getter="" default="false"> Lower-end override for [member rendering/reflections/sky_reflections/texture_array_reflections] on mobile devices, due to performance concerns or driver support. </member> + <member name="rendering/renderer/rendering_method" type="String" setter="" getter="" default=""forward_plus""> + Sets the renderer that will be used by the project. Options are: + [b]Forward Plus[/b]: High-end renderer designed for Desktop devices. Has a higher base overhead, but scales well with complex scenes. Not suitable for older devices or mobile. + [b]Mobile[/b]: Modern renderer designed for mobile devices. Has a lower base overhead than Forward Plus, but does not scale as well to large scenes with many elements. + [b]GL Compatibility[/b]: Low-end renderer designed for older devices. Based on the limitations of the OpenGL 3.3/ OpenGL ES 3.0 / WebGL 2 APIs. + </member> + <member name="rendering/renderer/rendering_method.mobile" type="String" setter="" getter="" default=""mobile""> + Override for [member rendering/renderer/rendering_method] on mobile devices. + </member> + <member name="rendering/renderer/rendering_method.web" type="String" setter="" getter="" default=""gl_compatibility""> + Override for [member rendering/renderer/rendering_method] on web. + </member> + <member name="rendering/rendering_device/descriptor_pools/max_descriptors_per_pool" type="int" setter="" getter="" default="64"> + </member> + <member name="rendering/rendering_device/driver" type="String" setter="" getter="" default=""vulkan""> + Sets the driver to be used by the renderer when using a RenderingDevice-based renderer like the clustered renderer or the mobile renderer. This property can not be edited directly, instead, set the driver using the platform-specific overrides. + </member> + <member name="rendering/rendering_device/driver.android" type="String" setter="" getter="" default=""vulkan""> + Android override for [member rendering/rendering_device/driver]. + </member> + <member name="rendering/rendering_device/driver.ios" type="String" setter="" getter="" default=""vulkan""> + iOS override for [member rendering/rendering_device/driver]. + </member> + <member name="rendering/rendering_device/driver.linuxbsd" type="String" setter="" getter="" default=""vulkan""> + LinuxBSD override for [member rendering/rendering_device/driver]. + </member> + <member name="rendering/rendering_device/driver.macos" type="String" setter="" getter="" default=""vulkan""> + macOS override for [member rendering/rendering_device/driver]. + </member> + <member name="rendering/rendering_device/driver.windows" type="String" setter="" getter="" default=""vulkan""> + Windows override for [member rendering/rendering_device/driver]. + </member> + <member name="rendering/rendering_device/staging_buffer/block_size_kb" type="int" setter="" getter="" default="256"> + </member> + <member name="rendering/rendering_device/staging_buffer/max_size_mb" type="int" setter="" getter="" default="128"> + </member> + <member name="rendering/rendering_device/staging_buffer/texture_upload_region_size_px" type="int" setter="" getter="" default="64"> + </member> <member name="rendering/scaling_3d/fsr_sharpness" type="float" setter="" getter="" default="0.2"> Determines how sharp the upscaled image will be when using the FSR upscaling mode. Sharpness halves with every whole number. Values go from 0.0 (sharpest) to 2.0. Values above 2.0 won't make a visible difference. </member> @@ -1947,6 +2135,7 @@ <member name="rendering/shader_compiler/shader_cache/compress" type="bool" setter="" getter="" default="true"> </member> <member name="rendering/shader_compiler/shader_cache/enabled" type="bool" setter="" getter="" default="true"> + Enable the shader cache, which stores compiled shaders to disk to prevent stuttering from shader compilation the next time the shader is needed. </member> <member name="rendering/shader_compiler/shader_cache/strip_debug" type="bool" setter="" getter="" default="false"> </member> @@ -2016,18 +2205,6 @@ <member name="rendering/vrs/texture" type="String" setter="" getter="" default=""""> If [member rendering/vrs/mode] is set to texture, this is the path to default texture loaded as the VRS image. </member> - <member name="rendering/vulkan/descriptor_pools/max_descriptors_per_pool" type="int" setter="" getter="" default="64"> - </member> - <member name="rendering/vulkan/rendering/back_end" type="int" setter="" getter="" default="0"> - </member> - <member name="rendering/vulkan/rendering/back_end.mobile" type="int" setter="" getter="" default="1"> - </member> - <member name="rendering/vulkan/staging_buffer/block_size_kb" type="int" setter="" getter="" default="256"> - </member> - <member name="rendering/vulkan/staging_buffer/max_size_mb" type="int" setter="" getter="" default="128"> - </member> - <member name="rendering/vulkan/staging_buffer/texture_upload_region_size_px" type="int" setter="" getter="" default="64"> - </member> <member name="threading/worker_pool/low_priority_thread_ratio" type="float" setter="" getter="" default="0.3"> </member> <member name="threading/worker_pool/max_threads" type="int" setter="" getter="" default="-1"> diff --git a/doc/classes/QuadMesh.xml b/doc/classes/QuadMesh.xml new file mode 100644 index 0000000000..b869774601 --- /dev/null +++ b/doc/classes/QuadMesh.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="QuadMesh" inherits="PlaneMesh" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> + <brief_description> + Class representing a square mesh facing the camera. + </brief_description> + <description> + Class representing a square [PrimitiveMesh]. This flat mesh does not have a thickness. By default, this mesh is aligned on the X and Y axes; this rotation is more suited for use with billboarded materials. A [QuadMesh] is equivalent to a [PlaneMesh] except its default [member PlaneMesh.orientation] is [constant PlaneMesh.FACE_Z]. + </description> + <tutorials> + <link title="GUI in 3D Demo">https://godotengine.org/asset-library/asset/127</link> + <link title="2D in 3D Demo">https://godotengine.org/asset-library/asset/129</link> + </tutorials> + <members> + <member name="orientation" type="int" setter="set_orientation" getter="get_orientation" overrides="PlaneMesh" enum="PlaneMesh.Orientation" default="2" /> + <member name="size" type="Vector2" setter="set_size" getter="get_size" overrides="PlaneMesh" default="Vector2(1, 1)" /> + </members> +</class> diff --git a/doc/classes/Quaternion.xml b/doc/classes/Quaternion.xml index a521af5709..f21ebf57e2 100644 --- a/doc/classes/Quaternion.xml +++ b/doc/classes/Quaternion.xml @@ -71,7 +71,7 @@ <param index="0" name="to" type="Quaternion" /> <description> Returns the angle between this quaternion and [param to]. This is the magnitude of the angle you would need to rotate by to get from one to the other. - [b]Note:[/b] This method has an abnormally high number of floating-point errors, so methods such as [code]is_zero_approx[/code] will not work reliably. + [b]Note:[/b] The magnitude of the floating-point error for this method is abnormally high, so methods such as [code]is_zero_approx[/code] will not work reliably. </description> </method> <method name="dot" qualifiers="const"> diff --git a/doc/classes/RefCounted.xml b/doc/classes/RefCounted.xml index 3daf3534b0..223e572254 100644 --- a/doc/classes/RefCounted.xml +++ b/doc/classes/RefCounted.xml @@ -13,6 +13,12 @@ <link title="When and how to avoid using nodes for everything">$DOCS_URL/tutorials/best_practices/node_alternatives.html</link> </tutorials> <methods> + <method name="get_reference_count" qualifiers="const"> + <return type="int" /> + <description> + Returns the current reference count. + </description> + </method> <method name="init_ref"> <return type="bool" /> <description> diff --git a/doc/classes/ResourceSaver.xml b/doc/classes/ResourceSaver.xml index b0c9056cbc..8cd701e0d8 100644 --- a/doc/classes/ResourceSaver.xml +++ b/doc/classes/ResourceSaver.xml @@ -62,10 +62,10 @@ Do not save editor-specific metadata (identified by their [code]__editor[/code] prefix). </constant> <constant name="FLAG_SAVE_BIG_ENDIAN" value="16" enum="SaverFlags" is_bitfield="true"> - Save as big endian (see [member File.big_endian]). + Save as big endian (see [member FileAccess.big_endian]). </constant> <constant name="FLAG_COMPRESS" value="32" enum="SaverFlags" is_bitfield="true"> - Compress the resource on save using [constant File.COMPRESSION_ZSTD]. Only available for binary resource types. + Compress the resource on save using [constant FileAccess.COMPRESSION_ZSTD]. Only available for binary resource types. </constant> <constant name="FLAG_REPLACE_SUBRESOURCE_PATHS" value="64" enum="SaverFlags" is_bitfield="true"> Take over the paths of the saved subresources (see [method Resource.take_over_path]). diff --git a/doc/classes/ScriptEditorBase.xml b/doc/classes/ScriptEditorBase.xml index c365e0971b..a3fcf53228 100644 --- a/doc/classes/ScriptEditorBase.xml +++ b/doc/classes/ScriptEditorBase.xml @@ -19,14 +19,14 @@ <method name="get_base_editor" qualifiers="const"> <return type="Control" /> <description> - Returns the underlying [Control] used for editing scripts. This can be either [CodeEdit] (for text scripts) or [GraphEdit] (for visual scripts). + Returns the underlying [Control] used for editing scripts. For text scripts, this is a [CodeEdit]. </description> </method> </methods> <signals> <signal name="edited_script_changed"> <description> - Emitted after script validation. For visual scripts on modification. + Emitted after script validation. </description> </signal> <signal name="go_to_help"> @@ -35,15 +35,22 @@ Emitted when the user requests a specific documentation page. </description> </signal> + <signal name="go_to_method"> + <param index="0" name="script" type="Object" /> + <param index="1" name="method" type="String" /> + <description> + Emitted when the user requests to view a specific method of a script, similar to [signal request_open_script_at_line]. + </description> + </signal> <signal name="name_changed"> <description> - Emitted after script validation or when the edited resource has changed. Not used by visual scripts. + Emitted after script validation or when the edited resource has changed. </description> </signal> <signal name="replace_in_files_requested"> <param index="0" name="text" type="String" /> <description> - Emitted when the user request to find and replace text in the file system. Not used by visual scripts. + Emitted when the user request to find and replace text in the file system. </description> </signal> <signal name="request_help"> @@ -56,7 +63,7 @@ <param index="0" name="script" type="Object" /> <param index="1" name="line" type="int" /> <description> - Emitted when the user requests a script. + Emitted when the user requests to view a specific line of a script, similar to [signal go_to_method]. </description> </signal> <signal name="request_save_history"> @@ -67,7 +74,7 @@ <signal name="search_in_files_requested"> <param index="0" name="text" type="String" /> <description> - Emitted when the user request to search text in the file system. Not used by visual scripts. + Emitted when the user request to search text in the file system. </description> </signal> </signals> diff --git a/doc/classes/Skeleton3D.xml b/doc/classes/Skeleton3D.xml index 5a0766263a..3bd0e04b92 100644 --- a/doc/classes/Skeleton3D.xml +++ b/doc/classes/Skeleton3D.xml @@ -32,9 +32,10 @@ Removes the global pose override on all bones in the skeleton. </description> </method> - <method name="clear_bones_local_pose_override"> + <method name="clear_bones_local_pose_override" is_deprecated="true"> <return type="void" /> <description> + Deprecated. Local pose overrides will be removed. Removes the local pose override on all bones in the skeleton. </description> </method> @@ -43,7 +44,7 @@ <description> </description> </method> - <method name="execute_modifications"> + <method name="execute_modifications" is_deprecated="true"> <return type="void" /> <param index="0" name="delta" type="float" /> <param index="1" name="execution_mode" type="int" /> @@ -58,7 +59,7 @@ Returns the bone index that matches [param name] as its name. </description> </method> - <method name="force_update_all_bone_transforms"> + <method name="force_update_all_bone_transforms" is_deprecated="true"> <return type="void" /> <description> Force updates the bone transforms/poses for all bones in the skeleton. @@ -166,7 +167,7 @@ Returns the rest transform for a bone [param bone_idx]. </description> </method> - <method name="get_modification_stack"> + <method name="get_modification_stack" is_deprecated="true"> <return type="SkeletonModificationStack3D" /> <description> Returns the modification stack attached to this skeleton, if one exists. @@ -178,7 +179,7 @@ Returns an array with all of the bones that are parentless. Another way to look at this is that it returns the indexes of all the bones that are not dependent or modified by other bones in the Skeleton. </description> </method> - <method name="global_pose_to_local_pose"> + <method name="global_pose_to_local_pose" is_deprecated="true"> <return type="Transform3D" /> <param index="0" name="bone_idx" type="int" /> <param index="1" name="global_pose" type="Transform3D" /> @@ -187,15 +188,16 @@ This can be used to easily convert a global pose from [method get_bone_global_pose] to a global transform in [method set_bone_local_pose_override]. </description> </method> - <method name="global_pose_to_world_transform"> + <method name="global_pose_to_world_transform" is_deprecated="true"> <return type="Transform3D" /> <param index="0" name="global_pose" type="Transform3D" /> <description> + Deprecated. Use [Node3D] apis instead. Takes the passed-in global pose and converts it to a world transform. This can be used to easily convert a global pose from [method get_bone_global_pose] to a global transform usable with a node's transform, like [member Node3D.global_transform] for example. </description> </method> - <method name="global_pose_z_forward_to_bone_forward"> + <method name="global_pose_z_forward_to_bone_forward" is_deprecated="true"> <return type="Basis" /> <param index="0" name="bone_idx" type="int" /> <param index="1" name="basis" type="Basis" /> @@ -211,7 +213,7 @@ Returns whether the bone pose for the bone at [param bone_idx] is enabled. </description> </method> - <method name="local_pose_to_global_pose"> + <method name="local_pose_to_global_pose" is_deprecated="true"> <return type="Transform3D" /> <param index="0" name="bone_idx" type="int" /> <param index="1" name="local_pose" type="Transform3D" /> @@ -293,16 +295,17 @@ <description> Sets the global pose transform, [param pose], for the bone at [param bone_idx]. [param amount] is the interpolation strength that will be used when applying the pose, and [param persistent] determines if the applied pose will remain. - [b]Note:[/b] The pose transform needs to be a global pose! Use [method world_transform_to_global_pose] to convert a world transform, like one you can get from a [Node3D], to a global pose. + [b]Note:[/b] The pose transform needs to be a global pose! To convert a world transform from a [Node3D] to a global bone pose, multiply the [method Transform3D.affine_inverse] of the node's [member Node3D.global_transform] by the desired world transform </description> </method> - <method name="set_bone_local_pose_override"> + <method name="set_bone_local_pose_override" is_deprecated="true"> <return type="void" /> <param index="0" name="bone_idx" type="int" /> <param index="1" name="pose" type="Transform3D" /> <param index="2" name="amount" type="float" /> <param index="3" name="persistent" type="bool" default="false" /> <description> + Deprecated. Local pose overrides will be removed. Sets the local pose transform, [param pose], for the bone at [param bone_idx]. [param amount] is the interpolation strength that will be used when applying the pose, and [param persistent] determines if the applied pose will remain. [b]Note:[/b] The pose transform needs to be a local pose! Use [method global_pose_to_local_pose] to convert a global pose to a local pose. @@ -353,7 +356,7 @@ Sets the rest transform for bone [param bone_idx]. </description> </method> - <method name="set_modification_stack"> + <method name="set_modification_stack" is_deprecated="true"> <return type="void" /> <param index="0" name="modification_stack" type="SkeletonModificationStack3D" /> <description> @@ -367,10 +370,11 @@ Unparents the bone at [param bone_idx] and sets its rest position to that of its parent prior to being reset. </description> </method> - <method name="world_transform_to_global_pose"> + <method name="world_transform_to_global_pose" is_deprecated="true"> <return type="Transform3D" /> <param index="0" name="world_transform" type="Transform3D" /> <description> + Deprecated. Use [Node3D] apis instead. Takes the passed-in global transform and converts it to a global pose. This can be used to easily convert a global transform from [member Node3D.global_transform] to a global pose usable with [method set_bone_global_pose_override], for example. </description> diff --git a/doc/classes/SkeletonIK3D.xml b/doc/classes/SkeletonIK3D.xml index 788ba3e248..1d50a97954 100644 --- a/doc/classes/SkeletonIK3D.xml +++ b/doc/classes/SkeletonIK3D.xml @@ -1,8 +1,29 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonIK3D" inherits="Node" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonIK3D" inherits="Node" is_deprecated="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> + SkeletonIK3D is used to place the end bone of a [Skeleton3D] bone chain at a certain point in 3D by rotating all bones in the chain accordingly. </brief_description> <description> + SkeletonIK3D is used to place the end bone of a [Skeleton3D] bone chain at a certain point in 3D by rotating all bones in the chain accordingly. A typical scenario for IK in games is to place a characters feet on the ground or a characters hands on a currently hold object. SkeletonIK uses FabrikInverseKinematic internally to solve the bone chain and applies the results to the [Skeleton3D] [code]bones_global_pose_override[/code] property for all affected bones in the chain. If fully applied this overwrites any bone transform from [Animation]s or bone custom poses set by users. The applied amount can be controlled with the [code]interpolation[/code] property. + [codeblock] + # Apply IK effect automatically on every new frame (not the current) + skeleton_ik_node.start() + + # Apply IK effect only on the current frame + skeleton_ik_node.start(true) + + # Stop IK effect and reset bones_global_pose_override on Skeleton + skeleton_ik_node.stop() + + # Apply full IK effect + skeleton_ik_node.set_interpolation(1.0) + + # Apply half IK effect + skeleton_ik_node.set_interpolation(0.5) + + # Apply zero IK effect (a value at or below 0.01 also removes bones_global_pose_override on Skeleton) + skeleton_ik_node.set_interpolation(0.0) + [/codeblock] </description> <tutorials> <link title="3D Inverse Kinematics Demo">https://godotengine.org/asset-library/asset/523</link> @@ -11,45 +32,59 @@ <method name="get_parent_skeleton" qualifiers="const"> <return type="Skeleton3D" /> <description> + Returns the parent [Skeleton3D] Node that was present when SkeletonIK entered the [SceneTree]. Returns null if the parent node was not a [Skeleton3D] Node when SkeletonIK3D entered the [SceneTree]. </description> </method> <method name="is_running"> <return type="bool" /> <description> + Returns [code]true[/code] if SkeletonIK is applying IK effects on continues frames to the [Skeleton3D] bones. Returns [code]false[/code] if SkeletonIK is stopped or [method start] was used with the [code]one_time[/code] parameter set to [code]true[/code]. </description> </method> <method name="start"> <return type="void" /> <param index="0" name="one_time" type="bool" default="false" /> <description> + Starts applying IK effects on each frame to the [Skeleton3D] bones but will only take effect starting on the next frame. If [code]one_time[/code] is [code]true[/code], this will take effect immediately but also reset on the next frame. </description> </method> <method name="stop"> <return type="void" /> <description> + Stops applying IK effects on each frame to the [Skeleton3D] bones and also calls [method Skeleton3D.clear_bones_global_pose_override] to remove existing overrides on all bones. </description> </method> </methods> <members> <member name="interpolation" type="float" setter="set_interpolation" getter="get_interpolation" default="1.0"> + Interpolation value for how much the IK results are applied to the current skeleton bone chain. A value of [code]1.0[/code] will overwrite all skeleton bone transforms completely while a value of [code]0.0[/code] will visually disable the SkeletonIK. A value at or below [code]0.01[/code] also calls [method Skeleton3D.clear_bones_global_pose_override]. </member> <member name="magnet" type="Vector3" setter="set_magnet_position" getter="get_magnet_position" default="Vector3(0, 0, 0)"> + Secondary target position (first is [member target] property or [member target_node]) for the IK chain. Use magnet position (pole target) to control the bending of the IK chain. Only works if the bone chain has more than 2 bones. The middle chain bone position will be linearly interpolated with the magnet position. </member> <member name="max_iterations" type="int" setter="set_max_iterations" getter="get_max_iterations" default="10"> + Number of iteration loops used by the IK solver to produce more accurate (and elegant) bone chain results. </member> <member name="min_distance" type="float" setter="set_min_distance" getter="get_min_distance" default="0.01"> + The minimum distance between bone and goal target. If the distance is below this value, the IK solver stops further iterations. </member> <member name="override_tip_basis" type="bool" setter="set_override_tip_basis" getter="is_override_tip_basis" default="true"> + If [code]true[/code] overwrites the rotation of the tip bone with the rotation of the [member target] (or [member target_node] if defined). </member> <member name="root_bone" type="StringName" setter="set_root_bone" getter="get_root_bone" default="&"""> + The name of the current root bone, the first bone in the IK chain. </member> <member name="target" type="Transform3D" setter="set_target_transform" getter="get_target_transform" default="Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)"> + First target of the IK chain where the tip bone is placed and, if [member override_tip_basis] is [code]true[/code], how the tip bone is rotated. If a [member target_node] path is available the nodes transform is used instead and this property is ignored. </member> <member name="target_node" type="NodePath" setter="set_target_node" getter="get_target_node" default="NodePath("")"> + Target node [NodePath] for the IK chain. If available, the node's current [Transform3D] is used instead of the [member target] property. </member> <member name="tip_bone" type="StringName" setter="set_tip_bone" getter="get_tip_bone" default="&"""> + The name of the current tip bone, the last bone in the IK chain placed at the [member target] transform (or [member target_node] if defined). </member> <member name="use_magnet" type="bool" setter="set_use_magnet" getter="is_using_magnet" default="false"> + If [code]true[/code], instructs the IK solver to consider the secondary magnet target (pole target) when calculating the bone chain. Use the magnet position (pole target) to control the bending of the IK chain. </member> </members> </class> diff --git a/doc/classes/SkeletonModification2D.xml b/doc/classes/SkeletonModification2D.xml index 46d32aef41..77aaf0213b 100644 --- a/doc/classes/SkeletonModification2D.xml +++ b/doc/classes/SkeletonModification2D.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModification2D" inherits="Resource" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModification2D" inherits="Resource" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A resource that operates on [Bone2D] nodes in a [Skeleton2D]. </brief_description> diff --git a/doc/classes/SkeletonModification2DCCDIK.xml b/doc/classes/SkeletonModification2DCCDIK.xml index c8fee3f94d..0d80b1b914 100644 --- a/doc/classes/SkeletonModification2DCCDIK.xml +++ b/doc/classes/SkeletonModification2DCCDIK.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModification2DCCDIK" inherits="SkeletonModification2D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModification2DCCDIK" inherits="SkeletonModification2D" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A modification that uses CCDIK to manipulate a series of bones to reach a target in 2D. </brief_description> diff --git a/doc/classes/SkeletonModification2DFABRIK.xml b/doc/classes/SkeletonModification2DFABRIK.xml index ff3a65fe1a..8d1cd4b4d4 100644 --- a/doc/classes/SkeletonModification2DFABRIK.xml +++ b/doc/classes/SkeletonModification2DFABRIK.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModification2DFABRIK" inherits="SkeletonModification2D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModification2DFABRIK" inherits="SkeletonModification2D" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A modification that uses FABRIK to manipulate a series of [Bone2D] nodes to reach a target. </brief_description> diff --git a/doc/classes/SkeletonModification2DJiggle.xml b/doc/classes/SkeletonModification2DJiggle.xml index 7329b2d865..3321fffe1b 100644 --- a/doc/classes/SkeletonModification2DJiggle.xml +++ b/doc/classes/SkeletonModification2DJiggle.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModification2DJiggle" inherits="SkeletonModification2D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModification2DJiggle" inherits="SkeletonModification2D" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A modification that jiggles [Bone2D] nodes as they move towards a target. </brief_description> diff --git a/doc/classes/SkeletonModification2DLookAt.xml b/doc/classes/SkeletonModification2DLookAt.xml index 4747b06056..136fed37de 100644 --- a/doc/classes/SkeletonModification2DLookAt.xml +++ b/doc/classes/SkeletonModification2DLookAt.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModification2DLookAt" inherits="SkeletonModification2D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModification2DLookAt" inherits="SkeletonModification2D" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A modification that rotates a [Bone2D] node to look at a target. </brief_description> diff --git a/doc/classes/SkeletonModification2DPhysicalBones.xml b/doc/classes/SkeletonModification2DPhysicalBones.xml index d5f46b2ea0..209602e974 100644 --- a/doc/classes/SkeletonModification2DPhysicalBones.xml +++ b/doc/classes/SkeletonModification2DPhysicalBones.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModification2DPhysicalBones" inherits="SkeletonModification2D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModification2DPhysicalBones" inherits="SkeletonModification2D" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A modification that applies the transforms of [PhysicalBone2D] nodes to [Bone2D] nodes. </brief_description> <description> This modification takes the transforms of [PhysicalBone2D] nodes and applies them to [Bone2D] nodes. This allows the [Bone2D] nodes to react to physics thanks to the linked [PhysicalBone2D] nodes. + Experimental. Physical bones may be changed in the future to perform the position update of [Bone2D] on their own. </description> <tutorials> </tutorials> diff --git a/doc/classes/SkeletonModification2DStackHolder.xml b/doc/classes/SkeletonModification2DStackHolder.xml index 791dea2fb1..85df111c0d 100644 --- a/doc/classes/SkeletonModification2DStackHolder.xml +++ b/doc/classes/SkeletonModification2DStackHolder.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModification2DStackHolder" inherits="SkeletonModification2D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModification2DStackHolder" inherits="SkeletonModification2D" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A modification that holds and executes a [SkeletonModificationStack2D]. </brief_description> diff --git a/doc/classes/SkeletonModification2DTwoBoneIK.xml b/doc/classes/SkeletonModification2DTwoBoneIK.xml index edd5431a0c..c476d71d44 100644 --- a/doc/classes/SkeletonModification2DTwoBoneIK.xml +++ b/doc/classes/SkeletonModification2DTwoBoneIK.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModification2DTwoBoneIK" inherits="SkeletonModification2D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModification2DTwoBoneIK" inherits="SkeletonModification2D" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A modification that rotates two bones using the law of cosigns to reach the target. </brief_description> diff --git a/doc/classes/SkeletonModification3D.xml b/doc/classes/SkeletonModification3D.xml index 8457179651..25431ea96f 100644 --- a/doc/classes/SkeletonModification3D.xml +++ b/doc/classes/SkeletonModification3D.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModification3D" inherits="Resource" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModification3D" inherits="Resource" is_deprecated="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A resource that operates on bones in a [Skeleton3D]. </brief_description> diff --git a/doc/classes/SkeletonModification3DCCDIK.xml b/doc/classes/SkeletonModification3DCCDIK.xml index dec0fbe99f..90b2e78449 100644 --- a/doc/classes/SkeletonModification3DCCDIK.xml +++ b/doc/classes/SkeletonModification3DCCDIK.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModification3DCCDIK" inherits="SkeletonModification3D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModification3DCCDIK" inherits="SkeletonModification3D" is_deprecated="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A modification that uses CCDIK to manipulate a series of bones to reach a target. </brief_description> diff --git a/doc/classes/SkeletonModification3DFABRIK.xml b/doc/classes/SkeletonModification3DFABRIK.xml index 325cc2a12e..a2bec2b559 100644 --- a/doc/classes/SkeletonModification3DFABRIK.xml +++ b/doc/classes/SkeletonModification3DFABRIK.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModification3DFABRIK" inherits="SkeletonModification3D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModification3DFABRIK" inherits="SkeletonModification3D" is_deprecated="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A modification that uses FABRIK to manipulate a series of bones to reach a target. </brief_description> diff --git a/doc/classes/SkeletonModification3DJiggle.xml b/doc/classes/SkeletonModification3DJiggle.xml index ef469d42ea..304f08bb20 100644 --- a/doc/classes/SkeletonModification3DJiggle.xml +++ b/doc/classes/SkeletonModification3DJiggle.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModification3DJiggle" inherits="SkeletonModification3D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModification3DJiggle" inherits="SkeletonModification3D" is_deprecated="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A modification that jiggles bones as they move towards a target. </brief_description> diff --git a/doc/classes/SkeletonModification3DLookAt.xml b/doc/classes/SkeletonModification3DLookAt.xml index 3602cfad95..aeed953ca9 100644 --- a/doc/classes/SkeletonModification3DLookAt.xml +++ b/doc/classes/SkeletonModification3DLookAt.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModification3DLookAt" inherits="SkeletonModification3D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModification3DLookAt" inherits="SkeletonModification3D" is_deprecated="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A modification that rotates a bone to look at a target. </brief_description> diff --git a/doc/classes/SkeletonModification3DStackHolder.xml b/doc/classes/SkeletonModification3DStackHolder.xml index 24240236a4..9448e2c783 100644 --- a/doc/classes/SkeletonModification3DStackHolder.xml +++ b/doc/classes/SkeletonModification3DStackHolder.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModification3DStackHolder" inherits="SkeletonModification3D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModification3DStackHolder" inherits="SkeletonModification3D" is_deprecated="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A modification that holds and executes a [SkeletonModificationStack3D]. </brief_description> diff --git a/doc/classes/SkeletonModification3DTwoBoneIK.xml b/doc/classes/SkeletonModification3DTwoBoneIK.xml index 6618ebbcfb..0e7ffd5c80 100644 --- a/doc/classes/SkeletonModification3DTwoBoneIK.xml +++ b/doc/classes/SkeletonModification3DTwoBoneIK.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModification3DTwoBoneIK" inherits="SkeletonModification3D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModification3DTwoBoneIK" inherits="SkeletonModification3D" is_deprecated="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A modification that moves two bones to reach the target. </brief_description> diff --git a/doc/classes/SkeletonModificationStack2D.xml b/doc/classes/SkeletonModificationStack2D.xml index 950e52e622..d96833e335 100644 --- a/doc/classes/SkeletonModificationStack2D.xml +++ b/doc/classes/SkeletonModificationStack2D.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModificationStack2D" inherits="Resource" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModificationStack2D" inherits="Resource" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A resource that holds a stack of [SkeletonModification2D]s. </brief_description> diff --git a/doc/classes/SkeletonModificationStack3D.xml b/doc/classes/SkeletonModificationStack3D.xml index 34c7099bca..9eaeeefd8e 100644 --- a/doc/classes/SkeletonModificationStack3D.xml +++ b/doc/classes/SkeletonModificationStack3D.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModificationStack3D" inherits="Resource" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModificationStack3D" inherits="Resource" is_deprecated="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A resource that holds a stack of [SkeletonModification3D]s. </brief_description> diff --git a/doc/classes/StreamPeerBuffer.xml b/doc/classes/StreamPeerBuffer.xml index 4bef9f44b7..f33c38e595 100644 --- a/doc/classes/StreamPeerBuffer.xml +++ b/doc/classes/StreamPeerBuffer.xml @@ -4,7 +4,7 @@ Data buffer stream peer. </brief_description> <description> - Data buffer stream peer that uses a byte array as the stream. This object can be used to handle binary data from network sessions. To handle binary data stored in files, [File] can be used directly. + Data buffer stream peer that uses a byte array as the stream. This object can be used to handle binary data from network sessions. To handle binary data stored in files, [FileAccess] can be used directly. A [StreamPeerBuffer] object keeps an internal cursor which is the offset in bytes to the start of the buffer. Get and put operations are performed at the cursor position and will move the cursor accordingly. </description> <tutorials> diff --git a/doc/classes/StreamPeerGZIP.xml b/doc/classes/StreamPeerGZIP.xml new file mode 100644 index 0000000000..71dd36160d --- /dev/null +++ b/doc/classes/StreamPeerGZIP.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="StreamPeerGZIP" inherits="StreamPeer" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> + <brief_description> + Stream peer handling GZIP and deflate compression/decompresison. + </brief_description> + <description> + This class allows to compress or decompress data using GZIP/deflate in a streaming fashion. This is particularly useful when compressing or decompressing files that has to be sent through the network without having to allocate them all in memory. + After starting the stream via [method start_compression] (or [method start_decompression]), calling [method StreamPeer.put_partial_data] on this stream will compress (or decompress) the data, writing it to the internal buffer. Calling [method StreamPeer.get_available_bytes] will return the pending bytes in the internal buffer, and [method StreamPeer.get_partial_data] will retrieve the compressed (or decompressed) bytes from it. When the stream is over, you must call [method finish] to ensure the internal buffer is properly flushed (make sure to call [method StreamPeer.get_available_bytes] on last time to check if more data needs to be read after that). + </description> + <tutorials> + </tutorials> + <methods> + <method name="clear"> + <return type="void" /> + <description> + Clears this stream, resetting the internal state. + </description> + </method> + <method name="finish"> + <return type="int" enum="Error" /> + <description> + Finalizes the stream, compressing or decompressing any buffered chunk left. + </description> + </method> + <method name="start_compression"> + <return type="int" enum="Error" /> + <param index="0" name="use_deflate" type="bool" default="false" /> + <param index="1" name="buffer_size" type="int" default="65535" /> + <description> + Start the stream in compression mode with the given [param buffer_size], if [param use_deflate] is [code]true[/code] uses deflate instead of GZIP. + </description> + </method> + <method name="start_decompression"> + <return type="int" enum="Error" /> + <param index="0" name="use_deflate" type="bool" default="false" /> + <param index="1" name="buffer_size" type="int" default="65535" /> + <description> + Start the stream in decompression mode with the given [param buffer_size], if [param use_deflate] is [code]true[/code] uses deflate instead of GZIP. + </description> + </method> + </methods> +</class> diff --git a/doc/classes/TextServer.xml b/doc/classes/TextServer.xml index 0db16b491d..2512c563c5 100644 --- a/doc/classes/TextServer.xml +++ b/doc/classes/TextServer.xml @@ -1565,6 +1565,8 @@ <constant name="FONT_LCD_SUBPIXEL_LAYOUT_VBGR" value="4" enum="FontLCDSubpixelLayout"> Vertical BGR sub-pixel layout. </constant> + <constant name="FONT_LCD_SUBPIXEL_LAYOUT_MAX" value="5" enum="FontLCDSubpixelLayout"> + </constant> <constant name="DIRECTION_AUTO" value="0" enum="Direction"> Text direction is determined based on contents and current locale. </constant> @@ -1720,6 +1722,7 @@ </constant> <constant name="HINTING_NORMAL" value="2" enum="Hinting"> Use the default font hinting mode (crisper but less smooth). + [b]Note:[/b] This hinting mode changes both horizontal and vertical glyph metrics. If applied to monospace font, some glyphs might have different width. </constant> <constant name="SUBPIXEL_POSITIONING_DISABLED" value="0" enum="SubpixelPositioning"> Glyph horizontal position is rounded to the whole pixel size, each glyph is rasterized once. diff --git a/doc/classes/TextServerExtension.xml b/doc/classes/TextServerExtension.xml index 4886bf0757..37d2698dd4 100644 --- a/doc/classes/TextServerExtension.xml +++ b/doc/classes/TextServerExtension.xml @@ -9,21 +9,19 @@ <tutorials> </tutorials> <methods> - <method name="create_font" qualifiers="virtual"> + <method name="_create_font" qualifiers="virtual"> <return type="RID" /> <description> - Creates new, empty font cache entry resource. To free the resulting resourec, use [method free_rid] method. </description> </method> - <method name="create_shaped_text" qualifiers="virtual"> + <method name="_create_shaped_text" qualifiers="virtual"> <return type="RID" /> <param index="0" name="direction" type="int" enum="TextServer.Direction" /> <param index="1" name="orientation" type="int" enum="TextServer.Orientation" /> <description> - Creates new buffer for complex text layout, with the given [param direction] and [param orientation]. To free the resulting buffer, use [method free_rid] method. </description> </method> - <method name="draw_hex_code_box" qualifiers="virtual const"> + <method name="_draw_hex_code_box" qualifiers="virtual const"> <return type="void" /> <param index="0" name="canvas" type="RID" /> <param index="1" name="size" type="int" /> @@ -31,42 +29,36 @@ <param index="3" name="index" type="int" /> <param index="4" name="color" type="Color" /> <description> - Draws box displaying character hexadecimal code. Used for replacing missing characters. - [b]Note:[/b] If this method is not implemented in the plugin, the default implementation will be used. </description> </method> - <method name="font_clear_glyphs" qualifiers="virtual"> + <method name="_font_clear_glyphs" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="Vector2i" /> <description> - Removes all rendered glyphs information from the cache entry. </description> </method> - <method name="font_clear_kerning_map" qualifiers="virtual"> + <method name="_font_clear_kerning_map" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="int" /> <description> - Removes all kerning overrides. </description> </method> - <method name="font_clear_size_cache" qualifiers="virtual"> + <method name="_font_clear_size_cache" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <description> - Removes all font sizes from the cache entry. </description> </method> - <method name="font_clear_textures" qualifiers="virtual"> + <method name="_font_clear_textures" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="Vector2i" /> <description> - Removes all textures from font cache entry. </description> </method> - <method name="font_draw_glyph" qualifiers="virtual const"> + <method name="_font_draw_glyph" qualifiers="virtual const"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="canvas" type="RID" /> @@ -75,10 +67,9 @@ <param index="4" name="index" type="int" /> <param index="5" name="color" type="Color" /> <description> - Draws single glyph into a canvas item at the position, using [param font_rid] at the size [param size]. </description> </method> - <method name="font_draw_glyph_outline" qualifiers="virtual const"> + <method name="_font_draw_glyph_outline" qualifiers="virtual const"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="canvas" type="RID" /> @@ -88,897 +79,779 @@ <param index="5" name="index" type="int" /> <param index="6" name="color" type="Color" /> <description> - Draws single glyph outline of size [param outline_size] into a canvas item at the position, using [param font_rid] at the size [param size]. </description> </method> - <method name="font_get_antialiasing" qualifiers="virtual const"> + <method name="_font_get_antialiasing" qualifiers="virtual const"> <return type="int" enum="TextServer.FontAntialiasing" /> <param index="0" name="font_rid" type="RID" /> <description> - Returns font anti-aliasing mode. </description> </method> - <method name="font_get_ascent" qualifiers="virtual const"> + <method name="_font_get_ascent" qualifiers="virtual const"> <return type="float" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="int" /> <description> - Returns the font ascent (number of pixels above the baseline). </description> </method> - <method name="font_get_descent" qualifiers="virtual const"> + <method name="_font_get_descent" qualifiers="virtual const"> <return type="float" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="int" /> <description> - Returns the font descent (number of pixels below the baseline). </description> </method> - <method name="font_get_embolden" qualifiers="virtual const"> + <method name="_font_get_embolden" qualifiers="virtual const"> <return type="float" /> <param index="0" name="font_rid" type="RID" /> <description> - Returns font embolden strength. </description> </method> - <method name="font_get_face_count" qualifiers="virtual const"> + <method name="_font_get_face_count" qualifiers="virtual const"> <return type="int" /> <param index="0" name="font_rid" type="RID" /> <description> - Returns number of faces in the TrueType / OpenType collection. </description> </method> - <method name="font_get_face_index" qualifiers="virtual const"> + <method name="_font_get_face_index" qualifiers="virtual const"> <return type="int" /> <param index="0" name="font_rid" type="RID" /> <description> - Returns an active face index in the TrueType / OpenType collection. </description> </method> - <method name="font_get_fixed_size" qualifiers="virtual const"> + <method name="_font_get_fixed_size" qualifiers="virtual const"> <return type="int" /> <param index="0" name="font_rid" type="RID" /> <description> - Returns bitmap font fixed size. </description> </method> - <method name="font_get_generate_mipmaps" qualifiers="virtual const"> + <method name="_font_get_generate_mipmaps" qualifiers="virtual const"> <return type="bool" /> <param index="0" name="font_rid" type="RID" /> <description> - Returns [code]true[/code] if font texture mipmap generation is enabled. </description> </method> - <method name="font_get_global_oversampling" qualifiers="virtual const"> + <method name="_font_get_global_oversampling" qualifiers="virtual const"> <return type="float" /> <description> - Returns the font oversampling factor, shared by all fonts in the TextServer. </description> </method> - <method name="font_get_glyph_advance" qualifiers="virtual const"> + <method name="_font_get_glyph_advance" qualifiers="virtual const"> <return type="Vector2" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="int" /> <param index="2" name="glyph" type="int" /> <description> - Returns glyph advance (offset of the next glyph). </description> </method> - <method name="font_get_glyph_contours" qualifiers="virtual const"> + <method name="_font_get_glyph_contours" qualifiers="virtual const"> <return type="Dictionary" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="int" /> <param index="2" name="index" type="int" /> <description> - Returns outline contours of the glyph as a [code]Dictionary[/code] with the following contents: - [code]points[/code] - [PackedVector3Array], containing outline points. [code]x[/code] and [code]y[/code] are point coordinates. [code]z[/code] is the type of the point, using the [enum TextServer.ContourPointTag] values. - [code]contours[/code] - [PackedInt32Array], containing indices the end points of each contour. - [code]orientation[/code] - [bool], contour orientation. If [code]true[/code], clockwise contours must be filled. </description> </method> - <method name="font_get_glyph_index" qualifiers="virtual const"> + <method name="_font_get_glyph_index" qualifiers="virtual const"> <return type="int" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="int" /> <param index="2" name="char" type="int" /> <param index="3" name="variation_selector" type="int" /> <description> - Returns the glyph index of a [param char], optionally modified by the [param variation_selector]. </description> </method> - <method name="font_get_glyph_list" qualifiers="virtual const"> + <method name="_font_get_glyph_list" qualifiers="virtual const"> <return type="PackedInt32Array" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="Vector2i" /> <description> - Returns list of rendered glyphs in the cache entry. </description> </method> - <method name="font_get_glyph_offset" qualifiers="virtual const"> + <method name="_font_get_glyph_offset" qualifiers="virtual const"> <return type="Vector2" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="Vector2i" /> <param index="2" name="glyph" type="int" /> <description> - Returns glyph offset from the baseline. </description> </method> - <method name="font_get_glyph_size" qualifiers="virtual const"> + <method name="_font_get_glyph_size" qualifiers="virtual const"> <return type="Vector2" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="Vector2i" /> <param index="2" name="glyph" type="int" /> <description> - Returns size of the glyph. </description> </method> - <method name="font_get_glyph_texture_idx" qualifiers="virtual const"> + <method name="_font_get_glyph_texture_idx" qualifiers="virtual const"> <return type="int" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="Vector2i" /> <param index="2" name="glyph" type="int" /> <description> - Returns index of the cache texture containing the glyph. </description> </method> - <method name="font_get_glyph_texture_rid" qualifiers="virtual const"> + <method name="_font_get_glyph_texture_rid" qualifiers="virtual const"> <return type="RID" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="Vector2i" /> <param index="2" name="glyph" type="int" /> <description> - Returns resource id of the cache texture containing the glyph. </description> </method> - <method name="font_get_glyph_texture_size" qualifiers="virtual const"> + <method name="_font_get_glyph_texture_size" qualifiers="virtual const"> <return type="Vector2" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="Vector2i" /> <param index="2" name="glyph" type="int" /> <description> - Returns size of the cache texture containing the glyph. </description> </method> - <method name="font_get_glyph_uv_rect" qualifiers="virtual const"> + <method name="_font_get_glyph_uv_rect" qualifiers="virtual const"> <return type="Rect2" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="Vector2i" /> <param index="2" name="glyph" type="int" /> <description> - Returns rectangle in the cache texture containing the glyph. </description> </method> - <method name="font_get_hinting" qualifiers="virtual const"> + <method name="_font_get_hinting" qualifiers="virtual const"> <return type="int" enum="TextServer.Hinting" /> <param index="0" name="font_rid" type="RID" /> <description> - Returns the font hinting mode. Used by dynamic fonts only. </description> </method> - <method name="font_get_kerning" qualifiers="virtual const"> + <method name="_font_get_kerning" qualifiers="virtual const"> <return type="Vector2" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="int" /> <param index="2" name="glyph_pair" type="Vector2i" /> <description> - Returns kerning for the pair of glyphs. </description> </method> - <method name="font_get_kerning_list" qualifiers="virtual const"> + <method name="_font_get_kerning_list" qualifiers="virtual const"> <return type="Vector2i[]" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="int" /> <description> - Returns list of the kerning overrides. </description> </method> - <method name="font_get_language_support_override" qualifiers="virtual"> + <method name="_font_get_language_support_override" qualifiers="virtual"> <return type="bool" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="language" type="String" /> <description> - Returns [code]true[/code] if support override is enabled for the [param language]. </description> </method> - <method name="font_get_language_support_overrides" qualifiers="virtual"> + <method name="_font_get_language_support_overrides" qualifiers="virtual"> <return type="PackedStringArray" /> <param index="0" name="font_rid" type="RID" /> <description> - Returns list of language support overrides. </description> </method> - <method name="font_get_msdf_pixel_range" qualifiers="virtual const"> + <method name="_font_get_msdf_pixel_range" qualifiers="virtual const"> <return type="int" /> <param index="0" name="font_rid" type="RID" /> <description> - Returns the width of the range around the shape between the minimum and maximum representable signed distance. </description> </method> - <method name="font_get_msdf_size" qualifiers="virtual const"> + <method name="_font_get_msdf_size" qualifiers="virtual const"> <return type="int" /> <param index="0" name="font_rid" type="RID" /> <description> - Returns source font size used to generate MSDF textures. </description> </method> - <method name="font_get_name" qualifiers="virtual const"> + <method name="_font_get_name" qualifiers="virtual const"> <return type="String" /> <param index="0" name="font_rid" type="RID" /> <description> - Returns font family name. </description> </method> - <method name="font_get_opentype_feature_overrides" qualifiers="virtual const"> + <method name="_font_get_opentype_feature_overrides" qualifiers="virtual const"> <return type="Dictionary" /> <param index="0" name="font_rid" type="RID" /> <description> - Returns font OpenType feature set override. </description> </method> - <method name="font_get_oversampling" qualifiers="virtual const"> + <method name="_font_get_oversampling" qualifiers="virtual const"> <return type="float" /> <param index="0" name="font_rid" type="RID" /> <description> - Returns font oversampling factor, if set to [code]0.0[/code] global oversampling factor is used instead. Used by dynamic fonts only. </description> </method> - <method name="font_get_scale" qualifiers="virtual const"> + <method name="_font_get_scale" qualifiers="virtual const"> <return type="float" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="int" /> <description> - Returns scaling factor of the color bitmap font. </description> </method> - <method name="font_get_script_support_override" qualifiers="virtual"> + <method name="_font_get_script_support_override" qualifiers="virtual"> <return type="bool" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="script" type="String" /> <description> - Returns [code]true[/code] if support override is enabled for the [param script]. </description> </method> - <method name="font_get_script_support_overrides" qualifiers="virtual"> + <method name="_font_get_script_support_overrides" qualifiers="virtual"> <return type="PackedStringArray" /> <param index="0" name="font_rid" type="RID" /> <description> - Returns list of script support overrides. </description> </method> - <method name="font_get_size_cache_list" qualifiers="virtual const"> + <method name="_font_get_size_cache_list" qualifiers="virtual const"> <return type="Vector2i[]" /> <param index="0" name="font_rid" type="RID" /> <description> - Returns list of the font sizes in the cache. Each size is [code]Vector2i[/code] with font size and outline size. </description> </method> - <method name="font_get_style" qualifiers="virtual const"> + <method name="_font_get_style" qualifiers="virtual const"> <return type="int" enum="TextServer.FontStyle" /> <param index="0" name="font_rid" type="RID" /> <description> - Returns font style flags, see [enum TextServer.FontStyle]. </description> </method> - <method name="font_get_style_name" qualifiers="virtual const"> + <method name="_font_get_style_name" qualifiers="virtual const"> <return type="String" /> <param index="0" name="font_rid" type="RID" /> <description> - Returns font style name. </description> </method> - <method name="font_get_subpixel_positioning" qualifiers="virtual const"> + <method name="_font_get_subpixel_positioning" qualifiers="virtual const"> <return type="int" enum="TextServer.SubpixelPositioning" /> <param index="0" name="font_rid" type="RID" /> <description> - Returns font sub-pixel glyph positioning mode. </description> </method> - <method name="font_get_supported_chars" qualifiers="virtual const"> + <method name="_font_get_supported_chars" qualifiers="virtual const"> <return type="String" /> <param index="0" name="font_rid" type="RID" /> <description> - Returns a string containing all the characters available in the font. </description> </method> - <method name="font_get_texture_count" qualifiers="virtual const"> + <method name="_font_get_texture_count" qualifiers="virtual const"> <return type="int" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="Vector2i" /> <description> - Returns number of textures used by font cache entry. </description> </method> - <method name="font_get_texture_image" qualifiers="virtual const"> + <method name="_font_get_texture_image" qualifiers="virtual const"> <return type="Image" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="Vector2i" /> <param index="2" name="texture_index" type="int" /> <description> - Returns font cache texture image data. </description> </method> - <method name="font_get_texture_offsets" qualifiers="virtual const"> + <method name="_font_get_texture_offsets" qualifiers="virtual const"> <return type="PackedInt32Array" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="Vector2i" /> <param index="2" name="texture_index" type="int" /> <description> - Returns array containing the first free pixel in the each column of texture. Should be the same size as texture width or empty. </description> </method> - <method name="font_get_transform" qualifiers="virtual const"> + <method name="_font_get_transform" qualifiers="virtual const"> <return type="Transform2D" /> <param index="0" name="font_rid" type="RID" /> <description> - Returns 2D transform applied to the font outlines. </description> </method> - <method name="font_get_underline_position" qualifiers="virtual const"> + <method name="_font_get_underline_position" qualifiers="virtual const"> <return type="float" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="int" /> <description> - Returns pixel offset of the underline below the baseline. </description> </method> - <method name="font_get_underline_thickness" qualifiers="virtual const"> + <method name="_font_get_underline_thickness" qualifiers="virtual const"> <return type="float" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="int" /> <description> - Returns thickness of the underline in pixels. </description> </method> - <method name="font_get_variation_coordinates" qualifiers="virtual const"> + <method name="_font_get_variation_coordinates" qualifiers="virtual const"> <return type="Dictionary" /> <param index="0" name="font_rid" type="RID" /> <description> - Returns variation coordinates for the specified font cache entry. See [method font_supported_variation_list] for more info. </description> </method> - <method name="font_has_char" qualifiers="virtual const"> + <method name="_font_has_char" qualifiers="virtual const"> <return type="bool" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="char" type="int" /> <description> - Returns [code]true[/code] if a Unicode [param char] is available in the font. </description> </method> - <method name="font_is_force_autohinter" qualifiers="virtual const"> + <method name="_font_is_force_autohinter" qualifiers="virtual const"> <return type="bool" /> <param index="0" name="font_rid" type="RID" /> <description> - Returns [code]true[/code] if auto-hinting is supported and preferred over font built-in hinting. Used by dynamic fonts only. </description> </method> - <method name="font_is_language_supported" qualifiers="virtual const"> + <method name="_font_is_language_supported" qualifiers="virtual const"> <return type="bool" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="language" type="String" /> <description> - Returns [code]true[/code], if font supports given language ([url=https://en.wikipedia.org/wiki/ISO_639-1]ISO 639[/url] code). </description> </method> - <method name="font_is_multichannel_signed_distance_field" qualifiers="virtual const"> + <method name="_font_is_multichannel_signed_distance_field" qualifiers="virtual const"> <return type="bool" /> <param index="0" name="font_rid" type="RID" /> <description> - Returns [code]true[/code] if glyphs of all sizes are rendered using single multichannel signed distance field generated from the dynamic font vector data. </description> </method> - <method name="font_is_script_supported" qualifiers="virtual const"> + <method name="_font_is_script_supported" qualifiers="virtual const"> <return type="bool" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="script" type="String" /> <description> - Returns [code]true[/code], if font supports given script (ISO 15924 code). </description> </method> - <method name="font_remove_glyph" qualifiers="virtual"> + <method name="_font_remove_glyph" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="Vector2i" /> <param index="2" name="glyph" type="int" /> <description> - Removes specified rendered glyph information from the cache entry. </description> </method> - <method name="font_remove_kerning" qualifiers="virtual"> + <method name="_font_remove_kerning" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="int" /> <param index="2" name="glyph_pair" type="Vector2i" /> <description> - Removes kerning override for the pair of glyphs. </description> </method> - <method name="font_remove_language_support_override" qualifiers="virtual"> + <method name="_font_remove_language_support_override" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="language" type="String" /> <description> - Remove language support override. </description> </method> - <method name="font_remove_script_support_override" qualifiers="virtual"> + <method name="_font_remove_script_support_override" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="script" type="String" /> <description> - Removes script support override. </description> </method> - <method name="font_remove_size_cache" qualifiers="virtual"> + <method name="_font_remove_size_cache" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="Vector2i" /> <description> - Removes specified font size from the cache entry. </description> </method> - <method name="font_remove_texture" qualifiers="virtual"> + <method name="_font_remove_texture" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="Vector2i" /> <param index="2" name="texture_index" type="int" /> <description> - Removes specified texture from the cache entry. </description> </method> - <method name="font_render_glyph" qualifiers="virtual"> + <method name="_font_render_glyph" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="Vector2i" /> <param index="2" name="index" type="int" /> <description> - Renders specified glyph to the font cache texture. </description> </method> - <method name="font_render_range" qualifiers="virtual"> + <method name="_font_render_range" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="Vector2i" /> <param index="2" name="start" type="int" /> <param index="3" name="end" type="int" /> <description> - Renders the range of characters to the font cache texture. </description> </method> - <method name="font_set_antialiasing" qualifiers="virtual"> + <method name="_font_set_antialiasing" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="antialiasing" type="int" enum="TextServer.FontAntialiasing" /> <description> - Sets font anti-aliasing mode. </description> </method> - <method name="font_set_ascent" qualifiers="virtual"> + <method name="_font_set_ascent" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="int" /> <param index="2" name="ascent" type="float" /> <description> - Sets the font ascent (number of pixels above the baseline). </description> </method> - <method name="font_set_data" qualifiers="virtual"> + <method name="_font_set_data" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="data" type="PackedByteArray" /> <description> - Sets font source data, e.g contents of the dynamic font source file. </description> </method> - <method name="font_set_data_ptr" qualifiers="virtual"> + <method name="_font_set_data_ptr" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="data_ptr" type="const uint8_t*" /> <param index="2" name="data_size" type="int" /> <description> - Sets font source data, e.g contents of the dynamic font source file. [param data_ptr] memory buffer must remain accessible during font lifetime. </description> </method> - <method name="font_set_descent" qualifiers="virtual"> + <method name="_font_set_descent" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="int" /> <param index="2" name="descent" type="float" /> <description> - Sets the font descent (number of pixels below the baseline). </description> </method> - <method name="font_set_embolden" qualifiers="virtual"> + <method name="_font_set_embolden" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="strength" type="float" /> <description> - Sets font embolden strength. If [param strength] is not equal to zero, emboldens the font outlines. Negative values reduce the outline thickness. </description> </method> - <method name="font_set_face_index" qualifiers="virtual"> + <method name="_font_set_face_index" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="face_index" type="int" /> <description> - Sets an active face index in the TrueType / OpenType collection. </description> </method> - <method name="font_set_fixed_size" qualifiers="virtual"> + <method name="_font_set_fixed_size" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="fixed_size" type="int" /> <description> - Sets bitmap font fixed size. If set to value greater than zero, same cache entry will be used for all font sizes. </description> </method> - <method name="font_set_force_autohinter" qualifiers="virtual"> + <method name="_font_set_force_autohinter" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="force_autohinter" type="bool" /> <description> - If set to [code]true[/code] auto-hinting is preferred over font built-in hinting. </description> </method> - <method name="font_set_generate_mipmaps" qualifiers="virtual"> + <method name="_font_set_generate_mipmaps" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="generate_mipmaps" type="bool" /> <description> - If set to [code]true[/code] font texture mipmap generation is enabled. </description> </method> - <method name="font_set_global_oversampling" qualifiers="virtual"> + <method name="_font_set_global_oversampling" qualifiers="virtual"> <return type="void" /> <param index="0" name="oversampling" type="float" /> <description> - Sets oversampling factor, shared by all font in the TextServer. - [b]Note:[/b] This value can be automatically changed by display server. </description> </method> - <method name="font_set_glyph_advance" qualifiers="virtual"> + <method name="_font_set_glyph_advance" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="int" /> <param index="2" name="glyph" type="int" /> <param index="3" name="advance" type="Vector2" /> <description> - Sets glyph advance (offset of the next glyph). </description> </method> - <method name="font_set_glyph_offset" qualifiers="virtual"> + <method name="_font_set_glyph_offset" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="Vector2i" /> <param index="2" name="glyph" type="int" /> <param index="3" name="offset" type="Vector2" /> <description> - Sets glyph offset from the baseline. </description> </method> - <method name="font_set_glyph_size" qualifiers="virtual"> + <method name="_font_set_glyph_size" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="Vector2i" /> <param index="2" name="glyph" type="int" /> <param index="3" name="gl_size" type="Vector2" /> <description> - Sets size of the glyph. </description> </method> - <method name="font_set_glyph_texture_idx" qualifiers="virtual"> + <method name="_font_set_glyph_texture_idx" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="Vector2i" /> <param index="2" name="glyph" type="int" /> <param index="3" name="texture_idx" type="int" /> <description> - Sets index of the cache texture containing the glyph. </description> </method> - <method name="font_set_glyph_uv_rect" qualifiers="virtual"> + <method name="_font_set_glyph_uv_rect" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="Vector2i" /> <param index="2" name="glyph" type="int" /> <param index="3" name="uv_rect" type="Rect2" /> <description> - Sets rectangle in the cache texture containing the glyph. </description> </method> - <method name="font_set_hinting" qualifiers="virtual"> + <method name="_font_set_hinting" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="hinting" type="int" enum="TextServer.Hinting" /> <description> - Sets font hinting mode. Used by dynamic fonts only. </description> </method> - <method name="font_set_kerning" qualifiers="virtual"> + <method name="_font_set_kerning" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="int" /> <param index="2" name="glyph_pair" type="Vector2i" /> <param index="3" name="kerning" type="Vector2" /> <description> - Sets kerning for the pair of glyphs. </description> </method> - <method name="font_set_language_support_override" qualifiers="virtual"> + <method name="_font_set_language_support_override" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="language" type="String" /> <param index="2" name="supported" type="bool" /> <description> - Adds override for [method font_is_language_supported]. </description> </method> - <method name="font_set_msdf_pixel_range" qualifiers="virtual"> + <method name="_font_set_msdf_pixel_range" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="msdf_pixel_range" type="int" /> <description> - Sets the width of the range around the shape between the minimum and maximum representable signed distance. </description> </method> - <method name="font_set_msdf_size" qualifiers="virtual"> + <method name="_font_set_msdf_size" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="msdf_size" type="int" /> <description> - Sets source font size used to generate MSDF textures. </description> </method> - <method name="font_set_multichannel_signed_distance_field" qualifiers="virtual"> + <method name="_font_set_multichannel_signed_distance_field" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="msdf" type="bool" /> <description> - If set to [code]true[/code], glyphs of all sizes are rendered using single multichannel signed distance field generated from the dynamic font vector data. MSDF rendering allows displaying the font at any scaling factor without blurriness, and without incurring a CPU cost when the font size changes (since the font no longer needs to be rasterized on the CPU). As a downside, font hinting is not available with MSDF. The lack of font hinting may result in less crisp and less readable fonts at small sizes. - [b]Note:[/b] MSDF font rendering does not render glyphs with overlapping shapes correctly. Overlapping shapes are not valid per the OpenType standard, but are still commonly found in many font files, especially those converted by Google Fonts. To avoid issues with overlapping glyphs, consider downloading the font file directly from the type foundry instead of relying on Google Fonts. </description> </method> - <method name="font_set_name" qualifiers="virtual"> + <method name="_font_set_name" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="name" type="String" /> <description> - Sets the font family name. </description> </method> - <method name="font_set_opentype_feature_overrides" qualifiers="virtual"> + <method name="_font_set_opentype_feature_overrides" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="overrides" type="Dictionary" /> <description> - Sets font OpenType feature set override. </description> </method> - <method name="font_set_oversampling" qualifiers="virtual"> + <method name="_font_set_oversampling" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="oversampling" type="float" /> <description> - Sets font oversampling factor, if set to [code]0.0[/code] global oversampling factor is used instead. Used by dynamic fonts only. </description> </method> - <method name="font_set_scale" qualifiers="virtual"> + <method name="_font_set_scale" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="int" /> <param index="2" name="scale" type="float" /> <description> - Sets scaling factor of the color bitmap font. </description> </method> - <method name="font_set_script_support_override" qualifiers="virtual"> + <method name="_font_set_script_support_override" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="script" type="String" /> <param index="2" name="supported" type="bool" /> <description> - Adds override for [method font_is_script_supported]. </description> </method> - <method name="font_set_style" qualifiers="virtual"> + <method name="_font_set_style" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="style" type="int" enum="TextServer.FontStyle" /> <description> - Sets the font style flags, see [enum TextServer.FontStyle]. </description> </method> - <method name="font_set_style_name" qualifiers="virtual"> + <method name="_font_set_style_name" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="name_style" type="String" /> <description> - Sets the font style name. </description> </method> - <method name="font_set_subpixel_positioning" qualifiers="virtual"> + <method name="_font_set_subpixel_positioning" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="subpixel_positioning" type="int" enum="TextServer.SubpixelPositioning" /> <description> - Sets font sub-pixel glyph positioning mode. </description> </method> - <method name="font_set_texture_image" qualifiers="virtual"> + <method name="_font_set_texture_image" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="Vector2i" /> <param index="2" name="texture_index" type="int" /> <param index="3" name="image" type="Image" /> <description> - Sets font cache texture image data. </description> </method> - <method name="font_set_texture_offsets" qualifiers="virtual"> + <method name="_font_set_texture_offsets" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="Vector2i" /> <param index="2" name="texture_index" type="int" /> <param index="3" name="offset" type="PackedInt32Array" /> <description> - Sets array containing the first free pixel in the each column of texture. Should be the same size as texture width or empty. </description> </method> - <method name="font_set_transform" qualifiers="virtual"> + <method name="_font_set_transform" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="transform" type="Transform2D" /> <description> - Sets 2D transform, applied to the font outlines, can be used for slanting, flipping and rotating glyphs. - For example, to simulate italic typeface by slanting, apply the following transform [code]Transform2D(1.0, slant, 0.0, 1.0, 0.0, 0.0)[/code]. </description> </method> - <method name="font_set_underline_position" qualifiers="virtual"> + <method name="_font_set_underline_position" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="int" /> <param index="2" name="underline_position" type="float" /> <description> - Sets pixel offset of the underline below the baseline. </description> </method> - <method name="font_set_underline_thickness" qualifiers="virtual"> + <method name="_font_set_underline_thickness" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="size" type="int" /> <param index="2" name="underline_thickness" type="float" /> <description> - Sets thickness of the underline in pixels. </description> </method> - <method name="font_set_variation_coordinates" qualifiers="virtual"> + <method name="_font_set_variation_coordinates" qualifiers="virtual"> <return type="void" /> <param index="0" name="font_rid" type="RID" /> <param index="1" name="variation_coordinates" type="Dictionary" /> <description> - Sets variation coordinates for the specified font cache entry. See [method font_supported_variation_list] for more info. </description> </method> - <method name="font_supported_feature_list" qualifiers="virtual const"> + <method name="_font_supported_feature_list" qualifiers="virtual const"> <return type="Dictionary" /> <param index="0" name="font_rid" type="RID" /> <description> - Returns the dictionary of the supported OpenType features. </description> </method> - <method name="font_supported_variation_list" qualifiers="virtual const"> + <method name="_font_supported_variation_list" qualifiers="virtual const"> <return type="Dictionary" /> <param index="0" name="font_rid" type="RID" /> <description> - Returns the dictionary of the supported OpenType variation coordinates. </description> </method> - <method name="format_number" qualifiers="virtual const"> + <method name="_format_number" qualifiers="virtual const"> <return type="String" /> <param index="0" name="string" type="String" /> <param index="1" name="language" type="String" /> <description> - Converts a number from the Western Arabic (0..9) to the numeral systems used in [param language]. </description> </method> - <method name="free_rid" qualifiers="virtual"> + <method name="_free_rid" qualifiers="virtual"> <return type="void" /> <param index="0" name="rid" type="RID" /> <description> - Frees an object created by this [TextServer]. </description> </method> - <method name="get_features" qualifiers="virtual const"> + <method name="_get_features" qualifiers="virtual const"> <return type="int" /> <description> - Returns text server features, see [enum TextServer.Feature]. </description> </method> - <method name="get_hex_code_box_size" qualifiers="virtual const"> + <method name="_get_hex_code_box_size" qualifiers="virtual const"> <return type="Vector2" /> <param index="0" name="size" type="int" /> <param index="1" name="index" type="int" /> <description> - Returns size of the replacement character (box with character hexadecimal code that is drawn in place of invalid characters). - [b]Note:[/b] If this method is not implemented in the plugin, the default implementation will be used. </description> </method> - <method name="get_name" qualifiers="virtual const"> + <method name="_get_name" qualifiers="virtual const"> <return type="String" /> <description> - Returns the name of the server interface. </description> </method> - <method name="get_support_data_filename" qualifiers="virtual const"> + <method name="_get_support_data_filename" qualifiers="virtual const"> <return type="String" /> <description> - Returns default TextServer database (e.g. ICU break iterators and dictionaries) filename. </description> </method> - <method name="get_support_data_info" qualifiers="virtual const"> + <method name="_get_support_data_info" qualifiers="virtual const"> <return type="String" /> <description> - Returns TextServer database (e.g. ICU break iterators and dictionaries) description. </description> </method> - <method name="has" qualifiers="virtual"> + <method name="_has" qualifiers="virtual"> <return type="bool" /> <param index="0" name="rid" type="RID" /> <description> - Returns [code]true[/code] if [param rid] is valid resource owned by this text server. </description> </method> - <method name="has_feature" qualifiers="virtual const"> + <method name="_has_feature" qualifiers="virtual const"> <return type="bool" /> <param index="0" name="feature" type="int" enum="TextServer.Feature" /> <description> - Returns [code]true[/code] if the server supports a feature. </description> </method> - <method name="is_confusable" qualifiers="virtual const"> + <method name="_is_confusable" qualifiers="virtual const"> <return type="int" /> <param index="0" name="string" type="String" /> <param index="1" name="dict" type="PackedStringArray" /> <description> - Returns index of the first string in [param dict] which is visually confusable with the [param string], or [code]-1[/code] if none is found. </description> </method> - <method name="is_locale_right_to_left" qualifiers="virtual const"> + <method name="_is_locale_right_to_left" qualifiers="virtual const"> <return type="bool" /> <param index="0" name="locale" type="String" /> <description> - Returns [code]true[/code] if locale is right-to-left. </description> </method> - <method name="is_valid_identifier" qualifiers="virtual const"> + <method name="_is_valid_identifier" qualifiers="virtual const"> <return type="bool" /> <param index="0" name="string" type="String" /> <description> - Returns [code]true[/code] is [param string] is a valid identifier. </description> </method> - <method name="load_support_data" qualifiers="virtual"> + <method name="_load_support_data" qualifiers="virtual"> <return type="bool" /> <param index="0" name="filename" type="String" /> <description> - Loads optional TextServer database (e.g. ICU break iterators and dictionaries). </description> </method> - <method name="name_to_tag" qualifiers="virtual const"> + <method name="_name_to_tag" qualifiers="virtual const"> <return type="int" /> <param index="0" name="name" type="String" /> <description> - Converts readable feature, variation, script or language name to OpenType tag. </description> </method> - <method name="parse_number" qualifiers="virtual const"> + <method name="_parse_number" qualifiers="virtual const"> <return type="String" /> <param index="0" name="string" type="String" /> <param index="1" name="language" type="String" /> <description> - Converts a number from the numeral systems used in [param language] to Western Arabic (0..9). </description> </method> - <method name="parse_structured_text" qualifiers="virtual const"> + <method name="_parse_structured_text" qualifiers="virtual const"> <return type="Vector2i[]" /> <param index="0" name="parser_type" type="int" enum="TextServer.StructuredTextParser" /> <param index="1" name="args" type="Array" /> @@ -986,37 +859,32 @@ <description> </description> </method> - <method name="percent_sign" qualifiers="virtual const"> + <method name="_percent_sign" qualifiers="virtual const"> <return type="String" /> <param index="0" name="language" type="String" /> <description> - Returns percent sign used in the [param language]. </description> </method> - <method name="save_support_data" qualifiers="virtual const"> + <method name="_save_support_data" qualifiers="virtual const"> <return type="bool" /> <param index="0" name="filename" type="String" /> <description> - Saves optional TextServer database (e.g. ICU break iterators and dictionaries) to the file. - [b]Note:[/b] This function is used by during project export, to include TextServer database. </description> </method> - <method name="shaped_get_span_count" qualifiers="virtual const"> + <method name="_shaped_get_span_count" qualifiers="virtual const"> <return type="int" /> <param index="0" name="shaped" type="RID" /> <description> - Returns number of text spans added using [method shaped_text_add_string] or [method shaped_text_add_object]. </description> </method> - <method name="shaped_get_span_meta" qualifiers="virtual const"> + <method name="_shaped_get_span_meta" qualifiers="virtual const"> <return type="Variant" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="index" type="int" /> <description> - Returns text span metadata. </description> </method> - <method name="shaped_set_span_update_font" qualifiers="virtual"> + <method name="_shaped_set_span_update_font" qualifiers="virtual"> <return type="void" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="index" type="int" /> @@ -1024,10 +892,9 @@ <param index="3" name="size" type="int" /> <param index="4" name="opentype_features" type="Dictionary" /> <description> - Changes text span font, font size and OpenType features, without changing the text. </description> </method> - <method name="shaped_text_add_object" qualifiers="virtual"> + <method name="_shaped_text_add_object" qualifiers="virtual"> <return type="bool" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="key" type="Variant" /> @@ -1035,10 +902,9 @@ <param index="3" name="inline_align" type="int" enum="InlineAlignment" /> <param index="4" name="length" type="int" /> <description> - Adds inline object to the text buffer, [param key] must be unique. In the text, object is represented as [param length] object replacement characters. </description> </method> - <method name="shaped_text_add_string" qualifiers="virtual"> + <method name="_shaped_text_add_string" qualifiers="virtual"> <return type="bool" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="text" type="String" /> @@ -1048,17 +914,15 @@ <param index="5" name="language" type="String" /> <param index="6" name="meta" type="Variant" /> <description> - Adds text span and font to draw it to the text buffer. </description> </method> - <method name="shaped_text_clear" qualifiers="virtual"> + <method name="_shaped_text_clear" qualifiers="virtual"> <return type="void" /> <param index="0" name="shaped" type="RID" /> <description> - Clears text buffer (removes text and inline objects). </description> </method> - <method name="shaped_text_draw" qualifiers="virtual const"> + <method name="_shaped_text_draw" qualifiers="virtual const"> <return type="void" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="canvas" type="RID" /> @@ -1067,11 +931,9 @@ <param index="4" name="clip_r" type="float" /> <param index="5" name="color" type="Color" /> <description> - Draw shaped text into a canvas item at a given position, with [param color]. [param pos] specifies the leftmost point of the baseline (for horizontal layout) or topmost point of the baseline (for vertical layout). - [b]Note:[/b] If this method is not implemented in the plugin, the default implementation will be used. </description> </method> - <method name="shaped_text_draw_outline" qualifiers="virtual const"> + <method name="_shaped_text_draw_outline" qualifiers="virtual const"> <return type="void" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="canvas" type="RID" /> @@ -1081,130 +943,109 @@ <param index="5" name="outline_size" type="int" /> <param index="6" name="color" type="Color" /> <description> - Draw the outline of the shaped text into a canvas item at a given position, with [param color]. [param pos] specifies the leftmost point of the baseline (for horizontal layout) or topmost point of the baseline (for vertical layout). - [b]Note:[/b] If this method is not implemented in the plugin, the default implementation will be used. </description> </method> - <method name="shaped_text_fit_to_width" qualifiers="virtual"> + <method name="_shaped_text_fit_to_width" qualifiers="virtual"> <return type="float" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="width" type="float" /> <param index="2" name="jst_flags" type="int" enum="TextServer.JustificationFlag" /> <description> - Adjusts text with to fit to specified width, returns new text width. </description> </method> - <method name="shaped_text_get_ascent" qualifiers="virtual const"> + <method name="_shaped_text_get_ascent" qualifiers="virtual const"> <return type="float" /> <param index="0" name="shaped" type="RID" /> <description> - Returns the text ascent (number of pixels above the baseline for horizontal layout or to the left of baseline for vertical). </description> </method> - <method name="shaped_text_get_carets" qualifiers="virtual const"> + <method name="_shaped_text_get_carets" qualifiers="virtual const"> <return type="void" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="position" type="int" /> <param index="2" name="caret" type="CaretInfo*" /> <description> - Returns shapes of the carets corresponding to the character offset [param position] in the text. Returned caret shape is 1 pixel wide rectangle. - [b]Note:[/b] If this method is not implemented in the plugin, the default implementation will be used. </description> </method> - <method name="shaped_text_get_custom_punctuation" qualifiers="virtual const"> + <method name="_shaped_text_get_custom_punctuation" qualifiers="virtual const"> <return type="String" /> <param index="0" name="shaped" type="RID" /> <description> - Returns custom punctuation character list, used for word breaking. If set to empty string, server defaults are used. </description> </method> - <method name="shaped_text_get_descent" qualifiers="virtual const"> + <method name="_shaped_text_get_descent" qualifiers="virtual const"> <return type="float" /> <param index="0" name="shaped" type="RID" /> <description> - Returns the text descent (number of pixels below the baseline for horizontal layout or to the right of baseline for vertical). </description> </method> - <method name="shaped_text_get_direction" qualifiers="virtual const"> + <method name="_shaped_text_get_direction" qualifiers="virtual const"> <return type="int" enum="TextServer.Direction" /> <param index="0" name="shaped" type="RID" /> <description> - Returns direction of the text. </description> </method> - <method name="shaped_text_get_dominant_direction_in_range" qualifiers="virtual const"> + <method name="_shaped_text_get_dominant_direction_in_range" qualifiers="virtual const"> <return type="int" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="start" type="int" /> <param index="2" name="end" type="int" /> <description> - Returns dominant direction of in the range of text. - [b]Note:[/b] If this method is not implemented in the plugin, the default implementation will be used. </description> </method> - <method name="shaped_text_get_ellipsis_glyph_count" qualifiers="virtual const"> + <method name="_shaped_text_get_ellipsis_glyph_count" qualifiers="virtual const"> <return type="int" /> <param index="0" name="shaped" type="RID" /> <description> - Returns number of glyphs in the ellipsis. </description> </method> - <method name="shaped_text_get_ellipsis_glyphs" qualifiers="virtual const"> + <method name="_shaped_text_get_ellipsis_glyphs" qualifiers="virtual const"> <return type="const Glyph*" /> <param index="0" name="shaped" type="RID" /> <description> - Returns array of the glyphs in the ellipsis. </description> </method> - <method name="shaped_text_get_ellipsis_pos" qualifiers="virtual const"> + <method name="_shaped_text_get_ellipsis_pos" qualifiers="virtual const"> <return type="int" /> <param index="0" name="shaped" type="RID" /> <description> - Returns position of the ellipsis. </description> </method> - <method name="shaped_text_get_glyph_count" qualifiers="virtual const"> + <method name="_shaped_text_get_glyph_count" qualifiers="virtual const"> <return type="int" /> <param index="0" name="shaped" type="RID" /> <description> - Returns number of glyphs in the buffer. </description> </method> - <method name="shaped_text_get_glyphs" qualifiers="virtual const"> + <method name="_shaped_text_get_glyphs" qualifiers="virtual const"> <return type="const Glyph*" /> <param index="0" name="shaped" type="RID" /> <description> - Returns an array of glyphs in the visual order. </description> </method> - <method name="shaped_text_get_grapheme_bounds" qualifiers="virtual const"> + <method name="_shaped_text_get_grapheme_bounds" qualifiers="virtual const"> <return type="Vector2" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="pos" type="int" /> <description> - Returns composite character's bounds as offsets from the start of the line. - [b]Note:[/b] If this method is not implemented in the plugin, the default implementation will be used. </description> </method> - <method name="shaped_text_get_inferred_direction" qualifiers="virtual const"> + <method name="_shaped_text_get_inferred_direction" qualifiers="virtual const"> <return type="int" enum="TextServer.Direction" /> <param index="0" name="shaped" type="RID" /> <description> - Returns direction of the text, inferred by the BiDi algorithm. </description> </method> - <method name="shaped_text_get_line_breaks" qualifiers="virtual const"> + <method name="_shaped_text_get_line_breaks" qualifiers="virtual const"> <return type="PackedInt32Array" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="width" type="float" /> <param index="2" name="start" type="int" /> <param index="3" name="break_flags" type="int" enum="TextServer.LineBreakFlag" /> <description> - Breaks text to the lines and returns character ranges for each line. - [b]Note:[/b] If this method is not implemented in the plugin, the default implementation will be used. </description> </method> - <method name="shaped_text_get_line_breaks_adv" qualifiers="virtual const"> + <method name="_shaped_text_get_line_breaks_adv" qualifiers="virtual const"> <return type="PackedInt32Array" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="width" type="PackedFloat32Array" /> @@ -1212,334 +1053,280 @@ <param index="3" name="once" type="bool" /> <param index="4" name="break_flags" type="int" enum="TextServer.LineBreakFlag" /> <description> - Breaks text to the lines and columns. Returns character ranges for each segment. - [b]Note:[/b] If this method is not implemented in the plugin, the default implementation will be used. </description> </method> - <method name="shaped_text_get_object_rect" qualifiers="virtual const"> + <method name="_shaped_text_get_object_rect" qualifiers="virtual const"> <return type="Rect2" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="key" type="Variant" /> <description> - Returns bounding rectangle of the inline object. </description> </method> - <method name="shaped_text_get_objects" qualifiers="virtual const"> + <method name="_shaped_text_get_objects" qualifiers="virtual const"> <return type="Array" /> <param index="0" name="shaped" type="RID" /> <description> - Returns array of inline objects. </description> </method> - <method name="shaped_text_get_orientation" qualifiers="virtual const"> + <method name="_shaped_text_get_orientation" qualifiers="virtual const"> <return type="int" enum="TextServer.Orientation" /> <param index="0" name="shaped" type="RID" /> <description> - eturns text orientation. </description> </method> - <method name="shaped_text_get_parent" qualifiers="virtual const"> + <method name="_shaped_text_get_parent" qualifiers="virtual const"> <return type="RID" /> <param index="0" name="shaped" type="RID" /> <description> - Returns the parent buffer from which the substring originates. </description> </method> - <method name="shaped_text_get_preserve_control" qualifiers="virtual const"> + <method name="_shaped_text_get_preserve_control" qualifiers="virtual const"> <return type="bool" /> <param index="0" name="shaped" type="RID" /> <description> - Returns [code]true[/code] if text buffer is configured to display control characters. </description> </method> - <method name="shaped_text_get_preserve_invalid" qualifiers="virtual const"> + <method name="_shaped_text_get_preserve_invalid" qualifiers="virtual const"> <return type="bool" /> <param index="0" name="shaped" type="RID" /> <description> - Returns [code]true[/code] if text buffer is configured to display hexadecimal codes in place of invalid characters. - [b]Note:[/b] If set to [code]false[/code], nothing is displayed in place of invalid characters. </description> </method> - <method name="shaped_text_get_range" qualifiers="virtual const"> + <method name="_shaped_text_get_range" qualifiers="virtual const"> <return type="Vector2i" /> <param index="0" name="shaped" type="RID" /> <description> - Returns substring buffer character range in the parent buffer. </description> </method> - <method name="shaped_text_get_selection" qualifiers="virtual const"> + <method name="_shaped_text_get_selection" qualifiers="virtual const"> <return type="PackedVector2Array" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="start" type="int" /> <param index="2" name="end" type="int" /> <description> - Returns selection rectangles for the specified character range. - [b]Note:[/b] If this method is not implemented in the plugin, the default implementation will be used. </description> </method> - <method name="shaped_text_get_size" qualifiers="virtual const"> + <method name="_shaped_text_get_size" qualifiers="virtual const"> <return type="Vector2" /> <param index="0" name="shaped" type="RID" /> <description> - Returns size of the text. </description> </method> - <method name="shaped_text_get_spacing" qualifiers="virtual const"> + <method name="_shaped_text_get_spacing" qualifiers="virtual const"> <return type="int" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="spacing" type="int" enum="TextServer.SpacingType" /> <description> - Returns extra spacing added between glyphs or lines in pixels. </description> </method> - <method name="shaped_text_get_trim_pos" qualifiers="virtual const"> + <method name="_shaped_text_get_trim_pos" qualifiers="virtual const"> <return type="int" /> <param index="0" name="shaped" type="RID" /> <description> - Returns the position of the overrun trim. </description> </method> - <method name="shaped_text_get_underline_position" qualifiers="virtual const"> + <method name="_shaped_text_get_underline_position" qualifiers="virtual const"> <return type="float" /> <param index="0" name="shaped" type="RID" /> <description> - Returns pixel offset of the underline below the baseline. </description> </method> - <method name="shaped_text_get_underline_thickness" qualifiers="virtual const"> + <method name="_shaped_text_get_underline_thickness" qualifiers="virtual const"> <return type="float" /> <param index="0" name="shaped" type="RID" /> <description> - Returns thickness of the underline. </description> </method> - <method name="shaped_text_get_width" qualifiers="virtual const"> + <method name="_shaped_text_get_width" qualifiers="virtual const"> <return type="float" /> <param index="0" name="shaped" type="RID" /> <description> - Returns width (for horizontal layout) or height (for vertical) of the text. </description> </method> - <method name="shaped_text_get_word_breaks" qualifiers="virtual const"> + <method name="_shaped_text_get_word_breaks" qualifiers="virtual const"> <return type="PackedInt32Array" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="grapheme_flags" type="int" enum="TextServer.GraphemeFlag" /> <description> - Breaks text into words and returns array of character ranges. - [b]Note:[/b] If this method is not implemented in the plugin, the default implementation will be used. </description> </method> - <method name="shaped_text_hit_test_grapheme" qualifiers="virtual const"> + <method name="_shaped_text_hit_test_grapheme" qualifiers="virtual const"> <return type="int" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="coord" type="float" /> <description> - Returns grapheme index at the specified pixel offset at the baseline, or [code]-1[/code] if none is found. - [b]Note:[/b] If this method is not implemented in the plugin, the default implementation will be used. </description> </method> - <method name="shaped_text_hit_test_position" qualifiers="virtual const"> + <method name="_shaped_text_hit_test_position" qualifiers="virtual const"> <return type="int" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="coord" type="float" /> <description> - Returns caret character offset at the specified pixel offset at the baseline. This function always returns a valid position. - [b]Note:[/b] If this method is not implemented in the plugin, the default implementation will be used. </description> </method> - <method name="shaped_text_is_ready" qualifiers="virtual const"> + <method name="_shaped_text_is_ready" qualifiers="virtual const"> <return type="bool" /> <param index="0" name="shaped" type="RID" /> <description> - Returns [code]true[/code] if buffer is successfully shaped. </description> </method> - <method name="shaped_text_next_grapheme_pos" qualifiers="virtual const"> + <method name="_shaped_text_next_grapheme_pos" qualifiers="virtual const"> <return type="int" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="pos" type="int" /> <description> - Returns composite character end position closest to the [param pos]. - [b]Note:[/b] If this method is not implemented in the plugin, the default implementation will be used. </description> </method> - <method name="shaped_text_overrun_trim_to_width" qualifiers="virtual"> + <method name="_shaped_text_overrun_trim_to_width" qualifiers="virtual"> <return type="void" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="width" type="float" /> <param index="2" name="trim_flags" type="int" enum="TextServer.TextOverrunFlag" /> <description> - Trims text if it exceeds the given width. </description> </method> - <method name="shaped_text_prev_grapheme_pos" qualifiers="virtual const"> + <method name="_shaped_text_prev_grapheme_pos" qualifiers="virtual const"> <return type="int" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="pos" type="int" /> <description> - Returns composite character start position closest to the [param pos]. - [b]Note:[/b] If this method is not implemented in the plugin, the default implementation will be used. </description> </method> - <method name="shaped_text_resize_object" qualifiers="virtual"> + <method name="_shaped_text_resize_object" qualifiers="virtual"> <return type="bool" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="key" type="Variant" /> <param index="2" name="size" type="Vector2" /> <param index="3" name="inline_align" type="int" enum="InlineAlignment" /> <description> - Sets new size and alignment of embedded object. </description> </method> - <method name="shaped_text_set_bidi_override" qualifiers="virtual"> + <method name="_shaped_text_set_bidi_override" qualifiers="virtual"> <return type="void" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="override" type="Array" /> <description> - Overrides BiDi for the structured text. - Override ranges should cover full source text without overlaps. BiDi algorithm will be used on each range separately. </description> </method> - <method name="shaped_text_set_custom_punctuation" qualifiers="virtual"> + <method name="_shaped_text_set_custom_punctuation" qualifiers="virtual"> <return type="void" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="punct" type="String" /> <description> - Sets custom punctuation character list, used for word breaking. If set to empty string, server defaults are used. </description> </method> - <method name="shaped_text_set_direction" qualifiers="virtual"> + <method name="_shaped_text_set_direction" qualifiers="virtual"> <return type="void" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="direction" type="int" enum="TextServer.Direction" /> <description> - Sets desired text [param direction]. If set to [code]TEXT_DIRECTION_AUTO[/code], direction will be detected based on the buffer contents and current locale. </description> </method> - <method name="shaped_text_set_orientation" qualifiers="virtual"> + <method name="_shaped_text_set_orientation" qualifiers="virtual"> <return type="void" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="orientation" type="int" enum="TextServer.Orientation" /> <description> - Sets desired text orientation. </description> </method> - <method name="shaped_text_set_preserve_control" qualifiers="virtual"> + <method name="_shaped_text_set_preserve_control" qualifiers="virtual"> <return type="void" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="enabled" type="bool" /> <description> - If set to [code]true[/code] text buffer will display control characters. </description> </method> - <method name="shaped_text_set_preserve_invalid" qualifiers="virtual"> + <method name="_shaped_text_set_preserve_invalid" qualifiers="virtual"> <return type="void" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="enabled" type="bool" /> <description> - If set to [code]true[/code] text buffer will display invalid characters as hexadecimal codes, otherwise nothing is displayed. </description> </method> - <method name="shaped_text_set_spacing" qualifiers="virtual"> + <method name="_shaped_text_set_spacing" qualifiers="virtual"> <return type="void" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="spacing" type="int" enum="TextServer.SpacingType" /> <param index="2" name="value" type="int" /> <description> - Sets extra spacing added between glyphs or lines in pixels. </description> </method> - <method name="shaped_text_shape" qualifiers="virtual"> + <method name="_shaped_text_shape" qualifiers="virtual"> <return type="bool" /> <param index="0" name="shaped" type="RID" /> <description> - Shapes buffer if it's not shaped. Returns [code]true[/code] if the string is shaped successfully. </description> </method> - <method name="shaped_text_sort_logical" qualifiers="virtual"> + <method name="_shaped_text_sort_logical" qualifiers="virtual"> <return type="const Glyph*" /> <param index="0" name="shaped" type="RID" /> <description> - Returns text glyphs in the logical order. </description> </method> - <method name="shaped_text_substr" qualifiers="virtual const"> + <method name="_shaped_text_substr" qualifiers="virtual const"> <return type="RID" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="start" type="int" /> <param index="2" name="length" type="int" /> <description> - Returns text buffer for the substring of the text in the [param shaped] text buffer (including inline objects). </description> </method> - <method name="shaped_text_tab_align" qualifiers="virtual"> + <method name="_shaped_text_tab_align" qualifiers="virtual"> <return type="float" /> <param index="0" name="shaped" type="RID" /> <param index="1" name="tab_stops" type="PackedFloat32Array" /> <description> - Aligns shaped text to the given tab-stops. </description> </method> - <method name="shaped_text_update_breaks" qualifiers="virtual"> + <method name="_shaped_text_update_breaks" qualifiers="virtual"> <return type="bool" /> <param index="0" name="shaped" type="RID" /> <description> - Updates line breaking positions in the text buffer. - [b]Note:[/b] This method is used by default line/word breaking methods, and its implementation might be omitted if custom line breaking in implemented. </description> </method> - <method name="shaped_text_update_justification_ops" qualifiers="virtual"> + <method name="_shaped_text_update_justification_ops" qualifiers="virtual"> <return type="bool" /> <param index="0" name="shaped" type="RID" /> <description> - Updates line justification positions (word breaks and elongations) in the text buffer. - [b]Note:[/b] This method is used by default line/word breaking methods, and its implementation might be omitted if custom line breaking in implemented. </description> </method> - <method name="spoof_check" qualifiers="virtual const"> + <method name="_spoof_check" qualifiers="virtual const"> <return type="bool" /> <param index="0" name="string" type="String" /> <description> - Returns [code]true[/code] if [param string] is likely to be an attempt at confusing the reader. </description> </method> - <method name="string_get_word_breaks" qualifiers="virtual const"> + <method name="_string_get_word_breaks" qualifiers="virtual const"> <return type="PackedInt32Array" /> <param index="0" name="string" type="String" /> <param index="1" name="language" type="String" /> <description> - Returns array of the word break character offsets. </description> </method> - <method name="string_to_lower" qualifiers="virtual const"> + <method name="_string_to_lower" qualifiers="virtual const"> <return type="String" /> <param index="0" name="string" type="String" /> <param index="1" name="language" type="String" /> <description> - Returns the string converted to lowercase. </description> </method> - <method name="string_to_upper" qualifiers="virtual const"> + <method name="_string_to_upper" qualifiers="virtual const"> <return type="String" /> <param index="0" name="string" type="String" /> <param index="1" name="language" type="String" /> <description> - Returns the string converted to uppercase. </description> </method> - <method name="strip_diacritics" qualifiers="virtual const"> + <method name="_strip_diacritics" qualifiers="virtual const"> <return type="String" /> <param index="0" name="string" type="String" /> <description> - Strips diacritics from the string. - [b]Note:[/b] If this method is not implemented in the plugin, the default implementation will be used. </description> </method> - <method name="tag_to_name" qualifiers="virtual const"> + <method name="_tag_to_name" qualifiers="virtual const"> <return type="String" /> <param index="0" name="tag" type="int" /> <description> - Converts OpenType tag to readable feature, variation, script or language name. </description> </method> </methods> diff --git a/doc/classes/Texture2DArray.xml b/doc/classes/Texture2DArray.xml index 6f059b5fbf..113f37f974 100644 --- a/doc/classes/Texture2DArray.xml +++ b/doc/classes/Texture2DArray.xml @@ -1,8 +1,11 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="Texture2DArray" inherits="ImageTextureLayered" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> + A single texture resource which consists of multiple, separate images. Each image has the same dimensions and number of mipmap levels. </brief_description> <description> + A Texture2DArray is different from a Texture3D: The Texture2DArray does not support trilinear interpolation between the [Image]s, i.e. no blending. + A Texture2DArray is also different from an [AtlasTexture]: In a Texture2DArray, all images are treated separately. In an atlas, the regions (i.e. the single images) can be of different sizes. Furthermore, you usually need to add a padding around the regions, to prevent accidental UV mapping to more than one region. The same goes for mipmapping: Mipmap chains are handled separately for each layer. In an atlas, the slicing has to be done manually in the fragment shader. </description> <tutorials> </tutorials> diff --git a/doc/classes/TextureLayered.xml b/doc/classes/TextureLayered.xml index 7b528e2082..5e6afcbc5c 100644 --- a/doc/classes/TextureLayered.xml +++ b/doc/classes/TextureLayered.xml @@ -1,10 +1,15 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="TextureLayered" inherits="Texture" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> - Base class for 3D texture types. + Base class for texture types which contain the data of multiple [Image]s. Each image is of the same size and format. </brief_description> <description> - Base class for [Texture2DArray], [Cubemap] and [CubemapArray]. Cannot be used directly, but contains all the functions necessary for accessing the derived resource types. Data is set on a per-layer basis. For [Texture2DArray]s, the layer specifies the array layer. + Base class for [Texture2DArray], [Cubemap] and [CubemapArray]. Cannot be used directly, but contains all the functions necessary for accessing the derived resource types. + Data is set on a per-layer basis. For [Texture2DArray]s, the layer specifies the array layer. + All images need to have the same width, height and number of mipmap levels. + A [TextureLayered] can be loaded with [code]method ResourceFormatLoader.load[/code]. + To create such a texture file yourself, re-import your image files using the Godot Editor import presets. + Internally, Godot maps these files to their respective counterparts in the target rendering driver (GLES3, Vulkan). </description> <tutorials> </tutorials> @@ -72,6 +77,7 @@ <method name="get_layers" qualifiers="const"> <return type="int" /> <description> + Returns the number of referenced [Image]s. </description> </method> <method name="get_width" qualifiers="const"> @@ -83,6 +89,7 @@ <method name="has_mipmaps" qualifiers="const"> <return type="bool" /> <description> + Returns [code]true[/code] if the layers have generated mipmaps. </description> </method> </methods> diff --git a/doc/classes/TileMap.xml b/doc/classes/TileMap.xml index 54eb83297d..fd9c44091c 100644 --- a/doc/classes/TileMap.xml +++ b/doc/classes/TileMap.xml @@ -188,7 +188,7 @@ </description> </method> <method name="get_used_rect"> - <return type="Rect2" /> + <return type="Rect2i" /> <description> Returns a rectangle enclosing the used (non-empty) tiles of the map, including all layers. </description> diff --git a/doc/classes/Time.xml b/doc/classes/Time.xml index cdbe30c444..1abe017a4d 100644 --- a/doc/classes/Time.xml +++ b/doc/classes/Time.xml @@ -17,7 +17,7 @@ <return type="Dictionary" /> <param index="0" name="utc" type="bool" default="false" /> <description> - Returns the current date as a dictionary of keys: [code]year[/code], [code]month[/code], [code]day[/code], [code]weekday[/code], and [code]dst[/code] (Daylight Savings Time). + Returns the current date as a dictionary of keys: [code]year[/code], [code]month[/code], [code]day[/code], and [code]weekday[/code]. The returned values are in the system's local time when [param utc] is [code]false[/code], otherwise they are in UTC. </description> </method> @@ -57,7 +57,7 @@ <return type="Dictionary" /> <param index="0" name="utc" type="bool" default="false" /> <description> - Returns the current date as a dictionary of keys: [code]year[/code], [code]month[/code], [code]day[/code], [code]weekday[/code], [code]hour[/code], [code]minute[/code], and [code]second[/code]. + Returns the current date as a dictionary of keys: [code]year[/code], [code]month[/code], [code]day[/code], [code]weekday[/code], [code]hour[/code], [code]minute[/code], [code]second[/code], and [code]dst[/code] (Daylight Savings Time). </description> </method> <method name="get_datetime_dict_from_unix_time" qualifiers="const"> diff --git a/doc/classes/Tree.xml b/doc/classes/Tree.xml index f6a078602c..539ca38190 100644 --- a/doc/classes/Tree.xml +++ b/doc/classes/Tree.xml @@ -312,6 +312,9 @@ The drop mode as an OR combination of flags. See [enum DropModeFlags] constants. Once dropping is done, reverts to [constant DROP_MODE_DISABLED]. Setting this during [method Control._can_drop_data] is recommended. This controls the drop sections, i.e. the decision and drawing of possible drop locations based on the mouse position. </member> + <member name="enable_recursive_folding" type="bool" setter="set_enable_recursive_folding" getter="is_recursive_folding_enabled" default="true"> + If [code]true[/code], recursive folding is enabled for this [Tree]. Holding down Shift while clicking the fold arrow collapses or uncollapses the [TreeItem] and all its descendants. + </member> <member name="focus_mode" type="int" setter="set_focus_mode" getter="get_focus_mode" overrides="Control" enum="Control.FocusMode" default="2" /> <member name="hide_folding" type="bool" setter="set_hide_folding" getter="is_folding_hidden" default="false"> If [code]true[/code], the folding arrow is hidden. diff --git a/doc/classes/TreeItem.xml b/doc/classes/TreeItem.xml index fdae6d205d..c109dc57f7 100644 --- a/doc/classes/TreeItem.xml +++ b/doc/classes/TreeItem.xml @@ -321,6 +321,14 @@ Returns the [Tree] that owns this TreeItem. </description> </method> + <method name="is_any_collapsed"> + <return type="bool" /> + <param index="0" name="only_visible" type="bool" default="false" /> + <description> + Returns [code]true[/code] if this [TreeItem], or any of its descendants, is collapsed. + If [param only_visible] is [code]true[/code] it ignores non-visible [TreeItem]s. + </description> + </method> <method name="is_button_disabled" qualifiers="const"> <return type="bool" /> <param index="0" name="column" type="int" /> @@ -442,6 +450,13 @@ If [code]true[/code], the given [param column] is checked. Clears column's indeterminate status. </description> </method> + <method name="set_collapsed_recursive"> + <return type="void" /> + <param index="0" name="enable" type="bool" /> + <description> + Collapses or uncollapses this [TreeItem] and all the descendants of this item. + </description> + </method> <method name="set_custom_as_button"> <return type="void" /> <param index="0" name="column" type="int" /> diff --git a/doc/classes/Tween.xml b/doc/classes/Tween.xml index c7fc78c1d3..acf900ae55 100644 --- a/doc/classes/Tween.xml +++ b/doc/classes/Tween.xml @@ -8,37 +8,89 @@ [Tween] is more suited than [AnimationPlayer] for animations where you don't know the final values in advance. For example, interpolating a dynamically-chosen camera zoom value is best done with a [Tween]; it would be difficult to do the same thing with an [AnimationPlayer] node. Tweens are also more light-weight than [AnimationPlayer], so they are very much suited for simple animations or general tasks that don't require visual tweaking provided by the editor. They can be used in a fire-and-forget manner for some logic that normally would be done by code. You can e.g. make something shoot periodically by using a looped [CallbackTweener] with a delay. A [Tween] can be created by using either [method SceneTree.create_tween] or [method Node.create_tween]. [Tween]s created manually (i.e. by using [code]Tween.new()[/code]) are invalid and can't be used for tweening values. A tween animation is created by adding [Tweener]s to the [Tween] object, using [method tween_property], [method tween_interval], [method tween_callback] or [method tween_method]: - [codeblock] + [codeblocks] + [gdscript] var tween = get_tree().create_tween() tween.tween_property($Sprite, "modulate", Color.red, 1) tween.tween_property($Sprite, "scale", Vector2(), 1) tween.tween_callback($Sprite.queue_free) - [/codeblock] + [/gdscript] + [csharp] + Tween tween = GetTree().CreateTween(); + tween.TweenProperty(GetNode("Sprite"), "modulate", Colors.Red, 1.0f); + tween.TweenProperty(GetNode("Sprite"), "scale", Vector2.Zero, 1.0f); + tween.TweenCallback(new Callable(GetNode("Sprite").QueueFree)); + [/csharp] + [/codeblocks] This sequence will make the [code]$Sprite[/code] node turn red, then shrink, before finally calling [method Node.queue_free] to free the sprite. [Tweener]s are executed one after another by default. This behavior can be changed using [method parallel] and [method set_parallel]. When a [Tweener] is created with one of the [code]tween_*[/code] methods, a chained method call can be used to tweak the properties of this [Tweener]. For example, if you want to set a different transition type in the above example, you can use [method set_trans]: - [codeblock] + [codeblocks] + [gdscript] var tween = get_tree().create_tween() tween.tween_property($Sprite, "modulate", Color.red, 1).set_trans(Tween.TRANS_SINE) tween.tween_property($Sprite, "scale", Vector2(), 1).set_trans(Tween.TRANS_BOUNCE) tween.tween_callback($Sprite.queue_free) - [/codeblock] + [/gdscript] + [csharp] + Tween tween = GetTree().CreateTween(); + tween.TweenProperty(GetNode("Sprite"), "modulate", Colors.Red, 1.0f).SetTrans(Tween.TransitionType.Sine); + tween.TweenProperty(GetNode("Sprite"), "scale", Vector2.Zero, 1.0f).SetTrans(Tween.TransitionType.Bounce); + tween.TweenCallback(new Callable(GetNode("Sprite").QueueFree)); + [/csharp] + [/codeblocks] Most of the [Tween] methods can be chained this way too. In the following example the [Tween] is bound to the running script's node and a default transition is set for its [Tweener]s: - [codeblock] + [codeblocks] + [gdscript] var tween = get_tree().create_tween().bind_node(self).set_trans(Tween.TRANS_ELASTIC) tween.tween_property($Sprite, "modulate", Color.red, 1) tween.tween_property($Sprite, "scale", Vector2(), 1) tween.tween_callback($Sprite.queue_free) - [/codeblock] + [/gdscript] + [csharp] + var tween = GetTree().CreateTween().BindNode(this).SetTrans(Tween.TransitionType.Elastic); + tween.TweenProperty(GetNode("Sprite"), "modulate", Colors.Red, 1.0f); + tween.TweenProperty(GetNode("Sprite"), "scale", Vector2.Zero, 1.0f); + tween.TweenCallback(new Callable(GetNode("Sprite").QueueFree)); + [/csharp] + [/codeblocks] Another interesting use for [Tween]s is animating arbitrary sets of objects: - [codeblock] + [codeblocks] + [gdscript] var tween = create_tween() for sprite in get_children(): tween.tween_property(sprite, "position", Vector2(0, 0), 1) - [/codeblock] + [/gdscript] + [csharp] + Tween tween = CreateTween(); + foreach (Node sprite in GetChildren()) + tween.TweenProperty(sprite, "position", Vector2.Zero, 1.0f); + [/csharp] + [/codeblocks] In the example above, all children of a node are moved one after another to position (0, 0). + You should avoid using more than one [Tween] per object's property. If two or more tweens animate one property at the same time, the last one created will take priority and assign the final value. If you want to interrupt and restart an animation, consider assigning the [Tween] to a variable: + [codeblocks] + [gdscript] + var tween + func animate(): + if tween: + tween.kill() # Abort the previous animation. + tween = create_tween() + [/gdscript] + [csharp] + private Tween tween; + + public void Animate() + { + if (tween != null) + tween.Kill(); // Abort the previous animation + tween = CreateTween(); + } + [/csharp] + [/codeblocks] Some [Tweener]s use transitions and eases. The first accepts a [enum TransitionType] constant, and refers to the way the timing of the animation is handled (see [url=https://easings.net/]easings.net[/url] for some examples). The second accepts an [enum EaseType] constant, and controls where the [code]trans_type[/code] is applied to the interpolation (in the beginning, the end, or both). If you don't know which transition and easing to pick, you can try different [enum TransitionType] constants with [constant EASE_IN_OUT], and use the one that looks best. [url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url] [b]Note:[/b] All [Tween]s will automatically start by default. To prevent a [Tween] from autostarting, you can call [method stop] immediately after it is created. + [b]Note:[/b] [Tween]s are processing after all of nodes in the current frame, i.e. after [method Node._process] or [method Node._physics_process] (depending on [enum TweenProcessMode]). </description> <tutorials> </tutorials> @@ -55,12 +107,20 @@ <return type="Tween" /> <description> Used to chain two [Tweener]s after [method set_parallel] is called with [code]true[/code]. - [codeblock] + [codeblocks] + [gdscript] var tween = create_tween().set_parallel(true) tween.tween_property(...) tween.tween_property(...) # Will run parallelly with above. tween.chain().tween_property(...) # Will run after two above are finished. - [/codeblock] + [/gdscript] + [csharp] + Tween tween = CreateTween().SetParallel(true); + tween.TweenProperty(...); + tween.TweenProperty(...); // Will run parallelly with above. + tween.Chain().TweenProperty(...); // Will run after two above are finished. + [/csharp] + [/codeblocks] </description> </method> <method name="custom_step"> @@ -118,12 +178,20 @@ <return type="Tween" /> <description> Makes the next [Tweener] run parallelly to the previous one. Example: - [codeblock] + [codeblocks] + [gdscript] var tween = create_tween() tween.tween_property(...) tween.parallel().tween_property(...) tween.parallel().tween_property(...) - [/codeblock] + [/gdscript] + [csharp] + Tween tween = CreateTween(); + tween.TweenProperty(...); + tween.Parallel().TweenProperty(...); + tween.Parallel().TweenProperty(...); + [/csharp] + [/codeblocks] All [Tweener]s in the example will run at the same time. You can make the [Tween] parallel by default by using [method set_parallel]. </description> @@ -205,16 +273,30 @@ <description> Creates and appends a [CallbackTweener]. This method can be used to call an arbitrary method in any object. Use [method Callable.bind] to bind additional arguments for the call. Example: object that keeps shooting every 1 second. - [codeblock] + [codeblocks] + [gdscript] var tween = get_tree().create_tween().set_loops() tween.tween_callback(shoot).set_delay(1) - [/codeblock] + [/gdscript] + [csharp] + Tween tween = GetTree().CreateTween().SetLoops(); + tween.TweenCallback(new Callable(Shoot)).SetDelay(1.0f); + [/csharp] + [/codeblocks] Example: turning a sprite red and then blue, with 2 second delay. - [codeblock] + [codeblocks] + [gdscript] var tween = get_tree().create_tween() tween.tween_callback($Sprite.set_modulate.bind(Color.red)).set_delay(2) tween.tween_callback($Sprite.set_modulate.bind(Color.blue)).set_delay(2) - [/codeblock] + [/gdscript] + [csharp] + Tween tween = GetTree().CreateTween(); + Sprite2D sprite = GetNode<Sprite2D>("Sprite"); + tween.TweenCallback(new Callable(() => sprite.Modulate = Colors.Red)).SetDelay(2.0f); + tween.TweenCallback(new Callable(() => sprite.Modulate = Colors.Blue)).SetDelay(2.0f); + [/csharp] + [/codeblocks] </description> </method> <method name="tween_interval"> @@ -223,13 +305,21 @@ <description> Creates and appends an [IntervalTweener]. This method can be used to create delays in the tween animation, as an alternative to using the delay in other [Tweener]s, or when there's no animation (in which case the [Tween] acts as a timer). [param time] is the length of the interval, in seconds. Example: creating an interval in code execution. - [codeblock] + [codeblocks] + [gdscript] # ... some code await create_tween().tween_interval(2).finished # ... more code - [/codeblock] + [/gdscript] + [csharp] + // ... some code + await ToSignal(CreateTween().TweenInterval(2.0f), Tween.SignalName.Finished); + // ... more code + [/csharp] + [/codeblocks] Example: creating an object that moves back and forth and jumps every few seconds. - [codeblock] + [codeblocks] + [gdscript] var tween = create_tween().set_loops() tween.tween_property($Sprite, "position:x", 200.0, 1).as_relative() tween.tween_callback(jump) @@ -237,7 +327,17 @@ tween.tween_property($Sprite, "position:x", -200.0, 1).as_relative() tween.tween_callback(jump) tween.tween_interval(2) - [/codeblock] + [/gdscript] + [csharp] + Tween tween = CreateTween().SetLoops(); + tween.TweenProperty(GetNode("Sprite"), "position:x", 200.0f, 1.0f).AsRelative(); + tween.TweenCallback(new Callable(Jump)); + tween.TweenInterval(2.0f); + tween.TweenProperty(GetNode("Sprite"), "position:x", -200.0f, 1.0f).AsRelative(); + tween.TweenCallback(new Callable(Jump)); + tween.TweenInterval(2.0f); + [/csharp] + [/codeblocks] </description> </method> <method name="tween_method"> @@ -249,19 +349,41 @@ <description> Creates and appends a [MethodTweener]. This method is similar to a combination of [method tween_callback] and [method tween_property]. It calls a method over time with a tweened value provided as an argument. The value is tweened between [param from] and [param to] over the time specified by [param duration], in seconds. Use [method Callable.bind] to bind additional arguments for the call. You can use [method MethodTweener.set_ease] and [method MethodTweener.set_trans] to tweak the easing and transition of the value or [method MethodTweener.set_delay] to delay the tweening. Example: making a 3D object look from one point to another point. - [codeblock] + [codeblocks] + [gdscript] var tween = create_tween() tween.tween_method(look_at.bind(Vector3.UP), Vector3(-1, 0, -1), Vector3(1, 0, -1), 1) # The look_at() method takes up vector as second argument. - [/codeblock] + [/gdscript] + [csharp] + Tween tween = CreateTween(); + tween.TweenMethod(new Callable(() => LookAt(Vector3.Up)), new Vector3(-1.0f, 0.0f, -1.0f), new Vector3(1.0f, 0.0f, -1.0f), 1.0f); // The LookAt() method takes up vector as second argument. + [/csharp] + [/codeblocks] Example: setting a text of a [Label], using an intermediate method and after a delay. - [codeblock] + [codeblocks] + [gdscript] func _ready(): var tween = create_tween() tween.tween_method(set_label_text, 0, 10, 1).set_delay(1) func set_label_text(value: int): $Label.text = "Counting " + str(value) - [/codeblock] + [/gdscript] + [csharp] + public override void _Ready() + { + base._Ready(); + + Tween tween = CreateTween(); + tween.TweenMethod(new Callable(SetLabelText), 0.0f, 10.0f, 1.0f).SetDelay(1.0f); + } + + private void SetLabelText(int value) + { + GetNode<Label>("Label").Text = $"Counting {value}"; + } + [/csharp] + [/codeblocks] </description> </method> <method name="tween_property"> @@ -272,19 +394,33 @@ <param index="3" name="duration" type="float" /> <description> Creates and appends a [PropertyTweener]. This method tweens a [param property] of an [param object] between an initial value and [param final_val] in a span of time equal to [param duration], in seconds. The initial value by default is the property's value at the time the tweening of the [PropertyTweener] starts. For example: - [codeblock] + [codeblocks] + [gdscript] var tween = create_tween() tween.tween_property($Sprite, "position", Vector2(100, 200), 1) tween.tween_property($Sprite, "position", Vector2(200, 300), 1) - [/codeblock] + [/gdscript] + [csharp] + Tween tween = CreateTween(); + tween.TweenProperty(GetNode("Sprite"), "position", new Vector2(100.0f, 200.0f), 1.0f); + tween.TweenProperty(GetNode("Sprite"), "position", new Vector2(200.0f, 300.0f), 1.0f); + [/csharp] + [/codeblocks] will move the sprite to position (100, 200) and then to (200, 300). If you use [method PropertyTweener.from] or [method PropertyTweener.from_current], the starting position will be overwritten by the given value instead. See other methods in [PropertyTweener] to see how the tweening can be tweaked further. [b]Note:[/b] You can find the correct property name by hovering over the property in the Inspector. You can also provide the components of a property directly by using [code]"property:component"[/code] (eg. [code]position:x[/code]), where it would only apply to that particular component. Example: moving object twice from the same position, with different transition types. - [codeblock] + [codeblocks] + [gdscript] var tween = create_tween() tween.tween_property($Sprite, "position", Vector2.RIGHT * 300, 1).as_relative().set_trans(Tween.TRANS_SINE) tween.tween_property($Sprite, "position", Vector2.RIGHT * 300, 1).as_relative().from_current().set_trans(Tween.TRANS_EXPO) - [/codeblock] + [/gdscript] + [csharp] + Tween tween = CreateTween(); + tween.TweenProperty(GetNode("Sprite"), "position", Vector2.Right * 300.0f, 1.0f).AsRelative().SetTrans(Tween.TransitionType.Sine); + tween.TweenProperty(GetNode("Sprite"), "position", Vector2.Right * 300.0f, 1.0f).AsRelative().FromCurrent().SetTrans(Tween.TransitionType.Expo); + [/csharp] + [/codeblocks] </description> </method> </methods> diff --git a/doc/classes/UndoRedo.xml b/doc/classes/UndoRedo.xml index 3ef59b1c39..7258efbdda 100644 --- a/doc/classes/UndoRedo.xml +++ b/doc/classes/UndoRedo.xml @@ -62,12 +62,11 @@ <tutorials> </tutorials> <methods> - <method name="add_do_method" qualifiers="vararg"> + <method name="add_do_method"> <return type="void" /> - <param index="0" name="object" type="Object" /> - <param index="1" name="method" type="StringName" /> + <param index="0" name="callable" type="Callable" /> <description> - Register a [param method] that will be called when the action is committed. + Register a [Callable] that will be called when the action is committed. </description> </method> <method name="add_do_property"> @@ -86,12 +85,11 @@ Register a reference for "do" that will be erased if the "do" history is lost. This is useful mostly for new nodes created for the "do" call. Do not use for resources. </description> </method> - <method name="add_undo_method" qualifiers="vararg"> + <method name="add_undo_method"> <return type="void" /> - <param index="0" name="object" type="Object" /> - <param index="1" name="method" type="StringName" /> + <param index="0" name="callable" type="Callable" /> <description> - Register a [param method] that will be called when the action is undone. + Register a [Callable] that will be called when the action is undone. </description> </method> <method name="add_undo_property"> diff --git a/doc/classes/Window.xml b/doc/classes/Window.xml index 2c0a694ef9..c585b54ee1 100644 --- a/doc/classes/Window.xml +++ b/doc/classes/Window.xml @@ -381,7 +381,8 @@ Note that behavior might be different depending on the platform. </member> <member name="transparent" type="bool" setter="set_flag" getter="get_flag" default="false"> - If [code]true[/code], the [Window]'s background can be transparent. This is best used with embedded windows. Currently non-embedded [Window] transparency is implemented only for MacOS. + If [code]true[/code], the [Window]'s background can be transparent. This is best used with embedded windows. + [b]Note:[/b] This flag has no effect if [member ProjectSettings.display/window/per_pixel_transparency/allowed] is set to [code]false[/code]. </member> <member name="unfocusable" type="bool" setter="set_flag" getter="get_flag" default="false"> If [code]true[/code], the [Window] can't be focused nor interacted with. It can still be visible. @@ -454,6 +455,11 @@ Emitted when the [constant NOTIFICATION_THEME_CHANGED] notification is sent. </description> </signal> + <signal name="titlebar_changed"> + <description> + Emitted when window title bar decorations are changed, e.g., macOS window enter/exit full screen mode, or extend-to-title flag is changed. + </description> + </signal> <signal name="visibility_changed"> <description> Emitted when [Window] is made visible or disappears. diff --git a/doc/classes/XRInterface.xml b/doc/classes/XRInterface.xml index 6296b95e6c..3e48b8284a 100644 --- a/doc/classes/XRInterface.xml +++ b/doc/classes/XRInterface.xml @@ -69,6 +69,18 @@ Is [code]true[/code] if this interface has been initialised. </description> </method> + <method name="is_passthrough_enabled"> + <return type="bool" /> + <description> + Is [code]true[/code] if passthrough is enabled. + </description> + </method> + <method name="is_passthrough_supported"> + <return type="bool" /> + <description> + Is [code]true[/code] if this interface supports passthrough. + </description> + </method> <method name="set_play_area_mode"> <return type="bool" /> <param index="0" name="mode" type="int" enum="XRInterface.PlayAreaMode" /> @@ -76,6 +88,19 @@ Sets the active play area mode, will return [code]false[/code] if the mode can't be used with this interface. </description> </method> + <method name="start_passthrough"> + <return type="bool" /> + <description> + Starts passthrough, will return [code]false[/code] if passthrough couldn't be started. + [b]Note:[/b] The viewport used for XR must have a transparent background, otherwise passthrough may not properly render. + </description> + </method> + <method name="stop_passthrough"> + <return type="void" /> + <description> + Stops passthrough. + </description> + </method> <method name="supports_play_area_mode"> <return type="bool" /> <param index="0" name="mode" type="int" enum="XRInterface.PlayAreaMode" /> diff --git a/doc/tools/make_rst.py b/doc/tools/make_rst.py index cd7de085d8..492a438d9b 100755 --- a/doc/tools/make_rst.py +++ b/doc/tools/make_rst.py @@ -526,7 +526,7 @@ def main() -> None: ) if os.path.exists(lang_file): try: - import polib + import polib # type: ignore except ImportError: print("Base template strings localization requires `polib`.") exit(1) @@ -739,9 +739,10 @@ def make_rst_class(class_def: ClassDef, state: State, dry_run: bool, output_dir: f.write(f"- {make_link(url, title)}\n\n") # Properties overview + ml: List[Tuple[Optional[str], ...]] = [] if len(class_def.properties) > 0: f.write(make_heading("Properties", "-")) - ml: List[Tuple[Optional[str], ...]] = [] + ml = [] for property_def in class_def.properties.values(): type_rst = property_def.type_name.to_rst(state) default = property_def.default_value @@ -757,7 +758,7 @@ def make_rst_class(class_def: ClassDef, state: State, dry_run: bool, output_dir: # Constructors, Methods, Operators overview if len(class_def.constructors) > 0: f.write(make_heading("Constructors", "-")) - ml: List[Tuple[Optional[str], ...]] = [] + ml = [] for method_list in class_def.constructors.values(): for m in method_list: ml.append(make_method_signature(class_def, m, "constructor", state)) @@ -765,7 +766,7 @@ def make_rst_class(class_def: ClassDef, state: State, dry_run: bool, output_dir: if len(class_def.methods) > 0: f.write(make_heading("Methods", "-")) - ml: List[Tuple[Optional[str], ...]] = [] + ml = [] for method_list in class_def.methods.values(): for m in method_list: ml.append(make_method_signature(class_def, m, "method", state)) @@ -773,7 +774,7 @@ def make_rst_class(class_def: ClassDef, state: State, dry_run: bool, output_dir: if len(class_def.operators) > 0: f.write(make_heading("Operators", "-")) - ml: List[Tuple[Optional[str], ...]] = [] + ml = [] for method_list in class_def.operators.values(): for m in method_list: ml.append(make_method_signature(class_def, m, "operator", state)) @@ -858,7 +859,7 @@ def make_rst_class(class_def: ClassDef, state: State, dry_run: bool, output_dir: f.write(make_heading("Annotations", "-")) index = 0 - for method_list in class_def.annotations.values(): + for method_list in class_def.annotations.values(): # type: ignore for i, m in enumerate(method_list): if index != 0: f.write("----\n\n") @@ -1039,17 +1040,15 @@ def make_method_signature( ) -> Tuple[str, str]: ret_type = "" - is_method_def = isinstance(definition, MethodDef) - if is_method_def: + if isinstance(definition, MethodDef): ret_type = definition.return_type.to_rst(state) qualifiers = None - if is_method_def or isinstance(definition, AnnotationDef): + if isinstance(definition, (MethodDef, AnnotationDef)): qualifiers = definition.qualifiers out = "" - - if is_method_def and ref_type != "": + if isinstance(definition, MethodDef) and ref_type != "": if ref_type == "operator": op_name = definition.name.replace("<", "\\<") # So operator "<" gets correctly displayed. out += f":ref:`{op_name}<class_{class_def.name}_{ref_type}_{sanitize_operator_name(definition.name, state)}_{definition.return_type.type_name}>` " @@ -1456,18 +1455,14 @@ def format_text_block( escape_post = True elif cmd.startswith("param"): - valid_context = ( - isinstance(context, MethodDef) - or isinstance(context, SignalDef) - or isinstance(context, AnnotationDef) - ) + valid_context = isinstance(context, (MethodDef, SignalDef, AnnotationDef)) if not valid_context: print_error( f'{state.current_class}.xml: Argument reference "{link_target}" used outside of method, signal, or annotation context in {context_name}.', state, ) else: - context_params: List[ParameterDef] = context.parameters + context_params: List[ParameterDef] = context.parameters # type: ignore found = False for param_def in context_params: if param_def.name == link_target: @@ -1480,6 +1475,8 @@ def format_text_block( ) tag_text = f"``{link_target}``" + escape_pre = True + escape_post = True # Formatting directives. diff --git a/doc/translations/ar.po b/doc/translations/ar.po index 43e62ecab2..ae292d4035 100644 --- a/doc/translations/ar.po +++ b/doc/translations/ar.po @@ -693,8 +693,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -704,7 +705,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -758,7 +760,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -770,7 +773,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1191,10 +1195,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -5013,19 +5022,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -5046,21 +5057,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -5070,9 +5085,10 @@ msgstr "ÙŠÙØ±Ø¬Ø¹ قيمة ظل الزاوية للمَعلم." #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -5724,9 +5740,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -5900,8 +5916,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -6612,7 +6628,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -6849,7 +6870,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -7497,7 +7523,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -8903,8 +8937,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8955,10 +8990,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9201,12 +9246,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9752,7 +9791,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9913,12 +9957,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10066,6 +10114,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10206,7 +10269,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11886,7 +11952,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11979,7 +12045,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -12007,9 +12075,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12509,13 +12577,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -12541,8 +12610,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12855,12 +12926,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12905,8 +12976,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12954,8 +13027,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -13017,7 +13093,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13142,7 +13218,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -13847,17 +13926,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -14164,12 +14243,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14206,12 +14286,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -15371,7 +15452,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -15397,7 +15486,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -16138,7 +16231,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18869,7 +18964,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -19018,16 +19115,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19173,18 +19271,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml #, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "ÙŠÙØ±Ø¬Ø¹ قيمة الجيب العكسية للمَعلم." @@ -24099,8 +24185,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24721,7 +24811,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26309,10 +26401,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27721,8 +27816,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -30024,11 +30119,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30874,7 +30972,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30886,6 +30988,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33246,14 +33358,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33261,22 +33373,26 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "ÙŠÙØ±Ø¬Ø¹ جيب المَعلم." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "ÙŠÙØ±Ø¬Ø¹ جيب المَعلم." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "ÙŠÙØ±Ø¬Ø¹ جيب المَعلم." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." -msgstr "" +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." +msgstr "ÙŠÙØ±Ø¬Ø¹ جيب المَعلم." #: doc/classes/Line2D.xml msgid "" @@ -34552,8 +34668,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -34598,7 +34718,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -34853,9 +34976,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35316,7 +35439,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36453,7 +36578,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37279,13 +37404,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40955,7 +41092,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46342,7 +46481,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "ÙŠÙØ±Ø¬Ø¹ جيب المَعلم." #: doc/classes/PopupMenu.xml @@ -46581,7 +46722,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47311,7 +47454,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49992,8 +50139,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53571,11 +53729,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -54012,7 +54174,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -54156,13 +54320,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -54485,6 +54655,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -54497,7 +54679,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55352,7 +55537,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55971,6 +56159,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56305,7 +56501,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57738,7 +57936,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -59005,6 +59203,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -59066,6 +59267,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -59088,7 +59292,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60225,6 +60432,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "ÙŠÙØ±Ø¬Ø¹ جيب المَعلم." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60255,6 +60467,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "ÙŠÙØ±Ø¬Ø¹ جيب المَعلم." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60296,7 +60513,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -61653,38 +61872,44 @@ msgid "Clears all values on the theme." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "ÙŠÙØ±Ø¬Ø¹ باقي قسمة كل من Ø§Ù„Ù…ÙØªØ¬Ù‡ÙŠÙ† (الشعاعين)." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "ÙŠÙØ±Ø¬Ø¹ جيب المَعلم." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "ÙŠÙØ±Ø¬Ø¹ باقي قسمة كل من Ø§Ù„Ù…ÙØªØ¬Ù‡ÙŠÙ† (الشعاعين)." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." -msgstr "" +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." +msgstr "ÙŠÙØ±Ø¬Ø¹ باقي قسمة كل من Ø§Ù„Ù…ÙØªØ¬Ù‡ÙŠÙ† (الشعاعين)." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "ÙŠÙØ±Ø¬Ø¹ باقي قسمة كل من Ø§Ù„Ù…ÙØªØ¬Ù‡ÙŠÙ† (الشعاعين)." #: doc/classes/Theme.xml msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61702,15 +61927,17 @@ msgid "Sets the theme's values to a copy of a given theme." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "ÙŠÙØ±Ø¬Ø¹ باقي قسمة كل من Ø§Ù„Ù…ÙØªØ¬Ù‡ÙŠÙ† (الشعاعين)." #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61720,15 +61947,16 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "ÙŠÙØ±Ø¬Ø¹ باقي قسمة كل من Ø§Ù„Ù…ÙØªØ¬Ù‡ÙŠÙ† (الشعاعين)." #: doc/classes/Theme.xml msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" @@ -61741,7 +61969,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" @@ -61749,7 +61977,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61759,15 +61987,16 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." -msgstr "" +"[code]theme_type[/code]." +msgstr "ÙŠÙØ±Ø¬Ø¹ باقي قسمة كل من Ø§Ù„Ù…ÙØªØ¬Ù‡ÙŠÙ† (الشعاعين)." #: doc/classes/Theme.xml msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61779,17 +62008,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -61802,9 +62033,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -61812,8 +62043,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -61828,7 +62059,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -61847,15 +62078,17 @@ msgstr "ÙŠÙØ±Ø¬Ø¹ باقي قسمة كل من Ø§Ù„Ù…ÙØªØ¬Ù‡ÙŠÙ† (الشعاع٠#: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61867,29 +62100,33 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61917,87 +62154,87 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -65177,21 +65414,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65204,7 +65445,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65233,7 +65474,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65243,22 +65516,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65271,8 +65557,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65470,16 +65758,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -71596,6 +71884,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -74136,7 +74428,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/ca.po b/doc/translations/ca.po index 2fce9a4d08..ff63e7f808 100644 --- a/doc/translations/ca.po +++ b/doc/translations/ca.po @@ -653,8 +653,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -664,7 +665,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -718,7 +720,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -730,7 +733,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1145,10 +1149,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4959,19 +4968,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4992,21 +5003,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -5015,9 +5030,10 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -5669,9 +5685,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -5845,8 +5861,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -6557,7 +6573,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -6794,7 +6815,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -7442,7 +7468,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -8848,8 +8882,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8900,10 +8935,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9145,12 +9190,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9696,7 +9735,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9857,12 +9901,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10010,6 +10058,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10150,7 +10213,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11828,7 +11894,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11921,7 +11987,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11949,9 +12017,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12448,13 +12516,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -12480,8 +12549,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12794,12 +12865,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12844,8 +12915,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12893,8 +12966,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12956,7 +13032,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13081,7 +13157,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -13786,17 +13865,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -14103,12 +14182,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14145,12 +14225,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -15310,7 +15391,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -15336,7 +15425,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -16077,7 +16170,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18802,7 +18897,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18951,16 +19048,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19105,18 +19203,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -24023,8 +24109,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24644,7 +24734,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26228,10 +26320,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27638,8 +27733,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -29939,11 +30034,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30788,7 +30886,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30800,6 +30902,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33157,14 +33269,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33172,21 +33284,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34462,8 +34574,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -34508,7 +34624,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -34763,9 +34882,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35224,7 +35343,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36336,7 +36457,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37151,13 +37272,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40821,7 +40954,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46185,7 +46320,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46424,7 +46561,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47153,7 +47292,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49834,8 +49977,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53411,11 +53565,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -53852,7 +54010,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53996,13 +54156,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -54325,6 +54491,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -54337,7 +54515,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55192,7 +55373,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55811,6 +55995,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56145,7 +56337,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57578,7 +57772,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58843,6 +59037,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -58904,6 +59101,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -58926,7 +59126,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60063,6 +60266,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60092,6 +60299,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60133,7 +60344,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -61483,37 +61696,38 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61532,14 +61746,15 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61550,14 +61765,14 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" @@ -61570,7 +61785,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" @@ -61578,7 +61793,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61590,13 +61805,13 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." +"[code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61608,17 +61823,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -61631,9 +61848,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -61641,8 +61858,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -61657,7 +61874,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -61675,15 +61892,17 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61695,29 +61914,33 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61745,87 +61968,87 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -64998,21 +65221,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65025,7 +65252,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65054,7 +65281,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65064,22 +65323,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65092,8 +65364,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65291,16 +65565,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -71394,6 +71668,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -73930,7 +74208,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/classes.pot b/doc/translations/classes.pot index b8187d24d5..6ee35f0a74 100644 --- a/doc/translations/classes.pot +++ b/doc/translations/classes.pot @@ -533,8 +533,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -544,7 +545,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -598,7 +600,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -610,7 +613,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1025,10 +1029,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4839,19 +4848,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4872,21 +4883,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4895,9 +4910,10 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -5549,9 +5565,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -5725,8 +5741,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -6437,7 +6453,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -6674,7 +6695,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -7322,7 +7348,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -8728,8 +8762,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8780,10 +8815,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9025,12 +9070,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9576,7 +9615,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9737,12 +9781,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9890,6 +9938,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10030,7 +10093,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11708,7 +11774,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11801,7 +11867,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11829,9 +11897,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12328,13 +12396,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -12360,8 +12429,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12674,12 +12745,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12724,8 +12795,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12773,8 +12846,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12836,7 +12912,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12961,7 +13037,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -13666,17 +13745,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -13983,12 +14062,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14025,12 +14105,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -15190,7 +15271,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -15216,7 +15305,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -15957,7 +16050,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18682,7 +18777,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18831,16 +18928,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -18985,18 +19083,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23900,8 +23986,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24521,7 +24611,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26105,10 +26197,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27515,8 +27610,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -29816,11 +29911,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30665,7 +30763,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30677,6 +30779,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33034,14 +33146,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33049,21 +33161,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34339,8 +34451,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -34385,7 +34501,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -34640,9 +34759,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35101,7 +35220,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36213,7 +36334,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37028,13 +37149,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40698,7 +40831,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46062,7 +46197,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46301,7 +46438,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47030,7 +47169,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49711,8 +49854,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53288,11 +53442,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -53729,7 +53887,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53873,13 +54033,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -54202,6 +54368,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -54214,7 +54392,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55069,7 +55250,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55688,6 +55872,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56022,7 +56214,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57455,7 +57649,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58720,6 +58914,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -58781,6 +58978,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -58803,7 +59003,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -59940,6 +60143,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -59969,6 +60176,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60010,7 +60221,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -61360,37 +61573,38 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61409,14 +61623,15 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61427,14 +61642,14 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" @@ -61447,7 +61662,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" @@ -61455,7 +61670,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61467,13 +61682,13 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." +"[code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61485,17 +61700,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -61508,9 +61725,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -61518,8 +61735,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -61534,7 +61751,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -61552,15 +61769,17 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61572,29 +61791,33 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61622,87 +61845,87 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -64875,21 +65098,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64902,7 +65129,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -64931,7 +65158,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -64941,22 +65200,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -64969,8 +65241,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65168,16 +65442,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -71271,6 +71545,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -73807,7 +74085,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/cs.po b/doc/translations/cs.po index 878b7e9aae..92e3272798 100644 --- a/doc/translations/cs.po +++ b/doc/translations/cs.po @@ -14,12 +14,13 @@ # DomcaSuzi <dominio122@gmail.com>, 2021. # Tomas Dostal <tomas.dostal.cz@gmail.com>, 2021. # JoeMoos <josephmoose13@gmail.com>, 2022. +# Mirinek <mirek.nozicka77@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-03-17 13:59+0000\n" -"Last-Translator: JoeMoos <josephmoose13@gmail.com>\n" +"PO-Revision-Date: 2022-08-28 00:17+0000\n" +"Last-Translator: Mirinek <mirek.nozicka77@gmail.com>\n" "Language-Team: Czech <https://hosted.weblate.org/projects/godot-engine/godot-" "class-reference/cs/>\n" "Language: cs\n" @@ -27,7 +28,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.12-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -92,15 +93,16 @@ msgstr "VýchozÃ" #: doc/tools/make_rst.py msgid "Setter" -msgstr "" +msgstr "Setter" #: doc/tools/make_rst.py msgid "value" msgstr "hodnota" #: doc/tools/make_rst.py +#, fuzzy msgid "Getter" -msgstr "" +msgstr "Getter" #: doc/tools/make_rst.py msgid "" @@ -789,8 +791,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -800,7 +803,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -875,7 +879,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -887,7 +892,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" "Lineárnà interpolace mezi dvÄ›ma hodnotami normalizovanou hodnout. Toto je " "opak [method inverse_lerp].\n" @@ -1478,16 +1484,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" -"Mapuje [code]hodnotu[/code] z rozsahu [code][istart, istop][/code] na [code]" -"[ostart, ostop][/code].\n" -"[codeblock]\n" -"range_lerp(75, 0, 100, -1, 1) # Vracà 0.5\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml #, fuzzy @@ -5345,19 +5351,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -5378,21 +5386,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -5402,9 +5414,10 @@ msgstr "Vrátà tangens parametru." #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -6056,9 +6069,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -6232,8 +6245,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -6946,7 +6959,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -7183,7 +7201,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -7831,7 +7854,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -9238,8 +9269,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -9290,10 +9322,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9539,12 +9581,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -10090,7 +10126,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10251,12 +10292,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10407,6 +10452,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10547,7 +10607,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -12228,7 +12291,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -12321,7 +12384,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -12349,9 +12414,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12854,13 +12919,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -12886,8 +12952,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -13200,12 +13268,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13250,8 +13318,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -13299,8 +13369,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -13362,7 +13435,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13487,7 +13560,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -14193,17 +14269,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -14511,12 +14587,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14553,12 +14630,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -15719,7 +15797,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -15745,7 +15831,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -16489,7 +16579,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -19244,7 +19336,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -19393,16 +19487,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19548,18 +19643,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml #, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "Vrátà arkus sinus parametru." @@ -24481,8 +24564,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -25103,7 +25190,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26691,10 +26780,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -28108,8 +28200,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -30412,11 +30504,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -31265,7 +31360,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -31277,6 +31376,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33640,14 +33749,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33655,22 +33764,26 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "Vrátà sinus parametru." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." -msgstr "" +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." +msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." #: doc/classes/Line2D.xml msgid "" @@ -34948,8 +35061,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -34994,7 +35111,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -35249,9 +35369,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35712,7 +35832,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36853,7 +36975,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37682,13 +37804,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -41362,7 +41496,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46761,7 +46897,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." #: doc/classes/PopupMenu.xml @@ -47000,7 +47138,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47730,7 +47870,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -50411,8 +50555,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53997,11 +54152,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -54438,7 +54597,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -54583,13 +54744,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -54912,6 +55079,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -54924,7 +55103,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55779,7 +55961,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -56399,6 +56584,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56733,7 +56926,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -58167,7 +58362,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -59440,6 +59635,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -59501,6 +59699,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -59523,7 +59724,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60661,6 +60865,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60691,6 +60900,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60732,7 +60946,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -62101,42 +62317,44 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." #: doc/classes/Theme.xml #, fuzzy msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." #: doc/classes/Theme.xml #, fuzzy msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." #: doc/classes/Theme.xml #, fuzzy msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." #: doc/classes/Theme.xml #, fuzzy msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." -msgstr "" +"theme has [code]theme_type[/code]." +msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." #: doc/classes/Theme.xml msgid "" @@ -62155,15 +62373,17 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." -msgstr "" +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." +msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." #: doc/classes/Theme.xml msgid "" @@ -62174,16 +62394,17 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." #: doc/classes/Theme.xml msgid "" @@ -62194,16 +62415,17 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." -msgstr "" +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." +msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." #: doc/classes/Theme.xml msgid "" @@ -62215,14 +62437,15 @@ msgstr "" #, fuzzy msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." +"[code]theme_type[/code]." msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." -msgstr "" +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." +msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." #: doc/classes/Theme.xml msgid "" @@ -62233,17 +62456,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -62256,9 +62481,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -62266,8 +62491,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -62282,7 +62507,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -62302,18 +62527,23 @@ msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula #, fuzzy msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" "Vracà [code]true[/code] pokud si jsou [code]a[/code] a [code]b[/code] " "pÅ™iblÞnÄ› rovny." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" +"Vracà [code]true[/code] pokud si jsou [code]a[/code] a [code]b[/code] " +"pÅ™iblÞnÄ› rovny." #: doc/classes/Theme.xml #, fuzzy @@ -62326,32 +62556,45 @@ msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula #, fuzzy msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" "Vracà [code]true[/code] pokud si jsou [code]a[/code] a [code]b[/code] " "pÅ™iblÞnÄ› rovny." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" +"Vracà [code]true[/code] pokud si jsou [code]a[/code] a [code]b[/code] " +"pÅ™iblÞnÄ› rovny." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" +"Vracà [code]true[/code] pokud si jsou [code]a[/code] a [code]b[/code] " +"pÅ™iblÞnÄ› rovny." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" +"Vracà [code]true[/code] pokud si jsou [code]a[/code] a [code]b[/code] " +"pÅ™iblÞnÄ› rovny." #: doc/classes/Theme.xml #, fuzzy @@ -62379,90 +62622,113 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." -msgstr "" +msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." -msgstr "" +msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." -msgstr "" +msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." -msgstr "" +msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." -msgstr "" +msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"Vracà [code]true[/code] pokud si jsou [code]a[/code] a [code]b[/code] " +"pÅ™iblÞnÄ› rovny." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"Vracà [code]true[/code] pokud si jsou [code]a[/code] a [code]b[/code] " +"pÅ™iblÞnÄ› rovny." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"Vracà [code]true[/code] pokud si jsou [code]a[/code] a [code]b[/code] " +"pÅ™iblÞnÄ› rovny." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"Vracà [code]true[/code] pokud si jsou [code]a[/code] a [code]b[/code] " +"pÅ™iblÞnÄ› rovny." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"Vracà [code]true[/code] pokud si jsou [code]a[/code] a [code]b[/code] " +"pÅ™iblÞnÄ› rovny." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"Vracà [code]true[/code] pokud si jsou [code]a[/code] a [code]b[/code] " +"pÅ™iblÞnÄ› rovny." #: doc/classes/Theme.xml msgid "" @@ -65646,21 +65912,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65673,7 +65943,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65702,7 +65972,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65712,22 +66014,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65740,8 +66055,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65939,16 +66256,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -72080,6 +72397,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -74620,7 +74941,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/de.po b/doc/translations/de.po index 0cf8d9ae17..0da2ce9bc1 100644 --- a/doc/translations/de.po +++ b/doc/translations/de.po @@ -48,12 +48,17 @@ # Christian Packenius <christian@packenius.com>, 2022. # Hannes Petersen <01zustrom.baklava@icloud.com>, 2022. # Hans Peter <figefi6308@runqx.com>, 2022. +# Tim <sakul8826@gmail.com>, 2022. +# Anonynonymouse <tom.spaine60388@gmail.com>, 2022. +# Felix Bitsch <felix.a.bitsch@gmail.com>, 2022. +# Coxcopi <master.vogel2015@gmail.com>, 2022. +# Harusakii <spieleok@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-07-23 03:56+0000\n" -"Last-Translator: Hans Peter <figefi6308@runqx.com>\n" +"PO-Revision-Date: 2022-09-12 01:18+0000\n" +"Last-Translator: Harusakii <spieleok@gmail.com>\n" "Language-Team: German <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/de/>\n" "Language: de\n" @@ -61,7 +66,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -89,7 +94,7 @@ msgstr "Signale" #: doc/tools/make_rst.py msgid "Enumerations" -msgstr "Aufzählungstypen" +msgstr "Aufzählungen" #: doc/tools/make_rst.py msgid "Constants" @@ -105,7 +110,7 @@ msgstr "Methoden-Beschreibung" #: doc/tools/make_rst.py msgid "Theme Property Descriptions" -msgstr "Beschreibung der Theme-Eigenschaften" +msgstr "Theme-Eigenschaften Beschreibungen" #: doc/tools/make_rst.py msgid "Inherits:" @@ -239,8 +244,8 @@ msgid "" "a = abs(-1) # a is 1\n" "[/codeblock]" msgstr "" -"Gibt den absoluten Wert des Parameters [code]s[/code] zurück (d.h. " -"vorzeichenloser Wert).\n" +"Gibt den absoluten Wert des Parameters [code]s[/code] zurück (positiver " +"Wert).\n" "[codeblock]\n" "a = abs(-1) # a ist 1\n" "[/codeblock]" @@ -563,11 +568,11 @@ msgstr "" "- Für [code]Dictionary[/code]s, prüft [code]==[/code] nur, ob es dasselbe " "Objekt ist .\n" "- Für [code]Array[/code]s, [code]==[/code] werden die Arrays elementweise " -"mit [code]==[/code] verglichen. Der Elemente-Vergleich ist also wieder " +"mit [code]==[/code] verglichen. Der Elemente-Vergleich ist also wieder " "einfach, nicht tief.\n" -"Zusammengefasst, immer wenn möglicherweise ein [code]Dictionary[/code] " -"involviert ist und du einen echten Inhaltsvergleich brauchst, verwende " -"[code]deep_equal[/code]." +"Zusammengefasst, immer wenn ein [code]Dictionary[/code] potentiell " +"involviert ist, und du einen wahren Inhaltsvergleich brauchst, musst du " +"[code]deep_equal[/code] verwenden." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -587,7 +592,7 @@ msgid "" "Converts a dictionary (previously created with [method inst2dict]) back to " "an instance. Useful for deserializing." msgstr "" -"Konvertiert ein Wörterbuch (das zuvor mit [method inst2dict] erstellt wurde) " +"Konvertiert ein Dictionary (das zuvor mit [method inst2dict] erstellt wurde) " "zurück in eine Instanz. Nützlich für die Deserialisierung." #: modules/gdscript/doc_classes/@GDScript.xml @@ -859,6 +864,7 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Returns an interpolation or extrapolation factor considering the range " "specified in [code]from[/code] and [code]to[/code], and the interpolated " @@ -866,8 +872,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -877,7 +884,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" "Gibt zurück einen Inter- bzw. Extrapolationsfaktor unter Berücksichtigung " "des Zahlenraums von [code]from[/code] bis [code]to[/code], und dem " @@ -968,12 +976,14 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Linearly interpolates between two values by the factor defined in " "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -985,7 +995,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" "Interpoliert linear zwischen zwei Werten mit dem in [code]weight[/code] " "definierten Faktor. Um eine Interpolation durchzuführen, sollte " @@ -1721,16 +1732,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" -"Bildet den Wert [code]value[/code] von einem Zahlenbereich [code]istart, " -"istop[/code] auf einen anderen [code]ostart, ostop[/code] ab.\n" -"[codeblock]\n" -"range_lerp(75, 0, 100, -1, 1) # Ergibt 0.5\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -2864,7 +2875,7 @@ msgstr "Rechte Richtungs-Taste." msgid "" "Media back key. Not to be confused with the Back button on an Android device." msgstr "" -"Medien-Zurück-Taste. Nicht zu verwechseln mit dem Zurück-Knopf bei einem " +"Media back Taste. Nicht zu verwechseln mit der Zurück-Taste auf einem " "Android-Gerät." #: doc/classes/@GlobalScope.xml @@ -3930,7 +3941,7 @@ msgstr "Gamecontroller linke Triggerachse." #: doc/classes/@GlobalScope.xml msgid "Gamepad left stick click." -msgstr "Klick auf dem linken Stick des Gamepads." +msgstr "Klick auf den linken Analog-Stick auf einem Gamepad." #: doc/classes/@GlobalScope.xml #, fuzzy @@ -3943,7 +3954,7 @@ msgstr "Gamecontroller rechte Trigger-Achse." #: doc/classes/@GlobalScope.xml msgid "Gamepad right stick click." -msgstr "Klick des rechten Stick des Gamepads." +msgstr "Klick auf den rechten Analog Stick eines Gamepads." #: doc/classes/@GlobalScope.xml msgid "Gamepad left stick horizontal axis." @@ -4091,18 +4102,27 @@ msgid "" "MIDI system exclusive message. This has behavior exclusive to the device " "you're receiving input from. Getting this data is not implemented in Godot." msgstr "" +"MIDI-System-exklusive Nachricht. Dieses Verhalten gilt nur für das Gerät, " +"von dem Sie Eingaben empfangen. Das Abrufen dieser Daten ist in Godot nicht " +"implementiert." #: doc/classes/@GlobalScope.xml msgid "" "MIDI quarter frame message. Contains timing information that is used to " "synchronize MIDI devices. Getting this data is not implemented in Godot." msgstr "" +"MIDI-Viertel-Frame-Meldung. Enthält Zeitinformationen, die zur " +"Synchronisierung von MIDI-Geräten verwendet werden. Das Abrufen dieser Daten " +"ist in Godot nicht implementiert." #: doc/classes/@GlobalScope.xml msgid "" "MIDI song position pointer message. Gives the number of 16th notes since the " "start of the song. Getting this data is not implemented in Godot." msgstr "" +"MIDI-Songpositionszeiger-Meldung. Gibt die Anzahl der 16tel-Noten seit " +"Beginn des Liedes an. Das Abrufen dieser Daten ist in Godot nicht " +"implementiert." #: doc/classes/@GlobalScope.xml msgid "" @@ -4118,6 +4138,8 @@ msgid "" "MIDI tune request message. Upon receiving a tune request, all analog " "synthesizers should tune their oscillators." msgstr "" +"MIDI Tune Request Nachricht. Beim Empfang einer Tune-Anforderung sollten " +"alle analogen Synthesizer ihre Oszillatoren stimmen." #: doc/classes/@GlobalScope.xml msgid "" @@ -4150,6 +4172,8 @@ msgid "" "MIDI active sensing message. This message is intended to be sent repeatedly " "to tell the receiver that a connection is alive." msgstr "" +"MIDI active sensing message. Diese Meldung soll wiederholt gesendet werden, " +"um dem Empfänger mitzuteilen, dass eine Verbindung besteht." #: doc/classes/@GlobalScope.xml msgid "" @@ -4436,6 +4460,15 @@ msgid "" "specified by appending [code]:integer[/code] to the name, e.g. [code]\"Zero," "One,Three:3,Four,Six:6\"[/code]." msgstr "" +"Weist darauf hin, dass eine Integer-, Float- oder String-Eigenschaft ein " +"Aufzählungswert ist, der in einer über eine Hinweiszeichenfolge angegebenen " +"Liste auszuwählen ist.\n" +"Die Hinweiszeichenkette ist eine durch Kommata getrennte Liste von Namen wie " +"z. B. [code]\"Hallo,Etwas,Sonst\"[/code]. Bei Integer- und Float-" +"Eigenschaften hat der erste Name in der Liste den Wert 0, der nächste den " +"Wert 1 und so weiter. Explizite Werte können auch durch Anhängen von [code]:" +"integer[/code] an den Namen angegeben werden, z. B. [code]\"Null,Eins,Drei:3," +"Vier,Sechs:6\"[/code]." #: doc/classes/@GlobalScope.xml msgid "" @@ -4445,6 +4478,12 @@ msgid "" "arbitrary values and can be empty. The list of values serves to suggest " "possible values." msgstr "" +"weist darauf hin, dass eine Zeichenketteneigenschaft ein Aufzählungswert " +"sein kann, der aus einer Liste ausgewählt werden kann, die über eine " +"Hinweiszeichenfolge wie [code]\"Hallo,Etwas,Sonst\"[/code]\n" +"m Gegensatz zu [constant PROPERTY_HINT_ENUM] akzeptiert eine Eigenschaft mit " +"diesem Hinweis weiterhin beliebige Werte und kann leer sein. Die Liste der " +"Werte dient dazu, mögliche Werte vorzuschlagen." #: doc/classes/@GlobalScope.xml msgid "" @@ -4998,6 +5037,16 @@ msgid "" "var box2 = box.expand(Vector3(0, -1, 2))\n" "[/codeblock]" msgstr "" +"Gibt eine Kopie dieses [AABB] zurück, erweitert um einen bestimmten Punkt " +"einzuschließen.\n" +"[b]Beispiel:[/b]\n" +"[codeblock]\n" +"# Position (-3, 2, 0), Größe (1, 1, 1)\n" +"var box = AABB(Vector3(-3, 2, 0), Vector3(1, 1, 1))\n" +"# Position (-3, -1, 0), Größe (3, 4, 2), so dass wir sowohl das " +"ursprüngliche AABB als auch Vector3(0, -1, 2) unterbringen\n" +"var box2 = box.expand(Vector3(0, -1, 2))\n" +"[/codeblock]" #: doc/classes/AABB.xml msgid "Returns the volume of the [AABB]." @@ -5193,6 +5242,11 @@ msgid "" "may cause a crash. If you wish to hide it or any of its children, use their " "[member CanvasItem.visible] property." msgstr "" +"Gibt die für den eingebauten Text verwendete Bezeichnung zurück.\n" +"[b]Warnung:[/b] Dies ist ein erforderlicher interner Knoten; das Entfernen " +"und Freigeben dieses Knotens kann zu einem Absturz führen. Wenn Sie ihn oder " +"eines seiner Kinder ausblenden möchten, verwenden Sie deren Eigenschaft " +"[member CanvasItem.visible]." #: doc/classes/AcceptDialog.xml msgid "" @@ -5201,6 +5255,11 @@ msgid "" "may cause a crash. If you wish to hide it or any of its children, use their " "[member CanvasItem.visible] property." msgstr "" +"Gibt die OK [Button]-Instanz zurück.\n" +"[b]Warnung:[/b] Dies ist ein erforderlicher interner Knoten; das Entfernen " +"und Freigeben dieses Knotens kann zu einem Absturz führen. Wenn Sie ihn oder " +"eines seiner Kinder ausblenden möchten, verwenden Sie deren Eigenschaft " +"[member CanvasItem.visible]." #: doc/classes/AcceptDialog.xml msgid "" @@ -5218,6 +5277,12 @@ msgid "" "the [code]button[/code] will no longer emit this dialog's [signal " "custom_action] signal or cancel this dialog." msgstr "" +"Entfernt den [code]button[/code] aus dem Dialog. Gibt den [code]button[/" +"code] NICHT frei. Der [code]button[/code] muss ein [Button] sein, der mit " +"der [method add_button] oder [method add_cancel] Methode hinzugefügt wurde. " +"Nach dem Entfernen wird das Drücken des [code]button[/code] nicht mehr das " +"[signal custom_action]-Signal dieses Dialogs auslösen oder diesen Dialog " +"abbrechen." #: doc/classes/AcceptDialog.xml msgid "Sets autowrapping for the text in the dialog." @@ -5433,6 +5498,18 @@ msgid "" "code] will make it so the [code]run[/code] animation uses normal and " "specular maps." msgstr "" +"[AnimatedSprite] ähnelt dem [Sprite]-Knoten, außer dass er mehrere Texturen " +"als Animationsrahmen enthält. Animationen werden mit einer [SpriteFrames]-" +"Ressource erstellt, die es Ihnen ermöglicht, Bilddateien (oder einen Ordner " +"mit diesen Dateien) zu importieren, um die Animationsrahmen für das Sprite " +"bereitzustellen. Die [SpriteFrames]-Ressource kann im Editor über die untere " +"Leiste SpriteFrames konfiguriert werden.\n" +"[b]Hinweis:[/b] Du kannst eine Reihe von Normal- oder Specular-Maps " +"zuordnen, indem du zusätzliche [SpriteFrames]-Ressourcen mit einem " +"[code]_normal[/code] oder [code]_specular[/code] Suffix erstellst. Wenn du " +"zum Beispiel 3 [SpriteFrames]-Ressourcen [code]run[/code], [code]run_normal[/" +"code] und [code]run_specular[/code] hast, wird die [code]run[/code]-" +"Animation normale und spekulare Maps verwenden." #: doc/classes/AnimatedSprite.xml doc/classes/AnimationPlayer.xml msgid "2D Sprite animation" @@ -5498,6 +5575,9 @@ msgid "" "option to load, edit, clear, make unique and save the states of the " "[SpriteFrames] resource." msgstr "" +"Die [SpriteFrames]-Ressource, die die Animation(en) enthält. Ermöglicht es " +"Ihnen, die Zustände der [SpriteFrames]-Ressource zu laden, zu bearbeiten, zu " +"löschen, eindeutig zu machen und zu speichern." #: doc/classes/AnimatedSprite.xml doc/classes/Sprite.xml #: doc/classes/SpriteBase3D.xml @@ -6398,26 +6478,22 @@ msgstr "" "Knoten nicht zur Addition anzeigen." #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" -"Ruft die Textbeschriftung für diesen Knoten ab (wird von einigen Editoren " -"verwendet)." #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" -"Ruft einen untergeordneten Knoten nach Index ab (wird von Editoren " -"verwendet, die von [AnimationRootNode] erben)." #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" -"Ruft alle Kindknoten in der Reihenfolge als [code]Name: Knoten[/code]-" -"Wörterbuch ab. Nur nützlich beim Erben von [AnimationRootNode]." #: doc/classes/AnimationNode.xml msgid "" @@ -6441,17 +6517,22 @@ msgstr "" "Bäumen wiederverwendet werden kann." #: doc/classes/AnimationNode.xml +#, fuzzy msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" "Ruft den Standardwert eines Parameters ab. Parameter sind benutzerdefinierte " "lokale Speicher, die für Ihre Knoten verwendet werden, da eine Ressource in " "mehreren Bäumen wiederverwendet werden kann." #: doc/classes/AnimationNode.xml +#, fuzzy msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" @@ -6461,9 +6542,11 @@ msgstr "" "ist ähnlich wie bei [method Object.get_property_list]." #: doc/classes/AnimationNode.xml +#, fuzzy msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" "Gibt [code]true[/code] zurück, ob der Mischbaum-Editor die Filterbearbeitung " "an diesem Node anzeigen soll." @@ -6474,10 +6557,12 @@ msgid "Returns whether the given path is filtered." msgstr "Gibt [code]true[/code] zurück, ob ein gegebener Pfad gefiltert ist." #: doc/classes/AnimationNode.xml +#, fuzzy msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -6633,7 +6718,7 @@ msgstr "AnimationTree" #: doc/classes/Quat.xml doc/classes/Skeleton.xml doc/classes/SpotLight.xml #: doc/classes/StaticBody.xml doc/classes/WorldEnvironment.xml msgid "Third Person Shooter Demo" -msgstr "" +msgstr "Third Person Shooter Demo" #: doc/classes/AnimationNodeAnimation.xml msgid "Input animation to use in an [AnimationNodeBlendTree]." @@ -6659,7 +6744,7 @@ msgstr "" #: doc/classes/MeshInstance.xml doc/classes/MeshLibrary.xml #: doc/classes/ProjectSettings.xml doc/classes/Transform.xml msgid "3D Platformer Demo" -msgstr "" +msgstr "3D Platformer Demo" #: doc/classes/AnimationNodeAnimation.xml msgid "" @@ -7332,9 +7417,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -7454,6 +7539,24 @@ msgid "" "animation_tree[\"parameters/Seek/seek_position\"] = 12.0\n" "[/codeblock]" msgstr "" +"Dieser Knoten kann verwendet werden, um einen Suchbefehl für alle " +"Unterkinder des Animationsgraphen auszuführen. Verwenden Sie diesen " +"Knotentyp, um eine [Animation] ab dem Start oder einer bestimmten " +"Abspielposition innerhalb des [AnimationNodeBlendTree] abzuspielen. Nach dem " +"Einstellen der Zeit und dem Ändern der Animationswiedergabe geht der " +"Suchknoten beim nächsten Prozessbild automatisch in den Schlafmodus, indem " +"er seinen Wert [code]seek_position[/code] auf [code]-1.0[/code] setzt.\n" +"[codeblock]\n" +"# Kind-Animation von Anfang an abspielen.\n" +"animation_tree.set(\"parameters/Seek/seek_position\", 0.0)\n" +"# Alternativer Syntax (gleiches Ergebnis wie oben).\n" +"animation_tree[\"parameters/Seek/seek_position\"] = 0.0\n" +"\n" +"# Kind-Animation ab dem 12 Sekunden Zeitstempel abspielen.\n" +"animation_tree.set(\"parameters/Seek/seek_position\", 12.0)\n" +"# Alternativer Syntax (gleiches Ergebnis wie oben).\n" +"animation_tree[\"parameters/Seek/seek_position\"] = 12.0\n" +"[/codeblock]" #: doc/classes/AnimationNodeTransition.xml msgid "A generic animation transition node for [AnimationTree]." @@ -7570,9 +7673,10 @@ msgstr "" "Zeichenkette, wenn nicht gefunden." #: doc/classes/AnimationPlayer.xml +#, fuzzy msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" "Liefert die [Animation] mit dem Schlüssel [code]name[/code] oder [code]null[/" "code], wenn nicht gefunden." @@ -7761,6 +7865,15 @@ msgid "" "get the currently playing animation, and internally for animation playback " "tracks. For more information, see [Animation]." msgstr "" +"Der Name der aktuell abgespielten Animation. Wenn keine Animation abgespielt " +"wird, ist der Wert der Eigenschaft eine leere Zeichenkette. Eine Änderung " +"dieses Wertes führt nicht zum Neustart der Animation. Weitere Informationen " +"über das Abspielen von Animationen finden Sie unter [method play].\n" +"[b]Hinweis:[/b] Diese Eigenschaft wird zwar im Inspektor angezeigt, ist aber " +"nicht zum Bearbeiten gedacht und wird nicht in der Szene gespeichert. Diese " +"Eigenschaft wird hauptsächlich verwendet, um die aktuell abgespielte " +"Animation zu erhalten, und intern für Animationswiedergabespuren. Für " +"weitere Informationen, siehe [Animation]." #: doc/classes/AnimationPlayer.xml msgid "The length (in seconds) of the currently being played animation." @@ -7814,6 +7927,13 @@ msgid "" "defined by the reset animation, if any, with the editor keeping the values " "that the nodes had before saving." msgstr "" +"Dies wird vom Editor verwendet. Wenn es auf [code]true[/code] gesetzt wird, " +"wird die Szene mit den Effekten der Reset-Animation gespeichert (als ob sie " +"auf Zeit 0 gesucht worden wäre), und nach dem Speichern wieder " +"zurückgesetzt.\n" +"Mit anderen Worten, die gespeicherte Szenendatei enthält die \"Standard-" +"Pose\", wie sie durch die Rücksetz-Animation definiert ist, und der Editor " +"behält die Werte bei, die die Knoten vor dem Speichern hatten." #: doc/classes/AnimationPlayer.xml msgid "The node from which node path references will travel." @@ -8073,6 +8193,8 @@ msgid "" "Binds a new [Animation] from the [member master_player] to the " "[AnimationTreePlayer]'s animation node with name [code]id[/code]." msgstr "" +"Bindet eine neue [Animation] aus dem [member master_player] an den " +"Animationsknoten des [AnimationTreePlayer] mit dem Namen [code]id[/code]." #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -8080,12 +8202,18 @@ msgid "" "[code]id[/code] turns off the track modifying the property at [code]path[/" "code]. The modified node's children continue to animate." msgstr "" +"Wenn [code]enable[/code] [code]true[/code] ist, schaltet der " +"Animationsknoten mit der ID [code]id[/code] die Spur aus, die die " +"Eigenschaft bei [code]path[/code] ändert. Die Kinder des geänderten Knotens " +"werden weiterhin animiert." #: doc/classes/AnimationTreePlayer.xml msgid "" "Binds the [Animation] named [code]source[/code] from [member master_player] " "to the animation node [code]id[/code]. Recalculates caches." msgstr "" +"Bindet die [Animation] namens [code]source[/code] vom [member master_player] " +"an den Animationsknoten [code]id[/code]. Berechnet die Caches neu." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8109,6 +8237,12 @@ msgid "" "At 0, output is input A. Towards 1, the influence of A gets lessened, the " "influence of B gets raised. At 1, output is input B." msgstr "" +"Legt den Überblendungswert eines Blend2-Knotens mit seinem Namen und Wert " +"fest.\n" +"Ein Blend2-Knoten überblendet zwei Animationen (A und B) mit einem Wert " +"zwischen 0 und 1.\n" +"Bei 0 ist die Ausgabe die Eingabe A. In Richtung 1 wird der Einfluss von A " +"verringert, der Einfluss von B erhöht. Bei 1 ist die Ausgabe die Eingabe B." #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -8116,6 +8250,10 @@ msgid "" "[code]id[/code] turns off the track modifying the property at [code]path[/" "code]. The modified node's children continue to animate." msgstr "" +"Wenn [code]enable[/code] [code]true[/code] ist, schaltet der Blend2-Knoten " +"mit dem Namen [code]id[/code] die Spur aus, die die Eigenschaft bei " +"[code]path[/code] ändert. Die Kinder des geänderten Knotens werden weiterhin " +"animiert." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8132,6 +8270,15 @@ msgid "" "input A. From 0 to 1, the influence of A gets lessened, the influence of B+ " "gets raised and the influence of B+ is 0. At 1, output is input B+." msgstr "" +"Legt den Überblendungsgrad eines Blend3-Knotens mit seinem Namen und Wert " +"fest.\n" +"Ein Blend3-Knoten überblendet drei Animationen (A, B-, B+) mit einem Wert " +"zwischen -1 und 1.\n" +"Bei -1 ist die Ausgabe die Eingabe B-. Von -1 bis 0 wird der Einfluss von B- " +"verringert, der Einfluss von A wird erhöht und der Einfluss von B+ ist 0. " +"Bei 0 ist die Ausgabe die Eingabe A. Von 0 bis 1 wird der Einfluss von A " +"verringert, der Einfluss von B+ wird erhöht und der Einfluss von B+ ist 0. " +"Bei 1 ist die Ausgabe die Eingabe B+." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8144,6 +8291,10 @@ msgid "" "A Blend4 Node blends two pairs of animations.\n" "The two pairs are blended like Blend2 and then added together." msgstr "" +"Legt den Überblendungsgrad eines Blend4-Knotens mit seinem Namen und Wert " +"fest.\n" +"Ein Blend4-Knoten blendet zwei Paare von Animationen.\n" +"Die beiden Paare werden wie Blend2 überblendet und dann addiert." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8160,7 +8311,7 @@ msgstr "Trennt das Node, der mit dem angegebenen Eingang verbunden ist." #: doc/classes/AnimationTreePlayer.xml msgid "Returns a [PoolStringArray] containing the name of all nodes." -msgstr "" +msgstr "Gibt ein [PoolStringArray] zurück, das die Namen aller Knoten enthält." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8172,16 +8323,22 @@ msgid "" "Sets the mix amount of a Mix node given its name and value.\n" "A Mix node adds input b to input a by the amount given by ratio." msgstr "" +"Legt die Mischmenge eines Mix-Knotens fest, dessen Name und Wert angegeben " +"ist.\n" +"Ein Mix-Knoten fügt Eingang B zu Eingang A um den durch ratio angegebenen " +"Betrag hinzu." #: doc/classes/AnimationTreePlayer.xml msgid "Check if a node exists (by name)." -msgstr "" +msgstr "Prüfen, ob ein Knoten existiert (nach Name)." #: doc/classes/AnimationTreePlayer.xml msgid "" "Returns the input count for a given node. Different types of nodes have " "different amount of inputs." msgstr "" +"Gibt die Anzahl der Eingaben für einen bestimmten Knoten zurück. " +"Verschiedene Knotentypen haben eine unterschiedliche Anzahl von Eingängen." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8196,6 +8353,7 @@ msgstr "Gibt das AnimationNode mit dem gegebenen Namen zurück." #: doc/classes/AnimationTreePlayer.xml msgid "Gets the node type, will return from [enum NodeType] enum." msgstr "" +"Ruft den Knotentyp ab, wird von der Aufzählung [enum NodeType] zurückgegeben." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8243,28 +8401,38 @@ msgstr "Gibt das AnimationNode mit dem gegebenen Namen zurück." msgid "" "Sets the autorestart property of a OneShot node given its name and value." msgstr "" +"Legt die Autorestart-Eigenschaft eines OneShot-Knotens mit dessen Namen und " +"Wert fest." #: doc/classes/AnimationTreePlayer.xml msgid "" "Sets the autorestart delay of a OneShot node given its name and value in " "seconds." msgstr "" +"Legt die Autostart-Verzögerung eines OneShot-Knotens fest, wobei der Name " +"und der Wert in Sekunden angegeben werden." #: doc/classes/AnimationTreePlayer.xml msgid "" "Sets the autorestart random delay of a OneShot node given its name and value " "in seconds." msgstr "" +"Legt die Zufallsverzögerung für den Autorestart eines OneShot-Knotens fest, " +"wobei der Name und der Wert in Sekunden angegeben werden." #: doc/classes/AnimationTreePlayer.xml msgid "" "Sets the fade in time of a OneShot node given its name and value in seconds." msgstr "" +"Legt die Einblendzeit eines OneShot-Knotens mit seinem Namen und einem Wert " +"in Sekunden fest." #: doc/classes/AnimationTreePlayer.xml msgid "" "Sets the fade out time of a OneShot node given its name and value in seconds." msgstr "" +"Legt die Ausblendzeit eines OneShot-Knotens fest, wobei der Name und der " +"Wert in Sekunden angegeben werden." #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -8272,6 +8440,9 @@ msgid "" "[code]id[/code] turns off the track modifying the property at [code]path[/" "code]. The modified node's children continue to animate." msgstr "" +"Wenn [code]enable[/code] [code]true[/code] ist, schaltet der OneShot-Knoten " +"mit der ID [code]id[/code] die Spur aus, die die Eigenschaft bei [code]path[/" +"code] ändert. Die Kinder des geänderten Knotens werden weiterhin animiert" #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8289,6 +8460,9 @@ msgid "" "animation nodes. Needed when external sources modify the animation nodes' " "state." msgstr "" +"Berechnet den Cache der von Animationsknoten erzeugten Spurinformationen " +"manuell neu. Wird benötigt, wenn externe Quellen den Zustand der " +"Animationsknoten ändern." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8297,7 +8471,7 @@ msgstr "Entfernt die Animation mit dem key [code]name[/code]." #: doc/classes/AnimationTreePlayer.xml msgid "Resets this [AnimationTreePlayer]." -msgstr "" +msgstr "Setzt diesen [AnimationTreePlayer] zurück." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8314,6 +8488,12 @@ msgid "" "If applied after a blend or mix, affects all input animations to that blend " "or mix." msgstr "" +"Setzt die Zeitskala des TimeScale-Knotens mit dem Namen [code]id[/code] auf " +"[code]scale[/code].\n" +"Der TimeScale-Knoten wird verwendet, um [Animationen] zu beschleunigen, wenn " +"die Skala über 1 liegt, oder sie zu verlangsamen, wenn sie unter 1 liegt.\n" +"Wenn er nach einer Überblendung oder Mischung angewendet wird, wirkt er sich " +"auf alle Eingangsanimationen für diese Überblendung oder Mischung aus." #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -8322,6 +8502,10 @@ msgid "" "This functions as a seek in the [Animation] or the blend or mix of " "[Animation]s input in it." msgstr "" +"Setzt den Zeitsuchwert des TimeSeek-Knotens mit dem Namen [code]id[/code] " +"auf [code]seconds[/code].\n" +"Dies funktioniert wie ein Suchlauf in der [Animation] oder der Mischung oder " +"dem Mix von [Animation]en, die darin eingegeben werden." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8346,6 +8530,9 @@ msgid "" "Returns the number of inputs for the transition node with name [code]id[/" "code]. You can add inputs by right-clicking on the transition node." msgstr "" +"Gibt die Anzahl der Eingänge für den Übergangsknoten mit dem Namen [code]id[/" +"code] zurück. Sie können Eingaben hinzufügen, indem Sie mit der rechten " +"Maustaste auf den Übergangsknoten klicken." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8360,6 +8547,9 @@ msgid "" "transition node with name [code]id[/code] is set to automatically advance to " "the next input upon completion." msgstr "" +"Gibt [code]true[/code] zurück, wenn die Eingabe an [code]input_idx[/code] " +"auf dem Übergangsknoten mit dem Namen [code]id[/code] so eingestellt ist, " +"dass sie nach Abschluss automatisch zur nächsten Eingabe übergeht." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8375,12 +8565,17 @@ msgid "" "The transition node with name [code]id[/code] advances to its next input " "automatically when the input at [code]input_idx[/code] completes." msgstr "" +"Der Übergangsknoten mit dem Namen [code]id[/code] geht automatisch zu seiner " +"nächsten Eingabe über, wenn die Eingabe an [code]input_idx[/code] " +"abgeschlossen ist." #: doc/classes/AnimationTreePlayer.xml msgid "" "Resizes the number of inputs available for the transition node with name " "[code]id[/code]." msgstr "" +"Verändert die Anzahl der verfügbaren Eingänge für den Übergangsknoten mit " +"dem Namen [code]id[/code]." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8403,6 +8598,9 @@ msgid "" "It accesses the bones, so it should point to the same node the " "[AnimationPlayer] would point its Root Node at." msgstr "" +"Der Knoten, von dem aus relativ auf andere Knoten zugegriffen werden kann.\n" +"Er greift auf die Bones zu, sollte also auf denselben Knoten zeigen, auf den " +"der [AnimationPlayer] seinen Root Knoten zeigen würde." #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -8410,6 +8608,10 @@ msgid "" "binds animations to animation nodes.\n" "Once set, [Animation] nodes can be added to the [AnimationTreePlayer]." msgstr "" +"Der Pfad zum [AnimationPlayer], von dem dieser [AnimationTreePlayer] " +"Animationen an Animationsknoten bindet.\n" +"Einmal festgelegt, können [Animation]-Knoten zum [AnimationTreePlayer] " +"hinzugefügt werden." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8418,7 +8620,7 @@ msgstr "Die Prozessmeldung, in der die Animationen aktualisiert werden sollen." #: doc/classes/AnimationTreePlayer.xml msgid "Output node." -msgstr "" +msgstr "Ausgangsknoten." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8432,27 +8634,27 @@ msgstr "Einmaliger Timer." #: doc/classes/AnimationTreePlayer.xml msgid "Mix node." -msgstr "" +msgstr "Mischknoten." #: doc/classes/AnimationTreePlayer.xml msgid "Blend2 node." -msgstr "" +msgstr "Blend2 Knoten." #: doc/classes/AnimationTreePlayer.xml msgid "Blend3 node." -msgstr "" +msgstr "Blend3 Knoten." #: doc/classes/AnimationTreePlayer.xml msgid "Blend4 node." -msgstr "" +msgstr "Blend4 Knoten." #: doc/classes/AnimationTreePlayer.xml msgid "TimeScale node." -msgstr "" +msgstr "TimeScale Knoten." #: doc/classes/AnimationTreePlayer.xml msgid "TimeSeek node." -msgstr "" +msgstr "TimeSeek Knoten." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8465,20 +8667,21 @@ msgid "3D area for detection and physics and audio influence." msgstr "2D-Bereich zur Erkennung und 2D-Physik-Einfluss." #: doc/classes/Area.xml -#, fuzzy msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" -"2D-Bereich, der [CollisionObject2D]-Knoten erkennt, die sich überlappen, " -"eintreten oder austreten. Kann auch lokale Physikparameter (Schwerkraft, " -"Dämpfung) ändern oder außer Kraft setzen." #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml #: doc/classes/ViewportTexture.xml msgid "GUI in 3D Demo" -msgstr "" +msgstr "Benutzeroberfläche in 3D-Demo" #: doc/classes/Area.xml msgid "" @@ -8645,10 +8848,15 @@ msgid "" "The degree to which this area applies reverb to its associated audio. Ranges " "from [code]0[/code] to [code]1[/code] with [code]0.1[/code] precision." msgstr "" +"Der Grad, in dem dieser Bereich Hall auf das zugehörige Audiomaterial " +"anwendet. Der Bereich reicht von [code]0[/code] bis [code]1[/code] mit einer " +"Genauigkeit von [code]0.1[/code]." #: doc/classes/Area.xml msgid "If [code]true[/code], the area applies reverb to its associated audio." msgstr "" +"Wenn [code]true[/code], wendet der Bereich Hall auf das zugehörige " +"Audiomaterial an." #: doc/classes/Area.xml msgid "The reverb bus name to use for this area's associated audio." @@ -8677,6 +8885,9 @@ msgid "" "be set to [code]true[/code].\n" "[code]area[/code] the other Area." msgstr "" +"Wird ausgesendet, wenn ein anderer Bereich diesen Bereich betritt. " +"Erfordert, dass [member monitoring] auf [code]true[/code] gesetzt ist.\n" +"[code]area[/code] der andere Bereich." #: doc/classes/Area.xml msgid "" @@ -8684,6 +8895,9 @@ msgid "" "be set to [code]true[/code].\n" "[code]area[/code] the other Area." msgstr "" +"Wird ausgesendet, wenn ein anderer Bereich diesen Bereich verlässt. " +"Erfordert, dass [member monitoring] auf [code]true[/code] gesetzt ist.\n" +"[code]area[/code] der andere Bereich." #: doc/classes/Area.xml msgid "" @@ -8699,6 +8913,18 @@ msgid "" "the [PhysicsServer]. Get the [CollisionShape] node with [code]self." "shape_owner_get_owner(local_shape_index)[/code]." msgstr "" +"Wird ausgesendet, wenn [Shape]s eines anderen Bereichs in [Shape]s dieses " +"Bereichs eintreten. Erfordert, dass [member monitoring] auf [code]true[/" +"code] gesetzt ist.\n" +"[code]area_rid[/code] die [RID] des vom [PhysicsServer] verwendeten " +"[CollisionObject] des anderen Bereichs.\n" +"[code]area[/code] die andere Area.\n" +"[code]area_shape_index[/code] der Index des [Shape] des anderen Bereichs, " +"der vom [PhysicsServer] verwendet wird. Holen Sie den [CollisionShape] " +"Knoten mit [code]area.shape_owner_get_owner(area_shape_index)[/code].\n" +"[code]local_shape_index[/code] der Index des [Shape] dieses Bereichs, der " +"vom [PhysicsServer] verwendet wird. Holen Sie den [CollisionShape] Knoten " +"mit [code]self.shape_owner_get_owner(local_shape_index)[/code]." #: doc/classes/Area.xml msgid "" @@ -8708,6 +8934,12 @@ msgid "" "[code]body[/code] the [Node], if it exists in the tree, of the other " "[PhysicsBody] or [GridMap]." msgstr "" +"Wird ausgesendet, wenn ein [PhysicsBody] oder eine [GridMap] diesen Bereich " +"betritt. Erfordert, dass [member monitoring] auf [code]true[/code] gesetzt " +"ist. [GridMap]s werden erkannt, wenn die [MeshLibrary] Kollisions-[Shape]s " +"hat.\n" +"[code]body[/code] die [Node] des anderen [PhysicsBody] oder der [GridMap], " +"wenn er im Baum existiert." #: doc/classes/Area.xml msgid "" @@ -8717,6 +8949,12 @@ msgid "" "[code]body[/code] the [Node], if it exists in the tree, of the other " "[PhysicsBody] or [GridMap]." msgstr "" +"Wird ausgesendet, wenn ein [PhysicsBody] oder eine [GridMap] diesen Bereich " +"verlässt. Erfordert, dass [member monitoring] auf [code]true[/code] gesetzt " +"ist. [GridMap]s werden erkannt, wenn die [MeshLibrary] Kollisions-[Shape]s " +"hat.\n" +"[code]body[/code] der [Node], falls im Baum vorhanden, des anderen " +"[PhysicsBody] oder der [GridMap]." #: doc/classes/Area.xml msgid "" @@ -8734,6 +8972,21 @@ msgid "" "the [PhysicsServer]. Get the [CollisionShape] node with [code]self." "shape_owner_get_owner(local_shape_index)[/code]." msgstr "" +"Wird ausgesendet, wenn eine [Shape] eines [PhysicsBody] oder einer [GridMap] " +"in eine [Shape] dieses Bereichs eintritt. Erfordert, dass [member " +"monitoring] auf [code]true[/code] gesetzt ist. [GridMap]s werden erkannt, " +"wenn die [MeshLibrary] Kollisions-[Shape]s hat.\n" +"[code]body_rid[/code] die [RID] des [PhysicsBody]s oder [MeshLibrary]s " +"[CollisionObject], das vom [PhysicsServer] verwendet wird.\n" +"[code]body[/code] der [Node] des [PhysicsBody] oder der [GridMap], wenn er " +"im Baum existiert.\n" +"[code]body_shape_index[/code] der Index des [Shape]s des [PhysicsBody] oder " +"der [GridMap], der vom [PhysicsServer] verwendet wird. Holen Sie den " +"[CollisionShape] Knoten mit [code]body." +"shape_owner_get_owner(body_shape_index)[/code].\n" +"[code]local_shape_index[/code] der Index des [Shape]s dieses Bereichs, der " +"vom [PhysicsServer] verwendet wird. Holen Sie den [CollisionShape] Knoten " +"mit [code]self.shape_owner_get_owner(local_shape_index)[/code]." #: doc/classes/Area.xml doc/classes/Area2D.xml msgid "This area does not affect gravity/damping." @@ -8744,24 +8997,34 @@ msgid "" "This area adds its gravity/damping values to whatever has been calculated so " "far (in [member priority] order)." msgstr "" +"Dieser Bereich addiert seine Schwerkraft-/Dämpfungswerte zu den bisher " +"berechneten Werten (in der Reihenfolge der [member priority])." #: doc/classes/Area.xml doc/classes/Area2D.xml msgid "" "This area adds its gravity/damping values to whatever has been calculated so " "far (in [member priority] order), ignoring any lower priority areas." msgstr "" +"Dieser Bereich addiert seine Schwere-/Dämpfungswerte zu den bisher " +"berechneten Werten (in der Reihenfolge der [member priority]) und ignoriert " +"alle Bereiche mit niedrigerer Priorität." #: doc/classes/Area.xml doc/classes/Area2D.xml msgid "" "This area replaces any gravity/damping, even the defaults, ignoring any " "lower priority areas." msgstr "" +"Dieser Bereich ersetzt jede Schwerkraft/Dämpfung, auch die Standardwerte, " +"und ignoriert alle Bereiche mit niedrigerer Priorität." #: doc/classes/Area.xml doc/classes/Area2D.xml msgid "" "This area replaces any gravity/damping calculated so far (in [member " "priority] order), but keeps calculating the rest of the areas." msgstr "" +"Dieser Bereich ersetzt alle bisher berechneten Schwerkraft-/Dämpfungswerte " +"(in der Reihenfolge der [member priority]), berechnet aber weiterhin die " +"übrigen Bereiche." #: doc/classes/Area2D.xml #, fuzzy @@ -8769,15 +9032,16 @@ msgid "2D area for detection and physics and audio influence." msgstr "2D-Bereich zur Erkennung und 2D-Physik-Einfluss." #: doc/classes/Area2D.xml -#, fuzzy msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" -"2D-Bereich, der [CollisionObject2D]-Knoten erkennt, die sich überlappen, " -"eintreten oder austreten. Kann auch lokale Physikparameter (Schwerkraft, " -"Dämpfung) ändern oder außer Kraft setzen." #: doc/classes/Area2D.xml msgid "Using Area2D" @@ -8786,13 +9050,13 @@ msgstr "Verwendung von Area2D" #: doc/classes/Area2D.xml doc/classes/CollisionShape2D.xml #: doc/classes/RectangleShape2D.xml msgid "2D Pong Demo" -msgstr "" +msgstr "2D Pong Demo" #: doc/classes/Area2D.xml doc/classes/Camera2D.xml #: doc/classes/KinematicBody2D.xml doc/classes/TileMap.xml #: doc/classes/TileSet.xml msgid "2D Platformer Demo" -msgstr "" +msgstr "2D Platformer Demo" #: doc/classes/Area2D.xml msgid "" @@ -8905,6 +9169,9 @@ msgid "" "to be set to [code]true[/code].\n" "[code]area[/code] the other Area2D." msgstr "" +"Wird ausgesendet, wenn ein anderes Area2D dieses Area2D betritt. Erfordert, " +"dass [member monitoring] auf [code]true[/code] gesetzt ist.\n" +"[code]area[/code] die andere Area2D." #: doc/classes/Area2D.xml msgid "" @@ -8912,6 +9179,9 @@ msgid "" "to be set to [code]true[/code].\n" "[code]area[/code] the other Area2D." msgstr "" +"Wird ausgesendet, wenn ein anderes Area2D dieses Area2D verlässt. Erfordert, " +"dass [member monitoring] auf [code]true[/code] gesetzt ist.\n" +"[code]area[/code] die andere Area2D." #: doc/classes/Area2D.xml msgid "" @@ -8927,6 +9197,18 @@ msgid "" "used by the [Physics2DServer]. Get the [CollisionShape2D] node with " "[code]self.shape_owner_get_owner(local_shape_index)[/code]." msgstr "" +"Wird ausgesendet, wenn [Shape2D]s eines anderen Area2Ds in [Shape2D]s dieses " +"Area2Ds verlassen. Erfordert, dass [member monitoring] auf [code]true[/code] " +"gesetzt ist.\n" +"[code]area_rid[/code] die [RID] des anderen Area2D's [CollisionObject2D], " +"das vom [Physics2DServer] verwendet wird.\n" +"[code]area[/code] die andere Area2D.\n" +"[code]area_shape_index[/code] der Index des [Shape2D]s des anderen Area2Ds, " +"das vom [Physics2DServer] verwendet wird. Holen Sie den [CollisionShape2D] " +"Knoten mit [code]area.shape_owner_get_owner(area_shape_index)[/code].\n" +"[code]local_shape_index[/code] der Index des [Shape2D]s dieses Area2Ds, der " +"vom [Physics2DServer] verwendet wird. Holen Sie den [CollisionShape2D] " +"Knoten mit [code]self.shape_owner_get_owner(local_shape_index)[/code]." #: doc/classes/Area2D.xml msgid "" @@ -8942,6 +9224,18 @@ msgid "" "used by the [Physics2DServer]. Get the [CollisionShape2D] node with " "[code]self.shape_owner_get_owner(local_shape_index)[/code]." msgstr "" +"Wird ausgesendet, wenn [Shape2D]s eines anderen Area2Ds [Shape2D]s dieses " +"Area2D verlassen. Erfordert, dass [member monitoring] auf [code]true[/code] " +"gesetzt ist.\n" +"[code]area_rid[/code] die [RID] des anderen Area2D's [CollisionObject2D], " +"das vom [Physics2DServer] verwendet wird.\n" +"[code]area[/code] die andere Area2D.\n" +"[code]area_shape_index[/code] der Index des [Shape2D]s des anderen Area2Ds, " +"das vom [Physics2DServer] verwendet wird. Holen Sie den [CollisionShape2D] " +"Knoten mit [code]area.shape_owner_get_owner(area_shape_index)[/code].\n" +"[code]local_shape_index[/code] der Index des [Shape2D]s dieses Area2Ds, der " +"vom [Physics2DServer] verwendet wird. Holen Sie den [CollisionShape2D] " +"Knoten mit [code]self.shape_owner_get_owner(local_shape_index)[/code]." #: doc/classes/Area2D.xml msgid "" @@ -8951,6 +9245,12 @@ msgid "" "[code]body[/code] the [Node], if it exists in the tree, of the other " "[PhysicsBody2D] or [TileMap]." msgstr "" +"Wird ausgesendet, wenn ein [PhysicsBody2D] oder eine [TileMap] diesen Area2D " +"betritt. Erfordert, dass [member monitoring] auf [code]true[/code] gesetzt " +"ist. [TileMap]s werden erkannt, wenn das [TileSet] Kollisions-[Shape2D]s " +"hat.\n" +"[code]body[/code] der [Node], falls im Baum vorhanden, des anderen " +"[PhysicsBody2D] oder [TileMap]." #: doc/classes/Area2D.xml msgid "" @@ -8960,6 +9260,12 @@ msgid "" "[code]body[/code] the [Node], if it exists in the tree, of the other " "[PhysicsBody2D] or [TileMap]." msgstr "" +"Wird ausgesendet, wenn ein [PhysicsBody2D] oder eine [TileMap] diesen Area2D " +"verlässt. Erfordert, dass [member monitoring] auf [code]true[/code] gesetzt " +"ist. [TileMap]s werden erkannt, wenn das [TileSet] Kollisions-[Shape2D]s " +"hat.\n" +"[code]body[/code] der [Node], falls im Baum vorhanden, des anderen " +"[PhysicsBody2D] oder [TileMap]." #: doc/classes/Area2D.xml msgid "" @@ -8979,6 +9285,21 @@ msgid "" "used by the [Physics2DServer]. Get the [CollisionShape2D] node with " "[code]self.shape_owner_get_owner(local_shape_index)[/code]." msgstr "" +"Wird ausgesendet, wenn eine der [Shape2D]s eines [PhysicsBody2D] oder einer " +"[TileMap] in eine der [Shape2D]s dieser Area2D eintritt. Erfordert, dass " +"[member monitoring] auf [code]true[/code] gesetzt ist. [TileMap]s werden " +"erkannt, wenn das [TileSet] Kollisions-[Shape2D]s hat.\n" +"[code]body_rid[/code] die [RID] des [PhysicsBody2D] oder [TileSet]'s " +"[CollisionObject2D], das vom [Physics2DServer] verwendet wird.\n" +"[code]body[/code] der [Node] des [PhysicsBody2D] oder der [TileMap], wenn er " +"im Baum existiert.\n" +"[code]body_shape_index[/code] der Index des [Shape2D]s des [PhysicsBody2D]s " +"oder der [TileMap], der vom [Physics2DServer] verwendet wird. Holen Sie sich " +"den [CollisionShape2D] Knoten mit [code]body." +"shape_owner_get_owner(body_shape_index)[/code].\n" +"[code]local_shape_index[/code] der Index des [Shape2D]s dieses Area2Ds, der " +"vom [Physics2DServer] verwendet wird. Holen Sie den [CollisionShape2D] " +"Knoten mit [code]self.shape_owner_get_owner(local_shape_index)[/code]." #: doc/classes/Area2D.xml msgid "" @@ -8998,10 +9319,25 @@ msgid "" "used by the [Physics2DServer]. Get the [CollisionShape2D] node with " "[code]self.shape_owner_get_owner(local_shape_index)[/code]." msgstr "" +"Wird ausgesendet, wenn eine der [Shape2D]s eines [PhysicsBody2D] oder einer " +"[TileMap] eine der [Shape2D]s dieser Area2D verlässt. Erfordert, dass " +"[member monitoring] auf [code]true[/code] gesetzt ist. [TileMap]s werden " +"erkannt, wenn das [TileSet] Kollisions-[Shape2D]s hat.\n" +"[code]body_rid[/code] die [RID] des [PhysicsBody2D] oder [TileSet]'s " +"[CollisionObject2D], das vom [Physics2DServer] verwendet wird.\n" +"[code]body[/code] der [Node] des [PhysicsBody2D] oder der [TileMap], wenn er " +"im Baum existiert.\n" +"[code]body_shape_index[/code] der Index des [Shape2D]s des [PhysicsBody2D]s " +"oder der [TileMap], der vom [Physics2DServer] verwendet wird. Holen Sie sich " +"den [CollisionShape2D] Knoten mit [code]body." +"shape_owner_get_owner(body_shape_index)[/code].\n" +"[code]local_shape_index[/code] der Index des [Shape2D]s dieses Area2Ds, der " +"vom [Physics2DServer] verwendet wird. Holen Sie den [CollisionShape2D] " +"Knoten mit [code]self.shape_owner_get_owner(local_shape_index)[/code]." #: doc/classes/Array.xml msgid "A generic array datatype." -msgstr "" +msgstr "Ein generischer Array Datentyp." #: doc/classes/Array.xml msgid "" @@ -9035,6 +9371,37 @@ msgid "" "pushing/removing elements. Using [code]const[/code] will only prevent " "assigning the constant with another value after it was initialized." msgstr "" +"Ein generisches Array, das mehrere Elemente beliebiger Typen enthalten kann, " +"die über einen numerischen Index ab 0 zugänglich sind. Negative Indizes " +"können verwendet werden, um von hinten zu zählen, wie in Python (-1 ist das " +"letzte Element, -2 das vorletzte usw.).\n" +"[b]Zum Beispiel:[/b]\n" +"[codeblock]\n" +"var array = [\"Eins\", 2, 3, \"Vier\"]\n" +"print(array[0]) # Eins.\n" +"print(array[2]) # 3.\n" +"print(array[-1]) # Vier.\n" +"array[2] = \"Drei\"\n" +"print(array[-2]) # Drei.\n" +"[/codeblock]\n" +"Arrays können mit dem Operator [code]+[/code] verbunden werden:\n" +"[codeblock]\n" +"var array1 = [\"Eins\", 2]\n" +"var array2 = [3, \"Vier\"]\n" +"print(array1 + array2) # [\"Eins\", 2, 3, \"Vier\"]\n" +"[/codeblock]\n" +"[b]Hinweis:[/b] Die Verkettung mit dem Operator [code]+=[/code] erzeugt ein " +"neues Array, was mit Kosten verbunden ist. Wenn Sie ein weiteres Array an " +"ein bestehendes Array anhängen wollen, ist die [method append_array] " +"effizienter.\n" +"[b]Hinweis:[/b] Arrays werden immer per Referenz übergeben. Um eine Kopie " +"eines Arrays zu erhalten, die unabhängig vom ursprünglichen Array verändert " +"werden kann, verwenden Sie [method duplicate].\n" +"[b]Hinweis:[/b] Wenn ein Array mit [code]const[/code] deklariert wird, kann " +"das Array selbst immer noch verändert werden, indem die Werte an einzelnen " +"Indizes definiert oder Elemente verschoben/entfernt werden. Die Verwendung " +"von [code]const[/code] verhindert nur, dass der Konstante ein anderer Wert " +"zugewiesen wird, nachdem sie initialisiert wurde." #: doc/classes/Array.xml #, fuzzy @@ -9090,6 +9457,13 @@ msgid "" "print(array1) # Prints [1, 2, 3, 4, 5, 6].\n" "[/codeblock]" msgstr "" +"Hängt ein weiteres Array an das Ende dieses Array an.\n" +"[codeblock]\n" +"var array1 = [1, 2, 3]\n" +"var array2 = [4, 5, 6]\n" +"array1.append_array(array2)\n" +"print(array1) # Prints [1, 2, 3, 4, 5, 6].\n" +"[/codeblock]" #: doc/classes/Array.xml msgid "" @@ -9099,6 +9473,12 @@ msgid "" "[/code]. If the array is empty, accessing by index will pause project " "execution when running from the editor." msgstr "" +"Gibt das letzte Element des Arrays zurück. Gibt einen Fehler aus und liefert " +"[code]null[/code], wenn das Array leer ist.\n" +"[b]Hinweis:[/b] Der Aufruf dieser Funktion ist nicht dasselbe wie das " +"Schreiben von [code]array[-1][/code]. Wenn das Array leer ist, führt der " +"Zugriff über den Index zu einer Unterbrechung der Projektausführung, wenn es " +"vom Editor aus ausgeführt wird." #: doc/classes/Array.xml msgid "" @@ -9110,6 +9490,13 @@ msgid "" "[b]Note:[/b] Calling [method bsearch] on an unsorted array results in " "unexpected behavior." msgstr "" +"Findet den Index eines vorhandenen Wertes (oder den Einfügeindex, der die " +"Sortierreihenfolge beibehält, wenn der Wert noch nicht im Array vorhanden " +"ist) mithilfe der binären Suche. Optional kann ein [code]before[/code]-" +"Spezifizierer übergeben werden. Falls [code]false[/code], kommt der " +"zurückgegebene Index nach allen vorhandenen Einträgen des Wertes im Array.\n" +"[b]Hinweis:[/b] Der Aufruf der [method bsearch] auf einem unsortierten Array " +"führt zu unerwartetem Verhalten." #: doc/classes/Array.xml msgid "" @@ -9149,19 +9536,57 @@ msgid "" "[b]Note:[/b] Calling [method bsearch_custom] on an unsorted array results in " "unexpected behavior." msgstr "" +"Findet den Index eines vorhandenen Wertes (oder den Einfügeindex, der die " +"Sortierreihenfolge beibehält, wenn der Wert noch nicht im Array vorhanden " +"ist) mithilfe der binären Suche und eine benutzerdefinierte " +"Vergleichsmethode, die im [code]obj[/code] deklariert ist. Optional kann ein " +"[code]before[/code]-Spezifizierer übergeben werden. Wenn [code]false[/code], " +"kommt der zurückgegebene Index nach allen vorhandenen Einträgen des Wertes " +"im Array. Die benutzerdefinierte Methode erhält zwei Argumente (ein Element " +"aus dem Array und den gesuchten Wert) und muss [code]true[/code] " +"zurückgeben, wenn das erste Argument kleiner als das zweite ist, und " +"ansonsten [code]false[/code].\n" +"[codeblock]\n" +"func cardinal_to_algebraic(a):\n" +" match a:\n" +" \"eins\":\n" +" return 1\n" +" \"zwei\":\n" +" return 2\n" +" \"drei\":\n" +" return 3\n" +" \"vier\":\n" +" return 4\n" +" _:\n" +" return 0\n" +"\n" +"func compare(a, b):\n" +" return cardinal_to_algebraic(a) < cardinal_to_algebraic(b)\n" +"\n" +"func _ready():\n" +" var a = [\"one\", \"two\", \"three\", \"four\"]\n" +" # `compare`ist in diesem Objekt definiert, also benutzen wir `self` als " +"den `obj` Parameter.\n" +" print(a.bsearch_custom(\"three\", self, \"compare\", true)) # Expected " +"value is 2.\n" +"[/codeblock]\n" +"[b]Hinweis:[/b] Der Aufruf der [method bsearch_custom] auf einem " +"unsortierten Array führt zu unerwartetem Verhalten." #: doc/classes/Array.xml msgid "" "Clears the array. This is equivalent to using [method resize] with a size of " "[code]0[/code]." msgstr "" +"Löscht das Array. Dies entspricht der Verwendung von [method resize] mit " +"einer Größe von [code]0[/code]." #: doc/classes/Array.xml doc/classes/PoolByteArray.xml #: doc/classes/PoolColorArray.xml doc/classes/PoolIntArray.xml #: doc/classes/PoolRealArray.xml doc/classes/PoolStringArray.xml #: doc/classes/PoolVector2Array.xml doc/classes/PoolVector3Array.xml msgid "Returns the number of times an element is in the array." -msgstr "" +msgstr "Gibt die Anzahl der Vorkommen eines Elements im Array zurück." #: doc/classes/Array.xml msgid "" @@ -9173,6 +9598,14 @@ msgid "" "modifying a sub-array or dictionary in the copy will also impact those " "referenced in the source array." msgstr "" +"Gibt eine Kopie des Arrays zurück.\n" +"Wenn [code]deep[/code] [code]true[/code] ist, wird eine tiefe Kopie " +"erstellt: alle verschachtelten Arrays und Dictionaries werden dupliziert und " +"nicht mit dem ursprünglichen Array geteilt. Wenn es [code]false[/code] ist, " +"wird eine flache Kopie erstellt und Verweise auf die ursprünglichen " +"verschachtelten Arrays und Dictionaries werden beibehalten, so dass die " +"Änderung eines Sub-Arrays oder Dictionaries in der Kopie auch Auswirkungen " +"auf die im Quell-Array referenzierten hat." #: doc/classes/Array.xml doc/classes/PoolByteArray.xml #: doc/classes/PoolColorArray.xml doc/classes/PoolIntArray.xml @@ -9191,6 +9624,15 @@ msgid "" "element is close to the beginning of the array (index 0). This is because " "all elements placed after the removed element have to be reindexed." msgstr "" +"Entfernt das erste Vorkommen eines Wertes aus dem Array. Wenn der Wert nicht " +"im Array vorhanden ist, passiert nichts. Um ein Element nach Index zu " +"entfernen, verwenden Sie stattdessen [method remove].\n" +"[b]Hinweis:[/b] Diese Methode arbeitet in-place und gibt keinen Wert " +"zurück.\n" +"[b]Hinweis:[/b] Bei großen Arrays ist diese Methode langsamer, wenn das " +"entfernte Element nahe am Anfang des Arrays liegt (Index 0). Das liegt " +"daran, dass alle Elemente, die nach dem entfernten Element platziert sind, " +"neu indiziert werden müssen." #: doc/classes/Array.xml msgid "" @@ -9203,6 +9645,14 @@ msgid "" "array.fill(0) # Initialize the 10 elements to 0.\n" "[/codeblock]" msgstr "" +"Weist allen Elementen des Arrays den angegebenen Wert zu. Dies kann " +"normalerweise zusammen mit [method resize] verwendet werden, um ein Array " +"mit einer bestimmten Größe und initialisierten Elementen zu erstellen:\n" +"[codeblock]\n" +"var array = []\n" +"array.resize(10)\n" +"array.fill(0) # Initialisieren Sie die 10 Elemente auf 0.\n" +"[/codeblock]" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml #: doc/classes/PoolColorArray.xml doc/classes/PoolIntArray.xml @@ -9213,12 +9663,18 @@ msgid "" "not found. Optionally, the initial search index can be passed. Returns " "[code]-1[/code] if [code]from[/code] is out of bounds." msgstr "" +"Durchsucht das Array nach einem Wert und gibt dessen Index oder [code]-1[/" +"code] zurück, wenn er nicht gefunden wurde. Optional kann auch der " +"anfängliche Suchindex übergeben werden. Gibt [code]-1[/code] zurück, wenn " +"[code]from[/code] außerhalb der Grenzen liegt." #: doc/classes/Array.xml msgid "" "Searches the array in reverse order for a value and returns its index or " "[code]-1[/code] if not found." msgstr "" +"Durchsucht das Array in umgekehrter Reihenfolge nach einem Wert und gibt " +"dessen Index oder [code]-1[/code] zurück, wenn er nicht gefunden wird." #: doc/classes/Array.xml msgid "" @@ -9228,6 +9684,12 @@ msgid "" "[/code]. If the array is empty, accessing by index will pause project " "execution when running from the editor." msgstr "" +"Gibt das erste Element des Arrays zurück. Gibt einen Fehler aus und liefert " +"[code]null[/code], wenn das Array leer ist.\n" +"[b]Hinweis:[/b] Der Aufruf dieser Funktion ist nicht dasselbe wie das " +"Schreiben von [code]array[0][/code]. Wenn das Array leer ist, führt der " +"Zugriff über den Index zu einer Unterbrechung der Projektausführung, wenn es " +"vom Editor aus ausgeführt wird." #: doc/classes/Array.xml msgid "" @@ -9246,6 +9708,20 @@ msgid "" " pass\n" "[/codeblock]" msgstr "" +"Gibt [code]true[/code] zurück, wenn das Array den angegebenen Wert enthält.\n" +"[codeblock]\n" +"[\"innerhalb\", 7].has(\"innerhalb\") # True\n" +"[\"innerhalb\", 7].has(\"außerhalb\") # False\n" +"[\"innerhalb\", 7].has(7) # True\n" +"[\"innerhalb\", 7].has(\"7\") # False\n" +"[/codeblock]\n" +"[b]Hinweis:[/b] Dies entspricht der Verwendung des Operators [code]in[/code] " +"wie folgt:\n" +"[codeblock]\n" +"# Wird als `true` ausgewertet.\n" +"if 2 in [2, 4, 6, 8]:\n" +" pass\n" +"[/codeblock]" #: doc/classes/Array.xml msgid "" @@ -9256,6 +9732,13 @@ msgid "" "does [i]not[/i] imply the arrays are equal, because different arrays can " "have identical hash values due to hash collisions." msgstr "" +"Gibt einen gehashten 32-Bit-Ganzzahlwert zurück, der das Array und seinen " +"Inhalt darstellt.\n" +"[b]Hinweis:[/b] [Array]s mit gleichem Inhalt erzeugen immer identische " +"Hashwerte. Das Gegenteil ist jedoch nicht der Fall. Die Rückgabe von " +"identischen Hash-Werten bedeutet [i]nicht[/i], dass die Arrays gleich sind, " +"da verschiedene Arrays aufgrund von Hash-Kollisionen identische Hash-Werte " +"haben können." #: doc/classes/Array.xml msgid "" @@ -9266,6 +9749,15 @@ msgid "" "element is close to the beginning of the array (index 0). This is because " "all elements placed after the newly inserted element have to be reindexed." msgstr "" +"Fügt ein neues Element an einer bestimmten Position in das Array ein. Die " +"Position muss gültig sein oder am Ende des Arrays liegen ([code]pos == size()" +"[/code]).\n" +"[b]Hinweis:[/b] Diese Methode arbeitet in-place und gibt keinen Wert " +"zurück.\n" +"[b]Hinweis:[/b] Bei großen Arrays wird diese Methode langsamer sein, wenn " +"das eingefügte Element nahe am Anfang des Arrays (Index 0) liegt. Dies liegt " +"daran, dass alle Elemente, die nach dem neu eingefügten Element platziert " +"sind, neu indiziert werden müssen." #: doc/classes/Array.xml doc/classes/PoolByteArray.xml #: doc/classes/PoolColorArray.xml doc/classes/PoolIntArray.xml @@ -9280,6 +9772,9 @@ msgid "" "comparable types. If the elements can't be compared, [code]null[/code] is " "returned." msgstr "" +"Gibt den größten im Array enthaltenen Wert zurück, wenn alle Elemente von " +"vergleichbarem Typ sind. Wenn die Elemente nicht verglichen werden können, " +"wird [code]null[/code] zurückgegeben." #: doc/classes/Array.xml msgid "" @@ -9287,6 +9782,9 @@ msgid "" "comparable types. If the elements can't be compared, [code]null[/code] is " "returned." msgstr "" +"Gibt den kleinsten im Array enthaltenen Wert zurück, wenn alle Elemente von " +"vergleichbarem Typ sind. Wenn die Elemente nicht verglichen werden können, " +"wird [code]null[/code] zurückgegeben." #: doc/classes/Array.xml msgid "" @@ -9300,6 +9798,17 @@ msgid "" "removed element. The larger the array and the lower the index of the removed " "element, the slower [method pop_at] will be." msgstr "" +"Entfernt das Element des Arrays am Index [code]position[/code] und gibt es " +"zurück. Falls negativ, wird [code]position[/code] relativ zum Ende des " +"Arrays betrachtet. Lässt das Array unangetastet und gibt [code]null[/code] " +"zurück, wenn das Array leer ist oder wenn der Zugriff außerhalb der Grenzen " +"erfolgt. Es wird eine Fehlermeldung ausgegeben, wenn der Zugriff auf das " +"Array außerhalb der Grenzen erfolgt, aber nicht, wenn das Array leer ist.\n" +"[b]Hinweis:[/b] Bei großen Arrays kann diese Methode langsamer sein als " +"[method pop_back], da sie die Elemente des Arrays, die sich nach dem " +"entfernten Element befinden, neu indiziert werden müssen. Je größer das " +"Array und je niedriger der Index des entfernten Elements ist, desto " +"langsamer wird die [method pop_at] sein." #: doc/classes/Array.xml msgid "" @@ -9307,6 +9816,9 @@ msgid "" "if the array is empty, without printing an error message. See also [method " "pop_front]." msgstr "" +"Entfernt und gibt das letzte Element des Arrays zurück. Gibt [code]null[/" +"code] zurück, wenn das Array leer ist, ohne eine Fehlermeldung auszugeben. " +"Siehe auch [Methode pop_front]." #: doc/classes/Array.xml msgid "" @@ -9317,6 +9829,12 @@ msgid "" "pop_back] as it will reindex all the array's elements every time it's " "called. The larger the array, the slower [method pop_front] will be." msgstr "" +"Entfernt und gibt das erste Element des Arrays zurück. Gibt [code]null[/" +"code] zurück, wenn das Array leer ist, ohne eine Fehlermeldung auszugeben. " +"Siehe auch [Methode pop_back].\n" +"[b]Hinweis:[/b] Bei großen Arrays ist diese Methode viel langsamer als " +"[method pop_back], da sie bei jedem Aufruf alle Elemente des Arrays neu " +"indiziert. Je größer das Array, desto langsamer ist [method pop_front]." #: doc/classes/Array.xml #, fuzzy @@ -9332,6 +9850,11 @@ msgid "" "push_back] as it will reindex all the array's elements every time it's " "called. The larger the array, the slower [method push_front] will be." msgstr "" +"Fügt ein Element am Anfang des Arrays hinzu. Siehe auch [Methode " +"push_back].\n" +"[b]Hinweis:[/b] Bei großen Arrays ist diese Methode viel langsamer als " +"[method push_back], da sie bei jedem Aufruf alle Elemente des Arrays neu " +"indiziert. Je größer das Array, desto langsamer ist [method push_front]." #: doc/classes/Array.xml msgid "" @@ -9343,6 +9866,15 @@ msgid "" "element is close to the beginning of the array (index 0). This is because " "all elements placed after the removed element have to be reindexed." msgstr "" +"Entfernt ein Element aus dem Array nach Index. Wenn der Index im Array nicht " +"vorhanden ist, passiert nichts. Um ein Element durch die Suche nach seinem " +"Wert zu entfernen, verwenden Sie stattdessen [method erase].\n" +"[b]Hinweis:[/b] Diese Methode arbeitet in-place und gibt keinen Wert " +"zurück.\n" +"[b]Hinweis:[/b] Bei großen Arrays ist diese Methode langsamer, wenn das " +"entfernte Element nahe am Anfang des Arrays liegt (Index 0). Dies liegt " +"daran, dass alle Elemente, die nach dem entfernten Element platziert sind, " +"neu indiziert werden müssen." #: doc/classes/Array.xml msgid "" @@ -9350,6 +9882,9 @@ msgid "" "size is smaller, elements are cleared, if bigger, new elements are " "[code]null[/code]." msgstr "" +"Ändert die Größe des Arrays, damit es eine andere Anzahl von Elementen " +"enthält. Ist die Größe des Arrays kleiner, werden die Elemente gelöscht, ist " +"sie größer, sind die neuen Elemente [code]null[/code]." #: doc/classes/Array.xml doc/classes/PoolByteArray.xml #: doc/classes/PoolColorArray.xml doc/classes/PoolIntArray.xml @@ -9361,6 +9896,10 @@ msgid "" "the array. If the adjusted start index is out of bounds, this method " "searches from the end of the array." msgstr "" +"Durchsucht das Array in umgekehrter Reihenfolge. Optional kann ein Start-" +"Suchindex übergeben werden. Ist dieser negativ, wird der Startindex relativ " +"zum Ende des Arrays betrachtet. Liegt der eingestellte Startindex außerhalb " +"der Grenzen, sucht diese Methode ab dem Ende des Arrays." #: doc/classes/Array.xml msgid "" @@ -9369,6 +9908,11 @@ msgid "" "@GDScript.randi]. Call [method @GDScript.randomize] to ensure that a new " "seed will be used each time if you want non-reproducible shuffling." msgstr "" +"Mischt das Array so, dass die Elemente eine zufällige Reihenfolge haben. " +"Diese Methode verwendet den globalen Zufallszahlengenerator, der auch für " +"Methoden wie [method @GDScript.randi] verwendet wird. Rufen Sie [method " +"@GDScript.randomize] auf, um sicherzustellen, dass jedes Mal ein neuer Seed " +"verwendet wird, wenn Sie ein nicht reproduzierbares Mischen wünschen." #: doc/classes/Array.xml doc/classes/PoolByteArray.xml #: doc/classes/PoolColorArray.xml doc/classes/PoolIntArray.xml @@ -9384,6 +9928,11 @@ msgid "" "and upper index are inclusive, with the [code]step[/code] describing the " "change between indices while slicing." msgstr "" +"Dupliziert die in der Funktion beschriebene Teilmenge und gibt sie in einem " +"Array zurück, wobei das Array tief kopiert wird, wenn [code]deep[/code] " +"[code]true[/code] ist. Unterer und oberer Index sind inklusive, wobei " +"[code]step[/code] den Wechsel zwischen den Indizes während des Slicings " +"beschreibt." #: doc/classes/Array.xml msgid "" @@ -9397,6 +9946,16 @@ msgid "" "print(strings) # Prints [string1, string10, string11, string2]\n" "[/codeblock]" msgstr "" +"Sortiert das Array.\n" +"[b]Hinweis:[/b] Strings werden in alphabetischer Reihenfolge sortiert (im " +"Gegensatz zur natürlichen Reihenfolge). Dies kann zu unerwartetem Verhalten " +"führen, wenn ein Array mit Strings sortiert wird, die mit einer Zahlenfolge " +"enden. Betrachten Sie das folgende Beispiel:\n" +"[codeblock]\n" +"var strings = [\"string1\", \"string2\", \"string10\", \"string11\"]\n" +"strings.sort()\n" +"print(strings) # Prints [string1, string10, string11, string2]\n" +"[/codeblock]" #: doc/classes/Array.xml msgid "" @@ -9422,11 +9981,33 @@ msgid "" "print(my_items) # Prints [[4, Tomato], [5, Potato], [9, Rice]].\n" "[/codeblock]" msgstr "" +"Sortiert das Array mit einer eigenen Methode. Die Argumente sind ein Objekt, " +"das die Methode enthält, und der Name dieser Methode. Die benutzerdefinierte " +"Methode erhält zwei Argumente (ein Paar von Elementen aus dem Array) und " +"muss entweder [code]true[/code] oder [code]false[/code] zurückgeben.\n" +"Für zwei Elemente [code]a[/code] und [code]b[/code], wenn die angegebene " +"Methode [code]true[/code] zurückgibt, wird Element [code]b[/code] nach " +"Element [code]a[/code] im Array stehen.\n" +"[b]Hinweis:[/b] Sie können den Rückgabewert nicht zufällig bestimmen, da der " +"Heapsort-Algorithmus ein deterministisches Ergebnis erwartet. Dies würde zu " +"einem unerwarteten Verhalten führen.\n" +"[codeblock]\n" +"class MyCustomSorter:\n" +" static func sort_ascending(a, b):\n" +" if a[0] < b[0]:\n" +" return true\n" +" return false\n" +"\n" +"var my_items = [[5, \"Kartoffel\"], [9, \"Reis\"], [4, \"Tomate\"]]\n" +"my_items.sort_custom(MyCustomSorter, \"sort_ascending\")\n" +"print(my_items) # Prints [[4, Tomate], [5, Kartoffel], [9, Reis]].\n" +"[/codeblock]" #: doc/classes/ArrayMesh.xml msgid "" "[Mesh] type that provides utility for constructing a surface from arrays." msgstr "" +"[Mesh]-Typ, der das Konstruieren einer Oberfläche aus Arrays ermöglicht." #: doc/classes/ArrayMesh.xml msgid "" @@ -9455,14 +10036,43 @@ msgid "" "OpenGL/Face-culling]winding order[/url] for front faces of triangle " "primitive modes." msgstr "" +"Das [ArrayMesh] wird verwendet, um ein [Mesh] zu konstruieren, indem die " +"Attribute als Arrays angegeben werden.\n" +"Das einfachste Beispiel ist die Erstellung eines einzelnen Dreiecks:\n" +"[codeblock]\n" +"var vertices = PoolVector3Array()\n" +"vertices.push_back(Vector3(0, 1, 0))\n" +"vertices.push_back(Vector3(1, 0, 0))\n" +"vertices.push_back(Vector3(0, 0, 1))\n" +"# Initialisiere das ArrayMesh.\n" +"var arr_mesh = ArrayMesh.new()\n" +"var arrays = []\n" +"arrays.resize(ArrayMesh.ARRAY_MAX)\n" +"arrays[ArrayMesh.ARRAY_VERTEX] = vertices\n" +"# Erstelle das Mesh.\n" +"arr_mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays)\n" +"var m = MeshInstance.new()\n" +"m.mesh = arr_mesh\n" +"[/codeblock]\n" +"Die [MeshInstance] ist bereit, dem darzustellenden [SceneTree] hinzugefügt " +"zu werden.\n" +"Siehe auch [ImmediateGeometry], [MeshDataTool] und [SurfaceTool] für " +"prozedurale Geometrieerzeugung.\n" +"[b]Hinweis:[/b] Godot verwendet die [url=https://learnopengl.com/Advanced-" +"OpenGL/Face-culling]Wickelreihenfolge[/url] im Uhrzeigersinn für " +"Vorderseiten von Dreiecks-Primitivmodi." #: doc/classes/ArrayMesh.xml msgid "" "Adds name for a blend shape that will be added with [method " "add_surface_from_arrays]. Must be called before surface is added." msgstr "" +"Fügt einen Namen für eine Mischform hinzu, die mit der [method " +"add_surface_from_arrays] hinzugefügt wird. Muss aufgerufen werden, bevor die " +"Oberfläche hinzugefügt wird." #: doc/classes/ArrayMesh.xml +#, fuzzy msgid "" "Creates a new surface.\n" "Surfaces are created to be rendered using a [code]primitive[/code], which " @@ -9477,78 +10087,115 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." -msgstr "" +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." +msgstr "" +"Erzeugt eine neue Oberfläche.\n" +"Flächen werden erstellt, um mit einem [code]primitive[/code] gerendert zu " +"werden, das einer der in [enum Mesh.PrimitiveType] definierten Typen sein " +"kann. (Es wird empfohlen, bei der Verwendung von Indizes nur Punkte, Linien " +"oder Dreiecke zu verwenden). Die [method Mesh.get_surface_count] wird zur " +"[code]surf_idx[/code] für diese neue Oberfläche.\n" +"Das Argument [code]arrays[/code] ist ein Array von Arrays. Siehe [enum " +"ArrayType] für die in diesem Array verwendeten Werte. Zum Beispiel ist " +"[code]arrays[0][/code] das Array der Vertices. Das erste Vertex-Sub-Array " +"ist immer erforderlich; die anderen sind optional. Das Hinzufügen eines " +"Index-Arrays versetzt diese Funktion in den \"Index-Modus\", in dem die " +"Vertex- und anderen Arrays zu Datenquellen werden und das Index-Array die " +"Reihenfolge der Vertexe definiert. Alle Sub-Arrays müssen die gleiche Länge " +"wie das Vertex-Array haben oder leer sein, mit Ausnahme der [constant " +"ARRAY_INDEX], falls sie verwendet wird." #: doc/classes/ArrayMesh.xml msgid "Removes all blend shapes from this [ArrayMesh]." -msgstr "" +msgstr "Entfernt alle Mischformen aus diesem [ArrayMesh]." #: doc/classes/ArrayMesh.xml msgid "Removes all surfaces from this [ArrayMesh]." -msgstr "" +msgstr "Entfernt alle Flächen aus diesem [ArrayMesh]." #: doc/classes/ArrayMesh.xml msgid "Returns the number of blend shapes that the [ArrayMesh] holds." -msgstr "" +msgstr "Gibt die Anzahl der Blendformen zurück, die das [ArrayMesh] enthält." #: doc/classes/ArrayMesh.xml msgid "Returns the name of the blend shape at this index." -msgstr "" +msgstr "Gibt den Namen der Blendform an diesem Index zurück." #: doc/classes/ArrayMesh.xml msgid "" "Will perform a UV unwrap on the [ArrayMesh] to prepare the mesh for " "lightmapping." msgstr "" +"Führt ein UV Unwrap auf dem [ArrayMesh] durch, um das Mesh für das " +"Lightmapping vorzubereiten." #: doc/classes/ArrayMesh.xml msgid "Will regenerate normal maps for the [ArrayMesh]." -msgstr "" +msgstr "Regeneriert Normal Maps für das [ArrayMesh]." #: doc/classes/ArrayMesh.xml msgid "" "Returns the index of the first surface with this name held within this " "[ArrayMesh]. If none are found, -1 is returned." msgstr "" +"Gibt den Index der ersten Fläche mit diesem Namen in diesem [ArrayMesh] " +"zurück. Wenn keine gefunden wird, wird -1 zurückgegeben." #: doc/classes/ArrayMesh.xml msgid "" "Returns the length in indices of the index array in the requested surface " "(see [method add_surface_from_arrays])." msgstr "" +"Gibt die Länge des Index-Arrays in der angeforderten Oberfläche in Indizes " +"zurück (siehe [method add_surface_from_arrays])." #: doc/classes/ArrayMesh.xml msgid "" "Returns the length in vertices of the vertex array in the requested surface " "(see [method add_surface_from_arrays])." msgstr "" +"Gibt die Länge des Vertex-Arrays in der angeforderten Oberfläche in Vertices " +"zurück (siehe [method add_surface_from_arrays])." #: doc/classes/ArrayMesh.xml msgid "" "Returns the format mask of the requested surface (see [method " "add_surface_from_arrays])." msgstr "" +"Gibt die Formatmaske der angeforderten Oberfläche zurück (siehe [method " +"add_surface_from_arrays])." #: doc/classes/ArrayMesh.xml msgid "Gets the name assigned to this surface." -msgstr "" +msgstr "Ruft den dieser Fläche zugewiesenen Namen ab." #: doc/classes/ArrayMesh.xml msgid "" "Returns the primitive type of the requested surface (see [method " "add_surface_from_arrays])." msgstr "" +"Gibt den primitiven Typ der angeforderten Fläche zurück (siehe [method " +"add_surface_from_arrays])." #: doc/classes/ArrayMesh.xml msgid "" "Removes a surface at position [code]surf_idx[/code], shifting greater " "surfaces one [code]surf_idx[/code] slot down." msgstr "" +"Entfernt eine Fläche an der Position [code]surf_idx[/code] und verschiebt " +"größere Flächen um einen [code]surf_idx[/code] Slot nach unten." #: doc/classes/ArrayMesh.xml msgid "Sets a name for a given surface." -msgstr "" +msgstr "Legt einen Namen für eine bestimmte Oberfläche fest." #: doc/classes/ArrayMesh.xml msgid "" @@ -9556,10 +10203,14 @@ msgid "" "[b]Warning:[/b] Only use if you know what you are doing. You can easily " "cause crashes by calling this function with improper arguments." msgstr "" +"Aktualisiert einen bestimmten Bereich von Mesh-Arrays auf der GPU.\n" +"[b]Warnung:[/b] Nur verwenden, wenn Sie wissen, was Sie tun. Sie können " +"leicht Abstürze verursachen, wenn Sie diese Funktion mit falschen Argumenten " +"aufrufen." #: doc/classes/ArrayMesh.xml msgid "Sets the blend shape mode to one of [enum Mesh.BlendShapeMode]." -msgstr "" +msgstr "Setzt den Blendform-Modus auf einen der [enum Mesh.BlendShapeMode]." #: doc/classes/ArrayMesh.xml doc/classes/PrimitiveMesh.xml msgid "" @@ -9567,22 +10218,26 @@ msgid "" "Especially useful to avoid unexpected culling when using a shader to offset " "vertices." msgstr "" +"Überschreibt den [AABB] mit einem vom Benutzer definierten Wert für die " +"Verwendung mit Frustum Culling. Besonders nützlich, um unerwartetes Culling " +"zu vermeiden, wenn ein Shader zum Versetzen von Vertices verwendet wird." #: doc/classes/ArrayMesh.xml msgid "Value used internally when no indices are present." -msgstr "" +msgstr "Wert wird intern benutzt, wenn keine Indizes vorhanden sind." #: doc/classes/ArrayMesh.xml msgid "Amount of weights/bone indices per vertex (always 4)." -msgstr "" +msgstr "Anzahl der Gewichte/Knochenindizes pro Vertex (immer 4)." #: doc/classes/ArrayMesh.xml msgid "[PoolVector3Array], [PoolVector2Array], or [Array] of vertex positions." msgstr "" +"[PoolVector3Array], [PoolVector2Array] oder [Array] von Vertex-Positionen." #: doc/classes/ArrayMesh.xml msgid "[PoolVector3Array] of vertex normals." -msgstr "" +msgstr "[PoolVector3Array] von Vertex-Normalen." #: doc/classes/ArrayMesh.xml msgid "" @@ -9590,28 +10245,34 @@ msgid "" "first 3 floats determine the tangent, and the last the binormal direction as " "-1 or 1." msgstr "" +"[PoolRealArray] von Vertex-Tangenten. Jedes Element in Gruppen von 4 Floats, " +"die ersten 3 Floats bestimmen die Tangente, und das letzte die binormale " +"Richtung als -1 oder 1." #: doc/classes/ArrayMesh.xml msgid "[PoolColorArray] of vertex colors." -msgstr "" +msgstr "[PoolColorArray] von Vertex-Farben." #: doc/classes/ArrayMesh.xml msgid "[PoolVector2Array] for UV coordinates." -msgstr "" +msgstr "[PoolVector2Array] für UV-Koordinaten." #: doc/classes/ArrayMesh.xml msgid "[PoolVector2Array] for second UV coordinates." -msgstr "" +msgstr "[PoolVector2Array] für zweite UV-Koordinaten." #: doc/classes/ArrayMesh.xml msgid "" "[PoolRealArray] or [PoolIntArray] of bone indices. Each element in groups of " "4 floats." msgstr "" +"[PoolRealArray] oder [PoolIntArray] von Knochenindizes. Jedes Element in " +"Gruppen von 4 Floats." #: doc/classes/ArrayMesh.xml msgid "[PoolRealArray] of bone weights. Each element in groups of 4 floats." msgstr "" +"[PoolRealArray] von Knochengewichten. Jedes Element in Gruppen von 4 Floats." #: doc/classes/ArrayMesh.xml msgid "" @@ -9626,50 +10287,61 @@ msgid "" "vertices of each triangle. For lines, the index array is in pairs indicating " "the start and end of each line." msgstr "" +"[PoolIntArray] von Ganzzahlen, die als Indizes verwendet werden und auf " +"Vertices, Farben, Normalen, Tangenten und Texturen verweisen. Alle diese " +"Arrays müssen die gleiche Anzahl von Elementen haben wie das Vertex-Array. " +"Kein Index kann über die Größe des Vertex-Arrays hinausgehen. Wenn dieses " +"Index-Array vorhanden ist, versetzt es die Funktion in den \"Index-Modus\", " +"in dem der Index den *i*-ten Vertex, die Normale, die Tangente, die Farbe, " +"die UV, usw. auswählt. Das bedeutet, wenn man verschiedene Normalen oder " +"Farben entlang einer Kante haben will, muss man die Vertices duplizieren.\n" +"Bei Dreiecken wird das Index-Array als Tripel interpretiert, das sich auf " +"die Vertices der einzelnen Dreiecke bezieht. Bei Linien besteht das Index-" +"Array aus Paaren, die den Anfang und das Ende jeder Linie angeben." #: doc/classes/ArrayMesh.xml doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "Represents the size of the [enum ArrayType] enum." -msgstr "" +msgstr "Stellt die Größe der Aufzählung [enum ArrayType] dar." #: doc/classes/ArrayMesh.xml msgid "Array format will include vertices (mandatory)." -msgstr "" +msgstr "Das Array-Format enthält Vertices (obligatorisch)." #: doc/classes/ArrayMesh.xml msgid "Array format will include normals." -msgstr "" +msgstr "Das Array-Format enthält Normalen." #: doc/classes/ArrayMesh.xml msgid "Array format will include tangents." -msgstr "" +msgstr "Das Array-Format enthält Tangenten." #: doc/classes/ArrayMesh.xml msgid "Array format will include a color array." -msgstr "" +msgstr "Das Array-Format enthält ein Farbarray." #: doc/classes/ArrayMesh.xml msgid "Array format will include UVs." -msgstr "" +msgstr "Das Array-Format enthält UVs." #: doc/classes/ArrayMesh.xml msgid "Array format will include another set of UVs." -msgstr "" +msgstr "Das Array-Format enthält einen weiteren Satz von UVs." #: doc/classes/ArrayMesh.xml msgid "Array format will include bone indices." -msgstr "" +msgstr "Das Array-Format enthält Knochenindizes." #: doc/classes/ArrayMesh.xml msgid "Array format will include bone weights." -msgstr "" +msgstr "Das Array-Format enthält Knochengewichte." #: doc/classes/ArrayMesh.xml msgid "Index array will be used." -msgstr "" +msgstr "Das Index-Array wird verwendet." #: doc/classes/ARVRAnchor.xml msgid "An anchor point in AR space." -msgstr "" +msgstr "Ein Ankerpunkt im AR-Raum." #: doc/classes/ARVRAnchor.xml msgid "" @@ -9687,16 +10359,32 @@ msgid "" "more about the real world out there especially if only part of the surface " "is in view." msgstr "" +"Der [ARVRAnchor]-Punkt ist ein räumlicher Knoten, der einen von der AR-" +"Plattform identifizierten Standort in der realen Welt auf eine Position " +"innerhalb der Spielwelt abbildet. Solange z. B. die Ebenenerkennung in ARKit " +"aktiviert ist, identifiziert und aktualisiert ARKit die Position von Ebenen " +"(Tische, Böden usw.) und erstellt Anker für sie.\n" +"Dieser Knoten wird durch seine eindeutige ID auf einen der Anker abgebildet. " +"Wenn Sie ein Signal erhalten, dass ein neuer Anker verfügbar ist, sollten " +"Sie diesen Knoten zu Ihrer Szene für diesen Anker hinzufügen. Sie können " +"Knoten vordefinieren und die ID festlegen; die Knoten bleiben dann einfach " +"auf 0,0,0, bis eine Ebene erkannt wird.\n" +"Denken Sie daran, dass, solange die Ebenenerkennung aktiviert ist, die " +"Größe, Platzierung und Ausrichtung eines Ankers aktualisiert wird, da die " +"Erkennungslogik mehr über die reale Welt da draußen erfährt, insbesondere " +"wenn nur ein Teil der Oberfläche im Blickfeld ist." #: doc/classes/ARVRAnchor.xml msgid "Returns the name given to this anchor." -msgstr "" +msgstr "Gibt den Namen zurück, der diesem Anker gegeben wurde." #: doc/classes/ARVRAnchor.xml msgid "" "Returns [code]true[/code] if the anchor is being tracked and [code]false[/" "code] if no anchor with this ID is currently known." msgstr "" +"Gibt [code]true[/code] zurück, wenn der Anker verfolgt wird, und " +"[code]false[/code], wenn derzeit kein Anker mit dieser ID bekannt ist." #: doc/classes/ARVRAnchor.xml msgid "" @@ -9706,11 +10394,18 @@ msgid "" "can be used to create shadows/reflections on surfaces or for generating " "collision shapes." msgstr "" +"Falls vom [ARVRInterface] bereitgestellt, wird ein Mesh-Objekt für den Anker " +"zurückgegeben. Bei einem Anker kann es sich um eine Form handeln, die sich " +"auf das verfolgte Objekt bezieht, oder um ein Mesh, das eine Topologie in " +"Bezug auf den Anker bietet und zur Erstellung von Schatten/Reflexionen auf " +"Oberflächen oder zur Erzeugung von Kollisionsformen verwendet werden kann." #: doc/classes/ARVRAnchor.xml msgid "" "Returns a plane aligned with our anchor; handy for intersection testing." msgstr "" +"Gibt eine Ebene zurück, die an unserem Anker ausgerichtet ist; praktisch für " +"Schnittpunkttests." #: doc/classes/ARVRAnchor.xml msgid "" @@ -9718,6 +10413,9 @@ msgid "" "anchor relates to a table in the real world, this is the estimated size of " "the surface of that table." msgstr "" +"Gibt die geschätzte Größe der erkannten Fläche zurück. Wenn sich der Anker " +"beispielsweise auf einen Tisch in der realen Welt bezieht, ist dies die " +"geschätzte Größe der Oberfläche dieses Tisches." #: doc/classes/ARVRAnchor.xml msgid "" @@ -9728,6 +10426,12 @@ msgid "" "when the AR server identifies that two anchors represent different parts of " "the same plane and merges them." msgstr "" +"Die ID des Ankers. Sie können diese festlegen, bevor der Anker selbst " +"existiert. Der erste Anker erhält eine ID von [code]1[/code], der zweite " +"eine ID von [code]2[/code] usw. Wenn Anker entfernt werden, kann die Engine " +"dann die entsprechende ID neuen Ankern zuweisen. Die häufigste Situation, in " +"der Anker \"verschwinden\", ist, wenn der AR-Server feststellt, dass zwei " +"Anker verschiedene Teile derselben Ebene darstellen, und sie zusammenführt." #: doc/classes/ARVRAnchor.xml msgid "" @@ -9735,12 +10439,17 @@ msgid "" "available. This is especially important for topology that is constantly " "being [code]mesh_updated[/code]." msgstr "" +"Wird ausgesendet, wenn sich das mit dem Anker verbundene Netz ändert oder " +"eines verfügbar wird. Dies ist besonders wichtig für eine Topologie, die " +"ständig [code]mesh_updated[/code] wird." #: doc/classes/ARVRCamera.xml msgid "" "A camera node with a few overrules for AR/VR applied, such as location " "tracking." msgstr "" +"Ein Kameraknoten, der einige Grundregeln für AR/VR anwendet, z. B. die " +"Standortverfolgung." #: doc/classes/ARVRCamera.xml msgid "" @@ -9755,10 +10464,23 @@ msgid "" "tracking data of the HMD and the location of the ARVRCamera can lag a few " "milliseconds behind what is used for rendering as a result." msgstr "" +"Dies ist ein räumlicher Hilfsknoten für unsere Kamera; beachten Sie, dass " +"bei stereoskopischem Rendering (VR-HMD) die meisten Kameraeigenschaften " +"ignoriert werden, da die HMD-Informationen sie außer Kraft setzen. Die " +"einzigen Eigenschaften, auf die man sich verlassen kann, sind die Nah- und " +"Fern-Ebene.\n" +"Die Position und Ausrichtung dieses Knotens wird vom ARVR-Server automatisch " +"aktualisiert, um die Position des HMD darzustellen, wenn eine solche " +"Verfolgung verfügbar ist, und kann somit von der Spiellogik verwendet " +"werden. Beachten Sie, dass der Render-Thread im Gegensatz zum ARVR " +"Controller Zugriff auf die aktuellsten Tracking-Daten des HMD hat und die " +"Position der ARVRCamera daher einige Millisekunden hinter dem zurückbleiben " +"kann, was für das Rendering verwendet wird." #: doc/classes/ARVRController.xml msgid "A spatial node representing a spatially-tracked controller." msgstr "" +"Ein räumlicher Knoten, der einen räumlich verfolgten Controller darstellt." #: doc/classes/ARVRController.xml msgid "" @@ -9775,18 +10497,35 @@ msgid "" "[ARVRServer]. This makes this node ideal to add child nodes to visualize the " "controller." msgstr "" +"Dies ist ein räumlicher Hilfsknoten, der mit der Verfolgung von Controllern " +"verbunden ist. Er bietet auch mehrere praktische Durchreichungen für den " +"Zustand von Schaltflächen und dergleichen auf den Controllern.\n" +"Controller sind durch ihre ID verknüpft. Sie können Controller-Knoten " +"erstellen, bevor die Controller verfügbar sind. Wenn Ihr Spiel immer zwei " +"Controller verwendet (einen für jede Hand), können Sie die Controller mit " +"der ID 1 und 2 vordefinieren; sie werden aktiv, sobald die Controller " +"erkannt werden. Wenn Sie erwarten, dass zusätzliche Controller verwendet " +"werden, sollten Sie auf die Signale reagieren und ARVRController-Knoten zu " +"Ihrer Szene hinzufügen.\n" +"Die Position des Controllerknotens wird automatisch durch den [ARVRServer] " +"aktualisiert. Dies macht diesen Knoten ideal, um Kindknoten zur " +"Visualisierung des Controllers hinzuzufügen." #: doc/classes/ARVRController.xml msgid "" "If active, returns the name of the associated controller if provided by the " "AR/VR SDK used." msgstr "" +"Wenn aktiv, wird der Name des zugehörigen Controllers zurückgegeben, sofern " +"er vom verwendeten AR/VR-SDK bereitgestellt wird." #: doc/classes/ARVRController.xml msgid "" "Returns the hand holding this controller, if known. See [enum " "ARVRPositionalTracker.TrackerHand]." msgstr "" +"Gibt die Hand zurück, die diesen Controller hält, falls bekannt. Siehe [enum " +"ARVRPositionalTracker.TrackerHand]." #: doc/classes/ARVRController.xml #, fuzzy @@ -9802,6 +10541,8 @@ msgid "" "Returns the value of the given axis for things like triggers, touchpads, " "etc. that are embedded into the controller." msgstr "" +"Gibt den Wert der angegebenen Achse für Dinge wie Trigger, Touchpads usw. " +"zurück, die in den Controller eingebettet sind." #: doc/classes/ARVRController.xml msgid "" @@ -9812,12 +10553,22 @@ msgid "" "the AR/VR controllers. This ID is purely offered as information so you can " "link up the controller with its joystick entry." msgstr "" +"Gibt die ID des Joystick-Objekts zurück, das mit diesem verbunden ist. Jeder " +"vom [ARVRServer] verfolgte Controller, der Tasten und Achsen hat, wird auch " +"als Joystick in Godot registriert. Das bedeutet, dass alle normalen Joystick-" +"Verfolgungen und Eingabe-Zuordnungen für Tasten und Achsen auf den AR/VR-" +"Controllern funktionieren werden. Diese ID wird lediglich als Information " +"angeboten, damit Sie den Controller mit seinem Joystick-Eintrag verknüpfen " +"können." #: doc/classes/ARVRController.xml msgid "" "If provided by the [ARVRInterface], this returns a mesh associated with the " "controller. This can be used to visualize the controller." msgstr "" +"Falls von der [ARVRInterface] bereitgestellt, wird ein mit dem Controller " +"verbundenes Netz zurückgegeben. Dieses kann zur Visualisierung des " +"Controllers verwendet werden." #: doc/classes/ARVRController.xml msgid "" @@ -9825,6 +10576,9 @@ msgid "" "pressed. See [enum JoystickList], in particular the [code]JOY_VR_*[/code] " "constants." msgstr "" +"Gibt [code]true[/code] zurück, wenn die Taste bei Index [code]button[/code] " +"gedrückt ist. Siehe [enum JoystickList], insbesondere die [code]JOY_VR_*[/" +"code] Konstanten." #: doc/classes/ARVRController.xml msgid "" @@ -9838,6 +10592,16 @@ msgid "" "When a controller is turned off, its slot is freed. This ensures controllers " "will keep the same ID even when controllers with lower IDs are turned off." msgstr "" +"Die ID des Controllers.\n" +"Eine Controller-ID von 0 ist ungebunden und führt immer zu einem inaktiven " +"Knoten. Die Controller-ID 1 ist für den ersten Controller reserviert, der " +"sich als linker Controller identifiziert, und die ID 2 ist für den ersten " +"Controller reserviert, der sich als rechter Controller identifiziert.\n" +"Für jeden weiteren Controller, den der [ARVRServer] erkennt, wird mit der " +"Controller-ID 3 fortgefahren.\n" +"Wenn ein Controller ausgeschaltet wird, wird sein Steckplatz freigegeben. " +"Dadurch wird sichergestellt, dass die Controller dieselbe ID behalten, auch " +"wenn Controller mit niedrigeren IDs ausgeschaltet werden." #: doc/classes/ARVRController.xml msgid "" @@ -9847,14 +10611,21 @@ msgid "" "This is a useful property to animate if you want the controller to vibrate " "for a limited duration." msgstr "" +"Der Grad, in dem die Steuerung vibriert. Der Bereich reicht von [code]0.0[/" +"code] bis [code]1.0[/code]. Wenn er geändert wird, wird [member " +"ARVRPositionalTracker.rumble] entsprechend aktualisiert.\n" +"Dies ist eine nützliche Eigenschaft zum Animieren, wenn der Controller für " +"eine begrenzte Dauer vibrieren soll." #: doc/classes/ARVRController.xml msgid "Emitted when a button on this controller is pressed." msgstr "" +"Wird ausgesendet, wenn eine Taste auf diesem Steuergerät gedrückt wird." #: doc/classes/ARVRController.xml msgid "Emitted when a button on this controller is released." msgstr "" +"Wird ausgesendet, wenn eine Taste an diesem Controller losgelassen wird." #: doc/classes/ARVRController.xml msgid "" @@ -9862,10 +10633,13 @@ msgid "" "becomes available. Generally speaking this will be a static mesh after " "becoming available." msgstr "" +"Wird ausgesendet, wenn sich das mit dem Controller verknüpfte Netz ändert " +"oder wenn eines verfügbar wird. Im Allgemeinen wird dies ein statisches Mesh " +"sein, nachdem es verfügbar geworden ist." #: doc/classes/ARVRInterface.xml msgid "Base class for an AR/VR interface implementation." -msgstr "" +msgstr "Basisklasse für die Implementierung einer AR/VR-Schnittstelle." #: doc/classes/ARVRInterface.xml msgid "" @@ -9878,6 +10652,15 @@ msgid "" "give us a working setup. You can query the available interfaces through " "[ARVRServer]." msgstr "" +"Diese Klasse muss implementiert werden, um eine AR- oder VR-Plattform für " +"Godot verfügbar zu machen. Diese sollten als C++-Module oder GDNative-Module " +"implementiert werden (beachten Sie, dass für GDNative die Unterklasse " +"ARVRScriptInterface verwendet werden sollte). Ein Teil der Schnittstelle ist " +"für GDScript offengelegt, so dass Sie eine AR- oder VR-Plattform erkennen, " +"aktivieren und konfigurieren können.\n" +"Die Schnittstellen sollten so geschrieben sein, dass man durch einfaches " +"Aktivieren ein funktionierendes Setup erhält. Sie können die verfügbaren " +"Schnittstellen über [ARVRServer] abfragen." #: doc/classes/ARVRInterface.xml msgid "" @@ -9885,22 +10668,31 @@ msgid "" "background, this method returns the feed ID in the [CameraServer] for this " "interface." msgstr "" +"Wenn es sich um eine AR-Schnittstelle handelt, die die Anzeige eines " +"Kamerafeeds als Hintergrund erfordert, gibt diese Methode die Feed-ID im " +"[CameraServer] für diese Schnittstelle zurück." #: doc/classes/ARVRInterface.xml msgid "" "Returns a combination of [enum Capabilities] flags providing information " "about the capabilities of this interface." msgstr "" +"Gibt eine Kombination von [enum Capabilities]-Flags zurück, die " +"Informationen über die Fähigkeiten dieser Schnittstelle liefern." #: doc/classes/ARVRInterface.xml msgid "Returns the name of this interface (OpenVR, OpenHMD, ARKit, etc)." msgstr "" +"Gibt den Namen dieser Schnittstelle zurück (OpenVR, OpenHMD, ARKit, etc.)." #: doc/classes/ARVRInterface.xml msgid "" "Returns the resolution at which we should render our intermediate results " "before things like lens distortion are applied by the VR platform." msgstr "" +"Gibt die Auflösung zurück, mit der wir unsere Zwischenergebnisse rendern " +"sollten, bevor Dinge wie Linsenverzerrungen von der VR-Plattform angewendet " +"werden." #: doc/classes/ARVRInterface.xml msgid "" @@ -9908,6 +10700,9 @@ msgid "" "provide feedback to the user whether there are issues with positional " "tracking." msgstr "" +"Gibt, falls unterstützt, den Status unserer Positionsbestimmung zurück. So " +"können Sie dem Benutzer eine Rückmeldung geben, ob es Probleme mit der " +"Positionsbestimmung gibt." #: doc/classes/ARVRInterface.xml msgid "" @@ -9928,45 +10723,72 @@ msgid "" "wish to do this if you want to track controllers from other platforms. " "However, at this point in time only one interface can render to an HMD." msgstr "" +"Rufen Sie dies auf, um diese Schnittstelle zu initialisieren. Die erste " +"Schnittstelle, die initialisiert wird, wird als primäre Schnittstelle " +"identifiziert und wird für die Rendering-Ausgabe verwendet.\n" +"Nach der Initialisierung der Schnittstelle, die Sie verwenden möchten, " +"müssen Sie den AR/VR-Modus eines Ansichtsfensters aktivieren und das " +"Rendering sollte beginnen.\n" +"[b]Hinweis:[/b] Sie müssen den AR/VR-Modus im Haupt-Viewport für jedes Gerät " +"aktivieren, das die Hauptausgabe von Godot verwendet, z. B. für mobile VR.\n" +"Wenn Sie dies für eine Plattform tun, die ihre eigene Ausgabe verarbeitet " +"(wie OpenVR), zeigt Godot nur ein Auge ohne Verzerrung auf dem Bildschirm " +"an. Alternativ können Sie einen separaten Viewport-Knoten zu Ihrer Szene " +"hinzufügen und AR/VR in diesem Viewport aktivieren. Es wird für die Ausgabe " +"an das HMD verwendet, so dass Sie im Hauptfenster alles tun können, was Sie " +"möchten, z. B. eine separate Kamera als Zuschauerkamera verwenden oder etwas " +"völlig anderes rendern.\n" +"Sie können zusätzliche Schnittstellen aktivieren, die derzeit nicht " +"verwendet werden. Dies kann sinnvoll sein, wenn Sie Controller von anderen " +"Plattformen verfolgen wollen. Zum jetzigen Zeitpunkt kann jedoch nur eine " +"Schnittstelle auf ein HMD gerendert werden." #: doc/classes/ARVRInterface.xml msgid "" "Returns [code]true[/code] if the current output of this interface is in " "stereo." msgstr "" +"Gibt [code]true[/code] zurück, wenn die aktuelle Ausgabe dieser " +"Schnittstelle in Stereo ist." #: doc/classes/ARVRInterface.xml msgid "Turns the interface off." -msgstr "" +msgstr "Schaltet die Schnittstelle aus." #: doc/classes/ARVRInterface.xml msgid "On an AR interface, [code]true[/code] if anchor detection is enabled." msgstr "" +"Auf einer AR-Schnittstelle: [code]true[/code], wenn die Ankererkennung " +"aktiviert ist." #: doc/classes/ARVRInterface.xml msgid "[code]true[/code] if this interface been initialized." -msgstr "" +msgstr "[code]true[/code] wenn diese Schnittstelle initialisiert wurde." #: doc/classes/ARVRInterface.xml msgid "[code]true[/code] if this is the primary interface." -msgstr "" +msgstr "[code]true[/code], wenn dies die primäre Schnittstelle ist." #: doc/classes/ARVRInterface.xml msgid "No ARVR capabilities." -msgstr "" +msgstr "Keine ARVR-Fähigkeiten." #: doc/classes/ARVRInterface.xml msgid "" "This interface can work with normal rendering output (non-HMD based AR)." msgstr "" +"Diese Schnittstelle kann mit normaler Rendering-Ausgabe arbeiten (nicht-HMD-" +"basierte AR)." #: doc/classes/ARVRInterface.xml msgid "This interface supports stereoscopic rendering." -msgstr "" +msgstr "Diese Schnittstelle unterstützt das stereoskopische Rendering." #: doc/classes/ARVRInterface.xml msgid "This interface supports AR (video background and real world tracking)." msgstr "" +"Diese Schnittstelle unterstützt AR (Video-Hintergrund und Real-World-" +"Tracking)." #: doc/classes/ARVRInterface.xml msgid "" @@ -9976,6 +10798,12 @@ msgid "" "[method get_render_targetsize]). Using a separate viewport node frees up the " "main viewport for other purposes." msgstr "" +"Diese Schnittstelle gibt die Daten an ein externes Gerät aus. Wird das " +"Hauptansichtsfenster verwendet, ist die Bildschirmausgabe ein unveränderter " +"Puffer entweder des linken oder des rechten Auges (gestreckt, wenn die Größe " +"des Ansichtsfensters nicht auf das gleiche Seitenverhältnis von [method " +"get_render_targetsize] geändert wird). Die Verwendung eines separaten " +"Ansichtsfenster-Knotens macht das Hauptansichtfenster für andere Zwecke frei." #: doc/classes/ARVRInterface.xml msgid "" @@ -9983,50 +10811,67 @@ msgid "" "information for our camera node or when stereo scopic rendering is not " "supported." msgstr "" +"Mono-Ausgabe, diese wird meist intern verwendet, wenn " +"Positionierungsinformationen für unseren Kameraknoten abgerufen werden oder " +"wenn das stereoskopische Rendering nicht unterstützt wird." #: doc/classes/ARVRInterface.xml msgid "" "Left eye output, this is mostly used internally when rendering the image for " "the left eye and obtaining positioning and projection information." msgstr "" +"Die Ausgabe für das linke Auge wird hauptsächlich intern verwendet, um das " +"Bild für das linke Auge zu rendern und Informationen zur Positionierung und " +"Projektion zu erhalten." #: doc/classes/ARVRInterface.xml msgid "" "Right eye output, this is mostly used internally when rendering the image " "for the right eye and obtaining positioning and projection information." msgstr "" +"Die Ausgabe für das rechte Auge wird hauptsächlich intern verwendet, um das " +"Bild für das rechte Auge zu rendern und Informationen zur Positionierung und " +"Projektion zu erhalten." #: doc/classes/ARVRInterface.xml msgid "Tracking is behaving as expected." -msgstr "" +msgstr "Das Tracking verhält sich wie erwartet." #: doc/classes/ARVRInterface.xml msgid "" "Tracking is hindered by excessive motion (the player is moving faster than " "tracking can keep up)." msgstr "" +"Das Tracking wird durch übermäßige Bewegung behindert (der Spieler bewegt " +"sich schneller, als die Verfolgung mithalten kann)." #: doc/classes/ARVRInterface.xml msgid "" "Tracking is hindered by insufficient features, it's too dark (for camera-" "based tracking), player is blocked, etc." msgstr "" +"Das Tracking wird durch unzureichende Fähigkeiten behindert, es ist zu " +"dunkel (für kamerabasiertes Tracking), der Spieler ist blockiert, usw." #: doc/classes/ARVRInterface.xml msgid "" "We don't know the status of the tracking or this interface does not provide " "feedback." msgstr "" +"Wir kennen den Status der Nachverfolgung nicht, oder diese Schnittstelle " +"gibt keine Rückmeldung." #: doc/classes/ARVRInterface.xml msgid "" "Tracking is not functional (camera not plugged in or obscured, lighthouses " "turned off, etc.)." msgstr "" +"Das Tracking funktioniert nicht (Kamera nicht eingesteckt oder verdeckt, " +"Lighthouses ausgeschaltet usw.)." #: modules/gdnative/doc_classes/ARVRInterfaceGDNative.xml msgid "GDNative wrapper for an ARVR interface." -msgstr "" +msgstr "GDNative-Wrapper für eine ARVR-Schnittstelle." #: modules/gdnative/doc_classes/ARVRInterfaceGDNative.xml msgid "" @@ -10034,10 +10879,14 @@ msgid "" "To use a GDNative ARVR interface, simply instantiate this object and set " "your GDNative library containing the ARVR interface implementation." msgstr "" +"Dies ist eine Wrapper-Klasse für GDNative-Implementierungen der ARVR-" +"Schnittstelle. Um eine GDNative-ARVR-Schnittstelle zu verwenden, " +"instanziieren Sie einfach dieses Objekt und definieren Sie Ihre GDNative-" +"Bibliothek, die die ARVR-Schnittstellenimplementierung enthält." #: doc/classes/ARVROrigin.xml msgid "The origin point in AR/VR." -msgstr "" +msgstr "Der Ursprungspunkt in AR/VR." #: doc/classes/ARVROrigin.xml msgid "" @@ -10054,6 +10903,21 @@ msgid "" "be a child node of this car. Or, if you're implementing a teleport system to " "move your character, you should change the position of this node." msgstr "" +"Dies ist ein spezieller Knoten innerhalb des AR/VR-Systems, der die " +"physische Position des Zentrums unseres Tracking-Raums der virtuellen " +"Position innerhalb unserer Spielwelt zuordnet.\n" +"Es sollte nur einen dieser Knoten in Ihrer Szene geben und Sie müssen einen " +"haben. Alle ARVRCamera-, ARVRController- und ARVRAnchor-Knoten sollten " +"direkte Kinder dieses Knotens sein, damit das räumliche Tracking korrekt " +"funktioniert.\n" +"Es ist die Position dieses Knotens, die du aktualisierst, wenn dein " +"Charakter sich durch deine Spielwelt bewegen muss, während wir uns in der " +"realen Welt nicht bewegen. Die Bewegung in der realen Welt erfolgt immer in " +"Bezug auf diesen Ursprungspunkt.\n" +"Wenn deine Figur zum Beispiel ein Auto fährt, sollte der ARVROrigin-Knoten " +"ein untergeordneter Knoten dieses Autos sein. Oder wenn du ein Teleport-" +"System implementierst, um deinen Charakter zu bewegen, solltest du die " +"Position dieses Knotens ändern." #: doc/classes/ARVROrigin.xml msgid "" @@ -10061,10 +10925,14 @@ msgid "" "assume a scale of 1 game world unit = 1 real world meter.\n" "[b]Note:[/b] This method is a passthrough to the [ARVRServer] itself." msgstr "" +"Ermöglicht es Ihnen, den Maßstab an die Einheiten Ihres Spiels anzupassen. " +"Die meisten AR/VR-Plattformen gehen von einem Maßstab von 1 Einheit der " +"Spielwelt = 1 Meter der realen Welt aus.\n" +"[b]Hinweis:[/b] Diese Methode ist ein Passthrough zum [ARVRServer] selbst." #: doc/classes/ARVRPositionalTracker.xml msgid "A tracked object." -msgstr "" +msgstr "Ein getracktes Objekt." #: doc/classes/ARVRPositionalTracker.xml msgid "" @@ -10079,35 +10947,53 @@ msgid "" "hood objects that make this all work. These are mostly exposed so that " "GDNative-based interfaces can interact with them." msgstr "" +"Eine Instanz dieses Objekts stellt ein Gerät dar, das verfolgt wird, z. B. " +"einen Controller oder Ankerpunkt. HMDs werden hier nicht dargestellt, da sie " +"intern gehandhabt werden.\n" +"Wenn Controller eingeschaltet werden und die AR/VR-Schnittstelle sie " +"erkennt, werden Instanzen dieses Objekts automatisch zur Liste der aktiven " +"Tracking-Objekte hinzugefügt, die über den [ARVRServer] zugänglich sind.\n" +"Der [ARVRController] und der [ARVRAnchor] verbrauchen beide Objekte dieses " +"Typs und sollten in Ihrem Projekt verwendet werden. Die Positions-Tracker " +"sind nur Objekte, die unter der Haube liegen und dafür sorgen, dass das " +"alles funktioniert. Sie sind meist offengelegt, damit GDNative-basierte " +"Schnittstellen mit ihnen interagieren können." #: doc/classes/ARVRPositionalTracker.xml msgid "" "Returns the hand holding this tracker, if known. See [enum TrackerHand] " "constants." msgstr "" +"Gibt die Hand zurück, die diesen Tracker hält, falls bekannt. Siehe [enum " +"TrackerHand] Konstanten." #: doc/classes/ARVRPositionalTracker.xml msgid "" "If this is a controller that is being tracked, the controller will also be " "represented by a joystick entry with this ID." msgstr "" +"Wenn es sich um einen Controller handelt, der verfolgt wird, wird der " +"Controller auch durch einen Joystick-Eintrag mit dieser ID dargestellt." #: doc/classes/ARVRPositionalTracker.xml msgid "" "Returns the mesh related to a controller or anchor point if one is available." msgstr "" +"Gibt das Netz zurück, das mit einem Controller oder Ankerpunkt verbunden " +"ist, falls ein solcher vorhanden ist." #: doc/classes/ARVRPositionalTracker.xml msgid "Returns the controller or anchor point's name if available." msgstr "" +"Gibt den Namen des Controllers oder des Ankerpunkts zurück, falls vorhanden." #: doc/classes/ARVRPositionalTracker.xml msgid "Returns the controller's orientation matrix." -msgstr "" +msgstr "Gibt die Orientierungsmatrix des Controllers zurück." #: doc/classes/ARVRPositionalTracker.xml msgid "Returns the world-space controller position." -msgstr "" +msgstr "Gibt die Position des Controllers im Raum zurück." #: doc/classes/ARVRPositionalTracker.xml msgid "" @@ -10115,60 +11001,75 @@ msgid "" "tracker type and matches the ID you need to specify for nodes such as the " "[ARVRController] and [ARVRAnchor] nodes." msgstr "" +"Gibt die interne Tracker-ID zurück. Diese identifiziert den Tracker " +"eindeutig pro Tracker-Typ und entspricht der ID, die Sie für Knoten wie die " +"[ARVRController]- und [ARVRAnchor]-Knoten angeben müssen." #: doc/classes/ARVRPositionalTracker.xml msgid "Returns [code]true[/code] if this device tracks orientation." msgstr "" +"Gibt [code]true[/code] zurück, wenn dieses Gerät die Ausrichtung verfolgt." #: doc/classes/ARVRPositionalTracker.xml msgid "Returns [code]true[/code] if this device tracks position." msgstr "" +"Gibt [code]true[/code] zurück, wenn dieses Gerät die Position verfolgt." #: doc/classes/ARVRPositionalTracker.xml msgid "Returns the transform combining this device's orientation and position." msgstr "" +"Gibt die Transformation zurück, die die Ausrichtung und Position dieses " +"Geräts kombiniert." #: doc/classes/ARVRPositionalTracker.xml msgid "Returns the tracker's type." -msgstr "" +msgstr "Gibt den Typ des Tracker zurück." #: doc/classes/ARVRPositionalTracker.xml msgid "" "The degree to which the tracker rumbles. Ranges from [code]0.0[/code] to " "[code]1.0[/code] with precision [code].01[/code]." msgstr "" +"Der Grad, wie stark der Tracker wackelt. Der Bereich reicht von [code]0.0[/" +"code] bis [code]1.0[/code] mit einer Genauigkeit von [code].01[/code]." #: doc/classes/ARVRPositionalTracker.xml msgid "The hand this tracker is held in is unknown or not applicable." msgstr "" +"Die Hand, in der dieser Tracker gehalten wird, ist unbekannt oder nicht " +"anwendbar." #: doc/classes/ARVRPositionalTracker.xml msgid "This tracker is the left hand controller." -msgstr "" +msgstr "Dieser Tracker ist der Controller für die linke Hand." #: doc/classes/ARVRPositionalTracker.xml msgid "This tracker is the right hand controller." -msgstr "" +msgstr "Dieser Tracker ist der Controller für die rechte Hand." #: doc/classes/ARVRServer.xml msgid "Server for AR and VR features." -msgstr "" +msgstr "Server für AR- und VR-Funktionen." #: doc/classes/ARVRServer.xml msgid "" "The AR/VR server is the heart of our Advanced and Virtual Reality solution " "and handles all the processing." msgstr "" +"Der AR/VR-Server ist das Herzstück unserer Advanced and Virtual Reality-" +"Lösung und übernimmt die gesamte Verarbeitung." #: doc/classes/ARVRServer.xml msgid "Registers an [ARVRInterface] object." -msgstr "" +msgstr "Registriert ein [ARVRInterface]-Objekt." #: doc/classes/ARVRServer.xml msgid "" "Registers a new [ARVRPositionalTracker] that tracks a spatial location in " "real space." msgstr "" +"Registriert einen neuen [ARVRPositionalTracker], der eine räumliche Position " +"im realen Raum verfolgt." #: doc/classes/ARVRServer.xml msgid "" @@ -10192,11 +11093,34 @@ msgid "" "button on a controller for a short period of time, or when implementing a " "teleport mechanism." msgstr "" +"Das ist eine wichtige Funktion, die man richtig verstehen muss. AR- und VR-" +"Plattformen gehen alle etwas anders mit der Positionierung um.\n" +"Bei Plattformen, die kein räumliches Tracking bieten, ist unser " +"Ursprungspunkt (0,0,0) die Position unseres HMD, aber Sie haben wenig " +"Kontrolle über die Richtung, in die der Spieler in der realen Welt blickt.\n" +"Bei Plattformen, die räumliches Tracking bieten, hängt unser Ausgangspunkt " +"sehr stark vom System ab. Bei OpenVR ist unser Ausgangspunkt in der Regel " +"das Zentrum des Tracking-Raums, also auf dem Boden. Bei anderen Plattformen " +"ist es oft die Position der Tracking-Kamera.\n" +"Mit dieser Methode können Sie Ihren Tracker auf die Position des HMD " +"zentrieren. Dabei wird die aktuelle Position des HMD verwendet, um alle " +"Tracking-Daten anzupassen; im Wesentlichen wird die reale Welt an die " +"aktuelle Position des Spielers in der Spielwelt angepasst.\n" +"Damit diese Methode brauchbare Ergebnisse liefert, müssen Tracking-" +"Informationen verfügbar sein. Dies dauert oft ein paar Frames nach dem Start " +"des Spiels.\n" +"Sie sollten diese Methode aufrufen, nachdem ein paar Sekunden vergangen " +"sind. Zum Beispiel, wenn der Benutzer eine Neuausrichtung der Anzeige " +"anfordert, indem er eine bestimmte Taste auf einem Controller für eine kurze " +"Zeitspanne gedrückt hält, oder wenn er einen Teleportmechanismus " +"implementiert." #: doc/classes/ARVRServer.xml msgid "" "Clears our current primary interface if it is set to the provided interface." msgstr "" +"Löscht unsere aktuelle primäre Schnittstelle, wenn sie auf die angegebene " +"Schnittstelle eingestellt ist." #: doc/classes/ARVRServer.xml msgid "" @@ -10204,15 +11128,20 @@ msgid "" "capabilities of an AR/VR platform, you can find the interface for that " "platform by name and initialize it." msgstr "" +"Findet eine Schnittstelle anhand ihres Namens. Wenn Ihr Projekt z. B. die " +"Funktionen einer AR/VR-Plattform nutzt, können Sie die Schnittstelle für " +"diese Plattform anhand ihres Namens finden und sie initialisieren." #: doc/classes/ARVRServer.xml msgid "Returns the primary interface's transformation." -msgstr "" +msgstr "Gibt die Transformation der primären Schnittstelle zurück." #: doc/classes/ARVRServer.xml msgid "" "Returns the interface registered at a given index in our list of interfaces." msgstr "" +"Gibt die Schnittstelle zurück, die unter einem bestimmten Index in unserer " +"Liste der Schnittstellen registriert ist." #: doc/classes/ARVRServer.xml msgid "" @@ -10222,11 +11151,18 @@ msgid "" "try to initialize each interface and use the first one that returns " "[code]true[/code]." msgstr "" +"Gibt die Anzahl der derzeit beim AR/VR-Server registrierten Schnittstellen " +"zurück. Wenn Ihr Projekt mehrere AR/VR-Plattformen unterstützt, können Sie " +"die verfügbaren Schnittstellen durchsehen und dem Benutzer entweder eine " +"Auswahl präsentieren oder einfach versuchen, jede Schnittstelle zu " +"initialisieren und die erste zu verwenden, die [code]true[/code] zurückgibt." #: doc/classes/ARVRServer.xml msgid "" "Returns a list of available interfaces the ID and name of each interface." msgstr "" +"Liefert eine Liste der verfügbaren Schnittstellen, die ID und den Namen " +"jeder Schnittstelle." #: doc/classes/ARVRServer.xml msgid "" @@ -10234,6 +11170,9 @@ msgid "" "the AR/VR eyes to [VisualServer]. The value comes from an internal call to " "[method OS.get_ticks_usec]." msgstr "" +"Gibt den absoluten Zeitstempel (in μs) der letzten [ARVRServer]-Übertragung " +"der AR/VR-Augen an [VisualServer] zurück. Der Wert stammt aus einem internen " +"Aufruf der [Methode OS.get_ticks_usec]." #: doc/classes/ARVRServer.xml msgid "" @@ -10241,6 +11180,9 @@ msgid "" "difference between [method get_last_commit_usec] and [method " "get_last_process_usec] when committing." msgstr "" +"Gibt die Dauer (in μs) des letzten Frames zurück. Dies wird als Differenz " +"zwischen [method get_last_commit_usec] und [method get_last_process_usec] " +"beim Commit berechnet." #: doc/classes/ARVRServer.xml msgid "" @@ -10248,46 +11190,55 @@ msgid "" "callback. The value comes from an internal call to [method OS." "get_ticks_usec]." msgstr "" +"Gibt den absoluten Zeitstempel (in μs) des letzten [ARVRServer]-Prozess-" +"Callbacks zurück. Der Wert stammt aus einem internen Aufruf der [Methode OS." +"get_ticks_usec]." #: doc/classes/ARVRServer.xml msgid "" "Returns the reference frame transform. Mostly used internally and exposed " "for GDNative build interfaces." msgstr "" +"Gibt die Transformation des Referenzrahmens zurück. Wird meist intern " +"verwendet und für GDNative-Build-Schnittstellen bereitgestellt." #: doc/classes/ARVRServer.xml msgid "Returns the positional tracker at the given ID." -msgstr "" +msgstr "Gibt den Positionstracker an der angegebenen ID zurück." #: doc/classes/ARVRServer.xml msgid "Returns the number of trackers currently registered." -msgstr "" +msgstr "Gibt die Anzahl der derzeit registrierten Tracker zurück." #: doc/classes/ARVRServer.xml msgid "Removes this interface." -msgstr "" +msgstr "Entfernt diese Schnittstelle." #: doc/classes/ARVRServer.xml msgid "Removes this positional tracker." -msgstr "" +msgstr "Entfernt diesen Positionstracker." #: doc/classes/ARVRServer.xml msgid "The primary [ARVRInterface] currently bound to the [ARVRServer]." msgstr "" +"Das primäre [ARVRInterface], das derzeit an den [ARVRServer] gebunden ist." #: doc/classes/ARVRServer.xml msgid "" "Allows you to adjust the scale to your game's units. Most AR/VR platforms " "assume a scale of 1 game world unit = 1 real world meter." msgstr "" +"Ermöglicht es Ihnen, den Maßstab an die Einheiten Ihres Spiels anzupassen. " +"Die meisten AR/VR-Plattformen gehen von einem Maßstab von 1 Einheit der " +"Spielwelt = 1 Meter der realen Welt aus." #: doc/classes/ARVRServer.xml msgid "Emitted when a new interface has been added." -msgstr "" +msgstr "Wird ausgesendet, wenn eine neue Schnittstelle hinzugefügt wurde." #: doc/classes/ARVRServer.xml msgid "Emitted when an interface is removed." -msgstr "" +msgstr "Wird ausgesendet, wenn eine Schnittstelle entfernt wird." #: doc/classes/ARVRServer.xml msgid "" @@ -10296,6 +11247,11 @@ msgid "" "important to react to this signal to add the appropriate [ARVRController] or " "[ARVRAnchor] nodes related to this new tracker." msgstr "" +"Wird ausgesendet, wenn ein neuer Tracker hinzugefügt wurde. Wenn Sie keine " +"feste Anzahl von Controllern verwenden oder wenn Sie [ARVRAnchor]s für eine " +"AR-Lösung verwenden, ist es wichtig, auf dieses Signal zu reagieren, um die " +"entsprechenden [ARVRController]- oder [ARVRAnchor]-Knoten für diesen neuen " +"Tracker hinzuzufügen." #: doc/classes/ARVRServer.xml msgid "" @@ -10305,30 +11261,36 @@ msgid "" "available (i.e. a new controller is switched on that takes the place of the " "previous one)." msgstr "" +"Wird ausgesendet, wenn ein Tracker entfernt wird. Sie sollten alle " +"[ARVRController]- oder [ARVRAnchor]-Punkte entfernen, falls zutreffend. Dies " +"ist nicht zwingend erforderlich, die Knoten werden einfach inaktiv und " +"werden wieder aktiv, wenn ein neuer Tracker verfügbar wird (d. h. ein neuer " +"Controller wird eingeschaltet, der den vorherigen ersetzt)." #: doc/classes/ARVRServer.xml msgid "The tracker tracks the location of a controller." -msgstr "" +msgstr "Der Tracker tracktden Standort eines Controllers." #: doc/classes/ARVRServer.xml msgid "The tracker tracks the location of a base station." -msgstr "" +msgstr "Der Tracker trackt den Standort einer Basisstation." #: doc/classes/ARVRServer.xml msgid "The tracker tracks the location and size of an AR anchor." -msgstr "" +msgstr "Der Tracker trackt die Position und Größe eines AR-Ankers." #: doc/classes/ARVRServer.xml msgid "Used internally to filter trackers of any known type." -msgstr "" +msgstr "Wird intern verwendet, um Tracker jedes bekannten Typs zu filtern." #: doc/classes/ARVRServer.xml msgid "Used internally if we haven't set the tracker type yet." msgstr "" +"Wird intern verwendet, wenn wir den Tracker-Typ noch nicht festgelegt haben." #: doc/classes/ARVRServer.xml msgid "Used internally to select all trackers." -msgstr "" +msgstr "Wird intern verwendet, um alle Tracker auszuwählen." #: doc/classes/ARVRServer.xml msgid "" @@ -10336,22 +11298,32 @@ msgid "" "user is looking to in the real world. The user will look dead ahead in the " "virtual world." msgstr "" +"Vollständige Rückstellung der Ausrichtung des HMD. Es spielt keine Rolle, in " +"welche Richtung der Benutzer in der realen Welt schaut. Der Benutzer blickt " +"in der virtuellen Welt genau nach vorne." #: doc/classes/ARVRServer.xml msgid "" "Resets the orientation but keeps the tilt of the device. So if we're looking " "down, we keep looking down but heading will be reset." msgstr "" +"Setzt die Ausrichtung zurück, behält aber die Neigung des Geräts bei. Wenn " +"wir also nach unten schauen, schauen wir weiterhin nach unten, aber die " +"Ausrichtung wird zurückgesetzt." #: doc/classes/ARVRServer.xml msgid "" "Does not reset the orientation of the HMD, only the position of the player " "gets centered." msgstr "" +"Die Ausrichtung des HMD wird nicht zurückgesetzt, nur die Position des " +"Spielers wird zentriert." #: doc/classes/AspectRatioContainer.xml msgid "Container that preserves its child controls' aspect ratio." msgstr "" +"Container, der das Seitenverhältnis seiner untergeordneten Steuerelemente " +"beibehält." #: doc/classes/AspectRatioContainer.xml msgid "" @@ -10360,6 +11332,11 @@ msgid "" "the container size is dynamic and the contents' size needs to adjust " "accordingly without losing proportions." msgstr "" +"Ordnet untergeordnete Steuerelemente so an, dass ihr Seitenverhältnis " +"automatisch erhalten bleibt, wenn die Größe des Containers geändert wird. " +"Löst das Problem, dass die Größe des Containers dynamisch ist und die Größe " +"des Inhalts entsprechend angepasst werden muss, ohne dass die Proportionen " +"verloren gehen." #: doc/classes/AspectRatioContainer.xml doc/classes/BoxContainer.xml #: doc/classes/CenterContainer.xml doc/classes/Container.xml @@ -10375,16 +11352,21 @@ msgstr "Tabulierter Container." #: doc/classes/AspectRatioContainer.xml msgid "Specifies the horizontal relative position of child controls." msgstr "" +"Gibt die horizontale relative Position der untergeordneten Steuerelemente an." #: doc/classes/AspectRatioContainer.xml msgid "Specifies the vertical relative position of child controls." msgstr "" +"Gibt die vertikale relative Position der untergeordneten Steuerelemente an." #: doc/classes/AspectRatioContainer.xml msgid "" "The aspect ratio to enforce on child controls. This is the width divided by " "the height. The ratio depends on the [member stretch_mode]." msgstr "" +"Das Seitenverhältnis, das für untergeordnete Steuerelemente erzwungen werden " +"soll. Dies ist die Breite geteilt durch die Höhe. Das Verhältnis hängt von " +"dem [member stretch_mode] ab." #: doc/classes/AspectRatioContainer.xml #, fuzzy @@ -10396,18 +11378,25 @@ msgid "" "The height of child controls is automatically adjusted based on the width of " "the container." msgstr "" +"Die Höhe der untergeordneten Steuerelemente wird automatisch an die Breite " +"des Containers angepasst." #: doc/classes/AspectRatioContainer.xml msgid "" "The width of child controls is automatically adjusted based on the height of " "the container." msgstr "" +"Die Breite der untergeordneten Steuerelemente wird automatisch an die Höhe " +"des Containers angepasst." #: doc/classes/AspectRatioContainer.xml msgid "" "The bounding rectangle of child controls is automatically adjusted to fit " "inside the container while keeping the aspect ratio." msgstr "" +"Das Begrenzungsrechteck der untergeordneten Steuerelemente wird automatisch " +"so angepasst, dass es in den Container passt, wobei das Seitenverhältnis " +"beibehalten wird." #: doc/classes/AspectRatioContainer.xml msgid "" @@ -10418,25 +11407,38 @@ msgid "" "and [member Control.rect_clip_content] is enabled, this allows to show only " "the container's area restricted by its own bounding rectangle." msgstr "" +"Die Breite und Höhe der untergeordneten Steuerelemente wird automatisch so " +"angepasst, dass ihr Begrenzungsrechteck den gesamten Bereich des Containers " +"abdeckt und das Seitenverhältnis beibehalten wird.\n" +"Wenn das Begrenzungsrechteck der untergeordneten Steuerelemente die Größe " +"des Containers überschreitet und [member Control.rect_clip_content] " +"aktiviert ist, ermöglicht dies die Anzeige nur des Bereichs des Containers, " +"der durch sein eigenes Begrenzungsrechteck begrenzt ist." #: doc/classes/AspectRatioContainer.xml msgid "" "Aligns child controls with the beginning (left or top) of the container." msgstr "" +"Richtet untergeordnete Steuerelemente am Anfang (links oder oben) des " +"Containers aus." #: doc/classes/AspectRatioContainer.xml msgid "Aligns child controls with the center of the container." -msgstr "" +msgstr "Richtet untergeordnete Steuerelemente an der Mitte des Containers aus." #: doc/classes/AspectRatioContainer.xml msgid "Aligns child controls with the end (right or bottom) of the container." msgstr "" +"Richtet untergeordnete Steuerelemente am Ende (rechts oder unten) des " +"Containers aus." #: doc/classes/AStar.xml msgid "" "An implementation of A* to find the shortest paths among connected points in " "space." msgstr "" +"Eine Implementierung von A*, um die kürzesten Wege zwischen verbundenen " +"Punkten im Raum zu finden." #: doc/classes/AStar.xml msgid "" @@ -10481,12 +11483,59 @@ msgid "" "[code]1.0[/code], then this equals the sum of Euclidean distances of all " "segments in the path." msgstr "" +"A* ( A Star) ist ein Computeralgorithmus, der häufig bei der Pfadfindung und " +"der Durchquerung von Graphen eingesetzt wird. Dabei werden kurze Pfade " +"zwischen Vertices (Punkten) über eine bestimmte Menge von Kanten (Segmenten) " +"gezeichnet. Aufgrund seiner Leistungsfähigkeit und Genauigkeit ist er weit " +"verbreitet. Die A*-Implementierung von Godot verwendet standardmäßig Punkte " +"im dreidimensionalen Raum und euklidische Abstände.\n" +"Sie müssen Punkte manuell mit [method add_point] hinzufügen und Segmente " +"manuell mit [method connect_points] erstellen. Anschließend können Sie mit " +"der Funktion [method are_points_connected] prüfen, ob es einen Pfad zwischen " +"zwei Punkten gibt, mit [method get_id_path] einen Pfad mit Indizes oder mit " +"[method get_point_path] einen Pfad mit tatsächlichen Koordinaten erhalten.\n" +"Es ist auch möglich, nicht-euklidische Distanzen zu verwenden. Erstellen Sie " +"dazu eine Klasse, die [code]AStar[/code] erweitert und überschreiben Sie die " +"Methoden [method _compute_cost] und [method _estimate_cost]. Beide nehmen " +"zwei Indizes und geben eine Länge zurück, wie im folgenden Beispiel gezeigt " +"wird.\n" +"[codeblock]\n" +"class MyAStar:\n" +" extends AStar\n" +"\n" +" func _compute_cost(u, v):\n" +" return abs(u - v)\n" +"\n" +" func _estimate_cost(u, v):\n" +" return min(0, abs(u - v) - 1)\n" +"[/codeblock]\n" +"Die [method_estimate_cost] sollte eine Untergrenze des Abstands zurückgeben, " +"d.h. [code]_estimate_cost(u, v) <= _compute_cost(u, v)[/code]. Dies dient " +"als Hinweis für den Algorithmus, da die benutzerdefinierten " +"[code]_compute_cost[/code] möglicherweise sehr rechenintensiv sind. Wenn " +"dies nicht der Fall ist, sollte [method _estimate_cost] denselben Wert wie " +"[method _compute_cost] zurückgeben, um dem Algorithmus die genauesten " +"Informationen zu liefern.\n" +"Wenn die Standardmethoden [method _estimate_cost] und [method _compute_cost] " +"verwendet werden oder wenn die mitgelieferte Methode [method _estimate_cost] " +"eine untere Grenze der Kosten zurückgibt, dann sind die von A* " +"zurückgegebenen Pfade die Pfade mit den niedrigsten Kosten. Dabei sind die " +"Kosten eines Pfades gleich der Summe der [method _compute_cost]-Ergebnisse " +"aller Segmente des Pfades multipliziert mit den [code]weight_scale[/code]s " +"der Endpunkte der jeweiligen Segmente. Wenn die Standardmethoden verwendet " +"werden und die [code]weight_scale[/code]s aller Punkte auf [code]1.0[/code] " +"gesetzt werden, dann entspricht dies der Summe der euklidischen Abstände " +"aller Segmente im Pfad." #: doc/classes/AStar.xml msgid "" "Called when computing the cost between two connected points.\n" "Note that this function is hidden in the default [code]AStar[/code] class." msgstr "" +"Wird aufgerufen, wenn die Kosten zwischen zwei verbundenen Punkten berechnet " +"werden.\n" +"Beachten Sie, dass diese Funktion in der Standardklasse [code]AStar[/code] " +"verborgen ist." #: doc/classes/AStar.xml msgid "" @@ -10494,6 +11543,10 @@ msgid "" "point.\n" "Note that this function is hidden in the default [code]AStar[/code] class." msgstr "" +"Wird aufgerufen, wenn die Kosten zwischen einem Punkt und dem Endpunkt des " +"Pfades geschätzt werden.\n" +"Beachten Sie, dass diese Funktion in der Standardklasse [code]AStar[/code] " +"verborgen ist." #: doc/classes/AStar.xml msgid "" @@ -10513,6 +11566,21 @@ msgid "" "If there already exists a point for the given [code]id[/code], its position " "and weight scale are updated to the given values." msgstr "" +"Fügt einen neuen Punkt an der angegebenen Position mit dem angegebenen " +"Bezeichner hinzu. Die [code]id[/code] muss 0 oder größer sein, und die " +"[code]weight_scale[/code] muss 0,0 oder größer sein.\n" +"Der [code]weight_scale[/code] wird mit dem Ergebnis von [method " +"_compute_cost] multipliziert, um die Gesamtkosten der Reise über ein Segment " +"von einem benachbarten Punkt zu diesem Punkt zu ermitteln. Unter sonst " +"gleichen Bedingungen bevorzugt der Algorithmus also Punkte mit niedrigeren " +"[code]weight_scale[/code]s, um einen Pfad zu bilden.\n" +"[codeblock]\n" +"var astar = AStar.new()\n" +"astar.add_point(1, Vector3(1, 0, 0), 4) # Fügt den Punkt (1, 0, 0) mit " +"weight_scale 4 und id 1 hinzu\n" +"[/codeblock]\n" +"Wenn es bereits einen Punkt für die angegebene [code]id[/code] gibt, werden " +"seine Position und Gewichtung auf die angegebenen Werte aktualisiert" #: doc/classes/AStar.xml msgid "" @@ -10520,10 +11588,14 @@ msgid "" "[code]bidirectional[/code] is [code]false[/code], returns whether movement " "from [code]id[/code] to [code]to_id[/code] is possible through this segment." msgstr "" +"Gibt zurück, ob die beiden angegebenen Punkte direkt durch ein Segment " +"verbunden sind. Wenn [code]bidirectional[/code] [code]false[/code] ist, wird " +"zurückgegeben, ob eine Bewegung von [code]id[/code] nach [code]to_id[/code] " +"durch dieses Segment möglich ist." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "Clears all the points and segments." -msgstr "" +msgstr "Löscht alle Punkte und Segmente." #: doc/classes/AStar.xml msgid "" @@ -10537,6 +11609,16 @@ msgid "" "astar.connect_points(1, 2, false)\n" "[/codeblock]" msgstr "" +"Erzeugt ein Segment zwischen den angegebenen Punkten. Wenn " +"[code]bidirectional[/code] [code]false[/code] ist, ist nur die Bewegung von " +"[code]id[/code] nach [code]to_id[/code] erlaubt, nicht die umgekehrte " +"Richtung.\n" +"[codeblock]\n" +"var astar = AStar.new()\n" +"astar.add_point(1, Vector3(1, 1, 0))\n" +"astar.add_point(2, Vector3(0, 5, 0))\n" +"astar.connect_points(1, 2, false)\n" +"[/codeblock]" #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" @@ -10544,10 +11626,15 @@ msgid "" "is [code]false[/code], only movement from [code]id[/code] to [code]to_id[/" "code] is prevented, and a unidirectional segment possibly remains." msgstr "" +"Löscht das Segment zwischen den angegebenen Punkten. Wenn " +"[code]bidirectional[/code] [code]false[/code] ist, wird nur die Bewegung von " +"[code]id[/code] nach [code]to_id[/code] verhindert, und es bleibt " +"möglicherweise ein unidirektionales Segment übrig." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "Returns the next available point ID with no point associated to it." msgstr "" +"Gibt die nächste verfügbare Punkte-ID zurück, der kein Punkt zugeordnet ist." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" @@ -10558,6 +11645,12 @@ msgid "" "the one with the smallest ID will be returned, ensuring a deterministic " "result." msgstr "" +"Gibt die ID des Punktes zurück, der [code]to_position[/code] am nächsten " +"liegt, optional unter Berücksichtigung deaktivierter Punkte. Gibt [code]-1[/" +"code] zurück, wenn es keine Punkte im Punktepool gibt.\n" +"[b]Hinweis:[/b] Wenn mehrere Punkte der [code]to_position[/code] am nächsten " +"liegen, wird der Punkt mit der kleinsten ID zurückgegeben, um ein " +"deterministisches Ergebnis zu gewährleisten." #: doc/classes/AStar.xml msgid "" @@ -10574,6 +11667,19 @@ msgid "" "The result is in the segment that goes from [code]y = 0[/code] to [code]y = " "5[/code]. It's the closest position in the segment to the given point." msgstr "" +"Gibt die nächstgelegene Position zu [code]to_position[/code] zurück, die " +"sich innerhalb eines Segments zwischen zwei verbundenen Punkten befindet.\n" +"[codeblock]\n" +"var astar = AStar.new()\n" +"astar.add_point(1, Vector3(0, 0, 0))\n" +"astar.add_point(2, Vector3(0, 5, 0))\n" +"astar.connect_points(1, 2)\n" +"var res = astar.get_closest_position_in_segment(Vector3(3, 3, 0)) # Gibt (0, " +"3, 0) zurück\n" +"[/codeblock]\n" +"Das Ergebnis liegt in dem Segment, das von [code]y = 0[/code] bis [code]y = " +"5[/code] reicht. Es ist die Position im Segment, die dem angegebenen Punkt " +"am nächsten liegt." #: doc/classes/AStar.xml msgid "" @@ -10598,12 +11704,34 @@ msgid "" "4, 3][/code] instead, because now even though the distance is longer, it's " "\"easier\" to get through point 4 than through point 2." msgstr "" +"Gibt ein Array mit den IDs der Punkte zurück, die den von AStar gefundenen " +"Pfad zwischen den angegebenen Punkten bilden. Das Array ist vom Startpunkt " +"bis zum Endpunkt des Pfades geordnet.\n" +"[codeblock]\n" +"var astar = AStar.new()\n" +"astar.add_point(1, Vector3(0, 0, 0))\n" +"astar.add_point(2, Vector3(0, 1, 0), 1) # Standartgewichtung ist 1\n" +"astar.add_point(3, Vector3(1, 1, 0))\n" +"astar.add_point(4, Vector3(2, 0, 0))\n" +"\n" +"astar.connect_points(1, 2, false)\n" +"astar.connect_points(2, 3, false)\n" +"astar.connect_points(4, 3, false)\n" +"astar.connect_points(1, 4, false)\n" +"\n" +"var res = astar.get_id_path(1, 3) # Gibt [1, 2, 3] zurück\n" +"[/codeblock]\n" +"Wenn du die Gewichtung des 2. Punktes auf 3 änderst, wird das Ergebnis " +"stattdessen [code][1, 4, 3][/code] sein, weil es jetzt, obwohl die Strecke " +"länger ist, \"einfacher\" ist, durch Punkt 4 zu kommen als durch Punkt 2." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" "Returns the capacity of the structure backing the points, useful in " "conjunction with [code]reserve_space[/code]." msgstr "" +"Gibt die Kapazität der Struktur zurück, in der die Punkte gespeichert sind, " +"nützlich in Verbindung mit [code]reserve_space[/code]." #: doc/classes/AStar.xml msgid "" @@ -10622,10 +11750,25 @@ msgid "" "var neighbors = astar.get_point_connections(1) # Returns [2, 3]\n" "[/codeblock]" msgstr "" +"Gibt ein Array mit den IDs der Punkte zurück, die die Verbindung mit dem " +"angegebenen Punkt bilden.\n" +"[codeblock]\n" +"var astar = AStar.new()\n" +"astar.add_point(1, Vector3(0, 0, 0))\n" +"astar.add_point(2, Vector3(0, 1, 0))\n" +"astar.add_point(3, Vector3(1, 1, 0))\n" +"astar.add_point(4, Vector3(2, 0, 0))\n" +"\n" +"astar.connect_points(1, 2, true)\n" +"astar.connect_points(1, 3, true)\n" +"\n" +"var neighbors = astar.get_point_connections(1) # Gibt [2, 3] zurück\n" +"[/codeblock]" #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "Returns the number of points currently in the points pool." msgstr "" +"Gibt die Anzahl der Punkte zurück, die sich derzeit im Punktepool befinden." #: doc/classes/AStar.xml msgid "" @@ -10635,38 +11778,53 @@ msgid "" "[b]Note:[/b] This method is not thread-safe. If called from a [Thread], it " "will return an empty [PoolVector3Array] and will print an error message." msgstr "" +"Gibt ein Array mit den Punkten zurück, die sich auf dem von AStar gefundenen " +"Pfad zwischen den angegebenen Punkten befinden. Das Array ist vom Startpunkt " +"bis zum Endpunkt des Pfades geordnet.\n" +"[b]Hinweis:[/b] Diese Methode ist nicht thread-sicher. Wenn sie von einem " +"[Thread] aufgerufen wird, gibt sie ein leeres [PoolVector3Array] zurück und " +"gibt eine Fehlermeldung aus." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" "Returns the position of the point associated with the given [code]id[/code]." msgstr "" +"Gibt die Position des Punktes zurück, der mit der angegebenen [code]id[/" +"code] verbunden ist." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" "Returns the weight scale of the point associated with the given [code]id[/" "code]." msgstr "" +"Gibt die Gewichtungsskala des Punktes zurück, der mit der angegebenen " +"[code]id[/code] verbunden ist." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "Returns an array of all points." -msgstr "" +msgstr "Gibt ein Array mit allen Punkten zurück." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" "Returns whether a point associated with the given [code]id[/code] exists." msgstr "" +"Gibt zurück, ob ein Punkt mit der angegebenen [code]id[/code] existiert." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" "Returns whether a point is disabled or not for pathfinding. By default, all " "points are enabled." msgstr "" +"Gibt zurück, ob ein Punkt für die Pfadfindung deaktiviert ist oder nicht. " +"Standardmäßig sind alle Punkte aktiviert." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" "Removes the point associated with the given [code]id[/code] from the points " "pool." msgstr "" +"Entfernt den mit der angegebenen [code]id[/code] verbundenen Punkt aus dem " +"Punktepool." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" @@ -10674,17 +11832,25 @@ msgid "" "you're adding a known large number of points at once, for a grid for " "instance. New capacity must be greater or equals to old capacity." msgstr "" +"Reserviert intern Platz für [code]num_nodes[/code] Punkte, was nützlich ist, " +"wenn Sie eine bekannt große Anzahl von Punkten auf einmal hinzufügen, z. B. " +"für ein Gitter. Die neue Kapazität muss größer oder gleich der alten " +"Kapazität sein." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" "Disables or enables the specified point for pathfinding. Useful for making a " "temporary obstacle." msgstr "" +"Deaktiviert oder aktiviert den angegebenen Punkt für die Pfadfindung. " +"Nützlich für die Erstellung eines temporären Hindernisses." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" "Sets the [code]position[/code] for the point with the given [code]id[/code]." msgstr "" +"Setzt die [code]Position[/code] für den Punkt mit der angegebenen [code]id[/" +"code]." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" @@ -10693,22 +11859,33 @@ msgid "" "_compute_cost] when determining the overall cost of traveling across a " "segment from a neighboring point to this point." msgstr "" +"Setzt den [code]weight_scale[/code] für den Punkt mit der angegebenen " +"[code]id[/code]. Der [code]weight_scale[/code] wird mit dem Ergebnis von " +"[method _compute_cost] multipliziert, wenn die Gesamtkosten für die Reise " +"über ein Segment von einem benachbarten Punkt zu diesem Punkt bestimmt " +"werden." #: doc/classes/AStar2D.xml msgid "AStar class representation that uses 2D vectors as edges." -msgstr "" +msgstr "AStar-Klassendarstellung, die 2D-Vektoren als Kanten verwendet." #: doc/classes/AStar2D.xml msgid "" "This is a wrapper for the [AStar] class which uses 2D vectors instead of 3D " "vectors." msgstr "" +"Dies ist ein Wrapper für die Klasse [AStar], die 2D-Vektoren anstelle von 3D-" +"Vektoren verwendet." #: doc/classes/AStar2D.xml msgid "" "Called when computing the cost between two connected points.\n" "Note that this function is hidden in the default [code]AStar2D[/code] class." msgstr "" +"Wird aufgerufen, wenn die Kosten zwischen zwei verbundenen Punkten berechnet " +"werden.\n" +"Beachten Sie, dass diese Funktion in der Standardklasse [code]AStar2D[/code] " +"verborgen ist." #: doc/classes/AStar2D.xml msgid "" @@ -10716,6 +11893,10 @@ msgid "" "point.\n" "Note that this function is hidden in the default [code]AStar2D[/code] class." msgstr "" +"Wird aufgerufen, wenn die Kosten zwischen einem Punkt und dem Endpunkt des " +"Pfades geschätzt werden.\n" +"Beachten Sie, dass diese Funktion in der Standardklasse [code]AStar2D[/code] " +"verborgen ist." #: doc/classes/AStar2D.xml msgid "" @@ -10735,6 +11916,21 @@ msgid "" "If there already exists a point for the given [code]id[/code], its position " "and weight scale are updated to the given values." msgstr "" +"Fügt einen neuen Punkt an der angegebenen Position mit dem angegebenen " +"Bezeichner hinzu. Die [code]id[/code] muss 0 oder größer sein, und die " +"[code]weight_scale[/code] muss 0,0 oder größer sein.\n" +"Der [code]weight_scale[/code] wird mit dem Ergebnis von [method " +"_compute_cost] multipliziert, um die Gesamtkosten der Reise über ein Segment " +"von einem benachbarten Punkt zu diesem Punkt zu ermitteln. Unter sonst " +"gleichen Bedingungen bevorzugt der Algorithmus also Punkte mit niedrigeren " +"[code]weight_scale[/code]s, um einen Pfad zu bilden.\n" +"[codeblock]\n" +"var astar = AStar2D.new()\n" +"astar.add_point(1, Vector2(1, 0), 4) # Fügt den Punkt (1, 0) mit " +"weight_scale 4 und id 1 hinzu\n" +"[/codeblock]\n" +"Wenn für die angegebene [code]id[/code] bereits ein Punkt existiert, werden " +"dessen Position und Gewichtungsskala auf die angegebenen Werte aktualisiert." #: doc/classes/AStar2D.xml msgid "" @@ -10742,6 +11938,10 @@ msgid "" "[code]bidirectional[/code] is [code]false[/code], returns whether movement " "from [code]id[/code] to [code]to_id[/code] is possible through this segment." msgstr "" +"Gibt zurück, ob es eine Verbindung/ein Segment zwischen den angegebenen " +"Punkten gibt. Wenn [code]bidirectional[/code] [code]false[/code] ist, wird " +"zurückgegeben, ob eine Bewegung von [code]id[/code] nach [code]to_id[/code] " +"durch dieses Segment möglich ist." #: doc/classes/AStar2D.xml msgid "" @@ -10755,6 +11955,16 @@ msgid "" "astar.connect_points(1, 2, false)\n" "[/codeblock]" msgstr "" +"Erzeugt ein Segment zwischen den angegebenen Punkten. Wenn " +"[code]bidirectional[/code] [code]false[/code] ist, ist nur die Bewegung von " +"[code]id[/code] nach [code]to_id[/code] erlaubt, nicht die umgekehrte " +"Richtung.\n" +"[codeblock]\n" +"var astar = AStar2D.new()\n" +"astar.add_point(1, Vector2(1, 1))\n" +"astar.add_point(2, Vector2(0, 5))\n" +"astar.connect_points(1, 2, false)\n" +"[/codeblock]" #: doc/classes/AStar2D.xml msgid "" @@ -10771,6 +11981,19 @@ msgid "" "The result is in the segment that goes from [code]y = 0[/code] to [code]y = " "5[/code]. It's the closest position in the segment to the given point." msgstr "" +"Gibt die nächstgelegene Position zu [code]to_position[/code] zurück, die " +"sich innerhalb eines Segments zwischen zwei verbundenen Punkten befindet.\n" +"[codeblock]\n" +"var astar = AStar2D.new()\n" +"astar.add_point(1, Vector2(0, 0))\n" +"astar.add_point(2, Vector2(0, 5))\n" +"astar.connect_points(1, 2)\n" +"var res = astar.get_closest_position_in_segment(Vector2(3, 3)) # Gibt (0, 3) " +"zurück\n" +"[/codeblock]\n" +"Das Ergebnis liegt in dem Segment, das von [code]y = 0[/code] bis [code]y = " +"5[/code] reicht. Es ist die Position im Segment, die dem angegebenen Punkt " +"am nächsten liegt." #: doc/classes/AStar2D.xml msgid "" @@ -10795,6 +12018,26 @@ msgid "" "4, 3][/code] instead, because now even though the distance is longer, it's " "\"easier\" to get through point 4 than through point 2." msgstr "" +"Gibt ein Array mit den IDs der Punkte zurück, die den von AStar2D gefundenen " +"Pfad zwischen den angegebenen Punkten bilden. Das Array ist vom Startpunkt " +"bis zum Endpunkt des Pfades geordnet.\n" +"[codeblock]\n" +"var astar = AStar2D.new()\n" +"astar.add_point(1, Vector2(0, 0))\n" +"astar.add_point(2, Vector2(0, 1), 1) # Standartgewichtung ist 1\n" +"astar.add_point(3, Vector2(1, 1))\n" +"astar.add_point(4, Vector2(2, 0))\n" +"\n" +"astar.connect_points(1, 2, false)\n" +"astar.connect_points(2, 3, false)\n" +"astar.connect_points(4, 3, false)\n" +"astar.connect_points(1, 4, false)\n" +"\n" +"var res = astar.get_id_path(1, 3) # Gibt [1, 2, 3] zurück\n" +"[/codeblock]\n" +"Wenn du die Gewichtung des 2. Punktes auf 3 änderst, wird das Ergebnis " +"stattdessen [code][1, 4, 3][/code] sein, weil es jetzt, obwohl die Strecke " +"länger ist, \"einfacher\" ist, durch Punkt 4 zu kommen als durch Punkt 2." #: doc/classes/AStar2D.xml msgid "" @@ -10813,6 +12056,20 @@ msgid "" "var neighbors = astar.get_point_connections(1) # Returns [2, 3]\n" "[/codeblock]" msgstr "" +"Gibt ein Array mit den IDs der Punkte zurück, die die Verbindung mit dem " +"angegebenen Punkt bilden.\n" +"[codeblock]\n" +"var astar = AStar2D.new()\n" +"astar.add_point(1, Vector2(0, 0))\n" +"astar.add_point(2, Vector2(0, 1))\n" +"astar.add_point(3, Vector2(1, 1))\n" +"astar.add_point(4, Vector2(2, 0))\n" +"\n" +"astar.connect_points(1, 2, true)\n" +"astar.connect_points(1, 3, true)\n" +"\n" +"var neighbors = astar.get_point_connections(1) # Gibt [2, 3] zurück\n" +"[/codeblock]" #: doc/classes/AStar2D.xml msgid "" @@ -10822,11 +12079,19 @@ msgid "" "[b]Note:[/b] This method is not thread-safe. If called from a [Thread], it " "will return an empty [PoolVector2Array] and will print an error message." msgstr "" +"Gibt ein Array mit den Punkten zurück, die sich auf dem von AStar2D " +"gefundenen Pfad zwischen den angegebenen Punkten befinden. Das Array ist vom " +"Startpunkt bis zum Endpunkt des Pfades geordnet.\n" +"[b]Hinweis:[/b] Diese Methode ist nicht thread-sicher. Wenn sie von einem " +"[Thread] aufgerufen wird, gibt sie ein leeres [PoolVector2Array] zurück und " +"gibt eine Fehlermeldung aus." #: doc/classes/AtlasTexture.xml msgid "" "Crops out one part of a texture, such as a texture from a texture atlas." msgstr "" +"Schneidet einen Teil einer Textur aus, z. B. eine Textur aus einem " +"Texturatlas." #: doc/classes/AtlasTexture.xml msgid "" @@ -10846,16 +12111,36 @@ msgid "" "FLAG_REPEAT] and [constant Texture.FLAG_MIRRORED_REPEAT] flags are ignored " "when using an AtlasTexture." msgstr "" +"Ressource [Texture], die einen Teil der Textur [member atlas], definiert " +"durch [member region], ausschneidet. Der Hauptanwendungsfall ist das " +"Ausschneiden von Texturen aus einem Textur-Atlas, der eine große Texturdatei " +"ist, die mehrere kleinere Texturen enthält. Besteht aus einer [Texture] für " +"den [member atlas], einer [member region], die den zu verwendenden Bereich " +"des [member atlas] definiert, und einem [member margin], der die Randbreite " +"definiert.\n" +"[AtlasTexture] kann nicht in einer [AnimatedTexture] verwendet werden, kann " +"nicht in Knoten wie [TextureRect] gekachelt werden und funktioniert nicht " +"ordnungsgemäß, wenn sie innerhalb von anderen [AtlasTexture]-Ressourcen " +"verwendet wird. Mehrere [AtlasTexture]-Ressourcen können verwendet werden, " +"um mehrere Texturen aus dem Atlas zu schneiden. Die Verwendung eines " +"Texturatlasses hilft, die Videospeicherkosten und Renderaufrufe im Vergleich " +"zur Verwendung mehrerer kleiner Dateien zu optimieren.\n" +"[b]Hinweis:[/b] AtlasTexturen unterstützen keine Wiederholungen. Die Flags " +"[constant Texture.FLAG_REPEAT] und [constant Texture.FLAG_MIRRORED_REPEAT] " +"werden bei der Verwendung einer AtlasTextur ignoriert." #: doc/classes/AtlasTexture.xml msgid "The texture that contains the atlas. Can be any [Texture] subtype." msgstr "" +"Die Textur, die den Atlas enthält. Kann ein beliebiger [Texture]-Subtyp sein." #: doc/classes/AtlasTexture.xml msgid "" "If [code]true[/code], clips the area outside of the region to avoid bleeding " "of the surrounding texture pixels." msgstr "" +"Wenn [code]true[/code], wird der Bereich außerhalb der Region abgeschnitten, " +"um ein Ausbluten der umliegenden Texturpixel zu vermeiden." #: doc/classes/AtlasTexture.xml msgid "" @@ -10863,87 +12148,124 @@ msgid "" "(\"w\" and \"h\" in the editor) resizes the texture so it fits within the " "margin." msgstr "" +"Der Rand um die Region. Der Parameter [member Rect2.size] von [Rect2] (\"w\" " +"und \"h\" im Editor) ändert die Größe der Textur so, dass sie in den Rand " +"passt." #: doc/classes/AtlasTexture.xml msgid "The AtlasTexture's used region." -msgstr "" +msgstr "Die verwendete Region der AtlasTextur." #: doc/classes/AudioBusLayout.xml msgid "Stores information about the audio buses." -msgstr "" +msgstr "Speichert Informationen über die Audiobusse." #: doc/classes/AudioBusLayout.xml msgid "" "Stores position, muting, solo, bypass, effects, effect position, volume, and " "the connections between buses. See [AudioServer] for usage." msgstr "" +"Speichert Position, Stummschaltung, Solo, Bypass, Effekte, Effektposition, " +"Lautstärke und die Verbindungen zwischen Bussen. Siehe [AudioServer] für die " +"Verwendung." #: doc/classes/AudioEffect.xml msgid "Audio effect for audio." -msgstr "" +msgstr "Audioeffekt für Audio." #: doc/classes/AudioEffect.xml msgid "" "Base resource for audio bus. Applies an audio effect on the bus that the " "resource is applied on." msgstr "" +"Basisressource für Audiobus. Wendet einen Audioeffekt auf den Bus an, auf " +"den die Ressource angewendet wird." -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" -msgstr "" +msgstr "Audio Mic Record Demo" #: doc/classes/AudioEffectAmplify.xml msgid "" "Adds an amplifying audio effect to an audio bus.\n" "Increases or decreases the volume of the selected audio bus." msgstr "" +"Fügt einen verstärkenden Audioeffekt zu einem Audiobus hinzu.\n" +"Erhöht oder verringert die Lautstärke des ausgewählten Audiobusses." #: doc/classes/AudioEffectAmplify.xml msgid "Increases or decreases the volume being routed through the audio bus." -msgstr "" +msgstr "Erhöht oder verringert die über den Audiobus geleitete Lautstärke." #: doc/classes/AudioEffectAmplify.xml msgid "" "Amount of amplification in decibels. Positive values make the sound louder, " "negative values make it quieter. Value can range from -80 to 24." msgstr "" +"Betrag der Verstärkung in Dezibel. Positive Werte machen den Ton lauter, " +"negative Werte machen ihn leiser. Der Wert kann von -80 bis 24 reichen." #: doc/classes/AudioEffectBandLimitFilter.xml msgid "Adds a band limit filter to the audio bus." -msgstr "" +msgstr "Fügt dem Audiobus einen Bandbegrenzungsfilter hinzu." #: doc/classes/AudioEffectBandLimitFilter.xml msgid "" "Limits the frequencies in a range around the [member AudioEffectFilter." "cutoff_hz] and allows frequencies outside of this range to pass." msgstr "" +"Begrenzt die Frequenzen in einem Bereich um den [member AudioEffectFilter." +"cutoff_hz] und lässt Frequenzen außerhalb dieses Bereichs passieren." #: doc/classes/AudioEffectBandPassFilter.xml msgid "Adds a band pass filter to the audio bus." -msgstr "" +msgstr "Fügt dem Audiobus einen Bandpassfilter hinzu." #: doc/classes/AudioEffectBandPassFilter.xml msgid "" "Attenuates the frequencies inside of a range around the [member " "AudioEffectFilter.cutoff_hz] and cuts frequencies outside of this band." msgstr "" +"Dämpft die Frequenzen innerhalb eines Bereichs um den [member " +"AudioEffectFilter.cutoff_hz] und schneidet Frequenzen außerhalb dieses " +"Bereichs ab." #: doc/classes/AudioEffectCapture.xml msgid "Captures audio from an audio bus in real-time." -msgstr "" +msgstr "Nimmt Audio von einem Audiobus in Echtzeit auf." #: doc/classes/AudioEffectCapture.xml +#, fuzzy msgid "" "AudioEffectCapture is an AudioEffect which copies all audio frames from the " "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" +"AudioEffectCapture ist ein AudioEffect, der alle Audio-Frames vom " +"angeschlossenen Audio-Effekt-Bus in seinen internen Ringpuffer kopiert.\n" +"Der Anwendungscode sollte diese Audioframes aus diesem Ringpuffer mit der " +"[method get_buffer] abrufen und nach Bedarf verarbeiten, z.B. um Daten von " +"einem Mikrofon zu erfassen, anwendungsdefinierte Effekte zu implementieren " +"oder um Audio über das Netzwerk zu übertragen. Wenn Audiodaten von einem " +"Mikrofon aufgenommen werden, ist das Format der Samples Stereo 32-Bit " +"Floating Point PCM." + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -10957,7 +12279,7 @@ msgstr "" #: doc/classes/AudioEffectCapture.xml msgid "Clears the internal ring buffer." -msgstr "" +msgstr "Löscht den internen Ringspeicher." #: doc/classes/AudioEffectCapture.xml msgid "" @@ -10967,6 +12289,11 @@ msgid "" "samples if available, or an empty [PoolVector2Array] if insufficient data " "was available." msgstr "" +"Ruft die nächsten [code]frames[/code] Audio-Samples aus dem internen " +"Ringpuffer ab.\n" +"Gibt ein [PoolVector2Array] zurück, das genau [code]frames[/code] Audio-" +"Samples enthält, falls verfügbar, oder ein leeres [PoolVector2Array], falls " +"nicht genügend Daten verfügbar waren." #: doc/classes/AudioEffectCapture.xml #, fuzzy @@ -10978,11 +12305,15 @@ msgid "" "Returns the number of audio frames discarded from the audio bus due to full " "buffer." msgstr "" +"Gibt die Anzahl der Audioframes zurück, die aufgrund eines vollen Puffers " +"vom Audiobus verworfen wurden." #: doc/classes/AudioEffectCapture.xml msgid "" "Returns the number of frames available to read using [method get_buffer]." msgstr "" +"Gibt die Anzahl der Bilder zurück, die mit der [methodget_buffer] gelesen " +"werden können." #: doc/classes/AudioEffectCapture.xml #, fuzzy @@ -10994,6 +12325,8 @@ msgid "" "Length of the internal ring buffer, in seconds. Setting the buffer length " "will have no effect if already initialized." msgstr "" +"Länge des internen Ringpuffers, in Sekunden. Die Einstellung der Pufferlänge " +"hat keine Auswirkungen, wenn sie bereits initialisiert ist." #: doc/classes/AudioEffectChorus.xml msgid "Adds a chorus audio effect." @@ -11073,7 +12406,7 @@ msgstr "" #: doc/classes/AudioEffectCompressor.xml msgid "Gain applied to the output signal." -msgstr "" +msgstr "Auf das Ausgangssignal angewendete Verstärkung." #: doc/classes/AudioEffectCompressor.xml msgid "" @@ -11190,12 +12523,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -11741,7 +13068,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -11902,12 +13234,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -12059,6 +13395,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml #, fuzzy msgid "MP3 audio stream driver." @@ -12203,7 +13554,10 @@ msgstr "Spielt Audio in 2D." #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -13899,7 +15253,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -13992,7 +15346,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -14020,9 +15376,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -14529,13 +15885,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -14561,8 +15918,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -14875,12 +16234,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -14925,8 +16284,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -14976,8 +16337,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -15039,7 +16403,8 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +#, fuzzy +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "[CanvasItem] wird aufgefordert zu zeichnen." #: doc/classes/CanvasItem.xml @@ -15174,7 +16539,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -15904,17 +17272,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -16247,12 +17615,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -16290,12 +17659,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -17522,7 +18892,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -17548,7 +18926,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -18297,7 +19679,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -21065,7 +22449,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -21214,16 +22600,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -21369,18 +22756,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml #, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "Liefert die Fläche des [Rect2i]." @@ -26323,8 +27698,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -26949,7 +28328,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -28549,10 +29930,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -29994,8 +31378,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -32325,11 +33709,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -33178,7 +34565,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -33190,6 +34581,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -35609,14 +37010,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -35624,22 +37025,29 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "Gibt die Anzahl der Spuren in der Animation zurück." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "Liefert die Position des Punktes bei Index [code]Punkt[/code]." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" +"Entfernt den Punkt bei Index [code]Punkt[/code] aus dem Überblendungsbereich." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" +"Liefert die Position des Punktes bei Index [code]Punkt[/code] im Dreieck von " +"Index [code]Dreieck[/code]." #: doc/classes/Line2D.xml msgid "" @@ -36918,8 +38326,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -36964,7 +38376,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -37219,9 +38634,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -37682,7 +39097,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -38846,7 +40263,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -39688,13 +41105,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -41461,11 +42890,11 @@ msgstr "Gobale Position." #: doc/classes/Node2D.xml msgid "Global rotation in radians." -msgstr "" +msgstr "Globale Rotation im Bogenmaß." #: doc/classes/Node2D.xml msgid "Global rotation in degrees." -msgstr "" +msgstr "Globale Rotation in Grad." #: doc/classes/Node2D.xml msgid "Global scale." @@ -41515,6 +42944,10 @@ msgid "" "VisualServer.CANVAS_ITEM_Z_MIN] and [constant VisualServer." "CANVAS_ITEM_Z_MAX] (inclusive)." msgstr "" +"Z-Index. Legt fest, in welcher Reihenfolge die Nodes gerendert werde . Eine " +"Node mit höherem Z-Index wird über anderen angezeigt. Wert muss zwischen " +"[constant VisualServer.CANVAS_ITEM_Z_MIN] und [constant VisualServer." +"CANVAS_ITEM_Z_MAX] liegen (einschließlich)." #: doc/classes/NodePath.xml msgid "Pre-parsed scene tree path." @@ -43378,7 +44811,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -47933,7 +49368,7 @@ msgstr "" #: doc/classes/Polygon2D.xml msgid "The texture's rotation in degrees." -msgstr "" +msgstr "Die Rotation (Drehung) der Textur in Grad." #: doc/classes/Polygon2D.xml msgid "" @@ -48857,7 +50292,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "Liefert die Position des Punktes bei Index [code]Punkt[/code]." #: doc/classes/PopupMenu.xml @@ -49099,7 +50536,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -49832,7 +51271,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -52520,8 +53963,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -56156,11 +57610,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -56598,7 +58056,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -56745,13 +58205,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -57076,6 +58542,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -57088,7 +58566,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -57943,7 +59424,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -58574,6 +60058,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -58910,7 +60402,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -60362,7 +61856,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -61656,6 +63150,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -61717,6 +63214,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -61739,7 +63239,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -62892,6 +64395,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Liefert die Position des Punktes bei Index [code]Punkt[/code]." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -62922,6 +64430,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Liefert die Position des Punktes bei Index [code]Punkt[/code]." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -62963,8 +64476,13 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +#, fuzzy +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" +"Wird ausgegeben, wenn eine benutzerdefinierte Taste gedrückt wird. Siehe " +"[method add_button]." #: doc/classes/Tabs.xml msgid "Emitted when a tab is clicked, even if it is the current tab." @@ -64342,7 +65860,7 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" "Bewegt den Vektor Richtung [code]to[/code] für den festen Betrag " @@ -64351,7 +65869,7 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" "Bewegt den Vektor Richtung [code]to[/code] für den festen Betrag " @@ -64360,7 +65878,7 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" "Bewegt den Vektor Richtung [code]to[/code] für den festen Betrag " @@ -64369,7 +65887,8 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." msgstr "" "Bewegt den Vektor Richtung [code]to[/code] für den festen Betrag " "[code]delta[/code]." @@ -64377,16 +65896,19 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" "Gibt [code]true[/code] zurück, wenn das Array [code]value[/code] enthält." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" +"Bewegt den Vektor Richtung [code]to[/code] für den festen Betrag " +"[code]delta[/code]." #: doc/classes/Theme.xml msgid "" @@ -64405,16 +65927,19 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" "Gibt [code]true[/code] zurück, wenn das Array [code]value[/code] enthält." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" +"Gibt [code]true[/code] zurück, wenn das Array [code]value[/code] enthält." #: doc/classes/Theme.xml msgid "" @@ -64425,17 +65950,19 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" "Gibt [code]true[/code] zurück, wenn das Array [code]value[/code] enthält." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" +"Gibt [code]true[/code] zurück, wenn das Array [code]value[/code] enthält." #: doc/classes/Theme.xml msgid "" @@ -64446,16 +65973,18 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" +"Gibt [code]true[/code] zurück, wenn das Array [code]value[/code] enthält." #: doc/classes/Theme.xml msgid "" @@ -64467,16 +65996,19 @@ msgstr "" #, fuzzy msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." +"[code]theme_type[/code]." msgstr "" "Liefert die Position des Punktes bei Index [code]Punkt[/code] im Dreieck von " "Index [code]Dreieck[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" +"Liefert die Position des Punktes bei Index [code]Punkt[/code] im Dreieck von " +"Index [code]Dreieck[/code]." #: doc/classes/Theme.xml msgid "" @@ -64487,17 +66019,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -64510,9 +66044,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -64520,8 +66054,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -64536,7 +66070,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -64558,18 +66092,23 @@ msgstr "" #, fuzzy msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" "Gibt [code]true[/code] zurück wenn Einstellung welche durch [code]name[/" "code]angegeben ist, existiert, ansonsten [code]false[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" +"Gibt [code]true[/code] zurück wenn Einstellung welche durch [code]name[/" +"code]angegeben ist, existiert, ansonsten [code]false[/code]." #: doc/classes/Theme.xml #, fuzzy @@ -64583,32 +66122,45 @@ msgstr "" #, fuzzy msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" "Gibt [code]true[/code] zurück wenn Einstellung welche durch [code]name[/" "code]angegeben ist, existiert, ansonsten [code]false[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" +"Gibt [code]true[/code] zurück wenn Einstellung welche durch [code]name[/" +"code]angegeben ist, existiert, ansonsten [code]false[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" +"Gibt [code]true[/code] zurück wenn Einstellung welche durch [code]name[/" +"code]angegeben ist, existiert, ansonsten [code]false[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" +"Gibt [code]true[/code] zurück wenn Einstellung welche durch [code]name[/" +"code]angegeben ist, existiert, ansonsten [code]false[/code]." #: doc/classes/Theme.xml #, fuzzy @@ -64636,90 +66188,120 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" +"Gibt [code]true[/code] zurück, wenn das Array [code]value[/code] enthält." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" +"Gibt [code]true[/code] zurück, wenn das Array [code]value[/code] enthält." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" +"Bewegt den Vektor Richtung [code]to[/code] für den festen Betrag " +"[code]delta[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" +"Liefert die Position des Punktes bei Index [code]Punkt[/code] im Dreieck von " +"Index [code]Dreieck[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" +"Gibt [code]true[/code] zurück, wenn das Array [code]value[/code] enthält." #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"Gibt [code]true[/code] zurück wenn Einstellung welche durch [code]name[/" +"code]angegeben ist, existiert, ansonsten [code]false[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"Gibt [code]true[/code] zurück wenn Einstellung welche durch [code]name[/" +"code]angegeben ist, existiert, ansonsten [code]false[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"Gibt [code]true[/code] zurück wenn Einstellung welche durch [code]name[/" +"code]angegeben ist, existiert, ansonsten [code]false[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"Gibt [code]true[/code] zurück wenn Einstellung welche durch [code]name[/" +"code]angegeben ist, existiert, ansonsten [code]false[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"Gibt [code]true[/code] zurück wenn Einstellung welche durch [code]name[/" +"code]angegeben ist, existiert, ansonsten [code]false[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"Gibt [code]true[/code] zurück wenn Einstellung welche durch [code]name[/" +"code]angegeben ist, existiert, ansonsten [code]false[/code]." #: doc/classes/Theme.xml msgid "" @@ -67975,21 +69557,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -68002,7 +69588,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -68031,7 +69617,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -68041,22 +69659,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -68069,8 +69700,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -68268,16 +69901,16 @@ msgid "Unknown error." msgstr "unbekannter Fehler." #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." -msgstr "UPNP Gerät." +msgid "Universal Plug and Play (UPnP) device." +msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -74582,6 +76215,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -77135,7 +78772,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/el.po b/doc/translations/el.po index 87eee32604..2044a45e60 100644 --- a/doc/translations/el.po +++ b/doc/translations/el.po @@ -548,8 +548,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -559,7 +560,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -613,7 +615,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -625,7 +628,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1040,10 +1044,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4855,19 +4864,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4888,21 +4899,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4912,9 +4927,10 @@ msgstr "ΕπιστÏÎφει την εφαπτομÎνη της παÏαμÎÏ„Ï #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -5566,9 +5582,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -5742,8 +5758,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -6454,7 +6470,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -6691,7 +6712,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -7339,7 +7365,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -8745,8 +8779,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8797,10 +8832,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9043,12 +9088,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9594,7 +9633,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9755,12 +9799,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9908,6 +9956,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10048,7 +10111,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11728,7 +11794,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11821,7 +11887,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11849,9 +11917,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12352,13 +12420,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -12384,8 +12453,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12698,12 +12769,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12748,8 +12819,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12797,8 +12870,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12860,7 +12936,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12985,7 +13061,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -13690,17 +13769,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -14007,12 +14086,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14049,12 +14129,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -15214,7 +15295,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -15240,7 +15329,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -15981,7 +16074,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18712,7 +18807,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18861,16 +18958,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19016,18 +19114,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml #, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "ΕπιστÏÎφει το τόξο ημιτόνου της παÏαμÎÏ„Ïου." @@ -23942,8 +24028,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24564,7 +24654,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26152,10 +26244,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27564,8 +27659,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -29867,11 +29962,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30717,7 +30815,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30729,6 +30831,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33089,14 +33201,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33104,22 +33216,26 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "ΕπιστÏÎφει το ημίτονο της παÏαμÎÏ„Ïου." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "ΕπιστÏÎφει το ημίτονο της παÏαμÎÏ„Ïου." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "ΕπιστÏÎφει το ημίτονο της παÏαμÎÏ„Ïου." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." -msgstr "" +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." +msgstr "ΕπιστÏÎφει το ημίτονο της παÏαμÎÏ„Ïου." #: doc/classes/Line2D.xml msgid "" @@ -34395,8 +34511,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -34441,7 +34561,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -34696,9 +34819,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35159,7 +35282,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36290,7 +36415,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37116,13 +37241,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40792,7 +40929,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46166,7 +46305,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "ΕπιστÏÎφει το ημίτονο της παÏαμÎÏ„Ïου." #: doc/classes/PopupMenu.xml @@ -46405,7 +46546,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47135,7 +47278,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49816,8 +49963,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53395,11 +53553,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -53836,7 +53998,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53980,13 +54144,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -54309,6 +54479,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -54321,7 +54503,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55176,7 +55361,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55795,6 +55983,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56129,7 +56325,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57562,7 +57760,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58829,6 +59027,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -58890,6 +59091,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -58912,7 +59116,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60049,6 +60256,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "ΕπιστÏÎφει το ημίτονο της παÏαμÎÏ„Ïου." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60079,6 +60291,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "ΕπιστÏÎφει το ημίτονο της παÏαμÎÏ„Ïου." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60120,7 +60337,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -61477,38 +61696,44 @@ msgid "Clears all values on the theme." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "ΕπιστÏÎφει το υπόλοιπο των 2 διανυσμάτων." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "ΕπιστÏÎφει το ημίτονο της παÏαμÎÏ„Ïου." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "ΕπιστÏÎφει το υπόλοιπο των 2 διανυσμάτων." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." -msgstr "" +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." +msgstr "ΕπιστÏÎφει το υπόλοιπο των 2 διανυσμάτων." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "ΕπιστÏÎφει το υπόλοιπο των 2 διανυσμάτων." #: doc/classes/Theme.xml msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61526,15 +61751,17 @@ msgid "Sets the theme's values to a copy of a given theme." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "ΕπιστÏÎφει το υπόλοιπο των 2 διανυσμάτων." #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61544,15 +61771,16 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "ΕπιστÏÎφει το υπόλοιπο των 2 διανυσμάτων." #: doc/classes/Theme.xml msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" @@ -61565,7 +61793,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" @@ -61573,7 +61801,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61583,15 +61811,16 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." -msgstr "" +"[code]theme_type[/code]." +msgstr "ΕπιστÏÎφει το υπόλοιπο των 2 διανυσμάτων." #: doc/classes/Theme.xml msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61603,17 +61832,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -61626,9 +61857,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -61636,8 +61867,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -61652,7 +61883,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -61671,15 +61902,17 @@ msgstr "ΕπιστÏÎφει το υπόλοιπο των 2 διανυσμάτω #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61691,29 +61924,33 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61741,87 +61978,87 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -65001,21 +65238,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65028,7 +65269,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65057,7 +65298,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65067,22 +65340,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65095,8 +65381,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65294,16 +65582,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -71420,6 +71708,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -73959,7 +74251,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/es.po b/doc/translations/es.po index f9d008c41a..12a03991b8 100644 --- a/doc/translations/es.po +++ b/doc/translations/es.po @@ -35,12 +35,14 @@ # Jake-insane <jake0insane@gmail.com>, 2022. # Luis Alberto Flores Baca <betofloresbaca@gmail.com>, 2022. # emnrx <emanuelermancia@gmail.com>, 2022. +# BlackNoizE404 <blacknoize404@gmail.com>, 2022. +# Keyla Arroyos <keylaarroyos@protonmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-06-16 18:58+0000\n" -"Last-Translator: emnrx <emanuelermancia@gmail.com>\n" +"PO-Revision-Date: 2022-09-26 05:24+0000\n" +"Last-Translator: Keyla Arroyos <keylaarroyos@protonmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/es/>\n" "Language: es\n" @@ -48,7 +50,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.14.1\n" #: doc/tools/make_rst.py msgid "Description" @@ -108,7 +110,7 @@ msgstr "(sobreescribe %s)" #: doc/tools/make_rst.py msgid "Default" -msgstr "Por defecto" +msgstr "Predeterminado" #: doc/tools/make_rst.py msgid "Setter" @@ -523,7 +525,6 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Compares two values by checking their actual contents, recursing into any " "[Array] or [Dictionary] up to its deepest level.\n" @@ -575,16 +576,14 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Converts a dictionary (previously created with [method inst2dict]) back to " "an instance. Useful for deserializing." msgstr "" -"Convierte un diccionario (que fue creado previamente con [method inst2dict]) " -"de nuevo en una instancia. Es útil para deserializar." +"Convierte un diccionario (previamente creado con [method inst2dict]) de " +"nuevo en una instancia. Es útil para deserializar." #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Returns an \"eased\" value of [code]x[/code] based on an easing function " "defined with [code]curve[/code]. This easing function is based on an " @@ -624,7 +623,6 @@ msgstr "" "avanzadas, utilice [Tween] o [AnimationPlayer]." #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "The natural exponential function. It raises the mathematical constant [b]e[/" "b] to the power of [code]s[/code] and returns it.\n" @@ -862,8 +860,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -873,7 +872,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" "Devuelve un factor de interpolación o extrapolación, considerando el rango " "especificado en [code]from[/code] y [code]to[/code], y el valor interpolado " @@ -967,7 +967,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -979,7 +980,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" "Interpola linealmente entre dos valores por un valor normalizado. Esto es la " "función inversa de [method inverse_lerp].\n" @@ -1653,16 +1655,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" -"Transforma un [code]value[/code] entre los rangos [code](istart, istop][/" -"code] a los rangos [code][ostart, ostop][/code].\n" -"[codeblock]\n" -"range_lerp(75, 0, 100, -1, 1) # Devuelve 0.5\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml #, fuzzy @@ -6348,25 +6350,22 @@ msgstr "" "[AnimationRootNode]. Si no, el editor no mostrará el nodo para añadir." #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" -"Obtiene la leyenda del texto de este nodo (usado por algunos editores)." #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" -"Obtiene un nodo hijo por Ãndice (utilizado por los editores que heredan de " -"[AnimationRootNode])." #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" -"Ordena todos los nodos infantiles como un diccionario de [code]name: node[/" -"code]. Sólo es útil cuando se hereda [AnimationRootNode]." #: doc/classes/AnimationNode.xml msgid "" @@ -6390,17 +6389,22 @@ msgstr "" "reutilizado en múltiples árboles." #: doc/classes/AnimationNode.xml +#, fuzzy msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" "Obtiene el valor por defecto de un parametro. Los parametros son " "personalizados en memoria local utilizados para tus nodos, dado que un " "recurso puede ser reutilizado en multiples arboles." #: doc/classes/AnimationNode.xml +#, fuzzy msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" @@ -6410,9 +6414,11 @@ msgstr "" "del [method Object.get_property_list]." #: doc/classes/AnimationNode.xml +#, fuzzy msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" "Devuelve [code]true[/code] si quieres que el editor del árbol de mezcla " "muestre la edición del filtro en este nodo." @@ -6423,10 +6429,12 @@ msgid "Returns whether the given path is filtered." msgstr "Devuelve [code]true[/code] si un camino dado es filtrado." #: doc/classes/AnimationNode.xml +#, fuzzy msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -7259,9 +7267,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -7495,9 +7503,10 @@ msgstr "" "encuentra." #: doc/classes/AnimationPlayer.xml +#, fuzzy msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" "Devuelve la [Animation] con clave [code]name[/code] or [code]null[/code] si " "no se encuentra." @@ -8385,15 +8394,16 @@ msgid "3D area for detection and physics and audio influence." msgstr "Ãrea 2D para la detección y la influencia de la fÃsica 2D." #: doc/classes/Area.xml -#, fuzzy msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" -"Ãrea 3D que detecta nodos [CollisionObject] superpuestos, entrando o " -"saliendo. También puede alterar o anular los parámetros de la fÃsica local " -"(gravedad, amortiguación)." #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml #: doc/classes/ViewportTexture.xml @@ -8706,15 +8716,16 @@ msgid "2D area for detection and physics and audio influence." msgstr "Ãrea 2D para la detección y la influencia de la fÃsica 2D." #: doc/classes/Area2D.xml -#, fuzzy msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" -"Ãrea 2D que detecta nodos [CollisionObject2D] superpuestos, entrando o " -"saliendo. También puede alterar o anular los parámetros de la fÃsica local " -"(gravedad, amortiguación)." #: doc/classes/Area2D.xml msgid "Using Area2D" @@ -9589,7 +9600,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" "Crea una nueva superificie.\n" "Superficies son creadas para ser renderizadas usando un [code]primitive[/" @@ -11614,8 +11633,9 @@ msgstr "" "Recurso base para el bus de audio. Aplica un efecto de audio en el bus en " "que el recurso es aplicado." -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -11675,10 +11695,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -11989,12 +12019,6 @@ msgstr "" "los juegos, puede simular el sonido proveniente de algún dispositivo " "saturado o altavoz muy eficientemente." -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "Poder de distorsión. El valor puede variar entre 0 y 1." @@ -12709,10 +12733,13 @@ msgstr "" "[code]at_position[/code]." #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" -"Devuelve los nombres de todos los dispositivos de entrada de audio " -"detectados en el sistema." #: doc/classes/AudioServer.xml msgid "Generates an [AudioBusLayout] using the available buses and effects." @@ -12906,12 +12933,16 @@ msgstr "Número de buses de audio disponibles." #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -13070,6 +13101,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml #, fuzzy msgid "MP3 audio stream driver." @@ -13228,7 +13274,10 @@ msgstr "Reproduce el sonido 3D en el espacio 3D." #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -15326,7 +15375,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" "Establece la proyección de la cámara en modo frustum (ver [constant " "PROJECTION_FRUSTUM]), especificando un [code]size[/code], un [code]offset[/" @@ -15445,10 +15494,13 @@ msgstr "" "- ~121,63 grados en una vista de 21:9" #: doc/classes/Camera.xml +#, fuzzy msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" "El desplazamiento de la cámara de frustum. Se puede cambiar desde el valor " "predeterminado para crear efectos de \"frustum inclinado\" como [url=https://" @@ -15485,15 +15537,11 @@ msgstr "" "la cámara escala su tamaño percibido." #: doc/classes/Camera.xml -#, fuzzy msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" -"El tamaño de la cámara se mide como la mitad de la anchura o la altura. Sólo " -"aplicable en modo ortogonal. Dado que [member keep_aspect] se bloquea en el " -"eje, [code]size[/code] establece la longitud del tamaño del otro eje." #: doc/classes/Camera.xml msgid "The vertical (Y) offset of the camera viewport." @@ -16157,18 +16205,20 @@ msgid "Base class of anything 2D." msgstr "Clase base de cualquier cosa 2D." #: doc/classes/CanvasItem.xml +#, fuzzy msgid "" "Base class of anything 2D. Canvas items are laid out in a tree; children " "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -16220,12 +16270,19 @@ msgid "Custom drawing in 2D" msgstr "" #: doc/classes/CanvasItem.xml +#, fuzzy msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" -"Función sobreescribible llamada por el motor (si está definida) para dibujar " -"el objeto canvas." +"Llamado cuando el nodo entra en el [SceneTree] (por ejemplo, al instalarse, " +"al cambiar de escena o después de llamar a [method add_child] en un script). " +"Si el nodo tiene hijos, su llamada a [method _enter_tree] se llamará " +"primero, y luego la de los hijos.\n" +"Corresponde a la notificación [constant NOTIFICATION_ENTER_TREE] en [method " +"Object._notification]." #: doc/classes/CanvasItem.xml msgid "" @@ -16614,12 +16671,13 @@ msgstr "" "Devuelve [code]true[/code] si las notificaciones de transformación global se " "comunican a los hijos." -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml +#, fuzzy msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" "Devuelve [code]true[/code] si el nodo está presente en el [SceneTree], su " "propiedad [member visible] es [code]true[/code] y todos sus antecedentes " @@ -16682,12 +16740,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" -"Pone en la cola el [CanvasItem] para la actualización. La [constant " -"NOTIFICATION_DRAW] será llamada en tiempo de inactividad para solicitar el " -"redibujado." #: doc/classes/CanvasItem.xml msgid "" @@ -16746,11 +16803,12 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" -"Emitido cuando el [CanvasItem] debe ser dibujado de nuevo. Esto sólo puede " -"ser conectado en tiempo real, ya que en diferido no se podrá dibujar." #: doc/classes/CanvasItem.xml msgid "Emitted when becoming hidden." @@ -16823,7 +16881,8 @@ msgstr "" "set_notify_local_transform]." #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +#, fuzzy +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "Se solicita al [CanvasItem] que dibuje." #: doc/classes/CanvasItem.xml @@ -16993,10 +17052,12 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" -"Establece la capa que sigue a la vista para simular un pseudo efecto 3D." #: doc/classes/CanvasLayer.xml msgid "" @@ -17921,17 +17982,17 @@ msgstr "Elimina al dueño de la forma dada." #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -18350,13 +18411,15 @@ msgstr "" "Nodo que representa los datos de la forma de la colisión en el espacio 3D." #: doc/classes/CollisionShape.xml +#, fuzzy msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" "Servicio de edición para crear y editar formas de colisión en el espacio 3D. " "Puede usar este nodo para representar todo tipo de formas de colisión, por " @@ -18405,13 +18468,15 @@ msgstr "" "Nodo que representa los datos de la forma de colisión en el espacio 2D." #: doc/classes/CollisionShape2D.xml +#, fuzzy msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" "Servicio de edición para crear y editar formas de colisión en el espacio 2D. " "Puede usar este nodo para representar todo tipo de formas de colisión, por " @@ -19783,21 +19848,21 @@ msgid "Concave polygon shape." msgstr "Forma de polÃgono cóncavo." #: doc/classes/ConcavePolygonShape.xml -#, fuzzy msgid "" "Concave polygon shape resource, which can be set into a [PhysicsBody] or " "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" -"Recurso de forma poligonal cóncava, que se puede establecer en un " -"[PhysicsBody] o área. Esta forma se crea alimentando una lista de " -"triángulos.\n" -"Nota: cuando se usa para la colisión, [ConcavePolygonShape] está pensado " -"para trabajar con nodos estáticos [PhysicsBody] como [StaticBody] y no " -"funcionará con [KinematicBody] o [RigidBody] con un modo distinto al " -"estático." #: doc/classes/ConcavePolygonShape.xml msgid "Returns the faces (an array of triangles)." @@ -19812,6 +19877,7 @@ msgid "Concave polygon 2D shape resource for physics." msgstr "Forma 2D polÃgonal cóncavo es un recurso para la fÃsica." #: doc/classes/ConcavePolygonShape2D.xml +#, fuzzy msgid "" "Concave polygon 2D shape resource for physics. It is made out of segments " "and is optimal for complex polygonal concave collisions. However, it is not " @@ -19822,7 +19888,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" "Forma 2D polÃgonal cóncavo es un recurso para la fÃsica. Está hecho de " "segmentos y es óptimo para colisiones poligonales cóncavas complejas. Sin " @@ -20889,10 +20959,10 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" -"Roba el foco de otro control y pasa a ser el control enfocado (ver [member " -"focus_mode])." #: doc/classes/Control.xml #, fuzzy @@ -24472,10 +24542,13 @@ msgid "A mathematic curve." msgstr "Una curva matemática." #: doc/classes/Curve.xml +#, fuzzy msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" "Una curva que puede ser guardada y reutilizada para otros objetos. Por " "defecto, oscila entre [code]0[/code] y [code]1[/code] en el eje Y y " @@ -24664,17 +24737,18 @@ msgstr "" "Mantiene un cacheo de puntos precalculados a lo largo de la curva, para " "acelerar los cálculos." -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml #, fuzzy msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" "Añade un punto a una curva en la posición [code]position[/code], con puntos " "de control [code]in[/code] y [code]out[/code].\n" @@ -24907,27 +24981,6 @@ msgstr "" #: doc/classes/Curve3D.xml #, fuzzy -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" -"Añade un punto a una curva en la posición [code]position[/code], con puntos " -"de control [code]in[/code] y [code]out[/code].\n" -"Si se da [code]at_position[/code], el punto se inserta antes del número de " -"punto [code]at_position[/code], desplazando ese punto (y todos los puntos " -"posteriores) después del punto insertado. Si no se da [code]at_position[/" -"code], o es un valor ilegal ([code]at_position <0[/code] o [code]at_position " -">= [method get_point_count][/code]), el punto se añadirá al final de la " -"lista de puntos." - -#: doc/classes/Curve3D.xml -#, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "Devuelve el caché de puntos como un [PackedVector3Array]." @@ -31644,11 +31697,13 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" -"Devuelve todo el archivo como una [String].\n" -"El texto se interpreta como codificado en UTF-8." #: doc/classes/File.xml #, fuzzy @@ -32413,13 +32468,16 @@ msgstr "" "Véase también [method CanvasItem.draw_string]." #: doc/classes/Font.xml +#, fuzzy msgid "" "Draw character [code]char[/code] into a canvas item using the font at a " "given position, with [code]modulate[/code] color, and optionally kerning if " "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" "Dibuja el carácter [code]char[/code] en un elemento del canvas utilizando la " "fuente en una posición determinada, con [code]modular[/code] color, y " @@ -34545,12 +34603,16 @@ msgstr "" "entre puntos de color definidos por el usuario." #: doc/classes/Gradient.xml +#, fuzzy msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" "Dado un conjunto de colores, este recurso los interpolará en orden. Esto " "significa que si tiene el color 1, el color 2 y el color 3, la rampa " @@ -36333,8 +36395,8 @@ msgstr "Cliente HTTP(Hyper-text transfer protocol)." msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -39548,11 +39610,14 @@ msgstr "Detiene la vibración del joypad." #: doc/classes/Input.xml #, fuzzy msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" "Vibración de los dispositivos Android e iOS.\n" "[b]Nota:[/b] Necesita permiso de VIBRATE para Android en la configuración de " @@ -40668,7 +40733,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -40683,6 +40752,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -43795,44 +43874,40 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" -"Añade un punto en la [code]position[/code]. Añade el punto al final de la " -"lÃnea.\n" -"Si se da [code]at_position[/code], el punto se inserta antes del número de " -"punto [code]at_position[/code], desplazando ese punto (y todos los puntos " -"posteriores) después del punto insertado. Si no se da [code]at_position[/" -"code], o es un valor ilegal ([code]at_position < 0[/code] o " -"[code]at_position >= [method get_point_count][/code]), el punto se añadirá " -"al final de la lista de puntos." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." +msgstr "" #: doc/classes/Line2D.xml msgid "Removes all points from the line." msgstr "Elimina todos los puntos de la lÃnea." #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "Devuelve la cantidad de puntos de Line2D." +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "Devuelve la cantidad de huesos del esqueleto." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "Devuelve la posición del punto [code]i[/code]." +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "Devuelve la posición del punto en el Ãndice [code]point[/code]." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." msgstr "Elimina el punto en el Ãndice [code]i[/code] de la lÃnea." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" "Sobrescribe la posición en el punto [code]i[/code] con la [code]position[/" "code] suministrada." @@ -45523,9 +45598,13 @@ msgstr "Flag utilizada para marcar un array normal comprimido (real)." msgid "Flag used to mark a compressed (half float) tangent array." msgstr "Flag utilizada para marcar un array tangencial comprimido (real)." -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." -msgstr "Flag usada para marcar una array de colores comprimida (real)." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." +msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "Flag used to mark a compressed (half float) UV coordinates array." @@ -45575,7 +45654,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" "Se usa para poner las banderas [constante ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -45879,9 +45961,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" "MeshInstance es un nodo que toma un recurso [Mesh] y lo añade al escenario " "actual creando una instancia del mismo. Esta es la clase más usada para " @@ -46463,7 +46545,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" "Establece el color de una instancia especÃfica.\n" "Para que el color tenga efecto, asegúrate de que [member use_colors] es " @@ -47819,7 +47903,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -48746,15 +48830,26 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml -#, fuzzy msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." -msgstr "Devuelve el estado actual de la conexión. Ver [enum ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." +msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml #, fuzzy @@ -53930,7 +54025,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -61141,7 +61238,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "Establece el icono del artÃculo en el Ãndice [code]idx[/code]." #: doc/classes/PopupMenu.xml @@ -61458,7 +61557,9 @@ msgstr "Clase para mostrar popups con un fondo de panel." msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" "Clase para mostrar popups con un fondo de panel. En algunos casos puede ser " "más simple de usar que el [Popup], ya que proporciona un fondo configurable. " @@ -62393,10 +62494,12 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" -"Si [code]true[/code], se permitirá la entrada del micrófono. Esto requiere " -"que se establezcan los permisos apropiados al exportar a Android o iOS." #: doc/classes/ProjectSettings.xml #, fuzzy @@ -65582,8 +65685,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -70324,11 +70438,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -70849,7 +70967,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" "Cambia la escena en curso a una nueva instancia de la [PackedScene] dada.\n" "Devuelve [constant OK] en el éxito o [constant ERR_CANT_CREATE] si la escena " @@ -71044,18 +71164,20 @@ msgstr "La escena actual." #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" -"Si [code]true[/code], las formas de colisión serán visibles cuando se " -"ejecute el juego desde el editor con fines de depuración." #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" -"Si [code]true[/code], los polÃgonos de navegación serán visibles cuando se " -"ejecute el juego desde el editor para su depuración." #: doc/classes/SceneTree.xml msgid "The root of the edited scene." @@ -71451,6 +71573,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -71463,7 +71597,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -72462,8 +72599,11 @@ msgstr "" "es especÃfico para cada forma y no puede ser configurado." #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." -msgstr "La forma personalizada es un solucionador personalizado." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." +msgstr "" #: doc/classes/ShortCut.xml msgid "A shortcut for binding input." @@ -73228,6 +73368,18 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" +"Devuelve [code]true[/code] si el nodo está presente en el [SceneTree], su " +"propiedad [member visible] es [code]true[/code] y todos sus antecedentes " +"también son visibles. Si algún antecedente está oculto, este nodo no será " +"visible en el árbol de la escena." + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -73673,7 +73825,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -75516,7 +75670,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -77083,6 +77237,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -77161,6 +77318,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -77195,11 +77355,15 @@ msgstr "" "en su lugar." #: doc/classes/String.xml +#, fuzzy msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" "Divide la string en reales usando una string delimitadora y devuelve un " "array de las substrings..\n" @@ -78701,6 +78865,11 @@ msgstr "" "está activada." #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Devuelve el texto del artÃculo en el Ãndice [code]idx[/code]." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "Devuelve el número de pestañas ocultas desplazadas a la izquierda." @@ -78733,6 +78902,11 @@ msgstr "" "del ratón." #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Establece un icono para la pestaña en el Ãndice [code]tab_idx[/code]." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" "Establece un icono [code]icon[/code] para la pestaña en el Ãndice " @@ -78790,9 +78964,12 @@ msgstr "" "ratón. Ver [member drag_to_rearrange_enabled]." #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +#, fuzzy +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" -"Se emite cuando se hace clic con el botón derecho del ratón en una pestaña." +"Se emite cuando se presiona un botón personalizado. Ver [method add_button]." #: doc/classes/Tabs.xml msgid "Emitted when a tab is clicked, even if it is the current tab." @@ -80473,7 +80650,7 @@ msgstr "Borra todos los valores del tema." #: doc/classes/Theme.xml #, fuzzy msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" "Borra el [Color] en [code]name[/code] si el tema tiene [code]type[/code]." @@ -80481,7 +80658,7 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" "Limpia la constante en [code]name[/code] si el tema tiene [code]type[/code]." @@ -80489,7 +80666,7 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" "Limpia la [Font] en [code]name[/code] si el tema tiene [code]type[/code]." @@ -80497,14 +80674,15 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." msgstr "" "Borra el icono en [code]name[/code] si el tema tiene [code]type[/code]." #: doc/classes/Theme.xml #, fuzzy msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" "Borra [StyleBox] en [code]name[/code] si el tema tiene [code]type[/code]." @@ -80513,7 +80691,7 @@ msgstr "" #, fuzzy msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" "Limpia la constante en [code]name[/code] si el tema tiene [code]type[/code]." @@ -80536,7 +80714,7 @@ msgstr "Establece los valores del tema a una copia de un tema dado." #: doc/classes/Theme.xml #, fuzzy msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" "Devuelve el [Color] en [code]name[/code] si el tema tiene [code]type[/code]." @@ -80545,7 +80723,8 @@ msgstr "" #, fuzzy msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" "Devuelve todos los [Color]s como un [PackedStringArray] relleno con el " "nombre de cada [Color], para su uso en [method get_color], si el tema tiene " @@ -80564,7 +80743,7 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" "Devuelve la constante en [code]name[/code] si el tema tiene [code]type[/" @@ -80574,7 +80753,7 @@ msgstr "" #, fuzzy msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" "Devuelve todas las constantes como un [PackedStringArray] relleno con el " @@ -80595,7 +80774,7 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" @@ -80605,7 +80784,7 @@ msgstr "" #, fuzzy msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" "Devuelve todas las [Fonts] como un [PackedStringArray] rellenado con el " "nombre de cada [Font], para su uso en el [method get_font], si el tema tiene " @@ -80625,7 +80804,7 @@ msgstr "" #, fuzzy msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." +"[code]theme_type[/code]." msgstr "" "Devuelve el icono [Texture2D] en [code]name[/code] si el tema tiene " "[code]type[/code]." @@ -80634,7 +80813,7 @@ msgstr "" #, fuzzy msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" "Devuelve todos los iconos como un [PackedStringArray] rellenado con el " "nombre de cada [Texture2D], para su uso en el [method get_icon], si el tema " @@ -80651,20 +80830,26 @@ msgstr "" "tiene [code]type[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" +"Devuelve todos los [StyleBox]s como un [PackedStringArray] relleno con el " +"nombre de cada [StyleBox], para su uso en [method get_stylebox], si el tema " +"tiene [code]type[/code]." #: doc/classes/Theme.xml #, fuzzy msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" "Devuelve todos los [StyleBox]s como un [PackedStringArray] relleno con el " "nombre de cada [StyleBox], para su uso en [method get_stylebox], si el tema " @@ -80682,22 +80867,30 @@ msgstr "" "[method get_stylebox_list], si el tema tiene [code]type[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" +"Establece el [Font] del tema a [code]font[/code] en [code]name[/code] en " +"[code]type[/code].\n" +"No hace nada si el tema no tiene [code]type[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" +"Devuelve todos los [StyleBox]s como un [PackedStringArray] relleno con el " +"nombre de cada [StyleBox], para su uso en [method get_stylebox], si el tema " +"tiene [code]type[/code]." #: doc/classes/Theme.xml #, fuzzy @@ -80715,7 +80908,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" "Devuelve todos los tipos de [code]type[/code] como un [PackedStringArray] " @@ -80741,8 +80934,9 @@ msgstr "Devuelve un [Array] de conexiones para la [code]signal[/code] dada." #, fuzzy msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" "Devuelve [code]true[/code] si [Color] con [code]name[/code] está en " "[code]type[/code].\n" @@ -80752,8 +80946,9 @@ msgstr "" #, fuzzy msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" "Devuelve [code]true[/code] si la constante con [code]name[/code] está en " "[code]type[/code].\n" @@ -80771,8 +80966,9 @@ msgstr "" #, fuzzy msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" "Devuelve [code]true[/code] si [Font] con [code]name[/code] está en " "[code]type[/code].\n" @@ -80782,8 +80978,9 @@ msgstr "" #, fuzzy msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" "Devuelve [code]true[/code] si el icono [Texture2D] con [code]name[/code] " "está en [code]type[/code].\n" @@ -80793,8 +80990,9 @@ msgstr "" #, fuzzy msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" "Devuelve [code]true[/code] si [StyleBox] con [code]name[/code] está en " "[code]type[/code].\n" @@ -80804,8 +81002,9 @@ msgstr "" #, fuzzy msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" "Devuelve [code]true[/code] si [StyleBox] con [code]name[/code] está en " "[code]type[/code].\n" @@ -80840,7 +81039,7 @@ msgstr "" #, fuzzy msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" "Devuelve el [Color] en [code]name[/code] si el tema tiene [code]type[/code]." @@ -80849,7 +81048,7 @@ msgstr "" #, fuzzy msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" "Devuelve la constante en [code]name[/code] si el tema tiene [code]type[/" @@ -80859,7 +81058,7 @@ msgstr "" #, fuzzy msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" "Devuelve la [Font] en [code]name[/code] si el tema tiene [code]type[/code]." @@ -80868,7 +81067,7 @@ msgstr "" #, fuzzy msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" "Devuelve el icono [StyleBox] en [code]name[/code] si el tema tiene " @@ -80878,7 +81077,7 @@ msgstr "" #, fuzzy msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" "Establece el [StyleBox] del tema a [code]stylebox[/code] en [code]name[/" @@ -80889,7 +81088,7 @@ msgstr "" #, fuzzy msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" "Establece la constante del tema en [code]constant[/code] en [code]name[/" @@ -80900,8 +81099,8 @@ msgstr "" #, fuzzy msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" "Establece el [Color] del tema a [code]color[/code] en [code]name[/code] en " "[code]type[/code].\n" @@ -80911,8 +81110,8 @@ msgstr "" #, fuzzy msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" "Establece la constante del tema en [code]constant[/code] en [code]name[/" "code] en [code]type[/code].\n" @@ -80922,8 +81121,8 @@ msgstr "" #, fuzzy msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" "Establece el [Font] del tema a [code]font[/code] en [code]name[/code] en " "[code]type[/code].\n" @@ -80933,8 +81132,8 @@ msgstr "" #, fuzzy msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" "Establece el [Font] del tema a [code]font[/code] en [code]name[/code] en " "[code]type[/code].\n" @@ -80944,8 +81143,8 @@ msgstr "" #, fuzzy msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" "Establece el [StyleBox] del tema a [code]stylebox[/code] en [code]name[/" "code] en [code]type[/code].\n" @@ -80955,10 +81154,10 @@ msgstr "" #, fuzzy msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" "Establece el [Font] del tema a [code]font[/code] en [code]name[/code] en " "[code]type[/code].\n" @@ -85082,21 +85281,25 @@ msgstr "" "sola." #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." -msgstr "Funciones de red de UPNP." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." +msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -85109,7 +85312,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -85138,7 +85341,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -85146,24 +85381,38 @@ msgid "Adds the given [UPNPDevice] to the list of discovered devices." msgstr "Añade el [UPNPDevice] dado a la lista de dispositivos descubiertos." #: modules/upnp/doc_classes/UPNP.xml +#, fuzzy msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" "Añade un mapeo para reenviar el [code]port[/code] externo (entre 1 y 65535) " @@ -85192,12 +85441,15 @@ msgid "Clears the list of discovered devices." msgstr "Borra la lista de dispositivos descubiertos." #: modules/upnp/doc_classes/UPNP.xml +#, fuzzy msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" "Elimina la asignación de puertos para la combinación de puertos y protocolos " "dada en la pasarela por defecto (ver [method get_gateway]) si existe. " @@ -85443,16 +85695,17 @@ msgid "Unknown error." msgstr "Error desconocido." #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." -msgstr "Dispositivo UPNP." +msgid "Universal Plug and Play (UPnP) device." +msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml +#, fuzzy msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" "Dispositivo UPNP. Véase [UPNP] para las funciones de descubrimiento y " "utilidad del UPNP. Proporciona un acceso de bajo nivel a los comandos de " @@ -93502,6 +93755,10 @@ msgid "Flag used to mark an index array." msgstr "Bandera usada para marcar un array de Ãndices." #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "Flag usada para marcar una array de colores comprimida (real)." + +#: doc/classes/VisualServer.xml #, fuzzy msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " @@ -96678,8 +96935,13 @@ msgstr "" "dependencia cÃclica, y permite que las referencias sean liberadas." #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." -msgstr "Devuelve el [Object] al que se refiere este weakref." +#, fuzzy +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." +msgstr "" +"Devuelve el valor inicial de la propiedad especificada. Devuelve [code]null[/" +"code] si la propiedad no existe." #: modules/webrtc/doc_classes/WebRTCDataChannel.xml msgid "Closes this data channel, notifying the other peer." diff --git a/doc/translations/et.po b/doc/translations/et.po new file mode 100644 index 0000000000..40bf471522 --- /dev/null +++ b/doc/translations/et.po @@ -0,0 +1,75525 @@ +# Estonian translation of the Godot Engine class reference. +# Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. +# Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). +# This file is distributed under the same license as the Godot source code. +# +# dogyx <aaronloit@zohomail.eu>, 2022. +msgid "" +msgstr "" +"Project-Id-Version: Godot Engine class reference\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" +"PO-Revision-Date: 2022-09-12 01:18+0000\n" +"Last-Translator: dogyx <aaronloit@zohomail.eu>\n" +"Language-Team: Estonian <https://hosted.weblate.org/projects/godot-engine/" +"godot-class-reference/et/>\n" +"Language: et\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8-bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.14.1-dev\n" + +#: doc/tools/make_rst.py +msgid "Description" +msgstr "Kirjeldus" + +#: doc/tools/make_rst.py +msgid "Tutorials" +msgstr "Õpetused" + +#: doc/tools/make_rst.py +msgid "Properties" +msgstr "Atribuudid" + +#: doc/tools/make_rst.py +msgid "Methods" +msgstr "Meetodid" + +#: doc/tools/make_rst.py +msgid "Theme Properties" +msgstr "Teema atribuudid" + +#: doc/tools/make_rst.py +msgid "Signals" +msgstr "Signaalid" + +#: doc/tools/make_rst.py +msgid "Enumerations" +msgstr "Loendused" + +#: doc/tools/make_rst.py +msgid "Constants" +msgstr "Konstandid" + +#: doc/tools/make_rst.py +msgid "Property Descriptions" +msgstr "Atribuutide kirjeldused" + +#: doc/tools/make_rst.py +msgid "Method Descriptions" +msgstr "Meetodite kirjeldused" + +#: doc/tools/make_rst.py +msgid "Theme Property Descriptions" +msgstr "Teema atribuutide kirjeldused" + +#: doc/tools/make_rst.py +msgid "Inherits:" +msgstr "Pärandub:" + +#: doc/tools/make_rst.py +msgid "Inherited By:" +msgstr "Pärandanud:" + +#: doc/tools/make_rst.py +msgid "(overrides %s)" +msgstr "(võtab üle %s)" + +#: doc/tools/make_rst.py +msgid "Default" +msgstr "Vaikimisi" + +#: doc/tools/make_rst.py +msgid "Setter" +msgstr "Setter" + +#: doc/tools/make_rst.py +msgid "value" +msgstr "väärtus" + +#: doc/tools/make_rst.py +msgid "Getter" +msgstr "Getter" + +#: doc/tools/make_rst.py +msgid "" +"This method should typically be overridden by the user to have any effect." +msgstr "" +"Kasutaja peaks selle meetodi tavaliselt üle võtma, et sellel oleks mingit " +"mõju." + +#: doc/tools/make_rst.py +msgid "" +"This method has no side effects. It doesn't modify any of the instance's " +"member variables." +msgstr "" +"Sellel meetodil ei ole kõrvalmõjusid. See ei muuda ühtegi eksemplari " +"liikmemuutujat." + +#: doc/tools/make_rst.py +msgid "" +"This method accepts any number of arguments after the ones described here." +msgstr "" +"See meetod võtab vastu mis tahes arvu argumente pärast siin kirjeldatud " +"argumente." + +#: doc/tools/make_rst.py +msgid "This method is used to construct a type." +msgstr "Seda meetodit kasutatakse tüübi konstrueerimiseks." + +#: doc/tools/make_rst.py +msgid "" +"This method doesn't need an instance to be called, so it can be called " +"directly using the class name." +msgstr "" +"Selle meetodi kutsumiseks pole vaja eksemplari, nii et seda saab kutsuda " +"otse kasutades klassi nime." + +#: doc/tools/make_rst.py +msgid "" +"This method describes a valid operator to use with this type as left-hand " +"operand." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "Built-in GDScript functions." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"List of core built-in GDScript functions. Math functions and other " +"utilities. Everything else is provided by objects. (Keywords: builtin, built " +"in, global functions.)" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns a color constructed from integer red, green, blue, and alpha " +"channels. Each channel should have 8 bits of information ranging from 0 to " +"255.\n" +"[code]r8[/code] red channel\n" +"[code]g8[/code] green channel\n" +"[code]b8[/code] blue channel\n" +"[code]a8[/code] alpha channel\n" +"[codeblock]\n" +"red = Color8(255, 0, 0)\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns a color according to the standardized [code]name[/code] with " +"[code]alpha[/code] ranging from 0 to 1.\n" +"[codeblock]\n" +"red = ColorN(\"red\", 1)\n" +"[/codeblock]\n" +"Supported color names are the same as the constants defined in [Color]." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns the absolute value of parameter [code]s[/code] (i.e. positive " +"value).\n" +"[codeblock]\n" +"a = abs(-1) # a is 1\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns the arc cosine of [code]s[/code] in radians. Use to get the angle of " +"cosine [code]s[/code]. [code]s[/code] must be between [code]-1.0[/code] and " +"[code]1.0[/code] (inclusive), otherwise, [method acos] will return [constant " +"NAN].\n" +"[codeblock]\n" +"# c is 0.523599 or 30 degrees if converted with rad2deg(s)\n" +"c = acos(0.866025)\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns the arc sine of [code]s[/code] in radians. Use to get the angle of " +"sine [code]s[/code]. [code]s[/code] must be between [code]-1.0[/code] and " +"[code]1.0[/code] (inclusive), otherwise, [method asin] will return [constant " +"NAN].\n" +"[codeblock]\n" +"# s is 0.523599 or 30 degrees if converted with rad2deg(s)\n" +"s = asin(0.5)\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Asserts that the [code]condition[/code] is [code]true[/code]. If the " +"[code]condition[/code] is [code]false[/code], an error is generated. When " +"running from the editor, the running project will also be paused until you " +"resume it. This can be used as a stronger form of [method push_error] for " +"reporting errors to project developers or add-on users.\n" +"[b]Note:[/b] For performance reasons, the code inside [method assert] is " +"only executed in debug builds or when running the project from the editor. " +"Don't include code that has side effects in an [method assert] call. " +"Otherwise, the project will behave differently when exported in release " +"mode.\n" +"The optional [code]message[/code] argument, if given, is shown in addition " +"to the generic \"Assertion failed\" message. You can use this to provide " +"additional details about why the assertion failed.\n" +"[codeblock]\n" +"# Imagine we always want speed to be between 0 and 20.\n" +"var speed = -10\n" +"assert(speed < 20) # True, the program will continue\n" +"assert(speed >= 0) # False, the program will stop\n" +"assert(speed >= 0 and speed < 20) # You can also combine the two conditional " +"statements in one check\n" +"assert(speed < 20, \"speed = %f, but the speed limit is 20\" % speed) # Show " +"a message with clarifying details\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns the arc tangent of [code]s[/code] in radians. Use it to get the " +"angle from an angle's tangent in trigonometry: [code]atan(tan(angle)) == " +"angle[/code].\n" +"The method cannot know in which quadrant the angle should fall. See [method " +"atan2] if you have both [code]y[/code] and [code]x[/code].\n" +"[codeblock]\n" +"a = atan(0.5) # a is 0.463648\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns the arc tangent of [code]y/x[/code] in radians. Use to get the angle " +"of tangent [code]y/x[/code]. To compute the value, the method takes into " +"account the sign of both arguments in order to determine the quadrant.\n" +"Important note: The Y coordinate comes first, by convention.\n" +"[codeblock]\n" +"a = atan2(0, -1) # a is 3.141593\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Decodes a byte array back to a value. When [code]allow_objects[/code] is " +"[code]true[/code] decoding objects is allowed.\n" +"[b]WARNING:[/b] Deserialized object can contain code which gets executed. Do " +"not use this option if the serialized object comes from untrusted sources to " +"avoid potential security threats (remote code execution)." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "" +"Converts a 2D point expressed in the cartesian coordinate system (X and Y " +"axis) to the polar coordinate system (a distance from the origin and an " +"angle)." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Rounds [code]s[/code] upward (towards positive infinity), returning the " +"smallest whole number that is not less than [code]s[/code].\n" +"[codeblock]\n" +"a = ceil(1.45) # a is 2.0\n" +"a = ceil(1.001) # a is 2.0\n" +"[/codeblock]\n" +"See also [method floor], [method round], [method stepify], and [int]." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns a character as a String of the given Unicode code point (which is " +"compatible with ASCII code).\n" +"[codeblock]\n" +"a = char(65) # a is \"A\"\n" +"a = char(65 + 32) # a is \"a\"\n" +"a = char(8364) # a is \"€\"\n" +"[/codeblock]\n" +"This is the inverse of [method ord]." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Clamps [code]value[/code] and returns a value not less than [code]min[/code] " +"and not more than [code]max[/code].\n" +"[codeblock]\n" +"a = clamp(1000, 1, 20) # a is 20\n" +"a = clamp(-10, 1, 20) # a is 1\n" +"a = clamp(15, 1, 20) # a is 15\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Converts from a type to another in the best way possible. The [code]type[/" +"code] parameter uses the [enum Variant.Type] values.\n" +"[codeblock]\n" +"a = Vector2(1, 0)\n" +"# Prints 1\n" +"print(a.length())\n" +"a = convert(a, TYPE_STRING)\n" +"# Prints 6 as \"(1, 0)\" is 6 characters\n" +"print(a.length())\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns the cosine of angle [code]s[/code] in radians.\n" +"[codeblock]\n" +"a = cos(TAU) # a is 1.0\n" +"a = cos(PI) # a is -1.0\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns the hyperbolic cosine of [code]s[/code] in radians.\n" +"[codeblock]\n" +"print(cosh(1)) # Prints 1.543081\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "Converts from decibels to linear energy (audio)." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "Deprecated alias for [method step_decimals]." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"[b]Note:[/b] [code]dectime[/code] has been deprecated and will be removed in " +"Godot 4.0, please use [method move_toward] instead.\n" +"Returns the result of [code]value[/code] decreased by [code]step[/code] * " +"[code]amount[/code].\n" +"[codeblock]\n" +"a = dectime(60, 10, 0.1)) # a is 59.0\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Compares two values by checking their actual contents, recursing into any " +"[Array] or [Dictionary] up to its deepest level.\n" +"This compares to [code]==[/code] in a number of ways:\n" +"- For [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" +"code], [code]Object[/code] and [code]RID[/code] both [code]deep_equal[/code] " +"and [code]==[/code] work the same.\n" +"- For [code]Dictionary[/code], [code]==[/code] considers equality if, and " +"only if, both variables point to the very same [code]Dictionary[/code], with " +"no recursion or awareness of the contents at all.\n" +"- For [code]Array[/code], [code]==[/code] considers equality if, and only " +"if, each item in the first [code]Array[/code] is equal to its counterpart in " +"the second [code]Array[/code], as told by [code]==[/code] itself. That " +"implies that [code]==[/code] recurses into [code]Array[/code], but not into " +"[code]Dictionary[/code].\n" +"In short, whenever a [code]Dictionary[/code] is potentially involved, if you " +"want a true content-aware comparison, you have to use [code]deep_equal[/" +"code]." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Converts an angle expressed in degrees to radians.\n" +"[codeblock]\n" +"r = deg2rad(180) # r is 3.141593\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Converts a dictionary (previously created with [method inst2dict]) back to " +"an instance. Useful for deserializing." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns an \"eased\" value of [code]x[/code] based on an easing function " +"defined with [code]curve[/code]. This easing function is based on an " +"exponent. The [code]curve[/code] can be any floating-point number, with " +"specific values leading to the following behaviors:\n" +"[codeblock]\n" +"- Lower than -1.0 (exclusive): Ease in-out\n" +"- 1.0: Linear\n" +"- Between -1.0 and 0.0 (exclusive): Ease out-in\n" +"- 0.0: Constant\n" +"- Between 0.0 to 1.0 (exclusive): Ease out\n" +"- 1.0: Linear\n" +"- Greater than 1.0 (exclusive): Ease in\n" +"[/codeblock]\n" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" +"ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" +"See also [method smoothstep]. If you need to perform more advanced " +"transitions, use [Tween] or [AnimationPlayer]." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"The natural exponential function. It raises the mathematical constant [b]e[/" +"b] to the power of [code]s[/code] and returns it.\n" +"[b]e[/b] has an approximate value of 2.71828, and can be obtained with " +"[code]exp(1)[/code].\n" +"For exponents to other bases use the method [method pow].\n" +"[codeblock]\n" +"a = exp(2) # Approximately 7.39\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Rounds [code]s[/code] downward (towards negative infinity), returning the " +"largest whole number that is not more than [code]s[/code].\n" +"[codeblock]\n" +"a = floor(2.45) # a is 2.0\n" +"a = floor(2.99) # a is 2.0\n" +"a = floor(-2.99) # a is -3.0\n" +"[/codeblock]\n" +"See also [method ceil], [method round], [method stepify], and [int].\n" +"[b]Note:[/b] This method returns a float. If you need an integer and " +"[code]s[/code] is a non-negative number, you can use [code]int(s)[/code] " +"directly." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns the floating-point remainder of [code]a/b[/code], keeping the sign " +"of [code]a[/code].\n" +"[codeblock]\n" +"r = fmod(7, 5.5) # r is 1.5\n" +"[/codeblock]\n" +"For the integer remainder operation, use the % operator." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns the floating-point modulus of [code]a/b[/code] that wraps equally in " +"positive and negative.\n" +"[codeblock]\n" +"for i in 7:\n" +" var x = 0.5 * i - 1.5\n" +" print(\"%4.1f %4.1f %4.1f\" % [x, fmod(x, 1.5), fposmod(x, 1.5)])\n" +"[/codeblock]\n" +"Produces:\n" +"[codeblock]\n" +"-1.5 -0.0 0.0\n" +"-1.0 -1.0 0.5\n" +"-0.5 -0.5 1.0\n" +" 0.0 0.0 0.0\n" +" 0.5 0.5 0.5\n" +" 1.0 1.0 1.0\n" +" 1.5 0.0 0.0\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns a reference to the specified function [code]funcname[/code] in the " +"[code]instance[/code] node. As functions aren't first-class objects in " +"GDscript, use [code]funcref[/code] to store a [FuncRef] in a variable and " +"call it later.\n" +"[codeblock]\n" +"func foo():\n" +" return(\"bar\")\n" +"\n" +"a = funcref(self, \"foo\")\n" +"print(a.call_func()) # Prints bar\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns an array of dictionaries representing the current call stack.\n" +"[codeblock]\n" +"func _ready():\n" +" foo()\n" +"\n" +"func foo():\n" +" bar()\n" +"\n" +"func bar():\n" +" print(get_stack())\n" +"[/codeblock]\n" +"would print\n" +"[codeblock]\n" +"[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " +"source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns the integer hash of the variable passed.\n" +"[codeblock]\n" +"print(hash(\"a\")) # Prints 177670\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns the passed instance converted to a dictionary (useful for " +"serializing).\n" +"[codeblock]\n" +"var foo = \"bar\"\n" +"func _ready():\n" +" var d = inst2dict(self)\n" +" print(d.keys())\n" +" print(d.values())\n" +"[/codeblock]\n" +"Prints out:\n" +"[codeblock]\n" +"[@subpath, @path, foo]\n" +"[, res://test.gd, bar]\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns the Object that corresponds to [code]instance_id[/code]. All Objects " +"have a unique instance ID.\n" +"[codeblock]\n" +"var foo = \"bar\"\n" +"func _ready():\n" +" var id = get_instance_id()\n" +" var inst = instance_from_id(id)\n" +" print(inst.foo) # Prints bar\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns an interpolation or extrapolation factor considering the range " +"specified in [code]from[/code] and [code]to[/code], and the interpolated " +"value specified in [code]weight[/code]. The returned value will be between " +"[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " +"[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " +"located outside this range, then an extrapolation factor will be returned " +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" +"[codeblock]\n" +"# The interpolation ratio in the `lerp()` call below is 0.75.\n" +"var middle = lerp(20, 30, 0.75)\n" +"# `middle` is now 27.5.\n" +"# Now, we pretend to have forgotten the original ratio and want to get it " +"back.\n" +"var ratio = inverse_lerp(20, 30, 27.5)\n" +"# `ratio` is now 0.75.\n" +"[/codeblock]\n" +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns [code]true[/code] if [code]a[/code] and [code]b[/code] are " +"approximately equal to each other.\n" +"Here, approximately equal means that [code]a[/code] and [code]b[/code] are " +"within a small internal epsilon of each other, which scales with the " +"magnitude of the numbers.\n" +"Infinity values of the same sign are considered equal." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns whether [code]s[/code] is an infinity value (either positive " +"infinity or negative infinity)." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns whether [code]instance[/code] is a valid object (e.g. has not been " +"deleted from memory)." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns whether [code]s[/code] is a NaN (\"Not a Number\" or invalid) value." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns [code]true[/code] if [code]s[/code] is zero or almost zero.\n" +"This method is faster than using [method is_equal_approx] with one value as " +"zero." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns length of Variant [code]var[/code]. Length is the character count of " +"String, element count of Array, size of Dictionary, etc.\n" +"[b]Note:[/b] Generates a fatal error if Variant can not provide a length.\n" +"[codeblock]\n" +"a = [1, 2, 3, 4]\n" +"len(a) # Returns 4\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Linearly interpolates between two values by the factor defined in " +"[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " +"between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " +"outside this range are allowed and can be used to perform [i]extrapolation[/" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" +"If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " +"[float], the return value is a [float].\n" +"If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " +"return value will be of the same type ([code]lerp[/code] then calls the " +"vector type's [code]linear_interpolate[/code] method).\n" +"[codeblock]\n" +"lerp(0, 4, 0.75) # Returns 3.0\n" +"lerp(Vector2(1, 5), Vector2(3, 2), 0.5) # Returns Vector2(2, 3.5)\n" +"[/codeblock]\n" +"See also [method inverse_lerp] which performs the reverse of this operation. " +"To perform eased interpolation with [method lerp], combine it with [method " +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Linearly interpolates between two angles (in radians) by a normalized " +"value.\n" +"Similar to [method lerp], but interpolates correctly when the angles wrap " +"around [constant @GDScript.TAU]. To perform eased interpolation with [method " +"lerp_angle], combine it with [method ease] or [method smoothstep].\n" +"[codeblock]\n" +"extends Sprite\n" +"var elapsed = 0.0\n" +"func _process(delta):\n" +" var min_angle = deg2rad(0.0)\n" +" var max_angle = deg2rad(90.0)\n" +" rotation = lerp_angle(min_angle, max_angle, elapsed)\n" +" elapsed += delta\n" +"[/codeblock]\n" +"[b]Note:[/b] This method lerps through the shortest path between [code]from[/" +"code] and [code]to[/code]. However, when these two angles are approximately " +"[code]PI + k * TAU[/code] apart for any integer [code]k[/code], it's not " +"obvious which way they lerp due to floating-point precision errors. For " +"example, [code]lerp_angle(0, PI, weight)[/code] lerps counter-clockwise, " +"while [code]lerp_angle(0, PI + 5 * TAU, weight)[/code] lerps clockwise." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Converts from linear energy to decibels (audio). This can be used to " +"implement volume sliders that behave as expected (since volume isn't " +"linear). Example:\n" +"[codeblock]\n" +"# \"Slider\" refers to a node that inherits Range such as HSlider or " +"VSlider.\n" +"# Its range must be configured to go from 0 to 1.\n" +"# Change the bus name if you'd like to change the volume of a specific bus " +"only.\n" +"AudioServer.set_bus_volume_db(AudioServer.get_bus_index(\"Master\"), " +"linear2db($Slider.value))\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Loads a resource from the filesystem located at [code]path[/code]. The " +"resource is loaded on the method call (unless it's referenced already " +"elsewhere, e.g. in another script or in the scene), which might cause slight " +"delay, especially when loading scenes. To avoid unnecessary delays when " +"loading something multiple times, either store the resource in a variable or " +"use [method preload].\n" +"[b]Note:[/b] Resource paths can be obtained by right-clicking on a resource " +"in the FileSystem dock and choosing \"Copy Path\" or by dragging the file " +"from the FileSystem dock into the script.\n" +"[codeblock]\n" +"# Load a scene called main located in the root of the project directory and " +"cache it in a variable.\n" +"var main = load(\"res://main.tscn\") # main will contain a PackedScene " +"resource.\n" +"[/codeblock]\n" +"[b]Important:[/b] The path must be absolute, a local path will just return " +"[code]null[/code].\n" +"This method is a simplified version of [method ResourceLoader.load], which " +"can be used for more advanced scenarios." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Natural logarithm. The amount of time needed to reach a certain level of " +"continuous growth.\n" +"[b]Note:[/b] This is not the same as the \"log\" function on most " +"calculators, which uses a base 10 logarithm.\n" +"[codeblock]\n" +"log(10) # Returns 2.302585\n" +"[/codeblock]\n" +"[b]Note:[/b] The logarithm of [code]0[/code] returns [code]-inf[/code], " +"while negative values return [code]-nan[/code]." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns the maximum of two values.\n" +"[codeblock]\n" +"max(1, 2) # Returns 2\n" +"max(-3.99, -4) # Returns -3.99\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns the minimum of two values.\n" +"[codeblock]\n" +"min(1, 2) # Returns 1\n" +"min(-3.99, -4) # Returns -4\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Moves [code]from[/code] toward [code]to[/code] by the [code]delta[/code] " +"value.\n" +"Use a negative [code]delta[/code] value to move away.\n" +"[codeblock]\n" +"move_toward(5, 10, 4) # Returns 9\n" +"move_toward(10, 5, 4) # Returns 6\n" +"move_toward(10, 5, -1.5) # Returns 11.5\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns the nearest equal or larger power of 2 for integer [code]value[/" +"code].\n" +"In other words, returns the smallest value [code]a[/code] where [code]a = " +"pow(2, n)[/code] such that [code]value <= a[/code] for some non-negative " +"integer [code]n[/code].\n" +"[codeblock]\n" +"nearest_po2(3) # Returns 4\n" +"nearest_po2(4) # Returns 4\n" +"nearest_po2(5) # Returns 8\n" +"\n" +"nearest_po2(0) # Returns 0 (this may not be what you expect)\n" +"nearest_po2(-1) # Returns 0 (this may not be what you expect)\n" +"[/codeblock]\n" +"[b]WARNING:[/b] Due to the way it is implemented, this function returns " +"[code]0[/code] rather than [code]1[/code] for non-positive values of " +"[code]value[/code] (in reality, 1 is the smallest integer power of 2)." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns an integer representing the Unicode code point of the given Unicode " +"character [code]char[/code].\n" +"[codeblock]\n" +"a = ord(\"A\") # a is 65\n" +"a = ord(\"a\") # a is 97\n" +"a = ord(\"€\") # a is 8364\n" +"[/codeblock]\n" +"This is the inverse of [method char]." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Parse JSON text to a Variant. (Use [method typeof] to check if the Variant's " +"type is what you expect.)\n" +"[b]Note:[/b] The JSON specification does not define integer or float types, " +"but only a [i]number[/i] type. Therefore, parsing a JSON text will convert " +"all numerical values to [float] types.\n" +"[b]Note:[/b] JSON objects do not preserve key order like Godot dictionaries, " +"thus, you should not rely on keys being in a certain order if a dictionary " +"is constructed from JSON. In contrast, JSON arrays retain the order of their " +"elements:\n" +"[codeblock]\n" +"var p = JSON.parse('[\"hello\", \"world\", \"!\"]')\n" +"if typeof(p.result) == TYPE_ARRAY:\n" +" print(p.result[0]) # Prints \"hello\"\n" +"else:\n" +" push_error(\"Unexpected results.\")\n" +"[/codeblock]\n" +"See also [JSON] for an alternative way to parse JSON text." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "" +"Converts a 2D point expressed in the polar coordinate system (a distance " +"from the origin [code]r[/code] and an angle [code]th[/code]) to the " +"cartesian coordinate system (X and Y axis)." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns the integer modulus of [code]a/b[/code] that wraps equally in " +"positive and negative.\n" +"[codeblock]\n" +"for i in range(-3, 4):\n" +" print(\"%2d %2d %2d\" % [i, i % 3, posmod(i, 3)])\n" +"[/codeblock]\n" +"Produces:\n" +"[codeblock]\n" +"-3 0 0\n" +"-2 -2 1\n" +"-1 -1 2\n" +" 0 0 0\n" +" 1 1 1\n" +" 2 2 2\n" +" 3 0 0\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns the result of [code]base[/code] raised to the power of [code]exp[/" +"code].\n" +"[codeblock]\n" +"pow(2, 5) # Returns 32.0\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns a [Resource] from the filesystem located at [code]path[/code]. The " +"resource is loaded during script parsing, i.e. is loaded with the script and " +"[method preload] effectively acts as a reference to that resource. Note that " +"the method requires a constant path. If you want to load a resource from a " +"dynamic/variable path, use [method load].\n" +"[b]Note:[/b] Resource paths can be obtained by right clicking on a resource " +"in the Assets Panel and choosing \"Copy Path\" or by dragging the file from " +"the FileSystem dock into the script.\n" +"[codeblock]\n" +"# Instance a scene.\n" +"var diamond = preload(\"res://diamond.tscn\").instance()\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Converts one or more arguments of any type to string in the best way " +"possible and prints them to the console.\n" +"[codeblock]\n" +"a = [1, 2, 3]\n" +"print(\"a\", \"=\", a) # Prints a=[1, 2, 3]\n" +"[/codeblock]\n" +"[b]Note:[/b] Consider using [method push_error] and [method push_warning] to " +"print error and warning messages instead of [method print]. This " +"distinguishes them from print messages used for debugging purposes, while " +"also displaying a stack trace when an error or warning is printed." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Like [method print], but includes the current stack frame when running with " +"the debugger turned on.\n" +"Output in the console would look something like this:\n" +"[codeblock]\n" +"Test print\n" +" At: res://test.gd:15:_process()\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Prints a stack track at code location, only works when running with debugger " +"turned on.\n" +"Output in the console would look something like this:\n" +"[codeblock]\n" +"Frame 0 - res://test.gd:16 in function '_process'\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Prints one or more arguments to strings in the best way possible to standard " +"error line.\n" +"[codeblock]\n" +"printerr(\"prints to stderr\")\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Prints one or more arguments to strings in the best way possible to console. " +"No newline is added at the end.\n" +"[codeblock]\n" +"printraw(\"A\")\n" +"printraw(\"B\")\n" +"# Prints AB\n" +"[/codeblock]\n" +"[b]Note:[/b] Due to limitations with Godot's built-in console, this only " +"prints to the terminal. If you need to print in the editor, use another " +"method, such as [method print]." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Prints one or more arguments to the console with a space between each " +"argument.\n" +"[codeblock]\n" +"prints(\"A\", \"B\", \"C\") # Prints A B C\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Prints one or more arguments to the console with a tab between each " +"argument.\n" +"[codeblock]\n" +"printt(\"A\", \"B\", \"C\") # Prints A B C\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Pushes an error message to Godot's built-in debugger and to the OS " +"terminal.\n" +"[codeblock]\n" +"push_error(\"test error\") # Prints \"test error\" to debugger and terminal " +"as error call\n" +"[/codeblock]\n" +"[b]Note:[/b] Errors printed this way will not pause project execution. To " +"print an error message and pause project execution in debug builds, use " +"[code]assert(false, \"test error\")[/code] instead." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Pushes a warning message to Godot's built-in debugger and to the OS " +"terminal.\n" +"[codeblock]\n" +"push_warning(\"test warning\") # Prints \"test warning\" to debugger and " +"terminal as warning call\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Converts an angle expressed in radians to degrees.\n" +"[codeblock]\n" +"rad2deg(0.523599) # Returns 30.0\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns a random floating point value between [code]from[/code] and " +"[code]to[/code] (both endpoints inclusive).\n" +"[codeblock]\n" +"prints(rand_range(0, 1), rand_range(0, 1)) # Prints e.g. 0.135591 0.405263\n" +"[/codeblock]\n" +"[b]Note:[/b] This is equivalent to [code]randf() * (to - from) + from[/code]." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Random from seed: pass a [code]seed[/code], and an array with both number " +"and new seed is returned. \"Seed\" here refers to the internal state of the " +"pseudo random number generator. The internal state of the current " +"implementation is 64 bits." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns a random floating point value on the interval [code][0, 1][/code].\n" +"[codeblock]\n" +"randf() # Returns e.g. 0.375671\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns a random unsigned 32-bit integer. Use remainder to obtain a random " +"value in the interval [code][0, N - 1][/code] (where N is smaller than " +"2^32).\n" +"[codeblock]\n" +"randi() # Returns random integer between 0 and 2^32 - 1\n" +"randi() % 20 # Returns random integer between 0 and 19\n" +"randi() % 100 # Returns random integer between 0 and 99\n" +"randi() % 100 + 1 # Returns random integer between 1 and 100\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Randomizes the seed (or the internal state) of the random number generator. " +"Current implementation reseeds using a number based on time.\n" +"[codeblock]\n" +"func _ready():\n" +" randomize()\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns an array with the given range. [method range] can be called in three " +"ways:\n" +"[code]range(n: int)[/code]: Starts from 0, increases by steps of 1, and " +"stops [i]before[/i] [code]n[/code]. The argument [code]n[/code] is " +"[b]exclusive[/b].\n" +"[code]range(b: int, n: int)[/code]: Starts from [code]b[/code], increases by " +"steps of 1, and stops [i]before[/i] [code]n[/code]. The arguments [code]b[/" +"code] and [code]n[/code] are [b]inclusive[/b] and [b]exclusive[/b], " +"respectively.\n" +"[code]range(b: int, n: int, s: int)[/code]: Starts from [code]b[/code], " +"increases/decreases by steps of [code]s[/code], and stops [i]before[/i] " +"[code]n[/code]. The arguments [code]b[/code] and [code]n[/code] are " +"[b]inclusive[/b] and [b]exclusive[/b], respectively. The argument [code]s[/" +"code] [b]can[/b] be negative, but not [code]0[/code]. If [code]s[/code] is " +"[code]0[/code], an error message is printed.\n" +"[method range] converts all arguments to [int] before processing.\n" +"[b]Note:[/b] Returns an empty array if no value meets the value constraint " +"(e.g. [code]range(2, 5, -1)[/code] or [code]range(5, 5, 1)[/code]).\n" +"Examples:\n" +"[codeblock]\n" +"print(range(4)) # Prints [0, 1, 2, 3]\n" +"print(range(2, 5)) # Prints [2, 3, 4]\n" +"print(range(0, 6, 2)) # Prints [0, 2, 4]\n" +"print(range(4, 1, -1)) # Prints [4, 3, 2]\n" +"[/codeblock]\n" +"To iterate over an [Array] backwards, use:\n" +"[codeblock]\n" +"var array = [3, 6, 9]\n" +"for i in range(array.size(), 0, -1):\n" +" print(array[i - 1])\n" +"[/codeblock]\n" +"Output:\n" +"[codeblock]\n" +"9\n" +"6\n" +"3\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" +"[codeblock]\n" +"range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Rounds [code]s[/code] to the nearest whole number, with halfway cases " +"rounded away from zero.\n" +"[codeblock]\n" +"a = round(2.49) # a is 2.0\n" +"a = round(2.5) # a is 3.0\n" +"a = round(2.51) # a is 3.0\n" +"[/codeblock]\n" +"See also [method floor], [method ceil], [method stepify], and [int]." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Sets seed for the random number generator.\n" +"[codeblock]\n" +"my_seed = \"Godot Rocks\"\n" +"seed(my_seed.hash())\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns the sign of [code]s[/code]: -1 or 1. Returns 0 if [code]s[/code] is " +"0.\n" +"[codeblock]\n" +"sign(-6) # Returns -1\n" +"sign(0) # Returns 0\n" +"sign(6) # Returns 1\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns the sine of angle [code]s[/code] in radians.\n" +"[codeblock]\n" +"sin(0.523599) # Returns 0.5\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns the hyperbolic sine of [code]s[/code].\n" +"[codeblock]\n" +"a = log(2.0) # Returns 0.693147\n" +"sinh(a) # Returns 0.75\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns the result of smoothly interpolating the value of [code]s[/code] " +"between [code]0[/code] and [code]1[/code], based on the where [code]s[/code] " +"lies with respect to the edges [code]from[/code] and [code]to[/code].\n" +"The return value is [code]0[/code] if [code]s <= from[/code], and [code]1[/" +"code] if [code]s >= to[/code]. If [code]s[/code] lies between [code]from[/" +"code] and [code]to[/code], the returned value follows an S-shaped curve that " +"maps [code]s[/code] between [code]0[/code] and [code]1[/code].\n" +"This S-shaped curve is the cubic Hermite interpolator, given by [code]f(y) = " +"3*y^2 - 2*y^3[/code] where [code]y = (x-from) / (to-from)[/code].\n" +"[codeblock]\n" +"smoothstep(0, 2, -5.0) # Returns 0.0\n" +"smoothstep(0, 2, 0.5) # Returns 0.15625\n" +"smoothstep(0, 2, 1.0) # Returns 0.5\n" +"smoothstep(0, 2, 2.0) # Returns 1.0\n" +"[/codeblock]\n" +"Compared to [method ease] with a curve value of [code]-1.6521[/code], " +"[method smoothstep] returns the smoothest possible curve with no sudden " +"changes in the derivative. If you need to perform more advanced transitions, " +"use [Tween] or [AnimationPlayer].\n" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" +"smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " +"-1.6521) return values[/url]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns the square root of [code]s[/code], where [code]s[/code] is a non-" +"negative number.\n" +"[codeblock]\n" +"sqrt(9) # Returns 3\n" +"[/codeblock]\n" +"[b]Note:[/b] Negative values of [code]s[/code] return NaN. If you need " +"negative inputs, use [code]System.Numerics.Complex[/code] in C#." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns the position of the first non-zero digit, after the decimal point. " +"Note that the maximum return value is 10, which is a design decision in the " +"implementation.\n" +"[codeblock]\n" +"n = step_decimals(5) # n is 0\n" +"n = step_decimals(1.0005) # n is 4\n" +"n = step_decimals(0.000000005) # n is 9\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Snaps float value [code]s[/code] to a given [code]step[/code]. This can also " +"be used to round a floating point number to an arbitrary number of " +"decimals.\n" +"[codeblock]\n" +"stepify(100, 32) # Returns 96.0\n" +"stepify(3.14159, 0.01) # Returns 3.14\n" +"[/codeblock]\n" +"See also [method ceil], [method floor], [method round], and [int]." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Converts one or more arguments of any type to string in the best way " +"possible.\n" +"[codeblock]\n" +"var a = [10, 20, 30]\n" +"var b = str(a);\n" +"len(a) # Returns 3\n" +"len(b) # Returns 12\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Converts a formatted string that was returned by [method var2str] to the " +"original value.\n" +"[codeblock]\n" +"a = '{ \"a\": 1, \"b\": 2 }'\n" +"b = str2var(a)\n" +"print(b[\"a\"]) # Prints 1\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns the tangent of angle [code]s[/code] in radians.\n" +"[codeblock]\n" +"tan(deg2rad(45)) # Returns 1\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns the hyperbolic tangent of [code]s[/code].\n" +"[codeblock]\n" +"a = log(2.0) # a is 0.693147\n" +"b = tanh(a) # b is 0.6\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Converts a [Variant] [code]var[/code] to JSON text and return the result. " +"Useful for serializing data to store or send over the network.\n" +"[codeblock]\n" +"# Both numbers below are integers.\n" +"a = { \"a\": 1, \"b\": 2 }\n" +"b = to_json(a)\n" +"print(b) # {\"a\":1, \"b\":2}\n" +"# Both numbers above are floats, even if they display without any decimal " +"places.\n" +"[/codeblock]\n" +"[b]Note:[/b] The JSON specification does not define integer or float types, " +"but only a [i]number[/i] type. Therefore, converting a [Variant] to JSON " +"text will convert all numerical values to [float] types.\n" +"See also [JSON] for an alternative way to convert a [Variant] to JSON text." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns whether the given class exists in [ClassDB].\n" +"[codeblock]\n" +"type_exists(\"Sprite\") # Returns true\n" +"type_exists(\"Variant\") # Returns false\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns the internal type of the given Variant object, using the [enum " +"Variant.Type] values.\n" +"[codeblock]\n" +"p = parse_json('[\"a\", \"b\", \"c\"]')\n" +"if typeof(p) == TYPE_ARRAY:\n" +" print(p[0]) # Prints a\n" +"else:\n" +" print(\"unexpected results\")\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Checks that [code]json[/code] is valid JSON data. Returns an empty string if " +"valid, or an error message otherwise.\n" +"[codeblock]\n" +"j = to_json([1, 2, 3])\n" +"v = validate_json(j)\n" +"if not v:\n" +" print(\"Valid JSON.\")\n" +"else:\n" +" push_error(\"Invalid JSON: \" + v)\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Encodes a variable value to a byte array. When [code]full_objects[/code] is " +"[code]true[/code] encoding objects is allowed (and can potentially include " +"code)." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Converts a Variant [code]var[/code] to a formatted string that can later be " +"parsed using [method str2var].\n" +"[codeblock]\n" +"a = { \"a\": 1, \"b\": 2 }\n" +"print(var2str(a))\n" +"[/codeblock]\n" +"prints\n" +"[codeblock]\n" +"{\n" +"\"a\": 1,\n" +"\"b\": 2\n" +"}\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Returns a weak reference to an object.\n" +"A weak reference to an object is not enough to keep the object alive: when " +"the only remaining references to a referent are weak references, garbage " +"collection is free to destroy the referent and reuse its memory for " +"something else. However, until the object is actually destroyed the weak " +"reference may return the object even if there are no strong references to it." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Wraps float [code]value[/code] between [code]min[/code] and [code]max[/" +"code].\n" +"Usable for creating loop-alike behavior or infinite surfaces.\n" +"[codeblock]\n" +"# Infinite loop between 5.0 and 9.9\n" +"value = wrapf(value + 0.1, 5.0, 10.0)\n" +"[/codeblock]\n" +"[codeblock]\n" +"# Infinite rotation (in radians)\n" +"angle = wrapf(angle + 0.1, 0.0, TAU)\n" +"[/codeblock]\n" +"[codeblock]\n" +"# Infinite rotation (in radians)\n" +"angle = wrapf(angle + 0.1, -PI, PI)\n" +"[/codeblock]\n" +"[b]Note:[/b] If [code]min[/code] is [code]0[/code], this is equivalent to " +"[method fposmod], so prefer using that instead.\n" +"[code]wrapf[/code] is more flexible than using the [method fposmod] approach " +"by giving the user control over the minimum value." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Wraps integer [code]value[/code] between [code]min[/code] and [code]max[/" +"code].\n" +"Usable for creating loop-alike behavior or infinite surfaces.\n" +"[codeblock]\n" +"# Infinite loop between 5 and 9\n" +"frame = wrapi(frame + 1, 5, 10)\n" +"[/codeblock]\n" +"[codeblock]\n" +"# result is -2\n" +"var result = wrapi(-6, -5, -1)\n" +"[/codeblock]\n" +"[b]Note:[/b] If [code]min[/code] is [code]0[/code], this is equivalent to " +"[method posmod], so prefer using that instead.\n" +"[code]wrapi[/code] is more flexible than using the [method posmod] approach " +"by giving the user control over the minimum value." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Stops the function execution and returns the current suspended state to the " +"calling function.\n" +"From the caller, call [method GDScriptFunctionState.resume] on the state to " +"resume execution. This invalidates the state. Within the resumed function, " +"[code]yield()[/code] returns whatever was passed to the [code]resume()[/" +"code] function call.\n" +"If passed an object and a signal, the execution is resumed when the object " +"emits the given signal. In this case, [code]yield()[/code] returns the " +"argument passed to [code]emit_signal()[/code] if the signal takes only one " +"argument, or an array containing all the arguments passed to " +"[code]emit_signal()[/code] if the signal takes multiple arguments.\n" +"You can also use [code]yield[/code] to wait for a function to finish:\n" +"[codeblock]\n" +"func _ready():\n" +" yield(countdown(), \"completed\") # waiting for the countdown() function " +"to complete\n" +" print('Ready')\n" +"\n" +"func countdown():\n" +" yield(get_tree(), \"idle_frame\") # returns a GDScriptFunctionState " +"object to _ready()\n" +" print(3)\n" +" yield(get_tree().create_timer(1.0), \"timeout\")\n" +" print(2)\n" +" yield(get_tree().create_timer(1.0), \"timeout\")\n" +" print(1)\n" +" yield(get_tree().create_timer(1.0), \"timeout\")\n" +"\n" +"# prints:\n" +"# 3\n" +"# 2\n" +"# 1\n" +"# Ready\n" +"[/codeblock]\n" +"When yielding on a function, the [code]completed[/code] signal will be " +"emitted automatically when the function returns. It can, therefore, be used " +"as the [code]signal[/code] parameter of the [code]yield[/code] method to " +"resume.\n" +"In order to yield on a function, the resulting function should also return a " +"[code]GDScriptFunctionState[/code]. Notice [code]yield(get_tree(), " +"\"idle_frame\")[/code] from the above example." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Constant that represents how many times the diameter of a circle fits around " +"its perimeter. This is equivalent to [code]TAU / 2[/code]." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"The circle constant, the circumference of the unit circle in radians. This " +"is equivalent to [code]PI * 2[/code], or 360 degrees in rotations." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"Positive floating-point infinity. This is the result of floating-point " +"division when the divisor is [code]0.0[/code]. For negative infinity, use " +"[code]-INF[/code]. Dividing by [code]-0.0[/code] will result in negative " +"infinity if the numerator is positive, so dividing by [code]0.0[/code] is " +"not the same as dividing by [code]-0.0[/code] (despite [code]0.0 == -0.0[/" +"code] returning [code]true[/code]).\n" +"[b]Note:[/b] Numeric infinity is only a concept with floating-point numbers, " +"and has no equivalent for integers. Dividing an integer number by [code]0[/" +"code] will not result in [constant INF] and will result in a run-time error " +"instead." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml +msgid "" +"\"Not a Number\", an invalid floating-point value. [constant NAN] has " +"special properties, including that it is not equal to itself ([code]NAN == " +"NAN[/code] returns [code]false[/code]). It is output by some invalid " +"operations, such as dividing floating-point [code]0.0[/code] by [code]0.0[/" +"code].\n" +"[b]Note:[/b] \"Not a Number\" is only a concept with floating-point numbers, " +"and has no equivalent for integers. Dividing an integer [code]0[/code] by " +"[code]0[/code] will not result in [constant NAN] and will result in a run-" +"time error instead." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Global scope constants and variables." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"Global scope constants and variables. This is all that resides in the " +"globals, constants regarding error codes, scancodes, property hints, etc.\n" +"Singletons are also documented here, since they can be accessed from " +"anywhere." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The [ARVRServer] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The [AudioServer] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The [CameraServer] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The [ClassDB] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The [Engine] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The [Geometry] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The [IP] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The [Input] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The [InputMap] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The [JSON] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"The [JavaClassWrapper] singleton.\n" +"[b]Note:[/b] Only implemented on Android." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"The [JavaScript] singleton.\n" +"[b]Note:[/b] Only implemented on HTML5." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The [Marshalls] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The [Navigation2DServer] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The [NavigationMeshGenerator] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The [NavigationServer] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The [OS] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The [Performance] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The [Physics2DServer] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The [PhysicsServer] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The [ProjectSettings] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The [ResourceLoader] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The [ResourceSaver] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The [Time] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The [TranslationServer] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The [VisualScriptEditor] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The [VisualServer] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Left margin, usually used for [Control] or [StyleBox]-derived classes." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Top margin, usually used for [Control] or [StyleBox]-derived classes." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Right margin, usually used for [Control] or [StyleBox]-derived classes." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"Bottom margin, usually used for [Control] or [StyleBox]-derived classes." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Top-left corner." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Top-right corner." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Bottom-right corner." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Bottom-left corner." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"General vertical alignment, usually used for [Separator], [ScrollBar], " +"[Slider], etc." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"General horizontal alignment, usually used for [Separator], [ScrollBar], " +"[Slider], etc." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Horizontal left alignment, usually for text-derived classes." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Horizontal center alignment, usually for text-derived classes." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Horizontal right alignment, usually for text-derived classes." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Vertical top alignment, usually for text-derived classes." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Vertical center alignment, usually for text-derived classes." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Vertical bottom alignment, usually for text-derived classes." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Scancodes with this bit applied are non-printable." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Escape key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Tab key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Shift+Tab key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Backspace key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Return key (on the main keyboard)." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Enter key on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Insert key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Delete key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Pause key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Print Screen key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "System Request key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Clear key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Home key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "End key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Left arrow key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Up arrow key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Right arrow key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Down arrow key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Page Up key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Page Down key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Shift key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Control key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Meta key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Alt key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Caps Lock key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Num Lock key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Scroll Lock key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "F1 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "F2 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "F3 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "F4 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "F5 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "F6 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "F7 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "F8 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "F9 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "F10 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "F11 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "F12 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "F13 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "F14 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "F15 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "F16 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Multiply (*) key on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Divide (/) key on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Subtract (-) key on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Period (.) key on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Add (+) key on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Number 0 on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Number 1 on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Number 2 on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Number 3 on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Number 4 on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Number 5 on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Number 6 on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Number 7 on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Number 8 on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Number 9 on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Left Super key (Windows key)." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Right Super key (Windows key)." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Context menu key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Left Hyper key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Right Hyper key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Help key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Left Direction key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Right Direction key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"Media back key. Not to be confused with the Back button on an Android device." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Media forward key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Media stop key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Media refresh key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Volume down key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Mute volume key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Volume up key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Bass Boost key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Bass up key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Bass down key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Treble up key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Treble down key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Media play key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Previous song key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Next song key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Media record key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Home page key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Favorites key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Search key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Standby key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Open URL / Launch Browser key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Launch Mail key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Launch Media key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Launch Shortcut 0 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Launch Shortcut 1 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Launch Shortcut 2 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Launch Shortcut 3 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Launch Shortcut 4 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Launch Shortcut 5 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Launch Shortcut 6 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Launch Shortcut 7 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Launch Shortcut 8 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Launch Shortcut 9 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Launch Shortcut A key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Launch Shortcut B key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Launch Shortcut C key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Launch Shortcut D key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Launch Shortcut E key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Launch Shortcut F key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Unknown key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Space key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "! key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "\" key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "# key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "$ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "% key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "& key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "' key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "( key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid ") key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "* key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "+ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid ", key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "- key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid ". key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "/ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Number 0." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Number 1." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Number 2." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Number 3." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Number 4." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Number 5." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Number 6." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Number 7." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Number 8." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Number 9." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid ": key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "; key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "< key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "= key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "> key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "? key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "@ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "A key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "B key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "C key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "D key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "E key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "F key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "G key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "H key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "I key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "J key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "K key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "L key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "M key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "N key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "O key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "P key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Q key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "R key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "S key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "T key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "U key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "V key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "W key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "X key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Y key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Z key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "[ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "\\ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "] key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "^ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "_ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "` key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "{ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "| key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "} key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "~ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Non-breakable space key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "¡ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "¢ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "£ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "¤ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Â¥ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "¦ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "§ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "¨ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "© key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "ª key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "« key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "¬ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Soft hyphen key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "® key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "¯ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "° key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "± key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "² key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "³ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "´ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "µ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "¶ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "· key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "¸ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "¹ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "º key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "» key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "¼ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "½ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "¾ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "¿ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "À key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "à key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid " key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "à key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Ä key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Ã… key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Æ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Ç key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "È key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "É key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Ê key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Ë key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "ÃŒ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "à key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "ÃŽ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "à key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "à key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Ñ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Ã’ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Ó key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Ô key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Õ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Ö key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "× key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Ø key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Ù key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Ú key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Û key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Ü key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "à key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Þ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "ß key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "÷ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "ÿ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Key Code mask." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Modifier key mask." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Shift key mask." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Alt key mask." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Meta key mask." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Ctrl key mask." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"Command key mask. On macOS, this is equivalent to [constant KEY_MASK_META]. " +"On other platforms, this is equivalent to [constant KEY_MASK_CTRL]. This " +"mask should be preferred to [constant KEY_MASK_META] or [constant " +"KEY_MASK_CTRL] for system shortcuts as it handles all platforms correctly." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Keypad key mask." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Group Switch key mask." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Left mouse button." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Right mouse button." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Middle mouse button." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Extra mouse button 1 (only present on some mice)." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Extra mouse button 2 (only present on some mice)." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Mouse wheel up." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Mouse wheel down." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Mouse wheel left button (only present on some mice)." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Mouse wheel right button (only present on some mice)." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Left mouse button mask." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Right mouse button mask." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Middle mouse button mask." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Extra mouse button 1 mask." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Extra mouse button 2 mask." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Invalid button or axis." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad button 0." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad button 1." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad button 2." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad button 3." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad button 4." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad button 5." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad button 6." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad button 7." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad button 8." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad button 9." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad button 10." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad button 11." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad button 12." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad button 13." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad button 14." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad button 15." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad button 16." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad button 17." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad button 18." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad button 19." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad button 20." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad button 21." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad button 22." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"The maximum number of game controller buttons supported by the engine. The " +"actual limit may be lower on specific platforms:\n" +"- Android: Up to 36 buttons.\n" +"- Linux: Up to 80 buttons.\n" +"- Windows and macOS: Up to 128 buttons." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "DualShock circle button." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "DualShock X button." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "DualShock square button." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "DualShock triangle button." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Xbox controller B button." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Xbox controller A button." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Xbox controller X button." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Xbox controller Y button." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Nintendo controller A button." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Nintendo controller B button." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Nintendo controller X button." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Nintendo controller Y button." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Grip (side) buttons on a VR controller." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Push down on the touchpad or main joystick on a VR controller." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Trigger on a VR controller." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"A button on the right Oculus Touch controller, X button on the left " +"controller (also when used in OpenVR)." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"B button on the right Oculus Touch controller, Y button on the left " +"controller (also when used in OpenVR)." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Menu button on either Oculus Touch controller." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Menu button in OpenVR (Except when Oculus Touch controllers are used)." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad button Select." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad button Start." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad DPad up." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad DPad down." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad DPad left." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad DPad right." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad SDL guide button." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad SDL miscellaneous button." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad SDL paddle 1 button." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad SDL paddle 2 button." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad SDL paddle 3 button." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad SDL paddle 4 button." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad SDL touchpad button." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad left Shoulder button." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad left trigger." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad left stick click." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad right Shoulder button." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad right trigger." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad right stick click." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad left stick horizontal axis." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad left stick vertical axis." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad right stick horizontal axis." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad right stick vertical axis." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Generic gamepad axis 4." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Generic gamepad axis 5." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad left trigger analog axis." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad right trigger analog axis." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Generic gamepad axis 8." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Generic gamepad axis 9." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Represents the maximum number of joystick axes supported." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad left analog trigger." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Gamepad right analog trigger." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "VR Controller analog trigger." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "VR Controller analog grip (side buttons)." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"OpenVR touchpad X axis (Joystick axis on Oculus Touch and Windows MR " +"controllers)." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"OpenVR touchpad Y axis (Joystick axis on Oculus Touch and Windows MR " +"controllers)." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"MIDI note OFF message. See the documentation of [InputEventMIDI] for " +"information of how to use MIDI inputs." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"MIDI note ON message. See the documentation of [InputEventMIDI] for " +"information of how to use MIDI inputs." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"MIDI aftertouch message. This message is most often sent by pressing down on " +"the key after it \"bottoms out\"." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"MIDI control change message. This message is sent when a controller value " +"changes. Controllers include devices such as pedals and levers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"MIDI program change message. This message sent when the program patch number " +"changes." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"MIDI channel pressure message. This message is most often sent by pressing " +"down on the key after it \"bottoms out\". This message is different from " +"polyphonic after-touch as it indicates the highest pressure across all keys." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"MIDI pitch bend message. This message is sent to indicate a change in the " +"pitch bender (wheel or lever, typically)." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"MIDI system exclusive message. This has behavior exclusive to the device " +"you're receiving input from. Getting this data is not implemented in Godot." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"MIDI quarter frame message. Contains timing information that is used to " +"synchronize MIDI devices. Getting this data is not implemented in Godot." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"MIDI song position pointer message. Gives the number of 16th notes since the " +"start of the song. Getting this data is not implemented in Godot." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"MIDI song select message. Specifies which sequence or song is to be played. " +"Getting this data is not implemented in Godot." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"MIDI tune request message. Upon receiving a tune request, all analog " +"synthesizers should tune their oscillators." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"MIDI timing clock message. Sent 24 times per quarter note when " +"synchronization is required." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"MIDI start message. Start the current sequence playing. This message will be " +"followed with Timing Clocks." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "MIDI continue message. Continue at the point the sequence was stopped." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "MIDI stop message. Stop the current sequence." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"MIDI active sensing message. This message is intended to be sent repeatedly " +"to tell the receiver that a connection is alive." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"MIDI system reset message. Reset all receivers in the system to power-up " +"status. It should not be sent on power-up itself." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"Methods that return [enum Error] return [constant OK] when no error " +"occurred. Note that many functions don't return an error code but will print " +"error messages to standard output.\n" +"Since [constant OK] has value 0, and all other failure codes are positive " +"integers, it can also be used in boolean checks, e.g.:\n" +"[codeblock]\n" +"var err = method_that_returns_error()\n" +"if err != OK:\n" +" print(\"Failure!\")\n" +"# Or, equivalent:\n" +"if err:\n" +" print(\"Still failing!\")\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Generic error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Unavailable error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Unconfigured error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Unauthorized error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Parameter range error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Out of memory (OOM) error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "File: Not found error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "File: Bad drive error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "File: Bad path error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "File: No permission error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "File: Already in use error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "File: Can't open error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "File: Can't write error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "File: Can't read error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "File: Unrecognized error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "File: Corrupt error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "File: Missing dependencies error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "File: End of file (EOF) error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Can't open error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Can't create error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Query failed error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Already in use error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Locked error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Timeout error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Can't connect error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Can't resolve error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Connection error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Can't acquire resource error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Can't fork process error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Invalid data error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Invalid parameter error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Already exists error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Does not exist error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Database: Read error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Database: Write error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Compilation failed error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Method not found error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Linking failed error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Script failed error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Cycling link (import cycle) error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Invalid declaration error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Duplicate symbol error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Parse error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Busy error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Skip error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Help error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Bug error." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"Printer on fire error. (This is an easter egg, no engine methods return this " +"error code.)" +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "No hint for the edited property." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"Hints that an integer or float property should be within a range specified " +"via the hint string [code]\"min,max\"[/code] or [code]\"min,max,step\"[/" +"code]. The hint string can optionally include [code]\"or_greater\"[/code] " +"and/or [code]\"or_lesser\"[/code] to allow manual input going respectively " +"above the max or below the min values. Example: [code]\"-360,360,1," +"or_greater,or_lesser\"[/code]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"Hints that a float property should be within an exponential range specified " +"via the hint string [code]\"min,max\"[/code] or [code]\"min,max,step\"[/" +"code]. The hint string can optionally include [code]\"or_greater\"[/code] " +"and/or [code]\"or_lesser\"[/code] to allow manual input going respectively " +"above the max or below the min values. Example: [code]\"0.01,100,0.01," +"or_greater\"[/code]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"Hints that an integer, float or string property is an enumerated value to " +"pick in a list specified via a hint string.\n" +"The hint string is a comma separated list of names such as [code]\"Hello," +"Something,Else\"[/code]. For integer and float properties, the first name in " +"the list has value 0, the next 1, and so on. Explicit values can also be " +"specified by appending [code]:integer[/code] to the name, e.g. [code]\"Zero," +"One,Three:3,Four,Six:6\"[/code]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"Hints that a string property can be an enumerated value to pick in a list " +"specified via a hint string such as [code]\"Hello,Something,Else\"[/code].\n" +"Unlike [constant PROPERTY_HINT_ENUM] a property with this hint still accepts " +"arbitrary values and can be empty. The list of values serves to suggest " +"possible values." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"Hints that a float property should be edited via an exponential easing " +"function. The hint string can include [code]\"attenuation\"[/code] to flip " +"the curve horizontally and/or [code]\"inout\"[/code] to also include in/out " +"easing." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Deprecated hint, unused." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"Hints that an integer property is a bitmask with named bit flags. For " +"example, to allow toggling bits 0, 1, 2 and 4, the hint could be something " +"like [code]\"Bit0,Bit1,Bit2,,Bit4\"[/code]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"Hints that an integer property is a bitmask using the optionally named 2D " +"render layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"Hints that an integer property is a bitmask using the optionally named 2D " +"physics layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"Hints that an integer property is a bitmask using the optionally named 2D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"render layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"physics layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"Hints that a string property is a path to a file. Editing it will show a " +"file dialog for picking the path. The hint string can be a set of filters " +"with wildcards like [code]\"*.png,*.jpg\"[/code]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"Hints that a string property is a path to a directory. Editing it will show " +"a file dialog for picking the path." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"Hints that a string property is an absolute path to a file outside the " +"project folder. Editing it will show a file dialog for picking the path. The " +"hint string can be a set of filters with wildcards like [code]\"*.png,*." +"jpg\"[/code]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"Hints that a string property is an absolute path to a directory outside the " +"project folder. Editing it will show a file dialog for picking the path." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"Hints that a property is an instance of a [Resource]-derived type, " +"optionally specified via the hint string (e.g. [code]\"Texture\"[/code]). " +"Editing it will show a popup menu of valid resource types to instantiate." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"Hints that a string property is text with line breaks. Editing it will show " +"a text input field where line breaks can be typed." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"Hints that a string property should have a placeholder text visible on its " +"input field, whenever the property is empty. The hint string is the " +"placeholder text to use." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"Hints that a color property should be edited without changing its alpha " +"component, i.e. only R, G and B channels are edited." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Hints that an image is compressed using lossy compression." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Hints that an image is compressed using lossless compression." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The property is serialized and saved in the scene file (default)." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The property is shown in the editor inspector (default)." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Deprecated usage flag, unused." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The property can be checked in the editor inspector." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The property is checked in the editor inspector." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The property is a translatable string." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Used to group properties together in the editor. See [EditorInspector]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Used to categorize properties together in the editor." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "The property does not save its state in [PackedScene]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Editing the property prompts the user for restarting the editor." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"The property is a script variable which should be serialized and saved in " +"the scene file." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Default usage (storage, editor and network)." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"Default usage for translatable strings (storage, editor, network and " +"internationalized)." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "" +"Default usage but without showing the property in the editor (storage, " +"network)." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Flag for a normal method." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Flag for an editor method." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Deprecated method flag, unused." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Flag for a constant method." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Flag for a virtual method." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Default method flags." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Variable is [code]null[/code]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Variable is of type [bool]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Variable is of type [int]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Variable is of type [float] (real)." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Variable is of type [String]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Variable is of type [Vector2]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Variable is of type [Rect2]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Variable is of type [Vector3]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Variable is of type [Transform2D]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Variable is of type [Plane]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Variable is of type [Quat]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Variable is of type [AABB]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Variable is of type [Basis]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Variable is of type [Transform]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Variable is of type [Color]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Variable is of type [NodePath]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Variable is of type [RID]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Variable is of type [Object]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Variable is of type [Dictionary]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Variable is of type [Array]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Variable is of type [PoolByteArray]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Variable is of type [PoolIntArray]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Variable is of type [PoolRealArray]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Variable is of type [PoolStringArray]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Variable is of type [PoolVector2Array]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Variable is of type [PoolVector3Array]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Variable is of type [PoolColorArray]." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Represents the size of the [enum Variant.Type] enum." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Equality operator ([code]==[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Inequality operator ([code]!=[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Less than operator ([code]<[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Less than or equal operator ([code]<=[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Greater than operator ([code]>[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Greater than or equal operator ([code]>=[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Addition operator ([code]+[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Subtraction operator ([code]-[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Multiplication operator ([code]*[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Division operator ([code]/[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Unary negation operator ([code]-[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Unary plus operator ([code]+[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Remainder/modulo operator ([code]%[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "String concatenation operator ([code]+[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Left shift operator ([code]<<[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Right shift operator ([code]>>[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Bitwise AND operator ([code]&[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Bitwise OR operator ([code]|[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Bitwise XOR operator ([code]^[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Bitwise NOT operator ([code]~[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Logical AND operator ([code]and[/code] or [code]&&[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Logical OR operator ([code]or[/code] or [code]||[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Logical XOR operator (not implemented in GDScript)." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Logical NOT operator ([code]not[/code] or [code]![/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Logical IN operator ([code]in[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml +msgid "Represents the size of the [enum Variant.Operator] enum." +msgstr "" + +#: doc/classes/AABB.xml +msgid "Axis-Aligned Bounding Box." +msgstr "" + +#: doc/classes/AABB.xml +msgid "" +"[AABB] consists of a position, a size, and several utility functions. It is " +"typically used for fast overlap tests.\n" +"It uses floating-point coordinates. The 2D counterpart to [AABB] is " +"[Rect2].\n" +"[b]Note:[/b] Unlike [Rect2], [AABB] does not have a variant that uses " +"integer coordinates." +msgstr "" + +#: doc/classes/AABB.xml doc/classes/Basis.xml doc/classes/Rect2.xml +#: doc/classes/Transform.xml doc/classes/Transform2D.xml +#: doc/classes/Vector2.xml doc/classes/Vector3.xml +msgid "Math tutorial index" +msgstr "" + +#: doc/classes/AABB.xml doc/classes/Rect2.xml doc/classes/Vector2.xml +#: doc/classes/Vector3.xml +msgid "Vector math" +msgstr "" + +#: doc/classes/AABB.xml doc/classes/Rect2.xml doc/classes/Vector2.xml +#: doc/classes/Vector3.xml +msgid "Advanced vector math" +msgstr "" + +#: doc/classes/AABB.xml +msgid "Constructs an [AABB] from a position and size." +msgstr "" + +#: doc/classes/AABB.xml +msgid "" +"Returns an AABB with equivalent position and size, modified so that the most-" +"negative corner is the origin and the size is positive." +msgstr "" + +#: doc/classes/AABB.xml +msgid "" +"Returns [code]true[/code] if this [AABB] completely encloses another one." +msgstr "" + +#: doc/classes/AABB.xml +msgid "" +"Returns a copy of this [AABB] expanded to include a given point.\n" +"[b]Example:[/b]\n" +"[codeblock]\n" +"# position (-3, 2, 0), size (1, 1, 1)\n" +"var box = AABB(Vector3(-3, 2, 0), Vector3(1, 1, 1))\n" +"# position (-3, -1, 0), size (3, 4, 2), so we fit both the original AABB and " +"Vector3(0, -1, 2)\n" +"var box2 = box.expand(Vector3(0, -1, 2))\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/AABB.xml +msgid "Returns the volume of the [AABB]." +msgstr "" + +#: doc/classes/AABB.xml +msgid "" +"Returns the center of the [AABB], which is equal to [member position] + " +"([member size] / 2)." +msgstr "" + +#: doc/classes/AABB.xml +msgid "Gets the position of the 8 endpoints of the [AABB] in space." +msgstr "" + +#: doc/classes/AABB.xml +msgid "Returns the normalized longest axis of the [AABB]." +msgstr "" + +#: doc/classes/AABB.xml +msgid "" +"Returns the index of the longest axis of the [AABB] (according to " +"[Vector3]'s [code]AXIS_*[/code] constants)." +msgstr "" + +#: doc/classes/AABB.xml +msgid "Returns the scalar length of the longest axis of the [AABB]." +msgstr "" + +#: doc/classes/AABB.xml +msgid "Returns the normalized shortest axis of the [AABB]." +msgstr "" + +#: doc/classes/AABB.xml +msgid "" +"Returns the index of the shortest axis of the [AABB] (according to " +"[Vector3]::AXIS* enum)." +msgstr "" + +#: doc/classes/AABB.xml +msgid "Returns the scalar length of the shortest axis of the [AABB]." +msgstr "" + +#: doc/classes/AABB.xml +msgid "" +"Returns the support point in a given direction. This is useful for collision " +"detection algorithms." +msgstr "" + +#: doc/classes/AABB.xml +msgid "" +"Returns a copy of the [AABB] grown a given amount of units towards all the " +"sides." +msgstr "" + +#: doc/classes/AABB.xml +msgid "Returns [code]true[/code] if the [AABB] is flat or empty." +msgstr "" + +#: doc/classes/AABB.xml +msgid "Returns [code]true[/code] if the [AABB] is empty." +msgstr "" + +#: doc/classes/AABB.xml +msgid "Returns [code]true[/code] if the [AABB] contains a point." +msgstr "" + +#: doc/classes/AABB.xml +msgid "" +"Returns the intersection between two [AABB]. An empty AABB (size 0,0,0) is " +"returned on failure." +msgstr "" + +#: doc/classes/AABB.xml +msgid "Returns [code]true[/code] if the [AABB] overlaps with another." +msgstr "" + +#: doc/classes/AABB.xml +msgid "Returns [code]true[/code] if the [AABB] is on both sides of a plane." +msgstr "" + +#: doc/classes/AABB.xml +msgid "" +"Returns [code]true[/code] if the [AABB] intersects the line segment between " +"[code]from[/code] and [code]to[/code]." +msgstr "" + +#: doc/classes/AABB.xml +msgid "" +"Returns [code]true[/code] if this [AABB] and [code]aabb[/code] are " +"approximately equal, by calling [method @GDScript.is_equal_approx] on each " +"component." +msgstr "" + +#: doc/classes/AABB.xml +msgid "" +"Returns a larger [AABB] that contains both this [AABB] and [code]with[/code]." +msgstr "" + +#: doc/classes/AABB.xml doc/classes/Rect2.xml +msgid "" +"Ending corner. This is calculated as [code]position + size[/code]. Setting " +"this value will change the size." +msgstr "" + +#: doc/classes/AABB.xml doc/classes/Rect2.xml +msgid "Beginning corner. Typically has values lower than [member end]." +msgstr "" + +#: doc/classes/AABB.xml doc/classes/Rect2.xml +msgid "" +"Size from [member position] to [member end]. Typically, all components are " +"positive.\n" +"If the size is negative, you can use [method abs] to fix it." +msgstr "" + +#: doc/classes/AcceptDialog.xml +msgid "Base dialog for user notification." +msgstr "" + +#: doc/classes/AcceptDialog.xml +msgid "" +"This dialog is useful for small notifications to the user about an event. It " +"can only be accepted or closed, with the same result." +msgstr "" + +#: doc/classes/AcceptDialog.xml +msgid "" +"Adds a button with label [code]text[/code] and a custom [code]action[/code] " +"to the dialog and returns the created button. [code]action[/code] will be " +"passed to the [signal custom_action] signal when pressed.\n" +"If [code]true[/code], [code]right[/code] will place the button to the right " +"of any sibling buttons.\n" +"You can use [method remove_button] method to remove a button created with " +"this method from the dialog." +msgstr "" + +#: doc/classes/AcceptDialog.xml +msgid "" +"Adds a button with label [code]name[/code] and a cancel action to the dialog " +"and returns the created button.\n" +"You can use [method remove_button] method to remove a button created with " +"this method from the dialog." +msgstr "" + +#: doc/classes/AcceptDialog.xml +msgid "" +"Returns the label used for built-in text.\n" +"[b]Warning:[/b] This is a required internal node, removing and freeing it " +"may cause a crash. If you wish to hide it or any of its children, use their " +"[member CanvasItem.visible] property." +msgstr "" + +#: doc/classes/AcceptDialog.xml +msgid "" +"Returns the OK [Button] instance.\n" +"[b]Warning:[/b] This is a required internal node, removing and freeing it " +"may cause a crash. If you wish to hide it or any of its children, use their " +"[member CanvasItem.visible] property." +msgstr "" + +#: doc/classes/AcceptDialog.xml +msgid "" +"Registers a [LineEdit] in the dialog. When the enter key is pressed, the " +"dialog will be accepted." +msgstr "" + +#: doc/classes/AcceptDialog.xml +msgid "" +"Removes the [code]button[/code] from the dialog. Does NOT free the " +"[code]button[/code]. The [code]button[/code] must be a [Button] added with " +"[method add_button] or [method add_cancel] method. After removal, pressing " +"the [code]button[/code] will no longer emit this dialog's [signal " +"custom_action] signal or cancel this dialog." +msgstr "" + +#: doc/classes/AcceptDialog.xml +msgid "Sets autowrapping for the text in the dialog." +msgstr "" + +#: doc/classes/AcceptDialog.xml +msgid "" +"If [code]true[/code], the dialog is hidden when the OK button is pressed. " +"You can set it to [code]false[/code] if you want to do e.g. input validation " +"when receiving the [signal confirmed] signal, and handle hiding the dialog " +"in your own logic.\n" +"[b]Note:[/b] Some nodes derived from this class can have a different default " +"value, and potentially their own built-in logic overriding this setting. For " +"example [FileDialog] defaults to [code]false[/code], and has its own input " +"validation code that is called when you press OK, which eventually hides the " +"dialog if the input is valid. As such, this property can't be used in " +"[FileDialog] to disable hiding the dialog when pressing OK." +msgstr "" + +#: doc/classes/AcceptDialog.xml +msgid "The text displayed by the dialog." +msgstr "" + +#: doc/classes/AcceptDialog.xml +msgid "Emitted when the dialog is accepted, i.e. the OK button is pressed." +msgstr "" + +#: doc/classes/AcceptDialog.xml +msgid "Emitted when a custom button is pressed. See [method add_button]." +msgstr "" + +#: doc/classes/AESContext.xml +msgid "Interface to low level AES encryption features." +msgstr "" + +#: doc/classes/AESContext.xml +msgid "" +"This class provides access to AES encryption/decryption of raw data. Both " +"AES-ECB and AES-CBC mode are supported.\n" +"[codeblock]\n" +"extends Node\n" +"\n" +"var aes = AESContext.new()\n" +"\n" +"func _ready():\n" +" var key = \"My secret key!!!\" # Key must be either 16 or 32 bytes.\n" +" var data = \"My secret text!!\" # Data size must be multiple of 16 " +"bytes, apply padding if needed.\n" +" # Encrypt ECB\n" +" aes.start(AESContext.MODE_ECB_ENCRYPT, key.to_utf8())\n" +" var encrypted = aes.update(data.to_utf8())\n" +" aes.finish()\n" +" # Decrypt ECB\n" +" aes.start(AESContext.MODE_ECB_DECRYPT, key.to_utf8())\n" +" var decrypted = aes.update(encrypted)\n" +" aes.finish()\n" +" # Check ECB\n" +" assert(decrypted == data.to_utf8())\n" +"\n" +" var iv = \"My secret iv!!!!\" # IV must be of exactly 16 bytes.\n" +" # Encrypt CBC\n" +" aes.start(AESContext.MODE_CBC_ENCRYPT, key.to_utf8(), iv.to_utf8())\n" +" encrypted = aes.update(data.to_utf8())\n" +" aes.finish()\n" +" # Decrypt CBC\n" +" aes.start(AESContext.MODE_CBC_DECRYPT, key.to_utf8(), iv.to_utf8())\n" +" decrypted = aes.update(encrypted)\n" +" aes.finish()\n" +" # Check CBC\n" +" assert(decrypted == data.to_utf8())\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/AESContext.xml +msgid "Close this AES context so it can be started again. See [method start]." +msgstr "" + +#: doc/classes/AESContext.xml +msgid "" +"Get the current IV state for this context (IV gets updated when calling " +"[method update]). You normally don't need this function.\n" +"[b]Note:[/b] This function only makes sense when the context is started with " +"[constant MODE_CBC_ENCRYPT] or [constant MODE_CBC_DECRYPT]." +msgstr "" + +#: doc/classes/AESContext.xml +msgid "" +"Start the AES context in the given [code]mode[/code]. A [code]key[/code] of " +"either 16 or 32 bytes must always be provided, while an [code]iv[/code] " +"(initialization vector) of exactly 16 bytes, is only needed when [code]mode[/" +"code] is either [constant MODE_CBC_ENCRYPT] or [constant MODE_CBC_DECRYPT]." +msgstr "" + +#: doc/classes/AESContext.xml +msgid "" +"Run the desired operation for this AES context. Will return a " +"[PoolByteArray] containing the result of encrypting (or decrypting) the " +"given [code]src[/code]. See [method start] for mode of operation.\n" +"[b]Note:[/b] The size of [code]src[/code] must be a multiple of 16. Apply " +"some padding if needed." +msgstr "" + +#: doc/classes/AESContext.xml +msgid "AES electronic codebook encryption mode." +msgstr "" + +#: doc/classes/AESContext.xml +msgid "AES electronic codebook decryption mode." +msgstr "" + +#: doc/classes/AESContext.xml +msgid "AES cipher blocker chaining encryption mode." +msgstr "" + +#: doc/classes/AESContext.xml +msgid "AES cipher blocker chaining decryption mode." +msgstr "" + +#: doc/classes/AESContext.xml +msgid "Maximum value for the mode enum." +msgstr "" + +#: doc/classes/AnimatedSprite.xml +msgid "" +"Sprite node that contains multiple textures as frames to play for animation." +msgstr "" + +#: doc/classes/AnimatedSprite.xml +msgid "" +"[AnimatedSprite] is similar to the [Sprite] node, except it carries multiple " +"textures as animation frames. Animations are created using a [SpriteFrames] " +"resource, which allows you to import image files (or a folder containing " +"said files) to provide the animation frames for the sprite. The " +"[SpriteFrames] resource can be configured in the editor via the SpriteFrames " +"bottom panel.\n" +"[b]Note:[/b] You can associate a set of normal or specular maps by creating " +"additional [SpriteFrames] resources with a [code]_normal[/code] or " +"[code]_specular[/code] suffix. For example, having 3 [SpriteFrames] " +"resources [code]run[/code], [code]run_normal[/code], and [code]run_specular[/" +"code] will make it so the [code]run[/code] animation uses normal and " +"specular maps." +msgstr "" + +#: doc/classes/AnimatedSprite.xml doc/classes/AnimationPlayer.xml +msgid "2D Sprite animation" +msgstr "" + +#: doc/classes/AnimatedSprite.xml doc/classes/Area2D.xml +#: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml +#: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml +#: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml +#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/VisibilityNotifier2D.xml +msgid "2D Dodge The Creeps Demo" +msgstr "" + +#: doc/classes/AnimatedSprite.xml +msgid "" +"Plays the animation named [code]anim[/code]. If no [code]anim[/code] is " +"provided, the current animation is played. If [code]backwards[/code] is " +"[code]true[/code], the animation will be played in reverse." +msgstr "" + +#: doc/classes/AnimatedSprite.xml doc/classes/AnimatedSprite3D.xml +msgid "Stops the current animation (does not reset the frame counter)." +msgstr "" + +#: doc/classes/AnimatedSprite.xml +msgid "" +"The current animation from the [member frames] resource. If this value " +"changes, the [code]frame[/code] counter is reset." +msgstr "" + +#: doc/classes/AnimatedSprite.xml doc/classes/SpriteBase3D.xml +msgid "If [code]true[/code], texture will be centered." +msgstr "" + +#: doc/classes/AnimatedSprite.xml doc/classes/Sprite.xml +#: doc/classes/SpriteBase3D.xml doc/classes/TextureButton.xml +#: doc/classes/TextureRect.xml +msgid "If [code]true[/code], texture is flipped horizontally." +msgstr "" + +#: doc/classes/AnimatedSprite.xml doc/classes/Sprite.xml +#: doc/classes/SpriteBase3D.xml doc/classes/TextureButton.xml +#: doc/classes/TextureRect.xml +msgid "If [code]true[/code], texture is flipped vertically." +msgstr "" + +#: doc/classes/AnimatedSprite.xml doc/classes/AnimatedSprite3D.xml +msgid "The displayed animation frame's index." +msgstr "" + +#: doc/classes/AnimatedSprite.xml +msgid "" +"The [SpriteFrames] resource containing the animation(s). Allows you the " +"option to load, edit, clear, make unique and save the states of the " +"[SpriteFrames] resource." +msgstr "" + +#: doc/classes/AnimatedSprite.xml doc/classes/Sprite.xml +#: doc/classes/SpriteBase3D.xml +msgid "The texture's drawing offset." +msgstr "" + +#: doc/classes/AnimatedSprite.xml doc/classes/AnimatedSprite3D.xml +msgid "If [code]true[/code], the [member animation] is currently playing." +msgstr "" + +#: doc/classes/AnimatedSprite.xml +msgid "The animation speed is multiplied by this value." +msgstr "" + +#: doc/classes/AnimatedSprite.xml doc/classes/AnimatedSprite3D.xml +msgid "" +"Emitted when the animation is finished (when it plays the last frame). If " +"the animation is looping, this signal is emitted every time the last frame " +"is drawn." +msgstr "" + +#: doc/classes/AnimatedSprite.xml doc/classes/AnimatedSprite3D.xml +msgid "Emitted when [member frame] changed." +msgstr "" + +#: doc/classes/AnimatedSprite3D.xml +msgid "" +"2D sprite node in 3D world, that can use multiple 2D textures for animation." +msgstr "" + +#: doc/classes/AnimatedSprite3D.xml +msgid "" +"Animations are created using a [SpriteFrames] resource, which can be " +"configured in the editor via the SpriteFrames panel." +msgstr "" + +#: doc/classes/AnimatedSprite3D.xml +msgid "2D Sprite animation (also applies to 3D)" +msgstr "" + +#: doc/classes/AnimatedSprite3D.xml +msgid "Returns [code]true[/code] if an animation is currently being played." +msgstr "" + +#: doc/classes/AnimatedSprite3D.xml +msgid "" +"Plays the animation named [code]anim[/code]. If no [code]anim[/code] is " +"provided, the current animation is played." +msgstr "" + +#: doc/classes/AnimatedSprite3D.xml +msgid "" +"The current animation from the [code]frames[/code] resource. If this value " +"changes, the [code]frame[/code] counter is reset." +msgstr "" + +#: doc/classes/AnimatedSprite3D.xml +msgid "The [SpriteFrames] resource containing the animation(s)." +msgstr "" + +#: doc/classes/AnimatedTexture.xml +msgid "Proxy texture for simple frame-based animations." +msgstr "" + +#: doc/classes/AnimatedTexture.xml +msgid "" +"[AnimatedTexture] is a resource format for frame-based animations, where " +"multiple textures can be chained automatically with a predefined delay for " +"each frame. Unlike [AnimationPlayer] or [AnimatedSprite], it isn't a [Node], " +"but has the advantage of being usable anywhere a [Texture] resource can be " +"used, e.g. in a [TileSet].\n" +"The playback of the animation is controlled by the [member fps] property as " +"well as each frame's optional delay (see [method set_frame_delay]). The " +"animation loops, i.e. it will restart at frame 0 automatically after playing " +"the last frame.\n" +"[AnimatedTexture] currently requires all frame textures to have the same " +"size, otherwise the bigger ones will be cropped to match the smallest one.\n" +"[b]Note:[/b] AnimatedTexture doesn't support using [AtlasTexture]s. Each " +"frame needs to be a separate [Texture]." +msgstr "" + +#: doc/classes/AnimatedTexture.xml +msgid "Returns the given frame's delay value." +msgstr "" + +#: doc/classes/AnimatedTexture.xml +msgid "Returns the given frame's [Texture]." +msgstr "" + +#: doc/classes/AnimatedTexture.xml +msgid "" +"Sets an additional delay (in seconds) between this frame and the next one, " +"that will be added to the time interval defined by [member fps]. By default, " +"frames have no delay defined. If a delay value is defined, the final time " +"interval between this frame and the next will be [code]1.0 / fps + delay[/" +"code].\n" +"For example, for an animation with 3 frames, 2 FPS and a frame delay on the " +"second frame of 1.2, the resulting playback will be:\n" +"[codeblock]\n" +"Frame 0: 0.5 s (1 / fps)\n" +"Frame 1: 1.7 s (1 / fps + 1.2)\n" +"Frame 2: 0.5 s (1 / fps)\n" +"Total duration: 2.7 s\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/AnimatedTexture.xml +msgid "" +"Assigns a [Texture] to the given frame. Frame IDs start at 0, so the first " +"frame has ID 0, and the last frame of the animation has ID [member frames] - " +"1.\n" +"You can define any number of textures up to [constant MAX_FRAMES], but keep " +"in mind that only frames from 0 to [member frames] - 1 will be part of the " +"animation." +msgstr "" + +#: doc/classes/AnimatedTexture.xml +msgid "Sets the currently visible frame of the texture." +msgstr "" + +#: doc/classes/AnimatedTexture.xml +msgid "" +"Animation speed in frames per second. This value defines the default time " +"interval between two frames of the animation, and thus the overall duration " +"of the animation loop based on the [member frames] property. A value of 0 " +"means no predefined number of frames per second, the animation will play " +"according to each frame's frame delay (see [method set_frame_delay]).\n" +"For example, an animation with 8 frames, no frame delay and a [code]fps[/" +"code] value of 2 will run for 4 seconds, with each frame lasting 0.5 seconds." +msgstr "" + +#: doc/classes/AnimatedTexture.xml +msgid "" +"Number of frames to use in the animation. While you can create the frames " +"independently with [method set_frame_texture], you need to set this value " +"for the animation to take new frames into account. The maximum number of " +"frames is [constant MAX_FRAMES]." +msgstr "" + +#: doc/classes/AnimatedTexture.xml +msgid "" +"If [code]true[/code], the animation will only play once and will not loop " +"back to the first frame after reaching the end. Note that reaching the end " +"will not set [member pause] to [code]true[/code]." +msgstr "" + +#: doc/classes/AnimatedTexture.xml +msgid "" +"If [code]true[/code], the animation will pause where it currently is (i.e. " +"at [member current_frame]). The animation will continue from where it was " +"paused when changing this property to [code]false[/code]." +msgstr "" + +#: doc/classes/AnimatedTexture.xml +msgid "" +"The maximum number of frames supported by [AnimatedTexture]. If you need " +"more frames in your animation, use [AnimationPlayer] or [AnimatedSprite]." +msgstr "" + +#: doc/classes/Animation.xml +msgid "Contains data used to animate everything in the engine." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"An Animation resource contains data used to animate everything in the " +"engine. Animations are divided into tracks, and each track must be linked to " +"a node. The state of that node can be changed through time, by adding timed " +"keys (events) to the track.\n" +"[codeblock]\n" +"# This creates an animation that makes the node \"Enemy\" move to the right " +"by\n" +"# 100 pixels in 0.5 seconds.\n" +"var animation = Animation.new()\n" +"var track_index = animation.add_track(Animation.TYPE_VALUE)\n" +"animation.track_set_path(track_index, \"Enemy:position:x\")\n" +"animation.track_insert_key(track_index, 0.0, 0)\n" +"animation.track_insert_key(track_index, 0.5, 100)\n" +"[/codeblock]\n" +"Animations are just data containers, and must be added to nodes such as an " +"[AnimationPlayer] or [AnimationTreePlayer] to be played back. Animation " +"tracks have different types, each with its own set of dedicated methods. " +"Check [enum TrackType] to see available types." +msgstr "" + +#: doc/classes/Animation.xml +msgid "Adds a track to the Animation." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Returns the animation name at the key identified by [code]key_idx[/code]. " +"The [code]track_idx[/code] must be the index of an Animation Track." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Inserts a key with value [code]animation[/code] at the given [code]time[/" +"code] (in seconds). The [code]track_idx[/code] must be the index of an " +"Animation Track." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Sets the key identified by [code]key_idx[/code] to value [code]animation[/" +"code]. The [code]track_idx[/code] must be the index of an Animation Track." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Returns the end offset of the key identified by [code]key_idx[/code]. The " +"[code]track_idx[/code] must be the index of an Audio Track.\n" +"End offset is the number of seconds cut off at the ending of the audio " +"stream." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Returns the start offset of the key identified by [code]key_idx[/code]. The " +"[code]track_idx[/code] must be the index of an Audio Track.\n" +"Start offset is the number of seconds cut off at the beginning of the audio " +"stream." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Returns the audio stream of the key identified by [code]key_idx[/code]. The " +"[code]track_idx[/code] must be the index of an Audio Track." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Inserts an Audio Track key at the given [code]time[/code] in seconds. The " +"[code]track_idx[/code] must be the index of an Audio Track.\n" +"[code]stream[/code] is the [AudioStream] resource to play. " +"[code]start_offset[/code] is the number of seconds cut off at the beginning " +"of the audio stream, while [code]end_offset[/code] is at the ending." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Sets the end offset of the key identified by [code]key_idx[/code] to value " +"[code]offset[/code]. The [code]track_idx[/code] must be the index of an " +"Audio Track." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Sets the start offset of the key identified by [code]key_idx[/code] to value " +"[code]offset[/code]. The [code]track_idx[/code] must be the index of an " +"Audio Track." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Sets the stream of the key identified by [code]key_idx[/code] to value " +"[code]stream[/code]. The [code]track_idx[/code] must be the index of an " +"Audio Track." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Returns the in handle of the key identified by [code]key_idx[/code]. The " +"[code]track_idx[/code] must be the index of a Bezier Track." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Returns the out handle of the key identified by [code]key_idx[/code]. The " +"[code]track_idx[/code] must be the index of a Bezier Track." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Returns the value of the key identified by [code]key_idx[/code]. The " +"[code]track_idx[/code] must be the index of a Bezier Track." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Inserts a Bezier Track key at the given [code]time[/code] in seconds. The " +"[code]track_idx[/code] must be the index of a Bezier Track.\n" +"[code]in_handle[/code] is the left-side weight of the added Bezier curve " +"point, [code]out_handle[/code] is the right-side one, while [code]value[/" +"code] is the actual value at this point." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Returns the interpolated value at the given [code]time[/code] (in seconds). " +"The [code]track_idx[/code] must be the index of a Bezier Track." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Sets the in handle of the key identified by [code]key_idx[/code] to value " +"[code]in_handle[/code]. The [code]track_idx[/code] must be the index of a " +"Bezier Track." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Sets the out handle of the key identified by [code]key_idx[/code] to value " +"[code]out_handle[/code]. The [code]track_idx[/code] must be the index of a " +"Bezier Track." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Sets the value of the key identified by [code]key_idx[/code] to the given " +"value. The [code]track_idx[/code] must be the index of a Bezier Track." +msgstr "" + +#: doc/classes/Animation.xml +msgid "Clear the animation (clear all tracks and reset all)." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Adds a new track that is a copy of the given track from [code]to_animation[/" +"code]." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Returns the index of the specified track. If the track is not found, return " +"-1." +msgstr "" + +#: doc/classes/Animation.xml +msgid "Returns the amount of tracks in the animation." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Returns all the key indices of a method track, given a position and delta " +"time." +msgstr "" + +#: doc/classes/Animation.xml +msgid "Returns the method name of a method track." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Returns the arguments values to be called on a method track for a given key " +"in a given track." +msgstr "" + +#: doc/classes/Animation.xml +msgid "Removes a track by specifying the track index." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Finds the key index by time in a given track. Optionally, only find it if " +"the exact time is given." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Returns [code]true[/code] if the track at [code]idx[/code] wraps the " +"interpolation loop. New tracks wrap the interpolation loop by default." +msgstr "" + +#: doc/classes/Animation.xml +msgid "Returns the interpolation type of a given track." +msgstr "" + +#: doc/classes/Animation.xml +msgid "Returns the amount of keys in a given track." +msgstr "" + +#: doc/classes/Animation.xml +msgid "Returns the time at which the key is located." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Returns the transition curve (easing) for a specific key (see the built-in " +"math function [method @GDScript.ease])." +msgstr "" + +#: doc/classes/Animation.xml +msgid "Returns the value of a given key in a given track." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Gets the path of a track. For more information on the path format, see " +"[method track_set_path]." +msgstr "" + +#: doc/classes/Animation.xml +msgid "Gets the type of a track." +msgstr "" + +#: doc/classes/Animation.xml +msgid "Insert a generic key in a given track." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Returns [code]true[/code] if the track at index [code]idx[/code] is enabled." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Returns [code]true[/code] if the given track is imported. Else, return " +"[code]false[/code]." +msgstr "" + +#: doc/classes/Animation.xml +msgid "Moves a track down." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Changes the index position of track [code]idx[/code] to the one defined in " +"[code]to_idx[/code]." +msgstr "" + +#: doc/classes/Animation.xml +msgid "Moves a track up." +msgstr "" + +#: doc/classes/Animation.xml +msgid "Removes a key by index in a given track." +msgstr "" + +#: doc/classes/Animation.xml +msgid "Removes a key by position (seconds) in a given track." +msgstr "" + +#: doc/classes/Animation.xml +msgid "Enables/disables the given track. Tracks are enabled by default." +msgstr "" + +#: doc/classes/Animation.xml +msgid "Sets the given track as imported or not." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"If [code]true[/code], the track at [code]idx[/code] wraps the interpolation " +"loop." +msgstr "" + +#: doc/classes/Animation.xml +msgid "Sets the interpolation type of a given track." +msgstr "" + +#: doc/classes/Animation.xml +msgid "Sets the time of an existing key." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Sets the transition curve (easing) for a specific key (see the built-in math " +"function [method @GDScript.ease])." +msgstr "" + +#: doc/classes/Animation.xml +msgid "Sets the value of an existing key." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Sets the path of a track. Paths must be valid scene-tree paths to a node and " +"must be specified starting from the parent node of the node that will " +"reproduce the animation. Tracks that control properties or bones must append " +"their name after the path, separated by [code]\":\"[/code].\n" +"For example, [code]\"character/skeleton:ankle\"[/code] or [code]\"character/" +"mesh:transform/local\"[/code]." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Swaps the track [code]idx[/code]'s index position with the track " +"[code]with_idx[/code]." +msgstr "" + +#: doc/classes/Animation.xml +msgid "Insert a transform key for a transform track." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Returns the interpolated value of a transform track at a given time (in " +"seconds). An array consisting of 3 elements: position ([Vector3]), rotation " +"([Quat]) and scale ([Vector3])." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Returns all the key indices of a value track, given a position and delta " +"time." +msgstr "" + +#: doc/classes/Animation.xml +msgid "Returns the update mode of a value track." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Returns the interpolated value at the given time (in seconds). The " +"[code]track_idx[/code] must be the index of a value track." +msgstr "" + +#: doc/classes/Animation.xml +msgid "Sets the update mode (see [enum UpdateMode]) of a value track." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"The total length of the animation (in seconds).\n" +"[b]Note:[/b] Length is not delimited by the last key, as this one may be " +"before or after the end to ensure correct interpolation and looping." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"A flag indicating that the animation must loop. This is used for correct " +"interpolation of animation cycles, and for hinting the player that it must " +"restart the animation." +msgstr "" + +#: doc/classes/Animation.xml +msgid "The animation step value." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Emitted when there's a change in the list of tracks, e.g. tracks are added, " +"moved or have changed paths." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Value tracks set values in node properties, but only those which can be " +"Interpolated." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Transform tracks are used to change node local transforms or skeleton pose " +"bones. Transitions are interpolated." +msgstr "" + +#: doc/classes/Animation.xml +msgid "Method tracks call functions with given arguments per key." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Bezier tracks are used to interpolate a value using custom curves. They can " +"also be used to animate sub-properties of vectors and colors (e.g. alpha " +"value of a [Color])." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Audio tracks are used to play an audio stream with either type of " +"[AudioStreamPlayer]. The stream can be trimmed and previewed in the " +"animation." +msgstr "" + +#: doc/classes/Animation.xml +msgid "Animation tracks play animations in other [AnimationPlayer] nodes." +msgstr "" + +#: doc/classes/Animation.xml +msgid "No interpolation (nearest value)." +msgstr "" + +#: doc/classes/Animation.xml doc/classes/Gradient.xml +msgid "Linear interpolation." +msgstr "" + +#: doc/classes/Animation.xml doc/classes/Gradient.xml +msgid "Cubic interpolation." +msgstr "" + +#: doc/classes/Animation.xml +msgid "Update between keyframes." +msgstr "" + +#: doc/classes/Animation.xml +msgid "Update at the keyframes and hold the value." +msgstr "" + +#: doc/classes/Animation.xml +msgid "Update at the keyframes." +msgstr "" + +#: doc/classes/Animation.xml +msgid "" +"Same as linear interpolation, but also interpolates from the current value " +"(i.e. dynamically at runtime) if the first key isn't at 0 seconds." +msgstr "" + +#: doc/classes/AnimationNode.xml +msgid "Base resource for [AnimationTree] nodes." +msgstr "" + +#: doc/classes/AnimationNode.xml +msgid "" +"Base resource for [AnimationTree] nodes. In general, it's not used directly, " +"but you can create custom ones with custom blending formulas.\n" +"Inherit this when creating nodes mainly for use in [AnimationNodeBlendTree], " +"otherwise [AnimationRootNode] should be used instead." +msgstr "" + +#: doc/classes/AnimationNode.xml +msgid "" +"Adds an input to the node. This is only useful for nodes created for use in " +"an [AnimationNodeBlendTree]." +msgstr "" + +#: doc/classes/AnimationNode.xml +msgid "" +"Blend an animation by [code]blend[/code] amount (name must be valid in the " +"linked [AnimationPlayer]). A [code]time[/code] and [code]delta[/code] may be " +"passed, as well as whether [code]seek[/code] happened." +msgstr "" + +#: doc/classes/AnimationNode.xml +msgid "" +"Blend an input. This is only useful for nodes created for an " +"[AnimationNodeBlendTree]. The [code]time[/code] parameter is a relative " +"delta, unless [code]seek[/code] is [code]true[/code], in which case it is " +"absolute. A filter mode may be optionally passed (see [enum FilterAction] " +"for options)." +msgstr "" + +#: doc/classes/AnimationNode.xml +msgid "" +"Blend another animation node (in case this node contains children animation " +"nodes). This function is only useful if you inherit from [AnimationRootNode] " +"instead, else editors will not display your node for addition." +msgstr "" + +#: doc/classes/AnimationNode.xml +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." +msgstr "" + +#: doc/classes/AnimationNode.xml +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." +msgstr "" + +#: doc/classes/AnimationNode.xml +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." +msgstr "" + +#: doc/classes/AnimationNode.xml +msgid "" +"Amount of inputs in this node, only useful for nodes that go into " +"[AnimationNodeBlendTree]." +msgstr "" + +#: doc/classes/AnimationNode.xml +msgid "Gets the name of an input by index." +msgstr "" + +#: doc/classes/AnimationNode.xml +msgid "" +"Gets the value of a parameter. Parameters are custom local memory used for " +"your nodes, given a resource can be reused in multiple trees." +msgstr "" + +#: doc/classes/AnimationNode.xml +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." +msgstr "" + +#: doc/classes/AnimationNode.xml +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " +"memory used for your nodes, given a resource can be reused in multiple " +"trees. Format is similar to [method Object.get_property_list]." +msgstr "" + +#: doc/classes/AnimationNode.xml +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." +msgstr "" + +#: doc/classes/AnimationNode.xml +msgid "Returns whether the given path is filtered." +msgstr "" + +#: doc/classes/AnimationNode.xml +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" +"Here, call the [method blend_input], [method blend_node] or [method " +"blend_animation] functions. You can also use [method get_parameter] and " +"[method set_parameter] to modify local memory.\n" +"This function should return the time left for the current animation to " +"finish (if unsure, pass the value from the main blend being called)." +msgstr "" + +#: doc/classes/AnimationNode.xml +msgid "Removes an input, call this only when inactive." +msgstr "" + +#: doc/classes/AnimationNode.xml +msgid "Adds or removes a path for the filter." +msgstr "" + +#: doc/classes/AnimationNode.xml +msgid "" +"Sets a custom parameter. These are used as local memory, because resources " +"can be reused across the tree or scenes." +msgstr "" + +#: doc/classes/AnimationNode.xml +msgid "If [code]true[/code], filtering is enabled." +msgstr "" + +#: doc/classes/AnimationNode.xml +msgid "Emitted when the node was removed from the graph." +msgstr "" + +#: doc/classes/AnimationNode.xml +msgid "" +"Emitted by nodes that inherit from this class and that have an internal tree " +"when one of their nodes changes. The nodes that emit this signal are " +"[AnimationNodeBlendSpace1D], [AnimationNodeBlendSpace2D], " +"[AnimationNodeStateMachine], and [AnimationNodeBlendTree]." +msgstr "" + +#: doc/classes/AnimationNode.xml +msgid "Do not use filtering." +msgstr "" + +#: doc/classes/AnimationNode.xml +msgid "Paths matching the filter will be allowed to pass." +msgstr "" + +#: doc/classes/AnimationNode.xml +msgid "Paths matching the filter will be discarded." +msgstr "" + +#: doc/classes/AnimationNode.xml +msgid "Paths matching the filter will be blended (by the blend value)." +msgstr "" + +#: doc/classes/AnimationNodeAdd2.xml +msgid "Blends two animations additively inside of an [AnimationNodeBlendTree]." +msgstr "" + +#: doc/classes/AnimationNodeAdd2.xml +msgid "" +"A resource to add to an [AnimationNodeBlendTree]. Blends two animations " +"additively based on an amount value in the [code][0.0, 1.0][/code] range." +msgstr "" + +#: doc/classes/AnimationNodeAdd2.xml doc/classes/AnimationNodeAdd3.xml +#: doc/classes/AnimationNodeBlend2.xml doc/classes/AnimationNodeBlend3.xml +msgid "" +"If [code]true[/code], sets the [code]optimization[/code] to [code]false[/" +"code] when calling [method AnimationNode.blend_input], forcing the blended " +"animations to update every frame." +msgstr "" + +#: doc/classes/AnimationNodeAdd3.xml +msgid "" +"Blends two of three animations additively inside of an " +"[AnimationNodeBlendTree]." +msgstr "" + +#: doc/classes/AnimationNodeAdd3.xml +msgid "" +"A resource to add to an [AnimationNodeBlendTree]. Blends two animations " +"together additively out of three based on a value in the [code][-1.0, 1.0][/" +"code] range.\n" +"This node has three inputs:\n" +"- The base animation to add to\n" +"- A -add animation to blend with when the blend amount is in the [code]" +"[-1.0, 0.0][/code] range.\n" +"- A +add animation to blend with when the blend amount is in the [code][0.0, " +"1.0][/code] range" +msgstr "" + +#: doc/classes/AnimationNodeAdd3.xml doc/classes/AnimationNodeAnimation.xml +#: doc/classes/AnimationNodeBlend2.xml +#: doc/classes/AnimationNodeBlendSpace2D.xml +#: doc/classes/AnimationNodeOneShot.xml doc/classes/AnimationNodeOutput.xml +#: doc/classes/AnimationNodeTimeScale.xml +#: doc/classes/AnimationNodeTransition.xml +msgid "AnimationTree" +msgstr "" + +#: doc/classes/AnimationNodeAdd3.xml doc/classes/AnimationNodeAnimation.xml +#: doc/classes/AnimationNodeBlend2.xml +#: doc/classes/AnimationNodeBlendSpace2D.xml +#: doc/classes/AnimationNodeOneShot.xml doc/classes/AnimationNodeOutput.xml +#: doc/classes/AnimationNodeTransition.xml doc/classes/AnimationPlayer.xml +#: doc/classes/AnimationTree.xml doc/classes/AudioEffectReverb.xml +#: doc/classes/Camera.xml doc/classes/CollisionShape.xml +#: doc/classes/CylinderShape.xml doc/classes/Environment.xml +#: doc/classes/GIProbe.xml doc/classes/GIProbeData.xml +#: doc/classes/KinematicBody.xml doc/classes/Light.xml doc/classes/Material.xml +#: doc/classes/Mesh.xml doc/classes/MeshInstance.xml doc/classes/Particles.xml +#: doc/classes/Quat.xml doc/classes/Skeleton.xml doc/classes/SpotLight.xml +#: doc/classes/StaticBody.xml doc/classes/WorldEnvironment.xml +msgid "Third Person Shooter Demo" +msgstr "" + +#: doc/classes/AnimationNodeAnimation.xml +msgid "Input animation to use in an [AnimationNodeBlendTree]." +msgstr "" + +#: doc/classes/AnimationNodeAnimation.xml +msgid "" +"A resource to add to an [AnimationNodeBlendTree]. Only features one output " +"set using the [member animation] property. Use it as an input for " +"[AnimationNode] that blend animations together." +msgstr "" + +#: doc/classes/AnimationNodeAnimation.xml doc/classes/AnimationNodeBlend2.xml +#: doc/classes/AnimationNodeOutput.xml doc/classes/AnimationNodeTimeScale.xml +#: doc/classes/AnimationNodeTransition.xml doc/classes/Area.xml +#: doc/classes/Basis.xml doc/classes/BoxShape.xml +#: doc/classes/CollisionShape.xml modules/gridmap/doc_classes/GridMap.xml +#: doc/classes/KinematicBody.xml doc/classes/Mesh.xml +#: doc/classes/MeshInstance.xml doc/classes/MeshLibrary.xml +#: doc/classes/ProjectSettings.xml doc/classes/Transform.xml +msgid "3D Platformer Demo" +msgstr "" + +#: doc/classes/AnimationNodeAnimation.xml +msgid "" +"Animation to use as an output. It is one of the animations provided by " +"[member AnimationTree.anim_player]." +msgstr "" + +#: doc/classes/AnimationNodeBlend2.xml +msgid "Blends two animations linearly inside of an [AnimationNodeBlendTree]." +msgstr "" + +#: doc/classes/AnimationNodeBlend2.xml +msgid "" +"A resource to add to an [AnimationNodeBlendTree]. Blends two animations " +"linearly based on an amount value in the [code][0.0, 1.0][/code] range." +msgstr "" + +#: doc/classes/AnimationNodeBlend3.xml +msgid "" +"Blends two of three animations linearly inside of an " +"[AnimationNodeBlendTree]." +msgstr "" + +#: doc/classes/AnimationNodeBlend3.xml +msgid "" +"A resource to add to an [AnimationNodeBlendTree]. Blends two animations " +"together linearly out of three based on a value in the [code][-1.0, 1.0][/" +"code] range.\n" +"This node has three inputs:\n" +"- The base animation\n" +"- A -blend animation to blend with when the blend amount is in the [code]" +"[-1.0, 0.0][/code] range.\n" +"- A +blend animation to blend with when the blend amount is in the [code]" +"[0.0, 1.0][/code] range" +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace1D.xml +msgid "" +"Blends linearly between two of any number of [AnimationNode] of any type " +"placed on a virtual axis." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace1D.xml +msgid "" +"A resource to add to an [AnimationNodeBlendTree].\n" +"This is a virtual axis on which you can add any type of [AnimationNode] " +"using [method add_blend_point].\n" +"Outputs the linear blend of the two [AnimationNode]s closest to the node's " +"current value.\n" +"You can set the extents of the axis using the [member min_space] and [member " +"max_space]." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace1D.xml +msgid "" +"Adds a new point that represents a [code]node[/code] on the virtual axis at " +"a given position set by [code]pos[/code]. You can insert it at a specific " +"index using the [code]at_index[/code] argument. If you use the default value " +"for [code]at_index[/code], the point is inserted at the end of the blend " +"points array." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace1D.xml +msgid "Returns the number of points on the blend axis." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace1D.xml +msgid "" +"Returns the [AnimationNode] referenced by the point at index [code]point[/" +"code]." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace1D.xml +#: doc/classes/AnimationNodeBlendSpace2D.xml +msgid "Returns the position of the point at index [code]point[/code]." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace1D.xml +msgid "Removes the point at index [code]point[/code] from the blend axis." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace1D.xml +#: doc/classes/AnimationNodeBlendSpace2D.xml +msgid "" +"Changes the [AnimationNode] referenced by the point at index [code]point[/" +"code]." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace1D.xml +#: doc/classes/AnimationNodeBlendSpace2D.xml +msgid "" +"Updates the position of the point at index [code]point[/code] on the blend " +"axis." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace1D.xml +msgid "" +"The blend space's axis's upper limit for the points' position. See [method " +"add_blend_point]." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace1D.xml +msgid "" +"The blend space's axis's lower limit for the points' position. See [method " +"add_blend_point]." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace1D.xml +msgid "Position increment to snap to when moving a point on the axis." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace1D.xml +msgid "Label of the virtual axis of the blend space." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml +msgid "" +"Blends linearly between three [AnimationNode] of any type placed in a 2D " +"space." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml +msgid "" +"A resource to add to an [AnimationNodeBlendTree].\n" +"This node allows you to blend linearly between three animations using a " +"[Vector2] weight.\n" +"You can add vertices to the blend space with [method add_blend_point] and " +"automatically triangulate it by setting [member auto_triangles] to " +"[code]true[/code]. Otherwise, use [method add_triangle] and [method " +"remove_triangle] to create up the blend space by hand." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml +msgid "" +"Adds a new point that represents a [code]node[/code] at the position set by " +"[code]pos[/code]. You can insert it at a specific index using the " +"[code]at_index[/code] argument. If you use the default value for " +"[code]at_index[/code], the point is inserted at the end of the blend points " +"array." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml +msgid "" +"Creates a new triangle using three points [code]x[/code], [code]y[/code], " +"and [code]z[/code]. Triangles can overlap. You can insert the triangle at a " +"specific index using the [code]at_index[/code] argument. If you use the " +"default value for [code]at_index[/code], the point is inserted at the end of " +"the blend points array." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml +msgid "Returns the number of points in the blend space." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml +msgid "" +"Returns the [AnimationRootNode] referenced by the point at index " +"[code]point[/code]." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml +msgid "Returns the number of triangles in the blend space." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml +msgid "" +"Returns the position of the point at index [code]point[/code] in the " +"triangle of index [code]triangle[/code]." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml +msgid "Removes the point at index [code]point[/code] from the blend space." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml +msgid "" +"Removes the triangle at index [code]triangle[/code] from the blend space." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml +msgid "" +"If [code]true[/code], the blend space is triangulated automatically. The " +"mesh updates every time you add or remove points with [method " +"add_blend_point] and [method remove_blend_point]." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml +msgid "" +"Controls the interpolation between animations. See [enum BlendMode] " +"constants." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml +msgid "" +"The blend space's X and Y axes' upper limit for the points' position. See " +"[method add_blend_point]." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml +msgid "" +"The blend space's X and Y axes' lower limit for the points' position. See " +"[method add_blend_point]." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml +msgid "Position increment to snap to when moving a point." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml +msgid "Name of the blend space's X axis." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml +msgid "Name of the blend space's Y axis." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml +msgid "" +"Emitted every time the blend space's triangles are created, removed, or when " +"one of their vertices changes position." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml +msgid "The interpolation between animations is linear." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml +msgid "" +"The blend space plays the animation of the node the blending position is " +"closest to. Useful for frame-by-frame 2D animations." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml +msgid "" +"Similar to [constant BLEND_MODE_DISCRETE], but starts the new animation at " +"the last animation's playback position." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml +msgid "[AnimationTree] node resource that contains many blend type nodes." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml +msgid "" +"This node may contain a sub-tree of any other blend type nodes, such as " +"[AnimationNodeTransition], [AnimationNodeBlend2], [AnimationNodeBlend3], " +"[AnimationNodeOneShot], etc. This is one of the most commonly used roots.\n" +"An [AnimationNodeOutput] node named [code]output[/code] is created by " +"default." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml +msgid "" +"Adds an [AnimationNode] at the given [code]position[/code]. The [code]name[/" +"code] is used to identify the created sub-node later." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml +msgid "" +"Connects the output of an [AnimationNode] as input for another " +"[AnimationNode], at the input port specified by [code]input_index[/code]." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml +msgid "Disconnects the node connected to the specified input." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml +msgid "Returns the sub-node with the specified [code]name[/code]." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml +msgid "" +"Returns the position of the sub-node with the specified [code]name[/code]." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml +msgid "" +"Returns [code]true[/code] if a sub-node with specified [code]name[/code] " +"exists." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml +msgid "Removes a sub-node." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml +msgid "Changes the name of a sub-node." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml +msgid "Modifies the position of a sub-node." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml +msgid "The global offset of all sub-nodes." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml +msgid "The connection was successful." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml +msgid "The input node is [code]null[/code]." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml +msgid "The specified input port is out of range." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml +msgid "The output node is [code]null[/code]." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml +msgid "Input and output nodes are the same." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml +msgid "The specified connection already exists." +msgstr "" + +#: doc/classes/AnimationNodeOneShot.xml +msgid "Plays an animation once in [AnimationNodeBlendTree]." +msgstr "" + +#: doc/classes/AnimationNodeOneShot.xml +msgid "" +"A resource to add to an [AnimationNodeBlendTree]. This node will execute a " +"sub-animation and return once it finishes. Blend times for fading in and out " +"can be customized, as well as filters." +msgstr "" + +#: doc/classes/AnimationNodeOneShot.xml +msgid "" +"If [code]true[/code], the sub-animation will restart automatically after " +"finishing." +msgstr "" + +#: doc/classes/AnimationNodeOneShot.xml +msgid "The delay after which the automatic restart is triggered, in seconds." +msgstr "" + +#: doc/classes/AnimationNodeOneShot.xml +msgid "" +"If [member autorestart] is [code]true[/code], a random additional delay (in " +"seconds) between 0 and this value will be added to [member " +"autorestart_delay]." +msgstr "" + +#: doc/classes/AnimationNodeOutput.xml +msgid "Generic output node to be added to [AnimationNodeBlendTree]." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml +msgid "State machine for control of animations." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml +msgid "" +"Contains multiple nodes representing animation states, connected in a graph. " +"Node transitions can be configured to happen automatically or via code, " +"using a shortest-path algorithm. Retrieve the " +"[AnimationNodeStateMachinePlayback] object from the [AnimationTree] node to " +"control it programmatically.\n" +"[b]Example:[/b]\n" +"[codeblock]\n" +"var state_machine = $AnimationTree.get(\"parameters/playback\")\n" +"state_machine.travel(\"some_state\")\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml +msgid "" +"Adds a new node to the graph. The [code]position[/code] is used for display " +"in the editor." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml +msgid "Adds a transition between the given nodes." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml +msgid "Returns the graph's end node." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml +msgid "Returns the draw offset of the graph. Used for display in the editor." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml +msgid "Returns the animation node with the given name." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml +msgid "Returns the given animation node's name." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml +msgid "Returns the given node's coordinates. Used for display in the editor." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml +msgid "Returns the given transition." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml +msgid "Returns the number of connections in the graph." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml +msgid "Returns the given transition's start node." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml +msgid "Returns the given transition's end node." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml +msgid "Returns [code]true[/code] if the graph contains the given node." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml +msgid "" +"Returns [code]true[/code] if there is a transition between the given nodes." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml +msgid "Deletes the given node from the graph." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml +msgid "Deletes the transition between the two specified nodes." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml +msgid "Deletes the given transition by index." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml +msgid "Renames the given node." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml +msgid "Replaces the node and keeps its transitions unchanged." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml +msgid "Sets the given node as the graph end point." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml +msgid "Sets the draw offset of the graph. Used for display in the editor." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml +msgid "Sets the node's coordinates. Used for display in the editor." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml +msgid "Sets the given node as the graph start point." +msgstr "" + +#: doc/classes/AnimationNodeStateMachinePlayback.xml +msgid "Playback control for [AnimationNodeStateMachine]." +msgstr "" + +#: doc/classes/AnimationNodeStateMachinePlayback.xml +msgid "" +"Allows control of [AnimationTree] state machines created with " +"[AnimationNodeStateMachine]. Retrieve with [code]$AnimationTree." +"get(\"parameters/playback\")[/code].\n" +"[b]Example:[/b]\n" +"[codeblock]\n" +"var state_machine = $AnimationTree.get(\"parameters/playback\")\n" +"state_machine.travel(\"some_state\")\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/AnimationNodeStateMachinePlayback.xml +msgid "Returns the currently playing animation state." +msgstr "" + +#: doc/classes/AnimationNodeStateMachinePlayback.xml +msgid "Returns the playback position within the current animation state." +msgstr "" + +#: doc/classes/AnimationNodeStateMachinePlayback.xml +msgid "" +"Returns the current travel path as computed internally by the A* algorithm." +msgstr "" + +#: doc/classes/AnimationNodeStateMachinePlayback.xml +msgid "Returns [code]true[/code] if an animation is playing." +msgstr "" + +#: doc/classes/AnimationNodeStateMachinePlayback.xml +msgid "Starts playing the given animation." +msgstr "" + +#: doc/classes/AnimationNodeStateMachinePlayback.xml +msgid "Stops the currently playing animation." +msgstr "" + +#: doc/classes/AnimationNodeStateMachinePlayback.xml +msgid "" +"Transitions from the current state to another one, following the shortest " +"path." +msgstr "" + +#: doc/classes/AnimationNodeStateMachineTransition.xml +msgid "" +"Turn on auto advance when this condition is set. The provided name will " +"become a boolean parameter on the [AnimationTree] that can be controlled " +"from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" +"[codeblock]\n" +"$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " +"(linear_velocity.x == 0)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/AnimationNodeStateMachineTransition.xml +msgid "" +"Turn on the transition automatically when this state is reached. This works " +"best with [constant SWITCH_MODE_AT_END]." +msgstr "" + +#: doc/classes/AnimationNodeStateMachineTransition.xml +msgid "" +"Don't use this transition during [method AnimationNodeStateMachinePlayback." +"travel] or [member auto_advance]." +msgstr "" + +#: doc/classes/AnimationNodeStateMachineTransition.xml +msgid "" +"Lower priority transitions are preferred when travelling through the tree " +"via [method AnimationNodeStateMachinePlayback.travel] or [member " +"auto_advance]." +msgstr "" + +#: doc/classes/AnimationNodeStateMachineTransition.xml +msgid "The transition type." +msgstr "" + +#: doc/classes/AnimationNodeStateMachineTransition.xml +msgid "The time to cross-fade between this state and the next." +msgstr "" + +#: doc/classes/AnimationNodeStateMachineTransition.xml +msgid "Emitted when [member advance_condition] is changed." +msgstr "" + +#: doc/classes/AnimationNodeStateMachineTransition.xml +msgid "" +"Switch to the next state immediately. The current state will end and blend " +"into the beginning of the new one." +msgstr "" + +#: doc/classes/AnimationNodeStateMachineTransition.xml +msgid "" +"Switch to the next state immediately, but will seek the new state to the " +"playback position of the old state." +msgstr "" + +#: doc/classes/AnimationNodeStateMachineTransition.xml +msgid "" +"Wait for the current state playback to end, then switch to the beginning of " +"the next state animation." +msgstr "" + +#: doc/classes/AnimationNodeTimeScale.xml +msgid "A time-scaling animation node to be used with [AnimationTree]." +msgstr "" + +#: doc/classes/AnimationNodeTimeScale.xml +msgid "" +"Allows scaling the speed of the animation (or reversing it) in any children " +"nodes. Setting it to 0 will pause the animation." +msgstr "" + +#: doc/classes/AnimationNodeTimeSeek.xml +msgid "A time-seeking animation node to be used with [AnimationTree]." +msgstr "" + +#: doc/classes/AnimationNodeTimeSeek.xml +msgid "" +"This node can be used to cause a seek command to happen to any sub-children " +"of the animation graph. Use this node type to play an [Animation] from the " +"start or a certain playback position inside the [AnimationNodeBlendTree]. " +"After setting the time and changing the animation playback, the seek node " +"automatically goes into sleep mode on the next process frame by setting its " +"[code]seek_position[/code] value to [code]-1.0[/code].\n" +"[codeblock]\n" +"# Play child animation from the start.\n" +"animation_tree.set(\"parameters/Seek/seek_position\", 0.0)\n" +"# Alternative syntax (same result as above).\n" +"animation_tree[\"parameters/Seek/seek_position\"] = 0.0\n" +"\n" +"# Play child animation from 12 second timestamp.\n" +"animation_tree.set(\"parameters/Seek/seek_position\", 12.0)\n" +"# Alternative syntax (same result as above).\n" +"animation_tree[\"parameters/Seek/seek_position\"] = 12.0\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/AnimationNodeTransition.xml +msgid "A generic animation transition node for [AnimationTree]." +msgstr "" + +#: doc/classes/AnimationNodeTransition.xml +msgid "" +"Simple state machine for cases which don't require a more advanced " +"[AnimationNodeStateMachine]. Animations can be connected to the inputs and " +"transition times can be specified." +msgstr "" + +#: doc/classes/AnimationNodeTransition.xml +msgid "The number of available input ports for this node." +msgstr "" + +#: doc/classes/AnimationNodeTransition.xml +msgid "" +"Cross-fading time (in seconds) between each animation connected to the " +"inputs." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "Container and player of [Animation] resources." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "" +"An animation player is used for general-purpose playback of [Animation] " +"resources. It contains a dictionary of animations (referenced by name) and " +"custom blend times between their transitions. Additionally, animations can " +"be played and blended in different channels.\n" +"[AnimationPlayer] is more suited than [Tween] for animations where you know " +"the final values in advance. For example, fading a screen in and out is more " +"easily done with an [AnimationPlayer] node thanks to the animation tools " +"provided by the editor. That particular example can also be implemented with " +"a [Tween] node, but it requires doing everything by code.\n" +"Updating the target properties of animations occurs at process time." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "Animation tutorial index" +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "" +"Adds [code]animation[/code] to the player accessible with the key " +"[code]name[/code]." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "" +"Shifts position in the animation timeline and immediately updates the " +"animation. [code]delta[/code] is the time in seconds to shift. Events " +"between the current frame and [code]delta[/code] are handled." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "Returns the name of the next animation in the queue." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "" +"Triggers the [code]anim_to[/code] animation when the [code]anim_from[/code] " +"animation completes." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "" +"[AnimationPlayer] caches animated nodes. It may not notice if a node " +"disappears; [method clear_caches] forces it to update the cache again." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "Clears all queued, unplayed animations." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "" +"Returns the name of [code]animation[/code] or an empty string if not found." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "" +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "Returns the list of stored animation names." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "" +"Gets the blend time (in seconds) between two animations, referenced by their " +"names." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "" +"Gets the actual playing speed of current animation or 0 if not playing. This " +"speed is the [member playback_speed] property multiplied by " +"[code]custom_speed[/code] argument specified when calling the [method play] " +"method." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "" +"Returns a list of the animation names that are currently queued to play." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "" +"Returns [code]true[/code] if the [AnimationPlayer] stores an [Animation] " +"with key [code]name[/code]." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "Returns [code]true[/code] if playing an animation." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "" +"Plays the animation with key [code]name[/code]. Custom blend times and speed " +"can be set. If [code]custom_speed[/code] is negative and [code]from_end[/" +"code] is [code]true[/code], the animation will play backwards (which is " +"equivalent to calling [method play_backwards]).\n" +"The [AnimationPlayer] keeps track of its current or last played animation " +"with [member assigned_animation]. If this method is called with that same " +"animation [code]name[/code], or with no [code]name[/code] parameter, the " +"assigned animation will resume playing if it was paused, or restart if it " +"was stopped (see [method stop] for both pause and stop). If the animation " +"was already playing, it will keep playing.\n" +"[b]Note:[/b] The animation will be updated the next time the " +"[AnimationPlayer] is processed. If other variables are updated at the same " +"time this is called, they may be updated too early. To perform the update " +"immediately, call [code]advance(0)[/code]." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "" +"Plays the animation with key [code]name[/code] in reverse.\n" +"This method is a shorthand for [method play] with [code]custom_speed = -1.0[/" +"code] and [code]from_end = true[/code], so see its description for more " +"information." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "" +"Queues an animation for playback once the current one is done.\n" +"[b]Note:[/b] If a looped animation is currently playing, the queued " +"animation will never play unless the looped animation is stopped somehow." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "Removes the animation with key [code]name[/code]." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "" +"Renames an existing animation with key [code]name[/code] to [code]newname[/" +"code]." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "" +"Seeks the animation to the [code]seconds[/code] point in time (in seconds). " +"If [code]update[/code] is [code]true[/code], the animation updates too, " +"otherwise it updates at process time. Events between the current frame and " +"[code]seconds[/code] are skipped.\n" +"[b]Note:[/b] Seeking to the end of the animation doesn't emit [signal " +"animation_finished]. If you want to skip animation and emit the signal, use " +"[method advance]." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "" +"Specifies a blend time (in seconds) between two animations, referenced by " +"their names." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "" +"Stops or pauses the currently playing animation. If [code]reset[/code] is " +"[code]true[/code], the animation position is reset to [code]0[/code] and the " +"playback speed is reset to [code]1.0[/code].\n" +"If [code]reset[/code] is [code]false[/code], the [member " +"current_animation_position] will be kept and calling [method play] or " +"[method play_backwards] without arguments or with the same animation name as " +"[member assigned_animation] will resume the animation." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "" +"If playing, the current animation; otherwise, the animation last played. " +"When set, would change the animation, but would not play it unless currently " +"playing. See also [member current_animation]." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "The name of the animation to play when the scene loads." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "" +"The name of the currently playing animation. If no animation is playing, the " +"property's value is an empty string. Changing this value does not restart " +"the animation. See [method play] for more information on playing " +"animations.\n" +"[b]Note:[/b] While this property appears in the inspector, it's not meant to " +"be edited, and it's not saved in the scene. This property is mainly used to " +"get the currently playing animation, and internally for animation playback " +"tracks. For more information, see [Animation]." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "The length (in seconds) of the currently being played animation." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "The position (in seconds) of the currently playing animation." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "The call mode to use for Call Method tracks." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "" +"If [code]true[/code], updates animations in response to process-related " +"notifications." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "" +"The default time in which to blend animations. Ranges from 0 to 4096 with " +"0.01 precision." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "The process notification in which to update animations." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "" +"The speed scaling ratio. For instance, if this value is 1, then the " +"animation plays at normal speed. If it's 0.5, then it plays at half speed. " +"If it's 2, then it plays at double speed." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "" +"This is used by the editor. If set to [code]true[/code], the scene will be " +"saved with the effects of the reset animation applied (as if it had been " +"seeked to time 0), then reverted after saving.\n" +"In other words, the saved scene file will contain the \"default pose\", as " +"defined by the reset animation, if any, with the editor keeping the values " +"that the nodes had before saving." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "The node from which node path references will travel." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "" +"Emitted when a queued animation plays after the previous animation was " +"finished. See [method queue].\n" +"[b]Note:[/b] The signal is not emitted when the animation is changed via " +"[method play] or from [AnimationTree]." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "Notifies when an animation finished playing." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "Notifies when an animation starts playing." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "" +"Notifies when the caches have been cleared, either automatically, or " +"manually via [method clear_caches]." +msgstr "" + +#: doc/classes/AnimationPlayer.xml doc/classes/AnimationTreePlayer.xml +msgid "" +"Process animation during the physics process. This is especially useful when " +"animating physics bodies." +msgstr "" + +#: doc/classes/AnimationPlayer.xml doc/classes/AnimationTreePlayer.xml +msgid "Process animation during the idle process." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "" +"Do not process animation. Use [method advance] to process the animation " +"manually." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "" +"Batch method calls during the animation process, then do the calls after " +"events are processed. This avoids bugs involving deleting nodes or modifying " +"the AnimationPlayer while playing." +msgstr "" + +#: doc/classes/AnimationPlayer.xml +msgid "Make method calls immediately when reached in the animation." +msgstr "" + +#: doc/classes/AnimationTree.xml +msgid "" +"A node to be used for advanced animation transitions in an [AnimationPlayer]." +msgstr "" + +#: doc/classes/AnimationTree.xml +msgid "" +"A node to be used for advanced animation transitions in an " +"[AnimationPlayer].\n" +"[b]Note:[/b] When linked with an [AnimationPlayer], several properties and " +"methods of the corresponding [AnimationPlayer] will not function as " +"expected. Playback and transitions should be handled using only the " +"[AnimationTree] and its constituent [AnimationNode](s). The " +"[AnimationPlayer] node should be used solely for adding, deleting, and " +"editing animations." +msgstr "" + +#: doc/classes/AnimationTree.xml +msgid "Using AnimationTree" +msgstr "" + +#: doc/classes/AnimationTree.xml +msgid "Manually advance the animations by the specified time (in seconds)." +msgstr "" + +#: doc/classes/AnimationTree.xml +msgid "" +"Retrieve the motion of the [member root_motion_track] as a [Transform] that " +"can be used elsewhere. If [member root_motion_track] is not a path to a " +"track of type [constant Animation.TYPE_TRANSFORM], returns an identity " +"transformation. See also [member root_motion_track] and [RootMotionView]." +msgstr "" + +#: doc/classes/AnimationTree.xml +msgid "If [code]true[/code], the [AnimationTree] will be processing." +msgstr "" + +#: doc/classes/AnimationTree.xml +msgid "The path to the [AnimationPlayer] used for animating." +msgstr "" + +#: doc/classes/AnimationTree.xml +msgid "" +"The process mode of this [AnimationTree]. See [enum AnimationProcessMode] " +"for available modes." +msgstr "" + +#: doc/classes/AnimationTree.xml +msgid "" +"The path to the Animation track used for root motion. Paths must be valid " +"scene-tree paths to a node, and must be specified starting from the parent " +"node of the node that will reproduce the animation. To specify a track that " +"controls properties or bones, append its name after the path, separated by " +"[code]\":\"[/code]. For example, [code]\"character/skeleton:ankle\"[/code] " +"or [code]\"character/mesh:transform/local\"[/code].\n" +"If the track has type [constant Animation.TYPE_TRANSFORM], the " +"transformation will be cancelled visually, and the animation will appear to " +"stay in place. See also [method get_root_motion_transform] and " +"[RootMotionView]." +msgstr "" + +#: doc/classes/AnimationTree.xml +msgid "The root animation node of this [AnimationTree]. See [AnimationNode]." +msgstr "" + +#: doc/classes/AnimationTree.xml +msgid "" +"The animations will progress during the physics frame (i.e. [method Node." +"_physics_process])." +msgstr "" + +#: doc/classes/AnimationTree.xml +msgid "" +"The animations will progress during the idle frame (i.e. [method Node." +"_process])." +msgstr "" + +#: doc/classes/AnimationTree.xml +msgid "The animations will only progress manually (see [method advance])." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"[i]Deprecated.[/i] Animation player that uses a node graph for blending " +"animations. Superseded by [AnimationTree]." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"[i]Deprecated.[/i] A node graph tool for blending multiple animations bound " +"to an [AnimationPlayer]. Especially useful for animating characters or other " +"skeleton-based rigs. It can combine several animations to form a desired " +"pose.\n" +"It takes [Animation]s from an [AnimationPlayer] node and mixes them " +"depending on the graph.\n" +"See [AnimationTree] for a more full-featured replacement of this node." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "Adds a [code]type[/code] node to the graph with name [code]id[/code]." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"Shifts position in the animation timeline. [code]delta[/code] is the time in " +"seconds to shift. Events between the current frame and [code]delta[/code] " +"are handled." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"Returns the [AnimationPlayer]'s [Animation] bound to the " +"[AnimationTreePlayer]'s animation node with name [code]id[/code]." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"Returns the name of the [member master_player]'s [Animation] bound to this " +"animation node." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"Returns the absolute playback timestamp of the animation node with name " +"[code]id[/code]." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"Binds a new [Animation] from the [member master_player] to the " +"[AnimationTreePlayer]'s animation node with name [code]id[/code]." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"If [code]enable[/code] is [code]true[/code], the animation node with ID " +"[code]id[/code] turns off the track modifying the property at [code]path[/" +"code]. The modified node's children continue to animate." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"Binds the [Animation] named [code]source[/code] from [member master_player] " +"to the animation node [code]id[/code]. Recalculates caches." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"Returns whether node [code]id[/code] and [code]dst_id[/code] are connected " +"at the specified slot." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "Returns the blend amount of a Blend2 node given its name." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"Sets the blend amount of a Blend2 node given its name and value.\n" +"A Blend2 node blends two animations (A and B) with the amount between 0 and " +"1.\n" +"At 0, output is input A. Towards 1, the influence of A gets lessened, the " +"influence of B gets raised. At 1, output is input B." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"If [code]enable[/code] is [code]true[/code], the Blend2 node with name " +"[code]id[/code] turns off the track modifying the property at [code]path[/" +"code]. The modified node's children continue to animate." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "Returns the blend amount of a Blend3 node given its name." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"Sets the blend amount of a Blend3 node given its name and value.\n" +"A Blend3 Node blends three animations (A, B-, B+) with the amount between -1 " +"and 1.\n" +"At -1, output is input B-. From -1 to 0, the influence of B- gets lessened, " +"the influence of A gets raised and the influence of B+ is 0. At 0, output is " +"input A. From 0 to 1, the influence of A gets lessened, the influence of B+ " +"gets raised and the influence of B+ is 0. At 1, output is input B+." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "Returns the blend amount of a Blend4 node given its name." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"Sets the blend amount of a Blend4 node given its name and value.\n" +"A Blend4 Node blends two pairs of animations.\n" +"The two pairs are blended like Blend2 and then added together." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"Connects node [code]id[/code] to [code]dst_id[/code] at the specified input " +"slot." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"Disconnects nodes connected to [code]id[/code] at the specified input slot." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "Returns a [PoolStringArray] containing the name of all nodes." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "Returns the mix amount of a Mix node given its name." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"Sets the mix amount of a Mix node given its name and value.\n" +"A Mix node adds input b to input a by the amount given by ratio." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "Check if a node exists (by name)." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"Returns the input count for a given node. Different types of nodes have " +"different amount of inputs." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "Returns the input source for a given node input." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "Returns position of a node in the graph given its name." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "Gets the node type, will return from [enum NodeType] enum." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "Renames a node in the graph." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "Sets the position of a node in the graph given its name and position." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "Returns the autostart delay of a OneShot node given its name." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "Returns the autostart random delay of a OneShot node given its name." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "Returns the fade in time of a OneShot node given its name." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "Returns the fade out time of a OneShot node given its name." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "Returns whether a OneShot node will auto restart given its name." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "Returns whether a OneShot node is active given its name." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"Sets the autorestart property of a OneShot node given its name and value." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"Sets the autorestart delay of a OneShot node given its name and value in " +"seconds." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"Sets the autorestart random delay of a OneShot node given its name and value " +"in seconds." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"Sets the fade in time of a OneShot node given its name and value in seconds." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"Sets the fade out time of a OneShot node given its name and value in seconds." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"If [code]enable[/code] is [code]true[/code], the OneShot node with ID " +"[code]id[/code] turns off the track modifying the property at [code]path[/" +"code]. The modified node's children continue to animate." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "Starts a OneShot node given its name." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "Stops the OneShot node with name [code]id[/code]." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"Manually recalculates the cache of track information generated from " +"animation nodes. Needed when external sources modify the animation nodes' " +"state." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "Removes the animation node with name [code]id[/code]." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "Resets this [AnimationTreePlayer]." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"Returns the time scale value of the TimeScale node with name [code]id[/code]." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"Sets the time scale of the TimeScale node with name [code]id[/code] to " +"[code]scale[/code].\n" +"The TimeScale node is used to speed [Animation]s up if the scale is above 1 " +"or slow them down if it is below 1.\n" +"If applied after a blend or mix, affects all input animations to that blend " +"or mix." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"Sets the time seek value of the TimeSeek node with name [code]id[/code] to " +"[code]seconds[/code].\n" +"This functions as a seek in the [Animation] or the blend or mix of " +"[Animation]s input in it." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"Deletes the input at [code]input_idx[/code] for the transition node with " +"name [code]id[/code]." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"Returns the index of the currently evaluated input for the transition node " +"with name [code]id[/code]." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"Returns the number of inputs for the transition node with name [code]id[/" +"code]. You can add inputs by right-clicking on the transition node." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"Returns the cross fade time for the transition node with name [code]id[/" +"code]." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"Returns [code]true[/code] if the input at [code]input_idx[/code] on the " +"transition node with name [code]id[/code] is set to automatically advance to " +"the next input upon completion." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"The transition node with name [code]id[/code] sets its current input at " +"[code]input_idx[/code]." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"The transition node with name [code]id[/code] advances to its next input " +"automatically when the input at [code]input_idx[/code] completes." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"Resizes the number of inputs available for the transition node with name " +"[code]id[/code]." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"The transition node with name [code]id[/code] sets its cross fade time to " +"[code]time_sec[/code]." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"If [code]true[/code], the [AnimationTreePlayer] is able to play animations." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"The node from which to relatively access other nodes.\n" +"It accesses the bones, so it should point to the same node the " +"[AnimationPlayer] would point its Root Node at." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "" +"The path to the [AnimationPlayer] from which this [AnimationTreePlayer] " +"binds animations to animation nodes.\n" +"Once set, [Animation] nodes can be added to the [AnimationTreePlayer]." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "The thread in which to update animations." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "Output node." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "Animation node." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "OneShot node." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "Mix node." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "Blend2 node." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "Blend3 node." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "Blend4 node." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "TimeScale node." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "TimeSeek node." +msgstr "" + +#: doc/classes/AnimationTreePlayer.xml +msgid "Transition node." +msgstr "" + +#: doc/classes/Area.xml +msgid "3D area for detection and physics and audio influence." +msgstr "" + +#: doc/classes/Area.xml +msgid "" +"3D area that detects [CollisionObject] nodes overlapping, entering, or " +"exiting. Can also alter or override local physics parameters (gravity, " +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." +msgstr "" + +#: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml +#: doc/classes/ViewportTexture.xml +msgid "GUI in 3D Demo" +msgstr "" + +#: doc/classes/Area.xml +msgid "" +"Returns a list of intersecting [Area]s. The overlapping area's [member " +"CollisionObject.collision_layer] must be part of this area's [member " +"CollisionObject.collision_mask] in order to be detected.\n" +"For performance reasons (collisions are all processed at the same time) this " +"list is modified once during the physics step, not immediately after objects " +"are moved. Consider using signals instead." +msgstr "" + +#: doc/classes/Area.xml +msgid "" +"Returns a list of intersecting [PhysicsBody]s. The overlapping body's " +"[member CollisionObject.collision_layer] must be part of this area's [member " +"CollisionObject.collision_mask] in order to be detected.\n" +"For performance reasons (collisions are all processed at the same time) this " +"list is modified once during the physics step, not immediately after objects " +"are moved. Consider using signals instead." +msgstr "" + +#: doc/classes/Area.xml +msgid "" +"If [code]true[/code], the given area overlaps the Area.\n" +"[b]Note:[/b] The result of this test is not immediate after moving objects. " +"For performance, list of overlaps is updated once per frame and before the " +"physics step. Consider using signals instead." +msgstr "" + +#: doc/classes/Area.xml +msgid "" +"If [code]true[/code], the given physics body overlaps the Area.\n" +"[b]Note:[/b] The result of this test is not immediate after moving objects. " +"For performance, list of overlaps is updated once per frame and before the " +"physics step. Consider using signals instead.\n" +"The [code]body[/code] argument can either be a [PhysicsBody] or a [GridMap] " +"instance (while GridMaps are not physics body themselves, they register " +"their tiles with collision shapes as a virtual physics body)." +msgstr "" + +#: doc/classes/Area.xml +msgid "" +"The rate at which objects stop spinning in this area. Represents the angular " +"velocity lost per second.\n" +"See [member ProjectSettings.physics/3d/default_angular_damp] for more " +"details about damping." +msgstr "" + +#: doc/classes/Area.xml doc/classes/Area2D.xml +msgid "The name of the area's audio bus." +msgstr "" + +#: doc/classes/Area.xml doc/classes/Area2D.xml +msgid "" +"If [code]true[/code], the area's audio bus overrides the default audio bus." +msgstr "" + +#: doc/classes/Area.xml +msgid "" +"The area's gravity intensity (in meters per second squared). This value " +"multiplies the gravity vector. This is useful to alter the force of gravity " +"without altering its direction." +msgstr "" + +#: doc/classes/Area.xml doc/classes/Area2D.xml +msgid "" +"The falloff factor for point gravity. The greater the value, the faster " +"gravity decreases with distance." +msgstr "" + +#: doc/classes/Area.xml doc/classes/Area2D.xml +msgid "" +"If [code]true[/code], gravity is calculated from a point (set via [member " +"gravity_vec]). See also [member space_override]." +msgstr "" + +#: doc/classes/Area.xml doc/classes/Area2D.xml +msgid "" +"The area's gravity vector (not normalized). If gravity is a point (see " +"[member gravity_point]), this will be the point of attraction." +msgstr "" + +#: doc/classes/Area.xml +msgid "" +"The rate at which objects stop moving in this area. Represents the linear " +"velocity lost per second.\n" +"See [member ProjectSettings.physics/3d/default_linear_damp] for more details " +"about damping." +msgstr "" + +#: doc/classes/Area.xml doc/classes/Area2D.xml +msgid "If [code]true[/code], other monitoring areas can detect this area." +msgstr "" + +#: doc/classes/Area.xml doc/classes/Area2D.xml +msgid "" +"If [code]true[/code], the area detects bodies or areas entering and exiting " +"it." +msgstr "" + +#: doc/classes/Area.xml doc/classes/Area2D.xml +msgid "The area's priority. Higher priority areas are processed first." +msgstr "" + +#: doc/classes/Area.xml +msgid "" +"The degree to which this area applies reverb to its associated audio. Ranges " +"from [code]0[/code] to [code]1[/code] with [code]0.1[/code] precision." +msgstr "" + +#: doc/classes/Area.xml +msgid "If [code]true[/code], the area applies reverb to its associated audio." +msgstr "" + +#: doc/classes/Area.xml +msgid "The reverb bus name to use for this area's associated audio." +msgstr "" + +#: doc/classes/Area.xml +msgid "" +"The degree to which this area's reverb is a uniform effect. Ranges from " +"[code]0[/code] to [code]1[/code] with [code]0.1[/code] precision." +msgstr "" + +#: doc/classes/Area.xml doc/classes/Area2D.xml +msgid "" +"Override mode for gravity and damping calculations within this area. See " +"[enum SpaceOverride] for possible values." +msgstr "" + +#: doc/classes/Area.xml +msgid "" +"Emitted when another Area enters this Area. Requires [member monitoring] to " +"be set to [code]true[/code].\n" +"[code]area[/code] the other Area." +msgstr "" + +#: doc/classes/Area.xml +msgid "" +"Emitted when another Area exits this Area. Requires [member monitoring] to " +"be set to [code]true[/code].\n" +"[code]area[/code] the other Area." +msgstr "" + +#: doc/classes/Area.xml +msgid "" +"Emitted when one of another Area's [Shape]s enters one of this Area's " +"[Shape]s. Requires [member monitoring] to be set to [code]true[/code].\n" +"[code]area_rid[/code] the [RID] of the other Area's [CollisionObject] used " +"by the [PhysicsServer].\n" +"[code]area[/code] the other Area.\n" +"[code]area_shape_index[/code] the index of the [Shape] of the other Area " +"used by the [PhysicsServer]. Get the [CollisionShape] node with [code]area." +"shape_owner_get_owner(area_shape_index)[/code].\n" +"[code]local_shape_index[/code] the index of the [Shape] of this Area used by " +"the [PhysicsServer]. Get the [CollisionShape] node with [code]self." +"shape_owner_get_owner(local_shape_index)[/code]." +msgstr "" + +#: doc/classes/Area.xml +msgid "" +"Emitted when a [PhysicsBody] or [GridMap] enters this Area. Requires [member " +"monitoring] to be set to [code]true[/code]. [GridMap]s are detected if the " +"[MeshLibrary] has Collision [Shape]s.\n" +"[code]body[/code] the [Node], if it exists in the tree, of the other " +"[PhysicsBody] or [GridMap]." +msgstr "" + +#: doc/classes/Area.xml +msgid "" +"Emitted when a [PhysicsBody] or [GridMap] exits this Area. Requires [member " +"monitoring] to be set to [code]true[/code]. [GridMap]s are detected if the " +"[MeshLibrary] has Collision [Shape]s.\n" +"[code]body[/code] the [Node], if it exists in the tree, of the other " +"[PhysicsBody] or [GridMap]." +msgstr "" + +#: doc/classes/Area.xml +msgid "" +"Emitted when one of a [PhysicsBody] or [GridMap]'s [Shape]s enters one of " +"this Area's [Shape]s. Requires [member monitoring] to be set to [code]true[/" +"code]. [GridMap]s are detected if the [MeshLibrary] has Collision [Shape]s.\n" +"[code]body_rid[/code] the [RID] of the [PhysicsBody] or [MeshLibrary]'s " +"[CollisionObject] used by the [PhysicsServer].\n" +"[code]body[/code] the [Node], if it exists in the tree, of the [PhysicsBody] " +"or [GridMap].\n" +"[code]body_shape_index[/code] the index of the [Shape] of the [PhysicsBody] " +"or [GridMap] used by the [PhysicsServer]. Get the [CollisionShape] node with " +"[code]body.shape_owner_get_owner(body_shape_index)[/code].\n" +"[code]local_shape_index[/code] the index of the [Shape] of this Area used by " +"the [PhysicsServer]. Get the [CollisionShape] node with [code]self." +"shape_owner_get_owner(local_shape_index)[/code]." +msgstr "" + +#: doc/classes/Area.xml doc/classes/Area2D.xml +msgid "This area does not affect gravity/damping." +msgstr "" + +#: doc/classes/Area.xml doc/classes/Area2D.xml +msgid "" +"This area adds its gravity/damping values to whatever has been calculated so " +"far (in [member priority] order)." +msgstr "" + +#: doc/classes/Area.xml doc/classes/Area2D.xml +msgid "" +"This area adds its gravity/damping values to whatever has been calculated so " +"far (in [member priority] order), ignoring any lower priority areas." +msgstr "" + +#: doc/classes/Area.xml doc/classes/Area2D.xml +msgid "" +"This area replaces any gravity/damping, even the defaults, ignoring any " +"lower priority areas." +msgstr "" + +#: doc/classes/Area.xml doc/classes/Area2D.xml +msgid "" +"This area replaces any gravity/damping calculated so far (in [member " +"priority] order), but keeps calculating the rest of the areas." +msgstr "" + +#: doc/classes/Area2D.xml +msgid "2D area for detection and physics and audio influence." +msgstr "" + +#: doc/classes/Area2D.xml +msgid "" +"2D area that detects [CollisionObject2D] nodes overlapping, entering, or " +"exiting. Can also alter or override local physics parameters (gravity, " +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." +msgstr "" + +#: doc/classes/Area2D.xml +msgid "Using Area2D" +msgstr "" + +#: doc/classes/Area2D.xml doc/classes/CollisionShape2D.xml +#: doc/classes/RectangleShape2D.xml +msgid "2D Pong Demo" +msgstr "" + +#: doc/classes/Area2D.xml doc/classes/Camera2D.xml +#: doc/classes/KinematicBody2D.xml doc/classes/TileMap.xml +#: doc/classes/TileSet.xml +msgid "2D Platformer Demo" +msgstr "" + +#: doc/classes/Area2D.xml +msgid "" +"Returns a list of intersecting [Area2D]s. The overlapping area's [member " +"CollisionObject2D.collision_layer] must be part of this area's [member " +"CollisionObject2D.collision_mask] in order to be detected.\n" +"For performance reasons (collisions are all processed at the same time) this " +"list is modified once during the physics step, not immediately after objects " +"are moved. Consider using signals instead." +msgstr "" + +#: doc/classes/Area2D.xml +msgid "" +"Returns a list of intersecting [PhysicsBody2D]s. The overlapping body's " +"[member CollisionObject2D.collision_layer] must be part of this area's " +"[member CollisionObject2D.collision_mask] in order to be detected.\n" +"For performance reasons (collisions are all processed at the same time) this " +"list is modified once during the physics step, not immediately after objects " +"are moved. Consider using signals instead." +msgstr "" + +#: doc/classes/Area2D.xml +msgid "" +"If [code]true[/code], the given area overlaps the Area2D.\n" +"[b]Note:[/b] The result of this test is not immediate after moving objects. " +"For performance, the list of overlaps is updated once per frame and before " +"the physics step. Consider using signals instead." +msgstr "" + +#: doc/classes/Area2D.xml +msgid "" +"If [code]true[/code], the given physics body overlaps the Area2D.\n" +"[b]Note:[/b] The result of this test is not immediate after moving objects. " +"For performance, list of overlaps is updated once per frame and before the " +"physics step. Consider using signals instead.\n" +"The [code]body[/code] argument can either be a [PhysicsBody2D] or a " +"[TileMap] instance (while TileMaps are not physics bodies themselves, they " +"register their tiles with collision shapes as a virtual physics body)." +msgstr "" + +#: doc/classes/Area2D.xml +msgid "" +"The rate at which objects stop spinning in this area. Represents the angular " +"velocity lost per second.\n" +"See [member ProjectSettings.physics/2d/default_angular_damp] for more " +"details about damping." +msgstr "" + +#: doc/classes/Area2D.xml +msgid "" +"The area's gravity intensity (in pixels per second squared). This value " +"multiplies the gravity vector. This is useful to alter the force of gravity " +"without altering its direction." +msgstr "" + +#: doc/classes/Area2D.xml +msgid "" +"The rate at which objects stop moving in this area. Represents the linear " +"velocity lost per second.\n" +"See [member ProjectSettings.physics/2d/default_linear_damp] for more details " +"about damping." +msgstr "" + +#: doc/classes/Area2D.xml +msgid "" +"Emitted when another Area2D enters this Area2D. Requires [member monitoring] " +"to be set to [code]true[/code].\n" +"[code]area[/code] the other Area2D." +msgstr "" + +#: doc/classes/Area2D.xml +msgid "" +"Emitted when another Area2D exits this Area2D. Requires [member monitoring] " +"to be set to [code]true[/code].\n" +"[code]area[/code] the other Area2D." +msgstr "" + +#: doc/classes/Area2D.xml +msgid "" +"Emitted when one of another Area2D's [Shape2D]s enters one of this Area2D's " +"[Shape2D]s. Requires [member monitoring] to be set to [code]true[/code].\n" +"[code]area_rid[/code] the [RID] of the other Area2D's [CollisionObject2D] " +"used by the [Physics2DServer].\n" +"[code]area[/code] the other Area2D.\n" +"[code]area_shape_index[/code] the index of the [Shape2D] of the other Area2D " +"used by the [Physics2DServer]. Get the [CollisionShape2D] node with " +"[code]area.shape_owner_get_owner(area_shape_index)[/code].\n" +"[code]local_shape_index[/code] the index of the [Shape2D] of this Area2D " +"used by the [Physics2DServer]. Get the [CollisionShape2D] node with " +"[code]self.shape_owner_get_owner(local_shape_index)[/code]." +msgstr "" + +#: doc/classes/Area2D.xml +msgid "" +"Emitted when one of another Area2D's [Shape2D]s exits one of this Area2D's " +"[Shape2D]s. Requires [member monitoring] to be set to [code]true[/code].\n" +"[code]area_rid[/code] the [RID] of the other Area2D's [CollisionObject2D] " +"used by the [Physics2DServer].\n" +"[code]area[/code] the other Area2D.\n" +"[code]area_shape_index[/code] the index of the [Shape2D] of the other Area2D " +"used by the [Physics2DServer]. Get the [CollisionShape2D] node with " +"[code]area.shape_owner_get_owner(area_shape_index)[/code].\n" +"[code]local_shape_index[/code] the index of the [Shape2D] of this Area2D " +"used by the [Physics2DServer]. Get the [CollisionShape2D] node with " +"[code]self.shape_owner_get_owner(local_shape_index)[/code]." +msgstr "" + +#: doc/classes/Area2D.xml +msgid "" +"Emitted when a [PhysicsBody2D] or [TileMap] enters this Area2D. Requires " +"[member monitoring] to be set to [code]true[/code]. [TileMap]s are detected " +"if the [TileSet] has Collision [Shape2D]s.\n" +"[code]body[/code] the [Node], if it exists in the tree, of the other " +"[PhysicsBody2D] or [TileMap]." +msgstr "" + +#: doc/classes/Area2D.xml +msgid "" +"Emitted when a [PhysicsBody2D] or [TileMap] exits this Area2D. Requires " +"[member monitoring] to be set to [code]true[/code]. [TileMap]s are detected " +"if the [TileSet] has Collision [Shape2D]s.\n" +"[code]body[/code] the [Node], if it exists in the tree, of the other " +"[PhysicsBody2D] or [TileMap]." +msgstr "" + +#: doc/classes/Area2D.xml +msgid "" +"Emitted when one of a [PhysicsBody2D] or [TileMap]'s [Shape2D]s enters one " +"of this Area2D's [Shape2D]s. Requires [member monitoring] to be set to " +"[code]true[/code]. [TileMap]s are detected if the [TileSet] has Collision " +"[Shape2D]s.\n" +"[code]body_rid[/code] the [RID] of the [PhysicsBody2D] or [TileSet]'s " +"[CollisionObject2D] used by the [Physics2DServer].\n" +"[code]body[/code] the [Node], if it exists in the tree, of the " +"[PhysicsBody2D] or [TileMap].\n" +"[code]body_shape_index[/code] the index of the [Shape2D] of the " +"[PhysicsBody2D] or [TileMap] used by the [Physics2DServer]. Get the " +"[CollisionShape2D] node with [code]body." +"shape_owner_get_owner(body_shape_index)[/code].\n" +"[code]local_shape_index[/code] the index of the [Shape2D] of this Area2D " +"used by the [Physics2DServer]. Get the [CollisionShape2D] node with " +"[code]self.shape_owner_get_owner(local_shape_index)[/code]." +msgstr "" + +#: doc/classes/Area2D.xml +msgid "" +"Emitted when one of a [PhysicsBody2D] or [TileMap]'s [Shape2D]s exits one of " +"this Area2D's [Shape2D]s. Requires [member monitoring] to be set to " +"[code]true[/code]. [TileMap]s are detected if the [TileSet] has Collision " +"[Shape2D]s.\n" +"[code]body_rid[/code] the [RID] of the [PhysicsBody2D] or [TileSet]'s " +"[CollisionObject2D] used by the [Physics2DServer].\n" +"[code]body[/code] the [Node], if it exists in the tree, of the " +"[PhysicsBody2D] or [TileMap].\n" +"[code]body_shape_index[/code] the index of the [Shape2D] of the " +"[PhysicsBody2D] or [TileMap] used by the [Physics2DServer]. Get the " +"[CollisionShape2D] node with [code]body." +"shape_owner_get_owner(body_shape_index)[/code].\n" +"[code]local_shape_index[/code] the index of the [Shape2D] of this Area2D " +"used by the [Physics2DServer]. Get the [CollisionShape2D] node with " +"[code]self.shape_owner_get_owner(local_shape_index)[/code]." +msgstr "" + +#: doc/classes/Array.xml +msgid "A generic array datatype." +msgstr "" + +#: doc/classes/Array.xml +msgid "" +"A generic array that can contain several elements of any type, accessible by " +"a numerical index starting at 0. Negative indices can be used to count from " +"the back, like in Python (-1 is the last element, -2 is the second to last, " +"etc.).\n" +"[b]Example:[/b]\n" +"[codeblock]\n" +"var array = [\"One\", 2, 3, \"Four\"]\n" +"print(array[0]) # One.\n" +"print(array[2]) # 3.\n" +"print(array[-1]) # Four.\n" +"array[2] = \"Three\"\n" +"print(array[-2]) # Three.\n" +"[/codeblock]\n" +"Arrays can be concatenated using the [code]+[/code] operator:\n" +"[codeblock]\n" +"var array1 = [\"One\", 2]\n" +"var array2 = [3, \"Four\"]\n" +"print(array1 + array2) # [\"One\", 2, 3, \"Four\"]\n" +"[/codeblock]\n" +"[b]Note:[/b] Concatenating with the [code]+=[/code] operator will create a " +"new array, which has a cost. If you want to append another array to an " +"existing array, [method append_array] is more efficient.\n" +"[b]Note:[/b] Arrays are always passed by reference. To get a copy of an " +"array that can be modified independently of the original array, use [method " +"duplicate].\n" +"[b]Note:[/b] When declaring an array with [code]const[/code], the array " +"itself can still be mutated by defining the values at individual indices or " +"pushing/removing elements. Using [code]const[/code] will only prevent " +"assigning the constant with another value after it was initialized." +msgstr "" + +#: doc/classes/Array.xml +msgid "Constructs an array from a [PoolColorArray]." +msgstr "" + +#: doc/classes/Array.xml +msgid "Constructs an array from a [PoolVector3Array]." +msgstr "" + +#: doc/classes/Array.xml +msgid "Constructs an array from a [PoolVector2Array]." +msgstr "" + +#: doc/classes/Array.xml +msgid "Constructs an array from a [PoolStringArray]." +msgstr "" + +#: doc/classes/Array.xml +msgid "Constructs an array from a [PoolRealArray]." +msgstr "" + +#: doc/classes/Array.xml +msgid "Constructs an array from a [PoolIntArray]." +msgstr "" + +#: doc/classes/Array.xml +msgid "Constructs an array from a [PoolByteArray]." +msgstr "" + +#: doc/classes/Array.xml doc/classes/PoolByteArray.xml +#: doc/classes/PoolColorArray.xml doc/classes/PoolIntArray.xml +#: doc/classes/PoolRealArray.xml doc/classes/PoolStringArray.xml +#: doc/classes/PoolVector2Array.xml doc/classes/PoolVector3Array.xml +msgid "" +"Appends an element at the end of the array (alias of [method push_back])." +msgstr "" + +#: doc/classes/Array.xml +msgid "" +"Appends another array at the end of this array.\n" +"[codeblock]\n" +"var array1 = [1, 2, 3]\n" +"var array2 = [4, 5, 6]\n" +"array1.append_array(array2)\n" +"print(array1) # Prints [1, 2, 3, 4, 5, 6].\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Array.xml +msgid "" +"Returns the last element of the array. Prints an error and returns " +"[code]null[/code] if the array is empty.\n" +"[b]Note:[/b] Calling this function is not the same as writing [code]array[-1]" +"[/code]. If the array is empty, accessing by index will pause project " +"execution when running from the editor." +msgstr "" + +#: doc/classes/Array.xml +msgid "" +"Finds the index of an existing value (or the insertion index that maintains " +"sorting order, if the value is not yet present in the array) using binary " +"search. Optionally, a [code]before[/code] specifier can be passed. If " +"[code]false[/code], the returned index comes after all existing entries of " +"the value in the array.\n" +"[b]Note:[/b] Calling [method bsearch] on an unsorted array results in " +"unexpected behavior." +msgstr "" + +#: doc/classes/Array.xml +msgid "" +"Finds the index of an existing value (or the insertion index that maintains " +"sorting order, if the value is not yet present in the array) using binary " +"search and a custom comparison method declared in the [code]obj[/code]. " +"Optionally, a [code]before[/code] specifier can be passed. If [code]false[/" +"code], the returned index comes after all existing entries of the value in " +"the array. The custom method receives two arguments (an element from the " +"array and the value searched for) and must return [code]true[/code] if the " +"first argument is less than the second, and return [code]false[/code] " +"otherwise.\n" +"[codeblock]\n" +"func cardinal_to_algebraic(a):\n" +" match a:\n" +" \"one\":\n" +" return 1\n" +" \"two\":\n" +" return 2\n" +" \"three\":\n" +" return 3\n" +" \"four\":\n" +" return 4\n" +" _:\n" +" return 0\n" +"\n" +"func compare(a, b):\n" +" return cardinal_to_algebraic(a) < cardinal_to_algebraic(b)\n" +"\n" +"func _ready():\n" +" var a = [\"one\", \"two\", \"three\", \"four\"]\n" +" # `compare` is defined in this object, so we use `self` as the `obj` " +"parameter.\n" +" print(a.bsearch_custom(\"three\", self, \"compare\", true)) # Expected " +"value is 2.\n" +"[/codeblock]\n" +"[b]Note:[/b] Calling [method bsearch_custom] on an unsorted array results in " +"unexpected behavior." +msgstr "" + +#: doc/classes/Array.xml +msgid "" +"Clears the array. This is equivalent to using [method resize] with a size of " +"[code]0[/code]." +msgstr "" + +#: doc/classes/Array.xml doc/classes/PoolByteArray.xml +#: doc/classes/PoolColorArray.xml doc/classes/PoolIntArray.xml +#: doc/classes/PoolRealArray.xml doc/classes/PoolStringArray.xml +#: doc/classes/PoolVector2Array.xml doc/classes/PoolVector3Array.xml +msgid "Returns the number of times an element is in the array." +msgstr "" + +#: doc/classes/Array.xml +msgid "" +"Returns a copy of the array.\n" +"If [code]deep[/code] is [code]true[/code], a deep copy is performed: all " +"nested arrays and dictionaries are duplicated and will not be shared with " +"the original array. If [code]false[/code], a shallow copy is made and " +"references to the original nested arrays and dictionaries are kept, so that " +"modifying a sub-array or dictionary in the copy will also impact those " +"referenced in the source array." +msgstr "" + +#: doc/classes/Array.xml doc/classes/PoolByteArray.xml +#: doc/classes/PoolColorArray.xml doc/classes/PoolIntArray.xml +#: doc/classes/PoolRealArray.xml doc/classes/PoolStringArray.xml +#: doc/classes/PoolVector2Array.xml doc/classes/PoolVector3Array.xml +msgid "Returns [code]true[/code] if the array is empty." +msgstr "" + +#: doc/classes/Array.xml +msgid "" +"Removes the first occurrence of a value from the array. If the value does " +"not exist in the array, nothing happens. To remove an element by index, use " +"[method remove] instead.\n" +"[b]Note:[/b] This method acts in-place and doesn't return a value.\n" +"[b]Note:[/b] On large arrays, this method will be slower if the removed " +"element is close to the beginning of the array (index 0). This is because " +"all elements placed after the removed element have to be reindexed." +msgstr "" + +#: doc/classes/Array.xml +msgid "" +"Assigns the given value to all elements in the array. This can typically be " +"used together with [method resize] to create an array with a given size and " +"initialized elements:\n" +"[codeblock]\n" +"var array = []\n" +"array.resize(10)\n" +"array.fill(0) # Initialize the 10 elements to 0.\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Array.xml doc/classes/PoolByteArray.xml +#: doc/classes/PoolColorArray.xml doc/classes/PoolIntArray.xml +#: doc/classes/PoolRealArray.xml doc/classes/PoolStringArray.xml +#: doc/classes/PoolVector2Array.xml doc/classes/PoolVector3Array.xml +msgid "" +"Searches the array for a value and returns its index or [code]-1[/code] if " +"not found. Optionally, the initial search index can be passed. Returns " +"[code]-1[/code] if [code]from[/code] is out of bounds." +msgstr "" + +#: doc/classes/Array.xml +msgid "" +"Searches the array in reverse order for a value and returns its index or " +"[code]-1[/code] if not found." +msgstr "" + +#: doc/classes/Array.xml +msgid "" +"Returns the first element of the array. Prints an error and returns " +"[code]null[/code] if the array is empty.\n" +"[b]Note:[/b] Calling this function is not the same as writing [code]array[0]" +"[/code]. If the array is empty, accessing by index will pause project " +"execution when running from the editor." +msgstr "" + +#: doc/classes/Array.xml +msgid "" +"Returns [code]true[/code] if the array contains the given value.\n" +"[codeblock]\n" +"[\"inside\", 7].has(\"inside\") # True\n" +"[\"inside\", 7].has(\"outside\") # False\n" +"[\"inside\", 7].has(7) # True\n" +"[\"inside\", 7].has(\"7\") # False\n" +"[/codeblock]\n" +"[b]Note:[/b] This is equivalent to using the [code]in[/code] operator as " +"follows:\n" +"[codeblock]\n" +"# Will evaluate to `true`.\n" +"if 2 in [2, 4, 6, 8]:\n" +" pass\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Array.xml +msgid "" +"Returns a hashed 32-bit integer value representing the array and its " +"contents.\n" +"[b]Note:[/b] [Array]s with equal content will always produce identical hash " +"values. However, the reverse is not true. Returning identical hash values " +"does [i]not[/i] imply the arrays are equal, because different arrays can " +"have identical hash values due to hash collisions." +msgstr "" + +#: doc/classes/Array.xml +msgid "" +"Inserts a new element at a given position in the array. The position must be " +"valid, or at the end of the array ([code]pos == size()[/code]).\n" +"[b]Note:[/b] This method acts in-place and doesn't return a value.\n" +"[b]Note:[/b] On large arrays, this method will be slower if the inserted " +"element is close to the beginning of the array (index 0). This is because " +"all elements placed after the newly inserted element have to be reindexed." +msgstr "" + +#: doc/classes/Array.xml doc/classes/PoolByteArray.xml +#: doc/classes/PoolColorArray.xml doc/classes/PoolIntArray.xml +#: doc/classes/PoolRealArray.xml doc/classes/PoolStringArray.xml +#: doc/classes/PoolVector2Array.xml doc/classes/PoolVector3Array.xml +msgid "Reverses the order of the elements in the array." +msgstr "" + +#: doc/classes/Array.xml +msgid "" +"Returns the maximum value contained in the array if all elements are of " +"comparable types. If the elements can't be compared, [code]null[/code] is " +"returned." +msgstr "" + +#: doc/classes/Array.xml +msgid "" +"Returns the minimum value contained in the array if all elements are of " +"comparable types. If the elements can't be compared, [code]null[/code] is " +"returned." +msgstr "" + +#: doc/classes/Array.xml +msgid "" +"Removes and returns the element of the array at index [code]position[/code]. " +"If negative, [code]position[/code] is considered relative to the end of the " +"array. Leaves the array untouched and returns [code]null[/code] if the array " +"is empty or if it's accessed out of bounds. An error message is printed when " +"the array is accessed out of bounds, but not when the array is empty.\n" +"[b]Note:[/b] On large arrays, this method can be slower than [method " +"pop_back] as it will reindex the array's elements that are located after the " +"removed element. The larger the array and the lower the index of the removed " +"element, the slower [method pop_at] will be." +msgstr "" + +#: doc/classes/Array.xml +msgid "" +"Removes and returns the last element of the array. Returns [code]null[/code] " +"if the array is empty, without printing an error message. See also [method " +"pop_front]." +msgstr "" + +#: doc/classes/Array.xml +msgid "" +"Removes and returns the first element of the array. Returns [code]null[/" +"code] if the array is empty, without printing an error message. See also " +"[method pop_back].\n" +"[b]Note:[/b] On large arrays, this method is much slower than [method " +"pop_back] as it will reindex all the array's elements every time it's " +"called. The larger the array, the slower [method pop_front] will be." +msgstr "" + +#: doc/classes/Array.xml +msgid "" +"Appends an element at the end of the array. See also [method push_front]." +msgstr "" + +#: doc/classes/Array.xml +msgid "" +"Adds an element at the beginning of the array. See also [method push_back].\n" +"[b]Note:[/b] On large arrays, this method is much slower than [method " +"push_back] as it will reindex all the array's elements every time it's " +"called. The larger the array, the slower [method push_front] will be." +msgstr "" + +#: doc/classes/Array.xml +msgid "" +"Removes an element from the array by index. If the index does not exist in " +"the array, nothing happens. To remove an element by searching for its value, " +"use [method erase] instead.\n" +"[b]Note:[/b] This method acts in-place and doesn't return a value.\n" +"[b]Note:[/b] On large arrays, this method will be slower if the removed " +"element is close to the beginning of the array (index 0). This is because " +"all elements placed after the removed element have to be reindexed." +msgstr "" + +#: doc/classes/Array.xml +msgid "" +"Resizes the array to contain a different number of elements. If the array " +"size is smaller, elements are cleared, if bigger, new elements are " +"[code]null[/code]." +msgstr "" + +#: doc/classes/Array.xml doc/classes/PoolByteArray.xml +#: doc/classes/PoolColorArray.xml doc/classes/PoolIntArray.xml +#: doc/classes/PoolRealArray.xml doc/classes/PoolStringArray.xml +#: doc/classes/PoolVector2Array.xml doc/classes/PoolVector3Array.xml +msgid "" +"Searches the array in reverse order. Optionally, a start search index can be " +"passed. If negative, the start index is considered relative to the end of " +"the array. If the adjusted start index is out of bounds, this method " +"searches from the end of the array." +msgstr "" + +#: doc/classes/Array.xml +msgid "" +"Shuffles the array such that the items will have a random order. This method " +"uses the global random number generator common to methods such as [method " +"@GDScript.randi]. Call [method @GDScript.randomize] to ensure that a new " +"seed will be used each time if you want non-reproducible shuffling." +msgstr "" + +#: doc/classes/Array.xml doc/classes/PoolByteArray.xml +#: doc/classes/PoolColorArray.xml doc/classes/PoolIntArray.xml +#: doc/classes/PoolRealArray.xml doc/classes/PoolStringArray.xml +#: doc/classes/PoolVector2Array.xml doc/classes/PoolVector3Array.xml +msgid "Returns the number of elements in the array." +msgstr "" + +#: doc/classes/Array.xml +msgid "" +"Duplicates the subset described in the function and returns it in an array, " +"deeply copying the array if [code]deep[/code] is [code]true[/code]. Lower " +"and upper index are inclusive, with the [code]step[/code] describing the " +"change between indices while slicing." +msgstr "" + +#: doc/classes/Array.xml +msgid "" +"Sorts the array.\n" +"[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " +"order). This may lead to unexpected behavior when sorting an array of " +"strings ending with a sequence of numbers. Consider the following example:\n" +"[codeblock]\n" +"var strings = [\"string1\", \"string2\", \"string10\", \"string11\"]\n" +"strings.sort()\n" +"print(strings) # Prints [string1, string10, string11, string2]\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Array.xml +msgid "" +"Sorts the array using a custom method. The arguments are an object that " +"holds the method and the name of such method. The custom method receives two " +"arguments (a pair of elements from the array) and must return either " +"[code]true[/code] or [code]false[/code].\n" +"For two elements [code]a[/code] and [code]b[/code], if the given method " +"returns [code]true[/code], element [code]b[/code] will be after element " +"[code]a[/code] in the array.\n" +"[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " +"expects a deterministic result. Doing so will result in unexpected " +"behavior.\n" +"[codeblock]\n" +"class MyCustomSorter:\n" +" static func sort_ascending(a, b):\n" +" if a[0] < b[0]:\n" +" return true\n" +" return false\n" +"\n" +"var my_items = [[5, \"Potato\"], [9, \"Rice\"], [4, \"Tomato\"]]\n" +"my_items.sort_custom(MyCustomSorter, \"sort_ascending\")\n" +"print(my_items) # Prints [[4, Tomato], [5, Potato], [9, Rice]].\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "" +"[Mesh] type that provides utility for constructing a surface from arrays." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "" +"The [ArrayMesh] is used to construct a [Mesh] by specifying the attributes " +"as arrays.\n" +"The most basic example is the creation of a single triangle:\n" +"[codeblock]\n" +"var vertices = PoolVector3Array()\n" +"vertices.push_back(Vector3(0, 1, 0))\n" +"vertices.push_back(Vector3(1, 0, 0))\n" +"vertices.push_back(Vector3(0, 0, 1))\n" +"# Initialize the ArrayMesh.\n" +"var arr_mesh = ArrayMesh.new()\n" +"var arrays = []\n" +"arrays.resize(ArrayMesh.ARRAY_MAX)\n" +"arrays[ArrayMesh.ARRAY_VERTEX] = vertices\n" +"# Create the Mesh.\n" +"arr_mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays)\n" +"var m = MeshInstance.new()\n" +"m.mesh = arr_mesh\n" +"[/codeblock]\n" +"The [MeshInstance] is ready to be added to the [SceneTree] to be shown.\n" +"See also [ImmediateGeometry], [MeshDataTool] and [SurfaceTool] for " +"procedural geometry generation.\n" +"[b]Note:[/b] Godot uses clockwise [url=https://learnopengl.com/Advanced-" +"OpenGL/Face-culling]winding order[/url] for front faces of triangle " +"primitive modes." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "" +"Adds name for a blend shape that will be added with [method " +"add_surface_from_arrays]. Must be called before surface is added." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "" +"Creates a new surface.\n" +"Surfaces are created to be rendered using a [code]primitive[/code], which " +"may be any of the types defined in [enum Mesh.PrimitiveType]. (As a note, " +"when using indices, it is recommended to only use points, lines, or " +"triangles.) [method Mesh.get_surface_count] will become the [code]surf_idx[/" +"code] for this new surface.\n" +"The [code]arrays[/code] argument is an array of arrays. See [enum ArrayType] " +"for the values used in this array. For example, [code]arrays[0][/code] is " +"the array of vertices. That first vertex sub-array is always required; the " +"others are optional. Adding an index array puts this function into \"index " +"mode\" where the vertex and other arrays become the sources of data and the " +"index array defines the vertex order. All sub-arrays must have the same " +"length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "Removes all blend shapes from this [ArrayMesh]." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "Removes all surfaces from this [ArrayMesh]." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "Returns the number of blend shapes that the [ArrayMesh] holds." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "Returns the name of the blend shape at this index." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "" +"Will perform a UV unwrap on the [ArrayMesh] to prepare the mesh for " +"lightmapping." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "Will regenerate normal maps for the [ArrayMesh]." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "" +"Returns the index of the first surface with this name held within this " +"[ArrayMesh]. If none are found, -1 is returned." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "" +"Returns the length in indices of the index array in the requested surface " +"(see [method add_surface_from_arrays])." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "" +"Returns the length in vertices of the vertex array in the requested surface " +"(see [method add_surface_from_arrays])." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "" +"Returns the format mask of the requested surface (see [method " +"add_surface_from_arrays])." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "Gets the name assigned to this surface." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "" +"Returns the primitive type of the requested surface (see [method " +"add_surface_from_arrays])." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "" +"Removes a surface at position [code]surf_idx[/code], shifting greater " +"surfaces one [code]surf_idx[/code] slot down." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "Sets a name for a given surface." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "" +"Updates a specified region of mesh arrays on the GPU.\n" +"[b]Warning:[/b] Only use if you know what you are doing. You can easily " +"cause crashes by calling this function with improper arguments." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "Sets the blend shape mode to one of [enum Mesh.BlendShapeMode]." +msgstr "" + +#: doc/classes/ArrayMesh.xml doc/classes/PrimitiveMesh.xml +msgid "" +"Overrides the [AABB] with one defined by user for use with frustum culling. " +"Especially useful to avoid unexpected culling when using a shader to offset " +"vertices." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "Value used internally when no indices are present." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "Amount of weights/bone indices per vertex (always 4)." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "[PoolVector3Array], [PoolVector2Array], or [Array] of vertex positions." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "[PoolVector3Array] of vertex normals." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "" +"[PoolRealArray] of vertex tangents. Each element in groups of 4 floats, " +"first 3 floats determine the tangent, and the last the binormal direction as " +"-1 or 1." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "[PoolColorArray] of vertex colors." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "[PoolVector2Array] for UV coordinates." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "[PoolVector2Array] for second UV coordinates." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "" +"[PoolRealArray] or [PoolIntArray] of bone indices. Each element in groups of " +"4 floats." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "[PoolRealArray] of bone weights. Each element in groups of 4 floats." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "" +"[PoolIntArray] of integers used as indices referencing vertices, colors, " +"normals, tangents, and textures. All of those arrays must have the same " +"number of elements as the vertex array. No index can be beyond the vertex " +"array size. When this index array is present, it puts the function into " +"\"index mode,\" where the index selects the *i*'th vertex, normal, tangent, " +"color, UV, etc. This means if you want to have different normals or colors " +"along an edge, you have to duplicate the vertices.\n" +"For triangles, the index array is interpreted as triples, referring to the " +"vertices of each triangle. For lines, the index array is in pairs indicating " +"the start and end of each line." +msgstr "" + +#: doc/classes/ArrayMesh.xml doc/classes/Mesh.xml doc/classes/VisualServer.xml +msgid "Represents the size of the [enum ArrayType] enum." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "Array format will include vertices (mandatory)." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "Array format will include normals." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "Array format will include tangents." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "Array format will include a color array." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "Array format will include UVs." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "Array format will include another set of UVs." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "Array format will include bone indices." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "Array format will include bone weights." +msgstr "" + +#: doc/classes/ArrayMesh.xml +msgid "Index array will be used." +msgstr "" + +#: doc/classes/ARVRAnchor.xml +msgid "An anchor point in AR space." +msgstr "" + +#: doc/classes/ARVRAnchor.xml +msgid "" +"The [ARVRAnchor] point is a spatial node that maps a real world location " +"identified by the AR platform to a position within the game world. For " +"example, as long as plane detection in ARKit is on, ARKit will identify and " +"update the position of planes (tables, floors, etc) and create anchors for " +"them.\n" +"This node is mapped to one of the anchors through its unique ID. When you " +"receive a signal that a new anchor is available, you should add this node to " +"your scene for that anchor. You can predefine nodes and set the ID; the " +"nodes will simply remain on 0,0,0 until a plane is recognized.\n" +"Keep in mind that, as long as plane detection is enabled, the size, placing " +"and orientation of an anchor will be updated as the detection logic learns " +"more about the real world out there especially if only part of the surface " +"is in view." +msgstr "" + +#: doc/classes/ARVRAnchor.xml +msgid "Returns the name given to this anchor." +msgstr "" + +#: doc/classes/ARVRAnchor.xml +msgid "" +"Returns [code]true[/code] if the anchor is being tracked and [code]false[/" +"code] if no anchor with this ID is currently known." +msgstr "" + +#: doc/classes/ARVRAnchor.xml +msgid "" +"If provided by the [ARVRInterface], this returns a mesh object for the " +"anchor. For an anchor, this can be a shape related to the object being " +"tracked or it can be a mesh that provides topology related to the anchor and " +"can be used to create shadows/reflections on surfaces or for generating " +"collision shapes." +msgstr "" + +#: doc/classes/ARVRAnchor.xml +msgid "" +"Returns a plane aligned with our anchor; handy for intersection testing." +msgstr "" + +#: doc/classes/ARVRAnchor.xml +msgid "" +"Returns the estimated size of the plane that was detected. Say when the " +"anchor relates to a table in the real world, this is the estimated size of " +"the surface of that table." +msgstr "" + +#: doc/classes/ARVRAnchor.xml +msgid "" +"The anchor's ID. You can set this before the anchor itself exists. The first " +"anchor gets an ID of [code]1[/code], the second an ID of [code]2[/code], " +"etc. When anchors get removed, the engine can then assign the corresponding " +"ID to new anchors. The most common situation where anchors \"disappear\" is " +"when the AR server identifies that two anchors represent different parts of " +"the same plane and merges them." +msgstr "" + +#: doc/classes/ARVRAnchor.xml +msgid "" +"Emitted when the mesh associated with the anchor changes or when one becomes " +"available. This is especially important for topology that is constantly " +"being [code]mesh_updated[/code]." +msgstr "" + +#: doc/classes/ARVRCamera.xml +msgid "" +"A camera node with a few overrules for AR/VR applied, such as location " +"tracking." +msgstr "" + +#: doc/classes/ARVRCamera.xml +msgid "" +"This is a helper spatial node for our camera; note that, if stereoscopic " +"rendering is applicable (VR-HMD), most of the camera properties are ignored, " +"as the HMD information overrides them. The only properties that can be " +"trusted are the near and far planes.\n" +"The position and orientation of this node is automatically updated by the " +"ARVR Server to represent the location of the HMD if such tracking is " +"available and can thus be used by game logic. Note that, in contrast to the " +"ARVR Controller, the render thread has access to the most up-to-date " +"tracking data of the HMD and the location of the ARVRCamera can lag a few " +"milliseconds behind what is used for rendering as a result." +msgstr "" + +#: doc/classes/ARVRController.xml +msgid "A spatial node representing a spatially-tracked controller." +msgstr "" + +#: doc/classes/ARVRController.xml +msgid "" +"This is a helper spatial node that is linked to the tracking of controllers. " +"It also offers several handy passthroughs to the state of buttons and such " +"on the controllers.\n" +"Controllers are linked by their ID. You can create controller nodes before " +"the controllers are available. If your game always uses two controllers (one " +"for each hand), you can predefine the controllers with ID 1 and 2; they will " +"become active as soon as the controllers are identified. If you expect " +"additional controllers to be used, you should react to the signals and add " +"ARVRController nodes to your scene.\n" +"The position of the controller node is automatically updated by the " +"[ARVRServer]. This makes this node ideal to add child nodes to visualize the " +"controller." +msgstr "" + +#: doc/classes/ARVRController.xml +msgid "" +"If active, returns the name of the associated controller if provided by the " +"AR/VR SDK used." +msgstr "" + +#: doc/classes/ARVRController.xml +msgid "" +"Returns the hand holding this controller, if known. See [enum " +"ARVRPositionalTracker.TrackerHand]." +msgstr "" + +#: doc/classes/ARVRController.xml +msgid "" +"Returns [code]true[/code] if the bound controller is active. ARVR systems " +"attempt to track active controllers." +msgstr "" + +#: doc/classes/ARVRController.xml +msgid "" +"Returns the value of the given axis for things like triggers, touchpads, " +"etc. that are embedded into the controller." +msgstr "" + +#: doc/classes/ARVRController.xml +msgid "" +"Returns the ID of the joystick object bound to this. Every controller " +"tracked by the [ARVRServer] that has buttons and axis will also be " +"registered as a joystick within Godot. This means that all the normal " +"joystick tracking and input mapping will work for buttons and axis found on " +"the AR/VR controllers. This ID is purely offered as information so you can " +"link up the controller with its joystick entry." +msgstr "" + +#: doc/classes/ARVRController.xml +msgid "" +"If provided by the [ARVRInterface], this returns a mesh associated with the " +"controller. This can be used to visualize the controller." +msgstr "" + +#: doc/classes/ARVRController.xml +msgid "" +"Returns [code]true[/code] if the button at index [code]button[/code] is " +"pressed. See [enum JoystickList], in particular the [code]JOY_VR_*[/code] " +"constants." +msgstr "" + +#: doc/classes/ARVRController.xml +msgid "" +"The controller's ID.\n" +"A controller ID of 0 is unbound and will always result in an inactive node. " +"Controller ID 1 is reserved for the first controller that identifies itself " +"as the left-hand controller and ID 2 is reserved for the first controller " +"that identifies itself as the right-hand controller.\n" +"For any other controller that the [ARVRServer] detects, we continue with " +"controller ID 3.\n" +"When a controller is turned off, its slot is freed. This ensures controllers " +"will keep the same ID even when controllers with lower IDs are turned off." +msgstr "" + +#: doc/classes/ARVRController.xml +msgid "" +"The degree to which the controller vibrates. Ranges from [code]0.0[/code] to " +"[code]1.0[/code]. If changed, updates [member ARVRPositionalTracker.rumble] " +"accordingly.\n" +"This is a useful property to animate if you want the controller to vibrate " +"for a limited duration." +msgstr "" + +#: doc/classes/ARVRController.xml +msgid "Emitted when a button on this controller is pressed." +msgstr "" + +#: doc/classes/ARVRController.xml +msgid "Emitted when a button on this controller is released." +msgstr "" + +#: doc/classes/ARVRController.xml +msgid "" +"Emitted when the mesh associated with the controller changes or when one " +"becomes available. Generally speaking this will be a static mesh after " +"becoming available." +msgstr "" + +#: doc/classes/ARVRInterface.xml +msgid "Base class for an AR/VR interface implementation." +msgstr "" + +#: doc/classes/ARVRInterface.xml +msgid "" +"This class needs to be implemented to make an AR or VR platform available to " +"Godot and these should be implemented as C++ modules or GDNative modules " +"(note that for GDNative the subclass ARVRScriptInterface should be used). " +"Part of the interface is exposed to GDScript so you can detect, enable and " +"configure an AR or VR platform.\n" +"Interfaces should be written in such a way that simply enabling them will " +"give us a working setup. You can query the available interfaces through " +"[ARVRServer]." +msgstr "" + +#: doc/classes/ARVRInterface.xml +msgid "" +"If this is an AR interface that requires displaying a camera feed as the " +"background, this method returns the feed ID in the [CameraServer] for this " +"interface." +msgstr "" + +#: doc/classes/ARVRInterface.xml +msgid "" +"Returns a combination of [enum Capabilities] flags providing information " +"about the capabilities of this interface." +msgstr "" + +#: doc/classes/ARVRInterface.xml +msgid "Returns the name of this interface (OpenVR, OpenHMD, ARKit, etc)." +msgstr "" + +#: doc/classes/ARVRInterface.xml +msgid "" +"Returns the resolution at which we should render our intermediate results " +"before things like lens distortion are applied by the VR platform." +msgstr "" + +#: doc/classes/ARVRInterface.xml +msgid "" +"If supported, returns the status of our tracking. This will allow you to " +"provide feedback to the user whether there are issues with positional " +"tracking." +msgstr "" + +#: doc/classes/ARVRInterface.xml +msgid "" +"Call this to initialize this interface. The first interface that is " +"initialized is identified as the primary interface and it will be used for " +"rendering output.\n" +"After initializing the interface you want to use you then need to enable the " +"AR/VR mode of a viewport and rendering should commence.\n" +"[b]Note:[/b] You must enable the AR/VR mode on the main viewport for any " +"device that uses the main output of Godot, such as for mobile VR.\n" +"If you do this for a platform that handles its own output (such as OpenVR) " +"Godot will show just one eye without distortion on screen. Alternatively, " +"you can add a separate viewport node to your scene and enable AR/VR on that " +"viewport. It will be used to output to the HMD, leaving you free to do " +"anything you like in the main window, such as using a separate camera as a " +"spectator camera or rendering something completely different.\n" +"While currently not used, you can activate additional interfaces. You may " +"wish to do this if you want to track controllers from other platforms. " +"However, at this point in time only one interface can render to an HMD." +msgstr "" + +#: doc/classes/ARVRInterface.xml +msgid "" +"Returns [code]true[/code] if the current output of this interface is in " +"stereo." +msgstr "" + +#: doc/classes/ARVRInterface.xml +msgid "Turns the interface off." +msgstr "" + +#: doc/classes/ARVRInterface.xml +msgid "On an AR interface, [code]true[/code] if anchor detection is enabled." +msgstr "" + +#: doc/classes/ARVRInterface.xml +msgid "[code]true[/code] if this interface been initialized." +msgstr "" + +#: doc/classes/ARVRInterface.xml +msgid "[code]true[/code] if this is the primary interface." +msgstr "" + +#: doc/classes/ARVRInterface.xml +msgid "No ARVR capabilities." +msgstr "" + +#: doc/classes/ARVRInterface.xml +msgid "" +"This interface can work with normal rendering output (non-HMD based AR)." +msgstr "" + +#: doc/classes/ARVRInterface.xml +msgid "This interface supports stereoscopic rendering." +msgstr "" + +#: doc/classes/ARVRInterface.xml +msgid "This interface supports AR (video background and real world tracking)." +msgstr "" + +#: doc/classes/ARVRInterface.xml +msgid "" +"This interface outputs to an external device. If the main viewport is used, " +"the on screen output is an unmodified buffer of either the left or right eye " +"(stretched if the viewport size is not changed to the same aspect ratio of " +"[method get_render_targetsize]). Using a separate viewport node frees up the " +"main viewport for other purposes." +msgstr "" + +#: doc/classes/ARVRInterface.xml +msgid "" +"Mono output, this is mostly used internally when retrieving positioning " +"information for our camera node or when stereo scopic rendering is not " +"supported." +msgstr "" + +#: doc/classes/ARVRInterface.xml +msgid "" +"Left eye output, this is mostly used internally when rendering the image for " +"the left eye and obtaining positioning and projection information." +msgstr "" + +#: doc/classes/ARVRInterface.xml +msgid "" +"Right eye output, this is mostly used internally when rendering the image " +"for the right eye and obtaining positioning and projection information." +msgstr "" + +#: doc/classes/ARVRInterface.xml +msgid "Tracking is behaving as expected." +msgstr "" + +#: doc/classes/ARVRInterface.xml +msgid "" +"Tracking is hindered by excessive motion (the player is moving faster than " +"tracking can keep up)." +msgstr "" + +#: doc/classes/ARVRInterface.xml +msgid "" +"Tracking is hindered by insufficient features, it's too dark (for camera-" +"based tracking), player is blocked, etc." +msgstr "" + +#: doc/classes/ARVRInterface.xml +msgid "" +"We don't know the status of the tracking or this interface does not provide " +"feedback." +msgstr "" + +#: doc/classes/ARVRInterface.xml +msgid "" +"Tracking is not functional (camera not plugged in or obscured, lighthouses " +"turned off, etc.)." +msgstr "" + +#: modules/gdnative/doc_classes/ARVRInterfaceGDNative.xml +msgid "GDNative wrapper for an ARVR interface." +msgstr "" + +#: modules/gdnative/doc_classes/ARVRInterfaceGDNative.xml +msgid "" +"This is a wrapper class for GDNative implementations of the ARVR interface. " +"To use a GDNative ARVR interface, simply instantiate this object and set " +"your GDNative library containing the ARVR interface implementation." +msgstr "" + +#: doc/classes/ARVROrigin.xml +msgid "The origin point in AR/VR." +msgstr "" + +#: doc/classes/ARVROrigin.xml +msgid "" +"This is a special node within the AR/VR system that maps the physical " +"location of the center of our tracking space to the virtual location within " +"our game world.\n" +"There should be only one of these nodes in your scene and you must have one. " +"All the ARVRCamera, ARVRController and ARVRAnchor nodes should be direct " +"children of this node for spatial tracking to work correctly.\n" +"It is the position of this node that you update when your character needs to " +"move through your game world while we're not moving in the real world. " +"Movement in the real world is always in relation to this origin point.\n" +"For example, if your character is driving a car, the ARVROrigin node should " +"be a child node of this car. Or, if you're implementing a teleport system to " +"move your character, you should change the position of this node." +msgstr "" + +#: doc/classes/ARVROrigin.xml +msgid "" +"Allows you to adjust the scale to your game's units. Most AR/VR platforms " +"assume a scale of 1 game world unit = 1 real world meter.\n" +"[b]Note:[/b] This method is a passthrough to the [ARVRServer] itself." +msgstr "" + +#: doc/classes/ARVRPositionalTracker.xml +msgid "A tracked object." +msgstr "" + +#: doc/classes/ARVRPositionalTracker.xml +msgid "" +"An instance of this object represents a device that is tracked, such as a " +"controller or anchor point. HMDs aren't represented here as they are handled " +"internally.\n" +"As controllers are turned on and the AR/VR interface detects them, instances " +"of this object are automatically added to this list of active tracking " +"objects accessible through the [ARVRServer].\n" +"The [ARVRController] and [ARVRAnchor] both consume objects of this type and " +"should be used in your project. The positional trackers are just under-the-" +"hood objects that make this all work. These are mostly exposed so that " +"GDNative-based interfaces can interact with them." +msgstr "" + +#: doc/classes/ARVRPositionalTracker.xml +msgid "" +"Returns the hand holding this tracker, if known. See [enum TrackerHand] " +"constants." +msgstr "" + +#: doc/classes/ARVRPositionalTracker.xml +msgid "" +"If this is a controller that is being tracked, the controller will also be " +"represented by a joystick entry with this ID." +msgstr "" + +#: doc/classes/ARVRPositionalTracker.xml +msgid "" +"Returns the mesh related to a controller or anchor point if one is available." +msgstr "" + +#: doc/classes/ARVRPositionalTracker.xml +msgid "Returns the controller or anchor point's name if available." +msgstr "" + +#: doc/classes/ARVRPositionalTracker.xml +msgid "Returns the controller's orientation matrix." +msgstr "" + +#: doc/classes/ARVRPositionalTracker.xml +msgid "Returns the world-space controller position." +msgstr "" + +#: doc/classes/ARVRPositionalTracker.xml +msgid "" +"Returns the internal tracker ID. This uniquely identifies the tracker per " +"tracker type and matches the ID you need to specify for nodes such as the " +"[ARVRController] and [ARVRAnchor] nodes." +msgstr "" + +#: doc/classes/ARVRPositionalTracker.xml +msgid "Returns [code]true[/code] if this device tracks orientation." +msgstr "" + +#: doc/classes/ARVRPositionalTracker.xml +msgid "Returns [code]true[/code] if this device tracks position." +msgstr "" + +#: doc/classes/ARVRPositionalTracker.xml +msgid "Returns the transform combining this device's orientation and position." +msgstr "" + +#: doc/classes/ARVRPositionalTracker.xml +msgid "Returns the tracker's type." +msgstr "" + +#: doc/classes/ARVRPositionalTracker.xml +msgid "" +"The degree to which the tracker rumbles. Ranges from [code]0.0[/code] to " +"[code]1.0[/code] with precision [code].01[/code]." +msgstr "" + +#: doc/classes/ARVRPositionalTracker.xml +msgid "The hand this tracker is held in is unknown or not applicable." +msgstr "" + +#: doc/classes/ARVRPositionalTracker.xml +msgid "This tracker is the left hand controller." +msgstr "" + +#: doc/classes/ARVRPositionalTracker.xml +msgid "This tracker is the right hand controller." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "Server for AR and VR features." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "" +"The AR/VR server is the heart of our Advanced and Virtual Reality solution " +"and handles all the processing." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "Registers an [ARVRInterface] object." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "" +"Registers a new [ARVRPositionalTracker] that tracks a spatial location in " +"real space." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "" +"This is an important function to understand correctly. AR and VR platforms " +"all handle positioning slightly differently.\n" +"For platforms that do not offer spatial tracking, our origin point (0,0,0) " +"is the location of our HMD, but you have little control over the direction " +"the player is facing in the real world.\n" +"For platforms that do offer spatial tracking, our origin point depends very " +"much on the system. For OpenVR, our origin point is usually the center of " +"the tracking space, on the ground. For other platforms, it's often the " +"location of the tracking camera.\n" +"This method allows you to center your tracker on the location of the HMD. It " +"will take the current location of the HMD and use that to adjust all your " +"tracking data; in essence, realigning the real world to your player's " +"current position in the game world.\n" +"For this method to produce usable results, tracking information must be " +"available. This often takes a few frames after starting your game.\n" +"You should call this method after a few seconds have passed. For instance, " +"when the user requests a realignment of the display holding a designated " +"button on a controller for a short period of time, or when implementing a " +"teleport mechanism." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "" +"Clears our current primary interface if it is set to the provided interface." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "" +"Finds an interface by its name. For instance, if your project uses " +"capabilities of an AR/VR platform, you can find the interface for that " +"platform by name and initialize it." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "Returns the primary interface's transformation." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "" +"Returns the interface registered at a given index in our list of interfaces." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "" +"Returns the number of interfaces currently registered with the AR/VR server. " +"If your project supports multiple AR/VR platforms, you can look through the " +"available interface, and either present the user with a selection or simply " +"try to initialize each interface and use the first one that returns " +"[code]true[/code]." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "" +"Returns a list of available interfaces the ID and name of each interface." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "" +"Returns the absolute timestamp (in μs) of the last [ARVRServer] commit of " +"the AR/VR eyes to [VisualServer]. The value comes from an internal call to " +"[method OS.get_ticks_usec]." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "" +"Returns the duration (in μs) of the last frame. This is computed as the " +"difference between [method get_last_commit_usec] and [method " +"get_last_process_usec] when committing." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "" +"Returns the absolute timestamp (in μs) of the last [ARVRServer] process " +"callback. The value comes from an internal call to [method OS." +"get_ticks_usec]." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "" +"Returns the reference frame transform. Mostly used internally and exposed " +"for GDNative build interfaces." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "Returns the positional tracker at the given ID." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "Returns the number of trackers currently registered." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "Removes this interface." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "Removes this positional tracker." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "The primary [ARVRInterface] currently bound to the [ARVRServer]." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "" +"Allows you to adjust the scale to your game's units. Most AR/VR platforms " +"assume a scale of 1 game world unit = 1 real world meter." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "Emitted when a new interface has been added." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "Emitted when an interface is removed." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "" +"Emitted when a new tracker has been added. If you don't use a fixed number " +"of controllers or if you're using [ARVRAnchor]s for an AR solution, it is " +"important to react to this signal to add the appropriate [ARVRController] or " +"[ARVRAnchor] nodes related to this new tracker." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "" +"Emitted when a tracker is removed. You should remove any [ARVRController] or " +"[ARVRAnchor] points if applicable. This is not mandatory, the nodes simply " +"become inactive and will be made active again when a new tracker becomes " +"available (i.e. a new controller is switched on that takes the place of the " +"previous one)." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "The tracker tracks the location of a controller." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "The tracker tracks the location of a base station." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "The tracker tracks the location and size of an AR anchor." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "Used internally to filter trackers of any known type." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "Used internally if we haven't set the tracker type yet." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "Used internally to select all trackers." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "" +"Fully reset the orientation of the HMD. Regardless of what direction the " +"user is looking to in the real world. The user will look dead ahead in the " +"virtual world." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "" +"Resets the orientation but keeps the tilt of the device. So if we're looking " +"down, we keep looking down but heading will be reset." +msgstr "" + +#: doc/classes/ARVRServer.xml +msgid "" +"Does not reset the orientation of the HMD, only the position of the player " +"gets centered." +msgstr "" + +#: doc/classes/AspectRatioContainer.xml +msgid "Container that preserves its child controls' aspect ratio." +msgstr "" + +#: doc/classes/AspectRatioContainer.xml +msgid "" +"Arranges child controls in a way to preserve their aspect ratio " +"automatically whenever the container is resized. Solves the problem where " +"the container size is dynamic and the contents' size needs to adjust " +"accordingly without losing proportions." +msgstr "" + +#: doc/classes/AspectRatioContainer.xml doc/classes/BoxContainer.xml +#: doc/classes/CenterContainer.xml doc/classes/Container.xml +#: doc/classes/GridContainer.xml doc/classes/HBoxContainer.xml +#: doc/classes/HSplitContainer.xml doc/classes/MarginContainer.xml +#: doc/classes/PanelContainer.xml doc/classes/ScrollContainer.xml +#: doc/classes/SplitContainer.xml doc/classes/TabContainer.xml +#: doc/classes/VBoxContainer.xml doc/classes/VSplitContainer.xml +msgid "GUI containers" +msgstr "" + +#: doc/classes/AspectRatioContainer.xml +msgid "Specifies the horizontal relative position of child controls." +msgstr "" + +#: doc/classes/AspectRatioContainer.xml +msgid "Specifies the vertical relative position of child controls." +msgstr "" + +#: doc/classes/AspectRatioContainer.xml +msgid "" +"The aspect ratio to enforce on child controls. This is the width divided by " +"the height. The ratio depends on the [member stretch_mode]." +msgstr "" + +#: doc/classes/AspectRatioContainer.xml +msgid "The stretch mode used to align child controls." +msgstr "" + +#: doc/classes/AspectRatioContainer.xml +msgid "" +"The height of child controls is automatically adjusted based on the width of " +"the container." +msgstr "" + +#: doc/classes/AspectRatioContainer.xml +msgid "" +"The width of child controls is automatically adjusted based on the height of " +"the container." +msgstr "" + +#: doc/classes/AspectRatioContainer.xml +msgid "" +"The bounding rectangle of child controls is automatically adjusted to fit " +"inside the container while keeping the aspect ratio." +msgstr "" + +#: doc/classes/AspectRatioContainer.xml +msgid "" +"The width and height of child controls is automatically adjusted to make " +"their bounding rectangle cover the entire area of the container while " +"keeping the aspect ratio.\n" +"When the bounding rectangle of child controls exceed the container's size " +"and [member Control.rect_clip_content] is enabled, this allows to show only " +"the container's area restricted by its own bounding rectangle." +msgstr "" + +#: doc/classes/AspectRatioContainer.xml +msgid "" +"Aligns child controls with the beginning (left or top) of the container." +msgstr "" + +#: doc/classes/AspectRatioContainer.xml +msgid "Aligns child controls with the center of the container." +msgstr "" + +#: doc/classes/AspectRatioContainer.xml +msgid "Aligns child controls with the end (right or bottom) of the container." +msgstr "" + +#: doc/classes/AStar.xml +msgid "" +"An implementation of A* to find the shortest paths among connected points in " +"space." +msgstr "" + +#: doc/classes/AStar.xml +msgid "" +"A* (A star) is a computer algorithm that is widely used in pathfinding and " +"graph traversal, the process of plotting short paths among vertices " +"(points), passing through a given set of edges (segments). It enjoys " +"widespread use due to its performance and accuracy. Godot's A* " +"implementation uses points in three-dimensional space and Euclidean " +"distances by default.\n" +"You must add points manually with [method add_point] and create segments " +"manually with [method connect_points]. Then you can test if there is a path " +"between two points with the [method are_points_connected] function, get a " +"path containing indices by [method get_id_path], or one containing actual " +"coordinates with [method get_point_path].\n" +"It is also possible to use non-Euclidean distances. To do so, create a class " +"that extends [code]AStar[/code] and override methods [method _compute_cost] " +"and [method _estimate_cost]. Both take two indices and return a length, as " +"is shown in the following example.\n" +"[codeblock]\n" +"class MyAStar:\n" +" extends AStar\n" +"\n" +" func _compute_cost(u, v):\n" +" return abs(u - v)\n" +"\n" +" func _estimate_cost(u, v):\n" +" return min(0, abs(u - v) - 1)\n" +"[/codeblock]\n" +"[method _estimate_cost] should return a lower bound of the distance, i.e. " +"[code]_estimate_cost(u, v) <= _compute_cost(u, v)[/code]. This serves as a " +"hint to the algorithm because the custom [code]_compute_cost[/code] might be " +"computation-heavy. If this is not the case, make [method _estimate_cost] " +"return the same value as [method _compute_cost] to provide the algorithm " +"with the most accurate information.\n" +"If the default [method _estimate_cost] and [method _compute_cost] methods " +"are used, or if the supplied [method _estimate_cost] method returns a lower " +"bound of the cost, then the paths returned by A* will be the lowest-cost " +"paths. Here, the cost of a path equals the sum of the [method _compute_cost] " +"results of all segments in the path multiplied by the [code]weight_scale[/" +"code]s of the endpoints of the respective segments. If the default methods " +"are used and the [code]weight_scale[/code]s of all points are set to " +"[code]1.0[/code], then this equals the sum of Euclidean distances of all " +"segments in the path." +msgstr "" + +#: doc/classes/AStar.xml +msgid "" +"Called when computing the cost between two connected points.\n" +"Note that this function is hidden in the default [code]AStar[/code] class." +msgstr "" + +#: doc/classes/AStar.xml +msgid "" +"Called when estimating the cost between a point and the path's ending " +"point.\n" +"Note that this function is hidden in the default [code]AStar[/code] class." +msgstr "" + +#: doc/classes/AStar.xml +msgid "" +"Adds a new point at the given position with the given identifier. The " +"[code]id[/code] must be 0 or larger, and the [code]weight_scale[/code] must " +"be 0.0 or greater.\n" +"The [code]weight_scale[/code] is multiplied by the result of [method " +"_compute_cost] when determining the overall cost of traveling across a " +"segment from a neighboring point to this point. Thus, all else being equal, " +"the algorithm prefers points with lower [code]weight_scale[/code]s to form a " +"path.\n" +"[codeblock]\n" +"var astar = AStar.new()\n" +"astar.add_point(1, Vector3(1, 0, 0), 4) # Adds the point (1, 0, 0) with " +"weight_scale 4 and id 1\n" +"[/codeblock]\n" +"If there already exists a point for the given [code]id[/code], its position " +"and weight scale are updated to the given values." +msgstr "" + +#: doc/classes/AStar.xml +msgid "" +"Returns whether the two given points are directly connected by a segment. If " +"[code]bidirectional[/code] is [code]false[/code], returns whether movement " +"from [code]id[/code] to [code]to_id[/code] is possible through this segment." +msgstr "" + +#: doc/classes/AStar.xml doc/classes/AStar2D.xml +msgid "Clears all the points and segments." +msgstr "" + +#: doc/classes/AStar.xml +msgid "" +"Creates a segment between the given points. If [code]bidirectional[/code] is " +"[code]false[/code], only movement from [code]id[/code] to [code]to_id[/code] " +"is allowed, not the reverse direction.\n" +"[codeblock]\n" +"var astar = AStar.new()\n" +"astar.add_point(1, Vector3(1, 1, 0))\n" +"astar.add_point(2, Vector3(0, 5, 0))\n" +"astar.connect_points(1, 2, false)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/AStar.xml doc/classes/AStar2D.xml +msgid "" +"Deletes the segment between the given points. If [code]bidirectional[/code] " +"is [code]false[/code], only movement from [code]id[/code] to [code]to_id[/" +"code] is prevented, and a unidirectional segment possibly remains." +msgstr "" + +#: doc/classes/AStar.xml doc/classes/AStar2D.xml +msgid "Returns the next available point ID with no point associated to it." +msgstr "" + +#: doc/classes/AStar.xml doc/classes/AStar2D.xml +msgid "" +"Returns the ID of the closest point to [code]to_position[/code], optionally " +"taking disabled points into account. Returns [code]-1[/code] if there are no " +"points in the points pool.\n" +"[b]Note:[/b] If several points are the closest to [code]to_position[/code], " +"the one with the smallest ID will be returned, ensuring a deterministic " +"result." +msgstr "" + +#: doc/classes/AStar.xml +msgid "" +"Returns the closest position to [code]to_position[/code] that resides inside " +"a segment between two connected points.\n" +"[codeblock]\n" +"var astar = AStar.new()\n" +"astar.add_point(1, Vector3(0, 0, 0))\n" +"astar.add_point(2, Vector3(0, 5, 0))\n" +"astar.connect_points(1, 2)\n" +"var res = astar.get_closest_position_in_segment(Vector3(3, 3, 0)) # Returns " +"(0, 3, 0)\n" +"[/codeblock]\n" +"The result is in the segment that goes from [code]y = 0[/code] to [code]y = " +"5[/code]. It's the closest position in the segment to the given point." +msgstr "" + +#: doc/classes/AStar.xml +msgid "" +"Returns an array with the IDs of the points that form the path found by " +"AStar between the given points. The array is ordered from the starting point " +"to the ending point of the path.\n" +"[codeblock]\n" +"var astar = AStar.new()\n" +"astar.add_point(1, Vector3(0, 0, 0))\n" +"astar.add_point(2, Vector3(0, 1, 0), 1) # Default weight is 1\n" +"astar.add_point(3, Vector3(1, 1, 0))\n" +"astar.add_point(4, Vector3(2, 0, 0))\n" +"\n" +"astar.connect_points(1, 2, false)\n" +"astar.connect_points(2, 3, false)\n" +"astar.connect_points(4, 3, false)\n" +"astar.connect_points(1, 4, false)\n" +"\n" +"var res = astar.get_id_path(1, 3) # Returns [1, 2, 3]\n" +"[/codeblock]\n" +"If you change the 2nd point's weight to 3, then the result will be [code][1, " +"4, 3][/code] instead, because now even though the distance is longer, it's " +"\"easier\" to get through point 4 than through point 2." +msgstr "" + +#: doc/classes/AStar.xml doc/classes/AStar2D.xml +msgid "" +"Returns the capacity of the structure backing the points, useful in " +"conjunction with [code]reserve_space[/code]." +msgstr "" + +#: doc/classes/AStar.xml +msgid "" +"Returns an array with the IDs of the points that form the connection with " +"the given point.\n" +"[codeblock]\n" +"var astar = AStar.new()\n" +"astar.add_point(1, Vector3(0, 0, 0))\n" +"astar.add_point(2, Vector3(0, 1, 0))\n" +"astar.add_point(3, Vector3(1, 1, 0))\n" +"astar.add_point(4, Vector3(2, 0, 0))\n" +"\n" +"astar.connect_points(1, 2, true)\n" +"astar.connect_points(1, 3, true)\n" +"\n" +"var neighbors = astar.get_point_connections(1) # Returns [2, 3]\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/AStar.xml doc/classes/AStar2D.xml +msgid "Returns the number of points currently in the points pool." +msgstr "" + +#: doc/classes/AStar.xml +msgid "" +"Returns an array with the points that are in the path found by AStar between " +"the given points. The array is ordered from the starting point to the ending " +"point of the path.\n" +"[b]Note:[/b] This method is not thread-safe. If called from a [Thread], it " +"will return an empty [PoolVector3Array] and will print an error message." +msgstr "" + +#: doc/classes/AStar.xml doc/classes/AStar2D.xml +msgid "" +"Returns the position of the point associated with the given [code]id[/code]." +msgstr "" + +#: doc/classes/AStar.xml doc/classes/AStar2D.xml +msgid "" +"Returns the weight scale of the point associated with the given [code]id[/" +"code]." +msgstr "" + +#: doc/classes/AStar.xml doc/classes/AStar2D.xml +msgid "Returns an array of all points." +msgstr "" + +#: doc/classes/AStar.xml doc/classes/AStar2D.xml +msgid "" +"Returns whether a point associated with the given [code]id[/code] exists." +msgstr "" + +#: doc/classes/AStar.xml doc/classes/AStar2D.xml +msgid "" +"Returns whether a point is disabled or not for pathfinding. By default, all " +"points are enabled." +msgstr "" + +#: doc/classes/AStar.xml doc/classes/AStar2D.xml +msgid "" +"Removes the point associated with the given [code]id[/code] from the points " +"pool." +msgstr "" + +#: doc/classes/AStar.xml doc/classes/AStar2D.xml +msgid "" +"Reserves space internally for [code]num_nodes[/code] points, useful if " +"you're adding a known large number of points at once, for a grid for " +"instance. New capacity must be greater or equals to old capacity." +msgstr "" + +#: doc/classes/AStar.xml doc/classes/AStar2D.xml +msgid "" +"Disables or enables the specified point for pathfinding. Useful for making a " +"temporary obstacle." +msgstr "" + +#: doc/classes/AStar.xml doc/classes/AStar2D.xml +msgid "" +"Sets the [code]position[/code] for the point with the given [code]id[/code]." +msgstr "" + +#: doc/classes/AStar.xml doc/classes/AStar2D.xml +msgid "" +"Sets the [code]weight_scale[/code] for the point with the given [code]id[/" +"code]. The [code]weight_scale[/code] is multiplied by the result of [method " +"_compute_cost] when determining the overall cost of traveling across a " +"segment from a neighboring point to this point." +msgstr "" + +#: doc/classes/AStar2D.xml +msgid "AStar class representation that uses 2D vectors as edges." +msgstr "" + +#: doc/classes/AStar2D.xml +msgid "" +"This is a wrapper for the [AStar] class which uses 2D vectors instead of 3D " +"vectors." +msgstr "" + +#: doc/classes/AStar2D.xml +msgid "" +"Called when computing the cost between two connected points.\n" +"Note that this function is hidden in the default [code]AStar2D[/code] class." +msgstr "" + +#: doc/classes/AStar2D.xml +msgid "" +"Called when estimating the cost between a point and the path's ending " +"point.\n" +"Note that this function is hidden in the default [code]AStar2D[/code] class." +msgstr "" + +#: doc/classes/AStar2D.xml +msgid "" +"Adds a new point at the given position with the given identifier. The " +"[code]id[/code] must be 0 or larger, and the [code]weight_scale[/code] must " +"be 0.0 or greater.\n" +"The [code]weight_scale[/code] is multiplied by the result of [method " +"_compute_cost] when determining the overall cost of traveling across a " +"segment from a neighboring point to this point. Thus, all else being equal, " +"the algorithm prefers points with lower [code]weight_scale[/code]s to form a " +"path.\n" +"[codeblock]\n" +"var astar = AStar2D.new()\n" +"astar.add_point(1, Vector2(1, 0), 4) # Adds the point (1, 0) with " +"weight_scale 4 and id 1\n" +"[/codeblock]\n" +"If there already exists a point for the given [code]id[/code], its position " +"and weight scale are updated to the given values." +msgstr "" + +#: doc/classes/AStar2D.xml +msgid "" +"Returns whether there is a connection/segment between the given points. If " +"[code]bidirectional[/code] is [code]false[/code], returns whether movement " +"from [code]id[/code] to [code]to_id[/code] is possible through this segment." +msgstr "" + +#: doc/classes/AStar2D.xml +msgid "" +"Creates a segment between the given points. If [code]bidirectional[/code] is " +"[code]false[/code], only movement from [code]id[/code] to [code]to_id[/code] " +"is allowed, not the reverse direction.\n" +"[codeblock]\n" +"var astar = AStar2D.new()\n" +"astar.add_point(1, Vector2(1, 1))\n" +"astar.add_point(2, Vector2(0, 5))\n" +"astar.connect_points(1, 2, false)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/AStar2D.xml +msgid "" +"Returns the closest position to [code]to_position[/code] that resides inside " +"a segment between two connected points.\n" +"[codeblock]\n" +"var astar = AStar2D.new()\n" +"astar.add_point(1, Vector2(0, 0))\n" +"astar.add_point(2, Vector2(0, 5))\n" +"astar.connect_points(1, 2)\n" +"var res = astar.get_closest_position_in_segment(Vector2(3, 3)) # Returns (0, " +"3)\n" +"[/codeblock]\n" +"The result is in the segment that goes from [code]y = 0[/code] to [code]y = " +"5[/code]. It's the closest position in the segment to the given point." +msgstr "" + +#: doc/classes/AStar2D.xml +msgid "" +"Returns an array with the IDs of the points that form the path found by " +"AStar2D between the given points. The array is ordered from the starting " +"point to the ending point of the path.\n" +"[codeblock]\n" +"var astar = AStar2D.new()\n" +"astar.add_point(1, Vector2(0, 0))\n" +"astar.add_point(2, Vector2(0, 1), 1) # Default weight is 1\n" +"astar.add_point(3, Vector2(1, 1))\n" +"astar.add_point(4, Vector2(2, 0))\n" +"\n" +"astar.connect_points(1, 2, false)\n" +"astar.connect_points(2, 3, false)\n" +"astar.connect_points(4, 3, false)\n" +"astar.connect_points(1, 4, false)\n" +"\n" +"var res = astar.get_id_path(1, 3) # Returns [1, 2, 3]\n" +"[/codeblock]\n" +"If you change the 2nd point's weight to 3, then the result will be [code][1, " +"4, 3][/code] instead, because now even though the distance is longer, it's " +"\"easier\" to get through point 4 than through point 2." +msgstr "" + +#: doc/classes/AStar2D.xml +msgid "" +"Returns an array with the IDs of the points that form the connection with " +"the given point.\n" +"[codeblock]\n" +"var astar = AStar2D.new()\n" +"astar.add_point(1, Vector2(0, 0))\n" +"astar.add_point(2, Vector2(0, 1))\n" +"astar.add_point(3, Vector2(1, 1))\n" +"astar.add_point(4, Vector2(2, 0))\n" +"\n" +"astar.connect_points(1, 2, true)\n" +"astar.connect_points(1, 3, true)\n" +"\n" +"var neighbors = astar.get_point_connections(1) # Returns [2, 3]\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/AStar2D.xml +msgid "" +"Returns an array with the points that are in the path found by AStar2D " +"between the given points. The array is ordered from the starting point to " +"the ending point of the path.\n" +"[b]Note:[/b] This method is not thread-safe. If called from a [Thread], it " +"will return an empty [PoolVector2Array] and will print an error message." +msgstr "" + +#: doc/classes/AtlasTexture.xml +msgid "" +"Crops out one part of a texture, such as a texture from a texture atlas." +msgstr "" + +#: doc/classes/AtlasTexture.xml +msgid "" +"[Texture] resource that crops out one part of the [member atlas] texture, " +"defined by [member region]. The main use case is cropping out textures from " +"a texture atlas, which is a big texture file that packs multiple smaller " +"textures. Consists of a [Texture] for the [member atlas], a [member region] " +"that defines the area of [member atlas] to use, and a [member margin] that " +"defines the border width.\n" +"[AtlasTexture] cannot be used in an [AnimatedTexture], cannot be tiled in " +"nodes such as [TextureRect], and does not work properly if used inside of " +"other [AtlasTexture] resources. Multiple [AtlasTexture] resources can be " +"used to crop multiple textures from the atlas. Using a texture atlas helps " +"to optimize video memory costs and render calls compared to using multiple " +"small files.\n" +"[b]Note:[/b] AtlasTextures don't support repetition. The [constant Texture." +"FLAG_REPEAT] and [constant Texture.FLAG_MIRRORED_REPEAT] flags are ignored " +"when using an AtlasTexture." +msgstr "" + +#: doc/classes/AtlasTexture.xml +msgid "The texture that contains the atlas. Can be any [Texture] subtype." +msgstr "" + +#: doc/classes/AtlasTexture.xml +msgid "" +"If [code]true[/code], clips the area outside of the region to avoid bleeding " +"of the surrounding texture pixels." +msgstr "" + +#: doc/classes/AtlasTexture.xml +msgid "" +"The margin around the region. The [Rect2]'s [member Rect2.size] parameter " +"(\"w\" and \"h\" in the editor) resizes the texture so it fits within the " +"margin." +msgstr "" + +#: doc/classes/AtlasTexture.xml +msgid "The AtlasTexture's used region." +msgstr "" + +#: doc/classes/AudioBusLayout.xml +msgid "Stores information about the audio buses." +msgstr "" + +#: doc/classes/AudioBusLayout.xml +msgid "" +"Stores position, muting, solo, bypass, effects, effect position, volume, and " +"the connections between buses. See [AudioServer] for usage." +msgstr "" + +#: doc/classes/AudioEffect.xml +msgid "Audio effect for audio." +msgstr "" + +#: doc/classes/AudioEffect.xml +msgid "" +"Base resource for audio bus. Applies an audio effect on the bus that the " +"resource is applied on." +msgstr "" + +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml +#: doc/classes/AudioStreamPlayer.xml +msgid "Audio Mic Record Demo" +msgstr "" + +#: doc/classes/AudioEffectAmplify.xml +msgid "" +"Adds an amplifying audio effect to an audio bus.\n" +"Increases or decreases the volume of the selected audio bus." +msgstr "" + +#: doc/classes/AudioEffectAmplify.xml +msgid "Increases or decreases the volume being routed through the audio bus." +msgstr "" + +#: doc/classes/AudioEffectAmplify.xml +msgid "" +"Amount of amplification in decibels. Positive values make the sound louder, " +"negative values make it quieter. Value can range from -80 to 24." +msgstr "" + +#: doc/classes/AudioEffectBandLimitFilter.xml +msgid "Adds a band limit filter to the audio bus." +msgstr "" + +#: doc/classes/AudioEffectBandLimitFilter.xml +msgid "" +"Limits the frequencies in a range around the [member AudioEffectFilter." +"cutoff_hz] and allows frequencies outside of this range to pass." +msgstr "" + +#: doc/classes/AudioEffectBandPassFilter.xml +msgid "Adds a band pass filter to the audio bus." +msgstr "" + +#: doc/classes/AudioEffectBandPassFilter.xml +msgid "" +"Attenuates the frequencies inside of a range around the [member " +"AudioEffectFilter.cutoff_hz] and cuts frequencies outside of this band." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml +msgid "Captures audio from an audio bus in real-time." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml +msgid "" +"AudioEffectCapture is an AudioEffect which copies all audio frames from the " +"attached audio effect bus into its internal ring buffer.\n" +"Application code should consume these audio frames from this ring buffer " +"using [method get_buffer] and process it as needed, for example to capture " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " +"microphone, the format of the samples will be stereo 32-bit floating point " +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" +msgstr "" + +#: doc/classes/AudioEffectCapture.xml +msgid "" +"Returns [code]true[/code] if at least [code]frames[/code] audio frames are " +"available to read in the internal ring buffer." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml +msgid "Clears the internal ring buffer." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml +msgid "" +"Gets the next [code]frames[/code] audio samples from the internal ring " +"buffer.\n" +"Returns a [PoolVector2Array] containing exactly [code]frames[/code] audio " +"samples if available, or an empty [PoolVector2Array] if insufficient data " +"was available." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml +msgid "Returns the total size of the internal ring buffer in frames." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml +msgid "" +"Returns the number of audio frames discarded from the audio bus due to full " +"buffer." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml +msgid "" +"Returns the number of frames available to read using [method get_buffer]." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml +msgid "Returns the number of audio frames inserted from the audio bus." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml +msgid "" +"Length of the internal ring buffer, in seconds. Setting the buffer length " +"will have no effect if already initialized." +msgstr "" + +#: doc/classes/AudioEffectChorus.xml +msgid "Adds a chorus audio effect." +msgstr "" + +#: doc/classes/AudioEffectChorus.xml +msgid "" +"Adds a chorus audio effect. The effect applies a filter with voices to " +"duplicate the audio source and manipulate it through the filter." +msgstr "" + +#: doc/classes/AudioEffectChorus.xml +msgid "The effect's raw signal." +msgstr "" + +#: doc/classes/AudioEffectChorus.xml +msgid "The voice's cutoff frequency." +msgstr "" + +#: doc/classes/AudioEffectChorus.xml +msgid "The voice's signal delay." +msgstr "" + +#: doc/classes/AudioEffectChorus.xml +msgid "The voice filter's depth." +msgstr "" + +#: doc/classes/AudioEffectChorus.xml +msgid "The voice's volume." +msgstr "" + +#: doc/classes/AudioEffectChorus.xml +msgid "The voice's pan level." +msgstr "" + +#: doc/classes/AudioEffectChorus.xml +msgid "The voice's filter rate." +msgstr "" + +#: doc/classes/AudioEffectChorus.xml +msgid "The amount of voices in the effect." +msgstr "" + +#: doc/classes/AudioEffectChorus.xml +msgid "The effect's processed signal." +msgstr "" + +#: doc/classes/AudioEffectCompressor.xml +msgid "" +"Adds a compressor audio effect to an audio bus.\n" +"Reduces sounds that exceed a certain threshold level, smooths out the " +"dynamics and increases the overall volume." +msgstr "" + +#: doc/classes/AudioEffectCompressor.xml +msgid "" +"Dynamic range compressor reduces the level of the sound when the amplitude " +"goes over a certain threshold in Decibels. One of the main uses of a " +"compressor is to increase the dynamic range by clipping as little as " +"possible (when sound goes over 0dB).\n" +"Compressor has many uses in the mix:\n" +"- In the Master bus to compress the whole output (although an " +"[AudioEffectLimiter] is probably better).\n" +"- In voice channels to ensure they sound as balanced as possible.\n" +"- Sidechained. This can reduce the sound level sidechained with another " +"audio bus for threshold detection. This technique is common in video game " +"mixing to the level of music and SFX while voices are being heard.\n" +"- Accentuates transients by using a wider attack, making effects sound more " +"punchy." +msgstr "" + +#: doc/classes/AudioEffectCompressor.xml +msgid "" +"Compressor's reaction time when the signal exceeds the threshold, in " +"microseconds. Value can range from 20 to 2000." +msgstr "" + +#: doc/classes/AudioEffectCompressor.xml +msgid "Gain applied to the output signal." +msgstr "" + +#: doc/classes/AudioEffectCompressor.xml +msgid "" +"Balance between original signal and effect signal. Value can range from 0 " +"(totally dry) to 1 (totally wet)." +msgstr "" + +#: doc/classes/AudioEffectCompressor.xml +msgid "" +"Amount of compression applied to the audio once it passes the threshold " +"level. The higher the ratio, the more the loud parts of the audio will be " +"compressed. Value can range from 1 to 48." +msgstr "" + +#: doc/classes/AudioEffectCompressor.xml +msgid "" +"Compressor's delay time to stop reducing the signal after the signal level " +"falls below the threshold, in milliseconds. Value can range from 20 to 2000." +msgstr "" + +#: doc/classes/AudioEffectCompressor.xml +msgid "Reduce the sound level using another audio bus for threshold detection." +msgstr "" + +#: doc/classes/AudioEffectCompressor.xml +msgid "" +"The level above which compression is applied to the audio. Value can range " +"from -60 to 0." +msgstr "" + +#: doc/classes/AudioEffectDelay.xml +msgid "" +"Adds a delay audio effect to an audio bus. Plays input signal back after a " +"period of time.\n" +"Two tap delay and feedback options." +msgstr "" + +#: doc/classes/AudioEffectDelay.xml +msgid "" +"Plays input signal back after a period of time. The delayed signal may be " +"played back multiple times to create the sound of a repeating, decaying " +"echo. Delay effects range from a subtle echo effect to a pronounced blending " +"of previous sounds with new sounds." +msgstr "" + +#: doc/classes/AudioEffectDelay.xml +msgid "" +"Output percent of original sound. At 0, only delayed sounds are output. " +"Value can range from 0 to 1." +msgstr "" + +#: doc/classes/AudioEffectDelay.xml +msgid "If [code]true[/code], feedback is enabled." +msgstr "" + +#: doc/classes/AudioEffectDelay.xml +msgid "Feedback delay time in milliseconds." +msgstr "" + +#: doc/classes/AudioEffectDelay.xml +msgid "Sound level for [code]tap1[/code]." +msgstr "" + +#: doc/classes/AudioEffectDelay.xml +msgid "" +"Low-pass filter for feedback, in Hz. Frequencies below this value are " +"filtered out of the source signal." +msgstr "" + +#: doc/classes/AudioEffectDelay.xml +msgid "If [code]true[/code], [code]tap1[/code] will be enabled." +msgstr "" + +#: doc/classes/AudioEffectDelay.xml +msgid "[code]tap1[/code] delay time in milliseconds." +msgstr "" + +#: doc/classes/AudioEffectDelay.xml +msgid "" +"Pan position for [code]tap1[/code]. Value can range from -1 (fully left) to " +"1 (fully right)." +msgstr "" + +#: doc/classes/AudioEffectDelay.xml +msgid "If [code]true[/code], [code]tap2[/code] will be enabled." +msgstr "" + +#: doc/classes/AudioEffectDelay.xml +msgid "[b]Tap2[/b] delay time in milliseconds." +msgstr "" + +#: doc/classes/AudioEffectDelay.xml +msgid "Sound level for [code]tap2[/code]." +msgstr "" + +#: doc/classes/AudioEffectDelay.xml +msgid "" +"Pan position for [code]tap2[/code]. Value can range from -1 (fully left) to " +"1 (fully right)." +msgstr "" + +#: doc/classes/AudioEffectDistortion.xml +msgid "" +"Adds a distortion audio effect to an Audio bus.\n" +"Modify the sound to make it distorted." +msgstr "" + +#: doc/classes/AudioEffectDistortion.xml +msgid "" +"Different types are available: clip, tan, lo-fi (bit crushing), overdrive, " +"or waveshape.\n" +"By distorting the waveform the frequency content change, which will often " +"make the sound \"crunchy\" or \"abrasive\". For games, it can simulate sound " +"coming from some saturated device or speaker very efficiently." +msgstr "" + +#: doc/classes/AudioEffectDistortion.xml +msgid "Distortion power. Value can range from 0 to 1." +msgstr "" + +#: doc/classes/AudioEffectDistortion.xml +msgid "" +"High-pass filter, in Hz. Frequencies higher than this value will not be " +"affected by the distortion. Value can range from 1 to 20000." +msgstr "" + +#: doc/classes/AudioEffectDistortion.xml +msgid "Distortion type." +msgstr "" + +#: doc/classes/AudioEffectDistortion.xml +msgid "" +"Increases or decreases the volume after the effect. Value can range from -80 " +"to 24." +msgstr "" + +#: doc/classes/AudioEffectDistortion.xml +msgid "" +"Increases or decreases the volume before the effect. Value can range from " +"-60 to 60." +msgstr "" + +#: doc/classes/AudioEffectDistortion.xml +msgid "" +"Digital distortion effect which cuts off peaks at the top and bottom of the " +"waveform." +msgstr "" + +#: doc/classes/AudioEffectDistortion.xml +msgid "" +"Low-resolution digital distortion effect. You can use it to emulate the " +"sound of early digital audio devices." +msgstr "" + +#: doc/classes/AudioEffectDistortion.xml +msgid "" +"Emulates the warm distortion produced by a field effect transistor, which is " +"commonly used in solid-state musical instrument amplifiers." +msgstr "" + +#: doc/classes/AudioEffectDistortion.xml +msgid "" +"Waveshaper distortions are used mainly by electronic musicians to achieve an " +"extra-abrasive sound." +msgstr "" + +#: doc/classes/AudioEffectEQ.xml +msgid "" +"Base class for audio equalizers. Gives you control over frequencies.\n" +"Use it to create a custom equalizer if [AudioEffectEQ6], [AudioEffectEQ10] " +"or [AudioEffectEQ21] don't fit your needs." +msgstr "" + +#: doc/classes/AudioEffectEQ.xml +msgid "" +"AudioEffectEQ gives you control over frequencies. Use it to compensate for " +"existing deficiencies in audio. AudioEffectEQs are useful on the Master bus " +"to completely master a mix and give it more character. They are also useful " +"when a game is run on a mobile device, to adjust the mix to that kind of " +"speakers (it can be added but disabled when headphones are plugged)." +msgstr "" + +#: doc/classes/AudioEffectEQ.xml +msgid "Returns the number of bands of the equalizer." +msgstr "" + +#: doc/classes/AudioEffectEQ.xml +msgid "Returns the band's gain at the specified index, in dB." +msgstr "" + +#: doc/classes/AudioEffectEQ.xml +msgid "Sets band's gain at the specified index, in dB." +msgstr "" + +#: doc/classes/AudioEffectEQ10.xml +msgid "" +"Adds a 10-band equalizer audio effect to an Audio bus. Gives you control " +"over frequencies from 31 Hz to 16000 Hz.\n" +"Each frequency can be modulated between -60/+24 dB." +msgstr "" + +#: doc/classes/AudioEffectEQ10.xml +msgid "" +"Frequency bands:\n" +"Band 1: 31 Hz\n" +"Band 2: 62 Hz\n" +"Band 3: 125 Hz\n" +"Band 4: 250 Hz\n" +"Band 5: 500 Hz\n" +"Band 6: 1000 Hz\n" +"Band 7: 2000 Hz\n" +"Band 8: 4000 Hz\n" +"Band 9: 8000 Hz\n" +"Band 10: 16000 Hz\n" +"See also [AudioEffectEQ], [AudioEffectEQ6], [AudioEffectEQ21]." +msgstr "" + +#: doc/classes/AudioEffectEQ21.xml +msgid "" +"Adds a 21-band equalizer audio effect to an Audio bus. Gives you control " +"over frequencies from 22 Hz to 22000 Hz.\n" +"Each frequency can be modulated between -60/+24 dB." +msgstr "" + +#: doc/classes/AudioEffectEQ21.xml +msgid "" +"Frequency bands:\n" +"Band 1: 22 Hz\n" +"Band 2: 32 Hz\n" +"Band 3: 44 Hz\n" +"Band 4: 63 Hz\n" +"Band 5: 90 Hz\n" +"Band 6: 125 Hz\n" +"Band 7: 175 Hz\n" +"Band 8: 250 Hz\n" +"Band 9: 350 Hz\n" +"Band 10: 500 Hz\n" +"Band 11: 700 Hz\n" +"Band 12: 1000 Hz\n" +"Band 13: 1400 Hz\n" +"Band 14: 2000 Hz\n" +"Band 15: 2800 Hz\n" +"Band 16: 4000 Hz\n" +"Band 17: 5600 Hz\n" +"Band 18: 8000 Hz\n" +"Band 19: 11000 Hz\n" +"Band 20: 16000 Hz\n" +"Band 21: 22000 Hz\n" +"See also [AudioEffectEQ], [AudioEffectEQ6], [AudioEffectEQ10]." +msgstr "" + +#: doc/classes/AudioEffectEQ6.xml +msgid "" +"Adds a 6-band equalizer audio effect to an Audio bus. Gives you control over " +"frequencies from 32 Hz to 10000 Hz.\n" +"Each frequency can be modulated between -60/+24 dB." +msgstr "" + +#: doc/classes/AudioEffectEQ6.xml +msgid "" +"Frequency bands:\n" +"Band 1: 32 Hz\n" +"Band 2: 100 Hz\n" +"Band 3: 320 Hz\n" +"Band 4: 1000 Hz\n" +"Band 5: 3200 Hz\n" +"Band 6: 10000 Hz\n" +"See also [AudioEffectEQ], [AudioEffectEQ10], [AudioEffectEQ21]." +msgstr "" + +#: doc/classes/AudioEffectFilter.xml +msgid "Adds a filter to the audio bus." +msgstr "" + +#: doc/classes/AudioEffectFilter.xml +msgid "Allows frequencies other than the [member cutoff_hz] to pass." +msgstr "" + +#: doc/classes/AudioEffectFilter.xml +msgid "Threshold frequency for the filter, in Hz." +msgstr "" + +#: doc/classes/AudioEffectFilter.xml +msgid "Gain amount of the frequencies after the filter." +msgstr "" + +#: doc/classes/AudioEffectFilter.xml +msgid "Amount of boost in the frequency range near the cutoff frequency." +msgstr "" + +#: doc/classes/AudioEffectHighPassFilter.xml +msgid "Adds a high-pass filter to the Audio Bus." +msgstr "" + +#: doc/classes/AudioEffectHighPassFilter.xml +msgid "" +"Cuts frequencies lower than the [member AudioEffectFilter.cutoff_hz] and " +"allows higher frequencies to pass." +msgstr "" + +#: doc/classes/AudioEffectHighShelfFilter.xml +msgid "Reduces all frequencies above the [member AudioEffectFilter.cutoff_hz]." +msgstr "" + +#: doc/classes/AudioEffectLimiter.xml +msgid "Adds a soft-clip limiter audio effect to an Audio bus." +msgstr "" + +#: doc/classes/AudioEffectLimiter.xml +msgid "" +"A limiter is similar to a compressor, but it's less flexible and designed to " +"disallow sound going over a given dB threshold. Adding one in the Master bus " +"is always recommended to reduce the effects of clipping.\n" +"Soft clipping starts to reduce the peaks a little below the threshold level " +"and progressively increases its effect as the input level increases such " +"that the threshold is never exceeded." +msgstr "" + +#: doc/classes/AudioEffectLimiter.xml +msgid "" +"The waveform's maximum allowed value, in decibels. Value can range from -20 " +"to -0.1." +msgstr "" + +#: doc/classes/AudioEffectLimiter.xml +msgid "" +"Applies a gain to the limited waves, in decibels. Value can range from 0 to " +"6." +msgstr "" + +#: doc/classes/AudioEffectLimiter.xml +msgid "" +"Threshold from which the limiter begins to be active, in decibels. Value can " +"range from -30 to 0." +msgstr "" + +#: doc/classes/AudioEffectLowPassFilter.xml +msgid "Adds a low-pass filter to the Audio bus." +msgstr "" + +#: doc/classes/AudioEffectLowPassFilter.xml +msgid "" +"Cuts frequencies higher than the [member AudioEffectFilter.cutoff_hz] and " +"allows lower frequencies to pass." +msgstr "" + +#: doc/classes/AudioEffectLowShelfFilter.xml +msgid "Reduces all frequencies below the [member AudioEffectFilter.cutoff_hz]." +msgstr "" + +#: doc/classes/AudioEffectNotchFilter.xml +msgid "Adds a notch filter to the Audio bus." +msgstr "" + +#: doc/classes/AudioEffectNotchFilter.xml +msgid "" +"Attenuates frequencies in a narrow band around the [member AudioEffectFilter." +"cutoff_hz] and cuts frequencies outside of this range." +msgstr "" + +#: doc/classes/AudioEffectPanner.xml +msgid "Adds a panner audio effect to an Audio bus. Pans sound left or right." +msgstr "" + +#: doc/classes/AudioEffectPanner.xml +msgid "" +"Determines how much of an audio signal is sent to the left and right buses." +msgstr "" + +#: doc/classes/AudioEffectPanner.xml +msgid "Pan position. Value can range from -1 (fully left) to 1 (fully right)." +msgstr "" + +#: doc/classes/AudioEffectPhaser.xml +msgid "" +"Adds a phaser audio effect to an Audio bus.\n" +"Combines the original signal with a copy that is slightly out of phase with " +"the original." +msgstr "" + +#: doc/classes/AudioEffectPhaser.xml +msgid "" +"Combines phase-shifted signals with the original signal. The movement of the " +"phase-shifted signals is controlled using a low-frequency oscillator." +msgstr "" + +#: doc/classes/AudioEffectPhaser.xml +msgid "" +"Governs how high the filter frequencies sweep. Low value will primarily " +"affect bass frequencies. High value can sweep high into the treble. Value " +"can range from 0.1 to 4." +msgstr "" + +#: doc/classes/AudioEffectPhaser.xml +msgid "Output percent of modified sound. Value can range from 0.1 to 0.9." +msgstr "" + +#: doc/classes/AudioEffectPhaser.xml +msgid "" +"Determines the maximum frequency affected by the LFO modulations, in Hz. " +"Value can range from 10 to 10000." +msgstr "" + +#: doc/classes/AudioEffectPhaser.xml +msgid "" +"Determines the minimum frequency affected by the LFO modulations, in Hz. " +"Value can range from 10 to 10000." +msgstr "" + +#: doc/classes/AudioEffectPhaser.xml +msgid "" +"Adjusts the rate in Hz at which the effect sweeps up and down across the " +"frequency range." +msgstr "" + +#: doc/classes/AudioEffectPitchShift.xml +msgid "" +"Adds a pitch-shifting audio effect to an Audio bus.\n" +"Raises or lowers the pitch of original sound." +msgstr "" + +#: doc/classes/AudioEffectPitchShift.xml +msgid "" +"Allows modulation of pitch independently of tempo. All frequencies can be " +"increased/decreased with minimal effect on transients." +msgstr "" + +#: doc/classes/AudioEffectPitchShift.xml +msgid "" +"The size of the [url=https://en.wikipedia.org/wiki/" +"Fast_Fourier_transform]Fast Fourier transform[/url] buffer. Higher values " +"smooth out the effect over time, but have greater latency. The effects of " +"this higher latency are especially noticeable on sounds that have sudden " +"amplitude changes." +msgstr "" + +#: doc/classes/AudioEffectPitchShift.xml +msgid "" +"The oversampling factor to use. Higher values result in better quality, but " +"are more demanding on the CPU and may cause audio cracking if the CPU can't " +"keep up." +msgstr "" + +#: doc/classes/AudioEffectPitchShift.xml +msgid "" +"The pitch scale to use. [code]1.0[/code] is the default pitch and plays " +"sounds unaltered. [member pitch_scale] can range from [code]0.0[/code] " +"(infinitely low pitch, inaudible) to [code]16[/code] (16 times higher than " +"the initial pitch)." +msgstr "" + +#: doc/classes/AudioEffectPitchShift.xml +#: doc/classes/AudioEffectSpectrumAnalyzer.xml +msgid "" +"Use a buffer of 256 samples for the Fast Fourier transform. Lowest latency, " +"but least stable over time." +msgstr "" + +#: doc/classes/AudioEffectPitchShift.xml +#: doc/classes/AudioEffectSpectrumAnalyzer.xml +msgid "" +"Use a buffer of 512 samples for the Fast Fourier transform. Low latency, but " +"less stable over time." +msgstr "" + +#: doc/classes/AudioEffectPitchShift.xml +#: doc/classes/AudioEffectSpectrumAnalyzer.xml +msgid "" +"Use a buffer of 1024 samples for the Fast Fourier transform. This is a " +"compromise between latency and stability over time." +msgstr "" + +#: doc/classes/AudioEffectPitchShift.xml +#: doc/classes/AudioEffectSpectrumAnalyzer.xml +msgid "" +"Use a buffer of 2048 samples for the Fast Fourier transform. High latency, " +"but stable over time." +msgstr "" + +#: doc/classes/AudioEffectPitchShift.xml +#: doc/classes/AudioEffectSpectrumAnalyzer.xml +msgid "" +"Use a buffer of 4096 samples for the Fast Fourier transform. Highest " +"latency, but most stable over time." +msgstr "" + +#: doc/classes/AudioEffectPitchShift.xml +#: doc/classes/AudioEffectSpectrumAnalyzer.xml +msgid "Represents the size of the [enum FFT_Size] enum." +msgstr "" + +#: doc/classes/AudioEffectRecord.xml +msgid "Audio effect used for recording the sound from an audio bus." +msgstr "" + +#: doc/classes/AudioEffectRecord.xml +msgid "" +"Allows the user to record the sound from an audio bus. This can include all " +"audio output by Godot when used on the \"Master\" audio bus.\n" +"Can be used (with an [AudioStreamMicrophone]) to record from a microphone.\n" +"It sets and gets the format in which the audio file will be recorded (8-bit, " +"16-bit, or compressed). It checks whether or not the recording is active, " +"and if it is, records the sound. It then returns the recorded sample." +msgstr "" + +#: doc/classes/AudioEffectRecord.xml +msgid "Recording with microphone" +msgstr "" + +#: doc/classes/AudioEffectRecord.xml +msgid "Returns the recorded sample." +msgstr "" + +#: doc/classes/AudioEffectRecord.xml +msgid "Returns whether the recording is active or not." +msgstr "" + +#: doc/classes/AudioEffectRecord.xml +msgid "" +"If [code]true[/code], the sound will be recorded. Note that restarting the " +"recording will remove the previously recorded sample." +msgstr "" + +#: doc/classes/AudioEffectRecord.xml +msgid "" +"Specifies the format in which the sample will be recorded. See [enum " +"AudioStreamSample.Format] for available formats." +msgstr "" + +#: doc/classes/AudioEffectReverb.xml +msgid "" +"Adds a reverberation audio effect to an Audio bus.\n" +"Simulates the sound of acoustic environments such as rooms, concert halls, " +"caverns, or an open spaces." +msgstr "" + +#: doc/classes/AudioEffectReverb.xml +msgid "" +"Simulates rooms of different sizes. Its parameters can be adjusted to " +"simulate the sound of a specific room." +msgstr "" + +#: doc/classes/AudioEffectReverb.xml +msgid "" +"Defines how reflective the imaginary room's walls are. Value can range from " +"0 to 1." +msgstr "" + +#: doc/classes/AudioEffectReverb.xml +msgid "" +"Output percent of original sound. At 0, only modified sound is outputted. " +"Value can range from 0 to 1." +msgstr "" + +#: doc/classes/AudioEffectReverb.xml +msgid "" +"High-pass filter passes signals with a frequency higher than a certain " +"cutoff frequency and attenuates signals with frequencies lower than the " +"cutoff frequency. Value can range from 0 to 1." +msgstr "" + +#: doc/classes/AudioEffectReverb.xml +msgid "Output percent of predelay. Value can range from 0 to 1." +msgstr "" + +#: doc/classes/AudioEffectReverb.xml +msgid "" +"Time between the original signal and the early reflections of the reverb " +"signal, in milliseconds." +msgstr "" + +#: doc/classes/AudioEffectReverb.xml +msgid "" +"Dimensions of simulated room. Bigger means more echoes. Value can range from " +"0 to 1." +msgstr "" + +#: doc/classes/AudioEffectReverb.xml +msgid "" +"Widens or narrows the stereo image of the reverb tail. 1 means fully widens. " +"Value can range from 0 to 1." +msgstr "" + +#: doc/classes/AudioEffectReverb.xml +msgid "" +"Output percent of modified sound. At 0, only original sound is outputted. " +"Value can range from 0 to 1." +msgstr "" + +#: doc/classes/AudioEffectSpectrumAnalyzer.xml +msgid "Audio effect that can be used for real-time audio visualizations." +msgstr "" + +#: doc/classes/AudioEffectSpectrumAnalyzer.xml +msgid "" +"This audio effect does not affect sound output, but can be used for real-" +"time audio visualizations.\n" +"See also [AudioStreamGenerator] for procedurally generating sounds." +msgstr "" + +#: doc/classes/AudioEffectSpectrumAnalyzer.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamPlayer.xml +#: doc/classes/CanvasItem.xml +msgid "Audio Spectrum Demo" +msgstr "" + +#: doc/classes/AudioEffectSpectrumAnalyzer.xml +#: doc/classes/AudioStreamGenerator.xml +#: doc/classes/AudioStreamGeneratorPlayback.xml +msgid "Godot 3.2 will get new audio features" +msgstr "" + +#: doc/classes/AudioEffectSpectrumAnalyzer.xml +msgid "" +"The length of the buffer to keep (in seconds). Higher values keep data " +"around for longer, but require more memory." +msgstr "" + +#: doc/classes/AudioEffectSpectrumAnalyzer.xml +msgid "" +"The size of the [url=https://en.wikipedia.org/wiki/" +"Fast_Fourier_transform]Fast Fourier transform[/url] buffer. Higher values " +"smooth out the spectrum analysis over time, but have greater latency. The " +"effects of this higher latency are especially noticeable with sudden " +"amplitude changes." +msgstr "" + +#: doc/classes/AudioEffectSpectrumAnalyzerInstance.xml +msgid "Use the average value as magnitude." +msgstr "" + +#: doc/classes/AudioEffectSpectrumAnalyzerInstance.xml +msgid "Use the maximum value as magnitude." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "Server interface for low-level audio access." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "" +"[AudioServer] is a low-level server interface for audio access. It is in " +"charge of creating sample data (playable audio) as well as its playback via " +"a voice interface." +msgstr "" + +#: doc/classes/AudioServer.xml doc/classes/AudioStreamPlayer.xml +msgid "Audio Device Changer Demo" +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "Adds a bus at [code]at_position[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "" +"Adds an [AudioEffect] effect to the bus [code]bus_idx[/code] at " +"[code]at_position[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "Generates an [AudioBusLayout] using the available buses and effects." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "" +"Returns the amount of channels of the bus at index [code]bus_idx[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "" +"Returns the [AudioEffect] at position [code]effect_idx[/code] in bus " +"[code]bus_idx[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "Returns the number of effects on the bus at [code]bus_idx[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "" +"Returns the [AudioEffectInstance] assigned to the given bus and effect " +"indices (and optionally channel)." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "Returns the index of the bus with the name [code]bus_name[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "Returns the name of the bus with the index [code]bus_idx[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "" +"Returns the peak volume of the left speaker at bus index [code]bus_idx[/" +"code] and channel index [code]channel[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "" +"Returns the peak volume of the right speaker at bus index [code]bus_idx[/" +"code] and channel index [code]channel[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "" +"Returns the name of the bus that the bus at index [code]bus_idx[/code] sends " +"to." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "Returns the volume of the bus at index [code]bus_idx[/code] in dB." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "Returns the names of all audio devices detected on the system." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "Returns the sample rate at the output of the [AudioServer]." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "Returns the audio driver's output latency." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "Returns the speaker configuration." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "Returns the relative time since the last mix occurred." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "Returns the relative time until the next mix occurs." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "" +"If [code]true[/code], the bus at index [code]bus_idx[/code] is bypassing " +"effects." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "" +"If [code]true[/code], the effect at index [code]effect_idx[/code] on the bus " +"at index [code]bus_idx[/code] is enabled." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "If [code]true[/code], the bus at index [code]bus_idx[/code] is muted." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "" +"If [code]true[/code], the bus at index [code]bus_idx[/code] is in solo mode." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "" +"Locks the audio driver's main loop.\n" +"[b]Note:[/b] Remember to unlock it afterwards." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "" +"Moves the bus from index [code]index[/code] to index [code]to_index[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "Removes the bus at index [code]index[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "" +"Removes the effect at index [code]effect_idx[/code] from the bus at index " +"[code]bus_idx[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "Overwrites the currently used [AudioBusLayout]." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "" +"Sets the name of the bus at index [code]bus_idx[/code] to [code]name[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "" +"Connects the output of the bus at [code]bus_idx[/code] to the bus named " +"[code]send[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "" +"Sets the volume of the bus at index [code]bus_idx[/code] to [code]volume_db[/" +"code]." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "Swaps the position of two effects in bus [code]bus_idx[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "" +"Unlocks the audio driver's main loop. (After locking it, you should always " +"unlock it.)" +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "Number of available audio buses." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "" +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "" +"Name of the current device for audio output (see [method get_device_list]). " +"On systems with multiple audio outputs (such as analog, USB and HDMI audio), " +"this can be used to select the audio output device. The value " +"[code]\"Default\"[/code] will play audio on the system-wide default audio " +"output. If an invalid device name is set, the value will be reverted back to " +"[code]\"Default\"[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "" +"Scales the rate at which audio is played (i.e. setting it to [code]0.5[/" +"code] will make the audio be played twice as fast)." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "Emitted when the [AudioBusLayout] changes." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "Two or fewer speakers were detected." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "A 3.1 channel surround setup was detected." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "A 5.1 channel surround setup was detected." +msgstr "" + +#: doc/classes/AudioServer.xml +msgid "A 7.1 channel surround setup was detected." +msgstr "" + +#: doc/classes/AudioStream.xml +msgid "Base class for audio streams." +msgstr "" + +#: doc/classes/AudioStream.xml +msgid "" +"Base class for audio streams. Audio streams are used for sound effects and " +"music playback, and support WAV (via [AudioStreamSample]) and OGG (via " +"[AudioStreamOGGVorbis]) file formats." +msgstr "" + +#: doc/classes/AudioStream.xml doc/classes/AudioStreamPlayer.xml +msgid "Audio streams" +msgstr "" + +#: doc/classes/AudioStream.xml doc/classes/AudioStreamGenerator.xml +#: doc/classes/AudioStreamGeneratorPlayback.xml +#: doc/classes/AudioStreamPlayback.xml doc/classes/AudioStreamPlayer.xml +msgid "Audio Generator Demo" +msgstr "" + +#: doc/classes/AudioStream.xml +msgid "Returns the length of the audio stream in seconds." +msgstr "" + +#: doc/classes/AudioStreamGenerator.xml +msgid "Audio stream that generates sounds procedurally." +msgstr "" + +#: doc/classes/AudioStreamGenerator.xml +msgid "" +"This audio stream does not play back sounds, but expects a script to " +"generate audio data for it instead. See also " +"[AudioStreamGeneratorPlayback].\n" +"See also [AudioEffectSpectrumAnalyzer] for performing real-time audio " +"spectrum analysis.\n" +"[b]Note:[/b] Due to performance constraints, this class is best used from C# " +"or from a compiled language via GDNative. If you still want to use this " +"class from GDScript, consider using a lower [member mix_rate] such as 11,025 " +"Hz or 22,050 Hz." +msgstr "" + +#: doc/classes/AudioStreamGenerator.xml +msgid "" +"The length of the buffer to generate (in seconds). Lower values result in " +"less latency, but require the script to generate audio data faster, " +"resulting in increased CPU usage and more risk for audio cracking if the CPU " +"can't keep up." +msgstr "" + +#: doc/classes/AudioStreamGenerator.xml +msgid "" +"The sample rate to use (in Hz). Higher values are more demanding for the CPU " +"to generate, but result in better quality.\n" +"In games, common sample rates in use are [code]11025[/code], [code]16000[/" +"code], [code]22050[/code], [code]32000[/code], [code]44100[/code], and " +"[code]48000[/code].\n" +"According to the [url=https://en.wikipedia.org/wiki/" +"Nyquist%E2%80%93Shannon_sampling_theorem]Nyquist-Shannon sampling theorem[/" +"url], there is no quality difference to human hearing when going past 40,000 " +"Hz (since most humans can only hear up to ~20,000 Hz, often less). If you " +"are generating lower-pitched sounds such as voices, lower sample rates such " +"as [code]32000[/code] or [code]22050[/code] may be usable with no loss in " +"quality." +msgstr "" + +#: doc/classes/AudioStreamGeneratorPlayback.xml +msgid "Plays back audio generated using [AudioStreamGenerator]." +msgstr "" + +#: doc/classes/AudioStreamGeneratorPlayback.xml +msgid "" +"This class is meant to be used with [AudioStreamGenerator] to play back the " +"generated audio in real-time." +msgstr "" + +#: doc/classes/AudioStreamGeneratorPlayback.xml +msgid "" +"Returns [code]true[/code] if a buffer of the size [code]amount[/code] can be " +"pushed to the audio sample data buffer without overflowing it, [code]false[/" +"code] otherwise." +msgstr "" + +#: doc/classes/AudioStreamGeneratorPlayback.xml +msgid "Clears the audio sample data buffer." +msgstr "" + +#: doc/classes/AudioStreamGeneratorPlayback.xml +msgid "" +"Returns the number of audio data frames left to play. If this returned " +"number reaches [code]0[/code], the audio will stop playing until frames are " +"added again. Therefore, make sure your script can always generate and push " +"new audio frames fast enough to avoid audio cracking." +msgstr "" + +#: doc/classes/AudioStreamGeneratorPlayback.xml +msgid "" +"Pushes several audio data frames to the buffer. This is usually more " +"efficient than [method push_frame] in C# and compiled languages via " +"GDNative, but [method push_buffer] may be [i]less[/i] efficient in GDScript." +msgstr "" + +#: doc/classes/AudioStreamGeneratorPlayback.xml +msgid "" +"Pushes a single audio data frame to the buffer. This is usually less " +"efficient than [method push_buffer] in C# and compiled languages via " +"GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: modules/minimp3/doc_classes/AudioStreamMP3.xml +msgid "MP3 audio stream driver." +msgstr "" + +#: modules/minimp3/doc_classes/AudioStreamMP3.xml +#: modules/stb_vorbis/doc_classes/AudioStreamOGGVorbis.xml +msgid "Contains the audio data in bytes." +msgstr "" + +#: modules/minimp3/doc_classes/AudioStreamMP3.xml +#: modules/stb_vorbis/doc_classes/AudioStreamOGGVorbis.xml +msgid "" +"If [code]true[/code], the stream will automatically loop when it reaches the " +"end." +msgstr "" + +#: modules/minimp3/doc_classes/AudioStreamMP3.xml +#: modules/stb_vorbis/doc_classes/AudioStreamOGGVorbis.xml +msgid "Time in seconds at which the stream starts after being looped." +msgstr "" + +#: modules/stb_vorbis/doc_classes/AudioStreamOGGVorbis.xml +msgid "OGG Vorbis audio stream driver." +msgstr "" + +#: doc/classes/AudioStreamPlayback.xml +msgid "Meta class for playing back audio." +msgstr "" + +#: doc/classes/AudioStreamPlayback.xml +msgid "" +"Can play, loop, pause a scroll through audio. See [AudioStream] and " +"[AudioStreamOGGVorbis] for usage." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml +msgid "Plays back audio non-positionally." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml +msgid "" +"Plays an audio stream non-positionally.\n" +"To play audio positionally, use [AudioStreamPlayer2D] or " +"[AudioStreamPlayer3D] instead of [AudioStreamPlayer]." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml +msgid "Returns the position in the [AudioStream] in seconds." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml +msgid "" +"Returns the [AudioStreamPlayback] object associated with this " +"[AudioStreamPlayer]." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml +msgid "Plays the audio from the given [code]from_position[/code], in seconds." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml +#: doc/classes/AudioStreamPlayer3D.xml +msgid "Sets the position from which audio will be played, in seconds." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml +#: doc/classes/AudioStreamPlayer3D.xml +msgid "Stops the audio." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml +msgid "If [code]true[/code], audio plays when added to scene tree." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml +msgid "" +"Bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml +msgid "" +"If the audio configuration has more than two speakers, this sets the target " +"channels. See [enum MixTarget] constants." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml +#: doc/classes/AudioStreamPlayer3D.xml +msgid "" +"The pitch and the tempo of the audio, as a multiplier of the audio sample's " +"sample rate." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml +#: doc/classes/AudioStreamPlayer3D.xml +msgid "If [code]true[/code], audio is playing." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml +msgid "The [AudioStream] object to be played." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml +msgid "" +"If [code]true[/code], the playback is paused. You can resume it by setting " +"[code]stream_paused[/code] to [code]false[/code]." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml +msgid "Volume of sound, in dB." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml +#: doc/classes/AudioStreamPlayer3D.xml +msgid "Emitted when the audio stops playing." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml +msgid "The audio will be played only on the first channel." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml +msgid "The audio will be played on all surround channels." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml +msgid "" +"The audio will be played on the second channel, which is usually the center." +msgstr "" + +#: doc/classes/AudioStreamPlayer2D.xml +msgid "Plays positional sound in 2D space." +msgstr "" + +#: doc/classes/AudioStreamPlayer2D.xml +msgid "" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" +"See also [AudioStreamPlayer] to play a sound non-positionally.\n" +"[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " +"output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " +"[member volume_db] to a very low value like [code]-100[/code] (which isn't " +"audible to human hearing)." +msgstr "" + +#: doc/classes/AudioStreamPlayer2D.xml doc/classes/AudioStreamPlayer3D.xml +msgid "Returns the position in the [AudioStream]." +msgstr "" + +#: doc/classes/AudioStreamPlayer2D.xml +msgid "" +"Returns the [AudioStreamPlayback] object associated with this " +"[AudioStreamPlayer2D]." +msgstr "" + +#: doc/classes/AudioStreamPlayer2D.xml doc/classes/AudioStreamPlayer3D.xml +msgid "" +"Plays the audio from the given position [code]from_position[/code], in " +"seconds." +msgstr "" + +#: doc/classes/AudioStreamPlayer2D.xml +msgid "" +"Determines which [Area2D] layers affect the sound for reverb and audio bus " +"effects. Areas can be used to redirect [AudioStream]s so that they play in a " +"certain audio bus. An example of how you might use this is making a " +"\"water\" area so that sounds played in the water are redirected through an " +"audio bus to make them sound like they are being played underwater." +msgstr "" + +#: doc/classes/AudioStreamPlayer2D.xml +msgid "Dampens audio over distance with this as an exponent." +msgstr "" + +#: doc/classes/AudioStreamPlayer2D.xml +msgid "Maximum distance from which audio is still hearable." +msgstr "" + +#: doc/classes/AudioStreamPlayer2D.xml +msgid "Base volume without dampening." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml +msgid "Plays positional sound in 3D space." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml +msgid "" +"Plays a sound effect with directed sound effects, dampens with distance if " +"needed, generates effect of hearable position in space. For greater realism, " +"a low-pass filter is automatically applied to distant sounds. This can be " +"disabled by setting [member attenuation_filter_cutoff_hz] to [code]20500[/" +"code].\n" +"By default, audio is heard from the camera position. This can be changed by " +"adding a [Listener] node to the scene and enabling it by calling [method " +"Listener.make_current] on it.\n" +"See also [AudioStreamPlayer] to play a sound non-positionally.\n" +"[b]Note:[/b] Hiding an [AudioStreamPlayer3D] node does not disable its audio " +"output. To temporarily disable an [AudioStreamPlayer3D]'s audio output, set " +"[member unit_db] to a very low value like [code]-100[/code] (which isn't " +"audible to human hearing)." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml +msgid "" +"Returns the [AudioStreamPlayback] object associated with this " +"[AudioStreamPlayer3D]." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml +msgid "" +"Determines which [Area] layers affect the sound for reverb and audio bus " +"effects. Areas can be used to redirect [AudioStream]s so that they play in a " +"certain audio bus. An example of how you might use this is making a " +"\"water\" area so that sounds played in the water are redirected through an " +"audio bus to make them sound like they are being played underwater." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml +msgid "" +"Dampens audio using a low-pass filter above this frequency, in Hz. To " +"disable the dampening effect entirely, set this to [code]20500[/code] as " +"this frequency is above the human hearing limit." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml +msgid "Amount how much the filter affects the loudness, in decibels." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml +msgid "" +"Decides if audio should get quieter with distance linearly, quadratically, " +"logarithmically, or not be affected by distance, effectively disabling " +"attenuation." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml +msgid "" +"If [code]true[/code], audio plays when the AudioStreamPlayer3D node is added " +"to scene tree." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml +msgid "" +"The bus on which this audio is playing.\n" +"[b]Note:[/b] When setting this property, keep in mind that no validation is " +"performed to see if the given name matches an existing bus. This is because " +"audio bus layouts might be loaded after this property is set. If this given " +"name can't be resolved at runtime, it will fall back to [code]\"Master\"[/" +"code]." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml +msgid "" +"Decides in which step the [url=https://en.wikipedia.org/wiki/" +"Doppler_effect]Doppler effect[/url] should be calculated.\n" +"[b]Note:[/b] Only effective if the current [Camera]'s [member Camera." +"doppler_tracking] property is set to a value other than [constant Camera." +"DOPPLER_TRACKING_DISABLED]." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml +msgid "The angle in which the audio reaches cameras undampened." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml +msgid "" +"If [code]true[/code], the audio should be dampened according to the " +"direction of the sound." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml +msgid "" +"Dampens audio if camera is outside of [member emission_angle_degrees] and " +"[member emission_angle_enabled] is set by this factor, in decibels." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml +msgid "Sets the absolute maximum of the soundlevel, in decibels." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml +msgid "" +"Sets the distance from which the [member out_of_range_mode] takes effect. " +"Has no effect if set to 0." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml +msgid "" +"Decides if audio should pause when source is outside of [member " +"max_distance] range." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml +msgid "The [AudioStream] resource to be played." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml +msgid "" +"If [code]true[/code], the playback is paused. You can resume it by setting " +"[member stream_paused] to [code]false[/code]." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml +msgid "The base sound level unaffected by dampening, in decibels." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml +msgid "" +"The factor for the attenuation effect. Higher values make the sound audible " +"over a larger distance." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml +msgid "Linear dampening of loudness according to distance." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml +msgid "Squared dampening of loudness according to distance." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml +msgid "Logarithmic dampening of loudness according to distance." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml +msgid "" +"No dampening of loudness according to distance. The sound will still be " +"heard positionally, unlike an [AudioStreamPlayer]. [constant " +"ATTENUATION_DISABLED] can be combined with a [member max_distance] value " +"greater than [code]0.0[/code] to achieve linear attenuation clamped to a " +"sphere of a defined size." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml +msgid "" +"Mix this audio in, even when it's out of range. This increases CPU usage, " +"but keeps the sound playing at the correct position if the camera leaves and " +"enters the [AudioStreamPlayer3D]'s [member max_distance] radius." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml +msgid "" +"Pause this audio when it gets out of range. This decreases CPU usage, but " +"will cause the sound to restart if the camera leaves and enters the " +"[AudioStreamPlayer3D]'s [member max_distance] radius." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml +msgid "Disables doppler tracking." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml +msgid "Executes doppler tracking in idle step (every rendered frame)." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml +msgid "" +"Executes doppler tracking in physics step (every simulated physics frame)." +msgstr "" + +#: doc/classes/AudioStreamRandomPitch.xml +msgid "Plays audio with random pitch shifting." +msgstr "" + +#: doc/classes/AudioStreamRandomPitch.xml +msgid "Randomly varies pitch on each start." +msgstr "" + +#: doc/classes/AudioStreamRandomPitch.xml +msgid "The current [AudioStream]." +msgstr "" + +#: doc/classes/AudioStreamRandomPitch.xml +msgid "The intensity of random pitch variation." +msgstr "" + +#: doc/classes/AudioStreamSample.xml +msgid "Stores audio data loaded from WAV files." +msgstr "" + +#: doc/classes/AudioStreamSample.xml +msgid "" +"AudioStreamSample stores sound samples loaded from WAV files. To play the " +"stored sound, use an [AudioStreamPlayer] (for non-positional audio) or " +"[AudioStreamPlayer2D]/[AudioStreamPlayer3D] (for positional audio). The " +"sound can be looped.\n" +"This class can also be used to store dynamically-generated PCM audio data. " +"See also [AudioStreamGenerator] for procedural audio generation." +msgstr "" + +#: doc/classes/AudioStreamSample.xml +msgid "" +"Saves the AudioStreamSample as a WAV file to [code]path[/code]. Samples with " +"IMA ADPCM format can't be saved.\n" +"[b]Note:[/b] A [code].wav[/code] extension is automatically appended to " +"[code]path[/code] if it is missing." +msgstr "" + +#: doc/classes/AudioStreamSample.xml +msgid "" +"Contains the audio data in bytes.\n" +"[b]Note:[/b] This property expects signed PCM8 data. To convert unsigned " +"PCM8 to signed PCM8, subtract 128 from each byte." +msgstr "" + +#: doc/classes/AudioStreamSample.xml +msgid "Audio format. See [enum Format] constants for values." +msgstr "" + +#: doc/classes/AudioStreamSample.xml +msgid "" +"The loop start point (in number of samples, relative to the beginning of the " +"sample). This information will be imported automatically from the WAV file " +"if present." +msgstr "" + +#: doc/classes/AudioStreamSample.xml +msgid "" +"The loop end point (in number of samples, relative to the beginning of the " +"sample). This information will be imported automatically from the WAV file " +"if present." +msgstr "" + +#: doc/classes/AudioStreamSample.xml +msgid "" +"The loop mode. This information will be imported automatically from the WAV " +"file if present. See [enum LoopMode] constants for values." +msgstr "" + +#: doc/classes/AudioStreamSample.xml +msgid "" +"The sample rate for mixing this audio. Higher values require more storage " +"space, but result in better quality.\n" +"In games, common sample rates in use are [code]11025[/code], [code]16000[/" +"code], [code]22050[/code], [code]32000[/code], [code]44100[/code], and " +"[code]48000[/code].\n" +"According to the [url=https://en.wikipedia.org/wiki/" +"Nyquist%E2%80%93Shannon_sampling_theorem]Nyquist-Shannon sampling theorem[/" +"url], there is no quality difference to human hearing when going past 40,000 " +"Hz (since most humans can only hear up to ~20,000 Hz, often less). If you " +"are using lower-pitched sounds such as voices, lower sample rates such as " +"[code]32000[/code] or [code]22050[/code] may be usable with no loss in " +"quality." +msgstr "" + +#: doc/classes/AudioStreamSample.xml +msgid "If [code]true[/code], audio is stereo." +msgstr "" + +#: doc/classes/AudioStreamSample.xml +msgid "8-bit audio codec." +msgstr "" + +#: doc/classes/AudioStreamSample.xml +msgid "16-bit audio codec." +msgstr "" + +#: doc/classes/AudioStreamSample.xml +msgid "Audio is compressed using IMA ADPCM." +msgstr "" + +#: doc/classes/AudioStreamSample.xml +msgid "Audio does not loop." +msgstr "" + +#: doc/classes/AudioStreamSample.xml +msgid "" +"Audio loops the data between [member loop_begin] and [member loop_end], " +"playing forward only." +msgstr "" + +#: doc/classes/AudioStreamSample.xml +msgid "" +"Audio loops the data between [member loop_begin] and [member loop_end], " +"playing back and forth." +msgstr "" + +#: doc/classes/AudioStreamSample.xml +msgid "" +"Audio loops the data between [member loop_begin] and [member loop_end], " +"playing backward only." +msgstr "" + +#: doc/classes/BackBufferCopy.xml +msgid "" +"Copies a region of the screen (or the whole screen) to a buffer so it can be " +"accessed in your shader scripts through the " +"[code]texture(SCREEN_TEXTURE, ...)[/code] function." +msgstr "" + +#: doc/classes/BackBufferCopy.xml +msgid "" +"Node for back-buffering the currently-displayed screen. The region defined " +"in the BackBufferCopy node is buffered with the content of the screen it " +"covers, or the entire screen according to the copy mode set. Use the " +"[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " +"access the buffer.\n" +"[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " +"anchors and margins won't apply to child [Control]-derived nodes. This can " +"be problematic when resizing the window. To avoid this, add [Control]-" +"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"adding them as children." +msgstr "" + +#: doc/classes/BackBufferCopy.xml +msgid "Buffer mode. See [enum CopyMode] constants." +msgstr "" + +#: doc/classes/BackBufferCopy.xml +msgid "" +"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"[constant COPY_MODE_RECT]." +msgstr "" + +#: doc/classes/BackBufferCopy.xml +msgid "" +"Disables the buffering mode. This means the BackBufferCopy node will " +"directly use the portion of screen it covers." +msgstr "" + +#: doc/classes/BackBufferCopy.xml +msgid "BackBufferCopy buffers a rectangular region." +msgstr "" + +#: doc/classes/BackBufferCopy.xml +msgid "BackBufferCopy buffers the entire screen." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "Prerendered indirect light map for a scene." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "" +"Baked lightmaps are an alternative workflow for adding indirect (or baked) " +"lighting to a scene. Unlike the [GIProbe] approach, baked lightmaps work " +"fine on low-end PCs and mobile devices as they consume almost no resources " +"in run-time.\n" +"[b]Procedural generation:[/b] Lightmap baking functionality is only " +"available in the editor. This means [BakedLightmap] is not suited to " +"procedurally generated or user-built levels. For procedurally generated or " +"user-built levels, use [GIProbe] instead.\n" +"[b]Note:[/b] Due to how lightmaps work, most properties only have a visible " +"effect once lightmaps are baked again." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "" +"Bakes the lightmap, scanning from the given [code]from_node[/code] root and " +"saves the resulting [BakedLightmapData] in [code]data_save_path[/code]. If " +"no root node is provided, parent of this node will be used as root instead. " +"If no save path is provided it will try to match the path from the current " +"[member light_data]." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "" +"If [code]true[/code], the lightmapper will merge the textures for all meshes " +"into one or several large layered textures. If [code]false[/code], every " +"mesh will get its own lightmap texture, which is less efficient.\n" +"[b]Note:[/b] Atlas lightmap rendering is only supported in GLES3, [i]not[/i] " +"GLES2. Non-atlas lightmap rendering is supported by both GLES3 and GLES2. If " +"[member ProjectSettings.rendering/quality/driver/fallback_to_gles2] is " +"[code]true[/code], consider baking lightmaps with [member atlas_generate] " +"set to [code]false[/code] so that the resulting lightmap is visible in both " +"GLES3 and GLES2." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "" +"Maximum size of each lightmap layer, only used when [member atlas_generate] " +"is enabled." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "" +"Raycasting bias used during baking to avoid floating point precision issues." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "" +"The energy multiplier for each bounce. Higher values will make indirect " +"lighting brighter. A value of [code]1.0[/code] represents physically " +"accurate behavior, but higher values can be used to make indirect lighting " +"propagate more visibly when using a low number of bounces. This can be used " +"to speed up bake times by lowering the number of [member bounces] then " +"increasing [member bounce_indirect_energy]. Unlike [member BakedLightmapData." +"energy], this property does not affect direct lighting emitted by light " +"nodes, emissive materials and the environment.\n" +"[b]Note:[/b] [member bounce_indirect_energy] only has an effect if [member " +"bounces] is set to a value greater than or equal to [code]1[/code]." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "" +"Number of light bounces that are taken into account during baking. See also " +"[member bounce_indirect_energy]." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "Grid size used for real-time capture information on dynamic objects." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "" +"When enabled, an octree containing the scene's lighting information will be " +"computed. This octree will then be used to light dynamic objects in the " +"scene." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "" +"Bias value to reduce the amount of light propagation in the captured octree." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "Bake quality of the capture data." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "" +"If a baked mesh doesn't have a UV2 size hint, this value will be used to " +"roughly compute a suitable lightmap size." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "" +"The environment color when [member environment_mode] is set to [constant " +"ENVIRONMENT_MODE_CUSTOM_COLOR]." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "" +"The energy scaling factor when when [member environment_mode] is set to " +"[constant ENVIRONMENT_MODE_CUSTOM_COLOR] or [constant " +"ENVIRONMENT_MODE_CUSTOM_SKY]." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "" +"The [Sky] resource to use when [member environment_mode] is set o [constant " +"ENVIRONMENT_MODE_CUSTOM_SKY]." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "The rotation of the baked custom sky." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "" +"Minimum ambient light for all the lightmap texels. This doesn't take into " +"account any occlusion from the scene's geometry, it simply ensures a minimum " +"amount of light on all the lightmap texels. Can be used for artistic control " +"on shadow color." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "Decides which environment to use during baking." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "" +"Size of the baked lightmap. Only meshes inside this region will be included " +"in the baked lightmap, also used as the bounds of the captured region for " +"dynamic lighting." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "" +"Deprecated, in previous versions it determined the location where lightmaps " +"were be saved." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "The calculated light data." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "" +"Determines the amount of samples per texel used in indirect light baking. " +"The amount of samples for each quality level can be configured in the " +"project settings." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "" +"Store full color values in the lightmap textures. When disabled, lightmap " +"textures will store a single brightness channel. Can be disabled to reduce " +"disk usage if the scene contains only white lights or you don't mind losing " +"color information in indirect lighting." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "" +"When enabled, a lightmap denoiser will be used to reduce the noise inherent " +"to Monte Carlo based global illumination." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "" +"If [code]true[/code], stores the lightmap textures in a high dynamic range " +"format (EXR). If [code]false[/code], stores the lightmap texture in a low " +"dynamic range PNG image. This can be set to [code]false[/code] to reduce " +"disk usage, but light values over 1.0 will be clamped and you may see " +"banding caused by the reduced precision.\n" +"[b]Note:[/b] Setting [member use_hdr] to [code]true[/code] will decrease " +"lightmap banding even when using the GLES2 backend or if [member " +"ProjectSettings.rendering/quality/depth/hdr] is [code]false[/code]." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "The lowest bake quality mode. Fastest to calculate." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "The default bake quality mode." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "A higher bake quality mode. Takes longer to calculate." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "The highest bake quality mode. Takes the longest to calculate." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "Baking was successful." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "" +"Returns if no viable save path is found. This can happen where an [member " +"image_path] is not specified or when the save location is invalid." +msgstr "" + +#: doc/classes/BakedLightmap.xml doc/classes/SpatialMaterial.xml +msgid "Currently unused." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "Returns when the baker cannot save per-mesh textures to file." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "The size of the generated lightmaps is too large." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "Some mesh contains UV2 values outside the [code][0,1][/code] range." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "Returns if user cancels baking." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "" +"Returns if lightmapper can't be created. Unless you are using a custom " +"lightmapper, please report this as bug." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "" +"There is no root node to start baking from. Either provide [code]from_node[/" +"code] argument or attach this node to a parent that should be used as root." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "No environment is used during baking." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "The baked environment is automatically picked from the current scene." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "A custom sky is used as environment during baking." +msgstr "" + +#: doc/classes/BakedLightmap.xml +msgid "A custom solid color is used as environment during baking." +msgstr "" + +#: doc/classes/BakedLightmapData.xml +msgid "" +"Global energy multiplier for baked and dynamic capture objects. This can be " +"changed at run-time without having to bake lightmaps again.\n" +"To adjust only the energy of indirect lighting (without affecting direct " +"lighting or emissive materials), adjust [member BakedLightmap." +"bounce_indirect_energy] and bake lightmaps again." +msgstr "" + +#: doc/classes/BakedLightmapData.xml +msgid "" +"Controls whether dynamic capture objects receive environment lighting or not." +msgstr "" + +#: doc/classes/BaseButton.xml +msgid "Base class for different kinds of buttons." +msgstr "" + +#: doc/classes/BaseButton.xml +msgid "" +"BaseButton is the abstract base class for buttons, so it shouldn't be used " +"directly (it doesn't display anything). Other types of buttons inherit from " +"it." +msgstr "" + +#: doc/classes/BaseButton.xml +msgid "" +"Called when the button is pressed. If you need to know the button's pressed " +"state (and [member toggle_mode] is active), use [method _toggled] instead." +msgstr "" + +#: doc/classes/BaseButton.xml +msgid "" +"Called when the button is toggled (only if [member toggle_mode] is active)." +msgstr "" + +#: doc/classes/BaseButton.xml +msgid "" +"Returns the visual state used to draw the button. This is useful mainly when " +"implementing your own draw code by either overriding _draw() or connecting " +"to \"draw\" signal. The visual state of the button is defined by the [enum " +"DrawMode] enum." +msgstr "" + +#: doc/classes/BaseButton.xml +msgid "" +"Returns [code]true[/code] if the mouse has entered the button and has not " +"left it yet." +msgstr "" + +#: doc/classes/BaseButton.xml +msgid "" +"Changes the [member pressed] state of the button, without emitting [signal " +"toggled]. Use when you just want to change the state of the button without " +"sending the pressed event (e.g. when initializing scene). Only works if " +"[member toggle_mode] is [code]true[/code].\n" +"[b]Note:[/b] This method doesn't unpress other buttons in its button [member " +"group]." +msgstr "" + +#: doc/classes/BaseButton.xml +msgid "" +"Determines when the button is considered clicked, one of the [enum " +"ActionMode] constants." +msgstr "" + +#: doc/classes/BaseButton.xml +msgid "" +"Binary mask to choose which mouse buttons this button will respond to.\n" +"To allow both left-click and right-click, use [code]BUTTON_MASK_LEFT | " +"BUTTON_MASK_RIGHT[/code]." +msgstr "" + +#: doc/classes/BaseButton.xml +msgid "" +"If [code]true[/code], the button is in disabled state and can't be clicked " +"or toggled." +msgstr "" + +#: doc/classes/BaseButton.xml +msgid "" +"[i]Deprecated.[/i] This property has been deprecated due to redundancy and " +"will be removed in Godot 4.0. This property no longer has any effect when " +"set. Please use [member Control.focus_mode] instead." +msgstr "" + +#: doc/classes/BaseButton.xml +msgid "[ButtonGroup] associated to the button." +msgstr "" + +#: doc/classes/BaseButton.xml +msgid "" +"If [code]true[/code], the button stays pressed when moving the cursor " +"outside the button while pressing it.\n" +"[b]Note:[/b] This property only affects the button's visual appearance. " +"Signals will be emitted at the same moment regardless of this property's " +"value." +msgstr "" + +#: doc/classes/BaseButton.xml +msgid "" +"If [code]true[/code], the button's state is pressed. Means the button is " +"pressed down or toggled (if [member toggle_mode] is active). Only works if " +"[member toggle_mode] is [code]true[/code].\n" +"[b]Note:[/b] Setting [member pressed] will result in [signal toggled] to be " +"emitted. If you want to change the pressed state without emitting that " +"signal, use [method set_pressed_no_signal]." +msgstr "" + +#: doc/classes/BaseButton.xml +msgid "[ShortCut] associated to the button." +msgstr "" + +#: doc/classes/BaseButton.xml +msgid "" +"If [code]true[/code], the button will add information about its shortcut in " +"the tooltip." +msgstr "" + +#: doc/classes/BaseButton.xml +msgid "" +"If [code]true[/code], the button is in toggle mode. Makes the button flip " +"state between pressed and unpressed each time its area is clicked." +msgstr "" + +#: doc/classes/BaseButton.xml +msgid "Emitted when the button starts being held down." +msgstr "" + +#: doc/classes/BaseButton.xml +msgid "Emitted when the button stops being held down." +msgstr "" + +#: doc/classes/BaseButton.xml +msgid "" +"Emitted when the button is toggled or pressed. This is on [signal " +"button_down] if [member action_mode] is [constant ACTION_MODE_BUTTON_PRESS] " +"and on [signal button_up] otherwise.\n" +"If you need to know the button's pressed state (and [member toggle_mode] is " +"active), use [signal toggled] instead." +msgstr "" + +#: doc/classes/BaseButton.xml +msgid "" +"Emitted when the button was just toggled between pressed and normal states " +"(only if [member toggle_mode] is active). The new state is contained in the " +"[code]button_pressed[/code] argument." +msgstr "" + +#: doc/classes/BaseButton.xml +msgid "" +"The normal state (i.e. not pressed, not hovered, not toggled and enabled) of " +"buttons." +msgstr "" + +#: doc/classes/BaseButton.xml +msgid "The state of buttons are pressed." +msgstr "" + +#: doc/classes/BaseButton.xml +msgid "The state of buttons are hovered." +msgstr "" + +#: doc/classes/BaseButton.xml +msgid "The state of buttons are disabled." +msgstr "" + +#: doc/classes/BaseButton.xml +msgid "The state of buttons are both hovered and pressed." +msgstr "" + +#: doc/classes/BaseButton.xml +msgid "Require just a press to consider the button clicked." +msgstr "" + +#: doc/classes/BaseButton.xml +msgid "" +"Require a press and a subsequent release before considering the button " +"clicked." +msgstr "" + +#: doc/classes/Basis.xml +msgid "3×3 matrix datatype." +msgstr "" + +#: doc/classes/Basis.xml +msgid "" +"3×3 matrix used for 3D rotation and scale. Almost always used as an " +"orthogonal basis for a Transform.\n" +"Contains 3 vector fields X, Y and Z as its columns, which are typically " +"interpreted as the local basis vectors of a transformation. For such use, it " +"is composed of a scaling and a rotation matrix, in that order (M = R.S).\n" +"Can also be accessed as array of 3D vectors. These vectors are normally " +"orthogonal to each other, but are not necessarily normalized (due to " +"scaling).\n" +"For more information, read the \"Matrices and transforms\" documentation " +"article." +msgstr "" + +#: doc/classes/Basis.xml doc/classes/Transform.xml doc/classes/Transform2D.xml +msgid "Matrices and transforms" +msgstr "" + +#: doc/classes/Basis.xml doc/classes/Quat.xml doc/classes/Transform.xml +msgid "Using 3D transforms" +msgstr "" + +#: doc/classes/Basis.xml doc/classes/Line2D.xml doc/classes/Transform.xml +#: doc/classes/Transform2D.xml doc/classes/Vector2.xml doc/classes/Vector3.xml +msgid "Matrix Transform Demo" +msgstr "" + +#: doc/classes/Basis.xml doc/classes/CylinderShape.xml +#: doc/classes/Dictionary.xml doc/classes/DynamicFont.xml +#: doc/classes/DynamicFontData.xml doc/classes/File.xml doc/classes/Input.xml +#: doc/classes/InputEvent.xml doc/classes/InputEventAction.xml +#: doc/classes/InputEventMouseMotion.xml doc/classes/KinematicBody.xml +#: doc/classes/RayCast.xml doc/classes/StaticBody.xml +#: doc/classes/SurfaceTool.xml doc/classes/TextureButton.xml +#: doc/classes/TextureRect.xml doc/classes/Thread.xml +#: doc/classes/VBoxContainer.xml +msgid "3D Voxel Demo" +msgstr "" + +#: doc/classes/Basis.xml doc/classes/Line2D.xml doc/classes/Transform.xml +#: doc/classes/Transform2D.xml +msgid "2.5D Demo" +msgstr "" + +#: doc/classes/Basis.xml +msgid "Constructs a pure rotation basis matrix from the given quaternion." +msgstr "" + +#: doc/classes/Basis.xml +msgid "" +"Constructs a pure rotation basis matrix from the given Euler angles (in the " +"YXZ convention: when *composing*, first Y, then X, and Z last), given in the " +"vector format as (X angle, Y angle, Z angle).\n" +"Consider using the [Quat] constructor instead, which uses a quaternion " +"instead of Euler angles." +msgstr "" + +#: doc/classes/Basis.xml +msgid "" +"Constructs a pure rotation basis matrix, rotated around the given " +"[code]axis[/code] by [code]angle[/code] (in radians). The axis must be a " +"normalized vector." +msgstr "" + +#: doc/classes/Basis.xml +msgid "Constructs a basis matrix from 3 axis vectors (matrix columns)." +msgstr "" + +#: doc/classes/Basis.xml +msgid "" +"Returns the determinant of the basis matrix. If the basis is uniformly " +"scaled, its determinant is the square of the scale.\n" +"A negative determinant means the basis has a negative scale. A zero " +"determinant means the basis isn't invertible, and is usually considered " +"invalid." +msgstr "" + +#: doc/classes/Basis.xml +msgid "" +"Returns the basis's rotation in the form of Euler angles (in the YXZ " +"convention: when decomposing, first Z, then X, and Y last). The returned " +"vector contains the rotation angles in the format (X angle, Y angle, Z " +"angle).\n" +"Consider using the [method get_rotation_quat] method instead, which returns " +"a [Quat] quaternion instead of Euler angles." +msgstr "" + +#: doc/classes/Basis.xml +msgid "" +"This function considers a discretization of rotations into 24 points on unit " +"sphere, lying along the vectors (x,y,z) with each component being either -1, " +"0, or 1, and returns the index of the point best representing the " +"orientation of the object. It is mainly used by the [GridMap] editor. For " +"further details, refer to the Godot source code." +msgstr "" + +#: doc/classes/Basis.xml +msgid "" +"Returns the basis's rotation in the form of a quaternion. See [method " +"get_euler] if you need Euler angles, but keep in mind quaternions should " +"generally be preferred to Euler angles." +msgstr "" + +#: doc/classes/Basis.xml +msgid "" +"Assuming that the matrix is the combination of a rotation and scaling, " +"return the absolute value of scaling factors along each axis." +msgstr "" + +#: doc/classes/Basis.xml +msgid "Returns the inverse of the matrix." +msgstr "" + +#: doc/classes/Basis.xml +msgid "" +"Returns [code]true[/code] if this basis and [code]b[/code] are approximately " +"equal, by calling [code]is_equal_approx[/code] on each component.\n" +"[b]Note:[/b] For complicated reasons, the epsilon argument is always " +"discarded. Don't use the epsilon argument, it does nothing." +msgstr "" + +#: doc/classes/Basis.xml +msgid "" +"Returns the orthonormalized version of the matrix (useful to call from time " +"to time to avoid rounding error for orthogonal matrices). This performs a " +"Gram-Schmidt orthonormalization on the basis of the matrix." +msgstr "" + +#: doc/classes/Basis.xml +msgid "" +"Introduce an additional rotation around the given axis by [code]angle[/code] " +"(in radians). The axis must be a normalized vector." +msgstr "" + +#: doc/classes/Basis.xml +msgid "" +"Introduce an additional scaling specified by the given 3D scaling factor." +msgstr "" + +#: doc/classes/Basis.xml +msgid "" +"Assuming that the matrix is a proper rotation matrix, slerp performs a " +"spherical-linear interpolation with another rotation matrix." +msgstr "" + +#: doc/classes/Basis.xml +msgid "Transposed dot product with the X axis of the matrix." +msgstr "" + +#: doc/classes/Basis.xml +msgid "Transposed dot product with the Y axis of the matrix." +msgstr "" + +#: doc/classes/Basis.xml +msgid "Transposed dot product with the Z axis of the matrix." +msgstr "" + +#: doc/classes/Basis.xml +msgid "Returns the transposed version of the matrix." +msgstr "" + +#: doc/classes/Basis.xml +msgid "Returns a vector transformed (multiplied) by the matrix." +msgstr "" + +#: doc/classes/Basis.xml +msgid "" +"Returns a vector transformed (multiplied) by the transposed basis matrix.\n" +"[b]Note:[/b] This results in a multiplication by the inverse of the matrix " +"only if it represents a rotation-reflection." +msgstr "" + +#: doc/classes/Basis.xml doc/classes/Transform2D.xml +msgid "" +"The basis matrix's X vector (column 0). Equivalent to array index [code]0[/" +"code]." +msgstr "" + +#: doc/classes/Basis.xml doc/classes/Transform2D.xml +msgid "" +"The basis matrix's Y vector (column 1). Equivalent to array index [code]1[/" +"code]." +msgstr "" + +#: doc/classes/Basis.xml +msgid "" +"The basis matrix's Z vector (column 2). Equivalent to array index [code]2[/" +"code]." +msgstr "" + +#: doc/classes/Basis.xml +msgid "" +"The identity basis, with no rotation or scaling applied.\n" +"This is identical to calling [code]Basis()[/code] without any parameters. " +"This constant can be used to make your code clearer, and for consistency " +"with C#." +msgstr "" + +#: doc/classes/Basis.xml +msgid "" +"The basis that will flip something along the X axis when used in a " +"transformation." +msgstr "" + +#: doc/classes/Basis.xml +msgid "" +"The basis that will flip something along the Y axis when used in a " +"transformation." +msgstr "" + +#: doc/classes/Basis.xml +msgid "" +"The basis that will flip something along the Z axis when used in a " +"transformation." +msgstr "" + +#: doc/classes/BitMap.xml +msgid "Boolean matrix." +msgstr "" + +#: doc/classes/BitMap.xml +msgid "" +"A two-dimensional array of boolean values, can be used to efficiently store " +"a binary matrix (every matrix element takes only one bit) and query the " +"values using natural cartesian coordinates." +msgstr "" + +#: doc/classes/BitMap.xml +msgid "" +"Returns an image of the same size as the bitmap and with a [enum Image." +"Format] of type [code]FORMAT_L8[/code]. [code]true[/code] bits of the bitmap " +"are being converted into white pixels, and [code]false[/code] bits into " +"black." +msgstr "" + +#: doc/classes/BitMap.xml +msgid "" +"Creates a bitmap with the specified size, filled with [code]false[/code]." +msgstr "" + +#: doc/classes/BitMap.xml +msgid "" +"Creates a bitmap that matches the given image dimensions, every element of " +"the bitmap is set to [code]false[/code] if the alpha value of the image at " +"that position is equal to [code]threshold[/code] or less, and [code]true[/" +"code] in other case." +msgstr "" + +#: doc/classes/BitMap.xml +msgid "Returns bitmap's value at the specified position." +msgstr "" + +#: doc/classes/BitMap.xml +msgid "Returns bitmap's dimensions." +msgstr "" + +#: doc/classes/BitMap.xml +msgid "" +"Returns the amount of bitmap elements that are set to [code]true[/code]." +msgstr "" + +#: doc/classes/BitMap.xml +msgid "" +"Applies morphological dilation or erosion to the bitmap. If [code]pixels[/" +"code] is positive, dilation is applied to the bitmap. If [code]pixels[/code] " +"is negative, erosion is applied to the bitmap. [code]rect[/code] defines the " +"area where the morphological operation is applied. Pixels located outside " +"the [code]rect[/code] are unaffected by [method grow_mask]." +msgstr "" + +#: doc/classes/BitMap.xml +msgid "Resizes the image to [code]new_size[/code]." +msgstr "" + +#: doc/classes/BitMap.xml +msgid "" +"Sets the bitmap's element at the specified position, to the specified value." +msgstr "" + +#: doc/classes/BitMap.xml +msgid "Sets a rectangular portion of the bitmap to the specified value." +msgstr "" + +#: doc/classes/BitmapFont.xml +msgid "" +"Renders text using fonts under the [url=https://www.angelcode.com/products/" +"bmfont/]BMFont[/url] format.\n" +"Handles files with the [code].fnt[/code] extension." +msgstr "" + +#: doc/classes/BitmapFont.xml +msgid "" +"Renders text using [code]*.fnt[/code] fonts containing texture atlases. " +"Supports distance fields. For using vector font files like TTF directly, see " +"[DynamicFont]." +msgstr "" + +#: doc/classes/BitmapFont.xml +msgid "" +"Adds a character to the font, where [code]character[/code] is the Unicode " +"value, [code]texture[/code] is the texture index, [code]rect[/code] is the " +"region in the texture (in pixels!), [code]align[/code] is the (optional) " +"alignment for the character and [code]advance[/code] is the (optional) " +"advance." +msgstr "" + +#: doc/classes/BitmapFont.xml +msgid "" +"Adds a kerning pair to the [BitmapFont] as a difference. Kerning pairs are " +"special cases where a typeface advance is determined by the next character." +msgstr "" + +#: doc/classes/BitmapFont.xml +msgid "Adds a texture to the [BitmapFont]." +msgstr "" + +#: doc/classes/BitmapFont.xml +msgid "Clears all the font data and settings." +msgstr "" + +#: doc/classes/BitmapFont.xml +msgid "" +"Creates a BitmapFont from the [code]*.fnt[/code] file at [code]path[/code]." +msgstr "" + +#: doc/classes/BitmapFont.xml +msgid "Returns a kerning pair as a difference." +msgstr "" + +#: doc/classes/BitmapFont.xml +msgid "Returns the font atlas texture at index [code]idx[/code]." +msgstr "" + +#: doc/classes/BitmapFont.xml +msgid "Returns the number of textures in the BitmapFont atlas." +msgstr "" + +#: doc/classes/BitmapFont.xml +msgid "Ascent (number of pixels above the baseline)." +msgstr "" + +#: doc/classes/BitmapFont.xml +msgid "If [code]true[/code], distance field hint is enabled." +msgstr "" + +#: doc/classes/BitmapFont.xml +msgid "The fallback font." +msgstr "" + +#: doc/classes/BitmapFont.xml +msgid "Total font height (ascent plus descent) in pixels." +msgstr "" + +#: doc/classes/Bone2D.xml +msgid "Joint used with [Skeleton2D] to control and animate other nodes." +msgstr "" + +#: doc/classes/Bone2D.xml +msgid "" +"Use a hierarchy of [code]Bone2D[/code] bound to a [Skeleton2D] to control, " +"and animate other [Node2D] nodes.\n" +"You can use [code]Bone2D[/code] and [code]Skeleton2D[/code] nodes to animate " +"2D meshes created with the Polygon 2D UV editor.\n" +"Each bone has a [member rest] transform that you can reset to with [method " +"apply_rest]. These rest poses are relative to the bone's parent.\n" +"If in the editor, you can set the rest pose of an entire skeleton using a " +"menu option, from the code, you need to iterate over the bones to set their " +"individual rest poses." +msgstr "" + +#: doc/classes/Bone2D.xml +msgid "Stores the node's current transforms in [member rest]." +msgstr "" + +#: doc/classes/Bone2D.xml +msgid "" +"Returns the node's index as part of the entire skeleton. See [Skeleton2D]." +msgstr "" + +#: doc/classes/Bone2D.xml +msgid "" +"Returns the node's [member rest] [code]Transform2D[/code] if it doesn't have " +"a parent, or its rest pose relative to its parent." +msgstr "" + +#: doc/classes/Bone2D.xml +msgid "" +"Length of the bone's representation drawn in the editor's viewport in pixels." +msgstr "" + +#: doc/classes/Bone2D.xml +msgid "" +"Rest transform of the bone. You can reset the node's transforms to this " +"value using [method apply_rest]." +msgstr "" + +#: doc/classes/BoneAttachment.xml +msgid "A node that will attach to a bone." +msgstr "" + +#: doc/classes/BoneAttachment.xml +msgid "" +"This node must be the child of a [Skeleton] node. You can then select a bone " +"for this node to attach to. The BoneAttachment node will copy the transform " +"of the selected bone." +msgstr "" + +#: doc/classes/BoneAttachment.xml +msgid "The name of the attached bone." +msgstr "" + +#: doc/classes/bool.xml +msgid "Boolean built-in type." +msgstr "" + +#: doc/classes/bool.xml +msgid "" +"Boolean is a built-in type. There are two boolean values: [code]true[/code] " +"and [code]false[/code]. You can think of it as a switch with on or off (1 or " +"0) setting. Booleans are used in programming for logic in condition " +"statements, like [code]if[/code] statements.\n" +"Booleans can be directly used in [code]if[/code] statements. The code below " +"demonstrates this on the [code]if can_shoot:[/code] line. You don't need to " +"use [code]== true[/code], you only need [code]if can_shoot:[/code]. " +"Similarly, use [code]if not can_shoot:[/code] rather than [code]== false[/" +"code].\n" +"[codeblock]\n" +"var can_shoot = true\n" +"\n" +"func shoot():\n" +" if can_shoot:\n" +" pass # Perform shooting actions here.\n" +"[/codeblock]\n" +"The following code will only create a bullet if both conditions are met: " +"action \"shoot\" is pressed and if [code]can_shoot[/code] is [code]true[/" +"code].\n" +"[b]Note:[/b] [code]Input.is_action_pressed(\"shoot\")[/code] is also a " +"boolean that is [code]true[/code] when \"shoot\" is pressed and [code]false[/" +"code] when \"shoot\" isn't pressed.\n" +"[codeblock]\n" +"var can_shoot = true\n" +"\n" +"func shoot():\n" +" if can_shoot and Input.is_action_pressed(\"shoot\"):\n" +" create_bullet()\n" +"[/codeblock]\n" +"The following code will set [code]can_shoot[/code] to [code]false[/code] and " +"start a timer. This will prevent player from shooting until the timer runs " +"out. Next [code]can_shoot[/code] will be set to [code]true[/code] again " +"allowing player to shoot once again.\n" +"[codeblock]\n" +"var can_shoot = true\n" +"onready var cool_down = $CoolDownTimer\n" +"\n" +"func shoot():\n" +" if can_shoot and Input.is_action_pressed(\"shoot\"):\n" +" create_bullet()\n" +" can_shoot = false\n" +" cool_down.start()\n" +"\n" +"func _on_CoolDownTimer_timeout():\n" +" can_shoot = true\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/bool.xml +msgid "" +"Cast an [int] value to a boolean value, this method will return [code]false[/" +"code] if [code]0[/code] is passed in, and [code]true[/code] for all other " +"ints." +msgstr "" + +#: doc/classes/bool.xml +msgid "" +"Cast a [float] value to a boolean value, this method will return " +"[code]false[/code] if [code]0.0[/code] is passed in, and [code]true[/code] " +"for all other floats." +msgstr "" + +#: doc/classes/bool.xml +msgid "" +"Cast a [String] value to a boolean value, this method will return " +"[code]false[/code] if [code]\"\"[/code] is passed in, and [code]true[/code] " +"for all non-empty strings.\n" +"Examples: [code]bool(\"False\")[/code] returns [code]true[/code], " +"[code]bool(\"\")[/code] returns [code]false[/code]." +msgstr "" + +#: doc/classes/BoxContainer.xml +msgid "Base class for box containers." +msgstr "" + +#: doc/classes/BoxContainer.xml +msgid "" +"Arranges child controls vertically or horizontally, and rearranges the " +"controls automatically when their minimum size changes." +msgstr "" + +#: doc/classes/BoxContainer.xml +msgid "" +"Adds a control to the box as a spacer. If [code]true[/code], [code]begin[/" +"code] will insert the spacer control in front of other children." +msgstr "" + +#: doc/classes/BoxContainer.xml +msgid "" +"The alignment of the container's children (must be one of [constant " +"ALIGN_BEGIN], [constant ALIGN_CENTER] or [constant ALIGN_END])." +msgstr "" + +#: doc/classes/BoxContainer.xml +msgid "Aligns children with the beginning of the container." +msgstr "" + +#: doc/classes/BoxContainer.xml +msgid "Aligns children with the center of the container." +msgstr "" + +#: doc/classes/BoxContainer.xml +msgid "Aligns children with the end of the container." +msgstr "" + +#: doc/classes/BoxShape.xml +msgid "Box shape resource." +msgstr "" + +#: doc/classes/BoxShape.xml +msgid "3D box shape that can be a child of a [PhysicsBody] or [Area]." +msgstr "" + +#: doc/classes/BoxShape.xml doc/classes/CapsuleShape.xml +#: doc/classes/ConcavePolygonShape.xml doc/classes/ConvexPolygonShape.xml +#: doc/classes/CylinderShape.xml doc/classes/ProjectSettings.xml +#: doc/classes/RigidBody.xml doc/classes/SphereShape.xml +#: doc/classes/StaticBody.xml +msgid "3D Physics Tests Demo" +msgstr "" + +#: doc/classes/BoxShape.xml doc/classes/CollisionShape.xml +#: modules/gridmap/doc_classes/GridMap.xml doc/classes/KinematicBody.xml +#: doc/classes/Mesh.xml doc/classes/MeshInstance.xml +#: doc/classes/MeshLibrary.xml +msgid "3D Kinematic Character Demo" +msgstr "" + +#: doc/classes/BoxShape.xml +msgid "" +"The box's half extents. The width, height and depth of this shape is twice " +"the half extents." +msgstr "" + +#: doc/classes/Button.xml +msgid "Standard themed Button." +msgstr "" + +#: doc/classes/Button.xml +msgid "" +"Button is the standard themed button. It can contain text and an icon, and " +"will display them according to the current [Theme].\n" +"[b]Example of creating a button and assigning an action when pressed by code:" +"[/b]\n" +"[codeblock]\n" +"func _ready():\n" +" var button = Button.new()\n" +" button.text = \"Click me\"\n" +" button.connect(\"pressed\", self, \"_button_pressed\")\n" +" add_child(button)\n" +"\n" +"func _button_pressed():\n" +" print(\"Hello world!\")\n" +"[/codeblock]\n" +"Buttons (like all Control nodes) can also be created in the editor, but some " +"situations may require creating them from code.\n" +"See also [BaseButton] which contains common properties and methods " +"associated with this node.\n" +"[b]Note:[/b] Buttons do not interpret touch input and therefore don't " +"support multitouch, since mouse emulation can only press one button at a " +"given time. Use [TouchScreenButton] for buttons that trigger gameplay " +"movement or actions, as [TouchScreenButton] supports multitouch." +msgstr "" + +#: doc/classes/Button.xml doc/classes/Dictionary.xml +#: doc/classes/GridContainer.xml doc/classes/OS.xml +#: doc/classes/PoolStringArray.xml doc/classes/ProjectSettings.xml +#: doc/classes/ResourceLoader.xml doc/classes/RichTextLabel.xml +msgid "OS Test Demo" +msgstr "" + +#: doc/classes/Button.xml +msgid "" +"Text alignment policy for the button's text, use one of the [enum TextAlign] " +"constants." +msgstr "" + +#: doc/classes/Button.xml +msgid "" +"When this property is enabled, text that is too large to fit the button is " +"clipped, when disabled the Button will always be wide enough to hold the " +"text." +msgstr "" + +#: doc/classes/Button.xml +msgid "" +"When enabled, the button's icon will expand/shrink to fit the button's size " +"while keeping its aspect." +msgstr "" + +#: doc/classes/Button.xml +msgid "Flat buttons don't display decoration." +msgstr "" + +#: doc/classes/Button.xml +msgid "" +"Button's icon, if text is present the icon will be placed before the text.\n" +"To edit margin and spacing of the icon, use [code]hseparation[/code] theme " +"property of [Button] and [code]content_margin_*[/code] properties of the " +"used [StyleBox]es." +msgstr "" + +#: doc/classes/Button.xml +msgid "" +"Specifies if the icon should be aligned to the left, right, or center of a " +"button. Uses the same [enum TextAlign] constants as the text alignment. If " +"centered, text will draw on top of the icon." +msgstr "" + +#: doc/classes/Button.xml doc/classes/LinkButton.xml +msgid "The button's text that will be displayed inside the button's area." +msgstr "" + +#: doc/classes/Button.xml +msgid "Align the text to the left." +msgstr "" + +#: doc/classes/Button.xml +msgid "Align the text to the center." +msgstr "" + +#: doc/classes/Button.xml +msgid "Align the text to the right." +msgstr "" + +#: doc/classes/Button.xml +msgid "Default text [Color] of the [Button]." +msgstr "" + +#: doc/classes/Button.xml +msgid "Text [Color] used when the [Button] is disabled." +msgstr "" + +#: doc/classes/Button.xml +msgid "" +"Text [Color] used when the [Button] is focused. Only replaces the normal " +"text color of the button. Disabled, hovered, and pressed states take " +"precedence over this color." +msgstr "" + +#: doc/classes/Button.xml +msgid "Text [Color] used when the [Button] is being hovered." +msgstr "" + +#: doc/classes/Button.xml +msgid "Text [Color] used when the [Button] is being pressed." +msgstr "" + +#: doc/classes/Button.xml +msgid "The horizontal space between [Button]'s icon and text." +msgstr "" + +#: doc/classes/Button.xml +msgid "[Font] of the [Button]'s text." +msgstr "" + +#: doc/classes/Button.xml +msgid "[StyleBox] used when the [Button] is disabled." +msgstr "" + +#: doc/classes/Button.xml +msgid "" +"[StyleBox] used when the [Button] is focused. It is displayed over the " +"current [StyleBox], so using [StyleBoxEmpty] will just disable the focus " +"visual effect." +msgstr "" + +#: doc/classes/Button.xml +msgid "[StyleBox] used when the [Button] is being hovered." +msgstr "" + +#: doc/classes/Button.xml +msgid "Default [StyleBox] for the [Button]." +msgstr "" + +#: doc/classes/Button.xml +msgid "[StyleBox] used when the [Button] is being pressed." +msgstr "" + +#: doc/classes/ButtonGroup.xml +msgid "Group of Buttons." +msgstr "" + +#: doc/classes/ButtonGroup.xml +msgid "" +"Group of [Button]. All direct and indirect children buttons become radios. " +"Only one allows being pressed.\n" +"[member BaseButton.toggle_mode] should be [code]true[/code]." +msgstr "" + +#: doc/classes/ButtonGroup.xml +msgid "" +"Returns an [Array] of [Button]s who have this as their [ButtonGroup] (see " +"[member BaseButton.group])." +msgstr "" + +#: doc/classes/ButtonGroup.xml +msgid "Returns the current pressed button." +msgstr "" + +#: doc/classes/ButtonGroup.xml +msgid "Emitted when one of the buttons of the group is pressed." +msgstr "" + +#: doc/classes/CallbackTweener.xml +msgid "Calls the specified method after optional delay." +msgstr "" + +#: doc/classes/CallbackTweener.xml +msgid "" +"[CallbackTweener] is used to call a method in a tweening sequence. See " +"[method SceneTreeTween.tween_callback] for more usage information.\n" +"[b]Note:[/b] [method SceneTreeTween.tween_callback] is the only correct way " +"to create [CallbackTweener]. Any [CallbackTweener] created manually will not " +"function correctly." +msgstr "" + +#: doc/classes/CallbackTweener.xml +msgid "" +"Makes the callback call delayed by given time in seconds. Example:\n" +"[codeblock]\n" +"var tween = get_tree().create_tween()\n" +"tween.tween_callback(queue_free).set_delay(2) #this will call queue_free() " +"after 2 seconds\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Camera.xml +msgid "Camera node, displays from a point of view." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"Camera is a special node that displays what is visible from its current " +"location. Cameras register themselves in the nearest [Viewport] node (when " +"ascending the tree). Only one camera can be active per viewport. If no " +"viewport is available ascending the tree, the camera will register in the " +"global viewport. In other words, a camera just provides 3D display " +"capabilities to a [Viewport], and, without one, a scene registered in that " +"[Viewport] (or higher viewports) can't be displayed." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"If this is the current camera, remove it from being current. If " +"[code]enable_next[/code] is [code]true[/code], request to make the next " +"camera current, if any." +msgstr "" + +#: doc/classes/Camera.xml +msgid "Returns the camera's RID from the [VisualServer]." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"Returns the transform of the camera plus the vertical ([member v_offset]) " +"and horizontal ([member h_offset]) offsets; and any other adjustments made " +"to the position and orientation of the camera by subclassed cameras such as " +"[ClippedCamera], [InterpolatedCamera] and [ARVRCamera]." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"Returns [code]true[/code] if the given [code]layer[/code] in the [member " +"cull_mask] is enabled, [code]false[/code] otherwise." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"Returns the camera's frustum planes in world space units as an array of " +"[Plane]s in the following order: near, far, left, top, right, bottom. Not to " +"be confused with [member frustum_offset]." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"Returns [code]true[/code] if the given position is behind the camera.\n" +"[b]Note:[/b] A position which returns [code]false[/code] may still be " +"outside the camera's field of view." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"Makes this camera the current camera for the [Viewport] (see class " +"description). If the camera node is outside the scene tree, it will attempt " +"to become current once it's added." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"Returns a normal vector from the screen point location directed along the " +"camera. Orthogonal cameras are normalized. Perspective cameras account for " +"perspective, screen width/height, etc." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"Returns the 3D point in world space that maps to the given 2D coordinate in " +"the [Viewport] rectangle on a plane that is the given [code]z_depth[/code] " +"distance into the scene away from the camera." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"Returns a normal vector in world space, that is the result of projecting a " +"point on the [Viewport] rectangle by the inverse camera projection. This is " +"useful for casting rays in the form of (origin, normal) for object " +"intersection or picking." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"Returns a 3D position in world space, that is the result of projecting a " +"point on the [Viewport] rectangle by the inverse camera projection. This is " +"useful for casting rays in the form of (origin, normal) for object " +"intersection or picking." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"Enables or disables the given [code]layer[/code] in the [member cull_mask]." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"Sets the camera projection to frustum mode (see [constant " +"PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" +"code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " +"world space units. See also [member frustum_offset]." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"Sets the camera projection to orthogonal mode (see [constant " +"PROJECTION_ORTHOGONAL]), by specifying a [code]size[/code], and the " +"[code]z_near[/code] and [code]z_far[/code] clip planes in world space units. " +"(As a hint, 2D games often use this projection, with values specified in " +"pixels.)" +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"Sets the camera projection to perspective mode (see [constant " +"PROJECTION_PERSPECTIVE]), by specifying a [code]fov[/code] (field of view) " +"angle in degrees, and the [code]z_near[/code] and [code]z_far[/code] clip " +"planes in world space units." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"Returns the 2D coordinate in the [Viewport] rectangle that maps to the given " +"3D point in world space.\n" +"[b]Note:[/b] When using this to position GUI elements over a 3D viewport, " +"use [method is_position_behind] to prevent them from appearing if the 3D " +"point is behind the camera:\n" +"[codeblock]\n" +"# This code block is part of a script that inherits from Spatial.\n" +"# `control` is a reference to a node inheriting from Control.\n" +"control.visible = not get_viewport().get_camera()." +"is_position_behind(global_transform.origin)\n" +"control.rect_position = get_viewport().get_camera()." +"unproject_position(global_transform.origin)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"The culling mask that describes which 3D render layers are rendered by this " +"camera." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"If [code]true[/code], the ancestor [Viewport] is currently using this " +"camera.\n" +"If multiple cameras are in the scene, one will always be made current. For " +"example, if two [Camera] nodes are present in the scene and only one is " +"current, setting one camera's [member current] to [code]false[/code] will " +"cause the other camera to be made current." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"If not [constant DOPPLER_TRACKING_DISABLED], this camera will simulate the " +"[url=https://en.wikipedia.org/wiki/Doppler_effect]Doppler effect[/url] for " +"objects changed in particular [code]_process[/code] methods. The Doppler " +"effect is only simulated for [AudioStreamPlayer3D] nodes that have [member " +"AudioStreamPlayer3D.doppler_tracking] set to a value other than [constant " +"AudioStreamPlayer3D.DOPPLER_TRACKING_DISABLED].\n" +"[b]Note:[/b] To toggle the Doppler effect preview in the editor, use the " +"Perspective menu in the top-left corner of the 3D viewport and toggle " +"[b]Enable Doppler[/b]." +msgstr "" + +#: doc/classes/Camera.xml +msgid "The [Environment] to use for this camera." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"The distance to the far culling boundary for this camera relative to its " +"local Z axis." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"The camera's field of view angle (in degrees). Only applicable in " +"perspective mode. Since [member keep_aspect] locks one axis, [code]fov[/" +"code] sets the other axis' field of view angle.\n" +"For reference, the default vertical field of view value ([code]70.0[/code]) " +"is equivalent to a horizontal FOV of:\n" +"- ~86.07 degrees in a 4:3 viewport\n" +"- ~96.50 degrees in a 16:10 viewport\n" +"- ~102.45 degrees in a 16:9 viewport\n" +"- ~117.06 degrees in a 21:9 viewport" +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"The camera's frustum offset. This can be changed from the default to create " +"\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." +msgstr "" + +#: doc/classes/Camera.xml +msgid "The horizontal (X) offset of the camera viewport." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"The axis to lock during [member fov]/[member size] adjustments. Can be " +"either [constant KEEP_WIDTH] or [constant KEEP_HEIGHT]." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"The distance to the near culling boundary for this camera relative to its " +"local Z axis." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"The camera's projection mode. In [constant PROJECTION_PERSPECTIVE] mode, " +"objects' Z distance from the camera's local space scales their perceived " +"size." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." +msgstr "" + +#: doc/classes/Camera.xml +msgid "The vertical (Y) offset of the camera viewport." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"Perspective projection. Objects on the screen becomes smaller when they are " +"far away." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"Orthogonal projection, also known as orthographic projection. Objects remain " +"the same size on the screen no matter how far away they are." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"Frustum projection. This mode allows adjusting [member frustum_offset] to " +"create \"tilted frustum\" effects." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"Preserves the horizontal aspect ratio; also known as Vert- scaling. This is " +"usually the best option for projects running in portrait mode, as taller " +"aspect ratios will benefit from a wider vertical FOV." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"Preserves the vertical aspect ratio; also known as Hor+ scaling. This is " +"usually the best option for projects running in landscape mode, as wider " +"aspect ratios will automatically benefit from a wider horizontal FOV." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"Disables [url=https://en.wikipedia.org/wiki/Doppler_effect]Doppler effect[/" +"url] simulation (default)." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"Simulate [url=https://en.wikipedia.org/wiki/Doppler_effect]Doppler effect[/" +"url] by tracking positions of objects that are changed in [code]_process[/" +"code]. Changes in the relative velocity of this camera compared to those " +"objects affect how audio is perceived (changing the audio's [member " +"AudioStreamPlayer3D.pitch_scale])." +msgstr "" + +#: doc/classes/Camera.xml +msgid "" +"Simulate [url=https://en.wikipedia.org/wiki/Doppler_effect]Doppler effect[/" +"url] by tracking positions of objects that are changed in " +"[code]_physics_process[/code]. Changes in the relative velocity of this " +"camera compared to those objects affect how audio is perceived (changing the " +"audio's [member AudioStreamPlayer3D.pitch_scale])." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "Camera node for 2D scenes." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"Camera node for 2D scenes. It forces the screen (current layer) to scroll " +"following this node. This makes it easier (and faster) to program scrollable " +"scenes than manually changing the position of [CanvasItem]-based nodes.\n" +"This node is intended to be a simple helper to get things going quickly, but " +"more functionality may be desired to change how the camera works. To make " +"your own custom camera node, inherit it from [Node2D] and change the " +"transform of the canvas by setting [member Viewport.canvas_transform] in " +"[Viewport] (you can obtain the current [Viewport] by using [method Node." +"get_viewport]).\n" +"Note that the [Camera2D] node's [code]position[/code] doesn't represent the " +"actual position of the screen, which may differ due to applied smoothing or " +"limits. You can use [method get_camera_screen_center] to get the real " +"position." +msgstr "" + +#: doc/classes/Camera2D.xml doc/classes/TileMap.xml doc/classes/TileSet.xml +msgid "2D Isometric Demo" +msgstr "" + +#: doc/classes/Camera2D.xml doc/classes/Environment.xml +#: doc/classes/WorldEnvironment.xml +msgid "2D HDR Demo" +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "Aligns the camera to the tracked node." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"Removes any [Camera2D] from the ancestor [Viewport]'s internal currently-" +"assigned camera." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "Forces the camera to update scroll immediately." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"Returns the camera's [code]position[/code] (the tracked point the camera " +"attempts to follow), relative to the origin.\n" +"[b]Note:[/b] The returned value is not the same as [member Node2D.position] " +"or [member Node2D.global_position], as it is affected by the [code]drag[/" +"code] properties." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"Returns the location of the [Camera2D]'s screen-center, relative to the " +"origin.\n" +"[b]Note:[/b] The real [code]position[/code] of the camera may be different, " +"see [method get_camera_position]." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"Returns the specified margin. See also [member drag_margin_bottom], [member " +"drag_margin_top], [member drag_margin_left], and [member drag_margin_right]." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"Returns the specified camera limit. See also [member limit_bottom], [member " +"limit_top], [member limit_left], and [member limit_right]." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"Make this the current 2D camera for the scene (viewport and layer), in case " +"there are many cameras in the scene." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"Sets the camera's position immediately to its current smoothing " +"destination.\n" +"This method has no effect if [member smoothing_enabled] is [code]false[/" +"code]." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"Sets the specified margin. See also [member drag_margin_bottom], [member " +"drag_margin_top], [member drag_margin_left], and [member drag_margin_right]." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"Sets the specified camera limit. See also [member limit_bottom], [member " +"limit_top], [member limit_left], and [member limit_right]." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "The Camera2D's anchor point. See [enum AnchorMode] constants." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"If [code]true[/code], the camera is the active camera for the current scene. " +"Only one camera can be current, so setting a different camera [code]current[/" +"code] will disable this one." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"The custom [Viewport] node attached to the [Camera2D]. If [code]null[/code] " +"or not a [Viewport], uses the default viewport instead." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"Bottom margin needed to drag the camera. A value of [code]1[/code] makes the " +"camera move only when reaching the edge of the screen." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"If [code]true[/code], the camera only moves when reaching the horizontal " +"drag margins. If [code]false[/code], the camera moves horizontally " +"regardless of margins." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"Left margin needed to drag the camera. A value of [code]1[/code] makes the " +"camera move only when reaching the edge of the screen." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"Right margin needed to drag the camera. A value of [code]1[/code] makes the " +"camera move only when reaching the edge of the screen." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"Top margin needed to drag the camera. A value of [code]1[/code] makes the " +"camera move only when reaching the edge of the screen." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"If [code]true[/code], the camera only moves when reaching the vertical drag " +"margins. If [code]false[/code], the camera moves vertically regardless of " +"margins." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"If [code]true[/code], draws the camera's drag margin rectangle in the editor." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"If [code]true[/code], draws the camera's limits rectangle in the editor." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"If [code]true[/code], draws the camera's screen rectangle in the editor." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"Bottom scroll limit in pixels. The camera stops moving when reaching this " +"value." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"Left scroll limit in pixels. The camera stops moving when reaching this " +"value." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"Right scroll limit in pixels. The camera stops moving when reaching this " +"value." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"If [code]true[/code], the camera smoothly stops when reaches its limits.\n" +"This property has no effect if [member smoothing_enabled] is [code]false[/" +"code].\n" +"[b]Note:[/b] To immediately update the camera's position to be within limits " +"without smoothing, even with this setting enabled, invoke [method " +"reset_smoothing]." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"Top scroll limit in pixels. The camera stops moving when reaching this value." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"The camera's offset, useful for looking around or camera shake animations." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"The horizontal offset of the camera, relative to the drag margins.\n" +"[b]Note:[/b] Offset H is used only to force offset relative to margins. It's " +"not updated in any way if drag margins are enabled and can be used to set " +"initial offset." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"The vertical offset of the camera, relative to the drag margins.\n" +"[b]Note:[/b] Used the same as [member offset_h]." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "The camera's process callback. See [enum Camera2DProcessMode]." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "If [code]true[/code], the camera view rotates with the target." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"If [code]true[/code], the camera smoothly moves towards the target at " +"[member smoothing_speed]." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"Speed in pixels per second of the camera's smoothing effect when [member " +"smoothing_enabled] is [code]true[/code]." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"The camera's zoom relative to the viewport. Values larger than " +"[code]Vector2(1, 1)[/code] zoom out and smaller values zoom in. For an " +"example, use [code]Vector2(0.5, 0.5)[/code] for a 2× zoom-in, and " +"[code]Vector2(4, 4)[/code] for a 4× zoom-out." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"The camera's position is fixed so that the top-left corner is always at the " +"origin." +msgstr "" + +#: doc/classes/Camera2D.xml +msgid "" +"The camera's position takes into account vertical/horizontal offsets and the " +"screen size." +msgstr "" + +#: doc/classes/Camera2D.xml doc/classes/ClippedCamera.xml +#: doc/classes/InterpolatedCamera.xml +msgid "The camera updates with the [code]_physics_process[/code] callback." +msgstr "" + +#: doc/classes/Camera2D.xml doc/classes/ClippedCamera.xml +#: doc/classes/InterpolatedCamera.xml +msgid "The camera updates with the [code]_process[/code] callback." +msgstr "" + +#: doc/classes/CameraFeed.xml +msgid "" +"A camera feed gives you access to a single physical camera attached to your " +"device." +msgstr "" + +#: doc/classes/CameraFeed.xml +msgid "" +"A camera feed gives you access to a single physical camera attached to your " +"device. When enabled, Godot will start capturing frames from the camera " +"which can then be used. See also [CameraServer].\n" +"[b]Note:[/b] Many cameras will return YCbCr images which are split into two " +"textures and need to be combined in a shader. Godot does this automatically " +"for you if you set the environment to show the camera image in the " +"background." +msgstr "" + +#: doc/classes/CameraFeed.xml +msgid "Returns the unique ID for this feed." +msgstr "" + +#: doc/classes/CameraFeed.xml +msgid "Returns the camera's name." +msgstr "" + +#: doc/classes/CameraFeed.xml +msgid "Returns the position of camera on the device." +msgstr "" + +#: doc/classes/CameraFeed.xml +msgid "If [code]true[/code], the feed is active." +msgstr "" + +#: doc/classes/CameraFeed.xml +msgid "The transform applied to the camera's image." +msgstr "" + +#: doc/classes/CameraFeed.xml +msgid "No image set for the feed." +msgstr "" + +#: doc/classes/CameraFeed.xml +msgid "Feed supplies RGB images." +msgstr "" + +#: doc/classes/CameraFeed.xml +msgid "Feed supplies YCbCr images that need to be converted to RGB." +msgstr "" + +#: doc/classes/CameraFeed.xml +msgid "" +"Feed supplies separate Y and CbCr images that need to be combined and " +"converted to RGB." +msgstr "" + +#: doc/classes/CameraFeed.xml +msgid "Unspecified position." +msgstr "" + +#: doc/classes/CameraFeed.xml +msgid "Camera is mounted at the front of the device." +msgstr "" + +#: doc/classes/CameraFeed.xml +msgid "Camera is mounted at the back of the device." +msgstr "" + +#: doc/classes/CameraServer.xml +msgid "Server keeping track of different cameras accessible in Godot." +msgstr "" + +#: doc/classes/CameraServer.xml +msgid "" +"The [CameraServer] keeps track of different cameras accessible in Godot. " +"These are external cameras such as webcams or the cameras on your phone.\n" +"It is notably used to provide AR modules with a video feed from the camera.\n" +"[b]Note:[/b] This class is currently only implemented on macOS and iOS. On " +"other platforms, no [CameraFeed]s will be available." +msgstr "" + +#: doc/classes/CameraServer.xml +msgid "Adds the camera [code]feed[/code] to the camera server." +msgstr "" + +#: doc/classes/CameraServer.xml +msgid "Returns an array of [CameraFeed]s." +msgstr "" + +#: doc/classes/CameraServer.xml +msgid "" +"Returns the [CameraFeed] corresponding to the camera with the given " +"[code]index[/code]." +msgstr "" + +#: doc/classes/CameraServer.xml +msgid "Returns the number of [CameraFeed]s registered." +msgstr "" + +#: doc/classes/CameraServer.xml +msgid "Removes the specified camera [code]feed[/code]." +msgstr "" + +#: doc/classes/CameraServer.xml +msgid "Emitted when a [CameraFeed] is added (e.g. a webcam is plugged in)." +msgstr "" + +#: doc/classes/CameraServer.xml +msgid "Emitted when a [CameraFeed] is removed (e.g. a webcam is unplugged)." +msgstr "" + +#: doc/classes/CameraServer.xml +msgid "The RGBA camera image." +msgstr "" + +#: doc/classes/CameraServer.xml +msgid "The [url=https://en.wikipedia.org/wiki/YCbCr]YCbCr[/url] camera image." +msgstr "" + +#: doc/classes/CameraServer.xml +msgid "The Y component camera image." +msgstr "" + +#: doc/classes/CameraServer.xml +msgid "The CbCr component camera image." +msgstr "" + +#: doc/classes/CameraTexture.xml +msgid "Texture provided by a [CameraFeed]." +msgstr "" + +#: doc/classes/CameraTexture.xml +msgid "" +"This texture gives access to the camera texture provided by a [CameraFeed].\n" +"[b]Note:[/b] Many cameras supply YCbCr images which need to be converted in " +"a shader." +msgstr "" + +#: doc/classes/CameraTexture.xml +msgid "The ID of the [CameraFeed] for which we want to display the image." +msgstr "" + +#: doc/classes/CameraTexture.xml +msgid "" +"Convenience property that gives access to the active property of the " +"[CameraFeed]." +msgstr "" + +#: doc/classes/CameraTexture.xml +msgid "" +"Which image within the [CameraFeed] we want access to, important if the " +"camera image is split in a Y and CbCr component." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "Base class of anything 2D." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Base class of anything 2D. Canvas items are laid out in a tree; children " +"inherit and extend their parent's transform. [CanvasItem] is extended by " +"[Control] for anything GUI-related, and by [Node2D] for anything related to " +"the 2D engine.\n" +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " +"drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" +"Canvas items are drawn in tree order. By default, children are on top of " +"their parents so a root [CanvasItem] will be drawn behind everything. This " +"behavior can be changed on a per-item basis.\n" +"A [CanvasItem] can also be hidden, which will also hide its children. It " +"provides many ways to change parameters such as modulation (for itself and " +"its children) and self modulation (only for itself), as well as its blend " +"mode.\n" +"Ultimately, a transform notification can be requested, which will notify the " +"node that its global position changed in case the parent tree changed.\n" +"[b]Note:[/b] Unless otherwise specified, all methods that have angle " +"parameters must have angles specified as [i]radians[/i]. To convert degrees " +"to radians, use [method @GDScript.deg2rad]." +msgstr "" + +#: doc/classes/CanvasItem.xml doc/classes/CanvasLayer.xml +#: doc/classes/InputEvent.xml doc/classes/Viewport.xml +msgid "Viewport and canvas transforms" +msgstr "" + +#: doc/classes/CanvasItem.xml doc/classes/Control.xml doc/classes/Node2D.xml +msgid "Custom drawing in 2D" +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Draws a unfilled arc between the given angles. The larger the value of " +"[code]point_count[/code], the smoother the curve. See also [method " +"draw_circle].\n" +"[b]Note:[/b] Line drawing is not accelerated by batching if " +"[code]antialiased[/code] is [code]true[/code].\n" +"[b]Note:[/b] Due to how it works, built-in antialiasing will not look " +"correct for translucent lines and may not work on certain platforms. As a " +"workaround, install the [url=https://github.com/godot-extended-libraries/" +"godot-antialiased-line2d]Antialiased Line2D[/url] add-on then create an " +"AntialiasedRegularPolygon2D node. That node relies on a texture with custom " +"mipmaps to perform antialiasing. 2D batching is also still supported with " +"those antialiased lines." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Draws a string character using a custom font. Returns the advance, depending " +"on the character width and kerning with an optional next character." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Draws a colored, filled circle. See also [method draw_arc], [method " +"draw_polyline] and [method draw_polygon].\n" +"[b]Note:[/b] Built-in antialiasing is not provided for [method draw_circle]. " +"As a workaround, install the [url=https://github.com/godot-extended-" +"libraries/godot-antialiased-line2d]Antialiased Line2D[/url] add-on then " +"create an AntialiasedRegularPolygon2D node. That node relies on a texture " +"with custom mipmaps to perform antialiasing." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Draws a colored polygon of any amount of points, convex or concave. Unlike " +"[method draw_polygon], a single color must be specified for the whole " +"polygon.\n" +"[b]Note:[/b] Due to how it works, built-in antialiasing will not look " +"correct for translucent polygons and may not work on certain platforms. As a " +"workaround, install the [url=https://github.com/godot-extended-libraries/" +"godot-antialiased-line2d]Antialiased Line2D[/url] add-on then create an " +"AntialiasedPolygon2D node. That node relies on a texture with custom mipmaps " +"to perform antialiasing." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Draws a line from a 2D point to another, with a given color and width. It " +"can be optionally antialiased. See also [method draw_multiline] and [method " +"draw_polyline].\n" +"[b]Note:[/b] Line drawing is not accelerated by batching if " +"[code]antialiased[/code] is [code]true[/code].\n" +"[b]Note:[/b] Due to how it works, built-in antialiasing will not look " +"correct for translucent lines and may not work on certain platforms. As a " +"workaround, install the [url=https://github.com/godot-extended-libraries/" +"godot-antialiased-line2d]Antialiased Line2D[/url] add-on then create an " +"AntialiasedLine2D node. That node relies on a texture with custom mipmaps to " +"perform antialiasing. 2D batching is also still supported with those " +"antialiased lines." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Draws a [Mesh] in 2D, using the provided texture. See [MeshInstance2D] for " +"related documentation." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Draws multiple disconnected lines with a uniform [code]color[/code]. When " +"drawing large amounts of lines, this is faster than using individual [method " +"draw_line] calls. To draw interconnected lines, use [method draw_polyline] " +"instead.\n" +"[b]Note:[/b] [code]width[/code] and [code]antialiased[/code] are currently " +"not implemented and have no effect. As a workaround, install the " +"[url=https://github.com/godot-extended-libraries/godot-antialiased-" +"line2d]Antialiased Line2D[/url] add-on then create an AntialiasedLine2D " +"node. That node relies on a texture with custom mipmaps to perform " +"antialiasing. 2D batching is also still supported with those antialiased " +"lines." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Draws multiple disconnected lines with a uniform [code]width[/code] and " +"segment-by-segment coloring. Colors assigned to line segments match by index " +"between [code]points[/code] and [code]colors[/code]. When drawing large " +"amounts of lines, this is faster than using individual [method draw_line] " +"calls. To draw interconnected lines, use [method draw_polyline_colors] " +"instead.\n" +"[b]Note:[/b] [code]width[/code] and [code]antialiased[/code] are currently " +"not implemented and have no effect. As a workaround, install the " +"[url=https://github.com/godot-extended-libraries/godot-antialiased-" +"line2d]Antialiased Line2D[/url] add-on then create an AntialiasedLine2D " +"node. That node relies on a texture with custom mipmaps to perform " +"antialiasing. 2D batching is also still supported with those antialiased " +"lines." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Draws a [MultiMesh] in 2D with the provided texture. See " +"[MultiMeshInstance2D] for related documentation." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Draws a solid polygon of any amount of points, convex or concave. Unlike " +"[method draw_colored_polygon], each point's color can be changed " +"individually. See also [method draw_polyline] and [method " +"draw_polyline_colors].\n" +"[b]Note:[/b] Due to how it works, built-in antialiasing will not look " +"correct for translucent polygons and may not work on certain platforms. As a " +"workaround, install the [url=https://github.com/godot-extended-libraries/" +"godot-antialiased-line2d]Antialiased Line2D[/url] add-on then create an " +"AntialiasedPolygon2D node. That node relies on a texture with custom mipmaps " +"to perform antialiasing." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Draws interconnected line segments with a uniform [code]color[/code] and " +"[code]width[/code] and optional antialiasing. When drawing large amounts of " +"lines, this is faster than using individual [method draw_line] calls. To " +"draw disconnected lines, use [method draw_multiline] instead. See also " +"[method draw_polygon].\n" +"[b]Note:[/b] Due to how it works, built-in antialiasing will not look " +"correct for translucent polygons and may not work on certain platforms. As a " +"workaround, install the [url=https://github.com/godot-extended-libraries/" +"godot-antialiased-line2d]Antialiased Line2D[/url] add-on then create an " +"AntialiasedPolygon2D node. That node relies on a texture with custom mipmaps " +"to perform antialiasing." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Draws interconnected line segments with a uniform [code]width[/code] and " +"segment-by-segment coloring, and optional antialiasing. Colors assigned to " +"line segments match by index between [code]points[/code] and [code]colors[/" +"code]. When drawing large amounts of lines, this is faster than using " +"individual [method draw_line] calls. To draw disconnected lines, use [method " +"draw_multiline_colors] instead. See also [method draw_polygon].\n" +"[b]Note:[/b] Due to how it works, built-in antialiasing will not look " +"correct for translucent polygons and may not work on certain platforms. As a " +"workaround, install the [url=https://github.com/godot-extended-libraries/" +"godot-antialiased-line2d]Antialiased Line2D[/url] add-on then create an " +"AntialiasedPolygon2D node. That node relies on a texture with custom mipmaps " +"to perform antialiasing." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Draws a custom primitive. 1 point for a point, 2 points for a line, 3 points " +"for a triangle, and 4 points for a quad. If 0 points or more than 4 points " +"are specified, nothing will be drawn and an error message will be printed. " +"See also [method draw_line], [method draw_polyline], [method draw_polygon], " +"and [method draw_rect]." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Draws a rectangle. If [code]filled[/code] is [code]true[/code], the " +"rectangle will be filled with the [code]color[/code] specified. If " +"[code]filled[/code] is [code]false[/code], the rectangle will be drawn as a " +"stroke with the [code]color[/code] and [code]width[/code] specified. If " +"[code]antialiased[/code] is [code]true[/code], the lines will attempt to " +"perform antialiasing using OpenGL line smoothing.\n" +"[b]Note:[/b] [code]width[/code] and [code]antialiased[/code] are only " +"effective if [code]filled[/code] is [code]false[/code].\n" +"[b]Note:[/b] Due to how it works, built-in antialiasing will not look " +"correct for translucent polygons and may not work on certain platforms. As a " +"workaround, install the [url=https://github.com/godot-extended-libraries/" +"godot-antialiased-line2d]Antialiased Line2D[/url] add-on then create an " +"AntialiasedPolygon2D node. That node relies on a texture with custom mipmaps " +"to perform antialiasing." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Sets a custom transform for drawing via components. Anything drawn " +"afterwards will be transformed by this." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Sets a custom transform for drawing via matrix. Anything drawn afterwards " +"will be transformed by this." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Draws [code]text[/code] using the specified [code]font[/code] at the " +"[code]position[/code] (bottom-left corner using the baseline of the font). " +"The text will have its color multiplied by [code]modulate[/code]. If " +"[code]clip_w[/code] is greater than or equal to 0, the text will be clipped " +"if it exceeds the specified width.\n" +"[b]Example using the default project font:[/b]\n" +"[codeblock]\n" +"# If using this method in a script that redraws constantly, move the\n" +"# `default_font` declaration to a member variable assigned in `_ready()`\n" +"# so the Control is only created once.\n" +"var default_font = Control.new().get_font(\"font\")\n" +"draw_string(default_font, Vector2(64, 64), \"Hello world\")\n" +"[/codeblock]\n" +"See also [method Font.draw]." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "Draws a styled rectangle." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "Draws a texture at a given position." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Draws a textured rectangle at a given position, optionally modulated by a " +"color. If [code]transpose[/code] is [code]true[/code], the texture will have " +"its X and Y coordinates swapped." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Draws a textured rectangle region at a given position, optionally modulated " +"by a color. If [code]transpose[/code] is [code]true[/code], the texture will " +"have its X and Y coordinates swapped." +msgstr "" + +#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +msgid "" +"Forces the transform to update. Transform changes in physics are not instant " +"for performance reasons. Transforms are accumulated and then set. Use this " +"if you need an up-to-date transform when doing physics operations." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "Returns the [RID] of the [World2D] canvas where this item is in." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "Returns the canvas item RID used by [VisualServer] for this item." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "Returns the transform matrix of this item's canvas." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Returns the mouse's position in the [CanvasLayer] that this [CanvasItem] is " +"in using the coordinate system of the [CanvasLayer]." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "Returns the global transform matrix of this item." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Returns the global transform matrix of this item in relation to the canvas." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Returns the mouse's position in this [CanvasItem] using the local coordinate " +"system of this [CanvasItem]." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "Returns the transform matrix of this item." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "Returns the viewport's boundaries as a [Rect2]." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "Returns this item's transform in relation to the viewport." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "Returns the [World2D] where this item is in." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Hide the [CanvasItem] if it's currently visible. This is equivalent to " +"setting [member visible] to [code]false[/code]." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Returns [code]true[/code] if local transform notifications are communicated " +"to children." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Returns [code]true[/code] if the node is set as top-level. See [method " +"set_as_toplevel]." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Returns [code]true[/code] if global transform notifications are communicated " +"to children." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree, and is consequently not drawn (see [method _draw])." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "Assigns [code]screen_point[/code] as this node's new local transform." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Transformations issued by [code]event[/code]'s inputs are applied in local " +"space instead of global space." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"If [code]enable[/code] is [code]true[/code], this [CanvasItem] will [i]not[/" +"i] inherit its transform from parent [CanvasItem]s. Its draw order will also " +"be changed to make it draw on top of other [CanvasItem]s that are not set as " +"top-level. The [CanvasItem] will effectively act as if it was placed as a " +"child of a bare [Node]. See also [method is_set_as_toplevel]." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"If [code]enable[/code] is [code]true[/code], this node will receive " +"[constant NOTIFICATION_LOCAL_TRANSFORM_CHANGED] when its local transform " +"changes." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"If [code]enable[/code] is [code]true[/code], this node will receive " +"[constant NOTIFICATION_TRANSFORM_CHANGED] when its global transform changes." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Show the [CanvasItem] if it's currently hidden. This is equivalent to " +"setting [member visible] to [code]true[/code]. For controls that inherit " +"[Popup], the correct way to make them visible is to call one of the multiple " +"[code]popup*()[/code] functions instead." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"The rendering layers in which this [CanvasItem] responds to [Light2D] nodes." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "The material applied to textures on this [CanvasItem]." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "The color applied to textures on this [CanvasItem]." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"The color applied to textures on this [CanvasItem]. This is not inherited by " +"children [CanvasItem]s." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "If [code]true[/code], the object draws behind its parent." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "If [code]true[/code], the object draws on top of its parent." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"If [code]true[/code], the parent [CanvasItem]'s [member material] property " +"is used as this one's material." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"If [code]true[/code], this [CanvasItem] is drawn. The node is only visible " +"if all of its antecedents are visible as well (in other words, [method " +"is_visible_in_tree] must return [code]true[/code]).\n" +"[b]Note:[/b] For controls that inherit [Popup], the correct way to make them " +"visible is to call one of the multiple [code]popup*()[/code] functions " +"instead." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "Emitted when becoming hidden." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Emitted when the item's [Rect2] boundaries (position or size) have changed, " +"or when an action is taking place that may have impacted these boundaries (e." +"g. changing [member Sprite.texture])." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "Emitted when the visibility (hidden/visible) changes." +msgstr "" + +#: doc/classes/CanvasItem.xml doc/classes/CanvasItemMaterial.xml +msgid "" +"Mix blending mode. Colors are assumed to be independent of the alpha " +"(opacity) value." +msgstr "" + +#: doc/classes/CanvasItem.xml doc/classes/CanvasItemMaterial.xml +msgid "Additive blending mode." +msgstr "" + +#: doc/classes/CanvasItem.xml doc/classes/CanvasItemMaterial.xml +msgid "Subtractive blending mode." +msgstr "" + +#: doc/classes/CanvasItem.xml doc/classes/CanvasItemMaterial.xml +msgid "Multiplicative blending mode." +msgstr "" + +#: doc/classes/CanvasItem.xml doc/classes/CanvasItemMaterial.xml +msgid "" +"Mix blending mode. Colors are assumed to be premultiplied by the alpha " +"(opacity) value." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"Disables blending mode. Colors including alpha are written as-is. Only " +"applicable for render targets with a transparent background. No lighting " +"will be applied." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"The [CanvasItem]'s global transform has changed. This notification is only " +"received if enabled by [method set_notify_transform]." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "" +"The [CanvasItem]'s local transform has changed. This notification is only " +"received if enabled by [method set_notify_local_transform]." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "The [CanvasItem] is requested to draw (see [method _draw])." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "The [CanvasItem]'s visibility has changed." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "The [CanvasItem] has entered the canvas." +msgstr "" + +#: doc/classes/CanvasItem.xml +msgid "The [CanvasItem] has exited the canvas." +msgstr "" + +#: doc/classes/CanvasItemMaterial.xml +msgid "A material for [CanvasItem]s." +msgstr "" + +#: doc/classes/CanvasItemMaterial.xml +msgid "" +"[CanvasItemMaterial]s provide a means of modifying the textures associated " +"with a CanvasItem. They specialize in describing blend and lighting " +"behaviors for textures. Use a [ShaderMaterial] to more fully customize a " +"material's interactions with a [CanvasItem]." +msgstr "" + +#: doc/classes/CanvasItemMaterial.xml +msgid "" +"The manner in which a material's rendering is applied to underlying textures." +msgstr "" + +#: doc/classes/CanvasItemMaterial.xml +msgid "The manner in which material reacts to lighting." +msgstr "" + +#: doc/classes/CanvasItemMaterial.xml +msgid "" +"The number of columns in the spritesheet assigned as [Texture] for a " +"[Particles2D] or [CPUParticles2D].\n" +"[b]Note:[/b] This property is only used and visible in the editor if [member " +"particles_animation] is [code]true[/code]." +msgstr "" + +#: doc/classes/CanvasItemMaterial.xml +msgid "" +"If [code]true[/code], the particles animation will loop.\n" +"[b]Note:[/b] This property is only used and visible in the editor if [member " +"particles_animation] is [code]true[/code]." +msgstr "" + +#: doc/classes/CanvasItemMaterial.xml +msgid "" +"The number of rows in the spritesheet assigned as [Texture] for a " +"[Particles2D] or [CPUParticles2D].\n" +"[b]Note:[/b] This property is only used and visible in the editor if [member " +"particles_animation] is [code]true[/code]." +msgstr "" + +#: doc/classes/CanvasItemMaterial.xml +msgid "" +"If [code]true[/code], enable spritesheet-based animation features when " +"assigned to [Particles2D] and [CPUParticles2D] nodes. The [member " +"ParticlesMaterial.anim_speed] or [member CPUParticles2D.anim_speed] should " +"also be set to a positive value for the animation to play.\n" +"This property (and other [code]particles_anim_*[/code] properties that " +"depend on it) has no effect on other types of nodes." +msgstr "" + +#: doc/classes/CanvasItemMaterial.xml +msgid "" +"Render the material using both light and non-light sensitive material " +"properties." +msgstr "" + +#: doc/classes/CanvasItemMaterial.xml +msgid "Render the material as if there were no light." +msgstr "" + +#: doc/classes/CanvasItemMaterial.xml +msgid "Render the material as if there were only light." +msgstr "" + +#: doc/classes/CanvasLayer.xml +msgid "Canvas drawing layer." +msgstr "" + +#: doc/classes/CanvasLayer.xml +msgid "" +"Canvas drawing layer. [CanvasItem] nodes that are direct or indirect " +"children of a [CanvasLayer] will be drawn in that layer. The layer is a " +"numeric index that defines the draw order. The default 2D scene renders with " +"index 0, so a [CanvasLayer] with index -1 will be drawn below, and one with " +"index 1 will be drawn above. This is very useful for HUDs (in layer 1+ or " +"above), or backgrounds (in layer -1 or below)." +msgstr "" + +#: doc/classes/CanvasLayer.xml +msgid "Canvas layers" +msgstr "" + +#: doc/classes/CanvasLayer.xml +msgid "Returns the RID of the canvas used by this layer." +msgstr "" + +#: doc/classes/CanvasLayer.xml +msgid "" +"Hides any [CanvasItem] under this [CanvasLayer]. This is equivalent to " +"setting [member visible] to [code]false[/code]." +msgstr "" + +#: doc/classes/CanvasLayer.xml +msgid "" +"Shows any [CanvasItem] under this [CanvasLayer]. This is equivalent to " +"setting [member visible] to [code]true[/code]." +msgstr "" + +#: doc/classes/CanvasLayer.xml +msgid "" +"The custom [Viewport] node assigned to the [CanvasLayer]. If [code]null[/" +"code], uses the default viewport instead." +msgstr "" + +#: doc/classes/CanvasLayer.xml +msgid "" +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " +"effect." +msgstr "" + +#: doc/classes/CanvasLayer.xml +msgid "" +"Scales the layer when using [member follow_viewport_enable]. Layers moving " +"into the foreground should have increasing scales, while layers moving into " +"the background should have decreasing scales." +msgstr "" + +#: doc/classes/CanvasLayer.xml +msgid "Layer index for draw order. Lower values are drawn first." +msgstr "" + +#: doc/classes/CanvasLayer.xml +msgid "The layer's base offset." +msgstr "" + +#: doc/classes/CanvasLayer.xml +msgid "The layer's rotation in radians." +msgstr "" + +#: doc/classes/CanvasLayer.xml +msgid "The layer's rotation in degrees." +msgstr "" + +#: doc/classes/CanvasLayer.xml +msgid "The layer's scale." +msgstr "" + +#: doc/classes/CanvasLayer.xml +msgid "The layer's transform." +msgstr "" + +#: doc/classes/CanvasLayer.xml +msgid "" +"If [code]false[/code], any [CanvasItem] under this [CanvasLayer] will be " +"hidden.\n" +"Unlike [member CanvasItem.visible], visibility of a [CanvasLayer] isn't " +"propagated to underlying layers." +msgstr "" + +#: doc/classes/CanvasLayer.xml +msgid "Emitted when visibility of the layer is changed. See [member visible]." +msgstr "" + +#: doc/classes/CanvasModulate.xml +msgid "Tint the entire canvas." +msgstr "" + +#: doc/classes/CanvasModulate.xml +msgid "" +"[CanvasModulate] tints the canvas elements using its assigned [member color]." +msgstr "" + +#: doc/classes/CanvasModulate.xml +msgid "The tint color to apply." +msgstr "" + +#: doc/classes/CapsuleMesh.xml +msgid "Class representing a capsule-shaped [PrimitiveMesh]." +msgstr "" + +#: doc/classes/CapsuleMesh.xml +msgid "" +"Height of the middle cylindrical part of the capsule (without the " +"hemispherical ends).\n" +"[b]Note:[/b] The capsule's total height is equal to [member mid_height] + 2 " +"* [member radius]." +msgstr "" + +#: doc/classes/CapsuleMesh.xml +msgid "Number of radial segments on the capsule mesh." +msgstr "" + +#: doc/classes/CapsuleMesh.xml +msgid "Radius of the capsule mesh." +msgstr "" + +#: doc/classes/CapsuleMesh.xml +msgid "Number of rings along the height of the capsule." +msgstr "" + +#: doc/classes/CapsuleShape.xml +msgid "Capsule shape for collisions." +msgstr "" + +#: doc/classes/CapsuleShape.xml doc/classes/CapsuleShape2D.xml +msgid "The capsule's height." +msgstr "" + +#: doc/classes/CapsuleShape.xml doc/classes/CapsuleShape2D.xml +msgid "The capsule's radius." +msgstr "" + +#: doc/classes/CapsuleShape2D.xml +msgid "Capsule shape for 2D collisions." +msgstr "" + +#: doc/classes/CenterContainer.xml +msgid "Keeps children controls centered." +msgstr "" + +#: doc/classes/CenterContainer.xml +msgid "" +"CenterContainer keeps children controls centered. This container keeps all " +"children to their minimum size, in the center." +msgstr "" + +#: doc/classes/CenterContainer.xml +msgid "" +"If [code]true[/code], centers children relative to the [CenterContainer]'s " +"top left corner." +msgstr "" + +#: doc/classes/CharFXTransform.xml +msgid "" +"Controls how an individual character will be displayed in a [RichTextEffect]." +msgstr "" + +#: doc/classes/CharFXTransform.xml +msgid "" +"By setting various properties on this object, you can control how individual " +"characters will be displayed in a [RichTextEffect]." +msgstr "" + +#: doc/classes/CharFXTransform.xml +msgid "" +"The index of the current character (starting from 0) for the " +"[RichTextLabel]'s BBCode text. Setting this property won't affect drawing." +msgstr "" + +#: doc/classes/CharFXTransform.xml +msgid "" +"The Unicode codepoint the character will use. This only affects non-" +"whitespace characters. [method @GDScript.ord] can be useful here. For " +"example, the following will replace all characters with asterisks:\n" +"[codeblock]\n" +"# `char_fx` is the CharFXTransform parameter from `_process_custom_fx()`.\n" +"# See the RichTextEffect documentation for details.\n" +"char_fx.character = ord(\"*\")\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/CharFXTransform.xml +msgid "The color the character will be drawn with." +msgstr "" + +#: doc/classes/CharFXTransform.xml +msgid "" +"The time elapsed since the [RichTextLabel] was added to the scene tree (in " +"seconds). Time stops when the [RichTextLabel] is paused (see [member Node." +"pause_mode]). Resets when the text in the [RichTextLabel] is changed.\n" +"[b]Note:[/b] Time still passes while the [RichTextLabel] is hidden." +msgstr "" + +#: doc/classes/CharFXTransform.xml +msgid "" +"Contains the arguments passed in the opening BBCode tag. By default, " +"arguments are strings; if their contents match a type such as [bool], [int] " +"or [float], they will be converted automatically. Color codes in the form " +"[code]#rrggbb[/code] or [code]#rgb[/code] will be converted to an opaque " +"[Color]. String arguments may not contain spaces, even if they're quoted. If " +"present, quotes will also be present in the final string.\n" +"For example, the opening BBCode tag [code][example foo=hello bar=true baz=42 " +"color=#ffffff][/code] will map to the following [Dictionary]:\n" +"[codeblock]\n" +"{\"foo\": \"hello\", \"bar\": true, \"baz\": 42, \"color\": Color(1, 1, 1, " +"1)}\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/CharFXTransform.xml +msgid "The position offset the character will be drawn with (in pixels)." +msgstr "" + +#: doc/classes/CharFXTransform.xml +msgid "" +"The index of the current character (starting from 0) for this " +"[RichTextEffect] custom block. Setting this property won't affect drawing." +msgstr "" + +#: doc/classes/CharFXTransform.xml +msgid "" +"If [code]true[/code], the character will be drawn. If [code]false[/code], " +"the character will be hidden. Characters around hidden characters will " +"reflow to take the space of hidden characters. If this is not desired, set " +"their [member color] to [code]Color(1, 1, 1, 0)[/code] instead." +msgstr "" + +#: doc/classes/CheckBox.xml +msgid "Binary choice user interface widget. See also [CheckButton]." +msgstr "" + +#: doc/classes/CheckBox.xml +msgid "" +"A checkbox allows the user to make a binary choice (choosing only one of two " +"possible options). It's similar to [CheckButton] in functionality, but it " +"has a different appearance. To follow established UX patterns, it's " +"recommended to use CheckBox when toggling it has [b]no[/b] immediate effect " +"on something. For instance, it should be used when toggling it will only do " +"something once a confirmation button is pressed.\n" +"See also [BaseButton] which contains common properties and methods " +"associated with this node." +msgstr "" + +#: doc/classes/CheckBox.xml +msgid "The [CheckBox] text's font color." +msgstr "" + +#: doc/classes/CheckBox.xml +msgid "The [CheckBox] text's font color when it's disabled." +msgstr "" + +#: doc/classes/CheckBox.xml +msgid "" +"The [CheckBox] text's font color when it's focused. Only replaces the normal " +"text color of the checkbox. Disabled, hovered, and pressed states take " +"precedence over this color." +msgstr "" + +#: doc/classes/CheckBox.xml +msgid "The [CheckBox] text's font color when it's hovered." +msgstr "" + +#: doc/classes/CheckBox.xml +msgid "The [CheckBox] text's font color when it's hovered and pressed." +msgstr "" + +#: doc/classes/CheckBox.xml +msgid "The [CheckBox] text's font color when it's pressed." +msgstr "" + +#: doc/classes/CheckBox.xml +msgid "The vertical offset used when rendering the check icons (in pixels)." +msgstr "" + +#: doc/classes/CheckBox.xml +msgid "The separation between the check icon and the text (in pixels)." +msgstr "" + +#: doc/classes/CheckBox.xml +msgid "The [Font] to use for the [CheckBox] text." +msgstr "" + +#: doc/classes/CheckBox.xml +msgid "The check icon to display when the [CheckBox] is checked." +msgstr "" + +#: doc/classes/CheckBox.xml +msgid "The check icon to display when the [CheckBox] is checked and disabled." +msgstr "" + +#: doc/classes/CheckBox.xml +msgid "" +"If the [CheckBox] is configured as a radio button, the icon to display when " +"the [CheckBox] is checked." +msgstr "" + +#: doc/classes/CheckBox.xml +msgid "" +"If the [CheckBox] is configured as a radio button, the icon to display when " +"the [CheckBox] is unchecked." +msgstr "" + +#: doc/classes/CheckBox.xml +msgid "The check icon to display when the [CheckBox] is unchecked." +msgstr "" + +#: doc/classes/CheckBox.xml +msgid "" +"The check icon to display when the [CheckBox] is unchecked and disabled." +msgstr "" + +#: doc/classes/CheckBox.xml +msgid "" +"The [StyleBox] to display as a background when the [CheckBox] is disabled." +msgstr "" + +#: doc/classes/CheckBox.xml +msgid "" +"The [StyleBox] to display as a background when the [CheckBox] is focused." +msgstr "" + +#: doc/classes/CheckBox.xml +msgid "" +"The [StyleBox] to display as a background when the [CheckBox] is hovered." +msgstr "" + +#: doc/classes/CheckBox.xml +msgid "" +"The [StyleBox] to display as a background when the [CheckBox] is hovered and " +"pressed." +msgstr "" + +#: doc/classes/CheckBox.xml doc/classes/CheckButton.xml +msgid "The [StyleBox] to display as a background." +msgstr "" + +#: doc/classes/CheckBox.xml +msgid "" +"The [StyleBox] to display as a background when the [CheckBox] is pressed." +msgstr "" + +#: doc/classes/CheckButton.xml +msgid "Checkable button. See also [CheckBox]." +msgstr "" + +#: doc/classes/CheckButton.xml +msgid "" +"CheckButton is a toggle button displayed as a check field. It's similar to " +"[CheckBox] in functionality, but it has a different appearance. To follow " +"established UX patterns, it's recommended to use CheckButton when toggling " +"it has an [b]immediate[/b] effect on something. For instance, it should be " +"used if toggling it enables/disables a setting without requiring the user to " +"press a confirmation button.\n" +"See also [BaseButton] which contains common properties and methods " +"associated with this node." +msgstr "" + +#: doc/classes/CheckButton.xml +msgid "The [CheckButton] text's font color." +msgstr "" + +#: doc/classes/CheckButton.xml +msgid "The [CheckButton] text's font color when it's disabled." +msgstr "" + +#: doc/classes/CheckButton.xml +msgid "" +"The [CheckButton] text's font color when it's focused. Only replaces the " +"normal text color of the button. Disabled, hovered, and pressed states take " +"precedence over this color." +msgstr "" + +#: doc/classes/CheckButton.xml +msgid "The [CheckButton] text's font color when it's hovered." +msgstr "" + +#: doc/classes/CheckButton.xml +msgid "The [CheckButton] text's font color when it's hovered and pressed." +msgstr "" + +#: doc/classes/CheckButton.xml +msgid "The [CheckButton] text's font color when it's pressed." +msgstr "" + +#: doc/classes/CheckButton.xml +msgid "The vertical offset used when rendering the toggle icons (in pixels)." +msgstr "" + +#: doc/classes/CheckButton.xml +msgid "The separation between the toggle icon and the text (in pixels)." +msgstr "" + +#: doc/classes/CheckButton.xml +msgid "The [Font] to use for the [CheckButton] text." +msgstr "" + +#: doc/classes/CheckButton.xml +msgid "The icon to display when the [CheckButton] is unchecked." +msgstr "" + +#: doc/classes/CheckButton.xml +msgid "The icon to display when the [CheckButton] is unchecked and disabled." +msgstr "" + +#: doc/classes/CheckButton.xml +msgid "The icon to display when the [CheckButton] is checked." +msgstr "" + +#: doc/classes/CheckButton.xml +msgid "The icon to display when the [CheckButton] is checked and disabled." +msgstr "" + +#: doc/classes/CheckButton.xml +msgid "" +"The [StyleBox] to display as a background when the [CheckButton] is disabled." +msgstr "" + +#: doc/classes/CheckButton.xml +msgid "" +"The [StyleBox] to display as a background when the [CheckButton] is focused." +msgstr "" + +#: doc/classes/CheckButton.xml +msgid "" +"The [StyleBox] to display as a background when the [CheckButton] is hovered." +msgstr "" + +#: doc/classes/CheckButton.xml +msgid "" +"The [StyleBox] to display as a background when the [CheckButton] is hovered " +"and pressed." +msgstr "" + +#: doc/classes/CheckButton.xml +msgid "" +"The [StyleBox] to display as a background when the [CheckButton] is pressed." +msgstr "" + +#: doc/classes/CircleShape2D.xml +msgid "Circular shape for 2D collisions." +msgstr "" + +#: doc/classes/CircleShape2D.xml +msgid "" +"Circular shape for 2D collisions. This shape is useful for modeling balls or " +"small characters and its collision detection with everything else is very " +"fast." +msgstr "" + +#: doc/classes/CircleShape2D.xml +msgid "The circle's radius." +msgstr "" + +#: doc/classes/ClassDB.xml +msgid "Class information repository." +msgstr "" + +#: doc/classes/ClassDB.xml +msgid "Provides access to metadata stored for every available class." +msgstr "" + +#: doc/classes/ClassDB.xml +msgid "" +"Returns [code]true[/code] if you can instance objects from the specified " +"[code]class[/code], [code]false[/code] in other case." +msgstr "" + +#: doc/classes/ClassDB.xml +msgid "Returns whether the specified [code]class[/code] is available or not." +msgstr "" + +#: doc/classes/ClassDB.xml +msgid "" +"Returns a category associated with the class for use in documentation and " +"the Asset Library. Debug mode required." +msgstr "" + +#: doc/classes/ClassDB.xml +msgid "" +"Returns an array with all the keys in [code]enum[/code] of [code]class[/" +"code] or its ancestry." +msgstr "" + +#: doc/classes/ClassDB.xml +msgid "" +"Returns an array with all the enums of [code]class[/code] or its ancestry." +msgstr "" + +#: doc/classes/ClassDB.xml +msgid "" +"Returns the value of the integer constant [code]name[/code] of [code]class[/" +"code] or its ancestry. Always returns 0 when the constant could not be found." +msgstr "" + +#: doc/classes/ClassDB.xml +msgid "" +"Returns which enum the integer constant [code]name[/code] of [code]class[/" +"code] or its ancestry belongs to." +msgstr "" + +#: doc/classes/ClassDB.xml +msgid "" +"Returns an array with the names all the integer constants of [code]class[/" +"code] or its ancestry." +msgstr "" + +#: doc/classes/ClassDB.xml +msgid "" +"Returns an array with all the methods of [code]class[/code] or its ancestry " +"if [code]no_inheritance[/code] is [code]false[/code]. Every element of the " +"array is a [Dictionary] with the following keys: [code]args[/code], " +"[code]default_args[/code], [code]flags[/code], [code]id[/code], [code]name[/" +"code], [code]return: (class_name, hint, hint_string, name, type, usage)[/" +"code].\n" +"[b]Note:[/b] In exported release builds the debug info is not available, so " +"the returned dictionaries will contain only method names." +msgstr "" + +#: doc/classes/ClassDB.xml +msgid "" +"Returns the value of [code]property[/code] of [code]class[/code] or its " +"ancestry." +msgstr "" + +#: doc/classes/ClassDB.xml +msgid "" +"Returns an array with all the properties of [code]class[/code] or its " +"ancestry if [code]no_inheritance[/code] is [code]false[/code]." +msgstr "" + +#: doc/classes/ClassDB.xml +msgid "" +"Returns the [code]signal[/code] data of [code]class[/code] or its ancestry. " +"The returned value is a [Dictionary] with the following keys: [code]args[/" +"code], [code]default_args[/code], [code]flags[/code], [code]id[/code], " +"[code]name[/code], [code]return: (class_name, hint, hint_string, name, type, " +"usage)[/code]." +msgstr "" + +#: doc/classes/ClassDB.xml +msgid "" +"Returns an array with all the signals of [code]class[/code] or its ancestry " +"if [code]no_inheritance[/code] is [code]false[/code]. Every element of the " +"array is a [Dictionary] as described in [method class_get_signal]." +msgstr "" + +#: doc/classes/ClassDB.xml +msgid "" +"Returns whether [code]class[/code] or its ancestry has an enum called " +"[code]name[/code] or not." +msgstr "" + +#: doc/classes/ClassDB.xml +msgid "" +"Returns whether [code]class[/code] or its ancestry has an integer constant " +"called [code]name[/code] or not." +msgstr "" + +#: doc/classes/ClassDB.xml +msgid "" +"Returns whether [code]class[/code] (or its ancestry if [code]no_inheritance[/" +"code] is [code]false[/code]) has a method called [code]method[/code] or not." +msgstr "" + +#: doc/classes/ClassDB.xml +msgid "" +"Returns whether [code]class[/code] or its ancestry has a signal called " +"[code]signal[/code] or not." +msgstr "" + +#: doc/classes/ClassDB.xml +msgid "" +"Sets [code]property[/code] value of [code]class[/code] to [code]value[/code]." +msgstr "" + +#: doc/classes/ClassDB.xml +msgid "Returns the names of all the classes available." +msgstr "" + +#: doc/classes/ClassDB.xml +msgid "" +"Returns the names of all the classes that directly or indirectly inherit " +"from [code]class[/code]." +msgstr "" + +#: doc/classes/ClassDB.xml +msgid "Returns the parent class of [code]class[/code]." +msgstr "" + +#: doc/classes/ClassDB.xml +msgid "Creates an instance of [code]class[/code]." +msgstr "" + +#: doc/classes/ClassDB.xml +msgid "Returns whether this [code]class[/code] is enabled or not." +msgstr "" + +#: doc/classes/ClassDB.xml +msgid "" +"Returns whether [code]inherits[/code] is an ancestor of [code]class[/code] " +"or not." +msgstr "" + +#: doc/classes/ClippedCamera.xml +msgid "A [Camera] that includes collision." +msgstr "" + +#: doc/classes/ClippedCamera.xml +msgid "" +"This node extends [Camera] to add collisions with [Area] and/or " +"[PhysicsBody] nodes. The camera cannot move through colliding objects." +msgstr "" + +#: doc/classes/ClippedCamera.xml +msgid "" +"Adds a collision exception so the camera does not collide with the specified " +"node." +msgstr "" + +#: doc/classes/ClippedCamera.xml +msgid "" +"Adds a collision exception so the camera does not collide with the specified " +"[RID]." +msgstr "" + +#: doc/classes/ClippedCamera.xml +msgid "Removes all collision exceptions." +msgstr "" + +#: doc/classes/ClippedCamera.xml +msgid "Returns the distance the camera has been offset due to a collision." +msgstr "" + +#: doc/classes/ClippedCamera.xml +msgid "" +"Returns [code]true[/code] if the specified bit index is on.\n" +"[b]Note:[/b] Bit indices range from 0-19." +msgstr "" + +#: doc/classes/ClippedCamera.xml +msgid "Removes a collision exception with the specified node." +msgstr "" + +#: doc/classes/ClippedCamera.xml +msgid "Removes a collision exception with the specified [RID]." +msgstr "" + +#: doc/classes/ClippedCamera.xml +msgid "" +"Sets the specified bit index to the [code]value[/code].\n" +"[b]Note:[/b] Bit indices range from 0-19." +msgstr "" + +#: doc/classes/ClippedCamera.xml +msgid "If [code]true[/code], the camera stops on contact with [Area]s." +msgstr "" + +#: doc/classes/ClippedCamera.xml +msgid "If [code]true[/code], the camera stops on contact with [PhysicsBody]s." +msgstr "" + +#: doc/classes/ClippedCamera.xml +msgid "" +"The camera's collision mask. Only objects in at least one collision layer " +"matching the mask will be detected. See [url=$DOCS_URL/tutorials/physics/" +"physics_introduction.html#collision-layers-and-masks]Collision layers and " +"masks[/url] in the documentation for more information." +msgstr "" + +#: doc/classes/ClippedCamera.xml +msgid "" +"The camera's collision margin. The camera can't get closer than this " +"distance to a colliding object." +msgstr "" + +#: doc/classes/ClippedCamera.xml +msgid "The camera's process callback. See [enum ProcessMode]." +msgstr "" + +#: doc/classes/CollisionObject.xml +msgid "Base node for collision objects." +msgstr "" + +#: doc/classes/CollisionObject.xml +msgid "" +"CollisionObject is the base class for physics objects. It can hold any " +"number of collision [Shape]s. Each shape must be assigned to a [i]shape " +"owner[/i]. The CollisionObject can have any number of shape owners. Shape " +"owners are not nodes and do not appear in the editor, but are accessible " +"through code using the [code]shape_owner_*[/code] methods." +msgstr "" + +#: doc/classes/CollisionObject.xml +msgid "" +"Receives unhandled [InputEvent]s. [code]position[/code] is the location in " +"world space of the mouse pointer on the surface of the shape with index " +"[code]shape_idx[/code] and [code]normal[/code] is the normal vector of the " +"surface at that point. Connect to the [signal input_event] signal to easily " +"pick up these events." +msgstr "" + +#: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml +msgid "" +"Creates a new shape owner for the given object. Returns [code]owner_id[/" +"code] of the new owner for future reference." +msgstr "" + +#: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml +msgid "" +"Returns whether or not the specified [code]bit[/code] of the [member " +"collision_layer] is set." +msgstr "" + +#: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml +msgid "" +"Returns whether or not the specified [code]bit[/code] of the [member " +"collision_mask] is set." +msgstr "" + +#: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml +#: doc/classes/Navigation2D.xml +msgid "Returns the object's [RID]." +msgstr "" + +#: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml +msgid "" +"Returns an [Array] of [code]owner_id[/code] identifiers. You can use these " +"ids in other methods that take [code]owner_id[/code] as an argument." +msgstr "" + +#: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml +msgid "If [code]true[/code], the shape owner and its shapes are disabled." +msgstr "" + +#: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml +msgid "Removes the given shape owner." +msgstr "" + +#: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml +msgid "" +"If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" +"code] in the [member collision_layer].\n" +"If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" +"code] in the [member collision_layer]." +msgstr "" + +#: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml +msgid "" +"If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" +"code] in the [member collision_mask].\n" +"If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" +"code] in the [member collision_mask]." +msgstr "" + +#: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml +msgid "Returns the [code]owner_id[/code] of the given shape." +msgstr "" + +#: doc/classes/CollisionObject.xml +msgid "Adds a [Shape] to the shape owner." +msgstr "" + +#: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml +msgid "Removes all shapes from the shape owner." +msgstr "" + +#: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml +msgid "Returns the parent object of the given shape owner." +msgstr "" + +#: doc/classes/CollisionObject.xml +msgid "Returns the [Shape] with the given id from the given shape owner." +msgstr "" + +#: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml +msgid "Returns the number of shapes the given shape owner contains." +msgstr "" + +#: doc/classes/CollisionObject.xml +msgid "" +"Returns the child index of the [Shape] with the given id from the given " +"shape owner." +msgstr "" + +#: doc/classes/CollisionObject.xml +msgid "Returns the shape owner's [Transform]." +msgstr "" + +#: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml +msgid "Removes a shape from the given shape owner." +msgstr "" + +#: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml +msgid "If [code]true[/code], disables the given shape owner." +msgstr "" + +#: doc/classes/CollisionObject.xml +msgid "Sets the [Transform] of the given shape owner." +msgstr "" + +#: doc/classes/CollisionObject.xml +msgid "" +"The physics layers this CollisionObject3D is in. Collision objects can exist " +"in one or more of 32 different layers. See also [member collision_mask].\n" +"[b]Note:[/b] A contact is detected if object A is in any of the layers that " +"object B scans, or object B is in any layers that object A scans. See " +"[url=$DOCS_URL/tutorials/physics/physics_introduction.html#collision-layers-" +"and-masks]Collision layers and masks[/url] in the documentation for more " +"information." +msgstr "" + +#: doc/classes/CollisionObject.xml +msgid "" +"The physics layers this CollisionObject3D scans. Collision objects can scan " +"one or more of 32 different layers. See also [member collision_layer].\n" +"[b]Note:[/b] A contact is detected if object A is in any of the layers that " +"object B scans, or object B is in any layers that object A scans. See " +"[url=$DOCS_URL/tutorials/physics/physics_introduction.html#collision-layers-" +"and-masks]Collision layers and masks[/url] in the documentation for more " +"information." +msgstr "" + +#: doc/classes/CollisionObject.xml +msgid "" +"If [code]true[/code], the [CollisionObject] will continue to receive input " +"events as the mouse is dragged across its shapes." +msgstr "" + +#: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml +msgid "" +"If [code]true[/code], this object is pickable. A pickable object can detect " +"the mouse pointer entering/leaving, and if the mouse is inside it, report " +"input events. Requires at least one [member collision_layer] bit to be set." +msgstr "" + +#: doc/classes/CollisionObject.xml +msgid "" +"Emitted when the object receives an unhandled [InputEvent]. [code]position[/" +"code] is the location in world space of the mouse pointer on the surface of " +"the shape with index [code]shape_idx[/code] and [code]normal[/code] is the " +"normal vector of the surface at that point." +msgstr "" + +#: doc/classes/CollisionObject.xml +msgid "Emitted when the mouse pointer enters any of this object's shapes." +msgstr "" + +#: doc/classes/CollisionObject.xml +msgid "Emitted when the mouse pointer exits all this object's shapes." +msgstr "" + +#: doc/classes/CollisionObject2D.xml +msgid "Base node for 2D collision objects." +msgstr "" + +#: doc/classes/CollisionObject2D.xml +msgid "" +"CollisionObject2D is the base class for 2D physics objects. It can hold any " +"number of 2D collision [Shape2D]s. Each shape must be assigned to a [i]shape " +"owner[/i]. The CollisionObject2D can have any number of shape owners. Shape " +"owners are not nodes and do not appear in the editor, but are accessible " +"through code using the [code]shape_owner_*[/code] methods.\n" +"[b]Note:[/b] Only collisions between objects within the same canvas " +"([Viewport] canvas or [CanvasLayer]) are supported. The behavior of " +"collisions between objects in different canvases is undefined." +msgstr "" + +#: doc/classes/CollisionObject2D.xml +msgid "" +"Accepts unhandled [InputEvent]s. Requires [member input_pickable] to be " +"[code]true[/code]. [code]shape_idx[/code] is the child index of the clicked " +"[Shape2D]. Connect to the [code]input_event[/code] signal to easily pick up " +"these events." +msgstr "" + +#: doc/classes/CollisionObject2D.xml +msgid "" +"Returns the [code]one_way_collision_margin[/code] of the shape owner " +"identified by given [code]owner_id[/code]." +msgstr "" + +#: doc/classes/CollisionObject2D.xml +msgid "" +"Returns [code]true[/code] if collisions for the shape owner originating from " +"this [CollisionObject2D] will not be reported to collided with " +"[CollisionObject2D]s." +msgstr "" + +#: doc/classes/CollisionObject2D.xml +msgid "Adds a [Shape2D] to the shape owner." +msgstr "" + +#: doc/classes/CollisionObject2D.xml +msgid "Returns the [Shape2D] with the given id from the given shape owner." +msgstr "" + +#: doc/classes/CollisionObject2D.xml +msgid "" +"Returns the child index of the [Shape2D] with the given id from the given " +"shape owner." +msgstr "" + +#: doc/classes/CollisionObject2D.xml +msgid "Returns the shape owner's [Transform2D]." +msgstr "" + +#: doc/classes/CollisionObject2D.xml +msgid "" +"If [code]enable[/code] is [code]true[/code], collisions for the shape owner " +"originating from this [CollisionObject2D] will not be reported to collided " +"with [CollisionObject2D]s." +msgstr "" + +#: doc/classes/CollisionObject2D.xml +msgid "" +"Sets the [code]one_way_collision_margin[/code] of the shape owner identified " +"by given [code]owner_id[/code] to [code]margin[/code] pixels." +msgstr "" + +#: doc/classes/CollisionObject2D.xml +msgid "Sets the [Transform2D] of the given shape owner." +msgstr "" + +#: doc/classes/CollisionObject2D.xml +msgid "" +"The physics layers this CollisionObject2D is in. Collision objects can exist " +"in one or more of 32 different layers. See also [member collision_mask].\n" +"[b]Note:[/b] A contact is detected if object A is in any of the layers that " +"object B scans, or object B is in any layers that object A scans. See " +"[url=$DOCS_URL/tutorials/physics/physics_introduction.html#collision-layers-" +"and-masks]Collision layers and masks[/url] in the documentation for more " +"information." +msgstr "" + +#: doc/classes/CollisionObject2D.xml +msgid "" +"The physics layers this CollisionObject2D scans. Collision objects can scan " +"one or more of 32 different layers. See also [member collision_layer].\n" +"[b]Note:[/b] A contact is detected if object A is in any of the layers that " +"object B scans, or object B is in any layers that object A scans. See " +"[url=$DOCS_URL/tutorials/physics/physics_introduction.html#collision-layers-" +"and-masks]Collision layers and masks[/url] in the documentation for more " +"information." +msgstr "" + +#: doc/classes/CollisionObject2D.xml +msgid "" +"Emitted when an input event occurs. Requires [member input_pickable] to be " +"[code]true[/code] and at least one [code]collision_layer[/code] bit to be " +"set. See [method _input_event] for details." +msgstr "" + +#: doc/classes/CollisionObject2D.xml +msgid "" +"Emitted when the mouse pointer enters any of this object's shapes. Requires " +"[member input_pickable] to be [code]true[/code] and at least one " +"[code]collision_layer[/code] bit to be set." +msgstr "" + +#: doc/classes/CollisionObject2D.xml +msgid "" +"Emitted when the mouse pointer exits all this object's shapes. Requires " +"[member input_pickable] to be [code]true[/code] and at least one " +"[code]collision_layer[/code] bit to be set." +msgstr "" + +#: doc/classes/CollisionPolygon.xml +msgid "Editor-only class for defining a collision polygon in 3D space." +msgstr "" + +#: doc/classes/CollisionPolygon.xml +msgid "" +"Allows editing a collision polygon's vertices on a selected plane. Can also " +"set a depth perpendicular to that plane. This class is only available in the " +"editor. It will not appear in the scene tree at run-time. Creates a [Shape] " +"for gameplay. Properties modified during gameplay will have no effect." +msgstr "" + +#: doc/classes/CollisionPolygon.xml +msgid "" +"Length that the resulting collision extends in either direction " +"perpendicular to its polygon." +msgstr "" + +#: doc/classes/CollisionPolygon.xml +msgid "If [code]true[/code], no collision will be produced." +msgstr "" + +#: doc/classes/CollisionPolygon.xml +msgid "" +"The collision margin for the generated [Shape]. See [member Shape.margin] " +"for more details." +msgstr "" + +#: doc/classes/CollisionPolygon.xml +msgid "" +"Array of vertices which define the polygon.\n" +"[b]Note:[/b] The returned value is a copy of the original. Methods which " +"mutate the size or properties of the return value will not impact the " +"original polygon. To change properties of the polygon, assign it to a " +"temporary variable and make changes before reassigning the [code]polygon[/" +"code] member." +msgstr "" + +#: doc/classes/CollisionPolygon2D.xml +msgid "Defines a 2D collision polygon." +msgstr "" + +#: doc/classes/CollisionPolygon2D.xml +msgid "" +"Provides a 2D collision polygon to a [CollisionObject2D] parent. Polygons " +"can be drawn in the editor or specified by a list of vertices." +msgstr "" + +#: doc/classes/CollisionPolygon2D.xml +msgid "Collision build mode. Use one of the [enum BuildMode] constants." +msgstr "" + +#: doc/classes/CollisionPolygon2D.xml +msgid "If [code]true[/code], no collisions will be detected." +msgstr "" + +#: doc/classes/CollisionPolygon2D.xml +msgid "" +"If [code]true[/code], only edges that face up, relative to " +"[CollisionPolygon2D]'s rotation, will collide with other objects.\n" +"[b]Note:[/b] This property has no effect if this [CollisionPolygon2D] is a " +"child of an [Area2D] node." +msgstr "" + +#: doc/classes/CollisionPolygon2D.xml +msgid "" +"The margin used for one-way collision (in pixels). Higher values will make " +"the shape thicker, and work better for colliders that enter the polygon at a " +"high velocity." +msgstr "" + +#: doc/classes/CollisionPolygon2D.xml +msgid "" +"The polygon's list of vertices. The final point will be connected to the " +"first. The returned value is a clone of the [PoolVector2Array], not a " +"reference." +msgstr "" + +#: doc/classes/CollisionPolygon2D.xml +msgid "Collisions will include the polygon and its contained area." +msgstr "" + +#: doc/classes/CollisionPolygon2D.xml +msgid "Collisions will only include the polygon edges." +msgstr "" + +#: doc/classes/CollisionShape.xml +msgid "Node that represents collision shape data in 3D space." +msgstr "" + +#: doc/classes/CollisionShape.xml +msgid "" +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." +msgstr "" + +#: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml +#: doc/classes/Physics2DDirectBodyState.xml +#: doc/classes/Physics2DDirectSpaceState.xml +#: doc/classes/PhysicsDirectBodyState.xml +#: doc/classes/PhysicsDirectSpaceState.xml doc/classes/RigidBody.xml +msgid "Physics introduction" +msgstr "" + +#: doc/classes/CollisionShape.xml +msgid "" +"Sets the collision shape's shape to the addition of all its convexed " +"[MeshInstance] siblings geometry." +msgstr "" + +#: doc/classes/CollisionShape.xml +msgid "" +"If this method exists within a script it will be called whenever the shape " +"resource has been modified." +msgstr "" + +#: doc/classes/CollisionShape.xml +msgid "A disabled collision shape has no effect in the world." +msgstr "" + +#: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml +msgid "The actual shape owned by this collision shape." +msgstr "" + +#: doc/classes/CollisionShape2D.xml +msgid "Node that represents collision shape data in 2D space." +msgstr "" + +#: doc/classes/CollisionShape2D.xml +msgid "" +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." +msgstr "" + +#: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml +#: doc/classes/RectangleShape2D.xml doc/classes/TileMap.xml +#: doc/classes/TileSet.xml +msgid "2D Kinematic Character Demo" +msgstr "" + +#: doc/classes/CollisionShape2D.xml +msgid "" +"A disabled collision shape has no effect in the world. This property should " +"be changed with [method Object.set_deferred]." +msgstr "" + +#: doc/classes/CollisionShape2D.xml +msgid "" +"Sets whether this collision shape should only detect collision on one side " +"(top or bottom).\n" +"[b]Note:[/b] This property has no effect if this [CollisionShape2D] is a " +"child of an [Area2D] node." +msgstr "" + +#: doc/classes/CollisionShape2D.xml +msgid "" +"The margin used for one-way collision (in pixels). Higher values will make " +"the shape thicker, and work better for colliders that enter the shape at a " +"high velocity." +msgstr "" + +#: doc/classes/Color.xml +msgid "Color in RGBA format using floats on the range of 0 to 1." +msgstr "" + +#: doc/classes/Color.xml +msgid "" +"A color represented by red, green, blue, and alpha (RGBA) components. The " +"alpha component is often used for opacity. Values are in floating-point and " +"usually range from 0 to 1. Some properties (such as CanvasItem.modulate) may " +"accept values greater than 1 (overbright or HDR colors).\n" +"You can also create a color from standardized color names by using [method " +"@GDScript.ColorN] or directly using the color constants defined here. The " +"standardized color set is based on the [url=https://en.wikipedia.org/wiki/" +"X11_color_names]X11 color names[/url].\n" +"If you want to supply values in a range of 0 to 255, you should use [method " +"@GDScript.Color8].\n" +"[b]Note:[/b] In a boolean context, a Color will evaluate to [code]false[/" +"code] if it's equal to [code]Color(0, 0, 0, 1)[/code] (opaque black). " +"Otherwise, a Color will always evaluate to [code]true[/code].\n" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/" +"color_constants.png]Color constants cheatsheet[/url]" +msgstr "" + +#: doc/classes/Color.xml doc/classes/ColorPickerButton.xml +msgid "2D GD Paint Demo" +msgstr "" + +#: doc/classes/Color.xml doc/classes/ColorPicker.xml +msgid "Tween Demo" +msgstr "" + +#: doc/classes/Color.xml doc/classes/ColorPickerButton.xml +msgid "GUI Drag And Drop Demo" +msgstr "" + +#: doc/classes/Color.xml +msgid "" +"Constructs a color from an HTML hexadecimal color string in ARGB or RGB " +"format. See also [method @GDScript.ColorN].\n" +"[codeblock]\n" +"# Each of the following creates the same color RGBA(178, 217, 10, 255).\n" +"var c1 = Color(\"#ffb2d90a\") # ARGB format with \"#\".\n" +"var c2 = Color(\"ffb2d90a\") # ARGB format.\n" +"var c3 = Color(\"#b2d90a\") # RGB format with \"#\".\n" +"var c4 = Color(\"b2d90a\") # RGB format.\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml +msgid "" +"Constructs a color from a 32-bit integer in RGBA format (each byte " +"represents a color channel).\n" +"[codeblock]\n" +"var color = Color(274) # Similar to Color(0.0, 0.0, 0.004, 0.07)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml +msgid "" +"Constructs a color from RGB values, typically between 0 and 1. Alpha will be " +"1.\n" +"[codeblock]\n" +"var color = Color(0.2, 1.0, 0.7) # Similar to Color8(51, 255, 178, 255)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml +msgid "" +"Constructs a color from RGBA values, typically between 0 and 1.\n" +"[codeblock]\n" +"var color = Color(0.2, 1.0, 0.7, 0.8) # Similar to Color8(51, 255, 178, " +"204)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml +msgid "" +"Returns a new color resulting from blending this color over another. If the " +"color is opaque, the result is also opaque. The second color may have a " +"range of alpha values.\n" +"[codeblock]\n" +"var bg = Color(0.0, 1.0, 0.0, 0.5) # Green with alpha of 50%\n" +"var fg = Color(1.0, 0.0, 0.0, 0.5) # Red with alpha of 50%\n" +"var blended_color = bg.blend(fg) # Brown with alpha of 75%\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml +msgid "" +"Returns the most contrasting color.\n" +"[codeblock]\n" +"var color = Color(0.3, 0.4, 0.9)\n" +"var contrasted_color = color.contrasted() # Equivalent to RGBA(204, 229, " +"102, 255)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml +msgid "" +"Returns a new color resulting from making this color darker by the specified " +"percentage (ratio from 0 to 1).\n" +"[codeblock]\n" +"var green = Color(0.0, 1.0, 0.0)\n" +"var darkgreen = green.darkened(0.2) # 20% darker than regular green\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml +msgid "" +"Constructs a color from an HSV profile. [code]h[/code], [code]s[/code], and " +"[code]v[/code] are values between 0 and 1.\n" +"[codeblock]\n" +"var color = Color.from_hsv(0.58, 0.5, 0.79, 0.8) # Equivalent to HSV(210, " +"50, 79, 0.8) or Color8(100, 151, 201, 0.8)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml +msgid "" +"Returns the luminance of the color in the [code][0.0, 1.0][/code] range.\n" +"This is useful when determining light or dark color. Colors with a luminance " +"smaller than 0.5 can be generally considered dark." +msgstr "" + +#: doc/classes/Color.xml +msgid "" +"Returns the color's grayscale representation.\n" +"The gray value is calculated as [code](r + g + b) / 3[/code].\n" +"[codeblock]\n" +"var color = Color(0.2, 0.45, 0.82)\n" +"var gray = color.gray() # A value of 0.466667\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml +msgid "" +"Returns the inverted color [code](1 - r, 1 - g, 1 - b, a)[/code].\n" +"[codeblock]\n" +"var color = Color(0.3, 0.4, 0.9)\n" +"var inverted_color = color.inverted() # Equivalent to Color(0.7, 0.6, 0.1)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml +msgid "" +"Returns [code]true[/code] if this color and [code]color[/code] are " +"approximately equal, by running [method @GDScript.is_equal_approx] on each " +"component." +msgstr "" + +#: doc/classes/Color.xml +msgid "" +"Returns a new color resulting from making this color lighter by the " +"specified percentage (ratio from 0 to 1).\n" +"[codeblock]\n" +"var green = Color(0.0, 1.0, 0.0)\n" +"var lightgreen = green.lightened(0.2) # 20% lighter than regular green\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml +msgid "" +"Returns the linear interpolation with another color. The interpolation " +"factor [code]weight[/code] is between 0 and 1.\n" +"[codeblock]\n" +"var c1 = Color(1.0, 0.0, 0.0)\n" +"var c2 = Color(0.0, 1.0, 0.0)\n" +"var li_c = c1.linear_interpolate(c2, 0.5) # Equivalent to Color(0.5, 0.5, " +"0.0)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml +msgid "" +"Returns the color converted to a 32-bit integer in ABGR format (each byte " +"represents a color channel). ABGR is the reversed version of the default " +"format.\n" +"[codeblock]\n" +"var color = Color(1, 0.5, 0.2)\n" +"print(color.to_abgr32()) # Prints 4281565439\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml +msgid "" +"Returns the color converted to a 64-bit integer in ABGR format (each word " +"represents a color channel). ABGR is the reversed version of the default " +"format.\n" +"[codeblock]\n" +"var color = Color(1, 0.5, 0.2)\n" +"print(color.to_abgr64()) # Prints -225178692812801\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml +msgid "" +"Returns the color converted to a 32-bit integer in ARGB format (each byte " +"represents a color channel). ARGB is more compatible with DirectX.\n" +"[codeblock]\n" +"var color = Color(1, 0.5, 0.2)\n" +"print(color.to_argb32()) # Prints 4294934323\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml +msgid "" +"Returns the color converted to a 64-bit integer in ARGB format (each word " +"represents a color channel). ARGB is more compatible with DirectX.\n" +"[codeblock]\n" +"var color = Color(1, 0.5, 0.2)\n" +"print(color.to_argb64()) # Prints -2147470541\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml +msgid "" +"Returns the color's HTML hexadecimal color string in ARGB format (ex: " +"[code]ff34f822[/code]).\n" +"Setting [code]with_alpha[/code] to [code]false[/code] excludes alpha from " +"the hexadecimal string.\n" +"[codeblock]\n" +"var color = Color(1, 1, 1, 0.5)\n" +"var s1 = color.to_html() # Returns \"7fffffff\"\n" +"var s2 = color.to_html(false) # Returns \"ffffff\"\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml +msgid "" +"Returns the color converted to a 32-bit integer in RGBA format (each byte " +"represents a color channel). RGBA is Godot's default format.\n" +"[codeblock]\n" +"var color = Color(1, 0.5, 0.2)\n" +"print(color.to_rgba32()) # Prints 4286526463\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml +msgid "" +"Returns the color converted to a 64-bit integer in RGBA format (each word " +"represents a color channel). RGBA is Godot's default format.\n" +"[codeblock]\n" +"var color = Color(1, 0.5, 0.2)\n" +"print(color.to_rgba64()) # Prints -140736629309441\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml +msgid "" +"The color's alpha component, typically on the range of 0 to 1. A value of 0 " +"means that the color is fully transparent. A value of 1 means that the color " +"is fully opaque." +msgstr "" + +#: doc/classes/Color.xml +msgid "Wrapper for [member a] that uses the range 0 to 255 instead of 0 to 1." +msgstr "" + +#: doc/classes/Color.xml +msgid "The color's blue component, typically on the range of 0 to 1." +msgstr "" + +#: doc/classes/Color.xml +msgid "Wrapper for [member b] that uses the range 0 to 255 instead of 0 to 1." +msgstr "" + +#: doc/classes/Color.xml +msgid "The color's green component, typically on the range of 0 to 1." +msgstr "" + +#: doc/classes/Color.xml +msgid "Wrapper for [member g] that uses the range 0 to 255 instead of 0 to 1." +msgstr "" + +#: doc/classes/Color.xml +msgid "The HSV hue of this color, on the range 0 to 1." +msgstr "" + +#: doc/classes/Color.xml +msgid "The color's red component, typically on the range of 0 to 1." +msgstr "" + +#: doc/classes/Color.xml +msgid "Wrapper for [member r] that uses the range 0 to 255 instead of 0 to 1." +msgstr "" + +#: doc/classes/Color.xml +msgid "The HSV saturation of this color, on the range 0 to 1." +msgstr "" + +#: doc/classes/Color.xml +msgid "The HSV value (brightness) of this color, on the range 0 to 1." +msgstr "" + +#: doc/classes/Color.xml +msgid "Alice blue color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Antique white color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Aqua color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Aquamarine color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Azure color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Beige color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Bisque color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Black color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Blanche almond color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Blue color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Blue violet color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Brown color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Burly wood color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Cadet blue color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Chartreuse color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Chocolate color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Coral color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Cornflower color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Corn silk color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Crimson color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Cyan color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Dark blue color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Dark cyan color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Dark goldenrod color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Dark gray color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Dark green color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Dark khaki color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Dark magenta color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Dark olive green color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Dark orange color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Dark orchid color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Dark red color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Dark salmon color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Dark sea green color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Dark slate blue color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Dark slate gray color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Dark turquoise color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Dark violet color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Deep pink color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Deep sky blue color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Dim gray color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Dodger blue color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Firebrick color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Floral white color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Forest green color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Fuchsia color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Gainsboro color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Ghost white color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Gold color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Goldenrod color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Gray color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Green color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Green yellow color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Honeydew color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Hot pink color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Indian red color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Indigo color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Ivory color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Khaki color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Lavender color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Lavender blush color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Lawn green color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Lemon chiffon color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Light blue color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Light coral color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Light cyan color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Light goldenrod color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Light gray color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Light green color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Light pink color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Light salmon color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Light sea green color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Light sky blue color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Light slate gray color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Light steel blue color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Light yellow color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Lime color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Lime green color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Linen color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Magenta color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Maroon color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Medium aquamarine color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Medium blue color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Medium orchid color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Medium purple color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Medium sea green color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Medium slate blue color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Medium spring green color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Medium turquoise color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Medium violet red color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Midnight blue color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Mint cream color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Misty rose color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Moccasin color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Navajo white color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Navy blue color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Old lace color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Olive color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Olive drab color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Orange color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Orange red color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Orchid color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Pale goldenrod color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Pale green color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Pale turquoise color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Pale violet red color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Papaya whip color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Peach puff color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Peru color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Pink color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Plum color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Powder blue color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Purple color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Rebecca purple color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Red color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Rosy brown color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Royal blue color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Saddle brown color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Salmon color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Sandy brown color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Sea green color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Seashell color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Sienna color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Silver color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Sky blue color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Slate blue color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Slate gray color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Snow color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Spring green color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Steel blue color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Tan color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Teal color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Thistle color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Tomato color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Transparent color (white with no alpha)." +msgstr "" + +#: doc/classes/Color.xml +msgid "Turquoise color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Violet color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Web gray color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Web green color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Web maroon color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Web purple color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Wheat color." +msgstr "" + +#: doc/classes/Color.xml +msgid "White color." +msgstr "" + +#: doc/classes/Color.xml +msgid "White smoke color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Yellow color." +msgstr "" + +#: doc/classes/Color.xml +msgid "Yellow green color." +msgstr "" + +#: doc/classes/ColorPicker.xml +msgid "Color picker control." +msgstr "" + +#: doc/classes/ColorPicker.xml +msgid "" +"Displays a color picker widget. Useful for selecting a color from an RGB/" +"RGBA colorspace.\n" +"[b]Note:[/b] This control is the color picker widget itself. You can use a " +"[ColorPickerButton] instead if you need a button that brings up a " +"[ColorPicker] in a pop-up." +msgstr "" + +#: doc/classes/ColorPicker.xml +msgid "" +"Adds the given color to a list of color presets. The presets are displayed " +"in the color picker and the user will be able to select them.\n" +"[b]Note:[/b] The presets list is only for [i]this[/i] color picker." +msgstr "" + +#: doc/classes/ColorPicker.xml +msgid "" +"Removes the given color from the list of color presets of this color picker." +msgstr "" + +#: doc/classes/ColorPicker.xml +msgid "Returns the list of colors in the presets of the color picker." +msgstr "" + +#: doc/classes/ColorPicker.xml doc/classes/ColorPickerButton.xml +msgid "The currently selected color." +msgstr "" + +#: doc/classes/ColorPicker.xml +msgid "" +"If [code]true[/code], the color will apply only after the user releases the " +"mouse button, otherwise it will apply immediately even in mouse motion event " +"(which can cause performance issues)." +msgstr "" + +#: doc/classes/ColorPicker.xml +msgid "If [code]true[/code], shows an alpha channel slider (opacity)." +msgstr "" + +#: doc/classes/ColorPicker.xml +msgid "" +"If [code]true[/code], allows editing the color with Hue/Saturation/Value " +"sliders.\n" +"[b]Note:[/b] Cannot be enabled if raw mode is on." +msgstr "" + +#: doc/classes/ColorPicker.xml +msgid "If [code]true[/code], the \"add preset\" button is enabled." +msgstr "" + +#: doc/classes/ColorPicker.xml +msgid "If [code]true[/code], saved color presets are visible." +msgstr "" + +#: doc/classes/ColorPicker.xml +msgid "" +"If [code]true[/code], allows the color R, G, B component values to go beyond " +"1.0, which can be used for certain special operations that require it (like " +"tinting without darkening or rendering sprites in HDR).\n" +"[b]Note:[/b] Cannot be enabled if HSV mode is on." +msgstr "" + +#: doc/classes/ColorPicker.xml +msgid "Emitted when the color is changed." +msgstr "" + +#: doc/classes/ColorPicker.xml +msgid "Emitted when a preset is added." +msgstr "" + +#: doc/classes/ColorPicker.xml +msgid "Emitted when a preset is removed." +msgstr "" + +#: doc/classes/ColorPicker.xml +msgid "The width of the hue selection slider." +msgstr "" + +#: doc/classes/ColorPicker.xml +msgid "The margin around the [ColorPicker]." +msgstr "" + +#: doc/classes/ColorPicker.xml +msgid "The height of the saturation-value selection box." +msgstr "" + +#: doc/classes/ColorPicker.xml +msgid "The width of the saturation-value selection box." +msgstr "" + +#: doc/classes/ColorPicker.xml +msgid "The icon for the \"Add Preset\" button." +msgstr "" + +#: doc/classes/ColorPicker.xml +msgid "Custom texture for the hue selection slider on the right." +msgstr "" + +#: doc/classes/ColorPicker.xml +msgid "" +"The indicator used to signalize that the color value is outside the 0-1 " +"range." +msgstr "" + +#: doc/classes/ColorPicker.xml +msgid "The icon for the screen color picker button." +msgstr "" + +#: doc/classes/ColorPickerButton.xml +msgid "Button that pops out a [ColorPicker]." +msgstr "" + +#: doc/classes/ColorPickerButton.xml +msgid "" +"Encapsulates a [ColorPicker] making it accessible by pressing a button. " +"Pressing the button will toggle the [ColorPicker] visibility.\n" +"See also [BaseButton] which contains common properties and methods " +"associated with this node.\n" +"[b]Note:[/b] By default, the button may not be wide enough for the color " +"preview swatch to be visible. Make sure to set [member Control." +"rect_min_size] to a big enough value to give the button enough space." +msgstr "" + +#: doc/classes/ColorPickerButton.xml +msgid "" +"Returns the [ColorPicker] that this node toggles.\n" +"[b]Warning:[/b] This is a required internal node, removing and freeing it " +"may cause a crash. If you wish to hide it or any of its children, use their " +"[member CanvasItem.visible] property." +msgstr "" + +#: doc/classes/ColorPickerButton.xml +msgid "" +"Returns the control's [PopupPanel] which allows you to connect to popup " +"signals. This allows you to handle events when the ColorPicker is shown or " +"hidden.\n" +"[b]Warning:[/b] This is a required internal node, removing and freeing it " +"may cause a crash. If you wish to hide it or any of its children, use their " +"[member CanvasItem.visible] property." +msgstr "" + +#: doc/classes/ColorPickerButton.xml +msgid "" +"If [code]true[/code], the alpha channel in the displayed [ColorPicker] will " +"be visible." +msgstr "" + +#: doc/classes/ColorPickerButton.xml +msgid "Emitted when the color changes." +msgstr "" + +#: doc/classes/ColorPickerButton.xml +msgid "" +"Emitted when the [ColorPicker] is created (the button is pressed for the " +"first time)." +msgstr "" + +#: doc/classes/ColorPickerButton.xml +msgid "Emitted when the [ColorPicker] is closed." +msgstr "" + +#: doc/classes/ColorPickerButton.xml +msgid "Default text [Color] of the [ColorPickerButton]." +msgstr "" + +#: doc/classes/ColorPickerButton.xml +msgid "Text [Color] used when the [ColorPickerButton] is disabled." +msgstr "" + +#: doc/classes/ColorPickerButton.xml +msgid "" +"Text [Color] used when the [ColorPickerButton] is focused. Only replaces the " +"normal text color of the button. Disabled, hovered, and pressed states take " +"precedence over this color." +msgstr "" + +#: doc/classes/ColorPickerButton.xml +msgid "Text [Color] used when the [ColorPickerButton] is being hovered." +msgstr "" + +#: doc/classes/ColorPickerButton.xml +msgid "Text [Color] used when the [ColorPickerButton] is being pressed." +msgstr "" + +#: doc/classes/ColorPickerButton.xml +msgid "The horizontal space between [ColorPickerButton]'s icon and text." +msgstr "" + +#: doc/classes/ColorPickerButton.xml +msgid "[Font] of the [ColorPickerButton]'s text." +msgstr "" + +#: doc/classes/ColorPickerButton.xml +msgid "The background of the color preview rect on the button." +msgstr "" + +#: doc/classes/ColorPickerButton.xml +msgid "[StyleBox] used when the [ColorPickerButton] is disabled." +msgstr "" + +#: doc/classes/ColorPickerButton.xml +msgid "" +"[StyleBox] used when the [ColorPickerButton] is focused. It is displayed " +"over the current [StyleBox], so using [StyleBoxEmpty] will just disable the " +"focus visual effect." +msgstr "" + +#: doc/classes/ColorPickerButton.xml +msgid "[StyleBox] used when the [ColorPickerButton] is being hovered." +msgstr "" + +#: doc/classes/ColorPickerButton.xml +msgid "Default [StyleBox] for the [ColorPickerButton]." +msgstr "" + +#: doc/classes/ColorPickerButton.xml +msgid "[StyleBox] used when the [ColorPickerButton] is being pressed." +msgstr "" + +#: doc/classes/ColorRect.xml +msgid "Colored rectangle." +msgstr "" + +#: doc/classes/ColorRect.xml +msgid "" +"Displays a rectangle filled with a solid [member color]. If you need to " +"display the border alone, consider using [ReferenceRect] instead." +msgstr "" + +#: doc/classes/ColorRect.xml +msgid "" +"The fill color.\n" +"[codeblock]\n" +"$ColorRect.color = Color(1, 0, 0, 1) # Set ColorRect's color to red.\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/ConcavePolygonShape.xml +msgid "Concave polygon shape." +msgstr "" + +#: doc/classes/ConcavePolygonShape.xml +msgid "" +"Concave polygon shape resource, which can be set into a [PhysicsBody] or " +"area. This shape is created by feeding a list of triangles.\n" +"[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " +"work with static [PhysicsBody] nodes like [StaticBody] and will not work " +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." +msgstr "" + +#: doc/classes/ConcavePolygonShape.xml +msgid "Returns the faces (an array of triangles)." +msgstr "" + +#: doc/classes/ConcavePolygonShape.xml +msgid "Sets the faces (an array of triangles)." +msgstr "" + +#: doc/classes/ConcavePolygonShape2D.xml +msgid "Concave polygon 2D shape resource for physics." +msgstr "" + +#: doc/classes/ConcavePolygonShape2D.xml +msgid "" +"Concave polygon 2D shape resource for physics. It is made out of segments " +"and is optimal for complex polygonal concave collisions. However, it is not " +"advised to use for [RigidBody2D] nodes. A CollisionPolygon2D in convex " +"decomposition mode (solids) or several convex objects are advised for that " +"instead. Otherwise, a concave polygon 2D shape is better for static " +"collisions.\n" +"The main difference between a [ConvexPolygonShape2D] and a " +"[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " +"uses a more complex method of collision detection, and a convex one forces " +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." +msgstr "" + +#: doc/classes/ConcavePolygonShape2D.xml +msgid "" +"The array of points that make up the [ConcavePolygonShape2D]'s line segments." +msgstr "" + +#: doc/classes/ConeTwistJoint.xml +msgid "A twist joint between two 3D PhysicsBodies." +msgstr "" + +#: doc/classes/ConeTwistJoint.xml +msgid "" +"The joint can rotate the bodies across an axis defined by the local x-axes " +"of the [Joint].\n" +"The twist axis is initiated as the X axis of the [Joint].\n" +"Once the Bodies swing, the twist axis is calculated as the middle of the x-" +"axes of the Joint in the local space of the two Bodies. See also " +"[Generic6DOFJoint]." +msgstr "" + +#: doc/classes/ConeTwistJoint.xml doc/classes/PhysicsServer.xml +msgid "" +"The speed with which the swing or twist will take place.\n" +"The higher, the faster." +msgstr "" + +#: doc/classes/ConeTwistJoint.xml doc/classes/PhysicsServer.xml +msgid "" +"Defines, how fast the swing- and twist-speed-difference on both sides gets " +"synced." +msgstr "" + +#: doc/classes/ConeTwistJoint.xml +msgid "" +"The ease with which the joint starts to twist. If it's too low, it takes " +"more force to start twisting the joint." +msgstr "" + +#: doc/classes/ConeTwistJoint.xml doc/classes/PhysicsServer.xml +msgid "" +"Swing is rotation from side to side, around the axis perpendicular to the " +"twist axis.\n" +"The swing span defines, how much rotation will not get corrected along the " +"swing axis.\n" +"Could be defined as looseness in the [ConeTwistJoint].\n" +"If below 0.05, this behavior is locked." +msgstr "" + +#: doc/classes/ConeTwistJoint.xml doc/classes/PhysicsServer.xml +msgid "" +"Twist is the rotation around the twist axis, this value defined how far the " +"joint can twist.\n" +"Twist is locked if below 0.05." +msgstr "" + +#: doc/classes/ConeTwistJoint.xml doc/classes/Generic6DOFJoint.xml +#: doc/classes/HingeJoint.xml doc/classes/Light.xml doc/classes/SliderJoint.xml +msgid "Represents the size of the [enum Param] enum." +msgstr "" + +#: doc/classes/ConfigFile.xml +msgid "Helper class to handle INI-style files." +msgstr "" + +#: doc/classes/ConfigFile.xml +msgid "" +"This helper class can be used to store [Variant] values on the filesystem " +"using INI-style formatting. The stored values are identified by a section " +"and a key:\n" +"[codeblock]\n" +"[section]\n" +"some_key=42\n" +"string_example=\"Hello World!\"\n" +"a_vector=Vector3( 1, 0, 2 )\n" +"[/codeblock]\n" +"The stored data can be saved to or parsed from a file, though ConfigFile " +"objects can also be used directly without accessing the filesystem.\n" +"The following example shows how to create a simple [ConfigFile] and save it " +"on disk:\n" +"[codeblock]\n" +"# Create new ConfigFile object.\n" +"var config = ConfigFile.new()\n" +"\n" +"# Store some values.\n" +"config.set_value(\"Player1\", \"player_name\", \"Steve\")\n" +"config.set_value(\"Player1\", \"best_score\", 10)\n" +"config.set_value(\"Player2\", \"player_name\", \"V3geta\")\n" +"config.set_value(\"Player2\", \"best_score\", 9001)\n" +"\n" +"# Save it to a file (overwrite if already exists).\n" +"config.save(\"user://scores.cfg\")\n" +"[/codeblock]\n" +"This example shows how the above file could be loaded:\n" +"[codeblock]\n" +"var score_data = {}\n" +"var config = ConfigFile.new()\n" +"\n" +"# Load data from a file.\n" +"var err = config.load(\"user://scores.cfg\")\n" +"\n" +"# If the file didn't load, ignore it.\n" +"if err != OK:\n" +" return\n" +"\n" +"# Iterate over all sections.\n" +"for player in config.get_sections():\n" +" # Fetch the data for each section.\n" +" var player_name = config.get_value(player, \"player_name\")\n" +" var player_score = config.get_value(player, \"best_score\")\n" +" score_data[player_name] = player_score\n" +"[/codeblock]\n" +"Any operation that mutates the ConfigFile such as [method set_value], " +"[method clear], or [method erase_section], only changes what is loaded in " +"memory. If you want to write the change to a file, you have to save the " +"changes with [method save], [method save_encrypted], or [method " +"save_encrypted_pass].\n" +"Keep in mind that section and property names can't contain spaces. Anything " +"after a space will be ignored on save and on load.\n" +"ConfigFiles can also contain manually written comment lines starting with a " +"semicolon ([code];[/code]). Those lines will be ignored when parsing the " +"file. Note that comments will be lost when saving the ConfigFile. This can " +"still be useful for dedicated server configuration files, which are " +"typically never overwritten without explicit user action.\n" +"[b]Note:[/b] The file extension given to a ConfigFile does not have any " +"impact on its formatting or behavior. By convention, the [code].cfg[/code] " +"extension is used here, but any other extension such as [code].ini[/code] is " +"also valid. Since neither [code].cfg[/code] nor [code].ini[/code] are " +"standardized, Godot's ConfigFile formatting may differ from files written by " +"other programs." +msgstr "" + +#: doc/classes/ConfigFile.xml +msgid "Removes the entire contents of the config." +msgstr "" + +#: doc/classes/ConfigFile.xml +msgid "" +"Deletes the specified section along with all the key-value pairs inside. " +"Raises an error if the section does not exist." +msgstr "" + +#: doc/classes/ConfigFile.xml +msgid "" +"Deletes the specified key in a section. Raises an error if either the " +"section or the key do not exist." +msgstr "" + +#: doc/classes/ConfigFile.xml +msgid "" +"Returns an array of all defined key identifiers in the specified section. " +"Raises an error and returns an empty array if the section does not exist." +msgstr "" + +#: doc/classes/ConfigFile.xml +msgid "Returns an array of all defined section identifiers." +msgstr "" + +#: doc/classes/ConfigFile.xml +msgid "" +"Returns the current value for the specified section and key. If either the " +"section or the key do not exist, the method returns the fallback " +"[code]default[/code] value. If [code]default[/code] is not specified or set " +"to [code]null[/code], an error is also raised." +msgstr "" + +#: doc/classes/ConfigFile.xml +msgid "Returns [code]true[/code] if the specified section exists." +msgstr "" + +#: doc/classes/ConfigFile.xml +msgid "Returns [code]true[/code] if the specified section-key pair exists." +msgstr "" + +#: doc/classes/ConfigFile.xml +msgid "" +"Loads the config file specified as a parameter. The file's contents are " +"parsed and loaded in the [ConfigFile] object which the method was called " +"on.\n" +"Returns one of the [enum Error] code constants ([code]OK[/code] on success)." +msgstr "" + +#: doc/classes/ConfigFile.xml +msgid "" +"Loads the encrypted config file specified as a parameter, using the provided " +"[code]key[/code] to decrypt it. The file's contents are parsed and loaded in " +"the [ConfigFile] object which the method was called on.\n" +"Returns one of the [enum Error] code constants ([code]OK[/code] on success)." +msgstr "" + +#: doc/classes/ConfigFile.xml +msgid "" +"Loads the encrypted config file specified as a parameter, using the provided " +"[code]password[/code] to decrypt it. The file's contents are parsed and " +"loaded in the [ConfigFile] object which the method was called on.\n" +"Returns one of the [enum Error] code constants ([code]OK[/code] on success)." +msgstr "" + +#: doc/classes/ConfigFile.xml +msgid "" +"Parses the passed string as the contents of a config file. The string is " +"parsed and loaded in the ConfigFile object which the method was called on.\n" +"Returns one of the [enum Error] code constants ([code]OK[/code] on success)." +msgstr "" + +#: doc/classes/ConfigFile.xml +msgid "" +"Saves the contents of the [ConfigFile] object to the file specified as a " +"parameter. The output file uses an INI-style structure.\n" +"Returns one of the [enum Error] code constants ([code]OK[/code] on success)." +msgstr "" + +#: doc/classes/ConfigFile.xml +msgid "" +"Saves the contents of the [ConfigFile] object to the AES-256 encrypted file " +"specified as a parameter, using the provided [code]key[/code] to encrypt it. " +"The output file uses an INI-style structure.\n" +"Returns one of the [enum Error] code constants ([code]OK[/code] on success)." +msgstr "" + +#: doc/classes/ConfigFile.xml +msgid "" +"Saves the contents of the [ConfigFile] object to the AES-256 encrypted file " +"specified as a parameter, using the provided [code]password[/code] to " +"encrypt it. The output file uses an INI-style structure.\n" +"Returns one of the [enum Error] code constants ([code]OK[/code] on success)." +msgstr "" + +#: doc/classes/ConfigFile.xml +msgid "" +"Assigns a value to the specified key of the specified section. If either the " +"section or the key do not exist, they are created. Passing a [code]null[/" +"code] value deletes the specified key if it exists, and deletes the section " +"if it ends up empty once the key has been removed." +msgstr "" + +#: doc/classes/ConfirmationDialog.xml +msgid "Dialog for confirmation of actions." +msgstr "" + +#: doc/classes/ConfirmationDialog.xml +msgid "" +"Dialog for confirmation of actions. This dialog inherits from " +"[AcceptDialog], but has by default an OK and Cancel button (in host OS " +"order).\n" +"To get cancel action, you can use:\n" +"[codeblock]\n" +"get_cancel().connect(\"pressed\", self, \"cancelled\")\n" +"[/codeblock]." +msgstr "" + +#: doc/classes/ConfirmationDialog.xml +msgid "" +"Returns the cancel button.\n" +"[b]Warning:[/b] This is a required internal node, removing and freeing it " +"may cause a crash. If you wish to hide it or any of its children, use their " +"[member CanvasItem.visible] property." +msgstr "" + +#: doc/classes/Container.xml +msgid "Base node for containers." +msgstr "" + +#: doc/classes/Container.xml +msgid "" +"Base node for containers. A [Container] contains other controls and " +"automatically arranges them in a certain way.\n" +"A Control can inherit this to create custom container classes." +msgstr "" + +#: doc/classes/Container.xml +msgid "" +"Fit a child control in a given rect. This is mainly a helper for creating " +"custom container classes." +msgstr "" + +#: doc/classes/Container.xml +msgid "" +"Queue resort of the contained children. This is called automatically anyway, " +"but can be called upon request." +msgstr "" + +#: doc/classes/Container.xml +msgid "Emitted when sorting the children is needed." +msgstr "" + +#: doc/classes/Container.xml +msgid "" +"Notification for when sorting the children, it must be obeyed immediately." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"All user interface nodes inherit from Control. A control's anchors and " +"margins adapt its position and size relative to its parent." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Base class for all UI-related nodes. [Control] features a bounding rectangle " +"that defines its extents, an anchor position relative to its parent control " +"or the current viewport, and margins that represent an offset to the anchor. " +"The margins update automatically when the node, any of its parents, or the " +"screen size change.\n" +"For more information on Godot's UI system, anchors, margins, and containers, " +"see the related tutorials in the manual. To build flexible UIs, you'll need " +"a mix of UI elements that inherit from [Control] and [Container] nodes.\n" +"[b]User Interface nodes and input[/b]\n" +"Godot sends input events to the scene's root node first, by calling [method " +"Node._input]. [method Node._input] forwards the event down the node tree to " +"the nodes under the mouse cursor, or on keyboard focus. To do so, it calls " +"[method MainLoop._input_event]. Call [method accept_event] so no other node " +"receives the event. Once you accept an input, it becomes handled so [method " +"Node._unhandled_input] will not process it.\n" +"Only one [Control] node can be in keyboard focus. Only the node in focus " +"will receive keyboard events. To get the focus, call [method grab_focus]. " +"[Control] nodes lose focus when another node grabs it, or if you hide the " +"node in focus.\n" +"Sets [member mouse_filter] to [constant MOUSE_FILTER_IGNORE] to tell a " +"[Control] node to ignore mouse or touch events. You'll need it if you place " +"an icon on top of a button.\n" +"[Theme] resources change the Control's appearance. If you change the [Theme] " +"on a [Control] node, it affects all of its children. To override some of the " +"theme's parameters, call one of the [code]add_*_override[/code] methods, " +"like [method add_font_override]. You can override the theme with the " +"inspector.\n" +"[b]Note:[/b] Theme items are [i]not[/i] [Object] properties. This means you " +"can't access their values using [method Object.get] and [method Object.set]. " +"Instead, use [method get_color], [method get_constant], [method get_font], " +"[method get_icon], [method get_stylebox], and the [code]add_*_override[/" +"code] methods provided by this class." +msgstr "" + +#: doc/classes/Control.xml +msgid "GUI tutorial index" +msgstr "" + +#: doc/classes/Control.xml +msgid "Control node gallery" +msgstr "" + +#: doc/classes/Control.xml +msgid "All GUI Demos" +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Virtual method to be implemented by the user. Returns whether [method " +"_gui_input] should not be called for children controls outside this " +"control's rectangle. Input will be clipped to the Rect of this [Control]. " +"Similar to [member rect_clip_content], but doesn't affect visibility.\n" +"If not overridden, defaults to [code]false[/code]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Virtual method to be implemented by the user. Returns the minimum size for " +"this control. Alternative to [member rect_min_size] for controlling minimum " +"size via code. The actual minimum size will be the max value of these two " +"(in each axis separately).\n" +"If not overridden, defaults to [constant Vector2.ZERO].\n" +"[b]Note:[/b] This method will not be called when the script is attached to a " +"[Control] node that already overrides its minimum size (e.g. [Label], " +"[Button], [PanelContainer] etc.). It can only be used with most basic GUI " +"nodes, like [Control], [Container], [Panel] etc." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Virtual method to be implemented by the user. Use this method to process and " +"accept inputs on UI elements. See [method accept_event].\n" +"Example: clicking a control.\n" +"[codeblock]\n" +"func _gui_input(event):\n" +" if event is InputEventMouseButton:\n" +" if event.button_index == BUTTON_LEFT and event.pressed:\n" +" print(\"I've been clicked D:\")\n" +"[/codeblock]\n" +"The event won't trigger if:\n" +"* clicking outside the control (see [method has_point]);\n" +"* control has [member mouse_filter] set to [constant MOUSE_FILTER_IGNORE];\n" +"* control is obstructed by another [Control] on top of it, which doesn't " +"have [member mouse_filter] set to [constant MOUSE_FILTER_IGNORE];\n" +"* control's parent has [member mouse_filter] set to [constant " +"MOUSE_FILTER_STOP] or has accepted the event;\n" +"* it happens outside the parent's rectangle and the parent has either " +"[member rect_clip_content] or [method _clips_input] enabled.\n" +"[b]Note:[/b] Event position is relative to the control origin." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Virtual method to be implemented by the user. Returns a [Control] node that " +"should be used as a tooltip instead of the default one. The [code]for_text[/" +"code] includes the contents of the [member hint_tooltip] property.\n" +"The returned node must be of type [Control] or Control-derived. It can have " +"child nodes of any type. It is freed when the tooltip disappears, so make " +"sure you always provide a new instance (if you want to use a pre-existing " +"node from your scene tree, you can duplicate it and pass the duplicated " +"instance). When [code]null[/code] or a non-Control node is returned, the " +"default tooltip will be used instead.\n" +"The returned node will be added as child to a [PopupPanel], so you should " +"only provide the contents of that panel. That [PopupPanel] can be themed " +"using [method Theme.set_stylebox] for the type [code]\"TooltipPanel\"[/code] " +"(see [member hint_tooltip] for an example).\n" +"[b]Note:[/b] The tooltip is shrunk to minimal size. If you want to ensure " +"it's fully visible, you might want to set its [member rect_min_size] to some " +"non-zero value.\n" +"Example of usage with a custom-constructed node:\n" +"[codeblock]\n" +"func _make_custom_tooltip(for_text):\n" +" var label = Label.new()\n" +" label.text = for_text\n" +" return label\n" +"[/codeblock]\n" +"Example of usage with a custom scene instance:\n" +"[codeblock]\n" +"func _make_custom_tooltip(for_text):\n" +" var tooltip = preload(\"res://SomeTooltipScene.tscn\").instance()\n" +" tooltip.get_node(\"Label\").text = for_text\n" +" return tooltip\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Marks an input event as handled. Once you accept an input event, it stops " +"propagating, even to nodes listening to [method Node._unhandled_input] or " +"[method Node._unhandled_key_input]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Creates a local override for a theme [Color] with the specified [code]name[/" +"code]. Local overrides always take precedence when fetching theme items for " +"the control.\n" +"See also [method get_color], [method remove_color_override].\n" +"[b]Example of overriding a label's color and resetting it later:[/b]\n" +"[codeblock]\n" +"# Given the child Label node \"MyLabel\", override its font color with a " +"custom value.\n" +"$MyLabel.add_color_override(\"font_color\", Color(1, 0.5, 0))\n" +"# Reset the font color of the child label.\n" +"$MyLabel.add_color_override(\"font_color\", get_color(\"font_color\", " +"\"Label\"))\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Creates a local override for a theme constant with the specified [code]name[/" +"code]. Local overrides always take precedence when fetching theme items for " +"the control.\n" +"See also [method get_constant], [method remove_constant_override]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Creates a local override for a theme [Font] with the specified [code]name[/" +"code]. Local overrides always take precedence when fetching theme items for " +"the control.\n" +"[b]Note:[/b] An override can be removed by assigning it a [code]null[/code] " +"value. This behavior is deprecated and will be removed in 4.0, use [method " +"remove_font_override] instead.\n" +"See also [method get_font]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Creates a local override for a theme icon with the specified [code]name[/" +"code]. Local overrides always take precedence when fetching theme items for " +"the control.\n" +"[b]Note:[/b] An override can be removed by assigning it a [code]null[/code] " +"value. This behavior is deprecated and will be removed in 4.0, use [method " +"remove_icon_override] instead.\n" +"See also [method get_icon]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Creates a local override for a theme shader with the specified [code]name[/" +"code]. Local overrides always take precedence when fetching theme items for " +"the control.\n" +"[b]Note:[/b] An override can be removed by assigning it a [code]null[/code] " +"value. This behavior is deprecated and will be removed in 4.0, use [method " +"remove_shader_override] instead." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Creates a local override for a theme [StyleBox] with the specified " +"[code]name[/code]. Local overrides always take precedence when fetching " +"theme items for the control.\n" +"[b]Note:[/b] An override can be removed by assigning it a [code]null[/code] " +"value. This behavior is deprecated and will be removed in 4.0, use [method " +"remove_stylebox_override] instead.\n" +"See also [method get_stylebox].\n" +"[b]Example of modifying a property in a StyleBox by duplicating it:[/b]\n" +"[codeblock]\n" +"# The snippet below assumes the child node MyButton has a StyleBoxFlat " +"assigned.\n" +"# Resources are shared across instances, so we need to duplicate it\n" +"# to avoid modifying the appearance of all other buttons.\n" +"var new_stylebox_normal = $MyButton.get_stylebox(\"normal\").duplicate()\n" +"new_stylebox_normal.border_width_top = 3\n" +"new_stylebox_normal.border_color = Color(0, 1, 0.5)\n" +"$MyButton.add_stylebox_override(\"normal\", new_stylebox_normal)\n" +"# Remove the stylebox override.\n" +"$MyButton.add_stylebox_override(\"normal\", null)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Godot calls this method to test if [code]data[/code] from a control's " +"[method get_drag_data] can be dropped at [code]position[/code]. " +"[code]position[/code] is local to this control.\n" +"This method should only be used to test the data. Process the data in " +"[method drop_data].\n" +"[codeblock]\n" +"func can_drop_data(position, data):\n" +" # Check position if it is relevant to you\n" +" # Otherwise, just check data\n" +" return typeof(data) == TYPE_DICTIONARY and data.has(\"expected\")\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Godot calls this method to pass you the [code]data[/code] from a control's " +"[method get_drag_data] result. Godot first calls [method can_drop_data] to " +"test if [code]data[/code] is allowed to drop at [code]position[/code] where " +"[code]position[/code] is local to this control.\n" +"[codeblock]\n" +"func can_drop_data(position, data):\n" +" return typeof(data) == TYPE_DICTIONARY and data.has(\"color\")\n" +"\n" +"func drop_data(position, data):\n" +" color = data[\"color\"]\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Finds the next (below in the tree) [Control] that can receive the focus." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Finds the previous (above in the tree) [Control] that can receive the focus." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Forces drag and bypasses [method get_drag_data] and [method " +"set_drag_preview] by passing [code]data[/code] and [code]preview[/code]. " +"Drag will start even if the mouse is neither over nor pressed on this " +"control.\n" +"The methods [method can_drop_data] and [method drop_data] must be " +"implemented on controls that want to receive drop data." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Returns the anchor identified by [code]margin[/code] constant from [enum " +"Margin] enum. A getter method for [member anchor_bottom], [member " +"anchor_left], [member anchor_right] and [member anchor_top]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Returns [member margin_left] and [member margin_top]. See also [member " +"rect_position]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Returns a [Color] from the first matching [Theme] in the tree if that " +"[Theme] has a color item with the specified [code]name[/code] and " +"[code]theme_type[/code]. If [code]theme_type[/code] is omitted the class " +"name of the current control is used as the type, or [member " +"theme_type_variation] if it is defined. If the type is a class name its " +"parent classes are also checked, in order of inheritance.\n" +"For the current control its local overrides are considered first (see " +"[method add_color_override]), then its assigned [member theme]. After the " +"current control, each parent control and its assigned [member theme] are " +"considered; controls without a [member theme] assigned are skipped. If no " +"matching [Theme] is found in the tree, a custom project [Theme] (see [member " +"ProjectSettings.gui/theme/custom]) and the default [Theme] are used.\n" +"[codeblock]\n" +"func _ready():\n" +" # Get the font color defined for the current Control's class, if it " +"exists.\n" +" modulate = get_color(\"font_color\")\n" +" # Get the font color defined for the Button class.\n" +" modulate = get_color(\"font_color\", \"Button\")\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Returns combined minimum size from [member rect_min_size] and [method " +"get_minimum_size]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Returns a constant from the first matching [Theme] in the tree if that " +"[Theme] has a constant item with the specified [code]name[/code] and " +"[code]theme_type[/code].\n" +"See [method get_color] for details." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Returns the mouse cursor shape the control displays on mouse hover. See " +"[enum CursorShape]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Godot calls this method to get data that can be dragged and dropped onto " +"controls that expect drop data. Returns [code]null[/code] if there is no " +"data to drag. Controls that want to receive drop data should implement " +"[method can_drop_data] and [method drop_data]. [code]position[/code] is " +"local to this control. Drag may be forced with [method force_drag].\n" +"A preview that will follow the mouse that should represent the data can be " +"set with [method set_drag_preview]. A good time to set the preview is in " +"this method.\n" +"[codeblock]\n" +"func get_drag_data(position):\n" +" var mydata = make_data()\n" +" set_drag_preview(make_preview(mydata))\n" +" return mydata\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Control.xml +msgid "Returns [member margin_right] and [member margin_bottom]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Returns the focus neighbour identified by [code]margin[/code] constant from " +"[enum Margin] enum. A getter method for [member focus_neighbour_bottom], " +"[member focus_neighbour_left], [member focus_neighbour_right] and [member " +"focus_neighbour_top]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Returns the control that has the keyboard focus or [code]null[/code] if none." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Returns a [Font] from the first matching [Theme] in the tree if that [Theme] " +"has a font item with the specified [code]name[/code] and [code]theme_type[/" +"code].\n" +"See [method get_color] for details." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Returns the position and size of the control relative to the top-left corner " +"of the screen. See [member rect_position] and [member rect_size]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Returns an icon from the first matching [Theme] in the tree if that [Theme] " +"has an icon item with the specified [code]name[/code] and [code]theme_type[/" +"code].\n" +"See [method get_color] for details." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Returns the anchor identified by [code]margin[/code] constant from [enum " +"Margin] enum. A getter method for [member margin_bottom], [member " +"margin_left], [member margin_right] and [member margin_top]." +msgstr "" + +#: doc/classes/Control.xml +msgid "Returns the minimum size for this control. See [member rect_min_size]." +msgstr "" + +#: doc/classes/Control.xml +msgid "Returns the width/height occupied in the parent control." +msgstr "" + +#: doc/classes/Control.xml +msgid "Returns the parent control node." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Returns the position and size of the control relative to the top-left corner " +"of the parent Control. See [member rect_position] and [member rect_size]." +msgstr "" + +#: doc/classes/Control.xml +msgid "Returns the rotation (in radians)." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Returns a [StyleBox] from the first matching [Theme] in the tree if that " +"[Theme] has a stylebox item with the specified [code]name[/code] and " +"[code]theme_type[/code].\n" +"See [method get_color] for details." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Returns the default font from the first matching [Theme] in the tree if that " +"[Theme] has a valid [member Theme.default_font] value.\n" +"See [method get_color] for details." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Returns the tooltip, which will appear when the cursor is resting over this " +"control. See [member hint_tooltip]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Creates an [InputEventMouseButton] that attempts to click the control. If " +"the event is received, the control acquires focus.\n" +"[codeblock]\n" +"func _process(delta):\n" +" grab_click_focus() #when clicking another Control node, this node will " +"be clicked instead\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Steal the focus from another control and become the focused control (see " +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Returns [code]true[/code] if there is a matching [Theme] in the tree that " +"has a color item with the specified [code]name[/code] and [code]theme_type[/" +"code].\n" +"See [method get_color] for details." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Returns [code]true[/code] if there is a local override for a theme [Color] " +"with the specified [code]name[/code] in this [Control] node.\n" +"See [method add_color_override]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Returns [code]true[/code] if there is a matching [Theme] in the tree that " +"has a constant item with the specified [code]name[/code] and " +"[code]theme_type[/code].\n" +"See [method get_color] for details." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Returns [code]true[/code] if there is a local override for a theme constant " +"with the specified [code]name[/code] in this [Control] node.\n" +"See [method add_constant_override]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Returns [code]true[/code] if this is the current focused control. See " +"[member focus_mode]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Returns [code]true[/code] if there is a matching [Theme] in the tree that " +"has a font item with the specified [code]name[/code] and [code]theme_type[/" +"code].\n" +"See [method get_color] for details." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Returns [code]true[/code] if there is a local override for a theme [Font] " +"with the specified [code]name[/code] in this [Control] node.\n" +"See [method add_font_override]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Returns [code]true[/code] if there is a matching [Theme] in the tree that " +"has an icon item with the specified [code]name[/code] and [code]theme_type[/" +"code].\n" +"See [method get_color] for details." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Returns [code]true[/code] if there is a local override for a theme icon with " +"the specified [code]name[/code] in this [Control] node.\n" +"See [method add_icon_override]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Virtual method to be implemented by the user. Returns whether the given " +"[code]point[/code] is inside this control.\n" +"If not overridden, default behavior is checking if the point is within " +"control's Rect.\n" +"[b]Note:[/b] If you want to check if a point is inside the control, you can " +"use [code]get_rect().has_point(point)[/code]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Returns [code]true[/code] if there is a local override for a theme shader " +"with the specified [code]name[/code] in this [Control] node.\n" +"See [method add_shader_override]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Returns [code]true[/code] if there is a matching [Theme] in the tree that " +"has a stylebox item with the specified [code]name[/code] and " +"[code]theme_type[/code].\n" +"See [method get_color] for details." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Returns [code]true[/code] if there is a local override for a theme " +"[StyleBox] with the specified [code]name[/code] in this [Control] node.\n" +"See [method add_stylebox_override]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Returns [code]true[/code] if a drag operation is successful. Alternative to " +"[method Viewport.gui_is_drag_successful].\n" +"Best used with [constant Node.NOTIFICATION_DRAG_END]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Invalidates the size cache in this node and in parent nodes up to toplevel. " +"Intended to be used with [method get_minimum_size] when the return value is " +"changed. Setting [member rect_min_size] directly calls this method " +"automatically." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Give up the focus. No other control will be able to receive keyboard input." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Removes a theme override for a [Color] with the given [code]name[/code]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Removes a theme override for a constant with the given [code]name[/code]." +msgstr "" + +#: doc/classes/Control.xml +msgid "Removes a theme override for a [Font] with the given [code]name[/code]." +msgstr "" + +#: doc/classes/Control.xml +msgid "Removes a theme override for an icon with the given [code]name[/code]." +msgstr "" + +#: doc/classes/Control.xml +msgid "Removes a theme override for a shader with the given [code]name[/code]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Removes a theme override for a [StyleBox] with the given [code]name[/code]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Sets the anchor identified by [code]margin[/code] constant from [enum " +"Margin] enum to value [code]anchor[/code]. A setter method for [member " +"anchor_bottom], [member anchor_left], [member anchor_right] and [member " +"anchor_top].\n" +"If [code]keep_margin[/code] is [code]true[/code], margins aren't updated " +"after this operation.\n" +"If [code]push_opposite_anchor[/code] is [code]true[/code] and the opposite " +"anchor overlaps this anchor, the opposite one will have its value " +"overridden. For example, when setting left anchor to 1 and the right anchor " +"has value of 0.5, the right anchor will also get value of 1. If " +"[code]push_opposite_anchor[/code] was [code]false[/code], the left anchor " +"would get value 0.5." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Works the same as [method set_anchor], but instead of [code]keep_margin[/" +"code] argument and automatic update of margin, it allows to set the margin " +"offset yourself (see [method set_margin])." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Sets both anchor preset and margin preset. See [method set_anchors_preset] " +"and [method set_margins_preset]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Sets the anchors to a [code]preset[/code] from [enum Control.LayoutPreset] " +"enum. This is the code equivalent to using the Layout menu in the 2D " +"editor.\n" +"If [code]keep_margins[/code] is [code]true[/code], control's position will " +"also be updated." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Sets [member margin_left] and [member margin_top] at the same time. " +"Equivalent of changing [member rect_position]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Forwards the handling of this control's drag and drop to [code]target[/code] " +"control.\n" +"Forwarding can be implemented in the target control similar to the methods " +"[method get_drag_data], [method can_drop_data], and [method drop_data] but " +"with two differences:\n" +"1. The function name must be suffixed with [b]_fw[/b]\n" +"2. The function must take an extra argument that is the control doing the " +"forwarding\n" +"[codeblock]\n" +"# ThisControl.gd\n" +"extends Control\n" +"func _ready():\n" +" set_drag_forwarding(target_control)\n" +"\n" +"# TargetControl.gd\n" +"extends Control\n" +"func can_drop_data_fw(position, data, from_control):\n" +" return true\n" +"\n" +"func drop_data_fw(position, data, from_control):\n" +" my_handle_data(data)\n" +"\n" +"func get_drag_data_fw(position, from_control):\n" +" set_drag_preview(my_preview)\n" +" return my_data()\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Shows the given control at the mouse pointer. A good time to call this " +"method is in [method get_drag_data]. The control must not be in the scene " +"tree. You should not free the control, and you should not keep a reference " +"to the control beyond the duration of the drag. It will be deleted " +"automatically after the drag has ended.\n" +"[codeblock]\n" +"export (Color, RGBA) var color = Color(1, 0, 0, 1)\n" +"\n" +"func get_drag_data(position):\n" +" # Use a control that is not in the tree\n" +" var cpb = ColorPickerButton.new()\n" +" cpb.color = color\n" +" cpb.rect_size = Vector2(50, 50)\n" +" set_drag_preview(cpb)\n" +" return color\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Control.xml +msgid "Sets [member margin_right] and [member margin_bottom] at the same time." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Sets the anchor identified by [code]margin[/code] constant from [enum " +"Margin] enum to [Control] at [code]neighbor[/code] node path. A setter " +"method for [member focus_neighbour_bottom], [member focus_neighbour_left], " +"[member focus_neighbour_right] and [member focus_neighbour_top]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Sets the [member rect_global_position] to given [code]position[/code].\n" +"If [code]keep_margins[/code] is [code]true[/code], control's anchors will be " +"updated instead of margins." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Sets the margin identified by [code]margin[/code] constant from [enum " +"Margin] enum to given [code]offset[/code]. A setter method for [member " +"margin_bottom], [member margin_left], [member margin_right] and [member " +"margin_top]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Sets the margins to a [code]preset[/code] from [enum Control.LayoutPreset] " +"enum. This is the code equivalent to using the Layout menu in the 2D " +"editor.\n" +"Use parameter [code]resize_mode[/code] with constants from [enum Control." +"LayoutPresetMode] to better determine the resulting size of the [Control]. " +"Constant size will be ignored if used with presets that change size, e.g. " +"[code]PRESET_LEFT_WIDE[/code].\n" +"Use parameter [code]margin[/code] to determine the gap between the [Control] " +"and the edges." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Sets the [member rect_position] to given [code]position[/code].\n" +"If [code]keep_margins[/code] is [code]true[/code], control's anchors will be " +"updated instead of margins." +msgstr "" + +#: doc/classes/Control.xml +msgid "Sets the rotation (in radians)." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Sets the size (see [member rect_size]).\n" +"If [code]keep_margins[/code] is [code]true[/code], control's anchors will be " +"updated instead of margins." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Displays a control as modal. Control must be a subwindow. Modal controls " +"capture the input signals until closed or the area outside them is accessed. " +"When a modal control loses focus, or the ESC key is pressed, they " +"automatically hide. Modal controls are used extensively for popup dialogs " +"and menus.\n" +"If [code]exclusive[/code] is [code]true[/code], other controls will not " +"receive input and clicking outside this control will not close it." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Moves the mouse cursor to [code]to_position[/code], relative to [member " +"rect_position] of this [Control]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Anchors the bottom edge of the node to the origin, the center, or the end of " +"its parent control. It changes how the bottom margin updates when the node " +"moves or changes size. You can use one of the [enum Anchor] constants for " +"convenience." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Anchors the left edge of the node to the origin, the center or the end of " +"its parent control. It changes how the left margin updates when the node " +"moves or changes size. You can use one of the [enum Anchor] constants for " +"convenience." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Anchors the right edge of the node to the origin, the center or the end of " +"its parent control. It changes how the right margin updates when the node " +"moves or changes size. You can use one of the [enum Anchor] constants for " +"convenience." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Anchors the top edge of the node to the origin, the center or the end of its " +"parent control. It changes how the top margin updates when the node moves or " +"changes size. You can use one of the [enum Anchor] constants for convenience." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"The focus access mode for the control (None, Click or All). Only one Control " +"can be focused at the same time, and it will receive keyboard signals." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Tells Godot which node it should give keyboard focus to if the user presses " +"the down arrow on the keyboard or down on a gamepad by default. You can " +"change the key by editing the [code]ui_down[/code] input action. The node " +"must be a [Control]. If this property is not set, Godot will give focus to " +"the closest [Control] to the bottom of this one." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Tells Godot which node it should give keyboard focus to if the user presses " +"the left arrow on the keyboard or left on a gamepad by default. You can " +"change the key by editing the [code]ui_left[/code] input action. The node " +"must be a [Control]. If this property is not set, Godot will give focus to " +"the closest [Control] to the left of this one." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Tells Godot which node it should give keyboard focus to if the user presses " +"the right arrow on the keyboard or right on a gamepad by default. You can " +"change the key by editing the [code]ui_right[/code] input action. The node " +"must be a [Control]. If this property is not set, Godot will give focus to " +"the closest [Control] to the bottom of this one." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Tells Godot which node it should give keyboard focus to if the user presses " +"the top arrow on the keyboard or top on a gamepad by default. You can change " +"the key by editing the [code]ui_top[/code] input action. The node must be a " +"[Control]. If this property is not set, Godot will give focus to the closest " +"[Control] to the bottom of this one." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Tells Godot which node it should give keyboard focus to if the user presses " +"Tab on a keyboard by default. You can change the key by editing the " +"[code]ui_focus_next[/code] input action.\n" +"If this property is not set, Godot will select a \"best guess\" based on " +"surrounding nodes in the scene tree." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Tells Godot which node it should give keyboard focus to if the user presses " +"Shift+Tab on a keyboard by default. You can change the key by editing the " +"[code]ui_focus_prev[/code] input action.\n" +"If this property is not set, Godot will select a \"best guess\" based on " +"surrounding nodes in the scene tree." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Controls the direction on the horizontal axis in which the control should " +"grow if its horizontal minimum size is changed to be greater than its " +"current size, as the control always has to be at least the minimum size." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Controls the direction on the vertical axis in which the control should grow " +"if its vertical minimum size is changed to be greater than its current size, " +"as the control always has to be at least the minimum size." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Changes the tooltip text. The tooltip appears when the user's mouse cursor " +"stays idle over this control for a few moments, provided that the [member " +"mouse_filter] property is not [constant MOUSE_FILTER_IGNORE]. You can change " +"the time required for the tooltip to appear with [code]gui/timers/" +"tooltip_delay_sec[/code] option in Project Settings.\n" +"The tooltip popup will use either a default implementation, or a custom one " +"that you can provide by overriding [method _make_custom_tooltip]. The " +"default tooltip includes a [PopupPanel] and [Label] whose theme properties " +"can be customized using [Theme] methods with the [code]\"TooltipPanel\"[/" +"code] and [code]\"TooltipLabel\"[/code] respectively. For example:\n" +"[codeblock]\n" +"var style_box = StyleBoxFlat.new()\n" +"style_box.set_bg_color(Color(1, 1, 0))\n" +"style_box.set_border_width_all(2)\n" +"# We assume here that the `theme` property has been assigned a custom Theme " +"beforehand.\n" +"theme.set_stylebox(\"panel\", \"TooltipPanel\", style_box)\n" +"theme.set_color(\"font_color\", \"TooltipLabel\", Color(0, 1, 1))\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Enables whether input should propagate when you close the control as modal.\n" +"If [code]false[/code], stops event handling at the viewport input event " +"handling. The viewport first hides the modal and after marks the input as " +"handled." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Distance between the node's bottom edge and its parent control, based on " +"[member anchor_bottom].\n" +"Margins are often controlled by one or multiple parent [Container] nodes, so " +"you should not modify them manually if your node is a direct child of a " +"[Container]. Margins update automatically when you move or resize the node." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Distance between the node's left edge and its parent control, based on " +"[member anchor_left].\n" +"Margins are often controlled by one or multiple parent [Container] nodes, so " +"you should not modify them manually if your node is a direct child of a " +"[Container]. Margins update automatically when you move or resize the node." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Distance between the node's right edge and its parent control, based on " +"[member anchor_right].\n" +"Margins are often controlled by one or multiple parent [Container] nodes, so " +"you should not modify them manually if your node is a direct child of a " +"[Container]. Margins update automatically when you move or resize the node." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Distance between the node's top edge and its parent control, based on " +"[member anchor_top].\n" +"Margins are often controlled by one or multiple parent [Container] nodes, so " +"you should not modify them manually if your node is a direct child of a " +"[Container]. Margins update automatically when you move or resize the node." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"The default cursor shape for this control. Useful for Godot plugins and " +"applications or games that use the system's mouse cursors.\n" +"[b]Note:[/b] On Linux, shapes may vary depending on the cursor theme of the " +"system." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Controls whether the control will be able to receive mouse button input " +"events through [method _gui_input] and how these events should be handled. " +"Also controls whether the control can receive the [signal mouse_entered], " +"and [signal mouse_exited] signals. See the constants to learn what each does." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Enables whether rendering of [CanvasItem] based children should be clipped " +"to this control's rectangle. If [code]true[/code], parts of a child which " +"would be visibly outside of this control's rectangle will not be rendered." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"The node's global position, relative to the world (usually to the top-left " +"corner of the window)." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"The minimum size of the node's bounding rectangle. If you set it to a value " +"greater than (0, 0), the node's bounding rectangle will always have at least " +"this size, even if its content is smaller. If it's set to (0, 0), the node " +"sizes automatically to fit its content, be it a texture or child nodes." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"By default, the node's pivot is its top-left corner. When you change its " +"[member rect_rotation] or [member rect_scale], it will rotate or scale " +"around this pivot. Set this property to [member rect_size] / 2 to pivot " +"around the Control's center." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"The node's position, relative to its parent. It corresponds to the " +"rectangle's top-left corner. The property is not affected by [member " +"rect_pivot_offset]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"The node's rotation around its pivot, in degrees. See [member " +"rect_pivot_offset] to change the pivot's position." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"The node's scale, relative to its [member rect_size]. Change this property " +"to scale the node around its [member rect_pivot_offset]. The Control's " +"[member hint_tooltip] will also scale according to this value.\n" +"[b]Note:[/b] This property is mainly intended to be used for animation " +"purposes. Text inside the Control will look pixelated or blurry when the " +"Control is scaled. To support multiple resolutions in your project, use an " +"appropriate viewport stretch mode as described in the [url=$DOCS_URL/" +"tutorials/rendering/multiple_resolutions.html]documentation[/url] instead of " +"scaling Controls individually.\n" +"[b]Note:[/b] If the Control node is a child of a [Container] node, the scale " +"will be reset to [code]Vector2(1, 1)[/code] when the scene is instanced. To " +"set the Control's scale when it's instanced, wait for one frame using " +"[code]yield(get_tree(), \"idle_frame\")[/code] then set its [member " +"rect_scale] property." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"The size of the node's bounding rectangle, in pixels. [Container] nodes " +"update this property automatically." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Tells the parent [Container] nodes how they should resize and place the node " +"on the X axis. Use one of the [enum SizeFlags] constants to change the " +"flags. See the constants to learn what each does." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"If the node and at least one of its neighbours uses the [constant " +"SIZE_EXPAND] size flag, the parent [Container] will let it take more or less " +"space depending on this property. If this node has a stretch ratio of 2 and " +"its neighbour a ratio of 1, this node will take two thirds of the available " +"space." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Tells the parent [Container] nodes how they should resize and place the node " +"on the Y axis. Use one of the [enum SizeFlags] constants to change the " +"flags. See the constants to learn what each does." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Changing this property replaces the current [Theme] resource this node and " +"all its [Control] children use." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"The name of a theme type variation used by this [Control] to look up its own " +"theme items. When empty, the class name of the node is used (e.g. " +"[code]Button[/code] for the [Button] control), as well as the class names of " +"all parent classes (in order of inheritance).\n" +"When set, this property gives the highest priority to the type of the " +"specified name. This type can in turn extend another type, forming a " +"dependency chain. See [method Theme.set_type_variation]. If the theme item " +"cannot be found using this type or its base types, lookup falls back on the " +"class names.\n" +"[b]Note:[/b] To look up [Control]'s own items use various [code]get_*[/code] " +"methods without specifying [code]theme_type[/code].\n" +"[b]Note:[/b] Theme items are looked for in the tree order, from branch to " +"root, where each [Control] node is checked for its [member theme] property. " +"The earliest match against any type/class name is returned. The project-" +"level Theme and the default Theme are checked last." +msgstr "" + +#: doc/classes/Control.xml +msgid "Emitted when the node gains keyboard focus." +msgstr "" + +#: doc/classes/Control.xml +msgid "Emitted when the node loses keyboard focus." +msgstr "" + +#: doc/classes/Control.xml +msgid "Emitted when the node receives an [InputEvent]." +msgstr "" + +#: doc/classes/Control.xml +msgid "Emitted when the node's minimum size changes." +msgstr "" + +#: doc/classes/Control.xml +msgid "Emitted when a modal [Control] is closed. See [method show_modal]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Emitted when the mouse enters the control's [code]Rect[/code] area, provided " +"its [member mouse_filter] lets the event reach it.\n" +"[b]Note:[/b] [signal mouse_entered] will not be emitted if the mouse enters " +"a child [Control] node before entering the parent's [code]Rect[/code] area, " +"at least until the mouse is moved to reach the parent's [code]Rect[/code] " +"area." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Emitted when the mouse leaves the control's [code]Rect[/code] area, provided " +"its [member mouse_filter] lets the event reach it.\n" +"[b]Note:[/b] [signal mouse_exited] will be emitted if the mouse enters a " +"child [Control] node, even if the mouse cursor is still inside the parent's " +"[code]Rect[/code] area.\n" +"If you want to check whether the mouse truly left the area, ignoring any top " +"nodes, you can use code like this:\n" +"[codeblock]\n" +"func _on_mouse_exited():\n" +" if not Rect2(Vector2(), rect_size)." +"has_point(get_local_mouse_position()):\n" +" # Not hovering over area.\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Control.xml +msgid "Emitted when the control changes size." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Emitted when one of the size flags changes. See [member " +"size_flags_horizontal] and [member size_flags_vertical]." +msgstr "" + +#: doc/classes/Control.xml +msgid "The node cannot grab focus. Use with [member focus_mode]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"The node can only grab focus on mouse clicks. Use with [member focus_mode]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"The node can grab focus on mouse click or using the arrows and the Tab keys " +"on the keyboard. Use with [member focus_mode]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Sent when the node changes size. Use [member rect_size] to get the new size." +msgstr "" + +#: doc/classes/Control.xml +msgid "Sent when the mouse pointer enters the node." +msgstr "" + +#: doc/classes/Control.xml +msgid "Sent when the mouse pointer exits the node." +msgstr "" + +#: doc/classes/Control.xml +msgid "Sent when the node grabs focus." +msgstr "" + +#: doc/classes/Control.xml +msgid "Sent when the node loses focus." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Sent when the node's [member theme] changes, right before Godot redraws the " +"control. Happens when you call one of the [code]add_*_override[/code] " +"methods." +msgstr "" + +#: doc/classes/Control.xml +msgid "Sent when an open modal dialog closes. See [method show_modal]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Sent when this node is inside a [ScrollContainer] which has begun being " +"scrolled." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Sent when this node is inside a [ScrollContainer] which has stopped being " +"scrolled." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Show the system's arrow mouse cursor when the user hovers the node. Use with " +"[member mouse_default_cursor_shape]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Show the system's I-beam mouse cursor when the user hovers the node. The I-" +"beam pointer has a shape similar to \"I\". It tells the user they can " +"highlight or insert text." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Show the system's pointing hand mouse cursor when the user hovers the node." +msgstr "" + +#: doc/classes/Control.xml +msgid "Show the system's cross mouse cursor when the user hovers the node." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Show the system's wait mouse cursor when the user hovers the node. Often an " +"hourglass." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Show the system's busy mouse cursor when the user hovers the node. Often an " +"arrow with a small hourglass." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Show the system's drag mouse cursor, often a closed fist or a cross symbol, " +"when the user hovers the node. It tells the user they're currently dragging " +"an item, like a node in the Scene dock." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Show the system's drop mouse cursor when the user hovers the node. It can be " +"an open hand. It tells the user they can drop an item they're currently " +"grabbing, like a node in the Scene dock." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Show the system's forbidden mouse cursor when the user hovers the node. " +"Often a crossed circle." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Show the system's vertical resize mouse cursor when the user hovers the " +"node. A double-headed vertical arrow. It tells the user they can resize the " +"window or the panel vertically." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Show the system's horizontal resize mouse cursor when the user hovers the " +"node. A double-headed horizontal arrow. It tells the user they can resize " +"the window or the panel horizontally." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Show the system's window resize mouse cursor when the user hovers the node. " +"The cursor is a double-headed arrow that goes from the bottom left to the " +"top right. It tells the user they can resize the window or the panel both " +"horizontally and vertically." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Show the system's window resize mouse cursor when the user hovers the node. " +"The cursor is a double-headed arrow that goes from the top left to the " +"bottom right, the opposite of [constant CURSOR_BDIAGSIZE]. It tells the user " +"they can resize the window or the panel both horizontally and vertically." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Show the system's move mouse cursor when the user hovers the node. It shows " +"2 double-headed arrows at a 90 degree angle. It tells the user they can move " +"a UI element freely." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Show the system's vertical split mouse cursor when the user hovers the node. " +"On Windows, it's the same as [constant CURSOR_VSIZE]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Show the system's horizontal split mouse cursor when the user hovers the " +"node. On Windows, it's the same as [constant CURSOR_HSIZE]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Show the system's help mouse cursor when the user hovers the node, a " +"question mark." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Snap all 4 anchors to the top-left of the parent control's bounds. Use with " +"[method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Snap all 4 anchors to the top-right of the parent control's bounds. Use with " +"[method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Snap all 4 anchors to the bottom-left of the parent control's bounds. Use " +"with [method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Snap all 4 anchors to the bottom-right of the parent control's bounds. Use " +"with [method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Snap all 4 anchors to the center of the left edge of the parent control's " +"bounds. Use with [method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Snap all 4 anchors to the center of the top edge of the parent control's " +"bounds. Use with [method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Snap all 4 anchors to the center of the right edge of the parent control's " +"bounds. Use with [method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Snap all 4 anchors to the center of the bottom edge of the parent control's " +"bounds. Use with [method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Snap all 4 anchors to the center of the parent control's bounds. Use with " +"[method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Snap all 4 anchors to the left edge of the parent control. The left margin " +"becomes relative to the left edge and the top margin relative to the top " +"left corner of the node's parent. Use with [method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Snap all 4 anchors to the top edge of the parent control. The left margin " +"becomes relative to the top left corner, the top margin relative to the top " +"edge, and the right margin relative to the top right corner of the node's " +"parent. Use with [method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Snap all 4 anchors to the right edge of the parent control. The right margin " +"becomes relative to the right edge and the top margin relative to the top " +"right corner of the node's parent. Use with [method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Snap all 4 anchors to the bottom edge of the parent control. The left margin " +"becomes relative to the bottom left corner, the bottom margin relative to " +"the bottom edge, and the right margin relative to the bottom right corner of " +"the node's parent. Use with [method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Snap all 4 anchors to a vertical line that cuts the parent control in half. " +"Use with [method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Snap all 4 anchors to a horizontal line that cuts the parent control in " +"half. Use with [method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Snap all 4 anchors to the respective corners of the parent control. Set all " +"4 margins to 0 after you applied this preset and the [Control] will fit its " +"parent control. This is equivalent to the \"Full Rect\" layout option in the " +"editor. Use with [method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml +msgid "The control will be resized to its minimum size." +msgstr "" + +#: doc/classes/Control.xml +msgid "The control's width will not change." +msgstr "" + +#: doc/classes/Control.xml +msgid "The control's height will not change." +msgstr "" + +#: doc/classes/Control.xml +msgid "The control's size will not change." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Tells the parent [Container] to expand the bounds of this node to fill all " +"the available space without pushing any other node. Use with [member " +"size_flags_horizontal] and [member size_flags_vertical]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Tells the parent [Container] to let this node take all the available space " +"on the axis you flag. If multiple neighboring nodes are set to expand, " +"they'll share the space based on their stretch ratio. See [member " +"size_flags_stretch_ratio]. Use with [member size_flags_horizontal] and " +"[member size_flags_vertical]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Sets the node's size flags to both fill and expand. See the 2 constants " +"above for more information." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Tells the parent [Container] to center the node in itself. It centers the " +"control based on its bounding box, so it doesn't work with the fill or " +"expand size flags. Use with [member size_flags_horizontal] and [member " +"size_flags_vertical]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Tells the parent [Container] to align the node with its end, either the " +"bottom or the right edge. It doesn't work with the fill or expand size " +"flags. Use with [member size_flags_horizontal] and [member " +"size_flags_vertical]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"The control will receive mouse button input events through [method " +"_gui_input] if clicked on. And the control will receive the [signal " +"mouse_entered] and [signal mouse_exited] signals. These events are " +"automatically marked as handled, and they will not propagate further to " +"other controls. This also results in blocking signals in other controls." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"The control will receive mouse button input events through [method " +"_gui_input] if clicked on. And the control will receive the [signal " +"mouse_entered] and [signal mouse_exited] signals. If this control does not " +"handle the event, the parent control (if any) will be considered, and so on " +"until there is no more parent control to potentially handle it. This also " +"allows signals to fire in other controls. Even if no control handled it at " +"all, the event will still be handled automatically, so unhandled input will " +"not be fired." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"The control will not receive mouse button input events through [method " +"_gui_input]. The control will also not receive the [signal mouse_entered] " +"nor [signal mouse_exited] signals. This will not block other controls from " +"receiving these events or firing the signals. Ignored events will not be " +"handled automatically." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"The control will grow to the left or top to make up if its minimum size is " +"changed to be greater than its current size on the respective axis." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"The control will grow to the right or bottom to make up if its minimum size " +"is changed to be greater than its current size on the respective axis." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"The control will grow in both directions equally to make up if its minimum " +"size is changed to be greater than its current size." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Snaps one of the 4 anchor's sides to the origin of the node's [code]Rect[/" +"code], in the top left. Use it with one of the [code]anchor_*[/code] member " +"variables, like [member anchor_left]. To change all 4 anchors at once, use " +"[method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml +msgid "" +"Snaps one of the 4 anchor's sides to the end of the node's [code]Rect[/" +"code], in the bottom right. Use it with one of the [code]anchor_*[/code] " +"member variables, like [member anchor_left]. To change all 4 anchors at " +"once, use [method set_anchors_preset]." +msgstr "" + +#: doc/classes/ConvexPolygonShape.xml +msgid "Convex polygon shape for 3D physics." +msgstr "" + +#: doc/classes/ConvexPolygonShape.xml +msgid "" +"Convex polygon shape resource, which can be added to a [PhysicsBody] or area." +msgstr "" + +#: doc/classes/ConvexPolygonShape.xml +msgid "The list of 3D points forming the convex polygon shape." +msgstr "" + +#: doc/classes/ConvexPolygonShape2D.xml +msgid "Convex polygon shape for 2D physics." +msgstr "" + +#: doc/classes/ConvexPolygonShape2D.xml +msgid "" +"Convex polygon shape for 2D physics. A convex polygon, whatever its shape, " +"is internally decomposed into as many convex polygons as needed to ensure " +"all collision checks against it are always done on convex polygons (which " +"are faster to check).\n" +"The main difference between a [ConvexPolygonShape2D] and a " +"[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " +"uses a more complex method of collision detection, and a convex one forces " +"itself to be convex in order to speed up collision detection." +msgstr "" + +#: doc/classes/ConvexPolygonShape2D.xml +msgid "" +"Based on the set of points provided, this creates and assigns the [member " +"points] property using the convex hull algorithm. Removing all unneeded " +"points. See [method Geometry.convex_hull_2d] for details." +msgstr "" + +#: doc/classes/ConvexPolygonShape2D.xml +msgid "" +"The polygon's list of vertices. Can be in either clockwise or " +"counterclockwise order. Only set this property with convex hull points, use " +"[method set_point_cloud] to generate a convex hull shape from concave shape " +"points." +msgstr "" + +#: doc/classes/CPUParticles.xml +msgid "CPU-based 3D particle emitter." +msgstr "" + +#: doc/classes/CPUParticles.xml +msgid "" +"CPU-based 3D particle node used to create a variety of particle systems and " +"effects.\n" +"See also [Particles], which provides the same functionality with hardware " +"acceleration, but may not run on older devices.\n" +"[b]Note:[/b] Unlike [Particles], the visibility rect is generated on-the-fly " +"and doesn't need to be configured by the user." +msgstr "" + +#: doc/classes/CPUParticles.xml +msgid "" +"Sets this node's properties to match a given [Particles] node with an " +"assigned [ParticlesMaterial]." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "Returns the base value of the parameter specified by [enum Parameter]." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "Returns the [Curve] of the parameter specified by [enum Parameter]." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "" +"Returns the randomness factor of the parameter specified by [enum Parameter]." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "" +"Returns the enabled state of the given flag (see [enum Flags] for options)." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "Restarts the particle emitter." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "Sets the base value of the parameter specified by [enum Parameter]." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "Sets the [Curve] of the parameter specified by [enum Parameter]." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "" +"Sets the randomness factor of the parameter specified by [enum Parameter]." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "Enables or disables the given flag (see [enum Flags] for options)." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/Particles.xml doc/classes/Particles2D.xml +msgid "" +"The number of particles emitted in one emission cycle (corresponding to the " +"[member lifetime]).\n" +"[b]Note:[/b] Changing [member amount] will reset the particle emission, " +"therefore removing all particles that were already emitted before changing " +"[member amount]." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "Initial rotation applied to each particle, in degrees." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "Each particle's rotation will be animated along this [Curve]." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/ParticlesMaterial.xml +msgid "Rotation randomness ratio." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "" +"Initial angular velocity applied to each particle in [i]degrees[/i] per " +"second. Sets the speed of rotation of the particle." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "Each particle's angular velocity will vary along this [Curve]." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/ParticlesMaterial.xml +msgid "Angular velocity randomness ratio." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/ParticlesMaterial.xml +msgid "Particle animation offset." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "Each particle's animation offset will vary along this [Curve]." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/ParticlesMaterial.xml +msgid "Animation offset randomness ratio." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/ParticlesMaterial.xml +msgid "Particle animation speed." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "Each particle's animation speed will vary along this [Curve]." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/ParticlesMaterial.xml +msgid "Animation speed randomness ratio." +msgstr "" + +#: doc/classes/CPUParticles.xml +msgid "" +"Each particle's initial color. To have particle display color in a " +"[SpatialMaterial] make sure to set [member SpatialMaterial." +"vertex_color_use_as_albedo] to [code]true[/code]." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Each particle's initial color will vary along this [GradientTexture] " +"(multiplied with [member color])." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/ParticlesMaterial.xml +msgid "" +"Each particle's color will vary along this [GradientTexture] over its " +"lifetime (multiplied with [member color])." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/ParticlesMaterial.xml +msgid "The rate at which particles lose velocity." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "Damping will vary along this [Curve]." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/ParticlesMaterial.xml +msgid "Damping randomness ratio." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/ParticlesMaterial.xml +msgid "Unit vector specifying the particles' emission direction." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/Particles.xml doc/classes/Particles2D.xml +msgid "Particle draw order. Uses [enum DrawOrder] values." +msgstr "" + +#: doc/classes/CPUParticles.xml +msgid "" +"The rectangle's extents if [member emission_shape] is set to [constant " +"EMISSION_SHAPE_BOX]." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "" +"Sets the [Color]s to modulate particles by when using [constant " +"EMISSION_SHAPE_POINTS] or [constant EMISSION_SHAPE_DIRECTED_POINTS]." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "" +"Sets the direction the particles will be emitted in when using [constant " +"EMISSION_SHAPE_DIRECTED_POINTS]." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "" +"Sets the initial positions to spawn particles when using [constant " +"EMISSION_SHAPE_POINTS] or [constant EMISSION_SHAPE_DIRECTED_POINTS]." +msgstr "" + +#: doc/classes/CPUParticles.xml +msgid "" +"The axis for the ring shaped emitter when using [constant " +"EMISSION_SHAPE_RING]." +msgstr "" + +#: doc/classes/CPUParticles.xml +msgid "" +"The height for the ring shaped emitter when using [constant " +"EMISSION_SHAPE_RING]." +msgstr "" + +#: doc/classes/CPUParticles.xml +msgid "" +"The inner radius for the ring shaped emitter when using [constant " +"EMISSION_SHAPE_RING]." +msgstr "" + +#: doc/classes/CPUParticles.xml +msgid "" +"The radius for the ring shaped emitter when using [constant " +"EMISSION_SHAPE_RING]." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "" +"Particles will be emitted inside this region. See [enum EmissionShape] for " +"possible values." +msgstr "" + +#: doc/classes/CPUParticles.xml +msgid "" +"The sphere's radius if [enum EmissionShape] is set to [constant " +"EMISSION_SHAPE_SPHERE]." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/Particles.xml doc/classes/Particles2D.xml +msgid "If [code]true[/code], particles are being emitted." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/Particles2D.xml +msgid "" +"How rapidly particles in an emission cycle are emitted. If greater than " +"[code]0[/code], there will be a gap in emissions before the next cycle " +"begins." +msgstr "" + +#: doc/classes/CPUParticles.xml +msgid "" +"The particle system's frame rate is fixed to a value. For instance, changing " +"the value to 2 will make the particles render at 2 frames per second. Note " +"this does not slow down the particle system itself." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/ParticlesMaterial.xml +msgid "Align Y axis of particle with the direction of its velocity." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/ParticlesMaterial.xml +msgid "If [code]true[/code], particles will not move on the z axis." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/ParticlesMaterial.xml +msgid "If [code]true[/code], particles rotate around Y axis by [member angle]." +msgstr "" + +#: doc/classes/CPUParticles.xml +msgid "" +"Amount of [member spread] in Y/Z plane. A value of [code]1[/code] restricts " +"particles to X/Z plane." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/Particles.xml doc/classes/Particles2D.xml +msgid "" +"If [code]true[/code], results in fractional delta calculation which has a " +"smoother particles display effect." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/ParticlesMaterial.xml +msgid "Gravity applied to every particle." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/ParticlesMaterial.xml +msgid "Initial hue variation applied to each particle." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "Each particle's hue will vary along this [Curve]." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/ParticlesMaterial.xml +msgid "Hue variation randomness ratio." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Initial velocity magnitude for each particle. Direction comes from [member " +"spread] and the node's orientation." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/ParticlesMaterial.xml +msgid "Initial velocity randomness ratio." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/Particles.xml doc/classes/Particles2D.xml +msgid "The amount of time each particle will exist (in seconds)." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/ParticlesMaterial.xml +msgid "Particle lifetime randomness ratio." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Linear acceleration applied to each particle in the direction of motion." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "Each particle's linear acceleration will vary along this [Curve]." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/ParticlesMaterial.xml +msgid "Linear acceleration randomness ratio." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/Particles.xml doc/classes/Particles2D.xml +msgid "" +"If [code]true[/code], particles use the parent node's coordinate space. If " +"[code]false[/code], they use global coordinates." +msgstr "" + +#: doc/classes/CPUParticles.xml +msgid "" +"The [Mesh] used for each particle. If [code]null[/code], particles will be " +"spheres." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/Particles2D.xml +msgid "" +"If [code]true[/code], only one emission cycle occurs. If set [code]true[/" +"code] during a cycle, emission will stop at the cycle's end." +msgstr "" + +#: doc/classes/CPUParticles.xml +msgid "" +"Orbital velocity applied to each particle. Makes the particles circle around " +"origin in the local XY plane. Specified in number of full rotations around " +"origin per second.\n" +"This property is only available when [member flag_disable_z] is [code]true[/" +"code]." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "Each particle's orbital velocity will vary along this [Curve]." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/ParticlesMaterial.xml +msgid "Orbital velocity randomness ratio." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/Particles2D.xml +msgid "Particle system starts as if it had already run for this many seconds." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Radial acceleration applied to each particle. Makes particle accelerate away " +"from origin." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "Each particle's radial acceleration will vary along this [Curve]." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/ParticlesMaterial.xml +msgid "Radial acceleration randomness ratio." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/Particles2D.xml +msgid "Emission lifetime randomness ratio." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/ParticlesMaterial.xml +msgid "Initial scale applied to each particle." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "Each particle's scale will vary along this [Curve]." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/ParticlesMaterial.xml +msgid "Scale randomness ratio." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/Particles2D.xml +msgid "" +"Particle system's running speed scaling ratio. A value of [code]0[/code] can " +"be used to pause the particles." +msgstr "" + +#: doc/classes/CPUParticles.xml +msgid "" +"Each particle's initial direction range from [code]+spread[/code] to [code]-" +"spread[/code] degrees. Applied to X/Z plane and Y/Z planes." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Tangential acceleration applied to each particle. Tangential acceleration is " +"perpendicular to the particle's velocity giving the particles a swirling " +"motion." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "Each particle's tangential acceleration will vary along this [Curve]." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/ParticlesMaterial.xml +msgid "Tangential acceleration randomness ratio." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/Particles.xml doc/classes/Particles2D.xml +msgid "Particles are drawn in the order emitted." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/Particles.xml doc/classes/Particles2D.xml +msgid "Particles are drawn in order of remaining lifetime." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/Particles.xml +msgid "Particles are drawn in order of depth." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_curve] to set initial velocity properties." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_curve] to set angular velocity properties." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_curve] to set orbital velocity properties." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_curve] to set linear acceleration properties." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_curve] to set radial acceleration properties." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_curve] to set tangential acceleration properties." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_curve] to set damping properties." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_curve] to set angle properties." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_curve] to set scale properties." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_curve] to set hue variation properties." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_curve] to set animation speed properties." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_curve] to set animation offset properties." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/ParticlesMaterial.xml +msgid "Represents the size of the [enum Parameter] enum." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "Use with [method set_particle_flag] to set [member flag_align_y]." +msgstr "" + +#: doc/classes/CPUParticles.xml +msgid "Use with [method set_particle_flag] to set [member flag_rotate_y]." +msgstr "" + +#: doc/classes/CPUParticles.xml +msgid "Use with [method set_particle_flag] to set [member flag_disable_z]." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/GeometryInstance.xml doc/classes/ParticlesMaterial.xml +#: doc/classes/SpatialMaterial.xml +msgid "Represents the size of the [enum Flags] enum." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/ParticlesMaterial.xml +msgid "All particles will be emitted from a single point." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/ParticlesMaterial.xml +msgid "Particles will be emitted in the volume of a sphere." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/ParticlesMaterial.xml +msgid "Particles will be emitted in the volume of a box." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "" +"Particles will be emitted at a position chosen randomly among [member " +"emission_points]. Particle color will be modulated by [member " +"emission_colors]." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +msgid "" +"Particles will be emitted at a position chosen randomly among [member " +"emission_points]. Particle velocity and rotation will be set based on " +"[member emission_normals]. Particle color will be modulated by [member " +"emission_colors]." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/ParticlesMaterial.xml +msgid "Particles will be emitted in a ring or cylinder." +msgstr "" + +#: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml +#: doc/classes/ParticlesMaterial.xml +msgid "Represents the size of the [enum EmissionShape] enum." +msgstr "" + +#: doc/classes/CPUParticles2D.xml +msgid "CPU-based 2D particle emitter." +msgstr "" + +#: doc/classes/CPUParticles2D.xml +msgid "" +"CPU-based 2D particle node used to create a variety of particle systems and " +"effects.\n" +"See also [Particles2D], which provides the same functionality with hardware " +"acceleration, but may not run on older devices.\n" +"[b]Note:[/b] Unlike [Particles2D], the visibility rect is generated on-the-" +"fly and doesn't need to be configured by the user." +msgstr "" + +#: doc/classes/CPUParticles2D.xml +msgid "" +"Sets this node's properties to match a given [Particles2D] node with an " +"assigned [ParticlesMaterial]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml +msgid "" +"Each particle's initial color. If [member texture] is defined, it will be " +"multiplied by this color." +msgstr "" + +#: doc/classes/CPUParticles2D.xml +msgid "" +"Each particle's color will vary along this [Gradient] (multiplied with " +"[member color])." +msgstr "" + +#: doc/classes/CPUParticles2D.xml +msgid "" +"The rectangle's extents if [member emission_shape] is set to [constant " +"EMISSION_SHAPE_RECTANGLE]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml +msgid "" +"The sphere's radius if [member emission_shape] is set to [constant " +"EMISSION_SHAPE_SPHERE]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml doc/classes/Particles.xml +#: doc/classes/Particles2D.xml +msgid "" +"The particle system's frame rate is fixed to a value. For instance, changing " +"the value to 2 will make the particles render at 2 frames per second. Note " +"this does not slow down the simulation of the particle system itself." +msgstr "" + +#: doc/classes/CPUParticles2D.xml doc/classes/Particles2D.xml +msgid "" +"Normal map to be used for the [member texture] property.\n" +"[b]Note:[/b] Godot expects the normal map to use X+, Y-, and Z+ coordinates. " +"See [url=http://wiki.polycount.com/wiki/" +"Normal_Map_Technical_Details#Common_Swizzle_Coordinates]this page[/url] for " +"a comparison of normal map coordinates expected by popular engines." +msgstr "" + +#: doc/classes/CPUParticles2D.xml +msgid "" +"Orbital velocity applied to each particle. Makes the particles circle around " +"origin. Specified in number of full rotations around origin per second." +msgstr "" + +#: doc/classes/CPUParticles2D.xml doc/classes/ParticlesMaterial.xml +msgid "" +"Each particle's initial direction range from [code]+spread[/code] to [code]-" +"spread[/code] degrees." +msgstr "" + +#: doc/classes/CPUParticles2D.xml doc/classes/Particles2D.xml +msgid "Particle texture. If [code]null[/code], particles will be squares." +msgstr "" + +#: doc/classes/CPUParticles2D.xml +msgid "Present for consistency with 3D particle nodes, not used in 2D." +msgstr "" + +#: doc/classes/CPUParticles2D.xml +msgid "" +"Particles will be emitted on the surface of a sphere flattened to two " +"dimensions." +msgstr "" + +#: doc/classes/CPUParticles2D.xml +msgid "Particles will be emitted in the area of a rectangle." +msgstr "" + +#: doc/classes/Crypto.xml +msgid "Access to advanced cryptographic functionalities." +msgstr "" + +#: doc/classes/Crypto.xml +msgid "" +"The Crypto class allows you to access some more advanced cryptographic " +"functionalities in Godot.\n" +"For now, this includes generating cryptographically secure random bytes, RSA " +"keys and self-signed X509 certificates generation, asymmetric key encryption/" +"decryption, and signing/verification.\n" +"[codeblock]\n" +"extends Node\n" +"\n" +"var crypto = Crypto.new()\n" +"var key = CryptoKey.new()\n" +"var cert = X509Certificate.new()\n" +"\n" +"func _ready():\n" +" # Generate new RSA key.\n" +" key = crypto.generate_rsa(4096)\n" +" # Generate new self-signed certificate with the given key.\n" +" cert = crypto.generate_self_signed_certificate(key, \"CN=mydomain.com," +"O=My Game Company,C=IT\")\n" +" # Save key and certificate in the user folder.\n" +" key.save(\"user://generated.key\")\n" +" cert.save(\"user://generated.crt\")\n" +" # Encryption\n" +" var data = \"Some data\"\n" +" var encrypted = crypto.encrypt(key, data.to_utf8())\n" +" # Decryption\n" +" var decrypted = crypto.decrypt(key, encrypted)\n" +" # Signing\n" +" var signature = crypto.sign(HashingContext.HASH_SHA256, data." +"sha256_buffer(), key)\n" +" # Verifying\n" +" var verified = crypto.verify(HashingContext.HASH_SHA256, data." +"sha256_buffer(), signature, key)\n" +" # Checks\n" +" assert(verified)\n" +" assert(data.to_utf8() == decrypted)\n" +"[/codeblock]\n" +"[b]Note:[/b] Not available in HTML5 exports." +msgstr "" + +#: doc/classes/Crypto.xml +msgid "" +"Compares two [PoolByteArray]s for equality without leaking timing " +"information in order to prevent timing attacks.\n" +"See [url=https://paragonie.com/blog/2015/11/preventing-timing-attacks-on-" +"string-comparison-with-double-hmac-strategy]this blog post[/url] for more " +"information." +msgstr "" + +#: doc/classes/Crypto.xml +msgid "" +"Decrypt the given [code]ciphertext[/code] with the provided private " +"[code]key[/code].\n" +"[b]Note:[/b] The maximum size of accepted ciphertext is limited by the key " +"size." +msgstr "" + +#: doc/classes/Crypto.xml +msgid "" +"Encrypt the given [code]plaintext[/code] with the provided public [code]key[/" +"code].\n" +"[b]Note:[/b] The maximum size of accepted plaintext is limited by the key " +"size." +msgstr "" + +#: doc/classes/Crypto.xml +msgid "" +"Generates a [PoolByteArray] of cryptographically secure random bytes with " +"given [code]size[/code]." +msgstr "" + +#: doc/classes/Crypto.xml +msgid "" +"Generates an RSA [CryptoKey] that can be used for creating self-signed " +"certificates and passed to [method StreamPeerSSL.accept_stream]." +msgstr "" + +#: doc/classes/Crypto.xml +msgid "" +"Generates a self-signed [X509Certificate] from the given [CryptoKey] and " +"[code]issuer_name[/code]. The certificate validity will be defined by " +"[code]not_before[/code] and [code]not_after[/code] (first valid date and " +"last valid date). The [code]issuer_name[/code] must contain at least " +"\"CN=\" (common name, i.e. the domain name), \"O=\" (organization, i.e. your " +"company name), \"C=\" (country, i.e. 2 lettered ISO-3166 code of the country " +"the organization is based in).\n" +"A small example to generate an RSA key and a X509 self-signed certificate.\n" +"[codeblock]\n" +"var crypto = Crypto.new()\n" +"# Generate 4096 bits RSA key.\n" +"var key = crypto.generate_rsa(4096)\n" +"# Generate self-signed certificate using the given key.\n" +"var cert = crypto.generate_self_signed_certificate(key, \"CN=example.com,O=A " +"Game Company,C=IT\")\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Crypto.xml +msgid "" +"Generates an [url=https://en.wikipedia.org/wiki/HMAC]HMAC[/url] digest of " +"[code]msg[/code] using [code]key[/code]. The [code]hash_type[/code] " +"parameter is the hashing algorithm that is used for the inner and outer " +"hashes.\n" +"Currently, only [constant HashingContext.HASH_SHA256] and [constant " +"HashingContext.HASH_SHA1] are supported." +msgstr "" + +#: doc/classes/Crypto.xml +msgid "" +"Sign a given [code]hash[/code] of type [code]hash_type[/code] with the " +"provided private [code]key[/code]." +msgstr "" + +#: doc/classes/Crypto.xml +msgid "" +"Verify that a given [code]signature[/code] for [code]hash[/code] of type " +"[code]hash_type[/code] against the provided public [code]key[/code]." +msgstr "" + +#: doc/classes/CryptoKey.xml +msgid "A cryptographic key (RSA)." +msgstr "" + +#: doc/classes/CryptoKey.xml +msgid "" +"The CryptoKey class represents a cryptographic key. Keys can be loaded and " +"saved like any other [Resource].\n" +"They can be used to generate a self-signed [X509Certificate] via [method " +"Crypto.generate_self_signed_certificate] and as private key in [method " +"StreamPeerSSL.accept_stream] along with the appropriate certificate." +msgstr "" + +#: doc/classes/CryptoKey.xml +msgid "" +"Return [code]true[/code] if this CryptoKey only has the public part, and not " +"the private one." +msgstr "" + +#: doc/classes/CryptoKey.xml +msgid "" +"Loads a key from [code]path[/code]. If [code]public_only[/code] is " +"[code]true[/code], only the public key will be loaded.\n" +"[b]Note:[/b] [code]path[/code] should be a \"*.pub\" file if " +"[code]public_only[/code] is [code]true[/code], a \"*.key\" file otherwise." +msgstr "" + +#: doc/classes/CryptoKey.xml +msgid "" +"Loads a key from the given [code]string[/code]. If [code]public_only[/code] " +"is [code]true[/code], only the public key will be loaded." +msgstr "" + +#: doc/classes/CryptoKey.xml +msgid "" +"Saves a key to the given [code]path[/code]. If [code]public_only[/code] is " +"[code]true[/code], only the public key will be saved.\n" +"[b]Note:[/b] [code]path[/code] should be a \"*.pub\" file if " +"[code]public_only[/code] is [code]true[/code], a \"*.key\" file otherwise." +msgstr "" + +#: doc/classes/CryptoKey.xml +msgid "" +"Returns a string containing the key in PEM format. If [code]public_only[/" +"code] is [code]true[/code], only the public key will be included." +msgstr "" + +#: modules/csg/doc_classes/CSGBox.xml +msgid "A CSG Box shape." +msgstr "" + +#: modules/csg/doc_classes/CSGBox.xml +msgid "" +"This node allows you to create a box for use with the CSG system.\n" +"[b]Note:[/b] CSG nodes are intended to be used for level prototyping. " +"Creating CSG nodes has a significant CPU cost compared to creating a " +"[MeshInstance] with a [PrimitiveMesh]. Moving a CSG node within another CSG " +"node also has a significant CPU cost, so it should be avoided during " +"gameplay." +msgstr "" + +#: modules/csg/doc_classes/CSGBox.xml modules/csg/doc_classes/CSGCombiner.xml +#: modules/csg/doc_classes/CSGCylinder.xml modules/csg/doc_classes/CSGMesh.xml +#: modules/csg/doc_classes/CSGPolygon.xml +#: modules/csg/doc_classes/CSGPrimitive.xml +#: modules/csg/doc_classes/CSGShape.xml modules/csg/doc_classes/CSGSphere.xml +#: modules/csg/doc_classes/CSGTorus.xml +msgid "Prototyping levels with CSG" +msgstr "" + +#: modules/csg/doc_classes/CSGBox.xml +msgid "Depth of the box measured from the center of the box." +msgstr "" + +#: modules/csg/doc_classes/CSGBox.xml +msgid "Height of the box measured from the center of the box." +msgstr "" + +#: modules/csg/doc_classes/CSGBox.xml +msgid "The material used to render the box." +msgstr "" + +#: modules/csg/doc_classes/CSGBox.xml +msgid "Width of the box measured from the center of the box." +msgstr "" + +#: modules/csg/doc_classes/CSGCombiner.xml +msgid "A CSG node that allows you to combine other CSG modifiers." +msgstr "" + +#: modules/csg/doc_classes/CSGCombiner.xml +msgid "" +"For complex arrangements of shapes, it is sometimes needed to add structure " +"to your CSG nodes. The CSGCombiner node allows you to create this structure. " +"The node encapsulates the result of the CSG operations of its children. In " +"this way, it is possible to do operations on one set of shapes that are " +"children of one CSGCombiner node, and a set of separate operations on a " +"second set of shapes that are children of a second CSGCombiner node, and " +"then do an operation that takes the two end results as its input to create " +"the final shape.\n" +"[b]Note:[/b] CSG nodes are intended to be used for level prototyping. " +"Creating CSG nodes has a significant CPU cost compared to creating a " +"[MeshInstance] with a [PrimitiveMesh]. Moving a CSG node within another CSG " +"node also has a significant CPU cost, so it should be avoided during " +"gameplay." +msgstr "" + +#: modules/csg/doc_classes/CSGCylinder.xml +msgid "A CSG Cylinder shape." +msgstr "" + +#: modules/csg/doc_classes/CSGCylinder.xml +msgid "" +"This node allows you to create a cylinder (or cone) for use with the CSG " +"system.\n" +"[b]Note:[/b] CSG nodes are intended to be used for level prototyping. " +"Creating CSG nodes has a significant CPU cost compared to creating a " +"[MeshInstance] with a [PrimitiveMesh]. Moving a CSG node within another CSG " +"node also has a significant CPU cost, so it should be avoided during " +"gameplay." +msgstr "" + +#: modules/csg/doc_classes/CSGCylinder.xml +msgid "" +"If [code]true[/code] a cone is created, the [member radius] will only apply " +"to one side." +msgstr "" + +#: modules/csg/doc_classes/CSGCylinder.xml +msgid "The height of the cylinder." +msgstr "" + +#: modules/csg/doc_classes/CSGCylinder.xml +msgid "The material used to render the cylinder." +msgstr "" + +#: modules/csg/doc_classes/CSGCylinder.xml +msgid "The radius of the cylinder." +msgstr "" + +#: modules/csg/doc_classes/CSGCylinder.xml +msgid "" +"The number of sides of the cylinder, the higher this number the more detail " +"there will be in the cylinder." +msgstr "" + +#: modules/csg/doc_classes/CSGCylinder.xml +msgid "" +"If [code]true[/code] the normals of the cylinder are set to give a smooth " +"effect making the cylinder seem rounded. If [code]false[/code] the cylinder " +"will have a flat shaded look." +msgstr "" + +#: modules/csg/doc_classes/CSGMesh.xml +msgid "A CSG Mesh shape that uses a mesh resource." +msgstr "" + +#: modules/csg/doc_classes/CSGMesh.xml +msgid "" +"This CSG node allows you to use any mesh resource as a CSG shape, provided " +"it is closed, does not self-intersect, does not contain internal faces and " +"has no edges that connect to more than two faces. See also [CSGPolygon] for " +"drawing 2D extruded polygons to be used as CSG nodes.\n" +"[b]Note:[/b] CSG nodes are intended to be used for level prototyping. " +"Creating CSG nodes has a significant CPU cost compared to creating a " +"[MeshInstance] with a [PrimitiveMesh]. Moving a CSG node within another CSG " +"node also has a significant CPU cost, so it should be avoided during " +"gameplay." +msgstr "" + +#: modules/csg/doc_classes/CSGMesh.xml +msgid "The [Material] used in drawing the CSG shape." +msgstr "" + +#: modules/csg/doc_classes/CSGMesh.xml +msgid "" +"The [Mesh] resource to use as a CSG shape.\n" +"[b]Note:[/b] When using an [ArrayMesh], avoid meshes with vertex normals " +"unless a flat shader is required. By default, CSGMesh will ignore the mesh's " +"vertex normals and use a smooth shader calculated using the faces' normals. " +"If a flat shader is required, ensure that all faces' vertex normals are " +"parallel." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon.xml +msgid "Extrudes a 2D polygon shape to create a 3D mesh." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon.xml +msgid "" +"An array of 2D points is extruded to quickly and easily create a variety of " +"3D meshes. See also [CSGMesh] for using 3D meshes as CSG nodes.\n" +"[b]Note:[/b] CSG nodes are intended to be used for level prototyping. " +"Creating CSG nodes has a significant CPU cost compared to creating a " +"[MeshInstance] with a [PrimitiveMesh]. Moving a CSG node within another CSG " +"node also has a significant CPU cost, so it should be avoided during " +"gameplay." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon.xml +msgid "" +"When [member mode] is [constant MODE_DEPTH], the depth of the extrusion." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon.xml +msgid "" +"Material to use for the resulting mesh. The UV maps the top half of the " +"material to the extruded shape (U along the the length of the extrusions and " +"V around the outline of the [member polygon]), the bottom-left quarter to " +"the front end face, and the bottom-right quarter to the back end face." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon.xml +msgid "The [member mode] used to extrude the [member polygon]." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon.xml +msgid "" +"When [member mode] is [constant MODE_PATH], by default, the top half of the " +"[member material] is stretched along the entire length of the extruded " +"shape. If [code]false[/code] the top half of the material is repeated every " +"step of the extrusion." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon.xml +msgid "" +"When [member mode] is [constant MODE_PATH], the path interval or ratio of " +"path points to extrusions." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon.xml +msgid "" +"When [member mode] is [constant MODE_PATH], this will determine if the " +"interval should be by distance ([constant PATH_INTERVAL_DISTANCE]) or " +"subdivision fractions ([constant PATH_INTERVAL_SUBDIVIDE])." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon.xml +msgid "" +"When [member mode] is [constant MODE_PATH], if [code]true[/code] the ends of " +"the path are joined, by adding an extrusion between the last and first " +"points of the path." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon.xml +msgid "" +"When [member mode] is [constant MODE_PATH], if [code]true[/code] the " +"[Transform] of the [CSGPolygon] is used as the starting point for the " +"extrusions, not the [Transform] of the [member path_node]." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon.xml +msgid "" +"When [member mode] is [constant MODE_PATH], the location of the [Path] " +"object used to extrude the [member polygon]." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon.xml +msgid "" +"When [member mode] is [constant MODE_PATH], the [enum PathRotation] method " +"used to rotate the [member polygon] as it is extruded." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon.xml +msgid "" +"When [member mode] is [constant MODE_PATH], extrusions that are less than " +"this angle, will be merged together to reduce polygon count." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon.xml +msgid "" +"When [member mode] is [constant MODE_PATH], this is the distance along the " +"path, in meters, the texture coordinates will tile. When set to 0, texture " +"coordinates will match geometry exactly with no tiling." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon.xml +msgid "" +"The point array that defines the 2D polygon that is extruded. This can be a " +"convex or concave polygon with 3 or more points. The polygon must [i]not[/i] " +"have any intersecting edges. Otherwise, triangulation will fail and no mesh " +"will be generated.\n" +"[b]Note:[/b] If only 1 or 2 points are defined in [member polygon], no mesh " +"will be generated." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon.xml +msgid "If [code]true[/code], applies smooth shading to the extrusions." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon.xml +msgid "" +"When [member mode] is [constant MODE_SPIN], the total number of degrees the " +"[member polygon] is rotated when extruding." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon.xml +msgid "" +"When [member mode] is [constant MODE_SPIN], the number of extrusions made." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon.xml +msgid "The [member polygon] shape is extruded along the negative Z axis." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon.xml +msgid "" +"The [member polygon] shape is extruded by rotating it around the Y axis." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon.xml +msgid "" +"The [member polygon] shape is extruded along the [Path] specified in [member " +"path_node]." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon.xml +msgid "" +"The [member polygon] shape is not rotated.\n" +"[b]Note:[/b] Requires the path's Z coordinates to continually decrease to " +"ensure viable shapes." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon.xml +msgid "" +"The [member polygon] shape is rotated along the path, but it is not rotated " +"around the path axis.\n" +"[b]Note:[/b] Requires the path's Z coordinates to continually decrease to " +"ensure viable shapes." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon.xml +msgid "" +"The [member polygon] shape follows the path and its rotations around the " +"path axis." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon.xml +msgid "" +"When [member mode] is set to [constant MODE_PATH], [member path_interval] " +"will determine the distance, in meters, each interval of the path will " +"extrude." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon.xml +msgid "" +"When [member mode] is set to [constant MODE_PATH], [member path_interval] " +"will subdivide the polygons along the path." +msgstr "" + +#: modules/csg/doc_classes/CSGPrimitive.xml +msgid "Base class for CSG primitives." +msgstr "" + +#: modules/csg/doc_classes/CSGPrimitive.xml +msgid "" +"Parent class for various CSG primitives. It contains code and functionality " +"that is common between them. It cannot be used directly. Instead use one of " +"the various classes that inherit from it.\n" +"[b]Note:[/b] CSG nodes are intended to be used for level prototyping. " +"Creating CSG nodes has a significant CPU cost compared to creating a " +"[MeshInstance] with a [PrimitiveMesh]. Moving a CSG node within another CSG " +"node also has a significant CPU cost, so it should be avoided during " +"gameplay." +msgstr "" + +#: modules/csg/doc_classes/CSGPrimitive.xml +msgid "Invert the faces of the mesh." +msgstr "" + +#: modules/csg/doc_classes/CSGShape.xml +msgid "The CSG base class." +msgstr "" + +#: modules/csg/doc_classes/CSGShape.xml +msgid "" +"This is the CSG base class that provides CSG operation support to the " +"various CSG nodes in Godot.\n" +"[b]Note:[/b] CSG nodes are intended to be used for level prototyping. " +"Creating CSG nodes has a significant CPU cost compared to creating a " +"[MeshInstance] with a [PrimitiveMesh]. Moving a CSG node within another CSG " +"node also has a significant CPU cost, so it should be avoided during " +"gameplay." +msgstr "" + +#: modules/csg/doc_classes/CSGShape.xml doc/classes/RayCast2D.xml +#: doc/classes/SoftBody.xml +msgid "Returns an individual bit on the collision mask." +msgstr "" + +#: modules/csg/doc_classes/CSGShape.xml +msgid "" +"Returns an [Array] with two elements, the first is the [Transform] of this " +"node and the second is the root [Mesh] of this node. Only works when this " +"node is the root shape." +msgstr "" + +#: modules/csg/doc_classes/CSGShape.xml +msgid "" +"Returns [code]true[/code] if this is a root shape and is thus the object " +"that is rendered." +msgstr "" + +#: modules/csg/doc_classes/CSGShape.xml doc/classes/SoftBody.xml +msgid "" +"Sets individual bits on the layer mask. Use this if you only need to change " +"one layer's value." +msgstr "" + +#: modules/csg/doc_classes/CSGShape.xml doc/classes/SoftBody.xml +msgid "" +"Sets individual bits on the collision mask. Use this if you only need to " +"change one layer's value." +msgstr "" + +#: modules/csg/doc_classes/CSGShape.xml +msgid "" +"Calculate tangents for the CSG shape which allows the use of normal maps. " +"This is only applied on the root shape, this setting is ignored on any child." +msgstr "" + +#: modules/csg/doc_classes/CSGShape.xml +msgid "" +"The physics layers this area is in.\n" +"Collidable objects can exist in any of 32 different layers. These layers " +"work like a tagging system, and are not visual. A collidable can use these " +"layers to select with which objects it can collide, using the collision_mask " +"property.\n" +"A contact is detected if object A is in any of the layers that object B " +"scans, or object B is in any layer scanned by object A. See [url=$DOCS_URL/" +"tutorials/physics/physics_introduction.html#collision-layers-and-" +"masks]Collision layers and masks[/url] in the documentation for more " +"information." +msgstr "" + +#: modules/csg/doc_classes/CSGShape.xml +msgid "" +"The physics layers this CSG shape scans for collisions. See [url=$DOCS_URL/" +"tutorials/physics/physics_introduction.html#collision-layers-and-" +"masks]Collision layers and masks[/url] in the documentation for more " +"information." +msgstr "" + +#: modules/csg/doc_classes/CSGShape.xml +msgid "" +"The operation that is performed on this shape. This is ignored for the first " +"CSG child node as the operation is between this node and the previous child " +"of this nodes parent." +msgstr "" + +#: modules/csg/doc_classes/CSGShape.xml +msgid "" +"Snap makes the mesh snap to a given distance so that the faces of two meshes " +"can be perfectly aligned. A lower value results in greater precision but may " +"be harder to adjust." +msgstr "" + +#: modules/csg/doc_classes/CSGShape.xml +msgid "" +"Adds a collision shape to the physics engine for our CSG shape. This will " +"always act like a static body. Note that the collision shape is still active " +"even if the CSG shape itself is hidden." +msgstr "" + +#: modules/csg/doc_classes/CSGShape.xml +msgid "" +"Geometry of both primitives is merged, intersecting geometry is removed." +msgstr "" + +#: modules/csg/doc_classes/CSGShape.xml +msgid "Only intersecting geometry remains, the rest is removed." +msgstr "" + +#: modules/csg/doc_classes/CSGShape.xml +msgid "" +"The second shape is subtracted from the first, leaving a dent with its shape." +msgstr "" + +#: modules/csg/doc_classes/CSGSphere.xml +msgid "A CSG Sphere shape." +msgstr "" + +#: modules/csg/doc_classes/CSGSphere.xml +msgid "" +"This node allows you to create a sphere for use with the CSG system.\n" +"[b]Note:[/b] CSG nodes are intended to be used for level prototyping. " +"Creating CSG nodes has a significant CPU cost compared to creating a " +"[MeshInstance] with a [PrimitiveMesh]. Moving a CSG node within another CSG " +"node also has a significant CPU cost, so it should be avoided during " +"gameplay." +msgstr "" + +#: modules/csg/doc_classes/CSGSphere.xml +msgid "The material used to render the sphere." +msgstr "" + +#: modules/csg/doc_classes/CSGSphere.xml +msgid "Number of vertical slices for the sphere." +msgstr "" + +#: modules/csg/doc_classes/CSGSphere.xml +msgid "Radius of the sphere." +msgstr "" + +#: modules/csg/doc_classes/CSGSphere.xml +msgid "Number of horizontal slices for the sphere." +msgstr "" + +#: modules/csg/doc_classes/CSGSphere.xml +msgid "" +"If [code]true[/code] the normals of the sphere are set to give a smooth " +"effect making the sphere seem rounded. If [code]false[/code] the sphere will " +"have a flat shaded look." +msgstr "" + +#: modules/csg/doc_classes/CSGTorus.xml +msgid "A CSG Torus shape." +msgstr "" + +#: modules/csg/doc_classes/CSGTorus.xml +msgid "" +"This node allows you to create a torus for use with the CSG system.\n" +"[b]Note:[/b] CSG nodes are intended to be used for level prototyping. " +"Creating CSG nodes has a significant CPU cost compared to creating a " +"[MeshInstance] with a [PrimitiveMesh]. Moving a CSG node within another CSG " +"node also has a significant CPU cost, so it should be avoided during " +"gameplay." +msgstr "" + +#: modules/csg/doc_classes/CSGTorus.xml +msgid "The inner radius of the torus." +msgstr "" + +#: modules/csg/doc_classes/CSGTorus.xml +msgid "The material used to render the torus." +msgstr "" + +#: modules/csg/doc_classes/CSGTorus.xml +msgid "The outer radius of the torus." +msgstr "" + +#: modules/csg/doc_classes/CSGTorus.xml +msgid "The number of edges each ring of the torus is constructed of." +msgstr "" + +#: modules/csg/doc_classes/CSGTorus.xml +msgid "The number of slices the torus is constructed of." +msgstr "" + +#: modules/csg/doc_classes/CSGTorus.xml +msgid "" +"If [code]true[/code] the normals of the torus are set to give a smooth " +"effect making the torus seem rounded. If [code]false[/code] the torus will " +"have a flat shaded look." +msgstr "" + +#: modules/mono/doc_classes/CSharpScript.xml +msgid "" +"A script implemented in the C# programming language (Mono-enabled builds " +"only)." +msgstr "" + +#: modules/mono/doc_classes/CSharpScript.xml +msgid "" +"This class represents a C# script. It is the C# equivalent of the [GDScript] " +"class and is only available in Mono-enabled Godot builds.\n" +"See also [GodotSharp]." +msgstr "" + +#: modules/mono/doc_classes/CSharpScript.xml +#: modules/gdnative/doc_classes/PluginScript.xml +msgid "Returns a new instance of the script." +msgstr "" + +#: doc/classes/CubeMap.xml +msgid "A CubeMap is a 6-sided 3D texture." +msgstr "" + +#: doc/classes/CubeMap.xml +msgid "" +"A 6-sided 3D texture typically used for faking reflections. It can be used " +"to make an object look as if it's reflecting its surroundings. This usually " +"delivers much better performance than other reflection methods." +msgstr "" + +#: doc/classes/CubeMap.xml +msgid "Returns the [CubeMap]'s height." +msgstr "" + +#: doc/classes/CubeMap.xml +msgid "" +"Returns an [Image] for a side of the [CubeMap] using one of the [enum Side] " +"constants." +msgstr "" + +#: doc/classes/CubeMap.xml +msgid "Returns the [CubeMap]'s width." +msgstr "" + +#: doc/classes/CubeMap.xml +msgid "" +"Sets an [Image] for a side of the [CubeMap] using one of the [enum Side] " +"constants." +msgstr "" + +#: doc/classes/CubeMap.xml +msgid "" +"The render flags for the [CubeMap]. See the [enum Flags] constants for " +"details." +msgstr "" + +#: doc/classes/CubeMap.xml +msgid "" +"The lossy storage quality of the [CubeMap] if the storage mode is set to " +"[constant STORAGE_COMPRESS_LOSSY]." +msgstr "" + +#: doc/classes/CubeMap.xml +msgid "The [CubeMap]'s storage mode. See [enum Storage] constants." +msgstr "" + +#: doc/classes/CubeMap.xml +msgid "Store the [CubeMap] without any compression." +msgstr "" + +#: doc/classes/CubeMap.xml +msgid "Store the [CubeMap] with strong compression that reduces image quality." +msgstr "" + +#: doc/classes/CubeMap.xml +msgid "" +"Store the [CubeMap] with moderate compression that doesn't reduce image " +"quality." +msgstr "" + +#: doc/classes/CubeMap.xml +msgid "Identifier for the left face of the [CubeMap]." +msgstr "" + +#: doc/classes/CubeMap.xml +msgid "Identifier for the right face of the [CubeMap]." +msgstr "" + +#: doc/classes/CubeMap.xml +msgid "Identifier for the bottom face of the [CubeMap]." +msgstr "" + +#: doc/classes/CubeMap.xml +msgid "Identifier for the top face of the [CubeMap]." +msgstr "" + +#: doc/classes/CubeMap.xml +msgid "Identifier for the front face of the [CubeMap]." +msgstr "" + +#: doc/classes/CubeMap.xml +msgid "Identifier for the back face of the [CubeMap]." +msgstr "" + +#: doc/classes/CubeMap.xml +msgid "Generate mipmaps, to enable smooth zooming out of the texture." +msgstr "" + +#: doc/classes/CubeMap.xml +msgid "Repeat (instead of clamp to edge)." +msgstr "" + +#: doc/classes/CubeMap.xml +msgid "Turn on magnifying filter, to enable smooth zooming in of the texture." +msgstr "" + +#: doc/classes/CubeMap.xml +msgid "Default flags. Generate mipmaps, repeat, and filter are enabled." +msgstr "" + +#: doc/classes/CubeMesh.xml +msgid "Generate an axis-aligned cuboid [PrimitiveMesh]." +msgstr "" + +#: doc/classes/CubeMesh.xml +msgid "" +"Generate an axis-aligned cuboid [PrimitiveMesh].\n" +"The cube's UV layout is arranged in a 3×2 layout that allows texturing each " +"face individually. To apply the same texture on all faces, change the " +"material's UV property to [code]Vector3(3, 2, 1)[/code].\n" +"[b]Note:[/b] When using a large textured [CubeMesh] (e.g. as a floor), you " +"may stumble upon UV jittering issues depending on the camera angle. To solve " +"this, increase [member subdivide_depth], [member subdivide_height] and " +"[member subdivide_width] until you no longer notice UV jittering." +msgstr "" + +#: doc/classes/CubeMesh.xml +msgid "Size of the cuboid mesh." +msgstr "" + +#: doc/classes/CubeMesh.xml +msgid "Number of extra edge loops inserted along the Z axis." +msgstr "" + +#: doc/classes/CubeMesh.xml +msgid "Number of extra edge loops inserted along the Y axis." +msgstr "" + +#: doc/classes/CubeMesh.xml +msgid "Number of extra edge loops inserted along the X axis." +msgstr "" + +#: doc/classes/CullInstance.xml +msgid "Parent of all nodes that can be culled by the Portal system." +msgstr "" + +#: doc/classes/CullInstance.xml +msgid "" +"Provides common functionality to nodes that can be culled by the [Portal] " +"system.\n" +"[code]Static[/code] and [code]Dynamic[/code] objects are the most " +"efficiently managed objects in the system, but there are some caveats. They " +"are expected to be present initially when [Room]s are converted using the " +"[RoomManager] [code]rooms_convert[/code] function, and their lifetime should " +"be the same as the game level (i.e. present until you call " +"[code]rooms_clear[/code] on the [RoomManager]. Although you shouldn't " +"create / delete these objects during gameplay, you can manage their " +"visibility with the standard [code]hide[/code] and [code]show[/code] " +"commands.\n" +"[code]Roaming[/code] objects on the other hand, require extra processing to " +"keep track of which [Room] they are within. This enables them to be culled " +"effectively, wherever they are.\n" +"[code]Global[/code] objects are not culled by the portal system, and use " +"view frustum culling only.\n" +"Objects that are not [code]Static[/code] or [code]Dynamic[/code] can be " +"freely created and deleted during the lifetime of the game level." +msgstr "" + +#: doc/classes/CullInstance.xml +msgid "" +"This allows fine control over the mesh merging feature in the " +"[RoomManager].\n" +"Setting this option to [code]false[/code] can be used to prevent an instance " +"being merged." +msgstr "" + +#: doc/classes/CullInstance.xml +msgid "" +"When set to [code]0[/code], [CullInstance]s will be autoplaced in the [Room] " +"with the highest priority.\n" +"When set to a value other than [code]0[/code], the system will attempt to " +"autoplace in a [Room] with the [code]autoplace_priority[/code], if it is " +"present.\n" +"This can be used to control autoplacement of building exteriors in an outer " +"[RoomGroup]." +msgstr "" + +#: doc/classes/CullInstance.xml +msgid "" +"When a manual bound has not been explicitly specified for a [Room], the " +"convex hull bound will be estimated from the geometry of the objects within " +"the room. This setting determines whether the geometry of an object is " +"included in this estimate of the room bound.\n" +"[b]Note:[/b] This setting is only relevant when the object is set to " +"[code]PORTAL_MODE_STATIC[/code] or [code]PORTAL_MODE_DYNAMIC[/code], and for " +"[Portal]s." +msgstr "" + +#: doc/classes/CullInstance.xml +msgid "" +"When using [Room]s and [Portal]s, this specifies how the [CullInstance] is " +"processed in the system." +msgstr "" + +#: doc/classes/CullInstance.xml +msgid "" +"Use for instances within [Room]s that will [b]not move[/b] - e.g. walls, " +"floors.\n" +"[b]Note:[/b] If you attempt to delete a [code]PORTAL_MODE_STATIC[/code] " +"instance while the room graph is loaded (converted), it will unload the room " +"graph and deactivate portal culling. This is because the [b]room graph[/b] " +"data has been invalidated. You will need to reconvert the rooms using the " +"[RoomManager] to activate the system again." +msgstr "" + +#: doc/classes/CullInstance.xml +msgid "" +"Use for instances within rooms that will move but [b]not change room[/b] - e." +"g. moving platforms.\n" +"[b]Note:[/b] If you attempt to delete a [code]PORTAL_MODE_DYNAMIC[/code] " +"instance while the room graph is loaded (converted), it will unload the room " +"graph and deactivate portal culling. This is because the [b]room graph[/b] " +"data has been invalidated. You will need to reconvert the rooms using the " +"[RoomManager] to activate the system again." +msgstr "" + +#: doc/classes/CullInstance.xml +msgid "Use for instances that will move [b]between[/b] [Room]s - e.g. players." +msgstr "" + +#: doc/classes/CullInstance.xml +msgid "" +"Use for instances that will be frustum culled only - e.g. first person " +"weapon, debug." +msgstr "" + +#: doc/classes/CullInstance.xml +msgid "" +"Use for instances that will not be shown at all - e.g. [b]manual room " +"bounds[/b] (specified by prefix [i]'Bound_'[/i])." +msgstr "" + +#: doc/classes/Curve.xml +msgid "A mathematic curve." +msgstr "" + +#: doc/classes/Curve.xml +msgid "" +"A curve that can be saved and re-used for other objects. By default, it " +"ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." +msgstr "" + +#: doc/classes/Curve.xml +msgid "" +"Adds a point to the curve. For each side, if the [code]*_mode[/code] is " +"[constant TANGENT_LINEAR], the [code]*_tangent[/code] angle (in degrees) " +"uses the slope of the curve halfway to the adjacent point. Allows custom " +"assignments to the [code]*_tangent[/code] angle if [code]*_mode[/code] is " +"set to [constant TANGENT_FREE]." +msgstr "" + +#: doc/classes/Curve.xml +msgid "Recomputes the baked cache of points for the curve." +msgstr "" + +#: doc/classes/Curve.xml +msgid "" +"Removes points that are closer than [code]CMP_EPSILON[/code] (0.00001) units " +"to their neighbor on the curve." +msgstr "" + +#: doc/classes/Curve.xml doc/classes/Curve2D.xml doc/classes/Curve3D.xml +msgid "Removes all points from the curve." +msgstr "" + +#: doc/classes/Curve.xml doc/classes/Curve2D.xml doc/classes/Curve3D.xml +msgid "Returns the number of points describing the curve." +msgstr "" + +#: doc/classes/Curve.xml +msgid "" +"Returns the left [enum TangentMode] for the point at [code]index[/code]." +msgstr "" + +#: doc/classes/Curve.xml +msgid "" +"Returns the left tangent angle (in degrees) for the point at [code]index[/" +"code]." +msgstr "" + +#: doc/classes/Curve.xml +msgid "Returns the curve coordinates for the point at [code]index[/code]." +msgstr "" + +#: doc/classes/Curve.xml +msgid "" +"Returns the right [enum TangentMode] for the point at [code]index[/code]." +msgstr "" + +#: doc/classes/Curve.xml +msgid "" +"Returns the right tangent angle (in degrees) for the point at [code]index[/" +"code]." +msgstr "" + +#: doc/classes/Curve.xml +msgid "" +"Returns the Y value for the point that would exist at the X position " +"[code]offset[/code] along the curve." +msgstr "" + +#: doc/classes/Curve.xml +msgid "" +"Returns the Y value for the point that would exist at the X position " +"[code]offset[/code] along the curve using the baked cache. Bakes the curve's " +"points if not already baked." +msgstr "" + +#: doc/classes/Curve.xml +msgid "Removes the point at [code]index[/code] from the curve." +msgstr "" + +#: doc/classes/Curve.xml +msgid "" +"Sets the left [enum TangentMode] for the point at [code]index[/code] to " +"[code]mode[/code]." +msgstr "" + +#: doc/classes/Curve.xml +msgid "" +"Sets the left tangent angle for the point at [code]index[/code] to " +"[code]tangent[/code]." +msgstr "" + +#: doc/classes/Curve.xml +msgid "Sets the offset from [code]0.5[/code]." +msgstr "" + +#: doc/classes/Curve.xml +msgid "" +"Sets the right [enum TangentMode] for the point at [code]index[/code] to " +"[code]mode[/code]." +msgstr "" + +#: doc/classes/Curve.xml +msgid "" +"Sets the right tangent angle for the point at [code]index[/code] to " +"[code]tangent[/code]." +msgstr "" + +#: doc/classes/Curve.xml +msgid "" +"Assigns the vertical position [code]y[/code] to the point at [code]index[/" +"code]." +msgstr "" + +#: doc/classes/Curve.xml +msgid "The number of points to include in the baked (i.e. cached) curve data." +msgstr "" + +#: doc/classes/Curve.xml +msgid "The maximum value the curve can reach." +msgstr "" + +#: doc/classes/Curve.xml +msgid "The minimum value the curve can reach." +msgstr "" + +#: doc/classes/Curve.xml +msgid "Emitted when [member max_value] or [member min_value] is changed." +msgstr "" + +#: doc/classes/Curve.xml +msgid "The tangent on this side of the point is user-defined." +msgstr "" + +#: doc/classes/Curve.xml +msgid "" +"The curve calculates the tangent on this side of the point as the slope " +"halfway towards the adjacent point." +msgstr "" + +#: doc/classes/Curve.xml +msgid "The total number of available tangent modes." +msgstr "" + +#: doc/classes/Curve2D.xml +msgid "Describes a Bézier curve in 2D space." +msgstr "" + +#: doc/classes/Curve2D.xml +msgid "" +"This class describes a Bézier curve in 2D space. It is mainly used to give a " +"shape to a [Path2D], but can be manually sampled for other purposes.\n" +"It keeps a cache of precalculated points along the curve, to speed up " +"further calculations." +msgstr "" + +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml +msgid "" +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." +msgstr "" + +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml +msgid "" +"Returns the total length of the curve, based on the cached points. Given " +"enough density (see [member bake_interval]), it should be approximate enough." +msgstr "" + +#: doc/classes/Curve2D.xml +msgid "Returns the cache of points as a [PoolVector2Array]." +msgstr "" + +#: doc/classes/Curve2D.xml +msgid "" +"Returns the closest offset to [code]to_point[/code]. This offset is meant to " +"be used in [method interpolate_baked].\n" +"[code]to_point[/code] must be in this curve's local space." +msgstr "" + +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml +msgid "" +"Returns the closest baked point (in curve's local space) to [code]to_point[/" +"code].\n" +"[code]to_point[/code] must be in this curve's local space." +msgstr "" + +#: doc/classes/Curve2D.xml +msgid "" +"Returns the position of the control point leading to the vertex [code]idx[/" +"code]. The returned position is relative to the vertex [code]idx[/code]. If " +"the index is out of bounds, the function sends an error to the console, and " +"returns [code](0, 0)[/code]." +msgstr "" + +#: doc/classes/Curve2D.xml +msgid "" +"Returns the position of the control point leading out of the vertex " +"[code]idx[/code]. The returned position is relative to the vertex [code]idx[/" +"code]. If the index is out of bounds, the function sends an error to the " +"console, and returns [code](0, 0)[/code]." +msgstr "" + +#: doc/classes/Curve2D.xml +msgid "" +"Returns the position of the vertex [code]idx[/code]. If the index is out of " +"bounds, the function sends an error to the console, and returns [code](0, 0)" +"[/code]." +msgstr "" + +#: doc/classes/Curve2D.xml +msgid "" +"Returns the position between the vertex [code]idx[/code] and the vertex " +"[code]idx + 1[/code], where [code]t[/code] controls if the point is the " +"first vertex ([code]t = 0.0[/code]), the last vertex ([code]t = 1.0[/code]), " +"or in between. Values of [code]t[/code] outside the range ([code]0.0 >= t " +"<=1[/code]) give strange, but predictable results.\n" +"If [code]idx[/code] is out of bounds it is truncated to the first or last " +"vertex, and [code]t[/code] is ignored. If the curve has no points, the " +"function sends an error to the console, and returns [code](0, 0)[/code]." +msgstr "" + +#: doc/classes/Curve2D.xml +msgid "" +"Returns a point within the curve at position [code]offset[/code], where " +"[code]offset[/code] is measured as a pixel distance along the curve.\n" +"To do that, it finds the two cached points where the [code]offset[/code] " +"lies between, then interpolates the values. This interpolation is cubic if " +"[code]cubic[/code] is set to [code]true[/code], or linear if set to " +"[code]false[/code].\n" +"Cubic interpolation tends to follow the curves better, but linear is faster " +"(and often, precise enough)." +msgstr "" + +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml +msgid "" +"Returns the position at the vertex [code]fofs[/code]. It calls [method " +"interpolate] using the integer part of [code]fofs[/code] as [code]idx[/" +"code], and its fractional part as [code]t[/code]." +msgstr "" + +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml +msgid "" +"Deletes the point [code]idx[/code] from the curve. Sends an error to the " +"console if [code]idx[/code] is out of bounds." +msgstr "" + +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml +msgid "" +"Sets the position of the control point leading to the vertex [code]idx[/" +"code]. If the index is out of bounds, the function sends an error to the " +"console. The position is relative to the vertex." +msgstr "" + +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml +msgid "" +"Sets the position of the control point leading out of the vertex [code]idx[/" +"code]. If the index is out of bounds, the function sends an error to the " +"console. The position is relative to the vertex." +msgstr "" + +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml +msgid "" +"Sets the position for the vertex [code]idx[/code]. If the index is out of " +"bounds, the function sends an error to the console." +msgstr "" + +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml +msgid "" +"Returns a list of points along the curve, with a curvature controlled point " +"density. That is, the curvier parts will have more points than the " +"straighter parts.\n" +"This approximation makes straight segments between each point, then " +"subdivides those segments until the resulting shape is similar enough.\n" +"[code]max_stages[/code] controls how many subdivisions a curve segment may " +"face before it is considered approximate enough. Each subdivision splits the " +"segment in half, so the default 5 stages may mean up to 32 subdivisions per " +"curve segment. Increase with care!\n" +"[code]tolerance_degrees[/code] controls how many degrees the midpoint of a " +"segment may deviate from the real curve, before the segment has to be " +"subdivided." +msgstr "" + +#: doc/classes/Curve2D.xml +msgid "" +"The distance in pixels between two adjacent cached points. Changing it " +"forces the cache to be recomputed the next time the [method " +"get_baked_points] or [method get_baked_length] function is called. The " +"smaller the distance, the more points in the cache and the more memory it " +"will consume, so use with care." +msgstr "" + +#: doc/classes/Curve3D.xml +msgid "Describes a Bézier curve in 3D space." +msgstr "" + +#: doc/classes/Curve3D.xml +msgid "" +"This class describes a Bézier curve in 3D space. It is mainly used to give a " +"shape to a [Path], but can be manually sampled for other purposes.\n" +"It keeps a cache of precalculated points along the curve, to speed up " +"further calculations." +msgstr "" + +#: doc/classes/Curve3D.xml +msgid "Returns the cache of points as a [PoolVector3Array]." +msgstr "" + +#: doc/classes/Curve3D.xml +msgid "Returns the cache of tilts as a [PoolRealArray]." +msgstr "" + +#: doc/classes/Curve3D.xml +msgid "" +"Returns the cache of up vectors as a [PoolVector3Array].\n" +"If [member up_vector_enabled] is [code]false[/code], the cache will be empty." +msgstr "" + +#: doc/classes/Curve3D.xml +msgid "" +"Returns the closest offset to [code]to_point[/code]. This offset is meant to " +"be used in [method interpolate_baked] or [method " +"interpolate_baked_up_vector].\n" +"[code]to_point[/code] must be in this curve's local space." +msgstr "" + +#: doc/classes/Curve3D.xml +msgid "" +"Returns the position of the control point leading to the vertex [code]idx[/" +"code]. The returned position is relative to the vertex [code]idx[/code]. If " +"the index is out of bounds, the function sends an error to the console, and " +"returns [code](0, 0, 0)[/code]." +msgstr "" + +#: doc/classes/Curve3D.xml +msgid "" +"Returns the position of the control point leading out of the vertex " +"[code]idx[/code]. The returned position is relative to the vertex [code]idx[/" +"code]. If the index is out of bounds, the function sends an error to the " +"console, and returns [code](0, 0, 0)[/code]." +msgstr "" + +#: doc/classes/Curve3D.xml +msgid "" +"Returns the position of the vertex [code]idx[/code]. If the index is out of " +"bounds, the function sends an error to the console, and returns [code](0, 0, " +"0)[/code]." +msgstr "" + +#: doc/classes/Curve3D.xml +msgid "" +"Returns the tilt angle in radians for the point [code]idx[/code]. If the " +"index is out of bounds, the function sends an error to the console, and " +"returns [code]0[/code]." +msgstr "" + +#: doc/classes/Curve3D.xml +msgid "" +"Returns the position between the vertex [code]idx[/code] and the vertex " +"[code]idx + 1[/code], where [code]t[/code] controls if the point is the " +"first vertex ([code]t = 0.0[/code]), the last vertex ([code]t = 1.0[/code]), " +"or in between. Values of [code]t[/code] outside the range ([code]0.0 >= t " +"<=1[/code]) give strange, but predictable results.\n" +"If [code]idx[/code] is out of bounds it is truncated to the first or last " +"vertex, and [code]t[/code] is ignored. If the curve has no points, the " +"function sends an error to the console, and returns [code](0, 0, 0)[/code]." +msgstr "" + +#: doc/classes/Curve3D.xml +msgid "" +"Returns a point within the curve at position [code]offset[/code], where " +"[code]offset[/code] is measured as a distance in 3D units along the curve.\n" +"To do that, it finds the two cached points where the [code]offset[/code] " +"lies between, then interpolates the values. This interpolation is cubic if " +"[code]cubic[/code] is set to [code]true[/code], or linear if set to " +"[code]false[/code].\n" +"Cubic interpolation tends to follow the curves better, but linear is faster " +"(and often, precise enough)." +msgstr "" + +#: doc/classes/Curve3D.xml +msgid "" +"Returns an up vector within the curve at position [code]offset[/code], where " +"[code]offset[/code] is measured as a distance in 3D units along the curve.\n" +"To do that, it finds the two cached up vectors where the [code]offset[/code] " +"lies between, then interpolates the values. If [code]apply_tilt[/code] is " +"[code]true[/code], an interpolated tilt is applied to the interpolated up " +"vector.\n" +"If the curve has no up vectors, the function sends an error to the console, " +"and returns [code](0, 1, 0)[/code]." +msgstr "" + +#: doc/classes/Curve3D.xml +msgid "" +"Sets the tilt angle in radians for the point [code]idx[/code]. If the index " +"is out of bounds, the function sends an error to the console.\n" +"The tilt controls the rotation along the look-at axis an object traveling " +"the path would have. In the case of a curve controlling a [PathFollow], this " +"tilt is an offset over the natural tilt the [PathFollow] calculates." +msgstr "" + +#: doc/classes/Curve3D.xml +msgid "" +"The distance in meters between two adjacent cached points. Changing it " +"forces the cache to be recomputed the next time the [method " +"get_baked_points] or [method get_baked_length] function is called. The " +"smaller the distance, the more points in the cache and the more memory it " +"will consume, so use with care." +msgstr "" + +#: doc/classes/Curve3D.xml +msgid "" +"If [code]true[/code], the curve will bake up vectors used for orientation. " +"This is used when [member PathFollow.rotation_mode] is set to [constant " +"PathFollow.ROTATION_ORIENTED]. Changing it forces the cache to be recomputed." +msgstr "" + +#: doc/classes/CurveTexture.xml +msgid "A texture that shows a curve." +msgstr "" + +#: doc/classes/CurveTexture.xml +msgid "" +"Renders a given [Curve] provided to it. Simplifies the task of drawing " +"curves and/or saving them as image files." +msgstr "" + +#: doc/classes/CurveTexture.xml +msgid "The [Curve] that is rendered onto the texture." +msgstr "" + +#: doc/classes/CurveTexture.xml +msgid "" +"The width of the texture (in pixels). Higher values make it possible to " +"represent high-frequency data better (such as sudden direction changes), at " +"the cost of increased generation time and memory usage." +msgstr "" + +#: doc/classes/CylinderMesh.xml +msgid "Class representing a cylindrical [PrimitiveMesh]." +msgstr "" + +#: doc/classes/CylinderMesh.xml +msgid "" +"Class representing a cylindrical [PrimitiveMesh]. This class can be used to " +"create cones by setting either the [member top_radius] or [member " +"bottom_radius] properties to [code]0.0[/code]." +msgstr "" + +#: doc/classes/CylinderMesh.xml +msgid "" +"Bottom radius of the cylinder. If set to [code]0.0[/code], the bottom faces " +"will not be generated, resulting in a conic shape." +msgstr "" + +#: doc/classes/CylinderMesh.xml +msgid "Full height of the cylinder." +msgstr "" + +#: doc/classes/CylinderMesh.xml +msgid "" +"Number of radial segments on the cylinder. Higher values result in a more " +"detailed cylinder/cone at the cost of performance." +msgstr "" + +#: doc/classes/CylinderMesh.xml +msgid "" +"Number of edge rings along the height of the cylinder. Changing [member " +"rings] does not have any visual impact unless a shader or procedural mesh " +"tool is used to alter the vertex data. Higher values result in more " +"subdivisions, which can be used to create smoother-looking effects with " +"shaders or procedural mesh tools (at the cost of performance). When not " +"altering the vertex data using a shader or procedural mesh tool, [member " +"rings] should be kept to its default value." +msgstr "" + +#: doc/classes/CylinderMesh.xml +msgid "" +"Top radius of the cylinder. If set to [code]0.0[/code], the top faces will " +"not be generated, resulting in a conic shape." +msgstr "" + +#: doc/classes/CylinderShape.xml +msgid "Cylinder shape for collisions." +msgstr "" + +#: doc/classes/CylinderShape.xml +msgid "The cylinder's height." +msgstr "" + +#: doc/classes/CylinderShape.xml +msgid "The cylinder's radius." +msgstr "" + +#: doc/classes/DampedSpringJoint2D.xml +msgid "Damped spring constraint for 2D physics." +msgstr "" + +#: doc/classes/DampedSpringJoint2D.xml +msgid "" +"Damped spring constraint for 2D physics. This resembles a spring joint that " +"always wants to go back to a given length." +msgstr "" + +#: doc/classes/DampedSpringJoint2D.xml +msgid "" +"The spring joint's damping ratio. A value between [code]0[/code] and " +"[code]1[/code]. When the two bodies move into different directions the " +"system tries to align them to the spring axis again. A high [code]damping[/" +"code] value forces the attached bodies to align faster." +msgstr "" + +#: doc/classes/DampedSpringJoint2D.xml +msgid "" +"The spring joint's maximum length. The two attached bodies cannot stretch it " +"past this value." +msgstr "" + +#: doc/classes/DampedSpringJoint2D.xml +msgid "" +"When the bodies attached to the spring joint move they stretch or squash it. " +"The joint always tries to resize towards this length." +msgstr "" + +#: doc/classes/DampedSpringJoint2D.xml +msgid "" +"The higher the value, the less the bodies attached to the joint will deform " +"it. The joint applies an opposing force to the bodies, the product of the " +"stiffness multiplied by the size difference from its resting length." +msgstr "" + +#: doc/classes/Dictionary.xml +msgid "Dictionary type." +msgstr "" + +#: doc/classes/Dictionary.xml +msgid "" +"Dictionary type. Associative container which contains values referenced by " +"unique keys. Dictionaries are composed of pairs of keys (which must be " +"unique) and values. Dictionaries will preserve the insertion order when " +"adding elements, even though this may not be reflected when printing the " +"dictionary. In other programming languages, this data structure is sometimes " +"referred to as a hash map or associative array.\n" +"You can define a dictionary by placing a comma-separated list of [code]key: " +"value[/code] pairs in curly braces [code]{}[/code].\n" +"Erasing elements while iterating over them [b]is not supported[/b] and will " +"result in undefined behavior.\n" +"[b]Note:[/b] Dictionaries are always passed by reference. To get a copy of a " +"dictionary which can be modified independently of the original dictionary, " +"use [method duplicate].\n" +"Creating a dictionary:\n" +"[codeblock]\n" +"var my_dict = {} # Creates an empty dictionary.\n" +"\n" +"var dict_variable_key = \"Another key name\"\n" +"var dict_variable_value = \"value2\"\n" +"var another_dict = {\n" +" \"Some key name\": \"value1\",\n" +" dict_variable_key: dict_variable_value,\n" +"}\n" +"\n" +"var points_dict = {\"White\": 50, \"Yellow\": 75, \"Orange\": 100}\n" +"\n" +"# Alternative Lua-style syntax.\n" +"# Doesn't require quotes around keys, but only string constants can be used " +"as key names.\n" +"# Additionally, key names must start with a letter or an underscore.\n" +"# Here, `some_key` is a string literal, not a variable!\n" +"another_dict = {\n" +" some_key = 42,\n" +"}\n" +"[/codeblock]\n" +"You can access a dictionary's values by referencing the appropriate key. In " +"the above example, [code]points_dict[\"White\"][/code] will return [code]50[/" +"code]. You can also write [code]points_dict.White[/code], which is " +"equivalent. However, you'll have to use the bracket syntax if the key you're " +"accessing the dictionary with isn't a fixed string (such as a number or " +"variable).\n" +"[codeblock]\n" +"export(String, \"White\", \"Yellow\", \"Orange\") var my_color\n" +"var points_dict = {\"White\": 50, \"Yellow\": 75, \"Orange\": 100}\n" +"func _ready():\n" +" # We can't use dot syntax here as `my_color` is a variable.\n" +" var points = points_dict[my_color]\n" +"[/codeblock]\n" +"In the above code, [code]points[/code] will be assigned the value that is " +"paired with the appropriate color selected in [code]my_color[/code].\n" +"Dictionaries can contain more complex data:\n" +"[codeblock]\n" +"my_dict = {\"First Array\": [1, 2, 3, 4]} # Assigns an Array to a String " +"key.\n" +"[/codeblock]\n" +"To add a key to an existing dictionary, access it like an existing key and " +"assign to it:\n" +"[codeblock]\n" +"var points_dict = {\"White\": 50, \"Yellow\": 75, \"Orange\": 100}\n" +"points_dict[\"Blue\"] = 150 # Add \"Blue\" as a key and assign 150 as its " +"value.\n" +"[/codeblock]\n" +"Finally, dictionaries can contain different types of keys and values in the " +"same dictionary:\n" +"[codeblock]\n" +"# This is a valid dictionary.\n" +"# To access the string \"Nested value\" below, use `my_dict.sub_dict." +"sub_key` or `my_dict[\"sub_dict\"][\"sub_key\"]`.\n" +"# Indexing styles can be mixed and matched depending on your needs.\n" +"var my_dict = {\n" +" \"String Key\": 5,\n" +" 4: [1, 2, 3],\n" +" 7: \"Hello\",\n" +" \"sub_dict\": {\"sub_key\": \"Nested value\"},\n" +"}\n" +"[/codeblock]\n" +"[b]Note:[/b] Unlike [Array]s, you can't compare dictionaries directly:\n" +"[codeblock]\n" +"array1 = [1, 2, 3]\n" +"array2 = [1, 2, 3]\n" +"\n" +"func compare_arrays():\n" +" print(array1 == array2) # Will print true.\n" +"\n" +"var dict1 = {\"a\": 1, \"b\": 2, \"c\": 3}\n" +"var dict2 = {\"a\": 1, \"b\": 2, \"c\": 3}\n" +"\n" +"func compare_dictionaries():\n" +" print(dict1 == dict2) # Will NOT print true.\n" +"[/codeblock]\n" +"You need to first calculate the dictionary's hash with [method hash] before " +"you can compare them:\n" +"[codeblock]\n" +"var dict1 = {\"a\": 1, \"b\": 2, \"c\": 3}\n" +"var dict2 = {\"a\": 1, \"b\": 2, \"c\": 3}\n" +"\n" +"func compare_dictionaries():\n" +" print(dict1.hash() == dict2.hash()) # Will print true.\n" +"[/codeblock]\n" +"[b]Note:[/b] When declaring a dictionary with [code]const[/code], the " +"dictionary itself can still be mutated by defining the values of individual " +"keys. Using [code]const[/code] will only prevent assigning the constant with " +"another value after it was initialized." +msgstr "" + +#: doc/classes/Dictionary.xml +msgid "GDScript basics: Dictionary" +msgstr "" + +#: doc/classes/Dictionary.xml +msgid "Clear the dictionary, removing all key/value pairs." +msgstr "" + +#: doc/classes/Dictionary.xml +msgid "" +"Creates a copy of the dictionary, and returns it. The [code]deep[/code] " +"parameter causes inner dictionaries and arrays to be copied recursively, but " +"does not apply to objects." +msgstr "" + +#: doc/classes/Dictionary.xml +msgid "Returns [code]true[/code] if the dictionary is empty." +msgstr "" + +#: doc/classes/Dictionary.xml +msgid "" +"Erase a dictionary key/value pair by key. Returns [code]true[/code] if the " +"given key was present in the dictionary, [code]false[/code] otherwise.\n" +"[b]Note:[/b] Don't erase elements while iterating over the dictionary. You " +"can iterate over the [method keys] array instead." +msgstr "" + +#: doc/classes/Dictionary.xml +msgid "" +"Returns the current value for the specified key in the [Dictionary]. If the " +"key does not exist, the method returns the value of the optional default " +"argument, or [code]null[/code] if it is omitted." +msgstr "" + +#: doc/classes/Dictionary.xml +msgid "" +"Returns [code]true[/code] if the dictionary has a given key.\n" +"[b]Note:[/b] This is equivalent to using the [code]in[/code] operator as " +"follows:\n" +"[codeblock]\n" +"# Will evaluate to `true`.\n" +"if \"godot\" in {\"godot\": \"engine\"}:\n" +" pass\n" +"[/codeblock]\n" +"This method (like the [code]in[/code] operator) will evaluate to [code]true[/" +"code] as long as the key exists, even if the associated value is [code]null[/" +"code]." +msgstr "" + +#: doc/classes/Dictionary.xml +msgid "" +"Returns [code]true[/code] if the dictionary has all the keys in the given " +"array." +msgstr "" + +#: doc/classes/Dictionary.xml +msgid "" +"Returns a hashed 32-bit integer value representing the dictionary contents. " +"This can be used to compare dictionaries by value:\n" +"[codeblock]\n" +"var dict1 = {0: 10}\n" +"var dict2 = {0: 10}\n" +"# The line below prints `true`, whereas it would have printed `false` if " +"both variables were compared directly.\n" +"print(dict1.hash() == dict2.hash())\n" +"[/codeblock]\n" +"[b]Note:[/b] Dictionaries with the same keys/values but in a different order " +"will have a different hash.\n" +"[b]Note:[/b] Dictionaries with equal content will always produce identical " +"hash values. However, the reverse is not true. Returning identical hash " +"values does [i]not[/i] imply the dictionaries are equal, because different " +"dictionaries can have identical hash values due to hash collisions." +msgstr "" + +#: doc/classes/Dictionary.xml +msgid "Returns the list of keys in the [Dictionary]." +msgstr "" + +#: doc/classes/Dictionary.xml +msgid "" +"Adds elements from [code]dictionary[/code] to this [Dictionary]. By default, " +"duplicate keys will not be copied over, unless [code]overwrite[/code] is " +"[code]true[/code]." +msgstr "" + +#: doc/classes/Dictionary.xml +msgid "Returns the number of keys in the dictionary." +msgstr "" + +#: doc/classes/Dictionary.xml +msgid "Returns the list of values in the [Dictionary]." +msgstr "" + +#: doc/classes/DirectionalLight.xml +msgid "Directional light from a distance, as from the Sun." +msgstr "" + +#: doc/classes/DirectionalLight.xml +msgid "" +"A directional light is a type of [Light] node that models an infinite number " +"of parallel rays covering the entire scene. It is used for lights with " +"strong intensity that are located far away from the scene to model sunlight " +"or moonlight. The worldspace location of the DirectionalLight transform " +"(origin) is ignored. Only the basis is used to determine light direction." +msgstr "" + +#: doc/classes/DirectionalLight.xml +msgid "" +"Amount of extra bias for shadow splits that are far away. If self-shadowing " +"occurs only on the splits far away, increasing this value can fix them. This " +"is ignored when [member directional_shadow_mode] is [constant " +"SHADOW_ORTHOGONAL]." +msgstr "" + +#: doc/classes/DirectionalLight.xml +msgid "" +"If [code]true[/code], shadow detail is sacrificed in exchange for smoother " +"transitions between splits. Enabling shadow blend splitting also has a " +"moderate performance cost. This is ignored when [member " +"directional_shadow_mode] is [constant SHADOW_ORTHOGONAL]." +msgstr "" + +#: doc/classes/DirectionalLight.xml +msgid "" +"Optimizes shadow rendering for detail versus movement. See [enum " +"ShadowDepthRange]." +msgstr "" + +#: doc/classes/DirectionalLight.xml +msgid "" +"The maximum distance for shadow splits. Increasing this value will make " +"directional shadows visible from further away, at the cost of lower overall " +"shadow detail and performance (since more objects need to be included in the " +"directional shadow rendering)." +msgstr "" + +#: doc/classes/DirectionalLight.xml +msgid "The light's shadow rendering algorithm. See [enum ShadowMode]." +msgstr "" + +#: doc/classes/DirectionalLight.xml +msgid "" +"Can be used to fix special cases of self shadowing when objects are " +"perpendicular to the light." +msgstr "" + +#: doc/classes/DirectionalLight.xml +msgid "" +"The distance from camera to shadow split 1. Relative to [member " +"directional_shadow_max_distance]. Only used when [member " +"directional_shadow_mode] is [constant SHADOW_PARALLEL_2_SPLITS] or [constant " +"SHADOW_PARALLEL_4_SPLITS]." +msgstr "" + +#: doc/classes/DirectionalLight.xml +msgid "" +"The distance from shadow split 1 to split 2. Relative to [member " +"directional_shadow_max_distance]. Only used when [member " +"directional_shadow_mode] is [constant SHADOW_PARALLEL_2_SPLITS] or [constant " +"SHADOW_PARALLEL_4_SPLITS]." +msgstr "" + +#: doc/classes/DirectionalLight.xml +msgid "" +"The distance from shadow split 2 to split 3. Relative to [member " +"directional_shadow_max_distance]. Only used when [member " +"directional_shadow_mode] is [constant SHADOW_PARALLEL_4_SPLITS]." +msgstr "" + +#: doc/classes/DirectionalLight.xml +msgid "" +"Renders the entire scene's shadow map from an orthogonal point of view. This " +"is the fastest directional shadow mode. May result in blurrier shadows on " +"close objects." +msgstr "" + +#: doc/classes/DirectionalLight.xml +msgid "" +"Splits the view frustum in 2 areas, each with its own shadow map. This " +"shadow mode is a compromise between [constant SHADOW_ORTHOGONAL] and " +"[constant SHADOW_PARALLEL_4_SPLITS] in terms of performance." +msgstr "" + +#: doc/classes/DirectionalLight.xml +msgid "" +"Splits the view frustum in 4 areas, each with its own shadow map. This is " +"the slowest directional shadow mode." +msgstr "" + +#: doc/classes/DirectionalLight.xml +msgid "" +"Keeps the shadow stable when the camera moves, at the cost of lower " +"effective shadow resolution." +msgstr "" + +#: doc/classes/DirectionalLight.xml +msgid "" +"Tries to achieve maximum shadow resolution. May result in saw effect on " +"shadow edges. This mode typically works best in games where the camera will " +"often move at high speeds, such as most racing games." +msgstr "" + +#: doc/classes/Directory.xml +msgid "Type used to handle the filesystem." +msgstr "" + +#: doc/classes/Directory.xml +msgid "" +"Directory type. It is used to manage directories and their content (not " +"restricted to the project folder).\n" +"When creating a new [Directory], its default opened directory will be " +"[code]res://[/code]. This may change in the future, so it is advised to " +"always use [method open] to initialize your [Directory] where you want to " +"operate, with explicit error checking.\n" +"[b]Note:[/b] Many resources types are imported (e.g. textures or sound " +"files), and their source asset will not be included in the exported game, as " +"only the imported version is used. Use [ResourceLoader] to access imported " +"resources.\n" +"Here is an example on how to iterate through the files of a directory:\n" +"[codeblock]\n" +"func dir_contents(path):\n" +" var dir = Directory.new()\n" +" if dir.open(path) == OK:\n" +" dir.list_dir_begin()\n" +" var file_name = dir.get_next()\n" +" while file_name != \"\":\n" +" if dir.current_is_dir():\n" +" print(\"Found directory: \" + file_name)\n" +" else:\n" +" print(\"Found file: \" + file_name)\n" +" file_name = dir.get_next()\n" +" else:\n" +" print(\"An error occurred when trying to access the path.\")\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Directory.xml +msgid "" +"Changes the currently opened directory to the one passed as an argument. The " +"argument can be relative to the current directory (e.g. [code]newdir[/code] " +"or [code]../newdir[/code]), or an absolute path (e.g. [code]/tmp/newdir[/" +"code] or [code]res://somedir/newdir[/code]).\n" +"Returns one of the [enum Error] code constants ([code]OK[/code] on success)." +msgstr "" + +#: doc/classes/Directory.xml +msgid "" +"Copies the [code]from[/code] file to the [code]to[/code] destination. Both " +"arguments should be paths to files, either relative or absolute. If the " +"destination file exists and is not access-protected, it will be " +"overwritten.\n" +"Returns one of the [enum Error] code constants ([code]OK[/code] on success)." +msgstr "" + +#: doc/classes/Directory.xml +msgid "" +"Returns whether the current item processed with the last [method get_next] " +"call is a directory ([code].[/code] and [code]..[/code] are considered " +"directories)." +msgstr "" + +#: doc/classes/Directory.xml +msgid "" +"Returns whether the target directory exists. The argument can be relative to " +"the current directory, or an absolute path." +msgstr "" + +#: doc/classes/Directory.xml +msgid "" +"Returns whether the target file exists. The argument can be relative to the " +"current directory, or an absolute path." +msgstr "" + +#: doc/classes/Directory.xml +msgid "" +"Returns the absolute path to the currently opened directory (e.g. " +"[code]res://folder[/code] or [code]C:\\tmp\\folder[/code])." +msgstr "" + +#: doc/classes/Directory.xml +msgid "" +"Returns the currently opened directory's drive index. See [method get_drive] " +"to convert returned index to the name of the drive." +msgstr "" + +#: doc/classes/Directory.xml +msgid "" +"On Windows, returns the name of the drive (partition) passed as an argument " +"(e.g. [code]C:[/code]).\n" +"On macOS, returns the path to the mounted volume passed as an argument.\n" +"On Linux, returns the path to the mounted volume or GTK 3 bookmark passed as " +"an argument.\n" +"On other platforms, or if the requested drive does not exist, the method " +"returns an empty String." +msgstr "" + +#: doc/classes/Directory.xml +msgid "" +"On Windows, returns the number of drives (partitions) mounted on the current " +"filesystem.\n" +"On macOS, returns the number of mounted volumes.\n" +"On Linux, returns the number of mounted volumes and GTK 3 bookmarks.\n" +"On other platforms, the method returns 0." +msgstr "" + +#: doc/classes/Directory.xml +msgid "" +"Returns the next element (file or directory) in the current directory " +"(including [code].[/code] and [code]..[/code], unless " +"[code]skip_navigational[/code] was given to [method list_dir_begin]).\n" +"The name of the file or directory is returned (and not its full path). Once " +"the stream has been fully processed, the method returns an empty String and " +"closes the stream automatically (i.e. [method list_dir_end] would not be " +"mandatory in such a case)." +msgstr "" + +#: doc/classes/Directory.xml +msgid "" +"On UNIX desktop systems, returns the available space on the current " +"directory's disk. On other platforms, this information is not available and " +"the method returns 0 or -1." +msgstr "" + +#: doc/classes/Directory.xml +msgid "" +"Initializes the stream used to list all files and directories using the " +"[method get_next] function, closing the currently opened stream if needed. " +"Once the stream has been processed, it should typically be closed with " +"[method list_dir_end].\n" +"If [code]skip_navigational[/code] is [code]true[/code], [code].[/code] and " +"[code]..[/code] are filtered out.\n" +"If [code]skip_hidden[/code] is [code]true[/code], hidden files are filtered " +"out." +msgstr "" + +#: doc/classes/Directory.xml +msgid "" +"Closes the current stream opened with [method list_dir_begin] (whether it " +"has been fully processed with [method get_next] does not matter)." +msgstr "" + +#: doc/classes/Directory.xml +msgid "" +"Creates a directory. The argument can be relative to the current directory, " +"or an absolute path. The target directory should be placed in an already " +"existing directory (to create the full path recursively, see [method " +"make_dir_recursive]).\n" +"Returns one of the [enum Error] code constants ([code]OK[/code] on success)." +msgstr "" + +#: doc/classes/Directory.xml +msgid "" +"Creates a target directory and all necessary intermediate directories in its " +"path, by calling [method make_dir] recursively. The argument can be relative " +"to the current directory, or an absolute path.\n" +"Returns one of the [enum Error] code constants ([code]OK[/code] on success)." +msgstr "" + +#: doc/classes/Directory.xml +msgid "" +"Opens an existing directory of the filesystem. The [code]path[/code] " +"argument can be within the project tree ([code]res://folder[/code]), the " +"user directory ([code]user://folder[/code]) or an absolute path of the user " +"filesystem (e.g. [code]/tmp/folder[/code] or [code]C:\\tmp\\folder[/code]).\n" +"Returns one of the [enum Error] code constants ([code]OK[/code] on success)." +msgstr "" + +#: doc/classes/Directory.xml +msgid "" +"Permanently deletes the target file or an empty directory. The argument can " +"be relative to the current directory, or an absolute path. If the target " +"directory is not empty, the operation will fail.\n" +"If you don't want to delete the file/directory permanently, use [method OS." +"move_to_trash] instead.\n" +"Returns one of the [enum Error] code constants ([code]OK[/code] on success)." +msgstr "" + +#: doc/classes/Directory.xml +msgid "" +"Renames (move) the [code]from[/code] file or directory to the [code]to[/" +"code] destination. Both arguments should be paths to files or directories, " +"either relative or absolute. If the destination file or directory exists and " +"is not access-protected, it will be overwritten.\n" +"Returns one of the [enum Error] code constants ([code]OK[/code] on success)." +msgstr "" + +#: doc/classes/DTLSServer.xml +msgid "Helper class to implement a DTLS server." +msgstr "" + +#: doc/classes/DTLSServer.xml +msgid "" +"This class is used to store the state of a DTLS server. Upon [method setup] " +"it converts connected [PacketPeerUDP] to [PacketPeerDTLS] accepting them via " +"[method take_connection] as DTLS clients. Under the hood, this class is used " +"to store the DTLS state and cookies of the server. The reason of why the " +"state and cookies are needed is outside of the scope of this documentation.\n" +"Below a small example of how to use it:\n" +"[codeblock]\n" +"# server.gd\n" +"extends Node\n" +"\n" +"var dtls := DTLSServer.new()\n" +"var server := UDPServer.new()\n" +"var peers = []\n" +"\n" +"func _ready():\n" +" server.listen(4242)\n" +" var key = load(\"key.key\") # Your private key.\n" +" var cert = load(\"cert.crt\") # Your X509 certificate.\n" +" dtls.setup(key, cert)\n" +"\n" +"func _process(delta):\n" +" while server.is_connection_available():\n" +" var peer : PacketPeerUDP = server.take_connection()\n" +" var dtls_peer : PacketPeerDTLS = dtls.take_connection(peer)\n" +" if dtls_peer.get_status() != PacketPeerDTLS.STATUS_HANDSHAKING:\n" +" continue # It is normal that 50% of the connections fails due to " +"cookie exchange.\n" +" print(\"Peer connected!\")\n" +" peers.append(dtls_peer)\n" +" for p in peers:\n" +" p.poll() # Must poll to update the state.\n" +" if p.get_status() == PacketPeerDTLS.STATUS_CONNECTED:\n" +" while p.get_available_packet_count() > 0:\n" +" print(\"Received message from client: %s\" % p.get_packet()." +"get_string_from_utf8())\n" +" p.put_packet(\"Hello DTLS client\".to_utf8())\n" +"[/codeblock]\n" +"[codeblock]\n" +"# client.gd\n" +"extends Node\n" +"\n" +"var dtls := PacketPeerDTLS.new()\n" +"var udp := PacketPeerUDP.new()\n" +"var connected = false\n" +"\n" +"func _ready():\n" +" udp.connect_to_host(\"127.0.0.1\", 4242)\n" +" dtls.connect_to_peer(udp, false) # Use true in production for " +"certificate validation!\n" +"\n" +"func _process(delta):\n" +" dtls.poll()\n" +" if dtls.get_status() == PacketPeerDTLS.STATUS_CONNECTED:\n" +" if !connected:\n" +" # Try to contact server\n" +" dtls.put_packet(\"The answer is... 42!\".to_utf8())\n" +" while dtls.get_available_packet_count() > 0:\n" +" print(\"Connected: %s\" % dtls.get_packet()." +"get_string_from_utf8())\n" +" connected = true\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/DTLSServer.xml +msgid "" +"Setup the DTLS server to use the given [code]private_key[/code] and provide " +"the given [code]certificate[/code] to clients. You can pass the optional " +"[code]chain[/code] parameter to provide additional CA chain information " +"along with the certificate." +msgstr "" + +#: doc/classes/DTLSServer.xml +msgid "" +"Try to initiate the DTLS handshake with the given [code]udp_peer[/code] " +"which must be already connected (see [method PacketPeerUDP." +"connect_to_host]).\n" +"[b]Note:[/b] You must check that the state of the return PacketPeerUDP is " +"[constant PacketPeerDTLS.STATUS_HANDSHAKING], as it is normal that 50% of " +"the new connections will be invalid due to cookie exchange." +msgstr "" + +#: doc/classes/DynamicFont.xml +msgid "DynamicFont renders vector font files at runtime." +msgstr "" + +#: doc/classes/DynamicFont.xml +msgid "" +"DynamicFont renders vector font files dynamically at runtime instead of " +"using a prerendered texture atlas like [BitmapFont]. This trades the faster " +"loading time of [BitmapFont]s for the ability to change font parameters like " +"size and spacing during runtime. [DynamicFontData] is used for referencing " +"the font file paths. DynamicFont also supports defining one or more fallback " +"fonts, which will be used when displaying a character not supported by the " +"main font.\n" +"DynamicFont uses the [url=https://www.freetype.org/]FreeType[/url] library " +"for rasterization. Supported formats are TrueType ([code].ttf[/code]), " +"OpenType ([code].otf[/code]), Web Open Font Format 1 ([code].woff[/code]), " +"and Web Open Font Format 2 ([code].woff2[/code]).\n" +"[codeblock]\n" +"var dynamic_font = DynamicFont.new()\n" +"dynamic_font.font_data = load(\"res://BarlowCondensed-Bold.ttf\")\n" +"dynamic_font.size = 64\n" +"$\"Label\".set(\"custom_fonts/font\", dynamic_font)\n" +"[/codeblock]\n" +"[b]Note:[/b] DynamicFont doesn't support features such as kerning, right-to-" +"left typesetting, ligatures, text shaping, variable fonts and optional font " +"features yet. If you wish to \"bake\" an optional font feature into a TTF " +"font file, you can use [url=https://fontforge.org/]FontForge[/url] to do so. " +"In FontForge, use [b]File > Generate Fonts[/b], click [b]Options[/b], choose " +"the desired features then generate the font." +msgstr "" + +#: doc/classes/DynamicFont.xml +msgid "Adds a fallback font." +msgstr "" + +#: doc/classes/DynamicFont.xml +msgid "" +"Returns a string containing all the characters available in the main and all " +"the fallback fonts.\n" +"If a given character is included in more than one font, it appears only once " +"in the returned string." +msgstr "" + +#: doc/classes/DynamicFont.xml +msgid "Returns the fallback font at index [code]idx[/code]." +msgstr "" + +#: doc/classes/DynamicFont.xml +msgid "Returns the number of fallback fonts." +msgstr "" + +#: doc/classes/DynamicFont.xml +msgid "" +"Returns the spacing for the given [code]type[/code] (see [enum SpacingType])." +msgstr "" + +#: doc/classes/DynamicFont.xml +msgid "Removes the fallback font at index [code]idx[/code]." +msgstr "" + +#: doc/classes/DynamicFont.xml +msgid "Sets the fallback font at index [code]idx[/code]." +msgstr "" + +#: doc/classes/DynamicFont.xml +msgid "" +"Sets the spacing for [code]type[/code] (see [enum SpacingType]) to " +"[code]value[/code] in pixels (not relative to the font size)." +msgstr "" + +#: doc/classes/DynamicFont.xml +msgid "Extra spacing at the bottom in pixels." +msgstr "" + +#: doc/classes/DynamicFont.xml +msgid "" +"Extra spacing for each character in pixels.\n" +"This can be a negative number to make the distance between characters " +"smaller." +msgstr "" + +#: doc/classes/DynamicFont.xml +msgid "" +"Extra spacing for the space character (in addition to [member " +"extra_spacing_char]) in pixels.\n" +"This can be a negative number to make the distance between words smaller." +msgstr "" + +#: doc/classes/DynamicFont.xml +msgid "Extra spacing at the top in pixels." +msgstr "" + +#: doc/classes/DynamicFont.xml +msgid "The font data." +msgstr "" + +#: doc/classes/DynamicFont.xml +msgid "" +"The font outline's color.\n" +"[b]Note:[/b] It's recommended to leave this at the default value so that you " +"can adjust it in individual controls. For example, if the outline is made " +"black here, it won't be possible to change its color using a Label's font " +"outline modulate theme item." +msgstr "" + +#: doc/classes/DynamicFont.xml +msgid "The font outline's thickness in pixels (not relative to the font size)." +msgstr "" + +#: doc/classes/DynamicFont.xml +msgid "The font size in pixels." +msgstr "" + +#: doc/classes/DynamicFont.xml +msgid "" +"If [code]true[/code], filtering is used. This makes the font blurry instead " +"of pixelated when scaling it if font oversampling is disabled or " +"ineffective. It's recommended to enable this when using the font in a " +"control whose size changes over time, unless a pixel art aesthetic is " +"desired." +msgstr "" + +#: doc/classes/DynamicFont.xml +msgid "" +"If [code]true[/code], mipmapping is used. This improves the font's " +"appearance when downscaling it if font oversampling is disabled or " +"ineffective." +msgstr "" + +#: doc/classes/DynamicFont.xml +msgid "Spacing at the top." +msgstr "" + +#: doc/classes/DynamicFont.xml +msgid "Spacing at the bottom." +msgstr "" + +#: doc/classes/DynamicFont.xml +msgid "Spacing for each character." +msgstr "" + +#: doc/classes/DynamicFont.xml +msgid "Spacing for the space character." +msgstr "" + +#: doc/classes/DynamicFontData.xml +msgid "Used with [DynamicFont] to describe the location of a font file." +msgstr "" + +#: doc/classes/DynamicFontData.xml +msgid "" +"Used with [DynamicFont] to describe the location of a vector font file for " +"dynamic rendering at runtime." +msgstr "" + +#: doc/classes/DynamicFontData.xml +msgid "" +"If [code]true[/code], the font is rendered with anti-aliasing. This property " +"applies both to the main font and its outline (if it has one)." +msgstr "" + +#: doc/classes/DynamicFontData.xml +msgid "The path to the vector font file." +msgstr "" + +#: doc/classes/DynamicFontData.xml +msgid "The font hinting mode used by FreeType. See [enum Hinting] for options." +msgstr "" + +#: doc/classes/DynamicFontData.xml +msgid "" +"If set to a value greater than [code]0.0[/code], it will override default " +"font oversampling, ignoring [member SceneTree.use_font_oversampling] value " +"and viewport stretch mode." +msgstr "" + +#: doc/classes/DynamicFontData.xml +msgid "Disables font hinting (smoother but less crisp)." +msgstr "" + +#: doc/classes/DynamicFontData.xml +msgid "Use the light font hinting mode." +msgstr "" + +#: doc/classes/DynamicFontData.xml +msgid "Use the default font hinting mode (crisper but less smooth)." +msgstr "" + +#: doc/classes/EditorExportPlugin.xml +msgid "A script that is executed when exporting the project." +msgstr "" + +#: doc/classes/EditorExportPlugin.xml +msgid "" +"[EditorExportPlugin]s are automatically invoked whenever the user exports " +"the project. Their most common use is to determine what files are being " +"included in the exported project. For each plugin, [method _export_begin] is " +"called at the beginning of the export process and then [method _export_file] " +"is called for each exported file.\n" +"To use [EditorExportPlugin], register it using the [method EditorPlugin." +"add_export_plugin] method first." +msgstr "" + +#: doc/classes/EditorExportPlugin.xml +msgid "" +"Virtual method to be overridden by the user. It is called when the export " +"starts and provides all information about the export. [code]features[/code] " +"is the list of features for the export, [code]is_debug[/code] is [code]true[/" +"code] for debug builds, [code]path[/code] is the target path for the " +"exported project. [code]flags[/code] is only used when running a runnable " +"profile, e.g. when using native run on Android." +msgstr "" + +#: doc/classes/EditorExportPlugin.xml +msgid "" +"Virtual method to be overridden by the user. Called when the export is " +"finished." +msgstr "" + +#: doc/classes/EditorExportPlugin.xml +msgid "" +"Virtual method to be overridden by the user. Called for each exported file, " +"providing arguments that can be used to identify the file. [code]path[/code] " +"is the path of the file, [code]type[/code] is the [Resource] represented by " +"the file (e.g. [PackedScene]) and [code]features[/code] is the list of " +"features for the export.\n" +"Calling [method skip] inside this callback will make the file not included " +"in the export." +msgstr "" + +#: doc/classes/EditorExportPlugin.xml +msgid "" +"Adds a custom file to be exported. [code]path[/code] is the virtual path " +"that can be used to load the file, [code]file[/code] is the binary data of " +"the file. If [code]remap[/code] is [code]true[/code], file will not be " +"exported, but instead remapped to the given [code]path[/code]." +msgstr "" + +#: doc/classes/EditorExportPlugin.xml +msgid "" +"Adds an iOS bundle file from the given [code]path[/code] to the exported " +"project." +msgstr "" + +#: doc/classes/EditorExportPlugin.xml +msgid "" +"Adds a C++ code to the iOS export. The final code is created from the code " +"appended by each active export plugin." +msgstr "" + +#: doc/classes/EditorExportPlugin.xml +msgid "" +"Adds a dynamic library (*.dylib, *.framework) to Linking Phase in iOS's " +"Xcode project and embeds it into resulting binary.\n" +"[b]Note:[/b] For static libraries (*.a) works in same way as [method " +"add_ios_framework].\n" +"This method should not be used for System libraries as they are already " +"present on the device." +msgstr "" + +#: doc/classes/EditorExportPlugin.xml +msgid "" +"Adds a static library (*.a) or dynamic library (*.dylib, *.framework) to " +"Linking Phase in iOS's Xcode project." +msgstr "" + +#: doc/classes/EditorExportPlugin.xml +msgid "Adds linker flags for the iOS export." +msgstr "" + +#: doc/classes/EditorExportPlugin.xml +msgid "Adds content for iOS Property List files." +msgstr "" + +#: doc/classes/EditorExportPlugin.xml +msgid "Adds a static lib from the given [code]path[/code] to the iOS project." +msgstr "" + +#: doc/classes/EditorExportPlugin.xml +msgid "" +"Adds file or directory matching [code]path[/code] to [code]PlugIns[/code] " +"directory of macOS app bundle.\n" +"[b]Note:[/b] This is useful only for macOS exports." +msgstr "" + +#: doc/classes/EditorExportPlugin.xml +msgid "" +"Adds a shared object or a directory containing only shared objects with the " +"given [code]tags[/code] and destination [code]path[/code].\n" +"[b]Note:[/b] In case of macOS exports, those shared objects will be added to " +"[code]Frameworks[/code] directory of app bundle.\n" +"In case of a directory code-sign will error if you place non code object in " +"directory." +msgstr "" + +#: doc/classes/EditorExportPlugin.xml +msgid "" +"To be called inside [method _export_file]. Skips the current file, so it's " +"not included in the export." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml +msgid "" +"An editor feature profile which can be used to disable specific features." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml +msgid "" +"An editor feature profile can be used to disable specific features of the " +"Godot editor. When disabled, the features won't appear in the editor, which " +"makes the editor less cluttered. This is useful in education settings to " +"reduce confusion or when working in a team. For example, artists and level " +"designers could use a feature profile that disables the script editor to " +"avoid accidentally making changes to files they aren't supposed to edit.\n" +"To manage editor feature profiles visually, use [b]Editor > Manage Feature " +"Profiles...[/b] at the top of the editor window." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml +msgid "Returns the specified [code]feature[/code]'s human-readable name." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml +msgid "" +"Returns [code]true[/code] if the class specified by [code]class_name[/code] " +"is disabled. When disabled, the class won't appear in the Create New Node " +"dialog." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml +msgid "" +"Returns [code]true[/code] if editing for the class specified by " +"[code]class_name[/code] is disabled. When disabled, the class will still " +"appear in the Create New Node dialog but the inspector will be read-only " +"when selecting a node that extends the class." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml +msgid "" +"Returns [code]true[/code] if [code]property[/code] is disabled in the class " +"specified by [code]class_name[/code]. When a property is disabled, it won't " +"appear in the inspector when selecting a node that extends the class " +"specified by [code]class_name[/code]." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml +msgid "" +"Returns [code]true[/code] if the [code]feature[/code] is disabled. When a " +"feature is disabled, it will disappear from the editor entirely." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml +msgid "" +"Loads an editor feature profile from a file. The file must follow the JSON " +"format obtained by using the feature profile manager's [b]Export[/b] button " +"or the [method save_to_file] method." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml +msgid "" +"Saves the editor feature profile to a file in JSON format. It can then be " +"imported using the feature profile manager's [b]Import[/b] button or the " +"[method load_from_file] method." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml +msgid "" +"If [code]disable[/code] is [code]true[/code], disables the class specified " +"by [code]class_name[/code]. When disabled, the class won't appear in the " +"Create New Node dialog." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml +msgid "" +"If [code]disable[/code] is [code]true[/code], disables editing for the class " +"specified by [code]class_name[/code]. When disabled, the class will still " +"appear in the Create New Node dialog but the inspector will be read-only " +"when selecting a node that extends the class." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml +msgid "" +"If [code]disable[/code] is [code]true[/code], disables editing for " +"[code]property[/code] in the class specified by [code]class_name[/code]. " +"When a property is disabled, it won't appear in the inspector when selecting " +"a node that extends the class specified by [code]class_name[/code]." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml +msgid "" +"If [code]disable[/code] is [code]true[/code], disables the editor feature " +"specified in [code]feature[/code]. When a feature is disabled, it will " +"disappear from the editor entirely." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml +msgid "" +"The 3D editor. If this feature is disabled, the 3D editor won't display but " +"3D nodes will still display in the Create New Node dialog." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml +msgid "" +"The Script tab, which contains the script editor and class reference " +"browser. If this feature is disabled, the Script tab won't display." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml +msgid "" +"The AssetLib tab. If this feature is disabled, the AssetLib tab won't " +"display." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml +msgid "" +"Scene tree editing. If this feature is disabled, the Scene tree dock will " +"still be visible but will be read-only." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml +msgid "" +"The Node dock. If this feature is disabled, signals and groups won't be " +"visible and modifiable from the editor." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml +msgid "" +"The FileSystem dock. If this feature is disabled, the FileSystem dock won't " +"be visible." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml +msgid "" +"The Import dock. If this feature is disabled, the Import dock won't be " +"visible." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml doc/classes/SpatialMaterial.xml +msgid "Represents the size of the [enum Feature] enum." +msgstr "" + +#: doc/classes/EditorFileDialog.xml +msgid "A modified version of [FileDialog] used by the editor." +msgstr "" + +#: doc/classes/EditorFileDialog.xml +msgid "" +"Adds a comma-delimited file extension filter option to the " +"[EditorFileDialog] with an optional semi-colon-delimited label.\n" +"For example, [code]\"*.tscn, *.scn; Scenes\"[/code] results in filter text " +"\"Scenes (*.tscn, *.scn)\"." +msgstr "" + +#: doc/classes/EditorFileDialog.xml +msgid "Removes all filters except for \"All Files (*)\"." +msgstr "" + +#: doc/classes/EditorFileDialog.xml +msgid "" +"Returns the [code]VBoxContainer[/code] used to display the file system.\n" +"[b]Warning:[/b] This is a required internal node, removing and freeing it " +"may cause a crash. If you wish to hide it or any of its children, use their " +"[member CanvasItem.visible] property." +msgstr "" + +#: doc/classes/EditorFileDialog.xml +msgid "" +"Notify the [EditorFileDialog] that its view of the data is no longer " +"accurate. Updates the view contents on next view update." +msgstr "" + +#: doc/classes/EditorFileDialog.xml +msgid "" +"The location from which the user may select a file, including [code]res://[/" +"code], [code]user://[/code], and the local file system." +msgstr "" + +#: doc/classes/EditorFileDialog.xml +msgid "The currently occupied directory." +msgstr "" + +#: doc/classes/EditorFileDialog.xml +msgid "The currently selected file." +msgstr "" + +#: doc/classes/EditorFileDialog.xml +msgid "The file system path in the address bar." +msgstr "" + +#: doc/classes/EditorFileDialog.xml +msgid "" +"If [code]true[/code], the [EditorFileDialog] will not warn the user before " +"overwriting files." +msgstr "" + +#: doc/classes/EditorFileDialog.xml +msgid "" +"The view format in which the [EditorFileDialog] displays resources to the " +"user." +msgstr "" + +#: doc/classes/EditorFileDialog.xml +msgid "" +"The purpose of the [EditorFileDialog], which defines the allowed behaviors." +msgstr "" + +#: doc/classes/EditorFileDialog.xml +msgid "" +"If [code]true[/code], hidden files and directories will be visible in the " +"[EditorFileDialog]." +msgstr "" + +#: doc/classes/EditorFileDialog.xml +msgid "Emitted when a directory is selected." +msgstr "" + +#: doc/classes/EditorFileDialog.xml +msgid "Emitted when a file is selected." +msgstr "" + +#: doc/classes/EditorFileDialog.xml +msgid "Emitted when multiple files are selected." +msgstr "" + +#: doc/classes/EditorFileDialog.xml +msgid "" +"The [EditorFileDialog] can select only one file. Accepting the window will " +"open the file." +msgstr "" + +#: doc/classes/EditorFileDialog.xml +msgid "" +"The [EditorFileDialog] can select multiple files. Accepting the window will " +"open all files." +msgstr "" + +#: doc/classes/EditorFileDialog.xml +msgid "" +"The [EditorFileDialog] can select only one directory. Accepting the window " +"will open the directory." +msgstr "" + +#: doc/classes/EditorFileDialog.xml +msgid "" +"The [EditorFileDialog] can select a file or directory. Accepting the window " +"will open it." +msgstr "" + +#: doc/classes/EditorFileDialog.xml +msgid "" +"The [EditorFileDialog] can select only one file. Accepting the window will " +"save the file." +msgstr "" + +#: doc/classes/EditorFileDialog.xml +msgid "" +"The [EditorFileDialog] can only view [code]res://[/code] directory contents." +msgstr "" + +#: doc/classes/EditorFileDialog.xml +msgid "" +"The [EditorFileDialog] can only view [code]user://[/code] directory contents." +msgstr "" + +#: doc/classes/EditorFileDialog.xml +msgid "The [EditorFileDialog] can view the entire local file system." +msgstr "" + +#: doc/classes/EditorFileDialog.xml +msgid "The [EditorFileDialog] displays resources as thumbnails." +msgstr "" + +#: doc/classes/EditorFileDialog.xml +msgid "The [EditorFileDialog] displays resources as a list of filenames." +msgstr "" + +#: doc/classes/EditorFileSystem.xml +msgid "Resource filesystem, as the editor sees it." +msgstr "" + +#: doc/classes/EditorFileSystem.xml +msgid "" +"This object holds information of all resources in the filesystem, their " +"types, etc.\n" +"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access " +"the singleton using [method EditorInterface.get_resource_filesystem]." +msgstr "" + +#: doc/classes/EditorFileSystem.xml +msgid "" +"Returns the resource type of the file, given the full path. This returns a " +"string such as [code]\"Resource\"[/code] or [code]\"GDScript\"[/code], " +"[i]not[/i] a file extension such as [code]\".gd\"[/code]." +msgstr "" + +#: doc/classes/EditorFileSystem.xml +msgid "Gets the root directory object." +msgstr "" + +#: doc/classes/EditorFileSystem.xml +msgid "Returns a view into the filesystem at [code]path[/code]." +msgstr "" + +#: doc/classes/EditorFileSystem.xml +msgid "Returns the scan progress for 0 to 1 if the FS is being scanned." +msgstr "" + +#: doc/classes/EditorFileSystem.xml +msgid "Returns [code]true[/code] if the filesystem is being scanned." +msgstr "" + +#: doc/classes/EditorFileSystem.xml +msgid "Scan the filesystem for changes." +msgstr "" + +#: doc/classes/EditorFileSystem.xml +msgid "Check if the source of any imported resource changed." +msgstr "" + +#: doc/classes/EditorFileSystem.xml +msgid "" +"Update a file information. Call this if an external program (not Godot) " +"modified the file." +msgstr "" + +#: doc/classes/EditorFileSystem.xml +msgid "Scans the script files and updates the list of custom class names." +msgstr "" + +#: doc/classes/EditorFileSystem.xml +msgid "Emitted if the filesystem changed." +msgstr "" + +#: doc/classes/EditorFileSystem.xml +msgid "Emitted if a resource is reimported." +msgstr "" + +#: doc/classes/EditorFileSystem.xml +msgid "" +"Emitted if at least one resource is reloaded when the filesystem is scanned." +msgstr "" + +#: doc/classes/EditorFileSystem.xml +msgid "Emitted if the source of any imported file changed." +msgstr "" + +#: doc/classes/EditorFileSystemDirectory.xml +msgid "A directory for the resource filesystem." +msgstr "" + +#: doc/classes/EditorFileSystemDirectory.xml +msgid "A more generalized, low-level variation of the directory concept." +msgstr "" + +#: doc/classes/EditorFileSystemDirectory.xml +msgid "" +"Returns the index of the directory with name [code]name[/code] or [code]-1[/" +"code] if not found." +msgstr "" + +#: doc/classes/EditorFileSystemDirectory.xml +msgid "" +"Returns the index of the file with name [code]name[/code] or [code]-1[/code] " +"if not found." +msgstr "" + +#: doc/classes/EditorFileSystemDirectory.xml +msgid "Returns the name of the file at index [code]idx[/code]." +msgstr "" + +#: doc/classes/EditorFileSystemDirectory.xml +msgid "Returns the number of files in this directory." +msgstr "" + +#: doc/classes/EditorFileSystemDirectory.xml +msgid "" +"Returns [code]true[/code] if the file at index [code]idx[/code] imported " +"properly." +msgstr "" + +#: doc/classes/EditorFileSystemDirectory.xml +msgid "Returns the path to the file at index [code]idx[/code]." +msgstr "" + +#: doc/classes/EditorFileSystemDirectory.xml +msgid "" +"Returns the base class of the script class defined in the file at index " +"[code]idx[/code]. If the file doesn't define a script class using the " +"[code]class_name[/code] syntax, this will return an empty string." +msgstr "" + +#: doc/classes/EditorFileSystemDirectory.xml +msgid "" +"Returns the name of the script class defined in the file at index [code]idx[/" +"code]. If the file doesn't define a script class using the [code]class_name[/" +"code] syntax, this will return an empty string." +msgstr "" + +#: doc/classes/EditorFileSystemDirectory.xml +msgid "" +"Returns the resource type of the file at index [code]idx[/code]. This " +"returns a string such as [code]\"Resource\"[/code] or [code]\"GDScript\"[/" +"code], [i]not[/i] a file extension such as [code]\".gd\"[/code]." +msgstr "" + +#: doc/classes/EditorFileSystemDirectory.xml +msgid "Returns the name of this directory." +msgstr "" + +#: doc/classes/EditorFileSystemDirectory.xml +msgid "" +"Returns the parent directory for this directory or [code]null[/code] if " +"called on a directory at [code]res://[/code] or [code]user://[/code]." +msgstr "" + +#: doc/classes/EditorFileSystemDirectory.xml +msgid "Returns the path to this directory." +msgstr "" + +#: doc/classes/EditorFileSystemDirectory.xml +msgid "Returns the subdirectory at index [code]idx[/code]." +msgstr "" + +#: doc/classes/EditorFileSystemDirectory.xml +msgid "Returns the number of subdirectories in this directory." +msgstr "" + +#: doc/classes/EditorImportPlugin.xml +msgid "" +"Registers a custom resource importer in the editor. Use the class to parse " +"any file and import it as a new resource type." +msgstr "" + +#: doc/classes/EditorImportPlugin.xml +msgid "" +"[EditorImportPlugin]s provide a way to extend the editor's resource import " +"functionality. Use them to import resources from custom files or to provide " +"alternatives to the editor's existing importers.\n" +"EditorImportPlugins work by associating with specific file extensions and a " +"resource type. See [method get_recognized_extensions] and [method " +"get_resource_type]. They may optionally specify some import presets that " +"affect the import process. EditorImportPlugins are responsible for creating " +"the resources and saving them in the [code].import[/code] directory (see " +"[member ProjectSettings.application/config/" +"use_hidden_project_data_directory]).\n" +"Below is an example EditorImportPlugin that imports a [Mesh] from a file " +"with the extension \".special\" or \".spec\":\n" +"[codeblock]\n" +"tool\n" +"extends EditorImportPlugin\n" +"\n" +"func get_importer_name():\n" +" return \"my.special.plugin\"\n" +"\n" +"func get_visible_name():\n" +" return \"Special Mesh\"\n" +"\n" +"func get_recognized_extensions():\n" +" return [\"special\", \"spec\"]\n" +"\n" +"func get_save_extension():\n" +" return \"mesh\"\n" +"\n" +"func get_resource_type():\n" +" return \"Mesh\"\n" +"\n" +"func get_preset_count():\n" +" return 1\n" +"\n" +"func get_preset_name(i):\n" +" return \"Default\"\n" +"\n" +"func get_import_options(i):\n" +" return [{\"name\": \"my_option\", \"default_value\": false}]\n" +"\n" +"func import(source_file, save_path, options, platform_variants, gen_files):\n" +" var file = File.new()\n" +" if file.open(source_file, File.READ) != OK:\n" +" return FAILED\n" +"\n" +" var mesh = Mesh.new()\n" +" # Fill the Mesh with data read in \"file\", left as an exercise to the " +"reader\n" +"\n" +" var filename = save_path + \".\" + get_save_extension()\n" +" return ResourceSaver.save(filename, mesh)\n" +"[/codeblock]\n" +"To use [EditorImportPlugin], register it using the [method EditorPlugin." +"add_import_plugin] method first." +msgstr "" + +#: doc/classes/EditorImportPlugin.xml +msgid "" +"Gets the options and default values for the preset at this index. Returns an " +"Array of Dictionaries with the following keys: [code]name[/code], " +"[code]default_value[/code], [code]property_hint[/code] (optional), " +"[code]hint_string[/code] (optional), [code]usage[/code] (optional)." +msgstr "" + +#: doc/classes/EditorImportPlugin.xml +msgid "" +"Gets the order of this importer to be run when importing resources. " +"Importers with [i]lower[/i] import orders will be called first, and higher " +"values will be called later. Use this to ensure the importer runs after the " +"dependencies are already imported. The default import order is [code]0[/" +"code] unless overridden by a specific importer. See [enum ResourceImporter." +"ImportOrder] for some predefined values." +msgstr "" + +#: doc/classes/EditorImportPlugin.xml +msgid "Gets the unique name of the importer." +msgstr "" + +#: doc/classes/EditorImportPlugin.xml +msgid "" +"This method can be overridden to hide specific import options if conditions " +"are met. This is mainly useful for hiding options that depend on others if " +"one of them is disabled. For example:\n" +"[codeblock]\n" +"func get_option_visibility(option, options):\n" +" # Only show the lossy quality setting if the compression mode is set to " +"\"Lossy\".\n" +" if option == \"compress/lossy_quality\" and options.has(\"compress/" +"mode\"):\n" +" return int(options[\"compress/mode\"]) == COMPRESS_LOSSY\n" +"\n" +" return true\n" +"[/codeblock]\n" +"Return [code]true[/code] to make all options always visible." +msgstr "" + +#: doc/classes/EditorImportPlugin.xml +msgid "" +"Gets the number of initial presets defined by the plugin. Use [method " +"get_import_options] to get the default options for the preset and [method " +"get_preset_name] to get the name of the preset." +msgstr "" + +#: doc/classes/EditorImportPlugin.xml +msgid "Gets the name of the options preset at this index." +msgstr "" + +#: doc/classes/EditorImportPlugin.xml +msgid "" +"Gets the priority of this plugin for the recognized extension. Higher " +"priority plugins will be preferred. The default priority is [code]1.0[/code]." +msgstr "" + +#: doc/classes/EditorImportPlugin.xml +msgid "" +"Gets the list of file extensions to associate with this loader (case-" +"insensitive). e.g. [code][\"obj\"][/code]." +msgstr "" + +#: doc/classes/EditorImportPlugin.xml +msgid "" +"Gets the Godot resource type associated with this loader. e.g. " +"[code]\"Mesh\"[/code] or [code]\"Animation\"[/code]." +msgstr "" + +#: doc/classes/EditorImportPlugin.xml +msgid "" +"Gets the extension used to save this resource in the [code].import[/code] " +"directory (see [member ProjectSettings.application/config/" +"use_hidden_project_data_directory])." +msgstr "" + +#: doc/classes/EditorImportPlugin.xml +msgid "" +"Gets the name to display in the import window. You should choose this name " +"as a continuation to \"Import as\", e.g. \"Import as Special Mesh\"." +msgstr "" + +#: doc/classes/EditorImportPlugin.xml +msgid "" +"Imports [code]source_file[/code] into [code]save_path[/code] with the import " +"[code]options[/code] specified. The [code]platform_variants[/code] and " +"[code]gen_files[/code] arrays will be modified by this function.\n" +"This method must be overridden to do the actual importing work. See this " +"class' description for an example of overriding this method." +msgstr "" + +#: doc/classes/EditorInspector.xml +msgid "A control used to edit properties of an object." +msgstr "" + +#: doc/classes/EditorInspector.xml +msgid "" +"This is the control that implements property editing in the editor's " +"Settings dialogs, the Inspector dock, etc. To get the [EditorInspector] used " +"in the editor's Inspector dock, use [method EditorInterface.get_inspector].\n" +"[EditorInspector] will show properties in the same order as the array " +"returned by [method Object.get_property_list].\n" +"If a property's name is path-like (i.e. if it contains forward slashes), " +"[EditorInspector] will create nested sections for \"directories\" along the " +"path. For example, if a property is named [code]highlighting/gdscript/" +"node_path_color[/code], it will be shown as \"Node Path Color\" inside the " +"\"GDScript\" section nested inside the \"Highlighting\" section.\n" +"If a property has [constant @GlobalScope.PROPERTY_USAGE_GROUP] usage, it " +"will group subsequent properties whose name starts with the property's hint " +"string. The group ends when a property does not start with that hint string " +"or when a new group starts. An empty group name effectively ends the current " +"group. [EditorInspector] will create a top-level section for each group. For " +"example, if a property with group usage is named [code]Collide With[/code] " +"and its hint string is [code]collide_with_[/code], a subsequent " +"[code]collide_with_area[/code] property will be shown as \"Area\" inside the " +"\"Collide With\" section.\n" +"[b]Note:[/b] Unlike sections created from path-like property names, " +"[EditorInspector] won't capitalize the name for sections created from " +"groups. So properties with group usage usually use capitalized names instead " +"of snake_cased names." +msgstr "" + +#: doc/classes/EditorInspector.xml +msgid "" +"Refreshes the inspector.\n" +"[b]Note:[/b] To save on CPU resources, calling this method will do nothing " +"if the time specified in [code]docks/property_editor/auto_refresh_interval[/" +"code] editor setting hasn't passed yet since this method was last called. " +"(By default, this interval is set to 0.3 seconds.)" +msgstr "" + +#: doc/classes/EditorInspector.xml +msgid "" +"Emitted when the Edit button of an [Object] has been pressed in the " +"inspector. This is mainly used in the remote scene tree inspector." +msgstr "" + +#: doc/classes/EditorInspector.xml +msgid "Emitted when a property is edited in the inspector." +msgstr "" + +#: doc/classes/EditorInspector.xml +msgid "" +"Emitted when a property is keyed in the inspector. Properties can be keyed " +"by clicking the \"key\" icon next to a property when the Animation panel is " +"toggled." +msgstr "" + +#: doc/classes/EditorInspector.xml +msgid "Emitted when a property is selected in the inspector." +msgstr "" + +#: doc/classes/EditorInspector.xml +msgid "" +"Emitted when a boolean property is toggled in the inspector.\n" +"[b]Note:[/b] This signal is never emitted if the internal [code]autoclear[/" +"code] property enabled. Since this property is always enabled in the editor " +"inspector, this signal is never emitted by the editor itself." +msgstr "" + +#: doc/classes/EditorInspector.xml +msgid "Emitted when a resource is selected in the inspector." +msgstr "" + +#: doc/classes/EditorInspector.xml +msgid "" +"Emitted when a property that requires a restart to be applied is edited in " +"the inspector. This is only used in the Project Settings and Editor Settings." +msgstr "" + +#: doc/classes/EditorInspectorPlugin.xml +msgid "Plugin for adding custom property editors on inspector." +msgstr "" + +#: doc/classes/EditorInspectorPlugin.xml +msgid "" +"[EditorInspectorPlugin] allows adding custom property editors to " +"[EditorInspector].\n" +"When an object is edited, the [method can_handle] function is called and " +"must return [code]true[/code] if the object type is supported.\n" +"If supported, the function [method parse_begin] will be called, allowing to " +"place custom controls at the beginning of the class.\n" +"Subsequently, the [method parse_category] and [method parse_property] are " +"called for every category and property. They offer the ability to add custom " +"controls to the inspector too.\n" +"Finally, [method parse_end] will be called.\n" +"On each of these calls, the \"add\" functions can be called.\n" +"To use [EditorInspectorPlugin], register it using the [method EditorPlugin." +"add_inspector_plugin] method first." +msgstr "" + +#: doc/classes/EditorInspectorPlugin.xml +msgid "Inspector plugins" +msgstr "" + +#: doc/classes/EditorInspectorPlugin.xml +msgid "Adds a custom control, which is not necessarily a property editor." +msgstr "" + +#: doc/classes/EditorInspectorPlugin.xml +msgid "" +"Adds a property editor for an individual property. The [code]editor[/code] " +"control must extend [EditorProperty]." +msgstr "" + +#: doc/classes/EditorInspectorPlugin.xml +msgid "" +"Adds an editor that allows modifying multiple properties. The [code]editor[/" +"code] control must extend [EditorProperty]." +msgstr "" + +#: doc/classes/EditorInspectorPlugin.xml +msgid "Returns [code]true[/code] if this object can be handled by this plugin." +msgstr "" + +#: doc/classes/EditorInspectorPlugin.xml +msgid "Called to allow adding controls at the beginning of the list." +msgstr "" + +#: doc/classes/EditorInspectorPlugin.xml +msgid "Called to allow adding controls at the beginning of the category." +msgstr "" + +#: doc/classes/EditorInspectorPlugin.xml +msgid "Called to allow adding controls at the end of the list." +msgstr "" + +#: doc/classes/EditorInspectorPlugin.xml +msgid "" +"Called to allow adding property specific editors to the inspector. Usually " +"these inherit [EditorProperty]. Returning [code]true[/code] removes the " +"built-in editor for this property, otherwise allows to insert a custom " +"editor before the built-in one." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "Godot editor's interface." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "" +"EditorInterface gives you control over Godot editor's window. It allows " +"customizing the window, saving and (re-)loading scenes, rendering mesh " +"previews, inspecting and editing resources and objects, and provides access " +"to [EditorSettings], [EditorFileSystem], [EditorResourcePreview], " +"[ScriptEditor], the editor viewport, and information about scenes.\n" +"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access " +"the singleton using [method EditorPlugin.get_editor_interface]." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "" +"Edits the given [Node]. The node will be also selected if it's inside the " +"scene tree." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "" +"Edits the given [Resource]. If the resource is a [Script] you can also edit " +"it with [method edit_script] to specify the line and column position." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "" +"Edits the given [Script]. The line and column on which to open the script " +"can also be specified. The script will be open with the user-configured " +"editor for the script's language which may be an external editor." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "" +"Returns the main container of Godot editor's window. For example, you can " +"use it to retrieve the size of the container and place your controls " +"accordingly.\n" +"[b]Warning:[/b] Removing and freeing this node will render the editor " +"useless and may cause a crash." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "Returns the current path being viewed in the [FileSystemDock]." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "Returns the edited (current) scene's root [Node]." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "" +"Returns the actual scale of the editor UI ([code]1.0[/code] being 100% " +"scale). This can be used to adjust position and dimensions of the UI added " +"by plugins.\n" +"[b]Note:[/b] This value is set via the [code]interface/editor/display_scale[/" +"code] and [code]interface/editor/custom_display_scale[/code] editor " +"settings. Editor must be restarted for changes to be properly applied." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "Returns the editor's [EditorSettings] instance." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "" +"Returns the main editor control. Use this as a parent for main screens.\n" +"[b]Note:[/b] This returns the main editor control containing the whole " +"editor, not the 2D or 3D viewports specifically.\n" +"[b]Warning:[/b] Removing and freeing this node will render a part of the " +"editor useless and may cause a crash." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "" +"Returns the editor's [FileSystemDock] instance.\n" +"[b]Warning:[/b] Removing and freeing this node will render a part of the " +"editor useless and may cause a crash." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "" +"Returns the editor's [EditorInspector] instance.\n" +"[b]Warning:[/b] Removing and freeing this node will render a part of the " +"editor useless and may cause a crash." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "Returns an [Array] with the file paths of the currently opened scenes." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "" +"Returns the name of the scene that is being played. If no scene is currently " +"being played, returns an empty string." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "Returns the editor's [EditorFileSystem] instance." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "Returns the editor's [EditorResourcePreview] instance." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "" +"Returns the editor's [ScriptEditor] instance.\n" +"[b]Warning:[/b] Removing and freeing this node will render a part of the " +"editor useless and may cause a crash." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "" +"Returns the path of the directory currently selected in the " +"[FileSystemDock]. If a file is selected, its base directory will be returned " +"using [method String.get_base_dir] instead." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "Returns the editor's [EditorSelection] instance." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "" +"Shows the given property on the given [code]object[/code] in the editor's " +"Inspector dock. If [code]inspector_only[/code] is [code]true[/code], plugins " +"will not attempt to edit [code]object[/code]." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "" +"Returns [code]true[/code] if a scene is currently being played, [code]false[/" +"code] otherwise. Paused scenes are considered as being played." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "" +"Returns [code]true[/code] if the specified [code]plugin[/code] is enabled. " +"The plugin name is the same as its directory name." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "" +"Returns mesh previews rendered at the given size as an [Array] of [Texture]s." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "Opens the scene at the given path." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "Plays the currently active scene." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "Plays the scene specified by its filepath." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "Plays the main scene." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "Reloads the scene at the given path." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "" +"Saves the scene. Returns either [code]OK[/code] or [code]ERR_CANT_CREATE[/" +"code] (see [@GlobalScope] constants)." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "Saves the scene as a file at [code]path[/code]." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "" +"Selects the file, with the path provided by [code]file[/code], in the " +"FileSystem dock." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "" +"Sets the editor's current main screen to the one specified in [code]name[/" +"code]. [code]name[/code] must match the text of the tab in question exactly " +"([code]2D[/code], [code]3D[/code], [code]Script[/code], [code]AssetLib[/" +"code])." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "" +"Sets the enabled status of a plugin. The plugin name is the same as its " +"directory name." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "Stops the scene that is currently playing." +msgstr "" + +#: doc/classes/EditorInterface.xml +msgid "" +"If [code]true[/code], enables distraction-free mode which hides side docks " +"to increase the space available for the main view." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "Used by the editor to extend its functionality." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Plugins are used by the editor to extend functionality. The most common " +"types of plugins are those which edit a given node or resource type, import " +"plugins and export plugins. See also [EditorScript] to add functions to the " +"editor." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Adds a script at [code]path[/code] to the Autoload list as [code]name[/code]." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Adds a control to the bottom panel (together with Output, Debug, Animation, " +"etc). Returns a reference to the button added. It's up to you to hide/show " +"the button when needed. When your plugin is deactivated, make sure to remove " +"your custom control with [method remove_control_from_bottom_panel] and free " +"it with [method Node.queue_free]." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Adds a custom control to a container (see [enum CustomControlContainer]). " +"There are many locations where custom controls can be added in the editor " +"UI.\n" +"Please remember that you have to manage the visibility of your custom " +"controls yourself (and likely hide it after adding it).\n" +"When your plugin is deactivated, make sure to remove your custom control " +"with [method remove_control_from_container] and free it with [method Node." +"queue_free]." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Adds the control to a specific dock slot (see [enum DockSlot] for options).\n" +"If the dock is repositioned and as long as the plugin is active, the editor " +"will save the dock position on further sessions.\n" +"When your plugin is deactivated, make sure to remove your custom control " +"with [method remove_control_from_docks] and free it with [method Node." +"queue_free]." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Adds a custom type, which will appear in the list of nodes or resources. An " +"icon can be optionally passed.\n" +"When given node or resource is selected, the base type will be instanced " +"(ie, \"Spatial\", \"Control\", \"Resource\"), then the script will be loaded " +"and set to this object.\n" +"You can use the virtual method [method handles] to check if your custom " +"object is being edited by checking the script or using the [code]is[/code] " +"keyword.\n" +"During run-time, this will be a simple object with a script so this function " +"does not need to be called then." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Registers a new [EditorExportPlugin]. Export plugins are used to perform " +"tasks when the project is being exported.\n" +"See [method add_inspector_plugin] for an example of how to register a plugin." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Registers a new [EditorImportPlugin]. Import plugins are used to import " +"custom and unsupported assets as a custom [Resource] type.\n" +"[b]Note:[/b] If you want to import custom 3D asset formats use [method " +"add_scene_import_plugin] instead.\n" +"See [method add_inspector_plugin] for an example of how to register a plugin." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Registers a new [EditorInspectorPlugin]. Inspector plugins are used to " +"extend [EditorInspector] and provide custom configuration tools for your " +"object's properties.\n" +"[b]Note:[/b] Always use [method remove_inspector_plugin] to remove the " +"registered [EditorInspectorPlugin] when your [EditorPlugin] is disabled to " +"prevent leaks and an unexpected behavior.\n" +"[codeblock]\n" +"const MyInspectorPlugin = preload(\"res://addons/your_addon/path/to/your/" +"script.gd\")\n" +"var inspector_plugin = MyInspectorPlugin.new()\n" +"\n" +"func _enter_tree():\n" +" add_inspector_plugin(inspector_plugin)\n" +"\n" +"func _exit_tree():\n" +" remove_inspector_plugin(inspector_plugin)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Registers a new [EditorSceneImporter]. Scene importers are used to import " +"custom 3D asset formats as scenes." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Registers a new [EditorSpatialGizmoPlugin]. Gizmo plugins are used to add " +"custom gizmos to the 3D preview viewport for a [Spatial].\n" +"See [method add_inspector_plugin] for an example of how to register a plugin." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Adds a custom menu item to [b]Project > Tools[/b] as [code]name[/code] that " +"calls [code]callback[/code] on an instance of [code]handler[/code] with a " +"parameter [code]ud[/code] when user activates it." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Adds a custom submenu under [b]Project > Tools >[/b] [code]name[/code]. " +"[code]submenu[/code] should be an object of class [PopupMenu]. This submenu " +"should be cleaned up using [code]remove_tool_menu_item(name)[/code]." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"This method is called when the editor is about to save the project, switch " +"to another tab, etc. It asks the plugin to apply any pending state changes " +"to ensure consistency.\n" +"This is used, for example, in shader editors to let the plugin know that it " +"must apply the shader code being written by the user to the object." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"This method is called when the editor is about to run the project. The " +"plugin can then perform required operations before the project runs.\n" +"This method must return a boolean. If this method returns [code]false[/" +"code], the project will not run. The run is aborted immediately, so this " +"also prevents all other plugins' [method build] methods from running." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Clear all the state and reset the object being edited to zero. This ensures " +"your plugin does not keep editing a currently existing node, or a node from " +"the wrong scene." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Called by the engine when the user disables the [EditorPlugin] in the Plugin " +"tab of the project settings window." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"This function is used for plugins that edit specific object types (nodes or " +"resources). It requests the editor to edit the given object." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Called by the engine when the user enables the [EditorPlugin] in the Plugin " +"tab of the project settings window." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Called by the engine when the 2D editor's viewport is updated. Use the " +"[code]overlay[/code] [Control] for drawing. You can update the viewport " +"manually by calling [method update_overlays].\n" +"[codeblock]\n" +"func forward_canvas_draw_over_viewport(overlay):\n" +" # Draw a circle at cursor position.\n" +" overlay.draw_circle(overlay.get_local_mouse_position(), 64, Color." +"white)\n" +"\n" +"func forward_canvas_gui_input(event):\n" +" if event is InputEventMouseMotion:\n" +" # Redraw viewport when cursor is moved.\n" +" update_overlays()\n" +" return true\n" +" return false\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"This method is the same as [method forward_canvas_draw_over_viewport], " +"except it draws on top of everything. Useful when you need an extra layer " +"that shows over anything else.\n" +"You need to enable calling of this method by using [method " +"set_force_draw_over_forwarding_enabled]." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Called when there is a root node in the current edited scene, [method " +"handles] is implemented and an [InputEvent] happens in the 2D viewport. " +"Intercepts the [InputEvent], if [code]return true[/code] [EditorPlugin] " +"consumes the [code]event[/code], otherwise forwards [code]event[/code] to " +"other Editor classes. Example:\n" +"[codeblock]\n" +"# Prevents the InputEvent to reach other Editor classes\n" +"func forward_canvas_gui_input(event):\n" +" var forward = true\n" +" return forward\n" +"[/codeblock]\n" +"Must [code]return false[/code] in order to forward the [InputEvent] to other " +"Editor classes. Example:\n" +"[codeblock]\n" +"# Consumes InputEventMouseMotion and forwards other InputEvent types\n" +"func forward_canvas_gui_input(event):\n" +" var forward = false\n" +" if event is InputEventMouseMotion:\n" +" forward = true\n" +" return forward\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Called by the engine when the 3D editor's viewport is updated. Use the " +"[code]overlay[/code] [Control] for drawing. You can update the viewport " +"manually by calling [method update_overlays].\n" +"[codeblock]\n" +"func forward_spatial_draw_over_viewport(overlay):\n" +" # Draw a circle at cursor position.\n" +" overlay.draw_circle(overlay.get_local_mouse_position(), 64)\n" +"\n" +"func forward_spatial_gui_input(camera, event):\n" +" if event is InputEventMouseMotion:\n" +" # Redraw viewport when cursor is moved.\n" +" update_overlays()\n" +" return true\n" +" return false\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"This method is the same as [method forward_spatial_draw_over_viewport], " +"except it draws on top of everything. Useful when you need an extra layer " +"that shows over anything else.\n" +"You need to enable calling of this method by using [method " +"set_force_draw_over_forwarding_enabled]." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Called when there is a root node in the current edited scene, [method " +"handles] is implemented and an [InputEvent] happens in the 3D viewport. " +"Intercepts the [InputEvent], if [code]return true[/code] [EditorPlugin] " +"consumes the [code]event[/code], otherwise forwards [code]event[/code] to " +"other Editor classes. Example:\n" +"[codeblock]\n" +"# Prevents the InputEvent to reach other Editor classes\n" +"func forward_spatial_gui_input(camera, event):\n" +" var forward = true\n" +" return forward\n" +"[/codeblock]\n" +"Must [code]return false[/code] in order to forward the [InputEvent] to other " +"Editor classes. Example:\n" +"[codeblock]\n" +"# Consumes InputEventMouseMotion and forwards other InputEvent types\n" +"func forward_spatial_gui_input(camera, event):\n" +" var forward = false\n" +" if event is InputEventMouseMotion:\n" +" forward = true\n" +" return forward\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"This is for editors that edit script-based objects. You can return a list of " +"breakpoints in the format ([code]script:line[/code]), for example: " +"[code]res://path_to_script.gd:25[/code]." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Returns the [EditorInterface] object that gives you control over Godot " +"editor's window and its functionalities." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Override this method in your plugin to return a [Texture] in order to give " +"it an icon.\n" +"For main screen plugins, this appears at the top of the screen, to the right " +"of the \"2D\", \"3D\", \"Script\", and \"AssetLib\" buttons.\n" +"Ideally, the plugin icon should be white with a transparent background and " +"16x16 pixels in size.\n" +"[codeblock]\n" +"func get_plugin_icon():\n" +" # You can use a custom icon:\n" +" return preload(\"res://addons/my_plugin/my_plugin_icon.svg\")\n" +" # Or use a built-in icon:\n" +" return get_editor_interface().get_base_control().get_icon(\"Node\", " +"\"EditorIcons\")\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Override this method in your plugin to provide the name of the plugin when " +"displayed in the Godot editor.\n" +"For main screen plugins, this appears at the top of the screen, to the right " +"of the \"2D\", \"3D\", \"Script\", and \"AssetLib\" buttons." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Gets the Editor's dialog used for making scripts.\n" +"[b]Note:[/b] Users can configure it before use.\n" +"[b]Warning:[/b] Removing and freeing this node will render a part of the " +"editor useless and may cause a crash." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Override this method to provide a state data you want to be saved, like view " +"position, grid settings, folding, etc. This is used when saving the scene " +"(so state is kept when opening it again) and for switching tabs (so state " +"can be restored when the tab returns). This data is automatically saved for " +"each scene in an [code]editstate[/code] file in the editor metadata folder. " +"If you want to store global (scene-independent) editor data for your plugin, " +"you can use [method get_window_layout] instead.\n" +"Use [method set_state] to restore your saved state.\n" +"[b]Note:[/b] This method should not be used to save important settings that " +"should persist with the project.\n" +"[b]Note:[/b] You must implement [method get_plugin_name] for the state to be " +"stored and restored correctly.\n" +"[codeblock]\n" +"func get_state():\n" +" var state = {\"zoom\": zoom, \"preferred_color\": my_color}\n" +" return state\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Gets the undo/redo object. Most actions in the editor can be undoable, so " +"use this object to make sure this happens when it's worth it." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Override this method to provide the GUI layout of the plugin or any other " +"data you want to be stored. This is used to save the project's editor layout " +"when [method queue_save_layout] is called or the editor layout was changed " +"(for example changing the position of a dock). The data is stored in the " +"[code]editor_layout.cfg[/code] file in the editor metadata directory.\n" +"Use [method set_window_layout] to restore your saved layout.\n" +"[codeblock]\n" +"func get_window_layout(configuration):\n" +" configuration.set_value(\"MyPlugin\", \"window_position\", $Window." +"position)\n" +" configuration.set_value(\"MyPlugin\", \"icon_color\", $Icon.modulate)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Implement this function if your plugin edits a specific type of object " +"(Resource or Node). If you return [code]true[/code], then you will get the " +"functions [method edit] and [method make_visible] called when the editor " +"requests them. If you have declared the methods [method " +"forward_canvas_gui_input] and [method forward_spatial_gui_input] these will " +"be called too." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Returns [code]true[/code] if this is a main screen editor plugin (it goes in " +"the workspace selector together with [b]2D[/b], [b]3D[/b], [b]Script[/b] and " +"[b]AssetLib[/b])." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "Minimizes the bottom panel." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "Makes a specific item in the bottom panel visible." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"This function will be called when the editor is requested to become visible. " +"It is used for plugins that edit a specific object type.\n" +"Remember that you have to manage the visibility of all your editor controls " +"manually." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "Queue save the project's editor layout." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "Removes an Autoload [code]name[/code] from the list." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Removes the control from the bottom panel. You have to manually [method Node." +"queue_free] the control." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Removes the control from the specified container. You have to manually " +"[method Node.queue_free] the control." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Removes the control from the dock. You have to manually [method Node." +"queue_free] the control." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "Removes a custom type added by [method add_custom_type]." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "Removes an export plugin registered by [method add_export_plugin]." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "Removes an import plugin registered by [method add_import_plugin]." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "Removes an inspector plugin registered by [method add_import_plugin]" +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Removes a scene importer registered by [method add_scene_import_plugin]." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "Removes a gizmo plugin registered by [method add_spatial_gizmo_plugin]." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "Removes a menu [code]name[/code] from [b]Project > Tools[/b]." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"This method is called after the editor saves the project or when it's " +"closed. It asks the plugin to save edited external scenes/resources." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Enables calling of [method forward_canvas_force_draw_over_viewport] for the " +"2D editor and [method forward_spatial_force_draw_over_viewport] for the 3D " +"editor when their viewports are updated. You need to call this method only " +"once and it will work permanently for this plugin." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Use this method if you always want to receive inputs from 3D view screen " +"inside [method forward_spatial_gui_input]. It might be especially usable if " +"your plugin will want to use raycast in the scene." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Restore the state saved by [method get_state]. This method is called when " +"the current scene tab is changed in the editor.\n" +"[b]Note:[/b] Your plugin must implement [method get_plugin_name], otherwise " +"it will not be recognized and this method will not be called.\n" +"[codeblock]\n" +"func set_state(data):\n" +" zoom = data.get(\"zoom\", 1.0)\n" +" preferred_color = data.get(\"my_color\", Color.white)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Restore the plugin GUI layout and data saved by [method get_window_layout]. " +"This method is called for every plugin on editor startup. Use the provided " +"[code]configuration[/code] file to read your saved data.\n" +"[codeblock]\n" +"func set_window_layout(configuration):\n" +" $Window.position = configuration.get_value(\"MyPlugin\", " +"\"window_position\", Vector2())\n" +" $Icon.modulate = configuration.get_value(\"MyPlugin\", \"icon_color\", " +"Color.white)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Updates the overlays of the 2D and 3D editor viewport. Causes methods " +"[method forward_canvas_draw_over_viewport], [method " +"forward_canvas_force_draw_over_viewport], [method " +"forward_spatial_draw_over_viewport] and [method " +"forward_spatial_force_draw_over_viewport] to be called." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Emitted when user changes the workspace ([b]2D[/b], [b]3D[/b], [b]Script[/" +"b], [b]AssetLib[/b]). Also works with custom screens defined by plugins." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Emitted when the scene is changed in the editor. The argument will return " +"the root node of the scene that has just become active. If this scene is new " +"and empty, the argument will be [code]null[/code]." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "" +"Emitted when user closes a scene. The argument is file path to a closed " +"scene." +msgstr "" + +#: doc/classes/EditorPlugin.xml +msgid "Represents the size of the [enum DockSlot] enum." +msgstr "" + +#: doc/classes/EditorProperty.xml +msgid "Custom control to edit properties for adding into the inspector." +msgstr "" + +#: doc/classes/EditorProperty.xml +msgid "" +"This control allows property editing for one or multiple properties into " +"[EditorInspector]. It is added via [EditorInspectorPlugin]." +msgstr "" + +#: doc/classes/EditorProperty.xml +msgid "" +"If any of the controls added can gain keyboard focus, add it here. This " +"ensures that focus will be restored if the inspector is refreshed." +msgstr "" + +#: doc/classes/EditorProperty.xml +msgid "" +"If one or several properties have changed, this must be called. [code]field[/" +"code] is used in case your editor can modify fields separately (as an " +"example, Vector3.x). The [code]changing[/code] argument avoids the editor " +"requesting this property to be refreshed (leave as [code]false[/code] if " +"unsure)." +msgstr "" + +#: doc/classes/EditorProperty.xml +msgid "Gets the edited object." +msgstr "" + +#: doc/classes/EditorProperty.xml +msgid "" +"Gets the edited property. If your editor is for a single property (added via " +"[method EditorInspectorPlugin.parse_property]), then this will return the " +"property." +msgstr "" + +#: doc/classes/EditorProperty.xml +msgid "Must be implemented to provide a custom tooltip to the property editor." +msgstr "" + +#: doc/classes/EditorProperty.xml +msgid "" +"Puts the [code]editor[/code] control below the property label. The control " +"must be previously added using [method Node.add_child]." +msgstr "" + +#: doc/classes/EditorProperty.xml +msgid "When this virtual function is called, you must update your editor." +msgstr "" + +#: doc/classes/EditorProperty.xml +msgid "" +"Used by the inspector, set to [code]true[/code] when the property is " +"checkable." +msgstr "" + +#: doc/classes/EditorProperty.xml +msgid "" +"Used by the inspector, set to [code]true[/code] when the property is checked." +msgstr "" + +#: doc/classes/EditorProperty.xml +msgid "" +"Used by the inspector, set to [code]true[/code] when the property is drawn " +"with the editor theme's warning color. This is used for editable children's " +"properties." +msgstr "" + +#: doc/classes/EditorProperty.xml +msgid "" +"Used by the inspector, set to [code]true[/code] when the property can add " +"keys for animation." +msgstr "" + +#: doc/classes/EditorProperty.xml +msgid "Set this property to change the label (if you want to show one)." +msgstr "" + +#: doc/classes/EditorProperty.xml +msgid "" +"Used by the inspector, set to [code]true[/code] when the property is read-" +"only." +msgstr "" + +#: doc/classes/EditorProperty.xml +msgid "" +"Emit it if you want multiple properties modified at the same time. Do not " +"use if added via [method EditorInspectorPlugin.parse_property]." +msgstr "" + +#: doc/classes/EditorProperty.xml +msgid "Used by sub-inspectors. Emit it if what was selected was an Object ID." +msgstr "" + +#: doc/classes/EditorProperty.xml +msgid "" +"Do not emit this manually, use the [method emit_changed] method instead." +msgstr "" + +#: doc/classes/EditorProperty.xml +msgid "Emitted when a property was checked. Used internally." +msgstr "" + +#: doc/classes/EditorProperty.xml +msgid "" +"Emit it if you want to add this value as an animation key (check for keying " +"being enabled first)." +msgstr "" + +#: doc/classes/EditorProperty.xml +msgid "Emit it if you want to key a property with a single value." +msgstr "" + +#: doc/classes/EditorProperty.xml +msgid "" +"Emit it if you want to mark (or unmark) the value of a property for being " +"saved regardless of being equal to the default value.\n" +"The default value is the one the property will get when the node is just " +"instantiated and can come from an ancestor scene in the inheritance/" +"instancing chain, a script or a builtin class." +msgstr "" + +#: doc/classes/EditorProperty.xml +msgid "" +"If you want a sub-resource to be edited, emit this signal with the resource." +msgstr "" + +#: doc/classes/EditorProperty.xml +msgid "Emitted when selected. Used internally." +msgstr "" + +#: doc/classes/EditorResourcePicker.xml +msgid "Godot editor's control for selecting [Resource] type properties." +msgstr "" + +#: doc/classes/EditorResourcePicker.xml +msgid "" +"This [Control] node is used in the editor's Inspector dock to allow editing " +"of [Resource] type properties. It provides options for creating, loading, " +"saving and converting resources. Can be used with [EditorInspectorPlugin] to " +"recreate the same behavior.\n" +"[b]Note:[/b] This [Control] does not include any editor for the resource, as " +"editing is controlled by the Inspector dock itself or sub-Inspectors." +msgstr "" + +#: doc/classes/EditorResourcePicker.xml +msgid "" +"Returns a list of all allowed types and subtypes corresponding to the " +"[member base_type]. If the [member base_type] is empty, an empty list is " +"returned." +msgstr "" + +#: doc/classes/EditorResourcePicker.xml +msgid "" +"This virtual method can be implemented to handle context menu items not " +"handled by default. See [method set_create_options]." +msgstr "" + +#: doc/classes/EditorResourcePicker.xml +msgid "" +"This virtual method is called when updating the context menu of " +"[EditorResourcePicker]. Implement this method to override the \"New ...\" " +"items with your own options. [code]menu_node[/code] is a reference to the " +"[PopupMenu] node.\n" +"[b]Note:[/b] Implement [method handle_menu_selected] to handle these custom " +"items." +msgstr "" + +#: doc/classes/EditorResourcePicker.xml +msgid "" +"Sets the toggle mode state for the main button. Works only if [member " +"toggle_mode] is set to [code]true[/code]." +msgstr "" + +#: doc/classes/EditorResourcePicker.xml +msgid "" +"The base type of allowed resource types. Can be a comma-separated list of " +"several options." +msgstr "" + +#: doc/classes/EditorResourcePicker.xml +msgid "If [code]true[/code], the value can be selected and edited." +msgstr "" + +#: doc/classes/EditorResourcePicker.xml +msgid "The edited resource value." +msgstr "" + +#: doc/classes/EditorResourcePicker.xml +msgid "" +"If [code]true[/code], the main button with the resource preview works in the " +"toggle mode. Use [method set_toggle_pressed] to manually set the state." +msgstr "" + +#: doc/classes/EditorResourcePicker.xml +msgid "Emitted when the value of the edited resource was changed." +msgstr "" + +#: doc/classes/EditorResourcePicker.xml +msgid "" +"Emitted when the resource value was set and user clicked to edit it. When " +"[code]edit[/code] is [code]true[/code], the signal was caused by the context " +"menu \"Edit\" option." +msgstr "" + +#: doc/classes/EditorResourcePreview.xml +msgid "Helper to generate previews of resources or files." +msgstr "" + +#: doc/classes/EditorResourcePreview.xml +msgid "" +"This object is used to generate previews for resources of files.\n" +"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access " +"the singleton using [method EditorInterface.get_resource_previewer]." +msgstr "" + +#: doc/classes/EditorResourcePreview.xml +msgid "Create an own, custom preview generator." +msgstr "" + +#: doc/classes/EditorResourcePreview.xml +msgid "" +"Check if the resource changed, if so, it will be invalidated and the " +"corresponding signal emitted." +msgstr "" + +#: doc/classes/EditorResourcePreview.xml +msgid "" +"Queue the [code]resource[/code] being edited for preview. Once the preview " +"is ready, the [code]receiver[/code]'s [code]receiver_func[/code] will be " +"called. The [code]receiver_func[/code] must take the following four " +"arguments: [String] path, [Texture] preview, [Texture] thumbnail_preview, " +"[Variant] userdata. [code]userdata[/code] can be anything, and will be " +"returned when [code]receiver_func[/code] is called.\n" +"[b]Note:[/b] If it was not possible to create the preview the " +"[code]receiver_func[/code] will still be called, but the preview will be " +"null." +msgstr "" + +#: doc/classes/EditorResourcePreview.xml +msgid "" +"Queue a resource file located at [code]path[/code] for preview. Once the " +"preview is ready, the [code]receiver[/code]'s [code]receiver_func[/code] " +"will be called. The [code]receiver_func[/code] must take the following four " +"arguments: [String] path, [Texture] preview, [Texture] thumbnail_preview, " +"[Variant] userdata. [code]userdata[/code] can be anything, and will be " +"returned when [code]receiver_func[/code] is called.\n" +"[b]Note:[/b] If it was not possible to create the preview the " +"[code]receiver_func[/code] will still be called, but the preview will be " +"null." +msgstr "" + +#: doc/classes/EditorResourcePreview.xml +msgid "Removes a custom preview generator." +msgstr "" + +#: doc/classes/EditorResourcePreview.xml +msgid "" +"Emitted if a preview was invalidated (changed). [code]path[/code] " +"corresponds to the path of the preview." +msgstr "" + +#: doc/classes/EditorResourcePreviewGenerator.xml +msgid "Custom generator of previews." +msgstr "" + +#: doc/classes/EditorResourcePreviewGenerator.xml +msgid "" +"Custom code to generate previews. Please check [code]file_dialog/" +"thumbnail_size[/code] in [EditorSettings] to find out the right size to do " +"previews at." +msgstr "" + +#: doc/classes/EditorResourcePreviewGenerator.xml +msgid "" +"If this function returns [code]true[/code], the generator will call [method " +"generate] or [method generate_from_path] for small previews as well.\n" +"By default, it returns [code]false[/code]." +msgstr "" + +#: doc/classes/EditorResourcePreviewGenerator.xml +msgid "" +"Generate a preview from a given resource with the specified size. This must " +"always be implemented.\n" +"Returning an empty texture is an OK way to fail and let another generator " +"take care.\n" +"Care must be taken because this function is always called from a thread (not " +"the main thread)." +msgstr "" + +#: doc/classes/EditorResourcePreviewGenerator.xml +msgid "" +"Generate a preview directly from a path with the specified size. " +"Implementing this is optional, as default code will load and call [method " +"generate].\n" +"Returning an empty texture is an OK way to fail and let another generator " +"take care.\n" +"Care must be taken because this function is always called from a thread (not " +"the main thread)." +msgstr "" + +#: doc/classes/EditorResourcePreviewGenerator.xml +msgid "" +"If this function returns [code]true[/code], the generator will automatically " +"generate the small previews from the normal preview texture generated by the " +"methods [method generate] or [method generate_from_path].\n" +"By default, it returns [code]false[/code]." +msgstr "" + +#: doc/classes/EditorResourcePreviewGenerator.xml +msgid "" +"Returns [code]true[/code] if your generator supports the resource of type " +"[code]type[/code]." +msgstr "" + +#: doc/classes/EditorSceneImporter.xml +msgid "Imports scenes from third-parties' 3D files." +msgstr "" + +#: doc/classes/EditorSceneImporter.xml +msgid "" +"[EditorSceneImporter] allows to define an importer script for a third-party " +"3D format.\n" +"To use [EditorSceneImporter], register it using the [method EditorPlugin." +"add_scene_import_plugin] method first." +msgstr "" + +#: modules/fbx/doc_classes/EditorSceneImporterFBX.xml +msgid "FBX 3D asset importer." +msgstr "" + +#: modules/fbx/doc_classes/EditorSceneImporterFBX.xml +msgid "" +"This is an FBX 3D asset importer with full support for most FBX features.\n" +"If exporting a FBX scene from Autodesk Maya, use these FBX export settings:\n" +"[codeblock]\n" +"- Smoothing Groups\n" +"- Smooth Mesh\n" +"- Triangluate (for meshes with blend shapes)\n" +"- Bake Animation\n" +"- Resample All\n" +"- Deformed Models\n" +"- Skins\n" +"- Blend Shapes\n" +"- Curve Filters\n" +"- Constant Key Reducer\n" +"- Auto Tangents Only\n" +"- *Do not check* Constraints (as it will break the file)\n" +"- Can check Embed Media (embeds textures into the exported FBX file)\n" +" - Note that when importing embedded media, the texture and mesh will be a " +"single immutable file.\n" +" - You will have to re-export then re-import the FBX if the texture has " +"changed.\n" +"- Units: Centimeters\n" +"- Up Axis: Y\n" +"- Binary format in FBX 2017\n" +"[/codeblock]" +msgstr "" + +#: modules/gltf/doc_classes/EditorSceneImporterGLTF.xml +msgid "" +"[b]Note:[/b] This class is only compiled in editor builds. Run-time glTF " +"loading and saving is [i]not[/i] available in exported projects. References " +"to [EditorSceneImporterGLTF] within a script will cause an error in an " +"exported project." +msgstr "" + +#: doc/classes/EditorScenePostImport.xml +msgid "Post-processes scenes after import." +msgstr "" + +#: doc/classes/EditorScenePostImport.xml +msgid "" +"Imported scenes can be automatically modified right after import by setting " +"their [b]Custom Script[/b] Import property to a [code]tool[/code] script " +"that inherits from this class.\n" +"The [method post_import] callback receives the imported scene's root node " +"and returns the modified version of the scene. Usage example:\n" +"[codeblock]\n" +"tool # Needed so it runs in editor\n" +"extends EditorScenePostImport\n" +"\n" +"# This sample changes all node names\n" +"\n" +"# Called right after the scene is imported and gets the root node\n" +"func post_import(scene):\n" +" # Change all node names to \"modified_[oldnodename]\"\n" +" iterate(scene)\n" +" return scene # Remember to return the imported scene\n" +"\n" +"func iterate(node):\n" +" if node != null:\n" +" node.name = \"modified_\" + node.name\n" +" for child in node.get_children():\n" +" iterate(child)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/EditorScenePostImport.xml +msgid "" +"Returns the source file path which got imported (e.g. [code]res://scene.dae[/" +"code])." +msgstr "" + +#: doc/classes/EditorScenePostImport.xml +msgid "Returns the resource folder the imported scene file is located in." +msgstr "" + +#: doc/classes/EditorScenePostImport.xml +msgid "" +"Called after the scene was imported. This method must return the modified " +"version of the scene." +msgstr "" + +#: doc/classes/EditorScript.xml +msgid "Base script that can be used to add extension functions to the editor." +msgstr "" + +#: doc/classes/EditorScript.xml +msgid "" +"Scripts extending this class and implementing its [method _run] method can " +"be executed from the Script Editor's [b]File > Run[/b] menu option (or by " +"pressing [code]Ctrl+Shift+X[/code]) while the editor is running. This is " +"useful for adding custom in-editor functionality to Godot. For more complex " +"additions, consider using [EditorPlugin]s instead.\n" +"[b]Note:[/b] Extending scripts need to have [code]tool[/code] mode enabled.\n" +"[b]Example script:[/b]\n" +"[codeblock]\n" +"tool\n" +"extends EditorScript\n" +"\n" +"func _run():\n" +" print(\"Hello from the Godot Editor!\")\n" +"[/codeblock]\n" +"[b]Note:[/b] The script is run in the Editor context, which means the output " +"is visible in the console window started with the Editor (stdout) instead of " +"the usual Godot [b]Output[/b] dock." +msgstr "" + +#: doc/classes/EditorScript.xml +msgid "This method is executed by the Editor when [b]File > Run[/b] is used." +msgstr "" + +#: doc/classes/EditorScript.xml +msgid "" +"Adds [code]node[/code] as a child of the root node in the editor context.\n" +"[b]Warning:[/b] The implementation of this method is currently disabled." +msgstr "" + +#: doc/classes/EditorScript.xml +msgid "Returns the [EditorInterface] singleton instance." +msgstr "" + +#: doc/classes/EditorScript.xml +msgid "Returns the Editor's currently active scene." +msgstr "" + +#: doc/classes/EditorScriptPicker.xml +msgid "" +"Godot editor's control for selecting the [code]script[/code] property of a " +"[Node]." +msgstr "" + +#: doc/classes/EditorScriptPicker.xml +msgid "" +"Similar to [EditorResourcePicker] this [Control] node is used in the " +"editor's Inspector dock, but only to edit the [code]script[/code] property " +"of a [Node]. Default options for creating new resources of all possible " +"subtypes are replaced with dedicated buttons that open the \"Attach Node " +"Script\" dialog. Can be used with [EditorInspectorPlugin] to recreate the " +"same behavior.\n" +"[b]Note:[/b] You must set the [member script_owner] for the custom context " +"menu items to work." +msgstr "" + +#: doc/classes/EditorScriptPicker.xml +msgid "The owner [Node] of the script property that holds the edited resource." +msgstr "" + +#: doc/classes/EditorSelection.xml +msgid "Manages the SceneTree selection in the editor." +msgstr "" + +#: doc/classes/EditorSelection.xml +msgid "" +"This object manages the SceneTree selection in the editor.\n" +"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access " +"the singleton using [method EditorInterface.get_selection]." +msgstr "" + +#: doc/classes/EditorSelection.xml +msgid "" +"Adds a node to the selection.\n" +"[b]Note:[/b] The newly selected node will not be automatically edited in the " +"inspector. If you want to edit a node, use [method EditorInterface." +"edit_node]." +msgstr "" + +#: doc/classes/EditorSelection.xml +msgid "Clear the selection." +msgstr "" + +#: doc/classes/EditorSelection.xml +msgid "Gets the list of selected nodes." +msgstr "" + +#: doc/classes/EditorSelection.xml +msgid "" +"Gets the list of selected nodes, optimized for transform operations (i.e. " +"moving them, rotating, etc). This list avoids situations where a node is " +"selected and also child/grandchild." +msgstr "" + +#: doc/classes/EditorSelection.xml +msgid "Removes a node from the selection." +msgstr "" + +#: doc/classes/EditorSelection.xml +msgid "Emitted when the selection changes." +msgstr "" + +#: doc/classes/EditorSettings.xml +msgid "Object that holds the project-independent editor settings." +msgstr "" + +#: doc/classes/EditorSettings.xml +msgid "" +"Object that holds the project-independent editor settings. These settings " +"are generally visible in the [b]Editor > Editor Settings[/b] menu.\n" +"Property names use slash delimiters to distinguish sections. Setting values " +"can be of any [Variant] type. It's recommended to use [code]snake_case[/" +"code] for editor settings to be consistent with the Godot editor itself.\n" +"Accessing the settings can be done using the following methods, such as:\n" +"[codeblock]\n" +"# `settings.set(\"some/property\", value)` also works as this class " +"overrides `_set()` internally.\n" +"settings.set_setting(\"some/property\",value)\n" +"\n" +"# `settings.get(\"some/property\", value)` also works as this class " +"overrides `_get()` internally.\n" +"settings.get_setting(\"some/property\")\n" +"\n" +"var list_of_settings = settings.get_property_list()\n" +"[/codeblock]\n" +"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access " +"the singleton using [method EditorInterface.get_editor_settings]." +msgstr "" + +#: doc/classes/EditorSettings.xml +msgid "" +"Adds a custom property info to a property. The dictionary must contain:\n" +"- [code]name[/code]: [String] (the name of the property)\n" +"- [code]type[/code]: [int] (see [enum Variant.Type])\n" +"- optionally [code]hint[/code]: [int] (see [enum PropertyHint]) and " +"[code]hint_string[/code]: [String]\n" +"[b]Example:[/b]\n" +"[codeblock]\n" +"editor_settings.set(\"category/property_name\", 0)\n" +"\n" +"var property_info = {\n" +" \"name\": \"category/property_name\",\n" +" \"type\": TYPE_INT,\n" +" \"hint\": PROPERTY_HINT_ENUM,\n" +" \"hint_string\": \"one,two,three\"\n" +"}\n" +"\n" +"editor_settings.add_property_info(property_info)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/EditorSettings.xml +msgid "Erases the setting whose name is specified by [code]property[/code]." +msgstr "" + +#: doc/classes/EditorSettings.xml +msgid "Returns the list of favorite files and directories for this project." +msgstr "" + +#: doc/classes/EditorSettings.xml +msgid "" +"Returns project-specific metadata for the [code]section[/code] and " +"[code]key[/code] specified. If the metadata doesn't exist, [code]default[/" +"code] will be returned instead. See also [method set_project_metadata]." +msgstr "" + +#: doc/classes/EditorSettings.xml +msgid "" +"Returns the project-specific settings path. Projects all have a unique " +"subdirectory inside the settings path where project-specific settings are " +"saved." +msgstr "" + +#: doc/classes/EditorSettings.xml +msgid "" +"Returns the list of recently visited folders in the file dialog for this " +"project." +msgstr "" + +#: doc/classes/EditorSettings.xml +msgid "" +"Returns the value of the setting specified by [code]name[/code]. This is " +"equivalent to using [method Object.get] on the EditorSettings instance." +msgstr "" + +#: doc/classes/EditorSettings.xml +msgid "" +"Gets the global settings path for the engine. Inside this path, you can find " +"some standard paths such as:\n" +"[code]settings/tmp[/code] - Used for temporary storage of files\n" +"[code]settings/templates[/code] - Where export templates are located" +msgstr "" + +#: doc/classes/EditorSettings.xml +msgid "" +"Returns [code]true[/code] if the setting specified by [code]name[/code] " +"exists, [code]false[/code] otherwise." +msgstr "" + +#: doc/classes/EditorSettings.xml +msgid "" +"Returns [code]true[/code] if the setting specified by [code]name[/code] can " +"have its value reverted to the default value, [code]false[/code] otherwise. " +"When this method returns [code]true[/code], a Revert button will display " +"next to the setting in the Editor Settings." +msgstr "" + +#: doc/classes/EditorSettings.xml +msgid "" +"Returns the default value of the setting specified by [code]name[/code]. " +"This is the value that would be applied when clicking the Revert button in " +"the Editor Settings." +msgstr "" + +#: doc/classes/EditorSettings.xml +msgid "Sets the list of favorite files and directories for this project." +msgstr "" + +#: doc/classes/EditorSettings.xml +msgid "" +"Sets the initial value of the setting specified by [code]name[/code] to " +"[code]value[/code]. This is used to provide a value for the Revert button in " +"the Editor Settings. If [code]update_current[/code] is true, the current " +"value of the setting will be set to [code]value[/code] as well." +msgstr "" + +#: doc/classes/EditorSettings.xml +msgid "" +"Sets project-specific metadata with the [code]section[/code], [code]key[/" +"code] and [code]data[/code] specified. This metadata is stored outside the " +"project folder and therefore won't be checked into version control. See also " +"[method get_project_metadata]." +msgstr "" + +#: doc/classes/EditorSettings.xml +msgid "" +"Sets the list of recently visited folders in the file dialog for this " +"project." +msgstr "" + +#: doc/classes/EditorSettings.xml +msgid "" +"Sets the [code]value[/code] of the setting specified by [code]name[/code]. " +"This is equivalent to using [method Object.set] on the EditorSettings " +"instance." +msgstr "" + +#: doc/classes/EditorSettings.xml +msgid "Emitted after any editor setting has changed." +msgstr "" + +#: doc/classes/EditorSettings.xml +msgid "" +"Emitted after any editor setting has changed. It's used by various editor " +"plugins to update their visuals on theme changes or logic on configuration " +"changes." +msgstr "" + +#: doc/classes/EditorSpatialGizmo.xml +msgid "Custom gizmo for editing Spatial objects." +msgstr "" + +#: doc/classes/EditorSpatialGizmo.xml +msgid "" +"Custom gizmo that is used for providing custom visualization and editing " +"(handles) for 3D Spatial objects. See [EditorSpatialGizmoPlugin] for more " +"information." +msgstr "" + +#: doc/classes/EditorSpatialGizmo.xml +msgid "" +"Adds the specified [code]segments[/code] to the gizmo's collision shape for " +"picking. Call this function during [method redraw]." +msgstr "" + +#: doc/classes/EditorSpatialGizmo.xml +msgid "" +"Adds collision triangles to the gizmo for picking. A [TriangleMesh] can be " +"generated from a regular [Mesh] too. Call this function during [method " +"redraw]." +msgstr "" + +#: doc/classes/EditorSpatialGizmo.xml +msgid "" +"Adds a list of handles (points) which can be used to deform the object being " +"edited.\n" +"There are virtual functions which will be called upon editing of these " +"handles. Call this function during [method redraw]." +msgstr "" + +#: doc/classes/EditorSpatialGizmo.xml +msgid "" +"Adds lines to the gizmo (as sets of 2 points), with a given material. The " +"lines are used for visualizing the gizmo. Call this function during [method " +"redraw]." +msgstr "" + +#: doc/classes/EditorSpatialGizmo.xml +msgid "" +"Adds a mesh to the gizmo with the specified [code]billboard[/code] state, " +"[code]skeleton[/code] and [code]material[/code]. If [code]billboard[/code] " +"is [code]true[/code], the mesh will rotate to always face the camera. Call " +"this function during [method redraw]." +msgstr "" + +#: doc/classes/EditorSpatialGizmo.xml +msgid "" +"Adds an unscaled billboard for visualization. Call this function during " +"[method redraw]." +msgstr "" + +#: doc/classes/EditorSpatialGizmo.xml +msgid "" +"Removes everything in the gizmo including meshes, collisions and handles." +msgstr "" + +#: doc/classes/EditorSpatialGizmo.xml +msgid "" +"Commit a handle being edited (handles must have been previously added by " +"[method add_handles]).\n" +"If the [code]cancel[/code] parameter is [code]true[/code], an option to " +"restore the edited value to the original is provided." +msgstr "" + +#: doc/classes/EditorSpatialGizmo.xml +msgid "" +"Gets the name of an edited handle (handles must have been previously added " +"by [method add_handles]).\n" +"Handles can be named for reference to the user when editing." +msgstr "" + +#: doc/classes/EditorSpatialGizmo.xml +msgid "" +"Gets actual value of a handle. This value can be anything and used for " +"eventually undoing the motion when calling [method commit_handle]." +msgstr "" + +#: doc/classes/EditorSpatialGizmo.xml +msgid "" +"Returns the [EditorSpatialGizmoPlugin] that owns this gizmo. It's useful to " +"retrieve materials using [method EditorSpatialGizmoPlugin.get_material]." +msgstr "" + +#: doc/classes/EditorSpatialGizmo.xml +msgid "Returns the Spatial node associated with this gizmo." +msgstr "" + +#: doc/classes/EditorSpatialGizmo.xml +msgid "" +"Returns [code]true[/code] if the handle at index [code]index[/code] is " +"highlighted by being hovered with the mouse." +msgstr "" + +#: doc/classes/EditorSpatialGizmo.xml +msgid "" +"This function is called when the [Spatial] this gizmo refers to changes (the " +"[method Spatial.update_gizmo] is called)." +msgstr "" + +#: doc/classes/EditorSpatialGizmo.xml +msgid "" +"This function is used when the user drags a gizmo handle (previously added " +"with [method add_handles]) in screen coordinates.\n" +"The [Camera] is also provided so screen coordinates can be converted to " +"raycasts." +msgstr "" + +#: doc/classes/EditorSpatialGizmo.xml +msgid "" +"Sets the gizmo's hidden state. If [code]true[/code], the gizmo will be " +"hidden. If [code]false[/code], it will be shown." +msgstr "" + +#: doc/classes/EditorSpatialGizmo.xml +msgid "" +"Sets the reference [Spatial] node for the gizmo. [code]node[/code] must " +"inherit from [Spatial]." +msgstr "" + +#: doc/classes/EditorSpatialGizmoPlugin.xml +msgid "Used by the editor to define Spatial gizmo types." +msgstr "" + +#: doc/classes/EditorSpatialGizmoPlugin.xml +msgid "" +"[EditorSpatialGizmoPlugin] allows you to define a new type of Gizmo. There " +"are two main ways to do so: extending [EditorSpatialGizmoPlugin] for the " +"simpler gizmos, or creating a new [EditorSpatialGizmo] type. See the " +"tutorial in the documentation for more info.\n" +"To use [EditorSpatialGizmoPlugin], register it using the [method " +"EditorPlugin.add_spatial_gizmo_plugin] method first." +msgstr "" + +#: doc/classes/EditorSpatialGizmoPlugin.xml +msgid "" +"Adds a new material to the internal material list for the plugin. It can " +"then be accessed with [method get_material]. Should not be overridden." +msgstr "" + +#: doc/classes/EditorSpatialGizmoPlugin.xml +msgid "" +"Override this method to define whether the gizmo can be hidden or not. " +"Returns [code]true[/code] if not overridden." +msgstr "" + +#: doc/classes/EditorSpatialGizmoPlugin.xml +msgid "" +"Override this method to commit gizmo handles. Called for this plugin's " +"active gizmos." +msgstr "" + +#: doc/classes/EditorSpatialGizmoPlugin.xml +msgid "" +"Override this method to return a custom [EditorSpatialGizmo] for the spatial " +"nodes of your choice, return [code]null[/code] for the rest of nodes. See " +"also [method has_gizmo]." +msgstr "" + +#: doc/classes/EditorSpatialGizmoPlugin.xml +msgid "" +"Creates a handle material with its variants (selected and/or editable) and " +"adds them to the internal material list. They can then be accessed with " +"[method get_material] and used in [method EditorSpatialGizmo.add_handles]. " +"Should not be overridden.\n" +"You can optionally provide a texture to use instead of the default icon." +msgstr "" + +#: doc/classes/EditorSpatialGizmoPlugin.xml +msgid "" +"Creates an icon material with its variants (selected and/or editable) and " +"adds them to the internal material list. They can then be accessed with " +"[method get_material] and used in [method EditorSpatialGizmo." +"add_unscaled_billboard]. Should not be overridden." +msgstr "" + +#: doc/classes/EditorSpatialGizmoPlugin.xml +msgid "" +"Creates an unshaded material with its variants (selected and/or editable) " +"and adds them to the internal material list. They can then be accessed with " +"[method get_material] and used in [method EditorSpatialGizmo.add_mesh] and " +"[method EditorSpatialGizmo.add_lines]. Should not be overridden." +msgstr "" + +#: doc/classes/EditorSpatialGizmoPlugin.xml +msgid "" +"Override this method to provide gizmo's handle names. Called for this " +"plugin's active gizmos." +msgstr "" + +#: doc/classes/EditorSpatialGizmoPlugin.xml +msgid "" +"Gets actual value of a handle from gizmo. Called for this plugin's active " +"gizmos." +msgstr "" + +#: doc/classes/EditorSpatialGizmoPlugin.xml +msgid "" +"Gets material from the internal list of materials. If an " +"[EditorSpatialGizmo] is provided, it will try to get the corresponding " +"variant (selected and/or editable)." +msgstr "" + +#: doc/classes/EditorSpatialGizmoPlugin.xml +msgid "" +"Override this method to provide the name that will appear in the gizmo " +"visibility menu." +msgstr "" + +#: doc/classes/EditorSpatialGizmoPlugin.xml +msgid "" +"Override this method to set the gizmo's priority. Higher values correspond " +"to higher priority. If a gizmo with higher priority conflicts with another " +"gizmo, only the gizmo with higher priority will be used.\n" +"All built-in editor gizmos return a priority of [code]-1[/code]. If not " +"overridden, this method will return [code]0[/code], which means custom " +"gizmos will automatically override built-in gizmos." +msgstr "" + +#: doc/classes/EditorSpatialGizmoPlugin.xml +msgid "" +"Override this method to define which Spatial nodes have a gizmo from this " +"plugin. Whenever a [Spatial] node is added to a scene this method is called, " +"if it returns [code]true[/code] the node gets a generic [EditorSpatialGizmo] " +"assigned and is added to this plugin's list of active gizmos." +msgstr "" + +#: doc/classes/EditorSpatialGizmoPlugin.xml +msgid "" +"Gets whether a handle is highlighted or not. Called for this plugin's active " +"gizmos." +msgstr "" + +#: doc/classes/EditorSpatialGizmoPlugin.xml +msgid "" +"Override this method to define whether a Spatial with this gizmo should be " +"selectable even when the gizmo is hidden." +msgstr "" + +#: doc/classes/EditorSpatialGizmoPlugin.xml +msgid "" +"Callback to redraw the provided gizmo. Called for this plugin's active " +"gizmos." +msgstr "" + +#: doc/classes/EditorSpatialGizmoPlugin.xml +msgid "" +"Update the value of a handle after it has been updated. Called for this " +"plugin's active gizmos." +msgstr "" + +#: doc/classes/EditorSpinSlider.xml +msgid "Godot editor's control for editing numeric values." +msgstr "" + +#: doc/classes/EditorSpinSlider.xml +msgid "" +"This [Control] node is used in the editor's Inspector dock to allow editing " +"of numeric values. Can be used with [EditorInspectorPlugin] to recreate the " +"same behavior." +msgstr "" + +#: doc/classes/EditorSpinSlider.xml +msgid "If [code]true[/code], the slider is hidden." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "" +"Version Control System (VCS) interface, which reads and writes to the local " +"VCS in use." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "" +"Defines the API that the editor uses to extract information from the " +"underlying VCS. The implementation of this API is included in VCS plugins, " +"which are scripts that inherit [EditorVCSInterface] and are attached (on " +"demand) to the singleton instance of [EditorVCSInterface]. Instead of " +"performing the task themselves, all the virtual functions listed below are " +"calling the internally overridden functions in the VCS plugins to provide a " +"plug-n-play experience. A custom VCS plugin is supposed to inherit from " +"[EditorVCSInterface] and override these virtual functions." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "Checks out a [code]branch_name[/code] in the VCS." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "" +"Commits the currently staged changes and applies the commit [code]msg[/code] " +"to the resulting commit." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "Creates a new branch named [code]branch_name[/code] in the VCS." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "" +"Creates a new remote destination with name [code]remote_name[/code] and " +"points it to [code]remote_url[/code]. This can be both an HTTPS remote or an " +"SSH remote." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "Discards the changes made in file present at [code]file_path[/code]." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "" +"Fetches new changes from the remote, but doesn't write changes to the " +"current working directory. Equivalent to [code]git fetch[/code]." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "" +"Gets an instance of an [Array] of [String]s containing available branch " +"names in the VCS." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "Gets the current branch name defined in the VCS." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "" +"Returns an [Array] of [Dictionary] items (see [method create_diff_file], " +"[method create_diff_hunk], [method create_diff_line], [method " +"add_line_diffs_into_diff_hunk] and [method add_diff_hunks_into_diff_file]), " +"each containing information about a diff. If [code]identifier[/code] is a " +"file path, returns a file diff, and if it is a commit identifier, then " +"returns a commit diff." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "" +"Returns an [Array] of [Dictionary] items (see [method create_diff_hunk]), " +"each containing a line diff between a file at [code]file_path[/code] and the " +"[code]text[/code] which is passed in." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "" +"Returns an [Array] of [Dictionary] items (see [method create_status_file]), " +"each containing the status data of every modified file in the project folder." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "" +"Returns an [Array] of [Dictionary] items (see [method create_commit]), each " +"containing the data for a past commit." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "" +"Returns an [Array] of [String]s, each containing the name of a remote " +"configured in the VCS." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "Returns the name of the underlying VCS provider." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "" +"Initializes the VCS plugin when called from the editor. Returns whether or " +"not the plugin was successfully initialized. A VCS project is initialized at " +"[code]project_path[/code]." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "Pulls changes from the remote. This can give rise to merge conflicts." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "" +"Pushes changes to the [code]remote[/code]. Optionally, if [code]force[/code] " +"is set to true, a force push will override the change history already " +"present on the remote." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "Remove a branch from the local VCS." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "Remove a remote from the local VCS." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "" +"Set user credentials in the underlying VCS. [code]username[/code] and " +"[code]password[/code] are used only during HTTPS authentication unless not " +"already mentioned in the remote URL. [code]ssh_public_key_path[/code], " +"[code]ssh_private_key_path[/code], and [code]ssh_passphrase[/code] are only " +"used during SSH authentication." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "" +"Shuts down VCS plugin instance. Called when the user either closes the " +"editor or shuts down the VCS plugin through the editor UI." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "Stages the file present at [code]file_path[/code] to the staged area." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "" +"Unstages the file present at [code]file_path[/code] from the staged area to " +"the unstaged area." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "" +"Helper function to add an array of [code]diff_hunks[/code] into a " +"[code]diff_file[/code]." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "" +"Helper function to add an array of [code]line_diffs[/code] into a " +"[code]diff_hunk[/code]." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "" +"Helper function to create a commit [Dictionary] item. [code]msg[/code] is " +"the commit message of the commit. [code]author[/code] is a single human-" +"readable string containing all the author's details, e.g. the email and name " +"configured in the VCS. [code]id[/code] is the identifier of the commit, in " +"whichever format your VCS may provide an identifier to commits. " +"[code]unix_timestamp[/code] is the UTC Unix timestamp of when the commit was " +"created. [code]offset_minutes[/code] is the timezone offset in minutes, " +"recorded from the system timezone where the commit was created." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "" +"Helper function to create a [code]Dictionary[/code] for storing old and new " +"diff file paths." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "" +"Helper function to create a [code]Dictionary[/code] for storing diff hunk " +"data. [code]old_start[/code] is the starting line number in old file. " +"[code]new_start[/code] is the starting line number in new file. " +"[code]old_lines[/code] is the number of lines in the old file. " +"[code]new_lines[/code] is the number of lines in the new file." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "" +"Helper function to create a [code]Dictionary[/code] for storing a line diff. " +"[code]new_line_no[/code] is the line number in the new file (can be " +"[code]-1[/code] if the line is deleted). [code]old_line_no[/code] is the " +"line number in the old file (can be [code]-1[/code] if the line is added). " +"[code]content[/code] is the diff text. [code]status[/code] is a single " +"character string which stores the line origin." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "" +"Helper function to create a [code]Dictionary[/code] used by editor to read " +"the status of a file." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "Pops up an error message in the edior." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "A new file has been added." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "An earlier added file has been modified." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "An earlier added file has been renamed." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "An earlier added file has been deleted." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "An earlier added file has been typechanged." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "A file is left unmerged." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "A commit is encountered from the commit area." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "A file is encountered from the staged area." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml +msgid "A file is encountered from the unstaged area." +msgstr "" + +#: doc/classes/EncodedObjectAsID.xml +msgid "Holds a reference to an [Object]'s instance ID." +msgstr "" + +#: doc/classes/EncodedObjectAsID.xml +msgid "" +"Utility class which holds a reference to the internal identifier of an " +"[Object] instance, as given by [method Object.get_instance_id]. This ID can " +"then be used to retrieve the object instance with [method @GDScript." +"instance_from_id].\n" +"This class is used internally by the editor inspector and script debugger, " +"but can also be used in plugins to pass and display objects as their IDs." +msgstr "" + +#: doc/classes/EncodedObjectAsID.xml +msgid "" +"The [Object] identifier stored in this [EncodedObjectAsID] instance. The " +"object instance can be retrieved with [method @GDScript.instance_from_id]." +msgstr "" + +#: doc/classes/Engine.xml +msgid "Access to engine properties." +msgstr "" + +#: doc/classes/Engine.xml +msgid "" +"The [Engine] singleton allows you to query and modify the project's run-time " +"parameters, such as frames per second, time scale, and others." +msgstr "" + +#: doc/classes/Engine.xml +msgid "" +"Returns engine author information in a Dictionary.\n" +"[code]lead_developers[/code] - Array of Strings, lead developer names\n" +"[code]founders[/code] - Array of Strings, founder names\n" +"[code]project_managers[/code] - Array of Strings, project manager names\n" +"[code]developers[/code] - Array of Strings, developer names" +msgstr "" + +#: doc/classes/Engine.xml +msgid "" +"Returns an Array of copyright information Dictionaries.\n" +"[code]name[/code] - String, component name\n" +"[code]parts[/code] - Array of Dictionaries {[code]files[/code], " +"[code]copyright[/code], [code]license[/code]} describing subsections of the " +"component" +msgstr "" + +#: doc/classes/Engine.xml +msgid "" +"Returns a Dictionary of Arrays of donor names.\n" +"{[code]platinum_sponsors[/code], [code]gold_sponsors[/code], " +"[code]silver_sponsors[/code], [code]bronze_sponsors[/code], " +"[code]mini_sponsors[/code], [code]gold_donors[/code], [code]silver_donors[/" +"code], [code]bronze_donors[/code]}" +msgstr "" + +#: doc/classes/Engine.xml +msgid "" +"Returns the total number of frames drawn. On headless platforms, or if the " +"render loop is disabled with [code]--disable-render-loop[/code] via command " +"line, [method get_frames_drawn] always returns [code]0[/code]. See [method " +"get_idle_frames]." +msgstr "" + +#: doc/classes/Engine.xml +msgid "Returns the frames per second of the running game." +msgstr "" + +#: doc/classes/Engine.xml +msgid "" +"Returns the total number of frames passed since engine initialization which " +"is advanced on each [b]idle frame[/b], regardless of whether the render loop " +"is enabled. See also [method get_frames_drawn] and [method " +"get_physics_frames].\n" +"[method get_idle_frames] can be used to run expensive logic less often " +"without relying on a [Timer]:\n" +"[codeblock]\n" +"func _process(_delta):\n" +" if Engine.get_idle_frames() % 2 == 0:\n" +" pass # Run expensive logic only once every 2 idle (render) frames " +"here.\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Engine.xml +msgid "" +"Returns Dictionary of licenses used by Godot and included third party " +"components." +msgstr "" + +#: doc/classes/Engine.xml +msgid "Returns Godot license text." +msgstr "" + +#: doc/classes/Engine.xml +msgid "Returns the main loop object (see [MainLoop] and [SceneTree])." +msgstr "" + +#: doc/classes/Engine.xml +msgid "" +"Returns the total number of frames passed since engine initialization which " +"is advanced on each [b]physics frame[/b]. See also [method " +"get_idle_frames].\n" +"[method get_physics_frames] can be used to run expensive logic less often " +"without relying on a [Timer]:\n" +"[codeblock]\n" +"func _physics_process(_delta):\n" +" if Engine.get_physics_frames() % 2 == 0:\n" +" pass # Run expensive logic only once every 2 physics frames here.\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Engine.xml +msgid "" +"Returns the fraction through the current physics tick we are at the time of " +"rendering the frame. This can be used to implement fixed timestep " +"interpolation." +msgstr "" + +#: doc/classes/Engine.xml +msgid "" +"Returns a global singleton with given [code]name[/code]. Often used for " +"plugins, e.g. [code]GodotPayment[/code] on Android." +msgstr "" + +#: doc/classes/Engine.xml +msgid "" +"Returns the current engine version information in a Dictionary.\n" +"[code]major[/code] - Holds the major version number as an int\n" +"[code]minor[/code] - Holds the minor version number as an int\n" +"[code]patch[/code] - Holds the patch version number as an int\n" +"[code]hex[/code] - Holds the full version number encoded as a " +"hexadecimal int with one byte (2 places) per number (see example below)\n" +"[code]status[/code] - Holds the status (e.g. \"beta\", \"rc1\", " +"\"rc2\", ... \"stable\") as a String\n" +"[code]build[/code] - Holds the build name (e.g. \"custom_build\") as a " +"String\n" +"[code]hash[/code] - Holds the full Git commit hash as a String\n" +"[code]year[/code] - Holds the year the version was released in as an " +"int\n" +"[code]string[/code] - [code]major[/code] + [code]minor[/code] + " +"[code]patch[/code] + [code]status[/code] + [code]build[/code] in a single " +"String\n" +"The [code]hex[/code] value is encoded as follows, from left to right: one " +"byte for the major, one byte for the minor, one byte for the patch version. " +"For example, \"3.1.12\" would be [code]0x03010C[/code]. [b]Note:[/b] It's " +"still an int internally, and printing it will give you its decimal " +"representation, which is not particularly meaningful. Use hexadecimal " +"literals for easy version comparisons from code:\n" +"[codeblock]\n" +"if Engine.get_version_info().hex >= 0x030200:\n" +" # Do things specific to version 3.2 or later\n" +"else:\n" +" # Do things specific to versions before 3.2\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Engine.xml +msgid "" +"Returns [code]true[/code] if a singleton with given [code]name[/code] exists " +"in global scope." +msgstr "" + +#: doc/classes/Engine.xml +msgid "" +"Returns [code]true[/code] if the game is inside the fixed process and " +"physics phase of the game loop." +msgstr "" + +#: doc/classes/Engine.xml +msgid "" +"If [code]true[/code], the script is currently running inside the editor. " +"This is useful for [code]tool[/code] scripts to conditionally draw editor " +"helpers, or prevent accidentally running \"game\" code that would affect the " +"scene state while in the editor:\n" +"[codeblock]\n" +"if Engine.editor_hint:\n" +" draw_gizmos()\n" +"else:\n" +" simulate_physics()\n" +"[/codeblock]\n" +"See [url=$DOCS_URL/tutorials/plugins/running_code_in_the_editor.html]Running " +"code in the editor[/url] in the documentation for more information.\n" +"[b]Note:[/b] To detect whether the script is run from an editor [i]build[/i] " +"(e.g. when pressing [code]F5[/code]), use [method OS.has_feature] with the " +"[code]\"editor\"[/code] argument instead. [code]OS.has_feature(\"editor\")[/" +"code] will evaluate to [code]true[/code] both when the code is running in " +"the editor and when running the project from the editor, but it will " +"evaluate to [code]false[/code] when the code is run from an exported project." +msgstr "" + +#: doc/classes/Engine.xml +msgid "" +"The number of fixed iterations per second. This controls how often physics " +"simulation and [method Node._physics_process] methods are run. This value " +"should generally always be set to [code]60[/code] or above, as Godot doesn't " +"interpolate the physics step. As a result, values lower than [code]60[/code] " +"will look stuttery. This value can be increased to make input more reactive " +"or work around collision tunneling issues, but keep in mind doing so will " +"increase CPU usage. See also [member target_fps] and [member ProjectSettings." +"physics/common/physics_fps].\n" +"[b]Note:[/b] Only 8 physics ticks may be simulated per rendered frame at " +"most. If more than 8 physics ticks have to be simulated per rendered frame " +"to keep up with rendering, the game will appear to slow down (even if " +"[code]delta[/code] is used consistently in physics calculations). Therefore, " +"it is recommended not to increase [member Engine.iterations_per_second] " +"above 240. Otherwise, the game will slow down when the rendering framerate " +"goes below 30 FPS." +msgstr "" + +#: doc/classes/Engine.xml +msgid "" +"Controls how much physics ticks are synchronized with real time. For 0 or " +"less, the ticks are synchronized. Such values are recommended for network " +"games, where clock synchronization matters. Higher values cause higher " +"deviation of the in-game clock and real clock but smooth out framerate " +"jitters. The default value of 0.5 should be fine for most; values above 2 " +"could cause the game to react to dropped frames with a noticeable delay and " +"are not recommended.\n" +"[b]Note:[/b] For best results, when using a custom physics interpolation " +"solution, the physics jitter fix should be disabled by setting [member " +"physics_jitter_fix] to [code]0[/code]." +msgstr "" + +#: doc/classes/Engine.xml +msgid "" +"If [code]false[/code], stops printing error and warning messages to the " +"console and editor Output log. This can be used to hide error and warning " +"messages during unit test suite runs. This property is equivalent to the " +"[member ProjectSettings.application/run/disable_stderr] project setting.\n" +"[b]Warning:[/b] If you set this to [code]false[/code] anywhere in the " +"project, important error messages may be hidden even if they are emitted " +"from other scripts. If this is set to [code]false[/code] in a [code]tool[/" +"code] script, this will also impact the editor itself. Do [i]not[/i] report " +"bugs before ensuring error messages are enabled (as they are by default).\n" +"[b]Note:[/b] This property does not impact the editor's Errors tab when " +"running a project from the editor." +msgstr "" + +#: doc/classes/Engine.xml +msgid "" +"The desired frames per second. If the hardware cannot keep up, this setting " +"may not be respected. A value of 0 means no limit." +msgstr "" + +#: doc/classes/Engine.xml +msgid "" +"Controls how fast or slow the in-game clock ticks versus the real life one. " +"It defaults to 1.0. A value of 2.0 means the game moves twice as fast as " +"real life, whilst a value of 0.5 means the game moves at half the regular " +"speed." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"Resource for environment nodes (like [WorldEnvironment]) that define " +"multiple rendering options." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"Resource for environment nodes (like [WorldEnvironment]) that define " +"multiple environment operations (such as background [Sky] or [Color], " +"ambient light, fog, depth-of-field...). These parameters affect the final " +"render of the scene. The order of these operations is:\n" +"- Depth of Field Blur\n" +"- Glow\n" +"- Tonemap (Auto Exposure)\n" +"- Adjustments\n" +"If the target [Viewport] is set to \"2D Without Sampling\", all post-" +"processing effects will be unavailable. With \"3D Without Effects\", the " +"following options will be unavailable:\n" +"- Ssao\n" +"- Ss Reflections\n" +"This can be configured for the root Viewport with [member ProjectSettings." +"rendering/quality/intended_usage/framebuffer_allocation], or for specific " +"Viewports via the [member Viewport.usage] property.\n" +"Note that [member ProjectSettings.rendering/quality/intended_usage/" +"framebuffer_allocation] has a mobile platform override to use \"3D Without " +"Effects\" by default. It improves the performance on mobile devices, but at " +"the same time affects the screen display on mobile devices." +msgstr "" + +#: doc/classes/Environment.xml doc/classes/WorldEnvironment.xml +msgid "Environment and post-processing" +msgstr "" + +#: doc/classes/Environment.xml +msgid "Light transport in game engines" +msgstr "" + +#: doc/classes/Environment.xml doc/classes/Material.xml doc/classes/Mesh.xml +#: doc/classes/MeshInstance.xml doc/classes/WorldEnvironment.xml +msgid "3D Material Testers Demo" +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"Returns [code]true[/code] if the glow level [code]idx[/code] is specified, " +"[code]false[/code] otherwise." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"Enables or disables the glow level at index [code]idx[/code]. Each level " +"relies on the previous level. This means that enabling higher glow levels " +"will slow down the glow effect rendering, even if previous levels aren't " +"enabled." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The global brightness value of the rendered scene. Effective only if " +"[code]adjustment_enabled[/code] is [code]true[/code]." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"Applies the provided [Texture] resource to affect the global color aspect of " +"the rendered scene. Effective only if [code]adjustment_enabled[/code] is " +"[code]true[/code]." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The global contrast value of the rendered scene (default value is 1). " +"Effective only if [code]adjustment_enabled[/code] is [code]true[/code]." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"If [code]true[/code], enables the [code]adjustment_*[/code] properties " +"provided by this resource. If [code]false[/code], modifications to the " +"[code]adjustment_*[/code] properties will have no effect on the rendered " +"scene." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The global color saturation value of the rendered scene (default value is " +"1). Effective only if [code]adjustment_enabled[/code] is [code]true[/code]." +msgstr "" + +#: doc/classes/Environment.xml +msgid "The ambient light's [Color]." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The ambient light's energy. The higher the value, the stronger the light." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"Defines the amount of light that the sky brings on the scene. A value of " +"[code]0.0[/code] means that the sky's light emission has no effect on the " +"scene illumination, thus all ambient illumination is provided by the ambient " +"light. On the contrary, a value of [code]1.0[/code] means that [i]all[/i] " +"the light that affects the scene is provided by the sky, thus the ambient " +"light parameter has no effect on the scene.\n" +"[b]Note:[/b] [member ambient_light_sky_contribution] is internally clamped " +"between [code]0.0[/code] and [code]1.0[/code] (inclusive)." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"If [code]true[/code], enables the tonemapping auto exposure mode of the " +"scene renderer. If [code]true[/code], the renderer will automatically " +"determine the exposure setting to adapt to the scene's illumination and the " +"observed light." +msgstr "" + +#: doc/classes/Environment.xml +msgid "The maximum luminance value for the auto exposure." +msgstr "" + +#: doc/classes/Environment.xml +msgid "The minimum luminance value for the auto exposure." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The scale of the auto exposure effect. Affects the intensity of auto " +"exposure." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The speed of the auto exposure effect. Affects the time needed for the " +"camera to perform auto exposure." +msgstr "" + +#: doc/classes/Environment.xml +msgid "The ID of the camera feed to show in the background." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The maximum layer ID to display. Only effective when using the [constant " +"BG_CANVAS] background mode." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The [Color] displayed for clear areas of the scene. Only effective when " +"using the [constant BG_COLOR] or [constant BG_COLOR_SKY] background modes)." +msgstr "" + +#: doc/classes/Environment.xml +msgid "The power of the light emitted by the background." +msgstr "" + +#: doc/classes/Environment.xml +msgid "The background mode. See [enum BGMode] for possible values." +msgstr "" + +#: doc/classes/Environment.xml +msgid "The [Sky] resource defined as background." +msgstr "" + +#: doc/classes/Environment.xml +msgid "The [Sky] resource's custom field of view." +msgstr "" + +#: doc/classes/Environment.xml +msgid "The [Sky] resource's rotation expressed as a [Basis]." +msgstr "" + +#: doc/classes/Environment.xml +msgid "The [Sky] resource's rotation expressed as Euler angles in radians." +msgstr "" + +#: doc/classes/Environment.xml +msgid "The [Sky] resource's rotation expressed as Euler angles in degrees." +msgstr "" + +#: doc/classes/Environment.xml +msgid "The amount of far blur for the depth-of-field effect." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The distance from the camera where the far blur effect affects the rendering." +msgstr "" + +#: doc/classes/Environment.xml +msgid "If [code]true[/code], enables the depth-of-field far blur effect." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The depth-of-field far blur's quality. Higher values can mitigate the " +"visible banding effect seen at higher strengths, but are much slower." +msgstr "" + +#: doc/classes/Environment.xml +msgid "The length of the transition between the no-blur area and far blur." +msgstr "" + +#: doc/classes/Environment.xml +msgid "The amount of near blur for the depth-of-field effect." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"Distance from the camera where the near blur effect affects the rendering." +msgstr "" + +#: doc/classes/Environment.xml +msgid "If [code]true[/code], enables the depth-of-field near blur effect." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The depth-of-field near blur's quality. Higher values can mitigate the " +"visible banding effect seen at higher strengths, but are much slower." +msgstr "" + +#: doc/classes/Environment.xml +msgid "The length of the transition between the near blur and no-blur area." +msgstr "" + +#: doc/classes/Environment.xml +msgid "The fog's [Color]." +msgstr "" + +#: doc/classes/Environment.xml +msgid "The fog's depth starting distance from the camera." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The fog depth's intensity curve. A number of presets are available in the " +"[b]Inspector[/b] by right-clicking the curve." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"If [code]true[/code], the depth fog effect is enabled. When enabled, fog " +"will appear in the distance (relative to the camera)." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The fog's depth end distance from the camera. If this value is set to 0, it " +"will be equal to the current camera's [member Camera.far] value." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"If [code]true[/code], fog effects are enabled. [member fog_height_enabled] " +"and/or [member fog_depth_enabled] must be set to [code]true[/code] to " +"actually display fog." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The height fog's intensity. A number of presets are available in the " +"[b]Inspector[/b] by right-clicking the curve." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"If [code]true[/code], the height fog effect is enabled. When enabled, fog " +"will appear in a defined height range, regardless of the distance from the " +"camera. This can be used to simulate \"deep water\" effects with a lower " +"performance cost compared to a dedicated shader." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The Y coordinate where the height fog will be the most intense. If this " +"value is greater than [member fog_height_min], fog will be displayed from " +"bottom to top. Otherwise, it will be displayed from top to bottom." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The Y coordinate where the height fog will be the least intense. If this " +"value is greater than [member fog_height_max], fog will be displayed from " +"top to bottom. Otherwise, it will be displayed from bottom to top." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The intensity of the depth fog color transition when looking towards the " +"sun. The sun's direction is determined automatically using the " +"DirectionalLight node in the scene." +msgstr "" + +#: doc/classes/Environment.xml +msgid "The depth fog's [Color] when looking towards the sun." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The intensity of the fog light transmittance effect. Amount of light that " +"the fog transmits." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"Enables fog's light transmission effect. If [code]true[/code], light will be " +"more visible in the fog to simulate light scattering as in real life." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"Smooths out the blockiness created by sampling higher levels, at the cost of " +"performance.\n" +"[b]Note:[/b] When using the GLES2 renderer, this is only available if the " +"GPU supports the [code]GL_EXT_gpu_shader4[/code] extension." +msgstr "" + +#: doc/classes/Environment.xml +msgid "The glow blending mode." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The bloom's intensity. If set to a value higher than [code]0[/code], this " +"will make glow visible in areas darker than the [member glow_hdr_threshold]." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"If [code]true[/code], the glow effect is enabled.\n" +"[b]Note:[/b] Only effective if [member ProjectSettings.rendering/quality/" +"intended_usage/framebuffer_allocation] is [b]3D[/b] ([i]not[/i] [b]3D " +"Without Effects[/b]). On mobile, [member ProjectSettings.rendering/quality/" +"intended_usage/framebuffer_allocation] defaults to [b]3D Without Effects[/b] " +"by default, so its [code].mobile[/code] override needs to be changed to " +"[b]3D[/b].\n" +"[b]Note:[/b] When using GLES3 on mobile, HDR rendering is disabled by " +"default for performance reasons. This means glow will only be visible if " +"[member glow_hdr_threshold] is decreased below [code]1.0[/code] or if " +"[member glow_bloom] is increased above [code]0.0[/code]. Also consider " +"increasing [member glow_intensity] to [code]1.5[/code]. If you want glow to " +"behave on mobile like it does on desktop (at a performance cost), enable " +"[member ProjectSettings.rendering/quality/depth/hdr]'s [code].mobile[/code] " +"override." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The higher threshold of the HDR glow. Areas brighter than this threshold " +"will be clamped for the purposes of the glow effect." +msgstr "" + +#: doc/classes/Environment.xml +msgid "The bleed scale of the HDR glow." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The lower threshold of the HDR glow. When using the GLES2 renderer (which " +"doesn't support HDR), this needs to be below [code]1.0[/code] for glow to be " +"visible. A value of [code]0.9[/code] works well in this case." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"Takes more samples during downsample pass of glow. This ensures that single " +"pixels are captured by glow which makes the glow look smoother and more " +"stable during movement. However, it is very expensive and makes the glow " +"post process take twice as long." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The glow intensity. When using the GLES2 renderer, this should be increased " +"to 1.5 to compensate for the lack of HDR rendering." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"If [code]true[/code], the 1st level of glow is enabled. This is the most " +"\"local\" level (least blurry)." +msgstr "" + +#: doc/classes/Environment.xml +msgid "If [code]true[/code], the 2th level of glow is enabled." +msgstr "" + +#: doc/classes/Environment.xml +msgid "If [code]true[/code], the 3th level of glow is enabled." +msgstr "" + +#: doc/classes/Environment.xml +msgid "If [code]true[/code], the 4th level of glow is enabled." +msgstr "" + +#: doc/classes/Environment.xml +msgid "If [code]true[/code], the 5th level of glow is enabled." +msgstr "" + +#: doc/classes/Environment.xml +msgid "If [code]true[/code], the 6th level of glow is enabled." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"If [code]true[/code], the 7th level of glow is enabled. This is the most " +"\"global\" level (blurriest)." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The glow strength. When using the GLES2 renderer, this should be increased " +"to 1.3 to compensate for the lack of HDR rendering." +msgstr "" + +#: doc/classes/Environment.xml +msgid "The depth tolerance for screen-space reflections." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"If [code]true[/code], screen-space reflections are enabled. Screen-space " +"reflections are more accurate than reflections from [GIProbe]s or " +"[ReflectionProbe]s, but are slower and can't reflect surfaces occluded by " +"others." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The fade-in distance for screen-space reflections. Affects the area from the " +"reflected material to the screen-space reflection)." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The fade-out distance for screen-space reflections. Affects the area from " +"the screen-space reflection to the \"global\" reflection." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The maximum number of steps for screen-space reflections. Higher values are " +"slower." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"If [code]true[/code], screen-space reflections will take the material " +"roughness into account." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The screen-space ambient occlusion intensity on materials that have an AO " +"texture defined. Values higher than [code]0[/code] will make the SSAO effect " +"visible in areas darkened by AO textures." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The screen-space ambient occlusion bias. This should be kept high enough to " +"prevent \"smooth\" curves from being affected by ambient occlusion." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The screen-space ambient occlusion blur quality. See [enum SSAOBlur] for " +"possible values." +msgstr "" + +#: doc/classes/Environment.xml +msgid "The screen-space ambient occlusion color." +msgstr "" + +#: doc/classes/Environment.xml +msgid "The screen-space ambient occlusion edge sharpness." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"If [code]true[/code], the screen-space ambient occlusion effect is enabled. " +"This darkens objects' corners and cavities to simulate ambient light not " +"reaching the entire object as in real life. This works well for small, " +"dynamic objects, but baked lighting or ambient occlusion textures will do a " +"better job at displaying ambient occlusion on large static objects. This is " +"a costly effect and should be disabled first when running into performance " +"issues." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The primary screen-space ambient occlusion intensity. See also [member " +"ssao_radius]." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The secondary screen-space ambient occlusion intensity. See also [member " +"ssao_radius2]." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The screen-space ambient occlusion intensity in direct light. In real life, " +"ambient occlusion only applies to indirect light, which means its effects " +"can't be seen in direct light. Values higher than [code]0[/code] will make " +"the SSAO effect visible in direct light." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The screen-space ambient occlusion quality. Higher qualities will make " +"better use of small objects for ambient occlusion, but are slower." +msgstr "" + +#: doc/classes/Environment.xml +msgid "The primary screen-space ambient occlusion radius." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The secondary screen-space ambient occlusion radius. If set to a value " +"higher than [code]0[/code], enables the secondary screen-space ambient " +"occlusion effect which can be used to improve the effect's appearance (at " +"the cost of performance)." +msgstr "" + +#: doc/classes/Environment.xml +msgid "The default exposure used for tonemapping." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The tonemapping mode to use. Tonemapping is the process that \"converts\" " +"HDR values to be suitable for rendering on a SDR display. (Godot doesn't " +"support rendering on HDR displays yet.)" +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"The white reference value for tonemapping. Only effective if the [member " +"tonemap_mode] isn't set to [constant TONE_MAPPER_LINEAR]." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"Keeps on screen every pixel drawn in the background. Only select this mode " +"if you really need to keep the old data. On modern GPUs it will generally " +"not be faster than clearing the background, and can be significantly slower, " +"particularly on mobile.\n" +"It can only be safely used in fully-interior scenes (no visible sky or sky " +"reflections). If enabled in a scene where the background is visible, \"ghost " +"trail\" artifacts will be visible when moving the camera." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"Clears the background using the clear color defined in [member " +"ProjectSettings.rendering/environment/default_clear_color]." +msgstr "" + +#: doc/classes/Environment.xml +msgid "Clears the background using a custom clear color." +msgstr "" + +#: doc/classes/Environment.xml +msgid "Displays a user-defined sky in the background." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"Clears the background using a custom clear color and allows defining a sky " +"for shading and reflection. This mode is slightly faster than [constant " +"BG_SKY] and should be preferred in scenes where reflections can be visible, " +"but the sky itself never is (e.g. top-down camera)." +msgstr "" + +#: doc/classes/Environment.xml +msgid "Displays a [CanvasLayer] in the background." +msgstr "" + +#: doc/classes/Environment.xml +msgid "Displays a camera feed in the background." +msgstr "" + +#: doc/classes/Environment.xml +msgid "Represents the size of the [enum BGMode] enum." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"Additive glow blending mode. Mostly used for particles, glows (bloom), lens " +"flare, bright sources." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"Screen glow blending mode. Increases brightness, used frequently with bloom." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"Soft light glow blending mode. Modifies contrast, exposes shadows and " +"highlights (vivid bloom)." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"Replace glow blending mode. Replaces all pixels' color by the glow value. " +"This can be used to simulate a full-screen blur effect by tweaking the glow " +"parameters to match the original image's brightness." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"Linear tonemapper operator. Reads the linear data and passes it on " +"unmodified. This can cause bright lighting to look blown out, with " +"noticeable clipping in the output colors." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"Reinhardt tonemapper operator. Performs a variation on rendered pixels' " +"colors by this formula: [code]color = color / (1 + color)[/code]. This " +"avoids clipping bright highlights, but the resulting image can look a bit " +"dull." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"Filmic tonemapper operator. This avoids clipping bright highlights, with a " +"resulting image that usually looks more vivid than [constant " +"TONE_MAPPER_REINHARDT]." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"Use the legacy Godot version of the Academy Color Encoding System " +"tonemapper. Unlike [constant TONE_MAPPER_ACES_FITTED], this version of ACES " +"does not handle bright lighting in a physically accurate way. ACES typically " +"has a more contrasted output compared to [constant TONE_MAPPER_REINHARDT] " +"and [constant TONE_MAPPER_FILMIC].\n" +"[b]Note:[/b] This tonemapping operator will be removed in Godot 4.0 in favor " +"of the more accurate [constant TONE_MAPPER_ACES_FITTED]." +msgstr "" + +#: doc/classes/Environment.xml +msgid "" +"Use the Academy Color Encoding System tonemapper. ACES is slightly more " +"expensive than other options, but it handles bright lighting in a more " +"realistic fashion by desaturating it as it becomes brighter. ACES typically " +"has a more contrasted output compared to [constant TONE_MAPPER_REINHARDT] " +"and [constant TONE_MAPPER_FILMIC]." +msgstr "" + +#: doc/classes/Environment.xml +msgid "Low depth-of-field blur quality (fastest)." +msgstr "" + +#: doc/classes/Environment.xml +msgid "Medium depth-of-field blur quality." +msgstr "" + +#: doc/classes/Environment.xml +msgid "High depth-of-field blur quality (slowest)." +msgstr "" + +#: doc/classes/Environment.xml +msgid "No blur for the screen-space ambient occlusion effect (fastest)." +msgstr "" + +#: doc/classes/Environment.xml +msgid "1×1 blur for the screen-space ambient occlusion effect." +msgstr "" + +#: doc/classes/Environment.xml +msgid "2×2 blur for the screen-space ambient occlusion effect." +msgstr "" + +#: doc/classes/Environment.xml +msgid "3×3 blur for the screen-space ambient occlusion effect (slowest)." +msgstr "" + +#: doc/classes/Environment.xml +msgid "Low quality for the screen-space ambient occlusion effect (fastest)." +msgstr "" + +#: doc/classes/Environment.xml +msgid "Medium quality for the screen-space ambient occlusion effect." +msgstr "" + +#: doc/classes/Environment.xml +msgid "High quality for the screen-space ambient occlusion effect (slowest)." +msgstr "" + +#: doc/classes/Expression.xml +msgid "A class that stores an expression you can execute." +msgstr "" + +#: doc/classes/Expression.xml +msgid "" +"An expression can be made of any arithmetic operation, built-in math " +"function call, method call of a passed instance, or built-in type " +"construction call.\n" +"An example expression text using the built-in math functions could be " +"[code]sqrt(pow(3,2) + pow(4,2))[/code].\n" +"In the following example we use a [LineEdit] node to write our expression " +"and show the result.\n" +"[codeblock]\n" +"onready var expression = Expression.new()\n" +"\n" +"func _ready():\n" +" $LineEdit.connect(\"text_entered\", self, \"_on_text_entered\")\n" +"\n" +"func _on_text_entered(command):\n" +" var error = expression.parse(command, [])\n" +" if error != OK:\n" +" print(expression.get_error_text())\n" +" return\n" +" var result = expression.execute([], null, true)\n" +" if not expression.has_execute_failed():\n" +" $LineEdit.text = str(result)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Expression.xml +msgid "" +"Executes the expression that was previously parsed by [method parse] and " +"returns the result. Before you use the returned object, you should check if " +"the method failed by calling [method has_execute_failed].\n" +"If you defined input variables in [method parse], you can specify their " +"values in the inputs array, in the same order." +msgstr "" + +#: doc/classes/Expression.xml +msgid "Returns the error text if [method parse] has failed." +msgstr "" + +#: doc/classes/Expression.xml +msgid "Returns [code]true[/code] if [method execute] has failed." +msgstr "" + +#: doc/classes/Expression.xml +msgid "" +"Parses the expression and returns an [enum Error] code.\n" +"You can optionally specify names of variables that may appear in the " +"expression with [code]input_names[/code], so that you can bind them when it " +"gets executed." +msgstr "" + +#: doc/classes/ExternalTexture.xml +msgid "Enable OpenGL ES external texture extension." +msgstr "" + +#: doc/classes/ExternalTexture.xml +msgid "" +"Enable support for the OpenGL ES external texture extension as defined by " +"[url=https://www.khronos.org/registry/OpenGL/extensions/OES/" +"OES_EGL_image_external.txt]OES_EGL_image_external[/url].\n" +"[b]Note:[/b] This is only supported for Android platforms." +msgstr "" + +#: doc/classes/ExternalTexture.xml +msgid "Returns the external texture name." +msgstr "" + +#: doc/classes/ExternalTexture.xml +msgid "External texture size." +msgstr "" + +#: doc/classes/File.xml +msgid "Type to handle file reading and writing operations." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"File type. This is used to permanently store data into the user device's " +"file system and to read from it. This can be used to store game save data or " +"player configuration files, for example.\n" +"Here's a sample on how to write and read from a file:\n" +"[codeblock]\n" +"func save(content):\n" +" var file = File.new()\n" +" file.open(\"user://save_game.dat\", File.WRITE)\n" +" file.store_string(content)\n" +" file.close()\n" +"\n" +"func load():\n" +" var file = File.new()\n" +" file.open(\"user://save_game.dat\", File.READ)\n" +" var content = file.get_as_text()\n" +" file.close()\n" +" return content\n" +"[/codeblock]\n" +"In the example above, the file will be saved in the user data folder as " +"specified in the [url=$DOCS_URL/tutorials/io/data_paths.html]Data paths[/" +"url] documentation.\n" +"[b]Note:[/b] To access project resources once exported, it is recommended to " +"use [ResourceLoader] instead of the [File] API, as some files are converted " +"to engine-specific formats and their original source files might not be " +"present in the exported PCK package.\n" +"[b]Note:[/b] Files are automatically closed only if the process exits " +"\"normally\" (such as by clicking the window manager's close button or " +"pressing [b]Alt + F4[/b]). If you stop the project execution by pressing " +"[b]F8[/b] while the project is running, the file won't be closed as the game " +"process will be killed. You can work around this by calling [method flush] " +"at regular intervals." +msgstr "" + +#: doc/classes/File.xml +msgid "File system" +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Closes the currently opened file and prevents subsequent read/write " +"operations. Use [method flush] to persist the data to disk without closing " +"the file." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Returns [code]true[/code] if the file cursor has already read past the end " +"of the file.\n" +"[b]Note:[/b] [code]eof_reached() == false[/code] cannot be used to check " +"whether there is more data available. To loop while there is more data " +"available, use:\n" +"[codeblock]\n" +"while file.get_position() < file.get_len():\n" +" # Read data\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Returns [code]true[/code] if the file exists in the given path.\n" +"[b]Note:[/b] Many resources types are imported (e.g. textures or sound " +"files), and their source asset will not be included in the exported game, as " +"only the imported version is used. See [method ResourceLoader.exists] for an " +"alternative approach that takes resource remapping into account." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Writes the file's buffer to disk. Flushing is automatically performed when " +"the file is closed. This means you don't need to call [method flush] " +"manually before closing a file using [method close]. Still, calling [method " +"flush] can be used to ensure the data is safe even if the project crashes " +"instead of being closed gracefully.\n" +"[b]Note:[/b] Only call [method flush] when you actually need it. Otherwise, " +"it will decrease performance due to constant disk writes." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Returns the next 16 bits from the file as an integer. See [method store_16] " +"for details on what values can be stored and retrieved this way." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Returns the next 32 bits from the file as an integer. See [method store_32] " +"for details on what values can be stored and retrieved this way." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Returns the next 64 bits from the file as an integer. See [method store_64] " +"for details on what values can be stored and retrieved this way." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Returns the next 8 bits from the file as an integer. See [method store_8] " +"for details on what values can be stored and retrieved this way." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." +msgstr "" + +#: doc/classes/File.xml +msgid "Returns next [code]len[/code] bytes of the file as a [PoolByteArray]." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Returns the next value of the file in CSV (Comma-Separated Values) format. " +"You can pass a different delimiter [code]delim[/code] to use other than the " +"default [code]\",\"[/code] (comma). This delimiter must be one-character " +"long, and cannot be a double quotation mark.\n" +"Text is interpreted as being UTF-8 encoded. Text values must be enclosed in " +"double quotes if they include the delimiter character. Double quotes within " +"a text value can be escaped by doubling their occurrence.\n" +"For example, the following CSV lines are valid and will be properly parsed " +"as two strings each:\n" +"[codeblock]\n" +"Alice,\"Hello, Bob!\"\n" +"Bob,Alice! What a surprise!\n" +"Alice,\"I thought you'd reply with \"\"Hello, world\"\".\"\n" +"[/codeblock]\n" +"Note how the second line can omit the enclosing quotes as it does not " +"include the delimiter. However it [i]could[/i] very well use quotes, it was " +"only written without for demonstration purposes. The third line must use " +"[code]\"\"[/code] for each quotation mark that needs to be interpreted as " +"such instead of the end of a text value." +msgstr "" + +#: doc/classes/File.xml +msgid "Returns the next 64 bits from the file as a floating-point number." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Returns the last error that happened when trying to perform operations. " +"Compare with the [code]ERR_FILE_*[/code] constants from [enum Error]." +msgstr "" + +#: doc/classes/File.xml +msgid "Returns the next 32 bits from the file as a floating-point number." +msgstr "" + +#: doc/classes/File.xml +msgid "Returns the size of the file in bytes." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Returns the next line of the file as a [String].\n" +"Text is interpreted as being UTF-8 encoded." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Returns an MD5 String representing the file at the given path or an empty " +"[String] on failure." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Returns the last time the [code]file[/code] was modified in unix timestamp " +"format or returns a [String] \"ERROR IN [code]file[/code]\". This unix " +"timestamp can be converted to datetime by using [method OS." +"get_datetime_from_unix_time]." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Returns a [String] saved in Pascal format from the file.\n" +"Text is interpreted as being UTF-8 encoded." +msgstr "" + +#: doc/classes/File.xml +msgid "Returns the path as a [String] for the current open file." +msgstr "" + +#: doc/classes/File.xml +msgid "Returns the absolute path as a [String] for the current open file." +msgstr "" + +#: doc/classes/File.xml +msgid "Returns the file cursor's position." +msgstr "" + +#: doc/classes/File.xml +msgid "Returns the next bits from the file as a floating-point number." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Returns a SHA-256 [String] representing the file at the given path or an " +"empty [String] on failure." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Returns the next [Variant] value from the file. If [code]allow_objects[/" +"code] is [code]true[/code], decoding objects is allowed.\n" +"[b]Warning:[/b] Deserialized objects can contain code which gets executed. " +"Do not use this option if the serialized object comes from untrusted sources " +"to avoid potential security threats such as remote code execution." +msgstr "" + +#: doc/classes/File.xml +msgid "Returns [code]true[/code] if the file is currently opened." +msgstr "" + +#: doc/classes/File.xml +msgid "Opens the file for writing or reading, depending on the flags." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Opens a compressed file for reading or writing.\n" +"[b]Note:[/b] [method open_compressed] can only read files that were saved by " +"Godot, not third-party compression formats. See [url=https://github.com/" +"godotengine/godot/issues/28999]GitHub issue #28999[/url] for a workaround." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Opens an encrypted file in write or read mode. You need to pass a binary key " +"to encrypt/decrypt it.\n" +"[b]Note:[/b] The provided key must be 32 bytes long." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Opens an encrypted file in write or read mode. You need to pass a password " +"to encrypt/decrypt it." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Changes the file reading/writing cursor to the specified position (in bytes " +"from the beginning of the file)." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Changes the file reading/writing cursor to the specified position (in bytes " +"from the end of the file).\n" +"[b]Note:[/b] This is an offset, so you should use negative numbers or the " +"cursor will be at the end of the file." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Stores an integer as 16 bits in the file.\n" +"[b]Note:[/b] The [code]value[/code] should lie in the interval [code][0, " +"2^16 - 1][/code]. Any other value will overflow and wrap around.\n" +"To store a signed integer, use [method store_64] or store a signed integer " +"from the interval [code][-2^15, 2^15 - 1][/code] (i.e. keeping one bit for " +"the signedness) and compute its sign manually when reading. For example:\n" +"[codeblock]\n" +"const MAX_15B = 1 << 15\n" +"const MAX_16B = 1 << 16\n" +"\n" +"func unsigned16_to_signed(unsigned):\n" +" return (unsigned + MAX_15B) % MAX_16B - MAX_15B\n" +"\n" +"func _ready():\n" +" var f = File.new()\n" +" f.open(\"user://file.dat\", File.WRITE_READ)\n" +" f.store_16(-42) # This wraps around and stores 65494 (2^16 - 42).\n" +" f.store_16(121) # In bounds, will store 121.\n" +" f.seek(0) # Go back to start to read the stored value.\n" +" var read1 = f.get_16() # 65494\n" +" var read2 = f.get_16() # 121\n" +" var converted1 = unsigned16_to_signed(read1) # -42\n" +" var converted2 = unsigned16_to_signed(read2) # 121\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Stores an integer as 32 bits in the file.\n" +"[b]Note:[/b] The [code]value[/code] should lie in the interval [code][0, " +"2^32 - 1][/code]. Any other value will overflow and wrap around.\n" +"To store a signed integer, use [method store_64], or convert it manually " +"(see [method store_16] for an example)." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Stores an integer as 64 bits in the file.\n" +"[b]Note:[/b] The [code]value[/code] must lie in the interval [code][-2^63, " +"2^63 - 1][/code] (i.e. be a valid [int] value)." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Stores an integer as 8 bits in the file.\n" +"[b]Note:[/b] The [code]value[/code] should lie in the interval [code][0, 255]" +"[/code]. Any other value will overflow and wrap around.\n" +"To store a signed integer, use [method store_64], or convert it manually " +"(see [method store_16] for an example)." +msgstr "" + +#: doc/classes/File.xml +msgid "Stores the given array of bytes in the file." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Store the given [PoolStringArray] in the file as a line formatted in the CSV " +"(Comma-Separated Values) format. You can pass a different delimiter " +"[code]delim[/code] to use other than the default [code]\",\"[/code] (comma). " +"This delimiter must be one-character long.\n" +"Text will be encoded as UTF-8." +msgstr "" + +#: doc/classes/File.xml +msgid "Stores a floating-point number as 64 bits in the file." +msgstr "" + +#: doc/classes/File.xml +msgid "Stores a floating-point number as 32 bits in the file." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Appends [code]line[/code] to the file followed by a line return character " +"([code]\\n[/code]), encoding the text as UTF-8." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Stores the given [String] as a line in the file in Pascal format (i.e. also " +"store the length of the string).\n" +"Text will be encoded as UTF-8." +msgstr "" + +#: doc/classes/File.xml +msgid "Stores a floating-point number in the file." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Appends [code]string[/code] to the file without a line return, encoding the " +"text as UTF-8.\n" +"[b]Note:[/b] This method is intended to be used to write text files. The " +"string is stored as a UTF-8 encoded buffer without string length or " +"terminating zero, which means that it can't be loaded back easily. If you " +"want to store a retrievable string in a binary file, consider using [method " +"store_pascal_string] instead. For retrieving strings from a text file, you " +"can use [code]get_buffer(length).get_string_from_utf8()[/code] (if you know " +"the length) or [method get_as_text]." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Stores any Variant value in the file. If [code]full_objects[/code] is " +"[code]true[/code], encoding objects is allowed (and can potentially include " +"code).\n" +"[b]Note:[/b] Not all properties are included. Only properties that are " +"configured with the [constant PROPERTY_USAGE_STORAGE] flag set will be " +"serialized. You can add a new usage flag to a property by overriding the " +"[method Object._get_property_list] method in your class. You can also check " +"how property usage is configured by calling [method Object." +"_get_property_list]. See [enum PropertyUsageFlags] for the possible usage " +"flags." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"If [code]true[/code], the file is read with big-endian [url=https://en." +"wikipedia.org/wiki/Endianness]endianness[/url]. If [code]false[/code], the " +"file is read with little-endian endianness. If in doubt, leave this to " +"[code]false[/code] as most files are written with little-endian endianness.\n" +"[b]Note:[/b] [member endian_swap] is only about the file format, not the CPU " +"type. The CPU endianness doesn't affect the default endianness for files " +"written.\n" +"[b]Note:[/b] This is always reset to [code]false[/code] whenever you open " +"the file. Therefore, you must set [member endian_swap] [i]after[/i] opening " +"the file, not before." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Opens the file for read operations. The cursor is positioned at the " +"beginning of the file." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Opens the file for write operations. The file is created if it does not " +"exist, and truncated if it does." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Opens the file for read and write operations. Does not truncate the file. " +"The cursor is positioned at the beginning of the file." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Opens the file for read and write operations. The file is created if it does " +"not exist, and truncated if it does. The cursor is positioned at the " +"beginning of the file." +msgstr "" + +#: doc/classes/File.xml +msgid "Uses the [url=http://fastlz.org/]FastLZ[/url] compression method." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Uses the [url=https://en.wikipedia.org/wiki/DEFLATE]DEFLATE[/url] " +"compression method." +msgstr "" + +#: doc/classes/File.xml +msgid "" +"Uses the [url=https://facebook.github.io/zstd/]Zstandard[/url] compression " +"method." +msgstr "" + +#: doc/classes/File.xml +msgid "Uses the [url=https://www.gzip.org/]gzip[/url] compression method." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "Dialog for selecting files or directories in the filesystem." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "" +"FileDialog is a preset dialog used to choose files and directories in the " +"filesystem. It supports filter masks. The FileDialog automatically sets its " +"window title according to the [member mode]. If you want to use a custom " +"title, disable this by setting [member mode_overrides_title] to [code]false[/" +"code]." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "" +"Adds [code]filter[/code] to the list of filters, which restricts what files " +"can be picked.\n" +"A [code]filter[/code] should be of the form [code]\"filename.extension ; " +"Description\"[/code], where filename and extension can be [code]*[/code] to " +"match any string. Filters starting with [code].[/code] (i.e. empty " +"filenames) are not allowed.\n" +"Example filters: [code]\"*.png ; PNG Images\"[/code], [code]\"project." +"godot ; Godot Project\"[/code]." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "Clear all the added filters in the dialog." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "Clear currently selected items in the dialog." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "" +"Returns the LineEdit for the selected file.\n" +"[b]Warning:[/b] This is a required internal node, removing and freeing it " +"may cause a crash. If you wish to hide it or any of its children, use their " +"[member CanvasItem.visible] property." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "" +"Returns the vertical box container of the dialog, custom controls can be " +"added to it.\n" +"[b]Warning:[/b] This is a required internal node, removing and freeing it " +"may cause a crash. If you wish to hide it or any of its children, use their " +"[member CanvasItem.visible] property." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "Invalidate and update the current dialog content list." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "" +"The file system access scope. See enum [code]Access[/code] constants.\n" +"[b]Warning:[/b] Currently, in sandboxed environments such as HTML5 builds or " +"sandboxed macOS apps, FileDialog cannot access the host file system. See " +"[url=https://github.com/godotengine/godot-proposals/issues/1123]godot-" +"proposals#1123[/url]." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "The current working directory of the file dialog." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "The currently selected file of the file dialog." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "The currently selected file path of the file dialog." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "" +"The available file type filters. For example, this shows only [code].png[/" +"code] and [code].gd[/code] files: [code]set_filters(PoolStringArray([\"*." +"png ; PNG Images\",\"*.gd ; GDScript Files\"]))[/code]. Multiple file types " +"can also be specified in a single filter. [code]\"*.png, *.jpg, *.jpeg ; " +"Supported Images\"[/code] will show both PNG and JPEG files when selected." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "" +"The dialog's open or save mode, which affects the selection behavior. See " +"enum [code]Mode[/code] constants." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "" +"If [code]true[/code], changing the [code]Mode[/code] property will set the " +"window title accordingly (e.g. setting mode to [constant MODE_OPEN_FILE] " +"will change the window title to \"Open a File\")." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "If [code]true[/code], the dialog will show hidden files." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "Emitted when the user selects a directory." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "" +"Emitted when the user selects a file by double-clicking it or pressing the " +"[b]OK[/b] button." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "Emitted when the user selects multiple files." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "The dialog allows selecting one, and only one file." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "The dialog allows selecting multiple files." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "" +"The dialog only allows selecting a directory, disallowing the selection of " +"any file." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "The dialog allows selecting one file or directory." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "The dialog will warn when a file exists." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "" +"The dialog only allows accessing files under the [Resource] path " +"([code]res://[/code])." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "" +"The dialog only allows accessing files under user data path ([code]user://[/" +"code])." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "The dialog allows accessing files on the whole file system." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "The color modulation applied to the file icon." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "" +"The color tint for disabled files (when the [FileDialog] is used in open " +"folder mode)." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "The color modulation applied to the folder icon." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "Custom icon for files." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "Custom icon for folders." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "Custom icon for the parent folder arrow." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "Custom icon for the reload button." +msgstr "" + +#: doc/classes/FileDialog.xml +msgid "Custom icon for the toggle hidden button." +msgstr "" + +#: doc/classes/float.xml +msgid "Float built-in type." +msgstr "" + +#: doc/classes/float.xml +msgid "" +"The [float] built-in type is a 64-bit double-precision floating-point " +"number, equivalent to [code]double[/code] in C++. This type has 14 reliable " +"decimal digits of precision. The [float] type can be stored in [Variant], " +"which is the generic type used by the engine. The maximum value of [float] " +"is approximately [code]1.79769e308[/code], and the minimum is approximately " +"[code]-1.79769e308[/code].\n" +"Most methods and properties in the engine use 32-bit single-precision " +"floating-point numbers instead, equivalent to [code]float[/code] in C++, " +"which have 6 reliable decimal digits of precision. For data structures such " +"as [Vector2] and [Vector3], Godot uses 32-bit floating-point numbers.\n" +"Math done using the [float] type is not guaranteed to be exact or " +"deterministic, and will often result in small errors. You should usually use " +"the [method @GDScript.is_equal_approx] and [method @GDScript.is_zero_approx] " +"methods instead of [code]==[/code] to compare [float] values for equality." +msgstr "" + +#: doc/classes/float.xml +msgid "Wikipedia: Double-precision floating-point format" +msgstr "" + +#: doc/classes/float.xml +msgid "Wikipedia: Single-precision floating-point format" +msgstr "" + +#: doc/classes/float.xml +msgid "" +"Cast a [bool] value to a floating-point value, [code]float(true)[/code] will " +"be equal to 1.0 and [code]float(false)[/code] will be equal to 0.0." +msgstr "" + +#: doc/classes/float.xml +msgid "" +"Cast an [int] value to a floating-point value, [code]float(1)[/code] will be " +"equal to 1.0." +msgstr "" + +#: doc/classes/float.xml +msgid "" +"Cast a [String] value to a floating-point value. This method accepts float " +"value strings like [code]\"1.23\"[/code] and exponential notation strings " +"for its parameter so calling [code]float(\"1e3\")[/code] will return 1000.0 " +"and calling [code]float(\"1e-3\")[/code] will return 0.001. Calling this " +"method with an invalid float string will return 0. This method stops parsing " +"at the first invalid character and will return the parsed result so far, so " +"calling [code]float(\"1a3\")[/code] will return 1 while calling " +"[code]float(\"1e3a2\")[/code] will return 1000.0." +msgstr "" + +#: doc/classes/FlowContainer.xml +msgid "Base class for flow containers." +msgstr "" + +#: doc/classes/FlowContainer.xml +msgid "" +"Arranges child [Control] nodes vertically or horizontally in a left-to-right " +"or top-to-bottom flow.\n" +"A line is filled with [Control] nodes until no more fit on the same line, " +"similar to text in an autowrapped label." +msgstr "" + +#: doc/classes/FlowContainer.xml +msgid "Returns the current line count." +msgstr "" + +#: doc/classes/Font.xml +msgid "Internationalized font and text drawing support." +msgstr "" + +#: doc/classes/Font.xml +msgid "" +"Font contains a Unicode-compatible character set, as well as the ability to " +"draw it with variable width, ascent, descent and kerning. For creating fonts " +"from TTF files (or other font formats), see the editor support for fonts.\n" +"[b]Note:[/b] If a [DynamicFont] doesn't contain a character used in a " +"string, the character in question will be replaced with codepoint " +"[code]0xfffd[/code] if it's available in the [DynamicFont]. If this " +"replacement character isn't available in the DynamicFont, the character will " +"be hidden without displaying any replacement character in the string.\n" +"[b]Note:[/b] If a [BitmapFont] doesn't contain a character used in a string, " +"the character in question will be hidden without displaying any replacement " +"character in the string.\n" +"[b]Note:[/b] Unicode characters after [code]0xffff[/code] (such as most " +"emoji) are [i]not[/i] supported on Windows. They will display as unknown " +"characters instead. This will be resolved in Godot 4.0." +msgstr "" + +#: doc/classes/Font.xml +msgid "" +"Draw [code]string[/code] into a canvas item using the font at a given " +"position, with [code]modulate[/code] color, and optionally clipping the " +"width. [code]position[/code] specifies the baseline, not the top. To draw " +"from the top, [i]ascent[/i] must be added to the Y axis.\n" +"See also [method CanvasItem.draw_string]." +msgstr "" + +#: doc/classes/Font.xml +msgid "" +"Draw character [code]char[/code] into a canvas item using the font at a " +"given position, with [code]modulate[/code] color, and optionally kerning if " +"[code]next[/code] is passed. clipping the width. [code]position[/code] " +"specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " +"must be added to the Y axis. The width used by the character is returned, " +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." +msgstr "" + +#: doc/classes/Font.xml +msgid "Returns the font ascent (number of pixels above the baseline)." +msgstr "" + +#: doc/classes/Font.xml +msgid "" +"Returns outline contours of the glyph as a [code]Dictionary[/code] with the " +"following contents:\n" +"[code]points[/code] - [PoolVector3Array], containing outline points. " +"[code]x[/code] and [code]y[/code] are point coordinates. [code]z[/code] is " +"the type of the point, using the [enum ContourPointTag] values.\n" +"[code]contours[/code] - [PoolIntArray], containing indices the end " +"points of each contour.\n" +"[code]orientation[/code] - [bool], contour orientation. If [code]true[/" +"code], clockwise contours must be filled." +msgstr "" + +#: doc/classes/Font.xml +msgid "" +"Returns the size of a character, optionally taking kerning into account if " +"the next character is provided. Note that the height returned is the font " +"height (see [method get_height]) and has no relation to the glyph height." +msgstr "" + +#: doc/classes/Font.xml +msgid "Returns resource id of the cache texture containing the char." +msgstr "" + +#: doc/classes/Font.xml +msgid "Returns size of the cache texture containing the char." +msgstr "" + +#: doc/classes/Font.xml +msgid "Returns char offset from the baseline." +msgstr "" + +#: doc/classes/Font.xml +msgid "Returns size of the char." +msgstr "" + +#: doc/classes/Font.xml +msgid "Returns rectangle in the cache texture containing the char." +msgstr "" + +#: doc/classes/Font.xml +msgid "Returns the font descent (number of pixels below the baseline)." +msgstr "" + +#: doc/classes/Font.xml +msgid "Returns the total font height (ascent plus descent) in pixels." +msgstr "" + +#: doc/classes/Font.xml +msgid "" +"Returns the size of a string, taking kerning and advance into account. Note " +"that the height returned is the font height (see [method get_height]) and " +"has no relation to the string." +msgstr "" + +#: doc/classes/Font.xml +msgid "" +"Returns the size that the string would have with word wrapping enabled with " +"a fixed [code]width[/code]." +msgstr "" + +#: doc/classes/Font.xml +msgid "Returns [code]true[/code] if the font has an outline." +msgstr "" + +#: doc/classes/Font.xml +msgid "" +"After editing a font (changing size, ascent, char rects, etc.). Call this " +"function to propagate changes to controls that might use it." +msgstr "" + +#: doc/classes/Font.xml +msgid "Contour point is on the curve." +msgstr "" + +#: doc/classes/Font.xml +msgid "" +"Contour point isn't on the curve, but serves as a control point for a conic " +"(quadratic) Bézier arc." +msgstr "" + +#: doc/classes/Font.xml +msgid "" +"Contour point isn't on the curve, but serves as a control point for a cubic " +"Bézier arc." +msgstr "" + +#: doc/classes/FuncRef.xml +msgid "Reference to a function in an object." +msgstr "" + +#: doc/classes/FuncRef.xml +msgid "" +"In GDScript, functions are not [i]first-class objects[/i]. This means it is " +"impossible to store them directly as variables, return them from another " +"function, or pass them as arguments.\n" +"However, by creating a [FuncRef] using the [method @GDScript.funcref] " +"function, a reference to a function in a given object can be created, passed " +"around and called." +msgstr "" + +#: doc/classes/FuncRef.xml +msgid "" +"Calls the referenced function previously set in [member function] or [method " +"@GDScript.funcref]." +msgstr "" + +#: doc/classes/FuncRef.xml +msgid "" +"Calls the referenced function previously set in [member function] or [method " +"@GDScript.funcref]. Contrarily to [method call_func], this method does not " +"support a variable number of arguments but expects all parameters to be " +"passed via a single [Array]." +msgstr "" + +#: doc/classes/FuncRef.xml +msgid "Returns whether the object still exists and has the function assigned." +msgstr "" + +#: doc/classes/FuncRef.xml +msgid "" +"The object containing the referenced function. This object must be of a type " +"actually inheriting from [Object], not a built-in type such as [int], " +"[Vector2] or [Dictionary]." +msgstr "" + +#: doc/classes/FuncRef.xml +msgid "The name of the referenced function." +msgstr "" + +#: modules/gdnative/doc_classes/GDNativeLibrary.xml +msgid "" +"An external library containing functions or script classes to use in Godot." +msgstr "" + +#: modules/gdnative/doc_classes/GDNativeLibrary.xml +msgid "" +"A GDNative library can implement [NativeScript]s, global functions to call " +"with the [GDNative] class, or low-level engine extensions through interfaces " +"such as [ARVRInterfaceGDNative]. The library must be compiled for each " +"platform and architecture that the project will run on." +msgstr "" + +#: modules/gdnative/doc_classes/GDNativeLibrary.xml +msgid "" +"Returns paths to all dependency libraries for the current platform and " +"architecture." +msgstr "" + +#: modules/gdnative/doc_classes/GDNativeLibrary.xml +msgid "" +"Returns the path to the dynamic library file for the current platform and " +"architecture." +msgstr "" + +#: modules/gdnative/doc_classes/GDNativeLibrary.xml +msgid "" +"This resource in INI-style [ConfigFile] format, as in [code].gdnlib[/code] " +"files." +msgstr "" + +#: modules/gdnative/doc_classes/GDNativeLibrary.xml +msgid "" +"If [code]true[/code], Godot loads only one copy of the library and each " +"script that references the library will share static data like static or " +"global variables.\n" +"If [code]false[/code], Godot loads a separate copy of the library into " +"memory for each script that references it." +msgstr "" + +#: modules/gdnative/doc_classes/GDNativeLibrary.xml +msgid "" +"If [code]true[/code], the editor will temporarily unload the library " +"whenever the user switches away from the editor window, allowing the user to " +"recompile the library without restarting Godot.\n" +"[b]Note:[/b] If the library defines tool scripts that run inside the editor, " +"[code]reloadable[/code] must be [code]false[/code]. Otherwise, the editor " +"will attempt to unload the tool scripts while they're in use and crash." +msgstr "" + +#: modules/gdnative/doc_classes/GDNativeLibrary.xml +msgid "" +"If [code]true[/code], Godot loads the library at startup rather than the " +"first time a script uses the library, calling [code]{prefix}" +"gdnative_singleton[/code] after initializing the library (where [code]" +"{prefix}[/code] is the value of [member symbol_prefix]). The library remains " +"loaded as long as Godot is running.\n" +"[b]Note:[/b] A singleton library cannot be [member reloadable]." +msgstr "" + +#: modules/gdnative/doc_classes/GDNativeLibrary.xml +msgid "" +"The prefix this library's entry point functions begin with. For example, a " +"GDNativeLibrary would declare its [code]gdnative_init[/code] function as " +"[code]godot_gdnative_init[/code] by default.\n" +"On platforms that require statically linking libraries (currently only iOS), " +"each library must have a different [code]symbol_prefix[/code]." +msgstr "" + +#: modules/gdscript/doc_classes/GDScript.xml +msgid "A script implemented in the GDScript programming language." +msgstr "" + +#: modules/gdscript/doc_classes/GDScript.xml +msgid "" +"A script implemented in the GDScript programming language. The script " +"extends the functionality of all objects that instance it.\n" +"[method new] creates a new instance of the script. [method Object." +"set_script] extends an existing object, if that object's class matches one " +"of the script's base classes." +msgstr "" + +#: modules/gdscript/doc_classes/GDScript.xml +msgid "Returns byte code for the script source code." +msgstr "" + +#: modules/gdscript/doc_classes/GDScript.xml +msgid "" +"Returns a new instance of the script.\n" +"For example:\n" +"[codeblock]\n" +"var MyClass = load(\"myclass.gd\")\n" +"var instance = MyClass.new()\n" +"assert(instance.get_script() == MyClass)\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/GDScriptFunctionState.xml +msgid "State of a function call after yielding." +msgstr "" + +#: modules/gdscript/doc_classes/GDScriptFunctionState.xml +msgid "" +"Calling [method @GDScript.yield] within a function will cause that function " +"to yield and return its current state as an object of this type. The yielded " +"function call can then be resumed later by calling [method resume] on this " +"state object." +msgstr "" + +#: modules/gdscript/doc_classes/GDScriptFunctionState.xml +msgid "" +"Check whether the function call may be resumed. This is not the case if the " +"function state was already resumed.\n" +"If [code]extended_check[/code] is enabled, it also checks if the associated " +"script and object still exist. The extended check is done in debug mode as " +"part of [method GDScriptFunctionState.resume], but you can use this if you " +"know you may be trying to resume without knowing for sure the object and/or " +"script have survived up to that point." +msgstr "" + +#: modules/gdscript/doc_classes/GDScriptFunctionState.xml +msgid "" +"Resume execution of the yielded function call.\n" +"If handed an argument, return the argument from the [method @GDScript.yield] " +"call in the yielded function call. You can pass e.g. an [Array] to hand " +"multiple arguments.\n" +"This function returns what the resumed function call returns, possibly " +"another function state if yielded again." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"The generic 6-degrees-of-freedom joint can implement a variety of joint " +"types by locking certain axes' rotation or translation." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"The first 3 DOF axes are linear axes, which represent translation of Bodies, " +"and the latter 3 DOF axes represent the angular motion. Each axis can be " +"either locked, or limited." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"The amount of rotational damping across the X axis.\n" +"The lower, the longer an impulse from one side takes to travel to the other " +"side." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "If [code]true[/code], rotation across the X axis is limited." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"When rotating across the X axis, this error tolerance factor defines how " +"much the correction gets slowed down. The lower, the slower." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"The maximum amount of force that can occur, when rotating around the X axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"The minimum rotation in negative direction to break loose and rotate around " +"the X axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"The amount of rotational restitution across the X axis. The lower, the more " +"restitution occurs." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "The speed of all rotations across the X axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"The minimum rotation in positive direction to break loose and rotate around " +"the X axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"The amount of rotational damping across the Y axis. The lower, the more " +"dampening occurs." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "If [code]true[/code], rotation across the Y axis is limited." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"When rotating across the Y axis, this error tolerance factor defines how " +"much the correction gets slowed down. The lower, the slower." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"The maximum amount of force that can occur, when rotating around the Y axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"The minimum rotation in negative direction to break loose and rotate around " +"the Y axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"The amount of rotational restitution across the Y axis. The lower, the more " +"restitution occurs." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "The speed of all rotations across the Y axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"The minimum rotation in positive direction to break loose and rotate around " +"the Y axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"The amount of rotational damping across the Z axis. The lower, the more " +"dampening occurs." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "If [code]true[/code], rotation across the Z axis is limited." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"When rotating across the Z axis, this error tolerance factor defines how " +"much the correction gets slowed down. The lower, the slower." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"The maximum amount of force that can occur, when rotating around the Z axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"The minimum rotation in negative direction to break loose and rotate around " +"the Z axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"The amount of rotational restitution across the Z axis. The lower, the more " +"restitution occurs." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "The speed of all rotations across the Z axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"The minimum rotation in positive direction to break loose and rotate around " +"the Z axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "If [code]true[/code], a rotating motor at the X axis is enabled." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "Maximum acceleration for the motor at the X axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "Target speed for the motor at the X axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "If [code]true[/code], a rotating motor at the Y axis is enabled." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "Maximum acceleration for the motor at the Y axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "Target speed for the motor at the Y axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "If [code]true[/code], a rotating motor at the Z axis is enabled." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "Maximum acceleration for the motor at the Z axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "Target speed for the motor at the Z axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "The amount of damping that happens at the X motion." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "If [code]true[/code], the linear motion across the X axis is limited." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "The minimum difference between the pivot points' X axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"The amount of restitution on the X axis movement. The lower, the more " +"momentum gets lost." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"A factor applied to the movement across the X axis. The lower, the slower " +"the movement." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "The maximum difference between the pivot points' X axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "The amount of damping that happens at the Y motion." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "If [code]true[/code], the linear motion across the Y axis is limited." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "The minimum difference between the pivot points' Y axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"The amount of restitution on the Y axis movement. The lower, the more " +"momentum gets lost." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"A factor applied to the movement across the Y axis. The lower, the slower " +"the movement." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "The maximum difference between the pivot points' Y axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "The amount of damping that happens at the Z motion." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "If [code]true[/code], the linear motion across the Z axis is limited." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "The minimum difference between the pivot points' Z axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"The amount of restitution on the Z axis movement. The lower, the more " +"momentum gets lost." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"A factor applied to the movement across the Z axis. The lower, the slower " +"the movement." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "The maximum difference between the pivot points' Z axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"If [code]true[/code], then there is a linear motor on the X axis. It will " +"attempt to reach the target velocity while staying within the force limits." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"The maximum force the linear motor can apply on the X axis while trying to " +"reach the target velocity." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "The speed that the linear motor will attempt to reach on the X axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"If [code]true[/code], then there is a linear motor on the Y axis. It will " +"attempt to reach the target velocity while staying within the force limits." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"The maximum force the linear motor can apply on the Y axis while trying to " +"reach the target velocity." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "The speed that the linear motor will attempt to reach on the Y axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"If [code]true[/code], then there is a linear motor on the Z axis. It will " +"attempt to reach the target velocity while staying within the force limits." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"The maximum force the linear motor can apply on the Z axis while trying to " +"reach the target velocity." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "The speed that the linear motor will attempt to reach on the Z axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml doc/classes/PhysicsServer.xml +msgid "The minimum difference between the pivot points' axes." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml doc/classes/PhysicsServer.xml +msgid "The maximum difference between the pivot points' axes." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"A factor applied to the movement across the axes. The lower, the slower the " +"movement." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"The amount of restitution on the axes' movement. The lower, the more " +"momentum gets lost." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml doc/classes/PhysicsServer.xml +msgid "" +"The amount of damping that happens at the linear motion across the axes." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "The velocity the linear motor will try to reach." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"The maximum force the linear motor will apply while trying to reach the " +"velocity target." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml doc/classes/PhysicsServer.xml +msgid "" +"The minimum rotation in negative direction to break loose and rotate around " +"the axes." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml doc/classes/PhysicsServer.xml +msgid "" +"The minimum rotation in positive direction to break loose and rotate around " +"the axes." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "The speed of all rotations across the axes." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml doc/classes/PhysicsServer.xml +msgid "" +"The amount of rotational damping across the axes. The lower, the more " +"dampening occurs." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml doc/classes/PhysicsServer.xml +msgid "" +"The amount of rotational restitution across the axes. The lower, the more " +"restitution occurs." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml doc/classes/PhysicsServer.xml +msgid "" +"The maximum amount of force that can occur, when rotating around the axes." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "" +"When rotating across the axes, this error tolerance factor defines how much " +"the correction gets slowed down. The lower, the slower." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml doc/classes/PhysicsServer.xml +msgid "Target speed for the motor at the axes." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml doc/classes/PhysicsServer.xml +msgid "Maximum acceleration for the motor at the axes." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "If enabled, linear motion is possible within the given limits." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "If enabled, rotational motion is possible within the given limits." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "If enabled, there is a rotational motor across these axes." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml +msgid "If enabled, there is a linear motor across these axes." +msgstr "" + +#: doc/classes/Generic6DOFJoint.xml doc/classes/HingeJoint.xml +msgid "Represents the size of the [enum Flag] enum." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "Helper node to calculate generic geometry operations." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Geometry provides users with a set of helper functions to create geometric " +"shapes, compute intersections between shapes, and process various other " +"geometric operations." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Returns an array with 6 [Plane]s that describe the sides of a box centered " +"at the origin. The box size is defined by [code]extents[/code], which " +"represents one (positive) corner of the box (i.e. half its actual size)." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Returns an array of [Plane]s closely bounding a faceted capsule centered at " +"the origin with radius [code]radius[/code] and height [code]height[/code]. " +"The parameter [code]sides[/code] defines how many planes will be generated " +"for the side part of the capsule, whereas [code]lats[/code] gives the number " +"of latitudinal steps at the bottom and top of the capsule. The parameter " +"[code]axis[/code] describes the axis along which the capsule is oriented (0 " +"for X, 1 for Y, 2 for Z)." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Returns an array of [Plane]s closely bounding a faceted cylinder centered at " +"the origin with radius [code]radius[/code] and height [code]height[/code]. " +"The parameter [code]sides[/code] defines how many planes will be generated " +"for the round part of the cylinder. The parameter [code]axis[/code] " +"describes the axis along which the cylinder is oriented (0 for X, 1 for Y, 2 " +"for Z)." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Clips the polygon defined by the points in [code]points[/code] against the " +"[code]plane[/code] and returns the points of the clipped polygon." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Clips [code]polygon_a[/code] against [code]polygon_b[/code] and returns an " +"array of clipped polygons. This performs [constant OPERATION_DIFFERENCE] " +"between polygons. Returns an empty array if [code]polygon_b[/code] " +"completely overlaps [code]polygon_a[/code].\n" +"If [code]polygon_b[/code] is enclosed by [code]polygon_a[/code], returns an " +"outer polygon (boundary) and inner polygon (hole) which could be " +"distinguished by calling [method is_polygon_clockwise]." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Clips [code]polyline[/code] against [code]polygon[/code] and returns an " +"array of clipped polylines. This performs [constant OPERATION_DIFFERENCE] " +"between the polyline and the polygon. This operation can be thought of as " +"cutting a line with a closed shape." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Given an array of [Vector2]s, returns the convex hull as a list of points in " +"counterclockwise order. The last point is the same as the first one." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Mutually excludes common area defined by intersection of [code]polygon_a[/" +"code] and [code]polygon_b[/code] (see [method intersect_polygons_2d]) and " +"returns an array of excluded polygons. This performs [constant " +"OPERATION_XOR] between polygons. In other words, returns all but common area " +"between polygons.\n" +"The operation may result in an outer polygon (boundary) and inner polygon " +"(hole) produced which could be distinguished by calling [method " +"is_polygon_clockwise]." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Returns the 3D point on the 3D segment ([code]s1[/code], [code]s2[/code]) " +"that is closest to [code]point[/code]. The returned point will always be " +"inside the specified segment." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Returns the 2D point on the 2D segment ([code]s1[/code], [code]s2[/code]) " +"that is closest to [code]point[/code]. The returned point will always be " +"inside the specified segment." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Returns the 3D point on the 3D line defined by ([code]s1[/code], [code]s2[/" +"code]) that is closest to [code]point[/code]. The returned point can be " +"inside the segment ([code]s1[/code], [code]s2[/code]) or outside of it, i.e. " +"somewhere on the line extending from the segment." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Returns the 2D point on the 2D line defined by ([code]s1[/code], [code]s2[/" +"code]) that is closest to [code]point[/code]. The returned point can be " +"inside the segment ([code]s1[/code], [code]s2[/code]) or outside of it, i.e. " +"somewhere on the line extending from the segment." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Given the two 3D segments ([code]p1[/code], [code]p2[/code]) and ([code]q1[/" +"code], [code]q2[/code]), finds those two points on the two segments that are " +"closest to each other. Returns a [PoolVector3Array] that contains this point " +"on ([code]p1[/code], [code]p2[/code]) as well the accompanying point on " +"([code]q1[/code], [code]q2[/code])." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Given the two 2D segments ([code]p1[/code], [code]q1[/code]) and ([code]p2[/" +"code], [code]q2[/code]), finds those two points on the two segments that are " +"closest to each other. Returns a [PoolVector2Array] that contains this point " +"on ([code]p1[/code], [code]q1[/code]) as well the accompanying point on " +"([code]p2[/code], [code]q2[/code])." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "Used internally by the engine." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Intersects [code]polygon_a[/code] with [code]polygon_b[/code] and returns an " +"array of intersected polygons. This performs [constant " +"OPERATION_INTERSECTION] between polygons. In other words, returns common " +"area shared by polygons. Returns an empty array if no intersection occurs.\n" +"The operation may result in an outer polygon (boundary) and inner polygon " +"(hole) produced which could be distinguished by calling [method " +"is_polygon_clockwise]." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Intersects [code]polyline[/code] with [code]polygon[/code] and returns an " +"array of intersected polylines. This performs [constant " +"OPERATION_INTERSECTION] between the polyline and the polygon. This operation " +"can be thought of as chopping a line with a closed shape." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Returns [code]true[/code] if [code]point[/code] is inside the circle or if " +"it's located exactly [i]on[/i] the circle's boundary, otherwise returns " +"[code]false[/code]." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Returns [code]true[/code] if [code]point[/code] is inside [code]polygon[/" +"code] or if it's located exactly [i]on[/i] polygon's boundary, otherwise " +"returns [code]false[/code]." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Returns [code]true[/code] if [code]polygon[/code]'s vertices are ordered in " +"clockwise order, otherwise returns [code]false[/code]." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Checks if the two lines ([code]from_a[/code], [code]dir_a[/code]) and " +"([code]from_b[/code], [code]dir_b[/code]) intersect. If yes, return the " +"point of intersection as [Vector2]. If no intersection takes place, returns " +"[code]null[/code].\n" +"[b]Note:[/b] The lines are specified using direction vectors, not end points." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Given an array of [Vector2]s representing tiles, builds an atlas. The " +"returned dictionary has two keys: [code]points[/code] is an array of " +"[Vector2] that specifies the positions of each tile, [code]size[/code] " +"contains the overall size of the whole atlas as [Vector2]." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Merges (combines) [code]polygon_a[/code] and [code]polygon_b[/code] and " +"returns an array of merged polygons. This performs [constant " +"OPERATION_UNION] between polygons.\n" +"The operation may result in an outer polygon (boundary) and multiple inner " +"polygons (holes) produced which could be distinguished by calling [method " +"is_polygon_clockwise]." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Inflates or deflates [code]polygon[/code] by [code]delta[/code] units " +"(pixels). If [code]delta[/code] is positive, makes the polygon grow outward. " +"If [code]delta[/code] is negative, shrinks the polygon inward. Returns an " +"array of polygons because inflating/deflating may result in multiple " +"discrete polygons. Returns an empty array if [code]delta[/code] is negative " +"and the absolute value of it approximately exceeds the minimum bounding " +"rectangle dimensions of the polygon.\n" +"Each polygon's vertices will be rounded as determined by [code]join_type[/" +"code], see [enum PolyJoinType].\n" +"The operation may result in an outer polygon (boundary) and inner polygon " +"(hole) produced which could be distinguished by calling [method " +"is_polygon_clockwise].\n" +"[b]Note:[/b] To translate the polygon's vertices specifically, use the " +"[method Transform2D.xform] method:\n" +"[codeblock]\n" +"var polygon = PoolVector2Array([Vector2(0, 0), Vector2(100, 0), Vector2(100, " +"100), Vector2(0, 100)])\n" +"var offset = Vector2(50, 50)\n" +"polygon = Transform2D(0, offset).xform(polygon)\n" +"print(polygon) # prints [Vector2(50, 50), Vector2(150, 50), Vector2(150, " +"150), Vector2(50, 150)]\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Inflates or deflates [code]polyline[/code] by [code]delta[/code] units " +"(pixels), producing polygons. If [code]delta[/code] is positive, makes the " +"polyline grow outward. Returns an array of polygons because inflating/" +"deflating may result in multiple discrete polygons. If [code]delta[/code] is " +"negative, returns an empty array.\n" +"Each polygon's vertices will be rounded as determined by [code]join_type[/" +"code], see [enum PolyJoinType].\n" +"Each polygon's endpoints will be rounded as determined by [code]end_type[/" +"code], see [enum PolyEndType].\n" +"The operation may result in an outer polygon (boundary) and inner polygon " +"(hole) produced which could be distinguished by calling [method " +"is_polygon_clockwise]." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Returns if [code]point[/code] is inside the triangle specified by [code]a[/" +"code], [code]b[/code] and [code]c[/code]." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Tests if the 3D ray starting at [code]from[/code] with the direction of " +"[code]dir[/code] intersects the triangle specified by [code]a[/code], " +"[code]b[/code] and [code]c[/code]. If yes, returns the point of intersection " +"as [Vector3]. If no intersection takes place, an empty [Variant] is returned." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Given the 2D segment ([code]segment_from[/code], [code]segment_to[/code]), " +"returns the position on the segment (as a number between 0 and 1) at which " +"the segment hits the circle that is located at position " +"[code]circle_position[/code] and has radius [code]circle_radius[/code]. If " +"the segment does not intersect the circle, -1 is returned (this is also the " +"case if the line extending the segment would intersect the circle, but the " +"segment does not)." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Given a convex hull defined though the [Plane]s in the array [code]planes[/" +"code], tests if the segment ([code]from[/code], [code]to[/code]) intersects " +"with that hull. If an intersection is found, returns a [PoolVector3Array] " +"containing the point the intersection and the hull's normal. If no " +"intersecion is found, an the returned array is empty." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Checks if the segment ([code]from[/code], [code]to[/code]) intersects the " +"cylinder with height [code]height[/code] that is centered at the origin and " +"has radius [code]radius[/code]. If no, returns an empty [PoolVector3Array]. " +"If an intersection takes place, the returned array contains the point of " +"intersection and the cylinder's normal at the point of intersection." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Checks if the two segments ([code]from_a[/code], [code]to_a[/code]) and " +"([code]from_b[/code], [code]to_b[/code]) intersect. If yes, return the point " +"of intersection as [Vector2]. If no intersection takes place, returns " +"[code]null[/code]." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Checks if the segment ([code]from[/code], [code]to[/code]) intersects the " +"sphere that is located at [code]sphere_position[/code] and has radius " +"[code]sphere_radius[/code]. If no, returns an empty [PoolVector3Array]. If " +"yes, returns a [PoolVector3Array] containing the point of intersection and " +"the sphere's normal at the point of intersection." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Tests if the segment ([code]from[/code], [code]to[/code]) intersects the " +"triangle [code]a[/code], [code]b[/code], [code]c[/code]. If yes, returns the " +"point of intersection as [Vector3]. If no intersection takes place, an empty " +"[Variant] is returned." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Triangulates the area specified by discrete set of [code]points[/code] such " +"that no point is inside the circumcircle of any resulting triangle. Returns " +"a [PoolIntArray] where each triangle consists of three consecutive point " +"indices into [code]points[/code] (i.e. the returned array will have [code]n " +"* 3[/code] elements, with [code]n[/code] being the number of found " +"triangles). If the triangulation did not succeed, an empty [PoolIntArray] is " +"returned." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Triangulates the polygon specified by the points in [code]polygon[/code]. " +"Returns a [PoolIntArray] where each triangle consists of three consecutive " +"point indices into [code]polygon[/code] (i.e. the returned array will have " +"[code]n * 3[/code] elements, with [code]n[/code] being the number of found " +"triangles). Output triangles will always be counter clockwise, and the " +"contour will be flipped if it's clockwise. If the triangulation did not " +"succeed, an empty [PoolIntArray] is returned." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Create regions where either subject or clip polygons (or both) are filled." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Create regions where subject polygons are filled except where clip polygons " +"are filled." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "Create regions where both subject and clip polygons are filled." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Create regions where either subject or clip polygons are filled but not " +"where both are filled." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Squaring is applied uniformally at all convex edge joins at [code]1 * delta[/" +"code]." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"While flattened paths can never perfectly trace an arc, they are " +"approximated by a series of arc chords." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"There's a necessary limit to mitered joins since offsetting edges that join " +"at very acute angles will produce excessively long and narrow \"spikes\". " +"For any given edge join, when miter offsetting would exceed that maximum " +"distance, \"square\" joining is applied." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Endpoints are joined using the [enum PolyJoinType] value and the path filled " +"as a polygon." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "" +"Endpoints are joined using the [enum PolyJoinType] value and the path filled " +"as a polyline." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "Endpoints are squared off with no extension." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "Endpoints are squared off and extended by [code]delta[/code] units." +msgstr "" + +#: doc/classes/Geometry.xml +msgid "Endpoints are rounded off and extended by [code]delta[/code] units." +msgstr "" + +#: doc/classes/GeometryInstance.xml +msgid "Base node for geometry-based visual instances." +msgstr "" + +#: doc/classes/GeometryInstance.xml +msgid "" +"Base node for geometry-based visual instances. Shares some common " +"functionality like visibility and custom materials." +msgstr "" + +#: doc/classes/GeometryInstance.xml +msgid "" +"Returns the [enum GeometryInstance.Flags] that have been set for this object." +msgstr "" + +#: doc/classes/GeometryInstance.xml +msgid "" +"Overrides the bounding box of this node with a custom one. To remove it, set " +"an [AABB] with all fields set to zero." +msgstr "" + +#: doc/classes/GeometryInstance.xml +msgid "" +"Sets the [enum GeometryInstance.Flags] specified. See [enum GeometryInstance." +"Flags] for options." +msgstr "" + +#: doc/classes/GeometryInstance.xml +msgid "" +"The selected shadow casting flag. See [enum ShadowCastingSetting] for " +"possible values." +msgstr "" + +#: doc/classes/GeometryInstance.xml +msgid "" +"The extra distance added to the GeometryInstance's bounding box ([AABB]) to " +"increase its cull box." +msgstr "" + +#: doc/classes/GeometryInstance.xml +msgid "" +"When disabled, the mesh will be taken into account when computing indirect " +"lighting, but the resulting lightmap will not be saved. Useful for emissive " +"only materials or shadow casters." +msgstr "" + +#: doc/classes/GeometryInstance.xml +msgid "" +"Scale factor for the generated baked lightmap. Useful for adding detail to " +"certain mesh instances." +msgstr "" + +#: doc/classes/GeometryInstance.xml +msgid "" +"The GeometryInstance's max LOD distance.\n" +"[b]Note:[/b] This property currently has no effect." +msgstr "" + +#: doc/classes/GeometryInstance.xml +msgid "" +"The GeometryInstance's max LOD margin.\n" +"[b]Note:[/b] This property currently has no effect." +msgstr "" + +#: doc/classes/GeometryInstance.xml +msgid "" +"The GeometryInstance's min LOD distance.\n" +"[b]Note:[/b] This property currently has no effect." +msgstr "" + +#: doc/classes/GeometryInstance.xml +msgid "" +"The GeometryInstance's min LOD margin.\n" +"[b]Note:[/b] This property currently has no effect." +msgstr "" + +#: doc/classes/GeometryInstance.xml +msgid "" +"The material overlay for the whole geometry.\n" +"If a material is assigned to this property, it will be rendered on top of " +"any other active material for all the surfaces." +msgstr "" + +#: doc/classes/GeometryInstance.xml +msgid "" +"The material override for the whole geometry.\n" +"If a material is assigned to this property, it will be used instead of any " +"material set in any material slot of the mesh." +msgstr "" + +#: doc/classes/GeometryInstance.xml +msgid "" +"If [code]true[/code], this GeometryInstance will be used when baking lights " +"using a [GIProbe] or [BakedLightmap]." +msgstr "" + +#: doc/classes/GeometryInstance.xml +msgid "The generated lightmap texture will have the original size." +msgstr "" + +#: doc/classes/GeometryInstance.xml +msgid "The generated lightmap texture will be twice as large, on each axis." +msgstr "" + +#: doc/classes/GeometryInstance.xml +msgid "The generated lightmap texture will be 4 times as large, on each axis." +msgstr "" + +#: doc/classes/GeometryInstance.xml +msgid "The generated lightmap texture will be 8 times as large, on each axis." +msgstr "" + +#: doc/classes/GeometryInstance.xml +msgid "Will not cast any shadows." +msgstr "" + +#: doc/classes/GeometryInstance.xml +msgid "" +"Will cast shadows from all visible faces in the GeometryInstance.\n" +"Will take culling into account, so faces not being rendered will not be " +"taken into account when shadow casting." +msgstr "" + +#: doc/classes/GeometryInstance.xml +msgid "" +"Will cast shadows from all visible faces in the GeometryInstance.\n" +"Will not take culling into account, so all faces will be taken into account " +"when shadow casting." +msgstr "" + +#: doc/classes/GeometryInstance.xml +msgid "" +"Will only show the shadows casted from this object.\n" +"In other words, the actual mesh will not be visible, only the shadows casted " +"from the mesh will be." +msgstr "" + +#: doc/classes/GeometryInstance.xml +msgid "" +"Will allow the GeometryInstance to be used when baking lights using a " +"[GIProbe] or [BakedLightmap]." +msgstr "" + +#: doc/classes/GeometryInstance.xml +msgid "" +"Unused in this class, exposed for consistency with [enum VisualServer." +"InstanceFlags]." +msgstr "" + +#: doc/classes/GIProbe.xml +msgid "Real-time global illumination (GI) probe." +msgstr "" + +#: doc/classes/GIProbe.xml +msgid "" +"[GIProbe]s are used to provide high-quality real-time indirect light to " +"scenes. They precompute the effect of objects that emit light and the effect " +"of static geometry to simulate the behavior of complex light in real-time. " +"[GIProbe]s need to be baked before using, however, once baked, dynamic " +"objects will receive light from them. Further, lights can be fully dynamic " +"or baked.\n" +"Having [GIProbe]s in a scene can be expensive, the quality of the probe can " +"be turned down in exchange for better performance in the [ProjectSettings] " +"using [member ProjectSettings.rendering/quality/voxel_cone_tracing/" +"high_quality].\n" +"[b]Procedural generation:[/b] [GIProbe] can be baked in an exported project, " +"which makes it suitable for procedurally generated or user-built levels as " +"long as all the geometry is generated in advance.\n" +"[b]Performance:[/b] [GIProbe] is relatively demanding on the GPU and is not " +"suited to low-end hardware such as integrated graphics (consider " +"[BakedLightmap] instead). To provide a fallback for low-end hardware, " +"consider adding an option to disable [GIProbe] in your project's options " +"menus. A [GIProbe] node can be disabled by hiding it.\n" +"[b]Note:[/b] Meshes should have sufficiently thick walls to avoid light " +"leaks (avoid one-sided walls). For interior levels, enclose your level " +"geometry in a sufficiently large box and bridge the loops to close the mesh. " +"To further prevent light leaks, you can also strategically place temporary " +"[MeshInstance] nodes with [member GeometryInstance.use_in_baked_light] " +"enabled. These temporary nodes can then be hidden after baking the [GIProbe] " +"node.\n" +"[b]Note:[/b] Due to a renderer limitation, emissive [ShaderMaterial]s cannot " +"emit light when used in a [GIProbe]. Only emissive [SpatialMaterial]s can " +"emit light in a [GIProbe]." +msgstr "" + +#: doc/classes/GIProbe.xml +msgid "GI probes" +msgstr "" + +#: doc/classes/GIProbe.xml +msgid "" +"Bakes the effect from all [GeometryInstance]s marked with [member " +"GeometryInstance.use_in_baked_light] and [Light]s marked with either " +"[constant Light.BAKE_INDIRECT] or [constant Light.BAKE_ALL]. If " +"[code]create_visual_debug[/code] is [code]true[/code], after baking the " +"light, this will generate a [MultiMesh] that has a cube representing each " +"solid cell with each cube colored to the cell's albedo color. This can be " +"used to visualize the [GIProbe]'s data and debug any issues that may be " +"occurring.\n" +"[b]Note:[/b] [method bake] works from the editor and in exported projects. " +"This makes it suitable for procedurally generated or user-built levels. " +"Baking a [GIProbe] generally takes from 5 to 20 seconds in most scenes. " +"Reducing [member subdiv] can speed up baking.\n" +"[b]Note:[/b] [GeometryInstance]s and [Light]s must be fully ready before " +"[method bake] is called. If you are procedurally creating those and some " +"meshes or lights are missing from your baked [GIProbe], use " +"[code]call_deferred(\"bake\")[/code] instead of calling [method bake] " +"directly." +msgstr "" + +#: doc/classes/GIProbe.xml +msgid "Calls [method bake] with [code]create_visual_debug[/code] enabled." +msgstr "" + +#: doc/classes/GIProbe.xml +msgid "" +"Offsets the lookup of the light contribution from the [GIProbe]. This can be " +"used to avoid self-shadowing, but may introduce light leaking at higher " +"values. This and [member normal_bias] should be played around with to " +"minimize self-shadowing and light leaking.\n" +"[b]Note:[/b] [code]bias[/code] should usually be above 1.0 as that is the " +"size of the voxels." +msgstr "" + +#: doc/classes/GIProbe.xml +msgid "" +"[i]Deprecated.[/i] This property has been deprecated due to known bugs and " +"no longer has any effect when enabled." +msgstr "" + +#: doc/classes/GIProbe.xml +msgid "The [GIProbeData] resource that holds the data for this [GIProbe]." +msgstr "" + +#: doc/classes/GIProbe.xml +msgid "" +"The maximum brightness that the [GIProbe] will recognize. Brightness will be " +"scaled within this range." +msgstr "" + +#: doc/classes/GIProbe.xml +msgid "" +"Energy multiplier. Makes the lighting contribution from the [GIProbe] " +"brighter." +msgstr "" + +#: doc/classes/GIProbe.xml +msgid "" +"The size of the area covered by the [GIProbe]. If you make the extents " +"larger without increasing the subdivisions with [member subdiv], the size of " +"each cell will increase and result in lower detailed lighting." +msgstr "" + +#: doc/classes/GIProbe.xml +msgid "" +"If [code]true[/code], ignores the sky contribution when calculating lighting." +msgstr "" + +#: doc/classes/GIProbe.xml +msgid "" +"Offsets the lookup into the [GIProbe] based on the object's normal " +"direction. Can be used to reduce some self-shadowing artifacts." +msgstr "" + +#: doc/classes/GIProbe.xml +msgid "" +"How much light propagates through the probe internally. A higher value " +"allows light to spread further." +msgstr "" + +#: doc/classes/GIProbe.xml +msgid "" +"Number of times to subdivide the grid that the [GIProbe] operates on. A " +"higher number results in finer detail and thus higher visual quality, while " +"lower numbers result in better performance." +msgstr "" + +#: doc/classes/GIProbe.xml +msgid "" +"Use 64 subdivisions. This is the lowest quality setting, but the fastest. " +"Use it if you can, but especially use it on lower-end hardware." +msgstr "" + +#: doc/classes/GIProbe.xml +msgid "Use 128 subdivisions. This is the default quality setting." +msgstr "" + +#: doc/classes/GIProbe.xml +msgid "Use 256 subdivisions." +msgstr "" + +#: doc/classes/GIProbe.xml +msgid "" +"Use 512 subdivisions. This is the highest quality setting, but the slowest. " +"On lower-end hardware, this could cause the GPU to stall." +msgstr "" + +#: doc/classes/GIProbe.xml +msgid "Represents the size of the [enum Subdiv] enum." +msgstr "" + +#: modules/gltf/doc_classes/GLTFAccessor.xml +msgid "" +"[b]Note:[/b] This class is only compiled in editor builds. Run-time glTF " +"loading and saving is [i]not[/i] available in exported projects. References " +"to [GLTFAccessor] within a script will cause an error in an exported project." +msgstr "" + +#: modules/gltf/doc_classes/GLTFAnimation.xml +msgid "" +"[b]Note:[/b] This class is only compiled in editor builds. Run-time glTF " +"loading and saving is [i]not[/i] available in exported projects. References " +"to [GLTFAnimation] within a script will cause an error in an exported " +"project." +msgstr "" + +#: modules/gltf/doc_classes/GLTFBufferView.xml +msgid "" +"[b]Note:[/b] This class is only compiled in editor builds. Run-time glTF " +"loading and saving is [i]not[/i] available in exported projects. References " +"to [GLTFBufferView] within a script will cause an error in an exported " +"project." +msgstr "" + +#: modules/gltf/doc_classes/GLTFCamera.xml +msgid "" +"[b]Note:[/b] This class is only compiled in editor builds. Run-time glTF " +"loading and saving is [i]not[/i] available in exported projects. References " +"to [GLTFCamera] within a script will cause an error in an exported project." +msgstr "" + +#: modules/gltf/doc_classes/GLTFDocument.xml +msgid "" +"[b]Note:[/b] This class is only compiled in editor builds. Run-time glTF " +"loading and saving is [i]not[/i] available in exported projects. References " +"to [GLTFDocument] within a script will cause an error in an exported project." +msgstr "" + +#: modules/gltf/doc_classes/GLTFLight.xml +msgid "" +"[b]Note:[/b] This class is only compiled in editor builds. Run-time glTF " +"loading and saving is [i]not[/i] available in exported projects. References " +"to [GLTFLight] within a script will cause an error in an exported project." +msgstr "" + +#: modules/gltf/doc_classes/GLTFLight.xml +msgid "" +"The [Color] of the light. Defaults to white. A black color causes the light " +"to have no effect." +msgstr "" + +#: modules/gltf/doc_classes/GLTFLight.xml +msgid "" +"The inner angle of the cone in a spotlight. Must be less than or equal to " +"the outer cone angle.\n" +"Within this angle, the light is at full brightness. Between the inner and " +"outer cone angles, there is a transition from full brightness to zero " +"brightness. When creating a Godot [SpotLight], the ratio between the inner " +"and outer cone angles is used to calculate the attenuation of the light." +msgstr "" + +#: modules/gltf/doc_classes/GLTFLight.xml +msgid "" +"The intensity of the light. This is expressed in candelas (lumens per " +"steradian) for point and spot lights, and lux (lumens per m²) for " +"directional lights. When creating a Godot light, this value is converted to " +"a unitless multiplier." +msgstr "" + +#: modules/gltf/doc_classes/GLTFLight.xml +msgid "" +"The outer angle of the cone in a spotlight. Must be greater than or equal to " +"the inner angle.\n" +"At this angle, the light drops off to zero brightness. Between the inner and " +"outer cone angles, there is a transition from full brightness to zero " +"brightness. If this angle is a half turn, then the spotlight emits in all " +"directions. When creating a Godot [SpotLight], the outer cone angle is used " +"as the angle of the spotlight." +msgstr "" + +#: modules/gltf/doc_classes/GLTFLight.xml +msgid "" +"The range of the light, beyond which the light has no effect. GLTF lights " +"with no range defined behave like physical lights (which have infinite " +"range). When creating a Godot light, the range is clamped to 4096." +msgstr "" + +#: modules/gltf/doc_classes/GLTFLight.xml +msgid "" +"The type of the light. The values accepted by Godot are \"point\", \"spot\", " +"and \"directional\", which correspond to Godot's [OmniLight], [SpotLight], " +"and [DirectionalLight] respectively." +msgstr "" + +#: modules/gltf/doc_classes/GLTFMesh.xml +msgid "" +"[b]Note:[/b] This class is only compiled in editor builds. Run-time glTF " +"loading and saving is [i]not[/i] available in exported projects. References " +"to [GLTFMesh] within a script will cause an error in an exported project." +msgstr "" + +#: modules/gltf/doc_classes/GLTFNode.xml +msgid "" +"[b]Note:[/b] This class is only compiled in editor builds. Run-time glTF " +"loading and saving is [i]not[/i] available in exported projects. References " +"to [GLTFNode] within a script will cause an error in an exported project." +msgstr "" + +#: modules/gltf/doc_classes/GLTFSkeleton.xml +msgid "" +"[b]Note:[/b] This class is only compiled in editor builds. Run-time glTF " +"loading and saving is [i]not[/i] available in exported projects. References " +"to [GLTFSkeleton] within a script will cause an error in an exported project." +msgstr "" + +#: modules/gltf/doc_classes/GLTFSpecGloss.xml +msgid "" +"[b]Note:[/b] This class is only compiled in editor builds. Run-time glTF " +"loading and saving is [i]not[/i] available in exported projects. References " +"to [GLTFSpecGloss] within a script will cause an error in an exported " +"project." +msgstr "" + +#: modules/gltf/doc_classes/GLTFState.xml +msgid "" +"[b]Note:[/b] This class is only compiled in editor builds. Run-time glTF " +"loading and saving is [i]not[/i] available in exported projects. References " +"to [GLTFState] within a script will cause an error in an exported project." +msgstr "" + +#: modules/gltf/doc_classes/GLTFTexture.xml +msgid "" +"[b]Note:[/b] This class is only compiled in editor builds. Run-time glTF " +"loading and saving is [i]not[/i] available in exported projects. References " +"to [GLTFTexture] within a script will cause an error in an exported project." +msgstr "" + +#: modules/mono/doc_classes/GodotSharp.xml +msgid "Bridge between Godot and the Mono runtime (Mono-enabled builds only)." +msgstr "" + +#: modules/mono/doc_classes/GodotSharp.xml +msgid "" +"This class is a bridge between Godot and the Mono runtime. It exposes " +"several low-level operations and is only available in Mono-enabled Godot " +"builds.\n" +"See also [CSharpScript]." +msgstr "" + +#: modules/mono/doc_classes/GodotSharp.xml +msgid "Attaches the current thread to the Mono runtime." +msgstr "" + +#: modules/mono/doc_classes/GodotSharp.xml +msgid "Detaches the current thread from the Mono runtime." +msgstr "" + +#: modules/mono/doc_classes/GodotSharp.xml +msgid "" +"Returns the current MonoDomain ID.\n" +"[b]Note:[/b] The Mono runtime must be initialized for this method to work " +"(use [method is_runtime_initialized] to check). If the Mono runtime isn't " +"initialized at the time this method is called, the engine will crash." +msgstr "" + +#: modules/mono/doc_classes/GodotSharp.xml +msgid "" +"Returns the scripts MonoDomain's ID. This will be the same MonoDomain ID as " +"[method get_domain_id], unless the scripts domain isn't loaded.\n" +"[b]Note:[/b] The Mono runtime must be initialized for this method to work " +"(use [method is_runtime_initialized] to check). If the Mono runtime isn't " +"initialized at the time this method is called, the engine will crash." +msgstr "" + +#: modules/mono/doc_classes/GodotSharp.xml +msgid "" +"Returns [code]true[/code] if the domain is being finalized, [code]false[/" +"code] otherwise." +msgstr "" + +#: modules/mono/doc_classes/GodotSharp.xml +msgid "" +"Returns [code]true[/code] if the Mono runtime is initialized, [code]false[/" +"code] otherwise." +msgstr "" + +#: modules/mono/doc_classes/GodotSharp.xml +msgid "" +"Returns [code]true[/code] if the Mono runtime is shutting down, [code]false[/" +"code] otherwise." +msgstr "" + +#: modules/mono/doc_classes/GodotSharp.xml +msgid "" +"Returns [code]true[/code] if the scripts domain is loaded, [code]false[/" +"code] otherwise." +msgstr "" + +#: doc/classes/Gradient.xml +msgid "" +"A color interpolator resource which can be used to generate colors between " +"user-defined color points." +msgstr "" + +#: doc/classes/Gradient.xml +msgid "" +"Given a set of colors, this resource will interpolate them in order. This " +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." +msgstr "" + +#: doc/classes/Gradient.xml +msgid "" +"Adds the specified color to the end of the ramp, with the specified offset." +msgstr "" + +#: doc/classes/Gradient.xml +msgid "Returns the color of the ramp color at index [code]point[/code]." +msgstr "" + +#: doc/classes/Gradient.xml +msgid "Returns the offset of the ramp color at index [code]point[/code]." +msgstr "" + +#: doc/classes/Gradient.xml +msgid "Returns the number of colors in the ramp." +msgstr "" + +#: doc/classes/Gradient.xml +msgid "Returns the interpolated color specified by [code]offset[/code]." +msgstr "" + +#: doc/classes/Gradient.xml +msgid "Removes the color at the index [code]point[/code]." +msgstr "" + +#: doc/classes/Gradient.xml +msgid "Sets the color of the ramp color at index [code]point[/code]." +msgstr "" + +#: doc/classes/Gradient.xml +msgid "Sets the offset for the ramp color at index [code]point[/code]." +msgstr "" + +#: doc/classes/Gradient.xml +msgid "Gradient's colors returned as a [PoolColorArray]." +msgstr "" + +#: doc/classes/Gradient.xml +msgid "" +"Defines how the colors between points of the gradient are interpolated. See " +"[enum InterpolationMode] for available modes." +msgstr "" + +#: doc/classes/Gradient.xml +msgid "Gradient's offsets returned as a [PoolRealArray]." +msgstr "" + +#: doc/classes/Gradient.xml +msgid "" +"Constant interpolation, color changes abruptly at each point and stays " +"uniform between. This might cause visible aliasing when used for a gradient " +"texture in some cases." +msgstr "" + +#: doc/classes/GradientTexture.xml +msgid "Gradient-filled texture." +msgstr "" + +#: doc/classes/GradientTexture.xml +msgid "" +"GradientTexture uses a [Gradient] to fill the texture data. The gradient " +"will be filled from left to right using colors obtained from the gradient. " +"This means the texture does not necessarily represent an exact copy of the " +"gradient, but instead an interpolation of samples obtained from the gradient " +"at fixed steps (see [member width]). See also [GradientTexture2D] and " +"[CurveTexture]." +msgstr "" + +#: doc/classes/GradientTexture.xml +msgid "The [Gradient] that will be used to fill the texture." +msgstr "" + +#: doc/classes/GradientTexture.xml +msgid "The number of color samples that will be obtained from the [Gradient]." +msgstr "" + +#: doc/classes/GradientTexture2D.xml +msgid "Gradient-filled 2D texture." +msgstr "" + +#: doc/classes/GradientTexture2D.xml +msgid "" +"The texture uses a [Gradient] to fill the texture data in 2D space. The " +"gradient is filled according to the specified [member fill] and [member " +"repeat] types using colors obtained from the gradient. The texture does not " +"necessarily represent an exact copy of the gradient, but instead an " +"interpolation of samples obtained from the gradient at fixed steps (see " +"[member width] and [member height]). See also [GradientTexture] and " +"[CurveTexture]." +msgstr "" + +#: doc/classes/GradientTexture2D.xml +msgid "" +"The gradient fill type, one of the [enum Fill] values. The texture is filled " +"by interpolating colors starting from [member fill_from] to [member fill_to] " +"offsets." +msgstr "" + +#: doc/classes/GradientTexture2D.xml +msgid "" +"The initial offset used to fill the texture specified in UV coordinates." +msgstr "" + +#: doc/classes/GradientTexture2D.xml +msgid "The final offset used to fill the texture specified in UV coordinates." +msgstr "" + +#: doc/classes/GradientTexture2D.xml +msgid "The [Gradient] used to fill the texture." +msgstr "" + +#: doc/classes/GradientTexture2D.xml +msgid "" +"The number of vertical color samples that will be obtained from the " +"[Gradient], which also represents the texture's height." +msgstr "" + +#: doc/classes/GradientTexture2D.xml +msgid "" +"The gradient repeat type, one of the [enum Repeat] values. The texture is " +"filled starting from [member fill_from] to [member fill_to] offsets by " +"default, but the gradient fill can be repeated to cover the entire texture." +msgstr "" + +#: doc/classes/GradientTexture2D.xml +msgid "" +"If [code]true[/code], the generated texture will support high dynamic range " +"([constant Image.FORMAT_RGBAF] format). This allows for glow effects to work " +"if [member Environment.glow_enabled] is [code]true[/code]. If [code]false[/" +"code], the generated texture will use low dynamic range; overbright colors " +"will be clamped ([constant Image.FORMAT_RGBA8] format)." +msgstr "" + +#: doc/classes/GradientTexture2D.xml +msgid "" +"The number of horizontal color samples that will be obtained from the " +"[Gradient], which also represents the texture's width." +msgstr "" + +#: doc/classes/GradientTexture2D.xml +msgid "The colors are linearly interpolated in a straight line." +msgstr "" + +#: doc/classes/GradientTexture2D.xml +msgid "The colors are linearly interpolated in a circular pattern." +msgstr "" + +#: doc/classes/GradientTexture2D.xml +msgid "" +"The gradient fill is restricted to the range defined by [member fill_from] " +"to [member fill_to] offsets." +msgstr "" + +#: doc/classes/GradientTexture2D.xml +msgid "" +"The texture is filled starting from [member fill_from] to [member fill_to] " +"offsets, repeating the same pattern in both directions." +msgstr "" + +#: doc/classes/GradientTexture2D.xml +msgid "" +"The texture is filled starting from [member fill_from] to [member fill_to] " +"offsets, mirroring the pattern in both directions." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "" +"GraphEdit is an area capable of showing various GraphNodes. It manages " +"connection events between them." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "" +"GraphEdit manages the showing of GraphNodes it contains, as well as " +"connections and disconnections between them. Signals are sent for each of " +"these two events. Disconnection between GraphNode slots is disabled by " +"default.\n" +"It is greatly advised to enable low-processor usage mode (see [member OS." +"low_processor_usage_mode]) when using GraphEdits." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "" +"Makes possible the connection between two different slot types. The type is " +"defined with the [method GraphNode.set_slot] method." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "" +"Makes possible to disconnect nodes when dragging from the slot at the left " +"if it has the specified type." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "" +"Makes possible to disconnect nodes when dragging from the slot at the right " +"if it has the specified type." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "Removes all connections between nodes." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "" +"Create a connection between the [code]from_port[/code] slot of the " +"[code]from[/code] GraphNode and the [code]to_port[/code] slot of the " +"[code]to[/code] GraphNode. If the connection already exists, no connection " +"is created." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "" +"Removes the connection between the [code]from_port[/code] slot of the " +"[code]from[/code] GraphNode and the [code]to_port[/code] slot of the " +"[code]to[/code] GraphNode. If the connection does not exist, no connection " +"is removed." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "" +"Returns an Array containing the list of connections. A connection consists " +"in a structure of the form [code]{ from_port: 0, from: \"GraphNode name 0\", " +"to_port: 1, to: \"GraphNode name 1\" }[/code]." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "" +"Gets the [HBoxContainer] that contains the zooming and grid snap controls in " +"the top left of the graph. You can use this method to reposition the toolbar " +"or to add your own custom controls to it.\n" +"[b]Warning:[/b] This is a required internal node, removing and freeing it " +"may cause a crash. If you wish to hide it or any of its children, use their " +"[member CanvasItem.visible] property." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "" +"Returns [code]true[/code] if the [code]from_port[/code] slot of the " +"[code]from[/code] GraphNode is connected to the [code]to_port[/code] slot of " +"the [code]to[/code] GraphNode." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "Returns whether it's possible to connect slots of the specified types." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "" +"Makes it not possible to connect between two different slot types. The type " +"is defined with the [method GraphNode.set_slot] method." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "" +"Removes the possibility to disconnect nodes when dragging from the slot at " +"the left if it has the specified type." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "" +"Removes the possibility to disconnect nodes when dragging from the slot at " +"the right if it has the specified type." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "" +"Sets the coloration of the connection between [code]from[/code]'s " +"[code]from_port[/code] and [code]to[/code]'s [code]to_port[/code] with the " +"color provided in the [code]activity[/code] theme property." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "Sets the specified [code]node[/code] as the one selected." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "If [code]true[/code], the minimap is visible." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "The opacity of the minimap rectangle." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "" +"The size of the minimap rectangle. The map itself is based on the size of " +"the grid area and is scaled to fit this rectangle." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "" +"If [code]true[/code], enables disconnection of existing connections in the " +"GraphEdit by dragging the right end." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "The scroll offset." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "" +"If [code]true[/code], makes a label with the current zoom level visible. The " +"zoom value is displayed in percents." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "The snapping distance in pixels." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "If [code]true[/code], enables snapping." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "The current zoom value." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "The upper zoom limit." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "The lower zoom limit." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "The step of each zoom level." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "Emitted at the beginning of a GraphNode movement." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "Emitted at the end of a GraphNode movement." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "" +"Emitted when user dragging connection from input port into empty space of " +"the graph." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "" +"Emitted to the GraphEdit when the connection between the [code]from_slot[/" +"code] slot of the [code]from[/code] GraphNode and the [code]to_slot[/code] " +"slot of the [code]to[/code] GraphNode is attempted to be created." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "" +"Emitted when user dragging connection from output port into empty space of " +"the graph." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "Emitted when the user presses [code]Ctrl + C[/code]." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "" +"Emitted when a GraphNode is attempted to be removed from the GraphEdit. " +"Provides a list of node names to be removed (all selected nodes, excluding " +"nodes without closing button)." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "" +"Emitted to the GraphEdit when the connection between [code]from_slot[/code] " +"slot of [code]from[/code] GraphNode and [code]to_slot[/code] slot of " +"[code]to[/code] GraphNode is attempted to be removed." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "" +"Emitted when a GraphNode is attempted to be duplicated in the GraphEdit." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "Emitted when a GraphNode is selected." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "Emitted when the user presses [code]Ctrl + V[/code]." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "" +"Emitted when a popup is requested. Happens on right-clicking in the " +"GraphEdit. [code]position[/code] is the position of the mouse pointer when " +"the signal is sent." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "" +"Emitted when the scroll offset is changed by the user. It will not be " +"emitted when changed in code." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "Color of major grid lines." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "Color of minor grid lines." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "The fill color of the selection rectangle." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "The outline color of the selection rectangle." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "" +"The horizontal range within which a port can be grabbed (on both sides)." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "The vertical range within which a port can be grabbed (on both sides)." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "The icon for the zoom out button." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "The icon for the zoom in button." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "The icon for the zoom reset button." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "The icon for the snap toggle button." +msgstr "" + +#: doc/classes/GraphEdit.xml +msgid "The background drawn under the grid." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "" +"A GraphNode is a container with potentially several input and output slots " +"allowing connections between GraphNodes. Slots can have different, " +"incompatible types." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "" +"A GraphNode is a container. Each GraphNode can have several input and output " +"slots, sometimes referred to as ports, allowing connections between " +"GraphNodes. To add a slot to GraphNode, add any [Control]-derived child node " +"to it.\n" +"After adding at least one child to GraphNode new sections will be " +"automatically created in the Inspector called 'Slot'. When 'Slot' is " +"expanded you will see list with index number for each slot. You can click on " +"each of them to expand further.\n" +"In the Inspector you can enable (show) or disable (hide) slots. By default, " +"all slots are disabled so you may not see any slots on your GraphNode " +"initially. You can assign a type to each slot. Only slots of the same type " +"will be able to connect to each other. You can also assign colors to slots. " +"A tuple of input and output slots is defined for each GUI element included " +"in the GraphNode. Input connections are on the left and output connections " +"are on the right side of GraphNode. Only enabled slots are counted as " +"connections." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "Disables all input and output slots of the GraphNode." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "Disables input and output slot whose index is [code]idx[/code]." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "Returns the [Color] of the input connection [code]idx[/code]." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "" +"Returns the number of enabled input slots (connections) to the GraphNode." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "Returns the position of the input connection [code]idx[/code]." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "Returns the type of the input connection [code]idx[/code]." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "Returns the [Color] of the output connection [code]idx[/code]." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "" +"Returns the number of enabled output slots (connections) of the GraphNode." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "Returns the position of the output connection [code]idx[/code]." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "Returns the type of the output connection [code]idx[/code]." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "Returns the left (input) [Color] of the slot [code]idx[/code]." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "Returns the right (output) [Color] of the slot [code]idx[/code]." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "Returns the left (input) type of the slot [code]idx[/code]." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "Returns the right (output) type of the slot [code]idx[/code]." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "" +"Returns [code]true[/code] if left (input) side of the slot [code]idx[/code] " +"is enabled." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "" +"Returns [code]true[/code] if right (output) side of the slot [code]idx[/" +"code] is enabled." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "" +"Sets properties of the slot with ID [code]idx[/code].\n" +"If [code]enable_left[/code]/[code]right[/code], a port will appear and the " +"slot will be able to be connected from this side.\n" +"[code]type_left[/code]/[code]right[/code] is an arbitrary type of the port. " +"Only ports with the same type values can be connected.\n" +"[code]color_left[/code]/[code]right[/code] is the tint of the port's icon on " +"this side.\n" +"[code]custom_left[/code]/[code]right[/code] is a custom texture for this " +"side's port.\n" +"[b]Note:[/b] This method only sets properties of the slot. To create the " +"slot, add a [Control]-derived child to the GraphNode.\n" +"Individual properties can be set using one of the [code]set_slot_*[/code] " +"methods. You must enable at least one side of the slot to do so." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "" +"Sets the [Color] of the left (input) side of the slot [code]idx[/code] to " +"[code]color_left[/code]." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "" +"Sets the [Color] of the right (output) side of the slot [code]idx[/code] to " +"[code]color_right[/code]." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "" +"Toggles the left (input) side of the slot [code]idx[/code]. If " +"[code]enable_left[/code] is [code]true[/code], a port will appear on the " +"left side and the slot will be able to be connected from this side." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "" +"Toggles the right (output) side of the slot [code]idx[/code]. If " +"[code]enable_right[/code] is [code]true[/code], a port will appear on the " +"right side and the slot will be able to be connected from this side." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "" +"Sets the left (input) type of the slot [code]idx[/code] to [code]type_left[/" +"code]." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "" +"Sets the right (output) type of the slot [code]idx[/code] to " +"[code]type_right[/code]." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "If [code]true[/code], the GraphNode is a comment node." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "" +"The offset of the GraphNode, relative to the scroll offset of the " +"[GraphEdit].\n" +"[b]Note:[/b] You cannot use position directly, as [GraphEdit] is a " +"[Container]." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "Sets the overlay shown above the GraphNode. See [enum Overlay]." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "" +"If [code]true[/code], the user can resize the GraphNode.\n" +"[b]Note:[/b] Dragging the handle will only emit the [signal resize_request] " +"signal, the GraphNode needs to be resized manually." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "If [code]true[/code], the GraphNode is selected." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "" +"If [code]true[/code], the close button will be visible.\n" +"[b]Note:[/b] Pressing it will only emit the [signal close_request] signal, " +"the GraphNode needs to be removed manually." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "The text displayed in the GraphNode's title bar." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "" +"Emitted when the GraphNode is requested to be closed. Happens on clicking " +"the close button (see [member show_close])." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "Emitted when the GraphNode is dragged." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "Emitted when the GraphNode is moved." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "" +"Emitted when the GraphNode is requested to be displayed over other ones. " +"Happens on focusing (clicking into) the GraphNode." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "" +"Emitted when the GraphNode is requested to be resized. Happens on dragging " +"the resizer handle (see [member resizable])." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "Emitted when any GraphNode's slot is updated." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "No overlay is shown." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "Show overlay set in the [code]breakpoint[/code] theme property." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "Show overlay set in the [code]position[/code] theme property." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "The color modulation applied to the close button icon." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "The color modulation applied to the resizer icon." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "Color of the title text." +msgstr "" + +#: doc/classes/GraphNode.xml doc/classes/WindowDialog.xml +msgid "The vertical offset of the close button." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "Horizontal offset for the ports." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "The vertical distance between ports." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "Vertical offset of the title text." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "Font used for the title text." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "" +"The icon for the close button, visible when [member show_close] is enabled." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "The icon used for representing ports." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "The icon used for resizer, visible when [member resizable] is enabled." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "" +"The background used when [member overlay] is set to [constant " +"OVERLAY_BREAKPOINT]." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "The [StyleBox] used when [member comment] is enabled." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "" +"The [StyleBox] used when [member comment] is enabled and the [GraphNode] is " +"focused." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "The default background for [GraphNode]." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "" +"The background used when [member overlay] is set to [constant " +"OVERLAY_POSITION]." +msgstr "" + +#: doc/classes/GraphNode.xml +msgid "The background used when the [GraphNode] is selected." +msgstr "" + +#: doc/classes/GridContainer.xml +msgid "" +"Grid container used to arrange Control-derived children in a grid like " +"layout." +msgstr "" + +#: doc/classes/GridContainer.xml +msgid "" +"GridContainer will arrange its Control-derived children in a grid like " +"structure, the grid columns are specified using the [member columns] " +"property and the number of rows will be equal to the number of children in " +"the container divided by the number of columns. For example, if the " +"container has 5 children, and 2 columns, there will be 3 rows in the " +"container.\n" +"Notice that grid layout will preserve the columns and rows for every size of " +"the container, and that empty columns will be expanded automatically.\n" +"[b]Note:[/b] GridContainer only works with child nodes inheriting from " +"Control. It won't rearrange child nodes inheriting from Node2D." +msgstr "" + +#: doc/classes/GridContainer.xml +msgid "" +"The number of columns in the [GridContainer]. If modified, [GridContainer] " +"reorders its Control-derived children to accommodate the new layout." +msgstr "" + +#: doc/classes/GridContainer.xml doc/classes/HFlowContainer.xml +#: doc/classes/VFlowContainer.xml +msgid "The horizontal separation of children nodes." +msgstr "" + +#: doc/classes/GridContainer.xml doc/classes/HFlowContainer.xml +#: doc/classes/VFlowContainer.xml +msgid "The vertical separation of children nodes." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "Node for 3D tile-based maps." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "" +"GridMap lets you place meshes on a grid interactively. It works both from " +"the editor and from scripts, which can help you create in-game level " +"editors.\n" +"GridMaps use a [MeshLibrary] which contains a list of tiles. Each tile is a " +"mesh with materials plus optional collision and navigation shapes.\n" +"A GridMap contains a collection of cells. Each grid cell refers to a tile in " +"the [MeshLibrary]. All cells in the map have the same dimensions.\n" +"Internally, a GridMap is split into a sparse collection of octants for " +"efficient rendering and physics processing. Every octant has the same " +"dimensions and can contain several cells.\n" +"[b]Note:[/b] GridMap doesn't extend [VisualInstance] and therefore can't be " +"hidden or cull masked based on [member VisualInstance.layers]. If you make a " +"light not affect the first layer, the whole GridMap won't be lit by the " +"light in question." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "Using gridmaps" +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "Clear all cells." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "" +"Returns an array of [ArrayMesh]es and [Transform] references of all bake " +"meshes that exist within the current GridMap." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "" +"The [MeshLibrary] item index located at the grid-based X, Y and Z " +"coordinates. If the cell is empty, [constant INVALID_CELL_ITEM] will be " +"returned." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "" +"The orientation of the cell at the grid-based X, Y and Z coordinates. -1 is " +"returned if the cell is empty." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "Returns an individual bit on the [member collision_layer]." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "Returns an individual bit on the [member collision_mask]." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "" +"Returns an array of [Transform] and [Mesh] references corresponding to the " +"non-empty cells in the grid. The transforms are specified in world space." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "" +"Returns an array of [Vector3] with the non-empty cell coordinates in the " +"grid map." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "" +"Returns an array of all cells with the given item index specified in " +"[code]item[/code]." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "" +"Returns the position of a grid cell in the GridMap's local coordinate space." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "" +"Sets the mesh index for the cell referenced by its grid-based X, Y and Z " +"coordinates.\n" +"A negative item index such as [constant INVALID_CELL_ITEM] will clear the " +"cell.\n" +"Optionally, the item's orientation can be passed. For valid orientation " +"values, see [method Basis.get_orthogonal_index]." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "Sets an individual bit on the [member collision_layer]." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "Sets an individual bit on the [member collision_mask]." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "" +"Returns the coordinates of the grid cell containing the given point.\n" +"[code]pos[/code] should be in the GridMap's local coordinate space." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "" +"If [code]true[/code], this GridMap uses cell navmesh resources to create " +"navigation regions." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "If [code]true[/code], grid items are centered on the X axis." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "If [code]true[/code], grid items are centered on the Y axis." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "If [code]true[/code], grid items are centered on the Z axis." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "" +"The size of each octant measured in number of cells. This applies to all " +"three axis." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "" +"The scale of the cell items.\n" +"This does not affect the size of the grid cells themselves, only the items " +"in them. This can be used to make cell items overlap their neighbors." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "" +"The dimensions of the grid's cells.\n" +"This does not affect the size of the meshes. See [member cell_scale]." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "" +"The physics layers this GridMap is in.\n" +"GridMaps act as static bodies, meaning they aren't affected by gravity or " +"other forces. They only affect other physics bodies that collide with them." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "" +"The physics layers this GridMap detects collisions in. See [url=$DOCS_URL/" +"tutorials/physics/physics_introduction.html#collision-layers-and-" +"masks]Collision layers and masks[/url] in the documentation for more " +"information." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "The assigned [MeshLibrary]." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "The navigation layers the GridMap generates its navigation regions in." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "" +"Overrides the default friction and bounce physics properties for the whole " +"[GridMap]." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "" +"Controls whether this GridMap will be baked in a [BakedLightmap] or not." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "Emitted when [member cell_size] changes." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml +msgid "" +"Invalid cell item that can be used in [method set_cell_item] to clear cells " +"(or represent an empty cell in [method get_cell_item])." +msgstr "" + +#: doc/classes/GrooveJoint2D.xml +msgid "Groove constraint for 2D physics." +msgstr "" + +#: doc/classes/GrooveJoint2D.xml +msgid "" +"Groove constraint for 2D physics. This is useful for making a body \"slide\" " +"through a segment placed in another." +msgstr "" + +#: doc/classes/GrooveJoint2D.xml +msgid "" +"The body B's initial anchor position defined by the joint's origin and a " +"local offset [member initial_offset] along the joint's Y axis (along the " +"groove)." +msgstr "" + +#: doc/classes/GrooveJoint2D.xml +msgid "" +"The groove's length. The groove is from the joint's origin towards [member " +"length] along the joint's local Y axis." +msgstr "" + +#: doc/classes/HashingContext.xml +msgid "Context to compute cryptographic hashes over multiple iterations." +msgstr "" + +#: doc/classes/HashingContext.xml +msgid "" +"The HashingContext class provides an interface for computing cryptographic " +"hashes over multiple iterations. This is useful for example when computing " +"hashes of big files (so you don't have to load them all in memory), network " +"streams, and data streams in general (so you don't have to hold buffers).\n" +"The [enum HashType] enum shows the supported hashing algorithms.\n" +"[codeblock]\n" +"const CHUNK_SIZE = 1024\n" +"\n" +"func hash_file(path):\n" +" var ctx = HashingContext.new()\n" +" var file = File.new()\n" +" # Start a SHA-256 context.\n" +" ctx.start(HashingContext.HASH_SHA256)\n" +" # Check that file exists.\n" +" if not file.file_exists(path):\n" +" return\n" +" # Open the file to hash.\n" +" file.open(path, File.READ)\n" +" # Update the context after reading each chunk.\n" +" while not file.eof_reached():\n" +" ctx.update(file.get_buffer(CHUNK_SIZE))\n" +" # Get the computed hash.\n" +" var res = ctx.finish()\n" +" # Print the result as hex string and array.\n" +" printt(res.hex_encode(), Array(res))\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/HashingContext.xml +msgid "Closes the current context, and return the computed hash." +msgstr "" + +#: doc/classes/HashingContext.xml +msgid "" +"Starts a new hash computation of the given [code]type[/code] (e.g. [constant " +"HASH_SHA256] to start computation of a SHA-256)." +msgstr "" + +#: doc/classes/HashingContext.xml +msgid "Updates the computation with the given [code]chunk[/code] of data." +msgstr "" + +#: doc/classes/HashingContext.xml +msgid "Hashing algorithm: MD5." +msgstr "" + +#: doc/classes/HashingContext.xml +msgid "Hashing algorithm: SHA-1." +msgstr "" + +#: doc/classes/HashingContext.xml +msgid "Hashing algorithm: SHA-256." +msgstr "" + +#: doc/classes/HBoxContainer.xml +msgid "Horizontal box container." +msgstr "" + +#: doc/classes/HBoxContainer.xml +msgid "Horizontal box container. See [BoxContainer]." +msgstr "" + +#: doc/classes/HBoxContainer.xml +msgid "The horizontal space between the [HBoxContainer]'s elements." +msgstr "" + +#: doc/classes/HeightMapShape.xml +msgid "Height map shape for 3D physics." +msgstr "" + +#: doc/classes/HeightMapShape.xml +msgid "" +"Height map shape resource, which can be added to a [PhysicsBody] or [Area]." +msgstr "" + +#: doc/classes/HeightMapShape.xml +msgid "" +"Height map data, pool array must be of [member map_width] * [member " +"map_depth] size." +msgstr "" + +#: doc/classes/HeightMapShape.xml +msgid "" +"Number of vertices in the depth of the height map. Changing this will resize " +"the [member map_data]." +msgstr "" + +#: doc/classes/HeightMapShape.xml +msgid "" +"Number of vertices in the width of the height map. Changing this will resize " +"the [member map_data]." +msgstr "" + +#: doc/classes/HFlowContainer.xml +msgid "Horizontal flow container." +msgstr "" + +#: doc/classes/HFlowContainer.xml +msgid "Horizontal version of [FlowContainer]." +msgstr "" + +#: doc/classes/HingeJoint.xml +msgid "A hinge between two 3D PhysicsBodies." +msgstr "" + +#: doc/classes/HingeJoint.xml +msgid "" +"A HingeJoint normally uses the Z axis of body A as the hinge axis, another " +"axis can be specified when adding it manually though. See also " +"[Generic6DOFJoint]." +msgstr "" + +#: doc/classes/HingeJoint.xml doc/classes/Label3D.xml +#: doc/classes/SpriteBase3D.xml +msgid "Returns the value of the specified flag." +msgstr "" + +#: doc/classes/HingeJoint.xml doc/classes/ParticlesMaterial.xml +#: doc/classes/PinJoint.xml +msgid "Returns the value of the specified parameter." +msgstr "" + +#: doc/classes/HingeJoint.xml +msgid "If [code]true[/code], enables the specified flag." +msgstr "" + +#: doc/classes/HingeJoint.xml doc/classes/PinJoint.xml +msgid "Sets the value of the specified parameter." +msgstr "" + +#: doc/classes/HingeJoint.xml doc/classes/PhysicsServer.xml +msgid "" +"The speed with which the rotation across the axis perpendicular to the hinge " +"gets corrected." +msgstr "" + +#: doc/classes/HingeJoint.xml +msgid "" +"If [code]true[/code], the hinges maximum and minimum rotation, defined by " +"[member angular_limit/lower] and [member angular_limit/upper] has effects." +msgstr "" + +#: doc/classes/HingeJoint.xml +msgid "" +"The minimum rotation. Only active if [member angular_limit/enable] is " +"[code]true[/code]." +msgstr "" + +#: doc/classes/HingeJoint.xml doc/classes/PhysicsServer.xml +msgid "The lower this value, the more the rotation gets slowed down." +msgstr "" + +#: doc/classes/HingeJoint.xml +msgid "" +"The maximum rotation. Only active if [member angular_limit/enable] is " +"[code]true[/code]." +msgstr "" + +#: doc/classes/HingeJoint.xml +msgid "When activated, a motor turns the hinge." +msgstr "" + +#: doc/classes/HingeJoint.xml doc/classes/PhysicsServer.xml +msgid "Maximum acceleration for the motor." +msgstr "" + +#: doc/classes/HingeJoint.xml doc/classes/PhysicsServer.xml +msgid "Target speed for the motor." +msgstr "" + +#: doc/classes/HingeJoint.xml doc/classes/PhysicsServer.xml +msgid "" +"The speed with which the two bodies get pulled together when they move in " +"different directions." +msgstr "" + +#: doc/classes/HMACContext.xml +msgid "Used to create an HMAC for a message using a key." +msgstr "" + +#: doc/classes/HMACContext.xml +msgid "" +"The HMACContext class is useful for advanced HMAC use cases, such as " +"streaming the message as it supports creating the message over time rather " +"than providing it all at once.\n" +"[codeblock]\n" +"extends Node\n" +"var ctx = HMACContext.new()\n" +"\n" +"func _ready():\n" +" var key = \"supersecret\".to_utf8()\n" +" var err = ctx.start(HashingContext.HASH_SHA256, key)\n" +" assert(err == OK)\n" +" var msg1 = \"this is \".to_utf8()\n" +" var msg2 = \"super duper secret\".to_utf8()\n" +" err = ctx.update(msg1)\n" +" assert(err == OK)\n" +" err = ctx.update(msg2)\n" +" assert(err == OK)\n" +" var hmac = ctx.finish()\n" +" print(hmac.hex_encode())\n" +"[/codeblock]\n" +"And in C# we can use the following.\n" +"[codeblock]\n" +"using Godot;\n" +"using System;\n" +"using System.Diagnostics;\n" +"\n" +"public class CryptoNode : Node\n" +"{\n" +" private HMACContext ctx = new HMACContext();\n" +" public override void _Ready()\n" +" {\n" +" PoolByteArray key = String(\"supersecret\").to_utf8();\n" +" Error err = ctx.Start(HashingContext.HASH_SHA256, key);\n" +" GD.Assert(err == OK);\n" +" PoolByteArray msg1 = String(\"this is \").to_utf8();\n" +" PoolByteArray msg2 = String(\"super duper secret\").to_utf8();\n" +" err = ctx.Update(msg1);\n" +" GD.Assert(err == OK);\n" +" err = ctx.Update(msg2);\n" +" GD.Assert(err == OK);\n" +" PoolByteArray hmac = ctx.Finish();\n" +" GD.Print(hmac.HexEncode());\n" +" }\n" +"}\n" +"[/codeblock]\n" +"[b]Note:[/b] Not available in HTML5 exports." +msgstr "" + +#: doc/classes/HMACContext.xml +msgid "" +"Returns the resulting HMAC. If the HMAC failed, an empty [PoolByteArray] is " +"returned." +msgstr "" + +#: doc/classes/HMACContext.xml +msgid "" +"Initializes the HMACContext. This method cannot be called again on the same " +"HMACContext until [method finish] has been called." +msgstr "" + +#: doc/classes/HMACContext.xml +msgid "" +"Updates the message to be HMACed. This can be called multiple times before " +"[method finish] is called to append [code]data[/code] to the message, but " +"cannot be called until [method start] has been called." +msgstr "" + +#: doc/classes/HScrollBar.xml +msgid "Horizontal scroll bar." +msgstr "" + +#: doc/classes/HScrollBar.xml +msgid "" +"Horizontal version of [ScrollBar], which goes from left (min) to right (max)." +msgstr "" + +#: doc/classes/HScrollBar.xml +msgid "" +"Icon used as a button to scroll the [ScrollBar] left. Supports custom step " +"using the [member ScrollBar.custom_step] property." +msgstr "" + +#: doc/classes/HScrollBar.xml doc/classes/VScrollBar.xml +msgid "Displayed when the mouse cursor hovers over the decrement button." +msgstr "" + +#: doc/classes/HScrollBar.xml doc/classes/VScrollBar.xml +msgid "Displayed when the decrement button is being pressed." +msgstr "" + +#: doc/classes/HScrollBar.xml +msgid "" +"Icon used as a button to scroll the [ScrollBar] right. Supports custom step " +"using the [member ScrollBar.custom_step] property." +msgstr "" + +#: doc/classes/HScrollBar.xml doc/classes/VScrollBar.xml +msgid "Displayed when the mouse cursor hovers over the increment button." +msgstr "" + +#: doc/classes/HScrollBar.xml doc/classes/VScrollBar.xml +msgid "Displayed when the increment button is being pressed." +msgstr "" + +#: doc/classes/HScrollBar.xml doc/classes/VScrollBar.xml +msgid "" +"Used as texture for the grabber, the draggable element representing current " +"scroll." +msgstr "" + +#: doc/classes/HScrollBar.xml doc/classes/VScrollBar.xml +msgid "Used when the mouse hovers over the grabber." +msgstr "" + +#: doc/classes/HScrollBar.xml doc/classes/VScrollBar.xml +msgid "Used when the grabber is being dragged." +msgstr "" + +#: doc/classes/HScrollBar.xml doc/classes/VScrollBar.xml +msgid "Used as background of this [ScrollBar]." +msgstr "" + +#: doc/classes/HScrollBar.xml doc/classes/VScrollBar.xml +msgid "Used as background when the [ScrollBar] has the GUI focus." +msgstr "" + +#: doc/classes/HSeparator.xml +msgid "Horizontal separator." +msgstr "" + +#: doc/classes/HSeparator.xml +msgid "" +"Horizontal separator. See [Separator]. Even though it looks horizontal, it " +"is used to separate objects vertically." +msgstr "" + +#: doc/classes/HSeparator.xml +msgid "" +"The height of the area covered by the separator. Effectively works like a " +"minimum height." +msgstr "" + +#: doc/classes/HSeparator.xml +msgid "The style for the separator line. Works best with [StyleBoxLine]." +msgstr "" + +#: doc/classes/HSlider.xml +msgid "Horizontal slider." +msgstr "" + +#: doc/classes/HSlider.xml +msgid "" +"Horizontal slider. See [Slider]. This one goes from left (min) to right " +"(max).\n" +"[b]Note:[/b] The [signal Range.changed] and [signal Range.value_changed] " +"signals are part of the [Range] class which this class inherits from." +msgstr "" + +#: doc/classes/HSlider.xml doc/classes/VSlider.xml +msgid "The texture for the grabber (the draggable element)." +msgstr "" + +#: doc/classes/HSlider.xml doc/classes/VSlider.xml +msgid "The texture for the grabber when it's disabled." +msgstr "" + +#: doc/classes/HSlider.xml doc/classes/VSlider.xml +msgid "The texture for the grabber when it's focused." +msgstr "" + +#: doc/classes/HSlider.xml doc/classes/VSlider.xml +msgid "" +"The texture for the ticks, visible when [member Slider.tick_count] is " +"greater than 0." +msgstr "" + +#: doc/classes/HSlider.xml +msgid "The background of the area to the left of the grabber." +msgstr "" + +#: doc/classes/HSlider.xml +msgid "" +"The background for the whole slider. Determines the height of the " +"[code]grabber_area[/code]." +msgstr "" + +#: doc/classes/HSplitContainer.xml +msgid "Horizontal split container." +msgstr "" + +#: doc/classes/HSplitContainer.xml +msgid "" +"Horizontal split container. See [SplitContainer]. This goes from left to " +"right." +msgstr "" + +#: doc/classes/HSplitContainer.xml doc/classes/VSplitContainer.xml +msgid "" +"Boolean value. If 1 ([code]true[/code]), the grabber will hide automatically " +"when it isn't under the cursor. If 0 ([code]false[/code]), it's always " +"visible." +msgstr "" + +#: doc/classes/HSplitContainer.xml doc/classes/VSplitContainer.xml +msgid "The space between sides of the container." +msgstr "" + +#: doc/classes/HSplitContainer.xml doc/classes/VSplitContainer.xml +msgid "The icon used for the grabber drawn in the middle area." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "Low-level hyper-text transfer protocol client." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " +"to make HTTP requests to download web content, upload files and other data " +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" +"[b]Note:[/b] This client only needs to connect to a host once (see [method " +"connect_to_host]) to send multiple requests. Because of this, methods that " +"take URLs usually take just the part after the host instead of the full URL, " +"as the client is already connected to a host. See [method request] for a " +"full example and to get started.\n" +"A [HTTPClient] should be reused between multiple requests or to connect to " +"different hosts instead of creating one client per request. Supports SSL and " +"SSL server certificate verification. HTTP status codes in the 2xx range " +"indicate success, 3xx redirection (i.e. \"try again, but over here\"), 4xx " +"something was wrong with the request, and 5xx something went wrong on the " +"server's side.\n" +"For more information on HTTP, see https://developer.mozilla.org/en-US/docs/" +"Web/HTTP (or read RFC 2616 to get it straight from the source: https://tools." +"ietf.org/html/rfc2616).\n" +"[b]Note:[/b] When performing HTTP requests from a project exported to HTML5, " +"keep in mind the remote server may not allow requests from foreign origins " +"due to [url=https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS]CORS[/" +"url]. If you host the server in question, you should modify its backend to " +"allow requests from foreign origins by adding the [code]Access-Control-Allow-" +"Origin: *[/code] HTTP header.\n" +"[b]Note:[/b] SSL/TLS support is currently limited to TLS 1.0, TLS 1.1, and " +"TLS 1.2. Attempting to connect to a TLS 1.3-only server will return an " +"error.\n" +"[b]Warning:[/b] SSL/TLS certificate revocation and certificate pinning are " +"currently not supported. Revoked certificates are accepted as long as they " +"are otherwise valid. If this is a concern, you may want to use automatically " +"managed certificates with a short validity period." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "Closes the current connection, allowing reuse of this [HTTPClient]." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"Connects to a host. This needs to be done before any requests are sent.\n" +"The host should not have http:// prepended but will strip the protocol " +"identifier if provided.\n" +"If no [code]port[/code] is specified (or [code]-1[/code] is used), it is " +"automatically set to 80 for HTTP and 443 for HTTPS (if [code]use_ssl[/code] " +"is enabled).\n" +"[code]verify_host[/code] will check the SSL identity of the host if set to " +"[code]true[/code]." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"Returns the response's body length.\n" +"[b]Note:[/b] Some Web servers may not send a body length. In this case, the " +"value returned will be [code]-1[/code]. If using chunked transfer encoding, " +"the body length will also be [code]-1[/code]." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "Returns the response's HTTP status code." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "Returns the response headers." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"Returns all response headers as a Dictionary of structure [code]{ \"key\": " +"\"value1; value2\" }[/code] where the case-sensitivity of the keys and " +"values is kept like the server delivers it. A value is a simple String, this " +"string can have more than one value where \"; \" is used as separator.\n" +"[b]Example:[/b]\n" +"[codeblock]\n" +"{\n" +" \"content-length\": 12,\n" +" \"Content-Type\": \"application/json; charset=UTF-8\",\n" +"}\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"Returns a [enum Status] constant. Need to call [method poll] in order to get " +"status updates." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "If [code]true[/code], this [HTTPClient] has a response available." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "If [code]true[/code], this [HTTPClient] has a response that is chunked." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"This needs to be called in order to have any request processed. Check " +"results with [method get_status]." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"Generates a GET/POST application/x-www-form-urlencoded style query string " +"from a provided dictionary, e.g.:\n" +"[codeblock]\n" +"var fields = {\"username\": \"user\", \"password\": \"pass\"}\n" +"var query_string = http_client.query_string_from_dict(fields)\n" +"# Returns \"username=user&password=pass\"\n" +"[/codeblock]\n" +"Furthermore, if a key has a [code]null[/code] value, only the key itself is " +"added, without equal sign and value. If the value is an array, for each " +"value in it a pair with the same key is added.\n" +"[codeblock]\n" +"var fields = {\"single\": 123, \"not_valued\": null, \"multiple\": [22, 33, " +"44]}\n" +"var query_string = http_client.query_string_from_dict(fields)\n" +"# Returns \"single=123¬_valued&multiple=22&multiple=33&multiple=44\"\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "Reads one chunk from the response." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"Sends a request to the connected host.\n" +"The URL parameter is usually just the part after the host, so for " +"[code]http://somehost.com/index.php[/code], it is [code]/index.php[/code]. " +"When sending requests to an HTTP proxy server, it should be an absolute URL. " +"For [constant HTTPClient.METHOD_OPTIONS] requests, [code]*[/code] is also " +"allowed. For [constant HTTPClient.METHOD_CONNECT] requests, it should be the " +"authority component ([code]host:port[/code]).\n" +"Headers are HTTP request headers. For available HTTP methods, see [enum " +"Method].\n" +"To create a POST request with query strings to push to the server, do:\n" +"[codeblock]\n" +"var fields = {\"username\" : \"user\", \"password\" : \"pass\"}\n" +"var query_string = http_client.query_string_from_dict(fields)\n" +"var headers = [\"Content-Type: application/x-www-form-urlencoded\", " +"\"Content-Length: \" + str(query_string.length())]\n" +"var result = http_client.request(http_client.METHOD_POST, \"/index.php\", " +"headers, query_string)\n" +"[/codeblock]\n" +"[b]Note:[/b] The [code]request_data[/code] parameter is ignored if " +"[code]method[/code] is [constant HTTPClient.METHOD_GET]. This is because GET " +"methods can't contain request data. As a workaround, you can pass request " +"data as a query string in the URL. See [method String.http_escape] for an " +"example." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"Sends a raw request to the connected host.\n" +"The URL parameter is usually just the part after the host, so for " +"[code]http://somehost.com/index.php[/code], it is [code]/index.php[/code]. " +"When sending requests to an HTTP proxy server, it should be an absolute URL. " +"For [constant HTTPClient.METHOD_OPTIONS] requests, [code]*[/code] is also " +"allowed. For [constant HTTPClient.METHOD_CONNECT] requests, it should be the " +"authority component ([code]host:port[/code]).\n" +"Headers are HTTP request headers. For available HTTP methods, see [enum " +"Method].\n" +"Sends the body data raw, as a byte array and does not encode it in any way." +msgstr "" + +#: doc/classes/HTTPClient.xml doc/classes/HTTPRequest.xml +msgid "" +"Sets the proxy server for HTTP requests.\n" +"The proxy server is unset if [code]host[/code] is empty or [code]port[/code] " +"is -1." +msgstr "" + +#: doc/classes/HTTPClient.xml doc/classes/HTTPRequest.xml +msgid "" +"Sets the proxy server for HTTPS requests.\n" +"The proxy server is unset if [code]host[/code] is empty or [code]port[/code] " +"is -1." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"If [code]true[/code], execution will block until all data is read from the " +"response." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "The connection to use for this client." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"The size of the buffer used and maximum bytes to read per iteration. See " +"[method read_response_body_chunk]." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP GET method. The GET method requests a representation of the specified " +"resource. Requests using GET should only retrieve data." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP HEAD method. The HEAD method asks for a response identical to that of a " +"GET request, but without the response body. This is useful to request " +"metadata like HTTP headers or to check if a resource exists." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP POST method. The POST method is used to submit an entity to the " +"specified resource, often causing a change in state or side effects on the " +"server. This is often used for forms and submitting data or uploading files." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP PUT method. The PUT method asks to replace all current representations " +"of the target resource with the request payload. (You can think of POST as " +"\"create or update\" and PUT as \"update\", although many services tend to " +"not make a clear distinction or change their meaning)." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP DELETE method. The DELETE method requests to delete the specified " +"resource." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP OPTIONS method. The OPTIONS method asks for a description of the " +"communication options for the target resource. Rarely used." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP TRACE method. The TRACE method performs a message loop-back test along " +"the path to the target resource. Returns the entire HTTP request received in " +"the response body. Rarely used." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP CONNECT method. The CONNECT method establishes a tunnel to the server " +"identified by the target resource. Rarely used." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP PATCH method. The PATCH method is used to apply partial modifications " +"to a resource." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "Represents the size of the [enum Method] enum." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "Status: Disconnected from the server." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "Status: Currently resolving the hostname for the given URL into an IP." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "Status: DNS failure: Can't resolve the hostname for the given URL." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "Status: Currently connecting to server." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "Status: Can't connect to the server." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "Status: Connection established." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "Status: Currently sending request." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "Status: HTTP body received." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "Status: Error in HTTP connection." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "Status: Error in SSL handshake." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]100 Continue[/code]. Interim response that indicates " +"everything so far is OK and that the client should continue with the request " +"(or ignore this status if already finished)." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]101 Switching Protocol[/code]. Sent in response to an " +"[code]Upgrade[/code] request header by the client. Indicates the protocol " +"the server is switching to." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]102 Processing[/code] (WebDAV). Indicates that the " +"server has received and is processing the request, but no response is " +"available yet." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]200 OK[/code]. The request has succeeded. Default " +"response for successful requests. Meaning varies depending on the request. " +"GET: The resource has been fetched and is transmitted in the message body. " +"HEAD: The entity headers are in the message body. POST: The resource " +"describing the result of the action is transmitted in the message body. " +"TRACE: The message body contains the request message as received by the " +"server." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]201 Created[/code]. The request has succeeded and a " +"new resource has been created as a result of it. This is typically the " +"response sent after a PUT request." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]202 Accepted[/code]. The request has been received " +"but not yet acted upon. It is non-committal, meaning that there is no way in " +"HTTP to later send an asynchronous response indicating the outcome of " +"processing the request. It is intended for cases where another process or " +"server handles the request, or for batch processing." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]203 Non-Authoritative Information[/code]. This " +"response code means returned meta-information set is not exact set as " +"available from the origin server, but collected from a local or a third " +"party copy. Except this condition, 200 OK response should be preferred " +"instead of this response." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]204 No Content[/code]. There is no content to send " +"for this request, but the headers may be useful. The user-agent may update " +"its cached headers for this resource with the new ones." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]205 Reset Content[/code]. The server has fulfilled " +"the request and desires that the client resets the \"document view\" that " +"caused the request to be sent to its original state as received from the " +"origin server." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]206 Partial Content[/code]. This response code is " +"used because of a range header sent by the client to separate download into " +"multiple streams." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]207 Multi-Status[/code] (WebDAV). A Multi-Status " +"response conveys information about multiple resources in situations where " +"multiple status codes might be appropriate." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]208 Already Reported[/code] (WebDAV). Used inside a " +"DAV: propstat response element to avoid enumerating the internal members of " +"multiple bindings to the same collection repeatedly." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]226 IM Used[/code] (WebDAV). The server has fulfilled " +"a GET request for the resource, and the response is a representation of the " +"result of one or more instance-manipulations applied to the current instance." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]300 Multiple Choice[/code]. The request has more than " +"one possible responses and there is no standardized way to choose one of the " +"responses. User-agent or user should choose one of them." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]301 Moved Permanently[/code]. Redirection. This " +"response code means the URI of requested resource has been changed. The new " +"URI is usually included in the response." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]302 Found[/code]. Temporary redirection. This " +"response code means the URI of requested resource has been changed " +"temporarily. New changes in the URI might be made in the future. Therefore, " +"this same URI should be used by the client in future requests." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]303 See Other[/code]. The server is redirecting the " +"user agent to a different resource, as indicated by a URI in the Location " +"header field, which is intended to provide an indirect response to the " +"original request." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]304 Not Modified[/code]. A conditional GET or HEAD " +"request has been received and would have resulted in a 200 OK response if it " +"were not for the fact that the condition evaluated to [code]false[/code]." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]305 Use Proxy[/code]. [i]Deprecated. Do not use.[/i]" +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]306 Switch Proxy[/code]. [i]Deprecated. Do not use.[/" +"i]" +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]307 Temporary Redirect[/code]. The target resource " +"resides temporarily under a different URI and the user agent MUST NOT change " +"the request method if it performs an automatic redirection to that URI." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]308 Permanent Redirect[/code]. The target resource " +"has been assigned a new permanent URI and any future references to this " +"resource ought to use one of the enclosed URIs." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]400 Bad Request[/code]. The request was invalid. The " +"server cannot or will not process the request due to something that is " +"perceived to be a client error (e.g., malformed request syntax, invalid " +"request message framing, invalid request contents, or deceptive request " +"routing)." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]401 Unauthorized[/code]. Credentials required. The " +"request has not been applied because it lacks valid authentication " +"credentials for the target resource." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]402 Payment Required[/code]. This response code is " +"reserved for future use. Initial aim for creating this code was using it for " +"digital payment systems, however this is not currently used." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]403 Forbidden[/code]. The client does not have access " +"rights to the content, i.e. they are unauthorized, so server is rejecting to " +"give proper response. Unlike [code]401[/code], the client's identity is " +"known to the server." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]404 Not Found[/code]. The server can not find " +"requested resource. Either the URL is not recognized or the endpoint is " +"valid but the resource itself does not exist. May also be sent instead of " +"403 to hide existence of a resource if the client is not authorized." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]405 Method Not Allowed[/code]. The request's HTTP " +"method is known by the server but has been disabled and cannot be used. For " +"example, an API may forbid DELETE-ing a resource. The two mandatory methods, " +"GET and HEAD, must never be disabled and should not return this error code." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]406 Not Acceptable[/code]. The target resource does " +"not have a current representation that would be acceptable to the user " +"agent, according to the proactive negotiation header fields received in the " +"request. Used when negotiation content." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]407 Proxy Authentication Required[/code]. Similar to " +"401 Unauthorized, but it indicates that the client needs to authenticate " +"itself in order to use a proxy." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]408 Request Timeout[/code]. The server did not " +"receive a complete request message within the time that it was prepared to " +"wait." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]409 Conflict[/code]. The request could not be " +"completed due to a conflict with the current state of the target resource. " +"This code is used in situations where the user might be able to resolve the " +"conflict and resubmit the request." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]410 Gone[/code]. The target resource is no longer " +"available at the origin server and this condition is likely permanent." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]411 Length Required[/code]. The server refuses to " +"accept the request without a defined Content-Length header." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]412 Precondition Failed[/code]. One or more " +"conditions given in the request header fields evaluated to [code]false[/" +"code] when tested on the server." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]413 Entity Too Large[/code]. The server is refusing " +"to process a request because the request payload is larger than the server " +"is willing or able to process." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]414 Request-URI Too Long[/code]. The server is " +"refusing to service the request because the request-target is longer than " +"the server is willing to interpret." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]415 Unsupported Media Type[/code]. The origin server " +"is refusing to service the request because the payload is in a format not " +"supported by this method on the target resource." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]416 Requested Range Not Satisfiable[/code]. None of " +"the ranges in the request's Range header field overlap the current extent of " +"the selected resource or the set of ranges requested has been rejected due " +"to invalid ranges or an excessive request of small or overlapping ranges." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]417 Expectation Failed[/code]. The expectation given " +"in the request's Expect header field could not be met by at least one of the " +"inbound servers." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]418 I'm A Teapot[/code]. Any attempt to brew coffee " +"with a teapot should result in the error code \"418 I'm a teapot\". The " +"resulting entity body MAY be short and stout." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]421 Misdirected Request[/code]. The request was " +"directed at a server that is not able to produce a response. This can be " +"sent by a server that is not configured to produce responses for the " +"combination of scheme and authority that are included in the request URI." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]422 Unprocessable Entity[/code] (WebDAV). The server " +"understands the content type of the request entity (hence a 415 Unsupported " +"Media Type status code is inappropriate), and the syntax of the request " +"entity is correct (thus a 400 Bad Request status code is inappropriate) but " +"was unable to process the contained instructions." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]423 Locked[/code] (WebDAV). The source or destination " +"resource of a method is locked." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]424 Failed Dependency[/code] (WebDAV). The method " +"could not be performed on the resource because the requested action depended " +"on another action and that action failed." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]426 Upgrade Required[/code]. The server refuses to " +"perform the request using the current protocol but might be willing to do so " +"after the client upgrades to a different protocol." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]428 Precondition Required[/code]. The origin server " +"requires the request to be conditional." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]429 Too Many Requests[/code]. The user has sent too " +"many requests in a given amount of time (see \"rate limiting\"). Back off " +"and increase time between requests or try again later." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]431 Request Header Fields Too Large[/code]. The " +"server is unwilling to process the request because its header fields are too " +"large. The request MAY be resubmitted after reducing the size of the request " +"header fields." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]451 Response Unavailable For Legal Reasons[/code]. " +"The server is denying access to the resource as a consequence of a legal " +"demand." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]500 Internal Server Error[/code]. The server " +"encountered an unexpected condition that prevented it from fulfilling the " +"request." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]501 Not Implemented[/code]. The server does not " +"support the functionality required to fulfill the request." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]502 Bad Gateway[/code]. The server, while acting as a " +"gateway or proxy, received an invalid response from an inbound server it " +"accessed while attempting to fulfill the request. Usually returned by load " +"balancers or proxies." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]503 Service Unavailable[/code]. The server is " +"currently unable to handle the request due to a temporary overload or " +"scheduled maintenance, which will likely be alleviated after some delay. Try " +"again later." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]504 Gateway Timeout[/code]. The server, while acting " +"as a gateway or proxy, did not receive a timely response from an upstream " +"server it needed to access in order to complete the request. Usually " +"returned by load balancers or proxies." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]505 HTTP Version Not Supported[/code]. The server " +"does not support, or refuses to support, the major version of HTTP that was " +"used in the request message." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]506 Variant Also Negotiates[/code]. The server has an " +"internal configuration error: the chosen variant resource is configured to " +"engage in transparent content negotiation itself, and is therefore not a " +"proper end point in the negotiation process." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]507 Insufficient Storage[/code]. The method could not " +"be performed on the resource because the server is unable to store the " +"representation needed to successfully complete the request." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]508 Loop Detected[/code]. The server terminated an " +"operation because it encountered an infinite loop while processing a request " +"with \"Depth: infinity\". This status indicates that the entire operation " +"failed." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]510 Not Extended[/code]. The policy for accessing the " +"resource has not been met in the request. The server should send back all " +"the information necessary for the client to issue an extended request." +msgstr "" + +#: doc/classes/HTTPClient.xml +msgid "" +"HTTP status code [code]511 Network Authentication Required[/code]. The " +"client needs to authenticate to gain network access." +msgstr "" + +#: doc/classes/HTTPRequest.xml +msgid "A node with the ability to send HTTP(S) requests." +msgstr "" + +#: doc/classes/HTTPRequest.xml +msgid "" +"A node with the ability to send HTTP requests. Uses [HTTPClient] " +"internally.\n" +"Can be used to make HTTP requests, i.e. download or upload files or web " +"content via HTTP.\n" +"[b]Warning:[/b] See the notes and warnings on [HTTPClient] for limitations, " +"especially regarding SSL security.\n" +"[b]Example of contacting a REST API and printing one of its returned fields:" +"[/b]\n" +"[codeblock]\n" +"func _ready():\n" +" # Create an HTTP request node and connect its completion signal.\n" +" var http_request = HTTPRequest.new()\n" +" add_child(http_request)\n" +" http_request.connect(\"request_completed\", self, " +"\"_http_request_completed\")\n" +"\n" +" # Perform a GET request. The URL below returns JSON as of writing.\n" +" var error = http_request.request(\"https://httpbin.org/get\")\n" +" if error != OK:\n" +" push_error(\"An error occurred in the HTTP request.\")\n" +"\n" +" # Perform a POST request. The URL below returns JSON as of writing.\n" +" # Note: Don't make simultaneous requests using a single HTTPRequest " +"node.\n" +" # The snippet below is provided for reference only.\n" +" var body = to_json({\"name\": \"Godette\"})\n" +" error = http_request.request(\"https://httpbin.org/post\", [], true, " +"HTTPClient.METHOD_POST, body)\n" +" if error != OK:\n" +" push_error(\"An error occurred in the HTTP request.\")\n" +"\n" +"\n" +"# Called when the HTTP request is completed.\n" +"func _http_request_completed(result, response_code, headers, body):\n" +" var response = parse_json(body.get_string_from_utf8())\n" +"\n" +" # Will print the user agent string used by the HTTPRequest node (as " +"recognized by httpbin.org).\n" +" print(response.headers[\"User-Agent\"])\n" +"[/codeblock]\n" +"[b]Example of loading and displaying an image using HTTPRequest:[/b]\n" +"[codeblock]\n" +"func _ready():\n" +" # Create an HTTP request node and connect its completion signal.\n" +" var http_request = HTTPRequest.new()\n" +" add_child(http_request)\n" +" http_request.connect(\"request_completed\", self, " +"\"_http_request_completed\")\n" +"\n" +" # Perform the HTTP request. The URL below returns a PNG image as of " +"writing.\n" +" var error = http_request.request(\"https://via.placeholder.com/512\")\n" +" if error != OK:\n" +" push_error(\"An error occurred in the HTTP request.\")\n" +"\n" +"\n" +"# Called when the HTTP request is completed.\n" +"func _http_request_completed(result, response_code, headers, body):\n" +" var image = Image.new()\n" +" var error = image.load_png_from_buffer(body)\n" +" if error != OK:\n" +" push_error(\"Couldn't load the image.\")\n" +"\n" +" var texture = ImageTexture.new()\n" +" texture.create_from_image(image)\n" +"\n" +" # Display the image in a TextureRect node.\n" +" var texture_rect = TextureRect.new()\n" +" add_child(texture_rect)\n" +" texture_rect.texture = texture\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/HTTPRequest.xml +msgid "Cancels the current request." +msgstr "" + +#: doc/classes/HTTPRequest.xml +msgid "" +"Returns the response body length.\n" +"[b]Note:[/b] Some Web servers may not send a body length. In this case, the " +"value returned will be [code]-1[/code]. If using chunked transfer encoding, " +"the body length will also be [code]-1[/code]." +msgstr "" + +#: doc/classes/HTTPRequest.xml +msgid "Returns the amount of bytes this HTTPRequest downloaded." +msgstr "" + +#: doc/classes/HTTPRequest.xml +msgid "" +"Returns the current status of the underlying [HTTPClient]. See [enum " +"HTTPClient.Status]." +msgstr "" + +#: doc/classes/HTTPRequest.xml +msgid "" +"Creates request on the underlying [HTTPClient]. If there is no configuration " +"errors, it tries to connect using [method HTTPClient.connect_to_host] and " +"passes parameters onto [method HTTPClient.request].\n" +"Returns [constant OK] if request is successfully created. (Does not imply " +"that the server has responded), [constant ERR_UNCONFIGURED] if not in the " +"tree, [constant ERR_BUSY] if still processing previous request, [constant " +"ERR_INVALID_PARAMETER] if given string is not a valid URL format, or " +"[constant ERR_CANT_CONNECT] if not using thread and the [HTTPClient] cannot " +"connect to host.\n" +"[b]Note:[/b] When [code]method[/code] is [constant HTTPClient.METHOD_GET], " +"the payload sent via [code]request_data[/code] might be ignored by the " +"server or even cause the server to reject the request (check [url=https://" +"datatracker.ietf.org/doc/html/rfc7231#section-4.3.1]RFC 7231 section 4.3.1[/" +"url] for more details). As a workaround, you can send data as a query string " +"in the URL. See [method String.http_escape] for an example." +msgstr "" + +#: doc/classes/HTTPRequest.xml +msgid "" +"Creates request on the underlying [HTTPClient] using a raw array of bytes " +"for the request body. If there is no configuration errors, it tries to " +"connect using [method HTTPClient.connect_to_host] and passes parameters onto " +"[method HTTPClient.request].\n" +"Returns [constant OK] if request is successfully created. (Does not imply " +"that the server has responded), [constant ERR_UNCONFIGURED] if not in the " +"tree, [constant ERR_BUSY] if still processing previous request, [constant " +"ERR_INVALID_PARAMETER] if given string is not a valid URL format, or " +"[constant ERR_CANT_CONNECT] if not using thread and the [HTTPClient] cannot " +"connect to host." +msgstr "" + +#: doc/classes/HTTPRequest.xml +msgid "" +"Maximum allowed size for response bodies ([code]-1[/code] means no limit). " +"When only small files are expected, this can be used to prevent disallow " +"receiving files that are too large, preventing potential denial of service " +"attacks." +msgstr "" + +#: doc/classes/HTTPRequest.xml +msgid "" +"The size of the buffer used and maximum bytes to read per iteration. See " +"[member HTTPClient.read_chunk_size].\n" +"Set this to a lower value (e.g. 4096 for 4 KiB) when downloading small files " +"to decrease memory usage at the cost of download speeds." +msgstr "" + +#: doc/classes/HTTPRequest.xml +msgid "" +"The file to download into. If set to a non-empty string, the request output " +"will be written to the file located at the path. If a file already exists at " +"the specified location, it will be overwritten as soon as body data begins " +"to be received.\n" +"[b]Note:[/b] Folders are not automatically created when the file is created. " +"If [member download_file] points to a subfolder, it's recommended to create " +"the necessary folders beforehand using [method Directory.make_dir_recursive] " +"to ensure the file can be written." +msgstr "" + +#: doc/classes/HTTPRequest.xml +msgid "" +"Maximum number of allowed redirects. This is used to prevent endless " +"redirect loops." +msgstr "" + +#: doc/classes/HTTPRequest.xml +msgid "" +"If set to a value greater than [code]0.0[/code] before the request starts, " +"the HTTP request will time out after [code]timeout[/code] seconds have " +"passed and the request is not [i]completed[/i] yet. For small HTTP requests " +"such as REST API usage, set [member timeout] to a value between [code]10.0[/" +"code] and [code]30.0[/code] to prevent the application from getting stuck if " +"the request fails to get a response in a timely manner. For file downloads, " +"leave this to [code]0.0[/code] to prevent the download from failing if it " +"takes too much time." +msgstr "" + +#: doc/classes/HTTPRequest.xml +msgid "If [code]true[/code], multithreading is used to improve performance." +msgstr "" + +#: doc/classes/HTTPRequest.xml +msgid "Emitted when a request is completed." +msgstr "" + +#: doc/classes/HTTPRequest.xml +msgid "Request successful." +msgstr "" + +#: doc/classes/HTTPRequest.xml +msgid "Request failed while connecting." +msgstr "" + +#: doc/classes/HTTPRequest.xml +msgid "Request failed while resolving." +msgstr "" + +#: doc/classes/HTTPRequest.xml +msgid "Request failed due to connection (read/write) error." +msgstr "" + +#: doc/classes/HTTPRequest.xml +msgid "Request failed on SSL handshake." +msgstr "" + +#: doc/classes/HTTPRequest.xml +msgid "Request does not have a response (yet)." +msgstr "" + +#: doc/classes/HTTPRequest.xml +msgid "Request exceeded its maximum size limit, see [member body_size_limit]." +msgstr "" + +#: doc/classes/HTTPRequest.xml +msgid "Request failed (currently unused)." +msgstr "" + +#: doc/classes/HTTPRequest.xml +msgid "HTTPRequest couldn't open the download file." +msgstr "" + +#: doc/classes/HTTPRequest.xml +msgid "HTTPRequest couldn't write to the download file." +msgstr "" + +#: doc/classes/HTTPRequest.xml +msgid "Request reached its maximum redirect limit, see [member max_redirects]." +msgstr "" + +#: doc/classes/Image.xml +msgid "Image datatype." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Native image datatype. Contains image data which can be converted to an " +"[ImageTexture] and provides commonly used [i]image processing[/i] methods. " +"The maximum width and height for an [Image] are [constant MAX_WIDTH] and " +"[constant MAX_HEIGHT].\n" +"An [Image] cannot be assigned to a [code]texture[/code] property of an " +"object directly (such as [Sprite]), and has to be converted manually to an " +"[ImageTexture] first.\n" +"[b]Note:[/b] The maximum image size is 16384×16384 pixels due to graphics " +"hardware limitations. Larger images may fail to import." +msgstr "" + +#: doc/classes/Image.xml doc/classes/ImageTexture.xml +msgid "Importing images" +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Alpha-blends [code]src_rect[/code] from [code]src[/code] image to this image " +"at coordinates [code]dest[/code], clipped accordingly to both image bounds. " +"This image and [code]src[/code] image [b]must[/b] have the same format. " +"[code]src_rect[/code] with not positive size is treated as empty." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Alpha-blends [code]src_rect[/code] from [code]src[/code] image to this image " +"using [code]mask[/code] image at coordinates [code]dst[/code], clipped " +"accordingly to both image bounds. Alpha channels are required for both " +"[code]src[/code] and [code]mask[/code]. [code]dst[/code] pixels and " +"[code]src[/code] pixels will blend if the corresponding mask pixel's alpha " +"value is not 0. This image and [code]src[/code] image [b]must[/b] have the " +"same format. [code]src[/code] image and [code]mask[/code] image [b]must[/b] " +"have the same size (width and height) but they can have different formats. " +"[code]src_rect[/code] with not positive size is treated as empty." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Copies [code]src_rect[/code] from [code]src[/code] image to this image at " +"coordinates [code]dst[/code], clipped accordingly to both image bounds. This " +"image and [code]src[/code] image [b]must[/b] have the same format. " +"[code]src_rect[/code] with not positive size is treated as empty." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Blits [code]src_rect[/code] area from [code]src[/code] image to this image " +"at the coordinates given by [code]dst[/code], clipped accordingly to both " +"image bounds. [code]src[/code] pixel is copied onto [code]dst[/code] if the " +"corresponding [code]mask[/code] pixel's alpha value is not 0. This image and " +"[code]src[/code] image [b]must[/b] have the same format. [code]src[/code] " +"image and [code]mask[/code] image [b]must[/b] have the same size (width and " +"height) but they can have different formats. [code]src_rect[/code] with not " +"positive size is treated as empty." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Converts a bumpmap to a normalmap. A bumpmap provides a height offset per-" +"pixel, while a normalmap provides a normal direction per pixel." +msgstr "" + +#: doc/classes/Image.xml +msgid "Removes the image's mipmaps." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Compresses the image to use less memory. Can not directly access pixel data " +"while the image is compressed. Returns error if the chosen compression mode " +"is not available. See [enum CompressMode] and [enum CompressSource] " +"constants." +msgstr "" + +#: doc/classes/Image.xml +msgid "Converts the image's format. See [enum Format] constants." +msgstr "" + +#: doc/classes/Image.xml +msgid "Copies [code]src[/code] image to this image." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Creates an empty image of given size and format. See [enum Format] " +"constants. If [code]use_mipmaps[/code] is [code]true[/code] then generate " +"mipmaps for this image. See the [method generate_mipmaps]." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Creates a new image of given size and format. See [enum Format] constants. " +"Fills the image with the given raw data. If [code]use_mipmaps[/code] is " +"[code]true[/code] then loads mipmaps for this image from [code]data[/code]. " +"See [method generate_mipmaps]." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Crops the image to the given [code]width[/code] and [code]height[/code]. If " +"the specified size is larger than the current size, the extra area is filled " +"with black pixels." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Decompresses the image if it is compressed. Returns an error if decompress " +"function is not available." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Returns [constant ALPHA_BLEND] if the image has data for alpha values. " +"Returns [constant ALPHA_BIT] if all the alpha values are stored in a single " +"bit. Returns [constant ALPHA_NONE] if no data for alpha values is found." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Stretches the image and enlarges it by a factor of 2. No interpolation is " +"done." +msgstr "" + +#: doc/classes/Image.xml +msgid "Fills the image with [code]color[/code]." +msgstr "" + +#: doc/classes/Image.xml +msgid "Fills [code]rect[/code] with [code]color[/code]." +msgstr "" + +#: doc/classes/Image.xml +msgid "Blends low-alpha pixels with nearby pixels." +msgstr "" + +#: doc/classes/Image.xml +msgid "Flips the image horizontally." +msgstr "" + +#: doc/classes/Image.xml +msgid "Flips the image vertically." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Generates mipmaps for the image. Mipmaps are precalculated lower-resolution " +"copies of the image that are automatically used if the image needs to be " +"scaled down when rendered. They help improve image quality and performance " +"when rendering. This method returns an error if the image is compressed, in " +"a custom format, or if the image's width/height is [code]0[/code].\n" +"[b]Note:[/b] Mipmap generation is done on the CPU, is single-threaded and is " +"[i]always[/i] done on the main thread. This means generating mipmaps will " +"result in noticeable stuttering during gameplay, even if [method " +"generate_mipmaps] is called from a [Thread]." +msgstr "" + +#: doc/classes/Image.xml +msgid "Returns a copy of the image's raw data." +msgstr "" + +#: doc/classes/Image.xml +msgid "Returns the image's format. See [enum Format] constants." +msgstr "" + +#: doc/classes/Image.xml +msgid "Returns the image's height." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Returns the offset where the image's mipmap with index [code]mipmap[/code] " +"is stored in the [code]data[/code] dictionary." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Returns the color of the pixel at [code](x, y)[/code] if the image is " +"locked. If the image is unlocked, it always returns a [Color] with the value " +"[code](0, 0, 0, 1.0)[/code]. This is the same as [method get_pixelv], but " +"two integer arguments instead of a Vector2 argument." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Returns the color of the pixel at [code]src[/code] if the image is locked. " +"If the image is unlocked, it always returns a [Color] with the value [code]" +"(0, 0, 0, 1.0)[/code]. This is the same as [method get_pixel], but with a " +"Vector2 argument instead of two integer arguments." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Returns a new image that is a copy of the image's area specified with " +"[code]rect[/code]." +msgstr "" + +#: doc/classes/Image.xml +msgid "Returns the image's size (width and height)." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Returns a [Rect2] enclosing the visible portion of the image, considering " +"each pixel with a non-zero alpha channel as visible." +msgstr "" + +#: doc/classes/Image.xml +msgid "Returns the image's width." +msgstr "" + +#: doc/classes/Image.xml +msgid "Returns [code]true[/code] if the image has generated mipmaps." +msgstr "" + +#: doc/classes/Image.xml +msgid "Returns [code]true[/code] if the image is compressed." +msgstr "" + +#: doc/classes/Image.xml +msgid "Returns [code]true[/code] if the image has no data." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Returns [code]true[/code] if all the image's pixels have an alpha value of " +"0. Returns [code]false[/code] if any pixel has an alpha value higher than 0." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Loads an image from file [code]path[/code]. See [url=$DOCS_URL/tutorials/" +"assets_pipeline/importing_images.html#supported-image-formats]Supported " +"image formats[/url] for a list of supported image formats and limitations.\n" +"[b]Warning:[/b] This method should only be used in the editor or in cases " +"when you need to load external images at run-time, such as images located at " +"the [code]user://[/code] directory, and may not work in exported projects.\n" +"See also [ImageTexture] description for usage examples." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Loads an image from the binary contents of a BMP file.\n" +"[b]Note:[/b] Godot's BMP module doesn't support 16-bit per pixel images. " +"Only 1-bit, 4-bit, 8-bit, 24-bit, and 32-bit per pixel images are supported." +msgstr "" + +#: doc/classes/Image.xml +msgid "Loads an image from the binary contents of a JPEG file." +msgstr "" + +#: doc/classes/Image.xml +msgid "Loads an image from the binary contents of a PNG file." +msgstr "" + +#: doc/classes/Image.xml +msgid "Loads an image from the binary contents of a TGA file." +msgstr "" + +#: doc/classes/Image.xml +msgid "Loads an image from the binary contents of a WebP file." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Locks the data for reading and writing access. Sends an error to the console " +"if the image is not locked when reading or writing a pixel." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Converts the image's data to represent coordinates on a 3D plane. This is " +"used when the image represents a normalmap. A normalmap can add lots of " +"detail to a 3D surface without increasing the polygon count." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Multiplies color values with alpha values. Resulting color values for a " +"pixel are [code](color * alpha)/256[/code]." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Resizes the image to the given [code]width[/code] and [code]height[/code]. " +"New pixels are calculated using the [code]interpolation[/code] mode defined " +"via [enum Interpolation] constants." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Resizes the image to the nearest power of 2 for the width and height. If " +"[code]square[/code] is [code]true[/code] then set width and height to be the " +"same. New pixels are calculated using the [code]interpolation[/code] mode " +"defined via [enum Interpolation] constants." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Converts a standard RGBE (Red Green Blue Exponent) image to an sRGB image." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Saves the image as an EXR file to [code]path[/code]. If [code]grayscale[/" +"code] is [code]true[/code] and the image has only one channel, it will be " +"saved explicitly as monochrome rather than one red channel. This function " +"will return [constant ERR_UNAVAILABLE] if Godot was compiled without the " +"TinyEXR module.\n" +"[b]Note:[/b] The TinyEXR module is disabled in non-editor builds, which " +"means [method save_exr] will return [constant ERR_UNAVAILABLE] when it is " +"called from an exported project." +msgstr "" + +#: doc/classes/Image.xml +msgid "Saves the image as a PNG file to [code]path[/code]." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Sets the [Color] of the pixel at [code](x, y)[/code] if the image is locked. " +"Example:\n" +"[codeblock]\n" +"var img = Image.new()\n" +"img.create(img_width, img_height, false, Image.FORMAT_RGBA8)\n" +"img.lock()\n" +"img.set_pixel(x, y, color) # Works\n" +"img.unlock()\n" +"img.set_pixel(x, y, color) # Does not have an effect\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Sets the [Color] of the pixel at [code](dst.x, dst.y)[/code] if the image is " +"locked. Note that the [code]dst[/code] values must be integers. Example:\n" +"[codeblock]\n" +"var img = Image.new()\n" +"img.create(img_width, img_height, false, Image.FORMAT_RGBA8)\n" +"img.lock()\n" +"img.set_pixelv(Vector2(x, y), color) # Works\n" +"img.unlock()\n" +"img.set_pixelv(Vector2(x, y), color) # Does not have an effect\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Image.xml +msgid "Shrinks the image by a factor of 2." +msgstr "" + +#: doc/classes/Image.xml +msgid "Converts the raw data from the sRGB colorspace to a linear scale." +msgstr "" + +#: doc/classes/Image.xml +msgid "Unlocks the data and prevents changes." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Holds all the image's color data in a given format. See [enum Format] " +"constants." +msgstr "" + +#: doc/classes/Image.xml +msgid "The maximal width allowed for [Image] resources." +msgstr "" + +#: doc/classes/Image.xml +msgid "The maximal height allowed for [Image] resources." +msgstr "" + +#: doc/classes/Image.xml +msgid "Texture format with a single 8-bit depth representing luminance." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"OpenGL texture format with two values, luminance and alpha each stored with " +"8 bits." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"OpenGL texture format [code]RED[/code] with a single component and a " +"bitdepth of 8.\n" +"[b]Note:[/b] When using the GLES2 backend, this uses the alpha channel " +"instead of the red channel for storage." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"OpenGL texture format [code]RG[/code] with two components and a bitdepth of " +"8 for each." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"OpenGL texture format [code]RGB[/code] with three components, each with a " +"bitdepth of 8.\n" +"[b]Note:[/b] When creating an [ImageTexture], an sRGB to linear color space " +"conversion is performed." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"OpenGL texture format [code]RGBA[/code] with four components, each with a " +"bitdepth of 8.\n" +"[b]Note:[/b] When creating an [ImageTexture], an sRGB to linear color space " +"conversion is performed." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"OpenGL texture format [code]RGBA[/code] with four components, each with a " +"bitdepth of 4." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"OpenGL texture format [code]GL_RGB5_A1[/code] where 5 bits of depth for each " +"component of RGB and one bit for alpha." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"OpenGL texture format [code]GL_R32F[/code] where there's one component, a 32-" +"bit floating-point value." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"OpenGL texture format [code]GL_RG32F[/code] where there are two components, " +"each a 32-bit floating-point values." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"OpenGL texture format [code]GL_RGB32F[/code] where there are three " +"components, each a 32-bit floating-point values." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"OpenGL texture format [code]GL_RGBA32F[/code] where there are four " +"components, each a 32-bit floating-point values." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"OpenGL texture format [code]GL_R32F[/code] where there's one component, a 16-" +"bit \"half-precision\" floating-point value." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"OpenGL texture format [code]GL_RG32F[/code] where there are two components, " +"each a 16-bit \"half-precision\" floating-point value." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"OpenGL texture format [code]GL_RGB32F[/code] where there are three " +"components, each a 16-bit \"half-precision\" floating-point value." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"OpenGL texture format [code]GL_RGBA32F[/code] where there are four " +"components, each a 16-bit \"half-precision\" floating-point value." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"A special OpenGL texture format where the three color components have 9 bits " +"of precision and all three share a single 5-bit exponent." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"The [url=https://en.wikipedia.org/wiki/S3_Texture_Compression]S3TC[/url] " +"texture format that uses Block Compression 1, and is the smallest variation " +"of S3TC, only providing 1 bit of alpha and color data being premultiplied " +"with alpha.\n" +"[b]Note:[/b] When creating an [ImageTexture], an sRGB to linear color space " +"conversion is performed." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"The [url=https://en.wikipedia.org/wiki/S3_Texture_Compression]S3TC[/url] " +"texture format that uses Block Compression 2, and color data is interpreted " +"as not having been premultiplied by alpha. Well suited for images with sharp " +"alpha transitions between translucent and opaque areas.\n" +"[b]Note:[/b] When creating an [ImageTexture], an sRGB to linear color space " +"conversion is performed." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"The [url=https://en.wikipedia.org/wiki/S3_Texture_Compression]S3TC[/url] " +"texture format also known as Block Compression 3 or BC3 that contains 64 " +"bits of alpha channel data followed by 64 bits of DXT1-encoded color data. " +"Color data is not premultiplied by alpha, same as DXT3. DXT5 generally " +"produces superior results for transparent gradients compared to DXT3.\n" +"[b]Note:[/b] When creating an [ImageTexture], an sRGB to linear color space " +"conversion is performed." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Texture format that uses [url=https://www.khronos.org/opengl/wiki/" +"Red_Green_Texture_Compression]Red Green Texture Compression[/url], " +"normalizing the red channel data using the same compression algorithm that " +"DXT5 uses for the alpha channel." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Texture format that uses [url=https://www.khronos.org/opengl/wiki/" +"Red_Green_Texture_Compression]Red Green Texture Compression[/url], " +"normalizing the red and green channel data using the same compression " +"algorithm that DXT5 uses for the alpha channel." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Texture format that uses [url=https://www.khronos.org/opengl/wiki/" +"BPTC_Texture_Compression]BPTC[/url] compression with unsigned normalized " +"RGBA components.\n" +"[b]Note:[/b] When creating an [ImageTexture], an sRGB to linear color space " +"conversion is performed." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Texture format that uses [url=https://www.khronos.org/opengl/wiki/" +"BPTC_Texture_Compression]BPTC[/url] compression with signed floating-point " +"RGB components." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Texture format that uses [url=https://www.khronos.org/opengl/wiki/" +"BPTC_Texture_Compression]BPTC[/url] compression with unsigned floating-point " +"RGB components." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Texture format used on PowerVR-supported mobile platforms, uses 2-bit color " +"depth with no alpha. More information can be found [url=https://en.wikipedia." +"org/wiki/PVRTC]here[/url].\n" +"[b]Note:[/b] When creating an [ImageTexture], an sRGB to linear color space " +"conversion is performed." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Same as [url=https://en.wikipedia.org/wiki/PVRTC]PVRTC2[/url], but with an " +"alpha component." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Similar to [url=https://en.wikipedia.org/wiki/PVRTC]PVRTC2[/url], but with 4-" +"bit color depth and no alpha." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Same as [url=https://en.wikipedia.org/wiki/PVRTC]PVRTC4[/url], but with an " +"alpha component." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"[url=https://en.wikipedia.org/wiki/" +"Ericsson_Texture_Compression#ETC1]Ericsson Texture Compression format 1[/" +"url], also referred to as \"ETC1\", and is part of the OpenGL ES graphics " +"standard. This format cannot store an alpha channel." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"[url=https://en.wikipedia.org/wiki/" +"Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression " +"format 2[/url] ([code]R11_EAC[/code] variant), which provides one channel of " +"unsigned data." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"[url=https://en.wikipedia.org/wiki/" +"Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression " +"format 2[/url] ([code]SIGNED_R11_EAC[/code] variant), which provides one " +"channel of signed data." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"[url=https://en.wikipedia.org/wiki/" +"Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression " +"format 2[/url] ([code]RG11_EAC[/code] variant), which provides two channels " +"of unsigned data." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"[url=https://en.wikipedia.org/wiki/" +"Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression " +"format 2[/url] ([code]SIGNED_RG11_EAC[/code] variant), which provides two " +"channels of signed data." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"[url=https://en.wikipedia.org/wiki/" +"Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression " +"format 2[/url] ([code]RGB8[/code] variant), which is a follow-up of ETC1 and " +"compresses RGB888 data.\n" +"[b]Note:[/b] When creating an [ImageTexture], an sRGB to linear color space " +"conversion is performed." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"[url=https://en.wikipedia.org/wiki/" +"Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression " +"format 2[/url] ([code]RGBA8[/code]variant), which compresses RGBA8888 data " +"with full alpha support.\n" +"[b]Note:[/b] When creating an [ImageTexture], an sRGB to linear color space " +"conversion is performed." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"[url=https://en.wikipedia.org/wiki/" +"Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression " +"format 2[/url] ([code]RGB8_PUNCHTHROUGH_ALPHA1[/code] variant), which " +"compresses RGBA data to make alpha either fully transparent or fully " +"opaque.\n" +"[b]Note:[/b] When creating an [ImageTexture], an sRGB to linear color space " +"conversion is performed." +msgstr "" + +#: doc/classes/Image.xml +msgid "Represents the size of the [enum Format] enum." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Performs nearest-neighbor interpolation. If the image is resized, it will be " +"pixelated." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Performs bilinear interpolation. If the image is resized, it will be blurry. " +"This mode is faster than [constant INTERPOLATE_CUBIC], but it results in " +"lower quality." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Performs cubic interpolation. If the image is resized, it will be blurry. " +"This mode often gives better results compared to [constant " +"INTERPOLATE_BILINEAR], at the cost of being slower." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Performs bilinear separately on the two most-suited mipmap levels, then " +"linearly interpolates between them.\n" +"It's slower than [constant INTERPOLATE_BILINEAR], but produces higher-" +"quality results with far fewer aliasing artifacts.\n" +"If the image does not have mipmaps, they will be generated and used " +"internally, but no mipmaps will be generated on the resulting image.\n" +"[b]Note:[/b] If you intend to scale multiple copies of the original image, " +"it's better to call [method generate_mipmaps]] on it in advance, to avoid " +"wasting processing power in generating them again and again.\n" +"On the other hand, if the image already has mipmaps, they will be used, and " +"a new set will be generated for the resulting image." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Performs Lanczos interpolation. This is the slowest image resizing mode, but " +"it typically gives the best results, especially when downscalng images." +msgstr "" + +#: doc/classes/Image.xml +msgid "Image does not have alpha." +msgstr "" + +#: doc/classes/Image.xml +msgid "Image stores alpha in a single bit." +msgstr "" + +#: doc/classes/Image.xml +msgid "Image uses alpha." +msgstr "" + +#: doc/classes/Image.xml +msgid "Use S3TC compression." +msgstr "" + +#: doc/classes/Image.xml +msgid "Use PVRTC2 compression." +msgstr "" + +#: doc/classes/Image.xml +msgid "Use PVRTC4 compression." +msgstr "" + +#: doc/classes/Image.xml +msgid "Use ETC compression." +msgstr "" + +#: doc/classes/Image.xml +msgid "Use ETC2 compression." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Source texture (before compression) is a regular texture. Default for all " +"textures." +msgstr "" + +#: doc/classes/Image.xml +msgid "Source texture (before compression) is in sRGB space." +msgstr "" + +#: doc/classes/Image.xml +msgid "" +"Source texture (before compression) is a normal texture (e.g. it can be " +"compressed into two channels)." +msgstr "" + +#: doc/classes/Image.xml +msgid "Source texture (before compression) is a [TextureLayered]." +msgstr "" + +#: doc/classes/ImageTexture.xml +msgid "A [Texture] based on an [Image]." +msgstr "" + +#: doc/classes/ImageTexture.xml +msgid "" +"A [Texture] based on an [Image]. For an image to be displayed, an " +"[ImageTexture] has to be created from it using the [method " +"create_from_image] method:\n" +"[codeblock]\n" +"var texture = ImageTexture.new()\n" +"var image = Image.new()\n" +"image.load(\"res://icon.png\")\n" +"texture.create_from_image(image)\n" +"$Sprite.texture = texture\n" +"[/codeblock]\n" +"This way, textures can be created at run-time by loading images both from " +"within the editor and externally.\n" +"[b]Warning:[/b] Prefer to load imported textures with [method @GDScript." +"load] over loading them from within the filesystem dynamically with [method " +"Image.load], as it may not work in exported projects:\n" +"[codeblock]\n" +"var texture = load(\"res://icon.png\")\n" +"$Sprite.texture = texture\n" +"[/codeblock]\n" +"This is because images have to be imported as [StreamTexture] first to be " +"loaded with [method @GDScript.load]. If you'd still like to load an image " +"file just like any other [Resource], import it as an [Image] resource " +"instead, and then load it normally using the [method @GDScript.load] " +"method.\n" +"But do note that the image data can still be retrieved from an imported " +"texture as well using the [method Texture.get_data] method, which returns a " +"copy of the data:\n" +"[codeblock]\n" +"var texture = load(\"res://icon.png\")\n" +"var image : Image = texture.get_data()\n" +"[/codeblock]\n" +"An [ImageTexture] is not meant to be operated from within the editor " +"interface directly, and is mostly useful for rendering images on screen " +"dynamically via code. If you need to generate images procedurally from " +"within the editor, consider saving and importing images as custom texture " +"resources implementing a new [EditorImportPlugin].\n" +"[b]Note:[/b] The maximum texture size is 16384×16384 pixels due to graphics " +"hardware limitations." +msgstr "" + +#: doc/classes/ImageTexture.xml +msgid "" +"Create a new [ImageTexture] with [code]width[/code] and [code]height[/" +"code].\n" +"[code]format[/code] is a value from [enum Image.Format], [code]flags[/code] " +"is any combination of [enum Texture.Flags]." +msgstr "" + +#: doc/classes/ImageTexture.xml +msgid "" +"Initializes the texture by allocating and setting the data from an [Image] " +"with [code]flags[/code] from [enum Texture.Flags]. An sRGB to linear color " +"space conversion can take place, according to [enum Image.Format]." +msgstr "" + +#: doc/classes/ImageTexture.xml +msgid "Returns the format of the texture, one of [enum Image.Format]." +msgstr "" + +#: doc/classes/ImageTexture.xml +msgid "" +"Loads an image from a file path and creates a texture from it.\n" +"[b]Note:[/b] This method is deprecated and will be removed in Godot 4.0, use " +"[method Image.load] and [method create_from_image] instead." +msgstr "" + +#: doc/classes/ImageTexture.xml +msgid "" +"Replaces the texture's data with a new [Image].\n" +"[b]Note:[/b] The texture has to be initialized first with the [method " +"create_from_image] method before it can be updated. The new image " +"dimensions, format, and mipmaps configuration should match the existing " +"texture's image configuration, otherwise it has to be re-created with the " +"[method create_from_image] method.\n" +"Use this method over [method create_from_image] if you need to update the " +"texture frequently, which is faster than allocating additional memory for a " +"new texture each time." +msgstr "" + +#: doc/classes/ImageTexture.xml doc/classes/VisualServer.xml +msgid "Resizes the texture to the specified dimensions." +msgstr "" + +#: doc/classes/ImageTexture.xml +msgid "The storage quality for [constant STORAGE_COMPRESS_LOSSY]." +msgstr "" + +#: doc/classes/ImageTexture.xml +msgid "The storage type (raw, lossy, or compressed)." +msgstr "" + +#: doc/classes/ImageTexture.xml +msgid "[Image] data is stored raw and unaltered." +msgstr "" + +#: doc/classes/ImageTexture.xml +msgid "" +"[Image] data is compressed with a lossy algorithm. You can set the storage " +"quality with [member lossy_quality]." +msgstr "" + +#: doc/classes/ImageTexture.xml +msgid "[Image] data is compressed with a lossless algorithm." +msgstr "" + +#: doc/classes/ImmediateGeometry.xml +msgid "Draws simple geometry from code." +msgstr "" + +#: doc/classes/ImmediateGeometry.xml +msgid "" +"Draws simple geometry from code. Uses a drawing mode similar to OpenGL 1.x.\n" +"See also [ArrayMesh], [MeshDataTool] and [SurfaceTool] for procedural " +"geometry generation.\n" +"[b]Note:[/b] ImmediateGeometry3D is best suited to small amounts of mesh " +"data that change every frame. It will be slow when handling large amounts of " +"mesh data. If mesh data doesn't change often, use [ArrayMesh], " +"[MeshDataTool] or [SurfaceTool] instead.\n" +"[b]Note:[/b] Godot uses clockwise [url=https://learnopengl.com/Advanced-" +"OpenGL/Face-culling]winding order[/url] for front faces of triangle " +"primitive modes.\n" +"[b]Note:[/b] In case of missing points when handling large amounts of mesh " +"data, try increasing its buffer size limit under [member ProjectSettings." +"rendering/limits/buffers/immediate_buffer_size_kb]." +msgstr "" + +#: doc/classes/ImmediateGeometry.xml +msgid "" +"Simple helper to draw an UV sphere with given latitude, longitude and radius." +msgstr "" + +#: doc/classes/ImmediateGeometry.xml +msgid "" +"Adds a vertex in local coordinate space with the currently set color/uv/etc." +msgstr "" + +#: doc/classes/ImmediateGeometry.xml +msgid "" +"Begin drawing (and optionally pass a texture override). When done call " +"[method end]. For more information on how this works, search for " +"[code]glBegin()[/code] and [code]glEnd()[/code] references.\n" +"For the type of primitive, see the [enum Mesh.PrimitiveType] enum." +msgstr "" + +#: doc/classes/ImmediateGeometry.xml +msgid "Clears everything that was drawn using begin/end." +msgstr "" + +#: doc/classes/ImmediateGeometry.xml +msgid "Ends a drawing context and displays the results." +msgstr "" + +#: doc/classes/ImmediateGeometry.xml +msgid "The current drawing color." +msgstr "" + +#: doc/classes/ImmediateGeometry.xml +msgid "The next vertex's normal." +msgstr "" + +#: doc/classes/ImmediateGeometry.xml +msgid "The next vertex's tangent (and binormal facing)." +msgstr "" + +#: doc/classes/ImmediateGeometry.xml +msgid "The next vertex's UV." +msgstr "" + +#: doc/classes/ImmediateGeometry.xml +msgid "The next vertex's second layer UV." +msgstr "" + +#: doc/classes/Input.xml +msgid "A singleton that deals with inputs." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"A singleton that deals with inputs. This includes key presses, mouse buttons " +"and movement, joypads, and input actions. Actions and their events can be " +"set in the [b]Input Map[/b] tab in the [b]Project > Project Settings[/b], or " +"with the [InputMap] class." +msgstr "" + +#: doc/classes/Input.xml +msgid "Inputs tutorial index" +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"This will simulate pressing the specified action.\n" +"The strength can be used for non-boolean actions, it's ranged between 0 and " +"1 representing the intensity of the given action.\n" +"[b]Note:[/b] This method will not cause any [method Node._input] calls. It " +"is intended to be used with [method is_action_pressed] and [method " +"is_action_just_pressed]. If you want to simulate [code]_input[/code], use " +"[method parse_input_event] instead." +msgstr "" + +#: doc/classes/Input.xml +msgid "If the specified action is already pressed, this will release it." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Adds a new mapping entry (in SDL2 format) to the mapping database. " +"Optionally update already connected devices." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Sends all input events which are in the current buffer to the game loop. " +"These events may have been buffered as a result of accumulated input " +"([member use_accumulated_input]) or agile input flushing ([member " +"ProjectSettings.input_devices/buffering/agile_event_flushing]).\n" +"The engine will already do this itself at key execution points (at least " +"once per frame). However, this can be useful in advanced cases where you " +"want precise control over the timing of event handling." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Returns the acceleration of the device's accelerometer sensor, if the device " +"has one. Otherwise, the method returns [constant Vector3.ZERO].\n" +"Note this method returns an empty [Vector3] when running from the editor " +"even when your device has an accelerometer. You must export your project to " +"a supported device to read values from the accelerometer.\n" +"[b]Note:[/b] This method only works on iOS, Android, and UWP. On other " +"platforms, it always returns [constant Vector3.ZERO]. On Android the unit of " +"measurement for each axis is m/s² while on iOS and UWP it's a multiple of " +"the Earth's gravitational acceleration [code]g[/code] (~9.81 m/s²)." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Returns a value between 0 and 1 representing the raw intensity of the given " +"action, ignoring the action's deadzone. In most cases, you should use " +"[method get_action_strength] instead.\n" +"If [code]exact[/code] is [code]false[/code], it ignores additional input " +"modifiers for [InputEventKey] and [InputEventMouseButton] events, and the " +"direction for [InputEventJoypadMotion] events." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Returns a value between 0 and 1 representing the intensity of the given " +"action. In a joypad, for example, the further away the axis (analog sticks " +"or L2, R2 triggers) is from the dead zone, the closer the value will be to " +"1. If the action is mapped to a control that has no axis as the keyboard, " +"the value returned will be 0 or 1.\n" +"If [code]exact[/code] is [code]false[/code], it ignores additional input " +"modifiers for [InputEventKey] and [InputEventMouseButton] events, and the " +"direction for [InputEventJoypadMotion] events." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Get axis input by specifying two actions, one negative and one positive.\n" +"This is a shorthand for writing [code]Input." +"get_action_strength(\"positive_action\") - Input." +"get_action_strength(\"negative_action\")[/code]." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Returns an [Array] containing the device IDs of all currently connected " +"joypads." +msgstr "" + +#: doc/classes/Input.xml +msgid "Returns the currently assigned cursor shape (see [enum CursorShape])." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Returns the gravity of the device's accelerometer sensor, if the device has " +"one. Otherwise, the method returns [constant Vector3.ZERO].\n" +"[b]Note:[/b] This method only works on Android and iOS. On other platforms, " +"it always returns [constant Vector3.ZERO]. On Android the unit of " +"measurement for each axis is m/s² while on iOS it's a multiple of the " +"Earth's gravitational acceleration [code]g[/code] (~9.81 m/s²)." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Returns the rotation rate in rad/s around a device's X, Y, and Z axes of the " +"gyroscope sensor, if the device has one. Otherwise, the method returns " +"[constant Vector3.ZERO].\n" +"[b]Note:[/b] This method only works on Android and iOS. On other platforms, " +"it always returns [constant Vector3.ZERO]." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Returns the current value of the joypad axis at given index (see [enum " +"JoystickList])." +msgstr "" + +#: doc/classes/Input.xml +msgid "Returns the index of the provided axis name." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Receives a [enum JoystickList] axis and returns its equivalent name as a " +"string." +msgstr "" + +#: doc/classes/Input.xml +msgid "Returns the index of the provided button name." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Receives a gamepad button from [enum JoystickList] and returns its " +"equivalent name as a string." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Returns a SDL2-compatible device GUID on platforms that use gamepad " +"remapping. Returns [code]\"Default Gamepad\"[/code] otherwise." +msgstr "" + +#: doc/classes/Input.xml +msgid "Returns the name of the joypad at the specified device index." +msgstr "" + +#: doc/classes/Input.xml +msgid "Returns the duration of the current vibration effect in seconds." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Returns the strength of the joypad vibration: x is the strength of the weak " +"motor, and y is the strength of the strong motor." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Returns the mouse speed for the last time the cursor was moved, and this " +"until the next frame where the mouse moves. This means that even if the " +"mouse is not moving, this function will still return the value of the last " +"motion." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Returns the magnetic field strength in micro-Tesla for all axes of the " +"device's magnetometer sensor, if the device has one. Otherwise, the method " +"returns [constant Vector3.ZERO].\n" +"[b]Note:[/b] This method only works on Android, iOS and UWP. On other " +"platforms, it always returns [constant Vector3.ZERO]." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Returns mouse buttons as a bitmask. If multiple mouse buttons are pressed at " +"the same time, the bits are added together." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Gets an input vector by specifying four actions for the positive and " +"negative X and Y axes.\n" +"This method is useful when getting vector input, such as from a joystick, " +"directional pad, arrows, or WASD. The vector has its length limited to 1 and " +"has a circular deadzone, which is useful for using vector input as " +"movement.\n" +"By default, the deadzone is automatically calculated from the average of the " +"action deadzones. However, you can override the deadzone to be whatever you " +"want (on the range of 0 to 1)." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Returns [code]true[/code] when the user starts pressing the action event, " +"meaning it's [code]true[/code] only on the frame that the user pressed down " +"the button.\n" +"This is useful for code that needs to run only once when an action is " +"pressed, instead of every frame while it's pressed.\n" +"If [code]exact[/code] is [code]false[/code], it ignores additional input " +"modifiers for [InputEventKey] and [InputEventMouseButton] events, and the " +"direction for [InputEventJoypadMotion] events.\n" +"[b]Note:[/b] Due to keyboard ghosting, [method is_action_just_pressed] may " +"return [code]false[/code] even if one of the action's keys is pressed. See " +"[url=$DOCS_URL/tutorials/inputs/input_examples.html#keyboard-events]Input " +"examples[/url] in the documentation for more information." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Returns [code]true[/code] when the user stops pressing the action event, " +"meaning it's [code]true[/code] only on the frame that the user released the " +"button.\n" +"If [code]exact[/code] is [code]false[/code], it ignores additional input " +"modifiers for [InputEventKey] and [InputEventMouseButton] events, and the " +"direction for [InputEventJoypadMotion] events." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Returns [code]true[/code] if you are pressing the action event. Note that if " +"an action has multiple buttons assigned and more than one of them is " +"pressed, releasing one button will release the action, even if some other " +"button assigned to this action is still pressed.\n" +"If [code]exact[/code] is [code]false[/code], it ignores additional input " +"modifiers for [InputEventKey] and [InputEventMouseButton] events, and the " +"direction for [InputEventJoypadMotion] events.\n" +"[b]Note:[/b] Due to keyboard ghosting, [method is_action_pressed] may return " +"[code]false[/code] even if one of the action's keys is pressed. See " +"[url=$DOCS_URL/tutorials/inputs/input_examples.html#keyboard-events]Input " +"examples[/url] in the documentation for more information." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Returns [code]true[/code] if you are pressing the joypad button (see [enum " +"JoystickList])." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Returns [code]true[/code] if the system knows the specified device. This " +"means that it sets all button and axis indices exactly as defined in [enum " +"JoystickList]. Unknown joypads are not expected to match these constants, " +"but you can still retrieve events from them." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Returns [code]true[/code] if you are pressing the key in the current " +"keyboard layout. You can pass a [enum KeyList] constant.\n" +"[method is_key_pressed] is only recommended over [method " +"is_physical_key_pressed] in non-game applications. This ensures that " +"shortcut keys behave as expected depending on the user's keyboard layout, as " +"keyboard shortcuts are generally dependent on the keyboard layout in non-" +"game applications. If in doubt, use [method is_physical_key_pressed].\n" +"[b]Note:[/b] Due to keyboard ghosting, [method is_key_pressed] may return " +"[code]false[/code] even if one of the action's keys is pressed. See " +"[url=$DOCS_URL/tutorials/inputs/input_examples.html#keyboard-events]Input " +"examples[/url] in the documentation for more information." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Returns [code]true[/code] if you are pressing the mouse button specified " +"with [enum ButtonList]." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Returns [code]true[/code] if you are pressing the key in the physical " +"location on the 101/102-key US QWERTY keyboard. You can pass a [enum " +"KeyList] constant.\n" +"[method is_physical_key_pressed] is recommended over [method is_key_pressed] " +"for in-game actions, as it will make W/A/S/D layouts work regardless of the " +"user's keyboard layout. [method is_physical_key_pressed] will also ensure " +"that the top row number keys work on any keyboard layout. If in doubt, use " +"[method is_physical_key_pressed].\n" +"[b]Note:[/b] Due to keyboard ghosting, [method is_physical_key_pressed] may " +"return [code]false[/code] even if one of the action's keys is pressed. See " +"[url=$DOCS_URL/tutorials/inputs/input_examples.html#keyboard-events]Input " +"examples[/url] in the documentation for more information." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Notifies the [Input] singleton that a connection has changed, to update the " +"state for the [code]device[/code] index.\n" +"This is used internally and should not have to be called from user scripts. " +"See [signal joy_connection_changed] for the signal emitted when this is " +"triggered internally." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Feeds an [InputEvent] to the game. Can be used to artificially trigger input " +"events from code. Also generates [method Node._input] calls.\n" +"Example:\n" +"[codeblock]\n" +"var a = InputEventAction.new()\n" +"a.action = \"ui_cancel\"\n" +"a.pressed = true\n" +"Input.parse_input_event(a)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Removes all mappings from the internal database that match the given GUID." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Sets the acceleration value of the accelerometer sensor. Can be used for " +"debugging on devices without a hardware sensor, for example in an editor on " +"a PC.\n" +"[b]Note:[/b] This value can be immediately overwritten by the hardware " +"sensor value on Android and iOS." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Sets a custom mouse cursor image, which is only visible inside the game " +"window. The hotspot can also be specified. Passing [code]null[/code] to the " +"image parameter resets to the system cursor. See [enum CursorShape] for the " +"list of shapes.\n" +"[code]image[/code]'s size must be lower than 256×256.\n" +"[code]hotspot[/code] must be within [code]image[/code]'s size.\n" +"[b]Note:[/b] [AnimatedTexture]s aren't supported as custom mouse cursors. If " +"using an [AnimatedTexture], only the first frame will be displayed.\n" +"[b]Note:[/b] Only images imported with the [b]Lossless[/b], [b]Lossy[/b] or " +"[b]Uncompressed[/b] compression modes are supported. The [b]Video RAM[/b] " +"compression mode can't be used for custom cursors." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Sets the default cursor shape to be used in the viewport instead of " +"[constant CURSOR_ARROW].\n" +"[b]Note:[/b] If you want to change the default cursor shape for [Control]'s " +"nodes, use [member Control.mouse_default_cursor_shape] instead.\n" +"[b]Note:[/b] This method generates an [InputEventMouseMotion] to update " +"cursor immediately." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Sets the gravity value of the accelerometer sensor. Can be used for " +"debugging on devices without a hardware sensor, for example in an editor on " +"a PC.\n" +"[b]Note:[/b] This value can be immediately overwritten by the hardware " +"sensor value on Android and iOS." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Sets the value of the rotation rate of the gyroscope sensor. Can be used for " +"debugging on devices without a hardware sensor, for example in an editor on " +"a PC.\n" +"[b]Note:[/b] This value can be immediately overwritten by the hardware " +"sensor value on Android and iOS." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Sets the value of the magnetic field of the magnetometer sensor. Can be used " +"for debugging on devices without a hardware sensor, for example in an editor " +"on a PC.\n" +"[b]Note:[/b] This value can be immediately overwritten by the hardware " +"sensor value on Android and iOS." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Starts to vibrate the joypad. Joypads usually come with two rumble motors, a " +"strong and a weak one. [code]weak_magnitude[/code] is the strength of the " +"weak motor (between 0 and 1) and [code]strong_magnitude[/code] is the " +"strength of the strong motor (between 0 and 1). [code]duration[/code] is the " +"duration of the effect in seconds (a duration of 0 will try to play the " +"vibration indefinitely).\n" +"[b]Note:[/b] Not every hardware is compatible with long effect durations; it " +"is recommended to restart an effect if it has to be played for more than a " +"few seconds." +msgstr "" + +#: doc/classes/Input.xml +msgid "Stops the vibration of the joypad." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" +"[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " +"permission in the export preset.\n" +"[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Sets the mouse position to the specified vector, provided in pixels and " +"relative to an origin at the upper left corner of the game window.\n" +"Mouse position is clipped to the limits of the screen resolution, or to the " +"limits of the game window if [enum MouseMode] is set to [constant " +"MOUSE_MODE_CONFINED]." +msgstr "" + +#: doc/classes/Input.xml +msgid "Controls the mouse mode. See [enum MouseMode] for more information." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"If [code]true[/code], similar input events sent by the operating system are " +"accumulated. When input accumulation is enabled, all input events generated " +"during a frame will be merged and emitted when the frame is done rendering. " +"Therefore, this limits the number of input method calls per second to the " +"rendering FPS.\n" +"Input accumulation can be disabled to get slightly more precise/reactive " +"input at the cost of increased CPU usage. In applications where drawing " +"freehand lines is required, input accumulation should generally be disabled " +"while the user is drawing the line to get results that closely follow the " +"actual input.\n" +"[b]Note:[/b] Input accumulation is [i]enabled[/i] by default. It is " +"recommended to keep it enabled for games which don't require very reactive " +"input, as this will decrease CPU usage." +msgstr "" + +#: doc/classes/Input.xml +msgid "Emitted when a joypad device has been connected or disconnected." +msgstr "" + +#: doc/classes/Input.xml +msgid "Makes the mouse cursor visible if it is hidden." +msgstr "" + +#: doc/classes/Input.xml +msgid "Makes the mouse cursor hidden if it is visible." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Captures the mouse. The mouse will be hidden and its position locked at the " +"center of the screen.\n" +"[b]Note:[/b] If you want to process the mouse's movement in this mode, you " +"need to use [member InputEventMouseMotion.relative]." +msgstr "" + +#: doc/classes/Input.xml +msgid "Makes the mouse cursor visible but confines it to the game window." +msgstr "" + +#: doc/classes/Input.xml +msgid "Arrow cursor. Standard, default pointing cursor." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"I-beam cursor. Usually used to show where the text cursor will appear when " +"the mouse is clicked." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Pointing hand cursor. Usually used to indicate the pointer is over a link or " +"other interactable item." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Cross cursor. Typically appears over regions in which a drawing operation " +"can be performed or for selections." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Wait cursor. Indicates that the application is busy performing an operation. " +"This cursor shape denotes that the application isn't usable during the " +"operation (e.g. something is blocking its main thread)." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Busy cursor. Indicates that the application is busy performing an operation. " +"This cursor shape denotes that the application is still usable during the " +"operation." +msgstr "" + +#: doc/classes/Input.xml +msgid "Drag cursor. Usually displayed when dragging something." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Can drop cursor. Usually displayed when dragging something to indicate that " +"it can be dropped at the current position." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Forbidden cursor. Indicates that the current action is forbidden (for " +"example, when dragging something) or that the control at a position is " +"disabled." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Vertical resize mouse cursor. A double-headed vertical arrow. It tells the " +"user they can resize the window or the panel vertically." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Horizontal resize mouse cursor. A double-headed horizontal arrow. It tells " +"the user they can resize the window or the panel horizontally." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Window resize mouse cursor. The cursor is a double-headed arrow that goes " +"from the bottom left to the top right. It tells the user they can resize the " +"window or the panel both horizontally and vertically." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Window resize mouse cursor. The cursor is a double-headed arrow that goes " +"from the top left to the bottom right, the opposite of [constant " +"CURSOR_BDIAGSIZE]. It tells the user they can resize the window or the panel " +"both horizontally and vertically." +msgstr "" + +#: doc/classes/Input.xml +msgid "Move cursor. Indicates that something can be moved." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Vertical split mouse cursor. On Windows, it's the same as [constant " +"CURSOR_VSIZE]." +msgstr "" + +#: doc/classes/Input.xml +msgid "" +"Horizontal split mouse cursor. On Windows, it's the same as [constant " +"CURSOR_HSIZE]." +msgstr "" + +#: doc/classes/Input.xml +msgid "Help cursor. Usually a question mark." +msgstr "" + +#: doc/classes/InputEvent.xml +msgid "Generic input event." +msgstr "" + +#: doc/classes/InputEvent.xml +msgid "Base class of all sort of input event. See [method Node._input]." +msgstr "" + +#: doc/classes/InputEvent.xml +msgid "InputEvent" +msgstr "" + +#: doc/classes/InputEvent.xml +msgid "" +"Returns [code]true[/code] if the given input event and this input event can " +"be added together (only for events of type [InputEventMouseMotion]).\n" +"The given input event's position, global position and speed will be copied. " +"The resulting [code]relative[/code] is a sum of both events. Both events' " +"modifiers have to be identical." +msgstr "" + +#: doc/classes/InputEvent.xml +msgid "Returns a [String] representation of the event." +msgstr "" + +#: doc/classes/InputEvent.xml +msgid "" +"Returns a value between 0.0 and 1.0 depending on the given actions' state. " +"Useful for getting the value of events of type [InputEventJoypadMotion].\n" +"If [code]exact_match[/code] is [code]false[/code], it ignores additional " +"input modifiers for [InputEventKey] and [InputEventMouseButton] events, and " +"the direction for [InputEventJoypadMotion] events." +msgstr "" + +#: doc/classes/InputEvent.xml +msgid "" +"Returns [code]true[/code] if this input event matches a pre-defined action " +"of any type.\n" +"If [code]exact_match[/code] is [code]false[/code], it ignores additional " +"input modifiers for [InputEventKey] and [InputEventMouseButton] events, and " +"the direction for [InputEventJoypadMotion] events." +msgstr "" + +#: doc/classes/InputEvent.xml +msgid "" +"Returns [code]true[/code] if the given action is being pressed (and is not " +"an echo event for [InputEventKey] events, unless [code]allow_echo[/code] is " +"[code]true[/code]). Not relevant for events of type [InputEventMouseMotion] " +"or [InputEventScreenDrag].\n" +"If [code]exact_match[/code] is [code]false[/code], it ignores additional " +"input modifiers for [InputEventKey] and [InputEventMouseButton] events, and " +"the direction for [InputEventJoypadMotion] events.\n" +"[b]Note:[/b] Due to keyboard ghosting, [method is_action_pressed] may return " +"[code]false[/code] even if one of the action's keys is pressed. See " +"[url=$DOCS_URL/tutorials/inputs/input_examples.html#keyboard-events]Input " +"examples[/url] in the documentation for more information." +msgstr "" + +#: doc/classes/InputEvent.xml +msgid "" +"Returns [code]true[/code] if the given action is released (i.e. not " +"pressed). Not relevant for events of type [InputEventMouseMotion] or " +"[InputEventScreenDrag].\n" +"If [code]exact_match[/code] is [code]false[/code], it ignores additional " +"input modifiers for [InputEventKey] and [InputEventMouseButton] events, and " +"the direction for [InputEventJoypadMotion] events." +msgstr "" + +#: doc/classes/InputEvent.xml +msgid "" +"Returns [code]true[/code] if this input event's type is one that can be " +"assigned to an input action." +msgstr "" + +#: doc/classes/InputEvent.xml +msgid "" +"Returns [code]true[/code] if this input event is an echo event (only for " +"events of type [InputEventKey])." +msgstr "" + +#: doc/classes/InputEvent.xml +msgid "" +"Returns [code]true[/code] if this input event is pressed. Not relevant for " +"events of type [InputEventMouseMotion] or [InputEventScreenDrag].\n" +"[b]Note:[/b] Due to keyboard ghosting, [method is_action_pressed] may return " +"[code]false[/code] even if one of the action's keys is pressed. See " +"[url=$DOCS_URL/tutorials/inputs/input_examples.html#keyboard-events]Input " +"examples[/url] in the documentation for more information." +msgstr "" + +#: doc/classes/InputEvent.xml +msgid "" +"Returns [code]true[/code] if the specified [code]event[/code] matches this " +"event. Only valid for action events i.e key ([InputEventKey]), button " +"([InputEventMouseButton] or [InputEventJoypadButton]), axis " +"[InputEventJoypadMotion] or action ([InputEventAction]) events.\n" +"If [code]exact_match[/code] is [code]false[/code], it ignores additional " +"input modifiers for [InputEventKey] and [InputEventMouseButton] events, and " +"the direction for [InputEventJoypadMotion] events." +msgstr "" + +#: doc/classes/InputEvent.xml +msgid "" +"Returns a copy of the given input event which has been offset by " +"[code]local_ofs[/code] and transformed by [code]xform[/code]. Relevant for " +"events of type [InputEventMouseButton], [InputEventMouseMotion], " +"[InputEventScreenTouch], [InputEventScreenDrag], [InputEventMagnifyGesture] " +"and [InputEventPanGesture]." +msgstr "" + +#: doc/classes/InputEvent.xml +msgid "" +"The event's device ID.\n" +"[b]Note:[/b] This device ID will always be [code]-1[/code] for emulated " +"mouse input from a touchscreen. This can be used to distinguish emulated " +"mouse input from physical mouse input." +msgstr "" + +#: doc/classes/InputEventAction.xml +msgid "Input event type for actions." +msgstr "" + +#: doc/classes/InputEventAction.xml +msgid "" +"Contains a generic action which can be targeted from several types of " +"inputs. Actions can be created from the [b]Input Map[/b] tab in the " +"[b]Project > Project Settings[/b] menu. See [method Node._input]." +msgstr "" + +#: doc/classes/InputEventAction.xml +msgid "InputEvent: Actions" +msgstr "" + +#: doc/classes/InputEventAction.xml +msgid "The action's name. Actions are accessed via this [String]." +msgstr "" + +#: doc/classes/InputEventAction.xml +msgid "" +"If [code]true[/code], the action's state is pressed. If [code]false[/code], " +"the action's state is released." +msgstr "" + +#: doc/classes/InputEventAction.xml +msgid "" +"The action's strength between 0 and 1. This value is considered as equal to " +"0 if pressed is [code]false[/code]. The event strength allows faking analog " +"joypad motion events, by specifying how strongly the joypad axis is bent or " +"pressed." +msgstr "" + +#: doc/classes/InputEventGesture.xml +msgid "Base class for touch control gestures." +msgstr "" + +#: doc/classes/InputEventGesture.xml +msgid "" +"The local gesture position relative to the [Viewport]. If used in [method " +"Control._gui_input], the position is relative to the current [Control] that " +"received this gesture." +msgstr "" + +#: doc/classes/InputEventJoypadButton.xml +msgid "Input event for gamepad buttons." +msgstr "" + +#: doc/classes/InputEventJoypadButton.xml +msgid "" +"Input event type for gamepad buttons. For gamepad analog sticks and " +"joysticks, see [InputEventJoypadMotion]." +msgstr "" + +#: doc/classes/InputEventJoypadButton.xml +msgid "Button identifier. One of the [enum JoystickList] button constants." +msgstr "" + +#: doc/classes/InputEventJoypadButton.xml +msgid "" +"If [code]true[/code], the button's state is pressed. If [code]false[/code], " +"the button's state is released." +msgstr "" + +#: doc/classes/InputEventJoypadButton.xml +msgid "" +"Represents the pressure the user puts on the button with their finger, if " +"the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +msgstr "" + +#: doc/classes/InputEventJoypadMotion.xml +msgid "" +"Input event type for gamepad joysticks and other motions. For buttons, see " +"[code]InputEventJoypadButton[/code]." +msgstr "" + +#: doc/classes/InputEventJoypadMotion.xml +msgid "" +"Stores information about joystick motions. One [InputEventJoypadMotion] " +"represents one axis at a time." +msgstr "" + +#: doc/classes/InputEventJoypadMotion.xml +msgid "Axis identifier. Use one of the [enum JoystickList] axis constants." +msgstr "" + +#: doc/classes/InputEventJoypadMotion.xml +msgid "" +"Current position of the joystick on the given axis. The value ranges from " +"[code]-1.0[/code] to [code]1.0[/code]. A value of [code]0[/code] means the " +"axis is in its resting position." +msgstr "" + +#: doc/classes/InputEventKey.xml +msgid "Input event type for keyboard events." +msgstr "" + +#: doc/classes/InputEventKey.xml +msgid "" +"Stores key presses on the keyboard. Supports key presses, key releases and " +"[member echo] events." +msgstr "" + +#: doc/classes/InputEventKey.xml +msgid "" +"Returns the physical scancode combined with modifier keys such as " +"[code]Shift[/code] or [code]Alt[/code]. See also [InputEventWithModifiers].\n" +"To get a human-readable representation of the [InputEventKey] with " +"modifiers, use [code]OS.get_scancode_string(event." +"get_physical_scancode_with_modifiers())[/code] where [code]event[/code] is " +"the [InputEventKey]." +msgstr "" + +#: doc/classes/InputEventKey.xml +msgid "" +"Returns the scancode combined with modifier keys such as [code]Shift[/code] " +"or [code]Alt[/code]. See also [InputEventWithModifiers].\n" +"To get a human-readable representation of the [InputEventKey] with " +"modifiers, use [code]OS.get_scancode_string(event." +"get_scancode_with_modifiers())[/code] where [code]event[/code] is the " +"[InputEventKey]." +msgstr "" + +#: doc/classes/InputEventKey.xml +msgid "" +"If [code]true[/code], the key was already pressed before this event. It " +"means the user is holding the key down." +msgstr "" + +#: doc/classes/InputEventKey.xml +msgid "" +"Key physical scancode, which corresponds to one of the [enum KeyList] " +"constants. Represent the physical location of a key on the 101/102-key US " +"QWERTY keyboard.\n" +"To get a human-readable representation of the [InputEventKey], use [code]OS." +"get_scancode_string(event.physical_scancode)[/code] where [code]event[/code] " +"is the [InputEventKey]." +msgstr "" + +#: doc/classes/InputEventKey.xml +msgid "" +"If [code]true[/code], the key's state is pressed. If [code]false[/code], the " +"key's state is released." +msgstr "" + +#: doc/classes/InputEventKey.xml +msgid "" +"The key scancode, which corresponds to one of the [enum KeyList] constants. " +"Represent key in the current keyboard layout.\n" +"To get a human-readable representation of the [InputEventKey], use [code]OS." +"get_scancode_string(event.scancode)[/code] where [code]event[/code] is the " +"[InputEventKey]." +msgstr "" + +#: doc/classes/InputEventKey.xml +msgid "" +"The key Unicode identifier (when relevant). Unicode identifiers for the " +"composite characters and complex scripts may not be available unless IME " +"input mode is active. See [method OS.set_ime_active] for more information." +msgstr "" + +#: doc/classes/InputEventMIDI.xml +msgid "Input event for MIDI inputs." +msgstr "" + +#: doc/classes/InputEventMIDI.xml +msgid "" +"InputEventMIDI allows receiving input events from MIDI devices such as a " +"piano. MIDI stands for Musical Instrument Digital Interface.\n" +"MIDI signals can be sent over a 5-pin MIDI connector or over USB, if your " +"device supports both be sure to check the settings in the device to see " +"which output it's using.\n" +"To receive input events from MIDI devices, you need to call [method OS." +"open_midi_inputs]. You can check which devices are detected using [method OS." +"get_connected_midi_inputs].\n" +"Note that Godot does not currently support MIDI output, so there is no way " +"to emit MIDI signals from Godot. Only MIDI input works." +msgstr "" + +#: doc/classes/InputEventMIDI.xml +msgid "MIDI Message Status Byte List" +msgstr "" + +#: doc/classes/InputEventMIDI.xml +msgid "Wikipedia General MIDI Instrument List" +msgstr "" + +#: doc/classes/InputEventMIDI.xml +msgid "Wikipedia Piano Key Frequencies List" +msgstr "" + +#: doc/classes/InputEventMIDI.xml +msgid "" +"The MIDI channel of this input event. There are 16 channels, so this value " +"ranges from 0 to 15. MIDI channel 9 is reserved for the use with percussion " +"instruments, the rest of the channels are for non-percussion instruments." +msgstr "" + +#: doc/classes/InputEventMIDI.xml +msgid "" +"If the message is [code]MIDI_MESSAGE_CONTROL_CHANGE[/code], this indicates " +"the controller number, otherwise this is zero. Controllers include devices " +"such as pedals and levers." +msgstr "" + +#: doc/classes/InputEventMIDI.xml +msgid "" +"If the message is [code]MIDI_MESSAGE_CONTROL_CHANGE[/code], this indicates " +"the controller value, otherwise this is zero. Controllers include devices " +"such as pedals and levers." +msgstr "" + +#: doc/classes/InputEventMIDI.xml +msgid "" +"The instrument of this input event. This value ranges from 0 to 127. Refer " +"to the instrument list on the General MIDI wikipedia article to see a list " +"of instruments, except that this value is 0-index, so subtract one from " +"every number on that chart. A standard piano will have an instrument number " +"of 0." +msgstr "" + +#: doc/classes/InputEventMIDI.xml +msgid "" +"Returns a value indicating the type of message for this MIDI signal. This is " +"a member of the [enum @GlobalScope.MidiMessageList] enum.\n" +"For MIDI messages between 0x80 and 0xEF, only the left half of the bits are " +"returned as this value, as the other part is the channel (ex: 0x94 becomes " +"0x9). For MIDI messages from 0xF0 to 0xFF, the value is returned as-is.\n" +"Notes will return [code]MIDI_MESSAGE_NOTE_ON[/code] when activated, but they " +"might not always return [code]MIDI_MESSAGE_NOTE_OFF[/code] when deactivated, " +"therefore your code should treat the input as stopped if some period of time " +"has passed.\n" +"For more information, see the MIDI message status byte list chart linked " +"above." +msgstr "" + +#: doc/classes/InputEventMIDI.xml +msgid "" +"The pitch index number of this MIDI signal. This value ranges from 0 to 127. " +"On a piano, middle C is 60, and A440 is 69, see the \"MIDI note\" column of " +"the piano key frequency chart on Wikipedia for more information." +msgstr "" + +#: doc/classes/InputEventMIDI.xml +msgid "" +"The pressure of the MIDI signal. This value ranges from 0 to 127. For many " +"devices, this value is always zero." +msgstr "" + +#: doc/classes/InputEventMIDI.xml +msgid "" +"The velocity of the MIDI signal. This value ranges from 0 to 127. For a " +"piano, this corresponds to how quickly the key was pressed, and is rarely " +"above about 110 in practice." +msgstr "" + +#: doc/classes/InputEventMouse.xml +msgid "Base input event type for mouse events." +msgstr "" + +#: doc/classes/InputEventMouse.xml +msgid "Stores general mouse events information." +msgstr "" + +#: doc/classes/InputEventMouse.xml +msgid "" +"The mouse button mask identifier, one of or a bitwise combination of the " +"[enum ButtonList] button masks." +msgstr "" + +#: doc/classes/InputEventMouse.xml +msgid "" +"When received in [method Node._input] or [method Node._unhandled_input], " +"returns the mouse's position in the root [Viewport] using the coordinate " +"system of the root [Viewport].\n" +"When received in [method Control._gui_input], returns the mouse's position " +"in the [CanvasLayer] that the [Control] is in using the coordinate system of " +"the [CanvasLayer]." +msgstr "" + +#: doc/classes/InputEventMouse.xml +msgid "" +"When received in [method Node._input] or [method Node._unhandled_input], " +"returns the mouse's position in the [Viewport] this [Node] is in using the " +"coordinate system of this [Viewport].\n" +"When received in [method Control._gui_input], returns the mouse's position " +"in the [Control] using the local coordinate system of the [Control]." +msgstr "" + +#: doc/classes/InputEventMouseButton.xml +msgid "Input event type for mouse button events." +msgstr "" + +#: doc/classes/InputEventMouseButton.xml +msgid "Contains mouse click information. See [method Node._input]." +msgstr "" + +#: doc/classes/InputEventMouseButton.xml +msgid "" +"The mouse button identifier, one of the [enum ButtonList] button or button " +"wheel constants." +msgstr "" + +#: doc/classes/InputEventMouseButton.xml +msgid "If [code]true[/code], the mouse button's state is a double-click." +msgstr "" + +#: doc/classes/InputEventMouseButton.xml +msgid "" +"The amount (or delta) of the event. When used for high-precision scroll " +"events, this indicates the scroll amount (vertical or horizontal). This is " +"only supported on some platforms; the reported sensitivity varies depending " +"on the platform. May be [code]0[/code] if not supported." +msgstr "" + +#: doc/classes/InputEventMouseButton.xml +msgid "" +"If [code]true[/code], the mouse button's state is pressed. If [code]false[/" +"code], the mouse button's state is released." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "Input event type for mouse motion events." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" +"Contains mouse and pen motion information. Supports relative, absolute " +"positions and speed. See [method Node._input].\n" +"[b]Note:[/b] The behavior of this event is affected by the value of [member " +"Input.use_accumulated_input]. When set to [code]true[/code] (default), mouse/" +"pen motion events received from the OS will be merged to emit an accumulated " +"event only once per frame rendered at most. When set to [code]false[/code], " +"the events will be emitted as received, which means that they can be emitted " +"multiple times per frame rendered, allowing for precise input reporting at " +"the expense of CPU usage.\n" +"[b]Note:[/b] If you use InputEventMouseMotion to draw lines, consider " +"implementing [url=https://en.wikipedia.org/wiki/" +"Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " +"avoid visible gaps in lines if the user is moving the mouse quickly." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "Mouse and input coordinates" +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" +"Returns [code]true[/code] when using the eraser end of a stylus pen.\n" +"[b]Note:[/b] This property is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" +"Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" +"code] to [code]1.0[/code]." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" +"The mouse position relative to the previous position (position at the last " +"frame).\n" +"[b]Note:[/b] Since [InputEventMouseMotion] is only emitted when the mouse " +"moves, the last event won't have a relative position of [code]Vector2(0, 0)[/" +"code] when the user stops moving the mouse." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "The mouse speed in pixels per second." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml +msgid "" +"Represents the angles of tilt of the pen. Positive X-coordinate value " +"indicates a tilt to the right. Positive Y-coordinate value indicates a tilt " +"toward the user. Ranges from [code]-1.0[/code] to [code]1.0[/code] for both " +"axes." +msgstr "" + +#: doc/classes/InputEventScreenDrag.xml +msgid "" +"Input event type for screen drag events. Only available on mobile devices." +msgstr "" + +#: doc/classes/InputEventScreenDrag.xml +msgid "Contains screen drag information. See [method Node._input]." +msgstr "" + +#: doc/classes/InputEventScreenDrag.xml +msgid "The drag event index in the case of a multi-drag event." +msgstr "" + +#: doc/classes/InputEventScreenDrag.xml +msgid "The drag position." +msgstr "" + +#: doc/classes/InputEventScreenDrag.xml +msgid "" +"The drag position relative to the previous position (position at the last " +"frame)." +msgstr "" + +#: doc/classes/InputEventScreenDrag.xml +msgid "The drag speed." +msgstr "" + +#: doc/classes/InputEventScreenTouch.xml +msgid "" +"Input event type for screen touch events.\n" +"(only available on mobile devices)" +msgstr "" + +#: doc/classes/InputEventScreenTouch.xml +msgid "" +"Stores multi-touch press/release information. Supports touch press, touch " +"release and [member index] for multi-touch count and order." +msgstr "" + +#: doc/classes/InputEventScreenTouch.xml +msgid "" +"The touch index in the case of a multi-touch event. One index = one finger." +msgstr "" + +#: doc/classes/InputEventScreenTouch.xml +msgid "The touch position." +msgstr "" + +#: doc/classes/InputEventScreenTouch.xml +msgid "" +"If [code]true[/code], the touch's state is pressed. If [code]false[/code], " +"the touch's state is released." +msgstr "" + +#: doc/classes/InputEventWithModifiers.xml +msgid "Base class for keys events with modifiers." +msgstr "" + +#: doc/classes/InputEventWithModifiers.xml +msgid "" +"Contains keys events information with modifiers support like [code]Shift[/" +"code] or [code]Alt[/code]. See [method Node._input]." +msgstr "" + +#: doc/classes/InputEventWithModifiers.xml +msgid "State of the [code]Alt[/code] modifier." +msgstr "" + +#: doc/classes/InputEventWithModifiers.xml +msgid "State of the [code]Command[/code] modifier." +msgstr "" + +#: doc/classes/InputEventWithModifiers.xml +msgid "State of the [code]Ctrl[/code] modifier." +msgstr "" + +#: doc/classes/InputEventWithModifiers.xml +msgid "State of the [code]Meta[/code] modifier." +msgstr "" + +#: doc/classes/InputEventWithModifiers.xml +msgid "State of the [code]Shift[/code] modifier." +msgstr "" + +#: doc/classes/InputMap.xml +msgid "Singleton that manages [InputEventAction]." +msgstr "" + +#: doc/classes/InputMap.xml +msgid "" +"Manages all [InputEventAction] which can be created/modified from the " +"project settings menu [b]Project > Project Settings > Input Map[/b] or in " +"code with [method add_action] and [method action_add_event]. See [method " +"Node._input]." +msgstr "" + +#: doc/classes/InputMap.xml +msgid "" +"Adds an [InputEvent] to an action. This [InputEvent] will trigger the action." +msgstr "" + +#: doc/classes/InputMap.xml +msgid "Removes an [InputEvent] from an action." +msgstr "" + +#: doc/classes/InputMap.xml +msgid "Removes all events from an action." +msgstr "" + +#: doc/classes/InputMap.xml +msgid "Returns a deadzone value for the action." +msgstr "" + +#: doc/classes/InputMap.xml +msgid "" +"Returns [code]true[/code] if the action has the given [InputEvent] " +"associated with it." +msgstr "" + +#: doc/classes/InputMap.xml +msgid "Sets a deadzone value for the action." +msgstr "" + +#: doc/classes/InputMap.xml +msgid "" +"Adds an empty action to the [InputMap] with a configurable [code]deadzone[/" +"code].\n" +"An [InputEvent] can then be added to this action with [method " +"action_add_event]." +msgstr "" + +#: doc/classes/InputMap.xml +msgid "Removes an action from the [InputMap]." +msgstr "" + +#: doc/classes/InputMap.xml +msgid "" +"Returns [code]true[/code] if the given event is part of an existing action. " +"This method ignores keyboard modifiers if the given [InputEvent] is not " +"pressed (for proper release detection). See [method action_has_event] if you " +"don't want this behavior.\n" +"If [code]exact_match[/code] is [code]false[/code], it ignores additional " +"input modifiers for [InputEventKey] and [InputEventMouseButton] events, and " +"the direction for [InputEventJoypadMotion] events." +msgstr "" + +#: doc/classes/InputMap.xml +msgid "" +"Returns an array of [InputEvent]s associated with a given action.\n" +"[b]Note:[/b] When used in the editor (e.g. a tool script or [EditorPlugin]), " +"this method will return events for the editor action. If you want to access " +"your project's input binds from the editor, read the [code]input/*[/code] " +"settings from [ProjectSettings]." +msgstr "" + +#: doc/classes/InputMap.xml +msgid "Returns an array of all actions in the [InputMap]." +msgstr "" + +#: doc/classes/InputMap.xml +msgid "" +"Returns [code]true[/code] if the [InputMap] has a registered action with the " +"given name." +msgstr "" + +#: doc/classes/InputMap.xml +msgid "" +"Clears all [InputEventAction] in the [InputMap] and load it anew from " +"[ProjectSettings]." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "Placeholder for the root [Node] of a [PackedScene]." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" +"Turning on the option [b]Load As Placeholder[/b] for an instanced scene in " +"the editor causes it to be replaced by an InstancePlaceholder when running " +"the game. This makes it possible to delay actually loading the scene until " +"calling [method replace_by_instance]. This is useful to avoid loading large " +"scenes all at once by loading parts of it selectively.\n" +"The InstancePlaceholder does not have a transform. This causes any child " +"nodes to be positioned relatively to the Viewport from point (0,0), rather " +"than their parent as displayed in the editor. Replacing the placeholder with " +"a scene with a transform will transform children relatively to their parent " +"again." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" +"Gets the path to the [PackedScene] resource file that is loaded by default " +"when calling [method replace_by_instance]. Not thread-safe. Use [method " +"Object.call_deferred] if calling from a thread." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" +"Replaces this placeholder by the scene handed as an argument, or the " +"original scene if no argument is given. As for all resources, the scene is " +"loaded only if it's not loaded already. By manually loading the scene " +"beforehand, delays caused by this function can be avoided." +msgstr "" + +#: doc/classes/int.xml +msgid "Integer built-in type." +msgstr "" + +#: doc/classes/int.xml +msgid "" +"Signed 64-bit integer type.\n" +"It can take values in the interval [code][-2^63, 2^63 - 1][/code], i.e. " +"[code][-9223372036854775808, 9223372036854775807][/code]. Exceeding those " +"bounds will wrap around.\n" +"[int] is a [Variant] type, and will thus be used when assigning an integer " +"value to a [Variant]. It can also be enforced with the [code]: int[/code] " +"type hint.\n" +"[codeblock]\n" +"var my_variant = 0 # int, value 0.\n" +"my_variant += 4.2 # float, value 4.2.\n" +"var my_int: int = 1 # int, value 1.\n" +"my_int = 4.2 # int, value 4, the right value is implicitly cast to int.\n" +"my_int = int(\"6.7\") # int, value 6, the String is explicitly cast with " +"int.\n" +"\n" +"var max_int = 9223372036854775807\n" +"print(max_int) # 9223372036854775807, OK.\n" +"max_int += 1\n" +"print(max_int) # -9223372036854775808, we overflowed and wrapped around.\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/int.xml +msgid "" +"Cast a [bool] value to an integer value, [code]int(true)[/code] will be " +"equals to 1 and [code]int(false)[/code] will be equals to 0." +msgstr "" + +#: doc/classes/int.xml +msgid "" +"Cast a float value to an integer value, this method simply removes the " +"number fractions (i.e. rounds [code]from[/code] towards zero), so for " +"example [code]int(2.7)[/code] will be equals to 2, [code]int(0.1)[/code] " +"will be equals to 0 and [code]int(-2.7)[/code] will be equals to -2. This " +"operation is also called truncation." +msgstr "" + +#: doc/classes/int.xml +msgid "" +"Cast a [String] value to an integer value, this method is an integer parser " +"from a string, so calling this method with an invalid integer string will " +"return 0, a valid string will be something like [code]'1.7'[/code]. This " +"method will ignore all non-number characters, so calling [code]int('1e3')[/" +"code] will return 13." +msgstr "" + +#: doc/classes/InterpolatedCamera.xml +msgid "[i]Deprecated.[/i] Camera which moves toward another node." +msgstr "" + +#: doc/classes/InterpolatedCamera.xml +msgid "" +"[i]Deprecated (will be removed in Godot 4.0).[/i] InterpolatedCamera is a " +"[Camera] which smoothly moves to match a target node's position and " +"rotation.\n" +"If it is not [member enabled] or does not have a valid target set, " +"InterpolatedCamera acts like a normal Camera." +msgstr "" + +#: doc/classes/InterpolatedCamera.xml +msgid "Sets the node to move toward and orient with." +msgstr "" + +#: doc/classes/InterpolatedCamera.xml +msgid "" +"If [code]true[/code], and a target is set, the camera will move " +"automatically." +msgstr "" + +#: doc/classes/InterpolatedCamera.xml +msgid "" +"The camera's process callback. See [enum InterpolatedCameraProcessMode]." +msgstr "" + +#: doc/classes/InterpolatedCamera.xml +msgid "" +"How quickly the camera moves toward its target. Higher values will result in " +"tighter camera motion." +msgstr "" + +#: doc/classes/InterpolatedCamera.xml +msgid "The target's [NodePath]." +msgstr "" + +#: doc/classes/IntervalTweener.xml +msgid "Creates an idle interval in a [SceneTreeTween] animation." +msgstr "" + +#: doc/classes/IntervalTweener.xml +msgid "" +"[IntervalTweener] is used to make delays in a tweening sequence. See [method " +"SceneTreeTween.tween_interval] for more usage information.\n" +"[b]Note:[/b] [method SceneTreeTween.tween_interval] is the only correct way " +"to create [IntervalTweener]. Any [IntervalTweener] created manually will not " +"function correctly." +msgstr "" + +#: doc/classes/IP.xml +msgid "Internet protocol (IP) support functions such as DNS resolution." +msgstr "" + +#: doc/classes/IP.xml +msgid "" +"IP contains support functions for the Internet Protocol (IP). TCP/IP support " +"is in different classes (see [StreamPeerTCP] and [TCP_Server]). IP provides " +"DNS hostname resolution support, both blocking and threaded." +msgstr "" + +#: doc/classes/IP.xml +msgid "" +"Removes all of a [code]hostname[/code]'s cached references. If no " +"[code]hostname[/code] is given, all cached IP addresses are removed." +msgstr "" + +#: doc/classes/IP.xml +msgid "" +"Removes a given item [code]id[/code] from the queue. This should be used to " +"free a queue after it has completed to enable more queries to happen." +msgstr "" + +#: doc/classes/IP.xml +msgid "Returns all the user's current IPv4 and IPv6 addresses as an array." +msgstr "" + +#: doc/classes/IP.xml +msgid "" +"Returns all network adapters as an array.\n" +"Each adapter is a dictionary of the form:\n" +"[codeblock]\n" +"{\n" +" \"index\": \"1\", # Interface index.\n" +" \"name\": \"eth0\", # Interface name.\n" +" \"friendly\": \"Ethernet One\", # A friendly name (might be empty).\n" +" \"addresses\": [\"192.168.1.101\"], # An array of IP addresses " +"associated to this interface.\n" +"}\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/IP.xml +msgid "" +"Returns a queued hostname's IP address, given its queue [code]id[/code]. " +"Returns an empty string on error or if resolution hasn't happened yet (see " +"[method get_resolve_item_status])." +msgstr "" + +#: doc/classes/IP.xml +msgid "" +"Return resolved addresses, or an empty array if an error happened or " +"resolution didn't happen yet (see [method get_resolve_item_status])." +msgstr "" + +#: doc/classes/IP.xml +msgid "" +"Returns a queued hostname's status as a [enum ResolverStatus] constant, " +"given its queue [code]id[/code]." +msgstr "" + +#: doc/classes/IP.xml +msgid "" +"Returns a given hostname's IPv4 or IPv6 address when resolved (blocking-type " +"method). The address type returned depends on the [enum Type] constant given " +"as [code]ip_type[/code]." +msgstr "" + +#: doc/classes/IP.xml +msgid "" +"Resolves a given hostname in a blocking way. Addresses are returned as an " +"[Array] of IPv4 or IPv6 depending on [code]ip_type[/code]." +msgstr "" + +#: doc/classes/IP.xml +msgid "" +"Creates a queue item to resolve a hostname to an IPv4 or IPv6 address " +"depending on the [enum Type] constant given as [code]ip_type[/code]. Returns " +"the queue ID if successful, or [constant RESOLVER_INVALID_ID] on error." +msgstr "" + +#: doc/classes/IP.xml +msgid "DNS hostname resolver status: No status." +msgstr "" + +#: doc/classes/IP.xml +msgid "DNS hostname resolver status: Waiting." +msgstr "" + +#: doc/classes/IP.xml +msgid "DNS hostname resolver status: Done." +msgstr "" + +#: doc/classes/IP.xml +msgid "DNS hostname resolver status: Error." +msgstr "" + +#: doc/classes/IP.xml +msgid "" +"Maximum number of concurrent DNS resolver queries allowed, [constant " +"RESOLVER_INVALID_ID] is returned if exceeded." +msgstr "" + +#: doc/classes/IP.xml +msgid "" +"Invalid ID constant. Returned if [constant RESOLVER_MAX_QUERIES] is exceeded." +msgstr "" + +#: doc/classes/IP.xml +msgid "Address type: None." +msgstr "" + +#: doc/classes/IP.xml +msgid "Address type: Internet protocol version 4 (IPv4)." +msgstr "" + +#: doc/classes/IP.xml +msgid "Address type: Internet protocol version 6 (IPv6)." +msgstr "" + +#: doc/classes/IP.xml +msgid "Address type: Any." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Control that provides a list of selectable items (and/or icons) in a single " +"column, or optionally in multiple columns." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"This control provides a selectable list of items that may be in a single (or " +"multiple columns) with option of text, icons, or both text and icon. " +"Tooltips are supported and may be different for every item in the list.\n" +"Selectable items in the list may be selected or deselected and multiple " +"selection may be enabled. Selection with right mouse button may also be " +"enabled to allow use of popup context menus. Items may also be \"activated\" " +"by double-clicking them or by pressing Enter.\n" +"Item text only supports single-line strings, newline characters (e.g. " +"[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " +"enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " +"fully fit its content by default. You need to set [member " +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "Adds an item to the item list with no text, only an icon." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Adds an item to the item list with specified text. Specify an [code]icon[/" +"code], or use [code]null[/code] as the [code]icon[/code] for a list item " +"with no icon.\n" +"If selectable is [code]true[/code], the list item will be selectable." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "Removes all items from the list." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Ensure current selection is visible, adjusting the scroll position as " +"necessary." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Returns the item index at the given [code]position[/code].\n" +"When there is no item at that point, -1 will be returned if [code]exact[/" +"code] is [code]true[/code], and the closest item index will be returned " +"otherwise." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "Returns the number of items currently in the list." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Returns the custom background color of the item specified by [code]idx[/" +"code] index." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Returns the custom foreground color of the item specified by [code]idx[/" +"code] index." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "Returns the icon associated with the specified index." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "Returns a [Color] modulating item's icon at the specified index." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Returns the region of item's icon used. The whole icon will be used if the " +"region has no area." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "Returns the metadata value of the specified index." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "Returns the text associated with the specified index." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "Returns the tooltip hint associated with the specified index." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "Returns an array with the indexes of the selected items." +msgstr "" + +#: doc/classes/ItemList.xml doc/classes/RichTextLabel.xml +msgid "" +"Returns the vertical scrollbar.\n" +"[b]Warning:[/b] This is a required internal node, removing and freeing it " +"may cause a crash. If you wish to hide it or any of its children, use their " +"[member CanvasItem.visible] property." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "Returns [code]true[/code] if one or more items are selected." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Returns [code]true[/code] if the item at the specified index is disabled." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Returns [code]true[/code] if the item icon will be drawn transposed, i.e. " +"the X and Y axes are swapped." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Returns [code]true[/code] if the item at the specified index is selectable." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Returns [code]true[/code] if the tooltip is enabled for specified item index." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Returns [code]true[/code] if the item at the specified index is currently " +"selected." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "Moves item from index [code]from_idx[/code] to [code]to_idx[/code]." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "Removes the item specified by [code]idx[/code] index from the list." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Select the item at the specified index.\n" +"[b]Note:[/b] This method does not trigger the item selection signal." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Sets the background color of the item specified by [code]idx[/code] index to " +"the specified [Color]." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Sets the foreground color of the item specified by [code]idx[/code] index to " +"the specified [Color]." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Disables (or enables) the item at the specified index.\n" +"Disabled items cannot be selected and do not trigger activation signals " +"(when double-clicking or pressing Enter)." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Sets (or replaces) the icon's [Texture] associated with the specified index." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Sets a modulating [Color] of the item associated with the specified index." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Sets the region of item's icon used. The whole icon will be used if the " +"region has no area." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "Sets whether the item icon will be drawn transposed." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Sets a value (of any type) to be stored with the item associated with the " +"specified index." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Allows or disallows selection of the item associated with the specified " +"index." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "Sets text of the item associated with the specified index." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "Sets the tooltip hint for the item associated with the specified index." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "Sets whether the tooltip hint is enabled for specified item index." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "Sorts items in the list by their text." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "Ensures the item associated with the specified index is not selected." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "Ensures there are no items selected." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"If [code]true[/code], the currently selected item can be selected again." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "If [code]true[/code], right mouse button click can select items." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"If [code]true[/code], the control will automatically resize the height to " +"fit its content." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"The width all columns will be adjusted to.\n" +"A value of zero disables the adjustment, each item will have a width equal " +"to the width of its content and the columns will have an uneven width." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"The size all icons will be adjusted to.\n" +"If either X or Y component is not greater than zero, icon size won't be " +"affected." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"The icon position, whether above or to the left of the text. See the [enum " +"IconMode] constants." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"The scale of icon applied after [member fixed_icon_size] and transposing " +"takes effect." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Maximum columns the list will have.\n" +"If greater than zero, the content will be split among the specified " +"columns.\n" +"A value of zero means unlimited columns, i.e. all items will be put in the " +"same row." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Maximum lines of text allowed in each item. Space will be reserved even when " +"there is not enough lines of text to display.\n" +"[b]Note:[/b] This property takes effect only when [member icon_mode] is " +"[constant ICON_MODE_TOP]. To make the text wrap, [member fixed_column_width] " +"should be greater than zero." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Whether all columns will have the same width.\n" +"If [code]true[/code], the width is equal to the largest column width of all " +"columns." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Allows single or multiple item selection. See the [enum SelectMode] " +"constants." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Triggered when specified list item is activated via double-clicking or by " +"pressing Enter." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Triggered when specified list item has been selected via right mouse " +"clicking.\n" +"The click position is also provided to allow appropriate popup of context " +"menus at the correct location.\n" +"[member allow_rmb_select] must be enabled." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Triggered when specified item has been selected.\n" +"[member allow_reselect] must be enabled to reselect an item." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Triggered when a multiple selection is altered on a list allowing multiple " +"selection." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Triggered when a left mouse click is issued within the rect of the list but " +"on empty space." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Triggered when a right mouse click is issued within the rect of the list but " +"on empty space.\n" +"[member allow_rmb_select] must be enabled." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "Icon is drawn above the text." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "Icon is drawn to the left of the text." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "Only allow selecting a single item." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "Allows selecting multiple items by holding Ctrl or Shift." +msgstr "" + +#: doc/classes/ItemList.xml doc/classes/Tree.xml +msgid "Default text [Color] of the item." +msgstr "" + +#: doc/classes/ItemList.xml doc/classes/Tree.xml +msgid "Text [Color] used when the item is selected." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"[Color] of the guideline. The guideline is a line drawn between each row of " +"items." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "The horizontal spacing between items." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "The spacing between item's icon and text." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "The vertical spacing between each line of text." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "The vertical spacing between items." +msgstr "" + +#: doc/classes/ItemList.xml doc/classes/Tree.xml +msgid "[Font] of the item's text." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"Default [StyleBox] for the [ItemList], i.e. used when the control is not " +"being focused." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "[StyleBox] used when the [ItemList] is being focused." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "[StyleBox] used for the cursor, when the [ItemList] is being focused." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"[StyleBox] used for the cursor, when the [ItemList] is not being focused." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"[StyleBox] for the selected items, used when the [ItemList] is not being " +"focused." +msgstr "" + +#: doc/classes/ItemList.xml +msgid "" +"[StyleBox] for the selected items, used when the [ItemList] is being focused." +msgstr "" + +#: doc/classes/JavaScript.xml +msgid "" +"Singleton that connects the engine with the browser's JavaScript context in " +"HTML5 export." +msgstr "" + +#: doc/classes/JavaScript.xml +msgid "" +"The JavaScript singleton is implemented only in the HTML5 export. It's used " +"to access the browser's JavaScript context. This allows interaction with " +"embedding pages or calling third-party JavaScript APIs.\n" +"[b]Note:[/b] This singleton can be disabled at build-time to improve " +"security. By default, the JavaScript singleton is enabled. Official export " +"templates also have the JavaScript singleton enabled. See [url=$DOCS_URL/" +"development/compiling/compiling_for_web.html]Compiling for the Web[/url] in " +"the documentation for more information." +msgstr "" + +#: doc/classes/JavaScript.xml +msgid "" +"Creates a reference to a script function that can be used as a callback by " +"JavaScript. The reference must be kept until the callback happens, or it " +"won't be called at all. See [JavaScriptObject] for usage." +msgstr "" + +#: doc/classes/JavaScript.xml +msgid "" +"Creates a new JavaScript object using the [code]new[/code] constructor. The " +"[code]object[/code] must a valid property of the JavaScript [code]window[/" +"code]. See [JavaScriptObject] for usage." +msgstr "" + +#: doc/classes/JavaScript.xml +msgid "" +"Prompts the user to download a file containing the specified [code]buffer[/" +"code]. The file will have the given [code]name[/code] and [code]mime[/code] " +"type.\n" +"[b]Note:[/b] The browser may override the [url=https://en.wikipedia.org/wiki/" +"Media_type]MIME type[/url] provided based on the file [code]name[/code]'s " +"extension.\n" +"[b]Note:[/b] Browsers might block the download if [method download_buffer] " +"is not being called from a user interaction (e.g. button click).\n" +"[b]Note:[/b] Browsers might ask the user for permission or block the " +"download if multiple download requests are made in a quick succession." +msgstr "" + +#: doc/classes/JavaScript.xml +msgid "" +"Execute the string [code]code[/code] as JavaScript code within the browser " +"window. This is a call to the actual global JavaScript function [code]eval()" +"[/code].\n" +"If [code]use_global_execution_context[/code] is [code]true[/code], the code " +"will be evaluated in the global execution context. Otherwise, it is " +"evaluated in the execution context of a function within the engine's runtime " +"environment." +msgstr "" + +#: doc/classes/JavaScript.xml +msgid "" +"Returns an interface to a JavaScript object that can be used by scripts. The " +"[code]interface[/code] must be a valid property of the JavaScript " +"[code]window[/code]. The callback must accept a single [Array] argument, " +"which will contain the JavaScript [code]arguments[/code]. See " +"[JavaScriptObject] for usage." +msgstr "" + +#: doc/classes/JavaScript.xml +msgid "" +"Returns [code]true[/code] if a new version of the progressive web app is " +"waiting to be activated.\n" +"[b]Note:[/b] Only relevant when exported as a Progressive Web App." +msgstr "" + +#: doc/classes/JavaScript.xml +msgid "" +"Performs the live update of the progressive web app. Forcing the new version " +"to be installed and the page to be reloaded.\n" +"[b]Note:[/b] Your application will be [b]reloaded in all browser tabs[/b].\n" +"[b]Note:[/b] Only relevant when exported as a Progressive Web App and " +"[method pwa_needs_update] returns [code]true[/code]." +msgstr "" + +#: doc/classes/JavaScript.xml +msgid "" +"Emitted when an update for this progressive web app has been detected but is " +"waiting to be activated because a previous version is active. See [method " +"pwa_update] to force the update to take place immediately." +msgstr "" + +#: doc/classes/JavaScriptObject.xml +msgid "A wrapper class for native JavaScript objects." +msgstr "" + +#: doc/classes/JavaScriptObject.xml +msgid "" +"JavaScriptObject is used to interact with JavaScript objects retrieved or " +"created via [method JavaScript.get_interface], [method JavaScript." +"create_object], or [method JavaScript.create_callback].\n" +"Example:\n" +"[codeblock]\n" +"extends Node\n" +"\n" +"var _my_js_callback = JavaScript.create_callback(self, \"myCallback\") # " +"This reference must be kept\n" +"var console = JavaScript.get_interface(\"console\")\n" +"\n" +"func _init():\n" +" var buf = JavaScript.create_object(\"ArrayBuffer\", 10) # new " +"ArrayBuffer(10)\n" +" print(buf) # prints [JavaScriptObject:OBJECT_ID]\n" +" var uint8arr = JavaScript.create_object(\"Uint8Array\", buf) # new " +"Uint8Array(buf)\n" +" uint8arr[1] = 255\n" +" prints(uint8arr[1], uint8arr.byteLength) # prints 255 10\n" +" console.log(uint8arr) # prints in browser console \"Uint8Array(10) [ 0, " +"255, 0, 0, 0, 0, 0, 0, 0, 0 ]\"\n" +"\n" +" # Equivalent of JavaScript: Array.from(uint8arr).forEach(myCallback)\n" +" JavaScript.get_interface(\"Array\").from(uint8arr)." +"forEach(_my_js_callback)\n" +"\n" +"func myCallback(args):\n" +" # Will be called with the parameters passed to the \"forEach\" callback\n" +" # [0, 0, [JavaScriptObject:1173]]\n" +" # [255, 1, [JavaScriptObject:1173]]\n" +" # ...\n" +" # [0, 9, [JavaScriptObject:1180]]\n" +" print(args)\n" +"[/codeblock]\n" +"[b]Note:[/b] Only available in the HTML5 platform." +msgstr "" + +#: doc/classes/JNISingleton.xml +msgid "" +"Singleton that connects the engine with Android plugins to interface with " +"native Android code." +msgstr "" + +#: doc/classes/JNISingleton.xml +msgid "" +"The JNISingleton is implemented only in the Android export. It's used to " +"call methods and connect signals from an Android plugin written in Java or " +"Kotlin. Methods and signals can be called and connected to the JNISingleton " +"as if it is a Node. See [url=https://en.wikipedia.org/wiki/" +"Java_Native_Interface]Java Native Interface - Wikipedia[/url] for more " +"information." +msgstr "" + +#: doc/classes/JNISingleton.xml +msgid "Creating Android plugins" +msgstr "" + +#: doc/classes/Joint.xml +msgid "Base class for all 3D joints." +msgstr "" + +#: doc/classes/Joint.xml +msgid "" +"Joints are used to bind together two physics bodies. They have a solver " +"priority and can define if the bodies of the two attached nodes should be " +"able to collide with each other." +msgstr "" + +#: doc/classes/Joint.xml doc/classes/RigidBody.xml doc/classes/VehicleBody.xml +#: doc/classes/VehicleWheel.xml +msgid "3D Truck Town Demo" +msgstr "" + +#: doc/classes/Joint.xml +msgid "" +"If [code]true[/code], the two bodies of the nodes are not able to collide " +"with each other." +msgstr "" + +#: doc/classes/Joint.xml +msgid "The node attached to the first side (A) of the joint." +msgstr "" + +#: doc/classes/Joint.xml +msgid "The node attached to the second side (B) of the joint." +msgstr "" + +#: doc/classes/Joint.xml +msgid "" +"The priority used to define which solver is executed first for multiple " +"joints. The lower the value, the higher the priority." +msgstr "" + +#: doc/classes/Joint2D.xml +msgid "Base node for all joint constraints in 2D physics." +msgstr "" + +#: doc/classes/Joint2D.xml +msgid "" +"Base node for all joint constraints in 2D physics. Joints take 2 bodies and " +"apply a custom constraint." +msgstr "" + +#: doc/classes/Joint2D.xml +msgid "" +"When [member node_a] and [member node_b] move in different directions the " +"[code]bias[/code] controls how fast the joint pulls them back to their " +"original position. The lower the [code]bias[/code] the more the two bodies " +"can pull on the joint." +msgstr "" + +#: doc/classes/Joint2D.xml +msgid "" +"If [code]true[/code], [member node_a] and [member node_b] can not collide." +msgstr "" + +#: doc/classes/Joint2D.xml +msgid "The first body attached to the joint. Must derive from [PhysicsBody2D]." +msgstr "" + +#: doc/classes/Joint2D.xml +msgid "" +"The second body attached to the joint. Must derive from [PhysicsBody2D]." +msgstr "" + +#: doc/classes/JSON.xml +msgid "Helper class for parsing JSON data." +msgstr "" + +#: doc/classes/JSON.xml +msgid "" +"Helper class for parsing JSON data. For usage example and other important " +"hints, see [JSONParseResult]." +msgstr "" + +#: doc/classes/JSON.xml +msgid "" +"Parses a JSON-encoded string and returns a [JSONParseResult] containing the " +"result." +msgstr "" + +#: doc/classes/JSON.xml +msgid "" +"Converts a [Variant] var to JSON text and returns the result. Useful for " +"serializing data to store or send over the network.\n" +"[b]Note:[/b] The JSON specification does not define integer or float types, " +"but only a [i]number[/i] type. Therefore, converting a Variant to JSON text " +"will convert all numerical values to [float] types.\n" +"The [code]indent[/code] parameter controls if and how something is indented, " +"the string used for this parameter will be used where there should be an " +"indent in the output, even spaces like [code]\" \"[/code] will work. " +"[code]\\t[/code] and [code]\\n[/code] can also be used for a tab indent, or " +"to make a newline for each indent respectively.\n" +"[b]Example output:[/b]\n" +"[codeblock]\n" +"## JSON.print(my_dictionary)\n" +"{\"name\":\"my_dictionary\",\"version\":\"1.0.0\",\"entities\":[{\"name\":" +"\"entity_0\",\"value\":\"value_0\"},{\"name\":\"entity_1\",\"value\":" +"\"value_1\"}]}\n" +"\n" +"## JSON.print(my_dictionary, \"\\t\")\n" +"{\n" +" \"name\": \"my_dictionary\",\n" +" \"version\": \"1.0.0\",\n" +" \"entities\": [\n" +" {\n" +" \"name\": \"entity_0\",\n" +" \"value\": \"value_0\"\n" +" },\n" +" {\n" +" \"name\": \"entity_1\",\n" +" \"value\": \"value_1\"\n" +" }\n" +" ]\n" +"}\n" +"\n" +"## JSON.print(my_dictionary, \"...\")\n" +"{\n" +"...\"name\": \"my_dictionary\",\n" +"...\"version\": \"1.0.0\",\n" +"...\"entities\": [\n" +"......{\n" +".........\"name\": \"entity_0\",\n" +".........\"value\": \"value_0\"\n" +"......},\n" +"......{\n" +".........\"name\": \"entity_1\",\n" +".........\"value\": \"value_1\"\n" +"......}\n" +"...]\n" +"}\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/JSONParseResult.xml +msgid "Data class wrapper for decoded JSON." +msgstr "" + +#: doc/classes/JSONParseResult.xml +msgid "" +"Returned by [method JSON.parse], [JSONParseResult] contains the decoded JSON " +"or error information if the JSON source wasn't successfully parsed. You can " +"check if the JSON source was successfully parsed with [code]if json_result." +"error == OK[/code]." +msgstr "" + +#: doc/classes/JSONParseResult.xml +msgid "" +"The error type if the JSON source was not successfully parsed. See the [enum " +"Error] constants." +msgstr "" + +#: doc/classes/JSONParseResult.xml +msgid "" +"The line number where the error occurred if the JSON source was not " +"successfully parsed." +msgstr "" + +#: doc/classes/JSONParseResult.xml +msgid "" +"The error message if the JSON source was not successfully parsed. See the " +"[enum Error] constants." +msgstr "" + +#: doc/classes/JSONParseResult.xml +msgid "" +"A [Variant] containing the parsed JSON. Use [method @GDScript.typeof] or the " +"[code]is[/code] keyword to check if it is what you expect. For example, if " +"the JSON source starts with curly braces ([code]{}[/code]), a [Dictionary] " +"will be returned. If the JSON source starts with brackets ([code][][/code]), " +"an [Array] will be returned.\n" +"[b]Note:[/b] The JSON specification does not define integer or float types, " +"but only a [i]number[/i] type. Therefore, parsing a JSON text will convert " +"all numerical values to [float] types.\n" +"[b]Note:[/b] JSON objects do not preserve key order like Godot dictionaries, " +"thus, you should not rely on keys being in a certain order if a dictionary " +"is constructed from JSON. In contrast, JSON arrays retain the order of their " +"elements:\n" +"[codeblock]\n" +"var p = JSON.parse('[\"hello\", \"world\", \"!\"]')\n" +"if typeof(p.result) == TYPE_ARRAY:\n" +" print(p.result[0]) # Prints \"hello\"\n" +"else:\n" +" push_error(\"Unexpected results.\")\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/JSONRPC.xml +msgid "A helper to handle dictionaries which look like JSONRPC documents." +msgstr "" + +#: doc/classes/JSONRPC.xml +msgid "" +"[url=https://www.jsonrpc.org/]JSON-RPC[/url] is a standard which wraps a " +"method call in a [JSON] object. The object has a particular structure and " +"identifies which method is called, the parameters to that function, and " +"carries an ID to keep track of responses. This class implements that " +"standard on top of [Dictionary]; you will have to convert between a " +"[Dictionary] and [JSON] with other functions." +msgstr "" + +#: doc/classes/JSONRPC.xml +msgid "" +"Returns a dictionary in the form of a JSON-RPC notification. Notifications " +"are one-shot messages which do not expect a response.\n" +"- [code]method[/code]: Name of the method being called.\n" +"- [code]params[/code]: An array or dictionary of parameters being passed to " +"the method." +msgstr "" + +#: doc/classes/JSONRPC.xml +msgid "" +"Returns a dictionary in the form of a JSON-RPC request. Requests are sent to " +"a server with the expectation of a response. The ID field is used for the " +"server to specify which exact request it is responding to.\n" +"- [code]method[/code]: Name of the method being called.\n" +"- [code]params[/code]: An array or dictionary of parameters being passed to " +"the method.\n" +"- [code]id[/code]: Uniquely identifies this request. The server is expected " +"to send a response with the same ID." +msgstr "" + +#: doc/classes/JSONRPC.xml +msgid "" +"When a server has received and processed a request, it is expected to send a " +"response. If you did not want a response then you need to have sent a " +"Notification instead.\n" +"- [code]result[/code]: The return value of the function which was called.\n" +"- [code]id[/code]: The ID of the request this response is targeted to." +msgstr "" + +#: doc/classes/JSONRPC.xml +msgid "" +"Creates a response which indicates a previous reply has failed in some way.\n" +"- [code]code[/code]: The error code corresponding to what kind of error this " +"is. See the [enum ErrorCode] constants.\n" +"- [code]message[/code]: A custom message about this error.\n" +"- [code]id[/code]: The request this error is a response to." +msgstr "" + +#: doc/classes/JSONRPC.xml +msgid "" +"Given a Dictionary which takes the form of a JSON-RPC request: unpack the " +"request and run it. Methods are resolved by looking at the field called " +"\"method\" and looking for an equivalently named function in the JSONRPC " +"object. If one is found that method is called.\n" +"To add new supported methods extend the JSONRPC class and call [method " +"process_action] on your subclass.\n" +"[code]action[/code]: The action to be run, as a Dictionary in the form of a " +"JSON-RPC request or notification." +msgstr "" + +#: doc/classes/JSONRPC.xml +msgid "" +"A method call was requested but no function of that name existed in the " +"JSONRPC subclass." +msgstr "" + +#: doc/classes/KinematicBody.xml +msgid "Kinematic body 3D node." +msgstr "" + +#: doc/classes/KinematicBody.xml +msgid "" +"Kinematic bodies are special types of bodies that are meant to be user-" +"controlled. They are not affected by physics at all; to other types of " +"bodies, such as a character or a rigid body, these are the same as a static " +"body. However, they have two main uses:\n" +"[b]Simulated motion:[/b] When these bodies are moved manually, either from " +"code or from an [AnimationPlayer] (with [member AnimationPlayer." +"playback_process_mode] set to \"physics\"), the physics will automatically " +"compute an estimate of their linear and angular velocity. This makes them " +"very useful for moving platforms or other AnimationPlayer-controlled objects " +"(like a door, a bridge that opens, etc).\n" +"[b]Kinematic characters:[/b] KinematicBody also has an API for moving " +"objects (the [method move_and_collide] and [method move_and_slide] methods) " +"while performing collision tests. This makes them really useful to implement " +"characters that collide against a world, but don't require advanced physics." +msgstr "" + +#: doc/classes/KinematicBody.xml doc/classes/KinematicBody2D.xml +msgid "Kinematic character (2D)" +msgstr "" + +#: doc/classes/KinematicBody.xml +msgid "" +"Returns [code]true[/code] if the specified [code]axis[/code] is locked. See " +"also [member move_lock_x], [member move_lock_y] and [member move_lock_z]." +msgstr "" + +#: doc/classes/KinematicBody.xml +msgid "" +"Returns the floor's collision angle at the last collision point according to " +"[code]up_direction[/code], which is [code]Vector3.UP[/code] by default. This " +"value is always positive and only valid after calling [method " +"move_and_slide] and when [method is_on_floor] returns [code]true[/code]." +msgstr "" + +#: doc/classes/KinematicBody.xml doc/classes/KinematicBody2D.xml +msgid "" +"Returns the surface normal of the floor at the last collision point. Only " +"valid after calling [method move_and_slide] or [method " +"move_and_slide_with_snap] and when [method is_on_floor] returns [code]true[/" +"code]." +msgstr "" + +#: doc/classes/KinematicBody.xml doc/classes/KinematicBody2D.xml +msgid "" +"Returns the linear velocity of the floor at the last collision point. Only " +"valid after calling [method move_and_slide] or [method " +"move_and_slide_with_snap] and when [method is_on_floor] returns [code]true[/" +"code]." +msgstr "" + +#: doc/classes/KinematicBody.xml +msgid "" +"Returns a [KinematicCollision], which contains information about the latest " +"collision that occurred during the last call to [method move_and_slide]." +msgstr "" + +#: doc/classes/KinematicBody.xml +msgid "" +"Returns a [KinematicCollision], which contains information about a collision " +"that occurred during the last call to [method move_and_slide] or [method " +"move_and_slide_with_snap]. Since the body can collide several times in a " +"single call to [method move_and_slide], you must specify the index of the " +"collision in the range 0 to ([method get_slide_count] - 1)." +msgstr "" + +#: doc/classes/KinematicBody.xml doc/classes/KinematicBody2D.xml +msgid "" +"Returns the number of times the body collided and changed direction during " +"the last call to [method move_and_slide] or [method " +"move_and_slide_with_snap]." +msgstr "" + +#: doc/classes/KinematicBody.xml doc/classes/KinematicBody2D.xml +msgid "" +"Returns [code]true[/code] if the body collided with the ceiling on the last " +"call of [method move_and_slide] or [method move_and_slide_with_snap]. " +"Otherwise, returns [code]false[/code]." +msgstr "" + +#: doc/classes/KinematicBody.xml doc/classes/KinematicBody2D.xml +msgid "" +"Returns [code]true[/code] if the body collided with the floor on the last " +"call of [method move_and_slide] or [method move_and_slide_with_snap]. " +"Otherwise, returns [code]false[/code]." +msgstr "" + +#: doc/classes/KinematicBody.xml doc/classes/KinematicBody2D.xml +msgid "" +"Returns [code]true[/code] if the body collided with a wall on the last call " +"of [method move_and_slide] or [method move_and_slide_with_snap]. Otherwise, " +"returns [code]false[/code]." +msgstr "" + +#: doc/classes/KinematicBody.xml +msgid "" +"Moves the body along the vector [code]rel_vec[/code]. The body will stop if " +"it collides. Returns a [KinematicCollision], which contains information " +"about the collision when stopped, or when touching another body along the " +"motion.\n" +"If [code]test_only[/code] is [code]true[/code], the body does not move but " +"the would-be collision information is given." +msgstr "" + +#: doc/classes/KinematicBody.xml +msgid "" +"Moves the body along a vector. If the body collides with another, it will " +"slide along the other body rather than stop immediately. If the other body " +"is a [KinematicBody] or [RigidBody], it will also be affected by the motion " +"of the other body. You can use this to make moving and rotating platforms, " +"or to make nodes push other nodes.\n" +"This method should be used in [method Node._physics_process] (or in a method " +"called by [method Node._physics_process]), as it uses the physics step's " +"[code]delta[/code] value automatically in calculations. Otherwise, the " +"simulation will run at an incorrect speed.\n" +"[code]linear_velocity[/code] is the velocity vector (typically meters per " +"second). Unlike in [method move_and_collide], you should [i]not[/i] multiply " +"it by [code]delta[/code] — the physics engine handles applying the " +"velocity.\n" +"[code]up_direction[/code] is the up direction, used to determine what is a " +"wall and what is a floor or a ceiling. If set to the default value of " +"[code]Vector3(0, 0, 0)[/code], everything is considered a wall.\n" +"If [code]stop_on_slope[/code] is [code]true[/code], body will not slide on " +"slopes when you include gravity in [code]linear_velocity[/code] and the body " +"is standing still.\n" +"If the body collides, it will change direction a maximum of " +"[code]max_slides[/code] times before it stops.\n" +"[code]floor_max_angle[/code] is the maximum angle (in radians) where a slope " +"is still considered a floor (or a ceiling), rather than a wall. The default " +"value equals 45 degrees.\n" +"If [code]infinite_inertia[/code] is [code]true[/code], body will be able to " +"push [RigidBody] nodes, but it won't also detect any collisions with them. " +"If [code]false[/code], it will interact with [RigidBody] nodes like with " +"[StaticBody].\n" +"Returns the [code]linear_velocity[/code] vector, rotated and/or scaled if a " +"slide collision occurred. To get detailed information about collisions that " +"occurred, use [method get_slide_collision].\n" +"When the body touches a moving platform, the platform's velocity is " +"automatically added to the body motion. If a collision occurs due to the " +"platform's motion, it will always be first in the slide collisions." +msgstr "" + +#: doc/classes/KinematicBody.xml +msgid "" +"Moves the body while keeping it attached to slopes. Similar to [method " +"move_and_slide].\n" +"As long as the [code]snap[/code] vector is in contact with the ground, the " +"body will remain attached to the surface. This means you must disable snap " +"in order to jump, for example. You can do this by setting [code]snap[/code] " +"to [code](0, 0, 0)[/code] or by using [method move_and_slide] instead." +msgstr "" + +#: doc/classes/KinematicBody.xml +msgid "" +"Locks or unlocks the specified [code]axis[/code] depending on the value of " +"[code]lock[/code]. See also [member move_lock_x], [member move_lock_y] and " +"[member move_lock_z]." +msgstr "" + +#: doc/classes/KinematicBody.xml +msgid "" +"Checks for collisions without moving the body. Virtually sets the node's " +"position, scale and rotation to that of the given [Transform], then tries to " +"move the body along the vector [code]rel_vec[/code]. Returns [code]true[/" +"code] if a collision would stop the body from moving along the whole path.\n" +"Use [method move_and_collide] instead for detecting collision with touching " +"bodies." +msgstr "" + +#: doc/classes/KinematicBody.xml +msgid "Lock the body's X axis movement." +msgstr "" + +#: doc/classes/KinematicBody.xml +msgid "Lock the body's Y axis movement." +msgstr "" + +#: doc/classes/KinematicBody.xml +msgid "Lock the body's Z axis movement." +msgstr "" + +#: doc/classes/KinematicBody.xml doc/classes/KinematicBody2D.xml +msgid "" +"Extra margin used for collision recovery in motion functions (see [method " +"move_and_collide], [method move_and_slide], [method " +"move_and_slide_with_snap]).\n" +"If the body is at least this close to another body, it will consider them to " +"be colliding and will be pushed away before performing the actual motion.\n" +"A higher value means it's more flexible for detecting collision, which helps " +"with consistently detecting walls and floors.\n" +"A lower value forces the collision algorithm to use more exact detection, so " +"it can be used in cases that specifically require precision, e.g at very low " +"scale to avoid visible jittering, or for stability with a stack of kinematic " +"bodies." +msgstr "" + +#: doc/classes/KinematicBody.xml doc/classes/KinematicBody2D.xml +msgid "" +"If [code]true[/code], the body's movement will be synchronized to the " +"physics frame. This is useful when animating movement via [AnimationPlayer], " +"for example on moving platforms. Do [b]not[/b] use together with [method " +"move_and_slide] or [method move_and_collide] functions." +msgstr "" + +#: doc/classes/KinematicBody.xml +msgid "" +"Lock the body's X axis movement. Deprecated alias for [member " +"axis_lock_motion_x]." +msgstr "" + +#: doc/classes/KinematicBody.xml +msgid "" +"Lock the body's Y axis movement. Deprecated alias for [member " +"axis_lock_motion_y]." +msgstr "" + +#: doc/classes/KinematicBody.xml +msgid "" +"Lock the body's Z axis movement. Deprecated alias for [member " +"axis_lock_motion_z]." +msgstr "" + +#: doc/classes/KinematicBody.xml doc/classes/KinematicBody2D.xml +msgid "" +"Sets the behavior to apply when you leave a moving platform. By default, to " +"be physically accurate, when you leave the last platform velocity is " +"applied. See [enum MovingPlatformApplyVelocityOnLeave] constants for " +"available behavior." +msgstr "" + +#: doc/classes/KinematicBody.xml doc/classes/KinematicBody2D.xml +msgid "Add the last platform velocity when you leave a moving platform." +msgstr "" + +#: doc/classes/KinematicBody.xml doc/classes/KinematicBody2D.xml +msgid "" +"Add the last platform velocity when you leave a moving platform, but any " +"downward motion is ignored. It's useful to keep full jump height even when " +"the platform is moving down." +msgstr "" + +#: doc/classes/KinematicBody.xml doc/classes/KinematicBody2D.xml +msgid "Do nothing when leaving a platform." +msgstr "" + +#: doc/classes/KinematicBody2D.xml +msgid "Kinematic body 2D node." +msgstr "" + +#: doc/classes/KinematicBody2D.xml +msgid "" +"Kinematic bodies are special types of bodies that are meant to be user-" +"controlled. They are not affected by physics at all; to other types of " +"bodies, such as a character or a rigid body, these are the same as a static " +"body. However, they have two main uses:\n" +"[b]Simulated motion:[/b] When these bodies are moved manually, either from " +"code or from an [AnimationPlayer] (with [member AnimationPlayer." +"playback_process_mode] set to \"physics\"), the physics will automatically " +"compute an estimate of their linear and angular velocity. This makes them " +"very useful for moving platforms or other AnimationPlayer-controlled objects " +"(like a door, a bridge that opens, etc).\n" +"[b]Kinematic characters:[/b] KinematicBody2D also has an API for moving " +"objects (the [method move_and_collide] and [method move_and_slide] methods) " +"while performing collision tests. This makes them really useful to implement " +"characters that collide against a world, but don't require advanced physics." +msgstr "" + +#: doc/classes/KinematicBody2D.xml +msgid "Using KinematicBody2D" +msgstr "" + +#: doc/classes/KinematicBody2D.xml +msgid "" +"Returns the floor's collision angle at the last collision point according to " +"[code]up_direction[/code], which is [code]Vector2.UP[/code] by default. This " +"value is always positive and only valid after calling [method " +"move_and_slide] and when [method is_on_floor] returns [code]true[/code]." +msgstr "" + +#: doc/classes/KinematicBody2D.xml +msgid "" +"Returns a [KinematicCollision2D], which contains information about the " +"latest collision that occurred during the last call to [method " +"move_and_slide]." +msgstr "" + +#: doc/classes/KinematicBody2D.xml +msgid "" +"Returns a [KinematicCollision2D], which contains information about a " +"collision that occurred during the last call to [method move_and_slide] or " +"[method move_and_slide_with_snap]. Since the body can collide several times " +"in a single call to [method move_and_slide], you must specify the index of " +"the collision in the range 0 to ([method get_slide_count] - 1).\n" +"[b]Example usage:[/b]\n" +"[codeblock]\n" +"for i in get_slide_count():\n" +" var collision = get_slide_collision(i)\n" +" print(\"Collided with: \", collision.collider.name)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/KinematicBody2D.xml +msgid "" +"Moves the body along the vector [code]rel_vec[/code]. The body will stop if " +"it collides. Returns a [KinematicCollision2D], which contains information " +"about the collision when stopped, or when touching another body along the " +"motion.\n" +"If [code]test_only[/code] is [code]true[/code], the body does not move but " +"the would-be collision information is given." +msgstr "" + +#: doc/classes/KinematicBody2D.xml +msgid "" +"Moves the body along a vector. If the body collides with another, it will " +"slide along the other body rather than stop immediately. If the other body " +"is a [KinematicBody2D] or [RigidBody2D], it will also be affected by the " +"motion of the other body. You can use this to make moving and rotating " +"platforms, or to make nodes push other nodes.\n" +"This method should be used in [method Node._physics_process] (or in a method " +"called by [method Node._physics_process]), as it uses the physics step's " +"[code]delta[/code] value automatically in calculations. Otherwise, the " +"simulation will run at an incorrect speed.\n" +"[code]linear_velocity[/code] is the velocity vector in pixels per second. " +"Unlike in [method move_and_collide], you should [i]not[/i] multiply it by " +"[code]delta[/code] — the physics engine handles applying the velocity.\n" +"[code]up_direction[/code] is the up direction, used to determine what is a " +"wall and what is a floor or a ceiling. If set to the default value of " +"[code]Vector2(0, 0)[/code], everything is considered a wall. This is useful " +"for topdown games.\n" +"If [code]stop_on_slope[/code] is [code]true[/code], body will not slide on " +"slopes when you include gravity in [code]linear_velocity[/code] and the body " +"is standing still.\n" +"If the body collides, it will change direction a maximum of " +"[code]max_slides[/code] times before it stops.\n" +"[code]floor_max_angle[/code] is the maximum angle (in radians) where a slope " +"is still considered a floor (or a ceiling), rather than a wall. The default " +"value equals 45 degrees.\n" +"If [code]infinite_inertia[/code] is [code]true[/code], body will be able to " +"push [RigidBody2D] nodes, but it won't also detect any collisions with them. " +"If [code]false[/code], it will interact with [RigidBody2D] nodes like with " +"[StaticBody2D].\n" +"Returns the [code]linear_velocity[/code] vector, rotated and/or scaled if a " +"slide collision occurred. To get detailed information about collisions that " +"occurred, use [method get_slide_collision].\n" +"When the body touches a moving platform, the platform's velocity is " +"automatically added to the body motion. If a collision occurs due to the " +"platform's motion, it will always be first in the slide collisions." +msgstr "" + +#: doc/classes/KinematicBody2D.xml +msgid "" +"Moves the body while keeping it attached to slopes. Similar to [method " +"move_and_slide].\n" +"As long as the [code]snap[/code] vector is in contact with the ground, the " +"body will remain attached to the surface. This means you must disable snap " +"in order to jump, for example. You can do this by setting [code]snap[/code] " +"to [code](0, 0)[/code] or by using [method move_and_slide] instead." +msgstr "" + +#: doc/classes/KinematicBody2D.xml +msgid "" +"Checks for collisions without moving the body. Virtually sets the node's " +"position, scale and rotation to that of the given [Transform2D], then tries " +"to move the body along the vector [code]rel_vec[/code]. Returns [code]true[/" +"code] if a collision would stop the body from moving along the whole path.\n" +"Use [method move_and_collide] instead for detecting collision with touching " +"bodies." +msgstr "" + +#: doc/classes/KinematicCollision.xml +msgid "Collision data for [KinematicBody] collisions." +msgstr "" + +#: doc/classes/KinematicCollision.xml +msgid "" +"Contains collision data for [KinematicBody] collisions. When a " +"[KinematicBody] is moved using [method KinematicBody.move_and_collide], it " +"stops if it detects a collision with another body. If a collision is " +"detected, a KinematicCollision object is returned.\n" +"This object contains information about the collision, including the " +"colliding object, the remaining motion, and the collision position. This " +"information can be used to calculate a collision response." +msgstr "" + +#: doc/classes/KinematicCollision.xml +msgid "" +"The collision angle according to [code]up_direction[/code], which is " +"[code]Vector3.UP[/code] by default. This value is always positive." +msgstr "" + +#: doc/classes/KinematicCollision.xml doc/classes/KinematicCollision2D.xml +msgid "The colliding body." +msgstr "" + +#: doc/classes/KinematicCollision.xml doc/classes/KinematicCollision2D.xml +msgid "" +"The colliding body's unique instance ID. See [method Object.get_instance_id]." +msgstr "" + +#: doc/classes/KinematicCollision.xml doc/classes/KinematicCollision2D.xml +msgid "The colliding body's metadata. See [Object]." +msgstr "" + +#: doc/classes/KinematicCollision.xml +msgid "The colliding body's [RID] used by the [PhysicsServer]." +msgstr "" + +#: doc/classes/KinematicCollision.xml doc/classes/KinematicCollision2D.xml +msgid "The colliding body's shape." +msgstr "" + +#: doc/classes/KinematicCollision.xml +msgid "The colliding shape's index. See [CollisionObject]." +msgstr "" + +#: doc/classes/KinematicCollision.xml doc/classes/KinematicCollision2D.xml +msgid "The colliding object's velocity." +msgstr "" + +#: doc/classes/KinematicCollision.xml doc/classes/KinematicCollision2D.xml +msgid "The moving object's colliding shape." +msgstr "" + +#: doc/classes/KinematicCollision.xml doc/classes/KinematicCollision2D.xml +msgid "The colliding body's shape's normal at the point of collision." +msgstr "" + +#: doc/classes/KinematicCollision.xml doc/classes/KinematicCollision2D.xml +msgid "The point of collision, in global coordinates." +msgstr "" + +#: doc/classes/KinematicCollision.xml doc/classes/KinematicCollision2D.xml +msgid "The moving object's remaining movement vector." +msgstr "" + +#: doc/classes/KinematicCollision.xml doc/classes/KinematicCollision2D.xml +msgid "The distance the moving object traveled before collision." +msgstr "" + +#: doc/classes/KinematicCollision2D.xml +msgid "Collision data for [KinematicBody2D] collisions." +msgstr "" + +#: doc/classes/KinematicCollision2D.xml +msgid "" +"Contains collision data for [KinematicBody2D] collisions. When a " +"[KinematicBody2D] is moved using [method KinematicBody2D.move_and_collide], " +"it stops if it detects a collision with another body. If a collision is " +"detected, a KinematicCollision2D object is returned.\n" +"This object contains information about the collision, including the " +"colliding object, the remaining motion, and the collision position. This " +"information can be used to calculate a collision response." +msgstr "" + +#: doc/classes/KinematicCollision2D.xml +msgid "" +"The collision angle according to [code]up_direction[/code], which is " +"[code]Vector2.UP[/code] by default. This value is always positive." +msgstr "" + +#: doc/classes/KinematicCollision2D.xml +msgid "The colliding body's [RID] used by the [Physics2DServer]." +msgstr "" + +#: doc/classes/KinematicCollision2D.xml +msgid "The colliding shape's index. See [CollisionObject2D]." +msgstr "" + +#: doc/classes/Label.xml +msgid "" +"Displays plain text in a line or wrapped inside a rectangle. For formatted " +"text, use [RichTextLabel]." +msgstr "" + +#: doc/classes/Label.xml +msgid "" +"Label displays plain text on the screen. It gives you control over the " +"horizontal and vertical alignment and can wrap the text inside the node's " +"bounding rectangle. It doesn't support bold, italics, or other formatting. " +"For that, use [RichTextLabel] instead.\n" +"[b]Note:[/b] Contrarily to most other [Control]s, Label's [member Control." +"mouse_filter] defaults to [constant Control.MOUSE_FILTER_IGNORE] (i.e. it " +"doesn't react to mouse input events). This implies that a label won't " +"display any configured [member Control.hint_tooltip], unless you change its " +"mouse filter.\n" +"[b]Note:[/b] Unicode characters after [code]0xffff[/code] (such as most " +"emoji) are [i]not[/i] supported on Windows. They will display as unknown " +"characters instead. This will be resolved in Godot 4.0." +msgstr "" + +#: doc/classes/Label.xml +msgid "Returns the amount of lines of text the Label has." +msgstr "" + +#: doc/classes/Label.xml +msgid "Returns the font size in pixels." +msgstr "" + +#: doc/classes/Label.xml +msgid "" +"Returns the total number of printable characters in the text (excluding " +"spaces and newlines)." +msgstr "" + +#: doc/classes/Label.xml +msgid "" +"Returns the number of lines shown. Useful if the [Label]'s height cannot " +"currently display all lines." +msgstr "" + +#: doc/classes/Label.xml +msgid "" +"Controls the text's horizontal align. Supports left, center, right, and " +"fill, or justify. Set it to one of the [enum Align] constants." +msgstr "" + +#: doc/classes/Label.xml +msgid "" +"If [code]true[/code], wraps the text inside the node's bounding rectangle. " +"If you resize the node, it will change its height automatically to show all " +"the text." +msgstr "" + +#: doc/classes/Label.xml +msgid "" +"If [code]true[/code], the Label only shows the text that fits inside its " +"bounding rectangle and will clip text horizontally." +msgstr "" + +#: doc/classes/Label.xml +msgid "" +"The node ignores the first [code]lines_skipped[/code] lines before it starts " +"to display text." +msgstr "" + +#: doc/classes/Label.xml +msgid "Limits the lines of text the node shows on screen." +msgstr "" + +#: doc/classes/Label.xml +msgid "" +"Limits the amount of visible characters. If you set [code]percent_visible[/" +"code] to 0.5, only up to half of the text's characters will display on " +"screen. Useful to animate the text in a dialog box." +msgstr "" + +#: doc/classes/Label.xml doc/classes/Label3D.xml +msgid "The text to display on screen." +msgstr "" + +#: doc/classes/Label.xml doc/classes/Label3D.xml doc/classes/TextMesh.xml +msgid "If [code]true[/code], all the text displays as UPPERCASE." +msgstr "" + +#: doc/classes/Label.xml +msgid "" +"Controls the text's vertical align. Supports top, center, bottom, and fill. " +"Set it to one of the [enum VAlign] constants." +msgstr "" + +#: doc/classes/Label.xml +msgid "Restricts the number of characters to display. Set to -1 to disable." +msgstr "" + +#: doc/classes/Label.xml doc/classes/Label3D.xml doc/classes/TextMesh.xml +msgid "Align rows to the left (default)." +msgstr "" + +#: doc/classes/Label.xml doc/classes/Label3D.xml doc/classes/TextMesh.xml +msgid "Align rows centered." +msgstr "" + +#: doc/classes/Label.xml doc/classes/Label3D.xml doc/classes/TextMesh.xml +msgid "Align rows to the right." +msgstr "" + +#: doc/classes/Label.xml doc/classes/Label3D.xml +msgid "Expand row whitespaces to fit the width." +msgstr "" + +#: doc/classes/Label.xml doc/classes/Label3D.xml +msgid "Align the whole text to the top." +msgstr "" + +#: doc/classes/Label.xml doc/classes/Label3D.xml +msgid "Align the whole text to the center." +msgstr "" + +#: doc/classes/Label.xml doc/classes/Label3D.xml +msgid "Align the whole text to the bottom." +msgstr "" + +#: doc/classes/Label.xml doc/classes/Label3D.xml +msgid "Align the whole text by spreading the rows." +msgstr "" + +#: doc/classes/Label.xml +msgid "Default text [Color] of the [Label]." +msgstr "" + +#: doc/classes/Label.xml +msgid "[Color] of the text's shadow effect." +msgstr "" + +#: doc/classes/Label.xml +msgid "The tint of [Font]'s outline. See [member DynamicFont.outline_color]." +msgstr "" + +#: doc/classes/Label.xml +msgid "Vertical space between lines in multiline [Label]." +msgstr "" + +#: doc/classes/Label.xml +msgid "" +"Boolean value. If set to 1 ([code]true[/code]), the shadow will be displayed " +"around the whole text as an outline." +msgstr "" + +#: doc/classes/Label.xml +msgid "The horizontal offset of the text's shadow." +msgstr "" + +#: doc/classes/Label.xml +msgid "The vertical offset of the text's shadow." +msgstr "" + +#: doc/classes/Label.xml +msgid "[Font] used for the [Label]'s text." +msgstr "" + +#: doc/classes/Label.xml +msgid "Background [StyleBox] for the [Label]." +msgstr "" + +#: doc/classes/Label3D.xml +msgid "Displays plain text in a 3D world." +msgstr "" + +#: doc/classes/Label3D.xml +msgid "" +"Label3D displays plain text in a 3D world. It gives you control over the " +"horizontal and vertical alignment." +msgstr "" + +#: doc/classes/Label3D.xml +msgid "" +"Returns a [TriangleMesh] with the label's vertices following its current " +"configuration (such as its [member pixel_size])." +msgstr "" + +#: doc/classes/Label3D.xml +msgid "" +"If [code]true[/code], the specified flag will be enabled. See [enum Label3D." +"DrawFlags] for a list of flags." +msgstr "" + +#: doc/classes/Label3D.xml +msgid "" +"The alpha cutting mode to use for the sprite. See [enum AlphaCutMode] for " +"possible values." +msgstr "" + +#: doc/classes/Label3D.xml doc/classes/SpatialMaterial.xml +msgid "Threshold at which the alpha scissor will discard values." +msgstr "" + +#: doc/classes/Label3D.xml +msgid "If [code]true[/code], wraps the text to the [member width]." +msgstr "" + +#: doc/classes/Label3D.xml +msgid "" +"The billboard mode to use for the label. See [enum SpatialMaterial." +"BillboardMode] for possible values." +msgstr "" + +#: doc/classes/Label3D.xml +msgid "" +"If [code]true[/code], text can be seen from the back as well, if " +"[code]false[/code], it is invisible when looking at it from behind." +msgstr "" + +#: doc/classes/Label3D.xml doc/classes/SpriteBase3D.xml +msgid "" +"If [code]true[/code], the label is rendered at the same size regardless of " +"distance." +msgstr "" + +#: doc/classes/Label3D.xml +msgid "[Font] used for the [Label3D]'s text." +msgstr "" + +#: doc/classes/Label3D.xml +msgid "" +"Controls the text's horizontal alignment. Supports left, center, right. Set " +"it to one of the [enum Align] constants." +msgstr "" + +#: doc/classes/Label3D.xml +msgid "Vertical space between lines in multiline [Label3D]." +msgstr "" + +#: doc/classes/Label3D.xml +msgid "Text [Color] of the [Label3D]." +msgstr "" + +#: doc/classes/Label3D.xml doc/classes/SpatialMaterial.xml +#: doc/classes/SpriteBase3D.xml +msgid "" +"If [code]true[/code], depth testing is disabled and the object will be drawn " +"in render order." +msgstr "" + +#: doc/classes/Label3D.xml +msgid "The text drawing offset (in pixels)." +msgstr "" + +#: doc/classes/Label3D.xml +msgid "The tint of [Font]'s outline." +msgstr "" + +#: doc/classes/Label3D.xml +msgid "" +"Sets the render priority for the text outline. Higher priority objects will " +"be sorted in front of lower priority objects.\n" +"[b]Note:[/b] This only applies if [member alpha_cut] is set to [constant " +"ALPHA_CUT_DISABLED] (default value).\n" +"[b]Note:[/b] This only applies to sorting of transparent objects. This will " +"not impact how transparent objects are sorted relative to opaque objects. " +"This is because opaque objects are not sorted, while transparent objects are " +"sorted from back to front (subject to priority)." +msgstr "" + +#: doc/classes/Label3D.xml +msgid "The size of one pixel's width on the label to scale it in 3D." +msgstr "" + +#: doc/classes/Label3D.xml +msgid "" +"Sets the render priority for the text. Higher priority objects will be " +"sorted in front of lower priority objects.\n" +"[b]Note:[/b] This only applies if [member alpha_cut] is set to [constant " +"ALPHA_CUT_DISABLED] (default value).\n" +"[b]Note:[/b] This only applies to sorting of transparent objects. This will " +"not impact how transparent objects are sorted relative to opaque objects. " +"This is because opaque objects are not sorted, while transparent objects are " +"sorted from back to front (subject to priority)." +msgstr "" + +#: doc/classes/Label3D.xml +msgid "" +"If [code]true[/code], the [Light] in the [Environment] has effects on the " +"label." +msgstr "" + +#: doc/classes/Label3D.xml +msgid "" +"Controls the text's vertical alignment. Supports top, center, bottom. Set it " +"to one of the [enum VAlign] constants." +msgstr "" + +#: doc/classes/Label3D.xml +msgid "Text width (in pixels), used for autowrap and fill alignment." +msgstr "" + +#: doc/classes/Label3D.xml +msgid "If set, lights in the environment affect the label." +msgstr "" + +#: doc/classes/Label3D.xml +msgid "" +"If set, text can be seen from the back as well. If not, the text is " +"invisible when looking at it from behind." +msgstr "" + +#: doc/classes/Label3D.xml doc/classes/SpatialMaterial.xml +#: doc/classes/SpriteBase3D.xml +msgid "" +"Disables the depth test, so this object is drawn on top of all others. " +"However, objects drawn after it in the draw order may cover it." +msgstr "" + +#: doc/classes/Label3D.xml +msgid "" +"Label is scaled by depth so that it always appears the same size on screen." +msgstr "" + +#: doc/classes/Label3D.xml doc/classes/SpriteBase3D.xml +msgid "Represents the size of the [enum DrawFlags] enum." +msgstr "" + +#: doc/classes/Label3D.xml +msgid "" +"This mode performs standard alpha blending. It can display translucent " +"areas, but transparency sorting issues may be visible when multiple " +"transparent materials are overlapping." +msgstr "" + +#: doc/classes/Label3D.xml +msgid "" +"This mode only allows fully transparent or fully opaque pixels. This mode is " +"also known as [i]alpha testing[/i] or [i]1-bit transparency[/i].\n" +"[b]Note:[/b] This mode might have issues with anti-aliased fonts and " +"outlines, try adjusting [member alpha_scissor_threshold] or using SDF font.\n" +"[b]Note:[/b] When using text with overlapping glyphs (e.g., cursive " +"scripts), this mode might have transparency sorting issues between the main " +"text and the outline." +msgstr "" + +#: doc/classes/Label3D.xml +msgid "" +"This mode draws fully opaque pixels in the depth prepass. This is slower " +"than [constant ALPHA_CUT_DISABLED] or [constant ALPHA_CUT_DISCARD], but it " +"allows displaying translucent areas and smooth edges while using proper " +"sorting.\n" +"[b]Note:[/b] When using text with overlapping glyphs (e.g., cursive " +"scripts), this mode might have transparency sorting issues between the main " +"text and the outline." +msgstr "" + +#: doc/classes/LargeTexture.xml +msgid "" +"[i]Deprecated.[/i] A [Texture] capable of storing many smaller textures with " +"offsets." +msgstr "" + +#: doc/classes/LargeTexture.xml +msgid "" +"[i]Deprecated (will be removed in Godot 4.0).[/i] A [Texture] capable of " +"storing many smaller textures with offsets.\n" +"You can dynamically add pieces ([Texture]s) to this [LargeTexture] using " +"different offsets." +msgstr "" + +#: doc/classes/LargeTexture.xml +msgid "" +"Adds [code]texture[/code] to this [LargeTexture], starting on offset " +"[code]ofs[/code]." +msgstr "" + +#: doc/classes/LargeTexture.xml +msgid "Clears the [LargeTexture]." +msgstr "" + +#: doc/classes/LargeTexture.xml +msgid "Returns the number of pieces currently in this [LargeTexture]." +msgstr "" + +#: doc/classes/LargeTexture.xml +msgid "Returns the offset of the piece with the index [code]idx[/code]." +msgstr "" + +#: doc/classes/LargeTexture.xml +msgid "Returns the [Texture] of the piece with the index [code]idx[/code]." +msgstr "" + +#: doc/classes/LargeTexture.xml +msgid "" +"Sets the offset of the piece with the index [code]idx[/code] to [code]ofs[/" +"code]." +msgstr "" + +#: doc/classes/LargeTexture.xml +msgid "" +"Sets the [Texture] of the piece with index [code]idx[/code] to " +"[code]texture[/code]." +msgstr "" + +#: doc/classes/LargeTexture.xml +msgid "Sets the size of this [LargeTexture]." +msgstr "" + +#: doc/classes/Light.xml +msgid "Provides a base class for different kinds of light nodes." +msgstr "" + +#: doc/classes/Light.xml +msgid "" +"Light is the [i]abstract[/i] base class for light nodes. As it can't be " +"instanced, it shouldn't be used directly. Other types of light nodes inherit " +"from it. Light contains the common variables and parameters used for " +"lighting." +msgstr "" + +#: doc/classes/Light.xml doc/classes/SpotLight.xml +msgid "3D lights and shadows" +msgstr "" + +#: doc/classes/Light.xml +msgid "Returns the value of the specified [enum Light.Param] parameter." +msgstr "" + +#: doc/classes/Light.xml +msgid "Sets the value of the specified [enum Light.Param] parameter." +msgstr "" + +#: doc/classes/Light.xml +msgid "" +"If [code]true[/code], the light only appears in the editor and will not be " +"visible at runtime." +msgstr "" + +#: doc/classes/Light.xml +msgid "The light's bake mode. See [enum BakeMode]." +msgstr "" + +#: doc/classes/Light.xml +msgid "" +"The light's color. An [i]overbright[/i] color can be used to achieve a " +"result equivalent to increasing the light's [member light_energy]." +msgstr "" + +#: doc/classes/Light.xml +msgid "The light will affect objects in the selected layers." +msgstr "" + +#: doc/classes/Light.xml +msgid "" +"The light's strength multiplier (this is not a physical unit). For " +"[OmniLight] and [SpotLight], changing this value will only change the light " +"color's intensity, not the light's radius." +msgstr "" + +#: doc/classes/Light.xml +msgid "" +"Secondary multiplier used with indirect light (light bounces). This works on " +"both [BakedLightmap] and [GIProbe]." +msgstr "" + +#: doc/classes/Light.xml +msgid "" +"If [code]true[/code], the light's effect is reversed, darkening areas and " +"casting bright shadows." +msgstr "" + +#: doc/classes/Light.xml +msgid "" +"The size of the light in Godot units. Only considered in baked lightmaps and " +"only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " +"this value will make the shadows appear blurrier. This can be used to " +"simulate area lights to an extent." +msgstr "" + +#: doc/classes/Light.xml +msgid "" +"The intensity of the specular blob in objects affected by the light. At " +"[code]0[/code], the light becomes a pure diffuse light. When not baking " +"emission, this can be used to avoid unrealistic reflections when placing " +"lights above an emissive surface." +msgstr "" + +#: doc/classes/Light.xml +msgid "" +"Used to adjust shadow appearance. Too small a value results in self-" +"shadowing (\"shadow acne\"), while too large a value causes shadows to " +"separate from casters (\"peter-panning\"). Adjust as needed." +msgstr "" + +#: doc/classes/Light.xml +msgid "The color of shadows cast by this light." +msgstr "" + +#: doc/classes/Light.xml +msgid "" +"Attempts to reduce [member shadow_bias] gap by rendering screen-space " +"contact shadows. This has a performance impact, especially at higher " +"values.\n" +"[b]Note:[/b] Contact shadows can look broken, so leaving this property to " +"[code]0.0[/code] is recommended." +msgstr "" + +#: doc/classes/Light.xml +msgid "If [code]true[/code], the light will cast shadows." +msgstr "" + +#: doc/classes/Light.xml +msgid "" +"If [code]true[/code], reverses the backface culling of the mesh. This can be " +"useful when you have a flat mesh that has a light behind it. If you need to " +"cast a shadow on both sides of the mesh, set the mesh to use double-sided " +"shadows with [constant GeometryInstance.SHADOW_CASTING_SETTING_DOUBLE_SIDED]." +msgstr "" + +#: doc/classes/Light.xml +msgid "Constant for accessing [member light_energy]." +msgstr "" + +#: doc/classes/Light.xml +msgid "Constant for accessing [member light_indirect_energy]." +msgstr "" + +#: doc/classes/Light.xml +msgid "Constant for accessing [member light_size]." +msgstr "" + +#: doc/classes/Light.xml +msgid "Constant for accessing [member light_specular]." +msgstr "" + +#: doc/classes/Light.xml +msgid "" +"Constant for accessing [member OmniLight.omni_range] or [member SpotLight." +"spot_range]." +msgstr "" + +#: doc/classes/Light.xml +msgid "" +"Constant for accessing [member OmniLight.omni_attenuation] or [member " +"SpotLight.spot_attenuation]." +msgstr "" + +#: doc/classes/Light.xml +msgid "Constant for accessing [member SpotLight.spot_angle]." +msgstr "" + +#: doc/classes/Light.xml +msgid "Constant for accessing [member SpotLight.spot_angle_attenuation]." +msgstr "" + +#: doc/classes/Light.xml +msgid "Constant for accessing [member shadow_contact]." +msgstr "" + +#: doc/classes/Light.xml +msgid "" +"Constant for accessing [member DirectionalLight." +"directional_shadow_max_distance]." +msgstr "" + +#: doc/classes/Light.xml +msgid "" +"Constant for accessing [member DirectionalLight.directional_shadow_split_1]." +msgstr "" + +#: doc/classes/Light.xml +msgid "" +"Constant for accessing [member DirectionalLight.directional_shadow_split_2]." +msgstr "" + +#: doc/classes/Light.xml +msgid "" +"Constant for accessing [member DirectionalLight.directional_shadow_split_3]." +msgstr "" + +#: doc/classes/Light.xml +msgid "" +"Constant for accessing [member DirectionalLight." +"directional_shadow_normal_bias]." +msgstr "" + +#: doc/classes/Light.xml +msgid "Constant for accessing [member shadow_bias]." +msgstr "" + +#: doc/classes/Light.xml +msgid "" +"Constant for accessing [member DirectionalLight." +"directional_shadow_bias_split_scale]." +msgstr "" + +#: doc/classes/Light.xml +msgid "" +"Light is ignored when baking.\n" +"[b]Note:[/b] Hiding a light does [i]not[/i] affect baking." +msgstr "" + +#: doc/classes/Light.xml +msgid "Only indirect lighting will be baked (default)." +msgstr "" + +#: doc/classes/Light.xml +msgid "" +"Both direct and indirect light will be baked.\n" +"[b]Note:[/b] You should hide the light if you don't want it to appear twice " +"(dynamic and baked)." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "Casts light in a 2D environment." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "" +"Casts light in a 2D environment. Light is defined by a (usually grayscale) " +"texture, a color, an energy value, a mode (see constants), and various other " +"parameters (range and shadows-related).\n" +"[b]Note:[/b] Light2D can also be used as a mask." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "The Light2D's [Color]." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "If [code]true[/code], Light2D will only appear when editing the scene." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "If [code]true[/code], Light2D will emit light." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "" +"The Light2D's energy value. The larger the value, the stronger the light." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "The Light2D's mode. See [enum Mode] constants for values." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "The offset of the Light2D's [code]texture[/code]." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "The height of the Light2D. Used with 2D normal mapping." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "" +"The layer mask. Only objects with a matching mask will be affected by the " +"Light2D." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "Maximum layer value of objects that are affected by the Light2D." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "Minimum layer value of objects that are affected by the Light2D." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "" +"Maximum [code]z[/code] value of objects that are affected by the Light2D." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "" +"Minimum [code]z[/code] value of objects that are affected by the Light2D." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "Shadow buffer size." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "[Color] of shadows cast by the Light2D." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "If [code]true[/code], the Light2D will cast shadows." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "Shadow filter type. See [enum ShadowFilter] for possible values." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "Smoothing value for shadows." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "Smooth shadow gradient length." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "" +"The shadow mask. Used with [LightOccluder2D] to cast shadows. Only occluders " +"with a matching light mask will cast shadows." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "[Texture] used for the Light2D's appearance." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "The [code]texture[/code]'s scale factor." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "" +"Adds the value of pixels corresponding to the Light2D to the values of " +"pixels under it. This is the common behavior of a light." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "" +"Subtracts the value of pixels corresponding to the Light2D to the values of " +"pixels under it, resulting in inversed light effect." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "" +"Mix the value of pixels corresponding to the Light2D to the values of pixels " +"under it by linear interpolation." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "" +"The light texture of the Light2D is used as a mask, hiding or revealing " +"parts of the screen underneath depending on the value of each pixel of the " +"light (mask) texture." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "No filter applies to the shadow map. See [member shadow_filter]." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "" +"Percentage closer filtering (3 samples) applies to the shadow map. See " +"[member shadow_filter]." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "" +"Percentage closer filtering (5 samples) applies to the shadow map. See " +"[member shadow_filter]." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "" +"Percentage closer filtering (7 samples) applies to the shadow map. See " +"[member shadow_filter]." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "" +"Percentage closer filtering (9 samples) applies to the shadow map. See " +"[member shadow_filter]." +msgstr "" + +#: doc/classes/Light2D.xml +msgid "" +"Percentage closer filtering (13 samples) applies to the shadow map. See " +"[member shadow_filter]." +msgstr "" + +#: doc/classes/LightOccluder2D.xml +msgid "Occludes light cast by a Light2D, casting shadows." +msgstr "" + +#: doc/classes/LightOccluder2D.xml +msgid "" +"Occludes light cast by a Light2D, casting shadows. The LightOccluder2D must " +"be provided with an [OccluderPolygon2D] in order for the shadow to be " +"computed." +msgstr "" + +#: doc/classes/LightOccluder2D.xml +msgid "" +"The LightOccluder2D's light mask. The LightOccluder2D will cast shadows only " +"from Light2D(s) that have the same light mask(s)." +msgstr "" + +#: doc/classes/LightOccluder2D.xml +msgid "The [OccluderPolygon2D] used to compute the shadow." +msgstr "" + +#: doc/classes/Line2D.xml +msgid "A 2D line." +msgstr "" + +#: doc/classes/Line2D.xml +msgid "" +"A line through several points in 2D space. Supports varying width and color " +"over the line's length, texturing, and several cap/joint types.\n" +"[b]Note:[/b] By default, Godot can only draw up to 4,096 polygon points at a " +"time. To increase this limit, open the Project Settings and increase [member " +"ProjectSettings.rendering/limits/buffers/canvas_polygon_buffer_size_kb] and " +"[member ProjectSettings.rendering/limits/buffers/" +"canvas_polygon_index_buffer_size_kb]." +msgstr "" + +#: doc/classes/Line2D.xml +msgid "" +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." +msgstr "" + +#: doc/classes/Line2D.xml +msgid "Removes all points from the line." +msgstr "" + +#: doc/classes/Line2D.xml +msgid "Returns the amount of points in the line." +msgstr "" + +#: doc/classes/Line2D.xml +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "" + +#: doc/classes/Line2D.xml +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "" + +#: doc/classes/Line2D.xml +msgid "" +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." +msgstr "" + +#: doc/classes/Line2D.xml +msgid "" +"If [code]true[/code], the line's border will attempt to perform antialiasing " +"by drawing thin OpenGL smooth lines on the line's edges.\n" +"[b]Note:[/b] Line2D is not accelerated by batching if [member antialiased] " +"is [code]true[/code].\n" +"[b]Note:[/b] Due to how it works, built-in antialiasing will not look " +"correct for translucent lines and may not work on certain platforms. As a " +"workaround, install the [url=https://github.com/godot-extended-libraries/" +"godot-antialiased-line2d]Antialiased Line2D[/url] add-on then create an " +"AntialiasedLine2D node. That node relies on a texture with custom mipmaps to " +"perform antialiasing. 2D batching is also still supported with those " +"antialiased lines." +msgstr "" + +#: doc/classes/Line2D.xml +msgid "" +"Controls the style of the line's first point. Use [enum LineCapMode] " +"constants." +msgstr "" + +#: doc/classes/Line2D.xml +msgid "The line's color. Will not be used if a gradient is set." +msgstr "" + +#: doc/classes/Line2D.xml +msgid "" +"Controls the style of the line's last point. Use [enum LineCapMode] " +"constants." +msgstr "" + +#: doc/classes/Line2D.xml +msgid "" +"The gradient is drawn through the whole line from start to finish. The " +"default color will not be used if a gradient is set." +msgstr "" + +#: doc/classes/Line2D.xml +msgid "The style for the points between the start and the end." +msgstr "" + +#: doc/classes/Line2D.xml +msgid "" +"The points that form the lines. The line is drawn between every point set in " +"this array. Points are interpreted as local vectors." +msgstr "" + +#: doc/classes/Line2D.xml +msgid "" +"The smoothness of the rounded joints and caps. Higher values result in " +"smoother corners, but are more demanding to render and update. This is only " +"used if a cap or joint is set as round.\n" +"[b]Note:[/b] The default value is tuned for lines with the default [member " +"width]. For thin lines, this value should be reduced to a number between " +"[code]2[/code] and [code]4[/code] to improve performance." +msgstr "" + +#: doc/classes/Line2D.xml +msgid "" +"The direction difference in radians between vector points. This value is " +"only used if [member joint_mode] is set to [constant LINE_JOINT_SHARP]." +msgstr "" + +#: doc/classes/Line2D.xml +msgid "" +"The texture used for the line's texture. Uses [code]texture_mode[/code] for " +"drawing style." +msgstr "" + +#: doc/classes/Line2D.xml +msgid "" +"The style to render the [code]texture[/code] on the line. Use [enum " +"LineTextureMode] constants." +msgstr "" + +#: doc/classes/Line2D.xml +msgid "The line's width." +msgstr "" + +#: doc/classes/Line2D.xml +msgid "" +"The line's width varies with the curve. The original width is simply " +"multiply by the value of the Curve." +msgstr "" + +#: doc/classes/Line2D.xml +msgid "" +"The line's joints will be pointy. If [code]sharp_limit[/code] is greater " +"than the rotation of a joint, it becomes a bevel joint instead." +msgstr "" + +#: doc/classes/Line2D.xml +msgid "The line's joints will be bevelled/chamfered." +msgstr "" + +#: doc/classes/Line2D.xml +msgid "The line's joints will be rounded." +msgstr "" + +#: doc/classes/Line2D.xml +msgid "Don't draw a line cap." +msgstr "" + +#: doc/classes/Line2D.xml +msgid "Draws the line cap as a box." +msgstr "" + +#: doc/classes/Line2D.xml +msgid "Draws the line cap as a circle." +msgstr "" + +#: doc/classes/Line2D.xml +msgid "" +"Takes the left pixels of the texture and renders it over the whole line." +msgstr "" + +#: doc/classes/Line2D.xml +msgid "" +"Tiles the texture over the line. The texture must be imported with " +"[b]Repeat[/b] enabled for it to work properly." +msgstr "" + +#: doc/classes/Line2D.xml +msgid "" +"Stretches the texture across the line. Import the texture with [b]Repeat[/b] " +"disabled for best results." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "Control that provides single-line string editing." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "" +"LineEdit provides a single-line string editor, used for text fields.\n" +"It features many built-in shortcuts which will always be available " +"([code]Ctrl[/code] here maps to [code]Command[/code] on macOS):\n" +"- Ctrl + C: Copy\n" +"- Ctrl + X: Cut\n" +"- Ctrl + V or Ctrl + Y: Paste/\"yank\"\n" +"- Ctrl + Z: Undo\n" +"- Ctrl + Shift + Z: Redo\n" +"- Ctrl + U: Delete text from the cursor position to the beginning of the " +"line\n" +"- Ctrl + K: Delete text from the cursor position to the end of the line\n" +"- Ctrl + A: Select all text\n" +"- Up/Down arrow: Move the cursor to the beginning/end of the line\n" +"On macOS, some extra keyboard shortcuts are available:\n" +"- Ctrl + F: Like the right arrow key, move the cursor one character right\n" +"- Ctrl + B: Like the left arrow key, move the cursor one character left\n" +"- Ctrl + P: Like the up arrow key, move the cursor to the previous line\n" +"- Ctrl + N: Like the down arrow key, move the cursor to the next line\n" +"- Ctrl + D: Like the Delete key, delete the character on the right side of " +"cursor\n" +"- Ctrl + H: Like the Backspace key, delete the character on the left side of " +"the cursor\n" +"- Command + Left arrow: Like the Home key, move the cursor to the beginning " +"of the line\n" +"- Command + Right arrow: Like the End key, move the cursor to the end of the " +"line" +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "" +"Adds [code]text[/code] after the cursor. If the resulting value is longer " +"than [member max_length], nothing happens." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "Erases the [LineEdit]'s [member text]." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "" +"Deletes one character at the cursor's current position (equivalent to " +"pressing the [code]Delete[/code] key)." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "" +"Deletes a section of the [member text] going from position " +"[code]from_column[/code] to [code]to_column[/code]. Both parameters should " +"be within the text's length." +msgstr "" + +#: doc/classes/LineEdit.xml doc/classes/RichTextLabel.xml +msgid "Clears the current selection." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "" +"Returns the [PopupMenu] of this [LineEdit]. By default, this menu is " +"displayed when right-clicking on the [LineEdit].\n" +"[b]Warning:[/b] This is a required internal node, removing and freeing it " +"may cause a crash. If you wish to hide it or any of its children, use their " +"[member CanvasItem.visible] property." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "" +"Returns the scroll offset due to [member caret_position], as a number of " +"characters." +msgstr "" + +#: doc/classes/LineEdit.xml doc/classes/TextEdit.xml +msgid "Returns the selection begin column." +msgstr "" + +#: doc/classes/LineEdit.xml doc/classes/TextEdit.xml +msgid "Returns the selection end column." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "Returns [code]true[/code] if the user has selected text." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "Executes a given action as defined in the [enum MenuItems] enum." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "" +"Selects characters inside [LineEdit] between [code]from[/code] and [code]to[/" +"code]. By default, [code]from[/code] is at the beginning and [code]to[/code] " +"at the end.\n" +"[codeblock]\n" +"text = \"Welcome\"\n" +"select() # Will select \"Welcome\".\n" +"select(4) # Will select \"ome\".\n" +"select(2, 5) # Will select \"lco\".\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "Selects the whole [String]." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "Text alignment as defined in the [enum Align] enum." +msgstr "" + +#: doc/classes/LineEdit.xml doc/classes/TextEdit.xml +msgid "If [code]true[/code], the caret (visual cursor) blinks." +msgstr "" + +#: doc/classes/LineEdit.xml doc/classes/TextEdit.xml +msgid "Duration (in seconds) of a caret's blinking cycle." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "" +"The cursor's position inside the [LineEdit]. When set, the text may scroll " +"to accommodate it." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "" +"If [code]true[/code], the [LineEdit] will show a clear button if [code]text[/" +"code] is not empty, which can be used to clear the text quickly." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "If [code]true[/code], the context menu will appear when right-clicked." +msgstr "" + +#: doc/classes/LineEdit.xml doc/classes/RichTextLabel.xml +#: doc/classes/TextEdit.xml +msgid "" +"If [code]true[/code], the selected text will be deselected when focus is " +"lost." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "" +"If [code]false[/code], existing text cannot be modified and new text cannot " +"be added." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "" +"If [code]true[/code], the [LineEdit] width will increase to stay longer than " +"the [member text]. It will [b]not[/b] compress if the [member text] is " +"shortened." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "" +"Maximum amount of characters that can be entered inside the [LineEdit]. If " +"[code]0[/code], there is no limit.\n" +"When a limit is defined, characters that would exceed [member max_length] " +"are truncated. This happens both for existing [member text] contents when " +"setting the max length, or for new text inserted in the [LineEdit], " +"including pasting. If any input text is truncated, the [signal " +"text_change_rejected] signal is emitted with the truncated substring as " +"parameter.\n" +"[b]Example:[/b]\n" +"[codeblock]\n" +"text = \"Hello world\"\n" +"max_length = 5\n" +"# `text` becomes \"Hello\".\n" +"max_length = 10\n" +"text += \" goodbye\"\n" +"# `text` becomes \"Hello good\".\n" +"# `text_change_rejected` is emitted with \"bye\" as parameter.\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/LineEdit.xml doc/classes/TextEdit.xml +msgid "" +"If [code]false[/code], using middle mouse button to paste clipboard will be " +"disabled.\n" +"[b]Note:[/b] This method is only implemented on Linux." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "" +"Opacity of the [member placeholder_text]. From [code]0[/code] to [code]1[/" +"code]." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "" +"Text shown when the [LineEdit] is empty. It is [b]not[/b] the [LineEdit]'s " +"default value (see [member text])." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "" +"Sets the icon that will appear in the right end of the [LineEdit] if there's " +"no [member text], or always, if [member clear_button_enabled] is set to " +"[code]false[/code]." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "" +"If [code]true[/code], every character is replaced with the secret character " +"(see [member secret_character])." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "" +"The character to use to mask secret input (defaults to \"*\"). Only a single " +"character can be used as the secret character." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "" +"If [code]false[/code], it's impossible to select the text using mouse nor " +"keyboard." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "If [code]false[/code], using shortcuts will be disabled." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "" +"String value of the [LineEdit].\n" +"[b]Note:[/b] Changing text using this property won't emit the [signal " +"text_changed] signal." +msgstr "" + +#: doc/classes/LineEdit.xml doc/classes/TextEdit.xml +msgid "" +"If [code]true[/code], the native virtual keyboard is shown when focused on " +"platforms that support it." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "" +"Emitted when appending text that overflows the [member max_length]. The " +"appended text is truncated to fit [member max_length], and the part that " +"couldn't fit is passed as the [code]rejected_substring[/code] argument." +msgstr "" + +#: doc/classes/LineEdit.xml doc/classes/TextEdit.xml +msgid "Emitted when the text changes." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "Emitted when the user presses [constant KEY_ENTER] on the [LineEdit]." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "Aligns the text on the left-hand side of the [LineEdit]." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "Centers the text in the middle of the [LineEdit]." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "Aligns the text on the right-hand side of the [LineEdit]." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "Stretches whitespaces to fit the [LineEdit]'s width." +msgstr "" + +#: doc/classes/LineEdit.xml doc/classes/TextEdit.xml +msgid "Cuts (copies and clears) the selected text." +msgstr "" + +#: doc/classes/LineEdit.xml doc/classes/TextEdit.xml +msgid "Copies the selected text." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "" +"Pastes the clipboard text over the selected text (or at the cursor's " +"position).\n" +"Non-printable escape characters are automatically stripped from the OS " +"clipboard via [method String.strip_escapes]." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "Erases the whole [LineEdit] text." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "Selects the whole [LineEdit] text." +msgstr "" + +#: doc/classes/LineEdit.xml doc/classes/TextEdit.xml +msgid "Undoes the previous action." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "Reverse the last undo action." +msgstr "" + +#: doc/classes/LineEdit.xml doc/classes/TextEdit.xml +msgid "Represents the size of the [enum MenuItems] enum." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "Color used as default tint for the clear button." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "Color used for the clear button when it's pressed." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "Color of the [LineEdit]'s visual cursor (caret)." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "Default font color." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "Font color for selected text (inside the selection rectangle)." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "Font color when editing is disabled." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "Color of the selection rectangle." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "" +"Minimum horizontal space for the text (not counting the clear button and " +"content margins). This value is measured in count of space characters (i.e. " +"this amount of space characters can be displayed without scrolling)." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "Font used for the text." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "Texture for the clear button. See [member clear_button_enabled]." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "Background used when [LineEdit] has GUI focus." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "Default background for the [LineEdit]." +msgstr "" + +#: doc/classes/LineEdit.xml +msgid "" +"Background used when [LineEdit] is in read-only mode ([member editable] is " +"set to [code]false[/code])." +msgstr "" + +#: doc/classes/LineShape2D.xml +msgid "Line shape for 2D collisions." +msgstr "" + +#: doc/classes/LineShape2D.xml +msgid "" +"Line shape for 2D collisions. It works like a 2D plane and will not allow " +"any physics body to go to the negative side. Not recommended for rigid " +"bodies, and usually not recommended for static bodies either because it " +"forces checks against it on every frame." +msgstr "" + +#: doc/classes/LineShape2D.xml +msgid "The line's distance from the origin." +msgstr "" + +#: doc/classes/LineShape2D.xml +msgid "The line's normal." +msgstr "" + +#: doc/classes/LinkButton.xml +msgid "Simple button used to represent a link to some resource." +msgstr "" + +#: doc/classes/LinkButton.xml +msgid "" +"This kind of button is primarily used when the interaction with the button " +"causes a context change (like linking to a web page).\n" +"See also [BaseButton] which contains common properties and methods " +"associated with this node." +msgstr "" + +#: doc/classes/LinkButton.xml +msgid "" +"Determines when to show the underline. See [enum UnderlineMode] for options." +msgstr "" + +#: doc/classes/LinkButton.xml +msgid "The LinkButton will always show an underline at the bottom of its text." +msgstr "" + +#: doc/classes/LinkButton.xml +msgid "" +"The LinkButton will show an underline at the bottom of its text when the " +"mouse cursor is over it." +msgstr "" + +#: doc/classes/LinkButton.xml +msgid "The LinkButton will never show an underline at the bottom of its text." +msgstr "" + +#: doc/classes/LinkButton.xml +msgid "Default text [Color] of the [LinkButton]." +msgstr "" + +#: doc/classes/LinkButton.xml +msgid "" +"Text [Color] used when the [LinkButton] is focused. Only replaces the normal " +"text color of the button. Disabled, hovered, and pressed states take " +"precedence over this color." +msgstr "" + +#: doc/classes/LinkButton.xml +msgid "Text [Color] used when the [LinkButton] is being hovered." +msgstr "" + +#: doc/classes/LinkButton.xml +msgid "Text [Color] used when the [LinkButton] is being pressed." +msgstr "" + +#: doc/classes/LinkButton.xml +msgid "The vertical space between the baseline of text and the underline." +msgstr "" + +#: doc/classes/LinkButton.xml +msgid "[Font] of the [LinkButton]'s text." +msgstr "" + +#: doc/classes/LinkButton.xml +msgid "" +"[StyleBox] used when the [LinkButton] is focused. It is displayed over the " +"current [StyleBox], so using [StyleBoxEmpty] will just disable the focus " +"visual effect." +msgstr "" + +#: doc/classes/Listener.xml doc/classes/Listener2D.xml +msgid "Overrides the location sounds are heard from." +msgstr "" + +#: doc/classes/Listener.xml +msgid "" +"Once added to the scene tree and enabled using [method make_current], this " +"node will override the location sounds are heard from. This can be used to " +"listen from a location different from the [Camera]." +msgstr "" + +#: doc/classes/Listener.xml +msgid "Disables the listener to use the current camera's listener instead." +msgstr "" + +#: doc/classes/Listener.xml +msgid "Returns the listener's global orthonormalized [Transform]." +msgstr "" + +#: doc/classes/Listener.xml +msgid "" +"Returns [code]true[/code] if the listener was made current using [method " +"make_current], [code]false[/code] otherwise.\n" +"[b]Note:[/b] There may be more than one Listener marked as \"current\" in " +"the scene tree, but only the one that was made current last will be used." +msgstr "" + +#: doc/classes/Listener.xml +msgid "Enables the listener. This will override the current camera's listener." +msgstr "" + +#: doc/classes/Listener2D.xml +msgid "" +"Once added to the scene tree and enabled using [method make_current], this " +"node will override the location sounds are heard from. Only one [Listener2D] " +"can be current. Using [method make_current] will disable the previous " +"[Listener2D].\n" +"If there is no active [Listener2D] in the current [Viewport], center of the " +"screen will be used as a hearing point for the audio. [Listener2D] needs to " +"be inside [SceneTree] to function." +msgstr "" + +#: doc/classes/Listener2D.xml +msgid "" +"Disables the [Listener2D]. If it's not set as current, this method will have " +"no effect." +msgstr "" + +#: doc/classes/Listener2D.xml +msgid "Returns [code]true[/code] if this [Listener2D] is currently active." +msgstr "" + +#: doc/classes/Listener2D.xml +msgid "" +"Makes the [Listener2D] active, setting it as the hearing point for the " +"sounds. If there is already another active [Listener2D], it will be " +"disabled.\n" +"This method will have no effect if the [Listener2D] is not added to " +"[SceneTree]." +msgstr "" + +#: doc/classes/MainLoop.xml +msgid "Abstract base class for the game's main loop." +msgstr "" + +#: doc/classes/MainLoop.xml +msgid "" +"[MainLoop] is the abstract base class for a Godot project's game loop. It is " +"inherited by [SceneTree], which is the default game loop implementation used " +"in Godot projects, though it is also possible to write and use one's own " +"[MainLoop] subclass instead of the scene tree.\n" +"Upon the application start, a [MainLoop] implementation must be provided to " +"the OS; otherwise, the application will exit. This happens automatically " +"(and a [SceneTree] is created) unless a main [Script] is provided from the " +"command line (with e.g. [code]godot -s my_loop.gd[/code], which should then " +"be a [MainLoop] implementation.\n" +"Here is an example script implementing a simple [MainLoop]:\n" +"[codeblock]\n" +"extends MainLoop\n" +"\n" +"var time_elapsed = 0\n" +"var keys_typed = []\n" +"var quit = false\n" +"\n" +"func _initialize():\n" +" print(\"Initialized:\")\n" +" print(\" Starting time: %s\" % str(time_elapsed))\n" +"\n" +"func _idle(delta):\n" +" time_elapsed += delta\n" +" # Return true to end the main loop.\n" +" return quit\n" +"\n" +"func _input_event(event):\n" +" # Record keys.\n" +" if event is InputEventKey and event.pressed and !event.echo:\n" +" keys_typed.append(OS.get_scancode_string(event.scancode))\n" +" # Quit on Escape press.\n" +" if event.scancode == KEY_ESCAPE:\n" +" quit = true\n" +" # Quit on any mouse click.\n" +" if event is InputEventMouseButton:\n" +" quit = true\n" +"\n" +"func _finalize():\n" +" print(\"Finalized:\")\n" +" print(\" End time: %s\" % str(time_elapsed))\n" +" print(\" Keys typed: %s\" % var2str(keys_typed))\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/MainLoop.xml +msgid "" +"Called when files are dragged from the OS file manager and dropped in the " +"game window. The arguments are a list of file paths and the identifier of " +"the screen where the drag originated." +msgstr "" + +#: doc/classes/MainLoop.xml +msgid "Called before the program exits." +msgstr "" + +#: doc/classes/MainLoop.xml +msgid "" +"Called when the user performs an action in the system global menu (e.g. the " +"Mac OS menu bar)." +msgstr "" + +#: doc/classes/MainLoop.xml +msgid "" +"Called each idle frame with the time since the last idle frame as argument " +"(in seconds). Equivalent to [method Node._process].\n" +"If implemented, the method must return a boolean value. [code]true[/code] " +"ends the main loop, while [code]false[/code] lets it proceed to the next " +"frame." +msgstr "" + +#: doc/classes/MainLoop.xml +msgid "Called once during initialization." +msgstr "" + +#: doc/classes/MainLoop.xml +msgid "Called whenever an [InputEvent] is received by the main loop." +msgstr "" + +#: doc/classes/MainLoop.xml +msgid "" +"Deprecated callback, does not do anything. Use [method _input_event] to " +"parse text input. Will be removed in Godot 4.0." +msgstr "" + +#: doc/classes/MainLoop.xml +msgid "" +"Called each physics frame with the time since the last physics frame as " +"argument ([code]delta[/code], in seconds). Equivalent to [method Node." +"_physics_process].\n" +"If implemented, the method must return a boolean value. [code]true[/code] " +"ends the main loop, while [code]false[/code] lets it proceed to the next " +"frame." +msgstr "" + +#: doc/classes/MainLoop.xml +msgid "" +"Should not be called manually, override [method _finalize] instead. Will be " +"removed in Godot 4.0." +msgstr "" + +#: doc/classes/MainLoop.xml +msgid "" +"Should not be called manually, override [method _idle] instead. Will be " +"removed in Godot 4.0." +msgstr "" + +#: doc/classes/MainLoop.xml +msgid "" +"Should not be called manually, override [method _initialize] instead. Will " +"be removed in Godot 4.0." +msgstr "" + +#: doc/classes/MainLoop.xml +msgid "" +"Should not be called manually, override [method _input_event] instead. Will " +"be removed in Godot 4.0." +msgstr "" + +#: doc/classes/MainLoop.xml +msgid "" +"Should not be called manually, override [method _input_text] instead. Will " +"be removed in Godot 4.0." +msgstr "" + +#: doc/classes/MainLoop.xml +msgid "" +"Should not be called manually, override [method _iteration] instead. Will be " +"removed in Godot 4.0." +msgstr "" + +#: doc/classes/MainLoop.xml +msgid "Emitted when a user responds to a permission request." +msgstr "" + +#: doc/classes/MainLoop.xml doc/classes/Node.xml +msgid "" +"Notification received from the OS when the mouse enters the game window.\n" +"Implemented on desktop and web platforms." +msgstr "" + +#: doc/classes/MainLoop.xml doc/classes/Node.xml +msgid "" +"Notification received from the OS when the mouse leaves the game window.\n" +"Implemented on desktop and web platforms." +msgstr "" + +#: doc/classes/MainLoop.xml doc/classes/Node.xml +msgid "" +"Notification received from the OS when the game window is focused.\n" +"Implemented on all platforms." +msgstr "" + +#: doc/classes/MainLoop.xml doc/classes/Node.xml +msgid "" +"Notification received from the OS when the game window is unfocused.\n" +"Implemented on all platforms." +msgstr "" + +#: doc/classes/MainLoop.xml doc/classes/Node.xml +msgid "" +"Notification received from the OS when a quit request is sent (e.g. closing " +"the window with a \"Close\" button or Alt+F4).\n" +"Implemented on desktop platforms." +msgstr "" + +#: doc/classes/MainLoop.xml doc/classes/Node.xml +msgid "" +"Notification received from the OS when a go back request is sent (e.g. " +"pressing the \"Back\" button on Android).\n" +"Specific to the Android platform." +msgstr "" + +#: doc/classes/MainLoop.xml doc/classes/Node.xml +msgid "" +"Notification received from the OS when an unfocus request is sent (e.g. " +"another OS window wants to take the focus).\n" +"No supported platforms currently send this notification." +msgstr "" + +#: doc/classes/MainLoop.xml doc/classes/Node.xml +msgid "" +"Notification received from the OS when the application is exceeding its " +"allocated memory.\n" +"Specific to the iOS platform." +msgstr "" + +#: doc/classes/MainLoop.xml doc/classes/Node.xml +msgid "" +"Notification received when translations may have changed. Can be triggered " +"by the user changing the locale. Can be used to respond to language changes, " +"for example to change the UI strings on the fly. Useful when working with " +"the built-in translation support, like [method Object.tr]." +msgstr "" + +#: doc/classes/MainLoop.xml doc/classes/Node.xml +msgid "" +"Notification received from the OS when a request for \"About\" information " +"is sent.\n" +"Specific to the macOS platform." +msgstr "" + +#: doc/classes/MainLoop.xml doc/classes/Node.xml +msgid "" +"Notification received from Godot's crash handler when the engine is about to " +"crash.\n" +"Implemented on desktop platforms if the crash handler is enabled." +msgstr "" + +#: doc/classes/MainLoop.xml doc/classes/Node.xml +msgid "" +"Notification received from the OS when an update of the Input Method Engine " +"occurs (e.g. change of IME cursor position or composition string).\n" +"Specific to the macOS platform." +msgstr "" + +#: doc/classes/MainLoop.xml doc/classes/Node.xml +msgid "" +"Notification received from the OS when the app is resumed.\n" +"Specific to the Android platform." +msgstr "" + +#: doc/classes/MainLoop.xml doc/classes/Node.xml +msgid "" +"Notification received from the OS when the app is paused.\n" +"Specific to the Android platform." +msgstr "" + +#: doc/classes/MarginContainer.xml +msgid "Simple margin container." +msgstr "" + +#: doc/classes/MarginContainer.xml +msgid "" +"Adds a top, left, bottom, and right margin to all [Control] nodes that are " +"direct children of the container. To control the [MarginContainer]'s margin, " +"use the [code]margin_*[/code] theme properties listed below.\n" +"[b]Note:[/b] Be careful, [Control] margin values are different than the " +"constant margin values. If you want to change the custom margin values of " +"the [MarginContainer] by code, you should use the following examples:\n" +"[codeblock]\n" +"# This code sample assumes the current script is extending MarginContainer.\n" +"var margin_value = 100\n" +"add_constant_override(\"margin_top\", margin_value)\n" +"add_constant_override(\"margin_left\", margin_value)\n" +"add_constant_override(\"margin_bottom\", margin_value)\n" +"add_constant_override(\"margin_right\", margin_value)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/MarginContainer.xml +msgid "" +"All direct children of [MarginContainer] will have a bottom margin of " +"[code]margin_bottom[/code] pixels." +msgstr "" + +#: doc/classes/MarginContainer.xml +msgid "" +"All direct children of [MarginContainer] will have a left margin of " +"[code]margin_left[/code] pixels." +msgstr "" + +#: doc/classes/MarginContainer.xml +msgid "" +"All direct children of [MarginContainer] will have a right margin of " +"[code]margin_right[/code] pixels." +msgstr "" + +#: doc/classes/MarginContainer.xml +msgid "" +"All direct children of [MarginContainer] will have a top margin of " +"[code]margin_top[/code] pixels." +msgstr "" + +#: doc/classes/Marshalls.xml +msgid "Data transformation (marshalling) and encoding helpers." +msgstr "" + +#: doc/classes/Marshalls.xml +msgid "Provides data transformation and encoding utility functions." +msgstr "" + +#: doc/classes/Marshalls.xml +msgid "" +"Returns a decoded [PoolByteArray] corresponding to the Base64-encoded string " +"[code]base64_str[/code]." +msgstr "" + +#: doc/classes/Marshalls.xml +msgid "" +"Returns a decoded string corresponding to the Base64-encoded string " +"[code]base64_str[/code]." +msgstr "" + +#: doc/classes/Marshalls.xml +msgid "" +"Returns a decoded [Variant] corresponding to the Base64-encoded string " +"[code]base64_str[/code]. If [code]allow_objects[/code] is [code]true[/code], " +"decoding objects is allowed.\n" +"[b]Warning:[/b] Deserialized objects can contain code which gets executed. " +"Do not use this option if the serialized object comes from untrusted sources " +"to avoid potential security threats such as remote code execution." +msgstr "" + +#: doc/classes/Marshalls.xml +msgid "Returns a Base64-encoded string of a given [PoolByteArray]." +msgstr "" + +#: doc/classes/Marshalls.xml +msgid "" +"Returns a Base64-encoded string of the UTF-8 string [code]utf8_str[/code]." +msgstr "" + +#: doc/classes/Marshalls.xml +msgid "" +"Returns a Base64-encoded string of the [Variant] [code]variant[/code]. If " +"[code]full_objects[/code] is [code]true[/code], encoding objects is allowed " +"(and can potentially include code)." +msgstr "" + +#: doc/classes/Material.xml +msgid "Abstract base [Resource] for coloring and shading geometry." +msgstr "" + +#: doc/classes/Material.xml +msgid "" +"Material is a base [Resource] used for coloring and shading geometry. All " +"materials inherit from it and almost all [VisualInstance] derived nodes " +"carry a Material. A few flags and parameters are shared between all material " +"types and are configured here." +msgstr "" + +#: doc/classes/Material.xml +msgid "" +"Sets the [Material] to be used for the next pass. This renders the object " +"again using a different material.\n" +"[b]Note:[/b] This only applies to [SpatialMaterial]s and [ShaderMaterial]s " +"with type \"Spatial\"." +msgstr "" + +#: doc/classes/Material.xml +msgid "" +"Sets the render priority for transparent objects in 3D scenes. Higher " +"priority objects will be sorted in front of lower priority objects.\n" +"[b]Note:[/b] This only applies to sorting of transparent objects. This will " +"not impact how transparent objects are sorted relative to opaque objects. " +"This is because opaque objects are not sorted, while transparent objects are " +"sorted from back to front (subject to priority)." +msgstr "" + +#: doc/classes/Material.xml +msgid "Maximum value for the [member render_priority] parameter." +msgstr "" + +#: doc/classes/Material.xml +msgid "Minimum value for the [member render_priority] parameter." +msgstr "" + +#: doc/classes/MenuButton.xml +msgid "Special button that brings up a [PopupMenu] when clicked." +msgstr "" + +#: doc/classes/MenuButton.xml +msgid "" +"Special button that brings up a [PopupMenu] when clicked.\n" +"New items can be created inside this [PopupMenu] using [code]get_popup()." +"add_item(\"My Item Name\")[/code]. You can also create them directly from " +"the editor. To do so, select the [MenuButton] node, then in the toolbar at " +"the top of the 2D editor, click [b]Items[/b] then click [b]Add[/b] in the " +"popup. You will be able to give each item new properties.\n" +"See also [BaseButton] which contains common properties and methods " +"associated with this node." +msgstr "" + +#: doc/classes/MenuButton.xml doc/classes/OptionButton.xml +msgid "" +"Returns the [PopupMenu] contained in this button.\n" +"[b]Warning:[/b] This is a required internal node, removing and freeing it " +"may cause a crash. If you wish to hide it or any of its children, use their " +"[member CanvasItem.visible] property." +msgstr "" + +#: doc/classes/MenuButton.xml +msgid "" +"If [code]true[/code], shortcuts are disabled and cannot be used to trigger " +"the button." +msgstr "" + +#: doc/classes/MenuButton.xml +msgid "" +"If [code]true[/code], when the cursor hovers above another [MenuButton] " +"within the same parent which also has [code]switch_on_hover[/code] enabled, " +"it will close the current [MenuButton] and open the other one." +msgstr "" + +#: doc/classes/MenuButton.xml +msgid "Emitted when [PopupMenu] of this MenuButton is about to show." +msgstr "" + +#: doc/classes/MenuButton.xml +msgid "Default text [Color] of the [MenuButton]." +msgstr "" + +#: doc/classes/MenuButton.xml +msgid "Text [Color] used when the [MenuButton] is disabled." +msgstr "" + +#: doc/classes/MenuButton.xml +msgid "" +"Text [Color] used when the [MenuButton] is focused. Only replaces the normal " +"text color of the button. Disabled, hovered, and pressed states take " +"precedence over this color." +msgstr "" + +#: doc/classes/MenuButton.xml +msgid "Text [Color] used when the [MenuButton] is being hovered." +msgstr "" + +#: doc/classes/MenuButton.xml +msgid "Text [Color] used when the [MenuButton] is being pressed." +msgstr "" + +#: doc/classes/MenuButton.xml +msgid "The horizontal space between [MenuButton]'s icon and text." +msgstr "" + +#: doc/classes/MenuButton.xml +msgid "[Font] of the [MenuButton]'s text." +msgstr "" + +#: doc/classes/MenuButton.xml +msgid "[StyleBox] used when the [MenuButton] is disabled." +msgstr "" + +#: doc/classes/MenuButton.xml +msgid "" +"[StyleBox] used when the [MenuButton] is focused. It is displayed over the " +"current [StyleBox], so using [StyleBoxEmpty] will just disable the focus " +"visual effect." +msgstr "" + +#: doc/classes/MenuButton.xml +msgid "[StyleBox] used when the [MenuButton] is being hovered." +msgstr "" + +#: doc/classes/MenuButton.xml +msgid "Default [StyleBox] for the [MenuButton]." +msgstr "" + +#: doc/classes/MenuButton.xml +msgid "[StyleBox] used when the [MenuButton] is being pressed." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "A [Resource] that contains vertex array-based geometry." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "" +"Mesh is a type of [Resource] that contains vertex array-based geometry, " +"divided in [i]surfaces[/i]. Each surface contains a completely separate " +"array and a material used to draw it. Design wise, a mesh with multiple " +"surfaces is preferred to a single surface, because objects created in 3D " +"editing software commonly contain multiple materials." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "" +"Calculate a [ConvexPolygonShape] from the mesh.\n" +"If [code]clean[/code] is [code]true[/code] (default), duplicate and interior " +"vertices are removed automatically. You can set it to [code]false[/code] to " +"make the process faster if not needed.\n" +"If [code]simplify[/code] is [code]true[/code], the geometry can be further " +"simplified to reduce the amount of vertices. Disabled by default." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "" +"Calculate an outline mesh at a defined offset (margin) from the original " +"mesh.\n" +"[b]Note:[/b] This method typically returns the vertices in reverse order (e." +"g. clockwise to counterclockwise)." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "Calculate a [ConcavePolygonShape] from the mesh." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "Generate a [TriangleMesh] from the mesh." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "" +"Returns the smallest [AABB] enclosing this mesh in local space. Not affected " +"by [code]custom_aabb[/code]. See also [method VisualInstance." +"get_transformed_aabb].\n" +"[b]Note:[/b] This is only implemented for [ArrayMesh] and [PrimitiveMesh]." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "" +"Returns all the vertices that make up the faces of the mesh. Each three " +"vertices represent one triangle." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "Returns the amount of surfaces that the [Mesh] holds." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "" +"Returns the arrays for the vertices, normals, uvs, etc. that make up the " +"requested surface (see [method ArrayMesh.add_surface_from_arrays])." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "Returns the blend shape arrays for the requested surface." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "" +"Returns a [Material] in a given surface. Surface is rendered using this " +"material." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "" +"Sets a [Material] for a given surface. Surface will be rendered using this " +"material." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "" +"Sets a hint to be used for lightmap resolution in [BakedLightmap]. Overrides " +"[member BakedLightmap.default_texels_per_unit]." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "Render array as points (one vertex equals one point)." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "Render array as lines (every two vertices a line is created)." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "Render array as line strip." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "Render array as line loop (like line strip, but closed)." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "Render array as triangles (every three vertices a triangle is created)." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "Render array as triangle strips." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "Render array as triangle fans." +msgstr "" + +#: doc/classes/Mesh.xml doc/classes/VisualServer.xml +msgid "Blend shapes are normalized." +msgstr "" + +#: doc/classes/Mesh.xml doc/classes/VisualServer.xml +msgid "Blend shapes are relative to base weight." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "" +"Mesh array contains vertices. All meshes require a vertex array so this " +"should always be present." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "Mesh array contains normals." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "Mesh array contains tangents." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "Mesh array contains colors." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "Mesh array contains UVs." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "Mesh array contains second UV." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "Mesh array contains bones." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "Mesh array contains bone weights." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "Mesh array uses indices." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "" +"Used internally to calculate other [code]ARRAY_COMPRESS_*[/code] enum " +"values. Do not use." +msgstr "" + +#: doc/classes/Mesh.xml doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) vertex array." +msgstr "" + +#: doc/classes/Mesh.xml doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) normal array." +msgstr "" + +#: doc/classes/Mesh.xml doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) tangent array." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." +msgstr "" + +#: doc/classes/Mesh.xml doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) UV coordinates array." +msgstr "" + +#: doc/classes/Mesh.xml doc/classes/VisualServer.xml +msgid "" +"Flag used to mark a compressed (half float) UV coordinates array for the " +"second UV coordinates." +msgstr "" + +#: doc/classes/Mesh.xml doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed bone array." +msgstr "" + +#: doc/classes/Mesh.xml doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) weight array." +msgstr "" + +#: doc/classes/Mesh.xml doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed index array." +msgstr "" + +#: doc/classes/Mesh.xml doc/classes/VisualServer.xml +msgid "Flag used to mark that the array contains 2D vertices." +msgstr "" + +#: doc/classes/Mesh.xml doc/classes/VisualServer.xml +msgid "Flag used to mark that the array uses 16-bit bones instead of 8-bit." +msgstr "" + +#: doc/classes/Mesh.xml doc/classes/VisualServer.xml +msgid "" +"Flag used to mark that the array uses an octahedral representation of normal " +"and tangent vectors rather than cartesian." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "" +"Used to set flags [constant ARRAY_COMPRESS_VERTEX], [constant " +"ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " +"ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " +"ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "Array of vertices." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "Array of normals." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "Array of tangents as an array of floats, 4 floats per tangent." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "Array of colors." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "Array of UV coordinates." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "Array of second set of UV coordinates." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "Array of bone data." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "Array of weights." +msgstr "" + +#: doc/classes/Mesh.xml +msgid "Array of indices." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Helper tool to access and edit [Mesh] data." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "" +"MeshDataTool provides access to individual vertices in a [Mesh]. It allows " +"users to read and edit vertex data of meshes. It also creates an array of " +"faces and edges.\n" +"To use MeshDataTool, load a mesh with [method create_from_surface]. When you " +"are finished editing the data commit the data to a mesh with [method " +"commit_to_surface].\n" +"Below is an example of how MeshDataTool may be used.\n" +"[codeblock]\n" +"var mesh = ArrayMesh.new()\n" +"mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, CubeMesh.new()." +"get_mesh_arrays())\n" +"var mdt = MeshDataTool.new()\n" +"mdt.create_from_surface(mesh, 0)\n" +"for i in range(mdt.get_vertex_count()):\n" +" var vertex = mdt.get_vertex(i)\n" +" # In this example we extend the mesh by one unit, which results in " +"separated faces as it is flat shaded.\n" +" vertex += mdt.get_vertex_normal(i)\n" +" # Save your change.\n" +" mdt.set_vertex(i, vertex)\n" +"mesh.surface_remove(0)\n" +"mdt.commit_to_surface(mesh)\n" +"var mi = MeshInstance.new()\n" +"mi.mesh = mesh\n" +"add_child(mi)\n" +"[/codeblock]\n" +"See also [ArrayMesh], [ImmediateGeometry] and [SurfaceTool] for procedural " +"geometry generation.\n" +"[b]Note:[/b] Godot uses clockwise [url=https://learnopengl.com/Advanced-" +"OpenGL/Face-culling]winding order[/url] for front faces of triangle " +"primitive modes." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Clears all data currently in MeshDataTool." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Adds a new surface to specified [Mesh] with edited data." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "" +"Uses specified surface of given [Mesh] to populate data for MeshDataTool.\n" +"Requires [Mesh] with primitive type [constant Mesh.PRIMITIVE_TRIANGLES]." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Returns the number of edges in this [Mesh]." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Returns array of faces that touch given edge." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Returns meta information assigned to given edge." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "" +"Returns index of specified vertex connected to given edge.\n" +"Vertex argument can only be 0 or 1 because edges are comprised of two " +"vertices." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Returns the number of faces in this [Mesh]." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "" +"Returns specified edge associated with given face.\n" +"Edge argument must be either 0, 1, or 2 because a face only has three edges." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Returns the metadata associated with the given face." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Calculates and returns the face normal of the given face." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "" +"Returns the specified vertex of the given face.\n" +"Vertex argument must be either 0, 1, or 2 because faces contain three " +"vertices." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "" +"Returns the [Mesh]'s format. Format is an integer made up of [Mesh] format " +"flags combined together. For example, a mesh containing both vertices and " +"normals would return a format of [code]3[/code] because [constant ArrayMesh." +"ARRAY_FORMAT_VERTEX] is [code]1[/code] and [constant ArrayMesh." +"ARRAY_FORMAT_NORMAL] is [code]2[/code].\n" +"See [enum ArrayMesh.ArrayFormat] for a list of format flags." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Returns the material assigned to the [Mesh]." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Returns the vertex at given index." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Returns the bones of the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Returns the color of the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Returns the total number of vertices in [Mesh]." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Returns an array of edges that share the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Returns an array of faces that share the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Returns the metadata associated with the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Returns the normal of the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Returns the tangent of the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Returns the UV of the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Returns the UV2 of the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Returns bone weights of the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Sets the metadata of the given edge." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Sets the metadata of the given face." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Sets the material to be used by newly-constructed [Mesh]." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Sets the position of the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Sets the bones of the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Sets the color of the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Sets the metadata associated with the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Sets the normal of the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Sets the tangent of the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Sets the UV of the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Sets the UV2 of the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml +msgid "Sets the bone weights of the given vertex." +msgstr "" + +#: doc/classes/MeshInstance.xml +msgid "Node that instances meshes into a scenario." +msgstr "" + +#: doc/classes/MeshInstance.xml +msgid "" +"MeshInstance is a node that takes a [Mesh] resource and adds it to the " +"current scenario by creating an instance of it. This is the class most often " +"used to get 3D geometry rendered and can be used to instance a single [Mesh] " +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." +msgstr "" + +#: doc/classes/MeshInstance.xml +msgid "" +"This helper creates a [StaticBody] child node with a [ConvexPolygonShape] " +"collision shape calculated from the mesh geometry. It's mainly used for " +"testing.\n" +"If [code]clean[/code] is [code]true[/code] (default), duplicate and interior " +"vertices are removed automatically. You can set it to [code]false[/code] to " +"make the process faster if not needed.\n" +"If [code]simplify[/code] is [code]true[/code], the geometry can be further " +"simplified to reduce the amount of vertices. Disabled by default." +msgstr "" + +#: doc/classes/MeshInstance.xml +msgid "" +"This helper creates a [MeshInstance] child node with gizmos at every vertex " +"calculated from the mesh geometry. It's mainly used for testing." +msgstr "" + +#: doc/classes/MeshInstance.xml +msgid "" +"This helper creates a [StaticBody] child node with multiple " +"[ConvexPolygonShape] collision shapes calculated from the mesh geometry via " +"convex decomposition. It's mainly used for testing." +msgstr "" + +#: doc/classes/MeshInstance.xml +msgid "" +"This helper creates a [StaticBody] child node with a [ConcavePolygonShape] " +"collision shape calculated from the mesh geometry. It's mainly used for " +"testing." +msgstr "" + +#: doc/classes/MeshInstance.xml +msgid "" +"Returns the [Material] that will be used by the [Mesh] when drawing. This " +"can return the [member GeometryInstance.material_override], the surface " +"override [Material] defined in this [MeshInstance], or the surface " +"[Material] defined in the [Mesh]. For example, if [member GeometryInstance." +"material_override] is used, all surfaces will return the override material." +msgstr "" + +#: doc/classes/MeshInstance.xml +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." +msgstr "" + +#: doc/classes/MeshInstance.xml +msgid "Returns the number of surface override materials." +msgstr "" + +#: doc/classes/MeshInstance.xml +msgid "" +"Returns [code]true[/code] if this [MeshInstance] can be merged with the " +"specified [code]other_mesh_instance[/code], using the [method MeshInstance." +"merge_meshes] function.\n" +"In order to be mergeable, properties of the [MeshInstance] must match, and " +"each surface must match, in terms of material, attributes and vertex format." +msgstr "" + +#: doc/classes/MeshInstance.xml +msgid "" +"This function can merge together the data from several source " +"[MeshInstance]s into a single destination [MeshInstance] (the MeshInstance " +"the function is called from). This is primarily useful for improving " +"performance by reducing the number of drawcalls and [Node]s.\n" +"Merging should only be attempted for simple meshes that do not contain " +"animation.\n" +"The final vertices can either be returned in global space, or in local space " +"relative to the destination [MeshInstance] global transform (the destination " +"Node must be inside the [SceneTree] for local space to work).\n" +"The function will make a final check for compatibility between the " +"[MeshInstance]s by default, this should always be used unless you have " +"previously checked for compatibility using [method MeshInstance." +"is_mergeable_with]. If the compatibility check is omitted and the meshes are " +"merged, you may see rendering errors.\n" +"[b]Note:[/b] The requirements for similarity between meshes are quite " +"stringent. They can be checked using the [method MeshInstance." +"is_mergeable_with] function prior to calling [method MeshInstance." +"merge_meshes].\n" +"Also note that any initial data in the destination [MeshInstance] data will " +"be discarded." +msgstr "" + +#: doc/classes/MeshInstance.xml +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." +msgstr "" + +#: doc/classes/MeshInstance.xml +msgid "The [Mesh] resource for the instance." +msgstr "" + +#: doc/classes/MeshInstance.xml +msgid "[NodePath] to the [Skeleton] associated with the instance." +msgstr "" + +#: doc/classes/MeshInstance.xml +msgid "Sets the skin to be used by this instance." +msgstr "" + +#: doc/classes/MeshInstance.xml +msgid "" +"If [code]true[/code], normals are transformed when software skinning is " +"used. Set to [code]false[/code] when normals are not needed for better " +"performance.\n" +"See [member ProjectSettings.rendering/quality/skinning/" +"software_skinning_fallback] for details about how software skinning is " +"enabled." +msgstr "" + +#: doc/classes/MeshInstance2D.xml +msgid "Node used for displaying a [Mesh] in 2D." +msgstr "" + +#: doc/classes/MeshInstance2D.xml +msgid "" +"Node used for displaying a [Mesh] in 2D. A [MeshInstance2D] can be " +"automatically created from an existing [Sprite] via a tool in the editor " +"toolbar. Select the [Sprite] node, then choose [b]Sprite > Convert to " +"MeshInstance2D[/b] at the top of the 2D editor viewport." +msgstr "" + +#: doc/classes/MeshInstance2D.xml +msgid "The [Mesh] that will be drawn by the [MeshInstance2D]." +msgstr "" + +#: doc/classes/MeshInstance2D.xml doc/classes/MultiMeshInstance2D.xml +msgid "" +"The normal map that will be used if using the default [CanvasItemMaterial].\n" +"[b]Note:[/b] Godot expects the normal map to use X+, Y+, and Z+ coordinates. " +"See [url=http://wiki.polycount.com/wiki/" +"Normal_Map_Technical_Details#Common_Swizzle_Coordinates]this page[/url] for " +"a comparison of normal map coordinates expected by popular engines." +msgstr "" + +#: doc/classes/MeshInstance2D.xml doc/classes/MultiMeshInstance2D.xml +msgid "" +"The [Texture] that will be used if using the default [CanvasItemMaterial]. " +"Can be accessed as [code]TEXTURE[/code] in CanvasItem shader." +msgstr "" + +#: doc/classes/MeshInstance2D.xml doc/classes/MultiMeshInstance2D.xml +msgid "Emitted when the [member texture] is changed." +msgstr "" + +#: doc/classes/MeshLibrary.xml +msgid "Library of meshes." +msgstr "" + +#: doc/classes/MeshLibrary.xml +msgid "" +"A library of meshes. Contains a list of [Mesh] resources, each with a name " +"and ID. Each item can also include collision and navigation shapes. This " +"resource is used in [GridMap]." +msgstr "" + +#: doc/classes/MeshLibrary.xml +msgid "Clears the library." +msgstr "" + +#: doc/classes/MeshLibrary.xml +msgid "" +"Creates a new item in the library with the given ID.\n" +"You can get an unused ID from [method get_last_unused_item_id]." +msgstr "" + +#: doc/classes/MeshLibrary.xml +msgid "Returns the first item with the given name." +msgstr "" + +#: doc/classes/MeshLibrary.xml +msgid "Returns the list of item IDs in use." +msgstr "" + +#: doc/classes/MeshLibrary.xml +msgid "Returns the item's mesh." +msgstr "" + +#: doc/classes/MeshLibrary.xml +msgid "Returns the transform applied to the item's mesh." +msgstr "" + +#: doc/classes/MeshLibrary.xml +msgid "Returns the item's name." +msgstr "" + +#: doc/classes/MeshLibrary.xml +msgid "Returns the item's navigation mesh." +msgstr "" + +#: doc/classes/MeshLibrary.xml +msgid "Returns the transform applied to the item's navigation mesh." +msgstr "" + +#: doc/classes/MeshLibrary.xml +msgid "" +"When running in the editor, returns a generated item preview (a 3D rendering " +"in isometric perspective). When used in a running project, returns the " +"manually-defined item preview which can be set using [method " +"set_item_preview]. Returns an empty [Texture] if no preview was manually set " +"in a running project." +msgstr "" + +#: doc/classes/MeshLibrary.xml +msgid "" +"Returns an item's collision shapes.\n" +"The array consists of each [Shape] followed by its [Transform]." +msgstr "" + +#: doc/classes/MeshLibrary.xml +msgid "Gets an unused ID for a new item." +msgstr "" + +#: doc/classes/MeshLibrary.xml +msgid "Removes the item." +msgstr "" + +#: doc/classes/MeshLibrary.xml +msgid "Sets the item's mesh." +msgstr "" + +#: doc/classes/MeshLibrary.xml +msgid "Sets the transform to apply to the item's mesh." +msgstr "" + +#: doc/classes/MeshLibrary.xml +msgid "" +"Sets the item's name.\n" +"This name is shown in the editor. It can also be used to look up the item " +"later using [method find_item_by_name]." +msgstr "" + +#: doc/classes/MeshLibrary.xml +msgid "Sets the item's navigation mesh." +msgstr "" + +#: doc/classes/MeshLibrary.xml +msgid "Sets the transform to apply to the item's navigation mesh." +msgstr "" + +#: doc/classes/MeshLibrary.xml +msgid "Sets a texture to use as the item's preview icon in the editor." +msgstr "" + +#: doc/classes/MeshLibrary.xml +msgid "" +"Sets an item's collision shapes.\n" +"The array should consist of [Shape] objects, each followed by a [Transform] " +"that will be applied to it. For shapes that should not have a transform, use " +"[constant Transform.IDENTITY]." +msgstr "" + +#: doc/classes/MeshTexture.xml +msgid "Simple texture that uses a mesh to draw itself." +msgstr "" + +#: doc/classes/MeshTexture.xml +msgid "" +"Simple texture that uses a mesh to draw itself. It's limited because flags " +"can't be changed and region drawing is not supported." +msgstr "" + +#: doc/classes/MeshTexture.xml +msgid "Sets the base texture that the Mesh will use to draw." +msgstr "" + +#: doc/classes/MeshTexture.xml +msgid "Sets the size of the image, needed for reference." +msgstr "" + +#: doc/classes/MeshTexture.xml +msgid "Sets the mesh used to draw. It must be a mesh using 2D vertices." +msgstr "" + +#: doc/classes/MethodTweener.xml +msgid "" +"Interpolates an abstract value and supplies it to a method called over time." +msgstr "" + +#: doc/classes/MethodTweener.xml +msgid "" +"[MethodTweener] is similar to a combination of [CallbackTweener] and " +"[PropertyTweener]. It calls a method providing an interpolated value as a " +"parameter. See [method SceneTreeTween.tween_method] for more usage " +"information.\n" +"[b]Note:[/b] [method SceneTreeTween.tween_method] is the only correct way to " +"create [MethodTweener]. Any [MethodTweener] created manually will not " +"function correctly." +msgstr "" + +#: doc/classes/MethodTweener.xml +msgid "" +"Sets the time in seconds after which the [MethodTweener] will start " +"interpolating. By default there's no delay." +msgstr "" + +#: doc/classes/MethodTweener.xml doc/classes/PropertyTweener.xml +msgid "" +"Sets the type of used easing from [enum Tween.EaseType]. If not set, the " +"default easing is used from the [SceneTreeTween] that contains this Tweener." +msgstr "" + +#: doc/classes/MethodTweener.xml doc/classes/PropertyTweener.xml +msgid "" +"Sets the type of used transition from [enum Tween.TransitionType]. If not " +"set, the default transition is used from the [SceneTreeTween] that contains " +"this Tweener." +msgstr "" + +#: modules/mobile_vr/doc_classes/MobileVRInterface.xml +msgid "Generic mobile VR implementation." +msgstr "" + +#: modules/mobile_vr/doc_classes/MobileVRInterface.xml +msgid "" +"This is a generic mobile VR implementation where you need to provide details " +"about the phone and HMD used. It does not rely on any existing framework. " +"This is the most basic interface we have. For the best effect, you need a " +"mobile phone with a gyroscope and accelerometer.\n" +"Note that even though there is no positional tracking, the camera will " +"assume the headset is at a height of 1.85 meters. You can change this by " +"setting [member eye_height].\n" +"You can initialise this interface as follows:\n" +"[codeblock]\n" +"var interface = ARVRServer.find_interface(\"Native mobile\")\n" +"if interface and interface.initialize():\n" +" get_viewport().arvr = true\n" +"[/codeblock]" +msgstr "" + +#: modules/mobile_vr/doc_classes/MobileVRInterface.xml +msgid "" +"The distance between the display and the lenses inside of the device in " +"centimeters." +msgstr "" + +#: modules/mobile_vr/doc_classes/MobileVRInterface.xml +msgid "The width of the display in centimeters." +msgstr "" + +#: modules/mobile_vr/doc_classes/MobileVRInterface.xml +msgid "" +"The height at which the camera is placed in relation to the ground (i.e. " +"[ARVROrigin] node)." +msgstr "" + +#: modules/mobile_vr/doc_classes/MobileVRInterface.xml +msgid "" +"The interocular distance, also known as the interpupillary distance. The " +"distance between the pupils of the left and right eye." +msgstr "" + +#: modules/mobile_vr/doc_classes/MobileVRInterface.xml +msgid "" +"The k1 lens factor is one of the two constants that define the strength of " +"the lens used and directly influences the lens distortion effect." +msgstr "" + +#: modules/mobile_vr/doc_classes/MobileVRInterface.xml +msgid "The k2 lens factor, see k1." +msgstr "" + +#: modules/mobile_vr/doc_classes/MobileVRInterface.xml +msgid "" +"The oversample setting. Because of the lens distortion we have to render our " +"buffers at a higher resolution then the screen can natively handle. A value " +"between 1.5 and 2.0 often provides good results but at the cost of " +"performance." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "Provides high-performance mesh instancing." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "" +"MultiMesh provides low-level mesh instancing. Drawing thousands of " +"[MeshInstance] nodes can be slow, since each object is submitted to the GPU " +"then drawn individually.\n" +"MultiMesh is much faster as it can draw thousands of instances with a single " +"draw call, resulting in less API overhead.\n" +"As a drawback, if the instances are too far away from each other, " +"performance may be reduced as every single instance will always render (they " +"are spatially indexed as one, for the whole object).\n" +"Since instances may have any behavior, the AABB used for visibility must be " +"provided by the user." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "" +"Returns the visibility axis-aligned bounding box in local space. See also " +"[method VisualInstance.get_transformed_aabb]." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "Gets a specific instance's color." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "Returns the custom data that has been set for a specific instance." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "Returns the [Transform] of a specific instance." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "Returns the [Transform2D] of a specific instance." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "" +"When using [i]physics interpolation[/i], this function allows you to prevent " +"interpolation on an instance in the current physics tick.\n" +"This allows you to move instances instantaneously, and should usually be " +"used when initially placing an instance such as a bullet to prevent " +"graphical glitches." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "" +"Sets all data related to the instances in one go. This is especially useful " +"when loading the data from disk or preparing the data from GDNative.\n" +"All data is packed in one large float array. An array may look like this: " +"Transform for instance 1, color data for instance 1, custom data for " +"instance 1, transform for instance 2, color data for instance 2, etc...\n" +"[Transform] is stored as 12 floats, [Transform2D] is stored as 8 floats, " +"[code]COLOR_8BIT[/code] / [code]CUSTOM_DATA_8BIT[/code] is stored as 1 float " +"(4 bytes as is) and [code]COLOR_FLOAT[/code] / [code]CUSTOM_DATA_FLOAT[/" +"code] is stored as 4 floats." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "" +"An alternative version of [method MultiMesh.set_as_bulk_array] which can be " +"used with [i]physics interpolation[/i]. This method takes two arrays, and " +"can set the data for the current and previous tick in one go. The renderer " +"will automatically interpolate the data at each frame.\n" +"This is useful for situations where the order of instances may change from " +"physics tick to tick, such as particle systems.\n" +"When the order of instances is coherent, the simpler [method MultiMesh." +"set_as_bulk_array] can still be used with interpolation." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "" +"Sets the color of a specific instance by [i]multiplying[/i] the mesh's " +"existing vertex colors.\n" +"For the color to take effect, ensure that [member color_format] is non-" +"[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "" +"Sets custom data for a specific instance. Although [Color] is used, it is " +"just a container for 4 floating point numbers. The format of the number can " +"change depending on the [enum CustomDataFormat] used." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "Sets the [Transform] for a specific instance." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "Sets the [Transform2D] for a specific instance." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "Format of colors in color array that gets passed to shader." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "Format of custom data in custom data array that gets passed to shader." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "" +"Number of instances that will get drawn. This clears and (re)sizes the " +"buffers. By default, all instances are drawn but you can limit this with " +"[member visible_instance_count]." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "Mesh to be drawn." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "" +"Choose whether to use an interpolation method that favors speed or quality.\n" +"When using low physics tick rates (typically below 20) or high rates of " +"object rotation, you may get better results from the high quality setting.\n" +"[b]Note:[/b] Fast quality does not equate to low quality. Except in the " +"special cases mentioned above, the quality should be comparable to high " +"quality." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "Format of transform used to transform mesh, either 2D or 3D." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "" +"Limits the number of instances drawn, -1 draws all instances. Changing this " +"does not change the sizes of the buffers." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "Use this when using 2D transforms." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "Use this when using 3D transforms." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "Use when you are not using per-instance [Color]s." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "" +"Compress [Color] data into 8 bits when passing to shader. This uses less " +"memory and can be faster, but the [Color] loses precision." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "" +"The [Color] passed into [method set_instance_color] will use 4 floats. Use " +"this for highest precision [Color]." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "Use when you are not using per-instance custom data." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "" +"Compress custom_data into 8 bits when passing to shader. This uses less " +"memory and can be faster, but loses precision and range. Floats packed into " +"8 bits can only represent values between 0 and 1, numbers outside that range " +"will be clamped." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "" +"The [Color] passed into [method set_instance_custom_data] will use 4 floats. " +"Use this for highest precision." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "" +"Always interpolate using Basis lerping, which can produce warping artifacts " +"in some situations." +msgstr "" + +#: doc/classes/MultiMesh.xml +msgid "" +"Attempt to interpolate using Basis slerping (spherical linear interpolation) " +"where possible, otherwise fall back to lerping." +msgstr "" + +#: doc/classes/MultiMeshInstance.xml +msgid "Node that instances a [MultiMesh]." +msgstr "" + +#: doc/classes/MultiMeshInstance.xml +msgid "" +"[MultiMeshInstance] is a specialized node to instance [GeometryInstance]s " +"based on a [MultiMesh] resource.\n" +"This is useful to optimize the rendering of a high amount of instances of a " +"given mesh (for example trees in a forest or grass strands)." +msgstr "" + +#: doc/classes/MultiMeshInstance.xml +msgid "" +"The [MultiMesh] resource that will be used and shared among all instances of " +"the [MultiMeshInstance]." +msgstr "" + +#: doc/classes/MultiMeshInstance2D.xml +msgid "Node that instances a [MultiMesh] in 2D." +msgstr "" + +#: doc/classes/MultiMeshInstance2D.xml +msgid "" +"[MultiMeshInstance2D] is a specialized node to instance a [MultiMesh] " +"resource in 2D.\n" +"Usage is the same as [MultiMeshInstance]." +msgstr "" + +#: doc/classes/MultiMeshInstance2D.xml +msgid "The [MultiMesh] that will be drawn by the [MultiMeshInstance2D]." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml +msgid "High-level multiplayer API." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml +msgid "" +"This class implements most of the logic behind the high-level multiplayer " +"API. See also [NetworkedMultiplayerPeer].\n" +"By default, [SceneTree] has a reference to this class that is used to " +"provide multiplayer capabilities (i.e. RPC/RSET) across the whole scene.\n" +"It is possible to override the MultiplayerAPI instance used by specific " +"Nodes by setting the [member Node.custom_multiplayer] property, effectively " +"allowing to run both client and server in the same scene.\n" +"[b]Note:[/b] The high-level multiplayer API protocol is an implementation " +"detail and isn't meant to be used by non-Godot servers. It may change " +"without notice." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml +msgid "" +"Clears the current MultiplayerAPI network state (you shouldn't call this " +"unless you know what you are doing)." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml +msgid "" +"Returns the peer IDs of all connected peers of this MultiplayerAPI's [member " +"network_peer]." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml +msgid "" +"Returns the unique peer ID of this MultiplayerAPI's [member network_peer]." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml +msgid "" +"Returns the sender's peer ID for the RPC currently being executed.\n" +"[b]Note:[/b] If not inside an RPC this method will return 0." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml doc/classes/SceneTree.xml +msgid "Returns [code]true[/code] if there is a [member network_peer] set." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml +msgid "" +"Returns [code]true[/code] if this MultiplayerAPI's [member network_peer] is " +"in server mode (listening for connections)." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml +msgid "" +"Method used for polling the MultiplayerAPI. You only need to worry about " +"this if you are using [member Node.custom_multiplayer] override or you set " +"[member SceneTree.multiplayer_poll] to [code]false[/code]. By default, " +"[SceneTree] will poll its MultiplayerAPI for you.\n" +"[b]Note:[/b] This method results in RPCs and RSETs being called, so they " +"will be executed in the same context of this function (e.g. [code]_process[/" +"code], [code]physics[/code], [Thread])." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml +msgid "" +"Sends the given raw [code]bytes[/code] to a specific peer identified by " +"[code]id[/code] (see [method NetworkedMultiplayerPeer.set_target_peer]). " +"Default ID is [code]0[/code], i.e. broadcast to all peers." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml +msgid "" +"If [code]true[/code] (or if the [member network_peer] has [member PacketPeer." +"allow_object_decoding] set to [code]true[/code]), the MultiplayerAPI will " +"allow encoding and decoding of object during RPCs/RSETs.\n" +"[b]Warning:[/b] Deserialized objects can contain code which gets executed. " +"Do not use this option if the serialized object comes from untrusted sources " +"to avoid potential security threats such as remote code execution." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml +msgid "" +"The peer object to handle the RPC system (effectively enabling networking " +"when set). Depending on the peer itself, the MultiplayerAPI will become a " +"network server (check with [method is_network_server]) and will set root " +"node's network mode to master, or it will become a regular peer with root " +"node set to puppet. All child nodes are set to inherit the network mode by " +"default. Handling of networking-related events (connection, disconnection, " +"new clients) is done by connecting to MultiplayerAPI's signals." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml +msgid "" +"If [code]true[/code], the MultiplayerAPI's [member network_peer] refuses new " +"incoming connections." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml +msgid "" +"The root node to use for RPCs. Instead of an absolute path, a relative path " +"will be used to find the node upon which the RPC should be executed.\n" +"This effectively allows to have different branches of the scene tree to be " +"managed by different MultiplayerAPI, allowing for example to run both client " +"and server in the same scene." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml +msgid "" +"Emitted when this MultiplayerAPI's [member network_peer] successfully " +"connected to a server. Only emitted on clients." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml +msgid "" +"Emitted when this MultiplayerAPI's [member network_peer] fails to establish " +"a connection to a server. Only emitted on clients." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml +msgid "" +"Emitted when this MultiplayerAPI's [member network_peer] connects with a new " +"peer. ID is the peer ID of the new peer. Clients get notified when other " +"clients connect to the same server. Upon connecting to a server, a client " +"also receives this signal for the server (with ID being 1)." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml +msgid "" +"Emitted when this MultiplayerAPI's [member network_peer] disconnects from a " +"peer. Clients get notified when other clients disconnect from the same " +"server." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml +msgid "" +"Emitted when this MultiplayerAPI's [member network_peer] receive a " +"[code]packet[/code] with custom data (see [method send_bytes]). ID is the " +"peer ID of the peer that sent the packet." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml +msgid "" +"Emitted when this MultiplayerAPI's [member network_peer] disconnects from " +"server. Only emitted on clients." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml +msgid "" +"Used with [method Node.rpc_config] or [method Node.rset_config] to disable a " +"method or property for all RPC calls, making it unavailable. Default for all " +"methods." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml +msgid "" +"Used with [method Node.rpc_config] or [method Node.rset_config] to set a " +"method to be called or a property to be changed only on the remote end, not " +"locally. Analogous to the [code]remote[/code] keyword. Calls and property " +"changes are accepted from all remote peers, no matter if they are node's " +"master or puppets." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml +msgid "" +"Used with [method Node.rpc_config] or [method Node.rset_config] to set a " +"method to be called or a property to be changed only on the network master " +"for this node. Analogous to the [code]master[/code] keyword. Only accepts " +"calls or property changes from the node's network puppets, see [method Node." +"set_network_master]." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml +msgid "" +"Used with [method Node.rpc_config] or [method Node.rset_config] to set a " +"method to be called or a property to be changed only on puppets for this " +"node. Analogous to the [code]puppet[/code] keyword. Only accepts calls or " +"property changes from the node's network master, see [method Node." +"set_network_master]." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml +msgid "" +"[i]Deprecated.[/i] Use [constant RPC_MODE_PUPPET] instead. Analogous to the " +"[code]slave[/code] keyword." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml +msgid "" +"Behave like [constant RPC_MODE_REMOTE] but also make the call or property " +"change locally. Analogous to the [code]remotesync[/code] keyword." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml +msgid "" +"[i]Deprecated.[/i] Use [constant RPC_MODE_REMOTESYNC] instead. Analogous to " +"the [code]sync[/code] keyword." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml +msgid "" +"Behave like [constant RPC_MODE_MASTER] but also make the call or property " +"change locally. Analogous to the [code]mastersync[/code] keyword." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml +msgid "" +"Behave like [constant RPC_MODE_PUPPET] but also make the call or property " +"change locally. Analogous to the [code]puppetsync[/code] keyword." +msgstr "" + +#: doc/classes/Mutex.xml +msgid "A synchronization mutex (mutual exclusion)." +msgstr "" + +#: doc/classes/Mutex.xml +msgid "" +"A synchronization mutex (mutual exclusion). This is used to synchronize " +"multiple [Thread]s, and is equivalent to a binary [Semaphore]. It guarantees " +"that only one thread can ever acquire the lock at a time. A mutex can be " +"used to protect a critical section; however, be careful to avoid deadlocks." +msgstr "" + +#: doc/classes/Mutex.xml +msgid "" +"Locks this [Mutex], blocks until it is unlocked by the current owner.\n" +"[b]Note:[/b] This function returns without blocking if the thread already " +"has ownership of the mutex." +msgstr "" + +#: doc/classes/Mutex.xml +msgid "" +"Tries locking this [Mutex], but does not block. Returns [constant OK] on " +"success, [constant ERR_BUSY] otherwise.\n" +"[b]Note:[/b] This function returns [constant OK] if the thread already has " +"ownership of the mutex." +msgstr "" + +#: doc/classes/Mutex.xml +msgid "" +"Unlocks this [Mutex], leaving it to other threads.\n" +"[b]Note:[/b] If a thread called [method lock] or [method try_lock] multiple " +"times while already having ownership of the mutex, it must also call [method " +"unlock] the same number of times in order to unlock it correctly." +msgstr "" + +#: modules/gdnative/doc_classes/NativeScript.xml +msgid "" +"Returns the documentation string that was previously set with " +"[code]godot_nativescript_set_class_documentation[/code]." +msgstr "" + +#: modules/gdnative/doc_classes/NativeScript.xml +msgid "" +"Returns the documentation string that was previously set with " +"[code]godot_nativescript_set_method_documentation[/code]." +msgstr "" + +#: modules/gdnative/doc_classes/NativeScript.xml +msgid "" +"Returns the documentation string that was previously set with " +"[code]godot_nativescript_set_property_documentation[/code]." +msgstr "" + +#: modules/gdnative/doc_classes/NativeScript.xml +msgid "" +"Returns the documentation string that was previously set with " +"[code]godot_nativescript_set_signal_documentation[/code]." +msgstr "" + +#: modules/gdnative/doc_classes/NativeScript.xml +msgid "" +"Constructs a new object of the base type with a script of this type already " +"attached.\n" +"[b]Note:[/b] Any arguments passed to this function will be ignored and not " +"passed to the native constructor function. This will change with in a future " +"API extension." +msgstr "" + +#: doc/classes/Navigation.xml +msgid "Mesh-based navigation and pathfinding node." +msgstr "" + +#: doc/classes/Navigation.xml +msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" +"Provides navigation and pathfinding within a collection of " +"[NavigationMesh]es. By default, these will be automatically collected from " +"child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " +"class also assists with aligning navigation agents with the meshes they are " +"navigating on." +msgstr "" + +#: doc/classes/Navigation.xml doc/classes/NavigationMesh.xml +#: doc/classes/NavigationServer.xml +msgid "3D Navmesh Demo" +msgstr "" + +#: doc/classes/Navigation.xml doc/classes/Navigation2D.xml +msgid "" +"Returns the navigation point closest to the point given. Points are in local " +"coordinate space." +msgstr "" + +#: doc/classes/Navigation.xml +msgid "" +"Returns the surface normal at the navigation point closest to the point " +"given. Useful for rotating a navigation agent according to the navigation " +"mesh it moves on." +msgstr "" + +#: doc/classes/Navigation.xml +msgid "" +"Returns the owner of the [NavigationMesh] which contains the navigation " +"point closest to the point given. This is usually a [NavigationMeshInstance]." +msgstr "" + +#: doc/classes/Navigation.xml +msgid "" +"Returns the navigation point closest to the given line segment. When " +"enabling [code]use_collision[/code], only considers intersection points " +"between segment and navigation meshes. If multiple intersection points are " +"found, the one closest to the segment start point is returned." +msgstr "" + +#: doc/classes/Navigation.xml +msgid "Returns the [RID] of the navigation map on the [NavigationServer]." +msgstr "" + +#: doc/classes/Navigation.xml +msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" +"Returns the path between two given points. Points are in local coordinate " +"space. If [code]optimize[/code] is [code]true[/code] (the default), the " +"agent properties associated with each [NavigationMesh] (radius, height, " +"etc.) are considered in the path calculation, otherwise they are ignored." +msgstr "" + +#: doc/classes/Navigation.xml +msgid "The cell height to use for fields." +msgstr "" + +#: doc/classes/Navigation.xml doc/classes/NavigationMesh.xml +msgid "The XZ plane cell size to use for fields." +msgstr "" + +#: doc/classes/Navigation.xml doc/classes/Navigation2D.xml +msgid "" +"This value is used to detect the near edges to connect compatible regions." +msgstr "" + +#: doc/classes/Navigation.xml +msgid "" +"A bitfield determining all navigation map layers the navigation can use on a " +"[method Navigation.get_simple_path] path query." +msgstr "" + +#: doc/classes/Navigation.xml +msgid "" +"Defines which direction is up. By default, this is [code](0, 1, 0)[/code], " +"which is the world's \"up\" direction." +msgstr "" + +#: doc/classes/Navigation.xml doc/classes/Navigation2DServer.xml +#: doc/classes/NavigationServer.xml +msgid "" +"Emitted when a navigation map is updated, when a region moves or is modified." +msgstr "" + +#: doc/classes/Navigation2D.xml +msgid "2D navigation and pathfinding node." +msgstr "" + +#: doc/classes/Navigation2D.xml +msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" +"Navigation2D provides navigation and pathfinding within a 2D area, specified " +"as a collection of [NavigationPolygon] resources. By default, these are " +"automatically collected from child [NavigationPolygonInstance] nodes." +msgstr "" + +#: doc/classes/Navigation2D.xml doc/classes/Navigation2DServer.xml +#: doc/classes/NavigationPolygon.xml +msgid "2D Navigation Demo" +msgstr "" + +#: doc/classes/Navigation2D.xml +msgid "" +"Returns the owner of the [NavigationPolygon] which contains the navigation " +"point closest to the point given. This is usually a " +"[NavigationPolygonInstance]." +msgstr "" + +#: doc/classes/Navigation2D.xml +msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" +"Returns the path between two given points. Points are in local coordinate " +"space. If [code]optimize[/code] is [code]true[/code] (the default), the path " +"is smoothed by merging path segments where possible." +msgstr "" + +#: doc/classes/Navigation2D.xml +msgid "The XY plane cell size to use for fields." +msgstr "" + +#: doc/classes/Navigation2D.xml +msgid "" +"A bitfield determining all navigation map layers the navigation can use on a " +"[method Navigation2D.get_simple_path] path query." +msgstr "" + +#: doc/classes/Navigation2DServer.xml +msgid "Server interface for low-level 2D navigation access." +msgstr "" + +#: doc/classes/Navigation2DServer.xml +msgid "" +"Navigation2DServer is the server responsible for all 2D navigation. It " +"handles several objects, namely maps, regions and agents.\n" +"Maps are made up of regions, which are made of navigation polygons. " +"Together, they define the navigable areas in the 2D world.\n" +"[b]Note:[/b] Most NavigationServer changes take effect after the next " +"physics frame and not immediately. This includes all changes made to maps, " +"regions or agents by navigation related Nodes in the SceneTree or made " +"through scripts.\n" +"For two regions to be connected to each other, they must share a similar " +"edge. An edge is considered connected to another if both of its two vertices " +"are at a distance less than navigation map [code]edge_connection_margin[/" +"code] to the respective other edge's vertex.\n" +"You may assign navigation layers to regions with [method Navigation2DServer." +"region_set_navigation_layers], which then can be checked upon when " +"requesting a path with [method Navigation2DServer.map_get_path]. This allows " +"allowing or forbidding some areas to 2D objects.\n" +"To use the collision avoidance system, you may use agents. You can set an " +"agent's target velocity, then the servers will emit a callback with a " +"modified velocity.\n" +"[b]Note:[/b] The collision avoidance system ignores regions. Using the " +"modified velocity as-is might lead to pushing and agent outside of a " +"navigable area. This is a limitation of the collision avoidance system, any " +"more complex situation may require the use of the physics engine.\n" +"This server keeps tracks of any call and executes them during the sync " +"phase. This means that you can request any change to the map, using any " +"thread, without worrying." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "Creates the agent." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns the navigation map [RID] the requested [code]agent[/code] is " +"currently assigned to." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "Returns [code]true[/code] if the map got changed the previous frame." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Callback called at the end of the RVO process. If a callback is created " +"manually and the agent is placed on a navigation map it will calculate " +"avoidance for the agent and dispatch the calculated [code]safe_velocity[/" +"code] to the [code]receiver[/code] object with a signal to the chosen " +"[code]method[/code] name.\n" +"[b]Note:[/b] Created callbacks are always processed independently of the " +"SceneTree state as long as the agent is on a navigation map and not freed. " +"To disable the dispatch of a callback from an agent use [method " +"agent_set_callback] again with a [code]null[/code] object as the " +"[code]receiver[/code]." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "Puts the agent in the map." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Sets the maximum number of other agents the agent takes into account in the " +"navigation. The larger this number, the longer the running time of the " +"simulation. If the number is too low, the simulation will not be safe." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "Sets the maximum speed of the agent. Must be positive." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Sets the maximum distance to other agents this agent takes into account in " +"the navigation. The larger this number, the longer the running time of the " +"simulation. If the number is too low, the simulation will not be safe." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "Sets the position of the agent in world space." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "Sets the radius of the agent." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "Sets the new target velocity." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"The minimal amount of time for which the agent's velocities that are " +"computed by the simulation are safe with respect to other agents. The larger " +"this number, the sooner this agent will respond to the presence of other " +"agents, but the less freedom this agent has in choosing its velocities. Must " +"be positive." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "Sets the current velocity of the agent." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "Destroys the given RID." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "Create a new map." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all navigation agents [RID]s that are currently assigned to the " +"requested navigation [code]map[/code]." +msgstr "" + +#: doc/classes/Navigation2DServer.xml +msgid "Returns the map cell height. [b]Note:[/b] Currently not implemented." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "Returns the map cell size." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns the point closest to the provided [code]to_point[/code] on the " +"navigation mesh surface." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns the owner region RID for the point returned by [method " +"map_get_closest_point]." +msgstr "" + +#: doc/classes/Navigation2DServer.xml +msgid "" +"Returns the edge connection margin of the map. The edge connection margin is " +"a distance used to connect two regions." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns the navigation path to reach the destination from the origin. " +"[code]navigation_layers[/code] is a bitmask of all region layers that are " +"allowed to be in the path." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all navigation regions [RID]s that are currently assigned to the " +"requested navigation [code]map[/code]." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "Returns [code]true[/code] if the map is active." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "Sets the map active." +msgstr "" + +#: doc/classes/Navigation2DServer.xml +msgid "" +"Set the map cell height used to weld the navigation mesh polygons. [b]Note:[/" +"b] Currently not implemented." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "Set the map cell size used to weld the navigation mesh polygons." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Set the map edge connection margin used to weld the compatible region edges." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "Creates a new region." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns the ending point of a connection door. [code]connection[/code] is an " +"index between 0 and the return value of [method " +"region_get_connections_count]." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns the starting point of a connection door. [code]connection[/code] is " +"an index between 0 and the return value of [method " +"region_get_connections_count]." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns how many connections this [code]region[/code] has with other regions " +"in the map." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "Returns the [code]enter_cost[/code] of this [code]region[/code]." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns the navigation map [RID] the requested [code]region[/code] is " +"currently assigned to." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "Returns the region's navigation layers." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "Sets the map for the region." +msgstr "" + +#: doc/classes/Navigation2DServer.xml +msgid "" +"Set the region's navigation layers. This allows selecting regions from a " +"path request (when using [method Navigation2DServer.map_get_path])." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "Sets the navigation mesh for the region." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "Sets the global transformation for the region." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "Sets the [code]travel_cost[/code] for this [code]region[/code]." +msgstr "" + +#: doc/classes/NavigationAgent.xml +msgid "3D agent used in navigation for collision avoidance." +msgstr "" + +#: doc/classes/NavigationAgent.xml +msgid "" +"3D agent that is used in navigation to reach a location while avoiding " +"static and dynamic obstacles. The dynamic obstacles are avoided using RVO " +"(Reciprocal Velocity Obstacles) collision avoidance. The agent needs " +"navigation data to work correctly. By default this node will register to the " +"default [World] navigation map. If this node is a child of a [Navigation] " +"node it will register to the navigation map of the navigation node or the " +"function [method set_navigation] can be used to set the navigation node " +"directly. [NavigationAgent] is physics safe.\n" +"[b]Note:[/b] After [method set_target_location] is used it is required to " +"use the [method get_next_location] function once every physics frame to " +"update the internal path logic of the NavigationAgent. The returned vector " +"position from this function should be used as the next movement position for " +"the agent's parent Node." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" +"Returns the distance to the target location, using the agent's global " +"position. The user must set the target location with [method " +"set_target_location] in order for this to be accurate." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" +"Returns the reachable final location in global coordinates. This can change " +"if the navigation path is altered in any way. Because of this, it would be " +"best to check this each frame." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" +"Returns this agent's current path from start to finish in global " +"coordinates. The path only updates when the target location is changed or " +"the agent requires a repath. The path array is not intended to be used in " +"direct path movement as the agent has its own internal path logic that would " +"get corrupted by changing the path array manually. Use the intended [method " +"get_next_location] once every physics frame to receive the next path point " +"for the agents movement as this function also updates the internal path " +"logic." +msgstr "" + +#: doc/classes/NavigationAgent.xml +msgid "" +"Returns which index the agent is currently on in the navigation path's " +"[PoolVector3Array]." +msgstr "" + +#: doc/classes/NavigationAgent.xml +msgid "" +"Returns the [Navigation] node that the agent is using for its navigation " +"system." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" +"Returns the [RID] of the navigation map for this NavigationAgent node. This " +"function returns always the map set on the NavigationAgent node and not the " +"map of the abstract agent on the NavigationServer. If the agent map is " +"changed directly with the NavigationServer API the NavigationAgent node will " +"not be aware of the map change. Use [method set_navigation_map] to change " +"the navigation map for the NavigationAgent and also update the agent on the " +"NavigationServer." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" +"Returns the next location in global coordinates that can be moved to, making " +"sure that there are no static objects in the way. If the agent does not have " +"a navigation path, it will return the position of the agent's parent. The " +"use of this function once every physics frame is required to update the " +"internal path logic of the NavigationAgent." +msgstr "" + +#: doc/classes/NavigationAgent.xml +msgid "Returns the [RID] of this agent on the [NavigationServer]." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" +"Returns the user-defined target location (set with [method " +"set_target_location])." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" +"Returns [code]true[/code] if the navigation path's final location has been " +"reached." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" +"Returns [code]true[/code] if the target location is reachable. The target " +"location is set using [method set_target_location]." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" +"Returns [code]true[/code] if the target location is reached. The target " +"location is set using [method set_target_location]. It may not always be " +"possible to reach the target location. It should always be possible to reach " +"the final location though. See [method get_final_location]." +msgstr "" + +#: doc/classes/NavigationAgent.xml +msgid "" +"Sets the [Navigation] node used by the agent. Useful when you don't want to " +"make the agent a child of a [Navigation] node." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" +"Sets the [RID] of the navigation map this NavigationAgent node should use " +"and also updates the [code]agent[/code] on the NavigationServer." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" +"Sets the user desired final location. This will clear the current navigation " +"path." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" +"Sends the passed in velocity to the collision avoidance algorithm. It will " +"adjust the velocity to avoid collisions. Once the adjustment to the velocity " +"is complete, it will emit the [signal velocity_computed] signal." +msgstr "" + +#: doc/classes/NavigationAgent.xml +msgid "" +"The NavigationAgent height offset is subtracted from the y-axis value of any " +"vector path position for this NavigationAgent. The NavigationAgent height " +"offset does not change or influence the navigation mesh or pathfinding query " +"result. Additional navigation maps that use regions with navigation meshes " +"that the developer baked with appropriate agent radius or height values are " +"required to support different-sized agents." +msgstr "" + +#: doc/classes/NavigationAgent.xml +msgid "" +"If [code]true[/code] the agent is registered for an RVO avoidance callback " +"on the [NavigationServer]. When [method set_velocity] is used and the " +"processing is completed a [code]safe_velocity[/code] Vector3 is received " +"with a signal connection to [signal velocity_computed]. Avoidance processing " +"with many registered agents has a significant performance cost and should " +"only be enabled on agents that currently require it." +msgstr "" + +#: doc/classes/NavigationAgent.xml +msgid "" +"Ignores collisions on the Y axis. Must be [code]true[/code] to move on a " +"horizontal plane." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "The maximum number of neighbors for the agent to consider." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "The maximum speed that an agent can move." +msgstr "" + +#: doc/classes/NavigationAgent.xml +msgid "" +"A bitfield determining all navigation map layers the [NavigationAgent] " +"belongs to. On path requests the agent will ignore navmeshes without at " +"least one matching layer." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "The distance to search for other agents." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" +"The maximum distance the agent is allowed away from the ideal path to the " +"final location. This can happen due to trying to avoid collisions. When the " +"maximum distance is exceeded, it recalculates the ideal path." +msgstr "" + +#: doc/classes/NavigationAgent.xml +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" +"The minimal amount of time for which this agent's velocities, that are " +"computed with the collision avoidance algorithm, are safe with respect to " +"other agents. The larger the number, the sooner the agent will respond to " +"other agents, but the less freedom in choosing its velocities. Must be " +"positive." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "Notifies when the final location is reached." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" +"Notifies when the navigation path changes. This can be triggered by the " +"navigation system or by the user changing the path." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" +"Notifies when the player-defined target, set with [method " +"set_target_location], is reached." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" +"Notifies when the collision avoidance velocity is calculated after a call to " +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml +msgid "2D agent used in navigation for collision avoidance." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml +msgid "" +"2D agent that is used in navigation to reach a location while avoiding " +"static and dynamic obstacles. The dynamic obstacles are avoided using RVO " +"(Reciprocal Velocity Obstacles) collision avoidance. The agent needs " +"navigation data to work correctly. By default this node will register to the " +"default [World2D] navigation map. If this node is a child of a " +"[Navigation2D] node it will register to the navigation map of the navigation " +"node or the function [method set_navigation] can be used to set the " +"navigation node directly. [NavigationAgent2D] is physics safe.\n" +"[b]Note:[/b] After [method set_target_location] is used it is required to " +"use the [method get_next_location] function once every physics frame to " +"update the internal path logic of the NavigationAgent. The returned vector " +"position from this function should be used as the next movement position for " +"the agent's parent Node." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml +msgid "" +"Returns which index the agent is currently on in the navigation path's " +"[PoolVector2Array]." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml +msgid "" +"Returns the [Navigation2D] node that the agent is using for its navigation " +"system." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml +msgid "Returns the [RID] of this agent on the [Navigation2DServer]." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml +msgid "" +"Sets the [Navigation2D] node used by the agent. Useful when you don't want " +"to make the agent a child of a [Navigation2D] node." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml +msgid "" +"If [code]true[/code] the agent is registered for an RVO avoidance callback " +"on the [Navigation2DServer]. When [method set_velocity] is used and the " +"processing is completed a [code]safe_velocity[/code] Vector2 is received " +"with a signal connection to [signal velocity_computed]. Avoidance processing " +"with many registered agents has a significant performance cost and should " +"only be enabled on agents that currently require it." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml +msgid "" +"A bitfield determining all navigation map layers the [NavigationAgent2D] " +"belongs to. On path requests the agent will ignore navmeshes without at " +"least one matching layer." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "A mesh to approximate the walkable areas and obstacles." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"A navigation mesh is a collection of polygons that define which areas of an " +"environment are traversable to aid agents in pathfinding through complicated " +"spaces." +msgstr "" + +#: doc/classes/NavigationMesh.xml doc/classes/NavigationPolygon.xml +msgid "" +"Adds a polygon using the indices of the vertices you get when calling " +"[method get_vertices]." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"Clears the array of polygons, but it doesn't clear the array of vertices." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"Initializes the navigation mesh by setting the vertices and indices " +"according to a [Mesh]." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"Returns whether the specified [code]bit[/code] of the [member " +"geometry_collision_mask] is set." +msgstr "" + +#: doc/classes/NavigationMesh.xml doc/classes/NavigationPolygon.xml +msgid "" +"Returns a [PoolIntArray] containing the indices of the vertices of a created " +"polygon." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "Returns the number of polygons in the navigation mesh." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"Returns a [PoolVector3Array] containing all the vertices being used to " +"create the polygons." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" +"code] in the [member geometry_collision_mask].\n" +"If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" +"code] in the [member geometry_collision_mask]." +msgstr "" + +#: doc/classes/NavigationMesh.xml doc/classes/NavigationPolygon.xml +msgid "" +"Sets the vertices that can be then indexed to create polygons with the " +"[method add_polygon] method." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"The minimum floor to ceiling height that will still allow the floor area to " +"be considered walkable.\n" +"[b]Note:[/b] While baking, this value will be rounded up to the nearest " +"multiple of [member cell_height]." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"The minimum ledge height that is considered to still be traversable.\n" +"[b]Note:[/b] While baking, this value will be rounded down to the nearest " +"multiple of [member cell_height]." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The maximum slope that is considered walkable, in degrees." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"The distance to erode/shrink the walkable area of the heightfield away from " +"obstructions.\n" +"[b]Note:[/b] While baking, this value will be rounded up to the nearest " +"multiple of [member cell_size]." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The Y axis cell size to use for fields." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"The sampling distance to use when generating the detail mesh, in cell unit." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"The maximum distance the detail mesh surface should deviate from " +"heightfield, in cell unit." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"The maximum distance a simplfied contour's border edges should deviate the " +"original raw contour." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"The maximum allowed length for contour edges along the border of the mesh.\n" +"[b]Note:[/b] While baking, this value will be rounded up to the nearest " +"multiple of [member cell_size]." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "If [code]true[/code], marks spans that are ledges as non-walkable." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"If [code]true[/code], marks non-walkable spans as walkable if their maximum " +"is within [member agent_max_climb] of a walkable neighbor." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"If [code]true[/code], marks walkable spans as not walkable if the clearance " +"above the span is less than [member agent_height]." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"The physics layers to scan for static colliders.\n" +"Only used when [member geometry_parsed_geometry_type] is [constant " +"PARSED_GEOMETRY_STATIC_COLLIDERS] or [constant PARSED_GEOMETRY_BOTH]." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"Determines which type of nodes will be parsed as geometry. See [enum " +"ParsedGeometryType] for possible values." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"The source of the geometry used when baking. See [enum SourceGeometryMode] " +"for possible values." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"The name of the group to scan for geometry.\n" +"Only used when [member geometry_source_geometry_mode] is [constant " +"SOURCE_GEOMETRY_GROUPS_WITH_CHILDREN] or [constant " +"SOURCE_GEOMETRY_GROUPS_EXPLICIT]." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"The maximum number of vertices allowed for polygons generated during the " +"contour to polygon conversion process." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"Any regions with a size smaller than this will be merged with larger regions " +"if possible.\n" +"[b]Note:[/b] This value will be squared to calculate the number of cells. " +"For example, a value of 20 will set the number of cells to 400." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"The minimum size of a region for it to be created.\n" +"[b]Note:[/b] This value will be squared to calculate the minimum number of " +"cells allowed to form isolated island areas. For example, a value of 8 will " +"set the number of cells to 64." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"Partitioning algorithm for creating the navigation mesh polys. See [enum " +"SamplePartitionType] for possible values." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"Watershed partitioning. Generally the best choice if you precompute the " +"navigation mesh, use this if you have large open areas." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"Monotone partitioning. Use this if you want fast navigation mesh generation." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"Layer partitioning. Good choice to use for tiled navigation mesh with medium " +"and small sized tiles." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "Represents the size of the [enum SamplePartitionType] enum." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"Parses mesh instances as geometry. This includes [MeshInstance], [CSGShape], " +"and [GridMap] nodes." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"Parses [StaticBody] colliders as geometry. The collider should be in any of " +"the layers specified by [member geometry_collision_mask]." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"Both [constant PARSED_GEOMETRY_MESH_INSTANCES] and [constant " +"PARSED_GEOMETRY_STATIC_COLLIDERS]." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "Represents the size of the [enum ParsedGeometryType] enum." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"Scans the child nodes of [NavigationMeshInstance] recursively for geometry." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"Scans nodes in a group and their child nodes recursively for geometry. The " +"group is specified by [member geometry_source_group_name]." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "" +"Uses nodes in a group for geometry. The group is specified by [member " +"geometry_source_group_name]." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "Represents the size of the [enum SourceGeometryMode] enum." +msgstr "" + +#: doc/classes/NavigationMeshGenerator.xml +msgid "Helper class for creating and clearing navigation meshes." +msgstr "" + +#: doc/classes/NavigationMeshGenerator.xml +msgid "" +"This class is responsible for creating and clearing 3D navigation meshes " +"used as [NavigationMesh] resources inside [NavigationMeshInstance]. The " +"[NavigationMeshGenerator] has very limited to no use for 2D as the " +"navigation mesh baking process expects 3D node types and 3D source geometry " +"to parse.\n" +"The entire navigation mesh baking is best done in a separate thread as the " +"voxelization, collision tests and mesh optimization steps involved are very " +"performance and time hungry operations.\n" +"Navigation mesh baking happens in multiple steps and the result depends on " +"3D source geometry and properties of the [NavigationMesh] resource. In the " +"first step, starting from a root node and depending on [NavigationMesh] " +"properties all valid 3D source geometry nodes are collected from the " +"[SceneTree]. Second, all collected nodes are parsed for their relevant 3D " +"geometry data and a combined 3D mesh is build. Due to the many different " +"types of parsable objects, from normal [MeshInstance]s to [CSGShape]s or " +"various [CollisionObject]s, some operations to collect geometry data can " +"trigger [VisualServer] and [PhysicsServer] synchronizations. Server " +"synchronization can have a negative effect on baking time or framerate as it " +"often involves [Mutex] locking for thread security. Many parsable objects " +"and the continuous synchronization with other threaded Servers can increase " +"the baking time significantly. On the other hand only a few but very large " +"and complex objects will take some time to prepare for the Servers which can " +"noticeably stall the next frame render. As a general rule the total amount " +"of parsable objects and their individual size and complexity should be " +"balanced to avoid framerate issues or very long baking times. The combined " +"mesh is then passed to the Recast Navigation Object to test the source " +"geometry for walkable terrain suitable to [NavigationMesh] agent properties " +"by creating a voxel world around the meshes bounding area.\n" +"The finalized navigation mesh is then returned and stored inside the " +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." +msgstr "" + +#: doc/classes/NavigationMeshGenerator.xml +msgid "" +"Bakes navigation data to the provided [code]nav_mesh[/code] by parsing child " +"nodes under the provided [code]root_node[/code] or a specific group of nodes " +"for potential source geometry. The parse behavior can be controlled with the " +"[member NavigationMesh.geometry_parsed_geometry_type] and [member " +"NavigationMesh.geometry_source_geometry_mode] properties on the " +"[NavigationMesh] resource." +msgstr "" + +#: doc/classes/NavigationMeshGenerator.xml +msgid "" +"Removes all polygons and vertices from the provided [code]nav_mesh[/code] " +"resource." +msgstr "" + +#: doc/classes/NavigationMeshInstance.xml +msgid "An instance of a [NavigationMesh]." +msgstr "" + +#: doc/classes/NavigationMeshInstance.xml +msgid "" +"An instance of a [NavigationMesh]. It tells the [Navigation] node what can " +"be navigated and what cannot, based on the [NavigationMesh] resource.\n" +"By default this node will register to the default [World] navigation map. If " +"this node is a child of a [Navigation] node it will register to the " +"navigation map of the navigation node.\n" +"Two regions can be connected to each other if they share a similar edge. You " +"can set the minimum distance between two vertices required to connect two " +"edges by using [method NavigationServer.map_set_edge_connection_margin].\n" +"[b]Note:[/b] Overlapping two regions' navmeshes is not enough for connecting " +"two regions. They must share a similar edge.\n" +"The cost of entering this region from another region can be controlled with " +"the [member enter_cost] value.\n" +"[b]Note:[/b] This value is not added to the path cost when the start " +"position is already inside this region.\n" +"The cost of traveling distances inside this region can be controlled with " +"the [member travel_cost] multiplier." +msgstr "" + +#: doc/classes/NavigationMeshInstance.xml +msgid "" +"Bakes the [NavigationMesh]. If [code]on_thread[/code] is set to [code]true[/" +"code] (default), the baking is done on a separate thread. Baking on separate " +"thread is useful because navigation baking is not a cheap operation. When it " +"is completed, it automatically sets the new [NavigationMesh]. Please note " +"that baking on separate thread may be very slow if geometry is parsed from " +"meshes as async access to each mesh involves heavy synchronization. Also, " +"please note that baking on a separate thread is automatically disabled on " +"operating systems that cannot use threads (such as HTML5 with threads " +"disabled)." +msgstr "" + +#: doc/classes/NavigationMeshInstance.xml +msgid "" +"Returns the [RID] of this region on the [NavigationServer]. Combined with " +"[method NavigationServer.map_get_closest_point_owner] can be used to " +"identify the [NavigationMeshInstance] closest to a point on the merged " +"navigation map." +msgstr "" + +#: doc/classes/NavigationMeshInstance.xml +msgid "Determines if the [NavigationMeshInstance] is enabled or disabled." +msgstr "" + +#: doc/classes/NavigationMeshInstance.xml +#: doc/classes/NavigationPolygonInstance.xml +msgid "" +"When pathfinding enters this region's navmesh from another regions navmesh " +"the [code]enter_cost[/code] value is added to the path distance for " +"determining the shortest path." +msgstr "" + +#: doc/classes/NavigationMeshInstance.xml +msgid "" +"A bitfield determining all navigation map layers the [NavigationMesh] " +"belongs to. On path requests with [method NavigationServer.map_get_path] " +"navmeshes without matching layers will be ignored and the navigation map " +"will only proximity merge different navmeshes with matching layers." +msgstr "" + +#: doc/classes/NavigationMeshInstance.xml +msgid "The [NavigationMesh] resource to use." +msgstr "" + +#: doc/classes/NavigationMeshInstance.xml +#: doc/classes/NavigationPolygonInstance.xml +msgid "" +"When pathfinding moves inside this region's navmesh the traveled distances " +"are multiplied with [code]travel_cost[/code] for determining the shortest " +"path." +msgstr "" + +#: doc/classes/NavigationMeshInstance.xml +msgid "Notifies when the navigation mesh bake operation is completed." +msgstr "" + +#: doc/classes/NavigationMeshInstance.xml +msgid "Notifies when the [NavigationMesh] has changed." +msgstr "" + +#: doc/classes/NavigationObstacle.xml +msgid "3D obstacle used in navigation for collision avoidance." +msgstr "" + +#: doc/classes/NavigationObstacle.xml +msgid "" +"3D obstacle used in navigation for collision avoidance. The obstacle needs " +"navigation data to work correctly. This can be done by having the obstacle " +"as a child of a [Navigation] node, or using [method set_navigation]. " +"[NavigationObstacle] is physics safe.\n" +"[b]Note:[/b] Obstacles are intended as a last resort option for constantly " +"moving objects that cannot be (re)baked to a navigation mesh efficiently." +msgstr "" + +#: doc/classes/NavigationObstacle.xml +msgid "" +"Returns the [Navigation] node that the obstacle is using for its navigation " +"system." +msgstr "" + +#: doc/classes/NavigationObstacle.xml +msgid "Returns the [RID] of this obstacle on the [NavigationServer]." +msgstr "" + +#: doc/classes/NavigationObstacle.xml +msgid "" +"Sets the [Navigation] node used by the obstacle. Useful when you don't want " +"to make the obstacle a child of a [Navigation] node." +msgstr "" + +#: doc/classes/NavigationObstacle.xml doc/classes/NavigationObstacle2D.xml +msgid "" +"Enables radius estimation algorithm which uses parent's collision shapes to " +"determine the obstacle radius." +msgstr "" + +#: doc/classes/NavigationObstacle.xml doc/classes/NavigationObstacle2D.xml +msgid "" +"The radius of the agent. Used only if [member estimate_radius] is set to " +"[code]false[/code]." +msgstr "" + +#: doc/classes/NavigationObstacle2D.xml +msgid "2D obstacle used in navigation for collision avoidance." +msgstr "" + +#: doc/classes/NavigationObstacle2D.xml +msgid "" +"2D obstacle used in navigation for collision avoidance. The obstacle needs " +"navigation data to work correctly. This can be done by having the obstacle " +"as a child of a [Navigation2D] node, or using [method set_navigation]. " +"[NavigationObstacle2D] is physics safe.\n" +"[b]Note:[/b] Obstacles are intended as a last resort option for constantly " +"moving objects that cannot be (re)baked to a navigation mesh efficiently." +msgstr "" + +#: doc/classes/NavigationObstacle2D.xml +msgid "" +"Returns the [Navigation2D] node that the obstacle is using for its " +"navigation system." +msgstr "" + +#: doc/classes/NavigationObstacle2D.xml +msgid "Returns the [RID] of this obstacle on the [Navigation2DServer]." +msgstr "" + +#: doc/classes/NavigationObstacle2D.xml +msgid "" +"Sets the [Navigation2D] node used by the obstacle. Useful when you don't " +"want to make the obstacle a child of a [Navigation2D] node." +msgstr "" + +#: doc/classes/NavigationPolygon.xml +msgid "" +"A node that has methods to draw outlines or use indices of vertices to " +"create navigation polygons." +msgstr "" + +#: doc/classes/NavigationPolygon.xml +msgid "" +"There are two ways to create polygons. Either by using the [method " +"add_outline] method, or using the [method add_polygon] method.\n" +"Using [method add_outline]:\n" +"[codeblock]\n" +"var polygon = NavigationPolygon.new()\n" +"var outline = PoolVector2Array([Vector2(0, 0), Vector2(0, 50), Vector2(50, " +"50), Vector2(50, 0)])\n" +"polygon.add_outline(outline)\n" +"polygon.make_polygons_from_outlines()\n" +"$NavigationPolygonInstance.navpoly = polygon\n" +"[/codeblock]\n" +"Using [method add_polygon] and indices of the vertices array.\n" +"[codeblock]\n" +"var polygon = NavigationPolygon.new()\n" +"var vertices = PoolVector2Array([Vector2(0, 0), Vector2(0, 50), Vector2(50, " +"50), Vector2(50, 0)])\n" +"polygon.set_vertices(vertices)\n" +"var indices = PoolIntArray([0, 1, 2, 3])\n" +"polygon.add_polygon(indices)\n" +"$NavigationPolygonInstance.navpoly = polygon\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/NavigationPolygon.xml +msgid "" +"Appends a [PoolVector2Array] that contains the vertices of an outline to the " +"internal array that contains all the outlines. You have to call [method " +"make_polygons_from_outlines] in order for this array to be converted to " +"polygons that the engine will use." +msgstr "" + +#: doc/classes/NavigationPolygon.xml +msgid "" +"Adds a [PoolVector2Array] that contains the vertices of an outline to the " +"internal array that contains all the outlines at a fixed position. You have " +"to call [method make_polygons_from_outlines] in order for this array to be " +"converted to polygons that the engine will use." +msgstr "" + +#: doc/classes/NavigationPolygon.xml +msgid "" +"Clears the array of the outlines, but it doesn't clear the vertices and the " +"polygons that were created by them." +msgstr "" + +#: doc/classes/NavigationPolygon.xml +msgid "" +"Clears the array of polygons, but it doesn't clear the array of outlines and " +"vertices." +msgstr "" + +#: doc/classes/NavigationPolygon.xml +msgid "" +"Returns the [NavigationMesh] resulting from this navigation polygon. This " +"navmesh can be used to update the navmesh of a region with the [method " +"NavigationServer.region_set_navmesh] API directly (as 2D uses the 3D server " +"behind the scene)." +msgstr "" + +#: doc/classes/NavigationPolygon.xml +msgid "" +"Returns a [PoolVector2Array] containing the vertices of an outline that was " +"created in the editor or by script." +msgstr "" + +#: doc/classes/NavigationPolygon.xml +msgid "" +"Returns the number of outlines that were created in the editor or by script." +msgstr "" + +#: doc/classes/NavigationPolygon.xml +msgid "Returns the count of all polygons." +msgstr "" + +#: doc/classes/NavigationPolygon.xml +msgid "" +"Returns a [PoolVector2Array] containing all the vertices being used to " +"create the polygons." +msgstr "" + +#: doc/classes/NavigationPolygon.xml +msgid "Creates polygons from the outlines added in the editor or by script." +msgstr "" + +#: doc/classes/NavigationPolygon.xml +msgid "" +"Removes an outline created in the editor or by script. You have to call " +"[method make_polygons_from_outlines] for the polygons to update." +msgstr "" + +#: doc/classes/NavigationPolygon.xml +msgid "" +"Changes an outline created in the editor or by script. You have to call " +"[method make_polygons_from_outlines] for the polygons to update." +msgstr "" + +#: doc/classes/NavigationPolygonInstance.xml +msgid "A region of the 2D navigation map." +msgstr "" + +#: doc/classes/NavigationPolygonInstance.xml +msgid "" +"A region of the navigation map. It tells the [Navigation2DServer] what can " +"be navigated and what cannot, based on its [NavigationPolygon] resource.\n" +"By default this node will register to the default [World2D] navigation map. " +"If this node is a child of a [Navigation2D] node it will register to the " +"navigation map of the navigation node.\n" +"Two regions can be connected to each other if they share a similar edge. You " +"can set the minimum distance between two vertices required to connect two " +"edges by using [method Navigation2DServer.map_set_edge_connection_margin].\n" +"[b]Note:[/b] Overlapping two regions' polygons is not enough for connecting " +"two regions. They must share a similar edge.\n" +"The pathfinding cost of entering this region from another region can be " +"controlled with the [member enter_cost] value.\n" +"[b]Note:[/b] This value is not added to the path cost when the start " +"position is already inside this region.\n" +"The pathfinding cost of traveling distances inside this region can be " +"controlled with the [member travel_cost] multiplier." +msgstr "" + +#: doc/classes/NavigationPolygonInstance.xml +msgid "" +"Returns the [RID] of this region on the [Navigation2DServer]. Combined with " +"[method Navigation2DServer.map_get_closest_point_owner] can be used to " +"identify the [NavigationPolygonInstance] closest to a point on the merged " +"navigation map." +msgstr "" + +#: doc/classes/NavigationPolygonInstance.xml +msgid "Determines if the [NavigationPolygonInstance] is enabled or disabled." +msgstr "" + +#: doc/classes/NavigationPolygonInstance.xml +msgid "" +"A bitfield determining all navigation map layers the [NavigationPolygon] " +"belongs to. On path requests with [method Navigation2DServer.map_get_path] " +"navmeshes without matching layers will be ignored and the navigation map " +"will only proximity merge different navmeshes with matching layers." +msgstr "" + +#: doc/classes/NavigationPolygonInstance.xml +msgid "The [NavigationPolygon] resource to use." +msgstr "" + +#: doc/classes/NavigationServer.xml +msgid "Server interface for low-level 3D navigation access." +msgstr "" + +#: doc/classes/NavigationServer.xml +msgid "" +"NavigationServer is the server responsible for all 3D navigation. It handles " +"several objects, namely maps, regions and agents.\n" +"Maps are made up of regions, which are made of navigation meshes. Together, " +"they define the navigable areas in the 3D world.\n" +"[b]Note:[/b] Most NavigationServer changes take effect after the next " +"physics frame and not immediately. This includes all changes made to maps, " +"regions or agents by navigation related Nodes in the SceneTree or made " +"through scripts.\n" +"For two regions to be connected to each other, they must share a similar " +"edge. An edge is considered connected to another if both of its two vertices " +"are at a distance less than [member Navigation.edge_connection_margin] to " +"the respective other edge's vertex.\n" +"To use the collision avoidance system, you may use agents. You can set an " +"agent's target velocity, then the servers will emit a callback with a " +"modified velocity.\n" +"[b]Note:[/b] The collision avoidance system ignores regions. Using the " +"modified velocity as-is might lead to pushing and agent outside of a " +"navigable area. This is a limitation of the collision avoidance system, any " +"more complex situation may require the use of the physics engine.\n" +"This server keeps tracks of any call and executes them during the sync " +"phase. This means that you can request any change to the map, using any " +"thread, without worrying." +msgstr "" + +#: doc/classes/NavigationServer.xml +msgid "Returns the map cell height." +msgstr "" + +#: doc/classes/NavigationServer.xml +msgid "" +"Returns the normal for the point returned by [method map_get_closest_point]." +msgstr "" + +#: doc/classes/NavigationServer.xml +msgid "" +"Returns the closest point between the navigation surface and the segment." +msgstr "" + +#: doc/classes/NavigationServer.xml +msgid "" +"Returns the edge connection margin of the map. This distance is the minimum " +"vertex distance needed to connect two edges from different regions." +msgstr "" + +#: doc/classes/NavigationServer.xml +msgid "Returns the map's up direction." +msgstr "" + +#: doc/classes/NavigationServer.xml +msgid "Set the map cell height used to weld the navigation mesh polygons." +msgstr "" + +#: doc/classes/NavigationServer.xml +msgid "Sets the map up direction." +msgstr "" + +#: doc/classes/NavigationServer.xml +msgid "" +"Process the collision avoidance agents.\n" +"The result of this process is needed by the physics server, so this must be " +"called in the main thread.\n" +"[b]Note:[/b] This function is not thread safe." +msgstr "" + +#: doc/classes/NavigationServer.xml +msgid "Bakes the navigation mesh." +msgstr "" + +#: doc/classes/NavigationServer.xml +msgid "" +"Set the region's navigation layers. This allows selecting regions from a " +"path request (when using [method NavigationServer.map_get_path])." +msgstr "" + +#: doc/classes/NavigationServer.xml +msgid "Control activation of this server." +msgstr "" + +#: doc/classes/NetworkedMultiplayerCustom.xml +msgid "" +"A [NetworkedMultiplayerPeer] implementation that can be controlled from a " +"script." +msgstr "" + +#: doc/classes/NetworkedMultiplayerCustom.xml +msgid "" +"A [NetworkedMultiplayerPeer] implementation that can be used as a [member " +"MultiplayerAPI.network_peer] and controlled from a script.\n" +"Its purpose is to allow adding a new backend for the high-Level multiplayer " +"API without needing to use GDNative." +msgstr "" + +#: doc/classes/NetworkedMultiplayerCustom.xml +msgid "" +"Deliver a packet to the local [MultiplayerAPI].\n" +"When your script receives a packet from other peers over the network " +"(originating from the [signal packet_generated] signal on the sending peer), " +"passing it to this method will deliver it locally." +msgstr "" + +#: doc/classes/NetworkedMultiplayerCustom.xml +msgid "" +"Initialize the peer with the given [code]peer_id[/code] (must be between 1 " +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." +msgstr "" + +#: doc/classes/NetworkedMultiplayerCustom.xml +msgid "" +"Set the state of the connection. See [enum NetworkedMultiplayerPeer." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." +msgstr "" + +#: doc/classes/NetworkedMultiplayerCustom.xml +msgid "Set the max packet size that this peer can handle." +msgstr "" + +#: doc/classes/NetworkedMultiplayerCustom.xml +msgid "" +"Emitted when the local [MultiplayerAPI] generates a packet.\n" +"Your script should take this packet and send it to the requested peer over " +"the network (which should call [method deliver_packet] with the data when " +"it's received)." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml +msgid "" +"PacketPeer implementation using the [url=http://enet.bespin.org/index." +"html]ENet[/url] library." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml +msgid "" +"A PacketPeer implementation that should be passed to [member SceneTree." +"network_peer] after being initialized as either a client or server. Events " +"can then be handled by connecting to [SceneTree] signals.\n" +"ENet's purpose is to provide a relatively thin, simple and robust network " +"communication layer on top of UDP (User Datagram Protocol).\n" +"[b]Note:[/b] ENet only uses UDP, not TCP. When forwarding the server port to " +"make your server accessible on the public Internet, you only need to forward " +"the server port in UDP. You can use the [UPNP] class to try to forward the " +"server port automatically when starting the server." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml +msgid "" +"Closes the connection. Ignored if no connection is currently established. If " +"this is a server it tries to notify all clients before forcibly " +"disconnecting them. If this is a client it simply closes the connection to " +"the server." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml +msgid "" +"Create client that connects to a server at [code]address[/code] using " +"specified [code]port[/code]. The given address needs to be either a fully " +"qualified domain name (e.g. [code]\"www.example.com\"[/code]) or an IP " +"address in IPv4 or IPv6 format (e.g. [code]\"192.168.1.1\"[/code]). The " +"[code]port[/code] is the port the server is listening on. The " +"[code]in_bandwidth[/code] and [code]out_bandwidth[/code] parameters can be " +"used to limit the incoming and outgoing bandwidth to the given number of " +"bytes per second. The default of 0 means unlimited bandwidth. Note that ENet " +"will strategically drop packets on specific sides of a connection between " +"peers to ensure the peer's bandwidth is not overwhelmed. The bandwidth " +"parameters also determine the window size of a connection which limits the " +"amount of reliable packets that may be in transit at any given time. Returns " +"[constant OK] if a client was created, [constant ERR_ALREADY_IN_USE] if this " +"NetworkedMultiplayerENet instance already has an open connection (in which " +"case you need to call [method close_connection] first) or [constant " +"ERR_CANT_CREATE] if the client could not be created. If [code]client_port[/" +"code] is specified, the client will also listen to the given port; this is " +"useful for some NAT traversal techniques." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml +msgid "" +"Create server that listens to connections via [code]port[/code]. The port " +"needs to be an available, unused port between 0 and 65535. Note that ports " +"below 1024 are privileged and may require elevated permissions depending on " +"the platform. To change the interface the server listens on, use [method " +"set_bind_ip]. The default IP is the wildcard [code]\"*\"[/code], which " +"listens on all available interfaces. [code]max_clients[/code] is the maximum " +"number of clients that are allowed at once, any number up to 4095 may be " +"used, although the achievable number of simultaneous clients may be far " +"lower and depends on the application. For additional details on the " +"bandwidth parameters, see [method create_client]. Returns [constant OK] if a " +"server was created, [constant ERR_ALREADY_IN_USE] if this " +"NetworkedMultiplayerENet instance already has an open connection (in which " +"case you need to call [method close_connection] first) or [constant " +"ERR_CANT_CREATE] if the server could not be created." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml +msgid "" +"Disconnect the given peer. If \"now\" is set to [code]true[/code], the " +"connection will be closed immediately without flushing queued messages." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml +msgid "" +"Returns the channel of the last packet fetched via [method PacketPeer." +"get_packet]." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml +msgid "" +"Returns the channel of the next packet that will be retrieved via [method " +"PacketPeer.get_packet]." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml +#: modules/websocket/doc_classes/WebSocketServer.xml +msgid "Returns the IP address of the given peer." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml +#: modules/websocket/doc_classes/WebSocketServer.xml +msgid "Returns the remote port of the given peer." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml +msgid "" +"The IP used when creating a server. This is set to the wildcard [code]\"*\"[/" +"code] by default, which binds to all available interfaces. The given IP " +"needs to be in IPv4 or IPv6 address format, for example: " +"[code]\"192.168.1.1\"[/code]." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml +msgid "" +"Configure the [X509Certificate] to use when [member use_dtls] is [code]true[/" +"code]. For servers, you must also setup the [CryptoKey] via [method " +"set_dtls_key]." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml +msgid "" +"Configure the [CryptoKey] to use when [member use_dtls] is [code]true[/" +"code]. Remember to also call [method set_dtls_certificate] to setup your " +"[X509Certificate]." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml +msgid "" +"Sets the timeout parameters for a peer.The timeout parameters control how " +"and when a peer will timeout from a failure to acknowledge reliable traffic. " +"Timeout values are expressed in milliseconds.\n" +"The [code]timeout_limit[/code] is a factor that, multiplied by a value based " +"on the average round trip time, will determine the timeout limit for a " +"reliable packet. When that limit is reached, the timeout will be doubled, " +"and the peer will be disconnected if that limit has reached " +"[code]timeout_min[/code]. The [code]timeout_max[/code] parameter, on the " +"other hand, defines a fixed timeout for which any packet must be " +"acknowledged or the peer will be dropped." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml +msgid "" +"Enforce ordered packets when using [constant NetworkedMultiplayerPeer." +"TRANSFER_MODE_UNRELIABLE] (thus behaving similarly to [constant " +"NetworkedMultiplayerPeer.TRANSFER_MODE_UNRELIABLE_ORDERED]). This is the " +"only way to use ordering with the RPC system." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml +msgid "" +"The number of channels to be used by ENet. Channels are used to separate " +"different kinds of data. In reliable or ordered mode, for example, the " +"packet delivery order is ensured on a per-channel basis. This is done to " +"combat latency and reduces ordering restrictions on packets. The delivery " +"status of a packet in one channel won't stall the delivery of other packets " +"in another channel." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml +msgid "" +"The compression method used for network packets. These have different " +"tradeoffs of compression speed versus bandwidth, you may need to test which " +"one works best for your use case if you use compression at all.\n" +"[b]Note:[/b] Most games' network design involve sending many small packets " +"frequently (smaller than 4 KB each). If in doubt, it is recommended to keep " +"the default compression algorithm as it works best on these small packets.\n" +"[b]Note:[/b] [member compression_mode] must be set to the same value on both " +"the server and all its clients. Clients will fail to connect if the [member " +"compression_mode] set on the client differs from the one set on the server. " +"Prior to Godot 3.4, the default [member compression_mode] was [constant " +"COMPRESS_NONE]. Nonetheless, mixing engine versions between clients and " +"server is not recommended and not officially supported." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml +msgid "" +"The hostname used for DTLS verification, to be compared against the \"CN\" " +"value in the certificate provided by the server.\n" +"When set to an empty string, the [code]address[/code] parameter passed to " +"[method create_client] is used instead." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml +msgid "" +"Enable or disable certificate verification when [member use_dtls] is " +"[code]true[/code]." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml +msgid "" +"Enable or disable the server feature that notifies clients of other peers' " +"connection/disconnection, and relays messages between them. When this option " +"is [code]false[/code], clients won't be automatically notified of other " +"peers and won't be able to send them packets through the server." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml +msgid "" +"Set the default channel to be used to transfer data. By default, this value " +"is [code]-1[/code] which means that ENet will only use 2 channels: one for " +"reliable packets, and one for unreliable packets. The channel [code]0[/code] " +"is reserved and cannot be used. Setting this member to any value between " +"[code]0[/code] and [member channel_count] (excluded) will force ENet to use " +"that channel for sending data. See [member channel_count] for more " +"information about ENet channels." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml +msgid "" +"When enabled, the client or server created by this peer, will use " +"[PacketPeerDTLS] instead of raw UDP sockets for communicating with the " +"remote peer. This will make the communication encrypted with DTLS at the " +"cost of higher resource usage and potentially larger packet size.\n" +"[b]Note:[/b] When creating a DTLS server, make sure you setup the key/" +"certificate pair via [method set_dtls_key] and [method " +"set_dtls_certificate]. For DTLS clients, have a look at the [member " +"dtls_verify] option, and configure the certificate accordingly via [method " +"set_dtls_certificate]." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml +msgid "" +"No compression. This uses the most bandwidth, but has the upside of " +"requiring the fewest CPU resources. This option may also be used to make " +"network debugging using tools like Wireshark easier." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml +msgid "" +"ENet's built-in range encoding. Works well on small packets, but is not the " +"most efficient algorithm on packets larger than 4 KB." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml +msgid "" +"[url=http://fastlz.org/]FastLZ[/url] compression. This option uses less CPU " +"resources compared to [constant COMPRESS_ZLIB], at the expense of using more " +"bandwidth." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml +msgid "" +"[url=https://www.zlib.net/]Zlib[/url] compression. This option uses less " +"bandwidth compared to [constant COMPRESS_FASTLZ], at the expense of using " +"more CPU resources. Note that this algorithm is not very efficient on " +"packets smaller than 4 KB. Therefore, it's recommended to use other " +"compression algorithms in most cases." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml +msgid "[url=https://facebook.github.io/zstd/]Zstandard[/url] compression." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml +msgid "A high-level network interface to simplify multiplayer interactions." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml +msgid "" +"Manages the connection to network peers. Assigns unique IDs to each client " +"connected to the server. See also [MultiplayerAPI].\n" +"[b]Note:[/b] The high-level multiplayer API protocol is an implementation " +"detail and isn't meant to be used by non-Godot servers. It may change " +"without notice." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml +msgid "High-level multiplayer" +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml +msgid "WebRTC Signaling Demo" +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml +msgid "" +"Returns the current state of the connection. See [enum ConnectionStatus]." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml +msgid "" +"Returns the ID of the [NetworkedMultiplayerPeer] who sent the most recent " +"packet." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml +msgid "Returns the ID of this [NetworkedMultiplayerPeer]." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml +msgid "Waits up to 1 second to receive a new network event." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml +msgid "" +"Sets the peer to which packets will be sent.\n" +"The [code]id[/code] can be one of: [constant TARGET_PEER_BROADCAST] to send " +"to all connected peers, [constant TARGET_PEER_SERVER] to send to the peer " +"acting as server, a valid peer ID to send to that specific peer, a negative " +"peer ID to send to all peers except that one. By default, the target peer is " +"[constant TARGET_PEER_BROADCAST]." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml +msgid "" +"If [code]true[/code], this [NetworkedMultiplayerPeer] refuses new " +"connections." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml +msgid "" +"The manner in which to send packets to the [code]target_peer[/code]. See " +"[enum TransferMode]." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml +msgid "Emitted when a connection attempt fails." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml +msgid "Emitted when a connection attempt succeeds." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml +msgid "Emitted by the server when a client connects." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml +msgid "Emitted by the server when a client disconnects." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml +msgid "Emitted by clients when the server disconnects." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml +msgid "" +"Packets are not acknowledged, no resend attempts are made for lost packets. " +"Packets may arrive in any order. Potentially faster than [constant " +"TRANSFER_MODE_UNRELIABLE_ORDERED]. Use for non-critical data, and always " +"consider whether the order matters." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml +msgid "" +"Packets are not acknowledged, no resend attempts are made for lost packets. " +"Packets are received in the order they were sent in. Potentially faster than " +"[constant TRANSFER_MODE_RELIABLE]. Use for non-critical data or data that " +"would be outdated if received late due to resend attempt(s) anyway, for " +"example movement and positional data." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml +msgid "" +"Packets must be received and resend attempts should be made until the " +"packets are acknowledged. Packets must be received in the order they were " +"sent in. Most reliable transfer mode, but potentially the slowest due to the " +"overhead. Use for critical data that must be transmitted and arrive in " +"order, for example an ability being triggered or a chat message. Consider " +"carefully if the information really is critical, and use sparingly." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml +msgid "The ongoing connection disconnected." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml +msgid "A connection attempt is ongoing." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml +msgid "The connection attempt succeeded." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml +msgid "Packets are sent to the server and then redistributed to other peers." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml +msgid "Packets are sent to the server alone." +msgstr "" + +#: doc/classes/NinePatchRect.xml +msgid "" +"Scalable texture-based frame that tiles the texture's centers and sides, but " +"keeps the corners' original size. Perfect for panels and dialog boxes." +msgstr "" + +#: doc/classes/NinePatchRect.xml +msgid "" +"Also known as 9-slice panels, NinePatchRect produces clean panels of any " +"size, based on a small texture. To do so, it splits the texture in a 3×3 " +"grid. When you scale the node, it tiles the texture's sides horizontally or " +"vertically, the center on both axes but it doesn't scale or tile the corners." +msgstr "" + +#: doc/classes/NinePatchRect.xml +msgid "" +"Returns the size of the margin identified by the given [enum Margin] " +"constant." +msgstr "" + +#: doc/classes/NinePatchRect.xml +msgid "" +"Sets the size of the margin identified by the given [enum Margin] constant " +"to [code]value[/code] in pixels." +msgstr "" + +#: doc/classes/NinePatchRect.xml +msgid "" +"The stretch mode to use for horizontal stretching/tiling. See [enum " +"NinePatchRect.AxisStretchMode] for possible values." +msgstr "" + +#: doc/classes/NinePatchRect.xml +msgid "" +"The stretch mode to use for vertical stretching/tiling. See [enum " +"NinePatchRect.AxisStretchMode] for possible values." +msgstr "" + +#: doc/classes/NinePatchRect.xml +msgid "" +"If [code]true[/code], draw the panel's center. Else, only draw the 9-slice's " +"borders." +msgstr "" + +#: doc/classes/NinePatchRect.xml +msgid "" +"The height of the 9-slice's bottom row. A margin of 16 means the 9-slice's " +"bottom corners and side will have a height of 16 pixels. You can set all 4 " +"margin values individually to create panels with non-uniform borders." +msgstr "" + +#: doc/classes/NinePatchRect.xml +msgid "" +"The width of the 9-slice's left column. A margin of 16 means the 9-slice's " +"left corners and side will have a width of 16 pixels. You can set all 4 " +"margin values individually to create panels with non-uniform borders." +msgstr "" + +#: doc/classes/NinePatchRect.xml +msgid "" +"The width of the 9-slice's right column. A margin of 16 means the 9-slice's " +"right corners and side will have a width of 16 pixels. You can set all 4 " +"margin values individually to create panels with non-uniform borders." +msgstr "" + +#: doc/classes/NinePatchRect.xml +msgid "" +"The height of the 9-slice's top row. A margin of 16 means the 9-slice's top " +"corners and side will have a height of 16 pixels. You can set all 4 margin " +"values individually to create panels with non-uniform borders." +msgstr "" + +#: doc/classes/NinePatchRect.xml +msgid "" +"Rectangular region of the texture to sample from. If you're working with an " +"atlas, use this property to define the area the 9-slice should use. All " +"other properties are relative to this one. If the rect is empty, " +"NinePatchRect will use the whole texture." +msgstr "" + +#: doc/classes/NinePatchRect.xml +msgid "The node's texture resource." +msgstr "" + +#: doc/classes/NinePatchRect.xml +msgid "Emitted when the node's texture changes." +msgstr "" + +#: doc/classes/NinePatchRect.xml +msgid "" +"Stretches the center texture across the NinePatchRect. This may cause the " +"texture to be distorted." +msgstr "" + +#: doc/classes/NinePatchRect.xml +msgid "" +"Repeats the center texture across the NinePatchRect. This won't cause any " +"visible distortion. The texture must be seamless for this to work without " +"displaying artifacts between edges.\n" +"[b]Note:[/b] Only supported when using the GLES3 renderer. When using the " +"GLES2 renderer, this will behave like [constant AXIS_STRETCH_MODE_STRETCH]." +msgstr "" + +#: doc/classes/NinePatchRect.xml +msgid "" +"Repeats the center texture across the NinePatchRect, but will also stretch " +"the texture to make sure each tile is visible in full. This may cause the " +"texture to be distorted, but less than [constant AXIS_STRETCH_MODE_STRETCH]. " +"The texture must be seamless for this to work without displaying artifacts " +"between edges.\n" +"[b]Note:[/b] Only supported when using the GLES3 renderer. When using the " +"GLES2 renderer, this will behave like [constant AXIS_STRETCH_MODE_STRETCH]." +msgstr "" + +#: doc/classes/Node.xml +msgid "Base class for all [i]scene[/i] objects." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Nodes are Godot's building blocks. They can be assigned as the child of " +"another node, resulting in a tree arrangement. A given node can contain any " +"number of nodes as children with the requirement that all siblings (direct " +"children of a node) should have unique names.\n" +"A tree of nodes is called a [i]scene[/i]. Scenes can be saved to the disk " +"and then instanced into other scenes. This allows for very high flexibility " +"in the architecture and data model of Godot projects.\n" +"[b]Scene tree:[/b] The [SceneTree] contains the active tree of nodes. When a " +"node is added to the scene tree, it receives the [constant " +"NOTIFICATION_ENTER_TREE] notification and its [method _enter_tree] callback " +"is triggered. Child nodes are always added [i]after[/i] their parent node, i." +"e. the [method _enter_tree] callback of a parent node will be triggered " +"before its child's.\n" +"Once all nodes have been added in the scene tree, they receive the [constant " +"NOTIFICATION_READY] notification and their respective [method _ready] " +"callbacks are triggered. For groups of nodes, the [method _ready] callback " +"is called in reverse order, starting with the children and moving up to the " +"parent nodes.\n" +"This means that when adding a node to the scene tree, the following order " +"will be used for the callbacks: [method _enter_tree] of the parent, [method " +"_enter_tree] of the children, [method _ready] of the children and finally " +"[method _ready] of the parent (recursively for the entire scene tree).\n" +"[b]Processing:[/b] Nodes can override the \"process\" state, so that they " +"receive a callback on each frame requesting them to process (do something). " +"Normal processing (callback [method _process], toggled with [method " +"set_process]) happens as fast as possible and is dependent on the frame " +"rate, so the processing time [i]delta[/i] (in seconds) is passed as an " +"argument. Physics processing (callback [method _physics_process], toggled " +"with [method set_physics_process]) happens a fixed number of times per " +"second (60 by default) and is useful for code related to the physics " +"engine.\n" +"Nodes can also process input events. When present, the [method _input] " +"function will be called for each input that the program receives. In many " +"cases, this can be overkill (unless used for simple projects), and the " +"[method _unhandled_input] function might be preferred; it is called when the " +"input event was not handled by anyone else (typically, GUI [Control] nodes), " +"ensuring that the node only receives the events that were meant for it.\n" +"To keep track of the scene hierarchy (especially when instancing scenes into " +"other scenes), an \"owner\" can be set for the node with the [member owner] " +"property. This keeps track of who instanced what. This is mostly useful when " +"writing editors and tools, though.\n" +"Finally, when a node is freed with [method Object.free] or [method " +"queue_free], it will also free all its children.\n" +"[b]Groups:[/b] Nodes can be added to as many groups as you want to be easy " +"to manage, you could create groups like \"enemies\" or \"collectables\" for " +"example, depending on your game. See [method add_to_group], [method " +"is_in_group] and [method remove_from_group]. You can then retrieve all nodes " +"in these groups, iterate them and even call methods on groups via the " +"methods on [SceneTree].\n" +"[b]Networking with nodes:[/b] After connecting to a server (or making one, " +"see [NetworkedMultiplayerENet]), it is possible to use the built-in RPC " +"(remote procedure call) system to communicate over the network. By calling " +"[method rpc] with a method name, it will be called locally and in all " +"connected peers (peers = clients and the server that accepts connections). " +"To identify which node receives the RPC call, Godot will use its [NodePath] " +"(make sure node names are the same on all peers). Also, take a look at the " +"high-level networking tutorial and corresponding demos." +msgstr "" + +#: doc/classes/Node.xml +msgid "Nodes and Scenes" +msgstr "" + +#: doc/classes/Node.xml +msgid "All Demos" +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Called when the node enters the [SceneTree] (e.g. upon instancing, scene " +"changing, or after calling [method add_child] in a script). If the node has " +"children, its [method _enter_tree] callback will be called first, and then " +"that of the children.\n" +"Corresponds to the [constant NOTIFICATION_ENTER_TREE] notification in " +"[method Object._notification]." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Called when the node is about to leave the [SceneTree] (e.g. upon freeing, " +"scene changing, or after calling [method remove_child] in a script). If the " +"node has children, its [method _exit_tree] callback will be called last, " +"after all its children have left the tree.\n" +"Corresponds to the [constant NOTIFICATION_EXIT_TREE] notification in [method " +"Object._notification] and signal [signal tree_exiting]. To get notified when " +"the node has already left the active tree, connect to the [signal " +"tree_exited]." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"The string returned from this method is displayed as a warning in the Scene " +"Dock if the script that overrides it is a [code]tool[/code] script.\n" +"Returning an empty string produces no warning.\n" +"Call [method update_configuration_warning] when the warning needs to be " +"updated for this node." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Called when there is an input event. The input event propagates up through " +"the node tree until a node consumes it.\n" +"It is only called if input processing is enabled, which is done " +"automatically if this method is overridden, and can be toggled with [method " +"set_process_input].\n" +"To consume the input event and stop it propagating further to other nodes, " +"[method SceneTree.set_input_as_handled] can be called.\n" +"For gameplay input, [method _unhandled_input] and [method " +"_unhandled_key_input] are usually a better fit as they allow the GUI to " +"intercept the events first.\n" +"[b]Note:[/b] This method is only called if the node is present in the scene " +"tree (i.e. if it's not an orphan)." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Called during the physics processing step of the main loop. Physics " +"processing means that the frame rate is synced to the physics, i.e. the " +"[code]delta[/code] variable should be constant. [code]delta[/code] is in " +"seconds.\n" +"It is only called if physics processing is enabled, which is done " +"automatically if this method is overridden, and can be toggled with [method " +"set_physics_process].\n" +"Corresponds to the [constant NOTIFICATION_PHYSICS_PROCESS] notification in " +"[method Object._notification].\n" +"[b]Note:[/b] This method is only called if the node is present in the scene " +"tree (i.e. if it's not an orphan)." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Called during the processing step of the main loop. Processing happens at " +"every frame and as fast as possible, so the [code]delta[/code] time since " +"the previous frame is not constant. [code]delta[/code] is in seconds.\n" +"It is only called if processing is enabled, which is done automatically if " +"this method is overridden, and can be toggled with [method set_process].\n" +"Corresponds to the [constant NOTIFICATION_PROCESS] notification in [method " +"Object._notification].\n" +"[b]Note:[/b] This method is only called if the node is present in the scene " +"tree (i.e. if it's not an orphan)." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Called when the node is \"ready\", i.e. when both the node and its children " +"have entered the scene tree. If the node has children, their [method _ready] " +"callbacks get triggered first, and the parent node will receive the ready " +"notification afterwards.\n" +"Corresponds to the [constant NOTIFICATION_READY] notification in [method " +"Object._notification]. See also the [code]onready[/code] keyword for " +"variables.\n" +"Usually used for initialization. For even earlier initialization, [method " +"Object._init] may be used. See also [method _enter_tree].\n" +"[b]Note:[/b] [method _ready] may be called only once for each node. After " +"removing a node from the scene tree and adding it again, [code]_ready[/code] " +"will not be called a second time. This can be bypassed by requesting another " +"call with [method request_ready], which may be called anywhere before adding " +"the node again." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Called when an [InputEvent] hasn't been consumed by [method _input] or any " +"GUI [Control] item. The input event propagates up through the node tree " +"until a node consumes it.\n" +"It is only called if unhandled input processing is enabled, which is done " +"automatically if this method is overridden, and can be toggled with [method " +"set_process_unhandled_input].\n" +"To consume the input event and stop it propagating further to other nodes, " +"[method SceneTree.set_input_as_handled] can be called.\n" +"For gameplay input, this and [method _unhandled_key_input] are usually a " +"better fit than [method _input] as they allow the GUI to intercept the " +"events first.\n" +"[b]Note:[/b] This method is only called if the node is present in the scene " +"tree (i.e. if it's not an orphan)." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Called when an [InputEventKey] hasn't been consumed by [method _input] or " +"any GUI [Control] item. The input event propagates up through the node tree " +"until a node consumes it.\n" +"It is only called if unhandled key input processing is enabled, which is " +"done automatically if this method is overridden, and can be toggled with " +"[method set_process_unhandled_key_input].\n" +"To consume the input event and stop it propagating further to other nodes, " +"[method SceneTree.set_input_as_handled] can be called.\n" +"For gameplay input, this and [method _unhandled_input] are usually a better " +"fit than [method _input] as they allow the GUI to intercept the events " +"first.\n" +"[b]Note:[/b] This method is only called if the node is present in the scene " +"tree (i.e. if it's not an orphan)." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Adds a child node. Nodes can have any number of children, but every child " +"must have a unique name. Child nodes are automatically deleted when the " +"parent node is deleted, so an entire scene can be removed by deleting its " +"topmost node.\n" +"If [code]legible_unique_name[/code] is [code]true[/code], the child node " +"will have a human-readable name based on the name of the node being " +"instanced instead of its type.\n" +"[b]Note:[/b] If the child node already has a parent, the function will fail. " +"Use [method remove_child] first to remove the node from its current parent. " +"For example:\n" +"[codeblock]\n" +"if child_node.get_parent():\n" +" child_node.get_parent().remove_child(child_node)\n" +"add_child(child_node)\n" +"[/codeblock]\n" +"[b]Note:[/b] If you want a child to be persisted to a [PackedScene], you " +"must set [member owner] in addition to calling [method add_child]. This is " +"typically relevant for [url=$DOCS_URL/tutorials/plugins/" +"running_code_in_the_editor.html]tool scripts[/url] and [url=$DOCS_URL/" +"tutorials/plugins/editor/index.html]editor plugins[/url]. If [method " +"add_child] is called without setting [member owner], the newly added [Node] " +"will not be visible in the scene tree, though it will be visible in the " +"2D/3D view." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Adds [code]child_node[/code] as a child. The child is placed below the given " +"[code]node[/code] in the list of children.\n" +"If [code]legible_unique_name[/code] is [code]true[/code], the child node " +"will have a human-readable name based on the name of the node being " +"instanced instead of its type." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Adds the node to a group. Groups are helpers to name and organize a subset " +"of nodes, for example \"enemies\" or \"collectables\". A node can be in any " +"number of groups. Nodes can be assigned a group at any time, but will not be " +"added until they are inside the scene tree (see [method is_inside_tree]). " +"See notes in the description, and the group methods in [SceneTree].\n" +"The [code]persistent[/code] option is used when packing node to " +"[PackedScene] and saving to file. Non-persistent groups aren't stored.\n" +"[b]Note:[/b] For performance reasons, the order of node groups is [i]not[/i] " +"guaranteed. The order of node groups should not be relied upon as it can " +"vary across project runs." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Returns [code]true[/code] if the node can process while the scene tree is " +"paused (see [member pause_mode]). Always returns [code]true[/code] if the " +"scene tree is not paused, and [code]false[/code] if the node is not in the " +"tree." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Creates a new [SceneTreeTween] and binds it to this node. This is equivalent " +"of doing:\n" +"[codeblock]\n" +"get_tree().create_tween().bind_node(self)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Duplicates the node, returning a new node.\n" +"You can fine-tune the behavior using the [code]flags[/code] (see [enum " +"DuplicateFlags]).\n" +"[b]Note:[/b] It will not work properly if the node contains a script with " +"constructor arguments (i.e. needs to supply arguments to [method Object." +"_init] method). In that case, the node will be duplicated without a script." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Finds a descendant of this node whose name matches [code]mask[/code] as in " +"[method String.match] (i.e. case-sensitive, but [code]\"*\"[/code] matches " +"zero or more characters and [code]\"?\"[/code] matches any single character " +"except [code]\".\"[/code]). Returns [code]null[/code] if no matching [Node] " +"is found.\n" +"[b]Note:[/b] It does not match against the full path, just against " +"individual node names.\n" +"If [code]owned[/code] is [code]true[/code], this method only finds nodes " +"whose owner is this node. This is especially important for scenes " +"instantiated through a script, because those scenes don't have an owner.\n" +"[b]Note:[/b] As this method walks through all the descendants of the node, " +"it is the slowest way to get a reference to another node. Whenever possible, " +"consider using [method get_node] instead. To avoid using [method find_node] " +"too often, consider caching the node reference into a variable." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Finds the first parent of the current node whose name matches [code]mask[/" +"code] as in [method String.match] (i.e. case-sensitive, but [code]\"*\"[/" +"code] matches zero or more characters and [code]\"?\"[/code] matches any " +"single character except [code]\".\"[/code]).\n" +"[b]Note:[/b] It does not match against the full path, just against " +"individual node names.\n" +"[b]Note:[/b] As this method walks upwards in the scene tree, it can be slow " +"in large, deeply nested scene trees. Whenever possible, consider using " +"[method get_node] instead. To avoid using [method find_parent] too often, " +"consider caching the node reference into a variable." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Returns a child node by its index (see [method get_child_count]). This " +"method is often used for iterating all children of a node.\n" +"To access a child node via its name, use [method get_node]." +msgstr "" + +#: doc/classes/Node.xml +msgid "Returns the number of child nodes." +msgstr "" + +#: doc/classes/Node.xml +msgid "Returns an array of references to node's children." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Returns an array listing the groups that the node is a member of.\n" +"[b]Note:[/b] For performance reasons, the order of node groups is [i]not[/i] " +"guaranteed. The order of node groups should not be relied upon as it can " +"vary across project runs.\n" +"[b]Note:[/b] The engine uses some group names internally (all starting with " +"an underscore). To avoid conflicts with internal groups, do not add custom " +"groups whose name starts with an underscore. To exclude internal groups " +"while looping over [method get_groups], use the following snippet:\n" +"[codeblock]\n" +"# Stores the node's non-internal groups only (as an array of Strings).\n" +"var non_internal_groups = []\n" +"for group in get_groups():\n" +" if not group.begins_with(\"_\"):\n" +" non_internal_groups.push_back(group)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Returns the node's index, i.e. its position among the siblings of its parent." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Returns the peer ID of the network master for this node. See [method " +"set_network_master]." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Fetches a node. The [NodePath] can be either a relative path (from the " +"current node) or an absolute path (in the scene tree) to a node. If the path " +"does not exist, [code]null[/code] is returned and an error is logged. " +"Attempts to access methods on the return value will result in an \"Attempt " +"to call <method> on a null instance.\" error.\n" +"[b]Note:[/b] Fetching absolute paths only works when the node is inside the " +"scene tree (see [method is_inside_tree]).\n" +"[b]Example:[/b] Assume your current node is Character and the following " +"tree:\n" +"[codeblock]\n" +"/root\n" +"/root/Character\n" +"/root/Character/Sword\n" +"/root/Character/Backpack/Dagger\n" +"/root/MyGame\n" +"/root/Swamp/Alligator\n" +"/root/Swamp/Mosquito\n" +"/root/Swamp/Goblin\n" +"[/codeblock]\n" +"Possible paths are:\n" +"[codeblock]\n" +"get_node(\"Sword\")\n" +"get_node(\"Backpack/Dagger\")\n" +"get_node(\"../Swamp/Alligator\")\n" +"get_node(\"/root/MyGame\")\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Fetches a node and one of its resources as specified by the [NodePath]'s " +"subname (e.g. [code]Area2D/CollisionShape2D:shape[/code]). If several nested " +"resources are specified in the [NodePath], the last one will be fetched.\n" +"The return value is an array of size 3: the first index points to the [Node] " +"(or [code]null[/code] if not found), the second index points to the " +"[Resource] (or [code]null[/code] if not found), and the third index is the " +"remaining [NodePath], if any.\n" +"For example, assuming that [code]Area2D/CollisionShape2D[/code] is a valid " +"node and that its [code]shape[/code] property has been assigned a " +"[RectangleShape2D] resource, one could have this kind of output:\n" +"[codeblock]\n" +"print(get_node_and_resource(\"Area2D/CollisionShape2D\")) # " +"[[CollisionShape2D:1161], Null, ]\n" +"print(get_node_and_resource(\"Area2D/CollisionShape2D:shape\")) # " +"[[CollisionShape2D:1161], [RectangleShape2D:1156], ]\n" +"print(get_node_and_resource(\"Area2D/CollisionShape2D:shape:extents\")) # " +"[[CollisionShape2D:1161], [RectangleShape2D:1156], :extents]\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Similar to [method get_node], but does not log an error if [code]path[/code] " +"does not point to a valid [Node]." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Returns the parent node of the current node, or [code]null[/code] if the " +"node lacks a parent." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Returns the absolute path of the current node. This only works if the " +"current node is inside the scene tree (see [method is_inside_tree])." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Returns the relative [NodePath] from this node to the specified [code]node[/" +"code]. Both nodes must be in the same scene or the function will fail." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Returns the time elapsed (in seconds) since the last physics-bound frame " +"(see [method _physics_process]). This is always a constant value in physics " +"processing unless the frames per second is changed via [member Engine." +"iterations_per_second]." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Returns the node's order in the scene tree branch. For example, if called on " +"the first child node the position is [code]0[/code]." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Returns the time elapsed (in seconds) since the last process callback. This " +"value may vary from frame to frame." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Returns [code]true[/code] if this is an instance load placeholder. See " +"[InstancePlaceholder]." +msgstr "" + +#: doc/classes/Node.xml +msgid "Returns the [SceneTree] that contains this node." +msgstr "" + +#: doc/classes/Node.xml +msgid "Returns the node's [Viewport]." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Returns [code]true[/code] if the node that the [NodePath] points to exists." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Returns [code]true[/code] if the [NodePath] points to a valid node and its " +"subname points to a valid resource, e.g. [code]Area2D/CollisionShape2D:" +"shape[/code]. Properties with a non-[Resource] type (e.g. nodes or primitive " +"math types) are not considered resources." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Returns [code]true[/code] if the given node is a direct or indirect child of " +"the current node." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Returns [code]true[/code] if the node is folded (collapsed) in the Scene " +"dock." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Returns [code]true[/code] if the given node occurs later in the scene " +"hierarchy than the current node." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Returns [code]true[/code] if this node is in the specified group. See notes " +"in the description, and the group methods in [SceneTree]." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Returns [code]true[/code] if this node is currently inside a [SceneTree]." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Returns [code]true[/code] if the local system is the master of this node." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Returns [code]true[/code] if the physics interpolated flag is set for this " +"Node (see [member physics_interpolation_mode]).\n" +"[b]Note:[/b] Interpolation will only be active if both the flag is set " +"[b]and[/b] physics interpolation is enabled within the [SceneTree]. This can " +"be tested using [method is_physics_interpolated_and_enabled]." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Returns [code]true[/code] if physics interpolation is enabled (see [member " +"physics_interpolation_mode]) [b]and[/b] enabled in the [SceneTree].\n" +"This is a convenience version of [method is_physics_interpolated] that also " +"checks whether physics interpolation is enabled globally.\n" +"See [member SceneTree.physics_interpolation] and [member ProjectSettings." +"physics/common/physics_interpolation]." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Returns [code]true[/code] if physics processing is enabled (see [method " +"set_physics_process])." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Returns [code]true[/code] if internal physics processing is enabled (see " +"[method set_physics_process_internal])." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Returns [code]true[/code] if processing is enabled (see [method " +"set_process])." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Returns [code]true[/code] if the node is processing input (see [method " +"set_process_input])." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Returns [code]true[/code] if internal processing is enabled (see [method " +"set_process_internal])." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Returns [code]true[/code] if the node is processing unhandled input (see " +"[method set_process_unhandled_input])." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Returns [code]true[/code] if the node is processing unhandled key input (see " +"[method set_process_unhandled_key_input])." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Moves a child node to a different position (order) among the other children. " +"Since calls, signals, etc are performed by tree order, changing the order of " +"children nodes may be useful." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Prints all stray nodes (nodes outside the [SceneTree]). Used for debugging. " +"Works only in debug builds." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Prints the tree to stdout. Used mainly for debugging purposes. This version " +"displays the path relative to the current node, and is good for copy/pasting " +"into the [method get_node] function.\n" +"[b]Example output:[/b]\n" +"[codeblock]\n" +"TheGame\n" +"TheGame/Menu\n" +"TheGame/Menu/Label\n" +"TheGame/Menu/Camera2D\n" +"TheGame/SplashScreen\n" +"TheGame/SplashScreen/Camera2D\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Similar to [method print_tree], this prints the tree to stdout. This version " +"displays a more graphical representation similar to what is displayed in the " +"scene inspector. It is useful for inspecting larger trees.\n" +"[b]Example output:[/b]\n" +"[codeblock]\n" +" â”–â•´TheGame\n" +" â” â•´Menu\n" +" ┃ â” â•´Label\n" +" ┃ â”–â•´Camera2D\n" +" â”–â•´SplashScreen\n" +" â”–â•´Camera2D\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Calls the given method (if present) with the arguments given in [code]args[/" +"code] on this node and recursively on all its children. If the " +"[code]parent_first[/code] argument is [code]true[/code], the method will be " +"called on the current node first, then on all its children. If " +"[code]parent_first[/code] is [code]false[/code], the children will be called " +"first." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Notifies the current node and all its children recursively by calling " +"[method Object.notification] on all of them." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Queues a node for deletion at the end of the current frame. When deleted, " +"all of its child nodes will be deleted as well. This method ensures it's " +"safe to delete the node, contrary to [method Object.free]. Use [method " +"Object.is_queued_for_deletion] to check whether a node will be deleted at " +"the end of the frame.\n" +"[b]Important:[/b] If you have a variable pointing to a node, it will [i]not[/" +"i] be assigned to [code]null[/code] once the node is freed. Instead, it will " +"point to a [i]previously freed instance[/i] and you should validate it with " +"[method @GDScript.is_instance_valid] before attempting to call its methods " +"or access its properties." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Moves this node to the bottom of parent node's children hierarchy. This is " +"often useful in GUIs ([Control] nodes), because their order of drawing " +"depends on their order in the tree. The top Node is drawn first, then any " +"siblings below the top Node in the hierarchy are successively drawn on top " +"of it. After using [code]raise[/code], a Control will be drawn on top of its " +"siblings." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Removes a node and sets all its children as children of the parent node (if " +"it exists). All event subscriptions that pass by the removed node will be " +"unsubscribed." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Removes a child node. The node is NOT deleted and must be deleted manually.\n" +"[b]Note:[/b] This function may set the [member owner] of the removed Node " +"(or its descendants) to be [code]null[/code], if that [member owner] is no " +"longer a parent or ancestor." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Removes a node from a group. See notes in the description, and the group " +"methods in [SceneTree]." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Replaces a node in a scene by the given one. Subscriptions that pass through " +"this node will be lost.\n" +"[b]Note:[/b] The given node will become the new parent of any child nodes " +"that the replaced node had.\n" +"[b]Note:[/b] The replaced node is not automatically freed, so you either " +"need to keep it in a variable for later use or free it using [method Object." +"free]." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Requests that [code]_ready[/code] be called again. Note that the method " +"won't be called immediately, but is scheduled for when the node is added to " +"the scene tree again (see [method _ready]). [code]_ready[/code] is called " +"only for the node which requested it, which means that you need to request " +"ready for each child if you want them to call [code]_ready[/code] too (in " +"which case, [code]_ready[/code] will be called in the same order as it would " +"normally)." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"When physics interpolation is active, moving a node to a radically different " +"transform (such as placement within a level) can result in a visible glitch " +"as the object is rendered moving from the old to new position over the " +"physics tick.\n" +"This glitch can be prevented by calling [code]reset_physics_interpolation[/" +"code], which temporarily turns off interpolation until the physics tick is " +"complete.\n" +"[constant NOTIFICATION_RESET_PHYSICS_INTERPOLATION] will be received by the " +"node and all children recursively.\n" +"[b]Note:[/b] This function should be called [b]after[/b] moving the node, " +"rather than before." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Sends a remote procedure call request for the given [code]method[/code] to " +"peers on the network (and locally), optionally sending all additional " +"arguments as arguments to the method called by the RPC. The call request " +"will only be received by nodes with the same [NodePath], including the exact " +"same node name. Behaviour depends on the RPC configuration for the given " +"method, see [method rpc_config]. Methods are not exposed to RPCs by default. " +"See also [method rset] and [method rset_config] for properties. Returns " +"[code]null[/code].\n" +"[b]Note:[/b] You can only safely use RPCs on clients after you received the " +"[code]connected_to_server[/code] signal from the [SceneTree]. You also need " +"to keep track of the connection state, either by the [SceneTree] signals " +"like [code]server_disconnected[/code] or by checking [code]SceneTree." +"network_peer.get_connection_status() == CONNECTION_CONNECTED[/code]." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Changes the RPC mode for the given [code]method[/code] to the given " +"[code]mode[/code]. See [enum MultiplayerAPI.RPCMode]. An alternative is " +"annotating methods and properties with the corresponding keywords " +"([code]remote[/code], [code]master[/code], [code]puppet[/code], " +"[code]remotesync[/code], [code]mastersync[/code], [code]puppetsync[/code]). " +"By default, methods are not exposed to networking (and RPCs). See also " +"[method rset] and [method rset_config] for properties." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Sends a [method rpc] to a specific peer identified by [code]peer_id[/code] " +"(see [method NetworkedMultiplayerPeer.set_target_peer]). Returns [code]null[/" +"code]." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Sends a [method rpc] using an unreliable protocol. Returns [code]null[/code]." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Sends a [method rpc] to a specific peer identified by [code]peer_id[/code] " +"using an unreliable protocol (see [method NetworkedMultiplayerPeer." +"set_target_peer]). Returns [code]null[/code]." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Remotely changes a property's value on other peers (and locally). Behaviour " +"depends on the RPC configuration for the given property, see [method " +"rset_config]. See also [method rpc] for RPCs for methods, most information " +"applies to this method as well." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Changes the RPC mode for the given [code]property[/code] to the given " +"[code]mode[/code]. See [enum MultiplayerAPI.RPCMode]. An alternative is " +"annotating methods and properties with the corresponding keywords " +"([code]remote[/code], [code]master[/code], [code]puppet[/code], " +"[code]remotesync[/code], [code]mastersync[/code], [code]puppetsync[/code]). " +"By default, properties are not exposed to networking (and RPCs). See also " +"[method rpc] and [method rpc_config] for methods." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Remotely changes the property's value on a specific peer identified by " +"[code]peer_id[/code] (see [method NetworkedMultiplayerPeer.set_target_peer])." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Remotely changes the property's value on other peers (and locally) using an " +"unreliable protocol." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Remotely changes property's value on a specific peer identified by " +"[code]peer_id[/code] using an unreliable protocol (see [method " +"NetworkedMultiplayerPeer.set_target_peer])." +msgstr "" + +#: doc/classes/Node.xml +msgid "Sets the folded state of the node in the Scene dock." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Sets the node's network master to the peer with the given peer ID. The " +"network master is the peer that has authority over the node on the network. " +"Useful in conjunction with the [code]master[/code] and [code]puppet[/code] " +"keywords. Inherited from the parent node by default, which ultimately " +"defaults to peer ID 1 (the server). If [code]recursive[/code], the given " +"peer is recursively set as the master for all children of this node." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Enables or disables physics (i.e. fixed framerate) processing. When a node " +"is being processed, it will receive a [constant " +"NOTIFICATION_PHYSICS_PROCESS] at a fixed (usually 60 FPS, see [member Engine." +"iterations_per_second] to change) interval (and the [method " +"_physics_process] callback will be called if exists). Enabled automatically " +"if [method _physics_process] is overridden. Any calls to this before [method " +"_ready] will be ignored." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Enables or disables internal physics for this node. Internal physics " +"processing happens in isolation from the normal [method _physics_process] " +"calls and is used by some nodes internally to guarantee proper functioning " +"even if the node is paused or physics processing is disabled for scripting " +"([method set_physics_process]). Only useful for advanced uses to manipulate " +"built-in nodes' behavior.\n" +"[b]Warning:[/b] Built-in Nodes rely on the internal processing for their own " +"logic, so changing this value from your code may lead to unexpected " +"behavior. Script access to this internal logic is provided for specific " +"advanced uses, but is unsafe and not supported." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Enables or disables processing. When a node is being processed, it will " +"receive a [constant NOTIFICATION_PROCESS] on every drawn frame (and the " +"[method _process] callback will be called if exists). Enabled automatically " +"if [method _process] is overridden. Any calls to this before [method _ready] " +"will be ignored." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Enables or disables input processing. This is not required for GUI controls! " +"Enabled automatically if [method _input] is overridden. Any calls to this " +"before [method _ready] will be ignored." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Enables or disabled internal processing for this node. Internal processing " +"happens in isolation from the normal [method _process] calls and is used by " +"some nodes internally to guarantee proper functioning even if the node is " +"paused or processing is disabled for scripting ([method set_process]). Only " +"useful for advanced uses to manipulate built-in nodes' behavior.\n" +"[b]Warning:[/b] Built-in Nodes rely on the internal processing for their own " +"logic, so changing this value from your code may lead to unexpected " +"behavior. Script access to this internal logic is provided for specific " +"advanced uses, but is unsafe and not supported." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Enables unhandled input processing. This is not required for GUI controls! " +"It enables the node to receive all input that was not previously handled " +"(usually by a [Control]). Enabled automatically if [method _unhandled_input] " +"is overridden. Any calls to this before [method _ready] will be ignored." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Enables unhandled key input processing. Enabled automatically if [method " +"_unhandled_key_input] is overridden. Any calls to this before [method " +"_ready] will be ignored." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Sets whether this is an instance load placeholder. See [InstancePlaceholder]." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Updates the warning displayed for this node in the Scene Dock.\n" +"Use [method _get_configuration_warning] to setup the warning message to " +"display." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"The override to the default [MultiplayerAPI]. Set to [code]null[/code] to " +"use the default [SceneTree] one." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"If a scene is instantiated from a file, its topmost node contains the " +"absolute file path from which it was loaded in [member filename] (e.g. " +"[code]res://levels/1.tscn[/code]). Otherwise, [member filename] is set to an " +"empty string." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"The [MultiplayerAPI] instance associated with this node. Either the [member " +"custom_multiplayer], or the default SceneTree one (if inside tree)." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"The name of the node. This name is unique among the siblings (other child " +"nodes from the same parent). When set to an existing name, the node will be " +"automatically renamed.\n" +"[b]Note:[/b] Auto-generated names might include the [code]@[/code] " +"character, which is reserved for unique names when using [method add_child]. " +"When setting the name manually, any [code]@[/code] will be removed." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"The node owner. A node can have any other node as owner (as long as it is a " +"valid parent, grandparent, etc. ascending in the tree). When saving a node " +"(using [PackedScene]), all the nodes it owns will be saved with it. This " +"allows for the creation of complex [SceneTree]s, with instancing and " +"subinstancing.\n" +"[b]Note:[/b] If you want a child to be persisted to a [PackedScene], you " +"must set [member owner] in addition to calling [method add_child]. This is " +"typically relevant for [url=$DOCS_URL/tutorials/plugins/" +"running_code_in_the_editor.html]tool scripts[/url] and [url=$DOCS_URL/" +"tutorials/plugins/editor/index.html]editor plugins[/url]. If [method " +"add_child] is called without setting [member owner], the newly added [Node] " +"will not be visible in the scene tree, though it will be visible in the " +"2D/3D view." +msgstr "" + +#: doc/classes/Node.xml +msgid "Pause mode. How the node will behave if the [SceneTree] is paused." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Allows enabling or disabling physics interpolation per node, offering a " +"finer grain of control than turning physics interpolation on and off " +"globally.\n" +"[b]Note:[/b] This can be especially useful for [Camera]s, where custom " +"interpolation can sometimes give superior results." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"The node's priority in the execution order of the enabled processing " +"callbacks (i.e. [constant NOTIFICATION_PROCESS], [constant " +"NOTIFICATION_PHYSICS_PROCESS] and their internal counterparts). Nodes whose " +"process priority value is [i]lower[/i] will have their processing callbacks " +"executed first." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Sets this node's name as a unique name in its [member owner]. This allows " +"the node to be accessed as [code]%Name[/code] instead of the full path, from " +"any node within that scene.\n" +"If another node with the same owner already had that name declared as " +"unique, that other node's name will no longer be set as having a unique name." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Emitted when a child node enters the scene tree, either because it entered " +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." +msgstr "" + +#: doc/classes/Node.xml +msgid "Emitted when the node is ready." +msgstr "" + +#: doc/classes/Node.xml +msgid "Emitted when the node is renamed." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." +msgstr "" + +#: doc/classes/Node.xml +msgid "Emitted after the node exits the tree and is no longer active." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Emitted when the node is still active but about to exit the tree. This is " +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." +msgstr "" + +#: doc/classes/Node.xml +msgid "Notification received when the node is moved in the parent." +msgstr "" + +#: doc/classes/Node.xml +msgid "Notification received when the node is ready. See [method _ready]." +msgstr "" + +#: doc/classes/Node.xml +msgid "Notification received when the node is paused." +msgstr "" + +#: doc/classes/Node.xml +msgid "Notification received when the node is unpaused." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Notification received every frame when the physics process flag is set (see " +"[method set_physics_process])." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Notification received every frame when the process flag is set (see [method " +"set_process])." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Notification received when a node is set as a child of another node.\n" +"[b]Note:[/b] This doesn't mean that a node entered the [SceneTree]." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Notification received when a node is unparented (parent removed it from the " +"list of children)." +msgstr "" + +#: doc/classes/Node.xml +msgid "Notification received when the node is instanced." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Notification received when a drag operation begins. All nodes receive this " +"notification, not only the dragged one.\n" +"Can be triggered either by dragging a [Control] that provides drag data (see " +"[method Control.get_drag_data]) or using [method Control.force_drag].\n" +"Use [method Viewport.gui_get_drag_data] to get the dragged data." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Notification received when a drag operation ends.\n" +"Use [method Viewport.gui_is_drag_successful] to check if the drag succeeded." +msgstr "" + +#: doc/classes/Node.xml +msgid "Notification received when the node's [NodePath] changed." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Notification received every frame when the internal process flag is set (see " +"[method set_process_internal])." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Notification received every frame when the internal physics process flag is " +"set (see [method set_physics_process_internal])." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Notification received when the node is ready, just before [constant " +"NOTIFICATION_READY] is received. Unlike the latter, it's sent every time the " +"node enters tree, instead of only once." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Notification received when [method reset_physics_interpolation] is called on " +"the node or parent nodes." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Inherits pause mode from the node's parent. For the root node, it is " +"equivalent to [constant PAUSE_MODE_STOP]. Default." +msgstr "" + +#: doc/classes/Node.xml +msgid "Stops processing when the [SceneTree] is paused." +msgstr "" + +#: doc/classes/Node.xml +msgid "Continue to process regardless of the [SceneTree] pause state." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Inherits physics interpolation mode from the node's parent. For the root " +"node, it is equivalent to [constant PHYSICS_INTERPOLATION_MODE_ON]. Default." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Turn off physics interpolation in this node and children set to [constant " +"PHYSICS_INTERPOLATION_MODE_INHERIT]." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Turn on physics interpolation in this node and children set to [constant " +"PHYSICS_INTERPOLATION_MODE_INHERIT]." +msgstr "" + +#: doc/classes/Node.xml +msgid "Duplicate the node's signals." +msgstr "" + +#: doc/classes/Node.xml +msgid "Duplicate the node's groups." +msgstr "" + +#: doc/classes/Node.xml +msgid "Duplicate the node's scripts." +msgstr "" + +#: doc/classes/Node.xml +msgid "" +"Duplicate using instancing.\n" +"An instance stays linked to the original so when the original changes, the " +"instance changes too." +msgstr "" + +#: doc/classes/Node2D.xml +msgid "" +"A 2D game object, inherited by all 2D-related nodes. Has a position, " +"rotation, scale, and Z index." +msgstr "" + +#: doc/classes/Node2D.xml +msgid "" +"A 2D game object, with a transform (position, rotation, and scale). All 2D " +"nodes, including physics objects and sprites, inherit from Node2D. Use " +"Node2D as a parent node to move, scale and rotate children in a 2D project. " +"Also gives control of the node's render order." +msgstr "" + +#: doc/classes/Node2D.xml doc/classes/Vector2.xml +msgid "All 2D Demos" +msgstr "" + +#: doc/classes/Node2D.xml +msgid "Multiplies the current scale by the [code]ratio[/code] vector." +msgstr "" + +#: doc/classes/Node2D.xml +msgid "" +"Returns the angle between the node and the [code]point[/code] in radians.\n" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/" +"node2d_get_angle_to.png]Illustration of the returned angle.[/url]" +msgstr "" + +#: doc/classes/Node2D.xml +msgid "Returns the [Transform2D] relative to this node's parent." +msgstr "" + +#: doc/classes/Node2D.xml +msgid "Adds the [code]offset[/code] vector to the node's global position." +msgstr "" + +#: doc/classes/Node2D.xml +msgid "" +"Rotates the node so it points towards the [code]point[/code], which is " +"expected to use global coordinates." +msgstr "" + +#: doc/classes/Node2D.xml +msgid "" +"Applies a local translation on the node's X axis based on the [method Node." +"_process]'s [code]delta[/code]. If [code]scaled[/code] is [code]false[/" +"code], normalizes the movement." +msgstr "" + +#: doc/classes/Node2D.xml +msgid "" +"Applies a local translation on the node's Y axis based on the [method Node." +"_process]'s [code]delta[/code]. If [code]scaled[/code] is [code]false[/" +"code], normalizes the movement." +msgstr "" + +#: doc/classes/Node2D.xml +msgid "" +"Applies a rotation to the node, in radians, starting from its current " +"rotation." +msgstr "" + +#: doc/classes/Node2D.xml +msgid "" +"Transforms the provided local position into a position in global coordinate " +"space. The input is expected to be local relative to the [Node2D] it is " +"called on. e.g. Applying this method to the positions of child nodes will " +"correctly transform their positions into the global coordinate space, but " +"applying it to a node's own position will give an incorrect result, as it " +"will incorporate the node's own transformation into its global position." +msgstr "" + +#: doc/classes/Node2D.xml +msgid "" +"Transforms the provided global position into a position in local coordinate " +"space. The output will be local relative to the [Node2D] it is called on. e." +"g. It is appropriate for determining the positions of child nodes, but it is " +"not appropriate for determining its own position relative to its parent." +msgstr "" + +#: doc/classes/Node2D.xml +msgid "" +"Translates the node by the given [code]offset[/code] in local coordinates." +msgstr "" + +#: doc/classes/Node2D.xml +msgid "Global position." +msgstr "" + +#: doc/classes/Node2D.xml +msgid "Global rotation in radians." +msgstr "" + +#: doc/classes/Node2D.xml +msgid "Global rotation in degrees." +msgstr "" + +#: doc/classes/Node2D.xml +msgid "Global scale." +msgstr "" + +#: doc/classes/Node2D.xml +msgid "Global [Transform2D]." +msgstr "" + +#: doc/classes/Node2D.xml +msgid "Position, relative to the node's parent." +msgstr "" + +#: doc/classes/Node2D.xml +msgid "Rotation in radians, relative to the node's parent." +msgstr "" + +#: doc/classes/Node2D.xml +msgid "Rotation in degrees, relative to the node's parent." +msgstr "" + +#: doc/classes/Node2D.xml +msgid "" +"The node's scale. Unscaled value: [code](1, 1)[/code].\n" +"[b]Note:[/b] Negative X scales in 2D are not decomposable from the " +"transformation matrix. Due to the way scale is represented with " +"transformation matrices in Godot, negative scales on the X axis will be " +"changed to negative scales on the Y axis and a rotation of 180 degrees when " +"decomposed." +msgstr "" + +#: doc/classes/Node2D.xml +msgid "Local [Transform2D]." +msgstr "" + +#: doc/classes/Node2D.xml +msgid "" +"If [code]true[/code], the node's Z index is relative to its parent's Z " +"index. If this node's Z index is 2 and its parent's effective Z index is 3, " +"then this node's effective Z index will be 2 + 3 = 5." +msgstr "" + +#: doc/classes/Node2D.xml +msgid "" +"Z index. Controls the order in which the nodes render. A node with a higher " +"Z index will display in front of others. Must be between [constant " +"VisualServer.CANVAS_ITEM_Z_MIN] and [constant VisualServer." +"CANVAS_ITEM_Z_MAX] (inclusive)." +msgstr "" + +#: doc/classes/NodePath.xml +msgid "Pre-parsed scene tree path." +msgstr "" + +#: doc/classes/NodePath.xml +msgid "" +"A pre-parsed relative or absolute path in a scene tree, for use with [method " +"Node.get_node] and similar functions. It can reference a node, a resource " +"within a node, or a property of a node or resource. For instance, " +"[code]\"Path2D/PathFollow2D/Sprite:texture:size\"[/code] would refer to the " +"[code]size[/code] property of the [code]texture[/code] resource on the node " +"named [code]\"Sprite\"[/code] which is a child of the other named nodes in " +"the path.\n" +"You will usually just pass a string to [method Node.get_node] and it will be " +"automatically converted, but you may occasionally want to parse a path ahead " +"of time with [NodePath] or the literal syntax [code]@\"path\"[/code]. " +"Exporting a [NodePath] variable will give you a node selection widget in the " +"properties panel of the editor, which can often be useful.\n" +"A [NodePath] is composed of a list of slash-separated node names (like a " +"filesystem path) and an optional colon-separated list of \"subnames\" which " +"can be resources or properties.\n" +"Some examples of NodePaths include the following:\n" +"[codeblock]\n" +"# No leading slash means it is relative to the current node.\n" +"@\"A\" # Immediate child A\n" +"@\"A/B\" # A's child B\n" +"@\".\" # The current node.\n" +"@\"..\" # The parent node.\n" +"@\"../C\" # A sibling node C.\n" +"# A leading slash means it is absolute from the SceneTree.\n" +"@\"/root\" # Equivalent to get_tree().get_root().\n" +"@\"/root/Main\" # If your main scene's root node were named \"Main\".\n" +"@\"/root/MyAutoload\" # If you have an autoloaded node or scene.\n" +"[/codeblock]\n" +"[b]Note:[/b] In the editor, [NodePath] properties are automatically updated " +"when moving, renaming or deleting a node in the scene tree, but they are " +"never updated at runtime." +msgstr "" + +#: doc/classes/NodePath.xml doc/classes/PackedScene.xml doc/classes/Panel.xml +#: doc/classes/PanelContainer.xml doc/classes/TileMap.xml +#: doc/classes/TileSet.xml +msgid "2D Role Playing Game Demo" +msgstr "" + +#: doc/classes/NodePath.xml +msgid "" +"Creates a NodePath from a string, e.g. [code]\"Path2D/PathFollow2D/Sprite:" +"texture:size\"[/code]. A path is absolute if it starts with a slash. " +"Absolute paths are only valid in the global scene tree, not within " +"individual scenes. In a relative path, [code]\".\"[/code] and [code]\"..\"[/" +"code] indicate the current node and its parent.\n" +"The \"subnames\" optionally included after the path to the target node can " +"point to resources or properties, and can also be nested.\n" +"Examples of valid NodePaths (assuming that those nodes exist and have the " +"referenced resources or properties):\n" +"[codeblock]\n" +"# Points to the Sprite node\n" +"\"Path2D/PathFollow2D/Sprite\"\n" +"# Points to the Sprite node and its \"texture\" resource.\n" +"# get_node() would retrieve \"Sprite\", while get_node_and_resource()\n" +"# would retrieve both the Sprite node and the \"texture\" resource.\n" +"\"Path2D/PathFollow2D/Sprite:texture\"\n" +"# Points to the Sprite node and its \"position\" property.\n" +"\"Path2D/PathFollow2D/Sprite:position\"\n" +"# Points to the Sprite node and the \"x\" component of its \"position\" " +"property.\n" +"\"Path2D/PathFollow2D/Sprite:position:x\"\n" +"# Absolute path (from \"root\")\n" +"\"/root/Level/Path2D\"\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/NodePath.xml +msgid "" +"Returns a node path with a colon character ([code]:[/code]) prepended, " +"transforming it to a pure property path with no node name (defaults to " +"resolving from the current node).\n" +"[codeblock]\n" +"# This will be parsed as a node path to the \"x\" property in the " +"\"position\" node\n" +"var node_path = NodePath(\"position:x\")\n" +"# This will be parsed as a node path to the \"x\" component of the " +"\"position\" property in the current node\n" +"var property_path = node_path.get_as_property_path()\n" +"print(property_path) # :position:x\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/NodePath.xml +msgid "" +"Returns all subnames concatenated with a colon character ([code]:[/code]) as " +"separator, i.e. the right side of the first colon in a node path.\n" +"[codeblock]\n" +"var nodepath = NodePath(\"Path2D/PathFollow2D/Sprite:texture:load_path\")\n" +"print(nodepath.get_concatenated_subnames()) # texture:load_path\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/NodePath.xml +msgid "" +"Gets the node name indicated by [code]idx[/code] (0 to [method " +"get_name_count] - 1).\n" +"[codeblock]\n" +"var node_path = NodePath(\"Path2D/PathFollow2D/Sprite\")\n" +"print(node_path.get_name(0)) # Path2D\n" +"print(node_path.get_name(1)) # PathFollow2D\n" +"print(node_path.get_name(2)) # Sprite\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/NodePath.xml +msgid "" +"Gets the number of node names which make up the path. Subnames (see [method " +"get_subname_count]) are not included.\n" +"For example, [code]\"Path2D/PathFollow2D/Sprite\"[/code] has 3 names." +msgstr "" + +#: doc/classes/NodePath.xml +msgid "" +"Gets the resource or property name indicated by [code]idx[/code] (0 to " +"[method get_subname_count]).\n" +"[codeblock]\n" +"var node_path = NodePath(\"Path2D/PathFollow2D/Sprite:texture:load_path\")\n" +"print(node_path.get_subname(0)) # texture\n" +"print(node_path.get_subname(1)) # load_path\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/NodePath.xml +msgid "" +"Gets the number of resource or property names (\"subnames\") in the path. " +"Each subname is listed after a colon character ([code]:[/code]) in the node " +"path.\n" +"For example, [code]\"Path2D/PathFollow2D/Sprite:texture:load_path\"[/code] " +"has 2 subnames." +msgstr "" + +#: doc/classes/NodePath.xml +msgid "" +"Returns [code]true[/code] if the node path is absolute (as opposed to " +"relative), which means that it starts with a slash character ([code]/[/" +"code]). Absolute node paths can be used to access the root node ([code]\"/" +"root\"[/code]) or autoloads (e.g. [code]\"/global\"[/code] if a \"global\" " +"autoload was registered)." +msgstr "" + +#: doc/classes/NodePath.xml +msgid "Returns [code]true[/code] if the node path is empty." +msgstr "" + +#: modules/opensimplex/doc_classes/NoiseTexture.xml +msgid "[OpenSimplexNoise] filled texture." +msgstr "" + +#: modules/opensimplex/doc_classes/NoiseTexture.xml +msgid "" +"Uses an [OpenSimplexNoise] to fill the texture data. You can specify the " +"texture size but keep in mind that larger textures will take longer to " +"generate and seamless noise only works with square sized textures.\n" +"NoiseTexture can also generate normalmap textures.\n" +"The class uses [Thread]s to generate the texture data internally, so [method " +"Texture.get_data] may return [code]null[/code] if the generation process has " +"not completed yet. In that case, you need to wait for the texture to be " +"generated before accessing the data:\n" +"[codeblock]\n" +"var texture = preload(\"res://noise.tres\")\n" +"yield(texture, \"changed\")\n" +"var image = texture.get_data()\n" +"[/codeblock]" +msgstr "" + +#: modules/opensimplex/doc_classes/NoiseTexture.xml +msgid "" +"If [code]true[/code], the resulting texture contains a normal map created " +"from the original noise interpreted as a bump map." +msgstr "" + +#: modules/opensimplex/doc_classes/NoiseTexture.xml +msgid "" +"Strength of the bump maps used in this texture. A higher value will make the " +"bump maps appear larger while a lower value will make them appear softer." +msgstr "" + +#: modules/opensimplex/doc_classes/NoiseTexture.xml +msgid "Height of the generated texture." +msgstr "" + +#: modules/opensimplex/doc_classes/NoiseTexture.xml +msgid "The [OpenSimplexNoise] instance used to generate the noise." +msgstr "" + +#: modules/opensimplex/doc_classes/NoiseTexture.xml +msgid "" +"An offset used to specify the noise space coordinate of the top left corner " +"of the generated noise. This value is ignored if [member seamless] is " +"enabled." +msgstr "" + +#: modules/opensimplex/doc_classes/NoiseTexture.xml +msgid "" +"Whether the texture can be tiled without visible seams or not. Seamless " +"textures take longer to generate.\n" +"[b]Note:[/b] Seamless noise has a lower contrast compared to non-seamless " +"noise. This is due to the way noise uses higher dimensions for generating " +"seamless noise." +msgstr "" + +#: modules/opensimplex/doc_classes/NoiseTexture.xml +msgid "Width of the generated texture." +msgstr "" + +#: doc/classes/Object.xml +msgid "Base class for all non-built-in types." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Every class which is not a built-in type inherits from this class.\n" +"You can construct Objects from scripting languages, using [code]Object.new()" +"[/code] in GDScript, [code]new Object[/code] in C#, or the \"Construct " +"Object\" node in VisualScript.\n" +"Objects do not manage memory. If a class inherits from Object, you will have " +"to delete instances of it manually. To do so, call the [method free] method " +"from your script or delete the instance from C++.\n" +"Some classes that extend Object add memory management. This is the case of " +"[Reference], which counts references and deletes itself automatically when " +"no longer referenced. [Node], another fundamental type, deletes all its " +"children when freed from memory.\n" +"Objects export properties, which are mainly useful for storage and editing, " +"but not really so much in programming. Properties are exported in [method " +"_get_property_list] and handled in [method _get] and [method _set]. However, " +"scripting languages and C++ have simpler means to export them.\n" +"Property membership can be tested directly in GDScript using [code]in[/" +"code]:\n" +"[codeblock]\n" +"var n = Node2D.new()\n" +"print(\"position\" in n) # Prints \"True\".\n" +"print(\"other_property\" in n) # Prints \"False\".\n" +"[/codeblock]\n" +"The [code]in[/code] operator will evaluate to [code]true[/code] as long as " +"the key exists, even if the value is [code]null[/code].\n" +"Objects also receive notifications. Notifications are a simple way to notify " +"the object about different events, so they can all be handled together. See " +"[method _notification].\n" +"[b]Note:[/b] Unlike references to a [Reference], references to an Object " +"stored in a variable can become invalid without warning. Therefore, it's " +"recommended to use [Reference] for data classes instead of [Object].\n" +"[b]Note:[/b] Due to a bug, you can't create a \"plain\" Object using " +"[code]Object.new()[/code]. Instead, use [code]ClassDB.instance(\"Object\")[/" +"code]. This bug only applies to Object itself, not any of its descendents " +"like [Reference]." +msgstr "" + +#: doc/classes/Object.xml doc/classes/Reference.xml doc/classes/Resource.xml +msgid "When and how to avoid using nodes for everything" +msgstr "" + +#: doc/classes/Object.xml +msgid "Advanced exports using _get_property_list()" +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Virtual method which can be overridden to customize the return value of " +"[method get].\n" +"Returns the given property. Returns [code]null[/code] if the [code]property[/" +"code] does not exist." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Virtual method which can be overridden to customize the return value of " +"[method get_property_list].\n" +"Returns the object's property list as an [Array] of dictionaries.\n" +"Each property's [Dictionary] must contain at least [code]name: String[/code] " +"and [code]type: int[/code] (see [enum Variant.Type]) entries. Optionally, it " +"can also include [code]hint: int[/code] (see [enum PropertyHint]), " +"[code]hint_string: String[/code], and [code]usage: int[/code] (see [enum " +"PropertyUsageFlags])." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Called when the object is initialized in memory. Can be defined to take in " +"parameters, that are passed in when constructing.\n" +"[b]Note:[/b] If [method _init] is defined with required parameters, then " +"explicit construction is the only valid means of creating an Object of the " +"class. If any other means (such as [method PackedScene.instance]) is used, " +"then initialization will fail." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Called whenever the object receives a notification, which is identified in " +"[code]what[/code] by a constant. The base [Object] has two constants " +"[constant NOTIFICATION_POSTINITIALIZE] and [constant " +"NOTIFICATION_PREDELETE], but subclasses such as [Node] define a lot more " +"notifications which are also received by this method." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Virtual method which can be overridden to customize the return value of " +"[method set].\n" +"Sets a property. Returns [code]true[/code] if the [code]property[/code] " +"exists." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Virtual method which can be overridden to customize the return value of " +"[method to_string], and thus the object's representation where it is " +"converted to a string, e.g. with [code]print(obj)[/code].\n" +"Returns a [String] representing the object. If not overridden, defaults to " +"[code]\"[ClassName:RID]\"[/code]." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Adds a user-defined [code]signal[/code]. Arguments are optional, but can be " +"added as an [Array] of dictionaries, each containing [code]name: String[/" +"code] and [code]type: int[/code] (see [enum Variant.Type]) entries." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Calls the [code]method[/code] on the object and returns the result. This " +"method supports a variable number of arguments, so parameters are passed as " +"a comma separated list. Example:\n" +"[codeblock]\n" +"call(\"set\", \"position\", Vector2(42.0, 0.0))\n" +"[/codeblock]\n" +"[b]Note:[/b] In C#, the method name must be specified as snake_case if it is " +"defined by a built-in Godot node. This doesn't apply to user-defined methods " +"where you should use the same convention as in the C# source (typically " +"PascalCase)." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Calls the [code]method[/code] on the object during idle time. This method " +"supports a variable number of arguments, so parameters are passed as a comma " +"separated list. Example:\n" +"[codeblock]\n" +"call_deferred(\"set\", \"position\", Vector2(42.0, 0.0))\n" +"[/codeblock]\n" +"[b]Note:[/b] In C#, the method name must be specified as snake_case if it is " +"defined by a built-in Godot node. This doesn't apply to user-defined methods " +"where you should use the same convention as in the C# source (typically " +"PascalCase)." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Calls the [code]method[/code] on the object and returns the result. " +"Contrarily to [method call], this method does not support a variable number " +"of arguments but expects all parameters to be via a single [Array].\n" +"[codeblock]\n" +"callv(\"set\", [ \"position\", Vector2(42.0, 0.0) ])\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Returns [code]true[/code] if the object can translate strings. See [method " +"set_message_translation] and [method tr]." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Connects a [code]signal[/code] to a [code]method[/code] on a [code]target[/" +"code] object. Pass optional [code]binds[/code] to the call as an [Array] of " +"parameters. These parameters will be passed to the method after any " +"parameter used in the call to [method emit_signal]. Use [code]flags[/code] " +"to set deferred or one-shot connections. See [enum ConnectFlags] constants.\n" +"A [code]signal[/code] can only be connected once to a [code]method[/code]. " +"It will print an error if already connected, unless the signal was connected " +"with [constant CONNECT_REFERENCE_COUNTED]. To avoid this, first, use [method " +"is_connected] to check for existing connections.\n" +"If the [code]target[/code] is destroyed in the game's lifecycle, the " +"connection will be lost.\n" +"Examples:\n" +"[codeblock]\n" +"connect(\"pressed\", self, \"_on_Button_pressed\") # BaseButton signal\n" +"connect(\"text_entered\", self, \"_on_LineEdit_text_entered\") # LineEdit " +"signal\n" +"connect(\"hit\", self, \"_on_Player_hit\", [ weapon_type, damage ]) # User-" +"defined signal\n" +"[/codeblock]\n" +"An example of the relationship between [code]binds[/code] passed to [method " +"connect] and parameters used when calling [method emit_signal]:\n" +"[codeblock]\n" +"connect(\"hit\", self, \"_on_Player_hit\", [ weapon_type, damage ]) # " +"weapon_type and damage are passed last\n" +"emit_signal(\"hit\", \"Dark lord\", 5) # \"Dark lord\" and 5 are passed " +"first\n" +"func _on_Player_hit(hit_by, level, weapon_type, damage):\n" +" print(\"Hit by %s (lvl %d) with weapon %s for %d damage\" % [hit_by, " +"level, weapon_type, damage])\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Disconnects a [code]signal[/code] from a [code]method[/code] on the given " +"[code]target[/code].\n" +"If you try to disconnect a connection that does not exist, the method will " +"print an error. Use [method is_connected] to ensure that the connection " +"exists." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Emits the given [code]signal[/code]. The signal must exist, so it should be " +"a built-in signal of this class or one of its parent classes, or a user-" +"defined signal. This method supports a variable number of arguments, so " +"parameters are passed as a comma separated list. Example:\n" +"[codeblock]\n" +"emit_signal(\"hit\", weapon_type, damage)\n" +"emit_signal(\"game_over\")\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Deletes the object from memory immediately. For [Node]s, you may want to use " +"[method Node.queue_free] to queue the node for safe deletion at the end of " +"the current frame.\n" +"[b]Important:[/b] If you have a variable pointing to an object, it will " +"[i]not[/i] be assigned to [code]null[/code] once the object is freed. " +"Instead, it will point to a [i]previously freed instance[/i] and you should " +"validate it with [method @GDScript.is_instance_valid] before attempting to " +"call its methods or access its properties." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Returns the [Variant] value of the given [code]property[/code]. If the " +"[code]property[/code] doesn't exist, this will return [code]null[/code].\n" +"[b]Note:[/b] In C#, the property name must be specified as snake_case if it " +"is defined by a built-in Godot node. This doesn't apply to user-defined " +"properties where you should use the same convention as in the C# source " +"(typically PascalCase)." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Returns the object's class as a [String]. See also [method is_class].\n" +"[b]Note:[/b] [method get_class] does not take [code]class_name[/code] " +"declarations into account. If the object has a [code]class_name[/code] " +"defined, the base class name will be returned instead." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Returns an [Array] of dictionaries with information about signals that are " +"connected to the object.\n" +"Each [Dictionary] contains three String entries:\n" +"- [code]source[/code] is a reference to the signal emitter.\n" +"- [code]signal_name[/code] is the name of the connected signal.\n" +"- [code]method_name[/code] is the name of the method to which the signal is " +"connected." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Gets the object's property indexed by the given [NodePath]. The node path " +"should be relative to the current object and can use the colon character " +"([code]:[/code]) to access nested properties. Examples: [code]\"position:" +"x\"[/code] or [code]\"material:next_pass:blend_mode\"[/code].\n" +"[b]Note:[/b] Even though the method takes [NodePath] argument, it doesn't " +"support actual paths to [Node]s in the scene tree, only colon-separated sub-" +"property paths. For the purpose of nodes, use [method Node." +"get_node_and_resource] instead." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Returns the object's unique instance ID.\n" +"This ID can be saved in [EncodedObjectAsID], and can be used to retrieve the " +"object instance with [method @GDScript.instance_from_id]." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Returns the object's metadata entry for the given [code]name[/code].\n" +"Throws error if the entry does not exist, unless [code]default[/code] is not " +"[code]null[/code] (in which case the default value will be returned)." +msgstr "" + +#: doc/classes/Object.xml +msgid "Returns the object's metadata as a [PoolStringArray]." +msgstr "" + +#: doc/classes/Object.xml +msgid "Returns the object's methods and their signatures as an [Array]." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Returns the object's property list as an [Array] of dictionaries.\n" +"Each property's [Dictionary] contain at least [code]name: String[/code] and " +"[code]type: int[/code] (see [enum Variant.Type]) entries. Optionally, it can " +"also include [code]hint: int[/code] (see [enum PropertyHint]), " +"[code]hint_string: String[/code], and [code]usage: int[/code] (see [enum " +"PropertyUsageFlags])." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Returns the object's [Script] instance, or [code]null[/code] if none is " +"assigned." +msgstr "" + +#: doc/classes/Object.xml +msgid "Returns an [Array] of connections for the given [code]signal[/code]." +msgstr "" + +#: doc/classes/Object.xml +msgid "Returns the list of signals as an [Array] of dictionaries." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Returns [code]true[/code] if a metadata entry is found with the given " +"[code]name[/code]." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Returns [code]true[/code] if the object contains the given [code]method[/" +"code]." +msgstr "" + +#: doc/classes/Object.xml +msgid "Returns [code]true[/code] if the given [code]signal[/code] exists." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Returns [code]true[/code] if the given user-defined [code]signal[/code] " +"exists. Only signals added using [method add_user_signal] are taken into " +"account." +msgstr "" + +#: doc/classes/Object.xml +msgid "Returns [code]true[/code] if signal emission blocking is enabled." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Returns [code]true[/code] if the object inherits from the given [code]class[/" +"code]. See also [method get_class].\n" +"[b]Note:[/b] [method is_class] does not take [code]class_name[/code] " +"declarations into account. If the object has a [code]class_name[/code] " +"defined, [method is_class] will return [code]false[/code] for that name." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Returns [code]true[/code] if a connection exists for a given [code]signal[/" +"code], [code]target[/code], and [code]method[/code]." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Returns [code]true[/code] if the [method Node.queue_free] method was called " +"for the object." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Send a given notification to the object, which will also trigger a call to " +"the [method _notification] method of all classes that the object inherits " +"from.\n" +"If [code]reversed[/code] is [code]true[/code], [method _notification] is " +"called first on the object's own class, and then up to its successive parent " +"classes. If [code]reversed[/code] is [code]false[/code], [method " +"_notification] is called first on the highest ancestor ([Object] itself), " +"and then down to its successive inheriting classes." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Notify the editor that the property list has changed, so that editor plugins " +"can take the new values into account. Does nothing on export builds." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Removes a given entry from the object's metadata. See also [method set_meta]." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Assigns a new value to the given property. If the [code]property[/code] does " +"not exist or the given value's type doesn't match, nothing will happen.\n" +"[b]Note:[/b] In C#, the property name must be specified as snake_case if it " +"is defined by a built-in Godot node. This doesn't apply to user-defined " +"properties where you should use the same convention as in the C# source " +"(typically PascalCase)." +msgstr "" + +#: doc/classes/Object.xml +msgid "If set to [code]true[/code], signal emission is blocked." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Assigns a new value to the given property, after the current frame's physics " +"step. This is equivalent to calling [method set] via [method call_deferred], " +"i.e. [code]call_deferred(\"set\", property, value)[/code].\n" +"[b]Note:[/b] In C#, the property name must be specified as snake_case if it " +"is defined by a built-in Godot node. This doesn't apply to user-defined " +"properties where you should use the same convention as in the C# source " +"(typically PascalCase)." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Assigns a new value to the property identified by the [NodePath]. The node " +"path should be relative to the current object and can use the colon " +"character ([code]:[/code]) to access nested properties. Example:\n" +"[codeblock]\n" +"set_indexed(\"position\", Vector2(42, 0))\n" +"set_indexed(\"position:y\", -10)\n" +"print(position) # (42, -10)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Defines whether the object can translate strings (with calls to [method " +"tr]). Enabled by default." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Adds, changes or removes a given entry in the object's metadata. Metadata " +"are serialized and can take any [Variant] value.\n" +"To remove a given entry from the object's metadata, use [method " +"remove_meta]. Metadata is also removed if its value is set to [code]null[/" +"code]. This means you can also use [code]set_meta(\"name\", null)[/code] to " +"remove metadata for [code]\"name\"[/code]." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Assigns a script to the object. Each object can have a single script " +"assigned to it, which are used to extend its functionality.\n" +"If the object already had a script, the previous script instance will be " +"freed and its variables and state will be lost. The new script's [method " +"_init] method will be called." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Returns a [String] representing the object. If not overridden, defaults to " +"[code]\"[ClassName:RID]\"[/code].\n" +"Override the method [method _to_string] to customize the [String] " +"representation." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Translates a message using translation catalogs configured in the Project " +"Settings.\n" +"Only works if message translation is enabled (which it is by default), " +"otherwise it returns the [code]message[/code] unchanged. See [method " +"set_message_translation]." +msgstr "" + +#: doc/classes/Object.xml +msgid "Emitted whenever the object's script is changed." +msgstr "" + +#: doc/classes/Object.xml +msgid "Called right when the object is initialized. Not available in script." +msgstr "" + +#: doc/classes/Object.xml +msgid "Called before the object is about to be deleted." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Connects a signal in deferred mode. This way, signal emissions are stored in " +"a queue, then set on idle time." +msgstr "" + +#: doc/classes/Object.xml +msgid "Persisting connections are saved when the object is serialized to file." +msgstr "" + +#: doc/classes/Object.xml +msgid "One-shot connections disconnect themselves after emission." +msgstr "" + +#: doc/classes/Object.xml +msgid "" +"Connect a signal as reference-counted. This means that a given signal can be " +"connected several times to the same target, and will only be fully " +"disconnected once no references are left." +msgstr "" + +#: doc/classes/Occluder.xml +msgid "Allows [OccluderShape]s to be used for occlusion culling." +msgstr "" + +#: doc/classes/Occluder.xml +msgid "" +"[Occluder]s that are placed within your scene will automatically cull " +"objects that are hidden from view by the occluder. This can increase " +"performance by decreasing the amount of objects drawn.\n" +"[Occluder]s are totally dynamic, you can move them as you wish. This means " +"you can for example, place occluders on a moving spaceship, and have it " +"occlude objects as it flies past.\n" +"You can place a large number of [Occluder]s within a scene. As it would be " +"counterproductive to cull against hundreds of occluders, the system will " +"automatically choose a selection of these for active use during any given " +"frame, based a screen space metric. Larger occluders are favored, as well as " +"those close to the camera. Note that a small occluder close to the camera " +"may be a better occluder in terms of screen space than a large occluder far " +"in the distance.\n" +"The type of occlusion primitive is determined by the [OccluderShape] that " +"you add to the [Occluder]. Some [OccluderShape]s may allow more than one " +"primitive in a single, node, for greater efficiency.\n" +"Although [Occluder]s work in general use, they also become even more " +"powerful when used in conjunction with the portal system. Occluders are " +"placed in rooms (based on their origin), and can block portals (and thus " +"entire rooms) as well as objects from rendering." +msgstr "" + +#: doc/classes/OccluderPolygon2D.xml +msgid "Defines a 2D polygon for LightOccluder2D." +msgstr "" + +#: doc/classes/OccluderPolygon2D.xml +msgid "" +"Editor facility that helps you draw a 2D polygon used as resource for " +"[LightOccluder2D]." +msgstr "" + +#: doc/classes/OccluderPolygon2D.xml +msgid "" +"If [code]true[/code], closes the polygon. A closed OccluderPolygon2D " +"occludes the light coming from any direction. An opened OccluderPolygon2D " +"occludes the light only at its outline's direction." +msgstr "" + +#: doc/classes/OccluderPolygon2D.xml +msgid "The culling mode to use." +msgstr "" + +#: doc/classes/OccluderPolygon2D.xml +msgid "" +"A [Vector2] array with the index for polygon's vertices positions.\n" +"[b]Note:[/b] The returned value is a copy of the underlying array, rather " +"than a reference." +msgstr "" + +#: doc/classes/OccluderPolygon2D.xml +msgid "Culling is disabled. See [member cull_mode]." +msgstr "" + +#: doc/classes/OccluderPolygon2D.xml +msgid "" +"Culling is performed in the clockwise direction. See [member cull_mode]." +msgstr "" + +#: doc/classes/OccluderPolygon2D.xml +msgid "" +"Culling is performed in the counterclockwise direction. See [member " +"cull_mode]." +msgstr "" + +#: doc/classes/OccluderShape.xml +msgid "" +"Base class for shapes used for occlusion culling by the [Occluder] node." +msgstr "" + +#: doc/classes/OccluderShape.xml +msgid "[Occluder]s can use any primitive shape derived from [OccluderShape]." +msgstr "" + +#: doc/classes/OccluderShapePolygon.xml +msgid "Polygon occlusion primitive for use with the [Occluder] node." +msgstr "" + +#: doc/classes/OccluderShapePolygon.xml +msgid "" +"[OccluderShape]s are resources used by [Occluder] nodes, allowing geometric " +"occlusion culling.\n" +"The polygon must be a convex polygon. The polygon points can be created and " +"deleted either in the Editor inspector or by calling " +"[code]set_polygon_points[/code]. The points of the edges can be set by " +"dragging the handles in the Editor viewport.\n" +"Additionally each polygon occluder can optionally support a single hole. If " +"you add at least three points in the Editor inspector to the hole, you can " +"drag the edge points of the hole in the Editor viewport.\n" +"In general, the lower the number of edges in polygons and holes, the faster " +"the system will operate at runtime, so in most cases you will want to use 4 " +"points for each." +msgstr "" + +#: doc/classes/OccluderShapePolygon.xml +msgid "Sets an individual hole point position." +msgstr "" + +#: doc/classes/OccluderShapePolygon.xml +msgid "Sets an individual polygon point position." +msgstr "" + +#: doc/classes/OccluderShapePolygon.xml +msgid "Allows changing the hole geometry from code." +msgstr "" + +#: doc/classes/OccluderShapePolygon.xml +msgid "Allows changing the polygon geometry from code." +msgstr "" + +#: doc/classes/OccluderShapePolygon.xml +msgid "" +"Specifies whether the occluder should operate from both sides. If " +"[code]false[/code], the occluder will operate one way only." +msgstr "" + +#: doc/classes/OccluderShapeSphere.xml +msgid "Spherical occlusion primitive for use with the [Occluder] node." +msgstr "" + +#: doc/classes/OccluderShapeSphere.xml +msgid "" +"[OccluderShape]s are resources used by [Occluder] nodes, allowing geometric " +"occlusion culling.\n" +"This shape can include multiple spheres. These can be created and deleted " +"either in the Editor inspector or by calling [code]set_spheres[/code]. The " +"sphere positions can be set by dragging the handle in the Editor viewport. " +"The radius can be set with the smaller handle." +msgstr "" + +#: doc/classes/OccluderShapeSphere.xml +msgid "Sets an individual sphere's position." +msgstr "" + +#: doc/classes/OccluderShapeSphere.xml +msgid "Sets an individual sphere's radius." +msgstr "" + +#: doc/classes/OccluderShapeSphere.xml +msgid "" +"The sphere data can be accessed as an array of [Plane]s. The position of " +"each sphere is stored in the [code]normal[/code], and the radius is stored " +"in the [code]d[/code] value of the plane." +msgstr "" + +#: doc/classes/OmniLight.xml +msgid "Omnidirectional light, such as a light bulb or a candle." +msgstr "" + +#: doc/classes/OmniLight.xml +msgid "" +"An Omnidirectional light is a type of [Light] that emits light in all " +"directions. The light is attenuated by distance and this attenuation can be " +"configured by changing its energy, radius, and attenuation parameters.\n" +"[b]Note:[/b] By default, only 32 OmniLights may affect a single mesh " +"[i]resource[/i] at once. Consider splitting your level into several meshes " +"to decrease the likelihood that more than 32 lights will affect the same " +"mesh resource. Splitting the level mesh will also improve frustum culling " +"effectiveness, leading to greater performance. If you need to use more " +"lights per mesh, you can increase [member ProjectSettings.rendering/limits/" +"rendering/max_lights_per_object] at the cost of shader compilation times." +msgstr "" + +#: doc/classes/OmniLight.xml +msgid "" +"The light's attenuation (drop-off) curve. A number of presets are available " +"in the [b]Inspector[/b] by right-clicking the curve." +msgstr "" + +#: doc/classes/OmniLight.xml +msgid "" +"The light's radius. Note that the effectively lit area may appear to be " +"smaller depending on the [member omni_attenuation] in use. No matter the " +"[member omni_attenuation] in use, the light will never reach anything " +"outside this radius." +msgstr "" + +#: doc/classes/OmniLight.xml +msgid "See [enum ShadowDetail]." +msgstr "" + +#: doc/classes/OmniLight.xml +msgid "" +"The shadow rendering mode to use for this [OmniLight]. See [enum " +"ShadowMode].\n" +"[b]Note:[/b] In GLES2, [constant SHADOW_CUBE] is only supported on GPUs that " +"feature support for depth cubemaps. Old GPUs such as the Radeon HD 4000 " +"series don't support cubemap shadows and will fall back to dual paraboloid " +"shadows as a result." +msgstr "" + +#: doc/classes/OmniLight.xml +msgid "" +"Shadows are rendered to a dual-paraboloid texture. Faster than [constant " +"SHADOW_CUBE], but lower-quality." +msgstr "" + +#: doc/classes/OmniLight.xml +msgid "" +"Shadows are rendered to a cubemap. Slower than [constant " +"SHADOW_DUAL_PARABOLOID], but higher-quality. Only supported on GPUs that " +"feature support for depth cubemaps." +msgstr "" + +#: doc/classes/OmniLight.xml +msgid "Use more detail vertically when computing the shadow." +msgstr "" + +#: doc/classes/OmniLight.xml +msgid "Use more detail horizontally when computing the shadow." +msgstr "" + +#: modules/opensimplex/doc_classes/OpenSimplexNoise.xml +msgid "Noise generator based on Open Simplex." +msgstr "" + +#: modules/opensimplex/doc_classes/OpenSimplexNoise.xml +msgid "" +"This resource allows you to configure and sample a fractal noise space. Here " +"is a brief usage example that configures an OpenSimplexNoise and gets " +"samples at various positions and dimensions:\n" +"[codeblock]\n" +"var noise = OpenSimplexNoise.new()\n" +"\n" +"# Configure\n" +"noise.seed = randi()\n" +"noise.octaves = 4\n" +"noise.period = 20.0\n" +"noise.persistence = 0.8\n" +"\n" +"# Sample\n" +"print(\"Values:\")\n" +"print(noise.get_noise_2d(1.0, 1.0))\n" +"print(noise.get_noise_3d(0.5, 3.0, 15.0))\n" +"print(noise.get_noise_4d(0.5, 1.9, 4.7, 0.0))\n" +"[/codeblock]" +msgstr "" + +#: modules/opensimplex/doc_classes/OpenSimplexNoise.xml +msgid "" +"Generate a noise image in [constant Image.FORMAT_L8] format with the " +"requested [code]width[/code] and [code]height[/code], based on the current " +"noise parameters. If [code]noise_offset[/code] is specified, then the offset " +"value is used as the coordinates of the top-left corner of the generated " +"noise." +msgstr "" + +#: modules/opensimplex/doc_classes/OpenSimplexNoise.xml +msgid "" +"Returns the 1D noise value [code][-1,1][/code] at the given x-coordinate.\n" +"[b]Note:[/b] This method actually returns the 2D noise value [code][-1,1][/" +"code] with fixed y-coordinate value 0.0." +msgstr "" + +#: modules/opensimplex/doc_classes/OpenSimplexNoise.xml +msgid "Returns the 2D noise value [code][-1,1][/code] at the given position." +msgstr "" + +#: modules/opensimplex/doc_classes/OpenSimplexNoise.xml +msgid "Returns the 3D noise value [code][-1,1][/code] at the given position." +msgstr "" + +#: modules/opensimplex/doc_classes/OpenSimplexNoise.xml +msgid "Returns the 4D noise value [code][-1,1][/code] at the given position." +msgstr "" + +#: modules/opensimplex/doc_classes/OpenSimplexNoise.xml +msgid "" +"Generate a tileable noise image in [constant Image.FORMAT_L8] format, based " +"on the current noise parameters. Generated seamless images are always square " +"([code]size[/code] × [code]size[/code]).\n" +"[b]Note:[/b] Seamless noise has a lower contrast compared to non-seamless " +"noise. This is due to the way noise uses higher dimensions for generating " +"seamless noise." +msgstr "" + +#: modules/opensimplex/doc_classes/OpenSimplexNoise.xml +msgid "Difference in period between [member octaves]." +msgstr "" + +#: modules/opensimplex/doc_classes/OpenSimplexNoise.xml +msgid "" +"Number of OpenSimplex noise layers that are sampled to get the fractal " +"noise. Higher values result in more detailed noise but take more time to " +"generate.\n" +"[b]Note:[/b] The maximum allowed value is 9." +msgstr "" + +#: modules/opensimplex/doc_classes/OpenSimplexNoise.xml +msgid "" +"Period of the base octave. A lower period results in a higher-frequency " +"noise (more value changes across the same distance)." +msgstr "" + +#: modules/opensimplex/doc_classes/OpenSimplexNoise.xml +msgid "" +"Contribution factor of the different octaves. A [code]persistence[/code] " +"value of 1 means all the octaves have the same contribution, a value of 0.5 " +"means each octave contributes half as much as the previous one." +msgstr "" + +#: modules/opensimplex/doc_classes/OpenSimplexNoise.xml +msgid "" +"Seed used to generate random values, different seeds will generate different " +"noise maps." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "Button control that provides selectable options when pressed." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "" +"OptionButton is a type button that provides a selectable list of items when " +"pressed. The item selected becomes the \"current\" item and is displayed as " +"the button text.\n" +"See also [BaseButton] which contains common properties and methods " +"associated with this node." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "" +"Adds an item, with a [code]texture[/code] icon, text [code]label[/code] and " +"(optionally) [code]id[/code]. If no [code]id[/code] is passed, the item " +"index will be used as the item's ID. New items are appended at the end." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "" +"Adds an item, with text [code]label[/code] and (optionally) [code]id[/code]. " +"If no [code]id[/code] is passed, the item index will be used as the item's " +"ID. New items are appended at the end." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "" +"Adds a separator to the list of items. Separators help to group items. " +"Separator also takes up an index and is appended at the end." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "Clears all the items in the [OptionButton]." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "Returns the amount of items in the OptionButton, including separators." +msgstr "" + +#: doc/classes/OptionButton.xml doc/classes/PopupMenu.xml +msgid "Returns the icon of the item at index [code]idx[/code]." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "Returns the ID of the item at index [code]idx[/code]." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "Returns the index of the item with the given [code]id[/code]." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "" +"Retrieves the metadata of an item. Metadata may be any type and can be used " +"to store extra information about an item, such as an external string ID." +msgstr "" + +#: doc/classes/OptionButton.xml doc/classes/PopupMenu.xml +msgid "Returns the text of the item at index [code]idx[/code]." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "Returns the tooltip of the item at index [code]idx[/code]." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "" +"Returns the ID of the selected item, or [code]-1[/code] if no item is " +"selected." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "" +"Gets the metadata of the selected item. Metadata for items can be set using " +"[method set_item_metadata]." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "" +"Returns [code]true[/code] if the item at index [code]idx[/code] is disabled." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "Removes the item at index [code]idx[/code]." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "" +"Selects an item by index and makes it the current item. This will work even " +"if the item is disabled.\n" +"Passing [code]-1[/code] as the index deselects any currently selected item." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "" +"Sets whether the item at index [code]idx[/code] is disabled.\n" +"Disabled items are drawn differently in the dropdown and are not selectable " +"by the user. If the current selected item is set as disabled, it will remain " +"selected." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "Sets the icon of the item at index [code]idx[/code]." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "Sets the ID of the item at index [code]idx[/code]." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "" +"Sets the metadata of an item. Metadata may be of any type and can be used to " +"store extra information about an item, such as an external string ID." +msgstr "" + +#: doc/classes/OptionButton.xml doc/classes/PopupMenu.xml +msgid "Sets the text of the item at index [code]idx[/code]." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "Sets the tooltip of the item at index [code]idx[/code]." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "" +"The index of the currently selected item, or [code]-1[/code] if no item is " +"selected." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "" +"Emitted when the user navigates to an item using the [code]ui_up[/code] or " +"[code]ui_down[/code] actions. The index of the item selected is passed as " +"argument." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "" +"Emitted when the current item has been changed by the user. The index of the " +"item selected is passed as argument." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "Default text [Color] of the [OptionButton]." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "Text [Color] used when the [OptionButton] is disabled." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "" +"Text [Color] used when the [OptionButton] is focused. Only replaces the " +"normal text color of the button. Disabled, hovered, and pressed states take " +"precedence over this color." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "Text [Color] used when the [OptionButton] is being hovered." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "Text [Color] used when the [OptionButton] is being pressed." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "" +"The horizontal space between the arrow icon and the right edge of the button." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "The horizontal space between [OptionButton]'s icon and text." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "[Font] of the [OptionButton]'s text." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "The arrow icon to be drawn on the right end of the button." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "[StyleBox] used when the [OptionButton] is disabled." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "" +"[StyleBox] used when the [OptionButton] is focused. It is displayed over the " +"current [StyleBox], so using [StyleBoxEmpty] will just disable the focus " +"visual effect." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "[StyleBox] used when the [OptionButton] is being hovered." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "Default [StyleBox] for the [OptionButton]." +msgstr "" + +#: doc/classes/OptionButton.xml +msgid "[StyleBox] used when the [OptionButton] is being pressed." +msgstr "" + +#: doc/classes/OS.xml +msgid "Operating System functions." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Operating System functions. OS wraps the most common functionality to " +"communicate with the host operating system, such as the clipboard, video " +"driver, date and time, timers, environment variables, execution of binaries, " +"command line, etc." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Displays a modal dialog box using the host OS' facilities. Execution is " +"blocked until the dialog is closed." +msgstr "" + +#: doc/classes/OS.xml +msgid "Returns [code]true[/code] if the host OS allows drawing." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns [code]true[/code] if the current host platform is using multiple " +"threads." +msgstr "" + +#: doc/classes/OS.xml +msgid "Centers the window on the screen if in windowed mode." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Shuts down system MIDI driver.\n" +"[b]Note:[/b] This method is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Crashes the engine (or the editor if called within a [code]tool[/code] " +"script). This should [i]only[/i] be used for testing the system's crash " +"handler, not for any other purpose. For general error reporting, use (in " +"order of preference) [method @GDScript.assert], [method @GDScript." +"push_error] or [method alert]. See also [method kill]." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Delays execution of the current thread by [code]msec[/code] milliseconds. " +"[code]msec[/code] must be greater than or equal to [code]0[/code]. " +"Otherwise, [method delay_msec] will do nothing and will print an error " +"message.\n" +"[b]Note:[/b] [method delay_msec] is a [i]blocking[/i] way to delay code " +"execution. To delay code execution in a non-blocking way, see [method " +"SceneTree.create_timer]. Yielding with [method SceneTree.create_timer] will " +"delay the execution of code placed below the [code]yield[/code] without " +"affecting the rest of the project (or editor, for [EditorPlugin]s and " +"[EditorScript]s).\n" +"[b]Note:[/b] When [method delay_msec] is called on the main thread, it will " +"freeze the project and will prevent it from redrawing and registering input " +"until the delay has passed. When using [method delay_msec] as part of an " +"[EditorPlugin] or [EditorScript], it will freeze the editor but won't freeze " +"the project if it is currently running (since the project is an independent " +"child process)." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Delays execution of the current thread by [code]usec[/code] microseconds. " +"[code]usec[/code] must be greater than or equal to [code]0[/code]. " +"Otherwise, [method delay_usec] will do nothing and will print an error " +"message.\n" +"[b]Note:[/b] [method delay_usec] is a [i]blocking[/i] way to delay code " +"execution. To delay code execution in a non-blocking way, see [method " +"SceneTree.create_timer]. Yielding with [method SceneTree.create_timer] will " +"delay the execution of code placed below the [code]yield[/code] without " +"affecting the rest of the project (or editor, for [EditorPlugin]s and " +"[EditorScript]s).\n" +"[b]Note:[/b] When [method delay_usec] is called on the main thread, it will " +"freeze the project and will prevent it from redrawing and registering input " +"until the delay has passed. When using [method delay_usec] as part of an " +"[EditorPlugin] or [EditorScript], it will freeze the editor but won't freeze " +"the project if it is currently running (since the project is an independent " +"child process)." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Dumps the memory allocation ringlist to a file (only works in debug).\n" +"Entry format per line: \"Address - Size - Description\"." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Dumps all used resources to file (only works in debug).\n" +"Entry format per line: \"Resource Type : Resource Location\".\n" +"At the end of the file is a statistic of all used Resource Types." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Execute the file at the given path with the arguments passed as an array of " +"strings. Platform path resolution will take place. The resolved file must " +"exist and be executable.\n" +"The arguments are used in the given order and separated by a space, so " +"[code]OS.execute(\"ping\", [\"-w\", \"3\", \"godotengine.org\"], false)[/" +"code] will resolve to [code]ping -w 3 godotengine.org[/code] in the system's " +"shell.\n" +"This method has slightly different behavior based on whether the " +"[code]blocking[/code] mode is enabled.\n" +"If [code]blocking[/code] is [code]true[/code], the Godot thread will pause " +"its execution while waiting for the process to terminate. The shell output " +"of the process will be written to the [code]output[/code] array as a single " +"string. When the process terminates, the Godot thread will resume " +"execution.\n" +"If [code]blocking[/code] is [code]false[/code], the Godot thread will " +"continue while the new process runs. It is not possible to retrieve the " +"shell output in non-blocking mode, so [code]output[/code] will be empty.\n" +"On Windows, if [code]open_console[/code] is [code]true[/code] and process is " +"console app, new terminal window will be opened, it's ignored on other " +"platforms.\n" +"The return value also depends on the blocking mode. When blocking, the " +"method will return an exit code of the process. When non-blocking, the " +"method returns a process ID, which you can use to monitor the process (and " +"potentially terminate it with [method kill]). If the process forking (non-" +"blocking) or opening (blocking) fails, the method will return [code]-1[/" +"code] or another exit code.\n" +"Example of blocking mode and retrieving the shell output:\n" +"[codeblock]\n" +"var output = []\n" +"var exit_code = OS.execute(\"ls\", [\"-l\", \"/tmp\"], true, output)\n" +"[/codeblock]\n" +"Example of non-blocking mode, running another instance of the project and " +"storing its process ID:\n" +"[codeblock]\n" +"var pid = OS.execute(OS.get_executable_path(), [], false)\n" +"[/codeblock]\n" +"If you wish to access a shell built-in or perform a composite command, a " +"platform-specific shell can be invoked. For example:\n" +"[codeblock]\n" +"OS.execute(\"CMD.exe\", [\"/C\", \"cd %TEMP% && dir\"], true, output)\n" +"[/codeblock]\n" +"[b]Note:[/b] This method is implemented on Android, iOS, Linux, macOS and " +"Windows.\n" +"[b]Note:[/b] To execute a Windows command interpreter built-in command, " +"specify [code]cmd.exe[/code] in [code]path[/code], [code]/c[/code] as the " +"first argument, and the desired command as the second argument.\n" +"[b]Note:[/b] To execute a PowerShell built-in command, specify " +"[code]powershell.exe[/code] in [code]path[/code], [code]-Command[/code] as " +"the first argument, and the desired command as the second argument.\n" +"[b]Note:[/b] To execute a Unix shell built-in command, specify shell " +"executable name in [code]path[/code], [code]-c[/code] as the first argument, " +"and the desired command as the second argument." +msgstr "" + +#: doc/classes/OS.xml +msgid "Returns the scancode of the given string (e.g. \"Escape\")." +msgstr "" + +#: doc/classes/OS.xml +msgid "Returns the total number of available audio drivers." +msgstr "" + +#: doc/classes/OS.xml +msgid "Returns the audio driver name for the given index." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the [i]global[/i] cache data directory according to the operating " +"system's standards. On desktop platforms, this path can be overridden by " +"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " +"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " +"Godot projects[/url] in the documentation for more information. See also " +"[method get_config_dir] and [method get_data_dir].\n" +"Not to be confused with [method get_user_data_dir], which returns the " +"[i]project-specific[/i] user data path." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the command-line arguments passed to the engine.\n" +"Command-line arguments can be written in any form, including both [code]--" +"key value[/code] and [code]--key=value[/code] forms so they can be properly " +"parsed, as long as custom command-line arguments do not conflict with engine " +"arguments.\n" +"You can also incorporate environment variables using the [method " +"get_environment] method.\n" +"You can set [member ProjectSettings.editor/main_run_args] to define command-" +"line arguments to be passed by the editor when running the project.\n" +"Here's a minimal example on how to parse command-line arguments into a " +"dictionary using the [code]--key=value[/code] form for arguments:\n" +"[codeblock]\n" +"var arguments = {}\n" +"for argument in OS.get_cmdline_args():\n" +" if argument.find(\"=\") > -1:\n" +" var key_value = argument.split(\"=\")\n" +" arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the [i]global[/i] user configuration directory according to the " +"operating system's standards. On desktop platforms, this path can be " +"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " +"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." +"html]File paths in Godot projects[/url] in the documentation for more " +"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"Not to be confused with [method get_user_data_dir], which returns the " +"[i]project-specific[/i] user data path." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns an array of MIDI device names.\n" +"The returned array will be empty if the system MIDI driver has not " +"previously been initialised with [method open_midi_inputs].\n" +"[b]Note:[/b] This method is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the currently used video driver, using one of the values from [enum " +"VideoDriver]." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the [i]global[/i] user data directory according to the operating " +"system's standards. On desktop platforms, this path can be overridden by " +"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " +"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " +"Godot projects[/url] in the documentation for more information. See also " +"[method get_cache_dir] and [method get_config_dir].\n" +"Not to be confused with [method get_user_data_dir], which returns the " +"[i]project-specific[/i] user data path." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Deprecated, use [method Time.get_date_dict_from_system] instead.\n" +"Returns current date as a dictionary of keys: [code]year[/code], " +"[code]month[/code], [code]day[/code], [code]weekday[/code], [code]dst[/code] " +"(Daylight Savings Time)." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Deprecated, use [method Time.get_datetime_dict_from_system] instead.\n" +"Returns current datetime as a dictionary of keys: [code]year[/code], " +"[code]month[/code], [code]day[/code], [code]weekday[/code], [code]dst[/code] " +"(Daylight Savings Time), [code]hour[/code], [code]minute[/code], " +"[code]second[/code]." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Deprecated, use [method Time.get_datetime_dict_from_unix_time] instead.\n" +"Gets a dictionary of time values corresponding to the given UNIX epoch time " +"(in seconds).\n" +"The returned Dictionary's values will be the same as [method get_datetime], " +"with the exception of Daylight Savings Time as it cannot be determined from " +"the epoch." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns an [Array] of [Rect2], each of which is the bounding rectangle for a " +"display cutout or notch. These are non-functional areas on edge-to-edge " +"screens used by cameras and sensors. Returns an empty array if the device " +"does not have cutouts. See also [method get_window_safe_area].\n" +"[b]Note:[/b] Currently only implemented on Android. Other platforms will " +"return an empty array even if they do have display cutouts or notches." +msgstr "" + +#: doc/classes/OS.xml +msgid "Returns the total amount of dynamic memory used (only works in debug)." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the value of an environment variable. Returns an empty string if the " +"environment variable doesn't exist.\n" +"[b]Note:[/b] Double-check the casing of [code]variable[/code]. Environment " +"variable names are case-sensitive on all platforms except Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "Returns the path to the current engine executable." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"With this function, you can get the list of dangerous permissions that have " +"been granted to the Android application.\n" +"[b]Note:[/b] This method is implemented on Android." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the IME cursor position (the currently-edited portion of the string) " +"relative to the characters in the composition string.\n" +"[constant MainLoop.NOTIFICATION_OS_IME_UPDATE] is sent to the application to " +"notify it of changes to the IME cursor position.\n" +"[b]Note:[/b] This method is implemented on macOS." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the IME intermediate composition string.\n" +"[constant MainLoop.NOTIFICATION_OS_IME_UPDATE] is sent to the application to " +"notify it of changes to the IME composition string.\n" +"[b]Note:[/b] This method is implemented on macOS." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the current latin keyboard variant as a String.\n" +"Possible return values are: [code]\"QWERTY\"[/code], [code]\"AZERTY\"[/" +"code], [code]\"QZERTY\"[/code], [code]\"DVORAK\"[/code], [code]\"NEO\"[/" +"code], [code]\"COLEMAK\"[/code] or [code]\"ERROR\"[/code].\n" +"[b]Note:[/b] This method is implemented on Linux, macOS and Windows. Returns " +"[code]\"QWERTY\"[/code] on unsupported platforms." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the host OS locale as a string of the form " +"[code]language_Script_COUNTRY_VARIANT@extra[/code]. If you want only the " +"language code and not the fully specified locale from the OS, you can use " +"[method get_locale_language].\n" +"[code]language[/code] - 2 or 3-letter [url=https://en.wikipedia.org/wiki/" +"List_of_ISO_639-1_codes]language code[/url], in lower case.\n" +"[code]Script[/code] - optional, 4-letter [url=https://en.wikipedia.org/wiki/" +"ISO_15924]script code[/url], in title case.\n" +"[code]COUNTRY[/code] - optional, 2 or 3-letter [url=https://en.wikipedia.org/" +"wiki/ISO_3166-1]country code[/url], in upper case.\n" +"[code]VARIANT[/code] - optional, language variant, region and sort order. " +"Variant can have any number of underscored keywords.\n" +"[code]extra[/code] - optional, semicolon separated list of additional key " +"words. Currency, calendar, sort order and numbering system information." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the host OS locale's 2 or 3-letter [url=https://en.wikipedia.org/" +"wiki/List_of_ISO_639-1_codes]language code[/url] as a string which should be " +"consistent on all platforms. This is equivalent to extracting the " +"[code]language[/code] part of the [method get_locale] string.\n" +"This can be used to narrow down fully specified locale strings to only the " +"\"common\" language code, when you don't need the additional information " +"about country code or variants. For example, for a French Canadian user with " +"[code]fr_CA[/code] locale, this would return [code]fr[/code]." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the ID of the main thread. See [method get_thread_caller_id].\n" +"[b]Note:[/b] Thread IDs are not deterministic and may be reused across " +"application restarts." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the model name of the current device.\n" +"[b]Note:[/b] This method is implemented on Android and iOS. Returns " +"[code]\"GenericDevice\"[/code] on unsupported platforms." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the name of the host OS. Possible values are: [code]\"Android\"[/" +"code], [code]\"iOS\"[/code], [code]\"HTML5\"[/code], [code]\"OSX\"[/code], " +"[code]\"Server\"[/code], [code]\"Windows\"[/code], [code]\"UWP\"[/code], " +"[code]\"X11\"[/code]." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns internal structure pointers for use in GDNative plugins.\n" +"[b]Note:[/b] This method is implemented on Linux and Windows (other OSs will " +"soon be supported)." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the amount of battery left in the device as a percentage. Returns " +"[code]-1[/code] if power state is unknown.\n" +"[b]Note:[/b] This method is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns an estimate of the time left in seconds before the device runs out " +"of battery. Returns [code]-1[/code] if power state is unknown.\n" +"[b]Note:[/b] This method is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the current state of the device regarding battery and power. See " +"[enum PowerState] constants.\n" +"[b]Note:[/b] This method is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the project's process ID.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, Linux, macOS and " +"Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the number of [i]logical[/i] CPU cores available on the host " +"machine. On CPUs with HyperThreading enabled, this number will be greater " +"than the number of [i]physical[/i] CPU cores." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the name of the CPU model on the host machine (e.g. \"Intel(R) " +"Core(TM) i7-6700K CPU @ 4.00GHz\").\n" +"[b]Note:[/b] This method is only implemented on Windows, macOS, Linux and " +"iOS. On Android, HTML5 and UWP, [method get_processor_name] returns an empty " +"string." +msgstr "" + +#: doc/classes/OS.xml +msgid "Returns the window size including decorations like window borders." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the given scancode as a string (e.g. Return values: " +"[code]\"Escape\"[/code], [code]\"Shift+Escape\"[/code]).\n" +"See also [member InputEventKey.scancode] and [method InputEventKey." +"get_scancode_with_modifiers]." +msgstr "" + +#: doc/classes/OS.xml +msgid "Returns the number of displays attached to the host machine." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the dots per inch density of the specified screen. If [code]screen[/" +"code] is [code]-1[/code] (the default value), the current screen will be " +"used.\n" +"[b]Note:[/b] On macOS, returned value is inaccurate if fractional display " +"scaling mode is used.\n" +"[b]Note:[/b] On Android devices, the actual screen densities are grouped " +"into six generalized densities:\n" +"[codeblock]\n" +" ldpi - 120 dpi\n" +" mdpi - 160 dpi\n" +" hdpi - 240 dpi\n" +" xhdpi - 320 dpi\n" +" xxhdpi - 480 dpi\n" +"xxxhdpi - 640 dpi\n" +"[/codeblock]\n" +"[b]Note:[/b] This method is implemented on Android, Linux, macOS and " +"Windows. Returns [code]72[/code] on unsupported platforms." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Return the greatest scale factor of all screens.\n" +"[b]Note:[/b] On macOS returned value is [code]2.0[/code] if there is at " +"least one hiDPI (Retina) screen in the system, and [code]1.0[/code] in all " +"other cases.\n" +"[b]Note:[/b] This method is implemented on macOS." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the position of the specified screen by index. If [code]screen[/" +"code] is [code]-1[/code] (the default value), the current screen will be " +"used." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the current refresh rate of the specified screen. If [code]screen[/" +"code] is [code]-1[/code] (the default value), the current screen will be " +"used.\n" +"[b]Note:[/b] Returns [code]-1.0[/code] if Godot fails to find the refresh " +"rate for the specified screen. On HTML5, [method get_screen_refresh_rate] " +"will always return [code]-1.0[/code] as there is no way to retrieve the " +"refresh rate on that platform.\n" +"To fallback to a default refresh rate if the method fails, try:\n" +"[codeblock]\n" +"var refresh_rate = OS.get_screen_refresh_rate()\n" +"if refresh_rate < 0:\n" +" refresh_rate = 60.0\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Return the scale factor of the specified screen by index. If [code]screen[/" +"code] is [code]-1[/code] (the default value), the current screen will be " +"used.\n" +"[b]Note:[/b] On macOS returned value is [code]2.0[/code] for hiDPI (Retina) " +"screen, and [code]1.0[/code] for all other cases.\n" +"[b]Note:[/b] This method is implemented on macOS." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the dimensions in pixels of the specified screen. If [code]screen[/" +"code] is [code]-1[/code] (the default value), the current screen will be " +"used." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the amount of time in milliseconds it took for the boot logo to " +"appear." +msgstr "" + +#: doc/classes/OS.xml +msgid "Returns the maximum amount of static memory used (only works in debug)." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the amount of static memory being used by the program in bytes (only " +"works in debug)." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the actual path to commonly used folders across different platforms. " +"Available locations are specified in [enum SystemDir].\n" +"[b]Note:[/b] This method is implemented on Android, Linux, macOS and " +"Windows.\n" +"[b]Note:[/b] Shared storage is implemented on Android and allows to " +"differentiate between app specific and shared directories. Shared " +"directories have additional restrictions on Android." +msgstr "" + +#: doc/classes/OS.xml +msgid "Returns the epoch time of the operating system in milliseconds." +msgstr "" + +#: doc/classes/OS.xml +msgid "Returns the epoch time of the operating system in seconds." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the total number of available tablet drivers.\n" +"[b]Note:[/b] This method is implemented on Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the tablet driver name for the given index.\n" +"[b]Note:[/b] This method is implemented on Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the ID of the current thread. This can be used in logs to ease " +"debugging of multi-threaded applications.\n" +"[b]Note:[/b] Thread IDs are not deterministic and may be reused across " +"application restarts." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Deprecated, use [method Time.get_ticks_msec] instead.\n" +"Returns the amount of time passed in milliseconds since the engine started." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Deprecated, use [method Time.get_ticks_usec] instead.\n" +"Returns the amount of time passed in microseconds since the engine started." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Deprecated, use [method Time.get_time_dict_from_system] instead.\n" +"Returns current time as a dictionary of keys: hour, minute, second." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the current time zone as a dictionary with the keys: bias and name." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns a string that is unique to the device.\n" +"[b]Note:[/b] This string may change without notice if the user reinstalls/" +"upgrades their operating system or changes their hardware. This means it " +"should generally not be used to encrypt persistent data as the data saved " +"before an unexpected ID change would become inaccessible. The returned " +"string may also be falsified using external programs, so do not rely on the " +"string returned by [method get_unique_id] for security purposes.\n" +"[b]Note:[/b] Returns an empty string on HTML5 and UWP, as this method isn't " +"implemented on those platforms yet." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the current UNIX epoch timestamp in seconds.\n" +"[b]Important:[/b] This is the system clock that the user can manually set. " +"[b]Never use[/b] this method for precise time calculation since its results " +"are also subject to automatic adjustments by the operating system. [b]Always " +"use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " +"calculation instead, since they are guaranteed to be monotonic (i.e. never " +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Gets an epoch time value from a dictionary of time values.\n" +"[code]datetime[/code] must be populated with the following keys: [code]year[/" +"code], [code]month[/code], [code]day[/code], [code]hour[/code], " +"[code]minute[/code], [code]second[/code].\n" +"If the dictionary is empty [code]0[/code] is returned. If some keys are " +"omitted, they default to the equivalent values for the UNIX epoch timestamp " +"0 (1970-01-01 at 00:00:00 UTC).\n" +"You can pass the output from [method get_datetime_from_unix_time] directly " +"into this function. Daylight Savings Time ([code]dst[/code]), if present, is " +"ignored." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the absolute directory path where user data is written ([code]user://" +"[/code]).\n" +"On Linux, this is [code]~/.local/share/godot/app_userdata/[project_name][/" +"code], or [code]~/.local/share/[custom_name][/code] if " +"[code]use_custom_user_dir[/code] is set.\n" +"On macOS, this is [code]~/Library/Application Support/Godot/app_userdata/" +"[project_name][/code], or [code]~/Library/Application Support/[custom_name][/" +"code] if [code]use_custom_user_dir[/code] is set.\n" +"On Windows, this is [code]%APPDATA%\\Godot\\app_userdata\\[project_name][/" +"code], or [code]%APPDATA%\\[custom_name][/code] if " +"[code]use_custom_user_dir[/code] is set. [code]%APPDATA%[/code] expands to " +"[code]%USERPROFILE%\\AppData\\Roaming[/code].\n" +"If the project name is empty, [code]user://[/code] falls back to [code]res://" +"[/code].\n" +"Not to be confused with [method get_data_dir], which returns the [i]global[/" +"i] (non-project-specific) user data directory." +msgstr "" + +#: doc/classes/OS.xml +msgid "Returns the number of video drivers supported on the current platform." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the name of the video driver matching the given [code]driver[/code] " +"index. This index is a value from [enum VideoDriver], and you can use " +"[method get_current_video_driver] to get the current backend's index." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the on-screen keyboard's height in pixels. Returns 0 if there is no " +"keyboard or if it is currently hidden." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns unobscured area of the window where interactive controls should be " +"rendered." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Add a new item with text \"label\" to global menu. Use \"_dock\" menu to add " +"item to the macOS dock icon menu.\n" +"[b]Note:[/b] This method is implemented on macOS." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Add a separator between items. Separators also occupy an index.\n" +"[b]Note:[/b] This method is implemented on macOS." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Clear the global menu, in effect removing all items.\n" +"[b]Note:[/b] This method is implemented on macOS." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Removes the item at index \"idx\" from the global menu. Note that the " +"indexes of items after the removed item are going to be shifted by one.\n" +"[b]Note:[/b] This method is implemented on macOS." +msgstr "" + +#: doc/classes/OS.xml +msgid "Returns [code]true[/code] if there is content on the clipboard." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns [code]true[/code] if the environment variable with the name " +"[code]variable[/code] exists.\n" +"[b]Note:[/b] Double-check the casing of [code]variable[/code]. Environment " +"variable names are case-sensitive on all platforms except Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns [code]true[/code] if the feature for the given feature tag is " +"supported in the currently running instance, depending on the platform, " +"build etc. Can be used to check whether you're currently running a debug " +"build, on a certain platform or arch, etc. Refer to the [url=$DOCS_URL/" +"tutorials/export/feature_tags.html]Feature Tags[/url] documentation for more " +"details.\n" +"[b]Note:[/b] Tag names are case-sensitive." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns [code]true[/code] if the device has a touchscreen or emulates one." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns [code]true[/code] if the platform has a virtual keyboard, " +"[code]false[/code] otherwise." +msgstr "" + +#: doc/classes/OS.xml +msgid "Hides the virtual keyboard if it is shown, does nothing otherwise." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns [code]true[/code] if the Godot binary used to run the project is a " +"[i]debug[/i] export template, or when running in the editor.\n" +"Returns [code]false[/code] if the Godot binary used to run the project is a " +"[i]release[/i] export template.\n" +"To check whether the Godot binary used to run the project is an export " +"template (debug or release), use [code]OS.has_feature(\"standalone\")[/code] " +"instead." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns [code]true[/code] if the [b]OK[/b] button should appear on the left " +"and [b]Cancel[/b] on the right." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns [code]true[/code] if the child process ID ([code]pid[/code]) is " +"still running or [code]false[/code] if it has terminated.\n" +"Must be a valid ID generated from [method execute].\n" +"[b]Note:[/b] This method is implemented on Android, iOS, Linux, macOS and " +"Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns [code]true[/code] if the input scancode corresponds to a Unicode " +"character." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns [code]true[/code] if the engine was executed with [code]-v[/code] " +"(verbose stdout)." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"If [code]true[/code], the [code]user://[/code] file system is persistent, so " +"that its state is the same after a player quits and starts the game again. " +"Relevant to the HTML5 platform, where this persistence may be unavailable." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns [code]true[/code] if the window should always be on top of other " +"windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns [code]true[/code] if the window is currently focused.\n" +"[b]Note:[/b] Only implemented on desktop platforms. On other platforms, it " +"will always return [code]true[/code]." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns active keyboard layout index.\n" +"[b]Note:[/b] This method is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the number of keyboard layouts.\n" +"[b]Note:[/b] This method is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the ISO-639/BCP-47 language code of the keyboard layout at position " +"[code]index[/code].\n" +"[b]Note:[/b] This method is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns the localized name of the keyboard layout at position [code]index[/" +"code].\n" +"[b]Note:[/b] This method is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Converts a physical (US QWERTY) [code]scancode[/code] to one in the active " +"keyboard layout.\n" +"[b]Note:[/b] This method is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Sets active keyboard layout.\n" +"[b]Note:[/b] This method is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Kill (terminate) the process identified by the given process ID ([code]pid[/" +"code]), e.g. the one returned by [method execute] in non-blocking mode. See " +"also [method crash].\n" +"[b]Note:[/b] This method can also be used to kill processes that were not " +"spawned by the game.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, Linux, macOS and " +"Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Moves the file or directory to the system's recycle bin. See also [method " +"Directory.remove].\n" +"The method takes only global paths, so you may need to use [method " +"ProjectSettings.globalize_path]. Do not use it for files in [code]res://[/" +"code] as it will not work in exported project.\n" +"[b]Note:[/b] If the user has disabled the recycle bin on their system, the " +"file will be permanently deleted instead.\n" +"[codeblock]\n" +"var file_to_remove = \"user://slot1.sav\"\n" +"OS.move_to_trash(ProjectSettings.globalize_path(file_to_remove))\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Moves the window to the front.\n" +"[b]Note:[/b] This method is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Returns [code]true[/code] if native video is playing.\n" +"[b]Note:[/b] This method is only implemented on iOS." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Pauses native video playback.\n" +"[b]Note:[/b] This method is only implemented on iOS." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Plays native video from the specified path, at the given volume and with " +"audio and subtitle tracks.\n" +"[b]Note:[/b] This method is only implemented on iOS." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Stops native video playback.\n" +"[b]Note:[/b] This method is implemented on iOS." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Resumes native video playback.\n" +"[b]Note:[/b] This method is implemented on iOS." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Initialises the singleton for the system MIDI driver.\n" +"[b]Note:[/b] This method is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Shows all resources in the game. Optionally, the list can be written to a " +"file by specifying a file path in [code]tofile[/code]." +msgstr "" + +#: doc/classes/OS.xml +msgid "Shows the list of loaded textures sorted by size in memory." +msgstr "" + +#: doc/classes/OS.xml +msgid "Shows the number of resources loaded by the game of the given types." +msgstr "" + +#: doc/classes/OS.xml +msgid "Shows all resources currently used by the game." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Request the user attention to the window. It'll flash the taskbar button on " +"Windows or bounce the dock icon on OSX.\n" +"[b]Note:[/b] This method is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"At the moment this function is only used by [code]AudioDriverOpenSL[/code] " +"to request permission for [code]RECORD_AUDIO[/code] on Android." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"With this function, you can request dangerous permissions since normal " +"permissions are automatically granted at install time in Android " +"applications.\n" +"[b]Note:[/b] This method is implemented on Android." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Sets the value of the environment variable [code]variable[/code] to " +"[code]value[/code]. The environment variable will be set for the Godot " +"process and any process executed with [method execute] after running [method " +"set_environment]. The environment variable will [i]not[/i] persist to " +"processes run after the Godot process was terminated.\n" +"[b]Note:[/b] Double-check the casing of [code]variable[/code]. Environment " +"variable names are case-sensitive on all platforms except Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Sets the game's icon using an [Image] resource.\n" +"The same image is used for window caption, taskbar/dock and window selection " +"dialog. Image is scaled as needed.\n" +"[b]Note:[/b] This method is implemented on HTML5, Linux, macOS and Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Sets whether IME input mode should be enabled.\n" +"If active IME handles key events before the application and creates an " +"composition string and suggestion list.\n" +"Application can retrieve the composition status by using [method " +"get_ime_selection] and [method get_ime_text] functions.\n" +"Completed composition string is committed when input is finished.\n" +"[b]Note:[/b] This method is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Sets position of IME suggestion list popup (in window coordinates).\n" +"[b]Note:[/b] This method is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Sets the game's icon using a multi-size platform-specific icon file ([code]*." +"ico[/code] on Windows and [code]*.icns[/code] on macOS).\n" +"Appropriate size sub-icons are used for window caption, taskbar/dock and " +"window selection dialog.\n" +"[b]Note:[/b] This method is implemented on macOS and Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "Sets the name of the current thread." +msgstr "" + +#: doc/classes/OS.xml +msgid "Enables backup saves if [code]enabled[/code] is [code]true[/code]." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Sets whether the window should always be on top.\n" +"[b]Note:[/b] This method is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Sets a polygonal region of the window which accepts mouse events. Mouse " +"events outside the region will be passed through.\n" +"Passing an empty array will disable passthrough support (all mouse events " +"will be intercepted by the window, which is the default behavior).\n" +"[codeblock]\n" +"# Set region, using Path2D node.\n" +"OS.set_window_mouse_passthrough($Path2D.curve.get_baked_points())\n" +"\n" +"# Set region, using Polygon2D node.\n" +"OS.set_window_mouse_passthrough($Polygon2D.polygon)\n" +"\n" +"# Reset region to default.\n" +"OS.set_window_mouse_passthrough([])\n" +"[/codeblock]\n" +"[b]Note:[/b] On Windows, the portion of a window that lies outside the " +"region is not drawn, while on Linux and macOS it is.\n" +"[b]Note:[/b] This method is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Sets the window title to the specified string.\n" +"[b]Note:[/b] This should be used sporadically. Don't set this every frame, " +"as that will negatively affect performance on some window managers.\n" +"[b]Note:[/b] This method is implemented on HTML5, Linux, macOS and Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Requests the OS to open a resource with the most appropriate program. For " +"example:\n" +"- [code]OS.shell_open(\"C:\\\\Users\\name\\Downloads\")[/code] on Windows " +"opens the file explorer at the user's Downloads folder.\n" +"- [code]OS.shell_open(\"https://godotengine.org\")[/code] opens the default " +"web browser on the official Godot website.\n" +"- [code]OS.shell_open(\"mailto:example@example.com\")[/code] opens the " +"default email client with the \"To\" field set to [code]example@example.com[/" +"code]. See [url=https://datatracker.ietf.org/doc/html/rfc2368]RFC 2368 - The " +"[code]mailto[/code] URL scheme[/url] for a list of fields that can be " +"added.\n" +"Use [method ProjectSettings.globalize_path] to convert a [code]res://[/code] " +"or [code]user://[/code] path into a system path for use with this method.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, HTML5, Linux, macOS " +"and Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Shows the virtual keyboard if the platform has one.\n" +"The [code]existing_text[/code] parameter is useful for implementing your own " +"[LineEdit] or [TextEdit], as it tells the virtual keyboard what text has " +"already been typed (the virtual keyboard uses it for auto-correct and " +"predictions).\n" +"The [code]multiline[/code] parameter needs to be set to [code]true[/code] to " +"be able to enter multiple lines of text, as in [TextEdit].\n" +"[b]Note:[/b] This method is implemented on Android, iOS and UWP." +msgstr "" + +#: doc/classes/OS.xml +msgid "The clipboard from the host OS. Might be unavailable on some platforms." +msgstr "" + +#: doc/classes/OS.xml +msgid "The current screen index (starting from 0)." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"If [code]true[/code], the engine filters the time delta measured between " +"each frame, and attempts to compensate for random variation. This will only " +"operate on systems where V-Sync is active." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"The exit code passed to the OS when the main loop exits. By convention, an " +"exit code of [code]0[/code] indicates success whereas a non-zero exit code " +"indicates an error. For portability reasons, the exit code should be set " +"between 0 and 125 (inclusive).\n" +"[b]Note:[/b] This value will be ignored if using [method SceneTree.quit] " +"with an [code]exit_code[/code] argument passed." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"If [code]true[/code], the engine tries to keep the screen on while the game " +"is running. Useful on mobile." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"If [code]true[/code], the engine optimizes for low processor usage by only " +"refreshing the screen if needed. Can improve battery consumption on mobile." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"The amount of sleeping between frames when the low-processor usage mode is " +"enabled (in microseconds). Higher values will result in lower CPU usage." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"The maximum size of the window (without counting window manager " +"decorations). Does not affect fullscreen mode. Set to [code](0, 0)[/code] to " +"reset to the system default value." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"The minimum size of the window in pixels (without counting window manager " +"decorations). Does not affect fullscreen mode. Set to [code](0, 0)[/code] to " +"reset to the system's default value.\n" +"[b]Note:[/b] By default, the project window has a minimum size of " +"[code]Vector2(64, 64)[/code]. This prevents issues that can arise when the " +"window is resized to a near-zero size." +msgstr "" + +#: doc/classes/OS.xml +msgid "The current screen orientation." +msgstr "" + +#: doc/classes/OS.xml +msgid "The current tablet driver in use." +msgstr "" + +#: doc/classes/OS.xml +msgid "If [code]true[/code], vertical synchronization (Vsync) is enabled." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"If [code]true[/code] and [code]vsync_enabled[/code] is true, the operating " +"system's window compositor will be used for vsync when the compositor is " +"enabled and the game is in windowed mode.\n" +"[b]Note:[/b] This option is experimental and meant to alleviate stutter " +"experienced by some users. However, some users have experienced a Vsync " +"framerate halving (e.g. from 60 FPS to 30 FPS) when using it.\n" +"[b]Note:[/b] This property is only implemented on Windows." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"If [code]true[/code], removes the window frame.\n" +"[b]Note:[/b] Setting [code]window_borderless[/code] to [code]false[/code] " +"disables per-pixel transparency." +msgstr "" + +#: doc/classes/OS.xml +msgid "If [code]true[/code], the window is fullscreen." +msgstr "" + +#: doc/classes/OS.xml +msgid "If [code]true[/code], the window is maximized." +msgstr "" + +#: doc/classes/OS.xml +msgid "If [code]true[/code], the window is minimized." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"If [code]true[/code], the window background is transparent and the window " +"frame is removed.\n" +"Use [code]get_tree().get_root().set_transparent_background(true)[/code] to " +"disable main viewport background rendering.\n" +"[b]Note:[/b] This property has no effect if [member ProjectSettings.display/" +"window/per_pixel_transparency/allowed] setting is disabled.\n" +"[b]Note:[/b] This property is implemented on HTML5, Linux, macOS, Windows, " +"and Android. It can't be changed at runtime for Android. Use [member " +"ProjectSettings.display/window/per_pixel_transparency/enabled] to set it at " +"startup instead." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"The window position relative to the screen, the origin is the top left " +"corner, +Y axis goes to the bottom and +X axis goes to the right." +msgstr "" + +#: doc/classes/OS.xml +msgid "If [code]true[/code], the window is resizable by the user." +msgstr "" + +#: doc/classes/OS.xml +msgid "The size of the window (without counting window manager decorations)." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"The GLES2 rendering backend. It uses OpenGL ES 2.0 on mobile devices, OpenGL " +"2.1 on desktop platforms and WebGL 1.0 on the web." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"The GLES3 rendering backend. It uses OpenGL ES 3.0 on mobile devices, OpenGL " +"3.3 on desktop platforms and WebGL 2.0 on the web." +msgstr "" + +#: doc/classes/OS.xml +msgid "Sunday." +msgstr "" + +#: doc/classes/OS.xml +msgid "Monday." +msgstr "" + +#: doc/classes/OS.xml +msgid "Tuesday." +msgstr "" + +#: doc/classes/OS.xml +msgid "Wednesday." +msgstr "" + +#: doc/classes/OS.xml +msgid "Thursday." +msgstr "" + +#: doc/classes/OS.xml +msgid "Friday." +msgstr "" + +#: doc/classes/OS.xml +msgid "Saturday." +msgstr "" + +#: doc/classes/OS.xml +msgid "January." +msgstr "" + +#: doc/classes/OS.xml +msgid "February." +msgstr "" + +#: doc/classes/OS.xml +msgid "March." +msgstr "" + +#: doc/classes/OS.xml +msgid "April." +msgstr "" + +#: doc/classes/OS.xml +msgid "May." +msgstr "" + +#: doc/classes/OS.xml +msgid "June." +msgstr "" + +#: doc/classes/OS.xml +msgid "July." +msgstr "" + +#: doc/classes/OS.xml +msgid "August." +msgstr "" + +#: doc/classes/OS.xml +msgid "September." +msgstr "" + +#: doc/classes/OS.xml +msgid "October." +msgstr "" + +#: doc/classes/OS.xml +msgid "November." +msgstr "" + +#: doc/classes/OS.xml +msgid "December." +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Application handle:\n" +"- Windows: [code]HINSTANCE[/code] of the application\n" +"- MacOS: [code]NSApplication*[/code] of the application (not yet " +"implemented)\n" +"- Android: [code]JNIEnv*[/code] of the application (not yet implemented)" +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Display handle:\n" +"- Linux: [code]X11::Display*[/code] for the display" +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Window handle:\n" +"- Windows: [code]HWND[/code] of the main window\n" +"- Linux: [code]X11::Window*[/code] of the main window\n" +"- MacOS: [code]NSWindow*[/code] of the main window (not yet implemented)\n" +"- Android: [code]jObject[/code] the main android activity (not yet " +"implemented)" +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"Window view:\n" +"- Windows: [code]HDC[/code] of the main window drawing context\n" +"- MacOS: [code]NSView*[/code] of the main windows view (not yet implemented)" +msgstr "" + +#: doc/classes/OS.xml +msgid "" +"OpenGL Context:\n" +"- Windows: [code]HGLRC[/code]\n" +"- Linux: [code]X11::GLXContext[/code]\n" +"- MacOS: [code]NSOpenGLContext*[/code] (not yet implemented)" +msgstr "" + +#: doc/classes/OS.xml +msgid "Landscape screen orientation." +msgstr "" + +#: doc/classes/OS.xml +msgid "Portrait screen orientation." +msgstr "" + +#: doc/classes/OS.xml +msgid "Reverse landscape screen orientation." +msgstr "" + +#: doc/classes/OS.xml +msgid "Reverse portrait screen orientation." +msgstr "" + +#: doc/classes/OS.xml +msgid "Uses landscape or reverse landscape based on the hardware sensor." +msgstr "" + +#: doc/classes/OS.xml +msgid "Uses portrait or reverse portrait based on the hardware sensor." +msgstr "" + +#: doc/classes/OS.xml +msgid "Uses most suitable orientation based on the hardware sensor." +msgstr "" + +#: doc/classes/OS.xml +msgid "Desktop directory path." +msgstr "" + +#: doc/classes/OS.xml +msgid "DCIM (Digital Camera Images) directory path." +msgstr "" + +#: doc/classes/OS.xml +msgid "Documents directory path." +msgstr "" + +#: doc/classes/OS.xml +msgid "Downloads directory path." +msgstr "" + +#: doc/classes/OS.xml +msgid "Movies directory path." +msgstr "" + +#: doc/classes/OS.xml +msgid "Music directory path." +msgstr "" + +#: doc/classes/OS.xml +msgid "Pictures directory path." +msgstr "" + +#: doc/classes/OS.xml +msgid "Ringtones directory path." +msgstr "" + +#: doc/classes/OS.xml +msgid "Unknown powerstate." +msgstr "" + +#: doc/classes/OS.xml +msgid "Unplugged, running on battery." +msgstr "" + +#: doc/classes/OS.xml +msgid "Plugged in, no battery available." +msgstr "" + +#: doc/classes/OS.xml +msgid "Plugged in, battery charging." +msgstr "" + +#: doc/classes/OS.xml +msgid "Plugged in, battery fully charged." +msgstr "" + +#: doc/classes/PackedDataContainerRef.xml +msgid "Reference version of [PackedDataContainer]." +msgstr "" + +#: doc/classes/PackedScene.xml +msgid "An abstraction of a serialized scene." +msgstr "" + +#: doc/classes/PackedScene.xml +msgid "" +"A simplified interface to a scene file. Provides access to operations and " +"checks that can be performed on the scene resource itself.\n" +"Can be used to save a node to a file. When saving, the node as well as all " +"the nodes it owns get saved (see [code]owner[/code] property on [Node]).\n" +"[b]Note:[/b] The node doesn't need to own itself.\n" +"[b]Example of loading a saved scene:[/b]\n" +"[codeblock]\n" +"# Use `load()` instead of `preload()` if the path isn't known at compile-" +"time.\n" +"var scene = preload(\"res://scene.tscn\").instance()\n" +"# Add the node as a child of the node the script is attached to.\n" +"add_child(scene)\n" +"[/codeblock]\n" +"[b]Example of saving a node with different owners:[/b] The following example " +"creates 3 objects: [code]Node2D[/code] ([code]node[/code]), " +"[code]RigidBody2D[/code] ([code]rigid[/code]) and [code]CollisionObject2D[/" +"code] ([code]collision[/code]). [code]collision[/code] is a child of " +"[code]rigid[/code] which is a child of [code]node[/code]. Only [code]rigid[/" +"code] is owned by [code]node[/code] and [code]pack[/code] will therefore " +"only save those two nodes, but not [code]collision[/code].\n" +"[codeblock]\n" +"# Create the objects.\n" +"var node = Node2D.new()\n" +"var rigid = RigidBody2D.new()\n" +"var collision = CollisionShape2D.new()\n" +"\n" +"# Create the object hierarchy.\n" +"rigid.add_child(collision)\n" +"node.add_child(rigid)\n" +"\n" +"# Change owner of `rigid`, but not of `collision`.\n" +"rigid.owner = node\n" +"\n" +"var scene = PackedScene.new()\n" +"# Only `node` and `rigid` are now packed.\n" +"var result = scene.pack(node)\n" +"if result == OK:\n" +" var error = ResourceSaver.save(\"res://path/name.scn\", scene) # Or " +"\"user://...\"\n" +" if error != OK:\n" +" push_error(\"An error occurred while saving the scene to disk.\")\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/PackedScene.xml +msgid "Returns [code]true[/code] if the scene file has nodes." +msgstr "" + +#: doc/classes/PackedScene.xml +msgid "" +"Returns the [code]SceneState[/code] representing the scene file contents." +msgstr "" + +#: doc/classes/PackedScene.xml +msgid "" +"Instantiates the scene's node hierarchy. Triggers child scene " +"instantiation(s). Triggers a [constant Node.NOTIFICATION_INSTANCED] " +"notification on the root node." +msgstr "" + +#: doc/classes/PackedScene.xml +msgid "" +"Pack will ignore any sub-nodes not owned by given node. See [member Node." +"owner]." +msgstr "" + +#: doc/classes/PackedScene.xml +msgid "" +"A dictionary representation of the scene contents.\n" +"Available keys include \"rnames\" and \"variants\" for resources, " +"\"node_count\", \"nodes\", \"node_paths\" for nodes, \"editable_instances\" " +"for base scene children overrides, \"conn_count\" and \"conns\" for signal " +"connections, and \"version\" for the format style of the PackedScene." +msgstr "" + +#: doc/classes/PackedScene.xml +msgid "If passed to [method instance], blocks edits to the scene state." +msgstr "" + +#: doc/classes/PackedScene.xml +msgid "" +"If passed to [method instance], provides local scene resources to the local " +"scene.\n" +"[b]Note:[/b] Only available in editor builds." +msgstr "" + +#: doc/classes/PackedScene.xml +msgid "" +"If passed to [method instance], provides local scene resources to the local " +"scene. Only the main scene should receive the main edit state.\n" +"[b]Note:[/b] Only available in editor builds." +msgstr "" + +#: doc/classes/PackedScene.xml +msgid "" +"It's similar to [constant GEN_EDIT_STATE_MAIN], but for the case where the " +"scene is being instantiated to be the base of another one.\n" +"[b]Note:[/b] Only available in editor builds." +msgstr "" + +#: modules/gltf/doc_classes/PackedSceneGLTF.xml +msgid "" +"[b]Note:[/b] This class is only compiled in editor builds. Run-time glTF " +"loading and saving is [i]not[/i] available in exported projects. References " +"to [PackedSceneGLTF] within a script will cause an error in an exported " +"project." +msgstr "" + +#: doc/classes/PacketPeer.xml +msgid "Abstraction and base class for packet-based protocols." +msgstr "" + +#: doc/classes/PacketPeer.xml +msgid "" +"PacketPeer is an abstraction and base class for packet-based protocols (such " +"as UDP). It provides an API for sending and receiving packets both as raw " +"data or variables. This makes it easy to transfer data over a protocol, " +"without having to encode data as low-level bytes or having to worry about " +"network ordering." +msgstr "" + +#: doc/classes/PacketPeer.xml +msgid "Returns the number of packets currently available in the ring-buffer." +msgstr "" + +#: doc/classes/PacketPeer.xml +msgid "Gets a raw packet." +msgstr "" + +#: doc/classes/PacketPeer.xml +msgid "" +"Returns the error state of the last packet received (via [method get_packet] " +"and [method get_var])." +msgstr "" + +#: doc/classes/PacketPeer.xml +msgid "" +"Gets a Variant. If [code]allow_objects[/code] (or [member " +"allow_object_decoding]) is [code]true[/code], decoding objects is allowed.\n" +"[b]Warning:[/b] Deserialized objects can contain code which gets executed. " +"Do not use this option if the serialized object comes from untrusted sources " +"to avoid potential security threats such as remote code execution." +msgstr "" + +#: doc/classes/PacketPeer.xml +msgid "Sends a raw packet." +msgstr "" + +#: doc/classes/PacketPeer.xml +msgid "" +"Sends a [Variant] as a packet. If [code]full_objects[/code] (or [member " +"allow_object_decoding]) is [code]true[/code], encoding objects is allowed " +"(and can potentially include code)." +msgstr "" + +#: doc/classes/PacketPeer.xml +msgid "" +"[i]Deprecated.[/i] Use [code]get_var[/code] and [code]put_var[/code] " +"parameters instead.\n" +"If [code]true[/code], the PacketPeer will allow encoding and decoding of " +"object via [method get_var] and [method put_var].\n" +"[b]Warning:[/b] Deserialized objects can contain code which gets executed. " +"Do not use this option if the serialized object comes from untrusted sources " +"to avoid potential security threats such as remote code execution." +msgstr "" + +#: doc/classes/PacketPeer.xml +msgid "" +"Maximum buffer size allowed when encoding [Variant]s. Raise this value to " +"support heavier memory allocations.\n" +"The [method put_var] method allocates memory on the stack, and the buffer " +"used will grow automatically to the closest power of two to match the size " +"of the [Variant]. If the [Variant] is bigger than " +"[code]encode_buffer_max_size[/code], the method will error out with " +"[constant ERR_OUT_OF_MEMORY]." +msgstr "" + +#: doc/classes/PacketPeerDTLS.xml +msgid "DTLS packet peer." +msgstr "" + +#: doc/classes/PacketPeerDTLS.xml +msgid "" +"This class represents a DTLS peer connection. It can be used to connect to a " +"DTLS server, and is returned by [method DTLSServer.take_connection].\n" +"[b]Warning:[/b] SSL/TLS certificate revocation and certificate pinning are " +"currently not supported. Revoked certificates are accepted as long as they " +"are otherwise valid. If this is a concern, you may want to use automatically " +"managed certificates with a short validity period." +msgstr "" + +#: doc/classes/PacketPeerDTLS.xml +msgid "" +"Connects a [code]peer[/code] beginning the DTLS handshake using the " +"underlying [PacketPeerUDP] which must be connected (see [method " +"PacketPeerUDP.connect_to_host]). If [code]validate_certs[/code] is " +"[code]true[/code], [PacketPeerDTLS] will validate that the certificate " +"presented by the remote peer and match it with the [code]for_hostname[/code] " +"argument. You can specify a custom [X509Certificate] to use for validation " +"via the [code]valid_certificate[/code] argument." +msgstr "" + +#: doc/classes/PacketPeerDTLS.xml +msgid "Disconnects this peer, terminating the DTLS session." +msgstr "" + +#: doc/classes/PacketPeerDTLS.xml doc/classes/StreamPeerSSL.xml +msgid "Returns the status of the connection. See [enum Status] for values." +msgstr "" + +#: doc/classes/PacketPeerDTLS.xml +msgid "" +"Poll the connection to check for incoming packets. Call this frequently to " +"update the status and keep the connection working." +msgstr "" + +#: doc/classes/PacketPeerDTLS.xml +msgid "A status representing a [PacketPeerDTLS] that is disconnected." +msgstr "" + +#: doc/classes/PacketPeerDTLS.xml +msgid "" +"A status representing a [PacketPeerDTLS] that is currently performing the " +"handshake with a remote peer." +msgstr "" + +#: doc/classes/PacketPeerDTLS.xml +msgid "" +"A status representing a [PacketPeerDTLS] that is connected to a remote peer." +msgstr "" + +#: doc/classes/PacketPeerDTLS.xml +msgid "A status representing a [PacketPeerDTLS] in a generic error state." +msgstr "" + +#: doc/classes/PacketPeerDTLS.xml +msgid "" +"An error status that shows a mismatch in the DTLS certificate domain " +"presented by the host and the domain requested for validation." +msgstr "" + +#: doc/classes/PacketPeerStream.xml +msgid "Wrapper to use a PacketPeer over a StreamPeer." +msgstr "" + +#: doc/classes/PacketPeerStream.xml +msgid "" +"PacketStreamPeer provides a wrapper for working using packets over a stream. " +"This allows for using packet based code with StreamPeers. PacketPeerStream " +"implements a custom protocol over the StreamPeer, so the user should not " +"read or write to the wrapped StreamPeer directly." +msgstr "" + +#: doc/classes/PacketPeerStream.xml +msgid "The wrapped [StreamPeer] object." +msgstr "" + +#: doc/classes/PacketPeerUDP.xml +msgid "UDP packet peer." +msgstr "" + +#: doc/classes/PacketPeerUDP.xml +msgid "" +"UDP packet peer. Can be used to send raw UDP packets as well as [Variant]s." +msgstr "" + +#: doc/classes/PacketPeerUDP.xml +msgid "Closes the UDP socket the [PacketPeerUDP] is currently listening on." +msgstr "" + +#: doc/classes/PacketPeerUDP.xml +msgid "" +"Calling this method connects this UDP peer to the given [code]host[/code]/" +"[code]port[/code] pair. UDP is in reality connectionless, so this option " +"only means that incoming packets from different addresses are automatically " +"discarded, and that outgoing packets are always sent to the connected " +"address (future calls to [method set_dest_address] are not allowed). This " +"method does not send any data to the remote peer, to do that, use [method " +"PacketPeer.put_var] or [method PacketPeer.put_packet] as usual. See also " +"[UDPServer].\n" +"[b]Note:[/b] Connecting to the remote peer does not help to protect from " +"malicious attacks like IP spoofing, etc. Think about using an encryption " +"technique like SSL or DTLS if you feel like your application is transferring " +"sensitive information." +msgstr "" + +#: doc/classes/PacketPeerUDP.xml +msgid "" +"Returns the IP of the remote peer that sent the last packet(that was " +"received with [method PacketPeer.get_packet] or [method PacketPeer.get_var])." +msgstr "" + +#: doc/classes/PacketPeerUDP.xml +msgid "" +"Returns the port of the remote peer that sent the last packet(that was " +"received with [method PacketPeer.get_packet] or [method PacketPeer.get_var])." +msgstr "" + +#: doc/classes/PacketPeerUDP.xml +msgid "" +"Returns [code]true[/code] if the UDP socket is open and has been connected " +"to a remote address. See [method connect_to_host]." +msgstr "" + +#: doc/classes/PacketPeerUDP.xml +msgid "Returns whether this [PacketPeerUDP] is listening." +msgstr "" + +#: doc/classes/PacketPeerUDP.xml +msgid "" +"Joins the multicast group specified by [code]multicast_address[/code] using " +"the interface identified by [code]interface_name[/code].\n" +"You can join the same multicast group with multiple interfaces. Use [method " +"IP.get_local_interfaces] to know which are available.\n" +"[b]Note:[/b] Some Android devices might require the " +"[code]CHANGE_WIFI_MULTICAST_STATE[/code] permission for multicast to work." +msgstr "" + +#: doc/classes/PacketPeerUDP.xml +msgid "" +"Removes the interface identified by [code]interface_name[/code] from the " +"multicast group specified by [code]multicast_address[/code]." +msgstr "" + +#: doc/classes/PacketPeerUDP.xml +msgid "" +"Makes this [PacketPeerUDP] listen on the [code]port[/code] binding to " +"[code]bind_address[/code] with a buffer size [code]recv_buf_size[/code].\n" +"If [code]bind_address[/code] is set to [code]\"*\"[/code] (default), the " +"peer will listen on all available addresses (both IPv4 and IPv6).\n" +"If [code]bind_address[/code] is set to [code]\"0.0.0.0\"[/code] (for IPv4) " +"or [code]\"::\"[/code] (for IPv6), the peer will listen on all available " +"addresses matching that IP type.\n" +"If [code]bind_address[/code] is set to any valid address (e.g. " +"[code]\"192.168.1.101\"[/code], [code]\"::1\"[/code], etc), the peer will " +"only listen on the interface with that addresses (or fail if no interface " +"with the given address exists)." +msgstr "" + +#: doc/classes/PacketPeerUDP.xml +msgid "" +"Enable or disable sending of broadcast packets (e.g. " +"[code]set_dest_address(\"255.255.255.255\", 4343)[/code]. This option is " +"disabled by default.\n" +"[b]Note:[/b] Some Android devices might require the " +"[code]CHANGE_WIFI_MULTICAST_STATE[/code] permission and this option to be " +"enabled to receive broadcast packets too." +msgstr "" + +#: doc/classes/PacketPeerUDP.xml +msgid "" +"Sets the destination address and port for sending packets and variables. A " +"hostname will be resolved using DNS if needed.\n" +"[b]Note:[/b] [method set_broadcast_enabled] must be enabled before sending " +"packets to a broadcast address (e.g. [code]255.255.255.255[/code])." +msgstr "" + +#: doc/classes/PacketPeerUDP.xml +msgid "" +"Waits for a packet to arrive on the listening port. See [method listen].\n" +"[b]Note:[/b] [method wait] can't be interrupted once it has been called. " +"This can be worked around by allowing the other party to send a specific " +"\"death pill\" packet like this:\n" +"[codeblock]\n" +"# Server\n" +"socket.set_dest_address(\"127.0.0.1\", 789)\n" +"socket.put_packet(\"Time to stop\".to_ascii())\n" +"\n" +"# Client\n" +"while socket.wait() == OK:\n" +" var data = socket.get_packet().get_string_from_ascii()\n" +" if data == \"Time to stop\":\n" +" return\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Panel.xml +msgid "Provides an opaque background for [Control] children." +msgstr "" + +#: doc/classes/Panel.xml +msgid "" +"Panel is a [Control] that displays an opaque background. It's commonly used " +"as a parent and container for other types of [Control] nodes." +msgstr "" + +#: doc/classes/Panel.xml +msgid "2D Finite State Machine Demo" +msgstr "" + +#: doc/classes/Panel.xml doc/classes/Skeleton.xml doc/classes/SkeletonIK.xml +msgid "3D Inverse Kinematics Demo" +msgstr "" + +#: doc/classes/Panel.xml +msgid "The style of this [Panel]." +msgstr "" + +#: doc/classes/PanelContainer.xml +msgid "Panel container type." +msgstr "" + +#: doc/classes/PanelContainer.xml +msgid "" +"Panel container type. This container fits controls inside of the delimited " +"area of a stylebox. It's useful for giving controls an outline." +msgstr "" + +#: doc/classes/PanelContainer.xml +msgid "The style of [PanelContainer]'s background." +msgstr "" + +#: doc/classes/PanoramaSky.xml +msgid "A type of [Sky] used to draw a background texture." +msgstr "" + +#: doc/classes/PanoramaSky.xml +msgid "" +"A resource referenced in an [Environment] that is used to draw a background. " +"The Panorama sky functions similar to skyboxes in other engines, except it " +"uses an equirectangular sky map instead of a cube map.\n" +"Using an HDR panorama is strongly recommended for accurate, high-quality " +"reflections. Godot supports the Radiance HDR ([code].hdr[/code]) and OpenEXR " +"([code].exr[/code]) image formats for this purpose.\n" +"You can use [url=https://danilw.github.io/GLSL-howto/cubemap_to_panorama_js/" +"cubemap_to_panorama.html]this tool[/url] to convert a cube map to an " +"equirectangular sky map." +msgstr "" + +#: doc/classes/PanoramaSky.xml +msgid "[Texture] to be applied to the PanoramaSky." +msgstr "" + +#: doc/classes/ParallaxBackground.xml +msgid "A node used to create a parallax scrolling background." +msgstr "" + +#: doc/classes/ParallaxBackground.xml +msgid "" +"A ParallaxBackground uses one or more [ParallaxLayer] child nodes to create " +"a parallax effect. Each [ParallaxLayer] can move at a different speed using " +"[member ParallaxLayer.motion_offset]. This creates an illusion of depth in a " +"2D game. If not used with a [Camera2D], you must manually calculate the " +"[member scroll_offset]." +msgstr "" + +#: doc/classes/ParallaxBackground.xml +msgid "The base position offset for all [ParallaxLayer] children." +msgstr "" + +#: doc/classes/ParallaxBackground.xml +msgid "The base motion scale for all [ParallaxLayer] children." +msgstr "" + +#: doc/classes/ParallaxBackground.xml +msgid "" +"If [code]true[/code], elements in [ParallaxLayer] child aren't affected by " +"the zoom level of the camera." +msgstr "" + +#: doc/classes/ParallaxBackground.xml +msgid "" +"Top-left limits for scrolling to begin. If the camera is outside of this " +"limit, the background will stop scrolling. Must be lower than [member " +"scroll_limit_end] to work." +msgstr "" + +#: doc/classes/ParallaxBackground.xml +msgid "" +"Bottom-right limits for scrolling to end. If the camera is outside of this " +"limit, the background will stop scrolling. Must be higher than [member " +"scroll_limit_begin] to work." +msgstr "" + +#: doc/classes/ParallaxBackground.xml +msgid "" +"The ParallaxBackground's scroll value. Calculated automatically when using a " +"[Camera2D], but can be used to manually manage scrolling when no camera is " +"present." +msgstr "" + +#: doc/classes/ParallaxLayer.xml +msgid "A parallax scrolling layer to be used with [ParallaxBackground]." +msgstr "" + +#: doc/classes/ParallaxLayer.xml +msgid "" +"A ParallaxLayer must be the child of a [ParallaxBackground] node. Each " +"ParallaxLayer can be set to move at different speeds relative to the camera " +"movement or the [member ParallaxBackground.scroll_offset] value.\n" +"This node's children will be affected by its scroll offset.\n" +"[b]Note:[/b] Any changes to this node's position and scale made after it " +"enters the scene will be ignored." +msgstr "" + +#: doc/classes/ParallaxLayer.xml +msgid "" +"The ParallaxLayer's [Texture] mirroring. Useful for creating an infinite " +"scrolling background. If an axis is set to [code]0[/code], the [Texture] " +"will not be mirrored." +msgstr "" + +#: doc/classes/ParallaxLayer.xml +msgid "" +"The ParallaxLayer's offset relative to the parent ParallaxBackground's " +"[member ParallaxBackground.scroll_offset]." +msgstr "" + +#: doc/classes/ParallaxLayer.xml +msgid "" +"Multiplies the ParallaxLayer's motion. If an axis is set to [code]0[/code], " +"it will not scroll." +msgstr "" + +#: doc/classes/Particles.xml +msgid "GPU-based 3D particle emitter." +msgstr "" + +#: doc/classes/Particles.xml +msgid "" +"3D particle node used to create a variety of particle systems and effects. " +"[Particles] features an emitter that generates some number of particles at a " +"given rate.\n" +"Use the [code]process_material[/code] property to add a [ParticlesMaterial] " +"to configure particle appearance and behavior. Alternatively, you can add a " +"[ShaderMaterial] which will be applied to all particles.\n" +"[b]Note:[/b] [Particles] only work when using the GLES3 renderer. If using " +"the GLES2 renderer, use [CPUParticles] instead. You can convert [Particles] " +"to [CPUParticles] by selecting the node, clicking the [b]Particles[/b] menu " +"at the top of the 3D editor viewport then choosing [b]Convert to " +"CPUParticles[/b].\n" +"[b]Note:[/b] On macOS, [Particles] rendering is much slower than " +"[CPUParticles] due to transform feedback being implemented on the CPU " +"instead of the GPU. Consider using [CPUParticles] instead when targeting " +"macOS.\n" +"[b]Note:[/b] After working on a Particles node, remember to update its " +"[member visibility_aabb] by selecting it, clicking the [b]Particles[/b] menu " +"at the top of the 3D editor viewport then choose [b]Generate Visibility " +"AABB[/b]. Otherwise, particles may suddenly disappear depending on the " +"camera position and angle." +msgstr "" + +#: doc/classes/Particles.xml +msgid "Controlling thousands of fish with Particles" +msgstr "" + +#: doc/classes/Particles.xml +msgid "" +"Returns the axis-aligned bounding box that contains all the particles that " +"are active in the current frame." +msgstr "" + +#: doc/classes/Particles.xml +msgid "Returns the [Mesh] that is drawn at index [code]pass[/code]." +msgstr "" + +#: doc/classes/Particles.xml +msgid "Restarts the particle emission, clearing existing particles." +msgstr "" + +#: doc/classes/Particles.xml +msgid "Sets the [Mesh] that is drawn at index [code]pass[/code]." +msgstr "" + +#: doc/classes/Particles.xml +msgid "[Mesh] that is drawn for the first draw pass." +msgstr "" + +#: doc/classes/Particles.xml +msgid "[Mesh] that is drawn for the second draw pass." +msgstr "" + +#: doc/classes/Particles.xml +msgid "[Mesh] that is drawn for the third draw pass." +msgstr "" + +#: doc/classes/Particles.xml +msgid "[Mesh] that is drawn for the fourth draw pass." +msgstr "" + +#: doc/classes/Particles.xml +msgid "The number of draw passes when rendering particles." +msgstr "" + +#: doc/classes/Particles.xml +msgid "" +"Time ratio between each emission. If [code]0[/code], particles are emitted " +"continuously. If [code]1[/code], all particles are emitted simultaneously." +msgstr "" + +#: doc/classes/Particles.xml +msgid "" +"If [code]true[/code], only [code]amount[/code] particles will be emitted." +msgstr "" + +#: doc/classes/Particles.xml +msgid "" +"Amount of time to preprocess the particles before animation starts. Lets you " +"start the animation some time after particles have started emitting." +msgstr "" + +#: doc/classes/Particles.xml doc/classes/Particles2D.xml +msgid "" +"[Material] for processing particles. Can be a [ParticlesMaterial] or a " +"[ShaderMaterial]." +msgstr "" + +#: doc/classes/Particles.xml +msgid "Emission randomness ratio." +msgstr "" + +#: doc/classes/Particles.xml +msgid "" +"Speed scaling ratio. A value of [code]0[/code] can be used to pause the " +"particles." +msgstr "" + +#: doc/classes/Particles.xml +msgid "" +"The [AABB] that determines the node's region which needs to be visible on " +"screen for the particle system to be active.\n" +"Grow the box if particles suddenly appear/disappear when the node enters/" +"exits the screen. The [AABB] can be grown via code or with the [b]Particles " +"→ Generate AABB[/b] editor tool.\n" +"[b]Note:[/b] If the [ParticlesMaterial] in use is configured to cast " +"shadows, you may want to enlarge this AABB to ensure the shadow is updated " +"when particles are off-screen." +msgstr "" + +#: doc/classes/Particles.xml +msgid "Maximum number of draw passes supported." +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "GPU-based 2D particle emitter." +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D particle node used to create a variety of particle systems and effects. " +"[Particles2D] features an emitter that generates some number of particles at " +"a given rate.\n" +"Use the [code]process_material[/code] property to add a [ParticlesMaterial] " +"to configure particle appearance and behavior. Alternatively, you can add a " +"[ShaderMaterial] which will be applied to all particles.\n" +"[b]Note:[/b] [Particles2D] only work when using the GLES3 renderer. If using " +"the GLES2 renderer, use [CPUParticles2D] instead. You can convert " +"[Particles2D] to [CPUParticles2D] by selecting the node, clicking the " +"[b]Particles[/b] menu at the top of the 2D editor viewport then choosing " +"[b]Convert to CPUParticles2D[/b].\n" +"[b]Note:[/b] On macOS, [Particles2D] rendering is much slower than " +"[CPUParticles2D] due to transform feedback being implemented on the CPU " +"instead of the GPU. Consider using [CPUParticles2D] instead when targeting " +"macOS.\n" +"[b]Note:[/b] After working on a Particles node, remember to update its " +"[member visibility_rect] by selecting it, clicking the [b]Particles[/b] menu " +"at the top of the 2D editor viewport then choose [b]Generate Visibility " +"Rect[/b]. Otherwise, particles may suddenly disappear depending on the " +"camera position and angle.\n" +"[b]Note:[/b] Unlike [CPUParticles2D], [Particles2D] currently ignore the " +"texture region defined in [AtlasTexture]s." +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "Particle systems (2D)" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "Returns a rectangle containing the positions of all existing particles." +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "Restarts all the existing particles." +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"The [Rect2] that determines the node's region which needs to be visible on " +"screen for the particle system to be active.\n" +"Grow the rect if particles suddenly appear/disappear when the node enters/" +"exits the screen. The [Rect2] can be grown via code or with the [b]Particles " +"→ Generate Visibility Rect[/b] editor tool." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "Particle properties for [Particles] and [Particles2D] nodes." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"ParticlesMaterial defines particle properties and behavior. It is used in " +"the [code]process_material[/code] of [Particles] and [Particles2D] emitter " +"nodes.\n" +"Some of this material's properties are applied to each particle when " +"emitted, while others can have a [CurveTexture] applied to vary values over " +"the lifetime of the particle.\n" +"When a randomness ratio is applied to a property it is used to scale that " +"property by a random amount. The random ratio is used to interpolate between " +"[code]1.0[/code] and a random number less than one, the result is multiplied " +"by the property to obtain the randomized property. For example a random " +"ratio of [code]0.4[/code] would scale the original property between " +"[code]0.4-1.0[/code] of its original value." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "Returns [code]true[/code] if the specified flag is enabled." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "Returns the randomness ratio associated with the specified parameter." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "Returns the [Texture] used by the specified parameter." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"If [code]true[/code], enables the specified flag. See [enum Flags] for " +"options." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "Sets the specified [enum Parameter]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "Sets the randomness ratio for the specified [enum Parameter]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "Sets the [Texture] for the specified [enum Parameter]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Initial rotation applied to each particle, in degrees.\n" +"[b]Note:[/b] Only applied when [member flag_disable_z] or [member " +"flag_rotate_y] are [code]true[/code] or the [SpatialMaterial] being used to " +"draw the particle is using [constant SpatialMaterial.BILLBOARD_PARTICLES]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "Each particle's rotation will be animated along this [CurveTexture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Initial angular velocity applied to each particle in [i]degrees[/i] per " +"second. Sets the speed of rotation of the particle.\n" +"[b]Note:[/b] Only applied when [member flag_disable_z] or [member " +"flag_rotate_y] are [code]true[/code] or the [SpatialMaterial] being used to " +"draw the particle is using [constant SpatialMaterial.BILLBOARD_PARTICLES]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "Each particle's angular velocity will vary along this [CurveTexture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "Each particle's animation offset will vary along this [CurveTexture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "Each particle's animation speed will vary along this [CurveTexture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Each particle's initial color. If the [Particles2D]'s [code]texture[/code] " +"is defined, it will be multiplied by this color. To have particle display " +"color in a [SpatialMaterial] make sure to set [member SpatialMaterial." +"vertex_color_use_as_albedo] to [code]true[/code]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "Damping will vary along this [CurveTexture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"The box's extents if [code]emission_shape[/code] is set to [constant " +"EMISSION_SHAPE_BOX]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Particle color will be modulated by color determined by sampling this " +"texture at the same point as the [member emission_point_texture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Particle velocity and rotation will be set by sampling this texture at the " +"same point as the [member emission_point_texture]. Used only in [constant " +"EMISSION_SHAPE_DIRECTED_POINTS]. Can be created automatically from mesh or " +"node by selecting \"Create Emission Points from Mesh/Node\" under the " +"\"Particles\" tool in the toolbar." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"The number of emission points if [code]emission_shape[/code] is set to " +"[constant EMISSION_SHAPE_POINTS] or [constant " +"EMISSION_SHAPE_DIRECTED_POINTS]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Particles will be emitted at positions determined by sampling this texture " +"at a random position. Used with [constant EMISSION_SHAPE_POINTS] and " +"[constant EMISSION_SHAPE_DIRECTED_POINTS]. Can be created automatically from " +"mesh or node by selecting \"Create Emission Points from Mesh/Node\" under " +"the \"Particles\" tool in the toolbar." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"The axis of the ring when using the emitter [constant EMISSION_SHAPE_RING]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"The height of the ring when using the emitter [constant EMISSION_SHAPE_RING]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"The inner radius of the ring when using the emitter [constant " +"EMISSION_SHAPE_RING]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"The radius of the ring when using the emitter [constant EMISSION_SHAPE_RING]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Particles will be emitted inside this region. Use [enum EmissionShape] " +"constants for values." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"The sphere's radius if [code]emission_shape[/code] is set to [constant " +"EMISSION_SHAPE_SPHERE]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "Amount of [member spread] along the Y axis." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "Each particle's hue will vary along this [CurveTexture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Each particle's linear acceleration will vary along this [CurveTexture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Orbital velocity applied to each particle. Makes the particles circle around " +"origin. Specified in number of full rotations around origin per second.\n" +"[b]Note:[/b] Only available when [member flag_disable_z] is [code]true[/" +"code]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "Each particle's orbital velocity will vary along this [CurveTexture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Each particle's radial acceleration will vary along this [CurveTexture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "Each particle's scale will vary along this [CurveTexture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Each particle's tangential acceleration will vary along this [CurveTexture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "Trail particles' color will vary along this [GradientTexture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Emitter will emit [code]amount[/code] divided by [code]trail_divisor[/code] " +"particles. The remaining particles will be used as trail(s)." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "Trail particles' size will vary along this [CurveTexture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_texture] to set initial velocity properties." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_texture] to set angular velocity properties." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_texture] to set orbital velocity properties." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_texture] to set linear acceleration properties." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_texture] to set radial acceleration properties." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_texture] to set tangential acceleration properties." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_texture] to set damping properties." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_texture] to set angle properties." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_texture] to set scale properties." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_texture] to set hue variation properties." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_texture] to set animation speed properties." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_texture] to set animation offset properties." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "Use with [method set_flag] to set [member flag_align_y]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "Use with [method set_flag] to set [member flag_rotate_y]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "Use with [method set_flag] to set [member flag_disable_z]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Particles will be emitted at a position determined by sampling a random " +"point on the [member emission_point_texture]. Particle color will be " +"modulated by [member emission_color_texture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml +msgid "" +"Particles will be emitted at a position determined by sampling a random " +"point on the [member emission_point_texture]. Particle velocity and rotation " +"will be set based on [member emission_normal_texture]. Particle color will " +"be modulated by [member emission_color_texture]." +msgstr "" + +#: doc/classes/Path.xml +msgid "Contains a [Curve3D] path for [PathFollow] nodes to follow." +msgstr "" + +#: doc/classes/Path.xml +msgid "" +"Can have [PathFollow] child nodes moving along the [Curve3D]. See " +"[PathFollow] for more information on the usage.\n" +"Note that the path is considered as relative to the moved nodes (children of " +"[PathFollow]). As such, the curve should usually start with a zero vector " +"[code](0, 0, 0)[/code]." +msgstr "" + +#: doc/classes/Path.xml +msgid "A [Curve3D] describing the path." +msgstr "" + +#: doc/classes/Path.xml +msgid "Emitted when the [member curve] changes." +msgstr "" + +#: doc/classes/Path2D.xml +msgid "Contains a [Curve2D] path for [PathFollow2D] nodes to follow." +msgstr "" + +#: doc/classes/Path2D.xml +msgid "" +"Can have [PathFollow2D] child nodes moving along the [Curve2D]. See " +"[PathFollow2D] for more information on usage.\n" +"[b]Note:[/b] The path is considered as relative to the moved nodes (children " +"of [PathFollow2D]). As such, the curve should usually start with a zero " +"vector ([code](0, 0)[/code])." +msgstr "" + +#: doc/classes/Path2D.xml +msgid "A [Curve2D] describing the path." +msgstr "" + +#: doc/classes/PathFollow.xml +msgid "Point sampler for a [Path]." +msgstr "" + +#: doc/classes/PathFollow.xml +msgid "" +"This node takes its parent [Path], and returns the coordinates of a point " +"within it, given a distance from the first vertex.\n" +"It is useful for making other nodes follow a path, without coding the " +"movement pattern. For that, the nodes must be children of this node. The " +"descendant nodes will then move accordingly when setting an offset in this " +"node." +msgstr "" + +#: doc/classes/PathFollow.xml +msgid "" +"If [code]true[/code], the position between two cached points is interpolated " +"cubically, and linearly otherwise.\n" +"The points along the [Curve3D] of the [Path] are precomputed before use, for " +"faster calculations. The point at the requested offset is then calculated " +"interpolating between two adjacent cached points. This may present a problem " +"if the curve makes sharp turns, as the cached points may not follow the " +"curve closely enough.\n" +"There are two answers to this problem: either increase the number of cached " +"points and increase memory consumption, or make a cubic interpolation " +"between two points at the cost of (slightly) slower calculations." +msgstr "" + +#: doc/classes/PathFollow.xml doc/classes/PathFollow2D.xml +msgid "The node's offset along the curve." +msgstr "" + +#: doc/classes/PathFollow.xml doc/classes/PathFollow2D.xml +msgid "" +"If [code]true[/code], any offset outside the path's length will wrap around, " +"instead of stopping at the ends. Use it for cyclic paths." +msgstr "" + +#: doc/classes/PathFollow.xml +msgid "" +"The distance from the first vertex, measured in 3D units along the path. " +"This sets this node's position to a point within the path." +msgstr "" + +#: doc/classes/PathFollow.xml +msgid "" +"Allows or forbids rotation on one or more axes, depending on the [enum " +"RotationMode] constants being used." +msgstr "" + +#: doc/classes/PathFollow.xml +msgid "" +"The distance from the first vertex, considering 0.0 as the first vertex and " +"1.0 as the last. This is just another way of expressing the offset within " +"the path, as the offset supplied is multiplied internally by the path's " +"length." +msgstr "" + +#: doc/classes/PathFollow.xml doc/classes/PathFollow2D.xml +msgid "The node's offset perpendicular to the curve." +msgstr "" + +#: doc/classes/PathFollow.xml +msgid "Forbids the PathFollow to rotate." +msgstr "" + +#: doc/classes/PathFollow.xml +msgid "Allows the PathFollow to rotate in the Y axis only." +msgstr "" + +#: doc/classes/PathFollow.xml +msgid "Allows the PathFollow to rotate in both the X, and Y axes." +msgstr "" + +#: doc/classes/PathFollow.xml +msgid "Allows the PathFollow to rotate in any axis." +msgstr "" + +#: doc/classes/PathFollow.xml +msgid "" +"Uses the up vector information in a [Curve3D] to enforce orientation. This " +"rotation mode requires the [Path]'s [member Curve3D.up_vector_enabled] " +"property to be set to [code]true[/code]." +msgstr "" + +#: doc/classes/PathFollow2D.xml +msgid "Point sampler for a [Path2D]." +msgstr "" + +#: doc/classes/PathFollow2D.xml +msgid "" +"This node takes its parent [Path2D], and returns the coordinates of a point " +"within it, given a distance from the first vertex.\n" +"It is useful for making other nodes follow a path, without coding the " +"movement pattern. For that, the nodes must be children of this node. The " +"descendant nodes will then move accordingly when setting an offset in this " +"node." +msgstr "" + +#: doc/classes/PathFollow2D.xml +msgid "" +"If [code]true[/code], the position between two cached points is interpolated " +"cubically, and linearly otherwise.\n" +"The points along the [Curve2D] of the [Path2D] are precomputed before use, " +"for faster calculations. The point at the requested offset is then " +"calculated interpolating between two adjacent cached points. This may " +"present a problem if the curve makes sharp turns, as the cached points may " +"not follow the curve closely enough.\n" +"There are two answers to this problem: either increase the number of cached " +"points and increase memory consumption, or make a cubic interpolation " +"between two points at the cost of (slightly) slower calculations." +msgstr "" + +#: doc/classes/PathFollow2D.xml +msgid "" +"How far to look ahead of the curve to calculate the tangent if the node is " +"rotating. E.g. shorter lookaheads will lead to faster rotations." +msgstr "" + +#: doc/classes/PathFollow2D.xml +msgid "The distance along the path in pixels." +msgstr "" + +#: doc/classes/PathFollow2D.xml +msgid "" +"If [code]true[/code], this node rotates to follow the path, making its " +"descendants rotate." +msgstr "" + +#: doc/classes/PathFollow2D.xml +msgid "" +"The distance along the path as a number in the range 0.0 (for the first " +"vertex) to 1.0 (for the last). This is just another way of expressing the " +"offset within the path, as the offset supplied is multiplied internally by " +"the path's length." +msgstr "" + +#: doc/classes/PCKPacker.xml +msgid "Creates packages that can be loaded into a running project." +msgstr "" + +#: doc/classes/PCKPacker.xml +msgid "" +"The [PCKPacker] is used to create packages that can be loaded into a running " +"project using [method ProjectSettings.load_resource_pack].\n" +"[codeblock]\n" +"var packer = PCKPacker.new()\n" +"packer.pck_start(\"test.pck\")\n" +"packer.add_file(\"res://text.txt\", \"text.txt\")\n" +"packer.flush()\n" +"[/codeblock]\n" +"The above [PCKPacker] creates package [code]test.pck[/code], then adds a " +"file named [code]text.txt[/code] at the root of the package." +msgstr "" + +#: doc/classes/PCKPacker.xml +msgid "" +"Adds the [code]source_path[/code] file to the current PCK package at the " +"[code]pck_path[/code] internal path (should start with [code]res://[/code])." +msgstr "" + +#: doc/classes/PCKPacker.xml +msgid "" +"Writes the files specified using all [method add_file] calls since the last " +"flush. If [code]verbose[/code] is [code]true[/code], a list of files added " +"will be printed to the console for easier debugging." +msgstr "" + +#: doc/classes/PCKPacker.xml +msgid "" +"Creates a new PCK file with the name [code]pck_name[/code]. The [code].pck[/" +"code] file extension isn't added automatically, so it should be part of " +"[code]pck_name[/code] (even though it's not required)." +msgstr "" + +#: doc/classes/Performance.xml +msgid "Exposes performance-related data." +msgstr "" + +#: doc/classes/Performance.xml +msgid "" +"This class provides access to a number of different monitors related to " +"performance, such as memory usage, draw calls, and FPS. These are the same " +"as the values displayed in the [b]Monitor[/b] tab in the editor's " +"[b]Debugger[/b] panel. By using the [method get_monitor] method of this " +"class, you can access this data from your code.\n" +"[b]Note:[/b] A few of these monitors are only available in debug mode and " +"will always return 0 when used in a release build.\n" +"[b]Note:[/b] Many of these monitors are not updated in real-time, so there " +"may be a short delay between changes." +msgstr "" + +#: doc/classes/Performance.xml +msgid "" +"Returns the value of one of the available monitors. You should provide one " +"of the [enum Monitor] constants as the argument, like this:\n" +"[codeblock]\n" +"print(Performance.get_monitor(Performance.TIME_FPS)) # Prints the FPS to the " +"console\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Performance.xml +msgid "Number of frames per second." +msgstr "" + +#: doc/classes/Performance.xml +msgid "Time it took to complete one frame, in seconds." +msgstr "" + +#: doc/classes/Performance.xml +msgid "Time it took to complete one physics frame, in seconds." +msgstr "" + +#: doc/classes/Performance.xml +msgid "" +"Static memory currently used, in bytes. Not available in release builds." +msgstr "" + +#: doc/classes/Performance.xml +msgid "" +"Dynamic memory currently used, in bytes. Not available in release builds." +msgstr "" + +#: doc/classes/Performance.xml +msgid "Available static memory. Not available in release builds." +msgstr "" + +#: doc/classes/Performance.xml +msgid "Available dynamic memory. Not available in release builds." +msgstr "" + +#: doc/classes/Performance.xml +msgid "" +"Largest amount of memory the message queue buffer has used, in bytes. The " +"message queue is used for deferred functions calls and notifications." +msgstr "" + +#: doc/classes/Performance.xml +msgid "Number of objects currently instanced (including nodes)." +msgstr "" + +#: doc/classes/Performance.xml +msgid "Number of resources currently used." +msgstr "" + +#: doc/classes/Performance.xml +msgid "" +"Number of nodes currently instanced in the scene tree. This also includes " +"the root node." +msgstr "" + +#: doc/classes/Performance.xml +msgid "" +"Number of orphan nodes, i.e. nodes which are not parented to a node of the " +"scene tree." +msgstr "" + +#: doc/classes/Performance.xml +msgid "3D objects drawn per frame." +msgstr "" + +#: doc/classes/Performance.xml +msgid "Vertices drawn per frame. 3D only." +msgstr "" + +#: doc/classes/Performance.xml +msgid "Material changes per frame. 3D only." +msgstr "" + +#: doc/classes/Performance.xml +msgid "Shader changes per frame. 3D only." +msgstr "" + +#: doc/classes/Performance.xml +msgid "Render surface changes per frame. 3D only." +msgstr "" + +#: doc/classes/Performance.xml +msgid "Draw calls per frame. 3D only." +msgstr "" + +#: doc/classes/Performance.xml +msgid "Items or joined items drawn per frame." +msgstr "" + +#: doc/classes/Performance.xml +msgid "Draw calls per frame." +msgstr "" + +#: doc/classes/Performance.xml doc/classes/VisualServer.xml +msgid "" +"The amount of video memory used, i.e. texture and vertex memory combined." +msgstr "" + +#: doc/classes/Performance.xml doc/classes/VisualServer.xml +msgid "The amount of texture memory used." +msgstr "" + +#: doc/classes/Performance.xml doc/classes/VisualServer.xml +msgid "The amount of vertex memory used." +msgstr "" + +#: doc/classes/Performance.xml doc/classes/VisualServer.xml +msgid "" +"Unimplemented in the GLES2 and GLES3 rendering backends, always returns 0." +msgstr "" + +#: doc/classes/Performance.xml +msgid "Number of active [RigidBody2D] nodes in the game." +msgstr "" + +#: doc/classes/Performance.xml +msgid "Number of collision pairs in the 2D physics engine." +msgstr "" + +#: doc/classes/Performance.xml +msgid "Number of islands in the 2D physics engine." +msgstr "" + +#: doc/classes/Performance.xml +msgid "Number of active [RigidBody] and [VehicleBody] nodes in the game." +msgstr "" + +#: doc/classes/Performance.xml +msgid "Number of collision pairs in the 3D physics engine." +msgstr "" + +#: doc/classes/Performance.xml +msgid "Number of islands in the 3D physics engine." +msgstr "" + +#: doc/classes/Performance.xml +msgid "Output latency of the [AudioServer]." +msgstr "" + +#: doc/classes/Performance.xml +msgid "Represents the size of the [enum Monitor] enum." +msgstr "" + +#: doc/classes/PHashTranslation.xml +msgid "Optimized translation." +msgstr "" + +#: doc/classes/PHashTranslation.xml +msgid "" +"Optimized translation. Uses real-time compressed translations, which results " +"in very small dictionaries." +msgstr "" + +#: doc/classes/PHashTranslation.xml +msgid "" +"Generates and sets an optimized translation from the given [Translation] " +"resource." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml +msgid "Direct access object to a physics body in the [Physics2DServer]." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml +msgid "" +"Provides direct access to a physics body in the [Physics2DServer], allowing " +"safe changes to physics properties. This object is passed via the direct " +"state callback of rigid/character bodies, and is intended for changing the " +"direct state of that body. See [method RigidBody2D._integrate_forces]." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml +#: doc/classes/Physics2DDirectSpaceState.xml +#: doc/classes/PhysicsDirectBodyState.xml +#: doc/classes/PhysicsDirectSpaceState.xml doc/classes/RayCast.xml +msgid "Ray-casting" +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml doc/classes/RigidBody2D.xml +msgid "Adds a constant directional force without affecting rotation." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml +#: doc/classes/PhysicsDirectBodyState.xml doc/classes/RigidBody2D.xml +msgid "" +"Adds a positioned force to the body. Both the force and the offset from the " +"body origin are in global coordinates." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml doc/classes/RigidBody2D.xml +msgid "Adds a constant rotational force." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml doc/classes/RigidBody2D.xml +msgid "Applies a directional impulse without affecting rotation." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml +msgid "" +"Applies a positioned impulse to the body. An impulse is time-independent! " +"Applying an impulse every frame would result in a framerate-dependent force. " +"For this reason, it should only be used when simulating one-time impacts " +"(use the \"_force\" functions otherwise). The offset uses the rotation of " +"the global coordinate system, but is centered at the object's origin." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml doc/classes/RigidBody2D.xml +msgid "Applies a rotational impulse to the body." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml +#: doc/classes/PhysicsDirectBodyState.xml +msgid "Returns the collider's [RID]." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml +#: doc/classes/PhysicsDirectBodyState.xml +msgid "Returns the collider's object id." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml +msgid "" +"Returns the collider object. This depends on how it was created (will return " +"a scene node if such was used to create it)." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml +#: doc/classes/PhysicsDirectBodyState.xml +msgid "Returns the contact position in the collider." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml +#: doc/classes/PhysicsDirectBodyState.xml +msgid "Returns the collider's shape index." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml +msgid "" +"Returns the collided shape's metadata. This metadata is different from " +"[method Object.get_meta], and is set with [method Physics2DServer." +"shape_set_data]." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml +#: doc/classes/PhysicsDirectBodyState.xml +msgid "Returns the linear velocity vector at the collider's contact point." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml +msgid "" +"Returns the number of contacts this body has with other bodies.\n" +"[b]Note:[/b] By default, this returns 0 unless bodies are configured to " +"monitor contacts. See [member RigidBody2D.contact_monitor]." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml +#: doc/classes/PhysicsDirectBodyState.xml +msgid "Returns the local normal at the contact point." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml +#: doc/classes/PhysicsDirectBodyState.xml +msgid "Returns the local position of the contact point." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml +#: doc/classes/PhysicsDirectBodyState.xml +msgid "Returns the local shape index of the collision." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml +#: doc/classes/PhysicsDirectBodyState.xml +msgid "Returns the current state of the space, useful for queries." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml +#: doc/classes/PhysicsDirectBodyState.xml +msgid "" +"Returns the body's velocity at the given relative position, including both " +"translation and rotation." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml +#: doc/classes/PhysicsDirectBodyState.xml +msgid "Calls the built-in force integration code." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml doc/classes/RigidBody2D.xml +msgid "The body's rotational velocity in [i]radians[/i] per second." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml +#: doc/classes/PhysicsDirectBodyState.xml +msgid "The inverse of the inertia of the body." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml +#: doc/classes/PhysicsDirectBodyState.xml +msgid "The inverse of the mass of the body." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml +msgid "The body's linear velocity in pixels per second." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml +#: doc/classes/PhysicsDirectBodyState.xml +msgid "If [code]true[/code], this body is currently sleeping (not active)." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml +#: doc/classes/PhysicsDirectBodyState.xml +msgid "The timestep (delta) used for the simulation." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml +#: doc/classes/PhysicsDirectBodyState.xml +msgid "" +"The rate at which the body stops rotating, if there are not any other forces " +"moving it." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml +#: doc/classes/PhysicsDirectBodyState.xml +msgid "The total gravity vector being currently applied to this body." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml +#: doc/classes/PhysicsDirectBodyState.xml +msgid "" +"The rate at which the body stops moving, if there are not any other forces " +"moving it." +msgstr "" + +#: doc/classes/Physics2DDirectBodyState.xml +#: doc/classes/PhysicsDirectBodyState.xml +msgid "The body's transformation matrix." +msgstr "" + +#: doc/classes/Physics2DDirectSpaceState.xml +msgid "Direct access object to a space in the [Physics2DServer]." +msgstr "" + +#: doc/classes/Physics2DDirectSpaceState.xml +msgid "" +"Direct access object to a space in the [Physics2DServer]. It's used mainly " +"to do queries against objects and areas residing in a given space." +msgstr "" + +#: doc/classes/Physics2DDirectSpaceState.xml +msgid "" +"Checks how far a [Shape2D] can move without colliding. All the parameters " +"for the query, including the shape and the motion, are supplied through a " +"[Physics2DShapeQueryParameters] object.\n" +"Returns an array with the safe and unsafe proportions (between 0 and 1) of " +"the motion. The safe proportion is the maximum fraction of the motion that " +"can be made without a collision. The unsafe proportion is the minimum " +"fraction of the distance that must be moved for a collision. If no collision " +"is detected a result of [code][1.0, 1.0][/code] will be returned.\n" +"[b]Note:[/b] Any [Shape2D]s that the shape is already colliding with e.g. " +"inside of, will be ignored. Use [method collide_shape] to determine the " +"[Shape2D]s that the shape is already colliding with." +msgstr "" + +#: doc/classes/Physics2DDirectSpaceState.xml +msgid "" +"Checks the intersections of a shape, given through a " +"[Physics2DShapeQueryParameters] object, against the space. The resulting " +"array contains a list of points where the shape intersects another. Like " +"with [method intersect_shape], the number of returned results can be limited " +"to save processing time." +msgstr "" + +#: doc/classes/Physics2DDirectSpaceState.xml +msgid "" +"Checks the intersections of a shape, given through a " +"[Physics2DShapeQueryParameters] object, against the space. If it collides " +"with more than one shape, the nearest one is selected. If the shape did not " +"intersect anything, then an empty dictionary is returned instead.\n" +"[b]Note:[/b] This method does not take into account the [code]motion[/code] " +"property of the object. The returned object is a dictionary containing the " +"following fields:\n" +"[code]collider_id[/code]: The colliding object's ID.\n" +"[code]linear_velocity[/code]: The colliding object's velocity [Vector2]. If " +"the object is an [Area2D], the result is [code](0, 0)[/code].\n" +"[code]metadata[/code]: The intersecting shape's metadata. This metadata is " +"different from [method Object.get_meta], and is set with [method " +"Physics2DServer.shape_set_data].\n" +"[code]normal[/code]: The object's surface normal at the intersection point.\n" +"[code]point[/code]: The intersection point.\n" +"[code]rid[/code]: The intersecting object's [RID].\n" +"[code]shape[/code]: The shape index of the colliding shape." +msgstr "" + +#: doc/classes/Physics2DDirectSpaceState.xml +msgid "" +"Checks whether a point is inside any solid shape. The shapes the point is " +"inside of are returned in an array containing dictionaries with the " +"following fields:\n" +"[code]collider[/code]: The colliding object.\n" +"[code]collider_id[/code]: The colliding object's ID.\n" +"[code]metadata[/code]: The intersecting shape's metadata. This metadata is " +"different from [method Object.get_meta], and is set with [method " +"Physics2DServer.shape_set_data].\n" +"[code]rid[/code]: The intersecting object's [RID].\n" +"[code]shape[/code]: The shape index of the colliding shape.\n" +"The number of intersections can be limited with the [code]max_results[/code] " +"parameter, to reduce the processing time.\n" +"Additionally, the method can take an [code]exclude[/code] array of objects " +"or [RID]s that are to be excluded from collisions, a [code]collision_mask[/" +"code] bitmask representing the physics layers to check in, or booleans to " +"determine if the ray should collide with [PhysicsBody2D]s or [Area2D]s, " +"respectively.\n" +"[b]Note:[/b] [ConcavePolygonShape2D]s and [CollisionPolygon2D]s in " +"[code]Segments[/code] build mode are not solid shapes. Therefore, they will " +"not be detected." +msgstr "" + +#: doc/classes/Physics2DDirectSpaceState.xml +msgid "" +"Checks whether a point is inside any solid shape, in a specific canvas layer " +"given by [code]canvas_instance_id[/code]. The shapes the point is inside of " +"are returned in an array containing dictionaries with the following fields:\n" +"[code]collider[/code]: The colliding object.\n" +"[code]collider_id[/code]: The colliding object's ID.\n" +"[code]metadata[/code]: The intersecting shape's metadata. This metadata is " +"different from [method Object.get_meta], and is set with [method " +"Physics2DServer.shape_set_data].\n" +"[code]rid[/code]: The intersecting object's [RID].\n" +"[code]shape[/code]: The shape index of the colliding shape.\n" +"The number of intersections can be limited with the [code]max_results[/code] " +"parameter, to reduce the processing time.\n" +"Additionally, the method can take an [code]exclude[/code] array of objects " +"or [RID]s that are to be excluded from collisions, a [code]collision_mask[/" +"code] bitmask representing the physics layers to check in, or booleans to " +"determine if the ray should collide with [PhysicsBody2D]s or [Area2D]s, " +"respectively.\n" +"[b]Note:[/b] [ConcavePolygonShape2D]s and [CollisionPolygon2D]s in " +"[code]Segments[/code] build mode are not solid shapes. Therefore, they will " +"not be detected." +msgstr "" + +#: doc/classes/Physics2DDirectSpaceState.xml +msgid "" +"Intersects a ray in a given space. The returned object is a dictionary with " +"the following fields:\n" +"[code]collider[/code]: The colliding object.\n" +"[code]collider_id[/code]: The colliding object's ID.\n" +"[code]metadata[/code]: The intersecting shape's metadata. This metadata is " +"different from [method Object.get_meta], and is set with [method " +"Physics2DServer.shape_set_data].\n" +"[code]normal[/code]: The object's surface normal at the intersection point.\n" +"[code]position[/code]: The intersection point.\n" +"[code]rid[/code]: The intersecting object's [RID].\n" +"[code]shape[/code]: The shape index of the colliding shape.\n" +"If the ray did not intersect anything, then an empty dictionary is returned " +"instead.\n" +"Additionally, the method can take an [code]exclude[/code] array of objects " +"or [RID]s that are to be excluded from collisions, a [code]collision_mask[/" +"code] bitmask representing the physics layers to check in, or booleans to " +"determine if the ray should collide with [PhysicsBody2D]s or [Area2D]s, " +"respectively." +msgstr "" + +#: doc/classes/Physics2DDirectSpaceState.xml +msgid "" +"Checks the intersections of a shape, given through a " +"[Physics2DShapeQueryParameters] object, against the space. The intersected " +"shapes are returned in an array containing dictionaries with the following " +"fields:\n" +"[code]collider[/code]: The colliding object.\n" +"[code]collider_id[/code]: The colliding object's ID.\n" +"[code]metadata[/code]: The intersecting shape's metadata. This metadata is " +"different from [method Object.get_meta], and is set with [method " +"Physics2DServer.shape_set_data].\n" +"[code]rid[/code]: The intersecting object's [RID].\n" +"[code]shape[/code]: The shape index of the colliding shape.\n" +"The number of intersections can be limited with the [code]max_results[/code] " +"parameter, to reduce the processing time." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "Server interface for low-level 2D physics access." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Physics2DServer is the server responsible for all 2D physics. It can create " +"many kinds of physics objects, but does not insert them on the node tree." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"Adds a shape to the area, along with a transform matrix. Shapes are usually " +"referenced by their index, so you should track which shape has a given index." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"Assigns the area to a descendant of [Object], so it can exist in the node " +"tree." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"Removes all shapes from an area. It does not delete the shapes, so they can " +"be reassigned later." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Creates an [Area2D]. After creating an [Area2D] with this method, assign it " +"to a space using [method area_set_space] to use the created [Area2D] in the " +"physics world." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Gets the instance ID of the object the area is assigned to." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Returns an area parameter value. See [enum AreaParameter] for a list of " +"available parameters." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Returns the [RID] of the nth shape of an area." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Returns the number of shapes assigned to an area." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Returns the transform matrix of a shape within an area." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Returns the space assigned to the area." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Returns the space override mode for the area." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Returns the transform matrix for an area." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"Removes a shape from an area. It does not delete the shape, so it can be " +"reassigned later." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Assigns the area to one or many physics layers." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Sets which physics layers the area will monitor." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"Sets the function to call when any body/area enters or exits the area. This " +"callback will be called for any object interacting with the area, and takes " +"five parameters:\n" +"1: [constant AREA_BODY_ADDED] or [constant AREA_BODY_REMOVED], depending on " +"whether the object entered or exited the area.\n" +"2: [RID] of the object that entered/exited the area.\n" +"3: Instance ID of the object that entered/exited the area.\n" +"4: The shape index of the object that entered/exited the area.\n" +"5: The shape index of the area where the object entered/exited." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Sets the value for an area parameter. See [enum AreaParameter] for a list of " +"available parameters." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"Substitutes a given area shape by another. The old shape is selected by its " +"index, the new one by its [RID]." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "Disables a given shape in an area." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Sets the transform matrix for an area shape." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Assigns a space to the area." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Sets the space override mode for the area. See [enum AreaSpaceOverrideMode] " +"for a list of available modes." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Sets the transform matrix for an area." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Adds a body to the list of bodies exempt from collisions." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Adds a positioned force to the applied force and torque. As with [method " +"body_apply_impulse], both the force and the offset from the body origin are " +"in global coordinates. A force differs from an impulse in that, while the " +"two are forces, the impulse clears itself after being applied." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"Adds a shape to the body, along with a transform matrix. Shapes are usually " +"referenced by their index, so you should track which shape has a given index." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Adds a positioned impulse to the applied force and torque. Both the force " +"and the offset from the body origin are in global coordinates." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Removes all shapes from a body." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "Creates a physics body." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Returns the physics layer or layers a body belongs to." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Returns the physics layer or layers a body can collide with." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "Returns the continuous collision detection mode." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Returns the [Physics2DDirectBodyState] of the body. Returns [code]null[/" +"code] if the body is destroyed or removed from the physics space." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"Returns the maximum contacts that can be reported. See [method " +"body_set_max_contacts_reported]." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Returns the body mode." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Returns the value of a body parameter. See [enum BodyParameter] for a list " +"of available parameters." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Returns the [RID] of the nth shape of a body." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Returns the number of shapes assigned to a body." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "Returns the metadata of a shape of a body." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Returns the transform matrix of a body shape." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Returns the [RID] of the space assigned to a body." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Returns a body state." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"Returns whether a body uses a callback function to calculate its own physics " +"(see [method body_set_force_integration_callback])." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "Removes a body from the list of bodies exempt from collisions." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"Removes a shape from a body. The shape is not deleted, so it can be reused " +"afterwards." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +#: doc/classes/RigidBody.xml +msgid "" +"Sets an axis velocity. The velocity in the given vector axis will be set as " +"the given vector length. This is useful for jumping behavior." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Sets the physics layer or layers a body belongs to." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Sets the physics layer or layers a body can collide with." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Sets the continuous collision detection mode using one of the [enum CCDMode] " +"constants.\n" +"Continuous collision detection tries to predict where a moving body will " +"collide, instead of moving it and correcting its movement if it collided." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"Sets the function used to calculate physics for an object, if that object " +"allows it (see [method body_set_omit_force_integration])." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"Sets the maximum contacts to report. Bodies can keep a log of the contacts " +"with other bodies, this is enabled by setting the maximum amount of contacts " +"reported to a number greater than 0." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "Sets the body mode using one of the [enum BodyMode] constants." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"Sets whether a body uses a callback function to calculate its own physics " +"(see [method body_set_force_integration_callback])." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Sets a body parameter. See [enum BodyParameter] for a list of available " +"parameters." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"Substitutes a given body shape by another. The old shape is selected by its " +"index, the new one by its [RID]." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Enables one way collision on body if [code]enable[/code] is [code]true[/" +"code]." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "Disables shape in body if [code]disable[/code] is [code]true[/code]." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Sets metadata of a shape within a body. This metadata is different from " +"[method Object.set_meta], and can be retrieved on shape queries." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Sets the transform matrix for a body shape." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Assigns a space to the body (see [method space_create])." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Sets a body state using one of the [enum BodyState] constants.\n" +"Note that the method doesn't take effect immediately. The state will change " +"on the next physics frame." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Returns [code]true[/code] if a collision would result from moving in the " +"given direction from a given point in space. Margin increases the size of " +"the shapes involved in the collision detection. [Physics2DTestMotionResult] " +"can be passed to return additional information in." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Creates a damped spring joint between two bodies. If not specified, the " +"second body is assumed to be the joint itself." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "Returns the value of a damped spring joint parameter." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Sets a damped spring joint parameter. See [enum DampedStringParam] for a " +"list of available parameters." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Destroys any of the objects created by Physics2DServer. If the [RID] passed " +"is not one of the objects that can be created by Physics2DServer, an error " +"will be sent to the console." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Returns information about the current state of the 2D physics engine. See " +"[enum ProcessInfo] for a list of available states." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Creates a groove joint between two bodies. If not specified, the bodies are " +"assumed to be the joint itself." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "Returns the value of a joint parameter." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "Returns a joint's type (see [enum JointType])." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Sets a joint parameter. See [enum JointParam] for a list of available " +"parameters." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Creates a pin joint between two bodies. If not specified, the second body is " +"assumed to be the joint itself." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "Activates or deactivates the 2D physics engine." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Sets the amount of iterations for calculating velocities of colliding " +"bodies. The greater the amount of iterations, the more accurate the " +"collisions will be. However, a greater amount of iterations requires more " +"CPU power, which can decrease performance. The default value is [code]8[/" +"code]." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Returns the shape data." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "Returns a shape's type (see [enum ShapeType])." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"Sets the shape data that defines its shape and size. The data to be passed " +"depends on the kind of shape created [method shape_get_type]." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"Creates a space. A space is a collection of parameters for the physics " +"engine that can be assigned to an area or a body. It can be assigned to an " +"area with [method area_set_space], or to a body with [method body_set_space]." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Returns the state of a space, a [Physics2DDirectSpaceState]. This object can " +"be used to make collision/intersection queries." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Returns the value of a space parameter." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Returns whether the space is active." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"Marks a space as active. It will not have an effect, unless it is assigned " +"to an area or body." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Sets the value for a space parameter. See [enum SpaceParameter] for a list " +"of available parameters." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"Constant to set/get the maximum distance a pair of bodies has to move before " +"their collision status has to be recalculated." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"Constant to set/get the maximum distance a shape can be from another before " +"they are considered separated." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"Constant to set/get the maximum distance a shape can penetrate another shape " +"before it is considered a collision." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"Constant to set/get the threshold linear velocity of activity. A body marked " +"as potentially inactive for both linear and angular velocity will be put to " +"sleep after the time given." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"Constant to set/get the threshold angular velocity of activity. A body " +"marked as potentially inactive for both linear and angular velocity will be " +"put to sleep after the time given." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"Constant to set/get the maximum time of activity. A body marked as " +"potentially inactive for both linear and angular velocity will be put to " +"sleep after this time." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"Constant to set/get the default solver bias for all physics constraints. A " +"solver bias is a factor controlling how much two objects \"rebound\", after " +"violating a constraint, to avoid leaving them in that state because of " +"numerical imprecision." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"This is the constant for creating line shapes. A line shape is an infinite " +"line with an origin point, and a normal. Thus, it can be used for front/" +"behind checks." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"This is the constant for creating segment shapes. A segment shape is a line " +"from a point A to a point B. It can be checked for intersections." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"This is the constant for creating circle shapes. A circle shape only has a " +"radius. It can be used for intersections and inside/outside checks." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"This is the constant for creating rectangle shapes. A rectangle shape is " +"defined by a width and a height. It can be used for intersections and inside/" +"outside checks." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"This is the constant for creating capsule shapes. A capsule shape is defined " +"by a radius and a length. It can be used for intersections and inside/" +"outside checks." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"This is the constant for creating convex polygon shapes. A polygon is " +"defined by a list of points. It can be used for intersections and inside/" +"outside checks. Unlike the [member CollisionPolygon2D.polygon] property, " +"polygons modified with [method shape_set_data] do not verify that the points " +"supplied form is a convex polygon." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"This is the constant for creating concave polygon shapes. A polygon is " +"defined by a list of points. It can be used for intersections checks, but " +"not for inside/outside checks." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"This constant is used internally by the engine. Any attempt to create this " +"kind of shape results in an error." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Constant to set/get gravity strength in an area." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Constant to set/get gravity vector/center in an area." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"Constant to set/get whether the gravity vector of an area is a direction, or " +"a center point." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"Constant to set/get the falloff factor for point gravity of an area. The " +"greater this value is, the faster the strength of gravity decreases with the " +"square of distance." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"This constant was used to set/get the falloff factor for point gravity. It " +"has been superseded by [constant AREA_PARAM_GRAVITY_DISTANCE_SCALE]." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Constant to set/get the linear dampening factor of an area." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Constant to set/get the angular dampening factor of an area." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Constant to set/get the priority (order of processing) of an area." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"This area does not affect gravity/damp. These are generally areas that exist " +"only to detect collisions, and objects entering or exiting them." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"This area adds its gravity/damp values to whatever has been calculated so " +"far. This way, many overlapping areas can combine their physics to make " +"interesting effects." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"This area adds its gravity/damp values to whatever has been calculated so " +"far. Then stops taking into account the rest of the areas, even the default " +"one." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"This area replaces any gravity/damp, even the default one, and stops taking " +"into account the rest of the areas." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"This area replaces any gravity/damp calculated so far, but keeps calculating " +"the rest of the areas, down to the default one." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Constant for static bodies." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Constant for kinematic bodies." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Constant for rigid bodies." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"Constant for rigid bodies in character mode. In this mode, a body can not " +"rotate, and only its linear velocity is affected by physics." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Constant to set/get a body's bounce factor." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Constant to set/get a body's friction." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Constant to set/get a body's mass." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "Constant to set/get a body's inertia." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Constant to set/get a body's gravity multiplier." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Constant to set/get a body's linear dampening factor." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Constant to set/get a body's angular dampening factor." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Represents the size of the [enum BodyParameter] enum." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Constant to set/get the current transform matrix of the body." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Constant to set/get the current linear velocity of the body." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Constant to set/get the current angular velocity of the body." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Constant to sleep/wake up a body, or to get whether it is sleeping." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Constant to set/get whether the body can sleep." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "Constant to create pin joints." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "Constant to create groove joints." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "Constant to create damped spring joints." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Sets the resting length of the spring joint. The joint will always try to go " +"to back this length when pulled apart." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Sets the stiffness of the spring joint. The joint applies a force equal to " +"the stiffness times the distance from its resting length." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Sets the damping ratio of the spring joint. A value of 0 indicates an " +"undamped spring, while 1 causes the system to reach equilibrium as fast as " +"possible (critical damping)." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Disables continuous collision detection. This is the fastest way to detect " +"body collisions, but can miss small, fast-moving objects." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Enables continuous collision detection by raycasting. It is faster than " +"shapecasting, but less precise." +msgstr "" + +#: doc/classes/Physics2DServer.xml +msgid "" +"Enables continuous collision detection by shapecasting. It is the slowest " +"CCD method, and the most precise." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"The value of the first parameter and area callback function receives, when " +"an object enters one of its shapes." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"The value of the first parameter and area callback function receives, when " +"an object exits one of its shapes." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Constant to get the number of objects that are not sleeping." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "Constant to get the number of possible collisions." +msgstr "" + +#: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml +msgid "" +"Constant to get the number of space regions where a collision could occur." +msgstr "" + +#: doc/classes/Physics2DShapeQueryParameters.xml +msgid "Parameters to be sent to a 2D shape physics query." +msgstr "" + +#: doc/classes/Physics2DShapeQueryParameters.xml +msgid "" +"This class contains the shape and other parameters for 2D intersection/" +"collision queries." +msgstr "" + +#: doc/classes/Physics2DShapeQueryParameters.xml +msgid "" +"Sets the [Shape2D] that will be used for collision/intersection queries." +msgstr "" + +#: doc/classes/Physics2DShapeQueryParameters.xml +msgid "If [code]true[/code], the query will take [Area2D]s into account." +msgstr "" + +#: doc/classes/Physics2DShapeQueryParameters.xml +msgid "" +"If [code]true[/code], the query will take [PhysicsBody2D]s into account." +msgstr "" + +#: doc/classes/Physics2DShapeQueryParameters.xml +#: doc/classes/PhysicsShapeQueryParameters.xml +msgid "" +"The physics layer(s) the query will take into account (as a bitmask). See " +"[url=$DOCS_URL/tutorials/physics/physics_introduction.html#collision-layers-" +"and-masks]Collision layers and masks[/url] in the documentation for more " +"information." +msgstr "" + +#: doc/classes/Physics2DShapeQueryParameters.xml +#: doc/classes/PhysicsShapeQueryParameters.xml +msgid "" +"The list of objects or object [RID]s that will be excluded from collisions." +msgstr "" + +#: doc/classes/Physics2DShapeQueryParameters.xml +#: doc/classes/PhysicsShapeQueryParameters.xml +msgid "The collision margin for the shape." +msgstr "" + +#: doc/classes/Physics2DShapeQueryParameters.xml +msgid "The motion of the shape being queried for." +msgstr "" + +#: doc/classes/Physics2DShapeQueryParameters.xml +#: doc/classes/PhysicsShapeQueryParameters.xml +msgid "The queried shape's [RID]. See also [method set_shape]." +msgstr "" + +#: doc/classes/Physics2DShapeQueryParameters.xml +#: doc/classes/PhysicsShapeQueryParameters.xml +msgid "The queried shape's transform matrix." +msgstr "" + +#: doc/classes/PhysicsBody.xml +msgid "Base class for all objects affected by physics in 3D space." +msgstr "" + +#: doc/classes/PhysicsBody.xml +msgid "" +"PhysicsBody is an abstract base class for implementing a physics body. All " +"*Body types inherit from it." +msgstr "" + +#: doc/classes/PhysicsBody.xml doc/classes/PhysicsBody2D.xml +#: doc/classes/SoftBody.xml +msgid "Adds a body to the list of bodies that this body can't collide with." +msgstr "" + +#: doc/classes/PhysicsBody.xml doc/classes/PhysicsBody2D.xml +#: doc/classes/SoftBody.xml +msgid "" +"Returns an array of nodes that were added as collision exceptions for this " +"body." +msgstr "" + +#: doc/classes/PhysicsBody.xml doc/classes/PhysicsBody2D.xml +#: doc/classes/SoftBody.xml +msgid "" +"Removes a body from the list of bodies that this body can't collide with." +msgstr "" + +#: doc/classes/PhysicsBody2D.xml +msgid "Base class for all objects affected by physics in 2D space." +msgstr "" + +#: doc/classes/PhysicsBody2D.xml +msgid "" +"PhysicsBody2D is an abstract base class for implementing a physics body. All " +"*Body2D types inherit from it." +msgstr "" + +#: doc/classes/PhysicsBody2D.xml +msgid "" +"Both collision_layer and collision_mask. Returns collision_layer when " +"accessed. Updates collision_layer and collision_mask when modified." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState.xml +msgid "Direct access object to a physics body in the [PhysicsServer]." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState.xml +msgid "" +"Provides direct access to a physics body in the [PhysicsServer], allowing " +"safe changes to physics properties. This object is passed via the direct " +"state callback of rigid/character bodies, and is intended for changing the " +"direct state of that body. See [method RigidBody._integrate_forces]." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState.xml +msgid "" +"Adds a constant directional force without affecting rotation.\n" +"This is equivalent to [code]add_force(force, Vector3(0,0,0))[/code]." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState.xml +msgid "Adds a constant rotational force without affecting position." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState.xml +msgid "" +"Applies a single directional impulse without affecting rotation.\n" +"This is equivalent to [code]apply_impulse(Vector3(0, 0, 0), impulse)[/code]." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState.xml +msgid "" +"Applies a positioned impulse to the body. An impulse is time-independent! " +"Applying an impulse every frame would result in a framerate-dependent force. " +"For this reason it should only be used when simulating one-time impacts. The " +"position uses the rotation of the global coordinate system, but is centered " +"at the object's origin." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState.xml +msgid "" +"Apply a torque impulse (which will be affected by the body mass and shape). " +"This will rotate the body around the vector [code]j[/code] passed as " +"parameter." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState.xml +msgid "Returns the collider object." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState.xml +msgid "" +"Returns the number of contacts this body has with other bodies.\n" +"[b]Note:[/b] By default, this returns 0 unless bodies are configured to " +"monitor contacts. See [member RigidBody.contact_monitor]." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState.xml +msgid "Impulse created by the contact. Only implemented for Bullet physics." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState.xml doc/classes/RigidBody.xml +msgid "" +"The body's rotational velocity in axis-angle format. The magnitude of the " +"vector is the rotation rate in [i]radians[/i] per second." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState.xml +msgid "The body's linear velocity in units per second." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState.xml +msgid "Direct access object to a space in the [PhysicsServer]." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState.xml +msgid "" +"Direct access object to a space in the [PhysicsServer]. It's used mainly to " +"do queries against objects and areas residing in a given space." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState.xml +msgid "" +"Checks how far a [Shape] can move without colliding. All the parameters for " +"the query, including the shape, are supplied through a " +"[PhysicsShapeQueryParameters] object.\n" +"Returns an array with the safe and unsafe proportions (between 0 and 1) of " +"the motion. The safe proportion is the maximum fraction of the motion that " +"can be made without a collision. The unsafe proportion is the minimum " +"fraction of the distance that must be moved for a collision. If no collision " +"is detected a result of [code][1.0, 1.0][/code] will be returned.\n" +"[b]Note:[/b] Any [Shape]s that the shape is already colliding with e.g. " +"inside of, will be ignored. Use [method collide_shape] to determine the " +"[Shape]s that the shape is already colliding with." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState.xml +msgid "" +"Checks the intersections of a shape, given through a " +"[PhysicsShapeQueryParameters] object, against the space. The resulting array " +"contains a list of points where the shape intersects another. Like with " +"[method intersect_shape], the number of returned results can be limited to " +"save processing time." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState.xml +msgid "" +"Checks the intersections of a shape, given through a " +"[PhysicsShapeQueryParameters] object, against the space. If it collides with " +"more than one shape, the nearest one is selected. The returned object is a " +"dictionary containing the following fields:\n" +"[code]collider_id[/code]: The colliding object's ID.\n" +"[code]linear_velocity[/code]: The colliding object's velocity [Vector3]. If " +"the object is an [Area], the result is [code](0, 0, 0)[/code].\n" +"[code]normal[/code]: The object's surface normal at the intersection point.\n" +"[code]point[/code]: The intersection point.\n" +"[code]rid[/code]: The intersecting object's [RID].\n" +"[code]shape[/code]: The shape index of the colliding shape.\n" +"If the shape did not intersect anything, then an empty dictionary is " +"returned instead." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState.xml +msgid "" +"Checks whether a point is inside any solid shape. The shapes the point is " +"inside of are returned in an array containing dictionaries with the " +"following fields:\n" +"[code]collider[/code]: The colliding object.\n" +"[code]collider_id[/code]: The colliding object's ID.\n" +"[code]rid[/code]: The intersecting object's [RID].\n" +"[code]shape[/code]: The shape index of the colliding shape.\n" +"The number of intersections can be limited with the [code]max_results[/code] " +"parameter, to reduce the processing time.\n" +"Additionally, the method can take an [code]exclude[/code] array of objects " +"or [RID]s that are to be excluded from collisions, a [code]collision_mask[/" +"code] bitmask representing the physics layers to check in, or booleans to " +"determine if the ray should collide with [PhysicsBody]s or [Area]s, " +"respectively." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState.xml +msgid "" +"Intersects a ray in a given space. The returned object is a dictionary with " +"the following fields:\n" +"[code]collider[/code]: The colliding object.\n" +"[code]collider_id[/code]: The colliding object's ID.\n" +"[code]normal[/code]: The object's surface normal at the intersection point.\n" +"[code]position[/code]: The intersection point.\n" +"[code]rid[/code]: The intersecting object's [RID].\n" +"[code]shape[/code]: The shape index of the colliding shape.\n" +"If the ray did not intersect anything, then an empty dictionary is returned " +"instead.\n" +"Additionally, the method can take an [code]exclude[/code] array of objects " +"or [RID]s that are to be excluded from collisions, a [code]collision_mask[/" +"code] bitmask representing the physics layers to check in, or booleans to " +"determine if the ray should collide with [PhysicsBody]s or [Area]s, " +"respectively." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState.xml +msgid "" +"Checks the intersections of a shape, given through a " +"[PhysicsShapeQueryParameters] object, against the space. The intersected " +"shapes are returned in an array containing dictionaries with the following " +"fields:\n" +"[code]collider[/code]: The colliding object.\n" +"[code]collider_id[/code]: The colliding object's ID.\n" +"[code]rid[/code]: The intersecting object's [RID].\n" +"[code]shape[/code]: The shape index of the colliding shape.\n" +"The number of intersections can be limited with the [code]max_results[/code] " +"parameter, to reduce the processing time." +msgstr "" + +#: doc/classes/PhysicsMaterial.xml +msgid "A material for physics properties." +msgstr "" + +#: doc/classes/PhysicsMaterial.xml +msgid "" +"Provides a means of modifying the collision properties of a [PhysicsBody]." +msgstr "" + +#: doc/classes/PhysicsMaterial.xml +msgid "" +"If [code]true[/code], subtracts the bounciness from the colliding object's " +"bounciness instead of adding it." +msgstr "" + +#: doc/classes/PhysicsMaterial.xml +msgid "" +"The body's bounciness. Values range from [code]0[/code] (no bounce) to " +"[code]1[/code] (full bounciness)." +msgstr "" + +#: doc/classes/PhysicsMaterial.xml +msgid "" +"The body's friction. Values range from [code]0[/code] (frictionless) to " +"[code]1[/code] (maximum friction)." +msgstr "" + +#: doc/classes/PhysicsMaterial.xml +msgid "" +"If [code]true[/code], the physics engine will use the friction of the object " +"marked as \"rough\" when two objects collide. If [code]false[/code], the " +"physics engine will use the lowest friction of all colliding objects " +"instead. If [code]true[/code] for both colliding objects, the physics engine " +"will use the highest friction." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "Server interface for low-level physics access." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"PhysicsServer is the server responsible for all 3D physics. It can create " +"many kinds of physics objects, but does not insert them on the node tree." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "Creates an [Area]." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"Returns an area parameter value. A list of available parameters is on the " +"[enum AreaParameter] constants." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "If [code]true[/code], area collides with rays." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"Sets the value for an area parameter. A list of available parameters is on " +"the [enum AreaParameter] constants." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "Sets object pickable with rays." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"Sets the space override mode for the area. The modes are described in the " +"[enum AreaSpaceOverrideMode] constants." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"Gives the body a push at a [code]position[/code] in the direction of the " +"[code]impulse[/code]." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "Gives the body a push to rotate it." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"Creates a physics body. The first parameter can be any value from [enum " +"BodyMode] constants, for the type of body created. Additionally, the body " +"can be created in sleeping state to save processing time." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"Returns the [PhysicsDirectBodyState] of the body. Returns [code]null[/code] " +"if the body is destroyed or removed from the physics space." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"Returns the value of a body parameter. A list of available parameters is on " +"the [enum BodyParameter] constants." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"If [code]true[/code], the continuous collision detection mode is enabled." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "If [code]true[/code], the body can be detected by rays." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"Removes a body from the list of bodies exempt from collisions.\n" +"Continuous collision detection tries to predict where a moving body will " +"collide, instead of moving it and correcting its movement if it collided." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"If [code]true[/code], the continuous collision detection mode is enabled.\n" +"Continuous collision detection tries to predict where a moving body will " +"collide, instead of moving it and correcting its movement if it collided." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "Sets the body mode, from one of the [enum BodyMode] constants." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"Sets a body parameter. A list of available parameters is on the [enum " +"BodyParameter] constants." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "Sets the body pickable with rays if [code]enabled[/code] is set." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "Sets a body state (see [enum BodyState] constants)." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"Returns [code]true[/code] if a collision would result from moving in the " +"given direction from a given point in space. [PhysicsTestMotionResult] can " +"be passed to return additional information in." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"Gets a cone_twist_joint parameter (see [enum ConeTwistJointParam] constants)." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"Sets a cone_twist_joint parameter (see [enum ConeTwistJointParam] constants)." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"Destroys any of the objects created by PhysicsServer. If the [RID] passed is " +"not one of the objects that can be created by PhysicsServer, an error will " +"be sent to the console." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"Gets a generic_6_DOF_joint flag (see [enum G6DOFJointAxisFlag] constants)." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"Gets a generic_6_DOF_joint parameter (see [enum G6DOFJointAxisParam] " +"constants)." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"Sets a generic_6_DOF_joint flag (see [enum G6DOFJointAxisFlag] constants)." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"Sets a generic_6_DOF_joint parameter (see [enum G6DOFJointAxisParam] " +"constants)." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"Returns information about the current state of the 3D physics engine. See " +"[enum ProcessInfo] for a list of available states. Only implemented for " +"Godot Physics." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "Gets a hinge_joint flag (see [enum HingeJointFlag] constants)." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "Gets a hinge_joint parameter (see [enum HingeJointParam])." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "Sets a hinge_joint flag (see [enum HingeJointFlag] constants)." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "Sets a hinge_joint parameter (see [enum HingeJointParam] constants)." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "Creates a [ConeTwistJoint]." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "Creates a [Generic6DOFJoint]." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "Creates a [HingeJoint]." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "Creates a [PinJoint]." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "Creates a [SliderJoint]." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "Gets the priority value of the Joint." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "Returns the type of the Joint." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "Sets the priority value of the Joint." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"Returns position of the joint in the local space of body a of the joint." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"Returns position of the joint in the local space of body b of the joint." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "Gets a pin_joint parameter (see [enum PinJointParam] constants)." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "Sets position of the joint in the local space of body a of the joint." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "Sets position of the joint in the local space of body b of the joint." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "Sets a pin_joint parameter (see [enum PinJointParam] constants)." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "Activates or deactivates the 3D physics engine." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"Sets the amount of iterations for calculating velocities of colliding " +"bodies. The greater the amount of iterations, the more accurate the " +"collisions will be. However, a greater amount of iterations requires more " +"CPU power, which can decrease performance. The default value is [code]8[/" +"code].\n" +"[b]Note:[/b] Only has an effect when using the GodotPhysics engine, not the " +"default Bullet physics engine." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"Creates a shape of a type from [enum ShapeType]. Does not assign it to a " +"body or an area. To do so, you must use [method area_set_shape] or [method " +"body_set_shape]." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "Returns the type of shape (see [enum ShapeType] constants)." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "Gets a slider_joint parameter (see [enum SliderJointParam] constants)." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"Returns the state of a space, a [PhysicsDirectSpaceState]. This object can " +"be used to make collision/intersection queries." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"Sets the value for a space parameter. A list of available parameters is on " +"the [enum SpaceParameter] constants." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "The [Joint] is a [PinJoint]." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "The [Joint] is a [HingeJoint]." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "The [Joint] is a [SliderJoint]." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "The [Joint] is a [ConeTwistJoint]." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "The [Joint] is a [Generic6DOFJoint]." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"The strength with which the pinned objects try to stay in positional " +"relation to each other.\n" +"The higher, the stronger." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"The strength with which the pinned objects try to stay in velocity relation " +"to each other.\n" +"The higher, the stronger." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"If above 0, this value is the maximum value for an impulse that this Joint " +"puts on its ends." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "The maximum rotation across the Hinge." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "The minimum rotation across the Hinge." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "If [code]true[/code], the Hinge has a maximum and a minimum rotation." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "If [code]true[/code], a motor turns the Hinge." +msgstr "" + +#: doc/classes/PhysicsServer.xml doc/classes/SliderJoint.xml +msgid "" +"The maximum difference between the pivot points on their X axis before " +"damping happens." +msgstr "" + +#: doc/classes/PhysicsServer.xml doc/classes/SliderJoint.xml +msgid "" +"The minimum difference between the pivot points on their X axis before " +"damping happens." +msgstr "" + +#: doc/classes/PhysicsServer.xml doc/classes/SliderJoint.xml +msgid "" +"A factor applied to the movement across the slider axis once the limits get " +"surpassed. The lower, the slower the movement." +msgstr "" + +#: doc/classes/PhysicsServer.xml doc/classes/SliderJoint.xml +msgid "" +"The amount of restitution once the limits are surpassed. The lower, the more " +"velocityenergy gets lost." +msgstr "" + +#: doc/classes/PhysicsServer.xml doc/classes/SliderJoint.xml +msgid "The amount of damping once the slider limits are surpassed." +msgstr "" + +#: doc/classes/PhysicsServer.xml doc/classes/SliderJoint.xml +msgid "" +"A factor applied to the movement across the slider axis as long as the " +"slider is in the limits. The lower, the slower the movement." +msgstr "" + +#: doc/classes/PhysicsServer.xml doc/classes/SliderJoint.xml +msgid "The amount of restitution inside the slider limits." +msgstr "" + +#: doc/classes/PhysicsServer.xml doc/classes/SliderJoint.xml +msgid "The amount of damping inside the slider limits." +msgstr "" + +#: doc/classes/PhysicsServer.xml doc/classes/SliderJoint.xml +msgid "A factor applied to the movement across axes orthogonal to the slider." +msgstr "" + +#: doc/classes/PhysicsServer.xml doc/classes/SliderJoint.xml +msgid "" +"The amount of restitution when movement is across axes orthogonal to the " +"slider." +msgstr "" + +#: doc/classes/PhysicsServer.xml doc/classes/SliderJoint.xml +msgid "" +"The amount of damping when movement is across axes orthogonal to the slider." +msgstr "" + +#: doc/classes/PhysicsServer.xml doc/classes/SliderJoint.xml +msgid "The upper limit of rotation in the slider." +msgstr "" + +#: doc/classes/PhysicsServer.xml doc/classes/SliderJoint.xml +msgid "The lower limit of rotation in the slider." +msgstr "" + +#: doc/classes/PhysicsServer.xml doc/classes/SliderJoint.xml +msgid "A factor applied to the all rotation once the limit is surpassed." +msgstr "" + +#: doc/classes/PhysicsServer.xml doc/classes/SliderJoint.xml +msgid "The amount of restitution of the rotation when the limit is surpassed." +msgstr "" + +#: doc/classes/PhysicsServer.xml doc/classes/SliderJoint.xml +msgid "The amount of damping of the rotation when the limit is surpassed." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "A factor that gets applied to the all rotation in the limits." +msgstr "" + +#: doc/classes/PhysicsServer.xml doc/classes/SliderJoint.xml +msgid "The amount of restitution of the rotation in the limits." +msgstr "" + +#: doc/classes/PhysicsServer.xml doc/classes/SliderJoint.xml +msgid "The amount of damping of the rotation in the limits." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"A factor that gets applied to the all rotation across axes orthogonal to the " +"slider." +msgstr "" + +#: doc/classes/PhysicsServer.xml doc/classes/SliderJoint.xml +msgid "" +"The amount of restitution of the rotation across axes orthogonal to the " +"slider." +msgstr "" + +#: doc/classes/PhysicsServer.xml doc/classes/SliderJoint.xml +msgid "" +"The amount of damping of the rotation across axes orthogonal to the slider." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "Represents the size of the [enum SliderJointParam] enum." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"The ease with which the Joint twists, if it's too low, it takes more force " +"to twist the joint." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"A factor that gets applied to the movement across the axes. The lower, the " +"slower the movement." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"The amount of restitution on the axes movement. The lower, the more velocity-" +"energy gets lost." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "The velocity that the joint's linear motor will attempt to reach." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"The maximum force that the linear motor can apply while trying to reach the " +"target velocity." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "A factor that gets multiplied onto all rotations across the axes." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"When correcting the crossing of limits in rotation across the axes, this " +"error tolerance factor defines how much the correction gets slowed down. The " +"lower, the slower." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "If set, linear motion is possible within the given limits." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "If set, rotational motion is possible." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "If set, there is a rotational motor across these axes." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "" +"If set, there is a linear motor on this axis that targets a specific " +"velocity." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "The [Shape] is a [PlaneShape]." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "The [Shape] is a [RayShape]." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "The [Shape] is a [SphereShape]." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "The [Shape] is a [BoxShape]." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "The [Shape] is a [CapsuleShape]." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "The [Shape] is a [CylinderShape]." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "The [Shape] is a [ConvexPolygonShape]." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "The [Shape] is a [ConcavePolygonShape]." +msgstr "" + +#: doc/classes/PhysicsServer.xml +msgid "The [Shape] is a [HeightMapShape]." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters.xml +msgid "Parameters to be sent to a 3D shape physics query." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters.xml +msgid "" +"This class contains the shape and other parameters for 3D intersection/" +"collision queries." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters.xml +msgid "Sets the [Shape] that will be used for collision/intersection queries." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters.xml +msgid "If [code]true[/code], the query will take [Area]s into account." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters.xml +msgid "If [code]true[/code], the query will take [PhysicsBody]s into account." +msgstr "" + +#: doc/classes/PinJoint.xml +msgid "Pin joint for 3D PhysicsBodies." +msgstr "" + +#: doc/classes/PinJoint.xml +msgid "" +"Pin joint for 3D rigid bodies. It pins 2 bodies (rigid or static) together. " +"See also [Generic6DOFJoint]." +msgstr "" + +#: doc/classes/PinJoint.xml +msgid "" +"The force with which the pinned objects stay in positional relation to each " +"other. The higher, the stronger." +msgstr "" + +#: doc/classes/PinJoint.xml +msgid "" +"The force with which the pinned objects stay in velocity relation to each " +"other. The higher, the stronger." +msgstr "" + +#: doc/classes/PinJoint.xml +msgid "" +"If above 0, this value is the maximum value for an impulse that this Joint " +"produces." +msgstr "" + +#: doc/classes/PinJoint2D.xml +msgid "Pin Joint for 2D shapes." +msgstr "" + +#: doc/classes/PinJoint2D.xml +msgid "" +"Pin Joint for 2D rigid bodies. It pins two bodies (rigid or static) together." +msgstr "" + +#: doc/classes/PinJoint2D.xml +msgid "" +"The higher this value, the more the bond to the pinned partner can flex." +msgstr "" + +#: doc/classes/Plane.xml +msgid "Plane in hessian form." +msgstr "" + +#: doc/classes/Plane.xml +msgid "" +"Plane represents a normalized plane equation. Basically, \"normal\" is the " +"normal of the plane (a,b,c normalized), and \"d\" is the distance from the " +"origin to the plane (in the direction of \"normal\"). \"Over\" or \"Above\" " +"the plane is considered the side of the plane towards where the normal is " +"pointing." +msgstr "" + +#: doc/classes/Plane.xml +msgid "" +"Creates a plane from the four parameters. The three components of the " +"resulting plane's [member normal] are [code]a[/code], [code]b[/code] and " +"[code]c[/code], and the plane has a distance of [code]d[/code] from the " +"origin." +msgstr "" + +#: doc/classes/Plane.xml +msgid "Creates a plane from the three points, given in clockwise order." +msgstr "" + +#: doc/classes/Plane.xml +msgid "Creates a plane from the normal and the plane's distance to the origin." +msgstr "" + +#: doc/classes/Plane.xml +msgid "Returns the center of the plane." +msgstr "" + +#: doc/classes/Plane.xml +msgid "" +"Returns the shortest distance from the plane to the position [code]point[/" +"code]." +msgstr "" + +#: doc/classes/Plane.xml +msgid "" +"Returns the center of the plane.\n" +"This method is deprecated, please use [method center] instead." +msgstr "" + +#: doc/classes/Plane.xml +msgid "" +"Returns [code]true[/code] if [code]point[/code] is inside the plane. " +"Comparison uses a custom minimum [code]epsilon[/code] threshold." +msgstr "" + +#: doc/classes/Plane.xml +msgid "" +"Returns the intersection point of the three planes [code]b[/code], [code]c[/" +"code] and this plane. If no intersection is found, [code]null[/code] is " +"returned." +msgstr "" + +#: doc/classes/Plane.xml +msgid "" +"Returns the intersection point of a ray consisting of the position " +"[code]from[/code] and the direction normal [code]dir[/code] with this plane. " +"If no intersection is found, [code]null[/code] is returned." +msgstr "" + +#: doc/classes/Plane.xml +msgid "" +"Returns the intersection point of a segment from position [code]begin[/code] " +"to position [code]end[/code] with this plane. If no intersection is found, " +"[code]null[/code] is returned." +msgstr "" + +#: doc/classes/Plane.xml +msgid "" +"Returns [code]true[/code] if this plane and [code]plane[/code] are " +"approximately equal, by running [method @GDScript.is_equal_approx] on each " +"component." +msgstr "" + +#: doc/classes/Plane.xml +msgid "" +"Returns [code]true[/code] if [code]point[/code] is located above the plane." +msgstr "" + +#: doc/classes/Plane.xml +msgid "Returns a copy of the plane, normalized." +msgstr "" + +#: doc/classes/Plane.xml +msgid "" +"Returns the orthogonal projection of [code]point[/code] into a point in the " +"plane." +msgstr "" + +#: doc/classes/Plane.xml +msgid "" +"The distance from the origin to the plane, in the direction of [member " +"normal]. This value is typically non-negative.\n" +"In the scalar equation of the plane [code]ax + by + cz = d[/code], this is " +"[code]d[/code], while the [code](a, b, c)[/code] coordinates are represented " +"by the [member normal] property." +msgstr "" + +#: doc/classes/Plane.xml +msgid "" +"The normal of the plane, which must be normalized.\n" +"In the scalar equation of the plane [code]ax + by + cz = d[/code], this is " +"the vector [code](a, b, c)[/code], where [code]d[/code] is the [member d] " +"property." +msgstr "" + +#: doc/classes/Plane.xml +msgid "The X component of the plane's [member normal] vector." +msgstr "" + +#: doc/classes/Plane.xml +msgid "The Y component of the plane's [member normal] vector." +msgstr "" + +#: doc/classes/Plane.xml +msgid "The Z component of the plane's [member normal] vector." +msgstr "" + +#: doc/classes/Plane.xml +msgid "A plane that extends in the Y and Z axes (normal vector points +X)." +msgstr "" + +#: doc/classes/Plane.xml +msgid "A plane that extends in the X and Z axes (normal vector points +Y)." +msgstr "" + +#: doc/classes/Plane.xml +msgid "A plane that extends in the X and Y axes (normal vector points +Z)." +msgstr "" + +#: doc/classes/PlaneMesh.xml +msgid "Class representing a planar [PrimitiveMesh]." +msgstr "" + +#: doc/classes/PlaneMesh.xml +msgid "" +"Class representing a planar [PrimitiveMesh]. This flat mesh does not have a " +"thickness. By default, this mesh is aligned on the X and Z axes; this " +"default rotation isn't suited for use with billboarded materials. For " +"billboarded materials, use [QuadMesh] instead.\n" +"[b]Note:[/b] When using a large textured [PlaneMesh] (e.g. as a floor), you " +"may stumble upon UV jittering issues depending on the camera angle. To solve " +"this, increase [member subdivide_depth] and [member subdivide_width] until " +"you no longer notice UV jittering." +msgstr "" + +#: doc/classes/PlaneMesh.xml +msgid "Offset from the origin of the generated plane. Useful for particles." +msgstr "" + +#: doc/classes/PlaneMesh.xml +msgid "Size of the generated plane." +msgstr "" + +#: doc/classes/PlaneMesh.xml +msgid "Number of subdivision along the Z axis." +msgstr "" + +#: doc/classes/PlaneMesh.xml +msgid "Number of subdivision along the X axis." +msgstr "" + +#: doc/classes/PlaneShape.xml +msgid "Infinite plane shape for 3D collisions." +msgstr "" + +#: doc/classes/PlaneShape.xml +msgid "" +"An infinite plane shape for 3D collisions. Note that the [Plane]'s normal " +"matters; anything \"below\" the plane will collide with it. If the " +"[PlaneShape] is used in a [PhysicsBody], it will cause colliding objects " +"placed \"below\" it to teleport \"above\" the plane." +msgstr "" + +#: doc/classes/PlaneShape.xml +msgid "The [Plane] used by the [PlaneShape] for collision." +msgstr "" + +#: doc/classes/PointMesh.xml +msgid "Mesh with a single Point primitive." +msgstr "" + +#: doc/classes/PointMesh.xml +msgid "" +"The PointMesh is made from a single point. Instead of relying on triangles, " +"points are rendered as a single rectangle on the screen with a constant " +"size. They are intended to be used with Particle systems, but can be used as " +"a cheap way to render constant size billboarded sprites (for example in a " +"point cloud).\n" +"PointMeshes, must be used with a material that has a point size. Point size " +"can be accessed in a shader with [code]POINT_SIZE[/code], or in a " +"[SpatialMaterial] by setting [member SpatialMaterial.flags_use_point_size] " +"and the variable [member SpatialMaterial.params_point_size].\n" +"When using PointMeshes, properties that normally alter vertices will be " +"ignored, including billboard mode, grow, and cull face." +msgstr "" + +#: doc/classes/Polygon2D.xml +msgid "A 2D polygon." +msgstr "" + +#: doc/classes/Polygon2D.xml +msgid "" +"A Polygon2D is defined by a set of points. Each point is connected to the " +"next, with the final point being connected to the first, resulting in a " +"closed polygon. Polygon2Ds can be filled with color (solid or gradient) or " +"filled with a given texture.\n" +"[b]Note:[/b] By default, Godot can only draw up to 4,096 polygon points at a " +"time. To increase this limit, open the Project Settings and increase [member " +"ProjectSettings.rendering/limits/buffers/canvas_polygon_buffer_size_kb] and " +"[member ProjectSettings.rendering/limits/buffers/" +"canvas_polygon_index_buffer_size_kb]." +msgstr "" + +#: doc/classes/Polygon2D.xml +msgid "" +"Adds a bone with the specified [code]path[/code] and [code]weights[/code]." +msgstr "" + +#: doc/classes/Polygon2D.xml +msgid "Removes all bones from this [Polygon2D]." +msgstr "" + +#: doc/classes/Polygon2D.xml +msgid "Removes the specified bone from this [Polygon2D]." +msgstr "" + +#: doc/classes/Polygon2D.xml +msgid "Returns the number of bones in this [Polygon2D]." +msgstr "" + +#: doc/classes/Polygon2D.xml +msgid "Returns the path to the node associated with the specified bone." +msgstr "" + +#: doc/classes/Polygon2D.xml +msgid "Returns the height values of the specified bone." +msgstr "" + +#: doc/classes/Polygon2D.xml +msgid "Sets the path to the node associated with the specified bone." +msgstr "" + +#: doc/classes/Polygon2D.xml +msgid "Sets the weight values for the specified bone." +msgstr "" + +#: doc/classes/Polygon2D.xml +msgid "" +"If [code]true[/code], attempts to perform antialiasing for polygon edges by " +"drawing a thin OpenGL smooth line on the edges.\n" +"[b]Note:[/b] Due to how it works, built-in antialiasing will not look " +"correct for translucent polygons and may not work on certain platforms. As a " +"workaround, install the [url=https://github.com/godot-extended-libraries/" +"godot-antialiased-line2d]Antialiased Line2D[/url] add-on then create an " +"AntialiasedPolygon2D node. That node relies on a texture with custom mipmaps " +"to perform antialiasing." +msgstr "" + +#: doc/classes/Polygon2D.xml +msgid "" +"The polygon's fill color. If [code]texture[/code] is defined, it will be " +"multiplied by this color. It will also be the default color for vertices not " +"set in [code]vertex_colors[/code]." +msgstr "" + +#: doc/classes/Polygon2D.xml +msgid "" +"Added padding applied to the bounding box when using [code]invert[/code]. " +"Setting this value too small may result in a \"Bad Polygon\" error." +msgstr "" + +#: doc/classes/Polygon2D.xml +msgid "" +"If [code]true[/code], polygon will be inverted, containing the area outside " +"the defined points and extending to the [code]invert_border[/code]." +msgstr "" + +#: doc/classes/Polygon2D.xml +msgid "The offset applied to each vertex." +msgstr "" + +#: doc/classes/Polygon2D.xml +msgid "" +"The polygon's list of vertices. The final point will be connected to the " +"first.\n" +"[b]Note:[/b] This returns a copy of the [PoolVector2Array] rather than a " +"reference." +msgstr "" + +#: doc/classes/Polygon2D.xml +msgid "" +"The polygon's fill texture. Use [code]uv[/code] to set texture coordinates." +msgstr "" + +#: doc/classes/Polygon2D.xml +msgid "" +"Amount to offset the polygon's [code]texture[/code]. If [code](0, 0)[/code] " +"the texture's origin (its top-left corner) will be placed at the polygon's " +"[code]position[/code]." +msgstr "" + +#: doc/classes/Polygon2D.xml +msgid "The texture's rotation in radians." +msgstr "" + +#: doc/classes/Polygon2D.xml +msgid "The texture's rotation in degrees." +msgstr "" + +#: doc/classes/Polygon2D.xml +msgid "" +"Amount to multiply the [code]uv[/code] coordinates when using a " +"[code]texture[/code]. Larger values make the texture smaller, and vice versa." +msgstr "" + +#: doc/classes/Polygon2D.xml +msgid "" +"Texture coordinates for each vertex of the polygon. There should be one " +"[code]uv[/code] per polygon vertex. If there are fewer, undefined vertices " +"will use [code](0, 0)[/code]." +msgstr "" + +#: doc/classes/Polygon2D.xml +msgid "" +"Color for each vertex. Colors are interpolated between vertices, resulting " +"in smooth gradients. There should be one per polygon vertex. If there are " +"fewer, undefined vertices will use [code]color[/code]." +msgstr "" + +#: doc/classes/PoolByteArray.xml +msgid "A pooled array of bytes." +msgstr "" + +#: doc/classes/PoolByteArray.xml +msgid "" +"An array specifically designed to hold bytes. Optimized for memory usage, " +"does not fragment the memory.\n" +"[b]Note:[/b] This type is passed by value and not by reference. This means " +"that when [i]mutating[/i] a class property of type [PoolByteArray] or " +"mutating a [PoolByteArray] within an [Array] or [Dictionary], changes will " +"be lost:\n" +"[codeblock]\n" +"var array = [PoolByteArray()]\n" +"array[0].push_back(123)\n" +"print(array) # [[]] (empty PoolByteArray within an Array)\n" +"[/codeblock]\n" +"Instead, the entire [PoolByteArray] property must be [i]reassigned[/i] with " +"[code]=[/code] for it to be changed:\n" +"[codeblock]\n" +"var array = [PoolByteArray()]\n" +"var pool_array = array[0]\n" +"pool_array.push_back(123)\n" +"array[0] = pool_array\n" +"print(array) # [[123]] (PoolByteArray with 1 element inside an Array)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/PoolByteArray.xml +msgid "" +"Constructs a new [PoolByteArray]. Optionally, you can pass in a generic " +"[Array] that will be converted." +msgstr "" + +#: doc/classes/PoolByteArray.xml +msgid "Appends a [PoolByteArray] at the end of this array." +msgstr "" + +#: doc/classes/PoolByteArray.xml +msgid "" +"Returns a new [PoolByteArray] with the data compressed. Set the compression " +"mode using one of [enum File.CompressionMode]'s constants." +msgstr "" + +#: doc/classes/PoolByteArray.xml +msgid "" +"Returns a new [PoolByteArray] with the data decompressed. Set " +"[code]buffer_size[/code] to the size of the uncompressed data. Set the " +"compression mode using one of [enum File.CompressionMode]'s constants." +msgstr "" + +#: doc/classes/PoolByteArray.xml +msgid "" +"Returns a new [PoolByteArray] with the data decompressed. Set the " +"compression mode using one of [enum File.CompressionMode]'s constants. " +"[b]This method only accepts gzip and deflate compression modes.[/b]\n" +"This method is potentially slower than [code]decompress[/code], as it may " +"have to re-allocate its output buffer multiple times while decompressing, " +"where as [code]decompress[/code] knows its output buffer size from the " +"beginning.\n" +"\n" +"GZIP has a maximal compression ratio of 1032:1, meaning it's very possible " +"for a small compressed payload to decompress to a potentially very large " +"output. To guard against this, you may provide a maximum size this function " +"is allowed to allocate in bytes via [code]max_output_size[/code]. Passing -1 " +"will allow for unbounded output. If any positive value is passed, and the " +"decompression exceeds that amount in bytes, then an error will be returned." +msgstr "" + +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "" +"Assigns the given value to all elements in the array. This can typically be " +"used together with [method resize] to create an array with a given size and " +"initialized elements." +msgstr "" + +#: doc/classes/PoolByteArray.xml +msgid "" +"Returns a copy of the array's contents as [String]. Fast alternative to " +"[method get_string_from_utf8] if the content is ASCII-only. Unlike the UTF-8 " +"function this function maps every byte to a character in the array. " +"Multibyte sequences will not be interpreted correctly. For parsing user " +"input always use [method get_string_from_utf8]." +msgstr "" + +#: doc/classes/PoolByteArray.xml +msgid "" +"Returns a copy of the array's contents as [String]. Slower than [method " +"get_string_from_ascii] but supports UTF-8 encoded data. Use this function if " +"you are unsure about the source of the data. For user input this function " +"should always be preferred." +msgstr "" + +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "" +"Returns [code]true[/code] if the array contains the given value.\n" +"[b]Note:[/b] This is equivalent to using the [code]in[/code] operator." +msgstr "" + +#: doc/classes/PoolByteArray.xml +msgid "" +"Returns a hexadecimal representation of this array as a [String].\n" +"[codeblock]\n" +"var array = PoolByteArray([11, 46, 255])\n" +"print(array.hex_encode()) # Prints: 0b2eff\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolRealArray.xml doc/classes/PoolStringArray.xml +#: doc/classes/PoolVector2Array.xml doc/classes/PoolVector3Array.xml +msgid "" +"Inserts a new element at a given position in the array. The position must be " +"valid, or at the end of the array ([code]idx == size()[/code])." +msgstr "" + +#: doc/classes/PoolByteArray.xml doc/classes/PoolRealArray.xml +msgid "Appends an element at the end of the array." +msgstr "" + +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Removes an element from the array by index." +msgstr "" + +#: doc/classes/PoolByteArray.xml doc/classes/PoolIntArray.xml +#: doc/classes/PoolRealArray.xml +msgid "" +"Sets the size of the array. If the array is grown, reserves elements at the " +"end of the array. If the array is shrunk, truncates the array to the new " +"size.\n" +"[b]Note:[/b] Added elements are not automatically initialized to 0 and will " +"contain garbage, i.e. indeterminate values." +msgstr "" + +#: doc/classes/PoolByteArray.xml +msgid "Changes the byte at the given index." +msgstr "" + +#: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml +#: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml +#: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml +#: doc/classes/PoolVector3Array.xml +msgid "Sorts the elements of the array in ascending order." +msgstr "" + +#: doc/classes/PoolByteArray.xml +msgid "" +"Returns the slice of the [PoolByteArray] between indices (inclusive) as a " +"new [PoolByteArray]. Any negative index is considered to be from the end of " +"the array." +msgstr "" + +#: doc/classes/PoolColorArray.xml +msgid "A pooled array of [Color]s." +msgstr "" + +#: doc/classes/PoolColorArray.xml +msgid "" +"An array specifically designed to hold [Color]. Optimized for memory usage, " +"does not fragment the memory.\n" +"[b]Note:[/b] This type is passed by value and not by reference. This means " +"that when [i]mutating[/i] a class property of type [PoolColorArray] or " +"mutating a [PoolColorArray] within an [Array] or [Dictionary], changes will " +"be lost:\n" +"[codeblock]\n" +"var array = [PoolColorArray()]\n" +"array[0].push_back(Color(0.1, 0.2, 0.3, 0.4))\n" +"print(array) # [[]] (empty PoolColorArray within an Array)\n" +"[/codeblock]\n" +"Instead, the entire [PoolColorArray] property must be [i]reassigned[/i] with " +"[code]=[/code] for it to be changed:\n" +"[codeblock]\n" +"var array = [PoolColorArray()]\n" +"var pool_array = array[0]\n" +"pool_array.push_back(Color(0.1, 0.2, 0.3, 0.4))\n" +"array[0] = pool_array\n" +"print(array) # [[(0.1, 0.2, 0.3, 0.4)]] (PoolColorArray with 1 element " +"inside an Array)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/PoolColorArray.xml +msgid "" +"Constructs a new [PoolColorArray]. Optionally, you can pass in a generic " +"[Array] that will be converted." +msgstr "" + +#: doc/classes/PoolColorArray.xml +msgid "Appends a [PoolColorArray] at the end of this array." +msgstr "" + +#: doc/classes/PoolColorArray.xml doc/classes/PoolIntArray.xml +msgid "Appends a value to the array." +msgstr "" + +#: doc/classes/PoolColorArray.xml doc/classes/PoolStringArray.xml +#: doc/classes/PoolVector2Array.xml doc/classes/PoolVector3Array.xml +msgid "" +"Sets the size of the array. If the array is grown, reserves elements at the " +"end of the array. If the array is shrunk, truncates the array to the new " +"size." +msgstr "" + +#: doc/classes/PoolColorArray.xml +msgid "Changes the [Color] at the given index." +msgstr "" + +#: doc/classes/PoolIntArray.xml +msgid "A pooled array of integers ([int])." +msgstr "" + +#: doc/classes/PoolIntArray.xml +msgid "" +"An array specifically designed to hold integer values ([int]). Optimized for " +"memory usage, does not fragment the memory.\n" +"[b]Note:[/b] This type is passed by value and not by reference. This means " +"that when [i]mutating[/i] a class property of type [PoolIntArray] or " +"mutating a [PoolIntArray] within an [Array] or [Dictionary], changes will be " +"lost:\n" +"[codeblock]\n" +"var array = [PoolIntArray()]\n" +"array[0].push_back(1234)\n" +"print(array) # [[]] (empty PoolIntArray within an Array)\n" +"[/codeblock]\n" +"Instead, the entire [PoolIntArray] property must be [i]reassigned[/i] with " +"[code]=[/code] for it to be changed:\n" +"[codeblock]\n" +"var array = [PoolIntArray()]\n" +"var pool_array = array[0]\n" +"pool_array.push_back(1234)\n" +"array[0] = pool_array\n" +"print(array) # [[1234]] (PoolIntArray with 1 element inside an Array)\n" +"[/codeblock]\n" +"[b]Note:[/b] This type is limited to signed 32-bit integers, which means it " +"can only take values in the interval [code][-2^31, 2^31 - 1][/code], i.e. " +"[code][-2147483648, 2147483647][/code]. Exceeding those bounds will wrap " +"around. In comparison, [int] uses signed 64-bit integers which can hold much " +"larger values." +msgstr "" + +#: doc/classes/PoolIntArray.xml +msgid "" +"Constructs a new [PoolIntArray]. Optionally, you can pass in a generic " +"[Array] that will be converted." +msgstr "" + +#: doc/classes/PoolIntArray.xml +msgid "Appends a [PoolIntArray] at the end of this array." +msgstr "" + +#: doc/classes/PoolIntArray.xml +msgid "" +"Inserts a new int at a given position in the array. The position must be " +"valid, or at the end of the array ([code]idx == size()[/code])." +msgstr "" + +#: doc/classes/PoolIntArray.xml +msgid "Changes the int at the given index." +msgstr "" + +#: doc/classes/PoolRealArray.xml +msgid "A pooled array of real numbers ([float])." +msgstr "" + +#: doc/classes/PoolRealArray.xml +msgid "" +"An array specifically designed to hold floating-point values. Optimized for " +"memory usage, does not fragment the memory.\n" +"[b]Note:[/b] This type is passed by value and not by reference. This means " +"that when [i]mutating[/i] a class property of type [PoolRealArray] or " +"mutating a [PoolRealArray] within an [Array] or [Dictionary], changes will " +"be lost:\n" +"[codeblock]\n" +"var array = [PoolRealArray()]\n" +"array[0].push_back(12.34)\n" +"print(array) # [[]] (empty PoolRealArray within an Array)\n" +"[/codeblock]\n" +"Instead, the entire [PoolRealArray] property must be [i]reassigned[/i] with " +"[code]=[/code] for it to be changed:\n" +"[codeblock]\n" +"var array = [PoolRealArray()]\n" +"var pool_array = array[0]\n" +"pool_array.push_back(12.34)\n" +"array[0] = pool_array\n" +"print(array) # [[12.34]] (PoolRealArray with 1 element inside an Array)\n" +"[/codeblock]\n" +"[b]Note:[/b] Unlike primitive [float]s which are 64-bit, numbers stored in " +"[PoolRealArray] are 32-bit floats. This means values stored in " +"[PoolRealArray] have lower precision compared to primitive [float]s. If you " +"need to store 64-bit floats in an array, use a generic [Array] with [float] " +"elements as these will still be 64-bit. However, using a generic [Array] to " +"store [float]s will use roughly 6 times more memory compared to a " +"[PoolRealArray]." +msgstr "" + +#: doc/classes/PoolRealArray.xml +msgid "" +"Constructs a new [PoolRealArray]. Optionally, you can pass in a generic " +"[Array] that will be converted." +msgstr "" + +#: doc/classes/PoolRealArray.xml +msgid "Appends a [PoolRealArray] at the end of this array." +msgstr "" + +#: doc/classes/PoolRealArray.xml +msgid "Changes the float at the given index." +msgstr "" + +#: doc/classes/PoolStringArray.xml +msgid "A pooled array of [String]s." +msgstr "" + +#: doc/classes/PoolStringArray.xml +msgid "" +"An array specifically designed to hold [String]s. Optimized for memory " +"usage, does not fragment the memory.\n" +"[b]Note:[/b] This type is passed by value and not by reference. This means " +"that when [i]mutating[/i] a class property of type [PoolStringArray] or " +"mutating a [PoolStringArray] within an [Array] or [Dictionary], changes will " +"be lost:\n" +"[codeblock]\n" +"var array = [PoolStringArray()]\n" +"array[0].push_back(\"hello\")\n" +"print(array) # [[]] (empty PoolStringArray within an Array)\n" +"[/codeblock]\n" +"Instead, the entire [PoolStringArray] property must be [i]reassigned[/i] " +"with [code]=[/code] for it to be changed:\n" +"[codeblock]\n" +"var array = [PoolStringArray()]\n" +"var pool_array = array[0]\n" +"pool_array.push_back(\"hello\")\n" +"array[0] = pool_array\n" +"print(array) # [[hello]] (PoolStringArray with 1 element inside an Array)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/PoolStringArray.xml +msgid "" +"Constructs a new [PoolStringArray]. Optionally, you can pass in a generic " +"[Array] that will be converted." +msgstr "" + +#: doc/classes/PoolStringArray.xml +msgid "Appends a [PoolStringArray] at the end of this array." +msgstr "" + +#: doc/classes/PoolStringArray.xml +msgid "" +"Returns a [String] with each element of the array joined with the given " +"[code]delimiter[/code]." +msgstr "" + +#: doc/classes/PoolStringArray.xml +msgid "Appends a string element at end of the array." +msgstr "" + +#: doc/classes/PoolStringArray.xml +msgid "Changes the [String] at the given index." +msgstr "" + +#: doc/classes/PoolVector2Array.xml +msgid "A pooled array of [Vector2]s." +msgstr "" + +#: doc/classes/PoolVector2Array.xml +msgid "" +"An array specifically designed to hold [Vector2]. Optimized for memory " +"usage, does not fragment the memory.\n" +"[b]Note:[/b] This type is passed by value and not by reference. This means " +"that when [i]mutating[/i] a class property of type [PoolVector2Array] or " +"mutating a [PoolVector2Array] within an [Array] or [Dictionary], changes " +"will be lost:\n" +"[codeblock]\n" +"var array = [PoolVector2Array()]\n" +"array[0].push_back(Vector2(12, 34))\n" +"print(array) # [[]] (empty PoolVector2Array within an Array)\n" +"[/codeblock]\n" +"Instead, the entire [PoolVector2Array] property must be [i]reassigned[/i] " +"with [code]=[/code] for it to be changed:\n" +"[codeblock]\n" +"var array = [PoolVector2Array()]\n" +"var pool_array = array[0]\n" +"pool_array.push_back(Vector2(12, 34))\n" +"array[0] = pool_array\n" +"print(array) # [[(12, 34)]] (PoolVector2Array with 1 element inside an " +"Array)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/PoolVector2Array.xml doc/classes/TileMap.xml +#: doc/classes/TileSet.xml +msgid "2D Navigation Astar Demo" +msgstr "" + +#: doc/classes/PoolVector2Array.xml +msgid "" +"Constructs a new [PoolVector2Array]. Optionally, you can pass in a generic " +"[Array] that will be converted." +msgstr "" + +#: doc/classes/PoolVector2Array.xml +msgid "Appends a [PoolVector2Array] at the end of this array." +msgstr "" + +#: doc/classes/PoolVector2Array.xml +msgid "Inserts a [Vector2] at the end." +msgstr "" + +#: doc/classes/PoolVector2Array.xml +msgid "Changes the [Vector2] at the given index." +msgstr "" + +#: doc/classes/PoolVector3Array.xml +msgid "A pooled array of [Vector3]." +msgstr "" + +#: doc/classes/PoolVector3Array.xml +msgid "" +"An array specifically designed to hold [Vector3]. Optimized for memory " +"usage, does not fragment the memory.\n" +"[b]Note:[/b] This type is passed by value and not by reference. This means " +"that when [i]mutating[/i] a class property of type [PoolVector3Array] or " +"mutating a [PoolVector3Array] within an [Array] or [Dictionary], changes " +"will be lost:\n" +"[codeblock]\n" +"var array = [PoolVector3Array()]\n" +"array[0].push_back(Vector3(12, 34, 56))\n" +"print(array) # [[]] (empty PoolVector3Array within an Array)\n" +"[/codeblock]\n" +"Instead, the entire [PoolVector3Array] property must be [i]reassigned[/i] " +"with [code]=[/code] for it to be changed:\n" +"[codeblock]\n" +"var array = [PoolVector3Array()]\n" +"var pool_array = array[0]\n" +"pool_array.push_back(Vector3(12, 34, 56))\n" +"array[0] = pool_array\n" +"print(array) # [[(12, 34, 56)]] (PoolVector3Array with 1 element inside an " +"Array)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/PoolVector3Array.xml +msgid "" +"Constructs a new [PoolVector3Array]. Optionally, you can pass in a generic " +"[Array] that will be converted." +msgstr "" + +#: doc/classes/PoolVector3Array.xml +msgid "Appends a [PoolVector3Array] at the end of this array." +msgstr "" + +#: doc/classes/PoolVector3Array.xml +msgid "Inserts a [Vector3] at the end." +msgstr "" + +#: doc/classes/PoolVector3Array.xml +msgid "Changes the [Vector3] at the given index." +msgstr "" + +#: doc/classes/Popup.xml +msgid "Base container control for popups and dialogs." +msgstr "" + +#: doc/classes/Popup.xml +msgid "" +"Popup is a base [Control] used to show dialogs and popups. It's a subwindow " +"and modal by default (see [Control]) and has helpers for custom popup " +"behavior. All popup methods ensure correct placement within the viewport." +msgstr "" + +#: doc/classes/Popup.xml +msgid "Popup (show the control in modal form)." +msgstr "" + +#: doc/classes/Popup.xml +msgid "" +"Popup (show the control in modal form) in the center of the screen relative " +"to its current canvas transform, at the current size, or at a size " +"determined by [code]size[/code]." +msgstr "" + +#: doc/classes/Popup.xml +msgid "" +"Popup (show the control in modal form) in the center of the screen relative " +"to the current canvas transform, clamping the size to [code]size[/code], " +"then ensuring the popup is no larger than the viewport size multiplied by " +"[code]fallback_ratio[/code]." +msgstr "" + +#: doc/classes/Popup.xml +msgid "" +"Popup (show the control in modal form) in the center of the screen relative " +"to the current canvas transform, ensuring the size is never smaller than " +"[code]minsize[/code]." +msgstr "" + +#: doc/classes/Popup.xml +msgid "" +"Popup (show the control in modal form) in the center of the screen relative " +"to the current canvas transform, scaled at a ratio of size of the screen." +msgstr "" + +#: doc/classes/Popup.xml +msgid "Shrink popup to keep to the minimum size of content." +msgstr "" + +#: doc/classes/Popup.xml +msgid "" +"If [code]true[/code], the popup will not be hidden when a click event occurs " +"outside of it, or when it receives the [code]ui_cancel[/code] action event.\n" +"[b]Note:[/b] Enabling this property doesn't affect the Close or Cancel " +"buttons' behavior in dialogs that inherit from this class. As a workaround, " +"you can use [method WindowDialog.get_close_button] or [method " +"ConfirmationDialog.get_cancel] and hide the buttons in question by setting " +"their [member CanvasItem.visible] property to [code]false[/code]." +msgstr "" + +#: doc/classes/Popup.xml +msgid "" +"Emitted when a popup is about to be shown. This is often used in [PopupMenu] " +"to clear the list of options then create a new one according to the current " +"context." +msgstr "" + +#: doc/classes/Popup.xml +msgid "Emitted when a popup is hidden." +msgstr "" + +#: doc/classes/Popup.xml +msgid "Notification sent right after the popup is shown." +msgstr "" + +#: doc/classes/Popup.xml +msgid "Notification sent right after the popup is hidden." +msgstr "" + +#: doc/classes/PopupDialog.xml +msgid "Base class for popup dialogs." +msgstr "" + +#: doc/classes/PopupDialog.xml +msgid "" +"PopupDialog is a base class for popup dialogs, along with [WindowDialog]." +msgstr "" + +#: doc/classes/PopupDialog.xml +msgid "Sets a custom [StyleBox] for the panel of the [PopupDialog]." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "PopupMenu displays a list of options." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"[PopupMenu] is a [Control] that displays a list of options. They are popular " +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Adds a new checkable item with text [code]label[/code].\n" +"An [code]id[/code] can optionally be provided, as well as an accelerator " +"([code]accel[/code]). If no [code]id[/code] is provided, one will be created " +"from the index. If no [code]accel[/code] is provided then the default " +"[code]0[/code] will be assigned to it. See [method get_item_accelerator] for " +"more info on accelerators.\n" +"[b]Note:[/b] Checkable items just display a checkmark, but don't have any " +"built-in checking behavior and must be checked/unchecked manually. See " +"[method set_item_checked] for more info on how to control it." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Adds a new checkable item and assigns the specified [ShortCut] to it. Sets " +"the label of the checkbox to the [ShortCut]'s name.\n" +"An [code]id[/code] can optionally be provided. If no [code]id[/code] is " +"provided, one will be created from the index.\n" +"[b]Note:[/b] Checkable items just display a checkmark, but don't have any " +"built-in checking behavior and must be checked/unchecked manually. See " +"[method set_item_checked] for more info on how to control it." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Adds a new checkable item with text [code]label[/code] and icon " +"[code]texture[/code].\n" +"An [code]id[/code] can optionally be provided, as well as an accelerator " +"([code]accel[/code]). If no [code]id[/code] is provided, one will be created " +"from the index. If no [code]accel[/code] is provided then the default " +"[code]0[/code] will be assigned to it. See [method get_item_accelerator] for " +"more info on accelerators.\n" +"[b]Note:[/b] Checkable items just display a checkmark, but don't have any " +"built-in checking behavior and must be checked/unchecked manually. See " +"[method set_item_checked] for more info on how to control it." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Adds a new checkable item and assigns the specified [ShortCut] and icon " +"[code]texture[/code] to it. Sets the label of the checkbox to the " +"[ShortCut]'s name.\n" +"An [code]id[/code] can optionally be provided. If no [code]id[/code] is " +"provided, one will be created from the index.\n" +"[b]Note:[/b] Checkable items just display a checkmark, but don't have any " +"built-in checking behavior and must be checked/unchecked manually. See " +"[method set_item_checked] for more info on how to control it." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Adds a new item with text [code]label[/code] and icon [code]texture[/code].\n" +"An [code]id[/code] can optionally be provided, as well as an accelerator " +"([code]accel[/code]). If no [code]id[/code] is provided, one will be created " +"from the index. If no [code]accel[/code] is provided then the default " +"[code]0[/code] will be assigned to it. See [method get_item_accelerator] for " +"more info on accelerators." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "Same as [method add_icon_check_item], but uses a radio check button." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Same as [method add_icon_check_shortcut], but uses a radio check button." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Adds a new item and assigns the specified [ShortCut] and icon [code]texture[/" +"code] to it. Sets the label of the checkbox to the [ShortCut]'s name.\n" +"An [code]id[/code] can optionally be provided. If no [code]id[/code] is " +"provided, one will be created from the index." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Adds a new item with text [code]label[/code].\n" +"An [code]id[/code] can optionally be provided, as well as an accelerator " +"([code]accel[/code]). If no [code]id[/code] is provided, one will be created " +"from the index. If no [code]accel[/code] is provided then the default " +"[code]0[/code] will be assigned to it. See [method get_item_accelerator] for " +"more info on accelerators." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Adds a new multistate item with text [code]label[/code].\n" +"Contrarily to normal binary items, multistate items can have more than two " +"states, as defined by [code]max_states[/code]. Each press or activate of the " +"item will increase the state by one. The default value is defined by " +"[code]default_state[/code].\n" +"An [code]id[/code] can optionally be provided, as well as an accelerator " +"([code]accel[/code]). If no [code]id[/code] is provided, one will be created " +"from the index. If no [code]accel[/code] is provided then the default " +"[code]0[/code] will be assigned to it. See [method get_item_accelerator] for " +"more info on accelerators." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Adds a new radio check button with text [code]label[/code].\n" +"An [code]id[/code] can optionally be provided, as well as an accelerator " +"([code]accel[/code]). If no [code]id[/code] is provided, one will be created " +"from the index. If no [code]accel[/code] is provided then the default " +"[code]0[/code] will be assigned to it. See [method get_item_accelerator] for " +"more info on accelerators.\n" +"[b]Note:[/b] Checkable items just display a checkmark, but don't have any " +"built-in checking behavior and must be checked/unchecked manually. See " +"[method set_item_checked] for more info on how to control it." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Adds a new radio check button and assigns a [ShortCut] to it. Sets the label " +"of the checkbox to the [ShortCut]'s name.\n" +"An [code]id[/code] can optionally be provided. If no [code]id[/code] is " +"provided, one will be created from the index.\n" +"[b]Note:[/b] Checkable items just display a checkmark, but don't have any " +"built-in checking behavior and must be checked/unchecked manually. See " +"[method set_item_checked] for more info on how to control it." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Adds a separator between items. Separators also occupy an index, which you " +"can set by using the [code]id[/code] parameter.\n" +"A [code]label[/code] can optionally be provided, which will appear at the " +"center of the separator." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Adds a [ShortCut].\n" +"An [code]id[/code] can optionally be provided. If no [code]id[/code] is " +"provided, one will be created from the index." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Adds an item that will act as a submenu of the parent [PopupMenu] node when " +"clicked. The [code]submenu[/code] argument is the name of the child " +"[PopupMenu] node that will be shown when the item is clicked.\n" +"An [code]id[/code] can optionally be provided. If no [code]id[/code] is " +"provided, one will be created from the index." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "Removes all items from the [PopupMenu]." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Returns the index of the currently focused item. Returns [code]-1[/code] if " +"no item is focused." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Returns the accelerator of the item at index [code]idx[/code]. Accelerators " +"are special combinations of keys that activate the item, no matter which " +"control is focused." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "Returns the number of items in the [PopupMenu]." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Returns the id of the item at index [code]idx[/code]. [code]id[/code] can be " +"manually assigned, while index can not." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Returns the index of the item containing the specified [code]id[/code]. " +"Index is automatically assigned to each item by the engine. Index can not be " +"set manually." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Returns the metadata of the specified item, which might be of any type. You " +"can set it with [method set_item_metadata], which provides a simple way of " +"assigning context data to items." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Returns the [ShortCut] associated with the specified [code]idx[/code] item." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Returns the submenu name of the item at index [code]idx[/code]. See [method " +"add_submenu_item] for more info on how to add a submenu." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Returns the tooltip associated with the specified index [code]idx[/code]." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Returns [code]true[/code] if the popup will be hidden when the window loses " +"focus or not." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Returns [code]true[/code] if the item at index [code]idx[/code] is checkable " +"in some way, i.e. if it has a checkbox or radio button.\n" +"[b]Note:[/b] Checkable items just display a checkmark or radio button, but " +"don't have any built-in checking behavior and must be checked/unchecked " +"manually." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Returns [code]true[/code] if the item at index [code]idx[/code] is checked." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Returns [code]true[/code] if the item at index [code]idx[/code] is disabled. " +"When it is disabled it can't be selected, or its action invoked.\n" +"See [method set_item_disabled] for more info on how to disable an item." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Returns [code]true[/code] if the item at index [code]idx[/code] has radio " +"button-style checkability.\n" +"[b]Note:[/b] This is purely cosmetic; you must add the logic for checking/" +"unchecking items in radio groups." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Returns [code]true[/code] if the item is a separator. If it is, it will be " +"displayed as a line. See [method add_separator] for more info on how to add " +"a separator." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "Returns [code]true[/code] if the specified item's shortcut is disabled." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Removes the item at index [code]idx[/code] from the menu.\n" +"[b]Note:[/b] The indices of items after the removed item will be shifted by " +"one." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "Hides the [PopupMenu] when the window loses focus." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Sets the accelerator of the item at index [code]idx[/code]. Accelerators are " +"special combinations of keys that activate the item, no matter which control " +"is focused." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Sets whether the item at index [code]idx[/code] has a checkbox. If " +"[code]false[/code], sets the type of the item to plain text.\n" +"[b]Note:[/b] Checkable items just display a checkmark, but don't have any " +"built-in checking behavior and must be checked/unchecked manually." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Sets the type of the item at the specified index [code]idx[/code] to radio " +"button. If [code]false[/code], sets the type of the item to plain text." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Mark the item at index [code]idx[/code] as a separator, which means that it " +"would be displayed as a line. If [code]false[/code], sets the type of the " +"item to plain text." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "Sets the checkstate status of the item at index [code]idx[/code]." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Enables/disables the item at index [code]idx[/code]. When it is disabled, it " +"can't be selected and its action can't be invoked." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "Replaces the [Texture] icon of the specified [code]idx[/code]." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "Sets the [code]id[/code] of the item at index [code]idx[/code]." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Sets the metadata of an item, which may be of any type. You can later get it " +"with [method get_item_metadata], which provides a simple way of assigning " +"context data to items." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Sets the state of a multistate item. See [method add_multistate_item] for " +"details." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "Sets a [ShortCut] for the specified item [code]idx[/code]." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "Disables the [ShortCut] of the specified index [code]idx[/code]." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Sets the submenu of the item at index [code]idx[/code]. The submenu is the " +"name of a child [PopupMenu] node that would be shown when the item is " +"clicked." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Sets the [String] tooltip of the item at the specified index [code]idx[/" +"code]." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Toggles the check state of the item of the specified index [code]idx[/code]." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Cycle to the next state of a multistate item. See [method " +"add_multistate_item] for details." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "If [code]true[/code], allows navigating [PopupMenu] with letter keys." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"If [code]true[/code], hides the [PopupMenu] when a checkbox or radio button " +"is selected." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "If [code]true[/code], hides the [PopupMenu] when an item is selected." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"If [code]true[/code], hides the [PopupMenu] when a state item is selected." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Sets the delay time in seconds for the submenu item to popup on mouse " +"hovering. If the popup menu is added as a child of another (acting as a " +"submenu), it will inherit the delay time of the parent menu item." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Emitted when user navigated to an item of some [code]id[/code] using " +"[code]ui_up[/code] or [code]ui_down[/code] action." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Emitted when an item of some [code]id[/code] is pressed or its accelerator " +"is activated." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"Emitted when an item of some [code]index[/code] is pressed or its " +"accelerator is activated." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "The default text [Color] for menu items' names." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"The text [Color] used for shortcuts and accelerators that show next to the " +"menu item name when defined. See [method get_item_accelerator] for more info " +"on accelerators." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "[Color] used for disabled menu items' text." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "[Color] used for the hovered text." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "[Color] used for labeled separators' text. See [method add_separator]." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"The horizontal space between the item's name and the shortcut text/submenu " +"arrow." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "The vertical space between each menu item." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "[Font] used for the menu items." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "[Font] used for the labeled separator." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "[Texture] icon for the checked checkbox items." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "[Texture] icon for the checked radio button items." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "[Texture] icon for the unchecked radio button items." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "[Texture] icon for the submenu arrow." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "[Texture] icon for the unchecked checkbox items." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "[StyleBox] displayed when the [PopupMenu] item is hovered." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"[StyleBox] for the left side of labeled separator. See [method " +"add_separator]." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "" +"[StyleBox] for the right side of labeled separator. See [method " +"add_separator]." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "Default [StyleBox] of the [PopupMenu] items." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "[StyleBox] used when the [PopupMenu] item is disabled." +msgstr "" + +#: doc/classes/PopupMenu.xml +msgid "[StyleBox] used for the separators. See [method add_separator]." +msgstr "" + +#: doc/classes/PopupPanel.xml +msgid "Class for displaying popups with a panel background." +msgstr "" + +#: doc/classes/PopupPanel.xml +msgid "" +"Class for displaying popups with a panel background. In some cases it might " +"be simpler to use than [Popup], since it provides a configurable background. " +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." +msgstr "" + +#: doc/classes/PopupPanel.xml +msgid "The background panel style of this [PopupPanel]." +msgstr "" + +#: doc/classes/Portal.xml +msgid "Portal nodes are used to enable visibility between [Room]s." +msgstr "" + +#: doc/classes/Portal.xml +msgid "" +"[Portal]s are a special type of [MeshInstance] that allow the portal culling " +"system to 'see' from one room to the next. They often correspond to doors " +"and windows in level geometry. By only allowing [Camera]s to see through " +"portals, this allows the system to cull out all the objects in rooms that " +"cannot be seen through portals. This is a form of [b]occlusion culling[/b], " +"and can greatly increase performance.\n" +"There are some limitations to the form of portals:\n" +"They must be single sided convex polygons, and usually you would orientate " +"their front faces [b]outward[/b] from the [Room] they are placed in. The " +"vertices should be positioned on a single plane (although their positioning " +"does not have to be perfect).\n" +"There is no need to place an opposite portal in an adjacent room, links are " +"made two-way automatically." +msgstr "" + +#: doc/classes/Portal.xml doc/classes/Room.xml +msgid "Sets individual points. Primarily for use by the editor." +msgstr "" + +#: doc/classes/Portal.xml +msgid "" +"This is a shortcut for setting the linked [Room] in the name of the [Portal] " +"(the name is used during conversion)." +msgstr "" + +#: doc/classes/Portal.xml +msgid "" +"The points defining the shape of the [Portal] polygon (which should be " +"convex).\n" +"These are defined in 2D, with [code]0,0[/code] being the origin of the " +"[Portal] node's [member Spatial.global_transform].\n" +"[b]Note:[/b] These raw points are sanitized for winding order internally." +msgstr "" + +#: doc/classes/Portal.xml +msgid "" +"Visibility through [Portal]s can be turned on and off at runtime - this is " +"useful for having closable doors." +msgstr "" + +#: doc/classes/Portal.xml +msgid "" +"Some objects are so big that they may be present in more than one [Room] " +"('sprawling'). As we often don't want objects that *just* breach the edges " +"to be assigned to neighbouring rooms, you can assign an extra margin through " +"the [Portal] to allow objects to breach without sprawling." +msgstr "" + +#: doc/classes/Portal.xml +msgid "" +"Portals default to being two way - see through in both directions, however " +"you can make them one way, visible from the source room only." +msgstr "" + +#: doc/classes/Portal.xml +msgid "" +"In most cases you will want to use the default [Portal] margin in your " +"portals (this is set in the [RoomManager]).\n" +"If you want to override this default, set this value to [code]false[/code], " +"and the local [member portal_margin] will take effect." +msgstr "" + +#: doc/classes/Position2D.xml +msgid "Generic 2D position hint for editing." +msgstr "" + +#: doc/classes/Position2D.xml +msgid "" +"Generic 2D position hint for editing. It's just like a plain [Node2D], but " +"it displays as a cross in the 2D editor at all times. You can set cross' " +"visual size by using the gizmo in the 2D editor while the node is selected." +msgstr "" + +#: doc/classes/Position3D.xml +msgid "Generic 3D position hint for editing." +msgstr "" + +#: doc/classes/Position3D.xml +msgid "" +"Generic 3D position hint for editing. It's just like a plain [Spatial], but " +"it displays as a cross in the 3D editor at all times." +msgstr "" + +#: doc/classes/PrimitiveMesh.xml +msgid "" +"Base class for all primitive meshes. Handles applying a [Material] to a " +"primitive mesh." +msgstr "" + +#: doc/classes/PrimitiveMesh.xml +msgid "" +"Base class for all primitive meshes. Handles applying a [Material] to a " +"primitive mesh. Examples include [CapsuleMesh], [CubeMesh], [CylinderMesh], " +"[PlaneMesh], [PrismMesh], [QuadMesh], and [SphereMesh]." +msgstr "" + +#: doc/classes/PrimitiveMesh.xml +msgid "" +"Returns mesh arrays used to constitute surface of [Mesh]. The result can be " +"passed to [method ArrayMesh.add_surface_from_arrays] to create a new " +"surface. For example:\n" +"[codeblock]\n" +"var c := CylinderMesh.new()\n" +"var arr_mesh := ArrayMesh.new()\n" +"arr_mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, c." +"get_mesh_arrays())\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/PrimitiveMesh.xml +msgid "" +"If set, the order of the vertices in each triangle are reversed resulting in " +"the backside of the mesh being drawn.\n" +"This gives the same result as using [constant SpatialMaterial.CULL_BACK] in " +"[member SpatialMaterial.params_cull_mode]." +msgstr "" + +#: doc/classes/PrimitiveMesh.xml +msgid "The current [Material] of the primitive mesh." +msgstr "" + +#: doc/classes/PrismMesh.xml +msgid "Class representing a prism-shaped [PrimitiveMesh]." +msgstr "" + +#: doc/classes/PrismMesh.xml +msgid "" +"Displacement of the upper edge along the X axis. 0.0 positions edge straight " +"above the bottom-left edge." +msgstr "" + +#: doc/classes/PrismMesh.xml +msgid "Size of the prism." +msgstr "" + +#: doc/classes/PrismMesh.xml +msgid "Number of added edge loops along the Z axis." +msgstr "" + +#: doc/classes/PrismMesh.xml +msgid "Number of added edge loops along the Y axis." +msgstr "" + +#: doc/classes/PrismMesh.xml +msgid "Number of added edge loops along the X axis." +msgstr "" + +#: doc/classes/ProceduralSky.xml +msgid "" +"Type of [Sky] that is generated procedurally based on user input parameters." +msgstr "" + +#: doc/classes/ProceduralSky.xml +msgid "" +"ProceduralSky provides a way to create an effective background quickly by " +"defining procedural parameters for the sun, the sky and the ground. The sky " +"and ground are very similar, they are defined by a color at the horizon, " +"another color, and finally an easing curve to interpolate between these two " +"colors. Similarly, the sun is described by a position in the sky, a color, " +"and an easing curve. However, the sun also defines a minimum and maximum " +"angle, these two values define at what distance the easing curve begins and " +"ends from the sun, and thus end up defining the size of the sun in the sky.\n" +"The ProceduralSky is updated on the CPU after the parameters change. It is " +"stored in a texture and then displayed as a background in the scene. This " +"makes it relatively unsuitable for real-time updates during gameplay. " +"However, with a small enough texture size, it can still be updated " +"relatively frequently, as it is updated on a background thread when multi-" +"threading is available." +msgstr "" + +#: doc/classes/ProceduralSky.xml +msgid "Color of the ground at the bottom." +msgstr "" + +#: doc/classes/ProceduralSky.xml +msgid "" +"How quickly the [member ground_horizon_color] fades into the [member " +"ground_bottom_color]." +msgstr "" + +#: doc/classes/ProceduralSky.xml +msgid "Amount of energy contribution from the ground." +msgstr "" + +#: doc/classes/ProceduralSky.xml +msgid "Color of the ground at the horizon." +msgstr "" + +#: doc/classes/ProceduralSky.xml +msgid "" +"How quickly the [member sky_horizon_color] fades into the [member " +"sky_top_color]." +msgstr "" + +#: doc/classes/ProceduralSky.xml +msgid "Amount of energy contribution from the sky." +msgstr "" + +#: doc/classes/ProceduralSky.xml +msgid "Color of the sky at the horizon." +msgstr "" + +#: doc/classes/ProceduralSky.xml +msgid "Color of the sky at the top." +msgstr "" + +#: doc/classes/ProceduralSky.xml +msgid "Distance from center of sun where it fades out completely." +msgstr "" + +#: doc/classes/ProceduralSky.xml +msgid "Distance from sun where it goes from solid to starting to fade." +msgstr "" + +#: doc/classes/ProceduralSky.xml +msgid "The sun's color." +msgstr "" + +#: doc/classes/ProceduralSky.xml +msgid "" +"How quickly the sun fades away between [member sun_angle_min] and [member " +"sun_angle_max]." +msgstr "" + +#: doc/classes/ProceduralSky.xml +msgid "Amount of energy contribution from the sun." +msgstr "" + +#: doc/classes/ProceduralSky.xml +msgid "The sun's height using polar coordinates." +msgstr "" + +#: doc/classes/ProceduralSky.xml +msgid "The direction of the sun using polar coordinates." +msgstr "" + +#: doc/classes/ProceduralSky.xml +msgid "" +"Size of [Texture] that the ProceduralSky will generate. The size is set " +"using [enum TextureSize]." +msgstr "" + +#: doc/classes/ProceduralSky.xml +msgid "Sky texture will be 256x128." +msgstr "" + +#: doc/classes/ProceduralSky.xml +msgid "Sky texture will be 512x256." +msgstr "" + +#: doc/classes/ProceduralSky.xml +msgid "Sky texture will be 1024x512. This is the default size." +msgstr "" + +#: doc/classes/ProceduralSky.xml +msgid "Sky texture will be 2048x1024." +msgstr "" + +#: doc/classes/ProceduralSky.xml +msgid "Sky texture will be 4096x2048." +msgstr "" + +#: doc/classes/ProceduralSky.xml +msgid "Represents the size of the [enum TextureSize] enum." +msgstr "" + +#: doc/classes/ProgressBar.xml +msgid "General-purpose progress bar." +msgstr "" + +#: doc/classes/ProgressBar.xml +msgid "General-purpose progress bar. Shows fill percentage from right to left." +msgstr "" + +#: doc/classes/ProgressBar.xml +msgid "If [code]true[/code], the fill percentage is displayed on the bar." +msgstr "" + +#: doc/classes/ProgressBar.xml +msgid "The color of the text." +msgstr "" + +#: doc/classes/ProgressBar.xml +msgid "The color of the text's shadow." +msgstr "" + +#: doc/classes/ProgressBar.xml +msgid "" +"Font used to draw the fill percentage if [member percent_visible] is " +"[code]true[/code]." +msgstr "" + +#: doc/classes/ProgressBar.xml +msgid "The style of the background." +msgstr "" + +#: doc/classes/ProgressBar.xml +msgid "The style of the progress (i.e. the part that fills the bar)." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Contains global variables accessible from everywhere." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Contains global variables accessible from everywhere. Use [method " +"get_setting], [method set_setting] or [method has_setting] to access them. " +"Variables stored in [code]project.godot[/code] are also loaded into " +"ProjectSettings, making this object very useful for reading custom game " +"configuration options.\n" +"When naming a Project Settings property, use the full path to the setting " +"including the category. For example, [code]\"application/config/name\"[/" +"code] for the project name. Category and property names can be viewed in the " +"Project Settings dialog.\n" +"[b]Feature tags:[/b] Project settings can be overridden for specific " +"platforms and configurations (debug, release, ...) using [url=$DOCS_URL/" +"tutorials/export/feature_tags.html]feature tags[/url].\n" +"[b]Overriding:[/b] Any project setting can be overridden by creating a file " +"named [code]override.cfg[/code] in the project's root directory. This can " +"also be used in exported projects by placing this file in the same directory " +"as the project binary. Overriding will still take the base project " +"settings' [url=$DOCS_URL/tutorials/export/feature_tags.html]feature tags[/" +"url] in account. Therefore, make sure to [i]also[/i] override the setting " +"with the desired feature tags if you want them to override base project " +"settings on all platforms and configurations." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Adds a custom property info to a property. The dictionary must contain:\n" +"- [code]name[/code]: [String] (the property's name)\n" +"- [code]type[/code]: [int] (see [enum Variant.Type])\n" +"- optionally [code]hint[/code]: [int] (see [enum PropertyHint]) and " +"[code]hint_string[/code]: [String]\n" +"[b]Example:[/b]\n" +"[codeblock]\n" +"ProjectSettings.set(\"category/property_name\", 0)\n" +"\n" +"var property_info = {\n" +" \"name\": \"category/property_name\",\n" +" \"type\": TYPE_INT,\n" +" \"hint\": PROPERTY_HINT_ENUM,\n" +" \"hint_string\": \"one,two,three\"\n" +"}\n" +"\n" +"ProjectSettings.add_property_info(property_info)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Clears the whole configuration (not recommended, may break things)." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Returns the order of a configuration value (influences when saved to the " +"config file)." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Returns the value of a setting.\n" +"[b]Example:[/b]\n" +"[codeblock]\n" +"print(ProjectSettings.get_setting(\"application/config/name\"))\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Returns the absolute, native OS path corresponding to the localized " +"[code]path[/code] (starting with [code]res://[/code] or [code]user://[/" +"code]). The returned path will vary depending on the operating system and " +"user preferences. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths " +"in Godot projects[/url] to see what those paths convert to. See also [method " +"localize_path].\n" +"[b]Note:[/b] [method globalize_path] with [code]res://[/code] will not work " +"in an exported project. Instead, prepend the executable's base directory to " +"the path when running from an exported project:\n" +"[codeblock]\n" +"var path = \"\"\n" +"if OS.has_feature(\"editor\"):\n" +" # Running from an editor binary.\n" +" # `path` will contain the absolute path to `hello.txt` located in the " +"project root.\n" +" path = ProjectSettings.globalize_path(\"res://hello.txt\")\n" +"else:\n" +" # Running from an exported project.\n" +" # `path` will contain the absolute path to `hello.txt` next to the " +"executable.\n" +" # This is *not* identical to using `ProjectSettings.globalize_path()` " +"with a `res://` path,\n" +" # but is close enough in spirit.\n" +" path = OS.get_executable_path().get_base_dir().plus_file(\"hello.txt\")\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Returns [code]true[/code] if a configuration value is present." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Loads the contents of the .pck or .zip file specified by [code]pack[/code] " +"into the resource filesystem ([code]res://[/code]). Returns [code]true[/" +"code] on success.\n" +"[b]Note:[/b] If a file from [code]pack[/code] shares the same path as a file " +"already in the resource filesystem, any attempts to load that file will use " +"the file from [code]pack[/code] unless [code]replace_files[/code] is set to " +"[code]false[/code].\n" +"[b]Note:[/b] The optional [code]offset[/code] parameter can be used to " +"specify the offset in bytes to the start of the resource pack. This is only " +"supported for .pck files." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Returns the localized path (starting with [code]res://[/code]) corresponding " +"to the absolute, native OS [code]path[/code]. See also [method " +"globalize_path]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Returns [code]true[/code] if the specified property exists and its initial " +"value differs from the current value." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Returns the specified property's initial value. Returns [code]null[/code] if " +"the property does not exist." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Saves the configuration to the [code]project.godot[/code] file.\n" +"[b]Note:[/b] This method is intended to be used by editor plugins, as " +"modified [ProjectSettings] can't be loaded back in the running app. If you " +"want to change project settings in exported projects, use [method " +"save_custom] to save [code]override.cfg[/code] file." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Saves the configuration to a custom file. The file extension must be [code]." +"godot[/code] (to save in text-based [ConfigFile] format) or [code].binary[/" +"code] (to save in binary format). You can also save [code]override.cfg[/" +"code] file, which is also text, but can be used in exported projects unlike " +"other formats." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Sets the specified property's initial value. This is the value the property " +"reverts to." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Sets the order of a configuration value (influences when saved to the config " +"file)." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Sets the value of a setting.\n" +"[b]Example:[/b]\n" +"[codeblock]\n" +"ProjectSettings.set_setting(\"application/config/name\", \"Example\")\n" +"[/codeblock]\n" +"This can also be used to erase custom project settings. To do this change " +"the setting value to [code]null[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Comma-separated list of custom Android modules (which must have been built " +"in the Android export templates) using their Java package path, e.g. " +"[code]\"org/godotengine/godot/MyCustomSingleton,com/example/foo/" +"FrenchFriesFactory\"[/code].\n" +"[b]Note:[/b] Since Godot 3.2.2, the [code]org/godotengine/godot/" +"GodotPaymentV3[/code] module was deprecated and replaced by the " +"[code]GodotPayment[/code] plugin which should be enabled in the Android " +"export preset under [code]Plugins[/code] section. The singleton to access in " +"code was also renamed to [code]GodotPayment[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Background color for the boot splash." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], scale the boot splash image to the full window size " +"(preserving the aspect ratio) when the engine starts. If [code]false[/code], " +"the engine will leave it at the default pixel size." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Path to an image used as the boot splash. If left empty, the default Godot " +"Engine splash will be displayed instead.\n" +"[b]Note:[/b] Only effective if [member application/boot_splash/show_image] " +"is [code]true[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], displays the image specified in [member application/" +"boot_splash/image] when the engine starts. If [code]false[/code], only " +"displays the plain color specified in [member application/boot_splash/" +"bg_color]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], applies linear filtering when scaling the image " +"(recommended for high-resolution artwork). If [code]false[/code], uses " +"nearest-neighbor interpolation (recommended for pixel art)." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"This user directory is used for storing persistent data ([code]user://[/" +"code] filesystem). If left empty, [code]user://[/code] resolves to a project-" +"specific folder in Godot's own configuration folder (see [method OS." +"get_user_data_dir]). If a custom directory name is defined, this name will " +"be used instead and appended to the system-specific user data directory " +"(same parent folder as the Godot configuration folder documented in [method " +"OS.get_user_data_dir]).\n" +"The [member application/config/use_custom_user_dir] setting must be enabled " +"for this to take effect." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The project's description, displayed as a tooltip in the Project Manager " +"when hovering the project." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Icon used for the project, set when project loads. Exporters will also use " +"this icon when possible." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Icon set in [code].icns[/code] format used on macOS to set the game's icon. " +"This is done automatically on start by calling [method OS.set_native_icon]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The project's name. It is used both by the Project Manager and by exporters. " +"The project name can be translated by translating its value in localization " +"files. The window title will be set to match the project name automatically " +"on startup.\n" +"[b]Note:[/b] Changing this value will also change the user data folder's " +"path if [member application/config/use_custom_user_dir] is [code]false[/" +"code]. After renaming the project, you will no longer be able to access " +"existing data in [code]user://[/code] unless you rename the old folder to " +"match the new project name. See [url=$DOCS_URL/tutorials/io/data_paths." +"html]Data paths[/url] in the documentation for more information." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Specifies a file to override project settings. For example: [code]user://" +"custom_settings.cfg[/code]. See \"Overriding\" in the [ProjectSettings] " +"class description at the top for more information.\n" +"[b]Note:[/b] Regardless of this setting's value, [code]res://override.cfg[/" +"code] will still be read to override the project settings." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], the project will save user data to its own user " +"directory (see [member application/config/custom_user_dir_name]). This " +"setting is only effective on desktop platforms. A name must be set in the " +"[member application/config/custom_user_dir_name] setting for this to take " +"effect. If [code]false[/code], the project will save user data to [code](OS " +"user data directory)/Godot/app_userdata/(project name)[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], the project will use a hidden directory ([code]." +"import[/code]) for storing project-specific data (metadata, shader cache, " +"etc.).\n" +"If [code]false[/code], a non-hidden directory ([code]import[/code]) will be " +"used instead.\n" +"[b]Note:[/b] Restart the application after changing this setting.\n" +"[b]Note:[/b] Changing this value can help on platforms or with third-party " +"tools where hidden directory patterns are disallowed. Only modify this " +"setting if you know that your environment requires it, as changing the " +"default can impact compatibility with some external tools or plugins which " +"expect the default [code].import[/code] folder." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Icon set in [code].ico[/code] format used on Windows to set the game's icon. " +"This is done automatically on start by calling [method OS.set_native_icon]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Time samples for frame deltas are subject to random variation introduced by " +"the platform, even when frames are displayed at regular intervals thanks to " +"V-Sync. This can lead to jitter. Delta smoothing can often give a better " +"result by filtering the input deltas to correct for minor fluctuations from " +"the refresh rate.\n" +"[b]Note:[/b] Delta smoothing is only attempted when [member display/window/" +"vsync/use_vsync] is switched on, as it does not work well without V-Sync.\n" +"It may take several seconds at a stable frame rate before the smoothing is " +"initially activated. It will only be active on machines where performance is " +"adequate to render frames at the refresh rate." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"[b]Experimental.[/b] Shifts the measurement of delta time for each frame to " +"just after the drawing has taken place. This may lead to more consistent " +"deltas and a reduction in frame stutters." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], disables printing to standard error. If [code]true[/" +"code], this also hides error and warning messages printed by [method " +"@GDScript.push_error] and [method @GDScript.push_warning]. See also [member " +"application/run/disable_stdout].\n" +"Changes to this setting will only be applied upon restarting the application." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], disables printing to standard output. This is " +"equivalent to starting the editor or project with the [code]--quiet[/code] " +"command line argument. See also [member application/run/disable_stderr].\n" +"Changes to this setting will only be applied upon restarting the application." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], flushes the standard output stream every time a line " +"is printed. This affects both terminal logging and file logging.\n" +"When running a project, this setting must be enabled if you want logs to be " +"collected by service managers such as systemd/journalctl. This setting is " +"disabled by default on release builds, since flushing on every printed line " +"will negatively affect performance if lots of lines are printed in a rapid " +"succession. Also, if this setting is enabled, logged files will still be " +"written successfully if the application crashes or is otherwise killed by " +"the user (without being closed \"normally\").\n" +"[b]Note:[/b] Regardless of this setting, the standard error stream " +"([code]stderr[/code]) is always flushed when a line is printed to it.\n" +"Changes to this setting will only be applied upon restarting the application." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Debug build override for [member application/run/flush_stdout_on_print], as " +"performance is less important during debugging.\n" +"Changes to this setting will only be applied upon restarting the application." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Forces a delay between frames in the main loop (in milliseconds). This may " +"be useful if you plan to disable vertical synchronization." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], enables low-processor usage mode. This setting only " +"works on desktop platforms. The screen is not redrawn if nothing changes " +"visually. This is meant for writing applications and editors, but is pretty " +"useless (and can hurt performance) in most games." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Amount of sleeping between frames when the low-processor usage mode is " +"enabled (in microseconds). Higher values will result in lower CPU usage." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Path to the main scene file that will be loaded when the project runs." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Audio buses will disable automatically when sound goes below a given dB " +"threshold for a given time. This saves CPU as effects assigned to that bus " +"will no longer do any processing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Default [AudioBusLayout] resource file to use in the project, unless " +"overridden by the scene." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Specifies the audio driver to use. This setting is platform-dependent as " +"each platform supports different audio drivers. If left empty, the default " +"audio driver will be used." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], microphone input will be allowed. This requires " +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The mixing rate used for audio (in Hz). In general, it's better to not touch " +"this and leave it to the host operating system." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Safer override for [member audio/mix_rate] in the Web platform. Here " +"[code]0[/code] means \"let the browser choose\" (since some browsers do not " +"like forcing the mix rate)." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Specifies the preferred output latency in milliseconds for audio. Lower " +"values will result in lower audio latency at the cost of increased CPU " +"usage. Low values may result in audible cracking on slower hardware.\n" +"Audio output latency may be constrained by the host operating system and " +"audio hardware drivers. If the host can not provide the specified audio " +"output latency then Godot will attempt to use the nearest latency allowed by " +"the host. As such you should always use [method AudioServer." +"get_output_latency] to determine the actual audio output latency.\n" +"[b]Note:[/b] This setting is ignored on Windows." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Safer override for [member audio/output_latency] in the Web platform, to " +"avoid audio issues especially on mobile devices." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Setting to hardcode audio delay when playing video. Best to leave this " +"untouched unless you know what you are doing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default compression level for gzip. Affects compressed scenes and " +"resources. Higher levels result in smaller files at the cost of compression " +"speed. Decompression speed is mostly unaffected by the compression level. " +"[code]-1[/code] uses the default gzip compression level, which is identical " +"to [code]6[/code] but could change in the future due to underlying zlib " +"updates." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default compression level for Zlib. Affects compressed scenes and " +"resources. Higher levels result in smaller files at the cost of compression " +"speed. Decompression speed is mostly unaffected by the compression level. " +"[code]-1[/code] uses the default gzip compression level, which is identical " +"to [code]6[/code] but could change in the future due to underlying zlib " +"updates." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default compression level for Zstandard. Affects compressed scenes and " +"resources. Higher levels result in smaller files at the cost of compression " +"speed. Decompression speed is mostly unaffected by the compression level." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Enables [url=https://github.com/facebook/zstd/releases/tag/v1.3.2]long-" +"distance matching[/url] in Zstandard." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Largest size limit (in power of 2) allowed when compressing using long-" +"distance matching with Zstandard. Higher values can result in better " +"compression, but will require more memory when compressing and decompressing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], displays getters and setters in autocompletion results " +"in the script editor. This setting is meant to be used when porting old " +"projects (Godot 2), as using member variables is the preferred style from " +"Godot 3 onwards." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], enables warnings when a constant is used as a function." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], enables warnings when deprecated keywords such as " +"[code]slave[/code] are used." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], enables specific GDScript warnings (see [code]debug/" +"gdscript/warnings/*[/code] settings). If [code]false[/code], disables all " +"GDScript warnings." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], scripts in the [code]res://addons[/code] folder will " +"not generate warnings." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], enables warnings when the type of the default value " +"set to an exported variable is different than the specified export type." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], enables warnings when a function is declared with the " +"same name as a constant." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], enables warnings when a function is declared with the " +"same name as a variable. This will turn into an error in a future version " +"when first-class functions become supported in GDScript." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], enables warnings when a function assigned to a " +"variable may yield and return a function state instead of a value." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], enables warnings when using a function as if it was a " +"property." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], enables warnings when a ternary operator may emit " +"values with incompatible types." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], enables warnings when dividing an integer by another " +"integer (the decimal part will be discarded)." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], enables warnings when passing a floating-point value " +"to a function that expects an integer (it will be converted and lose " +"precision)." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], enables warnings when using a property as if it was a " +"function." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], enables warnings when calling a function without using " +"its return value (by assigning it to a variable or using it as a function " +"argument). Such return values are sometimes used to denote possible errors " +"using the [enum Error] enum." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], enables warnings when defining a local or subclass " +"member variable that would shadow a variable at an upper level (such as a " +"member variable)." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], enables warnings when calling an expression that has " +"no effect on the surrounding code, such as writing [code]2 + 2[/code] as a " +"statement." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], enables warnings when calling a ternary expression " +"that has no effect on the surrounding code, such as writing [code]42 if " +"active else 0[/code] as a statement." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], all warnings will be reported as if they were errors." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], enables warnings when using a variable that wasn't " +"previously assigned." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], enables warnings when assigning a variable using an " +"assignment operator like [code]+=[/code] if the variable wasn't previously " +"assigned." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], enables warnings when unreachable code is detected " +"(such as after a [code]return[/code] statement that will always be executed)." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], enables warnings when using an expression whose type " +"may not be compatible with the function parameter expected." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "If [code]true[/code], enables warnings when performing an unsafe cast." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], enables warnings when calling a method whose presence " +"is not guaranteed at compile-time in the class." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], enables warnings when accessing a property whose " +"presence is not guaranteed at compile-time in the class." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], enables warnings when a function parameter is unused." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], enables warnings when a member variable is unused." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "If [code]true[/code], enables warnings when a signal is unused." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "If [code]true[/code], enables warnings when a local variable is unused." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], enables warnings when a variable is declared with the " +"same name as a function. This will turn into an error in a future version " +"when first-class functions become supported in GDScript." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], enables warnings when assigning the result of a " +"function that returns [code]void[/code] to a variable." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Message to be displayed before the backtrace when the engine crashes. By " +"default, this message is only used in exported projects due to the editor-" +"only override applied to this setting." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Editor-only override for [member debug/settings/crash_handler/message]. Does " +"not affect exported projects in debug or release mode." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Maximum number of frames per second allowed. The actual number of frames per " +"second may still be below this value if the game is lagging. See also " +"[member physics/common/physics_fps].\n" +"If [member display/window/vsync/use_vsync] is enabled, it takes precedence " +"and the forced FPS number cannot exceed the monitor's refresh rate.\n" +"This setting is therefore mostly relevant for lowering the maximum FPS below " +"VSync, e.g. to perform non-real-time rendering of static frames, or test the " +"project under lag conditions.\n" +"[b]Note:[/b] This property is only read when the project starts. To change " +"the rendering FPS cap at runtime, set [member Engine.target_fps] instead." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Maximum call stack allowed for debugging GDScript." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], enables warnings which can help pinpoint where nodes " +"are being incorrectly updated, which will result in incorrect interpolation " +"and visual glitches.\n" +"When a node is being interpolated, it is essential that the transform is set " +"during [method Node._physics_process] (during a physics tick) rather than " +"[method Node._process] (during a frame)." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Maximum amount of functions per frame allowed when profiling." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Print frames per second to standard output every second." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Print more information to standard output when running. It displays " +"information such as memory leaks, which scenes and resources are being " +"loaded, etc." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Maximum call stack in visual scripting, to avoid infinite recursion." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Color of the contact points between collision shapes, visible when \"Visible " +"Collision Shapes\" is enabled in the Debug menu." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Sets whether 2D physics will display collision outlines in game when " +"\"Visible Collision Shapes\" is enabled in the Debug menu." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Maximum number of contact points between collision shapes to display when " +"\"Visible Collision Shapes\" is enabled in the Debug menu." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Color of the collision shapes, visible when \"Visible Collision Shapes\" is " +"enabled in the Debug menu." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Color of the disabled navigation geometry, visible when \"Visible " +"Navigation\" is enabled in the Debug menu." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Color of the navigation geometry, visible when \"Visible Navigation\" is " +"enabled in the Debug menu." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Custom image for the mouse cursor (limited to 256×256)." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Hotspot for the custom mouse cursor image." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Position offset for tooltips, relative to the mouse cursor's hotspot." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], allows HiDPI display on Windows, macOS, and the HTML5 " +"platform. This setting has no effect on desktop Linux, as DPI-awareness " +"fallbacks are not supported there." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], keeps the screen on (even in case of inactivity), so " +"the screensaver does not take over. Works on desktop and mobile platforms." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default screen orientation to use on mobile devices.\n" +"[b]Note:[/b] When set to a portrait orientation, this project setting does " +"not flip the project resolution's width and height automatically. Instead, " +"you have to set [member display/window/size/width] and [member display/" +"window/size/height] accordingly." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], the home indicator is hidden automatically. This only " +"affects iOS devices without a physical home button." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], allows per-pixel transparency for the window " +"background. This affects performance, so leave it on [code]false[/code] " +"unless you need it.\n" +"See [member OS.window_per_pixel_transparency_enabled] for more details.\n" +"[b]Note:[/b] This feature is implemented on HTML5, Linux, macOS, Windows, " +"and Android." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Sets the window background to transparent when it starts.\n" +"See [member OS.window_per_pixel_transparency_enabled] for more details.\n" +"[b]Note:[/b] This feature is implemented on HTML5, Linux, macOS, Windows, " +"and Android." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Forces the main window to be always on top.\n" +"[b]Note:[/b] This setting is ignored on iOS, Android, and HTML5." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Forces the main window to be borderless.\n" +"[b]Note:[/b] This setting is ignored on iOS, Android, and HTML5." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Sets the main window to full screen when the project starts. Note that this " +"is not [i]exclusive[/i] fullscreen. On Windows and Linux, a borderless " +"window is used to emulate fullscreen. On macOS, a new desktop is used to " +"display the running project.\n" +"Regardless of the platform, enabling fullscreen will change the window size " +"to match the monitor's size. Therefore, make sure your project supports " +"[url=$DOCS_URL/tutorials/rendering/multiple_resolutions.html]multiple " +"resolutions[/url] when enabling fullscreen mode.\n" +"[b]Note:[/b] This setting is ignored on iOS, Android, and HTML5." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Sets the game's main viewport height. On desktop platforms, this is the " +"default window size. Stretch mode settings also use this as a reference when " +"enabled." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Allows the window to be resizable by default.\n" +"[b]Note:[/b] This setting is ignored on iOS." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If greater than zero, overrides the window height when running the game. " +"Useful for testing stretch modes." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If greater than zero, overrides the window width when running the game. " +"Useful for testing stretch modes." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Sets the game's main viewport width. On desktop platforms, this is the " +"default window size. Stretch mode settings also use this as a reference when " +"enabled." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Specifies the tablet driver to use. If left empty, the default driver will " +"be used." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], enables vertical synchronization. This eliminates " +"tearing that may appear in moving scenes, at the cost of higher input " +"latency and stuttering at lower framerates. If [code]false[/code], vertical " +"synchronization will be disabled, however, many platforms will enforce it " +"regardless (such as mobile platforms and HTML5)." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]Use Vsync[/code] is enabled and this setting is [code]true[/code], " +"enables vertical synchronization via the operating system's window " +"compositor when in windowed mode and the compositor is enabled. This will " +"prevent stutter in certain situations. (Windows only.)\n" +"[b]Note:[/b] This option is experimental and meant to alleviate stutter " +"experienced by some users. However, some users have experienced a Vsync " +"framerate halving (e.g. from 60 FPS to 30 FPS) when using it." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The command-line arguments to append to Godot's own command line when " +"running the project. This doesn't affect the editor itself.\n" +"It is possible to make another executable run Godot by using the " +"[code]%command%[/code] placeholder. The placeholder will be replaced with " +"Godot's own command line. Program-specific arguments should be placed " +"[i]before[/i] the placeholder, whereas Godot-specific arguments should be " +"placed [i]after[/i] the placeholder.\n" +"For example, this can be used to force the project to run on the dedicated " +"GPU in a NVIDIA Optimus system on Linux:\n" +"[codeblock]\n" +"prime-run %command%\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Default naming style for scene files to infer from their root nodes. " +"Possible options are:\n" +"- [code]0[/code] (Auto): Uses the scene root name as is without changing its " +"casing.\n" +"- [code]1[/code] (PascalCase): Converts the scene root name to PascalCase " +"casing.\n" +"- [code]2[/code] (snake_case): Converts the scene root name to snake_case " +"casing." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Search path for project-specific script templates. Godot will search for " +"script templates both in the editor-specific path and in this project-" +"specific path." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Text-based file extensions to include in the script editor's \"Find in " +"Files\" feature. You can add e.g. [code]tscn[/code] if you wish to also " +"parse your scene files, especially if you use built-in scripts which are " +"serialized in the scene files." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Load the previously opened VCS plugin when the editor starts up. This is set " +"to [code]true[/code] whenever a new VCS plugin is initialized." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Last loaded VCS plugin name. Used to autoload the plugin when the editor " +"starts up." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Default value for [member ScrollContainer.scroll_deadzone], which will be " +"used for all [ScrollContainer]s unless overridden." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If enabled, the moment [member Viewport.gui_disable_input] is set to " +"[code]false[/code] to disable GUI input in a viewport, current mouse over " +"and mouse focus will be dropped.\n" +"That behavior helps to keep a robust GUI state, with no surprises when input " +"is resumed regardless what has happened in the meantime.\n" +"If disabled, the legacy behavior is used, which consists in just not doing " +"anything besides the GUI input disable itself.\n" +"[b]Note:[/b] This is set to [code]true[/code] by default for new projects " +"and is the recommended setting." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], swaps OK and Cancel buttons in dialogs on Windows and " +"UWP to follow interface conventions." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Path to a custom [Theme] resource file to use for the project ([code]theme[/" +"code] or generic [code]tres[/code]/[code]res[/code] extension)." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Path to a custom [Font] resource to use as default for all GUI elements of " +"the project." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "If [code]true[/code], makes sure the theme used works with HiDPI." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Timer setting for incremental search in [Tree], [ItemList], etc. controls " +"(in milliseconds)." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Timer for detecting idle in [TextEdit] (in seconds)." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Default delay for tooltips (in seconds)." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Default [InputEventAction] to confirm a focused button, menu or list item, " +"or validate input.\n" +"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " +"necessary for the internal logic of several [Control]s. The events assigned " +"to the action can however be modified." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Default [InputEventAction] to discard a modal or pending input.\n" +"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " +"necessary for the internal logic of several [Control]s. The events assigned " +"to the action can however be modified." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Default [InputEventAction] to move down in the UI.\n" +"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " +"necessary for the internal logic of several [Control]s. The events assigned " +"to the action can however be modified." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Default [InputEventAction] to go to the end position of a [Control] (e.g. " +"last item in an [ItemList] or a [Tree]), matching the behavior of [constant " +"KEY_END] on typical desktop UI systems.\n" +"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " +"necessary for the internal logic of several [Control]s. The events assigned " +"to the action can however be modified." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Default [InputEventAction] to focus the next [Control] in the scene. The " +"focus behavior can be configured via [member Control.focus_next].\n" +"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " +"necessary for the internal logic of several [Control]s. The events assigned " +"to the action can however be modified." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Default [InputEventAction] to focus the previous [Control] in the scene. The " +"focus behavior can be configured via [member Control.focus_previous].\n" +"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " +"necessary for the internal logic of several [Control]s. The events assigned " +"to the action can however be modified." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Default [InputEventAction] to go to the start position of a [Control] (e.g. " +"first item in an [ItemList] or a [Tree]), matching the behavior of [constant " +"KEY_HOME] on typical desktop UI systems.\n" +"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " +"necessary for the internal logic of several [Control]s. The events assigned " +"to the action can however be modified." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Default [InputEventAction] to move left in the UI.\n" +"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " +"necessary for the internal logic of several [Control]s. The events assigned " +"to the action can however be modified." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Default [InputEventAction] to go down a page in a [Control] (e.g. in an " +"[ItemList] or a [Tree]), matching the behavior of [constant KEY_PAGEDOWN] on " +"typical desktop UI systems.\n" +"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " +"necessary for the internal logic of several [Control]s. The events assigned " +"to the action can however be modified." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Default [InputEventAction] to go up a page in a [Control] (e.g. in an " +"[ItemList] or a [Tree]), matching the behavior of [constant KEY_PAGEUP] on " +"typical desktop UI systems.\n" +"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " +"necessary for the internal logic of several [Control]s. The events assigned " +"to the action can however be modified." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Default [InputEventAction] to move right in the UI.\n" +"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " +"necessary for the internal logic of several [Control]s. The events assigned " +"to the action can however be modified." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Default [InputEventAction] to select an item in a [Control] (e.g. in an " +"[ItemList] or a [Tree]).\n" +"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " +"necessary for the internal logic of several [Control]s. The events assigned " +"to the action can however be modified." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Default [InputEventAction] to move up in the UI.\n" +"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " +"necessary for the internal logic of several [Control]s. The events assigned " +"to the action can however be modified." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], key/touch/joystick events will be flushed just before " +"every idle and physics frame.\n" +"If [code]false[/code], such events will be flushed only once per idle frame, " +"between iterations of the engine.\n" +"Enabling this can greatly improve the responsiveness to input, specially in " +"devices that need to run multiple physics frames per visible (idle) frame, " +"because they can't run at the target frame rate.\n" +"[b]Note:[/b] Currently implemented only in Android." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], sends mouse input events when tapping or swiping on " +"the touchscreen." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], sends touch input events when clicking or dragging the " +"mouse." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Default delay for touch events. This only affects iOS devices." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 1. If left empty, the layer will " +"display as \"Layer 1\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 10. If left empty, the layer will " +"display as \"Layer 10\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 11. If left empty, the layer will " +"display as \"Layer 11\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 12. If left empty, the layer will " +"display as \"Layer 12\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 13. If left empty, the layer will " +"display as \"Layer 13\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 14. If left empty, the layer will " +"display as \"Layer 14\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 15. If left empty, the layer will " +"display as \"Layer 15\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 16. If left empty, the layer will " +"display as \"Layer 16\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 17. If left empty, the layer will " +"display as \"Layer 17\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 18. If left empty, the layer will " +"display as \"Layer 18\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 19. If left empty, the layer will " +"display as \"Layer 19\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 2. If left empty, the layer will " +"display as \"Layer 2\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 20. If left empty, the layer will " +"display as \"Layer 20\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 21. If left empty, the layer will " +"display as \"Layer 21\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 22. If left empty, the layer will " +"display as \"Layer 22\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 23. If left empty, the layer will " +"display as \"Layer 23\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 24. If left empty, the layer will " +"display as \"Layer 24\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 25. If left empty, the layer will " +"display as \"Layer 25\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 26. If left empty, the layer will " +"display as \"Layer 26\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 27. If left empty, the layer will " +"display as \"Layer 27\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 28. If left empty, the layer will " +"display as \"Layer 28\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 29. If left empty, the layer will " +"display as \"Layer 29\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 3. If left empty, the layer will " +"display as \"Layer 3\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 30. If left empty, the layer will " +"display as \"Layer 30\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 31. If left empty, the layer will " +"display as \"Layer 31\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 32. If left empty, the layer will " +"display as \"Layer 32\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 4. If left empty, the layer will " +"display as \"Layer 4\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 5. If left empty, the layer will " +"display as \"Layer 5\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 6. If left empty, the layer will " +"display as \"Layer 6\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 7. If left empty, the layer will " +"display as \"Layer 7\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 8. If left empty, the layer will " +"display as \"Layer 8\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 2D navigation layer 9. If left empty, the layer will " +"display as \"Layer 9\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 1." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 10." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 11." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 12." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 13." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 14." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 15." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 16." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 17." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 18." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 19." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 2." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 20." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 21." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 22." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 23." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 24." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 25." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 26." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 27." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 28." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 29." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 3." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 30." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 31." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 32." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 4." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 5." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 6." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 7." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 8." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D physics layer 9." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D render layer 1." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D render layer 10." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D render layer 11." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D render layer 12." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D render layer 13." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D render layer 14." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D render layer 15." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D render layer 16." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D render layer 17." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D render layer 18." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D render layer 19." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D render layer 2." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D render layer 20." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D render layer 3." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D render layer 4." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D render layer 5." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D render layer 6." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D render layer 7." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D render layer 8." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 2D render layer 9." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 1. If left empty, the layer will " +"display as \"Layer 1\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 10. If left empty, the layer will " +"display as \"Layer 10\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 11. If left empty, the layer will " +"display as \"Layer 11\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 12. If left empty, the layer will " +"display as \"Layer 12\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 13. If left empty, the layer will " +"display as \"Layer 13\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 14. If left empty, the layer will " +"display as \"Layer 14\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 15. If left empty, the layer will " +"display as \"Layer 15\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 16. If left empty, the layer will " +"display as \"Layer 16\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 17. If left empty, the layer will " +"display as \"Layer 17\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 18. If left empty, the layer will " +"display as \"Layer 18\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 19. If left empty, the layer will " +"display as \"Layer 19\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 2. If left empty, the layer will " +"display as \"Layer 2\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 20. If left empty, the layer will " +"display as \"Layer 20\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 21. If left empty, the layer will " +"display as \"Layer 21\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 22. If left empty, the layer will " +"display as \"Layer 22\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 23. If left empty, the layer will " +"display as \"Layer 23\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 24. If left empty, the layer will " +"display as \"Layer 24\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 25. If left empty, the layer will " +"display as \"Layer 25\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 26. If left empty, the layer will " +"display as \"Layer 26\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 27. If left empty, the layer will " +"display as \"Layer 27\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 28. If left empty, the layer will " +"display as \"Layer 28\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 29. If left empty, the layer will " +"display as \"Layer 29\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 3. If left empty, the layer will " +"display as \"Layer 3\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 30. If left empty, the layer will " +"display as \"Layer 30\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 31. If left empty, the layer will " +"display as \"Layer 31\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 32. If left empty, the layer will " +"display as \"Layer 32\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 4. If left empty, the layer will " +"display as \"Layer 4\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 5. If left empty, the layer will " +"display as \"Layer 5\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 6. If left empty, the layer will " +"display as \"Layer 6\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 7. If left empty, the layer will " +"display as \"Layer 7\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 8. If left empty, the layer will " +"display as \"Layer 8\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Optional name for the 3D navigation layer 9. If left empty, the layer will " +"display as \"Layer 9\"." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 1." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 10." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 11." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 12." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 13." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 14." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 15." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 16." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 17." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 18." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 19." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 2." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 20." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 21." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 22." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 23." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 24." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 25." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 26." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 27." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 28." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 29." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 3." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 30." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 31." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 32." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 4." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 5." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 6." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 7." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 8." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D physics layer 9." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D render layer 1." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D render layer 10." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D render layer 11." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D render layer 12." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D render layer 13." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D render layer 14." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D render layer 15." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D render layer 16." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D render layer 17." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D render layer 18." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D render layer 19." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D render layer 2." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D render layer 20." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D render layer 3." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D render layer 4." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D render layer 5." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D render layer 6." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D render layer 7." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D render layer 8." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Optional name for the 3D render layer 9." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The locale to fall back to if a translation isn't available in a given " +"language. If left empty, [code]en[/code] (English) will be used." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If non-empty, this locale will be used when running the project from the " +"editor." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "If [code]true[/code], logs all output to files." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Desktop override for [member logging/file_logging/enable_file_logging], as " +"log files are not readily accessible on mobile/Web platforms." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Path to logs within the project. Using an [code]user://[/code] path is " +"recommended." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Specifies the maximum amount of log files allowed (used for rotation)." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Godot uses a message queue to defer some function calls. If you run out of " +"space on it (you will see an error), you can increase the size here." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"This is used by servers when used in multi-threading mode (servers and " +"visual). RIDs are preallocated to avoid stalling the server requesting them " +"on threads. If servers get stalled too often when loading resources in a " +"thread, increase this number." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The policy to use for unhandled Mono (C#) exceptions. The default " +"\"Terminate Application\" exits the project as soon as an unhandled " +"exception is thrown. \"Log Error\" logs an error message to the console " +"instead, and will not interrupt the project execution when an unhandled " +"exception is thrown.\n" +"[b]Note:[/b] The unhandled exception policy is always set to \"Log Error\" " +"in the editor, which also includes C# [code]tool[/code] scripts running " +"within the editor as well as editor plugin code." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Default cell height for 2D navigation maps. See [method Navigation2DServer." +"map_set_cell_height].\n" +"[b]Note:[/b] Currently not implemented." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Default cell size for 2D navigation maps. See [method Navigation2DServer." +"map_set_cell_size]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Default edge connection margin for 2D navigation maps. See [method " +"Navigation2DServer.map_set_edge_connection_margin]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Default cell height for 3D navigation maps. See [method NavigationServer." +"map_set_cell_height]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Default cell size for 3D navigation maps. See [method NavigationServer." +"map_set_cell_size]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Default edge connection margin for 3D navigation maps. See [method " +"NavigationServer.map_set_edge_connection_margin]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Default map up vector for 3D navigation maps. See [method NavigationServer." +"map_set_up]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Maximum amount of characters allowed to send as output from the debugger. " +"Over this value, content is dropped. This helps not to stall the debugger " +"connection." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Maximum number of errors allowed to be sent as output from the debugger. " +"Over this value, content is dropped. This helps not to stall the debugger " +"connection." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Maximum amount of messages allowed to send as output from the debugger. Over " +"this value, content is dropped. This helps not to stall the debugger " +"connection." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Maximum number of warnings allowed to be sent as output from the debugger. " +"Over this value, content is dropped. This helps not to stall the debugger " +"connection." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Default size of packet peer stream for deserializing Godot data (in bytes, " +"specified as a power of two). The default value [code]16[/code] is equal to " +"65,536 bytes. Over this size, data is dropped." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Timeout (in seconds) for connection attempts using TCP." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Maximum size (in kiB) for the [WebRTCDataChannel] input buffer." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Maximum size (in kiB) for the [WebSocketClient] input buffer." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Maximum number of concurrent input packets for [WebSocketClient]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Maximum size (in kiB) for the [WebSocketClient] output buffer." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Maximum number of concurrent output packets for [WebSocketClient]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Maximum size (in kiB) for the [WebSocketServer] input buffer." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Maximum number of concurrent input packets for [WebSocketServer]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Maximum size (in kiB) for the [WebSocketServer] output buffer." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Maximum number of concurrent output packets for [WebSocketServer]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Amount of read ahead used by remote filesystem. Higher values decrease the " +"effects of latency at the cost of higher bandwidth usage." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Page size used by remote filesystem (in bytes)." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The CA certificates bundle to use for SSL connections. If this is set to a " +"non-empty value, this will [i]override[/i] Godot's default [url=https://" +"github.com/godotengine/godot/blob/master/thirdparty/certs/ca-certificates." +"crt]Mozilla certificate bundle[/url]. If left empty, the default certificate " +"bundle will be used.\n" +"If in doubt, leave this setting empty." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"When creating node names automatically, set the type of casing in this " +"project. This is mostly an editor setting." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"What to use to separate node name from number. This is mostly an editor " +"setting." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Size of the hash table used for the broad-phase 2D hash grid algorithm.\n" +"[b]Note:[/b] Not used if [member ProjectSettings.physics/2d/use_bvh] is " +"enabled." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Additional expansion applied to object bounds in the 2D physics bounding " +"volume hierarchy. This can reduce BVH processing at the cost of a slightly " +"coarser broadphase, which can stress the physics more in some situations.\n" +"The default value will work well in most situations. A value of 0.0 will " +"turn this optimization off, and larger values may work better for larger, " +"faster moving objects.\n" +"[b]Note:[/b] Used only if [member ProjectSettings.physics/2d/use_bvh] is " +"enabled." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Cell size used for the broad-phase 2D hash grid algorithm (in pixels).\n" +"[b]Note:[/b] Not used if [member ProjectSettings.physics/2d/use_bvh] is " +"enabled." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default angular damp in 2D.\n" +"[b]Note:[/b] Good values are in the range [code]0[/code] to [code]1[/code]. " +"At value [code]0[/code] objects will keep moving with the same velocity. " +"Values greater than [code]1[/code] will aim to reduce the velocity to " +"[code]0[/code] in less than a second e.g. a value of [code]2[/code] will aim " +"to reduce the velocity to [code]0[/code] in half a second. A value equal to " +"or greater than the physics frame rate ([member ProjectSettings.physics/" +"common/physics_fps], [code]60[/code] by default) will bring the object to a " +"stop in one iteration." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default gravity strength in 2D (in pixels per second squared).\n" +"[b]Note:[/b] This property is only read when the project starts. To change " +"the default gravity at runtime, use the following code sample:\n" +"[codeblock]\n" +"# Set the default gravity strength to 98.\n" +"Physics2DServer.area_set_param(get_viewport().find_world_2d().get_space(), " +"Physics2DServer.AREA_PARAM_GRAVITY, 98)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default gravity direction in 2D.\n" +"[b]Note:[/b] This property is only read when the project starts. To change " +"the default gravity vector at runtime, use the following code sample:\n" +"[codeblock]\n" +"# Set the default gravity direction to `Vector2(0, 1)`.\n" +"Physics2DServer.area_set_param(get_viewport().find_world_2d().get_space(), " +"Physics2DServer.AREA_PARAM_GRAVITY_VECTOR, Vector2(0, 1))\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default linear damp in 2D.\n" +"[b]Note:[/b] Good values are in the range [code]0[/code] to [code]1[/code]. " +"At value [code]0[/code] objects will keep moving with the same velocity. " +"Values greater than [code]1[/code] will aim to reduce the velocity to " +"[code]0[/code] in less than a second e.g. a value of [code]2[/code] will aim " +"to reduce the velocity to [code]0[/code] in half a second. A value equal to " +"or greater than the physics frame rate ([member ProjectSettings.physics/" +"common/physics_fps], [code]60[/code] by default) will bring the object to a " +"stop in one iteration." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Threshold defining the surface size that constitutes a large object with " +"regard to cells in the broad-phase 2D hash grid algorithm.\n" +"[b]Note:[/b] Not used if [member ProjectSettings.physics/2d/use_bvh] is " +"enabled." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Sets which physics engine to use for 2D physics.\n" +"\"DEFAULT\" and \"GodotPhysics\" are the same, as there is currently no " +"alternative 2D physics server implemented." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Threshold angular velocity under which a 2D physics body will be considered " +"inactive. See [constant Physics2DServer." +"SPACE_PARAM_BODY_ANGULAR_VELOCITY_SLEEP_THRESHOLD]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Threshold linear velocity under which a 2D physics body will be considered " +"inactive. See [constant Physics2DServer." +"SPACE_PARAM_BODY_LINEAR_VELOCITY_SLEEP_THRESHOLD]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Sets whether physics is run on the main thread or a separate one. Running " +"the server on a thread increases performance, but restricts API access to " +"only physics process.\n" +"[b]Warning:[/b] As of Godot 3.2, there are mixed reports about the use of a " +"Multi-Threaded thread model for physics. Be sure to assess whether it does " +"give you extra performance and no regressions when using it." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Time (in seconds) of inactivity before which a 2D physics body will put to " +"sleep. See [constant Physics2DServer.SPACE_PARAM_BODY_TIME_TO_SLEEP]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Enables the use of bounding volume hierarchy instead of hash grid for 2D " +"physics spatial partitioning. This may give better performance." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Sets whether the 3D physics world will be created with support for " +"[SoftBody] physics. Only applies to the Bullet physics engine." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default angular damp in 3D.\n" +"[b]Note:[/b] Good values are in the range [code]0[/code] to [code]1[/code]. " +"At value [code]0[/code] objects will keep moving with the same velocity. " +"Values greater than [code]1[/code] will aim to reduce the velocity to " +"[code]0[/code] in less than a second e.g. a value of [code]2[/code] will aim " +"to reduce the velocity to [code]0[/code] in half a second. A value equal to " +"or greater than the physics frame rate ([member ProjectSettings.physics/" +"common/physics_fps], [code]60[/code] by default) will bring the object to a " +"stop in one iteration." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default gravity strength in 3D (in meters per second squared).\n" +"[b]Note:[/b] This property is only read when the project starts. To change " +"the default gravity at runtime, use the following code sample:\n" +"[codeblock]\n" +"# Set the default gravity strength to 9.8.\n" +"PhysicsServer.area_set_param(get_viewport().find_world().get_space(), " +"PhysicsServer.AREA_PARAM_GRAVITY, 9.8)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default gravity direction in 3D.\n" +"[b]Note:[/b] This property is only read when the project starts. To change " +"the default gravity vector at runtime, use the following code sample:\n" +"[codeblock]\n" +"# Set the default gravity direction to `Vector3(0, -1, 0)`.\n" +"PhysicsServer.area_set_param(get_viewport().find_world().get_space(), " +"PhysicsServer.AREA_PARAM_GRAVITY_VECTOR, Vector3(0, -1, 0))\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default linear damp in 3D.\n" +"[b]Note:[/b] Good values are in the range [code]0[/code] to [code]1[/code]. " +"At value [code]0[/code] objects will keep moving with the same velocity. " +"Values greater than [code]1[/code] will aim to reduce the velocity to " +"[code]0[/code] in less than a second e.g. a value of [code]2[/code] will aim " +"to reduce the velocity to [code]0[/code] in half a second. A value equal to " +"or greater than the physics frame rate ([member ProjectSettings.physics/" +"common/physics_fps], [code]60[/code] by default) will bring the object to a " +"stop in one iteration." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Additional expansion applied to object bounds in the 3D physics bounding " +"volume hierarchy. This can reduce BVH processing at the cost of a slightly " +"coarser broadphase, which can stress the physics more in some situations.\n" +"The default value will work well in most situations. A value of 0.0 will " +"turn this optimization off, and larger values may work better for larger, " +"faster moving objects.\n" +"[b]Note:[/b] Used only if [member ProjectSettings.physics/3d/godot_physics/" +"use_bvh] is enabled." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Enables the use of bounding volume hierarchy instead of octree for 3D " +"physics spatial partitioning. This may give better performance." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Sets which physics engine to use for 3D physics.\n" +"\"DEFAULT\" is currently the [url=https://bulletphysics.org]Bullet[/url] " +"physics engine. The \"GodotPhysics\" engine is still supported as an " +"alternative." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], smooths out collision with trimesh shapes " +"([ConcavePolygonShape]) by telling the Bullet physics engine to generate " +"internal edge information for every trimesh shape created.\n" +"[b]Note:[/b] Only effective if [member physics/3d/physics_engine] is set to " +"[code]DEFAULT[/code] or [code]Bullet[/code], [i]not[/i] [code]GodotPhysics[/" +"code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Enables [member Viewport.physics_object_picking] on the root viewport." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If enabled, 2D and 3D physics picking behaves this way in relation to " +"pause:\n" +"- When pause is started, every collision object that is hovered or captured " +"(3D only) is released from that condition, getting the relevant mouse-exit " +"callback, unless its pause mode makes it immune to pause.\n" +"- During pause, picking only considers collision objects immune to pause, " +"sending input events and enter/exit callbacks to them as expected.\n" +"If disabled, the legacy behavior is used, which consists in queuing the " +"picking input events during pause (so nodes won't get them) and flushing " +"that queue on resume, against the state of the 2D/3D world at that point." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The number of fixed iterations per second. This controls how often physics " +"simulation and [method Node._physics_process] methods are run. See also " +"[member debug/settings/fps/force_fps].\n" +"[b]Note:[/b] This property is only read when the project starts. To change " +"the physics FPS at runtime, set [member Engine.iterations_per_second] " +"instead.\n" +"[b]Note:[/b] Only 8 physics ticks may be simulated per rendered frame at " +"most. If more than 8 physics ticks have to be simulated per rendered frame " +"to keep up with rendering, the game will appear to slow down (even if " +"[code]delta[/code] is used consistently in physics calculations). Therefore, " +"it is recommended not to increase [member physics/common/physics_fps] above " +"240. Otherwise, the game will slow down when the rendering framerate goes " +"below 30 FPS." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], the renderer will interpolate the transforms of " +"physics objects between the last two transforms, such that smooth motion is " +"seen when physics ticks do not coincide with rendered frames.\n" +"[b]Note:[/b] When moving objects to new positions (rather than the usual " +"physics motion) you may want to temporarily turn off interpolation to " +"prevent a visible glitch. You can do this using the [method Node." +"reset_physics_interpolation] function." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Controls how much physics ticks are synchronized with real time. For 0 or " +"less, the ticks are synchronized. Such values are recommended for network " +"games, where clock synchronization matters. Higher values cause higher " +"deviation of in-game clock and real clock, but allows smoothing out " +"framerate jitters. The default value of 0.5 should be fine for most; values " +"above 2 could cause the game to react to dropped frames with a noticeable " +"delay and are not recommended.\n" +"[b]Note:[/b] For best results, when using a custom physics interpolation " +"solution, the physics jitter fix should be disabled by setting [member " +"physics/common/physics_jitter_fix] to [code]0[/code].\n" +"[b]Note:[/b] Jitter fix is automatically disabled at runtime when [member " +"physics/common/physics_interpolation] is enabled.\n" +"[b]Note:[/b] This property is only read when the project starts. To change " +"the value at runtime, set [member Engine.physics_jitter_fix] instead." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"[b]Experimental.[/b] Calls [code]glBufferData[/code] with NULL data prior to " +"uploading batching data. This may not be necessary but can be used for " +"safety.\n" +"[b]Note:[/b] Use with care. You are advised to leave this as default for " +"exports. A non-default setting that works better on your machine may " +"adversely affect performance for end users." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"[b]Experimental.[/b] If set to on, uses the [code]GL_STREAM_DRAW[/code] flag " +"for batching buffer uploads. If off, uses the [code]GL_DYNAMIC_DRAW[/code] " +"flag.\n" +"[b]Note:[/b] Use with care. You are advised to leave this as default for " +"exports. A non-default setting that works better on your machine may " +"adversely affect performance for end users." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"[b]Experimental.[/b] If set to on, this applies buffer orphaning - " +"[code]glBufferData[/code] is called with NULL data and the full buffer size " +"prior to uploading new data. This can be important to avoid stalling on some " +"hardware.\n" +"[b]Note:[/b] Use with care. You are advised to leave this as default for " +"exports. A non-default setting that works better on your machine may " +"adversely affect performance for end users." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"[b]Experimental.[/b] If set to on, uses the [code]GL_STREAM_DRAW[/code] flag " +"for legacy buffer uploads. If off, uses the [code]GL_DYNAMIC_DRAW[/code] " +"flag.\n" +"[b]Note:[/b] Use with care. You are advised to leave this as default for " +"exports. A non-default setting that works better on your machine may " +"adversely affect performance for end users." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Choose between fixed mode where corner scalings are preserved matching the " +"artwork, and scaling mode.\n" +"Not available in GLES3 when [member rendering/batching/options/use_batching] " +"is off." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Some NVIDIA GPU drivers have a bug which produces flickering issues for the " +"[code]draw_rect[/code] method, especially as used in [TileMap]. Refer to " +"[url=https://github.com/godotengine/godot/issues/9913]GitHub issue 9913[/" +"url] for details.\n" +"If [code]true[/code], this option enables a \"safe\" code path for such " +"NVIDIA GPUs at the cost of performance. This option affects GLES2 and GLES3 " +"rendering, but only on desktop platforms." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], performs 2D skinning on the CPU rather than the GPU. " +"This provides greater compatibility with a wide range of hardware, and also " +"may be faster in some circumstances.\n" +"Currently only available when [member rendering/batching/options/" +"use_batching] is active.\n" +"[b]Note:[/b] Antialiased software skinned polys are not supported, and will " +"be rendered without antialiasing.\n" +"[b]Note:[/b] Custom shaders that use the [code]VERTEX[/code] built-in " +"operate with [code]VERTEX[/code] position [i]after[/i] skinning, whereas " +"with hardware skinning, [code]VERTEX[/code] is the position [i]before[/i] " +"skinning." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], forces snapping of vertices to pixels in 2D rendering. " +"May help in some pixel art styles.\n" +"This snapping is performed on the GPU in the vertex shader.\n" +"Consider using the project setting [member rendering/batching/precision/" +"uv_contract] to prevent artifacts." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"When batching is on, this regularly prints a frame diagnosis log. Note that " +"this will degrade performance." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"[b]Experimental.[/b] For regression testing against the old renderer. If " +"this is switched on, and [code]use_batching[/code] is set, the renderer will " +"swap alternately between using the old renderer, and the batched renderer, " +"on each frame. This makes it easy to identify visual differences. " +"Performance will be degraded." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Lights have the potential to prevent joining items, and break many of the " +"performance benefits of batching. This setting enables some complex logic to " +"allow joining items if their lighting is similar, and overlap tests pass. " +"This can significantly improve performance in some games. Set to 0 to switch " +"off. With large values the cost of overlap tests may lead to diminishing " +"returns." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Sets the proportion of the total screen area (in pixels) that must be saved " +"by a scissor operation in order to activate light scissoring. This can " +"prevent parts of items being rendered outside the light area. Lower values " +"scissor more aggressively. A value of 1 scissors none of the items, a value " +"of 0 scissors every item. The power of 4 of the value is used, in order to " +"emphasize the lower range, and multiplied by the total screen area in pixels " +"to give the threshold. This can reduce fill rate requirements in scenes with " +"a lot of lighting." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Enabling this setting uses the legacy method to draw batches containing only " +"one rect. The legacy method is faster (approx twice as fast), but can cause " +"flicker on some systems. In order to directly compare performance with the " +"non-batching renderer you can set this to true, but it is recommended to " +"turn this off unless you can guarantee your target hardware will work with " +"this method." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Turns 2D batching on and off. Batching increases performance by reducing the " +"amount of graphics API drawcalls." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Switches on 2D batching within the editor." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Size of buffer reserved for batched vertices. Larger size enables larger " +"batches, but there are diminishing returns for the memory used. This should " +"only have a minor effect on performance." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Including color in the vertex format has a cost, however, not including " +"color prevents batching across color changes. This threshold determines the " +"ratio of [code]number of vertex color changes / total number of vertices[/" +"code] above which vertices will be translated to colored format. A value of " +"0 will always use colored vertices, 1 will never use colored vertices." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"In certain circumstances, the batcher can reorder items in order to better " +"join them. This may result in better performance. An overlap test is needed " +"however for each item lookahead, so there is a trade off, with diminishing " +"returns. If you are getting no benefit, setting this to 0 will switch it off." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Sets the number of commands to lookahead to determine whether to batch " +"render items. A value of 1 can join items consisting of single commands, 0 " +"turns off joining. Higher values are in theory more likely to join, however " +"this has diminishing returns and has a runtime cost so a small value is " +"recommended." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"On some platforms (especially mobile), precision issues in shaders can lead " +"to reading 1 texel outside of bounds, particularly where rects are scaled. " +"This can particularly lead to border artifacts around tiles in tilemaps.\n" +"This adjustment corrects for this by making a small contraction to the UV " +"coordinates used. Note that this can result in a slight squashing of border " +"texels." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The amount of UV contraction. This figure is divided by 1000000, and is a " +"proportion of the total texture dimensions, where the width and height are " +"both ranged from 0.0 to 1.0.\n" +"Use the default unless correcting for a problem on particular hardware." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Amount of light samples taken when using [constant BakedLightmap." +"BAKE_QUALITY_HIGH]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Amount of light samples taken when using [constant BakedLightmap." +"BAKE_QUALITY_LOW]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Amount of light samples taken when using [constant BakedLightmap." +"BAKE_QUALITY_MEDIUM]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Amount of light samples taken when using [constant BakedLightmap." +"BAKE_QUALITY_ULTRA]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Default background clear color. Overridable per [Viewport] using its " +"[Environment]. See [member Environment.background_mode] and [member " +"Environment.background_color] in particular. To change this default color " +"programmatically, use [method VisualServer.set_default_clear_color]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"[Environment] that will be used as a fallback environment in case a scene " +"does not specify its own environment. The default environment is loaded in " +"at scene load time regardless of whether you have set an environment or not. " +"If you do not rely on the fallback environment, it is best to delete " +"[code]default_env.tres[/code], or to specify a different default environment " +"here." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The use of half-float vertex compression may be producing rendering errors " +"on some platforms (especially iOS). These have been seen particularly in " +"particles. Disabling half-float may resolve these problems." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"iOS specific override for [member rendering/gles2/compatibility/" +"disable_half_float], due to poor support for half-float vertex compression " +"on many devices." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code] and available on the target Android device, enables " +"high floating point precision for all shader computations in GLES2.\n" +"[b]Warning:[/b] High floating point precision can be extremely slow on older " +"devices and is often not available at all. Use with caution." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], every time an asynchronous shader compilation or an " +"asynchronous shader reconstruction from cache starts or finishes, a line " +"will be logged telling how many of those are happening.\n" +"If the platform doesn't support parallel shader compile, but only the " +"compile queue via a secondary GL context, what the message will tell is the " +"number of shader compiles currently queued.\n" +"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" +"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" +"code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"This is the maximum number of shaders that can be compiled (or reconstructed " +"from cache) at the same time.\n" +"At runtime, while that count is reached, other shaders that can be " +"asynchronously compiled will just use their fallback, without their setup " +"being started until the count gets lower.\n" +"This is a way to balance the CPU work between running the game and compiling " +"the shaders. The goal is to have as many asynchronous compiles in flight as " +"possible without impacting the responsiveness of the game, which beyond some " +"point would destroy the benefits of asynchronous compilation. In other " +"words, you may be able to afford that the FPS lowers a bit, and that will " +"already be better than the stalling that synchronous compilation could " +"cause.\n" +"The default value is a conservative one, so you are advised to tweak it " +"according to the hardware you are targeting.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific devices you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The maximum size, in megabytes, that the ubershader cache can grow up to. On " +"startup, the least recently used entries will be deleted until the total " +"size is within bounds.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If set to [code]Asynchronous[/code] and available on the target device, " +"asynchronous compilation of shaders is enabled (in contrast to " +"[code]Asynchronous[/code]).\n" +"That means that when a shader is first used under some new rendering " +"situation, the game won't stall while such shader is being compiled. " +"Instead, a fallback will be used and the real shader will be compiled in the " +"background. Once the actual shader is compiled, it will be used the next " +"times it's used to draw a frame.\n" +"Depending on the async mode configured for a given material/shader, the " +"fallback will be an \"ubershader\" (the default) or just skip rendering any " +"item it is applied to.\n" +"An ubershader is a very complex shader, slow but suited to any rendering " +"situation, that the engine generates internally so it can be used from the " +"beginning while the traditional conditioned, optimized version of it is " +"being compiled.\n" +"To reduce loading times after the project has been launched at least once, " +"you can use [code]Asynchronous + Cache[/code]. This also causes the " +"ubershaders to be cached into storage so they can be ready faster next time " +"they are used (provided the platform provides support for it).\n" +"[b]Note:[/b] Asynchronous compilation is currently only supported for " +"spatial (3D) and particle materials/shaders. CanvasItem (2D) shaders will " +"not use asynchronous compilation even if this setting is set to " +"[code]Asynchronous[/code] or [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" +"You may want to do that since mobile GPUs generally won't support " +"ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Max buffer size for blend shapes. Any blend shape bigger than this will not " +"work." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Max buffer size for drawing polygons. Any polygon bigger than this will not " +"work." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Max index buffer size for drawing polygons. Any polygon bigger than this " +"will not work." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Max buffer size for drawing immediate objects (ImmediateGeometry nodes). " +"Nodes using more than this size will not work." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Max number of lights renderable per object. This is further limited by " +"hardware support. Most devices only support 409 lights, while many devices " +"(especially mobile) only support 102. Setting this low will slightly reduce " +"memory usage and may decrease shader compile times." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Max amount of elements renderable in a frame. If more elements than this are " +"visible per frame, they will not be drawn. Keep in mind elements refer to " +"mesh surfaces and not meshes themselves. Setting this low will slightly " +"reduce memory usage and may decrease shader compile times, particularly on " +"web. For most uses, the default value is suitable, but consider lowering as " +"much as possible on web export." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Max number of lights renderable in a frame. If more lights than this number " +"are used, they will be ignored. Setting this low will slightly reduce memory " +"usage and may decrease shader compile times, particularly on web. For most " +"uses, the default value is suitable, but consider lowering as much as " +"possible on web export." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Max number of reflection probes renderable in a frame. If more reflection " +"probes than this number are used, they will be ignored. Setting this low " +"will slightly reduce memory usage and may decrease shader compile times, " +"particularly on web. For most uses, the default value is suitable, but " +"consider lowering as much as possible on web export." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Shaders have a time variable that constantly increases. At some point, it " +"needs to be rolled back to zero to avoid precision errors on shader " +"animations. This setting specifies when (in seconds)." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], the texture importer will import lossless textures " +"using the PNG format. Otherwise, it will default to using WebP." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default compression level for lossless WebP. Higher levels result in " +"smaller files at the cost of compression speed. Decompression speed is " +"mostly unaffected by the compression level. Supported values are 0 to 9. " +"Note that compression levels above 6 are very slow and offer very little " +"savings." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"On import, mesh vertex data will be split into two streams within a single " +"vertex buffer, one for position data and the other for interleaved " +"attributes data. Recommended to be enabled if targeting mobile devices. " +"Requires manual reimport of meshes after toggling." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Determines the maximum number of polygon occluders that will be used at any " +"one time.\n" +"Although you can have many occluders in a scene, each frame the system will " +"choose from these the most relevant based on a screen space metric, in order " +"to give the best overall performance.\n" +"A greater number of polygons can potentially cull more objects, however the " +"cost of culling calculations scales with the number of occluders." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Determines the maximum number of sphere occluders that will be used at any " +"one time.\n" +"Although you can have many occluders in a scene, each frame the system will " +"choose from these the most relevant based on a screen space metric, in order " +"to give the best overall performance." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default convention is for portal normals to point outward (face outward) " +"from the source room.\n" +"If you accidentally build your level with portals facing the wrong way, this " +"setting can fix the problem.\n" +"It will flip named portal meshes (i.e. [code]-portal[/code]) on the initial " +"conversion to [Portal] nodes." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Show conversion logs.\n" +"[b]Note:[/b] This will automatically be disabled in exports." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], gameplay callbacks will be sent as [code]signals[/" +"code]. If [code]false[/code], they will be sent as [code]notifications[/" +"code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If enabled, while merging meshes, the system will also attempt to remove " +"[Spatial] nodes that no longer have any children.\n" +"Reducing the number of [Node]s in the scene tree can make traversal more " +"efficient, but can be switched off in case you wish to use empty [Spatial]s " +"for markers or some other purpose." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Show logs during PVS generation.\n" +"[b]Note:[/b] This will automatically be disabled in exports." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Uses a simplified method of generating PVS (potentially visible set) data. " +"The results may not be accurate where more than one portal join adjacent " +"rooms.\n" +"[b]Note:[/b] Generally you should only use this option if you encounter bugs " +"when it is set to [code]false[/code], i.e. there are problems with the " +"default method." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], allocates the root [Viewport]'s framebuffer with high " +"dynamic range. High dynamic range allows the use of [Color] values greater " +"than 1. This must be set to [code]true[/code] for glow rendering to work if " +"[member Environment.glow_hdr_threshold] is greater than or equal to " +"[code]1.0[/code].\n" +"[b]Note:[/b] Only available on the GLES3 backend." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Lower-end override for [member rendering/quality/depth/hdr] on mobile " +"devices, due to performance concerns or driver support. This must be set to " +"[code]true[/code] for glow rendering to work if [member Environment." +"glow_hdr_threshold] is greater than or equal to [code]1.0[/code].\n" +"[b]Note:[/b] Only available on the GLES3 backend." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], allocates the root [Viewport]'s framebuffer with full " +"floating-point precision (32-bit) instead of half floating-point precision " +"(16-bit). Only effective when [member rendering/quality/depth/hdr] is also " +"enabled.\n" +"[b]Note:[/b] Enabling this setting does not improve rendering quality. Using " +"full floating-point precision is slower, and is generally only needed for " +"advanced shaders that require a high level of precision. To reduce banding, " +"enable [member rendering/quality/filters/use_debanding] instead.\n" +"[b]Note:[/b] Only available on the GLES3 backend." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Disables depth pre-pass for some GPU vendors (usually mobile), as their " +"architecture already does this." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], performs a previous depth pass before rendering " +"materials. This increases performance in scenes with high overdraw, when " +"complex materials and lighting are used." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The directional shadow's size in pixels. Higher values will result in " +"sharper shadows, at the cost of performance. The value will be rounded up to " +"the nearest power of 2. This setting can be changed at run-time; the change " +"will be applied immediately." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Lower-end override for [member rendering/quality/directional_shadow/size] on " +"mobile devices, due to performance concerns or driver support." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The video driver to use (\"GLES2\" or \"GLES3\").\n" +"[b]Note:[/b] The backend in use can be overridden at runtime via the [code]--" +"video-driver[/code] command line argument, or by the [member rendering/" +"quality/driver/fallback_to_gles2] option if the target system does not " +"support GLES3 and falls back to GLES2. In such cases, this property is not " +"updated, so use [method OS.get_current_video_driver] to query it at run-time." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], allows falling back to the GLES2 driver if the GLES3 " +"driver is not supported.\n" +"[b]Note:[/b] The two video drivers are not drop-in replacements for each " +"other, so a game designed for GLES3 might not work properly when falling " +"back to GLES2. In particular, some features of the GLES3 backend are not " +"available in GLES2. Enabling this setting also means that both ETC and ETC2 " +"VRAM-compressed textures will be exported on Android and iOS, increasing the " +"data pack's size." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Maximum anisotropic filter level used for textures with anisotropy enabled. " +"Higher values will result in sharper textures when viewed from oblique " +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Sets the number of MSAA samples to use. MSAA is used to reduce aliasing " +"around the edges of polygons. A higher MSAA value results in smoother edges " +"but can be significantly slower on some hardware.\n" +"[b]Note:[/b] MSAA is not available on HTML5 export using the GLES2 backend." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If set to a value greater than [code]0.0[/code], contrast-adaptive " +"sharpening will be applied to the 3D viewport. This has a low performance " +"cost and can be used to recover some of the sharpness lost from using FXAA. " +"Values around [code]0.5[/code] generally give the best results. See also " +"[member rendering/quality/filters/use_fxaa]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], uses a fast post-processing filter to make banding " +"significantly less visible. In some cases, debanding may introduce a " +"slightly noticeable dithering pattern. It's recommended to enable debanding " +"only when actually needed since the dithering pattern will make lossless-" +"compressed screenshots larger.\n" +"[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" +"depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" +"[b]Note:[/b] There are known issues with debanding breaking rendering on " +"mobile platforms. Due to this, it is recommended to leave this option " +"disabled when targeting mobile platforms." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Enables FXAA in the root Viewport. FXAA is a popular screen-space " +"antialiasing method, which is fast but will make the image look blurry, " +"especially at lower resolutions. It can still work relatively well at large " +"resolutions such as 1440p and 4K. Some of the lost sharpness can be " +"recovered by enabling contrast-adaptive sharpening (see [member rendering/" +"quality/filters/sharpen_intensity])." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], uses nearest-neighbor mipmap filtering when using " +"mipmaps (also called \"bilinear filtering\"), which will result in visible " +"seams appearing between mipmap stages. This may increase performance in " +"mobile as less memory bandwidth is used. If [code]false[/code], linear " +"mipmap filtering (also called \"trilinear filtering\") is used." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Strategy used for framebuffer allocation. The simpler it is, the less " +"resources it uses (but the less features it supports). If set to \"2D " +"Without Sampling\" or \"3D Without Effects\", sample buffers will not be " +"allocated. This means [code]SCREEN_TEXTURE[/code] and [code]DEPTH_TEXTURE[/" +"code] will not be available in shaders and post-processing effects such as " +"glow will not be available in [Environment]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Lower-end override for [member rendering/quality/intended_usage/" +"framebuffer_allocation] on mobile devices, due to performance concerns or " +"driver support." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Enable usage of bicubic sampling in baked lightmaps. This results in " +"smoother looking lighting at the expense of more bandwidth usage. On GLES2, " +"changes to this setting will only be applied upon restarting the application." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Lower-end override for [member rendering/quality/lightmapping/" +"use_bicubic_sampling] on mobile devices, in order to reduce bandwidth usage." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Size of the atlas used by reflection probes. A larger size can result in " +"higher visual quality, while a smaller size will be faster and take up less " +"memory." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Number of subdivisions to use for the reflection atlas. A higher number " +"lowers the quality of each atlas, but allows you to use more." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], uses a high amount of samples to create blurred " +"variants of reflection probes and panorama backgrounds (sky). Those blurred " +"variants are used by rough materials." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Lower-end override for [member rendering/quality/reflections/" +"high_quality_ggx] on mobile devices, due to performance concerns or driver " +"support." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Limits the size of the irradiance map which is normally determined by " +"[member Sky.radiance_size]. A higher size results in a higher quality " +"irradiance map similarly to [member rendering/quality/reflections/" +"high_quality_ggx]. Use a higher value when using high-frequency HDRI maps, " +"otherwise keep this as low as possible.\n" +"[b]Note:[/b] Low and mid range hardware do not support complex irradiance " +"maps well and may crash if this is set too high." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], uses texture arrays instead of mipmaps for reflection " +"probes and panorama backgrounds (sky). This reduces jitter noise on " +"reflections, but costs more performance and memory." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Lower-end override for [member rendering/quality/reflections/" +"texture_array_reflections] on mobile devices, due to performance concerns or " +"driver support." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], uses faster but lower-quality Blinn model to generate " +"blurred reflections instead of the GGX model." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Lower-end override for [member rendering/quality/shading/" +"force_blinn_over_ggx] on mobile devices, due to performance concerns or " +"driver support." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], uses faster but lower-quality Lambert material " +"lighting model instead of Burley." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Lower-end override for [member rendering/quality/shading/" +"force_lambert_over_burley] on mobile devices, due to performance concerns or " +"driver support." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], forces vertex shading for all 3D [SpatialMaterial] and " +"[ShaderMaterial] rendering. This can be used to improve performance on low-" +"end mobile devices. The downside is that shading becomes much less accurate, " +"with visible linear interpolation between vertices that are joined together. " +"This can be compensated by ensuring meshes have a sufficient level of " +"subdivision (but not too much, to avoid reducing performance). Some material " +"features are also not supported when vertex shading is enabled.\n" +"See also [member SpatialMaterial.flags_vertex_lighting] which can be used to " +"enable vertex shading on specific materials only.\n" +"[b]Note:[/b] This setting does not affect unshaded materials." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Lower-end override for [member rendering/quality/shading/" +"force_vertex_shading] on mobile devices, due to performance concerns or " +"driver support. If lighting looks broken after exporting the project to a " +"mobile platform, try disabling this setting." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], enables new physical light attenuation for " +"[OmniLight]s and [SpotLight]s. This results in more realistic lighting " +"appearance with a very small performance cost. When physical light " +"attenuation is enabled, lights will appear to be darker as a result of the " +"new attenuation formula. This can be compensated by adjusting the lights' " +"energy or attenuation values.\n" +"Changes to this setting will only be applied upon restarting the application." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Size for cubemap into which the shadow is rendered before being copied into " +"the shadow atlas. A higher number can result in higher resolution shadows " +"when used with a higher [member rendering/quality/shadow_atlas/size]. " +"Setting higher than a quarter of the [member rendering/quality/shadow_atlas/" +"size] will not result in a perceptible increase in visual quality." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Subdivision quadrant size for shadow mapping. See shadow mapping " +"documentation." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Size for shadow atlas (used for OmniLights and SpotLights). The value will " +"be rounded up to the nearest power of 2. See shadow mapping documentation." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Lower-end override for [member rendering/quality/shadow_atlas/size] on " +"mobile devices, due to performance concerns or driver support." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Shadow filter mode. Higher-quality settings result in smoother shadows that " +"flicker less when moving. \"Disabled\" is the fastest option, but also has " +"the lowest quality. \"PCF5\" is smoother but is also slower. \"PCF13\" is " +"the smoothest option, but is also the slowest.\n" +"[b]Note:[/b] When using the GLES2 backend, the \"PCF13\" option actually " +"uses 16 samples to emulate linear filtering in the shader. This results in a " +"shadow appearance similar to the one produced by the GLES3 backend." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Lower-end override for [member rendering/quality/shadows/filter_mode] on " +"mobile devices, due to performance concerns or driver support." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Forces [MeshInstance] to always perform skinning on the CPU (applies to both " +"GLES2 and GLES3).\n" +"See also [member rendering/quality/skinning/software_skinning_fallback]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Allows [MeshInstance] to perform skinning on the CPU when the hardware " +"doesn't support the default GPU skinning process with GLES2.\n" +"If [code]false[/code], an alternative skinning process on the GPU is used in " +"this case (slower in most cases).\n" +"See also [member rendering/quality/skinning/force_software_skinning].\n" +"[b]Note:[/b] When the software skinning fallback is triggered, custom vertex " +"shaders will behave in a different way, because the bone transform will be " +"already applied to the modelview matrix." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Additional expansion applied to object bounds in the 3D rendering bounding " +"volume hierarchy. This can reduce BVH processing at the cost of a slightly " +"reduced accuracy.\n" +"The default value will work well in most situations. A value of 0.0 will " +"turn this optimization off, and larger values may work better for larger, " +"faster moving objects.\n" +"[b]Note:[/b] Used only if [member ProjectSettings.rendering/quality/" +"spatial_partitioning/use_bvh] is enabled." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The rendering octree balance can be changed to favor smaller ([code]0[/" +"code]), or larger ([code]1[/code]) branches.\n" +"Larger branches can increase performance significantly in some projects.\n" +"[b]Note:[/b] Not used if [member ProjectSettings.rendering/quality/" +"spatial_partitioning/use_bvh] is enabled." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Enables the use of bounding volume hierarchy instead of octree for rendering " +"spatial partitioning. This may give better performance." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Improves quality of subsurface scattering, but cost significantly increases." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Quality setting for subsurface scattering (samples taken)." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "Max radius used for subsurface scattering samples." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Weight subsurface scattering samples. Helps to avoid reading samples from " +"unrelated parts of the screen." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Use high-quality voxel cone tracing. This results in better-looking " +"reflections, but is much more expensive on the GPU." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Thread model for rendering. Rendering on a thread can vastly improve " +"performance, but synchronizing to the main thread can cause a bit more " +"jitter." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], a thread safe version of BVH (bounding volume " +"hierarchy) will be used in rendering and Godot physics.\n" +"Try enabling this option if you see any visual anomalies in 3D (such as " +"incorrect object visibility)." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], the texture importer will import VRAM-compressed " +"textures using the BPTC algorithm. This texture compression algorithm is " +"only supported on desktop platforms, and only when using the GLES3 " +"renderer.\n" +"[b]Note:[/b] Changing this setting does [i]not[/i] impact textures that were " +"already imported before. To make this setting apply to textures that were " +"already imported, exit the editor, remove the [code].import/[/code] folder " +"located inside the project folder then restart the editor (see [member " +"application/config/use_hidden_project_data_directory])." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], the texture importer will import VRAM-compressed " +"textures using the Ericsson Texture Compression algorithm. This algorithm " +"doesn't support alpha channels in textures.\n" +"[b]Note:[/b] Changing this setting does [i]not[/i] impact textures that were " +"already imported before. To make this setting apply to textures that were " +"already imported, exit the editor, remove the [code].import/[/code] folder " +"located inside the project folder then restart the editor (see [member " +"application/config/use_hidden_project_data_directory])." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], the texture importer will import VRAM-compressed " +"textures using the Ericsson Texture Compression 2 algorithm. This texture " +"compression algorithm is only supported when using the GLES3 renderer.\n" +"[b]Note:[/b] Changing this setting does [i]not[/i] impact textures that were " +"already imported before. To make this setting apply to textures that were " +"already imported, exit the editor, remove the [code].import/[/code] folder " +"located inside the project folder then restart the editor (see [member " +"application/config/use_hidden_project_data_directory])." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], the texture importer will import VRAM-compressed " +"textures using the PowerVR Texture Compression algorithm. This texture " +"compression algorithm is only supported on iOS.\n" +"[b]Note:[/b] Changing this setting does [i]not[/i] impact textures that were " +"already imported before. To make this setting apply to textures that were " +"already imported, exit the editor, remove the [code].import/[/code] folder " +"located inside the project folder then restart the editor (see [member " +"application/config/use_hidden_project_data_directory])." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"If [code]true[/code], the texture importer will import VRAM-compressed " +"textures using the S3 Texture Compression algorithm. This algorithm is only " +"supported on desktop platforms and consoles.\n" +"[b]Note:[/b] Changing this setting does [i]not[/i] impact textures that were " +"already imported before. To make this setting apply to textures that were " +"already imported, exit the editor, remove the [code].import/[/code] folder " +"located inside the project folder then restart the editor (see [member " +"application/config/use_hidden_project_data_directory])." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Cell size used for the 2D hash grid that [VisibilityNotifier2D] uses (in " +"pixels)." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"Objects can use this signal to restrict reading of settings only to " +"situations where a change has been made." +msgstr "" + +#: doc/classes/PropertyTweener.xml +msgid "Interpolates an [Object]'s property over time." +msgstr "" + +#: doc/classes/PropertyTweener.xml +msgid "" +"[PropertyTweener] is used to interpolate a property in an object. See " +"[method SceneTreeTween.tween_property] for more usage information.\n" +"[b]Note:[/b] [method SceneTreeTween.tween_property] is the only correct way " +"to create [PropertyTweener]. Any [PropertyTweener] created manually will not " +"function correctly." +msgstr "" + +#: doc/classes/PropertyTweener.xml +msgid "" +"When called, the final value will be used as a relative value instead. " +"Example:\n" +"[codeblock]\n" +"var tween = get_tree().create_tween()\n" +"tween.tween_property(self, \"position\", Vector2.RIGHT * 100, 1)." +"as_relative() #the node will move by 100 pixels to the right\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/PropertyTweener.xml +msgid "" +"Sets a custom initial value to the [PropertyTweener]. Example:\n" +"[codeblock]\n" +"var tween = get_tree().create_tween()\n" +"tween.tween_property(self, \"position\", Vector2(200, 100), 1)." +"from(Vector2(100, 100) #this will move the node from position (100, 100) to " +"(200, 100)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/PropertyTweener.xml +msgid "" +"Makes the [PropertyTweener] use the current property value (i.e. at the time " +"of creating this [PropertyTweener]) as a starting point. This is equivalent " +"of using [method from] with the current value. These two calls will do the " +"same:\n" +"[codeblock]\n" +"tween.tween_property(self, \"position\", Vector2(200, 100), 1)." +"from(position)\n" +"tween.tween_property(self, \"position\", Vector2(200, 100), 1)." +"from_current()\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/PropertyTweener.xml +msgid "" +"Sets the time in seconds after which the [PropertyTweener] will start " +"interpolating. By default there's no delay." +msgstr "" + +#: doc/classes/ProximityGroup.xml +msgid "General-purpose 3D proximity detection node." +msgstr "" + +#: doc/classes/ProximityGroup.xml +msgid "" +"General-purpose proximity detection node. [ProximityGroup] can be used for " +"[i]approximate[/i] distance checks, which are faster than exact distance " +"checks using [method Vector3.distance_to] or [method Vector3." +"distance_squared_to].\n" +"[ProximityGroup] nodes are automatically grouped together, as long as they " +"share the same [member group_name] and intersect with each other. By calling " +"the [method broadcast], you can invoke a specified method with various " +"parameters to all intersecting members.\n" +"[ProximityGroup] is cuboid-shaped and consists of a cluster of [Vector3] " +"coordinates. The coordinates are automatically calculated by calling [member " +"grid_radius]. To allow [ProximityGroup] to find its peers (and perform " +"automatic grouping), you need to define its [member group_name] to a non-" +"empty [String]. As soon as this object's shape intersects with another " +"[ProximityGroup] object' shape, and both share the same [member group_name], " +"they will belong together for as long as they intersect.\n" +"Since [ProximityGroup] doesn't rely the physics engine, you don't need to " +"add any other node as a child (unlike [PhysicsBody]).\n" +"The [ProximityGroup] uses the [SceneTree] groups in the background by " +"calling the method [method Node.add_to_group] internally. The [SceneTree] " +"group names are constructed by combining the [member group_name] with its " +"coordinates, which are calculated using the [member grid_radius] you defined " +"beforehand.\n" +"[b]Example:[/b] A [ProximityGroup] node named [code]\"PlanetEarth\"[/code] " +"at position [code]Vector3(6, 6, 6)[/code] with a [member group_name] set to " +"[code]\"planets\"[/code] and a [member grid_radius] of [code]Vector3(1, 2, 3)" +"[/code] will create the following [SceneTree] group names:\n" +"[codeblock]\n" +"- \"planets|5|4|3\"\n" +"- \"planets|5|4|4\"\n" +"- \"planets|5|4|5\"\n" +"- \"planets|5|4|6\"\n" +"- \"planets|5|4|7\"\n" +"- \"planets|5|4|8\"\n" +"- \"planets|5|4|9\"\n" +"- ...\n" +"[/codeblock]\n" +"If there is another [ProximityGroup] named [code]\"PlanetMars\"[/code] with " +"group name [code]\"planets\"[/code], and one of its coordinates is " +"[code]Vector3(5, 4, 7)[/code], it would normally create the [SceneTree] " +"group called [code]\"planets|5|4|7\"[/code]. However, since this group name " +"already exists, this [ProximityGroup] object will be [i]added[/i] to the " +"existing one. [code]\"PlanetEarth\"[/code] is already in this group. As long " +"as both nodes don't change their transform and stop intersecting (or exit " +"the scene tree), they are grouped together. As long as this intersection " +"exists, any call to [method broadcast] will affect [i]both[/i] " +"[ProximityGroup] nodes.\n" +"There are 3 caveats to keep in mind when using [ProximityGroup]:\n" +"- The larger the grid radius, the more coordinates and the more [SceneTree] " +"groups are created. This can have a performance impact if too many groups " +"are created.\n" +"- If the [ProximityGroup] node is transformed in any way (or is removed from " +"the scene tree), the groupings will have to be recalculated. This can also " +"have a performance impact.\n" +"- If your [member grid_radius] is smaller than [code]Vector3(1, 1, 1)[/" +"code], it will be rounded up to [code]Vector3(1, 1, 1)[/code]. Therefore, " +"small grid radius values may lead to unwanted groupings.\n" +"[b]Note:[/b] [ProximityGroup] will be removed in Godot 4.0 in favor of more " +"effective and faster [VisibilityNotifier] functionality. For most use cases, " +"[method Vector3.distance_to] or [method Vector3.distance_squared_to] are " +"fast enough too, especially if you call them less often using a [Timer] node." +msgstr "" + +#: doc/classes/ProximityGroup.xml +msgid "" +"Calls on all intersecting [ProximityGroup] the given method and parameters.\n" +"If the [member dispatch_mode] is set to [constant MODE_PROXY] (the default), " +"all calls are delegated to their respective parent [Node]." +msgstr "" + +#: doc/classes/ProximityGroup.xml +msgid "" +"Specifies which node gets contacted on a call of method [method broadcast]." +msgstr "" + +#: doc/classes/ProximityGroup.xml +msgid "" +"The size of the space in 3D units. This also sets the amount of coordinates " +"required to calculate whether two [ProximityGroup] nodes are intersecting or " +"not. Smaller [member grid_radius] values can be used for more precise " +"proximity checks at the cost of performance, since more groups will be " +"created." +msgstr "" + +#: doc/classes/ProximityGroup.xml +msgid "" +"Specify the common group name, to let other [ProximityGroup] nodes know, if " +"they should be auto-grouped with this node in case they intersect with each " +"other.\n" +"For example, if you have a [ProximityGroup] node named [code]\"Earth\"[/" +"code] and another called [code]\"Mars\"[/code], with both nodes having " +"[code]\"planet\"[/code] as their [member group_name]. Give both planets a " +"significantly larger [member grid_radius] than their actual radius, position " +"them close enough and they'll be automatically grouped." +msgstr "" + +#: doc/classes/ProximityGroup.xml +msgid "" +"Emitted when the user calls the [method broadcast] method and has set " +"[member dispatch_mode] to [constant MODE_SIGNAL].\n" +"The given method and its parameters are passed on to the listeners who " +"connected to this signal of this object, as well as any [ProximityGroup] " +"node this node is grouped together with.\n" +"[b]Note:[/b] This signal is [i]not[/i] emitted by default, as the default " +"[member dispatch_mode] is [constant MODE_PROXY]." +msgstr "" + +#: doc/classes/ProximityGroup.xml +msgid "This [ProximityGroup]'s parent will be target of [method broadcast]." +msgstr "" + +#: doc/classes/ProximityGroup.xml +msgid "" +"This [ProximityGroup] will emit the [signal broadcast] [i]signal[/i] when " +"calling the [method broadcast] [i]method[/i]." +msgstr "" + +#: doc/classes/QuadMesh.xml +msgid "Class representing a square mesh." +msgstr "" + +#: doc/classes/QuadMesh.xml +msgid "" +"Class representing a square [PrimitiveMesh]. This flat mesh does not have a " +"thickness. By default, this mesh is aligned on the X and Y axes; this " +"default rotation is more suited for use with billboarded materials. Unlike " +"[PlaneMesh], this mesh doesn't provide subdivision options." +msgstr "" + +#: doc/classes/QuadMesh.xml doc/classes/Viewport.xml +#: doc/classes/ViewportTexture.xml +msgid "2D in 3D Demo" +msgstr "" + +#: doc/classes/QuadMesh.xml +msgid "Offset of the generated Quad. Useful for particles." +msgstr "" + +#: doc/classes/QuadMesh.xml +msgid "Size on the X and Y axes." +msgstr "" + +#: doc/classes/Quat.xml +msgid "Quaternion." +msgstr "" + +#: doc/classes/Quat.xml +msgid "" +"A unit quaternion used for representing 3D rotations. Quaternions need to be " +"normalized to be used for rotation.\n" +"It is similar to Basis, which implements matrix representation of rotations, " +"and can be parametrized using both an axis-angle pair or Euler angles. Basis " +"stores rotation, scale, and shearing, while Quat only stores rotation.\n" +"Due to its compactness and the way it is stored in memory, certain " +"operations (obtaining axis-angle and performing SLERP, in particular) are " +"more efficient and robust against floating-point errors." +msgstr "" + +#: doc/classes/Quat.xml +msgid "Constructs a quaternion from the given [Basis]." +msgstr "" + +#: doc/classes/Quat.xml +msgid "" +"Constructs a quaternion that will perform a rotation specified by Euler " +"angles (in the YXZ convention: when decomposing, first Z, then X, and Y " +"last), given in the vector format as (X angle, Y angle, Z angle)." +msgstr "" + +#: doc/classes/Quat.xml +msgid "" +"Constructs a quaternion that will rotate around the given axis by the " +"specified angle. The axis must be a normalized vector." +msgstr "" + +#: doc/classes/Quat.xml +msgid "Constructs a quaternion defined by the given values." +msgstr "" + +#: doc/classes/Quat.xml +msgid "" +"Returns the angle between this quaternion and [code]to[/code]. This is the " +"magnitude of the angle you would need to rotate by to get from one to the " +"other.\n" +"[b]Note:[/b] This method has an abnormally high amount of floating-point " +"error, so methods such as [method @GDScript.is_zero_approx] will not work " +"reliably." +msgstr "" + +#: doc/classes/Quat.xml +msgid "" +"Performs a cubic spherical interpolation between quaternions [code]pre_a[/" +"code], this vector, [code]b[/code], and [code]post_b[/code], by the given " +"amount [code]weight[/code]." +msgstr "" + +#: doc/classes/Quat.xml +msgid "Returns the dot product of two quaternions." +msgstr "" + +#: doc/classes/Quat.xml +msgid "" +"Returns Euler angles (in the YXZ convention: when decomposing, first Z, then " +"X, and Y last) corresponding to the rotation represented by the unit " +"quaternion. Returned vector contains the rotation angles in the format (X " +"angle, Y angle, Z angle)." +msgstr "" + +#: doc/classes/Quat.xml +msgid "Returns the inverse of the quaternion." +msgstr "" + +#: doc/classes/Quat.xml +msgid "" +"Returns [code]true[/code] if this quaternion and [code]quat[/code] are " +"approximately equal, by running [method @GDScript.is_equal_approx] on each " +"component." +msgstr "" + +#: doc/classes/Quat.xml +msgid "Returns whether the quaternion is normalized or not." +msgstr "" + +#: doc/classes/Quat.xml +msgid "Returns the length of the quaternion." +msgstr "" + +#: doc/classes/Quat.xml +msgid "Returns the length of the quaternion, squared." +msgstr "" + +#: doc/classes/Quat.xml +msgid "Returns a copy of the quaternion, normalized to unit length." +msgstr "" + +#: doc/classes/Quat.xml +msgid "" +"Sets the quaternion to a rotation which rotates around axis by the specified " +"angle, in radians. The axis must be a normalized vector." +msgstr "" + +#: doc/classes/Quat.xml +msgid "" +"Sets the quaternion to a rotation specified by Euler angles (in the YXZ " +"convention: when decomposing, first Z, then X, and Y last), given in the " +"vector format as (X angle, Y angle, Z angle)." +msgstr "" + +#: doc/classes/Quat.xml +msgid "" +"Returns the result of the spherical linear interpolation between this " +"quaternion and [code]to[/code] by amount [code]weight[/code].\n" +"[b]Note:[/b] Both quaternions must be normalized." +msgstr "" + +#: doc/classes/Quat.xml +msgid "" +"Returns the result of the spherical linear interpolation between this " +"quaternion and [code]to[/code] by amount [code]weight[/code], but without " +"checking if the rotation path is not bigger than 90 degrees." +msgstr "" + +#: doc/classes/Quat.xml +msgid "Returns a vector transformed (multiplied) by this quaternion." +msgstr "" + +#: doc/classes/Quat.xml +msgid "" +"W component of the quaternion (real part).\n" +"Quaternion components should usually not be manipulated directly." +msgstr "" + +#: doc/classes/Quat.xml +msgid "" +"X component of the quaternion (imaginary [code]i[/code] axis part).\n" +"Quaternion components should usually not be manipulated directly." +msgstr "" + +#: doc/classes/Quat.xml +msgid "" +"Y component of the quaternion (imaginary [code]j[/code] axis part).\n" +"Quaternion components should usually not be manipulated directly." +msgstr "" + +#: doc/classes/Quat.xml +msgid "" +"Z component of the quaternion (imaginary [code]k[/code] axis part).\n" +"Quaternion components should usually not be manipulated directly." +msgstr "" + +#: doc/classes/Quat.xml +msgid "" +"The identity quaternion, representing no rotation. Equivalent to an identity " +"[Basis] matrix. If a vector is transformed by an identity quaternion, it " +"will not change." +msgstr "" + +#: doc/classes/RandomNumberGenerator.xml +msgid "A class for generating pseudo-random numbers." +msgstr "" + +#: doc/classes/RandomNumberGenerator.xml +msgid "" +"RandomNumberGenerator is a class for generating pseudo-random numbers. It " +"currently uses [url=http://www.pcg-random.org/]PCG32[/url].\n" +"[b]Note:[/b] The underlying algorithm is an implementation detail. As a " +"result, it should not be depended upon for reproducible random streams " +"across Godot versions.\n" +"To generate a random float number (within a given range) based on a time-" +"dependant seed:\n" +"[codeblock]\n" +"var rng = RandomNumberGenerator.new()\n" +"func _ready():\n" +" rng.randomize()\n" +" var my_random_number = rng.randf_range(-10.0, 10.0)\n" +"[/codeblock]\n" +"[b]Note:[/b] The default values of [member seed] and [member state] " +"properties are pseudo-random, and changes when calling [method randomize]. " +"The [code]0[/code] value documented here is a placeholder, and not the " +"actual default seed." +msgstr "" + +#: doc/classes/RandomNumberGenerator.xml +msgid "Random number generation" +msgstr "" + +#: doc/classes/RandomNumberGenerator.xml +msgid "" +"Generates a pseudo-random float between [code]0.0[/code] and [code]1.0[/" +"code] (inclusive)." +msgstr "" + +#: doc/classes/RandomNumberGenerator.xml +msgid "" +"Generates a pseudo-random float between [code]from[/code] and [code]to[/" +"code] (inclusive)." +msgstr "" + +#: doc/classes/RandomNumberGenerator.xml +msgid "" +"Generates a [url=https://en.wikipedia.org/wiki/Normal_distribution]normally-" +"distributed[/url] pseudo-random number, using Box-Muller transform with the " +"specified [code]mean[/code] and a standard [code]deviation[/code]. This is " +"also called Gaussian distribution." +msgstr "" + +#: doc/classes/RandomNumberGenerator.xml +msgid "" +"Generates a pseudo-random 32-bit unsigned integer between [code]0[/code] and " +"[code]4294967295[/code] (inclusive)." +msgstr "" + +#: doc/classes/RandomNumberGenerator.xml +msgid "" +"Generates a pseudo-random 32-bit signed integer between [code]from[/code] " +"and [code]to[/code] (inclusive)." +msgstr "" + +#: doc/classes/RandomNumberGenerator.xml +msgid "Setups a time-based seed to generator." +msgstr "" + +#: doc/classes/RandomNumberGenerator.xml +msgid "" +"Initializes the random number generator state based on the given seed value. " +"A given seed will give a reproducible sequence of pseudo-random numbers.\n" +"[b]Note:[/b] The RNG does not have an avalanche effect, and can output " +"similar random streams given similar seeds. Consider using a hash function " +"to improve your seed quality if they're sourced externally.\n" +"[b]Note:[/b] Setting this property produces a side effect of changing the " +"internal [member state], so make sure to initialize the seed [i]before[/i] " +"modifying the [member state]:\n" +"[codeblock]\n" +"var rng = RandomNumberGenerator.new()\n" +"rng.seed = hash(\"Godot\")\n" +"rng.state = 100 # Restore to some previously saved state.\n" +"[/codeblock]\n" +"[b]Warning:[/b] the getter of this property returns the previous [member " +"state], and not the initial seed value, which is going to be fixed in Godot " +"4.0." +msgstr "" + +#: doc/classes/RandomNumberGenerator.xml +msgid "" +"The current state of the random number generator. Save and restore this " +"property to restore the generator to a previous state:\n" +"[codeblock]\n" +"var rng = RandomNumberGenerator.new()\n" +"print(rng.randf())\n" +"var saved_state = rng.state # Store current state.\n" +"print(rng.randf()) # Advance internal state.\n" +"rng.state = saved_state # Restore the state.\n" +"print(rng.randf()) # Prints the same value as in previous.\n" +"[/codeblock]\n" +"[b]Note:[/b] Do not set state to arbitrary values, since the random number " +"generator requires the state to have certain qualities to behave properly. " +"It should only be set to values that came from the state property itself. To " +"initialize the random number generator with arbitrary input, use [member " +"seed] instead." +msgstr "" + +#: doc/classes/Range.xml +msgid "Abstract base class for range-based controls." +msgstr "" + +#: doc/classes/Range.xml +msgid "" +"Range is a base class for [Control] nodes that change a floating-point " +"[member value] between a [member min_value] and [member max_value], using a " +"configured [member step] and [member page] size. See e.g. [ScrollBar] and " +"[Slider] for examples of higher level nodes using Range." +msgstr "" + +#: doc/classes/Range.xml +msgid "" +"Binds two [Range]s together along with any ranges previously grouped with " +"either of them. When any of range's member variables change, it will share " +"the new value with all other ranges in its group." +msgstr "" + +#: doc/classes/Range.xml +msgid "Stops the [Range] from sharing its member variables with any other." +msgstr "" + +#: doc/classes/Range.xml +msgid "" +"If [code]true[/code], [member value] may be greater than [member max_value]." +msgstr "" + +#: doc/classes/Range.xml +msgid "" +"If [code]true[/code], [member value] may be less than [member min_value]." +msgstr "" + +#: doc/classes/Range.xml +msgid "" +"If [code]true[/code], and [code]min_value[/code] is greater than 0, " +"[code]value[/code] will be represented exponentially rather than linearly." +msgstr "" + +#: doc/classes/Range.xml +msgid "" +"Maximum value. Range is clamped if [code]value[/code] is greater than " +"[code]max_value[/code]." +msgstr "" + +#: doc/classes/Range.xml +msgid "" +"Minimum value. Range is clamped if [code]value[/code] is less than " +"[code]min_value[/code]." +msgstr "" + +#: doc/classes/Range.xml +msgid "" +"Page size. Used mainly for [ScrollBar]. ScrollBar's length is its size " +"multiplied by [code]page[/code] over the difference between [code]min_value[/" +"code] and [code]max_value[/code]." +msgstr "" + +#: doc/classes/Range.xml +msgid "The value mapped between 0 and 1." +msgstr "" + +#: doc/classes/Range.xml +msgid "" +"If [code]true[/code], [code]value[/code] will always be rounded to the " +"nearest integer." +msgstr "" + +#: doc/classes/Range.xml +msgid "" +"If greater than 0, [code]value[/code] will always be rounded to a multiple " +"of [code]step[/code]. If [code]rounded[/code] is also [code]true[/code], " +"[code]value[/code] will first be rounded to a multiple of [code]step[/code] " +"then rounded to the nearest integer." +msgstr "" + +#: doc/classes/Range.xml +msgid "Range's current value." +msgstr "" + +#: doc/classes/Range.xml +msgid "" +"Emitted when [member min_value], [member max_value], [member page], or " +"[member step] change." +msgstr "" + +#: doc/classes/Range.xml +msgid "" +"Emitted when [member value] changes. When used on a [Slider], this is called " +"continuously while dragging (potentially every frame). If you are performing " +"an expensive operation in a function connected to [signal value_changed], " +"consider using a [i]debouncing[/i] [Timer] to call the function less often.\n" +"[b]Note:[/b] Unlike signals such as [signal LineEdit.text_changed], [signal " +"value_changed] is also emitted when [code]value[/code] is set directly via " +"code." +msgstr "" + +#: doc/classes/RayCast.xml doc/classes/RayCast2D.xml +msgid "Query the closest object intersecting a ray." +msgstr "" + +#: doc/classes/RayCast.xml +msgid "" +"A RayCast represents a line from its origin to its destination position, " +"[code]cast_to[/code]. It is used to query the 3D space in order to find the " +"closest object along the path of the ray.\n" +"RayCast can ignore some objects by adding them to the exception list via " +"[code]add_exception[/code] or by setting proper filtering with collision " +"layers and masks.\n" +"RayCast can be configured to report collisions with [Area]s ([member " +"collide_with_areas]) and/or [PhysicsBody]s ([member collide_with_bodies]).\n" +"Only enabled raycasts will be able to query the space and report " +"collisions.\n" +"RayCast calculates intersection every physics frame (see [Node]), and the " +"result is cached so it can be used later until the next frame. If multiple " +"queries are required between physics frames (or during the same frame), use " +"[method force_raycast_update] after adjusting the raycast." +msgstr "" + +#: doc/classes/RayCast.xml doc/classes/RayCast2D.xml +msgid "" +"Adds a collision exception so the ray does not report collisions with the " +"specified node." +msgstr "" + +#: doc/classes/RayCast.xml doc/classes/RayCast2D.xml +msgid "" +"Adds a collision exception so the ray does not report collisions with the " +"specified [RID]." +msgstr "" + +#: doc/classes/RayCast.xml doc/classes/RayCast2D.xml +msgid "Removes all collision exceptions for this ray." +msgstr "" + +#: doc/classes/RayCast.xml doc/classes/RayCast2D.xml +msgid "" +"Updates the collision information for the ray. Use this method to update the " +"collision information immediately instead of waiting for the next " +"[code]_physics_process[/code] call, for example if the ray or its parent has " +"changed state.\n" +"[b]Note:[/b] [code]enabled[/code] is not required for this to work." +msgstr "" + +#: doc/classes/RayCast.xml doc/classes/RayCast2D.xml +msgid "" +"Returns the first object that the ray intersects, or [code]null[/code] if no " +"object is intersecting the ray (i.e. [method is_colliding] returns " +"[code]false[/code])." +msgstr "" + +#: doc/classes/RayCast.xml doc/classes/RayCast2D.xml +msgid "" +"Returns the shape ID of the first object that the ray intersects, or " +"[code]0[/code] if no object is intersecting the ray (i.e. [method " +"is_colliding] returns [code]false[/code])." +msgstr "" + +#: doc/classes/RayCast.xml +msgid "" +"Returns [code]true[/code] if the bit index passed is turned on.\n" +"[b]Note:[/b] Bit indices range from 0-19." +msgstr "" + +#: doc/classes/RayCast.xml doc/classes/RayCast2D.xml +msgid "" +"Returns the normal of the intersecting object's shape at the collision point." +msgstr "" + +#: doc/classes/RayCast.xml doc/classes/RayCast2D.xml +msgid "" +"Returns the collision point at which the ray intersects the closest object.\n" +"[b]Note:[/b] This point is in the [b]global[/b] coordinate system." +msgstr "" + +#: doc/classes/RayCast.xml doc/classes/RayCast2D.xml +msgid "" +"Returns whether any object is intersecting with the ray's vector " +"(considering the vector length)." +msgstr "" + +#: doc/classes/RayCast.xml doc/classes/RayCast2D.xml +msgid "" +"Removes a collision exception so the ray does report collisions with the " +"specified node." +msgstr "" + +#: doc/classes/RayCast.xml doc/classes/RayCast2D.xml +msgid "" +"Removes a collision exception so the ray does report collisions with the " +"specified [RID]." +msgstr "" + +#: doc/classes/RayCast.xml +msgid "" +"Sets the bit index passed to the [code]value[/code] passed.\n" +"[b]Note:[/b] Bit indexes range from 0-19." +msgstr "" + +#: doc/classes/RayCast.xml doc/classes/RayCast2D.xml +msgid "" +"The ray's destination point, relative to the RayCast's [code]position[/code]." +msgstr "" + +#: doc/classes/RayCast.xml +msgid "If [code]true[/code], collision with [Area]s will be reported." +msgstr "" + +#: doc/classes/RayCast.xml +msgid "If [code]true[/code], collision with [PhysicsBody]s will be reported." +msgstr "" + +#: doc/classes/RayCast.xml doc/classes/RayCast2D.xml +msgid "" +"The ray's collision mask. Only objects in at least one collision layer " +"enabled in the mask will be detected. See [url=$DOCS_URL/tutorials/physics/" +"physics_introduction.html#collision-layers-and-masks]Collision layers and " +"masks[/url] in the documentation for more information." +msgstr "" + +#: doc/classes/RayCast.xml +msgid "" +"The custom color to use to draw the shape in the editor and at run-time if " +"[b]Visible Collision Shapes[/b] is enabled in the [b]Debug[/b] menu. This " +"color will be highlighted at run-time if the [RayCast] is colliding with " +"something.\n" +"If set to [code]Color(0.0, 0.0, 0.0)[/code] (by default), the color set in " +"[member ProjectSettings.debug/shapes/collision/shape_color] is used." +msgstr "" + +#: doc/classes/RayCast.xml +msgid "" +"If set to [code]1[/code], a line is used as the debug shape. Otherwise, a " +"truncated pyramid is drawn to represent the [RayCast]. Requires [b]Visible " +"Collision Shapes[/b] to be enabled in the [b]Debug[/b] menu for the debug " +"shape to be visible at run-time." +msgstr "" + +#: doc/classes/RayCast.xml doc/classes/RayCast2D.xml +msgid "If [code]true[/code], collisions will be reported." +msgstr "" + +#: doc/classes/RayCast.xml +msgid "" +"If [code]true[/code], collisions will be ignored for this RayCast's " +"immediate parent." +msgstr "" + +#: doc/classes/RayCast2D.xml +msgid "" +"A RayCast represents a line from its origin to its destination position, " +"[code]cast_to[/code]. It is used to query the 2D space in order to find the " +"closest object along the path of the ray.\n" +"RayCast2D can ignore some objects by adding them to the exception list via " +"[code]add_exception[/code], by setting proper filtering with collision " +"layers, or by filtering object types with type masks.\n" +"RayCast2D can be configured to report collisions with [Area2D]s ([member " +"collide_with_areas]) and/or [PhysicsBody2D]s ([member " +"collide_with_bodies]).\n" +"Only enabled raycasts will be able to query the space and report " +"collisions.\n" +"RayCast2D calculates intersection every physics frame (see [Node]), and the " +"result is cached so it can be used later until the next frame. If multiple " +"queries are required between physics frames (or during the same frame) use " +"[method force_raycast_update] after adjusting the raycast." +msgstr "" + +#: doc/classes/RayCast2D.xml +msgid "" +"Sets or clears individual bits on the collision mask. This makes selecting " +"the areas scanned easier." +msgstr "" + +#: doc/classes/RayCast2D.xml +msgid "If [code]true[/code], collision with [Area2D]s will be reported." +msgstr "" + +#: doc/classes/RayCast2D.xml +msgid "If [code]true[/code], collision with [PhysicsBody2D]s will be reported." +msgstr "" + +#: doc/classes/RayCast2D.xml +msgid "" +"If [code]true[/code], the parent node will be excluded from collision " +"detection." +msgstr "" + +#: doc/classes/RayShape.xml +msgid "Ray shape for 3D collisions." +msgstr "" + +#: doc/classes/RayShape.xml +msgid "" +"Ray shape for 3D collisions, which can be set into a [PhysicsBody] or " +"[Area]. A ray is not really a collision body; instead, it tries to separate " +"itself from whatever is touching its far endpoint. It's often useful for " +"characters." +msgstr "" + +#: doc/classes/RayShape.xml doc/classes/RayShape2D.xml +msgid "The ray's length." +msgstr "" + +#: doc/classes/RayShape.xml doc/classes/RayShape2D.xml +msgid "If [code]true[/code], allow the shape to return the correct normal." +msgstr "" + +#: doc/classes/RayShape2D.xml +msgid "Ray shape for 2D collisions." +msgstr "" + +#: doc/classes/RayShape2D.xml +msgid "" +"Ray shape for 2D collisions. A ray is not really a collision body; instead, " +"it tries to separate itself from whatever is touching its far endpoint. It's " +"often useful for characters." +msgstr "" + +#: doc/classes/Rect2.xml +msgid "2D axis-aligned bounding box." +msgstr "" + +#: doc/classes/Rect2.xml +msgid "" +"[Rect2] consists of a position, a size, and several utility functions. It is " +"typically used for fast overlap tests.\n" +"It uses floating-point coordinates.\n" +"The 3D counterpart to [Rect2] is [AABB]." +msgstr "" + +#: doc/classes/Rect2.xml +msgid "Constructs a [Rect2] by position and size." +msgstr "" + +#: doc/classes/Rect2.xml +msgid "Constructs a [Rect2] by x, y, width, and height." +msgstr "" + +#: doc/classes/Rect2.xml +msgid "" +"Returns a [Rect2] with equivalent position and area, modified so that the " +"top-left corner is the origin and [code]width[/code] and [code]height[/code] " +"are positive." +msgstr "" + +#: doc/classes/Rect2.xml +msgid "Returns the intersection of this [Rect2] and b." +msgstr "" + +#: doc/classes/Rect2.xml +msgid "" +"Returns [code]true[/code] if this [Rect2] completely encloses another one." +msgstr "" + +#: doc/classes/Rect2.xml +msgid "" +"Returns a copy of this [Rect2] expanded to include a given point.\n" +"[b]Example:[/b]\n" +"[codeblock]\n" +"# position (-3, 2), size (1, 1)\n" +"var rect = Rect2(Vector2(-3, 2), Vector2(1, 1))\n" +"# position (-3, -1), size (3, 4), so we fit both rect and Vector2(0, -1)\n" +"var rect2 = rect.expand(Vector2(0, -1))\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Rect2.xml +msgid "Returns the area of the [Rect2]. See also [method has_no_area]." +msgstr "" + +#: doc/classes/Rect2.xml +msgid "" +"Returns the center of the [Rect2], which is equal to [member position] + " +"([member size] / 2)." +msgstr "" + +#: doc/classes/Rect2.xml +msgid "" +"Returns a copy of the [Rect2] grown a given amount of units towards all the " +"sides." +msgstr "" + +#: doc/classes/Rect2.xml +msgid "" +"Returns a copy of the [Rect2] grown a given amount of units towards each " +"direction individually." +msgstr "" + +#: doc/classes/Rect2.xml +msgid "" +"Returns a copy of the [Rect2] grown a given amount of units towards the " +"[enum Margin] direction." +msgstr "" + +#: doc/classes/Rect2.xml +msgid "" +"Returns [code]true[/code] if the [Rect2] is flat or empty, [code]false[/" +"code] otherwise. See also [method get_area].\n" +"[b]Note:[/b] If the [Rect2] has a negative size and is not flat or empty, " +"[method has_no_area] will return [code]true[/code]." +msgstr "" + +#: doc/classes/Rect2.xml +msgid "" +"Returns [code]true[/code] if the [Rect2] contains a point. By convention, " +"the right and bottom edges of the [Rect2] are considered exclusive, so " +"points on these edges are [b]not[/b] included.\n" +"[b]Note:[/b] This method is not reliable for [Rect2] with a [i]negative " +"size[/i]. Use [method abs] to get a positive sized equivalent rectangle to " +"check for contained points." +msgstr "" + +#: doc/classes/Rect2.xml +msgid "" +"Returns [code]true[/code] if the [Rect2] overlaps with [code]b[/code] (i.e. " +"they have at least one point in common).\n" +"If [code]include_borders[/code] is [code]true[/code], they will also be " +"considered overlapping if their borders touch, even without intersection." +msgstr "" + +#: doc/classes/Rect2.xml +msgid "" +"Returns [code]true[/code] if this [Rect2] and [code]rect[/code] are " +"approximately equal, by calling [code]is_equal_approx[/code] on each " +"component." +msgstr "" + +#: doc/classes/Rect2.xml +msgid "Returns a larger [Rect2] that contains this [Rect2] and [code]b[/code]." +msgstr "" + +#: doc/classes/RectangleShape2D.xml +msgid "Rectangle shape for 2D collisions." +msgstr "" + +#: doc/classes/RectangleShape2D.xml +msgid "" +"Rectangle shape for 2D collisions. This shape is useful for modeling box-" +"like 2D objects." +msgstr "" + +#: doc/classes/RectangleShape2D.xml +msgid "" +"The rectangle's half extents. The width and height of this shape is twice " +"the half extents." +msgstr "" + +#: doc/classes/Reference.xml +msgid "Base class for reference-counted objects." +msgstr "" + +#: doc/classes/Reference.xml +msgid "" +"Base class for any object that keeps a reference count. [Resource] and many " +"other helper objects inherit this class.\n" +"Unlike other [Object] types, References keep an internal reference counter " +"so that they are automatically released when no longer in use, and only " +"then. References therefore do not need to be freed manually with [method " +"Object.free].\n" +"In the vast majority of use cases, instantiating and using [Reference]-" +"derived types is all you need to do. The methods provided in this class are " +"only for advanced users, and can cause issues if misused.\n" +"[b]Note:[/b] In C#, references will not be freed instantly after they are no " +"longer in use. Instead, garbage collection will run periodically and will " +"free references that are no longer in use. This means that unused references " +"will linger on for a while before being removed." +msgstr "" + +#: doc/classes/Reference.xml +msgid "" +"Initializes the internal reference counter. Use this only if you really know " +"what you are doing.\n" +"Returns whether the initialization was successful." +msgstr "" + +#: doc/classes/Reference.xml +msgid "" +"Increments the internal reference counter. Use this only if you really know " +"what you are doing.\n" +"Returns [code]true[/code] if the increment was successful, [code]false[/" +"code] otherwise." +msgstr "" + +#: doc/classes/Reference.xml +msgid "" +"Decrements the internal reference counter. Use this only if you really know " +"what you are doing.\n" +"Returns [code]true[/code] if the decrement was successful, [code]false[/" +"code] otherwise." +msgstr "" + +#: doc/classes/ReferenceRect.xml +msgid "Reference frame for GUI." +msgstr "" + +#: doc/classes/ReferenceRect.xml +msgid "" +"A rectangle box that displays only a [member border_color] border color " +"around its rectangle. [ReferenceRect] has no fill [Color]. If you need to " +"display a rectangle filled with a solid color, consider using [ColorRect] " +"instead." +msgstr "" + +#: doc/classes/ReferenceRect.xml +msgid "Sets the border [Color] of the [ReferenceRect]." +msgstr "" + +#: doc/classes/ReferenceRect.xml +msgid "" +"Sets the border width of the [ReferenceRect]. The border grows both inwards " +"and outwards with respect to the rectangle box." +msgstr "" + +#: doc/classes/ReferenceRect.xml +msgid "" +"If set to [code]true[/code], the [ReferenceRect] will only be visible while " +"in editor. Otherwise, [ReferenceRect] will be visible in game." +msgstr "" + +#: doc/classes/ReflectionProbe.xml +msgid "" +"Captures its surroundings to create fast, accurate reflections from a given " +"point." +msgstr "" + +#: doc/classes/ReflectionProbe.xml +msgid "" +"Capture its surroundings as a dual paraboloid image, and stores versions of " +"it with increasing levels of blur to simulate different material " +"roughnesses.\n" +"The [ReflectionProbe] is used to create high-quality reflections at a low " +"performance cost (when [member update_mode] is [constant UPDATE_ONCE]). " +"[ReflectionProbe]s can be blended together and with the rest of the scene " +"smoothly. [ReflectionProbe]s can also be combined with [GIProbe] and screen-" +"space reflections ([member Environment.ss_reflections_enabled]) to get more " +"accurate reflections in specific areas. [ReflectionProbe]s render all " +"objects within their [member cull_mask], so updating them can be quite " +"expensive. It is best to update them once with the important static objects " +"and then leave them as-is.\n" +"[b]Note:[/b] Unlike [GIProbe], [ReflectionProbe]s only source their " +"environment from a [WorldEnvironment] node. If you specify an [Environment] " +"resource within a [Camera] node, it will be ignored by the " +"[ReflectionProbe]. This can lead to incorrect lighting within the " +"[ReflectionProbe].\n" +"[b]Note:[/b] By default, Godot will only render 16 reflection probes. If you " +"need more, increase the number of atlas subdivisions. This setting can be " +"found in [member ProjectSettings.rendering/quality/reflections/" +"atlas_subdiv].\n" +"[b]Note:[/b] The GLES2 backend will only display two reflection probes at " +"the same time for a single mesh. If possible, split up large meshes that " +"span over multiple reflection probes into smaller ones." +msgstr "" + +#: doc/classes/ReflectionProbe.xml +msgid "" +"If [code]true[/code], enables box projection. This makes reflections look " +"more correct in rectangle-shaped rooms by offsetting the reflection center " +"depending on the camera's location.\n" +"[b]Note:[/b] To better fit rectangle-shaped rooms that are not aligned to " +"the grid, you can rotate the [ReflectionProbe] node." +msgstr "" + +#: doc/classes/ReflectionProbe.xml +msgid "" +"Sets the cull mask which determines what objects are drawn by this probe. " +"Every [VisualInstance] with a layer included in this cull mask will be " +"rendered by the probe. To improve performance, it is best to only include " +"large objects which are likely to take up a lot of space in the reflection." +msgstr "" + +#: doc/classes/ReflectionProbe.xml +msgid "" +"If [code]true[/code], computes shadows in the reflection probe. This makes " +"the reflection probe slower to render; you may want to disable this if using " +"the [constant UPDATE_ALWAYS] [member update_mode]." +msgstr "" + +#: doc/classes/ReflectionProbe.xml +msgid "" +"The size of the reflection probe. The larger the extents the more space " +"covered by the probe which will lower the perceived resolution. It is best " +"to keep the extents only as large as you need them.\n" +"[b]Note:[/b] To better fit areas that are not aligned to the grid, you can " +"rotate the [ReflectionProbe] node." +msgstr "" + +#: doc/classes/ReflectionProbe.xml +msgid "" +"Defines the reflection intensity. Intensity modulates the strength of the " +"reflection." +msgstr "" + +#: doc/classes/ReflectionProbe.xml +msgid "" +"Sets the ambient light color to be used when this probe is set to [member " +"interior_enable]." +msgstr "" + +#: doc/classes/ReflectionProbe.xml +msgid "" +"Sets the contribution value for how much the reflection affects the ambient " +"light for this reflection probe when set to [member interior_enable]. Useful " +"so that ambient light matches the color of the room." +msgstr "" + +#: doc/classes/ReflectionProbe.xml +msgid "" +"Sets the energy multiplier for this reflection probe's ambient light " +"contribution when set to [member interior_enable]." +msgstr "" + +#: doc/classes/ReflectionProbe.xml +msgid "" +"If [code]true[/code], reflections will ignore sky contribution. Ambient " +"lighting is then controlled by the [code]interior_ambient_*[/code] " +"properties." +msgstr "" + +#: doc/classes/ReflectionProbe.xml +msgid "" +"The maximum distance away from the [ReflectionProbe] an object can be before " +"it is culled. Decrease this to improve performance, especially when using " +"the [constant UPDATE_ALWAYS] [member update_mode].\n" +"[b]Note:[/b] The maximum reflection distance is always at least equal to the " +"[member extents]. This means that decreasing [member max_distance] will not " +"always cull objects from reflections, especially if the reflection probe's " +"[member extents] are already large." +msgstr "" + +#: doc/classes/ReflectionProbe.xml +msgid "" +"Sets the origin offset to be used when this [ReflectionProbe] is in [member " +"box_projection] mode. This can be set to a non-zero value to ensure a " +"reflection fits a rectangle-shaped room, while reducing the amount of " +"objects that \"get in the way\" of the reflection." +msgstr "" + +#: doc/classes/ReflectionProbe.xml +msgid "" +"Sets how frequently the [ReflectionProbe] is updated. Can be [constant " +"UPDATE_ONCE] or [constant UPDATE_ALWAYS]." +msgstr "" + +#: doc/classes/ReflectionProbe.xml +msgid "" +"Update the probe once on the next frame (recommended for most objects). The " +"corresponding radiance map will be generated over the following six frames. " +"This takes more time to update than [constant UPDATE_ALWAYS], but it has a " +"lower performance cost and can result in higher-quality reflections. The " +"ReflectionProbe is updated when its transform changes, but not when nearby " +"geometry changes. You can force a [ReflectionProbe] update by moving the " +"[ReflectionProbe] slightly in any direction." +msgstr "" + +#: doc/classes/ReflectionProbe.xml +msgid "" +"Update the probe every frame. This provides better results for fast-moving " +"dynamic objects (such as cars). However, it has a significant performance " +"cost. Due to the cost, it's recommended to only use one ReflectionProbe with " +"[constant UPDATE_ALWAYS] at most per scene. For all other use cases, use " +"[constant UPDATE_ONCE]." +msgstr "" + +#: modules/regex/doc_classes/RegEx.xml +msgid "Class for searching text for patterns using regular expressions." +msgstr "" + +#: modules/regex/doc_classes/RegEx.xml +msgid "" +"A regular expression (or regex) is a compact language that can be used to " +"recognise strings that follow a specific pattern, such as URLs, email " +"addresses, complete sentences, etc. For instance, a regex of [code]ab[0-9][/" +"code] would find any string that is [code]ab[/code] followed by any number " +"from [code]0[/code] to [code]9[/code]. For a more in-depth look, you can " +"easily find various tutorials and detailed explanations on the Internet.\n" +"To begin, the RegEx object needs to be compiled with the search pattern " +"using [method compile] before it can be used.\n" +"[codeblock]\n" +"var regex = RegEx.new()\n" +"regex.compile(\"\\\\w-(\\\\d+)\")\n" +"[/codeblock]\n" +"The search pattern must be escaped first for GDScript before it is escaped " +"for the expression. For example, [code]compile(\"\\\\d+\")[/code] would be " +"read by RegEx as [code]\\d+[/code]. Similarly, [code]compile(\"\\\"(?:\\\\\\" +"\\.|[^\\\"])*\\\"\")[/code] would be read as [code]\"(?:\\\\.|[^\"])*\"[/" +"code].\n" +"Using [method search], you can find the pattern within the given text. If a " +"pattern is found, [RegExMatch] is returned and you can retrieve details of " +"the results using methods such as [method RegExMatch.get_string] and [method " +"RegExMatch.get_start].\n" +"[codeblock]\n" +"var regex = RegEx.new()\n" +"regex.compile(\"\\\\w-(\\\\d+)\")\n" +"var result = regex.search(\"abc n-0123\")\n" +"if result:\n" +" print(result.get_string()) # Would print n-0123\n" +"[/codeblock]\n" +"The results of capturing groups [code]()[/code] can be retrieved by passing " +"the group number to the various methods in [RegExMatch]. Group 0 is the " +"default and will always refer to the entire pattern. In the above example, " +"calling [code]result.get_string(1)[/code] would give you [code]0123[/code].\n" +"This version of RegEx also supports named capturing groups, and the names " +"can be used to retrieve the results. If two or more groups have the same " +"name, the name would only refer to the first one with a match.\n" +"[codeblock]\n" +"var regex = RegEx.new()\n" +"regex.compile(\"d(?<digit>[0-9]+)|x(?<digit>[0-9a-f]+)\")\n" +"var result = regex.search(\"the number is x2f\")\n" +"if result:\n" +" print(result.get_string(\"digit\")) # Would print 2f\n" +"[/codeblock]\n" +"If you need to process multiple results, [method search_all] generates a " +"list of all non-overlapping results. This can be combined with a [code]for[/" +"code] loop for convenience.\n" +"[codeblock]\n" +"for result in regex.search_all(\"d01, d03, d0c, x3f and x42\"):\n" +" print(result.get_string(\"digit\"))\n" +"# Would print 01 03 0 3f 42\n" +"[/codeblock]\n" +"[b]Example of splitting a string using a RegEx:[/b]\n" +"[codeblock]\n" +"var regex = RegEx.new()\n" +"regex.compile(\"\\\\S+\") # Negated whitespace character class.\n" +"var results = []\n" +"for result in regex.search_all(\"One Two \\n\\tThree\"):\n" +" results.push_back(result.get_string())\n" +"# The `results` array now contains \"One\", \"Two\", \"Three\".\n" +"[/codeblock]\n" +"[b]Note:[/b] Godot's regex implementation is based on the [url=https://www." +"pcre.org/]PCRE2[/url] library. You can view the full pattern reference " +"[url=https://www.pcre.org/current/doc/html/pcre2pattern.html]here[/url].\n" +"[b]Tip:[/b] You can use [url=https://regexr.com/]Regexr[/url] to test " +"regular expressions online." +msgstr "" + +#: modules/regex/doc_classes/RegEx.xml +msgid "" +"This method resets the state of the object, as if it was freshly created. " +"Namely, it unassigns the regular expression of this object." +msgstr "" + +#: modules/regex/doc_classes/RegEx.xml +msgid "" +"Compiles and assign the search pattern to use. Returns [constant OK] if the " +"compilation is successful. If an error is encountered, details are printed " +"to standard output and an error is returned." +msgstr "" + +#: modules/regex/doc_classes/RegEx.xml +msgid "Returns the number of capturing groups in compiled pattern." +msgstr "" + +#: modules/regex/doc_classes/RegEx.xml +msgid "" +"Returns an array of names of named capturing groups in the compiled pattern. " +"They are ordered by appearance." +msgstr "" + +#: modules/regex/doc_classes/RegEx.xml +msgid "Returns the original search pattern that was compiled." +msgstr "" + +#: modules/regex/doc_classes/RegEx.xml +msgid "Returns whether this object has a valid search pattern assigned." +msgstr "" + +#: modules/regex/doc_classes/RegEx.xml +msgid "" +"Searches the text for the compiled pattern. Returns a [RegExMatch] container " +"of the first matching result if found, otherwise [code]null[/code]. The " +"region to search within can be specified without modifying where the start " +"and end anchor would be." +msgstr "" + +#: modules/regex/doc_classes/RegEx.xml +msgid "" +"Searches the text for the compiled pattern. Returns an array of [RegExMatch] " +"containers for each non-overlapping result. If no results were found, an " +"empty array is returned instead. The region to search within can be " +"specified without modifying where the start and end anchor would be." +msgstr "" + +#: modules/regex/doc_classes/RegEx.xml +msgid "" +"Searches the text for the compiled pattern and replaces it with the " +"specified string. Escapes and backreferences such as [code]$1[/code] and " +"[code]$name[/code] are expanded and resolved. By default, only the first " +"instance is replaced, but it can be changed for all instances (global " +"replacement). The region to search within can be specified without modifying " +"where the start and end anchor would be." +msgstr "" + +#: modules/regex/doc_classes/RegExMatch.xml +msgid "Contains the results of a [RegEx] search." +msgstr "" + +#: modules/regex/doc_classes/RegExMatch.xml +msgid "" +"Contains the results of a single [RegEx] match returned by [method RegEx." +"search] and [method RegEx.search_all]. It can be used to find the position " +"and range of the match and its capturing groups, and it can extract its " +"substring for you." +msgstr "" + +#: modules/regex/doc_classes/RegExMatch.xml +msgid "" +"Returns the end position of the match within the source string. The end " +"position of capturing groups can be retrieved by providing its group number " +"as an integer or its string name (if it's a named group). The default value " +"of 0 refers to the whole pattern.\n" +"Returns -1 if the group did not match or doesn't exist." +msgstr "" + +#: modules/regex/doc_classes/RegExMatch.xml +msgid "Returns the number of capturing groups." +msgstr "" + +#: modules/regex/doc_classes/RegExMatch.xml +msgid "" +"Returns the starting position of the match within the source string. The " +"starting position of capturing groups can be retrieved by providing its " +"group number as an integer or its string name (if it's a named group). The " +"default value of 0 refers to the whole pattern.\n" +"Returns -1 if the group did not match or doesn't exist." +msgstr "" + +#: modules/regex/doc_classes/RegExMatch.xml +msgid "" +"Returns the substring of the match from the source string. Capturing groups " +"can be retrieved by providing its group number as an integer or its string " +"name (if it's a named group). The default value of 0 refers to the whole " +"pattern.\n" +"Returns an empty string if the group did not match or doesn't exist." +msgstr "" + +#: modules/regex/doc_classes/RegExMatch.xml +msgid "" +"A dictionary of named groups and its corresponding group number. Only groups " +"that were matched are included. If multiple groups have the same name, that " +"name would refer to the first matching one." +msgstr "" + +#: modules/regex/doc_classes/RegExMatch.xml +msgid "An [Array] of the match and its capturing groups." +msgstr "" + +#: modules/regex/doc_classes/RegExMatch.xml +msgid "" +"The source string used with the search pattern to find this matching result." +msgstr "" + +#: doc/classes/RemoteTransform.xml +msgid "" +"RemoteTransform pushes its own [Transform] to another [Spatial] derived Node " +"in the scene." +msgstr "" + +#: doc/classes/RemoteTransform.xml +msgid "" +"RemoteTransform pushes its own [Transform] to another [Spatial] derived Node " +"(called the remote node) in the scene.\n" +"It can be set to update another Node's position, rotation and/or scale. It " +"can use either global or local coordinates." +msgstr "" + +#: doc/classes/RemoteTransform.xml +msgid "" +"[RemoteTransform] caches the remote node. It may not notice if the remote " +"node disappears; [method force_update_cache] forces it to update the cache " +"again." +msgstr "" + +#: doc/classes/RemoteTransform.xml +msgid "" +"The [NodePath] to the remote node, relative to the RemoteTransform's " +"position in the scene." +msgstr "" + +#: doc/classes/RemoteTransform.xml doc/classes/RemoteTransform2D.xml +msgid "If [code]true[/code], the remote node's position is updated." +msgstr "" + +#: doc/classes/RemoteTransform.xml doc/classes/RemoteTransform2D.xml +msgid "If [code]true[/code], the remote node's rotation is updated." +msgstr "" + +#: doc/classes/RemoteTransform.xml doc/classes/RemoteTransform2D.xml +msgid "If [code]true[/code], the remote node's scale is updated." +msgstr "" + +#: doc/classes/RemoteTransform.xml doc/classes/RemoteTransform2D.xml +msgid "" +"If [code]true[/code], global coordinates are used. If [code]false[/code], " +"local coordinates are used." +msgstr "" + +#: doc/classes/RemoteTransform2D.xml +msgid "" +"RemoteTransform2D pushes its own [Transform2D] to another [CanvasItem] " +"derived Node in the scene." +msgstr "" + +#: doc/classes/RemoteTransform2D.xml +msgid "" +"RemoteTransform2D pushes its own [Transform2D] to another [CanvasItem] " +"derived Node (called the remote node) in the scene.\n" +"It can be set to update another Node's position, rotation and/or scale. It " +"can use either global or local coordinates." +msgstr "" + +#: doc/classes/RemoteTransform2D.xml +msgid "" +"[RemoteTransform2D] caches the remote node. It may not notice if the remote " +"node disappears; [method force_update_cache] forces it to update the cache " +"again." +msgstr "" + +#: doc/classes/RemoteTransform2D.xml +msgid "" +"The [NodePath] to the remote node, relative to the RemoteTransform2D's " +"position in the scene." +msgstr "" + +#: doc/classes/Resource.xml +msgid "Base class for all resources." +msgstr "" + +#: doc/classes/Resource.xml +msgid "" +"Resource is the base class for all Godot-specific resource types, serving " +"primarily as data containers. Since they inherit from [Reference], resources " +"are reference-counted and freed when no longer in use. They are also cached " +"once loaded from disk, so that any further attempts to load a resource from " +"a given path will return the same reference (all this in contrast to a " +"[Node], which is not reference-counted and can be instanced from disk as " +"many times as desired). Resources can be saved externally on disk or bundled " +"into another object, such as a [Node] or another resource.\n" +"[b]Note:[/b] In C#, resources will not be freed instantly after they are no " +"longer in use. Instead, garbage collection will run periodically and will " +"free resources that are no longer in use. This means that unused resources " +"will linger on for a while before being removed." +msgstr "" + +#: doc/classes/Resource.xml +msgid "Resources" +msgstr "" + +#: doc/classes/Resource.xml +msgid "" +"Virtual function which can be overridden to customize the behavior value of " +"[method setup_local_to_scene]." +msgstr "" + +#: doc/classes/Resource.xml +msgid "" +"Duplicates the resource, returning a new resource with the exported members " +"copied. [b]Note:[/b] To duplicate the resource the constructor is called " +"without arguments. This method will error when the constructor doesn't have " +"default values.\n" +"By default, sub-resources are shared between resource copies for efficiency. " +"This can be changed by passing [code]true[/code] to the [code]subresources[/" +"code] argument which will copy the subresources.\n" +"[b]Note:[/b] If [code]subresources[/code] is [code]true[/code], this method " +"will only perform a shallow copy. Nested resources within subresources will " +"not be duplicated and will still be shared.\n" +"[b]Note:[/b] When duplicating a resource, only [code]export[/code]ed " +"properties are copied. Other properties will be set to their default value " +"in the new resource." +msgstr "" + +#: doc/classes/Resource.xml +msgid "" +"Emits the [signal changed] signal.\n" +"If external objects which depend on this resource should be updated, this " +"method must be called manually whenever the state of this resource has " +"changed (such as modification of properties).\n" +"The method is equivalent to:\n" +"[codeblock]\n" +"emit_signal(\"changed\")\n" +"[/codeblock]\n" +"[b]Note:[/b] This method is called automatically for built-in resources." +msgstr "" + +#: doc/classes/Resource.xml +msgid "" +"If [member resource_local_to_scene] is enabled and the resource was loaded " +"from a [PackedScene] instantiation, returns the local scene where this " +"resource's unique copy is in use. Otherwise, returns [code]null[/code]." +msgstr "" + +#: doc/classes/Resource.xml +msgid "" +"Returns the RID of the resource (or an empty RID). Many resources (such as " +"[Texture], [Mesh], etc) are high-level abstractions of resources stored in a " +"server, so this function will return the original RID." +msgstr "" + +#: doc/classes/Resource.xml +msgid "" +"This method is called when a resource with [member resource_local_to_scene] " +"enabled is loaded from a [PackedScene] instantiation. Its behavior can be " +"customized by overriding [method _setup_local_to_scene] from script.\n" +"For most resources, this method performs no base logic. [ViewportTexture] " +"performs custom logic to properly set the proxy texture and flags in the " +"local viewport." +msgstr "" + +#: doc/classes/Resource.xml +msgid "" +"Sets the path of the resource, potentially overriding an existing cache " +"entry for this path. This differs from setting [member resource_path], as " +"the latter would error out if another resource was already cached for the " +"given path." +msgstr "" + +#: doc/classes/Resource.xml +msgid "" +"If [code]true[/code], the resource will be made unique in each instance of " +"its local scene. It can thus be modified in a scene instance without " +"impacting other instances of that same scene." +msgstr "" + +#: doc/classes/Resource.xml +msgid "" +"The name of the resource. This is an optional identifier. If [member " +"resource_name] is not empty, its value will be displayed to represent the " +"current resource in the editor inspector. For built-in scripts, the [member " +"resource_name] will be displayed as the tab name in the script editor." +msgstr "" + +#: doc/classes/Resource.xml +msgid "" +"The path to the resource. In case it has its own file, it will return its " +"filepath. If it's tied to the scene, it will return the scene's path, " +"followed by the resource's index." +msgstr "" + +#: doc/classes/Resource.xml +msgid "" +"Emitted whenever the resource changes.\n" +"[b]Note:[/b] This signal is not emitted automatically for custom resources, " +"which means that you need to create a setter and emit the signal yourself." +msgstr "" + +#: doc/classes/ResourceFormatLoader.xml +msgid "Loads a specific resource type from a file." +msgstr "" + +#: doc/classes/ResourceFormatLoader.xml +msgid "" +"Godot loads resources in the editor or in exported games using " +"ResourceFormatLoaders. They are queried automatically via the " +"[ResourceLoader] singleton, or when a resource with internal dependencies is " +"loaded. Each file type may load as a different resource type, so multiple " +"ResourceFormatLoaders are registered in the engine.\n" +"Extending this class allows you to define your own loader. Be sure to " +"respect the documented return types and values. You should give it a global " +"class name with [code]class_name[/code] for it to be registered. Like built-" +"in ResourceFormatLoaders, it will be called automatically when loading " +"resources of its handled type(s). You may also implement a " +"[ResourceFormatSaver].\n" +"[b]Note:[/b] You can also extend [EditorImportPlugin] if the resource type " +"you need exists but Godot is unable to load its format. Choosing one way " +"over another depends on if the format is suitable or not for the final " +"exported game. For example, it's better to import [code].png[/code] textures " +"as [code].stex[/code] ([StreamTexture]) first, so they can be loaded with " +"better efficiency on the graphics card." +msgstr "" + +#: doc/classes/ResourceFormatLoader.xml +msgid "" +"If implemented, gets the dependencies of a given resource. If " +"[code]add_types[/code] is [code]true[/code], paths should be appended " +"[code]::TypeName[/code], where [code]TypeName[/code] is the class name of " +"the dependency.\n" +"[b]Note:[/b] Custom resource types defined by scripts aren't known by the " +"[ClassDB], so you might just return [code]\"Resource\"[/code] for them." +msgstr "" + +#: doc/classes/ResourceFormatLoader.xml +msgid "Gets the list of extensions for files this loader is able to read." +msgstr "" + +#: doc/classes/ResourceFormatLoader.xml +msgid "" +"Gets the class name of the resource associated with the given path. If the " +"loader cannot handle it, it should return [code]\"\"[/code].\n" +"[b]Note:[/b] Custom resource types defined by scripts aren't known by the " +"[ClassDB], so you might just return [code]\"Resource\"[/code] for them." +msgstr "" + +#: doc/classes/ResourceFormatLoader.xml +msgid "" +"Tells which resource class this loader can load.\n" +"[b]Note:[/b] Custom resource types defined by scripts aren't known by the " +"[ClassDB], so you might just handle [code]\"Resource\"[/code] for them." +msgstr "" + +#: doc/classes/ResourceFormatLoader.xml +msgid "" +"Loads a resource when the engine finds this loader to be compatible. If the " +"loaded resource is the result of an import, [code]original_path[/code] will " +"target the source file. Returns a [Resource] object on success, or an [enum " +"Error] constant in case of failure." +msgstr "" + +#: doc/classes/ResourceFormatLoader.xml +msgid "" +"If implemented, renames dependencies within the given resource and saves it. " +"[code]renames[/code] is a dictionary [code]{ String => String }[/code] " +"mapping old dependency paths to new paths.\n" +"Returns [constant OK] on success, or an [enum Error] constant in case of " +"failure." +msgstr "" + +#: doc/classes/ResourceFormatSaver.xml +msgid "Saves a specific resource type to a file." +msgstr "" + +#: doc/classes/ResourceFormatSaver.xml +msgid "" +"The engine can save resources when you do it from the editor, or when you " +"use the [ResourceSaver] singleton. This is accomplished thanks to multiple " +"[ResourceFormatSaver]s, each handling its own format and called " +"automatically by the engine.\n" +"By default, Godot saves resources as [code].tres[/code] (text-based), [code]." +"res[/code] (binary) or another built-in format, but you can choose to create " +"your own format by extending this class. Be sure to respect the documented " +"return types and values. You should give it a global class name with " +"[code]class_name[/code] for it to be registered. Like built-in " +"ResourceFormatSavers, it will be called automatically when saving resources " +"of its recognized type(s). You may also implement a [ResourceFormatLoader]." +msgstr "" + +#: doc/classes/ResourceFormatSaver.xml +msgid "" +"Returns the list of extensions available for saving the resource object, " +"provided it is recognized (see [method recognize])." +msgstr "" + +#: doc/classes/ResourceFormatSaver.xml +msgid "Returns whether the given resource object can be saved by this saver." +msgstr "" + +#: doc/classes/ResourceFormatSaver.xml +msgid "" +"Saves the given resource object to a file at the target [code]path[/code]. " +"[code]flags[/code] is a bitmask composed with [enum ResourceSaver." +"SaverFlags] constants.\n" +"Returns [constant OK] on success, or an [enum Error] constant in case of " +"failure." +msgstr "" + +#: doc/classes/ResourceImporter.xml +msgid "Base class for the implementation of core resource importers." +msgstr "" + +#: doc/classes/ResourceImporter.xml +msgid "" +"This is the base class for the resource importers implemented in core. To " +"implement your own resource importers using editor plugins, see " +"[EditorImportPlugin]." +msgstr "" + +#: doc/classes/ResourceImporter.xml +msgid "Import plugins" +msgstr "" + +#: doc/classes/ResourceImporter.xml +msgid "The default import order." +msgstr "" + +#: doc/classes/ResourceImporter.xml +msgid "" +"The import order for scenes, which ensures scenes are imported [i]after[/i] " +"all other core resources such as textures. Custom importers should generally " +"have an import order lower than [code]100[/code] to avoid issues when " +"importing scenes that rely on custom resources." +msgstr "" + +#: doc/classes/ResourceInteractiveLoader.xml +msgid "Interactive [Resource] loader." +msgstr "" + +#: doc/classes/ResourceInteractiveLoader.xml +msgid "" +"Interactive [Resource] loader. This object is returned by [ResourceLoader] " +"when performing an interactive load. It allows loading resources with high " +"granularity, which makes it mainly useful for displaying loading bars or " +"percentages." +msgstr "" + +#: doc/classes/ResourceInteractiveLoader.xml +msgid "" +"Returns the loaded resource if the load operation completed successfully, " +"[code]null[/code] otherwise." +msgstr "" + +#: doc/classes/ResourceInteractiveLoader.xml +msgid "" +"Returns the load stage. The total amount of stages can be queried with " +"[method get_stage_count]." +msgstr "" + +#: doc/classes/ResourceInteractiveLoader.xml +msgid "" +"Returns the total amount of stages (calls to [method poll]) needed to " +"completely load this resource." +msgstr "" + +#: doc/classes/ResourceInteractiveLoader.xml +msgid "" +"Polls the loading operation, i.e. loads a data chunk up to the next stage.\n" +"Returns [constant OK] if the poll is successful but the load operation has " +"not finished yet (intermediate stage). This means [method poll] will have to " +"be called again until the last stage is completed.\n" +"Returns [constant ERR_FILE_EOF] if the load operation has completed " +"successfully. The loaded resource can be obtained by calling [method " +"get_resource].\n" +"Returns another [enum Error] code if the poll has failed." +msgstr "" + +#: doc/classes/ResourceInteractiveLoader.xml +msgid "" +"Polls the loading operation successively until the resource is completely " +"loaded or a [method poll] fails.\n" +"Returns [constant ERR_FILE_EOF] if the load operation has completed " +"successfully. The loaded resource can be obtained by calling [method " +"get_resource].\n" +"Returns another [enum Error] code if a poll has failed, aborting the " +"operation." +msgstr "" + +#: doc/classes/ResourceLoader.xml +msgid "Singleton used to load resource files." +msgstr "" + +#: doc/classes/ResourceLoader.xml +msgid "" +"Singleton used to load resource files from the filesystem.\n" +"It uses the many [ResourceFormatLoader] classes registered in the engine " +"(either built-in or from a plugin) to load files into memory and convert " +"them to a format that can be used by the engine." +msgstr "" + +#: doc/classes/ResourceLoader.xml +msgid "" +"Returns whether a recognized resource exists for the given [code]path[/" +"code].\n" +"An optional [code]type_hint[/code] can be used to further specify the " +"[Resource] type that should be handled by the [ResourceFormatLoader]." +msgstr "" + +#: doc/classes/ResourceLoader.xml +msgid "" +"Returns the dependencies for the resource at the given [code]path[/code]." +msgstr "" + +#: doc/classes/ResourceLoader.xml +msgid "Returns the list of recognized extensions for a resource type." +msgstr "" + +#: doc/classes/ResourceLoader.xml +msgid "" +"[i]Deprecated method.[/i] Use [method has_cached] or [method exists] instead." +msgstr "" + +#: doc/classes/ResourceLoader.xml +msgid "" +"Returns whether a cached resource is available for the given [code]path[/" +"code].\n" +"Once a resource has been loaded by the engine, it is cached in memory for " +"faster access, and future calls to the [method load] or [method " +"load_interactive] methods will use the cached version. The cached resource " +"can be overridden by using [method Resource.take_over_path] on a new " +"resource for that same path." +msgstr "" + +#: doc/classes/ResourceLoader.xml +msgid "" +"Loads a resource at the given [code]path[/code], caching the result for " +"further access.\n" +"The registered [ResourceFormatLoader]s are queried sequentially to find the " +"first one which can handle the file's extension, and then attempt loading. " +"If loading fails, the remaining ResourceFormatLoaders are also attempted.\n" +"An optional [code]type_hint[/code] can be used to further specify the " +"[Resource] type that should be handled by the [ResourceFormatLoader]. " +"Anything that inherits from [Resource] can be used as a type hint, for " +"example [Image].\n" +"If [code]no_cache[/code] is [code]true[/code], the resource cache will be " +"bypassed and the resource will be loaded anew. Otherwise, the cached " +"resource will be returned if it exists.\n" +"Returns an empty resource if no [ResourceFormatLoader] could handle the " +"file.\n" +"GDScript has a simplified [method @GDScript.load] built-in method which can " +"be used in most situations, leaving the use of [ResourceLoader] for more " +"advanced scenarios." +msgstr "" + +#: doc/classes/ResourceLoader.xml +msgid "" +"Starts loading a resource interactively. The returned " +"[ResourceInteractiveLoader] object allows to load with high granularity, " +"calling its [method ResourceInteractiveLoader.poll] method successively to " +"load chunks.\n" +"An optional [code]type_hint[/code] can be used to further specify the " +"[Resource] type that should be handled by the [ResourceFormatLoader]. " +"Anything that inherits from [Resource] can be used as a type hint, for " +"example [Image]." +msgstr "" + +#: doc/classes/ResourceLoader.xml +msgid "" +"Changes the behavior on missing sub-resources. The default behavior is to " +"abort loading." +msgstr "" + +#: doc/classes/ResourcePreloader.xml +msgid "Resource Preloader Node." +msgstr "" + +#: doc/classes/ResourcePreloader.xml +msgid "" +"This node is used to preload sub-resources inside a scene, so when the scene " +"is loaded, all the resources are ready to use and can be retrieved from the " +"preloader.\n" +"GDScript has a simplified [method @GDScript.preload] built-in method which " +"can be used in most situations, leaving the use of [ResourcePreloader] for " +"more advanced scenarios." +msgstr "" + +#: doc/classes/ResourcePreloader.xml +msgid "" +"Adds a resource to the preloader with the given [code]name[/code]. If a " +"resource with the given [code]name[/code] already exists, the new resource " +"will be renamed to \"[code]name[/code] N\" where N is an incrementing number " +"starting from 2." +msgstr "" + +#: doc/classes/ResourcePreloader.xml +msgid "Returns the resource associated to [code]name[/code]." +msgstr "" + +#: doc/classes/ResourcePreloader.xml +msgid "Returns the list of resources inside the preloader." +msgstr "" + +#: doc/classes/ResourcePreloader.xml +msgid "" +"Returns [code]true[/code] if the preloader contains a resource associated to " +"[code]name[/code]." +msgstr "" + +#: doc/classes/ResourcePreloader.xml +msgid "" +"Removes the resource associated to [code]name[/code] from the preloader." +msgstr "" + +#: doc/classes/ResourcePreloader.xml +msgid "" +"Renames a resource inside the preloader from [code]name[/code] to " +"[code]newname[/code]." +msgstr "" + +#: doc/classes/ResourceSaver.xml +msgid "Singleton for saving Godot-specific resource types." +msgstr "" + +#: doc/classes/ResourceSaver.xml +msgid "" +"Singleton for saving Godot-specific resource types to the filesystem.\n" +"It uses the many [ResourceFormatSaver] classes registered in the engine " +"(either built-in or from a plugin) to save engine-specific resource data to " +"text-based (e.g. [code].tres[/code] or [code].tscn[/code]) or binary files " +"(e.g. [code].res[/code] or [code].scn[/code])." +msgstr "" + +#: doc/classes/ResourceSaver.xml +msgid "" +"Returns the list of extensions available for saving a resource of a given " +"type." +msgstr "" + +#: doc/classes/ResourceSaver.xml +msgid "" +"Saves a resource to disk to the given path, using a [ResourceFormatSaver] " +"that recognizes the resource object.\n" +"The [code]flags[/code] bitmask can be specified to customize the save " +"behavior.\n" +"Returns [constant OK] on success." +msgstr "" + +#: doc/classes/ResourceSaver.xml +msgid "Save the resource with a path relative to the scene which uses it." +msgstr "" + +#: doc/classes/ResourceSaver.xml +msgid "Bundles external resources." +msgstr "" + +#: doc/classes/ResourceSaver.xml +msgid "" +"Changes the [member Resource.resource_path] of the saved resource to match " +"its new location." +msgstr "" + +#: doc/classes/ResourceSaver.xml +msgid "" +"Do not save editor-specific metadata (identified by their [code]__editor[/" +"code] prefix)." +msgstr "" + +#: doc/classes/ResourceSaver.xml +msgid "Save as big endian (see [member File.endian_swap])." +msgstr "" + +#: doc/classes/ResourceSaver.xml +msgid "" +"Compress the resource on save using [constant File.COMPRESSION_ZSTD]. Only " +"available for binary resource types." +msgstr "" + +#: doc/classes/ResourceSaver.xml +msgid "" +"Take over the paths of the saved subresources (see [method Resource." +"take_over_path])." +msgstr "" + +#: doc/classes/RichTextEffect.xml +msgid "A custom effect for use with [RichTextLabel]." +msgstr "" + +#: doc/classes/RichTextEffect.xml +msgid "" +"A custom effect for use with [RichTextLabel].\n" +"[b]Note:[/b] For a [RichTextEffect] to be usable, a BBCode tag must be " +"defined as a member variable called [code]bbcode[/code] in the script.\n" +"[codeblock]\n" +"# The RichTextEffect will be usable like this: `[example]Some text[/" +"example]`\n" +"var bbcode = \"example\"\n" +"[/codeblock]\n" +"[b]Note:[/b] As soon as a [RichTextLabel] contains at least one " +"[RichTextEffect], it will continuously process the effect unless the project " +"is paused. This may impact battery life negatively." +msgstr "" + +#: doc/classes/RichTextEffect.xml +msgid "" +"Override this method to modify properties in [code]char_fx[/code]. The " +"method must return [code]true[/code] if the character could be transformed " +"successfully. If the method returns [code]false[/code], it will skip " +"transformation to avoid displaying broken text." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "Label that displays rich text." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"Rich text can contain custom text, fonts, images and some basic formatting. " +"The label manages these as an internal tag stack. It also adapts itself to " +"given width/heights.\n" +"[b]Note:[/b] Assignments to [member bbcode_text] clear the tag stack and " +"reconstruct it from the property's contents. Any edits made to [member " +"bbcode_text] will erase previous edits made from other manual sources such " +"as [method append_bbcode] and the [code]push_*[/code] / [method pop] " +"methods.\n" +"[b]Note:[/b] RichTextLabel doesn't support entangled BBCode tags. For " +"example, instead of using [code][b]bold[i]bold italic[/b]italic[/i][/code], " +"use [code][b]bold[i]bold italic[/i][/b][i]italic[/i][/code].\n" +"[b]Note:[/b] [code]push_*/pop[/code] functions won't affect BBCode.\n" +"[b]Note:[/b] Unlike [Label], RichTextLabel doesn't have a [i]property[/i] to " +"horizontally align text to the center. Instead, enable [member " +"bbcode_enabled] and surround the text in a [code][center][/code] tag as " +"follows: [code][center]Example[/center][/code]. There is currently no built-" +"in way to vertically align text either, but this can be emulated by relying " +"on anchors/containers and the [member fit_content_height] property.\n" +"[b]Note:[/b] Unicode characters after [code]0xffff[/code] (such as most " +"emoji) are [i]not[/i] supported on Windows. They will display as unknown " +"characters instead. This will be resolved in Godot 4.0." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "BBCode in RichTextLabel" +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "GUI Rich Text/BBcode Demo" +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"Adds an image's opening and closing tags to the tag stack, optionally " +"providing a [code]width[/code] and [code]height[/code] to resize the image.\n" +"If [code]width[/code] or [code]height[/code] is set to 0, the image size " +"will be adjusted in order to keep the original aspect ratio." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "Adds raw non-BBCode-parsed text to the tag stack." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"Parses [code]bbcode[/code] and adds tags to the tag stack as needed.\n" +"[b]Note:[/b] Using this method, you can't close a tag that was opened in a " +"previous [method append_bbcode] call. This is done to improve performance, " +"especially when updating large RichTextLabels since rebuilding the whole " +"BBCode every time would be slower. If you absolutely need to close a tag in " +"a future method call, append the [member bbcode_text] instead of using " +"[method append_bbcode].\n" +"[b]Note:[/b] This method internals' can't possibly fail, but an error code " +"is returned for backwards compatibility, which will always be [constant OK]." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "Clears the tag stack and sets [member bbcode_text] to an empty string." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "Returns the height of the content." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"Returns the total number of newlines in the tag stack's text tags. Considers " +"wrapped text as one line." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "Returns the current selection text. Does not include BBCodes." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"Returns the total number of characters from text tags. Does not include " +"BBCodes." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "Returns the number of visible lines." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"Installs a custom effect. [code]effect[/code] should be a valid " +"[RichTextEffect]." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "Adds a newline tag to the tag stack." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"The assignment version of [method append_bbcode]. Clears the tag stack and " +"inserts the new content.\n" +"[b]Note:[/b] This method internals' can't possibly fail, but an error code " +"is returned for backwards compatibility, which will always be [constant OK]." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "Parses BBCode parameter [code]expressions[/code] into a dictionary." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"Terminates the current tag. Use after [code]push_*[/code] methods to close " +"BBCodes manually. Does not need to follow [code]add_*[/code] methods." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"Adds an [code][align][/code] tag based on the given [code]align[/code] " +"value. See [enum Align] for possible values." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"Adds a [code][font][/code] tag with a bold font to the tag stack. This is " +"the same as adding a [code][b][/code] tag if not currently in a [code][i][/" +"code] tag." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"Adds a [code][font][/code] tag with a bold italics font to the tag stack." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"Adds a [code][cell][/code] tag to the tag stack. Must be inside a [code]" +"[table][/code] tag. See [method push_table] for details." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "Adds a [code][color][/code] tag to the tag stack." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"Adds a [code][font][/code] tag to the tag stack. Overrides default fonts for " +"its duration." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"Adds an [code][indent][/code] tag to the tag stack. Multiplies [code]level[/" +"code] by current [member tab_size] to determine new margin length." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"Adds a [code][font][/code] tag with a italics font to the tag stack. This is " +"the same as adding a [code][i][/code] tag if not currently in a [code][b][/" +"code] tag." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"Adds a [code][list][/code] tag to the tag stack. Similar to the BBCodes " +"[code][ol][/code] or [code][ul][/code], but supports more list types. Not " +"fully implemented!" +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"Adds a [code][meta][/code] tag to the tag stack. Similar to the BBCode [code]" +"[url=something]{text}[/url][/code], but supports non-[String] metadata types." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "Adds a [code][font][/code] tag with a monospace font to the tag stack." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "Adds a [code][font][/code] tag with a normal font to the tag stack." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "Adds a [code][s][/code] tag to the tag stack." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "Adds a [code][table=columns][/code] tag to the tag stack." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "Adds a [code][u][/code] tag to the tag stack." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"Removes a line of content from the label. Returns [code]true[/code] if the " +"line exists.\n" +"The [code]line[/code] argument is the index of the line to remove, it can " +"take values in the interval [code][0, get_line_count() - 1][/code]." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "Scrolls the window's top line to match [code]line[/code]." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"Edits the selected column's expansion options. If [code]expand[/code] is " +"[code]true[/code], the column expands in proportion to its expansion ratio " +"versus the other columns' ratios.\n" +"For example, 2 columns with ratios 3 and 4 plus 70 pixels in available width " +"would expand 30 and 40 pixels, respectively.\n" +"If [code]expand[/code] is [code]false[/code], the column will not contribute " +"to the total ratio." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"If [code]true[/code], the label uses BBCode formatting.\n" +"[b]Note:[/b] Trying to alter the [RichTextLabel]'s text with [method " +"add_text] will reset this to [code]false[/code]. Use instead [method " +"append_bbcode] to preserve BBCode formatting." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"The label's text in BBCode format. Is not representative of manual " +"modifications to the internal tag stack. Erases changes made by other " +"methods when edited.\n" +"[b]Note:[/b] It is unadvised to use the [code]+=[/code] operator with " +"[code]bbcode_text[/code] (e.g. [code]bbcode_text += \"some string\"[/code]) " +"as it replaces the whole text and can cause slowdowns. It will also erase " +"all BBCode that was added to stack using [code]push_*[/code] methods. Use " +"[method append_bbcode] for adding text instead, unless you absolutely need " +"to close a tag that was opened in an earlier method call." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"The currently installed custom effects. This is an array of " +"[RichTextEffect]s.\n" +"To add a custom effect, it's more convenient to use [method install_effect]." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"If [code]true[/code], the label's height will be automatically updated to " +"fit its content.\n" +"[b]Note:[/b] This property is used as a workaround to fix issues with " +"[RichTextLabel] in [Container]s, but it's unreliable in some cases and will " +"be removed in future versions." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"If [code]true[/code], the label underlines meta tags such as [code][url]" +"{text}[/url][/code]." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "If [code]true[/code], the label uses the custom font color." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"The range of characters to display, as a [float] between 0.0 and 1.0. When " +"assigned an out of range value, it's the same as assigning 1.0.\n" +"[b]Note:[/b] Setting this property updates [member visible_characters] based " +"on current [method get_total_character_count]." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"If [code]true[/code], the scrollbar is visible. Setting this to [code]false[/" +"code] does not block scrolling completely. See [method scroll_to_line]." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"If [code]true[/code], the window scrolls down to display new content " +"automatically." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "If [code]true[/code], the label allows text selection." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"The number of spaces associated with a single tab length. Does not affect " +"[code]\\t[/code] in text tags, only indent tags." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"The raw text of the label.\n" +"When set, clears the tag stack and adds a raw text tag to the top of it. " +"Does not parse BBCodes. Does not modify [member bbcode_text]." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"The restricted number of characters to display in the label. If [code]-1[/" +"code], all characters will be displayed.\n" +"[b]Note:[/b] Setting this property updates [member percent_visible] based on " +"current [method get_total_character_count]." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"Triggered when the user clicks on content between meta tags. If the meta is " +"defined in text, e.g. [code][url={\"data\"=\"hi\"}]hi[/url][/code], then the " +"parameter for this signal will be a [String] type. If a particular type or " +"an object is desired, the [method push_meta] method must be used to manually " +"insert the data into the tag stack." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "Triggers when the mouse exits a meta tag." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "Triggers when the mouse enters a meta tag." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "Makes text left aligned." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "Makes text centered." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "Makes text right aligned." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "Makes text fill width." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "Aligns top of the inline image to the top of the text." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "Aligns center of the inline image to the center of the text." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "Aligns bottom of the inline image to the baseline of the text." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "Aligns bottom of the inline image to the bottom of the text." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "Each list item has a number marker." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "Each list item has a letter marker." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "Each list item has a filled circle marker." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "The default text color." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"The color of selected text, used when [member selection_enabled] is " +"[code]true[/code]." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "The color of the font's shadow." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "The color of the selection box." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "The vertical space between lines." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "" +"Boolean value. If 1 ([code]true[/code]), the shadow will be displayed around " +"the whole text as an outline." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "The horizontal offset of the font's shadow." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "The vertical offset of the font's shadow." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "The horizontal separation of elements in a table." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "The vertical separation of elements in a table." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "The font used for bold text." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "The font used for bold italics text." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "The font used for italics text." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "The font used for monospace text." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "The default text font." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "The background used when the [RichTextLabel] is focused." +msgstr "" + +#: doc/classes/RichTextLabel.xml +msgid "The normal background for the [RichTextLabel]." +msgstr "" + +#: doc/classes/RID.xml +msgid "Handle for a [Resource]'s unique ID." +msgstr "" + +#: doc/classes/RID.xml +msgid "" +"The RID type is used to access the unique integer ID of a resource. They are " +"opaque, which means they do not grant access to the associated resource by " +"themselves. They are used by and with the low-level Server classes such as " +"[VisualServer]." +msgstr "" + +#: doc/classes/RID.xml +msgid "" +"Creates a new RID instance with the ID of a given resource. When not handed " +"a valid resource, silently stores the unused ID 0." +msgstr "" + +#: doc/classes/RID.xml +msgid "Returns the ID of the referenced resource." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "" +"Physics Body whose position is determined through physics simulation in 3D " +"space." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "" +"This is the node that implements full 3D physics. This means that you do not " +"control a RigidBody directly. Instead, you can apply forces to it (gravity, " +"impulses, etc.), and the physics simulation will calculate the resulting " +"movement, collision, bouncing, rotating, etc.\n" +"A RigidBody has 4 behavior [member mode]s: Rigid, Static, Character, and " +"Kinematic.\n" +"[b]Note:[/b] Don't change a RigidBody's position every frame or very often. " +"Sporadic changes work fine, but physics runs at a different granularity " +"(fixed Hz) than usual rendering (process callback) and maybe even in a " +"separate thread, so changing this from a process loop may result in strange " +"behavior. If you need to directly affect the body's state, use [method " +"_integrate_forces], which allows you to directly access the physics state.\n" +"If you need to override the default physics behavior, you can write a custom " +"force integration function. See [member custom_integrator].\n" +"With Bullet physics (the default), the center of mass is the RigidBody3D " +"center. With GodotPhysics, the center of mass is the average of the " +"[CollisionShape] centers." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "" +"Called during physics processing, allowing you to read and safely modify the " +"simulation state for the object. By default, it works in addition to the " +"usual physics behavior, but the [member custom_integrator] property allows " +"you to disable the default behavior and do fully custom force integration " +"for a body." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "" +"Adds a constant directional force (i.e. acceleration) without affecting " +"rotation.\n" +"This is equivalent to [code]add_force(force, Vector3(0,0,0))[/code]." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "" +"Adds a constant directional force (i.e. acceleration).\n" +"The position uses the rotation of the global coordinate system, but is " +"centered at the object's origin." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "" +"Adds a constant rotational force (i.e. a motor) without affecting position." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "" +"Applies a directional impulse without affecting rotation.\n" +"This is equivalent to [code]apply_impulse(Vector3(0,0,0), impulse)[/code]." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "" +"Applies a positioned impulse to the body. An impulse is time independent! " +"Applying an impulse every frame would result in a framerate-dependent force. " +"For this reason it should only be used when simulating one-time impacts. The " +"position uses the rotation of the global coordinate system, but is centered " +"at the object's origin." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "" +"Applies a torque impulse which will be affected by the body mass and shape. " +"This will rotate the body around the [code]impulse[/code] vector passed." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "" +"Returns [code]true[/code] if the specified linear or rotational axis is " +"locked." +msgstr "" + +#: doc/classes/RigidBody.xml doc/classes/RigidBody2D.xml +msgid "" +"Returns a list of the bodies colliding with this one. Requires [member " +"contact_monitor] to be set to [code]true[/code] and [member " +"contacts_reported] to be set high enough to detect all the collisions.\n" +"[b]Note:[/b] The result of this test is not immediate after moving objects. " +"For performance, list of collisions is updated once per frame and before the " +"physics step. Consider using signals instead." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "" +"Returns the inverse inertia tensor basis. This is used to calculate the " +"angular acceleration resulting from a torque applied to the RigidBody." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "Locks the specified linear or rotational axis." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "" +"Damps the body's rotational forces. If this value is different from -1.0 it " +"will be added to any angular damp derived from the world or areas.\n" +"See [member ProjectSettings.physics/3d/default_angular_damp] for more " +"details about damping." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "Lock the body's rotation in the X axis." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "Lock the body's rotation in the Y axis." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "Lock the body's rotation in the Z axis." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "Lock the body's movement in the X axis." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "Lock the body's movement in the Y axis." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "Lock the body's movement in the Z axis." +msgstr "" + +#: doc/classes/RigidBody.xml doc/classes/RigidBody2D.xml +#: doc/classes/StaticBody.xml doc/classes/StaticBody2D.xml +msgid "" +"The body's bounciness. Values range from [code]0[/code] (no bounce) to " +"[code]1[/code] (full bounciness).\n" +"Deprecated, use [member PhysicsMaterial.bounce] instead via [member " +"physics_material_override]." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "" +"If [code]true[/code], the body can enter sleep mode when there is no " +"movement. See [member sleeping].\n" +"[b]Note:[/b] A RigidBody3D will never enter sleep mode automatically if its " +"[member mode] is [constant MODE_CHARACTER]. It can still be put to sleep " +"manually by setting its [member sleeping] property to [code]true[/code]." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "" +"If [code]true[/code], the RigidBody will emit signals when it collides with " +"another RigidBody. See also [member contacts_reported]." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "" +"The maximum number of contacts that will be recorded. Requires [member " +"contact_monitor] to be set to [code]true[/code].\n" +"[b]Note:[/b] The number of contacts is different from the number of " +"collisions. Collisions between parallel edges will result in two contacts " +"(one at each end), and collisions between parallel faces will result in four " +"contacts (one at each corner)." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "" +"If [code]true[/code], continuous collision detection is used.\n" +"Continuous collision detection tries to predict where a moving body will " +"collide, instead of moving it and correcting its movement if it collided. " +"Continuous collision detection is more precise, and misses fewer impacts by " +"small, fast-moving objects. Not using continuous collision detection is " +"faster to compute, but can miss small, fast-moving objects." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "" +"If [code]true[/code], internal force integration will be disabled (like " +"gravity or air friction) for this body. Other than collision response, the " +"body will only move as determined by the [method _integrate_forces] " +"function, if defined." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "" +"The body's friction, from 0 (frictionless) to 1 (max friction).\n" +"Deprecated, use [member PhysicsMaterial.friction] instead via [member " +"physics_material_override]." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "" +"This is multiplied by the global 3D gravity setting found in [b]Project > " +"Project Settings > Physics > 3d[/b] to produce RigidBody's gravity. For " +"example, a value of 1 will be normal gravity, 2 will apply double gravity, " +"and 0.5 will apply half gravity to this object." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "" +"The body's linear damp. Cannot be less than -1.0. If this value is different " +"from -1.0 it will be added to any linear damp derived from the world or " +"areas.\n" +"See [member ProjectSettings.physics/3d/default_linear_damp] for more details " +"about damping." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "" +"The body's linear velocity in units per second. Can be used sporadically, " +"but [b]don't set this every frame[/b], because physics may run in another " +"thread and runs at a different granularity. Use [method _integrate_forces] " +"as your process loop for precise control of the body state." +msgstr "" + +#: doc/classes/RigidBody.xml doc/classes/RigidBody2D.xml +msgid "The body's mass." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "The body mode. See [enum Mode] for possible values." +msgstr "" + +#: doc/classes/RigidBody.xml doc/classes/RigidBody2D.xml +#: doc/classes/StaticBody.xml doc/classes/StaticBody2D.xml +msgid "" +"The physics material override for the body.\n" +"If a material is assigned to this property, it will be used instead of any " +"other physics material, such as an inherited one." +msgstr "" + +#: doc/classes/RigidBody.xml doc/classes/RigidBody2D.xml +msgid "" +"If [code]true[/code], the body will not move and will not calculate forces " +"until woken up by another body through, for example, a collision, or by " +"using the [method apply_impulse] or [method add_force] methods." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "" +"The body's weight based on its mass and the global 3D gravity. Global values " +"are set in [b]Project > Project Settings > Physics > 3d[/b]." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "" +"Emitted when a collision with another [PhysicsBody] or [GridMap] occurs. " +"Requires [member contact_monitor] to be set to [code]true[/code] and [member " +"contacts_reported] to be set high enough to detect all the collisions. " +"[GridMap]s are detected if the [MeshLibrary] has Collision [Shape]s.\n" +"[code]body[/code] the [Node], if it exists in the tree, of the other " +"[PhysicsBody] or [GridMap]." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "" +"Emitted when the collision with another [PhysicsBody] or [GridMap] ends. " +"Requires [member contact_monitor] to be set to [code]true[/code] and [member " +"contacts_reported] to be set high enough to detect all the collisions. " +"[GridMap]s are detected if the [MeshLibrary] has Collision [Shape]s.\n" +"[code]body[/code] the [Node], if it exists in the tree, of the other " +"[PhysicsBody] or [GridMap]." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "" +"Emitted when one of this RigidBody's [Shape]s collides with another " +"[PhysicsBody] or [GridMap]'s [Shape]s. Requires [member contact_monitor] to " +"be set to [code]true[/code] and [member contacts_reported] to be set high " +"enough to detect all the collisions. [GridMap]s are detected if the " +"[MeshLibrary] has Collision [Shape]s.\n" +"[code]body_rid[/code] the [RID] of the other [PhysicsBody] or " +"[MeshLibrary]'s [CollisionObject] used by the [PhysicsServer].\n" +"[code]body[/code] the [Node], if it exists in the tree, of the other " +"[PhysicsBody] or [GridMap].\n" +"[code]body_shape_index[/code] the index of the [Shape] of the other " +"[PhysicsBody] or [GridMap] used by the [PhysicsServer]. Get the " +"[CollisionShape] node with [code]body.shape_owner_get_owner(body_shape_index)" +"[/code].\n" +"[code]local_shape_index[/code] the index of the [Shape] of this RigidBody " +"used by the [PhysicsServer]. Get the [CollisionShape] node with [code]self." +"shape_owner_get_owner(local_shape_index)[/code].\n" +"[b]Note:[/b] Bullet physics cannot identify the shape index when using a " +"[ConcavePolygonShape]. Don't use multiple [CollisionShape]s when using a " +"[ConcavePolygonShape] with Bullet physics if you need shape indices." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "" +"Emitted when the collision between one of this RigidBody's [Shape]s and " +"another [PhysicsBody] or [GridMap]'s [Shape]s ends. Requires [member " +"contact_monitor] to be set to [code]true[/code] and [member " +"contacts_reported] to be set high enough to detect all the collisions. " +"[GridMap]s are detected if the [MeshLibrary] has Collision [Shape]s.\n" +"[code]body_rid[/code] the [RID] of the other [PhysicsBody] or " +"[MeshLibrary]'s [CollisionObject] used by the [PhysicsServer]. [GridMap]s " +"are detected if the Meshes have [Shape]s.\n" +"[code]body[/code] the [Node], if it exists in the tree, of the other " +"[PhysicsBody] or [GridMap].\n" +"[code]body_shape_index[/code] the index of the [Shape] of the other " +"[PhysicsBody] or [GridMap] used by the [PhysicsServer]. Get the " +"[CollisionShape] node with [code]body.shape_owner_get_owner(body_shape_index)" +"[/code].\n" +"[code]local_shape_index[/code] the index of the [Shape] of this RigidBody " +"used by the [PhysicsServer]. Get the [CollisionShape] node with [code]self." +"shape_owner_get_owner(local_shape_index)[/code].\n" +"[b]Note:[/b] Bullet physics cannot identify the shape index when using a " +"[ConcavePolygonShape]. Don't use multiple [CollisionShape]s when using a " +"[ConcavePolygonShape] with Bullet physics if you need shape indices." +msgstr "" + +#: doc/classes/RigidBody.xml doc/classes/RigidBody2D.xml +msgid "" +"Emitted when the physics engine changes the body's sleeping state.\n" +"[b]Note:[/b] Changing the value [member sleeping] will not trigger this " +"signal. It is only emitted if the sleeping state is changed by the physics " +"engine or [code]emit_signal(\"sleeping_state_changed\")[/code] is used." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "" +"Rigid body mode. This is the \"natural\" state of a rigid body. It is " +"affected by forces, and can move, rotate, and be affected by user code." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "" +"Static mode. The body behaves like a [StaticBody], and can only move by user " +"code." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "" +"Character body mode. This behaves like a rigid body, but can not rotate." +msgstr "" + +#: doc/classes/RigidBody.xml +msgid "" +"Kinematic body mode. The body behaves like a [KinematicBody], and can only " +"move by user code." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "A body that is controlled by the 2D physics engine." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "" +"This node implements simulated 2D physics. You do not control a RigidBody2D " +"directly. Instead, you apply forces to it (gravity, impulses, etc.) and the " +"physics simulation calculates the resulting movement based on its mass, " +"friction, and other physical properties.\n" +"A RigidBody2D has 4 behavior [member mode]s: Rigid, Static, Character, and " +"Kinematic.\n" +"[b]Note:[/b] You should not change a RigidBody2D's [code]position[/code] or " +"[code]linear_velocity[/code] every frame or even very often. If you need to " +"directly affect the body's state, use [method _integrate_forces], which " +"allows you to directly access the physics state.\n" +"Please also keep in mind that physics bodies manage their own transform " +"which overwrites the ones you set. So any direct or indirect transformation " +"(including scaling of the node or its parent) will be visible in the editor " +"only, and immediately reset at runtime.\n" +"If you need to override the default physics behavior or add a transformation " +"at runtime, you can write a custom force integration. See [member " +"custom_integrator].\n" +"The center of mass is always located at the node's origin without taking " +"into account the [CollisionShape2D] centroid offsets." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "2D Physics Platformer Demo" +msgstr "" + +#: doc/classes/RigidBody2D.xml doc/classes/Sprite.xml +msgid "Instancing Demo" +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "" +"Allows you to read and safely modify the simulation state for the object. " +"Use this instead of [method Node._physics_process] if you need to directly " +"change the body's [code]position[/code] or other physics properties. By " +"default, it works in addition to the usual physics behavior, but [member " +"custom_integrator] allows you to disable the default behavior and write " +"custom force integration for a body." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "" +"Applies a positioned impulse to the body. An impulse is time-independent! " +"Applying an impulse every frame would result in a framerate-dependent force. " +"For this reason it should only be used when simulating one-time impacts (use " +"the \"_force\" functions otherwise). The position uses the rotation of the " +"global coordinate system, but is centered at the object's origin." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "" +"Sets the body's velocity on the given axis. The velocity in the given vector " +"axis will be set as the given vector length. This is useful for jumping " +"behavior." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "" +"Returns [code]true[/code] if a collision would result from moving in the " +"given vector. [code]margin[/code] increases the size of the shapes involved " +"in the collision detection, and [code]result[/code] is an object of type " +"[Physics2DTestMotionResult], which contains additional information about the " +"collision (should there be one)." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "" +"Damps the body's [member angular_velocity]. If [code]-1[/code], the body " +"will use the [b]Default Angular Damp[/b] defined in [b]Project > Project " +"Settings > Physics > 2d[/b]. If greater than [code]-1[/code] it will be " +"added to the default project value.\n" +"See [member ProjectSettings.physics/2d/default_angular_damp] for more " +"details about damping." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "The body's total applied force." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "The body's total applied torque." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "" +"If [code]true[/code], the body can enter sleep mode when there is no " +"movement. See [member sleeping].\n" +"[b]Note:[/b] A RigidBody2D will never enter sleep mode automatically if its " +"[member mode] is [constant MODE_CHARACTER]. It can still be put to sleep " +"manually by setting its [member sleeping] property to [code]true[/code]." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "" +"If [code]true[/code], the body will emit signals when it collides with " +"another RigidBody2D. See also [member contacts_reported]." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "" +"The maximum number of contacts that will be recorded. Requires [member " +"contact_monitor] to be set to [code]true[/code].\n" +"[b]Note:[/b] The number of contacts is different from the number of " +"collisions. Collisions between parallel edges will result in two contacts " +"(one at each end)." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "" +"Continuous collision detection mode.\n" +"Continuous collision detection tries to predict where a moving body will " +"collide instead of moving it and correcting its movement after collision. " +"Continuous collision detection is slower, but more precise and misses fewer " +"collisions with small, fast-moving objects. Raycasting and shapecasting " +"methods are available. See [enum CCDMode] for details." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "" +"If [code]true[/code], internal force integration is disabled for this body. " +"Aside from collision response, the body will only move as determined by the " +"[method _integrate_forces] function." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "" +"The body's friction. Values range from [code]0[/code] (frictionless) to " +"[code]1[/code] (maximum friction).\n" +"Deprecated, use [member PhysicsMaterial.friction] instead via [member " +"physics_material_override]." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "" +"Multiplies the gravity applied to the body. The body's gravity is calculated " +"from the [b]Default Gravity[/b] value in [b]Project > Project Settings > " +"Physics > 2d[/b] and/or any additional gravity vector applied by [Area2D]s." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "" +"The body's moment of inertia. This is like mass, but for rotation: it " +"determines how much torque it takes to rotate the body. The moment of " +"inertia is usually computed automatically from the mass and the shapes, but " +"this function allows you to set a custom value. Set 0 inertia to return to " +"automatically computing it." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "" +"Damps the body's [member linear_velocity]. If [code]-1[/code], the body will " +"use the [b]Default Linear Damp[/b] in [b]Project > Project Settings > " +"Physics > 2d[/b]. If greater than [code]-1[/code] it will be added to the " +"default project value.\n" +"See [member ProjectSettings.physics/2d/default_linear_damp] for more details " +"about damping." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "" +"The body's linear velocity in pixels per second. Can be used sporadically, " +"but [b]don't set this every frame[/b], because physics may run in another " +"thread and runs at a different granularity. Use [method _integrate_forces] " +"as your process loop for precise control of the body state." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "The body's mode. See [enum Mode] for possible values." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "" +"The body's weight based on its mass and the [b]Default Gravity[/b] value in " +"[b]Project > Project Settings > Physics > 2d[/b]." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "" +"Emitted when a collision with another [PhysicsBody2D] or [TileMap] occurs. " +"Requires [member contact_monitor] to be set to [code]true[/code] and [member " +"contacts_reported] to be set high enough to detect all the collisions. " +"[TileMap]s are detected if the [TileSet] has Collision [Shape2D]s.\n" +"[code]body[/code] the [Node], if it exists in the tree, of the other " +"[PhysicsBody2D] or [TileMap]." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "" +"Emitted when the collision with another [PhysicsBody2D] or [TileMap] ends. " +"Requires [member contact_monitor] to be set to [code]true[/code] and [member " +"contacts_reported] to be set high enough to detect all the collisions. " +"[TileMap]s are detected if the [TileSet] has Collision [Shape2D]s.\n" +"[code]body[/code] the [Node], if it exists in the tree, of the other " +"[PhysicsBody2D] or [TileMap]." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "" +"Emitted when one of this RigidBody2D's [Shape2D]s collides with another " +"[PhysicsBody2D] or [TileMap]'s [Shape2D]s. Requires [member contact_monitor] " +"to be set to [code]true[/code] and [member contacts_reported] to be set high " +"enough to detect all the collisions. [TileMap]s are detected if the " +"[TileSet] has Collision [Shape2D]s.\n" +"[code]body_rid[/code] the [RID] of the other [PhysicsBody2D] or [TileSet]'s " +"[CollisionObject2D] used by the [Physics2DServer].\n" +"[code]body[/code] the [Node], if it exists in the tree, of the other " +"[PhysicsBody2D] or [TileMap].\n" +"[code]body_shape_index[/code] the index of the [Shape2D] of the other " +"[PhysicsBody2D] or [TileMap] used by the [Physics2DServer]. Get the " +"[CollisionShape2D] node with [code]body." +"shape_owner_get_owner(body_shape_index)[/code].\n" +"[code]local_shape_index[/code] the index of the [Shape2D] of this " +"RigidBody2D used by the [Physics2DServer]. Get the [CollisionShape2D] node " +"with [code]self.shape_owner_get_owner(local_shape_index)[/code]." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "" +"Emitted when the collision between one of this RigidBody2D's [Shape2D]s and " +"another [PhysicsBody2D] or [TileMap]'s [Shape2D]s ends. Requires [member " +"contact_monitor] to be set to [code]true[/code] and [member " +"contacts_reported] to be set high enough to detect all the collisions. " +"[TileMap]s are detected if the [TileSet] has Collision [Shape2D]s.\n" +"[code]body_rid[/code] the [RID] of the other [PhysicsBody2D] or [TileSet]'s " +"[CollisionObject2D] used by the [Physics2DServer].\n" +"[code]body[/code] the [Node], if it exists in the tree, of the other " +"[PhysicsBody2D] or [TileMap].\n" +"[code]body_shape_index[/code] the index of the [Shape2D] of the other " +"[PhysicsBody2D] or [TileMap] used by the [Physics2DServer]. Get the " +"[CollisionShape2D] node with [code]body." +"shape_owner_get_owner(body_shape_index)[/code].\n" +"[code]local_shape_index[/code] the index of the [Shape2D] of this " +"RigidBody2D used by the [Physics2DServer]. Get the [CollisionShape2D] node " +"with [code]self.shape_owner_get_owner(local_shape_index)[/code]." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "" +"Rigid mode. The body behaves as a physical object. It collides with other " +"bodies and responds to forces applied to it. This is the default mode." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "Static mode. The body behaves like a [StaticBody2D] and does not move." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "" +"Character mode. Similar to [constant MODE_RIGID], but the body can not " +"rotate." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "" +"Kinematic mode. The body behaves like a [KinematicBody2D], and must be moved " +"by code." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "" +"Continuous collision detection disabled. This is the fastest way to detect " +"body collisions, but can miss small, fast-moving objects." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "" +"Continuous collision detection enabled using raycasting. This is faster than " +"shapecasting but less precise." +msgstr "" + +#: doc/classes/RigidBody2D.xml +msgid "" +"Continuous collision detection enabled using shapecasting. This is the " +"slowest CCD method and the most precise." +msgstr "" + +#: doc/classes/Room.xml +msgid "Room node, used to group objects together locally for [Portal] culling." +msgstr "" + +#: doc/classes/Room.xml +msgid "" +"The [Portal] culling system requires levels to be built using objects " +"grouped together by location in areas called [Room]s. In many cases these " +"will correspond to actual rooms in buildings, but not necessarily (a canyon " +"area may be treated as a room).\n" +"Any [VisualInstance] that is a child or grandchild of a [Room] will be " +"assigned to that room, if the [code]portal_mode[/code] of that " +"[VisualInstance] is set to [code]STATIC[/code] (does not move) or " +"[code]DYNAMIC[/code] (moves only within the room).\n" +"Internally the room boundary must form a [b]convex hull[/b], and by default " +"this is determined automatically by the geometry of the objects you place " +"within the room.\n" +"You can alternatively precisely specify a [b]manual bound[/b]. If you place " +"a [MeshInstance] with a name prefixed by [code]Bound_[/code], it will turn " +"off the bound generation from geometry, and instead use the vertices of this " +"MeshInstance to directly calculate a convex hull during the conversion stage " +"(see [RoomManager]).\n" +"In order to see from one room into an adjacent room, [Portal]s must be " +"placed over non-occluded openings between rooms. These will often be placed " +"over doors and windows." +msgstr "" + +#: doc/classes/Room.xml +msgid "" +"If [code]points[/code] are set, the [Room] bounding convex hull will be " +"built from these points. If no points are set, the room bound will either be " +"derived from a manual bound ([MeshInstance] with name prefix [code]Bound_[/" +"code]), or from the geometry within the room.\n" +"Note that you can use the [code]Generate Points[/code] editor button to get " +"started. This will use either the geometry or manual bound to generate the " +"room hull, and save the resulting points, allowing you to edit them to " +"further refine the bound." +msgstr "" + +#: doc/classes/Room.xml +msgid "" +"The [code]simplify[/code] value determines to what degree room hulls " +"(bounds) are simplified, by removing similar planes. A value of 0 gives no " +"simplification, 1 gives maximum simplification." +msgstr "" + +#: doc/classes/Room.xml +msgid "" +"The room hull simplification can either use the default value set in the " +"[RoomManager], or override this and use the per room setting." +msgstr "" + +#: doc/classes/RoomGroup.xml +msgid "Groups [Room]s together to allow common functionality." +msgstr "" + +#: doc/classes/RoomGroup.xml +msgid "" +"Although [Room] behavior can be specified individually, sometimes it is " +"faster and more convenient to write functionality for a group of rooms.\n" +"[RoomGroup]s should be placed as children of the [b]room list[/b] (the " +"parent [Node] of your [Room]s), and [Room]s should be placed in turn as " +"children of a [RoomGroup] in order to assign them to the RoomGroup.\n" +"A [RoomGroup] can for example be used to specify [Room]s that are " +"[b]outside[/b], and switch on or off a directional light, sky, or rain " +"effect as the player enters / exits the area.\n" +"[RoomGroup]s receive [b]gameplay callbacks[/b] when the " +"[code]gameplay_monitor[/code] is switched on, as [code]signal[/code]s or " +"[code]notification[/code]s as they enter and exit the [b]gameplay area[/b] " +"(see [RoomManager] for details)." +msgstr "" + +#: doc/classes/RoomGroup.xml +msgid "" +"This priority will be applied to [Room]s within the group. The [Room] " +"priority allows the use of [b]internal rooms[/b], rooms [i]within[/i] " +"another room or rooms.\n" +"When the [Camera] is within more than one room (regular and internal), the " +"higher priority room will take precedence. So with for example, a house " +"inside a terrain 'room', you would make the house higher priority, so that " +"when the camera is within the house, the house is used as the source room, " +"but outside the house, the terrain room would be used instead." +msgstr "" + +#: doc/classes/RoomManager.xml +msgid "The RoomManager node is used to control the portal culling system." +msgstr "" + +#: doc/classes/RoomManager.xml +msgid "" +"In order to utilize the portal occlusion culling system, you must build your " +"level using [Room]s and [Portal]s. Before these can be used at runtime, they " +"must undergo a short conversion process to build the [code]room graph[/" +"code], runtime data needed for portal culling. The [code]room graph[/code] " +"is controlled by the [RoomManager] node, and the [RoomManager] also contains " +"settings that are common throughout the portal system." +msgstr "" + +#: doc/classes/RoomManager.xml +msgid "" +"This function clears all converted data from the [b]room graph[/b]. Use this " +"before unloading a level, when transitioning from level to level, or " +"returning to a main menu." +msgstr "" + +#: doc/classes/RoomManager.xml +msgid "" +"This is the most important function in the whole portal culling system. " +"Without it, the system cannot function.\n" +"First it goes through every [Room] that is a child of the [code]room list[/" +"code] node (and [RoomGroup]s within) and converts and adds it to the " +"[code]room graph[/code].\n" +"This works for both [Room] nodes, and [Spatial] nodes that follow a special " +"naming convention. They should begin with the prefix [i]'Room_'[/i], " +"followed by the name you wish to give the room, e.g. [i]'Room_lounge'[/i]. " +"This will automatically convert such [Spatial]s to [Room] nodes for you. " +"This is useful if you want to build you entire room system in e.g. Blender, " +"and reimport multiple times as you work on the level.\n" +"The conversion will try to assign [VisualInstance]s that are children and " +"grandchildren of the [Room] to the room. These should be given a suitable " +"[code]portal mode[/code] (see the [CullInstance] documentation). The default " +"[code]portal mode[/code] is [code]STATIC[/code] - objects which are not " +"expected to move while the level is played, which will typically be most " +"objects.\n" +"The conversion will usually use the geometry of these [VisualInstance]s (and " +"the [Portal]s) to calculate a convex hull bound for the room. These bounds " +"will be shown in the editor with a wireframe. Alternatively you can specify " +"a manual custom bound for any room, see the [Room] documentation.\n" +"By definition, [Camera]s within a room can see everything else within the " +"room (that is one advantage to using convex hulls). However, in order to see " +"from one room into adjacent rooms, you must place [Portal]s, which represent " +"openings that the camera can see through, like windows and doors.\n" +"[Portal]s are really just specialized [MeshInstance]s. In fact you will " +"usually first create a portal by creating a [MeshInstance], especially a " +"[code]plane[/code] mesh instance. You would move the plane in the editor to " +"cover a window or doorway, with the front face pointing outward from the " +"room. To let the conversion process know you want this mesh to be a portal, " +"again we use a special naming convention. [MeshInstance]s to be converted to " +"a [Portal] should start with the prefix [i]'Portal_'[/i].\n" +"You now have a choice - you can leave the name as [i]'Portal_'[/i] and allow " +"the system to automatically detect the nearest [Room] to link. In most cases " +"this will work fine.\n" +"An alternative method is to specify the [Room] to link to manually, " +"appending a suffix to the portal name, which should be the name of the room " +"you intend to link to. For example [i]'Portal_lounge'[/i] will attempt to " +"link to the room named [i]'Room_lounge'[/i].\n" +"There is a special case here - Godot does not allow two nodes to share the " +"same name. What if you want to manually have more than one portal leading " +"into the same room? Surely they will need to both be called, e.g. " +"[i]'Portal_lounge'[/i]?\n" +"The solution is a wildcard character. After the room name, if you use the " +"character [i]'*'[/i], this character and anything following it will be " +"ignored. So you can use for example [i]'Portal_lounge*0'[/i], " +"[i]'Portal_lounge*1'[/i] etc.\n" +"Note that [Portal]s that have already been converted to [Portal] nodes " +"(rather than [MeshInstance]s) still need to follow the same naming " +"convention, as they will be relinked each time during conversion.\n" +"It is recommended that you only place objects in rooms that are desired to " +"stay within those rooms - i.e. [code]portal mode[/code]s [code]STATIC[/code] " +"or [code]DYNAMIC[/code] (not crossing portals). [code]GLOBAL[/code] and " +"[code]ROAMING[/code] objects are best placed in another part of the scene " +"tree, to avoid confusion. See [CullInstance] for a full description of " +"portal modes." +msgstr "" + +#: doc/classes/RoomManager.xml +msgid "" +"Switches the portal culling system on and off.\n" +"It is important to note that when portal culling is active, it is " +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" +"Switching to [code]active[/code] will have no effect when the [code]room " +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." +msgstr "" + +#: doc/classes/RoomManager.xml +msgid "" +"Large objects can 'sprawl' over (be present in) more than one room. It can " +"be useful to visualize which objects are sprawling outside the current " +"room.\n" +"Toggling this setting turns this debug view on and off." +msgstr "" + +#: doc/classes/RoomManager.xml +msgid "" +"Usually we don't want objects that only [b]just[/b] cross a boundary into an " +"adjacent [Room] to sprawl into that room. To prevent this, each [Portal] has " +"an extra margin, or tolerance zone where objects can enter without sprawling " +"to a neighbouring room.\n" +"In most cases you can set this here for all portals. It is possible to " +"override the margin for each portal." +msgstr "" + +#: doc/classes/RoomManager.xml +msgid "" +"When using a partial or full PVS, the gameplay monitor allows you to receive " +"callbacks when roaming objects or rooms enter or exit the [b]gameplay area[/" +"b]. The gameplay area is defined as either the primary, or secondary PVS.\n" +"These callbacks allow you to, for example, reduce processing for objects " +"that are far from the player, or turn on and off AI.\n" +"You can either choose to receive callbacks as notifications through the " +"[code]_notification[/code] function, or as signals.\n" +"[code]NOTIFICATION_ENTER_GAMEPLAY[/code]\n" +"[code]NOTIFICATION_EXIT_GAMEPLAY[/code]\n" +"Signals: [code]\"gameplay_entered\"[/code], [code]\"gameplay_exited\"[/code]" +msgstr "" + +#: doc/classes/RoomManager.xml +msgid "" +"If enabled, the system will attempt to merge similar meshes (particularly in " +"terms of materials) within [Room]s during conversion. This can significantly " +"reduce the number of drawcalls and state changes required during rendering, " +"albeit at a cost of reduced culling granularity.\n" +"[b]Note:[/b] This operates at runtime during the conversion process, and " +"will only operate on exported or running projects, in order to prevent " +"accidental alteration to the scene and loss of data." +msgstr "" + +#: doc/classes/RoomManager.xml +msgid "" +"When converting rooms, the editor will warn you if overlap is detected " +"between rooms. Overlap can interfere with determining the room that cameras " +"and objects are within. A small amount can be acceptable, depending on your " +"level. Here you can alter the threshold at which the editor warning appears. " +"There are no other side effects." +msgstr "" + +#: doc/classes/RoomManager.xml +msgid "" +"Portal rendering is recursive - each time a portal is seen through an " +"earlier portal there is some cost. For this reason, and to prevent the " +"possibility of infinite loops, this setting provides a hard limit on the " +"recursion depth.\n" +"[b]Note:[/b] This value is unused when using [code]Full[/code] PVS mode." +msgstr "" + +#: doc/classes/RoomManager.xml +msgid "" +"Portal culling normally operates using the current [Camera] / [Camera]s, " +"however for debugging purposes within the editor, you can use this setting " +"to override this behavior and force it to use a particular camera to get a " +"better idea of what the occlusion culling is doing." +msgstr "" + +#: doc/classes/RoomManager.xml +msgid "" +"Optionally during conversion the potentially visible set (PVS) of rooms that " +"are potentially visible from each room can be calculated. This can be used " +"either to aid in dynamic portal culling, or to totally replace portal " +"culling.\n" +"In [code]Full[/code] PVS Mode, all objects within the potentially visible " +"rooms will be frustum culled, and rendered if they are within the view " +"frustum." +msgstr "" + +#: doc/classes/RoomManager.xml +msgid "" +"In order to reduce processing for roaming objects, an expansion is applied " +"to their AABB as they move. This expanded volume is used to calculate which " +"rooms the roaming object is within. If the object's exact AABB is still " +"within this expanded volume on the next move, there is no need to reprocess " +"the object, which can save considerable CPU.\n" +"The downside is that if the expansion is too much, the object may end up " +"unexpectedly sprawling into neighbouring rooms and showing up where it might " +"otherwise be culled.\n" +"In order to balance roaming performance against culling accuracy, this " +"expansion margin can be customized by the user. It will typically depend on " +"your room and object sizes, and movement speeds. The default value should " +"work reasonably in most circumstances." +msgstr "" + +#: doc/classes/RoomManager.xml +msgid "" +"During the conversion process, the geometry of objects within [Room]s, or a " +"custom specified manual bound, are used to generate a [b]convex hull bound[/" +"b].\n" +"This convex hull is [b]required[/b] in the visibility system, and is used " +"for many purposes. Most importantly, it is used to decide whether the " +"[Camera] (or an object) is within a [Room]. The convex hull generating " +"algorithm is good, but occasionally it can create too many (or too few) " +"planes to give a good representation of the room volume.\n" +"The [code]room_simplify[/code] value can be used to gain fine control over " +"this process. It determines how similar planes can be for them to be " +"considered the same (and duplicates removed). The value can be set between 0 " +"(no simplification) and 1 (maximum simplification).\n" +"The value set here is the default for all rooms, but individual rooms can " +"override this value if desired.\n" +"The room convex hulls are shown as a wireframe in the editor." +msgstr "" + +#: doc/classes/RoomManager.xml +msgid "" +"For the [Room] conversion process to succeed, you must point the " +"[RoomManager] to the parent [Node] of your [Room]s and [RoomGroup]s, which " +"we refer to as the [code]roomlist[/code] (the roomlist is not a special node " +"type, it is normally just a [Spatial])." +msgstr "" + +#: doc/classes/RoomManager.xml +msgid "Shows the [Portal] margins when the portal gizmo is used in the editor." +msgstr "" + +#: doc/classes/RoomManager.xml +msgid "" +"When receiving gameplay callbacks when objects enter and exit gameplay, the " +"[b]gameplay area[/b] can be defined by either the primary PVS (potentially " +"visible set) of [Room]s, or the secondary PVS (the primary PVS and their " +"neighbouring [Room]s).\n" +"Sometimes using the larger gameplay area of the secondary PVS may be " +"preferable." +msgstr "" + +#: doc/classes/RoomManager.xml +msgid "" +"Use only [Portal]s at runtime to determine visibility. PVS will not be " +"generated at [Room]s conversion, and gameplay notifications cannot be used." +msgstr "" + +#: doc/classes/RoomManager.xml +msgid "" +"Use a combination of PVS and [Portal]s to determine visibility (this is " +"usually fastest and most accurate)." +msgstr "" + +#: doc/classes/RoomManager.xml +msgid "" +"Use only the PVS (potentially visible set) of [Room]s to determine " +"visibility." +msgstr "" + +#: doc/classes/RootMotionView.xml +msgid "Editor-only helper for setting up root motion in [AnimationTree]." +msgstr "" + +#: doc/classes/RootMotionView.xml +msgid "" +"[i]Root motion[/i] refers to an animation technique where a mesh's skeleton " +"is used to give impulse to a character. When working with 3D animations, a " +"popular technique is for animators to use the root skeleton bone to give " +"motion to the rest of the skeleton. This allows animating characters in a " +"way where steps actually match the floor below. It also allows precise " +"interaction with objects during cinematics. See also [AnimationTree].\n" +"[b]Note:[/b] [RootMotionView] is only visible in the editor. It will be " +"hidden automatically in the running project, and will also be converted to a " +"plain [Node] in the running project. This means a script attached to a " +"[RootMotionView] node [i]must[/i] have [code]extends Node[/code] instead of " +"[code]extends RootMotionView[/code]. Additionally, it must not be a " +"[code]tool[/code] script." +msgstr "" + +#: doc/classes/RootMotionView.xml +msgid "Using AnimationTree - Root motion" +msgstr "" + +#: doc/classes/RootMotionView.xml +msgid "Path to an [AnimationTree] node to use as a basis for root motion." +msgstr "" + +#: doc/classes/RootMotionView.xml +msgid "The grid's cell size in 3D units." +msgstr "" + +#: doc/classes/RootMotionView.xml +msgid "The grid's color." +msgstr "" + +#: doc/classes/RootMotionView.xml +msgid "" +"The grid's radius in 3D units. The grid's opacity will fade gradually as the " +"distance from the origin increases until this [member radius] is reached." +msgstr "" + +#: doc/classes/RootMotionView.xml +msgid "" +"If [code]true[/code], the grid's points will all be on the same Y coordinate " +"([i]local[/i] Y = 0). If [code]false[/code], the points' original Y " +"coordinate is preserved." +msgstr "" + +#: doc/classes/SceneState.xml +msgid "A script interface to a scene file's data." +msgstr "" + +#: doc/classes/SceneState.xml +msgid "" +"Maintains a list of resources, nodes, exported, and overridden properties, " +"and built-in scripts associated with a scene.\n" +"This class cannot be instantiated directly, it is retrieved for a given " +"scene as the result of [method PackedScene.get_state]." +msgstr "" + +#: doc/classes/SceneState.xml +msgid "" +"Returns the list of bound parameters for the signal at [code]idx[/code]." +msgstr "" + +#: doc/classes/SceneState.xml +msgid "" +"Returns the number of signal connections in the scene.\n" +"The [code]idx[/code] argument used to query connection metadata in other " +"[code]get_connection_*[/code] methods in the interval [code][0, " +"get_connection_count() - 1][/code]." +msgstr "" + +#: doc/classes/SceneState.xml +msgid "" +"Returns the connection flags for the signal at [code]idx[/code]. See [enum " +"Object.ConnectFlags] constants." +msgstr "" + +#: doc/classes/SceneState.xml +msgid "Returns the method connected to the signal at [code]idx[/code]." +msgstr "" + +#: doc/classes/SceneState.xml +msgid "Returns the name of the signal at [code]idx[/code]." +msgstr "" + +#: doc/classes/SceneState.xml +msgid "" +"Returns the path to the node that owns the signal at [code]idx[/code], " +"relative to the root node." +msgstr "" + +#: doc/classes/SceneState.xml +msgid "" +"Returns the path to the node that owns the method connected to the signal at " +"[code]idx[/code], relative to the root node." +msgstr "" + +#: doc/classes/SceneState.xml +msgid "" +"Returns the number of nodes in the scene.\n" +"The [code]idx[/code] argument used to query node data in other " +"[code]get_node_*[/code] methods in the interval [code][0, get_node_count() - " +"1][/code]." +msgstr "" + +#: doc/classes/SceneState.xml +msgid "" +"Returns the list of group names associated with the node at [code]idx[/code]." +msgstr "" + +#: doc/classes/SceneState.xml +msgid "" +"Returns the node's index, which is its position relative to its siblings. " +"This is only relevant and saved in scenes for cases where new nodes are " +"added to an instanced or inherited scene among siblings from the base scene. " +"Despite the name, this index is not related to the [code]idx[/code] argument " +"used here and in other methods." +msgstr "" + +#: doc/classes/SceneState.xml +msgid "" +"Returns a [PackedScene] for the node at [code]idx[/code] (i.e. the whole " +"branch starting at this node, with its child nodes and resources), or " +"[code]null[/code] if the node is not an instance." +msgstr "" + +#: doc/classes/SceneState.xml +msgid "" +"Returns the path to the represented scene file if the node at [code]idx[/" +"code] is an [InstancePlaceholder]." +msgstr "" + +#: doc/classes/SceneState.xml +msgid "Returns the name of the node at [code]idx[/code]." +msgstr "" + +#: doc/classes/SceneState.xml +msgid "" +"Returns the path to the owner of the node at [code]idx[/code], relative to " +"the root node." +msgstr "" + +#: doc/classes/SceneState.xml +msgid "" +"Returns the path to the node at [code]idx[/code].\n" +"If [code]for_parent[/code] is [code]true[/code], returns the path of the " +"[code]idx[/code] node's parent instead." +msgstr "" + +#: doc/classes/SceneState.xml +msgid "" +"Returns the number of exported or overridden properties for the node at " +"[code]idx[/code].\n" +"The [code]prop_idx[/code] argument used to query node property data in other " +"[code]get_node_property_*[/code] methods in the interval [code][0, " +"get_node_property_count() - 1][/code]." +msgstr "" + +#: doc/classes/SceneState.xml +msgid "" +"Returns the name of the property at [code]prop_idx[/code] for the node at " +"[code]idx[/code]." +msgstr "" + +#: doc/classes/SceneState.xml +msgid "" +"Returns the value of the property at [code]prop_idx[/code] for the node at " +"[code]idx[/code]." +msgstr "" + +#: doc/classes/SceneState.xml +msgid "Returns the type of the node at [code]idx[/code]." +msgstr "" + +#: doc/classes/SceneState.xml +msgid "" +"Returns [code]true[/code] if the node at [code]idx[/code] is an " +"[InstancePlaceholder]." +msgstr "" + +#: doc/classes/SceneState.xml +msgid "" +"If passed to [method PackedScene.instance], blocks edits to the scene state." +msgstr "" + +#: doc/classes/SceneState.xml +msgid "" +"If passed to [method PackedScene.instance], provides inherited scene " +"resources to the local scene.\n" +"[b]Note:[/b] Only available in editor builds." +msgstr "" + +#: doc/classes/SceneState.xml +msgid "" +"If passed to [method PackedScene.instance], provides local scene resources " +"to the local scene. Only the main scene should receive the main edit state.\n" +"[b]Note:[/b] Only available in editor builds." +msgstr "" + +#: doc/classes/SceneState.xml +msgid "" +"If passed to [method PackedScene.instance], it's similar to [constant " +"GEN_EDIT_STATE_MAIN], but for the case where the scene is being instantiated " +"to be the base of another one.\n" +"[b]Note:[/b] Only available in editor builds." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "Manages the game loop via a hierarchy of nodes." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"As one of the most important classes, the [SceneTree] manages the hierarchy " +"of nodes in a scene as well as scenes themselves. Nodes can be added, " +"retrieved and removed. The whole scene tree (and thus the current scene) can " +"be paused. Scenes can be loaded, switched and reloaded.\n" +"You can also use the [SceneTree] to organize your nodes into groups: every " +"node can be assigned as many groups as you want to create, e.g. an \"enemy\" " +"group. You can then iterate these groups or even call methods and set " +"properties on all the group's members at once.\n" +"[SceneTree] is the default [MainLoop] implementation used by scenes, and is " +"thus in charge of the game loop." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Calls [code]method[/code] on each member of the given group. You can pass " +"arguments to [code]method[/code] by specifying them at the end of the method " +"call. This method is equivalent of calling [method call_group_flags] with " +"[constant GROUP_CALL_DEFAULT] flag.\n" +"[b]Note:[/b] [code]method[/code] may only have 5 arguments at most (7 " +"arguments passed to this method in total).\n" +"[b]Note:[/b] Due to design limitations, [method call_group] will fail " +"silently if one of the arguments is [code]null[/code].\n" +"[b]Note:[/b] [method call_group] will always call methods with an one-frame " +"delay, in a way similar to [method Object.call_deferred]. To call methods " +"immediately, use [method call_group_flags] with the [constant " +"GROUP_CALL_REALTIME] flag." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Calls [code]method[/code] on each member of the given group, respecting the " +"given [enum GroupCallFlags]. You can pass arguments to [code]method[/code] " +"by specifying them at the end of the method call.\n" +"[b]Note:[/b] [code]method[/code] may only have 5 arguments at most (8 " +"arguments passed to this method in total).\n" +"[b]Note:[/b] Due to design limitations, [method call_group_flags] will fail " +"silently if one of the arguments is [code]null[/code].\n" +"[codeblock]\n" +"# Call the method immediately and in reverse order.\n" +"get_tree().call_group_flags(SceneTree.GROUP_CALL_REALTIME | SceneTree." +"GROUP_CALL_REVERSE, \"bases\", \"destroy\")\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Changes the running scene to the one at the given [code]path[/code], after " +"loading it into a [PackedScene] and creating a new instance.\n" +"Returns [constant OK] on success, [constant ERR_CANT_OPEN] if the " +"[code]path[/code] cannot be loaded into a [PackedScene], or [constant " +"ERR_CANT_CREATE] if that scene cannot be instantiated.\n" +"[b]Note:[/b] The scene change is deferred, which means that the new scene " +"node is added on the next idle frame. You won't be able to access it " +"immediately after the [method change_scene] call." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Changes the running scene to a new instance of the given [PackedScene].\n" +"Returns [constant OK] on success or [constant ERR_CANT_CREATE] if the scene " +"cannot be instantiated.\n" +"[b]Note:[/b] The scene change is deferred, which means that the new scene " +"node is added on the next idle frame. You won't be able to access it " +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Returns a [SceneTreeTimer] which will [signal SceneTreeTimer.timeout] after " +"the given time in seconds elapsed in this [SceneTree]. If " +"[code]pause_mode_process[/code] is set to [code]false[/code], pausing the " +"[SceneTree] will also pause the timer.\n" +"Commonly used to create a one-shot delay timer as in the following example:\n" +"[codeblock]\n" +"func some_function():\n" +" print(\"start\")\n" +" yield(get_tree().create_timer(1.0), \"timeout\")\n" +" print(\"end\")\n" +"[/codeblock]\n" +"The timer will be automatically freed after its time elapses." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "Creates and returns a new [SceneTreeTween]." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Returns the current frame number, i.e. the total frame count since the " +"application started." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Returns the peer IDs of all connected peers of this [SceneTree]'s [member " +"network_peer]." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "Returns the unique peer ID of this [SceneTree]'s [member network_peer]." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "Returns the number of nodes in this [SceneTree]." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "Returns a list of all nodes assigned to the given group." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Returns an array of currently existing [SceneTreeTween]s in the [SceneTree] " +"(both running and paused)." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "Returns the sender's peer ID for the most recently received RPC call." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "Returns [code]true[/code] if the given group exists." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Returns [code]true[/code] if the most recent [InputEvent] was marked as " +"handled with [method set_input_as_handled]." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Returns [code]true[/code] if this [SceneTree]'s [member network_peer] is in " +"server mode (listening for connections)." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "Sends the given notification to all members of the [code]group[/code]." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Sends the given notification to all members of the [code]group[/code], " +"respecting the given [enum GroupCallFlags]." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Queues the given object for deletion, delaying the call to [method Object." +"free] to after the current frame." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Quits the application at the end of the current iteration. A process " +"[code]exit_code[/code] can optionally be passed as an argument. If this " +"argument is [code]0[/code] or greater, it will override the [member OS." +"exit_code] defined before quitting the application.\n" +"[b]Note:[/b] On iOS this method doesn't work. Instead, as recommended by the " +"iOS Human Interface Guidelines, the user is expected to close apps via the " +"Home button." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Reloads the currently active scene.\n" +"Returns [constant OK] on success, [constant ERR_UNCONFIGURED] if no [member " +"current_scene] was defined yet, [constant ERR_CANT_OPEN] if [member " +"current_scene] cannot be loaded into a [PackedScene], or [constant " +"ERR_CANT_CREATE] if the scene cannot be instantiated." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Sets the given [code]property[/code] to [code]value[/code] on all members of " +"the given group." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Sets the given [code]property[/code] to [code]value[/code] on all members of " +"the given group, respecting the given [enum GroupCallFlags]." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "Marks the most recent [InputEvent] as handled." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Configures screen stretching to the given [enum StretchMode], [enum " +"StretchAspect], minimum size and [code]scale[/code]." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"If [code]true[/code], the application automatically accepts quitting.\n" +"For mobile platforms, see [member quit_on_go_back]." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "The current scene." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"If [code]true[/code], collision shapes will be visible when running the game " +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"If [code]true[/code], navigation polygons will be visible when running the " +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "The root of the edited scene." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "The default [MultiplayerAPI] instance for this [SceneTree]." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"If [code]true[/code] (default value), enables automatic polling of the " +"[MultiplayerAPI] for this SceneTree during [signal idle_frame].\n" +"If [code]false[/code], you need to manually call [method MultiplayerAPI." +"poll] to process network packets and deliver RPCs/RSETs. This allows running " +"RPCs/RSETs in a different loop (e.g. physics, thread, specific time step) " +"and for manual [Mutex] protection when accessing the [MultiplayerAPI] from " +"threads." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"The peer object to handle the RPC system (effectively enabling networking " +"when set). Depending on the peer itself, the [SceneTree] will become a " +"network server (check with [method is_network_server]) and will set the root " +"node's network mode to master, or it will become a regular peer with the " +"root node set to puppet. All child nodes are set to inherit the network mode " +"by default. Handling of networking-related events (connection, " +"disconnection, new clients) is done by connecting to [SceneTree]'s signals." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"If [code]true[/code], the [SceneTree] is paused. Doing so will have the " +"following behavior:\n" +"- 2D and 3D physics will be stopped. This includes signals and collision " +"detection.\n" +"- [method Node._process], [method Node._physics_process] and [method Node." +"_input] will not be called anymore in nodes." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Although physics interpolation would normally be globally turned on and off " +"using [member ProjectSettings.physics/common/physics_interpolation], this " +"property allows control over interpolation at runtime." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"If [code]true[/code], the application quits automatically on going back (e." +"g. on Android).\n" +"To handle 'Go Back' button when this option is disabled, use [constant " +"MainLoop.NOTIFICATION_WM_GO_BACK_REQUEST]." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"If [code]true[/code], the [SceneTree]'s [member network_peer] refuses new " +"incoming connections." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "The [SceneTree]'s root [Viewport]." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"If [code]true[/code], font oversampling is enabled. This means that " +"[DynamicFont]s will be rendered at higher or lower size than configured " +"based on the viewport's scaling ratio. For example, in a viewport scaled " +"with a factor 1.5, a font configured with size 14 would be rendered with " +"size 21 ([code]14 * 1.5[/code]).\n" +"[b]Note:[/b] Font oversampling is only used if the viewport stretch mode is " +"[constant STRETCH_MODE_VIEWPORT], and if the stretch aspect mode is " +"different from [constant STRETCH_ASPECT_IGNORE].\n" +"[b]Note:[/b] This property is set automatically for the active [SceneTree] " +"when the project starts based on the configuration of [code]rendering/" +"quality/dynamic_fonts/use_oversampling[/code] in [ProjectSettings]. The " +"property can however be overridden at runtime as needed." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Emitted whenever this [SceneTree]'s [member network_peer] successfully " +"connected to a server. Only emitted on clients." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Emitted whenever this [SceneTree]'s [member network_peer] fails to establish " +"a connection to a server. Only emitted on clients." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Emitted when files are dragged from the OS file manager and dropped in the " +"game window. The arguments are a list of file paths and the identifier of " +"the screen where the drag originated." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "Emitted whenever global menu item is clicked." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Emitted immediately before [method Node._process] is called on every node in " +"the [SceneTree]." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Emitted whenever this [SceneTree]'s [member network_peer] connects with a " +"new peer. ID is the peer ID of the new peer. Clients get notified when other " +"clients connect to the same server. Upon connecting to a server, a client " +"also receives this signal for the server (with ID being 1)." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Emitted whenever this [SceneTree]'s [member network_peer] disconnects from a " +"peer. Clients get notified when other clients disconnect from the same " +"server." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "Emitted whenever a node is added to the [SceneTree]." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Emitted when a node's configuration changed. Only emitted in [code]tool[/" +"code] mode." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "Emitted whenever a node is removed from the [SceneTree]." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "Emitted whenever a node is renamed." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Emitted immediately before [method Node._physics_process] is called on every " +"node in the [SceneTree]." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Emitted when the screen resolution (fullscreen) or window size (windowed) " +"changes." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Emitted whenever this [SceneTree]'s [member network_peer] disconnected from " +"server. Only emitted on clients." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Emitted whenever the [SceneTree] hierarchy changed (children being moved or " +"renamed, etc.)." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "Call a group with no flags (default)." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "Call a group in reverse scene order." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "Call a group immediately (calls are normally made on idle)." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "Call a group only once even if the call is executed many times." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "No stretching." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "Render stretching in higher resolution (interpolated)." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Keep the specified display resolution. No interpolation. Content may appear " +"pixelated." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Fill the window with the content stretched to cover excessive space. Content " +"may appear stretched." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Retain the same aspect ratio by padding with black bars on either axis. This " +"prevents distortion." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Expand vertically. Left/right black bars may appear if the window is too " +"wide." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Expand horizontally. Top/bottom black bars may appear if the window is too " +"tall." +msgstr "" + +#: doc/classes/SceneTree.xml +msgid "" +"Expand in both directions, retaining the same aspect ratio. This prevents " +"distortion while avoiding black bars." +msgstr "" + +#: doc/classes/SceneTreeTimer.xml +msgid "One-shot timer." +msgstr "" + +#: doc/classes/SceneTreeTimer.xml +msgid "" +"A one-shot timer managed by the scene tree, which emits [signal timeout] on " +"completion. See also [method SceneTree.create_timer].\n" +"As opposed to [Timer], it does not require the instantiation of a node. " +"Commonly used to create a one-shot delay timer as in the following example:\n" +"[codeblock]\n" +"func some_function():\n" +" print(\"Timer started.\")\n" +" yield(get_tree().create_timer(1.0), \"timeout\")\n" +" print(\"Timer ended.\")\n" +"[/codeblock]\n" +"The timer will be dereferenced after its time elapses. To preserve the " +"timer, you can keep a reference to it. See [Reference]." +msgstr "" + +#: doc/classes/SceneTreeTimer.xml +msgid "The time remaining (in seconds)." +msgstr "" + +#: doc/classes/SceneTreeTimer.xml doc/classes/Timer.xml +msgid "Emitted when the timer reaches 0." +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "" +"Lightweight object used for general-purpose animation via script, using " +"[Tweener]s." +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "" +"[SceneTreeTween] is a tween managed by the scene tree. As opposed to " +"[Tween], it does not require the instantiation of a node.\n" +"[SceneTreeTween]s are more light-weight than [AnimationPlayer], so they are " +"very much suited for simple animations or general tasks that don't require " +"visual tweaking provided by the editor. They can be used in a fire-and-" +"forget manner for some logic that normally would be done by code. You can e." +"g. make something shoot periodically by using a looped [CallbackTweener] " +"with a delay.\n" +"A [SceneTreeTween] can be created by using either [method SceneTree." +"create_tween] or [method Node.create_tween]. [SceneTreeTween]s created " +"manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " +"used for tweening values, but you can do manual interpolation with [method " +"interpolate_value].\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" +"[codeblock]\n" +"var tween = get_tree().create_tween()\n" +"tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" +"tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" +"tween.tween_callback($Sprite, \"queue_free\")\n" +"[/codeblock]\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" +"When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " +"chained method call can be used to tweak the properties of this [Tweener]. " +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" +"[codeblock]\n" +"var tween = get_tree().create_tween()\n" +"tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." +"TRANS_SINE)\n" +"tween.tween_property($Sprite, \"scale\", Vector2(), 1).set_trans(Tween." +"TRANS_BOUNCE)\n" +"tween.tween_callback($Sprite, \"queue_free\")\n" +"[/codeblock]\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" +"[codeblock]\n" +"var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." +"TRANS_ELASTIC)\n" +"tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" +"tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" +"tween.tween_callback($Sprite, \"queue_free\")\n" +"[/codeblock]\n" +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " +"objects:\n" +"[codeblock]\n" +"var tween = create_tween()\n" +"for sprite in get_children():\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" +"[/codeblock]\n" +"In the example above, all children of a node are moved one after another to " +"position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." +"TransitionType] constant, and refers to the way the timing of the animation " +"is handled (see [url=https://easings.net/]easings.net[/url] for some " +"examples). The second accepts an [enum Tween.EaseType] constant, and " +"controls where the [code]trans_type[/code] is applied to the interpolation " +"(in the beginning, the end, or both). If you don't know which transition and " +"easing to pick, you can try different [enum Tween.TransitionType] constants " +"with [constant Tween.EASE_IN_OUT], and use the one that looks best.\n" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/" +"tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" +"[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " +"prevent a [SceneTreeTween] from autostarting, you can call [method stop] " +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "" +"Binds this [SceneTreeTween] with the given [code]node[/code]. " +"[SceneTreeTween]s are processed directly by the [SceneTree], so they run " +"independently of the animated nodes. When you bind a [Node] with the " +"[SceneTreeTween], the [SceneTreeTween] will halt the animation when the " +"object is not inside tree and the [SceneTreeTween] will be automatically " +"killed when the bound object is freed. Also [constant TWEEN_PAUSE_BOUND] " +"will make the pausing behavior dependent on the bound node.\n" +"For a shorter way to create and bind a [SceneTreeTween], you can use [method " +"Node.create_tween]." +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "" +"Used to chain two [Tweener]s after [method set_parallel] is called with " +"[code]true[/code].\n" +"[codeblock]\n" +"var tween = create_tween().set_parallel(true)\n" +"tween.tween_property(...)\n" +"tween.tween_property(...) # Will run parallelly with above.\n" +"tween.chain().tween_property(...) # Will run after two above are finished.\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" +"Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " +"haven't finished.\n" +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "" +"Returns the total time in seconds the [SceneTreeTween] has been animating (i." +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" +"[b]Note:[/b] As it results from accumulating frame deltas, the time returned " +"after the [SceneTreeTween] has finished animating will be slightly greater " +"than the actual [SceneTreeTween] duration." +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "" +"This method can be used for manual interpolation of a value, when you don't " +"want [SceneTreeTween] to do animating for you. It's similar to [method " +"@GDScript.lerp], but with support for custom transition and easing.\n" +"[code]initial_value[/code] is the starting value of the interpolation.\n" +"[code]delta_value[/code] is the change of the value in the interpolation, i." +"e. it's equal to [code]final_value - initial_value[/code].\n" +"[code]elapsed_time[/code] is the time in seconds that passed after the " +"interpolation started and it's used to control the position of the " +"interpolation. E.g. when it's equal to half of the [code]duration[/code], " +"the interpolated value will be halfway between initial and final values. " +"This value can also be greater than [code]duration[/code] or lower than 0, " +"which will extrapolate the value.\n" +"[code]duration[/code] is the total time of the interpolation.\n" +"[b]Note:[/b] If [code]duration[/code] is equal to [code]0[/code], the method " +"will always return the final value, regardless of [code]elapsed_time[/code] " +"provided." +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "" +"Returns whether the [SceneTreeTween] is currently running, i.e. it wasn't " +"paused and it's not finished." +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "" +"Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " +"[SceneTreeTween] contained by the scene tree (i.e. the array from [method " +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended. You can however still use " +"[method interpolate_value]." +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "Aborts all tweening operations and invalidates the [SceneTreeTween]." +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "" +"Makes the next [Tweener] run parallelly to the previous one. Example:\n" +"[codeblock]\n" +"var tween = create_tween()\n" +"tween.tween_property(...)\n" +"tween.parallel().tween_property(...)\n" +"tween.parallel().tween_property(...)\n" +"[/codeblock]\n" +"All [Tweener]s in the example will run at the same time.\n" +"You can make the [SceneTreeTween] parallel by default by using [method " +"set_parallel]." +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "" +"Pauses the tweening. The animation can be resumed by using [method play]." +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "Resumes a paused or stopped [SceneTreeTween]." +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "" +"Sets the default ease type for [PropertyTweener]s and [MethodTweener]s " +"animated by this [SceneTreeTween]." +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "" +"Sets the number of times the tweening sequence will be repeated, i.e. " +"[code]set_loops(2)[/code] will run the animation twice.\n" +"Calling this method without arguments will make the [SceneTreeTween] run " +"infinitely, until either it is killed with [method kill], the " +"[SceneTreeTween]'s bound node is freed, or all the animated objects have " +"been freed (which makes further animation impossible).\n" +"[b]Warning:[/b] Make sure to always add some duration/delay when using " +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a " +"[SceneTreeTween]'s lifetime depends on some node, always use [method " +"bind_node]." +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "" +"If [code]parallel[/code] is [code]true[/code], the [Tweener]s appended after " +"this method will by default run simultaneously, as opposed to sequentially." +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "" +"Determines the behavior of the [SceneTreeTween] when the [SceneTree] is " +"paused. Check [enum TweenPauseMode] for options.\n" +"Default value is [constant TWEEN_PAUSE_BOUND]." +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "" +"Determines whether the [SceneTreeTween] should run during idle frame (see " +"[method Node._process]) or physics frame (see [method Node." +"_physics_process].\n" +"Default value is [constant Tween.TWEEN_PROCESS_IDLE]." +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "" +"Scales the speed of tweening. This affects all [Tweener]s and their delays." +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "" +"Sets the default transition type for [PropertyTweener]s and [MethodTweener]s " +"animated by this [SceneTreeTween]." +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "" +"Stops the tweening and resets the [SceneTreeTween] to its initial state. " +"This will not remove any appended [Tweener]s." +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "" +"Creates and appends a [CallbackTweener]. This method can be used to call an " +"arbitrary method in any object. Use [code]binds[/code] to bind additional " +"arguments for the call.\n" +"Example: object that keeps shooting every 1 second.\n" +"[codeblock]\n" +"var tween = get_tree().create_tween().set_loops()\n" +"tween.tween_callback(self, \"shoot\").set_delay(1)\n" +"[/codeblock]\n" +"Example: turning a sprite red and then blue, with 2 second delay.\n" +"[codeblock]\n" +"var tween = get_tree().create_tween()\n" +"tween.tween_callback($Sprite, \"set_modulate\", [Color.red]).set_delay(2)\n" +"tween.tween_callback($Sprite, \"set_modulate\", [Color.blue]).set_delay(2)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "" +"Creates and appends an [IntervalTweener]. This method can be used to create " +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" +"Example: creating an interval in code execution.\n" +"[codeblock]\n" +"# ... some code\n" +"yield(create_tween().tween_interval(2), \"finished\")\n" +"# ... more code\n" +"[/codeblock]\n" +"Example: creating an object that moves back and forth and jumps every few " +"seconds.\n" +"[codeblock]\n" +"var tween = create_tween().set_loops()\n" +"tween.tween_property($Sprite, \"position:x\", 200.0, 1).as_relative()\n" +"tween.tween_callback(self, \"jump\")\n" +"tween.tween_interval(2)\n" +"tween.tween_property($Sprite, \"position:x\", -200.0, 1).as_relative()\n" +"tween.tween_callback(self, \"jump\")\n" +"tween.tween_interval(2)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "" +"Creates and appends a [MethodTweener]. This method is similar to a " +"combination of [method tween_callback] and [method tween_property]. It calls " +"a method over time with a tweened value provided as an argument. The value " +"is tweened between [code]from[/code] and [code]to[/code] over the time " +"specified by [code]duration[/code], in seconds. Use [code]binds[/code] to " +"bind additional arguments for the call. You can use [method MethodTweener." +"set_ease] and [method MethodTweener.set_trans] to tweak the easing and " +"transition of the value or [method MethodTweener.set_delay] to delay the " +"tweening.\n" +"Example: making a 3D object look from one point to another point.\n" +"[codeblock]\n" +"var tween = create_tween()\n" +"tween.tween_method(self, \"look_at\", Vector3(-1, 0, -1), Vector3(1, 0, -1), " +"1, [Vector3.UP]) # The look_at() method takes up vector as second argument.\n" +"[/codeblock]\n" +"Example: setting a text of a [Label], using an intermediate method and after " +"a delay.\n" +"[codeblock]\n" +"func _ready():\n" +" var tween = create_tween()\n" +" tween.tween_method(self, \"set_label_text\", 0, 10, 1).set_delay(1)\n" +"\n" +"func set_label_text(value: int):\n" +" $Label.text = \"Counting \" + str(value)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "" +"Creates and appends a [PropertyTweener]. This method tweens a " +"[code]property[/code] of an [code]object[/code] between an initial value and " +"[code]final_val[/code] in a span of time equal to [code]duration[/code], in " +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" +"[codeblock]\n" +"var tween = create_tween()\n" +"tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" +"tween.tween_property($Sprite, \"position\", Vector2(200, 300), 1)\n" +"[/codeblock]\n" +"will move the sprite to position (100, 200) and then to (200, 300). If you " +"use [method PropertyTweener.from] or [method PropertyTweener.from_current], " +"the starting position will be overwritten by the given value instead. See " +"other methods in [PropertyTweener] to see how the tweening can be tweaked " +"further.\n" +"[b]Note:[/b] You can find the correct property name by hovering over the " +"property in the Inspector. You can also provide the components of a property " +"directly by using [code]\"property:component\"[/code] (eg. [code]position:x[/" +"code]), where it would only apply to that particular component.\n" +"Example: moving object twice from the same position, with different " +"transition types.\n" +"[codeblock]\n" +"var tween = create_tween()\n" +"tween.tween_property($Sprite, \"position\", Vector2.RIGHT * 300, 1)." +"as_relative().set_trans(Tween.TRANS_SINE)\n" +"tween.tween_property($Sprite, \"position\", Vector2.RIGHT * 300, 1)." +"as_relative().from_current().set_trans(Tween.TRANS_EXPO)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "" +"Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " +"when the [SceneTreeTween] is set to infinite looping (see [method " +"set_loops]).\n" +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "" +"Emitted when a full loop is complete (see [method set_loops]), providing the " +"loop index. This signal is not emitted after the final loop, use [signal " +"finished] instead for this case." +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "" +"Emitted when one step of the [SceneTreeTween] is complete, providing the " +"step index. One step is either a single [Tweener] or a group of [Tweener]s " +"running in parallel." +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "" +"If the [SceneTreeTween] has a bound node, it will process when that node can " +"process (see [member Node.pause_mode]). Otherwise it's the same as [constant " +"TWEEN_PAUSE_STOP]." +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "If [SceneTree] is paused, the [SceneTreeTween] will also pause." +msgstr "" + +#: doc/classes/SceneTreeTween.xml +msgid "" +"The [SceneTreeTween] will process regardless of whether [SceneTree] is " +"paused." +msgstr "" + +#: doc/classes/Script.xml +msgid "A class stored as a resource." +msgstr "" + +#: doc/classes/Script.xml +msgid "" +"A class stored as a resource. A script extends the functionality of all " +"objects that instance it.\n" +"The [code]new[/code] method of a script subclass creates a new instance. " +"[method Object.set_script] extends an existing object, if that object's " +"class matches one of the script's base classes." +msgstr "" + +#: doc/classes/Script.xml +msgid "Returns [code]true[/code] if the script can be instanced." +msgstr "" + +#: doc/classes/Script.xml +msgid "Returns the script directly inherited by this script." +msgstr "" + +#: doc/classes/Script.xml +msgid "Returns the script's base type." +msgstr "" + +#: doc/classes/Script.xml +msgid "Returns the default value of the specified property." +msgstr "" + +#: doc/classes/Script.xml +msgid "Returns a dictionary containing constant names and their values." +msgstr "" + +#: doc/classes/Script.xml +msgid "Returns the list of methods in this [Script]." +msgstr "" + +#: doc/classes/Script.xml +msgid "Returns the list of properties in this [Script]." +msgstr "" + +#: doc/classes/Script.xml +msgid "Returns the list of user signals defined in this [Script]." +msgstr "" + +#: doc/classes/Script.xml +msgid "" +"Returns [code]true[/code] if the script, or a base class, defines a signal " +"with the given name." +msgstr "" + +#: doc/classes/Script.xml +msgid "Returns [code]true[/code] if the script contains non-empty source code." +msgstr "" + +#: doc/classes/Script.xml +msgid "" +"Returns [code]true[/code] if [code]base_object[/code] is an instance of this " +"script." +msgstr "" + +#: doc/classes/Script.xml +msgid "" +"Returns [code]true[/code] if the script is a tool script. A tool script can " +"run in the editor." +msgstr "" + +#: doc/classes/Script.xml +msgid "Reloads the script's class implementation. Returns an error code." +msgstr "" + +#: doc/classes/Script.xml +msgid "" +"The script source code or an empty string if source code is not available. " +"When set, does not reload the class implementation automatically." +msgstr "" + +#: doc/classes/ScriptCreateDialog.xml +msgid "The Editor's popup dialog for creating new [Script] files." +msgstr "" + +#: doc/classes/ScriptCreateDialog.xml +msgid "" +"The [ScriptCreateDialog] creates script files according to a given template " +"for a given scripting language. The standard use is to configure its fields " +"prior to calling one of the [method Popup.popup] methods.\n" +"[codeblock]\n" +"func _ready():\n" +" dialog.config(\"Node\", \"res://new_node.gd\") # For in-engine types\n" +" dialog.config(\"\\\"res://base_node.gd\\\"\", \"res://derived_node.gd\") " +"# For script types\n" +" dialog.popup_centered()\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/ScriptCreateDialog.xml +msgid "Prefills required fields to configure the ScriptCreateDialog for use." +msgstr "" + +#: doc/classes/ScriptCreateDialog.xml +msgid "Emitted when the user clicks the OK button." +msgstr "" + +#: doc/classes/ScriptEditor.xml +msgid "Godot editor's script editor." +msgstr "" + +#: doc/classes/ScriptEditor.xml +msgid "" +"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access " +"the singleton using [method EditorInterface.get_script_editor]." +msgstr "" + +#: doc/classes/ScriptEditor.xml +msgid "Returns a [Script] that is currently active in editor." +msgstr "" + +#: doc/classes/ScriptEditor.xml +msgid "" +"Returns an array with all [Script] objects which are currently open in " +"editor." +msgstr "" + +#: doc/classes/ScriptEditor.xml +msgid "Goes to the specified line in the current script." +msgstr "" + +#: doc/classes/ScriptEditor.xml +msgid "" +"Opens the script create dialog. The script will extend [code]base_name[/" +"code]. The file extension can be omitted from [code]base_path[/code]. It " +"will be added based on the selected scripting language." +msgstr "" + +#: doc/classes/ScriptEditor.xml +msgid "" +"Reload all currently opened scripts from disk in case the file contents are " +"newer." +msgstr "" + +#: doc/classes/ScriptEditor.xml +msgid "" +"Emitted when user changed active script. Argument is a freshly activated " +"[Script]." +msgstr "" + +#: doc/classes/ScriptEditor.xml +msgid "" +"Emitted when editor is about to close the active script. Argument is a " +"[Script] that is going to be closed." +msgstr "" + +#: doc/classes/ScrollBar.xml +msgid "Base class for scroll bars." +msgstr "" + +#: doc/classes/ScrollBar.xml +msgid "" +"Scrollbars are a [Range]-based [Control], that display a draggable area (the " +"size of the page). Horizontal ([HScrollBar]) and Vertical ([VScrollBar]) " +"versions are available." +msgstr "" + +#: doc/classes/ScrollBar.xml +msgid "" +"Overrides the step used when clicking increment and decrement buttons or " +"when using arrow keys when the [ScrollBar] is focused." +msgstr "" + +#: doc/classes/ScrollBar.xml +msgid "Emitted when the scrollbar is being scrolled." +msgstr "" + +#: doc/classes/ScrollContainer.xml +msgid "A helper node for displaying scrollable elements such as lists." +msgstr "" + +#: doc/classes/ScrollContainer.xml +msgid "" +"A ScrollContainer node meant to contain a [Control] child. ScrollContainers " +"will automatically create a scrollbar child ([HScrollBar], [VScrollBar], or " +"both) when needed and will only draw the Control within the ScrollContainer " +"area. Scrollbars will automatically be drawn at the right (for vertical) or " +"bottom (for horizontal) and will enable dragging to move the viewable " +"Control (and its children) within the ScrollContainer. Scrollbars will also " +"automatically resize the grabber based on the [member Control.rect_min_size] " +"of the Control relative to the ScrollContainer. Works great with a [Panel] " +"control. You can set [code]EXPAND[/code] on the children's size flags, so " +"they will upscale to the ScrollContainer's size if it's larger (scroll is " +"invisible for the chosen dimension)." +msgstr "" + +#: doc/classes/ScrollContainer.xml +msgid "" +"Ensures the given [code]control[/code] is visible (must be a direct or " +"indirect child of the ScrollContainer). Used by [member follow_focus].\n" +"[b]Note:[/b] This will not work on a node that was just added during the " +"same frame. If you want to scroll to a newly added child, you must wait " +"until the next frame using [signal SceneTree.idle_frame]:\n" +"[codeblock]\n" +"add_child(child_node)\n" +"yield(get_tree(), \"idle_frame\")\n" +"ensure_control_visible(child_node)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/ScrollContainer.xml +msgid "" +"Returns the horizontal scrollbar [HScrollBar] of this [ScrollContainer].\n" +"[b]Warning:[/b] This is a required internal node, removing and freeing it " +"may cause a crash. If you wish to disable the horizontal scrollbar, use " +"[member scroll_horizontal_enabled]. If you want to only hide it instead, use " +"its [member CanvasItem.visible] property." +msgstr "" + +#: doc/classes/ScrollContainer.xml +msgid "" +"Returns the vertical scrollbar [VScrollBar] of this [ScrollContainer].\n" +"[b]Warning:[/b] This is a required internal node, removing and freeing it " +"may cause a crash. If you wish to disable the vertical scrollbar, use " +"[member scroll_vertical_enabled]. If you want to only hide it instead, use " +"its [member CanvasItem.visible] property." +msgstr "" + +#: doc/classes/ScrollContainer.xml +msgid "" +"If [code]true[/code], the ScrollContainer will automatically scroll to " +"focused children (including indirect children) to make sure they are fully " +"visible." +msgstr "" + +#: doc/classes/ScrollContainer.xml +msgid "The current horizontal scroll value." +msgstr "" + +#: doc/classes/ScrollContainer.xml +msgid "If [code]true[/code], enables horizontal scrolling." +msgstr "" + +#: doc/classes/ScrollContainer.xml +msgid "The current vertical scroll value." +msgstr "" + +#: doc/classes/ScrollContainer.xml +msgid "If [code]true[/code], enables vertical scrolling." +msgstr "" + +#: doc/classes/ScrollContainer.xml +msgid "Emitted when scrolling stops." +msgstr "" + +#: doc/classes/ScrollContainer.xml +msgid "Emitted when scrolling is started." +msgstr "" + +#: doc/classes/ScrollContainer.xml +msgid "The background [StyleBox] of the [ScrollContainer]." +msgstr "" + +#: doc/classes/SegmentShape2D.xml +msgid "Segment shape for 2D collisions." +msgstr "" + +#: doc/classes/SegmentShape2D.xml +msgid "" +"Segment shape for 2D collisions. Consists of two points, [code]a[/code] and " +"[code]b[/code]." +msgstr "" + +#: doc/classes/SegmentShape2D.xml +msgid "The segment's first point position." +msgstr "" + +#: doc/classes/SegmentShape2D.xml +msgid "The segment's second point position." +msgstr "" + +#: doc/classes/Semaphore.xml +msgid "A synchronization semaphore." +msgstr "" + +#: doc/classes/Semaphore.xml +msgid "" +"A synchronization semaphore which can be used to synchronize multiple " +"[Thread]s. Initialized to zero on creation. Be careful to avoid deadlocks. " +"For a binary version, see [Mutex]." +msgstr "" + +#: doc/classes/Semaphore.xml +msgid "" +"Lowers the [Semaphore], allowing one more thread in.\n" +"[b]Note:[/b] This method internals' can't possibly fail, but an error code " +"is returned for backwards compatibility, which will always be [constant OK]." +msgstr "" + +#: doc/classes/Semaphore.xml +msgid "" +"Like [method wait], but won't block, so if the value is zero, fails " +"immediately and returns [constant ERR_BUSY]. If non-zero, it returns " +"[constant OK] to report success." +msgstr "" + +#: doc/classes/Semaphore.xml +msgid "" +"Waits for the [Semaphore], if its value is zero, blocks until non-zero.\n" +"[b]Note:[/b] This method internals' can't possibly fail, but an error code " +"is returned for backwards compatibility, which will always be [constant OK]." +msgstr "" + +#: doc/classes/Separator.xml +msgid "Base class for separators." +msgstr "" + +#: doc/classes/Separator.xml +msgid "" +"Separator is a [Control] used for separating other controls. It's purely a " +"visual decoration. Horizontal ([HSeparator]) and Vertical ([VSeparator]) " +"versions are available." +msgstr "" + +#: doc/classes/Shader.xml +msgid "A custom shader program." +msgstr "" + +#: doc/classes/Shader.xml +msgid "" +"This class allows you to define a custom shader program that can be used by " +"a [ShaderMaterial]. Shaders allow you to write your own custom behavior for " +"rendering objects or updating particle information. For a detailed " +"explanation and usage, please see the tutorials linked below." +msgstr "" + +#: doc/classes/Shader.xml +msgid "" +"Returns the texture that is set as default for the specified parameter.\n" +"[b]Note:[/b] [code]param[/code] must match the name of the uniform in the " +"code exactly." +msgstr "" + +#: doc/classes/Shader.xml +msgid "" +"Returns the shader mode for the shader, either [constant MODE_CANVAS_ITEM], " +"[constant MODE_SPATIAL] or [constant MODE_PARTICLES]." +msgstr "" + +#: doc/classes/Shader.xml +msgid "" +"Returns [code]true[/code] if the shader has this param defined as a uniform " +"in its code.\n" +"[b]Note:[/b] [code]param[/code] must match the name of the uniform in the " +"code exactly." +msgstr "" + +#: doc/classes/Shader.xml +msgid "" +"Sets the default texture to be used with a texture uniform. The default is " +"used if a texture is not set in the [ShaderMaterial].\n" +"[b]Note:[/b] [code]param[/code] must match the name of the uniform in the " +"code exactly." +msgstr "" + +#: doc/classes/Shader.xml +msgid "" +"Returns the shader's code as the user has written it, not the full generated " +"code used internally." +msgstr "" + +#: doc/classes/Shader.xml +msgid "" +"Returns the shader's custom defines. Custom defines can be used in Godot to " +"add GLSL preprocessor directives (e.g: extensions) required for the shader " +"logic.\n" +"[b]Note:[/b] Custom defines are not validated by the Godot shader parser, so " +"care should be taken when using them." +msgstr "" + +#: doc/classes/Shader.xml +msgid "Mode used to draw all 3D objects." +msgstr "" + +#: doc/classes/Shader.xml +msgid "Mode used to draw all 2D objects." +msgstr "" + +#: doc/classes/Shader.xml +msgid "" +"Mode used to calculate particle information on a per-particle basis. Not " +"used for drawing." +msgstr "" + +#: doc/classes/ShaderMaterial.xml +msgid "A material that uses a custom [Shader] program." +msgstr "" + +#: doc/classes/ShaderMaterial.xml +msgid "" +"A material that uses a custom [Shader] program to render either items to " +"screen or process particles. You can create multiple materials for the same " +"shader but configure different values for the uniforms defined in the " +"shader.\n" +"[b]Note:[/b] Due to a renderer limitation, emissive [ShaderMaterial]s cannot " +"emit light when used in a [GIProbe]. Only emissive [SpatialMaterial]s can " +"emit light in a [GIProbe]." +msgstr "" + +#: doc/classes/ShaderMaterial.xml +msgid "" +"Returns the current value set for this material of a uniform in the shader." +msgstr "" + +#: doc/classes/ShaderMaterial.xml +msgid "" +"Returns [code]true[/code] if the property identified by [code]name[/code] " +"can be reverted to a default value." +msgstr "" + +#: doc/classes/ShaderMaterial.xml +msgid "" +"Returns the default value of the material property with given [code]name[/" +"code]." +msgstr "" + +#: doc/classes/ShaderMaterial.xml +msgid "" +"Changes the value set for this material of a uniform in the shader.\n" +"[b]Note:[/b] [code]param[/code] must match the name of the uniform in the " +"code exactly." +msgstr "" + +#: doc/classes/ShaderMaterial.xml +msgid "The [Shader] program used to render this material." +msgstr "" + +#: doc/classes/Shape.xml +msgid "Base class for all 3D shape resources." +msgstr "" + +#: doc/classes/Shape.xml +msgid "" +"Base class for all 3D shape resources. Nodes that inherit from this can be " +"used as shapes for a [PhysicsBody] or [Area] objects." +msgstr "" + +#: doc/classes/Shape.xml +msgid "" +"Returns the [ArrayMesh] used to draw the debug collision for this [Shape]." +msgstr "" + +#: doc/classes/Shape.xml +msgid "" +"The collision margin for the shape. Used in Bullet Physics only.\n" +"Collision margins allow collision detection to be more efficient by adding " +"an extra shell around shapes. Collision algorithms are more expensive when " +"objects overlap by more than their margin, so a higher value for margins is " +"better for performance, at the cost of accuracy around edges as it makes " +"them less sharp." +msgstr "" + +#: doc/classes/Shape2D.xml +msgid "Base class for all 2D shapes." +msgstr "" + +#: doc/classes/Shape2D.xml +msgid "Base class for all 2D shapes. All 2D shape types inherit from this." +msgstr "" + +#: doc/classes/Shape2D.xml +msgid "" +"Returns [code]true[/code] if this shape is colliding with another.\n" +"This method needs the transformation matrix for this shape " +"([code]local_xform[/code]), the shape to check collisions with " +"([code]with_shape[/code]), and the transformation matrix of that shape " +"([code]shape_xform[/code])." +msgstr "" + +#: doc/classes/Shape2D.xml +msgid "" +"Returns a list of contact point pairs where this shape touches another.\n" +"If there are no collisions, the returned list is empty. Otherwise, the " +"returned list contains contact points arranged in pairs, with entries " +"alternating between points on the boundary of this shape and points on the " +"boundary of [code]with_shape[/code].\n" +"A collision pair A, B can be used to calculate the collision normal with " +"[code](B - A).normalized()[/code], and the collision depth with [code](B - " +"A).length()[/code]. This information is typically used to separate shapes, " +"particularly in collision solvers.\n" +"This method needs the transformation matrix for this shape " +"([code]local_xform[/code]), the shape to check collisions with " +"([code]with_shape[/code]), and the transformation matrix of that shape " +"([code]shape_xform[/code])." +msgstr "" + +#: doc/classes/Shape2D.xml +msgid "" +"Returns whether this shape would collide with another, if a given movement " +"was applied.\n" +"This method needs the transformation matrix for this shape " +"([code]local_xform[/code]), the movement to test on this shape " +"([code]local_motion[/code]), the shape to check collisions with " +"([code]with_shape[/code]), the transformation matrix of that shape " +"([code]shape_xform[/code]), and the movement to test onto the other object " +"([code]shape_motion[/code])." +msgstr "" + +#: doc/classes/Shape2D.xml +msgid "" +"Returns a list of contact point pairs where this shape would touch another, " +"if a given movement was applied.\n" +"If there would be no collisions, the returned list is empty. Otherwise, the " +"returned list contains contact points arranged in pairs, with entries " +"alternating between points on the boundary of this shape and points on the " +"boundary of [code]with_shape[/code].\n" +"A collision pair A, B can be used to calculate the collision normal with " +"[code](B - A).normalized()[/code], and the collision depth with [code](B - " +"A).length()[/code]. This information is typically used to separate shapes, " +"particularly in collision solvers.\n" +"This method needs the transformation matrix for this shape " +"([code]local_xform[/code]), the movement to test on this shape " +"([code]local_motion[/code]), the shape to check collisions with " +"([code]with_shape[/code]), the transformation matrix of that shape " +"([code]shape_xform[/code]), and the movement to test onto the other object " +"([code]shape_motion[/code])." +msgstr "" + +#: doc/classes/Shape2D.xml +msgid "" +"Draws a solid shape onto a [CanvasItem] with the [VisualServer] API filled " +"with the specified [code]color[/code]. The exact drawing method is specific " +"for each shape and cannot be configured." +msgstr "" + +#: doc/classes/Shape2D.xml +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." +msgstr "" + +#: doc/classes/ShortCut.xml +msgid "A shortcut for binding input." +msgstr "" + +#: doc/classes/ShortCut.xml +msgid "" +"A shortcut for binding input.\n" +"Shortcuts are commonly used for interacting with a [Control] element from a " +"[InputEvent]." +msgstr "" + +#: doc/classes/ShortCut.xml +msgid "Returns the shortcut's [InputEvent] as a [String]." +msgstr "" + +#: doc/classes/ShortCut.xml +msgid "" +"Returns [code]true[/code] if the shortcut's [InputEvent] equals [code]event[/" +"code]." +msgstr "" + +#: doc/classes/ShortCut.xml +msgid "If [code]true[/code], this shortcut is valid." +msgstr "" + +#: doc/classes/ShortCut.xml +msgid "" +"The shortcut's [InputEvent].\n" +"Generally the [InputEvent] is a keyboard key, though it can be any " +"[InputEvent]." +msgstr "" + +#: doc/classes/Skeleton.xml +msgid "Skeleton for characters and animated objects." +msgstr "" + +#: doc/classes/Skeleton.xml +msgid "" +"Skeleton provides a hierarchical interface for managing bones, including " +"pose, rest and animation (see [Animation]). It can also use ragdoll " +"physics.\n" +"The overall transform of a bone with respect to the skeleton is determined " +"by the following hierarchical order: rest pose, custom pose and pose.\n" +"Note that \"global pose\" below refers to the overall transform of the bone " +"with respect to skeleton, so it not the actual global/world transform of the " +"bone." +msgstr "" + +#: doc/classes/Skeleton.xml +msgid "" +"Adds a bone, with name [code]name[/code]. [method get_bone_count] will " +"become the bone index." +msgstr "" + +#: doc/classes/Skeleton.xml +msgid "[i]Deprecated soon.[/i]" +msgstr "" + +#: doc/classes/Skeleton.xml +msgid "Clear all the bones in this skeleton." +msgstr "" + +#: doc/classes/Skeleton.xml +msgid "Returns the bone index that matches [code]name[/code] as its name." +msgstr "" + +#: doc/classes/Skeleton.xml +msgid "Returns the amount of bones in the skeleton." +msgstr "" + +#: doc/classes/Skeleton.xml +msgid "" +"Returns the custom pose of the specified bone. Custom pose is applied on top " +"of the rest pose." +msgstr "" + +#: doc/classes/Skeleton.xml +msgid "" +"Returns the overall transform of the specified bone, with respect to the " +"skeleton. Being relative to the skeleton frame, this is not the actual " +"\"global\" transform of the bone." +msgstr "" + +#: doc/classes/Skeleton.xml +msgid "" +"Returns the overall transform of the specified bone, with respect to the " +"skeleton, but without any global pose overrides. Being relative to the " +"skeleton frame, this is not the actual \"global\" transform of the bone." +msgstr "" + +#: doc/classes/Skeleton.xml +msgid "Returns the name of the bone at index [code]index[/code]." +msgstr "" + +#: doc/classes/Skeleton.xml +msgid "" +"Returns the bone index which is the parent of the bone at [code]bone_idx[/" +"code]. If -1, then bone has no parent.\n" +"[b]Note:[/b] The parent bone returned will always be less than " +"[code]bone_idx[/code]." +msgstr "" + +#: doc/classes/Skeleton.xml +msgid "" +"Returns the pose transform of the specified bone. Pose is applied on top of " +"the custom pose, which is applied on top the rest pose." +msgstr "" + +#: doc/classes/Skeleton.xml +msgid "Returns the rest transform for a bone [code]bone_idx[/code]." +msgstr "" + +#: doc/classes/Skeleton.xml +msgid "" +"Sets the bone index [code]parent_idx[/code] as the parent of the bone at " +"[code]bone_idx[/code]. If -1, then bone has no parent.\n" +"[b]Note:[/b] [code]parent_idx[/code] must be less than [code]bone_idx[/code]." +msgstr "" + +#: doc/classes/Skeleton.xml +msgid "Sets the pose transform for bone [code]bone_idx[/code]." +msgstr "" + +#: doc/classes/Skeleton.xml +msgid "Sets the rest transform for bone [code]bone_idx[/code]." +msgstr "" + +#: doc/classes/Skeleton2D.xml +msgid "Skeleton for 2D characters and animated objects." +msgstr "" + +#: doc/classes/Skeleton2D.xml +msgid "" +"Skeleton2D parents a hierarchy of [Bone2D] objects. It is a requirement of " +"[Bone2D]. Skeleton2D holds a reference to the rest pose of its children and " +"acts as a single point of access to its bones." +msgstr "" + +#: doc/classes/Skeleton2D.xml +msgid "" +"Returns a [Bone2D] from the node hierarchy parented by Skeleton2D. The " +"object to return is identified by the parameter [code]idx[/code]. Bones are " +"indexed by descending the node hierarchy from top to bottom, adding the " +"children of each branch before moving to the next sibling." +msgstr "" + +#: doc/classes/Skeleton2D.xml +msgid "" +"Returns the number of [Bone2D] nodes in the node hierarchy parented by " +"Skeleton2D." +msgstr "" + +#: doc/classes/Skeleton2D.xml +msgid "Returns the [RID] of a Skeleton2D instance." +msgstr "" + +#: doc/classes/SkeletonIK.xml +msgid "" +"SkeletonIK is used to place the end bone of a [Skeleton] bone chain at a " +"certain point in 3D by rotating all bones in the chain accordingly." +msgstr "" + +#: doc/classes/SkeletonIK.xml +msgid "" +"SkeletonIK is used to place the end bone of a [Skeleton] bone chain at a " +"certain point in 3D by rotating all bones in the chain accordingly. A " +"typical scenario for IK in games is to place a characters feet on the ground " +"or a characters hands on a currently hold object. SkeletonIK uses " +"FabrikInverseKinematic internally to solve the bone chain and applies the " +"results to the [Skeleton] [code]bones_global_pose_override[/code] property " +"for all affected bones in the chain. If fully applied this overwrites any " +"bone transform from [Animation]s or bone custom poses set by users. The " +"applied amount can be controlled with the [code]interpolation[/code] " +"property.\n" +"[codeblock]\n" +"# Apply IK effect automatically on every new frame (not the current)\n" +"skeleton_ik_node.start()\n" +"\n" +"# Apply IK effect only on the current frame\n" +"skeleton_ik_node.start(true)\n" +"\n" +"# Stop IK effect and reset bones_global_pose_override on Skeleton\n" +"skeleton_ik_node.stop()\n" +"\n" +"# Apply full IK effect\n" +"skeleton_ik_node.set_interpolation(1.0)\n" +"\n" +"# Apply half IK effect\n" +"skeleton_ik_node.set_interpolation(0.5)\n" +"\n" +"# Apply zero IK effect (a value at or below 0.01 also removes " +"bones_global_pose_override on Skeleton)\n" +"skeleton_ik_node.set_interpolation(0.0)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/SkeletonIK.xml +msgid "" +"Returns the parent [Skeleton] Node that was present when SkeletonIK entered " +"the [SceneTree]. Returns null if the parent node was not a [Skeleton] Node " +"when SkeletonIK entered the [SceneTree]." +msgstr "" + +#: doc/classes/SkeletonIK.xml +msgid "" +"Returns [code]true[/code] if SkeletonIK is applying IK effects on continues " +"frames to the [Skeleton] bones. Returns [code]false[/code] if SkeletonIK is " +"stopped or [method start] was used with the [code]one_time[/code] parameter " +"set to [code]true[/code]." +msgstr "" + +#: doc/classes/SkeletonIK.xml +msgid "" +"Starts applying IK effects on each frame to the [Skeleton] bones but will " +"only take effect starting on the next frame. If [code]one_time[/code] is " +"[code]true[/code], this will take effect immediately but also reset on the " +"next frame." +msgstr "" + +#: doc/classes/SkeletonIK.xml +msgid "" +"Stops applying IK effects on each frame to the [Skeleton] bones and also " +"calls [method Skeleton.clear_bones_global_pose_override] to remove existing " +"overrides on all bones." +msgstr "" + +#: doc/classes/SkeletonIK.xml +msgid "" +"Interpolation value for how much the IK results are applied to the current " +"skeleton bone chain. A value of [code]1.0[/code] will overwrite all skeleton " +"bone transforms completely while a value of [code]0.0[/code] will visually " +"disable the SkeletonIK. A value at or below [code]0.01[/code] also calls " +"[method Skeleton.clear_bones_global_pose_override]." +msgstr "" + +#: doc/classes/SkeletonIK.xml +msgid "" +"Secondary target position (first is [member target] property or [member " +"target_node]) for the IK chain. Use magnet position (pole target) to control " +"the bending of the IK chain. Only works if the bone chain has more than 2 " +"bones. The middle chain bone position will be linearly interpolated with the " +"magnet position." +msgstr "" + +#: doc/classes/SkeletonIK.xml +msgid "" +"Number of iteration loops used by the IK solver to produce more accurate " +"(and elegant) bone chain results." +msgstr "" + +#: doc/classes/SkeletonIK.xml +msgid "" +"The minimum distance between bone and goal target. If the distance is below " +"this value, the IK solver stops further iterations." +msgstr "" + +#: doc/classes/SkeletonIK.xml +msgid "" +"If [code]true[/code] overwrites the rotation of the tip bone with the " +"rotation of the [member target] (or [member target_node] if defined)." +msgstr "" + +#: doc/classes/SkeletonIK.xml +msgid "The name of the current root bone, the first bone in the IK chain." +msgstr "" + +#: doc/classes/SkeletonIK.xml +msgid "" +"First target of the IK chain where the tip bone is placed and, if [member " +"override_tip_basis] is [code]true[/code], how the tip bone is rotated. If a " +"[member target_node] path is available the nodes transform is used instead " +"and this property is ignored." +msgstr "" + +#: doc/classes/SkeletonIK.xml +msgid "" +"Target node [NodePath] for the IK chain. If available, the node's current " +"[Transform] is used instead of the [member target] property." +msgstr "" + +#: doc/classes/SkeletonIK.xml +msgid "" +"The name of the current tip bone, the last bone in the IK chain placed at " +"the [member target] transform (or [member target_node] if defined)." +msgstr "" + +#: doc/classes/SkeletonIK.xml +msgid "" +"If [code]true[/code], instructs the IK solver to consider the secondary " +"magnet target (pole target) when calculating the bone chain. Use the magnet " +"position (pole target) to control the bending of the IK chain." +msgstr "" + +#: doc/classes/Sky.xml +msgid "The base class for [PanoramaSky] and [ProceduralSky]." +msgstr "" + +#: doc/classes/Sky.xml +msgid "" +"The [Sky]'s radiance map size. The higher the radiance map size, the more " +"detailed the lighting from the [Sky] will be.\n" +"See [enum RadianceSize] constants for values.\n" +"[b]Note:[/b] You will only benefit from high radiance sizes if you have " +"perfectly sharp reflective surfaces in your project and are not using " +"[ReflectionProbe]s or [GIProbe]s. For most projects, keeping [member " +"radiance_size] to the default value is the best compromise between visuals " +"and performance. Be careful when using high radiance size values as these " +"can cause crashes on low-end GPUs." +msgstr "" + +#: doc/classes/Sky.xml +msgid "Radiance texture size is 32×32 pixels." +msgstr "" + +#: doc/classes/Sky.xml +msgid "Radiance texture size is 64×64 pixels." +msgstr "" + +#: doc/classes/Sky.xml +msgid "Radiance texture size is 128×128 pixels." +msgstr "" + +#: doc/classes/Sky.xml +msgid "Radiance texture size is 256×256 pixels." +msgstr "" + +#: doc/classes/Sky.xml +msgid "Radiance texture size is 512×512 pixels." +msgstr "" + +#: doc/classes/Sky.xml +msgid "" +"Radiance texture size is 1024×1024 pixels.\n" +"[b]Note:[/b] [constant RADIANCE_SIZE_1024] is not exposed in the inspector " +"as it is known to cause GPU hangs on certain systems." +msgstr "" + +#: doc/classes/Sky.xml +msgid "" +"Radiance texture size is 2048×2048 pixels.\n" +"[b]Note:[/b] [constant RADIANCE_SIZE_2048] is not exposed in the inspector " +"as it is known to cause GPU hangs on certain systems." +msgstr "" + +#: doc/classes/Sky.xml +msgid "Represents the size of the [enum RadianceSize] enum." +msgstr "" + +#: doc/classes/Slider.xml +msgid "Base class for GUI sliders." +msgstr "" + +#: doc/classes/Slider.xml +msgid "" +"Base class for GUI sliders.\n" +"[b]Note:[/b] The [signal Range.changed] and [signal Range.value_changed] " +"signals are part of the [Range] class which this class inherits from." +msgstr "" + +#: doc/classes/Slider.xml +msgid "" +"If [code]true[/code], the slider can be interacted with. If [code]false[/" +"code], the value can be changed only by code." +msgstr "" + +#: doc/classes/Slider.xml +msgid "If [code]true[/code], the value can be changed using the mouse wheel." +msgstr "" + +#: doc/classes/Slider.xml +msgid "" +"Number of ticks displayed on the slider, including border ticks. Ticks are " +"uniformly-distributed value markers." +msgstr "" + +#: doc/classes/Slider.xml +msgid "" +"If [code]true[/code], the slider will display ticks for minimum and maximum " +"values." +msgstr "" + +#: doc/classes/Slider.xml +msgid "" +"Emitted when dragging stops. If [code]value_changed[/code] is true, [member " +"Range.value] is different from the value when you started the dragging." +msgstr "" + +#: doc/classes/Slider.xml +msgid "Emitted when dragging is started." +msgstr "" + +#: doc/classes/SliderJoint.xml +msgid "Slider between two PhysicsBodies in 3D." +msgstr "" + +#: doc/classes/SliderJoint.xml +msgid "" +"Slides across the X axis of the pivot object. See also [Generic6DOFJoint]." +msgstr "" + +#: doc/classes/SliderJoint.xml +msgid "" +"The amount of damping of the rotation when the limit is surpassed.\n" +"A lower damping value allows a rotation initiated by body A to travel to " +"body B slower." +msgstr "" + +#: doc/classes/SliderJoint.xml +msgid "" +"The amount of restitution of the rotation when the limit is surpassed.\n" +"Does not affect damping." +msgstr "" + +#: doc/classes/SliderJoint.xml +msgid "" +"A factor applied to the all rotation once the limit is surpassed.\n" +"Makes all rotation slower when between 0 and 1." +msgstr "" + +#: doc/classes/SliderJoint.xml +msgid "A factor applied to the all rotation in the limits." +msgstr "" + +#: doc/classes/SliderJoint.xml +msgid "" +"A factor applied to the all rotation across axes orthogonal to the slider." +msgstr "" + +#: doc/classes/SliderJoint.xml +msgid "" +"The amount of damping that happens once the limit defined by [member " +"linear_limit/lower_distance] and [member linear_limit/upper_distance] is " +"surpassed." +msgstr "" + +#: doc/classes/SliderJoint.xml +msgid "" +"The amount of restitution once the limits are surpassed. The lower, the more " +"velocity-energy gets lost." +msgstr "" + +#: doc/classes/SoftBody.xml +msgid "A soft mesh physics body." +msgstr "" + +#: doc/classes/SoftBody.xml +msgid "" +"A deformable physics body. Used to create elastic or deformable objects such " +"as cloth, rubber, or other flexible materials.\n" +"[b]Note:[/b] There are many known bugs in [SoftBody]. Therefore, it's not " +"recommended to use them for things that can affect gameplay (such as a " +"player character made entirely out of soft bodies)." +msgstr "" + +#: doc/classes/SoftBody.xml +msgid "Returns local translation of a vertex in the surface array." +msgstr "" + +#: doc/classes/SoftBody.xml +msgid "Returns [code]true[/code] if vertex is set to pinned." +msgstr "" + +#: doc/classes/SoftBody.xml +msgid "" +"Sets the pinned state of a surface vertex. When set to [code]true[/code], " +"the optional [code]attachment_path[/code] can define a [Spatial] the pinned " +"vertex will be attached to." +msgstr "" + +#: doc/classes/SoftBody.xml +msgid "" +"The physics layers this SoftBody is in.\n" +"Collidable objects can exist in any of 32 different layers. These layers " +"work like a tagging system, and are not visual. A collidable can use these " +"layers to select with which objects it can collide, using the collision_mask " +"property.\n" +"A contact is detected if object A is in any of the layers that object B " +"scans, or object B is in any layer scanned by object A. See [url=$DOCS_URL/" +"tutorials/physics/physics_introduction.html#collision-layers-and-" +"masks]Collision layers and masks[/url] in the documentation for more " +"information." +msgstr "" + +#: doc/classes/SoftBody.xml +msgid "" +"The physics layers this SoftBody scans for collisions. See [url=$DOCS_URL/" +"tutorials/physics/physics_introduction.html#collision-layers-and-" +"masks]Collision layers and masks[/url] in the documentation for more " +"information." +msgstr "" + +#: doc/classes/SoftBody.xml +msgid "[NodePath] to a [CollisionObject] this SoftBody should avoid clipping." +msgstr "" + +#: doc/classes/SoftBody.xml +msgid "" +"If [code]true[/code], the [SoftBody] is simulated in physics. Can be set to " +"[code]false[/code] to pause the physics simulation." +msgstr "" + +#: doc/classes/SoftBody.xml +msgid "If [code]true[/code], the [SoftBody] will respond to [RayCast]s." +msgstr "" + +#: doc/classes/SoftBody.xml +msgid "" +"Increasing this value will improve the resulting simulation, but can affect " +"performance. Use with care." +msgstr "" + +#: doc/classes/SoftBody.xml +msgid "The SoftBody's mass." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "Most basic 3D game object, parent of all 3D-related nodes." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Most basic 3D game object, with a 3D [Transform] and visibility settings. " +"All other 3D game objects inherit from Spatial. Use [Spatial] as a parent " +"node to move, scale, rotate and show/hide children in a 3D project.\n" +"Affine operations (rotate, scale, translate) happen in parent's local " +"coordinate system, unless the [Spatial] object is set as top-level. Affine " +"operations in this coordinate system correspond to direct affine operations " +"on the [Spatial]'s transform. The word local below refers to this coordinate " +"system. The coordinate system that is attached to the [Spatial] object " +"itself is referred to as object-local coordinate system.\n" +"[b]Note:[/b] Unless otherwise specified, all methods that have angle " +"parameters must have angles specified as [i]radians[/i]. To convert degrees " +"to radians, use [method @GDScript.deg2rad]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "Introduction to 3D" +msgstr "" + +#: doc/classes/Spatial.xml doc/classes/Vector3.xml +msgid "All 3D Demos" +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"When using physics interpolation, there will be circumstances in which you " +"want to know the interpolated (displayed) transform of a node rather than " +"the standard transform (which may only be accurate to the most recent " +"physics tick).\n" +"This is particularly important for frame-based operations that take place in " +"[method Node._process], rather than [method Node._physics_process]. Examples " +"include [Camera]s focusing on a node, or finding where to fire lasers from " +"on a frame rather than physics tick." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Returns the parent [Spatial], or an empty [Object] if no parent exists or " +"parent is not of type [Spatial]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Returns the current [World] resource this [Spatial] node is registered to." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Rotates the global (world) transformation around axis, a unit [Vector3], by " +"specified angle in radians. The rotation axis is in global coordinate system." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Scales the global (world) transformation by the given [Vector3] scale " +"factors." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Moves the global (world) transformation by [Vector3] offset. The offset is " +"in global coordinate system." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Disables rendering of this node. Changes [member visible] to [code]false[/" +"code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Returns whether node notifies about its local transformation changes. " +"[Spatial] will not propagate this by default." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Returns whether this node uses a scale of [code](1, 1, 1)[/code] or its " +"local transformation scale." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Returns whether this node is set as Toplevel, that is whether it ignores its " +"parent nodes transformations." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Returns whether the node notifies about its global and local transformation " +"changes. [Spatial] will not propagate this by default." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Rotates the node so that the local forward axis (-Z) points toward the " +"[code]target[/code] position.\n" +"The local up axis (+Y) points as close to the [code]up[/code] vector as " +"possible while staying perpendicular to the local forward axis. The " +"resulting transform is orthogonal, and the scale is preserved. Non-uniform " +"scaling may not work correctly.\n" +"The [code]target[/code] position cannot be the same as the node's position, " +"the [code]up[/code] vector cannot be zero, and the direction from the node's " +"position to the [code]target[/code] vector cannot be parallel to the " +"[code]up[/code] vector.\n" +"Operations take place in global space." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Moves the node to the specified [code]position[/code], and then rotates " +"itself to point toward the [code]target[/code] as per [method look_at]. " +"Operations take place in global space." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Resets this node's transformations (like scale, skew and taper) preserving " +"its rotation and translation by performing Gram-Schmidt orthonormalization " +"on this node's [Transform]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Rotates the local transformation around axis, a unit [Vector3], by specified " +"angle in radians." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Rotates the local transformation around axis, a unit [Vector3], by specified " +"angle in radians. The rotation axis is in object-local coordinate system." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "Rotates the local transformation around the X axis by angle in radians." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "Rotates the local transformation around the Y axis by angle in radians." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "Rotates the local transformation around the Z axis by angle in radians." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Scales the local transformation by given 3D scale factors in object-local " +"coordinate system." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Makes the node ignore its parents transformations. Node transformations are " +"only in global space." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Sets whether the node uses a scale of [code](1, 1, 1)[/code] or its local " +"transformation scale. Changes to the local transformation scale are " +"preserved." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Reset all transformations for this node (sets its [Transform] to the " +"identity matrix)." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Sets whether the node ignores notification that its transformation (global " +"or local) changed." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Sets whether the node notifies about its local transformation changes. " +"[Spatial] will not propagate this by default." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Sets whether the node notifies about its global and local transformation " +"changes. [Spatial] will not propagate this by default, unless it is in the " +"editor context and it has a valid gizmo." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Enables rendering of this node. Changes [member visible] to [code]true[/" +"code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Transforms [code]local_point[/code] from this node's local space to world " +"space." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Transforms [code]global_point[/code] from world space to this node's local " +"space." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Changes the node's position by the given offset [Vector3].\n" +"Note that the translation [code]offset[/code] is affected by the node's " +"scale, so if scaled by e.g. [code](10, 1, 1)[/code], a translation by an " +"offset of [code](2, 0, 0)[/code] would actually add 20 ([code]2 * 10[/code]) " +"to the X coordinate." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Changes the node's position by the given offset [Vector3] in local space." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "Updates the [SpatialGizmo] of this node." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"The [SpatialGizmo] for this node. Used for example in [EditorSpatialGizmo] " +"as custom visualization and editing handles in Editor." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Rotation part of the global transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "World space (global) [Transform] of this node." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Global position of this node. This is equivalent to [code]global_transform." +"origin[/code]." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Rotation part of the local transformation in radians, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation " +"\"vector\" is not meaningful." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Rotation part of the local transformation in degrees, specified in terms of " +"YXZ-Euler angles in the format (X angle, Y angle, Z angle)." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Scale part of the local transformation.\n" +"[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " +"transformation matrix. Due to the way scale is represented with " +"transformation matrices in Godot, the scale values will either be all " +"positive or all negative." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "Local space [Transform] of this node, with respect to the parent node." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "Local translation of this node." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"If [code]true[/code], this node is drawn. The node is only visible if all of " +"its antecedents are visible as well (in other words, [method " +"is_visible_in_tree] must return [code]true[/code])." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Emitted by portal system gameplay monitor when a node enters the gameplay " +"area." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Emitted by portal system gameplay monitor when a node exits the gameplay " +"area." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "Emitted when node visibility changes." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Spatial nodes receives this notification when their global transform " +"changes. This means that either the current or a parent node changed its " +"transform.\n" +"In order for [constant NOTIFICATION_TRANSFORM_CHANGED] to work, users first " +"need to ask for it, with [method set_notify_transform]. The notification is " +"also sent if the node is in the editor context and it has a valid gizmo." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Spatial nodes receives this notification when they are registered to new " +"[World] resource." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Spatial nodes receives this notification when they are unregistered from " +"current [World] resource." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "Spatial nodes receives this notification when their visibility changes." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Spatial nodes receives this notification if the portal system gameplay " +"monitor detects they have entered the gameplay area." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" +"Spatial nodes receives this notification if the portal system gameplay " +"monitor detects they have exited the gameplay area." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Default 3D rendering material." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"This provides a default material with a wide variety of rendering features " +"and properties without the need to write shader code. See the tutorial below " +"for details." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Returns [code]true[/code], if the specified [enum Feature] is enabled." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Returns [code]true[/code], if the specified flag is enabled. See [enum " +"Flags] enumerator for options." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Returns the [Texture] associated with the specified [enum TextureParam]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], enables the specified [enum Feature]. Many features " +"that are available in [SpatialMaterial]s need to be enabled before use. This " +"way the cost for using the feature is only incurred when specified. Features " +"can also be enabled by setting the corresponding member to [code]true[/code]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], enables the specified flag. Flags are optional " +"behavior that can be turned on and off. Only one flag can be enabled at a " +"time with this function, the flag enumerators cannot be bit-masked together " +"to enable or disable multiple flags at once. Flags can also be enabled by " +"setting the corresponding member to [code]true[/code]. See [enum Flags] " +"enumerator for options." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Sets the [Texture] to be used by the specified [enum TextureParam]. This " +"function is called when setting members ending in [code]*_texture[/code]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "The material's base color." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Texture to multiply by [member albedo_color]. Used for basic texturing of " +"objects." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"The strength of the anisotropy effect. This is multiplied by [member " +"anisotropy_flowmap]'s alpha channel if a texture is defined there and the " +"texture contains an alpha channel." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], anisotropy is enabled. Anisotropy changes the shape of " +"the specular blob and aligns it to tangent space. This is useful for brushed " +"aluminium and hair reflections.\n" +"[b]Note:[/b] Mesh tangents are needed for anisotropy to work. If the mesh " +"does not contain tangents, the anisotropy effect will appear broken.\n" +"[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " +"texture filtering. Anisotropic texture filtering can be enabled by selecting " +"a texture in the FileSystem dock, going to the Import dock, checking the " +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Texture that offsets the tangent map for anisotropy calculations and " +"optionally controls the anisotropy effect (if an alpha channel is present). " +"The flowmap texture is expected to be a derivative map, with the red channel " +"representing distortion on the X axis and green channel representing " +"distortion on the Y axis. Values below 0.5 will result in negative " +"distortion, whereas values above 0.5 will result in positive distortion.\n" +"If present, the texture's alpha channel will be used to multiply the " +"strength of the [member anisotropy] effect. Fully opaque pixels will keep " +"the anisotropy effect's original strength while fully transparent pixels " +"will disable the anisotropy effect entirely. The flowmap texture's blue " +"channel is ignored." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], ambient occlusion is enabled. Ambient occlusion " +"darkens areas based on the [member ao_texture]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Amount that ambient occlusion affects lighting from lights. If [code]0[/" +"code], ambient occlusion only affects ambient light. If [code]1[/code], " +"ambient occlusion affects lights just as much as it affects ambient light. " +"This can be used to impact the strength of the ambient occlusion effect, but " +"typically looks unrealistic." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], use [code]UV2[/code] coordinates to look up from the " +"[member ao_texture]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Texture that defines the amount of ambient occlusion for a given point on " +"the object." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Specifies the channel of the [member ao_texture] in which the ambient " +"occlusion information is stored. This is useful when you store the " +"information for multiple effects in a single texture. For example if you " +"stored metallic in the red channel, roughness in the blue, and ambient " +"occlusion in the green you could reduce the number of textures you use." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [member ProjectSettings.rendering/gles3/shaders/shader_compilation_mode] " +"is [code]Synchronous[/code] (with or without cache), this determines how " +"this material must behave in regards to asynchronous shader compilation.\n" +"[constant ASYNC_MODE_VISIBLE] is the default and the best for most cases." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Sets the strength of the clearcoat effect. Setting to [code]0[/code] looks " +"the same as disabling the clearcoat effect." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], clearcoat rendering is enabled. Adds a secondary " +"transparent pass to the lighting calculation resulting in an added specular " +"blob. This makes materials appear as if they have a clear layer on them that " +"can be either glossy or rough.\n" +"[b]Note:[/b] Clearcoat rendering is not visible if the material has [member " +"flags_unshaded] set to [code]true[/code]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Sets the roughness of the clearcoat pass. A higher value results in a " +"smoother clearcoat while a lower value results in a rougher clearcoat." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Texture that defines the strength of the clearcoat effect and the glossiness " +"of the clearcoat. Strength is specified in the red channel while glossiness " +"is specified in the green channel." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], the shader will read depth texture at multiple points " +"along the view ray to determine occlusion and parrallax. This can be very " +"performance demanding, but results in more realistic looking depth mapping." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], depth mapping is enabled (also called \"parallax " +"mapping\" or \"height mapping\"). See also [member normal_enabled].\n" +"[b]Note:[/b] Depth mapping is not supported if triplanar mapping is used on " +"the same material. The value of [member depth_enabled] will be ignored if " +"[member uv1_triplanar] is enabled." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], direction of the binormal is flipped before using in " +"the depth effect. This may be necessary if you have encoded your binormals " +"in a way that is conflicting with the depth effect." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], direction of the tangent is flipped before using in " +"the depth effect. This may be necessary if you have encoded your tangents in " +"a way that is conflicting with the depth effect." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Number of layers to use when using [member depth_deep_parallax] and the view " +"direction is perpendicular to the surface of the object. A higher number " +"will be more performance demanding while a lower number may not look as " +"crisp." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Number of layers to use when using [member depth_deep_parallax] and the view " +"direction is parallel to the surface of the object. A higher number will be " +"more performance demanding while a lower number may not look as crisp." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Scales the depth offset effect. A higher number will create a larger depth." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Texture used to determine depth at a given pixel. Depth is always stored in " +"the red channel." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Texture that specifies the color of the detail overlay." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Specifies how the [member detail_albedo] should blend with the current " +"[code]ALBEDO[/code]. See [enum BlendMode] for options." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], enables the detail overlay. Detail is a second texture " +"that gets mixed over the surface of the object based on [member " +"detail_mask]. This can be used to add variation to objects, or to blend " +"between two different albedo/normal textures." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Texture used to specify how the detail textures get blended with the base " +"textures." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Texture that specifies the per-pixel normal of the detail overlay.\n" +"[b]Note:[/b] Godot expects the normal map to use X+, Y+, and Z+ coordinates. " +"See [url=http://wiki.polycount.com/wiki/" +"Normal_Map_Technical_Details#Common_Swizzle_Coordinates]this page[/url] for " +"a comparison of normal map coordinates expected by popular engines." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Specifies whether to use [code]UV[/code] or [code]UV2[/code] for the detail " +"layer. See [enum DetailUV] for options." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Distance at which the object appears fully opaque.\n" +"[b]Note:[/b] If [code]distance_fade_max_distance[/code] is less than " +"[code]distance_fade_min_distance[/code], the behavior will be reversed. The " +"object will start to fade away at [code]distance_fade_max_distance[/code] " +"and will fully disappear once it reaches [code]distance_fade_min_distance[/" +"code]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Distance at which the object starts to become visible. If the object is less " +"than this distance away, it will be invisible.\n" +"[b]Note:[/b] If [code]distance_fade_min_distance[/code] is greater than " +"[code]distance_fade_max_distance[/code], the behavior will be reversed. The " +"object will start to fade away at [code]distance_fade_max_distance[/code] " +"and will fully disappear once it reaches [code]distance_fade_min_distance[/" +"code]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Specifies which type of fade to use. Can be any of the [enum " +"DistanceFadeMode]s." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "The emitted light's color. See [member emission_enabled]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], the body emits light. Emitting light makes the object " +"appear brighter. The object can also cast light on other objects if a " +"[GIProbe] or [BakedLightmap] is used and this object is used in baked " +"lighting." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "The emitted light's strength. See [member emission_enabled]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Use [code]UV2[/code] to read from the [member emission_texture]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Sets how [member emission] interacts with [member emission_texture]. Can " +"either add or multiply. See [enum EmissionOperator] for options." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Texture that specifies how much surface emits light at a given point." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Forces a conversion of the [member albedo_texture] from sRGB space to linear " +"space." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Enables signed distance field rendering shader." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "If [code]true[/code], the object receives no ambient light." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], the object receives no shadow that would otherwise be " +"cast onto it." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], the shader will compute extra operations to make sure " +"the normal stays correct when using a non-uniform scale. Only enable if " +"using non-uniform scaling." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], the object is rendered at the same size regardless of " +"distance." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], transparency is enabled on the body. See also [member " +"params_blend_mode]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "If [code]true[/code], the object is unaffected by lighting." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], render point size can be changed.\n" +"[b]Note:[/b] This is only effective for objects whose geometry is point-" +"based rather than triangle-based. See also [member params_point_size]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], enables the \"shadow to opacity\" render mode where " +"lighting modifies the alpha so shadowed areas are opaque and non-shadowed " +"areas are transparent. Useful for overlaying shadows onto a camera feed in " +"AR." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], lighting is calculated per vertex rather than per " +"pixel. This may increase performance on low-end devices, especially for " +"meshes with a lower polygon count. The downside is that shading becomes much " +"less accurate, with visible linear interpolation between vertices that are " +"joined together. This can be compensated by ensuring meshes have a " +"sufficient level of subdivision (but not too much, to avoid reducing " +"performance). Some material features are also not supported when vertex " +"shading is enabled.\n" +"See also [member ProjectSettings.rendering/quality/shading/" +"force_vertex_shading] which can globally enable vertex shading on all " +"materials.\n" +"[b]Note:[/b] By default, vertex shading is enforced on mobile platforms by " +"[member ProjectSettings.rendering/quality/shading/force_vertex_shading]'s " +"[code]mobile[/code] override.\n" +"[b]Note:[/b] [member flags_vertex_lighting] has no effect if [member " +"flags_unshaded] is [code]true[/code]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], triplanar mapping is calculated in world space rather " +"than object local space. See also [member uv1_triplanar]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"A high value makes the material appear more like a metal. Non-metals use " +"their albedo as the diffuse color and add diffuse to the specular " +"reflection. With non-metals, the reflection appears on top of the albedo " +"color. Metals use their albedo as a multiplier to the specular reflection " +"and set the diffuse color to black resulting in a tinted reflection. " +"Materials work better when fully metal or fully non-metal, values between " +"[code]0[/code] and [code]1[/code] should only be used for blending between " +"metal and non-metal sections. To alter the amount of reflection use [member " +"roughness]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Sets the size of the specular lobe. The specular lobe is the bright spot " +"that is reflected from light sources.\n" +"[b]Note:[/b] Unlike [member metallic], this is not energy-conserving, so it " +"should be left at [code]0.5[/code] in most cases. See also [member " +"roughness]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Texture used to specify metallic for an object. This is multiplied by " +"[member metallic]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Specifies the channel of the [member metallic_texture] in which the metallic " +"information is stored. This is useful when you store the information for " +"multiple effects in a single texture. For example if you stored metallic in " +"the red channel, roughness in the blue, and ambient occlusion in the green " +"you could reduce the number of textures you use." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "If [code]true[/code], normal mapping is enabled." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "The strength of the normal map's effect." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Texture used to specify the normal at a given pixel. The " +"[code]normal_texture[/code] only uses the red and green channels; the blue " +"and alpha channels are ignored. The normal read from [code]normal_texture[/" +"code] is oriented around the surface normal provided by the [Mesh].\n" +"[b]Note:[/b] The mesh must have both normals and tangents defined in its " +"vertex data. Otherwise, the normal map won't render correctly and will only " +"appear to darken the whole surface. If creating geometry with [SurfaceTool], " +"you can use [method SurfaceTool.generate_normals] and [method SurfaceTool." +"generate_tangents] to automatically generate normals and tangents " +"respectively.\n" +"[b]Note:[/b] Godot expects the normal map to use X+, Y+, and Z+ coordinates. " +"See [url=http://wiki.polycount.com/wiki/" +"Normal_Map_Technical_Details#Common_Swizzle_Coordinates]this page[/url] for " +"a comparison of normal map coordinates expected by popular engines." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], the shader will keep the scale set for the mesh. " +"Otherwise the scale is lost when billboarding. Only applies when [member " +"params_billboard_mode] is [constant BILLBOARD_ENABLED]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Controls how the object faces the camera. See [enum BillboardMode].\n" +"[b]Note:[/b] Billboard mode is not suitable for VR because the left-right " +"vector of the camera is not horizontal when the screen is attached to your " +"head instead of on the table. See [url=https://github.com/godotengine/godot/" +"issues/41567]GitHub issue #41567[/url] for details." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"The material's blend mode.\n" +"[b]Note:[/b] Values other than [code]Mix[/code] force the object into the " +"transparent pipeline. See [enum BlendMode]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Which side of the object is not drawn when backfaces are rendered. See [enum " +"CullMode]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Determines when depth rendering takes place. See [enum DepthDrawMode]. See " +"also [member flags_transparent]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"The algorithm used for diffuse light scattering. See [enum DiffuseMode]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], enables the vertex grow setting. See [member " +"params_grow_amount]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Grows object vertices in the direction of their normals." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Currently unimplemented in Godot." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "The point size in pixels. See [member flags_use_point_size]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "The method for rendering the specular blob. See [enum SpecularMode]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], the shader will discard all pixels that have an alpha " +"value less than [member params_alpha_scissor_threshold]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"The number of horizontal frames in the particle sprite sheet. Only enabled " +"when using [constant BILLBOARD_PARTICLES]. See [member " +"params_billboard_mode]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], particle animations are looped. Only enabled when " +"using [constant BILLBOARD_PARTICLES]. See [member params_billboard_mode]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"The number of vertical frames in the particle sprite sheet. Only enabled " +"when using [constant BILLBOARD_PARTICLES]. See [member " +"params_billboard_mode]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Distance over which the fade effect takes place. The larger the distance the " +"longer it takes for an object to fade." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], the proximity fade effect is enabled. The proximity " +"fade effect fades out each pixel based on its distance to another object." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], the refraction effect is enabled. Refraction distorts " +"transparency based on light from behind the object. When using the GLES3 " +"backend, the material's roughness value will affect the blurriness of the " +"refraction. Higher roughness values will make the refraction look blurrier." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"The strength of the refraction effect. Higher values result in a more " +"distorted appearance for the refraction." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Texture that controls the strength of the refraction per-pixel. Multiplied " +"by [member refraction_scale]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Specifies the channel of the [member refraction_texture] in which the " +"refraction information is stored. This is useful when you store the " +"information for multiple effects in a single texture. For example if you " +"stored metallic in the red channel, roughness in the blue, and ambient " +"occlusion in the green you could reduce the number of textures you use." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Sets the strength of the rim lighting effect." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], rim effect is enabled. Rim lighting increases the " +"brightness at glancing angles on an object.\n" +"[b]Note:[/b] Rim lighting is not visible if the material has [member " +"flags_unshaded] set to [code]true[/code]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Texture used to set the strength of the rim lighting effect per-pixel. " +"Multiplied by [member rim]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"The amount of to blend light and albedo color when rendering rim effect. If " +"[code]0[/code] the light color is used, while [code]1[/code] means albedo " +"color is used. An intermediate value generally works best." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Surface reflection. A value of [code]0[/code] represents a perfect mirror " +"while a value of [code]1[/code] completely blurs the reflection. See also " +"[member metallic]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Texture used to control the roughness per-pixel. Multiplied by [member " +"roughness]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], subsurface scattering is enabled. Emulates light that " +"penetrates an object's surface, is scattered, and then emerges." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "The strength of the subsurface scattering effect." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Texture used to control the subsurface scattering strength. Stored in the " +"red texture channel. Multiplied by [member subsurf_scatter_strength]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"The color used by the transmission effect. Represents the light passing " +"through an object." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "If [code]true[/code], the transmission effect is enabled." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Texture used to control the transmission effect per-pixel. Added to [member " +"transmission]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"How much to offset the [code]UV[/code] coordinates. This amount will be " +"added to [code]UV[/code] in the vertex function. This can be used to offset " +"a texture." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"How much to scale the [code]UV[/code] coordinates. This is multiplied by " +"[code]UV[/code] in the vertex function." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], instead of using [code]UV[/code] textures will use a " +"triplanar texture lookup to determine how to apply textures. Triplanar uses " +"the orientation of the object's surface to blend between texture " +"coordinates. It reads from the source texture 3 times, once for each axis " +"and then blends between the results based on how closely the pixel aligns " +"with each axis. This is often used for natural features to get a realistic " +"blend of materials. Because triplanar texturing requires many more texture " +"reads per-pixel it is much slower than normal UV texturing. Additionally, " +"because it is blending the texture between the three axes, it is unsuitable " +"when you are trying to achieve crisp texturing." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"A lower number blends the texture more softly while a higher number blends " +"the texture more sharply." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"How much to offset the [code]UV2[/code] coordinates. This amount will be " +"added to [code]UV2[/code] in the vertex function. This can be used to offset " +"a texture." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"How much to scale the [code]UV2[/code] coordinates. This is multiplied by " +"[code]UV2[/code] in the vertex function." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], instead of using [code]UV2[/code] textures will use a " +"triplanar texture lookup to determine how to apply textures. Triplanar uses " +"the orientation of the object's surface to blend between texture " +"coordinates. It reads from the source texture 3 times, once for each axis " +"and then blends between the results based on how closely the pixel aligns " +"with each axis. This is often used for natural features to get a realistic " +"blend of materials. Because triplanar texturing requires many more texture " +"reads per-pixel it is much slower than normal UV texturing. Additionally, " +"because it is blending the texture between the three axes, it is unsuitable " +"when you are trying to achieve crisp texturing." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"If [code]true[/code], the model's vertex colors are processed as sRGB mode." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "If [code]true[/code], the vertex color is used as albedo color." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Texture specifying per-pixel color." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Texture specifying per-pixel metallic value." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Texture specifying per-pixel roughness value." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Texture specifying per-pixel emission color." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Texture specifying per-pixel normal vector." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Texture specifying per-pixel rim value." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Texture specifying per-pixel clearcoat value." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Texture specifying per-pixel flowmap direction for use with [member " +"anisotropy]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Texture specifying per-pixel ambient occlusion value." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Texture specifying per-pixel depth." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Texture specifying per-pixel subsurface scattering." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Texture specifying per-pixel transmission color." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Texture specifying per-pixel refraction strength." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Texture specifying per-pixel detail mask blending value." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Texture specifying per-pixel detail color." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Texture specifying per-pixel detail normal." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Represents the size of the [enum TextureParam] enum." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Use [code]UV[/code] with the detail texture." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Use [code]UV2[/code] with the detail texture." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Constant for setting [member flags_transparent]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Constant for setting [member emission_enabled]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Constant for setting [member normal_enabled]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Constant for setting [member rim_enabled]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Constant for setting [member clearcoat_enabled]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Constant for setting [member anisotropy_enabled]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Constant for setting [member ao_enabled]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Constant for setting [member depth_enabled]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Constant for setting [member subsurf_scatter_enabled]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Constant for setting [member transmission_enabled]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Constant for setting [member refraction_enabled]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Constant for setting [member detail_enabled]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Default blend mode. The color of the object is blended over the background " +"based on the object's alpha value." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "The color of the object is added to the background." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "The color of the object is subtracted from the background." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "The color of the object is multiplied by the background." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Default depth draw mode. Depth is drawn only for opaque objects." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Depth draw is calculated for both opaque and transparent objects." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "No depth draw." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"For transparent objects, an opaque pass is made first with the opaque parts, " +"then transparency is drawn." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Default cull mode. The back of the object is culled when not visible." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "The front of the object is culled when not visible." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "No culling is performed." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"No lighting is used on the object. Color comes directly from [code]ALBEDO[/" +"code]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Lighting is calculated per-vertex rather than per-pixel. This can be used to " +"increase the speed of the shader at the cost of quality." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Set [code]ALBEDO[/code] to the per-vertex color specified in the mesh." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Vertex color is in sRGB space and needs to be converted to linear. Only " +"applies in the GLES3 renderer." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Uses point size to alter the size of primitive points. Also changes the " +"albedo texture lookup to use [code]POINT_COORD[/code] instead of [code]UV[/" +"code]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Object is scaled by depth so that it always appears the same size on screen." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Shader will keep the scale set for the mesh. Otherwise the scale is lost " +"when billboarding. Only applies when [member params_billboard_mode] is " +"[constant BILLBOARD_ENABLED]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Use triplanar texture lookup for all texture lookups that would normally use " +"[code]UV[/code]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Use triplanar texture lookup for all texture lookups that would normally use " +"[code]UV2[/code]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Use [code]UV2[/code] coordinates to look up from the [member ao_texture]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Use [code]UV2[/code] coordinates to look up from the [member " +"emission_texture]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Use alpha scissor. Set by [member params_use_alpha_scissor]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Use world coordinates in the triplanar texture lookup instead of local " +"coordinates." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Forces the shader to convert albedo from sRGB space to linear space." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Disables receiving shadows from other objects." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Disables receiving ambient light." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Ensures that normals appear correct, even with non-uniform scaling." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Enables the shadow to opacity feature." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Default diffuse scattering algorithm." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Diffuse scattering ignores roughness." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Extends Lambert to cover more than 90 degrees when roughness increases." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Attempts to use roughness to emulate microsurfacing." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Uses a hard cut for lighting, with smoothing affected by roughness." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Default specular blob." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Older specular algorithm, included for compatibility." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Toon blob which changes size based on roughness." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "No specular blob." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Billboard mode is disabled." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "The object's Z axis will always face the camera." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "The object's X axis will always face the camera." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Used for particle systems when assigned to [Particles] and [CPUParticles] " +"nodes. Enables [code]particles_anim_*[/code] properties.\n" +"The [member ParticlesMaterial.anim_speed] or [member CPUParticles." +"anim_speed] should also be set to a positive value for the animation to play." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Used to read from the red channel of a texture." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Used to read from the green channel of a texture." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Used to read from the blue channel of a texture." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Used to read from the alpha channel of a texture." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Adds the emission color to the color from the emission texture." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Multiplies the emission color by the color from the emission texture." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "Do not use distance fade." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Smoothly fades the object out based on each pixel's distance from the camera " +"using the alpha channel." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Smoothly fades the object out based on each pixel's distance from the camera " +"using a dither approach. Dithering discards pixels based on a set pattern to " +"smoothly fade without enabling transparency. On certain hardware this can be " +"faster than [constant DISTANCE_FADE_PIXEL_ALPHA]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Smoothly fades the object out based on the object's distance from the camera " +"using a dither approach. Dithering discards pixels based on a set pattern to " +"smoothly fade without enabling transparency. On certain hardware this can be " +"faster than [constant DISTANCE_FADE_PIXEL_ALPHA]." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"The real conditioned shader needed on each situation will be sent for " +"background compilation. In the meantime, a very complex shader that adapts " +"to every situation will be used (\"ubershader\"). This ubershader is much " +"slower to render, but will keep the game running without stalling to " +"compile. Once shader compilation is done, the ubershader is replaced by the " +"traditional optimized shader." +msgstr "" + +#: doc/classes/SpatialMaterial.xml +msgid "" +"Anything with this material applied won't be rendered while this material's " +"shader is being compiled.\n" +"This is useful for optimization, in cases where the visuals won't suffer " +"from having certain non-essential elements missing during the short time " +"their shaders are being compiled." +msgstr "" + +#: doc/classes/SphereMesh.xml +msgid "Class representing a spherical [PrimitiveMesh]." +msgstr "" + +#: doc/classes/SphereMesh.xml +msgid "Full height of the sphere." +msgstr "" + +#: doc/classes/SphereMesh.xml +msgid "" +"If [code]true[/code], a hemisphere is created rather than a full sphere.\n" +"[b]Note:[/b] To get a regular hemisphere, the height and radius of the " +"sphere must be equal." +msgstr "" + +#: doc/classes/SphereMesh.xml +msgid "Number of radial segments on the sphere." +msgstr "" + +#: doc/classes/SphereMesh.xml +msgid "Radius of sphere." +msgstr "" + +#: doc/classes/SphereMesh.xml +msgid "Number of segments along the height of the sphere." +msgstr "" + +#: doc/classes/SphereShape.xml +msgid "Sphere shape for 3D collisions." +msgstr "" + +#: doc/classes/SphereShape.xml +msgid "" +"Sphere shape for 3D collisions, which can be set into a [PhysicsBody] or " +"[Area]. This shape is useful for modeling sphere-like 3D objects." +msgstr "" + +#: doc/classes/SphereShape.xml +msgid "The sphere's radius. The shape's diameter is double the radius." +msgstr "" + +#: doc/classes/SpinBox.xml +msgid "Numerical input text field." +msgstr "" + +#: doc/classes/SpinBox.xml +msgid "" +"SpinBox is a numerical input text field. It allows entering integers and " +"floats.\n" +"[b]Example:[/b]\n" +"[codeblock]\n" +"var spin_box = SpinBox.new()\n" +"add_child(spin_box)\n" +"var line_edit = spin_box.get_line_edit()\n" +"line_edit.context_menu_enabled = false\n" +"spin_box.align = LineEdit.ALIGN_RIGHT\n" +"[/codeblock]\n" +"The above code will create a [SpinBox], disable context menu on it and set " +"the text alignment to right.\n" +"See [Range] class for more options over the [SpinBox].\n" +"[b]Note:[/b] [SpinBox] relies on an underlying [LineEdit] node. To theme a " +"[SpinBox]'s background, add theme items for [LineEdit] and customize them.\n" +"[b]Note:[/b] If you want to implement drag and drop for the underlying " +"[LineEdit], you can use [method Control.set_drag_forwarding] on the node " +"returned by [method get_line_edit]." +msgstr "" + +#: doc/classes/SpinBox.xml +msgid "Applies the current value of this [SpinBox]." +msgstr "" + +#: doc/classes/SpinBox.xml +msgid "" +"Returns the [LineEdit] instance from this [SpinBox]. You can use it to " +"access properties and methods of [LineEdit].\n" +"[b]Warning:[/b] This is a required internal node, removing and freeing it " +"may cause a crash. If you wish to hide it or any of its children, use their " +"[member CanvasItem.visible] property." +msgstr "" + +#: doc/classes/SpinBox.xml +msgid "Sets the text alignment of the [SpinBox]." +msgstr "" + +#: doc/classes/SpinBox.xml +msgid "" +"If [code]true[/code], the [SpinBox] will be editable. Otherwise, it will be " +"read only." +msgstr "" + +#: doc/classes/SpinBox.xml +msgid "" +"Adds the specified [code]prefix[/code] string before the numerical value of " +"the [SpinBox]." +msgstr "" + +#: doc/classes/SpinBox.xml +msgid "" +"Adds the specified [code]suffix[/code] string after the numerical value of " +"the [SpinBox]." +msgstr "" + +#: doc/classes/SpinBox.xml +msgid "Sets a custom [Texture] for up and down arrows of the [SpinBox]." +msgstr "" + +#: doc/classes/SplitContainer.xml +msgid "Container for splitting and adjusting." +msgstr "" + +#: doc/classes/SplitContainer.xml +msgid "" +"Container for splitting two [Control]s vertically or horizontally, with a " +"grabber that allows adjusting the split offset or ratio." +msgstr "" + +#: doc/classes/SplitContainer.xml +msgid "" +"Clamps the [member split_offset] value to not go outside the currently " +"possible minimal and maximum values." +msgstr "" + +#: doc/classes/SplitContainer.xml +msgid "" +"If [code]true[/code], the area of the first [Control] will be collapsed and " +"the dragger will be disabled." +msgstr "" + +#: doc/classes/SplitContainer.xml +msgid "" +"Determines the dragger's visibility. See [enum DraggerVisibility] for " +"details." +msgstr "" + +#: doc/classes/SplitContainer.xml +msgid "" +"The initial offset of the splitting between the two [Control]s, with " +"[code]0[/code] being at the end of the first [Control]." +msgstr "" + +#: doc/classes/SplitContainer.xml +msgid "Emitted when the dragger is dragged by user." +msgstr "" + +#: doc/classes/SplitContainer.xml +msgid "The split dragger is visible when the cursor hovers it." +msgstr "" + +#: doc/classes/SplitContainer.xml +msgid "The split dragger is never visible." +msgstr "" + +#: doc/classes/SplitContainer.xml +msgid "The split dragger is never visible and its space collapsed." +msgstr "" + +#: doc/classes/SpotLight.xml +msgid "A spotlight, such as a reflector spotlight or a lantern." +msgstr "" + +#: doc/classes/SpotLight.xml +msgid "" +"A Spotlight is a type of [Light] node that emits lights in a specific " +"direction, in the shape of a cone. The light is attenuated through the " +"distance. This attenuation can be configured by changing the energy, radius " +"and attenuation parameters of [Light].\n" +"[b]Note:[/b] By default, only 32 SpotLights may affect a single mesh " +"[i]resource[/i] at once. Consider splitting your level into several meshes " +"to decrease the likelihood that more than 32 lights will affect the same " +"mesh resource. Splitting the level mesh will also improve frustum culling " +"effectiveness, leading to greater performance. If you need to use more " +"lights per mesh, you can increase [member ProjectSettings.rendering/limits/" +"rendering/max_lights_per_object] at the cost of shader compilation times." +msgstr "" + +#: doc/classes/SpotLight.xml +msgid "The spotlight's angle in degrees." +msgstr "" + +#: doc/classes/SpotLight.xml +msgid "The spotlight's angular attenuation curve." +msgstr "" + +#: doc/classes/SpotLight.xml +msgid "The spotlight's light energy attenuation curve." +msgstr "" + +#: doc/classes/SpotLight.xml +msgid "" +"The maximal range that can be reached by the spotlight. Note that the " +"effectively lit area may appear to be smaller depending on the [member " +"spot_attenuation] in use. No matter the [member spot_attenuation] in use, " +"the light will never reach anything outside this range." +msgstr "" + +#: doc/classes/SpringArm.xml +msgid "A helper node, mostly used in 3rd person cameras." +msgstr "" + +#: doc/classes/SpringArm.xml +msgid "" +"The SpringArm node is a node that casts a ray (or collision shape) along its " +"z axis and moves all its direct children to the collision point, minus a " +"margin.\n" +"The most common use case for this is to make a 3rd person camera that reacts " +"to collisions in the environment.\n" +"The SpringArm will either cast a ray, or if a shape is given, it will cast " +"the shape in the direction of its z axis.\n" +"If you use the SpringArm as a camera controller for your player, you might " +"need to exclude the player's collider from the SpringArm's collision check." +msgstr "" + +#: doc/classes/SpringArm.xml +msgid "" +"Adds the [PhysicsBody] object with the given [RID] to the list of " +"[PhysicsBody] objects excluded from the collision check." +msgstr "" + +#: doc/classes/SpringArm.xml +msgid "" +"Clears the list of [PhysicsBody] objects excluded from the collision check." +msgstr "" + +#: doc/classes/SpringArm.xml +msgid "Returns the spring arm's current length." +msgstr "" + +#: doc/classes/SpringArm.xml +msgid "" +"Removes the given [RID] from the list of [PhysicsBody] objects excluded from " +"the collision check." +msgstr "" + +#: doc/classes/SpringArm.xml +msgid "" +"The layers against which the collision check shall be done. See " +"[url=$DOCS_URL/tutorials/physics/physics_introduction.html#collision-layers-" +"and-masks]Collision layers and masks[/url] in the documentation for more " +"information." +msgstr "" + +#: doc/classes/SpringArm.xml +msgid "" +"When the collision check is made, a candidate length for the SpringArm is " +"given.\n" +"The margin is then subtracted to this length and the translation is applied " +"to the child objects of the SpringArm.\n" +"This margin is useful for when the SpringArm has a [Camera] as a child node: " +"without the margin, the [Camera] would be placed on the exact point of " +"collision, while with the margin the [Camera] would be placed close to the " +"point of collision." +msgstr "" + +#: doc/classes/SpringArm.xml +msgid "" +"The [Shape] to use for the SpringArm.\n" +"When the shape is set, the SpringArm will cast the [Shape] on its z axis " +"instead of performing a ray cast." +msgstr "" + +#: doc/classes/SpringArm.xml +msgid "" +"The maximum extent of the SpringArm. This is used as a length for both the " +"ray and the shape cast used internally to calculate the desired position of " +"the SpringArm's child nodes.\n" +"To know more about how to perform a shape cast or a ray cast, please consult " +"the [PhysicsDirectSpaceState] documentation." +msgstr "" + +#: doc/classes/Sprite.xml +msgid "General-purpose sprite node." +msgstr "" + +#: doc/classes/Sprite.xml +msgid "" +"A node that displays a 2D texture. The texture displayed can be a region " +"from a larger atlas texture, or a frame from a sprite sheet animation." +msgstr "" + +#: doc/classes/Sprite.xml +msgid "" +"Returns a [Rect2] representing the Sprite's boundary in local coordinates. " +"Can be used to detect if the Sprite was clicked. Example:\n" +"[codeblock]\n" +"func _input(event):\n" +" if event is InputEventMouseButton and event.pressed and event." +"button_index == BUTTON_LEFT:\n" +" if get_rect().has_point(to_local(event.position)):\n" +" print(\"A click!\")\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Sprite.xml +msgid "" +"Returns [code]true[/code], if the pixel at the given position is opaque and " +"[code]false[/code] in other case.\n" +"[b]Note:[/b] It also returns [code]false[/code], if the sprite's texture is " +"[code]null[/code] or if the given position is invalid." +msgstr "" + +#: doc/classes/Sprite.xml +msgid "If [code]true[/code], texture is centered." +msgstr "" + +#: doc/classes/Sprite.xml doc/classes/Sprite3D.xml +msgid "" +"Current frame to display from sprite sheet. [member hframes] or [member " +"vframes] must be greater than 1." +msgstr "" + +#: doc/classes/Sprite.xml doc/classes/Sprite3D.xml +msgid "" +"Coordinates of the frame to display from sprite sheet. This is as an alias " +"for the [member frame] property. [member hframes] or [member vframes] must " +"be greater than 1." +msgstr "" + +#: doc/classes/Sprite.xml doc/classes/Sprite3D.xml +msgid "The number of columns in the sprite sheet." +msgstr "" + +#: doc/classes/Sprite.xml +msgid "" +"The normal map gives depth to the Sprite.\n" +"[b]Note:[/b] Godot expects the normal map to use X+, Y-, and Z+ coordinates. " +"See [url=http://wiki.polycount.com/wiki/" +"Normal_Map_Technical_Details#Common_Swizzle_Coordinates]this page[/url] for " +"a comparison of normal map coordinates expected by popular engines." +msgstr "" + +#: doc/classes/Sprite.xml +msgid "" +"If [code]true[/code], texture is cut from a larger atlas texture. See " +"[member region_rect]." +msgstr "" + +#: doc/classes/Sprite.xml +msgid "If [code]true[/code], the outermost pixels get blurred out." +msgstr "" + +#: doc/classes/Sprite.xml doc/classes/Sprite3D.xml +msgid "" +"The region of the atlas texture to display. [member region_enabled] must be " +"[code]true[/code]." +msgstr "" + +#: doc/classes/Sprite.xml +msgid "[Texture] object to draw." +msgstr "" + +#: doc/classes/Sprite.xml doc/classes/Sprite3D.xml +msgid "The number of rows in the sprite sheet." +msgstr "" + +#: doc/classes/Sprite.xml doc/classes/Sprite3D.xml +msgid "Emitted when the [member frame] changes." +msgstr "" + +#: doc/classes/Sprite.xml +msgid "Emitted when the [member texture] changes." +msgstr "" + +#: doc/classes/Sprite3D.xml +msgid "2D sprite node in a 3D world." +msgstr "" + +#: doc/classes/Sprite3D.xml +msgid "" +"A node that displays a 2D texture in a 3D environment. The texture displayed " +"can be a region from a larger atlas texture, or a frame from a sprite sheet " +"animation." +msgstr "" + +#: doc/classes/Sprite3D.xml +msgid "" +"If [code]true[/code], texture will be cut from a larger atlas texture. See " +"[member region_rect]." +msgstr "" + +#: doc/classes/Sprite3D.xml +msgid "" +"[Texture] object to draw. If [member GeometryInstance.material_override] is " +"used, this will be overridden. The size information is still used." +msgstr "" + +#: doc/classes/SpriteBase3D.xml +msgid "2D sprite node in 3D environment." +msgstr "" + +#: doc/classes/SpriteBase3D.xml +msgid "A node that displays 2D texture information in a 3D environment." +msgstr "" + +#: doc/classes/SpriteBase3D.xml +msgid "Returns the rectangle representing this sprite." +msgstr "" + +#: doc/classes/SpriteBase3D.xml +msgid "If [code]true[/code], the specified flag will be enabled." +msgstr "" + +#: doc/classes/SpriteBase3D.xml +msgid "The direction in which the front of the texture faces." +msgstr "" + +#: doc/classes/SpriteBase3D.xml +msgid "" +"If [code]true[/code], texture can be seen from the back as well, if " +"[code]false[/code], it is invisible when looking at it from behind." +msgstr "" + +#: doc/classes/SpriteBase3D.xml +msgid "" +"A color value used to [i]multiply[/i] the texture's colors. Can be used for " +"mood-coloring or to simulate the color of light.\n" +"[b]Note:[/b] If a [member GeometryInstance.material_override] is defined on " +"the [SpriteBase3D], the material override must be configured to take vertex " +"colors into account for albedo. Otherwise, the color defined in [member " +"modulate] will be ignored. For a [SpatialMaterial], [member SpatialMaterial." +"vertex_color_use_as_albedo] must be [code]true[/code]. For a " +"[ShaderMaterial], [code]ALBEDO *= COLOR.rgb;[/code] must be inserted in the " +"shader's [code]fragment()[/code] function." +msgstr "" + +#: doc/classes/SpriteBase3D.xml +msgid "" +"The texture's visibility on a scale from [code]0[/code] (fully invisible) to " +"[code]1[/code] (fully visible). [member opacity] is a multiplier for the " +"[member modulate] color's alpha channel.\n" +"[b]Note:[/b] If a [member GeometryInstance.material_override] is defined on " +"the [SpriteBase3D], the material override must be configured to take vertex " +"colors into account for albedo. Otherwise, the opacity defined in [member " +"opacity] will be ignored. For a [SpatialMaterial], [member SpatialMaterial." +"vertex_color_use_as_albedo] must be [code]true[/code]. For a " +"[ShaderMaterial], [code]ALPHA *= COLOR.a;[/code] must be inserted in the " +"shader's [code]fragment()[/code] function." +msgstr "" + +#: doc/classes/SpriteBase3D.xml +msgid "The size of one pixel's width on the sprite to scale it in 3D." +msgstr "" + +#: doc/classes/SpriteBase3D.xml +msgid "" +"Sets the render priority for the sprite. Higher priority objects will be " +"sorted in front of lower priority objects.\n" +"[b]Note:[/b] This only applies if [member alpha_cut] is set to [constant " +"ALPHA_CUT_DISABLED] (default value).\n" +"[b]Note:[/b] This only applies to sorting of transparent objects. This will " +"not impact how transparent objects are sorted relative to opaque objects. " +"This is because opaque objects are not sorted, while transparent objects are " +"sorted from back to front (subject to priority)." +msgstr "" + +#: doc/classes/SpriteBase3D.xml +msgid "" +"If [code]true[/code], the [Light] in the [Environment] has effects on the " +"sprite." +msgstr "" + +#: doc/classes/SpriteBase3D.xml +msgid "" +"If [code]true[/code], the texture's transparency and the opacity are used to " +"make those parts of the sprite invisible." +msgstr "" + +#: doc/classes/SpriteBase3D.xml +msgid "" +"If set, the texture's transparency and the opacity are used to make those " +"parts of the sprite invisible." +msgstr "" + +#: doc/classes/SpriteBase3D.xml +msgid "If set, lights in the environment affect the sprite." +msgstr "" + +#: doc/classes/SpriteBase3D.xml +msgid "" +"If set, texture can be seen from the back as well, if not, it is invisible " +"when looking at it from behind." +msgstr "" + +#: doc/classes/SpriteBase3D.xml +msgid "" +"Sprite is scaled by depth so that it always appears the same size on screen." +msgstr "" + +#: doc/classes/SpriteFrames.xml +msgid "Sprite frame library for AnimatedSprite and AnimatedSprite3D." +msgstr "" + +#: doc/classes/SpriteFrames.xml +msgid "" +"Sprite frame library for an [AnimatedSprite] or [AnimatedSprite3D] node. " +"Contains frames and animation data for playback.\n" +"[b]Note:[/b] You can associate a set of normal maps by creating additional " +"[SpriteFrames] resources with a [code]_normal[/code] suffix. For example, " +"having 2 [SpriteFrames] resources [code]run[/code] and [code]run_normal[/" +"code] will make it so the [code]run[/code] animation uses the normal map." +msgstr "" + +#: doc/classes/SpriteFrames.xml +msgid "Adds a new animation to the library." +msgstr "" + +#: doc/classes/SpriteFrames.xml +msgid "Adds a frame to the given animation." +msgstr "" + +#: doc/classes/SpriteFrames.xml +msgid "Removes all frames from the given animation." +msgstr "" + +#: doc/classes/SpriteFrames.xml +msgid "Removes all animations. A \"default\" animation will be created." +msgstr "" + +#: doc/classes/SpriteFrames.xml +msgid "" +"Returns [code]true[/code] if the given animation is configured to loop when " +"it finishes playing. Otherwise, returns [code]false[/code]." +msgstr "" + +#: doc/classes/SpriteFrames.xml +msgid "" +"Returns an array containing the names associated to each animation. Values " +"are placed in alphabetical order." +msgstr "" + +#: doc/classes/SpriteFrames.xml +msgid "The animation's speed in frames per second." +msgstr "" + +#: doc/classes/SpriteFrames.xml +msgid "Returns the animation's selected frame." +msgstr "" + +#: doc/classes/SpriteFrames.xml +msgid "Returns the number of frames in the animation." +msgstr "" + +#: doc/classes/SpriteFrames.xml +msgid "If [code]true[/code], the named animation exists." +msgstr "" + +#: doc/classes/SpriteFrames.xml +msgid "Removes the given animation." +msgstr "" + +#: doc/classes/SpriteFrames.xml +msgid "Removes the animation's selected frame." +msgstr "" + +#: doc/classes/SpriteFrames.xml +msgid "Changes the animation's name to [code]newname[/code]." +msgstr "" + +#: doc/classes/SpriteFrames.xml +msgid "If [code]true[/code], the animation will loop." +msgstr "" + +#: doc/classes/SpriteFrames.xml +msgid "Sets the texture of the given frame." +msgstr "" + +#: doc/classes/SpriteFrames.xml +msgid "Compatibility property, always equals to an empty array." +msgstr "" + +#: doc/classes/StaticBody.xml +msgid "Static body for 3D physics." +msgstr "" + +#: doc/classes/StaticBody.xml +msgid "" +"Static body for 3D physics. A static body is a simple body that is not " +"intended to move. In contrast to [RigidBody], they don't consume any CPU " +"resources as long as they don't move.\n" +"Additionally, a constant linear or angular velocity can be set for the " +"static body, so even if it doesn't move, it affects other bodies as if it " +"was moving (this is useful for simulating conveyor belts or conveyor wheels)." +msgstr "" + +#: doc/classes/StaticBody.xml +msgid "" +"The body's constant angular velocity. This does not rotate the body, but " +"affects other bodies that touch it, as if it was in a state of rotation." +msgstr "" + +#: doc/classes/StaticBody.xml +msgid "" +"The body's constant linear velocity. This does not move the body, but " +"affects other bodies that touch it, as if it was in a state of movement." +msgstr "" + +#: doc/classes/StaticBody.xml +msgid "" +"The body's friction, from 0 (frictionless) to 1 (full friction).\n" +"Deprecated, use [member PhysicsMaterial.friction] instead via [member " +"physics_material_override]." +msgstr "" + +#: doc/classes/StaticBody2D.xml +msgid "Static body for 2D physics." +msgstr "" + +#: doc/classes/StaticBody2D.xml +msgid "" +"Static body for 2D physics. A StaticBody2D is a body that is not intended to " +"move. It is ideal for implementing objects in the environment, such as walls " +"or platforms.\n" +"Additionally, a constant linear or angular velocity can be set for the " +"static body, which will affect colliding bodies as if it were moving (for " +"example, a conveyor belt)." +msgstr "" + +#: doc/classes/StaticBody2D.xml +msgid "" +"The body's constant angular velocity. This does not rotate the body, but " +"affects colliding bodies, as if it were rotating." +msgstr "" + +#: doc/classes/StaticBody2D.xml +msgid "" +"The body's constant linear velocity. This does not move the body, but " +"affects colliding bodies, as if it were moving." +msgstr "" + +#: doc/classes/StaticBody2D.xml +msgid "" +"The body's friction. Values range from [code]0[/code] (no friction) to " +"[code]1[/code] (full friction).\n" +"Deprecated, use [member PhysicsMaterial.friction] instead via [member " +"physics_material_override]." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "Abstraction and base class for stream-based protocols." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "" +"StreamPeer is an abstraction and base class for stream-based protocols (such " +"as TCP). It provides an API for sending and receiving data through streams " +"as raw data or strings." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "Gets a signed 16-bit value from the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "Gets a signed 32-bit value from the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "Gets a signed 64-bit value from the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "Gets a signed byte from the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "Returns the amount of bytes this [StreamPeer] has available." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "" +"Returns a chunk data with the received bytes. The amount of bytes to be " +"received can be requested in the [code]bytes[/code] argument. If not enough " +"bytes are available, the function will block until the desired amount is " +"received. This function returns two values, an [enum @GlobalScope.Error] " +"code and a data array." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "Gets a double-precision float from the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "Gets a single-precision float from the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "" +"Returns a chunk data with the received bytes. The amount of bytes to be " +"received can be requested in the \"bytes\" argument. If not enough bytes are " +"available, the function will return how many were actually received. This " +"function returns two values, an [enum @GlobalScope.Error] code, and a data " +"array." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "" +"Gets an ASCII string with byte-length [code]bytes[/code] from the stream. If " +"[code]bytes[/code] is negative (default) the length will be read from the " +"stream using the reverse process of [method put_string]." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "Gets an unsigned 16-bit value from the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "Gets an unsigned 32-bit value from the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "Gets an unsigned 64-bit value from the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "Gets an unsigned byte from the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "" +"Gets an UTF-8 string with byte-length [code]bytes[/code] from the stream " +"(this decodes the string sent as UTF-8). If [code]bytes[/code] is negative " +"(default) the length will be read from the stream using the reverse process " +"of [method put_utf8_string]." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "" +"Gets a Variant from the stream. If [code]allow_objects[/code] is [code]true[/" +"code], decoding objects is allowed.\n" +"[b]Warning:[/b] Deserialized objects can contain code which gets executed. " +"Do not use this option if the serialized object comes from untrusted sources " +"to avoid potential security threats such as remote code execution." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "Puts a signed 16-bit value into the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "Puts a signed 32-bit value into the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "Puts a signed 64-bit value into the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "Puts a signed byte into the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "" +"Sends a chunk of data through the connection, blocking if necessary until " +"the data is done sending. This function returns an [enum @GlobalScope.Error] " +"code." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "Puts a double-precision float into the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "Puts a single-precision float into the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "" +"Sends a chunk of data through the connection. If all the data could not be " +"sent at once, only part of it will. This function returns two values, an " +"[enum @GlobalScope.Error] code and an integer, describing how much data was " +"actually sent." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "" +"Puts a zero-terminated ASCII string into the stream prepended by a 32-bit " +"unsigned integer representing its size.\n" +"[b]Note:[/b] To put an ASCII string without prepending its size, you can use " +"[method put_data]:\n" +"[codeblock]\n" +"put_data(\"Hello world\".to_ascii())\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "Puts an unsigned 16-bit value into the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "Puts an unsigned 32-bit value into the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "Puts an unsigned 64-bit value into the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "Puts an unsigned byte into the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "" +"Puts a zero-terminated UTF-8 string into the stream prepended by a 32 bits " +"unsigned integer representing its size.\n" +"[b]Note:[/b] To put an UTF-8 string without prepending its size, you can use " +"[method put_data]:\n" +"[codeblock]\n" +"put_data(\"Hello world\".to_utf8())\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "" +"Puts a Variant into the stream. If [code]full_objects[/code] is [code]true[/" +"code] encoding objects is allowed (and can potentially include code)." +msgstr "" + +#: doc/classes/StreamPeer.xml +msgid "" +"If [code]true[/code], this [StreamPeer] will using big-endian format for " +"encoding and decoding." +msgstr "" + +#: doc/classes/StreamPeerBuffer.xml +msgid "Data buffer stream peer." +msgstr "" + +#: doc/classes/StreamPeerBuffer.xml +msgid "" +"Data buffer stream peer that uses a byte array as the stream. This object " +"can be used to handle binary data from network sessions. To handle binary " +"data stored in files, [File] can be used directly.\n" +"A [StreamPeerBuffer] object keeps an internal cursor which is the offset in " +"bytes to the start of the buffer. Get and put operations are performed at " +"the cursor position and will move the cursor accordingly." +msgstr "" + +#: doc/classes/StreamPeerBuffer.xml +msgid "Clears the [member data_array] and resets the cursor." +msgstr "" + +#: doc/classes/StreamPeerBuffer.xml +msgid "" +"Returns a new [StreamPeerBuffer] with the same [member data_array] content." +msgstr "" + +#: doc/classes/StreamPeerBuffer.xml +msgid "Returns the current cursor position." +msgstr "" + +#: doc/classes/StreamPeerBuffer.xml +msgid "Returns the size of [member data_array]." +msgstr "" + +#: doc/classes/StreamPeerBuffer.xml +msgid "Resizes the [member data_array]. This [i]doesn't[/i] update the cursor." +msgstr "" + +#: doc/classes/StreamPeerBuffer.xml +msgid "" +"Moves the cursor to the specified position. [code]position[/code] must be a " +"valid index of [member data_array]." +msgstr "" + +#: doc/classes/StreamPeerBuffer.xml +msgid "The underlying data buffer. Setting this value resets the cursor." +msgstr "" + +#: doc/classes/StreamPeerSSL.xml +msgid "SSL stream peer." +msgstr "" + +#: doc/classes/StreamPeerSSL.xml +msgid "" +"SSL stream peer. This object can be used to connect to an SSL server or " +"accept a single SSL client connection." +msgstr "" + +#: doc/classes/StreamPeerSSL.xml +msgid "" +"Accepts a peer connection as a server using the given [code]private_key[/" +"code] and providing the given [code]certificate[/code] to the client. You " +"can pass the optional [code]chain[/code] parameter to provide additional CA " +"chain information along with the certificate." +msgstr "" + +#: doc/classes/StreamPeerSSL.xml +msgid "" +"Connects to a peer using an underlying [StreamPeer] [code]stream[/code]. If " +"[code]validate_certs[/code] is [code]true[/code], [StreamPeerSSL] will " +"validate that the certificate presented by the peer matches the " +"[code]for_hostname[/code].\n" +"[b]Note:[/b] Specifying a custom [code]valid_certificate[/code] is not " +"supported in HTML5 exports due to browsers restrictions." +msgstr "" + +#: doc/classes/StreamPeerSSL.xml doc/classes/StreamPeerTCP.xml +msgid "Disconnects from host." +msgstr "" + +#: doc/classes/StreamPeerSSL.xml +msgid "" +"Poll the connection to check for incoming bytes. Call this right before " +"[method StreamPeer.get_available_bytes] for it to work properly." +msgstr "" + +#: doc/classes/StreamPeerSSL.xml +msgid "A status representing a [StreamPeerSSL] that is disconnected." +msgstr "" + +#: doc/classes/StreamPeerSSL.xml +msgid "A status representing a [StreamPeerSSL] during handshaking." +msgstr "" + +#: doc/classes/StreamPeerSSL.xml +msgid "A status representing a [StreamPeerSSL] that is connected to a host." +msgstr "" + +#: doc/classes/StreamPeerSSL.xml +msgid "A status representing a [StreamPeerSSL] in error state." +msgstr "" + +#: doc/classes/StreamPeerSSL.xml +msgid "" +"An error status that shows a mismatch in the SSL certificate domain " +"presented by the host and the domain requested for validation." +msgstr "" + +#: doc/classes/StreamPeerTCP.xml +msgid "TCP stream peer." +msgstr "" + +#: doc/classes/StreamPeerTCP.xml +msgid "" +"TCP stream peer. This object can be used to connect to TCP servers, or also " +"is returned by a TCP server." +msgstr "" + +#: doc/classes/StreamPeerTCP.xml +msgid "" +"Connects to the specified [code]host:port[/code] pair. A hostname will be " +"resolved if valid. Returns [constant OK] on success or [constant FAILED] on " +"failure." +msgstr "" + +#: doc/classes/StreamPeerTCP.xml +msgid "Returns the IP of this peer." +msgstr "" + +#: doc/classes/StreamPeerTCP.xml +msgid "Returns the port of this peer." +msgstr "" + +#: doc/classes/StreamPeerTCP.xml +msgid "Returns the status of the connection, see [enum Status]." +msgstr "" + +#: doc/classes/StreamPeerTCP.xml +msgid "" +"Returns [code]true[/code] if this peer is currently connected or is " +"connecting to a host, [code]false[/code] otherwise." +msgstr "" + +#: doc/classes/StreamPeerTCP.xml +msgid "" +"If [code]enabled[/code] is [code]true[/code], packets will be sent " +"immediately. If [code]enabled[/code] is [code]false[/code] (the default), " +"packet transfers will be delayed and combined using [url=https://en." +"wikipedia.org/wiki/Nagle%27s_algorithm]Nagle's algorithm[/url].\n" +"[b]Note:[/b] It's recommended to leave this disabled for applications that " +"send large packets or need to transfer a lot of data, as enabling this can " +"decrease the total available bandwidth." +msgstr "" + +#: doc/classes/StreamPeerTCP.xml +msgid "" +"The initial status of the [StreamPeerTCP]. This is also the status after " +"disconnecting." +msgstr "" + +#: doc/classes/StreamPeerTCP.xml +msgid "A status representing a [StreamPeerTCP] that is connecting to a host." +msgstr "" + +#: doc/classes/StreamPeerTCP.xml +msgid "A status representing a [StreamPeerTCP] that is connected to a host." +msgstr "" + +#: doc/classes/StreamPeerTCP.xml +msgid "A status representing a [StreamPeerTCP] in error state." +msgstr "" + +#: doc/classes/StreamTexture.xml +msgid "A [code].stex[/code] texture." +msgstr "" + +#: doc/classes/StreamTexture.xml +msgid "A texture that is loaded from a [code].stex[/code] file." +msgstr "" + +#: doc/classes/StreamTexture.xml +msgid "Loads the texture from the given path." +msgstr "" + +#: doc/classes/StreamTexture.xml +msgid "The StreamTexture's file path to a [code].stex[/code] file." +msgstr "" + +#: doc/classes/String.xml +msgid "Built-in string class." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"This is the built-in string class (and the one used by GDScript). It " +"supports Unicode and provides all necessary means for string handling. " +"Strings are reference-counted and use a copy-on-write approach, so passing " +"them around is cheap in resources." +msgstr "" + +#: doc/classes/String.xml +msgid "Constructs a new String from the given [bool]." +msgstr "" + +#: doc/classes/String.xml +msgid "Constructs a new String from the given [int]." +msgstr "" + +#: doc/classes/String.xml +msgid "Constructs a new String from the given [float]." +msgstr "" + +#: doc/classes/String.xml +msgid "Constructs a new String from the given [Vector2]." +msgstr "" + +#: doc/classes/String.xml +msgid "Constructs a new String from the given [Rect2]." +msgstr "" + +#: doc/classes/String.xml +msgid "Constructs a new String from the given [Vector3]." +msgstr "" + +#: doc/classes/String.xml +msgid "Constructs a new String from the given [Transform2D]." +msgstr "" + +#: doc/classes/String.xml +msgid "Constructs a new String from the given [Plane]." +msgstr "" + +#: doc/classes/String.xml +msgid "Constructs a new String from the given [Quat]." +msgstr "" + +#: doc/classes/String.xml +msgid "Constructs a new String from the given [AABB]." +msgstr "" + +#: doc/classes/String.xml +msgid "Constructs a new String from the given [Basis]." +msgstr "" + +#: doc/classes/String.xml +msgid "Constructs a new String from the given [Transform]." +msgstr "" + +#: doc/classes/String.xml +msgid "Constructs a new String from the given [Color]." +msgstr "" + +#: doc/classes/String.xml +msgid "Constructs a new String from the given [NodePath]." +msgstr "" + +#: doc/classes/String.xml +msgid "Constructs a new String from the given [RID]." +msgstr "" + +#: doc/classes/String.xml +msgid "Constructs a new String from the given [Dictionary]." +msgstr "" + +#: doc/classes/String.xml +msgid "Constructs a new String from the given [Array]." +msgstr "" + +#: doc/classes/String.xml +msgid "Constructs a new String from the given [PoolByteArray]." +msgstr "" + +#: doc/classes/String.xml +msgid "Constructs a new String from the given [PoolIntArray]." +msgstr "" + +#: doc/classes/String.xml +msgid "Constructs a new String from the given [PoolRealArray]." +msgstr "" + +#: doc/classes/String.xml +msgid "Constructs a new String from the given [PoolStringArray]." +msgstr "" + +#: doc/classes/String.xml +msgid "Constructs a new String from the given [PoolVector2Array]." +msgstr "" + +#: doc/classes/String.xml +msgid "Constructs a new String from the given [PoolVector3Array]." +msgstr "" + +#: doc/classes/String.xml +msgid "Constructs a new String from the given [PoolColorArray]." +msgstr "" + +#: doc/classes/String.xml +msgid "Returns [code]true[/code] if the string begins with the given string." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Returns an array containing the bigrams (pairs of consecutive letters) of " +"this string.\n" +"[codeblock]\n" +"print(\"Bigrams\".bigrams()) # Prints \"[Bi, ig, gr, ra, am, ms]\"\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Returns a copy of the string with special characters escaped using the C " +"language standard." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Returns a copy of the string with escaped characters replaced by their " +"meanings. Supported escape sequences are [code]\\'[/code], [code]\\\"[/" +"code], [code]\\?[/code], [code]\\\\[/code], [code]\\a[/code], [code]\\b[/" +"code], [code]\\f[/code], [code]\\n[/code], [code]\\r[/code], [code]\\t[/" +"code], [code]\\v[/code].\n" +"[b]Note:[/b] Unlike the GDScript parser, this method doesn't support the " +"[code]\\uXXXX[/code] escape sequence." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Changes the case of some letters. Replaces underscores with spaces, adds " +"spaces before in-word uppercase characters, converts all letters to " +"lowercase, then capitalizes the first letter and every letter following a " +"space character. For [code]capitalize camelCase mixed_with_underscores[/" +"code], it will return [code]Capitalize Camel Case Mixed With Underscores[/" +"code]." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Performs a case-sensitive comparison to another string. Returns [code]-1[/" +"code] if less than, [code]1[/code] if greater than, or [code]0[/code] if " +"equal. \"less than\" or \"greater than\" are determined by the [url=https://" +"en.wikipedia.org/wiki/List_of_Unicode_characters]Unicode code points[/url] " +"of each string, which roughly matches the alphabetical order.\n" +"[b]Behavior with different string lengths:[/b] Returns [code]1[/code] if the " +"\"base\" string is longer than the [code]to[/code] string or [code]-1[/code] " +"if the \"base\" string is shorter than the [code]to[/code] string. Keep in " +"mind this length is determined by the number of Unicode codepoints, [i]not[/" +"i] the actual visible characters.\n" +"[b]Behavior with empty strings:[/b] Returns [code]-1[/code] if the \"base\" " +"string is empty, [code]1[/code] if the [code]to[/code] string is empty or " +"[code]0[/code] if both strings are empty.\n" +"To get a boolean result from a string comparison, use the [code]==[/code] " +"operator instead. See also [method nocasecmp_to]." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Returns the number of occurrences of substring [code]what[/code] between " +"[code]from[/code] and [code]to[/code] positions. If [code]from[/code] and " +"[code]to[/code] equals 0 the whole string will be used. If only [code]to[/" +"code] equals 0 the remained substring will be used." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Returns the number of occurrences of substring [code]what[/code] (ignoring " +"case) between [code]from[/code] and [code]to[/code] positions. If " +"[code]from[/code] and [code]to[/code] equals 0 the whole string will be " +"used. If only [code]to[/code] equals 0 the remained substring will be used." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Returns a copy of the string with indentation (leading tabs and spaces) " +"removed. See also [method indent] to add indentation." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Returns [code]true[/code] if the length of the string equals [code]0[/code]." +msgstr "" + +#: doc/classes/String.xml +msgid "Returns [code]true[/code] if the string ends with the given string." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Erases [code]chars[/code] characters from the string starting from " +"[code]position[/code]." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Finds the first occurrence of a substring. Returns the starting position of " +"the substring or [code]-1[/code] if not found. Optionally, the initial " +"search index can be passed.\n" +"[b]Note:[/b] If you just want to know whether a string contains a substring, " +"use the [code]in[/code] operator as follows:\n" +"[codeblock]\n" +"# Will evaluate to `false`.\n" +"if \"i\" in \"team\":\n" +" pass\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Finds the last occurrence of a substring. Returns the starting position of " +"the substring or [code]-1[/code] if not found." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Finds the first occurrence of a substring, ignoring case. Returns the " +"starting position of the substring or [code]-1[/code] if not found. " +"Optionally, the initial search index can be passed." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Formats the string by replacing all occurrences of [code]placeholder[/code] " +"with the elements of [code]values[/code].\n" +"[code]values[/code] can be a [Dictionary] or an [Array]. Any underscores in " +"[code]placeholder[/code] will be replaced with the corresponding keys in " +"advance. Array elements use their index as keys.\n" +"[codeblock]\n" +"# Prints: Waiting for Godot is a play by Samuel Beckett, and Godot Engine is " +"named after it.\n" +"var use_array_values = \"Waiting for {0} is a play by {1}, and {0} Engine is " +"named after it.\"\n" +"print(use_array_values.format([\"Godot\", \"Samuel Beckett\"]))\n" +"\n" +"# Prints: User 42 is Godot.\n" +"print(\"User {id} is {name}.\".format({\"id\": 42, \"name\": \"Godot\"}))\n" +"[/codeblock]\n" +"Some additional handling is performed when [code]values[/code] is an array. " +"If [code]placeholder[/code] does not contain an underscore, the elements of " +"the array will be used to replace one occurrence of the placeholder in turn; " +"If an array element is another 2-element array, it'll be interpreted as a " +"key-value pair.\n" +"[codeblock]\n" +"# Prints: User 42 is Godot.\n" +"print(\"User {} is {}.\".format([42, \"Godot\"], \"{}\"))\n" +"print(\"User {id} is {name}.\".format([[\"id\", 42], [\"name\", " +"\"Godot\"]]))\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/String.xml +msgid "If the string is a valid file path, returns the base directory name." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"If the string is a valid file path, returns the full file path without the " +"extension." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Returns the extension without the leading period character ([code].[/code]) " +"if the string is a valid file name or path. If the string does not contain " +"an extension, returns an empty string instead.\n" +"[codeblock]\n" +"print(\"/path/to/file.txt\".get_extension()) # \"txt\"\n" +"print(\"file.txt\".get_extension()) # \"txt\"\n" +"print(\"file.sample.txt\".get_extension()) # \"txt\"\n" +"print(\".txt\".get_extension()) # \"txt\"\n" +"print(\"file.txt.\".get_extension()) # \"\" (empty string)\n" +"print(\"file.txt..\".get_extension()) # \"\" (empty string)\n" +"print(\"txt\".get_extension()) # \"\" (empty string)\n" +"print(\"\".get_extension()) # \"\" (empty string)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/String.xml +msgid "If the string is a valid file path, returns the filename." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Splits a string using a [code]delimiter[/code] and returns a substring at " +"index [code]slice[/code]. Returns an empty string if the index doesn't " +"exist.\n" +"This is a more performant alternative to [method split] for cases when you " +"need only one element from the array at a fixed index.\n" +"Example:\n" +"[codeblock]\n" +"print(\"i/am/example/string\".get_slice(\"/\", 2)) # Prints 'example'.\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Returns the 32-bit hash value representing the string's contents.\n" +"[b]Note:[/b] [String]s with equal content will always produce identical hash " +"values. However, the reverse is not true. Returning identical hash values " +"does [i]not[/i] imply the strings are equal, because different strings can " +"have identical hash values due to hash collisions." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Converts a string containing a hexadecimal number into an integer. " +"Hexadecimal strings are expected to be prefixed with \"[code]0x[/code]\" " +"otherwise [code]0[/code] is returned.\n" +"[codeblock]\n" +"print(\"0xff\".hex_to_int()) # Print \"255\"\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Escapes (encodes) a string to URL friendly format. Also referred to as 'URL " +"encode'.\n" +"[codeblock]\n" +"print(\"https://example.org/?escaped=\" + \"Godot Engine:'docs'\"." +"http_escape())\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Unescapes (decodes) a string in URL encoded format. Also referred to as 'URL " +"decode'.\n" +"[codeblock]\n" +"print(\"https://example.org/?escaped=\" + \"Godot%20Engine%3A%27docs%27\"." +"http_unescape())\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Converts [code]size[/code] represented as number of bytes to human-readable " +"format using internationalized set of data size units, namely: B, KiB, MiB, " +"GiB, TiB, PiB, EiB. Note that the next smallest unit is picked automatically " +"to hold at most 1024 units.\n" +"[codeblock]\n" +"var bytes = 133790307\n" +"var size = String.humanize_size(bytes)\n" +"print(size) # prints \"127.5 MiB\"\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Returns a copy of the string with lines indented with [code]prefix[/code].\n" +"For example, the string can be indented with two tabs using " +"[code]\"\\t\\t\"[/code], or four spaces using [code]\" \"[/code]. The " +"prefix can be any string so it can also be used to comment out strings with " +"e.g. [code]\"# \"[/code]. See also [method dedent] to remove indentation.\n" +"[b]Note:[/b] Empty lines are kept empty." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Returns a copy of the string with the substring [code]what[/code] inserted " +"at the given position." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"If the string is a path to a file or directory, returns [code]true[/code] if " +"the path is absolute." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"If the string is a path to a file or directory, returns [code]true[/code] if " +"the path is relative." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Returns [code]true[/code] if this string is a subsequence of the given " +"string." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Returns [code]true[/code] if this string is a subsequence of the given " +"string, without considering case." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Returns [code]true[/code] if this string is free from characters that aren't " +"allowed in file names, those being:\n" +"[code]: / \\ ? * \" | % < >[/code]" +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Returns [code]true[/code] if this string contains a valid float. This is " +"inclusive of integers, and also supports exponents:\n" +"[codeblock]\n" +"print(\"1.7\".is_valid_float()) # Prints \"True\"\n" +"print(\"24\".is_valid_float()) # Prints \"True\"\n" +"print(\"7e3\".is_valid_float()) # Prints \"True\"\n" +"print(\"Hello\".is_valid_float()) # Prints \"False\"\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Returns [code]true[/code] if this string contains a valid hexadecimal " +"number. If [code]with_prefix[/code] is [code]true[/code], then a validity of " +"the hexadecimal number is determined by [code]0x[/code] prefix, for " +"instance: [code]0xDEADC0DE[/code]." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Returns [code]true[/code] if this string contains a valid color in " +"hexadecimal HTML notation. Other HTML notations such as named colors or " +"[code]hsl()[/code] colors aren't considered valid by this method and will " +"return [code]false[/code]." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Returns [code]true[/code] if this string is a valid identifier. A valid " +"identifier may contain only letters, digits and underscores ([code]_[/code]) " +"and the first character may not be a digit.\n" +"[codeblock]\n" +"print(\"good_ident_1\".is_valid_identifier()) # Prints \"True\"\n" +"print(\"1st_bad_ident\".is_valid_identifier()) # Prints \"False\"\n" +"print(\"bad_ident_#2\".is_valid_identifier()) # Prints \"False\"\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Returns [code]true[/code] if this string contains a valid integer.\n" +"[codeblock]\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Returns [code]true[/code] if this string contains only a well-formatted IPv4 " +"or IPv6 address. This method considers [url=https://en.wikipedia.org/wiki/" +"Reserved_IP_addresses]reserved IP addresses[/url] such as [code]0.0.0.0[/" +"code] as valid." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Return a [String] which is the concatenation of the [code]parts[/code]. The " +"separator between elements is the string providing this method.\n" +"Example:\n" +"[codeblock]\n" +"print(\", \".join([\"One\", \"Two\", \"Three\", \"Four\"]))\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Returns a copy of the string with special characters escaped using the JSON " +"standard." +msgstr "" + +#: doc/classes/String.xml +msgid "Returns a number of characters from the left of the string." +msgstr "" + +#: doc/classes/String.xml +msgid "Returns the string's amount of characters." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Returns a copy of the string with characters removed from the left. The " +"[code]chars[/code] argument is a string specifying the set of characters to " +"be removed.\n" +"[b]Note:[/b] The [code]chars[/code] is not a prefix. See [method " +"trim_prefix] method that will remove a single prefix string rather than a " +"set of characters." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Does a simple case-sensitive expression match, where [code]\"*\"[/code] " +"matches zero or more arbitrary characters and [code]\"?\"[/code] matches any " +"single character except a period ([code]\".\"[/code]). An empty string or " +"empty expression always evaluates to [code]false[/code]." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Does a simple case-insensitive expression match, where [code]\"*\"[/code] " +"matches zero or more arbitrary characters and [code]\"?\"[/code] matches any " +"single character except a period ([code]\".\"[/code]). An empty string or " +"empty expression always evaluates to [code]false[/code]." +msgstr "" + +#: doc/classes/String.xml +msgid "Returns the MD5 hash of the string as an array of bytes." +msgstr "" + +#: doc/classes/String.xml +msgid "Returns the MD5 hash of the string as a string." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Performs a case-insensitive [i]natural order[/i] comparison to another " +"string. Returns [code]-1[/code] if less than, [code]1[/code] if greater " +"than, or [code]0[/code] if equal. \"less than\" or \"greater than\" are " +"determined by the [url=https://en.wikipedia.org/wiki/" +"List_of_Unicode_characters]Unicode code points[/url] of each string, which " +"roughly matches the alphabetical order. Internally, lowercase characters " +"will be converted to uppercase during the comparison.\n" +"When used for sorting, natural order comparison will order suites of numbers " +"as expected by most people. If you sort the numbers from 1 to 10 using " +"natural order, you will get [code][1, 2, 3, ...][/code] instead of [code][1, " +"10, 2, 3, ...][/code].\n" +"[b]Behavior with different string lengths:[/b] Returns [code]1[/code] if the " +"\"base\" string is longer than the [code]to[/code] string or [code]-1[/code] " +"if the \"base\" string is shorter than the [code]to[/code] string. Keep in " +"mind this length is determined by the number of Unicode codepoints, [i]not[/" +"i] the actual visible characters.\n" +"[b]Behavior with empty strings:[/b] Returns [code]-1[/code] if the \"base\" " +"string is empty, [code]1[/code] if the [code]to[/code] string is empty or " +"[code]0[/code] if both strings are empty.\n" +"To get a boolean result from a string comparison, use the [code]==[/code] " +"operator instead. See also [method nocasecmp_to] and [method casecmp_to]." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Performs a case-insensitive comparison to another string. Returns [code]-1[/" +"code] if less than, [code]1[/code] if greater than, or [code]0[/code] if " +"equal. \"less than\" or \"greater than\" are determined by the [url=https://" +"en.wikipedia.org/wiki/List_of_Unicode_characters]Unicode code points[/url] " +"of each string, which roughly matches the alphabetical order. Internally, " +"lowercase characters will be converted to uppercase during the comparison.\n" +"[b]Behavior with different string lengths:[/b] Returns [code]1[/code] if the " +"\"base\" string is longer than the [code]to[/code] string or [code]-1[/code] " +"if the \"base\" string is shorter than the [code]to[/code] string. Keep in " +"mind this length is determined by the number of Unicode codepoints, [i]not[/" +"i] the actual visible characters.\n" +"[b]Behavior with empty strings:[/b] Returns [code]-1[/code] if the \"base\" " +"string is empty, [code]1[/code] if the [code]to[/code] string is empty or " +"[code]0[/code] if both strings are empty.\n" +"To get a boolean result from a string comparison, use the [code]==[/code] " +"operator instead. See also [method casecmp_to]." +msgstr "" + +#: doc/classes/String.xml +msgid "Returns the character code at position [code]at[/code]." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Formats a number to have an exact number of [code]digits[/code] after the " +"decimal point." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Formats a number to have an exact number of [code]digits[/code] before the " +"decimal point." +msgstr "" + +#: doc/classes/String.xml +msgid "Decode a percent-encoded string. See [method percent_encode]." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Percent-encodes a string. Encodes parameters in a URL when sending a HTTP " +"GET request (and bodies of form-urlencoded POST requests)." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"If the string is a path, this concatenates [code]file[/code] at the end of " +"the string as a subpath. E.g. [code]\"this/is\".plus_file(\"path\") == " +"\"this/is/path\"[/code]." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Returns original string repeated a number of times. The number of " +"repetitions is given by the argument." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Replaces occurrences of a case-sensitive substring with the given one inside " +"the string." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Replaces occurrences of a case-insensitive substring with the given one " +"inside the string." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Performs a case-sensitive search for a substring, but starts from the end of " +"the string instead of the beginning." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Performs a case-insensitive search for a substring, but starts from the end " +"of the string instead of the beginning." +msgstr "" + +#: doc/classes/String.xml +msgid "Returns the right side of the string from a given position." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Splits the string by a [code]delimiter[/code] string and returns an array of " +"the substrings, starting from right.\n" +"The splits in the returned array are sorted in the same order as the " +"original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" +"If [code]maxsplit[/code] is specified, it defines the number of splits to do " +"from the right up to [code]maxsplit[/code]. The default value of 0 means " +"that all items are split, thus giving the same result as [method split].\n" +"Example:\n" +"[codeblock]\n" +"var some_string = \"One,Two,Three,Four\"\n" +"var some_array = some_string.rsplit(\",\", true, 1)\n" +"print(some_array.size()) # Prints 2\n" +"print(some_array[0]) # Prints \"One,Two,Three\"\n" +"print(some_array[1]) # Prints \"Four\"\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Returns a copy of the string with characters removed from the right. The " +"[code]chars[/code] argument is a string specifying the set of characters to " +"be removed.\n" +"[b]Note:[/b] The [code]chars[/code] is not a suffix. See [method " +"trim_suffix] method that will remove a single suffix string rather than a " +"set of characters." +msgstr "" + +#: doc/classes/String.xml +msgid "Returns the SHA-1 hash of the string as an array of bytes." +msgstr "" + +#: doc/classes/String.xml +msgid "Returns the SHA-1 hash of the string as a string." +msgstr "" + +#: doc/classes/String.xml +msgid "Returns the SHA-256 hash of the string as an array of bytes." +msgstr "" + +#: doc/classes/String.xml +msgid "Returns the SHA-256 hash of the string as a string." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Returns the similarity index ([url=https://en.wikipedia.org/wiki/" +"S%C3%B8rensen%E2%80%93Dice_coefficient]Sorensen-Dice coefficient[/url]) of " +"this string compared to another. A result of 1.0 means totally similar, " +"while 0.0 means totally dissimilar.\n" +"[codeblock]\n" +"print(\"ABC123\".similarity(\"ABC123\")) # Prints \"1\"\n" +"print(\"ABC123\".similarity(\"XYZ456\")) # Prints \"0\"\n" +"print(\"ABC123\".similarity(\"123ABC\")) # Prints \"0.8\"\n" +"print(\"ABC123\".similarity(\"abc123\")) # Prints \"0.4\"\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/String.xml +msgid "Returns a simplified canonical path." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Splits the string by a [code]delimiter[/code] string and returns an array of " +"the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" +"If [code]maxsplit[/code] is specified, it defines the number of splits to do " +"from the left up to [code]maxsplit[/code]. The default value of [code]0[/" +"code] means that all items are split.\n" +"If you need only one element from the array at a specific index, [method " +"get_slice] is a more performant option.\n" +"Example:\n" +"[codeblock]\n" +"var some_string = \"One,Two,Three,Four\"\n" +"var some_array = some_string.split(\",\", true, 1)\n" +"print(some_array.size()) # Prints 2\n" +"print(some_array[0]) # Prints \"One\"\n" +"print(some_array[1]) # Prints \"Two,Three,Four\"\n" +"[/codeblock]\n" +"If you need to split strings with more complex rules, use the [RegEx] class " +"instead." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Splits the string in floats by using a delimiter string and returns an array " +"of the substrings.\n" +"For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Returns a copy of the string stripped of any non-printable character " +"(including tabulations, spaces and line breaks) at the beginning and the " +"end. The optional arguments are used to toggle stripping on the left and " +"right edges respectively." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Returns a copy of the string stripped of any escape character. These include " +"all non-printable control characters of the first page of the ASCII table (< " +"32), such as tabulation ([code]\\t[/code] in C) and newline ([code]\\n[/" +"code] and [code]\\r[/code]) characters, but not spaces." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Returns part of the string from the position [code]from[/code] with length " +"[code]len[/code]. Argument [code]len[/code] is optional and using [code]-1[/" +"code] will return remaining characters from given position." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Converts the String (which is a character array) to [PoolByteArray] (which " +"is an array of bytes). The conversion is faster compared to [method " +"to_utf8], as this method assumes that all the characters in the String are " +"ASCII characters." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Converts a string containing a decimal number into a [code]float[/code]. The " +"method will stop on the first non-number character except the first [code].[/" +"code] (decimal point), and [code]e[/code] which is used for exponential.\n" +"[codeblock]\n" +"print(\"12.3\".to_float()) # 12.3\n" +"print(\"1.2.3\".to_float()) # 1.2\n" +"print(\"12ab3\".to_float()) # 12\n" +"print(\"1e3\".to_float()) # 1000\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Converts a string containing an integer number into an [code]int[/code]. The " +"method will remove any non-number character and stop if it encounters a " +"[code].[/code].\n" +"[codeblock]\n" +"print(\"123\".to_int()) # 123\n" +"print(\"a1b2c3\".to_int()) # 123\n" +"print(\"1.2.3\".to_int()) # 1\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/String.xml +msgid "Returns the string converted to lowercase." +msgstr "" + +#: doc/classes/String.xml +msgid "Returns the string converted to uppercase." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Converts the String (which is an array of characters) to [PoolByteArray] " +"(which is an array of bytes). The conversion is a bit slower than [method " +"to_ascii], but supports all UTF-8 characters. Therefore, you should prefer " +"this function over [method to_ascii]." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Converts the String (which is an array of characters) to [PoolByteArray] " +"(which is an array of bytes)." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Removes a given string from the start if it starts with it or leaves the " +"string unchanged." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Removes a given string from the end if it ends with it or leaves the string " +"unchanged." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Removes any characters from the string that are prohibited in [Node] names " +"([code].[/code] [code]:[/code] [code]@[/code] [code]/[/code] [code]\"[/" +"code])." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Returns a copy of the string with special characters escaped using the XML " +"standard." +msgstr "" + +#: doc/classes/String.xml +msgid "" +"Returns a copy of the string with escaped characters replaced by their " +"meanings according to the XML standard." +msgstr "" + +#: doc/classes/StyleBox.xml +msgid "Base class for drawing stylized boxes for the UI." +msgstr "" + +#: doc/classes/StyleBox.xml +msgid "" +"StyleBox is [Resource] that provides an abstract base class for drawing " +"stylized boxes for the UI. StyleBoxes are used for drawing the styles of " +"buttons, line edit backgrounds, tree backgrounds, etc. and also for testing " +"a transparency mask for pointer signals. If mask test fails on a StyleBox " +"assigned as mask to a control, clicks and motion signals will go through it " +"to the one below.\n" +"[b]Note:[/b] For children of [Control] that have [i]Theme Properties[/i], " +"the [code]focus[/code] [StyleBox] is displayed over the [code]normal[/code], " +"[code]hover[/code] or [code]pressed[/code] [StyleBox]. This makes the " +"[code]focus[/code] [StyleBox] more reusable across different nodes." +msgstr "" + +#: doc/classes/StyleBox.xml +msgid "" +"Draws this stylebox using a canvas item identified by the given [RID].\n" +"The [RID] value can either be the result of [method CanvasItem." +"get_canvas_item] called on an existing [CanvasItem]-derived node, or " +"directly from creating a canvas item in the [VisualServer] with [method " +"VisualServer.canvas_item_create]." +msgstr "" + +#: doc/classes/StyleBox.xml +msgid "Returns the size of this [StyleBox] without the margins." +msgstr "" + +#: doc/classes/StyleBox.xml +msgid "" +"Returns the [CanvasItem] that handles its [constant CanvasItem." +"NOTIFICATION_DRAW] or [method CanvasItem._draw] callback at this moment." +msgstr "" + +#: doc/classes/StyleBox.xml +msgid "Returns the default value of the specified [enum Margin]." +msgstr "" + +#: doc/classes/StyleBox.xml +msgid "" +"Returns the content margin offset for the specified [enum Margin].\n" +"Positive values reduce size inwards, unlike [Control]'s margin values." +msgstr "" + +#: doc/classes/StyleBox.xml +msgid "Returns the minimum size that this stylebox can be shrunk to." +msgstr "" + +#: doc/classes/StyleBox.xml +msgid "" +"Returns the \"offset\" of a stylebox. This helper function returns a value " +"equivalent to [code]Vector2(style.get_margin(MARGIN_LEFT), style." +"get_margin(MARGIN_TOP))[/code]." +msgstr "" + +#: doc/classes/StyleBox.xml +msgid "" +"Sets the default value of the specified [enum Margin] to given [code]offset[/" +"code] in pixels." +msgstr "" + +#: doc/classes/StyleBox.xml +msgid "Test a position in a rectangle, return whether it passes the mask test." +msgstr "" + +#: doc/classes/StyleBox.xml +msgid "" +"The bottom margin for the contents of this style box. Increasing this value " +"reduces the space available to the contents from the bottom.\n" +"If this value is negative, it is ignored and a child-specific margin is used " +"instead. For example for [StyleBoxFlat] the border thickness (if any) is " +"used instead.\n" +"It is up to the code using this style box to decide what these contents are: " +"for example, a [Button] respects this content margin for the textual " +"contents of the button.\n" +"[method get_margin] should be used to fetch this value as consumer instead " +"of reading these properties directly. This is because it correctly respects " +"negative values and the fallback mentioned above." +msgstr "" + +#: doc/classes/StyleBox.xml +msgid "" +"The left margin for the contents of this style box.Increasing this value " +"reduces the space available to the contents from the left.\n" +"Refer to [member content_margin_bottom] for extra considerations." +msgstr "" + +#: doc/classes/StyleBox.xml +msgid "" +"The right margin for the contents of this style box. Increasing this value " +"reduces the space available to the contents from the right.\n" +"Refer to [member content_margin_bottom] for extra considerations." +msgstr "" + +#: doc/classes/StyleBox.xml +msgid "" +"The top margin for the contents of this style box. Increasing this value " +"reduces the space available to the contents from the top.\n" +"Refer to [member content_margin_bottom] for extra considerations." +msgstr "" + +#: doc/classes/StyleBoxEmpty.xml +msgid "Empty stylebox (does not display anything)." +msgstr "" + +#: doc/classes/StyleBoxEmpty.xml +msgid "Empty stylebox (really does not display anything)." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "" +"Customizable [StyleBox] with a given set of parameters (no texture required)." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "" +"This [StyleBox] can be used to achieve all kinds of looks without the need " +"of a texture. The following properties are customizable:\n" +"- Color\n" +"- Border width (individual width for each border)\n" +"- Rounded corners (individual radius for each corner)\n" +"- Shadow (with blur and offset)\n" +"Setting corner radius to high values is allowed. As soon as corners overlap, " +"the stylebox will switch to a relative system. Example:\n" +"[codeblock]\n" +"height = 30\n" +"corner_radius_top_left = 50\n" +"corner_radius_bottom_left = 100\n" +"[/codeblock]\n" +"The relative system now would take the 1:2 ratio of the two left corners to " +"calculate the actual corner width. Both corners added will [b]never[/b] be " +"more than the height. Result:\n" +"[codeblock]\n" +"corner_radius_top_left: 10\n" +"corner_radius_bottom_left: 20\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "" +"Returns the given [code]margin[/code]'s border width. See [enum Margin] for " +"possible values." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "Returns the smallest border width out of all four borders." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "" +"Returns the given [code]corner[/code]'s radius. See [enum Corner] for " +"possible values." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml doc/classes/StyleBoxTexture.xml +msgid "" +"Returns the size of the given [code]margin[/code]'s expand margin. See [enum " +"Margin] for possible values." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "" +"Sets the border width to [code]width[/code] pixels for the given " +"[code]margin[/code]. See [enum Margin] for possible values." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "Sets the border width to [code]width[/code] pixels for all margins." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "" +"Sets the corner radius to [code]radius[/code] pixels for the given " +"[code]corner[/code]. See [enum Corner] for possible values." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "Sets the corner radius to [code]radius[/code] pixels for all corners." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "" +"Sets the corner radius for each corner to [code]radius_top_left[/code], " +"[code]radius_top_right[/code], [code]radius_bottom_right[/code], and " +"[code]radius_bottom_left[/code] pixels." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml doc/classes/StyleBoxTexture.xml +msgid "" +"Sets the expand margin to [code]size[/code] pixels for the given " +"[code]margin[/code]. See [enum Margin] for possible values." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml doc/classes/StyleBoxTexture.xml +msgid "Sets the expand margin to [code]size[/code] pixels for all margins." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml doc/classes/StyleBoxTexture.xml +msgid "" +"Sets the expand margin for each margin to [code]size_left[/code], " +"[code]size_top[/code], [code]size_right[/code], and [code]size_bottom[/code] " +"pixels." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "" +"Antialiasing draws a small ring around the edges, which fades to " +"transparency. As a result, edges look much smoother. This is only noticeable " +"when using rounded corners or [member skew].\n" +"[b]Note:[/b] When using beveled corners with 45-degree angles ([member " +"corner_detail] = 1), it is recommended to set [member anti_aliasing] to " +"[code]false[/code] to ensure crisp visuals and avoid possible visual " +"glitches." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "" +"This changes the size of the faded ring. Higher values can be used to " +"achieve a \"blurry\" effect." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "The background color of the stylebox." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "If [code]true[/code], the border will fade into the background color." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "Sets the color of the border." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "Border width for the bottom border." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "Border width for the left border." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "Border width for the right border." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "Border width for the top border." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "" +"This sets the number of vertices used for each corner. Higher values result " +"in rounder corners but take more processing power to compute. When choosing " +"a value, you should take the corner radius ([method set_corner_radius_all]) " +"into account.\n" +"For corner radii less than 10, [code]4[/code] or [code]5[/code] should be " +"enough. For corner radii less than 30, values between [code]8[/code] and " +"[code]12[/code] should be enough.\n" +"A corner detail of [code]1[/code] will result in chamfered corners instead " +"of rounded corners, which is useful for some artistic effects." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "" +"The bottom-left corner's radius. If [code]0[/code], the corner is not " +"rounded." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "" +"The bottom-right corner's radius. If [code]0[/code], the corner is not " +"rounded." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "" +"The top-left corner's radius. If [code]0[/code], the corner is not rounded." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "" +"The top-right corner's radius. If [code]0[/code], the corner is not rounded." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "Toggles drawing of the inner part of the stylebox." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "" +"Expands the stylebox outside of the control rect on the bottom edge. Useful " +"in combination with [member border_width_bottom] to draw a border outside " +"the control rect.\n" +"[b]Note:[/b] Unlike [member StyleBox.content_margin_bottom], [member " +"expand_margin_bottom] does [i]not[/i] affect the size of the clickable area " +"for [Control]s. This can negatively impact usability if used wrong, as the " +"user may try to click an area of the StyleBox that cannot actually receive " +"clicks." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "" +"Expands the stylebox outside of the control rect on the left edge. Useful in " +"combination with [member border_width_left] to draw a border outside the " +"control rect.\n" +"[b]Note:[/b] Unlike [member StyleBox.content_margin_left], [member " +"expand_margin_left] does [i]not[/i] affect the size of the clickable area " +"for [Control]s. This can negatively impact usability if used wrong, as the " +"user may try to click an area of the StyleBox that cannot actually receive " +"clicks." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "" +"Expands the stylebox outside of the control rect on the right edge. Useful " +"in combination with [member border_width_right] to draw a border outside the " +"control rect.\n" +"[b]Note:[/b] Unlike [member StyleBox.content_margin_right], [member " +"expand_margin_right] does [i]not[/i] affect the size of the clickable area " +"for [Control]s. This can negatively impact usability if used wrong, as the " +"user may try to click an area of the StyleBox that cannot actually receive " +"clicks." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "" +"Expands the stylebox outside of the control rect on the top edge. Useful in " +"combination with [member border_width_top] to draw a border outside the " +"control rect.\n" +"[b]Note:[/b] Unlike [member StyleBox.content_margin_top], [member " +"expand_margin_top] does [i]not[/i] affect the size of the clickable area for " +"[Control]s. This can negatively impact usability if used wrong, as the user " +"may try to click an area of the StyleBox that cannot actually receive clicks." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "" +"The color of the shadow. This has no effect if [member shadow_size] is lower " +"than 1." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "" +"The shadow offset in pixels. Adjusts the position of the shadow relatively " +"to the stylebox." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "The shadow size in pixels." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml +msgid "" +"If set to a non-zero value on either axis, [member skew] distorts the " +"StyleBox horizontally and/or vertically. This can be used for \"futuristic\"-" +"style UIs. Positive values skew the StyleBox towards the right (X axis) and " +"upwards (Y axis), while negative values skew the StyleBox towards the left " +"(X axis) and downwards (Y axis).\n" +"[b]Note:[/b] To ensure text does not touch the StyleBox's edges, consider " +"increasing the [StyleBox]'s content margin (see [member StyleBox." +"content_margin_bottom]). It is preferable to increase the content margin " +"instead of the expand margin (see [member expand_margin_bottom]), as " +"increasing the expand margin does not increase the size of the clickable " +"area for [Control]s." +msgstr "" + +#: doc/classes/StyleBoxLine.xml +msgid "[StyleBox] that displays a single line." +msgstr "" + +#: doc/classes/StyleBoxLine.xml +msgid "" +"[StyleBox] that displays a single line of a given color and thickness. It " +"can be used to draw things like separators." +msgstr "" + +#: doc/classes/StyleBoxLine.xml +msgid "The line's color." +msgstr "" + +#: doc/classes/StyleBoxLine.xml +msgid "" +"The number of pixels the line will extend before the [StyleBoxLine]'s " +"bounds. If set to a negative value, the line will begin inside the " +"[StyleBoxLine]'s bounds." +msgstr "" + +#: doc/classes/StyleBoxLine.xml +msgid "" +"The number of pixels the line will extend past the [StyleBoxLine]'s bounds. " +"If set to a negative value, the line will end inside the [StyleBoxLine]'s " +"bounds." +msgstr "" + +#: doc/classes/StyleBoxLine.xml +msgid "The line's thickness in pixels." +msgstr "" + +#: doc/classes/StyleBoxLine.xml +msgid "" +"If [code]true[/code], the line will be vertical. If [code]false[/code], the " +"line will be horizontal." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml +msgid "Texture-based nine-patch [StyleBox]." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml +msgid "" +"Texture-based nine-patch [StyleBox], in a way similar to [NinePatchRect]. " +"This stylebox performs a 3×3 scaling of a texture, where only the center " +"cell is fully stretched. This makes it possible to design bordered styles " +"regardless of the stylebox's size." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml +msgid "" +"Returns the size of the given [code]margin[/code]. See [enum Margin] for " +"possible values." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml +msgid "" +"Sets the margin to [code]size[/code] pixels for the given [code]margin[/" +"code]. See [enum Margin] for possible values." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml +msgid "" +"Controls how the stylebox's texture will be stretched or tiled horizontally. " +"See [enum AxisStretchMode] for possible values." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml +msgid "" +"Controls how the stylebox's texture will be stretched or tiled vertically. " +"See [enum AxisStretchMode] for possible values." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml +msgid "" +"If [code]true[/code], the nine-patch texture's center tile will be drawn." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml +msgid "" +"Expands the bottom margin of this style box when drawing, causing it to be " +"drawn larger than requested." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml +msgid "" +"Expands the left margin of this style box when drawing, causing it to be " +"drawn larger than requested." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml +msgid "" +"Expands the right margin of this style box when drawing, causing it to be " +"drawn larger than requested." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml +msgid "" +"Expands the top margin of this style box when drawing, causing it to be " +"drawn larger than requested." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml +msgid "" +"Increases the bottom margin of the 3×3 texture box.\n" +"A higher value means more of the source texture is considered to be part of " +"the bottom border of the 3×3 box.\n" +"This is also the value used as fallback for [member StyleBox." +"content_margin_bottom] if it is negative." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml +msgid "" +"Increases the left margin of the 3×3 texture box.\n" +"A higher value means more of the source texture is considered to be part of " +"the left border of the 3×3 box.\n" +"This is also the value used as fallback for [member StyleBox." +"content_margin_left] if it is negative." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml +msgid "" +"Increases the right margin of the 3×3 texture box.\n" +"A higher value means more of the source texture is considered to be part of " +"the right border of the 3×3 box.\n" +"This is also the value used as fallback for [member StyleBox." +"content_margin_right] if it is negative." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml +msgid "" +"Increases the top margin of the 3×3 texture box.\n" +"A higher value means more of the source texture is considered to be part of " +"the top border of the 3×3 box.\n" +"This is also the value used as fallback for [member StyleBox." +"content_margin_top] if it is negative." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml +msgid "Modulates the color of the texture when this style box is drawn." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml +msgid "" +"The normal map to use when drawing this style box.\n" +"[b]Note:[/b] Godot expects the normal map to use X+, Y-, and Z+ coordinates. " +"See [url=http://wiki.polycount.com/wiki/" +"Normal_Map_Technical_Details#Common_Swizzle_Coordinates]this page[/url] for " +"a comparison of normal map coordinates expected by popular engines." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml +msgid "" +"Species a sub-region of the texture to use.\n" +"This is equivalent to first wrapping the texture in an [AtlasTexture] with " +"the same region." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml +msgid "The texture to use when drawing this style box." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml +msgid "Emitted when the stylebox's texture is changed." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml +msgid "" +"Stretch the stylebox's texture. This results in visible distortion unless " +"the texture size matches the stylebox's size perfectly." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml +msgid "" +"Repeats the stylebox's texture to match the stylebox's size according to the " +"nine-patch system." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml +msgid "" +"Repeats the stylebox's texture to match the stylebox's size according to the " +"nine-patch system. Unlike [constant AXIS_STRETCH_MODE_TILE], the texture may " +"be slightly stretched to make the nine-patch texture tile seamlessly." +msgstr "" + +#: doc/classes/SurfaceTool.xml +msgid "Helper tool to create geometry." +msgstr "" + +#: doc/classes/SurfaceTool.xml +msgid "" +"The [SurfaceTool] is used to construct a [Mesh] by specifying vertex " +"attributes individually. It can be used to construct a [Mesh] from a script. " +"All properties except indices need to be added before calling [method " +"add_vertex]. For example, to add vertex colors and UVs:\n" +"[codeblock]\n" +"var st = SurfaceTool.new()\n" +"st.begin(Mesh.PRIMITIVE_TRIANGLES)\n" +"st.add_color(Color(1, 0, 0))\n" +"st.add_uv(Vector2(0, 0))\n" +"st.add_vertex(Vector3(0, 0, 0))\n" +"[/codeblock]\n" +"The above [SurfaceTool] now contains one vertex of a triangle which has a UV " +"coordinate and a specified [Color]. If another vertex were added without " +"calling [method add_uv] or [method add_color], then the last values would be " +"used.\n" +"Vertex attributes must be passed [b]before[/b] calling [method add_vertex]. " +"Failure to do so will result in an error when committing the vertex " +"information to a mesh.\n" +"Additionally, the attributes used before the first vertex is added determine " +"the format of the mesh. For example, if you only add UVs to the first " +"vertex, you cannot add color to any of the subsequent vertices.\n" +"See also [ArrayMesh], [ImmediateGeometry] and [MeshDataTool] for procedural " +"geometry generation.\n" +"[b]Note:[/b] Godot uses clockwise [url=https://learnopengl.com/Advanced-" +"OpenGL/Face-culling]winding order[/url] for front faces of triangle " +"primitive modes." +msgstr "" + +#: doc/classes/SurfaceTool.xml +msgid "" +"Specifies an array of bones to use for the [i]next[/i] vertex. [code]bones[/" +"code] must contain 4 integers." +msgstr "" + +#: doc/classes/SurfaceTool.xml +msgid "" +"Specifies a [Color] to use for the [i]next[/i] vertex. If every vertex needs " +"to have this information set and you fail to submit it for the first vertex, " +"this information may not be used at all.\n" +"[b]Note:[/b] The material must have [member SpatialMaterial." +"vertex_color_use_as_albedo] enabled for the vertex color to be visible." +msgstr "" + +#: doc/classes/SurfaceTool.xml +msgid "" +"Adds an index to index array if you are using indexed vertices. Does not " +"need to be called before adding vertices." +msgstr "" + +#: doc/classes/SurfaceTool.xml +msgid "" +"Specifies a normal to use for the [i]next[/i] vertex. If every vertex needs " +"to have this information set and you fail to submit it for the first vertex, " +"this information may not be used at all." +msgstr "" + +#: doc/classes/SurfaceTool.xml +msgid "" +"Specifies whether the current vertex (if using only vertex arrays) or " +"current index (if also using index arrays) should use smooth normals for " +"normal calculation." +msgstr "" + +#: doc/classes/SurfaceTool.xml +msgid "" +"Specifies a tangent to use for the [i]next[/i] vertex. If every vertex needs " +"to have this information set and you fail to submit it for the first vertex, " +"this information may not be used at all." +msgstr "" + +#: doc/classes/SurfaceTool.xml +msgid "" +"Inserts a triangle fan made of array data into [Mesh] being constructed.\n" +"Requires the primitive type be set to [constant Mesh.PRIMITIVE_TRIANGLES]." +msgstr "" + +#: doc/classes/SurfaceTool.xml +msgid "" +"Specifies a set of UV coordinates to use for the [i]next[/i] vertex. If " +"every vertex needs to have this information set and you fail to submit it " +"for the first vertex, this information may not be used at all." +msgstr "" + +#: doc/classes/SurfaceTool.xml +msgid "" +"Specifies an optional second set of UV coordinates to use for the [i]next[/" +"i] vertex. If every vertex needs to have this information set and you fail " +"to submit it for the first vertex, this information may not be used at all." +msgstr "" + +#: doc/classes/SurfaceTool.xml +msgid "" +"Specifies the position of current vertex. Should be called after specifying " +"other vertex properties (e.g. Color, UV)." +msgstr "" + +#: doc/classes/SurfaceTool.xml +msgid "" +"Specifies weight values to use for the [i]next[/i] vertex. [code]weights[/" +"code] must contain 4 values. If every vertex needs to have this information " +"set and you fail to submit it for the first vertex, this information may not " +"be used at all." +msgstr "" + +#: doc/classes/SurfaceTool.xml +msgid "" +"Append vertices from a given [Mesh] surface onto the current vertex array " +"with specified [Transform].\n" +"[b]Note:[/b] Using [method append_from] on a [Thread] is much slower as the " +"GPU must communicate data back to the CPU, while also causing the main " +"thread to stall (as OpenGL is not thread-safe). Consider requesting a copy " +"of the mesh, converting it to an [ArrayMesh] and adding vertices manually " +"instead." +msgstr "" + +#: doc/classes/SurfaceTool.xml +msgid "" +"Called before adding any vertices. Takes the primitive type as an argument " +"(e.g. [constant Mesh.PRIMITIVE_TRIANGLES])." +msgstr "" + +#: doc/classes/SurfaceTool.xml +msgid "Clear all information passed into the surface tool so far." +msgstr "" + +#: doc/classes/SurfaceTool.xml +msgid "" +"Returns a constructed [ArrayMesh] from current information passed in. If an " +"existing [ArrayMesh] is passed in as an argument, will add an extra surface " +"to the existing [ArrayMesh].\n" +"Default flag is [constant Mesh.ARRAY_COMPRESS_DEFAULT] if compression is " +"enabled. If compression is disabled the default flag is [constant Mesh." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION]. See [code]ARRAY_COMPRESS_*[/code] " +"constants in [enum Mesh.ArrayFormat] for other flags." +msgstr "" + +#: doc/classes/SurfaceTool.xml +msgid "" +"Commits the data to the same format used by [method ArrayMesh." +"add_surface_from_arrays]. This way you can further process the mesh data " +"using the [ArrayMesh] API." +msgstr "" + +#: doc/classes/SurfaceTool.xml +msgid "Creates a vertex array from an existing [Mesh]." +msgstr "" + +#: doc/classes/SurfaceTool.xml +msgid "" +"Creates a vertex array from the specified blend shape of an existing [Mesh]. " +"This can be used to extract a specific pose from a blend shape." +msgstr "" + +#: doc/classes/SurfaceTool.xml +msgid "Removes the index array by expanding the vertex array." +msgstr "" + +#: doc/classes/SurfaceTool.xml +msgid "" +"Generates normals from vertices so you do not have to do it manually. If " +"[code]flip[/code] is [code]true[/code], the resulting normals will be " +"inverted. [method generate_normals] should be called [i]after[/i] generating " +"geometry and [i]before[/i] committing the mesh using [method commit] or " +"[method commit_to_arrays]. For correct display of normal-mapped surfaces, " +"you will also have to generate tangents using [method generate_tangents].\n" +"[b]Note:[/b] [method generate_normals] only works if the primitive type to " +"be set to [constant Mesh.PRIMITIVE_TRIANGLES]." +msgstr "" + +#: doc/classes/SurfaceTool.xml +msgid "" +"Generates a tangent vector for each vertex. Requires that each vertex have " +"UVs and normals set already (see [method generate_normals])." +msgstr "" + +#: doc/classes/SurfaceTool.xml +msgid "" +"Shrinks the vertex array by creating an index array. This can improve " +"performance by avoiding vertex reuse." +msgstr "" + +#: doc/classes/SurfaceTool.xml +msgid "Sets [Material] to be used by the [Mesh] you are constructing." +msgstr "" + +#: doc/classes/TabContainer.xml +msgid "Tabbed container." +msgstr "" + +#: doc/classes/TabContainer.xml +msgid "" +"Arranges [Control] children into a tabbed view, creating a tab for each one. " +"The active tab's corresponding [Control] has its [code]visible[/code] " +"property set to [code]true[/code], and all other children's to [code]false[/" +"code].\n" +"Ignores non-[Control] children.\n" +"[b]Note:[/b] The drawing of the clickable tabs themselves is handled by this " +"node. Adding [Tabs] as children is not needed." +msgstr "" + +#: doc/classes/TabContainer.xml +msgid "Returns the child [Control] node located at the active tab index." +msgstr "" + +#: doc/classes/TabContainer.xml +msgid "" +"Returns the [Popup] node instance if one has been set already with [method " +"set_popup].\n" +"[b]Warning:[/b] This is a required internal node, removing and freeing it " +"may cause a crash. If you wish to hide it or any of its children, use their " +"[member CanvasItem.visible] property." +msgstr "" + +#: doc/classes/TabContainer.xml doc/classes/Tabs.xml +msgid "Returns the previously active tab index." +msgstr "" + +#: doc/classes/TabContainer.xml +msgid "Returns the [Control] node from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/TabContainer.xml doc/classes/Tabs.xml +msgid "Returns the number of tabs." +msgstr "" + +#: doc/classes/TabContainer.xml doc/classes/Tabs.xml +msgid "" +"Returns [code]true[/code] if the tab at index [code]tab_idx[/code] is " +"disabled." +msgstr "" + +#: doc/classes/TabContainer.xml +msgid "" +"Returns [code]true[/code] if the tab at index [code]tab_idx[/code] is hidden." +msgstr "" + +#: doc/classes/TabContainer.xml doc/classes/Tabs.xml +msgid "" +"Returns the [Texture] for the tab at index [code]tab_idx[/code] or " +"[code]null[/code] if the tab has no [Texture]." +msgstr "" + +#: doc/classes/TabContainer.xml +msgid "" +"Returns the index of the tab at local coordinates [code]point[/code]. " +"Returns [code]-1[/code] if the point is outside the control boundaries or if " +"there's no tab at the queried position." +msgstr "" + +#: doc/classes/TabContainer.xml +msgid "" +"Returns the title of the tab at index [code]tab_idx[/code]. Tab titles " +"default to the name of the indexed child node, but this can be overridden " +"with [method set_tab_title]." +msgstr "" + +#: doc/classes/TabContainer.xml +msgid "Returns the [TabContainer] rearrange group id." +msgstr "" + +#: doc/classes/TabContainer.xml +msgid "" +"If set on a [Popup] node instance, a popup menu icon appears in the top-" +"right corner of the [TabContainer]. Clicking it will expand the [Popup] node." +msgstr "" + +#: doc/classes/TabContainer.xml doc/classes/Tabs.xml +msgid "" +"If [code]disabled[/code] is [code]true[/code], disables the tab at index " +"[code]tab_idx[/code], making it non-interactable." +msgstr "" + +#: doc/classes/TabContainer.xml +msgid "" +"If [code]hidden[/code] is [code]true[/code], hides the tab at index " +"[code]tab_idx[/code], making it disappear from the tab area." +msgstr "" + +#: doc/classes/TabContainer.xml +msgid "Sets an icon for the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/TabContainer.xml +msgid "" +"Sets a title for the tab at index [code]tab_idx[/code]. Tab titles default " +"to the name of the indexed child node." +msgstr "" + +#: doc/classes/TabContainer.xml +msgid "" +"Defines rearrange group id, choose for each [TabContainer] the same value to " +"enable tab drag between [TabContainer]. Enable drag with [member " +"drag_to_rearrange_enabled]." +msgstr "" + +#: doc/classes/TabContainer.xml +msgid "" +"If [code]true[/code], all tabs are drawn in front of the panel. If " +"[code]false[/code], inactive tabs are drawn behind the panel." +msgstr "" + +#: doc/classes/TabContainer.xml +msgid "" +"The current tab index. When set, this index's [Control] node's " +"[code]visible[/code] property is set to [code]true[/code] and all others are " +"set to [code]false[/code]." +msgstr "" + +#: doc/classes/TabContainer.xml doc/classes/Tabs.xml +msgid "If [code]true[/code], tabs can be rearranged with mouse drag." +msgstr "" + +#: doc/classes/TabContainer.xml +msgid "" +"The alignment of all tabs in the tab container. See the [enum TabAlign] " +"constants for details." +msgstr "" + +#: doc/classes/TabContainer.xml +msgid "" +"If [code]true[/code], tabs are visible. If [code]false[/code], tabs' content " +"and titles are hidden." +msgstr "" + +#: doc/classes/TabContainer.xml +msgid "" +"If [code]true[/code], children [Control] nodes that are hidden have their " +"minimum size take into account in the total, instead of only the currently " +"visible one." +msgstr "" + +#: doc/classes/TabContainer.xml +msgid "" +"Emitted when the [TabContainer]'s [Popup] button is clicked. See [method " +"set_popup] for details." +msgstr "" + +#: doc/classes/TabContainer.xml doc/classes/Tabs.xml +msgid "Emitted when switching to another tab." +msgstr "" + +#: doc/classes/TabContainer.xml +msgid "Emitted when a tab is selected, even if it is the current tab." +msgstr "" + +#: doc/classes/TabContainer.xml doc/classes/Tabs.xml +msgid "Align the tabs to the left." +msgstr "" + +#: doc/classes/TabContainer.xml doc/classes/Tabs.xml +msgid "Align the tabs to the center." +msgstr "" + +#: doc/classes/TabContainer.xml doc/classes/Tabs.xml +msgid "Align the tabs to the right." +msgstr "" + +#: doc/classes/TabContainer.xml doc/classes/Tabs.xml +msgid "Font color of inactive tabs." +msgstr "" + +#: doc/classes/TabContainer.xml doc/classes/Tabs.xml +msgid "Font color of disabled tabs." +msgstr "" + +#: doc/classes/TabContainer.xml doc/classes/Tabs.xml +msgid "Font color of the currently selected tab." +msgstr "" + +#: doc/classes/TabContainer.xml +msgid "Horizontal separation between tabs." +msgstr "" + +#: doc/classes/TabContainer.xml +msgid "The space at the left and right edges of the tab bar." +msgstr "" + +#: doc/classes/TabContainer.xml doc/classes/Tabs.xml +msgid "The font used to draw tab names." +msgstr "" + +#: doc/classes/TabContainer.xml doc/classes/Tabs.xml +msgid "" +"Icon for the left arrow button that appears when there are too many tabs to " +"fit in the container width. When the button is disabled (i.e. the first tab " +"is visible), it appears semi-transparent." +msgstr "" + +#: doc/classes/TabContainer.xml doc/classes/Tabs.xml +msgid "" +"Icon for the left arrow button that appears when there are too many tabs to " +"fit in the container width. Used when the button is being hovered with the " +"cursor." +msgstr "" + +#: doc/classes/TabContainer.xml doc/classes/Tabs.xml +msgid "" +"Icon for the right arrow button that appears when there are too many tabs to " +"fit in the container width. When the button is disabled (i.e. the last tab " +"is visible) it appears semi-transparent." +msgstr "" + +#: doc/classes/TabContainer.xml doc/classes/Tabs.xml +msgid "" +"Icon for the right arrow button that appears when there are too many tabs to " +"fit in the container width. Used when the button is being hovered with the " +"cursor." +msgstr "" + +#: doc/classes/TabContainer.xml +msgid "The icon for the menu button (see [method set_popup])." +msgstr "" + +#: doc/classes/TabContainer.xml +msgid "" +"The icon for the menu button (see [method set_popup]) when it's being " +"hovered with the cursor." +msgstr "" + +#: doc/classes/TabContainer.xml +msgid "The style for the background fill." +msgstr "" + +#: doc/classes/TabContainer.xml +msgid "The style of inactive tabs." +msgstr "" + +#: doc/classes/TabContainer.xml +msgid "The style of disabled tabs." +msgstr "" + +#: doc/classes/TabContainer.xml doc/classes/Tabs.xml +msgid "The style of the currently selected tab." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "Tabs control." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "" +"Simple tabs control, similar to [TabContainer] but is only in charge of " +"drawing tabs, not interacting with children." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "Adds a new tab." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "Moves the scroll view to make the tab visible." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "" +"Returns [code]true[/code] if the offset buttons (the ones that appear when " +"there's not enough space for all tabs) are visible." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "Returns [code]true[/code] if select with right mouse button is enabled." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "Returns the number of hidden tabs offsetted to the left." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "Returns tab [Rect2] with local position and size." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "Returns the title of the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "Returns the [Tabs]' rearrange group ID." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "Moves a tab from [code]from[/code] to [code]to[/code]." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "Removes the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "" +"If [code]true[/code], enables selecting a tab with the right mouse button." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "Sets a [code]title[/code] for the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "" +"Defines the rearrange group ID. Choose for each [Tabs] the same value to " +"dragging tabs between [Tabs]. Enable drag with [member " +"drag_to_rearrange_enabled]." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "Select tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "" +"if [code]true[/code], the mouse's scroll wheel can be used to navigate the " +"scroll view." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "The alignment of all tabs. See [enum TabAlign] for details." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "" +"Sets when the close button will appear on the tabs. See [enum " +"CloseButtonDisplayPolicy] for details." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "" +"Emitted when the active tab is rearranged via mouse drag. See [member " +"drag_to_rearrange_enabled]." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "Emitted when a tab is clicked, even if it is the current tab." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "Emitted when a tab is closed." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "Emitted when a tab is hovered by the mouse." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "Represents the size of the [enum TabAlign] enum." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "Never show the close buttons." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "Only show the close button on the currently active tab." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "Show the close button on all tabs." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "Represents the size of the [enum CloseButtonDisplayPolicy] enum." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "The horizontal separation between the tabs." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "The icon for the close button (see [member tab_close_display_policy])." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "Background of the close button when it's being hovered with the cursor." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "Background of the close button when it's being pressed." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "The style of an inactive tab." +msgstr "" + +#: doc/classes/Tabs.xml +msgid "The style of a disabled tab" +msgstr "" + +#: doc/classes/TCP_Server.xml +msgid "A TCP server." +msgstr "" + +#: doc/classes/TCP_Server.xml +msgid "" +"A TCP server. Listens to connections on a port and returns a [StreamPeerTCP] " +"when it gets an incoming connection." +msgstr "" + +#: doc/classes/TCP_Server.xml +msgid "Returns [code]true[/code] if a connection is available for taking." +msgstr "" + +#: doc/classes/TCP_Server.xml +msgid "" +"Returns [code]true[/code] if the server is currently listening for " +"connections." +msgstr "" + +#: doc/classes/TCP_Server.xml +msgid "" +"Listen on the [code]port[/code] binding to [code]bind_address[/code].\n" +"If [code]bind_address[/code] is set as [code]\"*\"[/code] (default), the " +"server will listen on all available addresses (both IPv4 and IPv6).\n" +"If [code]bind_address[/code] is set as [code]\"0.0.0.0\"[/code] (for IPv4) " +"or [code]\"::\"[/code] (for IPv6), the server will listen on all available " +"addresses matching that IP type.\n" +"If [code]bind_address[/code] is set to any valid address (e.g. " +"[code]\"192.168.1.101\"[/code], [code]\"::1\"[/code], etc), the server will " +"only listen on the interface with that addresses (or fail if no interface " +"with the given address exists)." +msgstr "" + +#: doc/classes/TCP_Server.xml +msgid "Stops listening." +msgstr "" + +#: doc/classes/TCP_Server.xml +msgid "" +"If a connection is available, returns a StreamPeerTCP with the connection." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Multiline text editing control." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"TextEdit is meant for editing large, multiline text. It also has facilities " +"for editing code, such as syntax highlighting support and multiple levels of " +"undo/redo.\n" +"[b]Note:[/b] When holding down [code]Alt[/code], the vertical scroll wheel " +"will scroll 5 times as fast as it would normally do. This also works in the " +"Godot script editor." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Adds color region (given the delimiters) and its colors." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Adds a [code]keyword[/code] and its [Color]." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Returns if the given line is foldable, that is, it has indented lines right " +"below it." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Centers the viewport on the line the editing cursor is at. This also resets " +"the [member scroll_horizontal] value to [code]0[/code]." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Clears all custom syntax coloring information previously added with [method " +"add_color_region] or [method add_keyword_color]." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Clears the undo history." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Copy's the current text selection." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Returns the column the editing cursor is at." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Returns the line the editing cursor is at." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Moves the cursor at the specified [code]column[/code] index.\n" +"If [code]adjust_viewport[/code] is set to [code]true[/code], the viewport " +"will center at the cursor position after the move occurs." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Moves the cursor at the specified [code]line[/code] index.\n" +"If [code]adjust_viewport[/code] is set to [code]true[/code], the viewport " +"will center at the cursor position after the move occurs.\n" +"If [code]can_be_hidden[/code] is set to [code]true[/code], the specified " +"[code]line[/code] can be hidden using [method set_line_as_hidden]." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Cut's the current selection." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Deselects the current selection." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Folds all lines that are possible to be folded (see [method can_fold])." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Folds the given line, if possible (see [method can_fold])." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Returns an array containing the line number of each breakpoint." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Returns the [Color] of the specified [code]keyword[/code]." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Returns the text of a specific line." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Returns the line and column at the given position. In the returned vector, " +"[code]x[/code] is the column, [code]y[/code] is the line." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Returns the amount of total lines in the text." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Returns the height of a largest line." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Returns the width in pixels of the [code]wrap_index[/code] on [code]line[/" +"code]." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Returns the number of times the given line is wrapped." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Returns an array of [String]s representing each wrapped index." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Returns the [PopupMenu] of this [TextEdit]. By default, this menu is " +"displayed when right-clicking on the [TextEdit].\n" +"[b]Warning:[/b] This is a required internal node, removing and freeing it " +"may cause a crash. If you wish to hide it or any of its children, use their " +"[member CanvasItem.visible] property." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Returns the local position for the given [code]line[/code] and [code]column[/" +"code]. If [code]x[/code] or [code]y[/code] of the returned vector equal " +"[code]-1[/code], the position is outside of the viewable area of the " +"control.\n" +"[b]Note:[/b] The Y position corresponds to the bottom side of the line. Use " +"[method get_rect_at_line_column] to get the top side position." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Returns the local position and size for the grapheme at the given " +"[code]line[/code] and [code]column[/code]. If [code]x[/code] or [code]y[/" +"code] position of the returned rect equal [code]-1[/code], the position is " +"outside of the viewable area of the control.\n" +"[b]Note:[/b] The Y position of the returned rect corresponds to the top side " +"of the line, unlike [method get_pos_at_line_column] which returns the bottom " +"side." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Returns the selection begin line." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Returns the text inside the selection." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Returns the selection end line." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Returns the total width of all gutters and internal padding." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Returns the total amount of lines that could be drawn." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Returns the number of visible lines, including wrapped text." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Returns a [String] text with the word under the caret (text cursor) location." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Returns whether the specified [code]keyword[/code] has a color set to it or " +"not." +msgstr "" + +#: doc/classes/TextEdit.xml doc/classes/UndoRedo.xml +msgid "Returns [code]true[/code] if a \"redo\" action is available." +msgstr "" + +#: doc/classes/TextEdit.xml doc/classes/UndoRedo.xml +msgid "Returns [code]true[/code] if an \"undo\" action is available." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Insert the specified text at the cursor position." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Returns whether the line at the specified index is folded or not." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Returns whether the line at the specified index is hidden or not." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Returns [code]true[/code] when the specified [code]line[/code] is bookmarked." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Returns [code]true[/code] when the specified [code]line[/code] has a " +"breakpoint." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Returns [code]true[/code] when the specified [code]line[/code] is marked as " +"safe." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Returns if the given line is wrapped." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Returns whether the mouse is over selection. If [code]edges[/code] is " +"[code]true[/code], the edges are considered part of the selection." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Returns [code]true[/code] if the selection is active." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Triggers a right-click menu action by the specified index. See [enum " +"MenuItems] for a list of available indexes." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Paste the current selection." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Perform redo operation." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Removes all the breakpoints. This will not fire the [signal " +"breakpoint_toggled] signal." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Perform a search inside the text. Search flags can be specified in the [enum " +"SearchFlags] enum.\n" +"Returns an empty [code]PoolIntArray[/code] if no result was found. " +"Otherwise, the result line and column can be accessed at indices specified " +"in the [enum SearchResult] enum, e.g:\n" +"[codeblock]\n" +"var result = search(key, flags, line, column)\n" +"if result.size() > 0:\n" +" # Result found.\n" +" var res_line = result[TextEdit.SEARCH_RESULT_LINE]\n" +" var res_column = result[TextEdit.SEARCH_RESULT_COLUMN]\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Perform selection, from line/column to line/column.\n" +"If [member selecting_enabled] is [code]false[/code], no selection will occur." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Select all the text.\n" +"If [member selecting_enabled] is [code]false[/code], no selection will occur." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Sets the text for a specific line." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Bookmarks the [code]line[/code] if [code]bookmark[/code] is [code]true[/" +"code]. Deletes the bookmark if [code]bookmark[/code] is [code]false[/code].\n" +"Bookmarks are shown in the [member breakpoint_gutter]." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Adds or removes the breakpoint in [code]line[/code]. Breakpoints are shown " +"in the [member breakpoint_gutter]." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "If [code]true[/code], hides the line of the specified index." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"If [code]true[/code], marks the [code]line[/code] as safe.\n" +"This will show the line number with the color provided in the " +"[code]safe_line_number_color[/code] theme property." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Toggle the folding of the code block at the given line." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Perform undo operation." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Unfolds the given line, if folded." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Unhide all lines that were previously set to hidden by [method " +"set_line_as_hidden]." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "If [code]true[/code], the bookmark gutter is visible." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "If [code]true[/code], the breakpoint gutter is visible." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"If [code]true[/code], the caret displays as a rectangle.\n" +"If [code]false[/code], the caret displays as a bar." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"If [code]true[/code], a right-click moves the cursor at the mouse position " +"before displaying the context menu.\n" +"If [code]false[/code], the context menu disregards mouse location." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "If [code]true[/code], a right-click displays the context menu." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "If [code]true[/code], allow drag and drop of selected text." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"If [code]true[/code], the \"space\" character will have a visible " +"representation." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"If [code]true[/code], the \"tab\" character will have a visible " +"representation." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"If [code]true[/code], the fold gutter is visible. This enables folding " +"groups of indented lines." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"If [code]true[/code], all lines that have been set to hidden by [method " +"set_line_as_hidden], will not be visible." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"If [code]true[/code], all occurrences of the selected text will be " +"highlighted." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "If [code]true[/code], the line containing the cursor is highlighted." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"If [code]true[/code], a minimap is shown, providing an outline of your " +"source code." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "The width, in pixels, of the minimap." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"If [code]true[/code], custom [code]font_color_selected[/code] will be used " +"for selected text." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"If [code]true[/code], read-only mode is enabled. Existing text cannot be " +"modified and new text cannot be added." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"If there is a horizontal scrollbar, this determines the current horizontal " +"scroll value in pixels." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"If there is a vertical scrollbar, this determines the current vertical " +"scroll value in line numbers, starting at 0 for the top line." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"If [code]true[/code], text can be selected.\n" +"If [code]false[/code], text can not be selected by the user or by the " +"[method select] or [method select_all] methods." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"If [code]true[/code], shortcut keys for context menu items are enabled, even " +"if the context menu is disabled." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"If [code]true[/code], line numbers are displayed to the left of the text." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"If [code]true[/code], sets the [code]step[/code] of the scrollbars to " +"[code]0.25[/code] which results in smoother scrolling." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"If [code]true[/code], any custom color properties that have been set for " +"this [TextEdit] will be visible." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "String value of the [TextEdit]." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Vertical scroll sensitivity." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"If [code]true[/code], enables text wrapping when it goes beyond the edge of " +"what is visible." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Emitted when a breakpoint is placed via the breakpoint gutter." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Emitted when the cursor changes." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Emitted when the info icon is clicked." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Match case when searching." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Match whole words when searching." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Search from end to beginning." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Used to access the result column from [method search]." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Used to access the result line from [method search]." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Pastes the clipboard text over the selected text (or at the cursor's " +"position)." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Erases the whole [TextEdit] text." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Selects the whole [TextEdit] text." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Redoes the previous action." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Sets the background [Color] of this [TextEdit]. [member syntax_highlighting] " +"has to be enabled." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Sets the [Color] of the bookmark marker. [member syntax_highlighting] has to " +"be enabled." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Sets the [Color] of the breakpoints. [member breakpoint_gutter] has to be " +"enabled." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Sets the font [Color]." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Sets the [Color] of the selected text. [member override_selected_font_color] " +"has to be enabled." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Sets the [Color] of the line numbers. [member show_line_numbers] has to be " +"enabled." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Sets the [Color] of marked text." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Sets the highlight [Color] of text selections." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Sets the highlight [Color] of multiple occurrences. [member " +"highlight_all_occurrences] has to be enabled." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Sets the spacing between the lines." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Sets the default [Font]." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Sets a custom [Texture] for tab text characters." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "Sets the [StyleBox] of this [TextEdit]." +msgstr "" + +#: doc/classes/TextEdit.xml +msgid "" +"Sets the [StyleBox] of this [TextEdit] when [member readonly] is enabled." +msgstr "" + +#: doc/classes/TextMesh.xml +msgid "Generate an [PrimitiveMesh] from the text." +msgstr "" + +#: doc/classes/TextMesh.xml +msgid "" +"Generate an [PrimitiveMesh] from the text.\n" +"TextMesh can be generated only when using dynamic fonts with vector glyph " +"contours. Bitmap fonts (including bitmap data in the TrueType/OpenType " +"containers, like color emoji fonts) are not supported.\n" +"The UV layout is arranged in 4 horizontal strips, top to bottom: 40% of the " +"height for the front face, 40% for the back face, 10% for the outer edges " +"and 10% for the inner edges." +msgstr "" + +#: doc/classes/TextMesh.xml +msgid "Step (in pixels) used to approximate Bézier curves." +msgstr "" + +#: doc/classes/TextMesh.xml +msgid "" +"Depths of the mesh, if set to [code]0.0[/code] only front surface, is " +"generated, and UV layout is changed to use full texture for the front face " +"only." +msgstr "" + +#: doc/classes/TextMesh.xml +msgid "[Font] used for the [TextMesh]'s text." +msgstr "" + +#: doc/classes/TextMesh.xml +msgid "" +"Controls the text's horizontal alignment. Supports left, center and right. " +"Set it to one of the [enum Align] constants." +msgstr "" + +#: doc/classes/TextMesh.xml +msgid "The size of one pixel's width on the text to scale it in 3D." +msgstr "" + +#: doc/classes/TextMesh.xml +msgid "The text to generate mesh from." +msgstr "" + +#: doc/classes/Texture.xml +msgid "Texture for 2D and 3D." +msgstr "" + +#: doc/classes/Texture.xml +msgid "" +"A texture works by registering an image in the video hardware, which then " +"can be used in 3D models or 2D [Sprite] or GUI [Control].\n" +"Textures are often created by loading them from a file. See [method " +"@GDScript.load].\n" +"[Texture] is a base for other resources. It cannot be used directly.\n" +"[b]Note:[/b] The maximum texture size is 16384×16384 pixels due to graphics " +"hardware limitations. Larger textures may fail to import." +msgstr "" + +#: doc/classes/Texture.xml +msgid "" +"Draws the texture using a [CanvasItem] with the [VisualServer] API at the " +"specified [code]position[/code]. Equivalent to [method VisualServer." +"canvas_item_add_texture_rect] with a rect at [code]position[/code] and the " +"size of this [Texture]." +msgstr "" + +#: doc/classes/Texture.xml +msgid "" +"Draws the texture using a [CanvasItem] with the [VisualServer] API. " +"Equivalent to [method VisualServer.canvas_item_add_texture_rect]." +msgstr "" + +#: doc/classes/Texture.xml +msgid "" +"Draws a part of the texture using a [CanvasItem] with the [VisualServer] " +"API. Equivalent to [method VisualServer.canvas_item_add_texture_rect_region]." +msgstr "" + +#: doc/classes/Texture.xml +msgid "" +"Returns an [Image] that is a copy of data from this [Texture]. [Image]s can " +"be accessed and manipulated directly." +msgstr "" + +#: doc/classes/Texture.xml +msgid "Returns the texture height." +msgstr "" + +#: doc/classes/Texture.xml +msgid "Returns the texture size." +msgstr "" + +#: doc/classes/Texture.xml +msgid "Returns the texture width." +msgstr "" + +#: doc/classes/Texture.xml +msgid "Returns [code]true[/code] if this [Texture] has an alpha channel." +msgstr "" + +#: doc/classes/Texture.xml +msgid "" +"The texture's [enum Flags]. [enum Flags] are used to set various properties " +"of the [Texture]." +msgstr "" + +#: doc/classes/Texture.xml +msgid "" +"Default flags. [constant FLAG_MIPMAPS], [constant FLAG_REPEAT] and [constant " +"FLAG_FILTER] are enabled." +msgstr "" + +#: doc/classes/Texture.xml doc/classes/VisualServer.xml +msgid "" +"Generates mipmaps, which are smaller versions of the same texture to use " +"when zoomed out, keeping the aspect ratio." +msgstr "" + +#: doc/classes/Texture.xml +msgid "" +"Repeats the texture (instead of clamp to edge).\n" +"[b]Note:[/b] Ignored when using an [AtlasTexture] as these don't support " +"repetition." +msgstr "" + +#: doc/classes/Texture.xml doc/classes/VisualServer.xml +msgid "Uses a magnifying filter, to enable smooth zooming in of the texture." +msgstr "" + +#: doc/classes/Texture.xml doc/classes/TextureLayered.xml +#: doc/classes/VisualServer.xml +msgid "" +"Uses anisotropic mipmap filtering. Generates smaller versions of the same " +"texture with different aspect ratios.\n" +"This results in better-looking textures when viewed from oblique angles." +msgstr "" + +#: doc/classes/Texture.xml doc/classes/VisualServer.xml +msgid "Converts the texture to the sRGB color space." +msgstr "" + +#: doc/classes/Texture.xml +msgid "" +"Repeats the texture with alternate sections mirrored.\n" +"[b]Note:[/b] Ignored when using an [AtlasTexture] as these don't support " +"repetition." +msgstr "" + +#: doc/classes/Texture.xml doc/classes/VisualServer.xml +msgid "Texture is a video surface." +msgstr "" + +#: doc/classes/Texture3D.xml +msgid "Texture with 3 dimensions." +msgstr "" + +#: doc/classes/Texture3D.xml +msgid "" +"Texture3D is a 3-dimensional [Texture] that has a width, height, and depth. " +"See also [TextureArray].\n" +"[b]Note:[/b] [Texture3D]s can only be sampled in shaders in the GLES3 " +"backend. In GLES2, their data can be accessed via scripting, but there is no " +"way to render them in a hardware-accelerated manner." +msgstr "" + +#: doc/classes/Texture3D.xml +msgid "" +"Creates the Texture3D with specified [code]width[/code], [code]height[/" +"code], and [code]depth[/code]. See [enum Image.Format] for [code]format[/" +"code] options. See [enum TextureLayered.Flags] enumerator for [code]flags[/" +"code] options." +msgstr "" + +#: doc/classes/TextureArray.xml +msgid "Array of textures stored in a single primitive." +msgstr "" + +#: doc/classes/TextureArray.xml +msgid "" +"[TextureArray]s store an array of [Image]s in a single [Texture] primitive. " +"Each layer of the texture array has its own mipmap chain. This makes it is a " +"good alternative to texture atlases. See also [Texture3D].\n" +"[TextureArray]s must be displayed using shaders. After importing your file " +"as a [TextureArray] and setting the appropriate Horizontal and Vertical " +"Slices, display it by setting it as a uniform to a shader, for example " +"(2D):\n" +"[codeblock]\n" +"shader_type canvas_item;\n" +"\n" +"uniform sampler2DArray tex;\n" +"uniform int index;\n" +"\n" +"void fragment() {\n" +" COLOR = texture(tex, vec3(UV.x, UV.y, float(index)));\n" +"}\n" +"[/codeblock]\n" +"Set the integer uniform \"index\" to show a particular part of the texture " +"as defined by the Horizontal and Vertical Slices in the importer.\n" +"[b]Note:[/b] When sampling an albedo texture from a texture array in 3D, the " +"sRGB -> linear conversion hint ([code]hint_albedo[/code]) should be used to " +"prevent colors from looking washed out:\n" +"[codeblock]\n" +"shader_type spatial;\n" +"\n" +"uniform sampler2DArray tex : hint_albedo;\n" +"uniform int index;\n" +"\n" +"void fragment() {\n" +" ALBEDO = texture(tex, vec3(UV.x, UV.y, float(index)));\n" +"}\n" +"[/codeblock]\n" +"[b]Note:[/b] [TextureArray]s can only be sampled in shaders in the GLES3 " +"backend. In GLES2, their data can be accessed via scripting, but there is no " +"way to render them in a hardware-accelerated manner." +msgstr "" + +#: doc/classes/TextureArray.xml +msgid "" +"Creates the TextureArray with specified [code]width[/code], [code]height[/" +"code], and [code]depth[/code]. See [enum Image.Format] for [code]format[/" +"code] options. See [enum TextureLayered.Flags] enumerator for [code]flags[/" +"code] options." +msgstr "" + +#: doc/classes/TextureButton.xml +msgid "" +"Texture-based button. Supports Pressed, Hover, Disabled and Focused states." +msgstr "" + +#: doc/classes/TextureButton.xml +msgid "" +"[TextureButton] has the same functionality as [Button], except it uses " +"sprites instead of Godot's [Theme] resource. It is faster to create, but it " +"doesn't support localization like more complex [Control]s.\n" +"The \"normal\" state must contain a texture ([member texture_normal]); other " +"textures are optional.\n" +"See also [BaseButton] which contains common properties and methods " +"associated with this node." +msgstr "" + +#: doc/classes/TextureButton.xml +msgid "" +"If [code]true[/code], the texture stretches to the edges of the node's " +"bounding rectangle using the [member stretch_mode]. If [code]false[/code], " +"the texture will not scale with the node." +msgstr "" + +#: doc/classes/TextureButton.xml +msgid "" +"Controls the texture's behavior when you resize the node's bounding " +"rectangle, [b]only if[/b] [member expand] is [code]true[/code]. Set it to " +"one of the [enum StretchMode] constants. See the constants to learn more." +msgstr "" + +#: doc/classes/TextureButton.xml +msgid "" +"Pure black and white [BitMap] image to use for click detection. On the mask, " +"white pixels represent the button's clickable area. Use it to create buttons " +"with curved shapes." +msgstr "" + +#: doc/classes/TextureButton.xml +msgid "" +"Texture to display when the node is disabled. See [member BaseButton." +"disabled]." +msgstr "" + +#: doc/classes/TextureButton.xml +msgid "Texture to display when the node has mouse or keyboard focus." +msgstr "" + +#: doc/classes/TextureButton.xml +msgid "Texture to display when the mouse hovers the node." +msgstr "" + +#: doc/classes/TextureButton.xml +msgid "" +"Texture to display by default, when the node is [b]not[/b] in the disabled, " +"focused, hover or pressed state." +msgstr "" + +#: doc/classes/TextureButton.xml +msgid "" +"Texture to display on mouse down over the node, if the node has keyboard " +"focus and the player presses the Enter key or if the player presses the " +"[member BaseButton.shortcut] key." +msgstr "" + +#: doc/classes/TextureButton.xml doc/classes/TextureRect.xml +msgid "Scale to fit the node's bounding rectangle." +msgstr "" + +#: doc/classes/TextureButton.xml doc/classes/TextureRect.xml +msgid "Tile inside the node's bounding rectangle." +msgstr "" + +#: doc/classes/TextureButton.xml doc/classes/TextureRect.xml +msgid "" +"The texture keeps its original size and stays in the bounding rectangle's " +"top-left corner." +msgstr "" + +#: doc/classes/TextureButton.xml doc/classes/TextureRect.xml +msgid "" +"The texture keeps its original size and stays centered in the node's " +"bounding rectangle." +msgstr "" + +#: doc/classes/TextureButton.xml doc/classes/TextureRect.xml +msgid "" +"Scale the texture to fit the node's bounding rectangle, but maintain the " +"texture's aspect ratio." +msgstr "" + +#: doc/classes/TextureButton.xml +msgid "" +"Scale the texture to fit the node's bounding rectangle, center it, and " +"maintain its aspect ratio." +msgstr "" + +#: doc/classes/TextureButton.xml doc/classes/TextureRect.xml +msgid "" +"Scale the texture so that the shorter side fits the bounding rectangle. The " +"other side clips to the node's limits." +msgstr "" + +#: doc/classes/TextureLayered.xml +msgid "Base class for 3D texture types." +msgstr "" + +#: doc/classes/TextureLayered.xml +msgid "" +"Base class for [Texture3D] and [TextureArray]. Cannot be used directly, but " +"contains all the functions necessary for accessing and using [Texture3D] and " +"[TextureArray]. Data is set on a per-layer basis. For [Texture3D]s, the " +"layer specifies the depth or Z-index, they can be treated as a bunch of 2D " +"slices. Similarly, for [TextureArray]s, the layer specifies the array layer." +msgstr "" + +#: doc/classes/TextureLayered.xml +msgid "" +"Returns the depth of the texture. Depth is the 3rd dimension (typically Z-" +"axis)." +msgstr "" + +#: doc/classes/TextureLayered.xml +msgid "" +"Returns the current format being used by this texture. See [enum Image." +"Format] for details." +msgstr "" + +#: doc/classes/TextureLayered.xml +msgid "" +"Returns the height of the texture. Height is typically represented by the Y-" +"axis." +msgstr "" + +#: doc/classes/TextureLayered.xml +msgid "" +"Returns an [Image] resource with the data from specified [code]layer[/code]." +msgstr "" + +#: doc/classes/TextureLayered.xml +msgid "" +"Returns the width of the texture. Width is typically represented by the X-" +"axis." +msgstr "" + +#: doc/classes/TextureLayered.xml +msgid "" +"Partially sets the data for a specified [code]layer[/code] by overwriting " +"using the data of the specified [code]image[/code]. [code]x_offset[/code] " +"and [code]y_offset[/code] determine where the [Image] is \"stamped\" over " +"the texture. The [code]image[/code] must fit within the texture." +msgstr "" + +#: doc/classes/TextureLayered.xml +msgid "" +"Sets the data for the specified layer. Data takes the form of a 2-" +"dimensional [Image] resource." +msgstr "" + +#: doc/classes/TextureLayered.xml +msgid "Returns a dictionary with all the data used by this texture." +msgstr "" + +#: doc/classes/TextureLayered.xml +msgid "Specifies which [enum Flags] apply to this texture." +msgstr "" + +#: doc/classes/TextureLayered.xml +msgid "" +"Default flags for [TextureArray]. [constant FLAG_MIPMAPS], [constant " +"FLAG_REPEAT] and [constant FLAG_FILTER] are enabled." +msgstr "" + +#: doc/classes/TextureLayered.xml +msgid "Default flags for [Texture3D]. [constant FLAG_FILTER] is enabled." +msgstr "" + +#: doc/classes/TextureLayered.xml +msgid "Texture will generate mipmaps on creation." +msgstr "" + +#: doc/classes/TextureLayered.xml +msgid "Texture will repeat when UV used is outside the 0-1 range." +msgstr "" + +#: doc/classes/TextureLayered.xml +msgid "" +"Use filtering when reading from texture. Filtering smooths out pixels. " +"Turning filtering off is slightly faster and more appropriate when you need " +"access to individual pixels." +msgstr "" + +#: doc/classes/TextureProgress.xml +msgid "" +"Texture-based progress bar. Useful for loading screens and life or stamina " +"bars." +msgstr "" + +#: doc/classes/TextureProgress.xml +msgid "" +"TextureProgress works like [ProgressBar], but uses up to 3 textures instead " +"of Godot's [Theme] resource. It can be used to create horizontal, vertical " +"and radial progress bars." +msgstr "" + +#: doc/classes/TextureProgress.xml +msgid "The fill direction. See [enum FillMode] for possible values." +msgstr "" + +#: doc/classes/TextureProgress.xml +msgid "" +"If [code]true[/code], Godot treats the bar's textures like in " +"[NinePatchRect]. Use the [code]stretch_margin_*[/code] properties like " +"[member stretch_margin_bottom] to set up the nine patch's 3×3 grid. When " +"using a radial [member fill_mode], this setting will enable stretching." +msgstr "" + +#: doc/classes/TextureProgress.xml +msgid "" +"Offsets [member texture_progress] if [member fill_mode] is [constant " +"FILL_CLOCKWISE] or [constant FILL_COUNTER_CLOCKWISE]." +msgstr "" + +#: doc/classes/TextureProgress.xml +msgid "" +"Upper limit for the fill of [member texture_progress] if [member fill_mode] " +"is [constant FILL_CLOCKWISE] or [constant FILL_COUNTER_CLOCKWISE]. When the " +"node's [code]value[/code] is equal to its [code]max_value[/code], the " +"texture fills up to this angle.\n" +"See [member Range.value], [member Range.max_value]." +msgstr "" + +#: doc/classes/TextureProgress.xml +msgid "" +"Starting angle for the fill of [member texture_progress] if [member " +"fill_mode] is [constant FILL_CLOCKWISE] or [constant " +"FILL_COUNTER_CLOCKWISE]. When the node's [code]value[/code] is equal to its " +"[code]min_value[/code], the texture doesn't show up at all. When the " +"[code]value[/code] increases, the texture fills and tends towards [member " +"radial_fill_degrees]." +msgstr "" + +#: doc/classes/TextureProgress.xml +msgid "" +"The height of the 9-patch's bottom row. A margin of 16 means the 9-slice's " +"bottom corners and side will have a height of 16 pixels. You can set all 4 " +"margin values individually to create panels with non-uniform borders." +msgstr "" + +#: doc/classes/TextureProgress.xml +msgid "The width of the 9-patch's left column." +msgstr "" + +#: doc/classes/TextureProgress.xml +msgid "The width of the 9-patch's right column." +msgstr "" + +#: doc/classes/TextureProgress.xml +msgid "The height of the 9-patch's top row." +msgstr "" + +#: doc/classes/TextureProgress.xml +msgid "" +"[Texture] that draws over the progress bar. Use it to add highlights or an " +"upper-frame that hides part of [member texture_progress]." +msgstr "" + +#: doc/classes/TextureProgress.xml +msgid "" +"[Texture] that clips based on the node's [code]value[/code] and [member " +"fill_mode]. As [code]value[/code] increased, the texture fills up. It shows " +"entirely when [code]value[/code] reaches [code]max_value[/code]. It doesn't " +"show at all if [code]value[/code] is equal to [code]min_value[/code].\n" +"The [code]value[/code] property comes from [Range]. See [member Range." +"value], [member Range.min_value], [member Range.max_value]." +msgstr "" + +#: doc/classes/TextureProgress.xml +msgid "" +"The offset of [member texture_progress]. Useful for [member texture_over] " +"and [member texture_under] with fancy borders, to avoid transparent margins " +"in your progress texture." +msgstr "" + +#: doc/classes/TextureProgress.xml +msgid "[Texture] that draws under the progress bar. The bar's background." +msgstr "" + +#: doc/classes/TextureProgress.xml +msgid "" +"Multiplies the color of the bar's [code]texture_over[/code] texture. The " +"effect is similar to [member CanvasItem.modulate], except it only affects " +"this specific texture instead of the entire node." +msgstr "" + +#: doc/classes/TextureProgress.xml +msgid "" +"Multiplies the color of the bar's [code]texture_progress[/code] texture." +msgstr "" + +#: doc/classes/TextureProgress.xml +msgid "Multiplies the color of the bar's [code]texture_under[/code] texture." +msgstr "" + +#: doc/classes/TextureProgress.xml +msgid "The [member texture_progress] fills from left to right." +msgstr "" + +#: doc/classes/TextureProgress.xml +msgid "The [member texture_progress] fills from right to left." +msgstr "" + +#: doc/classes/TextureProgress.xml +msgid "The [member texture_progress] fills from top to bottom." +msgstr "" + +#: doc/classes/TextureProgress.xml +msgid "The [member texture_progress] fills from bottom to top." +msgstr "" + +#: doc/classes/TextureProgress.xml +msgid "" +"Turns the node into a radial bar. The [member texture_progress] fills " +"clockwise. See [member radial_center_offset], [member radial_initial_angle] " +"and [member radial_fill_degrees] to control the way the bar fills up." +msgstr "" + +#: doc/classes/TextureProgress.xml +msgid "" +"Turns the node into a radial bar. The [member texture_progress] fills " +"counterclockwise. See [member radial_center_offset], [member " +"radial_initial_angle] and [member radial_fill_degrees] to control the way " +"the bar fills up." +msgstr "" + +#: doc/classes/TextureProgress.xml +msgid "" +"The [member texture_progress] fills from the center, expanding both towards " +"the left and the right." +msgstr "" + +#: doc/classes/TextureProgress.xml +msgid "" +"The [member texture_progress] fills from the center, expanding both towards " +"the top and the bottom." +msgstr "" + +#: doc/classes/TextureProgress.xml +msgid "" +"Turns the node into a radial bar. The [member texture_progress] fills " +"radially from the center, expanding both clockwise and counterclockwise. See " +"[member radial_center_offset], [member radial_initial_angle] and [member " +"radial_fill_degrees] to control the way the bar fills up." +msgstr "" + +#: doc/classes/TextureRect.xml +msgid "Control for drawing textures." +msgstr "" + +#: doc/classes/TextureRect.xml +msgid "" +"Used to draw icons and sprites in a user interface. The texture's placement " +"can be controlled with the [member stretch_mode] property. It can scale, " +"tile, or stay centered inside its bounding rectangle.\n" +"[b]Note:[/b] You should enable [member flip_v] when using a TextureRect to " +"display a [ViewportTexture]. Alternatively, you can enable [member Viewport." +"render_target_v_flip] on the Viewport. Otherwise, the image will appear " +"upside down." +msgstr "" + +#: doc/classes/TextureRect.xml +msgid "If [code]true[/code], the texture scales to fit its bounding rectangle." +msgstr "" + +#: doc/classes/TextureRect.xml +msgid "" +"Controls the texture's behavior when resizing the node's bounding rectangle. " +"See [enum StretchMode]." +msgstr "" + +#: doc/classes/TextureRect.xml +msgid "The node's [Texture] resource." +msgstr "" + +#: doc/classes/TextureRect.xml +msgid "" +"Scale to fit the node's bounding rectangle, only if [code]expand[/code] is " +"[code]true[/code]. Default [code]stretch_mode[/code], for backwards " +"compatibility. Until you set [code]expand[/code] to [code]true[/code], the " +"texture will behave like [constant STRETCH_KEEP]." +msgstr "" + +#: doc/classes/TextureRect.xml +msgid "" +"Scale the texture to fit the node's bounding rectangle, center it and " +"maintain its aspect ratio." +msgstr "" + +#: doc/classes/Theme.xml +msgid "Theme for controls." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"A theme for skinning controls. Controls can be skinned individually, but for " +"complex applications, it's more practical to just create a global theme that " +"defines everything. This theme can be applied to any [Control]; the Control " +"and its children will automatically use it.\n" +"Theme resources can alternatively be loaded by writing them in a [code]." +"theme[/code] file, see the documentation for more information." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Adds an empty theme type for every valid data type.\n" +"[b]Note:[/b] Empty types are not saved with the theme. This method only " +"exists to perform in-memory changes to the resource. Use available " +"[code]set_*[/code] methods to add theme items." +msgstr "" + +#: doc/classes/Theme.xml +msgid "Clears all values on the theme." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" +"code]." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" +"code]." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" +"code]." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" +"code]." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " +"theme has [code]theme_type[/code]." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Unmarks [code]theme_type[/code] as being a variation of another theme type. " +"See [method set_type_variation]." +msgstr "" + +#: doc/classes/Theme.xml +msgid "Sets the theme's values to a copy of the default theme values." +msgstr "" + +#: doc/classes/Theme.xml +msgid "Sets the theme's values to a copy of a given theme." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" +"code]." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Returns all the [Color] types as a [PoolStringArray] filled with unique type " +"names, for use in [method get_color] and/or [method get_color_list]." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" +"code]." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Returns all the constants as a [PoolStringArray] filled with each constant's " +"name, for use in [method get_constant], if the theme has [code]theme_type[/" +"code]." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Returns all the constant types as a [PoolStringArray] filled with unique " +"type names, for use in [method get_constant] and/or [method " +"get_constant_list]." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" +"code]. If such item does not exist and [member default_font] is set on the " +"theme, the default font will be returned." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Returns all the [Font] types as a [PoolStringArray] filled with unique type " +"names, for use in [method get_font] and/or [method get_font_list]." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Returns the icon [Texture] at [code]name[/code] if the theme has " +"[code]theme_type[/code]." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Returns all the icon types as a [PoolStringArray] filled with unique type " +"names, for use in [method get_icon] and/or [method get_icon_list]." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Returns the [StyleBox] at [code]name[/code] if the theme has " +"[code]theme_type[/code].\n" +"Valid [code]name[/code]s may be found using [method get_stylebox_list]. " +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Returns all the [StyleBox]s as a [PoolStringArray] filled with each " +"[StyleBox]'s name, for use in [method get_stylebox], if the theme has " +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Returns all the [StyleBox] types as a [PoolStringArray] filled with unique " +"type names, for use in [method get_stylebox] and/or [method " +"get_stylebox_list]." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " +"theme has [code]theme_type[/code].\n" +"Valid [code]name[/code]s may be found using [method get_theme_item_list] or " +"a data type specific method. Valid [code]theme_type[/code]s may be found " +"using [method get_theme_item_types] or a data type specific method." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " +"filled with each theme items's name, for use in [method get_theme_item] or a " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_theme_item_types] or a data type specific method." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Returns all the theme items of [code]data_type[/code] types as a " +"[PoolStringArray] filled with unique type names, for use in [method " +"get_theme_item], [method get_theme_item_list] or data type specific methods." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Returns all the theme types as a [PoolStringArray] filled with unique type " +"names, for use in other [code]get_*[/code] functions of this theme.\n" +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " +"future version." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Returns the name of the base theme type if [code]theme_type[/code] is a " +"valid variation type. Returns an empty string otherwise." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Returns a list of all type variations for the given [code]base_type[/code]." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Returns [code]true[/code] if [Color] with [code]name[/code] is in " +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Returns [code]true[/code] if constant with [code]name[/code] is in " +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Returns [code]true[/code] if this theme has a valid [member default_font] " +"value." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Returns [code]true[/code] if [Font] with [code]name[/code] is in " +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Returns [code]true[/code] if a theme item of [code]data_type[/code] with " +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Returns [code]true[/code] if [code]theme_type[/code] is marked as a " +"variation of [code]base_type[/code]." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Adds missing and overrides existing definitions with values from the " +"[code]other[/code] [Theme].\n" +"[b]Note:[/b] This modifies the current theme. If you want to merge two " +"themes together without modifying either one, create a new empty theme and " +"merge the other two into it one after another." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Removes the theme type, gracefully discarding defined theme items. If the " +"type is a variation, this information is also erased. If the type is a base " +"for type variations, those variations lose their base." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " +"this method fails." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Renames the constant at [code]old_name[/code] to [code]name[/code] if the " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " +"this method fails." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " +"this method fails." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " +"method fails." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " +"this method fails." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" +"code] is already taken, this method fails." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Sets the theme item of [code]data_type[/code] to [code]value[/code] at " +"[code]name[/code] in [code]theme_type[/code].\n" +"Does nothing if the [code]value[/code] type does not match [code]data_type[/" +"code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"Marks [code]theme_type[/code] as a variation of [code]base_type[/code].\n" +"This adds [code]theme_type[/code] as a suggested option for [member Control." +"theme_type_variation] on a [Control] that is of the [code]base_type[/code] " +"class.\n" +"Variations can also be nested, i.e. [code]base_type[/code] can be another " +"variation. If a chain of variations ends with a [code]base_type[/code] " +"matching the class of the [Control], the whole chain is going to be " +"suggested as options.\n" +"[b]Note:[/b] Suggestions only show up if this theme resource is set as the " +"project default theme. See [member ProjectSettings.gui/theme/custom]." +msgstr "" + +#: doc/classes/Theme.xml +msgid "" +"The default font of this [Theme] resource. Used as a fallback value for font " +"items defined in this theme, but having invalid values. If this value is " +"also invalid, the global default value is used.\n" +"Use [method has_default_font] to check if this value is valid." +msgstr "" + +#: doc/classes/Theme.xml +msgid "Theme's [Color] item type." +msgstr "" + +#: doc/classes/Theme.xml +msgid "Theme's constant item type." +msgstr "" + +#: doc/classes/Theme.xml +msgid "Theme's [Font] item type." +msgstr "" + +#: doc/classes/Theme.xml +msgid "Theme's icon [Texture] item type." +msgstr "" + +#: doc/classes/Theme.xml +msgid "Theme's [StyleBox] item type." +msgstr "" + +#: doc/classes/Theme.xml +msgid "Maximum value for the DataType enum." +msgstr "" + +#: doc/classes/Thread.xml +msgid "A unit of execution in a process." +msgstr "" + +#: doc/classes/Thread.xml +msgid "" +"A unit of execution in a process. Can run methods on [Object]s " +"simultaneously. The use of synchronization via [Mutex] or [Semaphore] is " +"advised if working with shared objects.\n" +"[b]Note:[/b] Breakpoints won't break on code if it's running in a thread. " +"This is a current limitation of the GDScript debugger." +msgstr "" + +#: doc/classes/Thread.xml +msgid "Using multiple threads" +msgstr "" + +#: doc/classes/Thread.xml +msgid "Thread-safe APIs" +msgstr "" + +#: doc/classes/Thread.xml +msgid "" +"Returns the current [Thread]'s ID, uniquely identifying it among all " +"threads. If the [Thread] is not running this returns an empty string." +msgstr "" + +#: doc/classes/Thread.xml +msgid "" +"Returns [code]true[/code] if this [Thread] has been started. Once started, " +"this will return [code]true[/code] until it is joined using [method " +"wait_to_finish]. For checking if a [Thread] is still executing its task, use " +"[method is_alive]." +msgstr "" + +#: doc/classes/Thread.xml +msgid "" +"Returns [code]true[/code] if this [Thread] is currently running. This is " +"useful for determining if [method wait_to_finish] can be called without " +"blocking the calling thread.\n" +"To check if a [Thread] is joinable, use [method is_active]." +msgstr "" + +#: doc/classes/Thread.xml +msgid "" +"Starts a new [Thread] that runs [code]method[/code] on object " +"[code]instance[/code] with [code]userdata[/code] passed as an argument. Even " +"if no userdata is passed, [code]method[/code] must accept one argument and " +"it will be null. The [code]priority[/code] of the [Thread] can be changed by " +"passing a value from the [enum Priority] enum.\n" +"Returns [constant OK] on success, or [constant ERR_CANT_CREATE] on failure." +msgstr "" + +#: doc/classes/Thread.xml +msgid "" +"Joins the [Thread] and waits for it to finish. Returns the output of the " +"method passed to [method start].\n" +"Should either be used when you want to retrieve the value returned from the " +"method called by the [Thread] or before freeing the instance that contains " +"the [Thread].\n" +"To determine if this can be called without blocking the calling thread, " +"check if [method is_alive] is [code]false[/code].\n" +"[b]Note:[/b] After the [Thread] finishes joining it will be disposed. If you " +"want to use it again you will have to create a new instance of it." +msgstr "" + +#: doc/classes/Thread.xml +msgid "A thread running with lower priority than normally." +msgstr "" + +#: doc/classes/Thread.xml +msgid "A thread with a standard priority." +msgstr "" + +#: doc/classes/Thread.xml +msgid "A thread running with higher priority than normally." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "Node for 2D tile-based maps." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "" +"Node for 2D tile-based maps. Tilemaps use a [TileSet] which contain a list " +"of tiles (textures plus optional collision, navigation, and/or occluder " +"shapes) which are used to create grid-based maps.\n" +"When doing physics queries against the tilemap, the cell coordinates are " +"encoded as [code]metadata[/code] for each detected collision shape returned " +"by methods such as [method Physics2DDirectSpaceState.intersect_shape], " +"[method Physics2DDirectBodyState.get_contact_collider_shape_metadata], etc." +msgstr "" + +#: doc/classes/TileMap.xml doc/classes/TileSet.xml +msgid "Using Tilemaps" +msgstr "" + +#: doc/classes/TileMap.xml doc/classes/TileSet.xml +msgid "2D Hexagonal Demo" +msgstr "" + +#: doc/classes/TileMap.xml +msgid "Clears all cells." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "Clears cells that do not exist in the tileset." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "" +"Returns the tile index of the given cell. If no tile exists in the cell, " +"returns [constant INVALID_CELL]." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "" +"Returns the coordinate (subtile column and row) of the autotile variation in " +"the tileset. Returns a zero vector if the cell doesn't have autotiling." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "" +"Returns the tile index of the cell given by a Vector2. If no tile exists in " +"the cell, returns [constant INVALID_CELL]." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "Returns [code]true[/code] if the given collision layer bit is set." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "Returns [code]true[/code] if the given collision mask bit is set." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "" +"Returns a [Vector2] array with the positions of all cells containing a tile " +"from the tileset (i.e. a tile index different from [code]-1[/code])." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "" +"Returns an array of all cells with the given tile index specified in " +"[code]id[/code]." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "Returns a rectangle enclosing the used (non-empty) tiles of the map." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "" +"Returns [code]true[/code] if the given cell is transposed, i.e. the X and Y " +"axes are swapped." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "Returns [code]true[/code] if the given cell is flipped in the X axis." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "Returns [code]true[/code] if the given cell is flipped in the Y axis." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "" +"Returns the local position of the top left corner of the cell corresponding " +"to the given tilemap (grid-based) coordinates.\n" +"To get the global position, use [method Node2D.to_global]:\n" +"[codeblock]\n" +"var local_position = my_tilemap.map_to_world(map_position)\n" +"var global_position = my_tilemap.to_global(local_position)\n" +"[/codeblock]\n" +"Optionally, the tilemap's half offset can be ignored." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "" +"Sets the tile index for the given cell.\n" +"An index of [code]-1[/code] clears the cell.\n" +"Optionally, the tile can also be flipped, transposed, or given autotile " +"coordinates. The autotile coordinate refers to the column and row of the " +"subtile.\n" +"[b]Note:[/b] Data such as navigation polygons and collision shapes are not " +"immediately updated for performance reasons.\n" +"If you need these to be immediately updated, you can call [method " +"update_dirty_quadrants].\n" +"Overriding this method also overrides it internally, allowing custom logic " +"to be implemented when tiles are placed/removed:\n" +"[codeblock]\n" +"func set_cell(x, y, tile, flip_x=false, flip_y=false, transpose=false, " +"autotile_coord=Vector2()):\n" +" # Write your custom logic here.\n" +" # To call the default method:\n" +" .set_cell(x, y, tile, flip_x, flip_y, transpose, autotile_coord)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/TileMap.xml +msgid "" +"Sets the tile index for the cell given by a Vector2.\n" +"An index of [code]-1[/code] clears the cell.\n" +"Optionally, the tile can also be flipped, transposed, or given autotile " +"coordinates. The autotile coordinate refers to the column and row of the " +"subtile.\n" +"[b]Note:[/b] Data such as navigation polygons and collision shapes are not " +"immediately updated for performance reasons.\n" +"If you need these to be immediately updated, you can call [method " +"update_dirty_quadrants]." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "Sets the given collision layer bit." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "Sets the given collision mask bit." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "" +"Applies autotiling rules to the cell (and its adjacent cells) referenced by " +"its grid-based X and Y coordinates." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "" +"Applies autotiling rules to the cells in the given region (specified by grid-" +"based X and Y coordinates).\n" +"Calling with invalid (or missing) parameters applies autotiling rules for " +"the entire tilemap." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "" +"Updates the tile map's quadrants, allowing things such as navigation and " +"collision shapes to be immediately used if modified." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "" +"Returns the tilemap (grid-based) coordinates corresponding to the given " +"local position.\n" +"To use this with a global position, first determine the local position with " +"[method Node2D.to_local]:\n" +"[codeblock]\n" +"var local_position = my_tilemap.to_local(global_position)\n" +"var map_position = my_tilemap.world_to_map(local_position)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/TileMap.xml +msgid "If [code]true[/code], this TileMap bakes a navigation region." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "If [code]true[/code], the cell's UVs will be clipped." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "The custom [Transform2D] to be applied to the TileMap's cells." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "" +"Amount to offset alternating tiles. See [enum HalfOffset] for possible " +"values." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "" +"The TileMap's quadrant size. Optimizes drawing by batching, using chunks of " +"this size." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "The TileMap's cell size." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "Position for tile origin. See [enum TileOrigin] for possible values." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "" +"If [code]true[/code], the TileMap's direct children will be drawn in order " +"of their Y coordinate." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "" +"If [code]true[/code], the textures will be centered in the middle of each " +"tile. This is useful for certain isometric or top-down modes when textures " +"are made larger or smaller than the tiles (e.g. to avoid flickering on tile " +"edges). The offset is still applied, but from the center of the tile. If " +"used, [member compatibility_mode] is ignored.\n" +"If [code]false[/code], the texture position start in the top-left corner " +"unless [member compatibility_mode] is enabled." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "" +"Bounce value for static body collisions (see [code]collision_use_kinematic[/" +"code])." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "" +"Friction value for static body collisions (see " +"[code]collision_use_kinematic[/code])." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "" +"The collision layer(s) for all colliders in the TileMap. See [url=$DOCS_URL/" +"tutorials/physics/physics_introduction.html#collision-layers-and-" +"masks]Collision layers and masks[/url] in the documentation for more " +"information." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "" +"The collision mask(s) for all colliders in the TileMap. See [url=$DOCS_URL/" +"tutorials/physics/physics_introduction.html#collision-layers-and-" +"masks]Collision layers and masks[/url] in the documentation for more " +"information." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "" +"If [code]true[/code], TileMap collisions will be handled as a kinematic " +"body. If [code]false[/code], collisions will be handled as static body." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "" +"If [code]true[/code], this tilemap's collision shape will be added to the " +"collision shape of the parent. The parent has to be a [CollisionObject2D]." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "" +"If [code]true[/code], the compatibility with the tilemaps made in Godot 3.1 " +"or earlier is maintained (textures move when the tile origin changes and " +"rotate if the texture size is not homogeneous). This mode presents problems " +"when doing [code]flip_h[/code], [code]flip_v[/code] and [code]transpose[/" +"code] tile operations on non-homogeneous isometric tiles (e.g. 2:1), in " +"which the texture could not coincide with the collision, thus it is not " +"recommended for isometric or non-square tiles.\n" +"If [code]false[/code], the textures do not move when doing [code]flip_h[/" +"code], [code]flip_v[/code] operations if no offset is used, nor when " +"changing the tile origin.\n" +"The compatibility mode doesn't work with the [member centered_textures] " +"option, because displacing textures with the [member cell_tile_origin] " +"option or in irregular tiles is not relevant when centering those textures." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "The TileMap orientation mode. See [enum Mode] for possible values." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "The navigation layers the TileMap generates its navigation regions in." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "" +"The light mask assigned to all light occluders in the TileMap. The TileSet's " +"light occluders will cast shadows only from Light2D(s) that have the same " +"light mask(s)." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "" +"If [code]true[/code], collision shapes are visible in the editor. Doesn't " +"affect collision shapes visibility at runtime. To show collision shapes at " +"runtime, enable [b]Visible Collision Shapes[/b] in the [b]Debug[/b] menu " +"instead." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "The assigned [TileSet]." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "Emitted when a tilemap setting has changed." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "Returned when a cell doesn't exist." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "Orthogonal orientation mode." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "Isometric orientation mode." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "Custom orientation mode." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "Half offset on the X coordinate." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "Half offset on the Y coordinate." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "Half offset disabled." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "Half offset on the X coordinate (negative)." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "Half offset on the Y coordinate (negative)." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "Tile origin at its top-left corner." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "Tile origin at its center." +msgstr "" + +#: doc/classes/TileMap.xml +msgid "Tile origin at its bottom-left corner." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Tile library for tilemaps." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "" +"A TileSet is a library of tiles for a [TileMap]. It contains a list of " +"tiles, each consisting of a sprite and optional collision shapes.\n" +"Tiles are referenced by a unique integer ID." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "" +"Determines when the auto-tiler should consider two different auto-tile IDs " +"to be bound together.\n" +"[b]Note:[/b] [code]neighbor_id[/code] will be [code]-1[/code] ([constant " +"TileMap.INVALID_CELL]) when checking a tile against an empty neighbor tile." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Clears all bitmask information of the autotile." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "" +"Returns the bitmask of the subtile from an autotile given its coordinates.\n" +"The value is the sum of the values in [enum AutotileBindings] present in the " +"subtile (e.g. a value of 5 means the bitmask has bindings in both the top " +"left and top right)." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Returns the [enum BitmaskMode] of the autotile." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "" +"Returns the subtile that's being used as an icon in an atlas/autotile given " +"its coordinates.\n" +"The subtile defined as the icon will be used as a fallback when the atlas/" +"autotile's bitmask information is incomplete. It will also be used to " +"represent it in the TileSet editor." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "" +"Returns the light occluder of the subtile from an atlas/autotile given its " +"coordinates." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "" +"Returns the navigation polygon of the subtile from an atlas/autotile given " +"its coordinates." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Returns the size of the subtiles in an atlas/autotile." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Returns the spacing between subtiles of the atlas/autotile." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "" +"Returns the priority of the subtile from an autotile given its coordinates.\n" +"When more than one subtile has the same bitmask value, one of them will be " +"picked randomly for drawing. Its priority will define how often it will be " +"picked." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "" +"Returns the drawing index of the subtile from an atlas/autotile given its " +"coordinates." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "" +"Sets the bitmask of the subtile from an autotile given its coordinates.\n" +"The value is the sum of the values in [enum AutotileBindings] present in the " +"subtile (e.g. a value of 5 means the bitmask has bindings in both the top " +"left and top right)." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Sets the [enum BitmaskMode] of the autotile." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "" +"Sets the subtile that will be used as an icon in an atlas/autotile given its " +"coordinates.\n" +"The subtile defined as the icon will be used as a fallback when the atlas/" +"autotile's bitmask information is incomplete. It will also be used to " +"represent it in the TileSet editor." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "" +"Sets the light occluder of the subtile from an atlas/autotile given its " +"coordinates." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "" +"Sets the navigation polygon of the subtile from an atlas/autotile given its " +"coordinates." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Sets the size of the subtiles in an atlas/autotile." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Sets the spacing between subtiles of the atlas/autotile." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "" +"Sets the priority of the subtile from an autotile given its coordinates.\n" +"When more than one subtile has the same bitmask value, one of them will be " +"picked randomly for drawing. Its priority will define how often it will be " +"picked." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "" +"Sets the drawing index of the subtile from an atlas/autotile given its " +"coordinates." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Clears all tiles." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Creates a new tile with the given ID." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Returns the first tile matching the given name." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "" +"Returns the ID following the last currently used ID, useful when creating a " +"new tile." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Returns an array of all currently used tile IDs." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Removes the given tile ID." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Adds a shape to the tile." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Returns the tile's light occluder." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Returns the tile's material." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Returns the tile's modulation color." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Returns the tile's name." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Returns the navigation polygon of the tile." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Returns the offset of the tile's navigation polygon." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Returns the tile's normal map texture." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Returns the offset of the tile's light occluder." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Returns the tile sub-region in the texture." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Returns a tile's given shape." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Returns the number of shapes assigned to a tile." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Returns the offset of a tile's shape." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Returns the one-way collision value of a tile's shape." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Returns the [Transform2D] of a tile's shape." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "" +"Returns an array of dictionaries describing the tile's shapes.\n" +"[b]Dictionary structure in the array returned by this method:[/b]\n" +"[codeblock]\n" +"{\n" +" \"autotile_coord\": Vector2,\n" +" \"one_way\": bool,\n" +" \"one_way_margin\": int,\n" +" \"shape\": CollisionShape2D,\n" +" \"shape_transform\": Transform2D,\n" +"}\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Returns the tile's texture." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Returns the texture offset of the tile." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Returns the tile's [enum TileMode]." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Returns the tile's Z index (drawing layer)." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Sets a light occluder for the tile." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Sets the tile's material." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "" +"Sets the tile's modulation color.\n" +"[b]Note:[/b] Modulation is performed by setting the tile's vertex color. To " +"access this in a shader, use [code]COLOR[/code] rather than [code]MODULATE[/" +"code] (which instead accesses the [TileMap]'s [member CanvasItem.modulate] " +"property)." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Sets the tile's name." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Sets the tile's navigation polygon." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Sets an offset for the tile's navigation polygon." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "" +"Sets the tile's normal map texture.\n" +"[b]Note:[/b] Godot expects the normal map to use X+, Y-, and Z+ coordinates. " +"See [url=http://wiki.polycount.com/wiki/" +"Normal_Map_Technical_Details#Common_Swizzle_Coordinates]this page[/url] for " +"a comparison of normal map coordinates expected by popular engines." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Sets an offset for the tile's light occluder." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "" +"Sets the tile's sub-region in the texture. This is common in texture atlases." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Sets a shape for the tile, enabling collision." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Sets the offset of a tile's shape." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Enables one-way collision on a tile's shape." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Sets a [Transform2D] on a tile's shape." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Sets an array of shapes for the tile, enabling collision." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Sets the tile's texture." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Sets the tile's texture offset." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Sets the tile's [enum TileMode]." +msgstr "" + +#: doc/classes/TileSet.xml +msgid "Sets the tile's drawing index." +msgstr "" + +#: doc/classes/Time.xml +msgid "Time singleton for working with time." +msgstr "" + +#: doc/classes/Time.xml +msgid "" +"The Time singleton allows converting time between various formats and also " +"getting time information from the system.\n" +"This class conforms with as many of the ISO 8601 standards as possible. All " +"dates follow the Proleptic Gregorian calendar. As such, the day before " +"[code]1582-10-15[/code] is [code]1582-10-14[/code], not [code]1582-10-04[/" +"code]. The year before 1 AD (aka 1 BC) is number [code]0[/code], with the " +"year before that (2 BC) being [code]-1[/code], etc.\n" +"Conversion methods assume \"the same timezone\", and do not handle timezone " +"conversions or DST automatically. Leap seconds are also not handled, they " +"must be done manually if desired. Suffixes such as \"Z\" are not handled, " +"you need to strip them away manually.\n" +"When getting time information from the system, the time can either be in the " +"local timezone or UTC depending on the [code]utc[/code] parameter. However, " +"the [method get_unix_time_from_system] method always returns the time in " +"UTC.\n" +"[b]Important:[/b] The [code]_from_system[/code] methods use the system clock " +"that the user can manually set. [b]Never use[/b] this method for precise " +"time calculation since its results are subject to automatic adjustments by " +"the user or the operating system. [b]Always use[/b] [method get_ticks_usec] " +"or [method get_ticks_msec] for precise time calculation instead, since they " +"are guaranteed to be monotonic (i.e. never decrease)." +msgstr "" + +#: doc/classes/Time.xml +msgid "" +"Returns the current date as a dictionary of keys: [code]year[/code], " +"[code]month[/code], [code]day[/code], [code]weekday[/code], and [code]dst[/" +"code] (Daylight Savings Time).\n" +"The returned values are in the system's local time when [code]utc[/code] is " +"false, otherwise they are in UTC." +msgstr "" + +#: doc/classes/Time.xml +msgid "" +"Converts the given Unix timestamp to a dictionary of keys: [code]year[/" +"code], [code]month[/code], [code]day[/code], and [code]weekday[/code]." +msgstr "" + +#: doc/classes/Time.xml +msgid "" +"Returns the current date as an ISO 8601 date string (YYYY-MM-DD).\n" +"The returned values are in the system's local time when [code]utc[/code] is " +"false, otherwise they are in UTC." +msgstr "" + +#: doc/classes/Time.xml +msgid "" +"Converts the given Unix timestamp to an ISO 8601 date string (YYYY-MM-DD)." +msgstr "" + +#: doc/classes/Time.xml +msgid "" +"Converts the given ISO 8601 date and time string (YYYY-MM-DDTHH:MM:SS) to a " +"dictionary of keys: [code]year[/code], [code]month[/code], [code]day[/code], " +"[code]weekday[/code], [code]hour[/code], [code]minute[/code], and " +"[code]second[/code].\n" +"If [code]weekday[/code] is false, then the [code]weekday[/code] entry is " +"excluded (the calculation is relatively expensive).\n" +"[b]Note:[/b] Any decimal fraction in the time string will be ignored " +"silently." +msgstr "" + +#: doc/classes/Time.xml +msgid "" +"Returns the current date as a dictionary of keys: [code]year[/code], " +"[code]month[/code], [code]day[/code], [code]weekday[/code], [code]hour[/" +"code], [code]minute[/code], and [code]second[/code]." +msgstr "" + +#: doc/classes/Time.xml +msgid "" +"Converts the given Unix timestamp to a dictionary of keys: [code]year[/" +"code], [code]month[/code], [code]day[/code], and [code]weekday[/code].\n" +"The returned Dictionary's values will be the same as the [method " +"get_datetime_dict_from_system] if the Unix timestamp is the current time, " +"with the exception of Daylight Savings Time as it cannot be determined from " +"the epoch." +msgstr "" + +#: doc/classes/Time.xml +msgid "" +"Converts the given dictionary of keys to an ISO 8601 date and time string " +"(YYYY-MM-DDTHH:MM:SS).\n" +"The given dictionary can be populated with the following keys: [code]year[/" +"code], [code]month[/code], [code]day[/code], [code]hour[/code], " +"[code]minute[/code], and [code]second[/code]. Any other entries (including " +"[code]dst[/code]) are ignored.\n" +"If the dictionary is empty, [code]0[/code] is returned. If some keys are " +"omitted, they default to the equivalent values for the Unix epoch timestamp " +"0 (1970-01-01 at 00:00:00).\n" +"If [code]use_space[/code] is true, use a space instead of the letter T in " +"the middle." +msgstr "" + +#: doc/classes/Time.xml +msgid "" +"Returns the current date and time as an ISO 8601 date and time string (YYYY-" +"MM-DDTHH:MM:SS).\n" +"The returned values are in the system's local time when [code]utc[/code] is " +"false, otherwise they are in UTC.\n" +"If [code]use_space[/code] is true, use a space instead of the letter T in " +"the middle." +msgstr "" + +#: doc/classes/Time.xml +msgid "" +"Converts the given Unix timestamp to an ISO 8601 date and time string (YYYY-" +"MM-DDTHH:MM:SS).\n" +"If [code]use_space[/code] is true, use a space instead of the letter T in " +"the middle." +msgstr "" + +#: doc/classes/Time.xml +msgid "" +"Converts the given timezone offset in minutes to a timezone offset string. " +"For example, -480 returns \"-08:00\", 345 returns \"+05:45\", and 0 returns " +"\"+00:00\"." +msgstr "" + +#: doc/classes/Time.xml +msgid "" +"Returns the amount of time passed in milliseconds since the engine started.\n" +"Will always be positive or 0 and uses a 64-bit value (it will wrap after " +"roughly 500 million years)." +msgstr "" + +#: doc/classes/Time.xml +msgid "" +"Returns the amount of time passed in microseconds since the engine started.\n" +"Will always be positive or 0 and uses a 64-bit value (it will wrap after " +"roughly half a million years)." +msgstr "" + +#: doc/classes/Time.xml +msgid "" +"Returns the current time as a dictionary of keys: [code]hour[/code], " +"[code]minute[/code], and [code]second[/code].\n" +"The returned values are in the system's local time when [code]utc[/code] is " +"false, otherwise they are in UTC." +msgstr "" + +#: doc/classes/Time.xml +msgid "" +"Converts the given time to a dictionary of keys: [code]hour[/code], " +"[code]minute[/code], and [code]second[/code]." +msgstr "" + +#: doc/classes/Time.xml +msgid "" +"Returns the current time as an ISO 8601 time string (HH:MM:SS).\n" +"The returned values are in the system's local time when [code]utc[/code] is " +"false, otherwise they are in UTC." +msgstr "" + +#: doc/classes/Time.xml +msgid "" +"Converts the given Unix timestamp to an ISO 8601 time string (HH:MM:SS)." +msgstr "" + +#: doc/classes/Time.xml +msgid "" +"Returns the current time zone as a dictionary of keys: [code]bias[/code] and " +"[code]name[/code]. The [code]bias[/code] value is the offset from UTC in " +"minutes, since not all time zones are multiples of an hour from UTC." +msgstr "" + +#: doc/classes/Time.xml +msgid "" +"Converts a dictionary of time values to a Unix timestamp.\n" +"The given dictionary can be populated with the following keys: [code]year[/" +"code], [code]month[/code], [code]day[/code], [code]hour[/code], " +"[code]minute[/code], and [code]second[/code]. Any other entries (including " +"[code]dst[/code]) are ignored.\n" +"If the dictionary is empty, [code]0[/code] is returned. If some keys are " +"omitted, they default to the equivalent values for the Unix epoch timestamp " +"0 (1970-01-01 at 00:00:00).\n" +"You can pass the output from [method get_datetime_dict_from_unix_time] " +"directly into this function and get the same as what was put in.\n" +"[b]Note:[/b] Unix timestamps are often in UTC. This method does not do any " +"timezone conversion, so the timestamp will be in the same timezone as the " +"given datetime dictionary." +msgstr "" + +#: doc/classes/Time.xml +msgid "" +"Converts the given ISO 8601 date and/or time string to a Unix timestamp. The " +"string can contain a date only, a time only, or both.\n" +"[b]Note:[/b] Unix timestamps are often in UTC. This method does not do any " +"timezone conversion, so the timestamp will be in the same timezone as the " +"given datetime string.\n" +"[b]Note:[/b] Any decimal fraction in the time string will be ignored " +"silently." +msgstr "" + +#: doc/classes/Time.xml +msgid "" +"Returns the current Unix timestamp in seconds based on the system time in " +"UTC. This method is implemented by the operating system and always returns " +"the time in UTC.\n" +"[b]Note:[/b] Unlike other methods that use integer timestamps, this method " +"returns the timestamp as a [float] for sub-second precision." +msgstr "" + +#: doc/classes/Time.xml +msgid "The month of January, represented numerically as [code]01[/code]." +msgstr "" + +#: doc/classes/Time.xml +msgid "The month of February, represented numerically as [code]02[/code]." +msgstr "" + +#: doc/classes/Time.xml +msgid "The month of March, represented numerically as [code]03[/code]." +msgstr "" + +#: doc/classes/Time.xml +msgid "The month of April, represented numerically as [code]04[/code]." +msgstr "" + +#: doc/classes/Time.xml +msgid "The month of May, represented numerically as [code]05[/code]." +msgstr "" + +#: doc/classes/Time.xml +msgid "The month of June, represented numerically as [code]06[/code]." +msgstr "" + +#: doc/classes/Time.xml +msgid "The month of July, represented numerically as [code]07[/code]." +msgstr "" + +#: doc/classes/Time.xml +msgid "The month of August, represented numerically as [code]08[/code]." +msgstr "" + +#: doc/classes/Time.xml +msgid "The month of September, represented numerically as [code]09[/code]." +msgstr "" + +#: doc/classes/Time.xml +msgid "The month of October, represented numerically as [code]10[/code]." +msgstr "" + +#: doc/classes/Time.xml +msgid "The month of November, represented numerically as [code]11[/code]." +msgstr "" + +#: doc/classes/Time.xml +msgid "The month of December, represented numerically as [code]12[/code]." +msgstr "" + +#: doc/classes/Time.xml +msgid "The day of the week Sunday, represented numerically as [code]0[/code]." +msgstr "" + +#: doc/classes/Time.xml +msgid "The day of the week Monday, represented numerically as [code]1[/code]." +msgstr "" + +#: doc/classes/Time.xml +msgid "The day of the week Tuesday, represented numerically as [code]2[/code]." +msgstr "" + +#: doc/classes/Time.xml +msgid "" +"The day of the week Wednesday, represented numerically as [code]3[/code]." +msgstr "" + +#: doc/classes/Time.xml +msgid "" +"The day of the week Thursday, represented numerically as [code]4[/code]." +msgstr "" + +#: doc/classes/Time.xml +msgid "The day of the week Friday, represented numerically as [code]5[/code]." +msgstr "" + +#: doc/classes/Time.xml +msgid "" +"The day of the week Saturday, represented numerically as [code]6[/code]." +msgstr "" + +#: doc/classes/Timer.xml +msgid "A countdown timer." +msgstr "" + +#: doc/classes/Timer.xml +msgid "" +"Counts down a specified interval and emits a signal on reaching 0. Can be " +"set to repeat or \"one-shot\" mode.\n" +"[b]Note:[/b] To create a one-shot timer without instantiating a node, use " +"[method SceneTree.create_timer]." +msgstr "" + +#: doc/classes/Timer.xml +msgid "Returns [code]true[/code] if the timer is stopped." +msgstr "" + +#: doc/classes/Timer.xml +msgid "" +"Starts the timer. Sets [code]wait_time[/code] to [code]time_sec[/code] if " +"[code]time_sec > 0[/code]. This also resets the remaining time to " +"[code]wait_time[/code].\n" +"[b]Note:[/b] This method will not resume a paused timer. See [member paused]." +msgstr "" + +#: doc/classes/Timer.xml +msgid "Stops the timer." +msgstr "" + +#: doc/classes/Timer.xml +msgid "" +"If [code]true[/code], the timer will automatically start when entering the " +"scene tree.\n" +"[b]Note:[/b] This property is automatically set to [code]false[/code] after " +"the timer enters the scene tree and starts." +msgstr "" + +#: doc/classes/Timer.xml +msgid "" +"If [code]true[/code], the timer will stop when reaching 0. If [code]false[/" +"code], it will restart." +msgstr "" + +#: doc/classes/Timer.xml +msgid "" +"If [code]true[/code], the timer is paused and will not process until it is " +"unpaused again, even if [method start] is called." +msgstr "" + +#: doc/classes/Timer.xml +msgid "Processing mode. See [enum TimerProcessMode]." +msgstr "" + +#: doc/classes/Timer.xml +msgid "" +"The timer's remaining time in seconds. Returns 0 if the timer is inactive.\n" +"[b]Note:[/b] You cannot set this value. To change the timer's remaining " +"time, use [method start]." +msgstr "" + +#: doc/classes/Timer.xml +msgid "" +"The wait time in seconds.\n" +"[b]Note:[/b] Timers can only emit once per rendered frame at most (or once " +"per physics frame if [member process_mode] is [constant " +"TIMER_PROCESS_PHYSICS]). This means very low wait times (lower than 0.05 " +"seconds) will behave in significantly different ways depending on the " +"rendered framerate. For very low wait times, it is recommended to use a " +"process loop in a script instead of using a Timer node." +msgstr "" + +#: doc/classes/Timer.xml +msgid "" +"Update the timer during the physics step at each frame (fixed framerate " +"processing)." +msgstr "" + +#: doc/classes/Timer.xml +msgid "Update the timer during the idle time at each frame." +msgstr "" + +#: doc/classes/ToolButton.xml +msgid "Flat button helper class." +msgstr "" + +#: doc/classes/ToolButton.xml +msgid "" +"This is a helper class to generate a flat [Button] (see [member Button." +"flat]), creating a [ToolButton] is equivalent to:\n" +"[codeblock]\n" +"var btn = Button.new()\n" +"btn.flat = true\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/ToolButton.xml +msgid "Default text [Color] of the [ToolButton]." +msgstr "" + +#: doc/classes/ToolButton.xml +msgid "Text [Color] used when the [ToolButton] is disabled." +msgstr "" + +#: doc/classes/ToolButton.xml +msgid "" +"Text [Color] used when the [ToolButton] is focused. Only replaces the normal " +"text color of the button. Disabled, hovered, and pressed states take " +"precedence over this color." +msgstr "" + +#: doc/classes/ToolButton.xml +msgid "Text [Color] used when the [ToolButton] is being hovered." +msgstr "" + +#: doc/classes/ToolButton.xml +msgid "Text [Color] used when the [ToolButton] is being pressed." +msgstr "" + +#: doc/classes/ToolButton.xml +msgid "The horizontal space between [ToolButton]'s icon and text." +msgstr "" + +#: doc/classes/ToolButton.xml +msgid "[Font] of the [ToolButton]'s text." +msgstr "" + +#: doc/classes/ToolButton.xml +msgid "[StyleBox] used when the [ToolButton] is disabled." +msgstr "" + +#: doc/classes/ToolButton.xml +msgid "" +"[StyleBox] used when the [ToolButton] is focused. It is displayed over the " +"current [StyleBox], so using [StyleBoxEmpty] will just disable the focus " +"visual effect." +msgstr "" + +#: doc/classes/ToolButton.xml +msgid "[StyleBox] used when the [ToolButton] is being hovered." +msgstr "" + +#: doc/classes/ToolButton.xml +msgid "Default [StyleBox] for the [ToolButton]." +msgstr "" + +#: doc/classes/ToolButton.xml +msgid "[StyleBox] used when the [ToolButton] is being pressed." +msgstr "" + +#: doc/classes/TouchScreenButton.xml +msgid "Button for touch screen devices for gameplay use." +msgstr "" + +#: doc/classes/TouchScreenButton.xml +msgid "" +"TouchScreenButton allows you to create on-screen buttons for touch devices. " +"It's intended for gameplay use, such as a unit you have to touch to move. " +"Unlike [Button], TouchScreenButton supports multitouch out of the box. " +"Several TouchScreenButtons can be pressed at the same time with touch " +"input.\n" +"This node inherits from [Node2D]. Unlike with [Control] nodes, you cannot " +"set anchors on it. If you want to create menus or user interfaces, you may " +"want to use [Button] nodes instead. To make button nodes react to touch " +"events, you can enable the Emulate Mouse option in the Project Settings.\n" +"You can configure TouchScreenButton to be visible only on touch devices, " +"helping you develop your game both for desktop and mobile devices." +msgstr "" + +#: doc/classes/TouchScreenButton.xml +msgid "Returns [code]true[/code] if this button is currently pressed." +msgstr "" + +#: doc/classes/TouchScreenButton.xml +msgid "The button's action. Actions can be handled with [InputEventAction]." +msgstr "" + +#: doc/classes/TouchScreenButton.xml +msgid "The button's bitmask." +msgstr "" + +#: doc/classes/TouchScreenButton.xml +msgid "The button's texture for the normal state." +msgstr "" + +#: doc/classes/TouchScreenButton.xml +msgid "" +"If [code]true[/code], the [signal pressed] and [signal released] signals are " +"emitted whenever a pressed finger goes in and out of the button, even if the " +"pressure started outside the active area of the button.\n" +"[b]Note:[/b] This is a \"pass-by\" (not \"bypass\") press mode." +msgstr "" + +#: doc/classes/TouchScreenButton.xml +msgid "The button's texture for the pressed state." +msgstr "" + +#: doc/classes/TouchScreenButton.xml +msgid "The button's shape." +msgstr "" + +#: doc/classes/TouchScreenButton.xml +msgid "" +"If [code]true[/code], the button's shape is centered in the provided " +"texture. If no texture is used, this property has no effect." +msgstr "" + +#: doc/classes/TouchScreenButton.xml +msgid "If [code]true[/code], the button's shape is visible." +msgstr "" + +#: doc/classes/TouchScreenButton.xml +msgid "" +"The button's visibility mode. See [enum VisibilityMode] for possible values." +msgstr "" + +#: doc/classes/TouchScreenButton.xml +msgid "Emitted when the button is pressed (down)." +msgstr "" + +#: doc/classes/TouchScreenButton.xml +msgid "Emitted when the button is released (up)." +msgstr "" + +#: doc/classes/TouchScreenButton.xml +msgid "Always visible." +msgstr "" + +#: doc/classes/TouchScreenButton.xml +msgid "Visible on touch screens only." +msgstr "" + +#: doc/classes/Transform.xml +msgid "3D transformation (3×4 matrix)." +msgstr "" + +#: doc/classes/Transform.xml +msgid "" +"3×4 matrix (3 rows, 4 columns) used for 3D linear transformations. It can " +"represent transformations such as translation, rotation, or scaling. It " +"consists of a [member basis] (first 3 columns) and a [Vector3] for the " +"[member origin] (last column).\n" +"For more information, read the \"Matrices and transforms\" documentation " +"article." +msgstr "" + +#: doc/classes/Transform.xml +msgid "" +"Constructs a Transform from four [Vector3] values (matrix columns). Each " +"axis corresponds to local basis vectors (some of which may be scaled)." +msgstr "" + +#: doc/classes/Transform.xml +msgid "Constructs a Transform from a [Basis] and [Vector3]." +msgstr "" + +#: doc/classes/Transform.xml +msgid "Constructs a Transform from a [Transform2D]." +msgstr "" + +#: doc/classes/Transform.xml +msgid "" +"Constructs a Transform from a [Quat]. The origin will be [code]Vector3(0, 0, " +"0)[/code]." +msgstr "" + +#: doc/classes/Transform.xml +msgid "" +"Constructs the Transform from a [Basis]. The origin will be Vector3(0, 0, 0)." +msgstr "" + +#: doc/classes/Transform.xml doc/classes/Transform2D.xml +msgid "" +"Returns the inverse of the transform, under the assumption that the " +"transformation is composed of rotation, scaling and translation." +msgstr "" + +#: doc/classes/Transform.xml doc/classes/Transform2D.xml +msgid "" +"Returns a transform interpolated between this transform and another by a " +"given [code]weight[/code] (on the range of 0.0 to 1.0)." +msgstr "" + +#: doc/classes/Transform.xml doc/classes/Transform2D.xml +msgid "" +"Returns the inverse of the transform, under the assumption that the " +"transformation is composed of rotation and translation (no scaling, use " +"[method affine_inverse] for transforms with scaling)." +msgstr "" + +#: doc/classes/Transform.xml doc/classes/Transform2D.xml +msgid "" +"Returns [code]true[/code] if this transform and [code]transform[/code] are " +"approximately equal, by calling [code]is_equal_approx[/code] on each " +"component." +msgstr "" + +#: doc/classes/Transform.xml +msgid "" +"Returns a copy of the transform rotated such that its -Z axis points towards " +"the [code]target[/code] position.\n" +"The transform will first be rotated around the given [code]up[/code] vector, " +"and then fully aligned to the target by a further rotation around an axis " +"perpendicular to both the [code]target[/code] and [code]up[/code] vectors.\n" +"Operations take place in global space." +msgstr "" + +#: doc/classes/Transform.xml doc/classes/Transform2D.xml +msgid "" +"Returns the transform with the basis orthogonal (90 degrees), and normalized " +"axis vectors (scale of 1 or -1)." +msgstr "" + +#: doc/classes/Transform.xml +msgid "" +"Returns a copy of the transform rotated around the given [code]axis[/code] " +"by the given [code]angle[/code] (in radians), using matrix multiplication. " +"The [code]axis[/code] must be a normalized vector." +msgstr "" + +#: doc/classes/Transform.xml +msgid "" +"Returns a copy of the transform with its basis and origin scaled by the " +"given [code]scale[/code] factor, using matrix multiplication." +msgstr "" + +#: doc/classes/Transform.xml doc/classes/Transform2D.xml +msgid "" +"Returns a copy of the transform translated by the given [code]offset[/code], " +"relative to the transform's basis vectors.\n" +"Unlike [method rotated] and [method scaled], this does not use matrix " +"multiplication." +msgstr "" + +#: doc/classes/Transform.xml +msgid "" +"Transforms the given [Vector3], [Plane], [AABB], or [PoolVector3Array] by " +"this transform." +msgstr "" + +#: doc/classes/Transform.xml +msgid "" +"Inverse-transforms the given [Vector3], [Plane], [AABB], or " +"[PoolVector3Array] by this transform, under the assumption that the " +"transformation is composed of rotation and translation (no scaling). " +"Equivalent to calling [code]inverse().xform(v)[/code] on this transform. For " +"affine transformations (e.g. with scaling) see [method affine_inverse] " +"method." +msgstr "" + +#: doc/classes/Transform.xml +msgid "" +"The basis is a matrix containing 3 [Vector3] as its columns: X axis, Y axis, " +"and Z axis. These vectors can be interpreted as the basis vectors of local " +"coordinate system traveling with the object." +msgstr "" + +#: doc/classes/Transform.xml +msgid "" +"The translation offset of the transform (column 3, the fourth column). " +"Equivalent to array index [code]3[/code]." +msgstr "" + +#: doc/classes/Transform.xml +msgid "" +"[Transform] with no translation, rotation or scaling applied. When applied " +"to other data structures, [constant IDENTITY] performs no transformation." +msgstr "" + +#: doc/classes/Transform.xml +msgid "[Transform] with mirroring applied perpendicular to the YZ plane." +msgstr "" + +#: doc/classes/Transform.xml +msgid "[Transform] with mirroring applied perpendicular to the XZ plane." +msgstr "" + +#: doc/classes/Transform.xml +msgid "[Transform] with mirroring applied perpendicular to the XY plane." +msgstr "" + +#: doc/classes/Transform2D.xml +msgid "2D transformation (2×3 matrix)." +msgstr "" + +#: doc/classes/Transform2D.xml +msgid "" +"2×3 matrix (2 rows, 3 columns) used for 2D linear transformations. It can " +"represent transformations such as translation, rotation, or scaling. It " +"consists of three [Vector2] values: [member x], [member y], and the [member " +"origin].\n" +"For more information, read the \"Matrices and transforms\" documentation " +"article." +msgstr "" + +#: doc/classes/Transform2D.xml +msgid "Constructs the transform from a 3D [Transform]." +msgstr "" + +#: doc/classes/Transform2D.xml +msgid "" +"Constructs the transform from 3 [Vector2] values representing [member x], " +"[member y], and the [member origin] (the three column vectors)." +msgstr "" + +#: doc/classes/Transform2D.xml +msgid "Constructs the transform from a given angle (in radians) and position." +msgstr "" + +#: doc/classes/Transform2D.xml +msgid "" +"Returns a vector transformed (multiplied) by the basis matrix.\n" +"This method does not account for translation (the origin vector)." +msgstr "" + +#: doc/classes/Transform2D.xml +msgid "" +"Returns a vector transformed (multiplied) by the inverse basis matrix.\n" +"This method does not account for translation (the origin vector)." +msgstr "" + +#: doc/classes/Transform2D.xml +msgid "Returns the transform's origin (translation)." +msgstr "" + +#: doc/classes/Transform2D.xml +msgid "Returns the transform's rotation (in radians)." +msgstr "" + +#: doc/classes/Transform2D.xml +msgid "Returns the scale." +msgstr "" + +#: doc/classes/Transform2D.xml +msgid "" +"Returns a copy of the transform rotated by the given [code]angle[/code] (in " +"radians), using matrix multiplication." +msgstr "" + +#: doc/classes/Transform2D.xml +msgid "" +"Returns a copy of the transform scaled by the given [code]scale[/code] " +"factor, using matrix multiplication.\n" +"[b]Note:[/b] Negative X scales in 2D are not decomposable from the " +"transformation matrix. Due to the way scale is represented with " +"transformation matrices in Godot, negative scales on the X axis will be " +"changed to negative scales on the Y axis and a rotation of 180 degrees when " +"decomposed." +msgstr "" + +#: doc/classes/Transform2D.xml +msgid "" +"Transforms the given [Vector2], [Rect2], or [PoolVector2Array] by this " +"transform." +msgstr "" + +#: doc/classes/Transform2D.xml +msgid "" +"Inverse-transforms the given [Vector2], [Rect2], or [PoolVector2Array] by " +"this transform, under the assumption that the transformation is composed of " +"rotation and translation (no scaling). Equivalent to calling [code]inverse()." +"xform(v)[/code] on this transform. For affine transformations (e.g. with " +"scaling) see [method affine_inverse] method." +msgstr "" + +#: doc/classes/Transform2D.xml +msgid "" +"The origin vector (column 2, the third column). Equivalent to array index " +"[code]2[/code]. The origin vector represents translation." +msgstr "" + +#: doc/classes/Transform2D.xml +msgid "" +"The identity [Transform2D] with no translation, rotation or scaling applied. " +"When applied to other data structures, [constant IDENTITY] performs no " +"transformation." +msgstr "" + +#: doc/classes/Transform2D.xml +msgid "The [Transform2D] that will flip something along the X axis." +msgstr "" + +#: doc/classes/Transform2D.xml +msgid "The [Transform2D] that will flip something along the Y axis." +msgstr "" + +#: doc/classes/Translation.xml +msgid "Language Translation." +msgstr "" + +#: doc/classes/Translation.xml +msgid "" +"Translations are resources that can be loaded and unloaded on demand. They " +"map a string to another string." +msgstr "" + +#: doc/classes/Translation.xml +msgid "Virtual method to override [method get_message]." +msgstr "" + +#: doc/classes/Translation.xml +msgid "Adds a message if nonexistent, followed by its translation." +msgstr "" + +#: doc/classes/Translation.xml +msgid "Erases a message." +msgstr "" + +#: doc/classes/Translation.xml +msgid "Returns a message's translation." +msgstr "" + +#: doc/classes/Translation.xml +msgid "Returns the number of existing messages." +msgstr "" + +#: doc/classes/Translation.xml +msgid "Returns all the messages (keys)." +msgstr "" + +#: doc/classes/Translation.xml +msgid "The locale of the translation." +msgstr "" + +#: doc/classes/TranslationServer.xml +msgid "Server that manages all translations." +msgstr "" + +#: doc/classes/TranslationServer.xml +msgid "" +"Server that manages all translations. Translations can be set to it and " +"removed from it." +msgstr "" + +#: doc/classes/TranslationServer.xml +msgid "Adds a [Translation] resource." +msgstr "" + +#: doc/classes/TranslationServer.xml +msgid "Clears the server from all translations." +msgstr "" + +#: doc/classes/TranslationServer.xml +msgid "Returns an array of all loaded locales of the project." +msgstr "" + +#: doc/classes/TranslationServer.xml +msgid "" +"Returns the current locale of the project.\n" +"See also [method OS.get_locale] and [method OS.get_locale_language] to query " +"the locale of the user system." +msgstr "" + +#: doc/classes/TranslationServer.xml +msgid "" +"Returns a locale's language and its variant (e.g. [code]\"en_US\"[/code] " +"would return [code]\"English (United States)\"[/code])." +msgstr "" + +#: doc/classes/TranslationServer.xml +msgid "Removes the given translation from the server." +msgstr "" + +#: doc/classes/TranslationServer.xml +msgid "" +"Sets the locale of the project. The [code]locale[/code] string will be " +"standardized to match known locales (e.g. [code]en-US[/code] would be " +"matched to [code]en_US[/code]).\n" +"If translations have been loaded beforehand for the new locale, they will be " +"applied." +msgstr "" + +#: doc/classes/TranslationServer.xml +msgid "Returns the current locale's translation for the given message (key)." +msgstr "" + +#: doc/classes/Tree.xml +msgid "Control to show a tree of items." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"This shows a tree of items that can be selected, expanded and collapsed. The " +"tree can have multiple columns with custom controls like text editing, " +"buttons and popups. It can be useful for structured displays and " +"interactions.\n" +"Trees are built via code, using [TreeItem] objects to create the structure. " +"They have a single root but multiple roots can be simulated if a dummy " +"hidden root is added.\n" +"[codeblock]\n" +"func _ready():\n" +" var tree = Tree.new()\n" +" var root = tree.create_item()\n" +" tree.set_hide_root(true)\n" +" var child1 = tree.create_item(root)\n" +" var child2 = tree.create_item(root)\n" +" var subchild1 = tree.create_item(child1)\n" +" subchild1.set_text(0, \"Subchild1\")\n" +"[/codeblock]\n" +"To iterate over all the [TreeItem] objects in a [Tree] object, use [method " +"TreeItem.get_next] and [method TreeItem.get_children] after getting the root " +"through [method get_root]. You can use [method Object.free] on a [TreeItem] " +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." +msgstr "" + +#: doc/classes/Tree.xml +msgid "Clears the tree. This removes all items." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Creates an item in the tree and adds it as a child of [code]parent[/code], " +"which can be either a valid [TreeItem] or [code]null[/code].\n" +"If [code]parent[/code] is [code]null[/code], the root item will be the " +"parent, or the new item will be the root itself if the tree is empty.\n" +"The new item will be the [code]idx[/code]th child of parent, or it will be " +"the last child if there are not enough siblings." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Edits the selected tree item as if it was clicked. The item must be set " +"editable with [method TreeItem.set_editable]. Returns [code]true[/code] if " +"the item could be edited. Fails if no item is selected." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Makes the currently focused cell visible.\n" +"This will scroll the tree if necessary. In [constant SELECT_ROW] mode, this " +"will not do horizontal scrolling, as all the cells in the selected row is " +"focused logically.\n" +"[b]Note:[/b] Despite the name of this method, the focus cursor itself is " +"only visible in [constant SELECT_MULTI] mode." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Returns the button id at [code]position[/code], or -1 if no button is there." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Returns the column index at [code]position[/code], or -1 if no item is there." +msgstr "" + +#: doc/classes/Tree.xml +msgid "Returns the column's title." +msgstr "" + +#: doc/classes/Tree.xml +msgid "Returns the column's width in pixels." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Returns the rectangle for custom popups. Helper to create custom cell " +"controls that display a popup. See [method TreeItem.set_cell_mode]." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Returns the drop section at [code]position[/code], or -100 if no item is " +"there.\n" +"Values -1, 0, or 1 will be returned for the \"above item\", \"on item\", and " +"\"below item\" drop sections, respectively. See [enum DropModeFlags] for a " +"description of each drop section.\n" +"To get the item which the returned drop section is relative to, use [method " +"get_item_at_position]." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Returns the currently edited item. Can be used with [signal item_edited] to " +"get the item that was modified.\n" +"[codeblock]\n" +"func _ready():\n" +" $Tree.connect(\"item_edited\", self, \"on_Tree_item_edited\")\n" +"\n" +"func on_Tree_item_edited():\n" +" print($Tree.get_edited()) # This item just got edited (e.g. checked).\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Tree.xml +msgid "Returns the column for the currently edited item." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Returns the rectangle area for the specified [TreeItem]. If [code]column[/" +"code] is specified, only get the position and size of that column, otherwise " +"get the rectangle containing all columns." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Returns the tree item at the specified position (relative to the tree origin " +"position)." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Returns the next selected [TreeItem] after the given one, or [code]null[/" +"code] if the end is reached.\n" +"If [code]from[/code] is [code]null[/code], this returns the first selected " +"item." +msgstr "" + +#: doc/classes/Tree.xml +msgid "Returns the last pressed button's index." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Returns the tree's root item, or [code]null[/code] if the tree is empty." +msgstr "" + +#: doc/classes/Tree.xml +msgid "Returns the current scrolling position." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Returns the currently focused item, or [code]null[/code] if no item is " +"focused.\n" +"In [constant SELECT_ROW] and [constant SELECT_SINGLE] modes, the focused " +"item is same as the selected item. In [constant SELECT_MULTI] mode, the " +"focused item is the item under the focus cursor, not necessarily selected.\n" +"To get the currently selected item(s), use [method get_next_selected]." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Returns the currently focused column, or -1 if no column is focused.\n" +"In [constant SELECT_SINGLE] mode, the focused column is the selected column. " +"In [constant SELECT_ROW] mode, the focused column is always 0 if any item is " +"selected. In [constant SELECT_MULTI] mode, the focused column is the column " +"under the focus cursor, and there are not necessarily any column selected.\n" +"To tell whether a column of an item is selected, use [method TreeItem." +"is_selected]." +msgstr "" + +#: doc/classes/Tree.xml +msgid "Causes the [Tree] to jump to the specified [TreeItem]." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"If [code]true[/code], the column will have the \"Expand\" flag of [Control]. " +"Columns that have the \"Expand\" flag will use their \"min_width\" in a " +"similar fashion to [member Control.size_flags_stretch_ratio]." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Sets the minimum width of a column. Columns that have the \"Expand\" flag " +"will use their \"min_width\" in a similar fashion to [member Control." +"size_flags_stretch_ratio]." +msgstr "" + +#: doc/classes/Tree.xml +msgid "Sets the title of a column." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"If [code]true[/code], the currently selected cell may be selected again." +msgstr "" + +#: doc/classes/Tree.xml +msgid "If [code]true[/code], a right mouse button click can select items." +msgstr "" + +#: doc/classes/Tree.xml +msgid "If [code]true[/code], column titles are visible." +msgstr "" + +#: doc/classes/Tree.xml +msgid "The number of columns." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"The drop mode as an OR combination of flags. See [enum DropModeFlags] " +"constants. Once dropping is done, reverts to [constant DROP_MODE_DISABLED]. " +"Setting this during [method Control.can_drop_data] is recommended.\n" +"This controls the drop sections, i.e. the decision and drawing of possible " +"drop locations based on the mouse position." +msgstr "" + +#: doc/classes/Tree.xml +msgid "If [code]true[/code], the folding arrow is hidden." +msgstr "" + +#: doc/classes/Tree.xml +msgid "If [code]true[/code], the tree's root is hidden." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Allows single or multiple selection. See the [enum SelectMode] constants." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Emitted when a button on the tree was pressed (see [method TreeItem." +"add_button])." +msgstr "" + +#: doc/classes/Tree.xml +msgid "Emitted when a cell is selected." +msgstr "" + +#: doc/classes/Tree.xml +msgid "Emitted when a column's title is pressed." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Emitted when a cell with the [constant TreeItem.CELL_MODE_CUSTOM] is clicked " +"to be edited." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Emitted when the right mouse button is pressed in the empty space of the " +"tree." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Emitted when the right mouse button is pressed if right mouse button " +"selection is active and the tree is empty." +msgstr "" + +#: doc/classes/Tree.xml +msgid "Emitted when an item's label is double-clicked." +msgstr "" + +#: doc/classes/Tree.xml +msgid "Emitted when an item is collapsed by a click on the folding arrow." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Emitted when a custom button is pressed (i.e. in a [constant TreeItem." +"CELL_MODE_CUSTOM] mode cell)." +msgstr "" + +#: doc/classes/Tree.xml +msgid "Emitted when an item's icon is double-clicked." +msgstr "" + +#: doc/classes/Tree.xml +msgid "Emitted when an item is edited." +msgstr "" + +#: doc/classes/Tree.xml +msgid "Emitted when an item is edited using the right mouse button." +msgstr "" + +#: doc/classes/Tree.xml +msgid "Emitted when an item is selected with the right mouse button." +msgstr "" + +#: doc/classes/Tree.xml +msgid "Emitted when an item is selected." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Emitted instead of [code]item_selected[/code] if [code]select_mode[/code] is " +"[constant SELECT_MULTI]." +msgstr "" + +#: doc/classes/Tree.xml +msgid "Emitted when a left mouse button click does not select any item." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Allows selection of a single cell at a time. From the perspective of items, " +"only a single item is allowed to be selected. And there is only one column " +"selected in the selected item.\n" +"The focus cursor is always hidden in this mode, but it is positioned at the " +"current selection, making the currently selected item the currently focused " +"item." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Allows selection of a single row at a time. From the perspective of items, " +"only a single items is allowed to be selected. And all the columns are " +"selected in the selected item.\n" +"The focus cursor is always hidden in this mode, but it is positioned at the " +"first column of the current selection, making the currently selected item " +"the currently focused item." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Allows selection of multiple cells at the same time. From the perspective of " +"items, multiple items are allowed to be selected. And there can be multiple " +"columns selected in each selected item.\n" +"The focus cursor is visible in this mode, the item or column under the " +"cursor is not necessarily selected." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Disables all drop sections, but still allows to detect the \"on item\" drop " +"section by [method get_drop_section_at_position].\n" +"[b]Note:[/b] This is the default flag, it has no effect when combined with " +"other flags." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Enables the \"on item\" drop section. This drop section covers the entire " +"item.\n" +"When combined with [constant DROP_MODE_INBETWEEN], this drop section halves " +"the height and stays centered vertically." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Enables \"above item\" and \"below item\" drop sections. The \"above item\" " +"drop section covers the top half of the item, and the \"below item\" drop " +"section covers the bottom half.\n" +"When combined with [constant DROP_MODE_ON_ITEM], these drop sections halves " +"the height and stays on top / bottom accordingly." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Text [Color] for a [constant TreeItem.CELL_MODE_CUSTOM] mode cell when it's " +"hovered." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"[Color] used to draw possible drop locations. See [enum DropModeFlags] " +"constants for further description of drop locations." +msgstr "" + +#: doc/classes/Tree.xml +msgid "[Color] of the guideline." +msgstr "" + +#: doc/classes/Tree.xml +msgid "[Color] of the relationship lines." +msgstr "" + +#: doc/classes/Tree.xml +msgid "Default text [Color] of the title button." +msgstr "" + +#: doc/classes/Tree.xml +msgid "The horizontal space between each button in a cell." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Draws the guidelines if not zero, this acts as a boolean. The guideline is a " +"horizontal line drawn at the bottom of each item." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Draws the relationship lines if not zero, this acts as a boolean. " +"Relationship lines are drawn at the start of child items to show hierarchy." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"The horizontal space between item cells. This is also used as the margin at " +"the start of an item when folding is disabled." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"The horizontal margin at the start of an item. This is used when folding is " +"enabled for the item." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"The maximum distance between the mouse cursor and the control's border to " +"trigger border scrolling when dragging." +msgstr "" + +#: doc/classes/Tree.xml +msgid "The speed of border scrolling." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"The vertical padding inside each item, i.e. the distance between the item's " +"content and top/bottom border." +msgstr "" + +#: doc/classes/Tree.xml +msgid "[Font] of the title button's text." +msgstr "" + +#: doc/classes/Tree.xml +msgid "The arrow icon used when a foldable item is not collapsed." +msgstr "" + +#: doc/classes/Tree.xml +msgid "The arrow icon used when a foldable item is collapsed." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"The check icon to display when the [constant TreeItem.CELL_MODE_CHECK] mode " +"cell is checked." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"The arrow icon to display for the [constant TreeItem.CELL_MODE_RANGE] mode " +"cell." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"The check icon to display when the [constant TreeItem.CELL_MODE_CHECK] mode " +"cell is unchecked." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"The updown arrow icon to display for the [constant TreeItem.CELL_MODE_RANGE] " +"mode cell." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Default [StyleBox] for the [Tree], i.e. used when the control is not being " +"focused." +msgstr "" + +#: doc/classes/Tree.xml +msgid "[StyleBox] used when the [Tree] is being focused." +msgstr "" + +#: doc/classes/Tree.xml +msgid "[StyleBox] used when a button in the tree is pressed." +msgstr "" + +#: doc/classes/Tree.xml +msgid "[StyleBox] used for the cursor, when the [Tree] is being focused." +msgstr "" + +#: doc/classes/Tree.xml +msgid "[StyleBox] used for the cursor, when the [Tree] is not being focused." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"Default [StyleBox] for a [constant TreeItem.CELL_MODE_CUSTOM] mode cell." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"[StyleBox] for a [constant TreeItem.CELL_MODE_CUSTOM] mode cell when it's " +"hovered." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"[StyleBox] for a [constant TreeItem.CELL_MODE_CUSTOM] mode cell when it's " +"pressed." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"[StyleBox] for the selected items, used when the [Tree] is not being focused." +msgstr "" + +#: doc/classes/Tree.xml +msgid "" +"[StyleBox] for the selected items, used when the [Tree] is being focused." +msgstr "" + +#: doc/classes/Tree.xml +msgid "[StyleBox] used when the title button is being hovered." +msgstr "" + +#: doc/classes/Tree.xml +msgid "Default [StyleBox] for the title button." +msgstr "" + +#: doc/classes/Tree.xml +msgid "[StyleBox] used when the title button is being pressed." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Control for a single item inside a [Tree]." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "" +"Control for a single item inside a [Tree]. May have child [TreeItem]s and be " +"styled as well as contain buttons.\n" +"You can remove a [TreeItem] by using [method Object.free]." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "" +"Adds a button with [Texture] [code]button[/code] at column [code]column[/" +"code]. The [code]id[/code] is used to identify the button. If not specified, " +"the next available index is used, which may be retrieved by calling [method " +"get_button_count] immediately before this method. Optionally, the button can " +"be [code]disabled[/code] and have a [code]tooltip[/code]." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "" +"Calls the [code]method[/code] on the actual TreeItem and its children " +"recursively. Pass parameters as a comma separated list." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Resets the background color for the given column to default." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Resets the color for the given column to default." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Deselects the given column." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "" +"Removes the button at index [code]button_idx[/code] in column [code]column[/" +"code]." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "" +"Returns the [Texture] of the button at index [code]button_idx[/code] in " +"column [code]column[/code]." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "" +"Returns the button index if there is a button with id [code]id[/code] in " +"column [code]column[/code], otherwise returns -1." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Returns the number of buttons in column [code]column[/code]." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "" +"Returns the id for the button at index [code]button_idx[/code] in column " +"[code]column[/code]." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "" +"Returns the tooltip string for the button at index [code]button_idx[/code] " +"in column [code]column[/code]." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Returns the column's cell mode." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "" +"Returns the TreeItem's first child item or a null object if there is none." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Returns the custom background color of column [code]column[/code]." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Returns the custom color of column [code]column[/code]." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Returns [code]true[/code] if [code]expand_right[/code] is set." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Returns the given column's icon [Texture]. Error if no icon is set." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Returns the column's icon's maximum width." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Returns the [Color] modulating the column's icon." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Returns the icon [Texture] region as [Rect2]." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "" +"Returns the metadata value that was set for the given column using [method " +"set_metadata]." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "" +"Returns the next sibling TreeItem in the tree or a null object if there is " +"none." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "" +"Returns the next visible sibling TreeItem in the tree or a null object if " +"there is none.\n" +"If [code]wrap[/code] is enabled, the method will wrap around to the first " +"visible element in the tree when called on the last visible element, " +"otherwise it returns [code]null[/code]." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Returns the parent TreeItem or a null object if there is none." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "" +"Returns the previous sibling TreeItem in the tree or a null object if there " +"is none." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "" +"Returns the previous visible sibling TreeItem in the tree or a null object " +"if there is none.\n" +"If [code]wrap[/code] is enabled, the method will wrap around to the last " +"visible element in the tree when called on the first visible element, " +"otherwise it returns [code]null[/code]." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Returns the value of a [constant CELL_MODE_RANGE] column." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "" +"Returns a dictionary containing the range parameters for a given column. The " +"keys are \"min\", \"max\", \"step\", and \"expr\"." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Gets the suffix string shown after the column value." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Returns the given column's text." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Returns the given column's text alignment." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Returns the given column's tooltip." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "" +"Returns [code]true[/code] if the button at index [code]button_idx[/code] for " +"the given column is disabled." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Returns [code]true[/code] if the given column is checked." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Returns [code]true[/code] if column [code]column[/code] is editable." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Returns [code]true[/code] if column [code]column[/code] is selectable." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Returns [code]true[/code] if column [code]column[/code] is selected." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Moves this TreeItem to the bottom in the [Tree] hierarchy." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Moves this TreeItem to the top in the [Tree] hierarchy." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "" +"Removes the given child [TreeItem] and all its children from the [Tree]. " +"Note that it doesn't free the item from memory, so it can be reused later. " +"To completely remove a [TreeItem] use [method Object.free]." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Selects the column [code]column[/code]." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "" +"Sets the given column's button [Texture] at index [code]button_idx[/code] to " +"[code]button[/code]." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "" +"If [code]true[/code], disables the button at index [code]button_idx[/code] " +"in column [code]column[/code]." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "" +"Sets the given column's cell mode to [code]mode[/code]. See [enum " +"TreeCellMode] constants." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "If [code]true[/code], the column [code]column[/code] is checked." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "" +"Sets the given column's custom background color and whether to just use it " +"as an outline." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Sets the given column's custom color." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "" +"Sets the given column's custom draw callback to [code]callback[/code] method " +"on [code]object[/code].\n" +"The [code]callback[/code] should accept two arguments: the [TreeItem] that " +"is drawn and its position and size as a [Rect2]." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "If [code]true[/code], column [code]column[/code] is editable." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "" +"If [code]true[/code], column [code]column[/code] is expanded to the right." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Sets the given column's icon [Texture]." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Sets the given column's icon's maximum width." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Modulates the given column's icon with [code]modulate[/code]." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Sets the given column's icon's texture region." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "" +"Sets the metadata value for the given column, which can be retrieved later " +"using [method get_metadata]. This can be used, for example, to store a " +"reference to the original data." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Sets the value of a [constant CELL_MODE_RANGE] column." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "" +"Sets the range of accepted values for a column. The column must be in the " +"[constant CELL_MODE_RANGE] mode.\n" +"If [code]expr[/code] is [code]true[/code], the edit mode slider will use an " +"exponential scale as with [member Range.exp_edit]." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "If [code]true[/code], the given column is selectable." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "" +"Sets a string to be shown after a column's value (for example, a unit " +"abbreviation)." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Sets the given column's text value." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "" +"Sets the given column's text alignment. See [enum TextAlign] for possible " +"values." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Sets the given column's tooltip text." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "If [code]true[/code], the TreeItem is collapsed." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "The custom minimum height." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "If [code]true[/code], folding is disabled for this TreeItem." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Cell contains a string." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Cell contains a checkbox." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Cell contains a range." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Cell contains an icon." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Align text to the left. See [code]set_text_align()[/code]." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Center text. See [code]set_text_align()[/code]." +msgstr "" + +#: doc/classes/TreeItem.xml +msgid "Align text to the right. See [code]set_text_align()[/code]." +msgstr "" + +#: doc/classes/TriangleMesh.xml +msgid "Internal mesh type." +msgstr "" + +#: doc/classes/TriangleMesh.xml +msgid "Mesh type used internally for collision calculations." +msgstr "" + +#: doc/classes/Tween.xml +msgid "Smoothly animates a node's properties over time." +msgstr "" + +#: doc/classes/Tween.xml +msgid "" +"Tweens are useful for animations requiring a numerical property to be " +"interpolated over a range of values. The name [i]tween[/i] comes from [i]in-" +"betweening[/i], an animation technique where you specify [i]keyframes[/i] " +"and the computer interpolates the frames that appear between them.\n" +"[Tween] is more suited than [AnimationPlayer] for animations where you don't " +"know the final values in advance. For example, interpolating a dynamically-" +"chosen camera zoom value is best done with a [Tween] node; it would be " +"difficult to do the same thing with an [AnimationPlayer] node.\n" +"Here is a brief usage example that makes a 2D node move smoothly between two " +"positions:\n" +"[codeblock]\n" +"var tween = get_node(\"Tween\")\n" +"tween.interpolate_property($Node2D, \"position\",\n" +" Vector2(0, 0), Vector2(100, 100), 1,\n" +" Tween.TRANS_LINEAR, Tween.EASE_IN_OUT)\n" +"tween.start()\n" +"[/codeblock]\n" +"Many methods require a property name, such as [code]\"position\"[/code] " +"above. You can find the correct property name by hovering over the property " +"in the Inspector. You can also provide the components of a property directly " +"by using [code]\"property:component\"[/code] (e.g. [code]position:x[/code]), " +"where it would only apply to that particular component.\n" +"Many of the methods accept [code]trans_type[/code] and [code]ease_type[/" +"code]. The first accepts an [enum TransitionType] constant, and refers to " +"the way the timing of the animation is handled (see [url=https://easings." +"net/]easings.net[/url] for some examples). The second accepts an [enum " +"EaseType] constant, and controls where the [code]trans_type[/code] is " +"applied to the interpolation (in the beginning, the end, or both). If you " +"don't know which transition and easing to pick, you can try different [enum " +"TransitionType] constants with [constant EASE_IN_OUT], and use the one that " +"looks best.\n" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/" +"tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" +"[b]Note:[/b] Tween methods will return [code]false[/code] if the requested " +"operation cannot be completed.\n" +"[b]Note:[/b] For an alternative method of tweening, that doesn't require " +"using nodes, see [SceneTreeTween]." +msgstr "" + +#: doc/classes/Tween.xml +msgid "" +"Follows [code]method[/code] of [code]object[/code] and applies the returned " +"value on [code]target_method[/code] of [code]target[/code], beginning from " +"[code]initial_val[/code] for [code]duration[/code] seconds, [code]delay[/" +"code] later. Methods are called with consecutive values.\n" +"Use [enum TransitionType] for [code]trans_type[/code] and [enum EaseType] " +"for [code]ease_type[/code] parameters. These values control the timing and " +"direction of the interpolation. See the class description for more " +"information." +msgstr "" + +#: doc/classes/Tween.xml +msgid "" +"Follows [code]property[/code] of [code]object[/code] and applies it on " +"[code]target_property[/code] of [code]target[/code], beginning from " +"[code]initial_val[/code] for [code]duration[/code] seconds, [code]delay[/" +"code] seconds later.\n" +"Use [enum TransitionType] for [code]trans_type[/code] and [enum EaseType] " +"for [code]ease_type[/code] parameters. These values control the timing and " +"direction of the interpolation. See the class description for more " +"information." +msgstr "" + +#: doc/classes/Tween.xml +msgid "" +"Returns the total time needed for all tweens to end. If you have two tweens, " +"one lasting 10 seconds and the other 20 seconds, it would return 20 seconds, " +"as by that time all tweens would have finished." +msgstr "" + +#: doc/classes/Tween.xml +msgid "" +"Calls [code]callback[/code] of [code]object[/code] after [code]duration[/" +"code]. [code]arg1[/code]-[code]arg5[/code] are arguments to be passed to the " +"callback." +msgstr "" + +#: doc/classes/Tween.xml +msgid "" +"Calls [code]callback[/code] of [code]object[/code] after [code]duration[/" +"code] on the main thread (similar to [method Object.call_deferred]). " +"[code]arg1[/code]-[code]arg5[/code] are arguments to be passed to the " +"callback." +msgstr "" + +#: doc/classes/Tween.xml +msgid "" +"Animates [code]method[/code] of [code]object[/code] from [code]initial_val[/" +"code] to [code]final_val[/code] for [code]duration[/code] seconds, " +"[code]delay[/code] seconds later. Methods are called with consecutive " +"values.\n" +"Use [enum TransitionType] for [code]trans_type[/code] and [enum EaseType] " +"for [code]ease_type[/code] parameters. These values control the timing and " +"direction of the interpolation. See the class description for more " +"information." +msgstr "" + +#: doc/classes/Tween.xml +msgid "" +"Animates [code]property[/code] of [code]object[/code] from " +"[code]initial_val[/code] to [code]final_val[/code] for [code]duration[/code] " +"seconds, [code]delay[/code] seconds later. Setting the initial value to " +"[code]null[/code] uses the current value of the property.\n" +"Use [enum TransitionType] for [code]trans_type[/code] and [enum EaseType] " +"for [code]ease_type[/code] parameters. These values control the timing and " +"direction of the interpolation. See the class description for more " +"information." +msgstr "" + +#: doc/classes/Tween.xml +msgid "" +"Returns [code]true[/code] if any tweens are currently running.\n" +"[b]Note:[/b] This method doesn't consider tweens that have ended." +msgstr "" + +#: doc/classes/Tween.xml +msgid "" +"Stops animation and removes a tween, given its object and property/method " +"pair. By default, all tweens are removed, unless [code]key[/code] is " +"specified." +msgstr "" + +#: doc/classes/Tween.xml +msgid "Stops animation and removes all tweens." +msgstr "" + +#: doc/classes/Tween.xml +msgid "" +"Resets a tween to its initial value (the one given, not the one before the " +"tween), given its object and property/method pair. By default, all tweens " +"are reset, unless [code]key[/code] is specified." +msgstr "" + +#: doc/classes/Tween.xml +msgid "" +"Resets all tweens to their initial values (the ones given, not those before " +"the tween)." +msgstr "" + +#: doc/classes/Tween.xml +msgid "" +"Continues animating a stopped tween, given its object and property/method " +"pair. By default, all tweens are resumed, unless [code]key[/code] is " +"specified." +msgstr "" + +#: doc/classes/Tween.xml +msgid "Continues animating all stopped tweens." +msgstr "" + +#: doc/classes/Tween.xml +msgid "Sets the interpolation to the given [code]time[/code] in seconds." +msgstr "" + +#: doc/classes/Tween.xml +msgid "" +"Activates/deactivates the tween. See also [method stop_all] and [method " +"resume_all]." +msgstr "" + +#: doc/classes/Tween.xml +msgid "Starts the tween. You can define animations both before and after this." +msgstr "" + +#: doc/classes/Tween.xml +msgid "" +"Stops a tween, given its object and property/method pair. By default, all " +"tweens are stopped, unless [code]key[/code] is specified." +msgstr "" + +#: doc/classes/Tween.xml +msgid "Stops animating all tweens." +msgstr "" + +#: doc/classes/Tween.xml +msgid "" +"Animates [code]method[/code] of [code]object[/code] from the value returned " +"by [code]initial_method[/code] to [code]final_val[/code] for [code]duration[/" +"code] seconds, [code]delay[/code] seconds later. Methods are animated by " +"calling them with consecutive values.\n" +"Use [enum TransitionType] for [code]trans_type[/code] and [enum EaseType] " +"for [code]ease_type[/code] parameters. These values control the timing and " +"direction of the interpolation. See the class description for more " +"information." +msgstr "" + +#: doc/classes/Tween.xml +msgid "" +"Animates [code]property[/code] of [code]object[/code] from the current value " +"of the [code]initial_val[/code] property of [code]initial[/code] to " +"[code]final_val[/code] for [code]duration[/code] seconds, [code]delay[/code] " +"seconds later.\n" +"Use [enum TransitionType] for [code]trans_type[/code] and [enum EaseType] " +"for [code]ease_type[/code] parameters. These values control the timing and " +"direction of the interpolation. See the class description for more " +"information." +msgstr "" + +#: doc/classes/Tween.xml +msgid "Returns the current time of the tween." +msgstr "" + +#: doc/classes/Tween.xml +msgid "The tween's animation process thread. See [enum TweenProcessMode]." +msgstr "" + +#: doc/classes/Tween.xml +msgid "" +"The tween's speed multiplier. For example, set it to [code]1.0[/code] for " +"normal speed, [code]2.0[/code] for two times normal speed, or [code]0.5[/" +"code] for half of the normal speed. A value of [code]0[/code] pauses the " +"animation, but see also [method set_active] or [method stop_all] for this." +msgstr "" + +#: doc/classes/Tween.xml +msgid "If [code]true[/code], the tween loops." +msgstr "" + +#: doc/classes/Tween.xml +msgid "Emitted when all processes in a tween end." +msgstr "" + +#: doc/classes/Tween.xml +msgid "Emitted when a tween ends." +msgstr "" + +#: doc/classes/Tween.xml +msgid "Emitted when a tween starts." +msgstr "" + +#: doc/classes/Tween.xml +msgid "Emitted at each step of the animation." +msgstr "" + +#: doc/classes/Tween.xml +msgid "The tween updates with the [code]_physics_process[/code] callback." +msgstr "" + +#: doc/classes/Tween.xml +msgid "The tween updates with the [code]_process[/code] callback." +msgstr "" + +#: doc/classes/Tween.xml +msgid "The animation is interpolated linearly." +msgstr "" + +#: doc/classes/Tween.xml +msgid "The animation is interpolated using a sine function." +msgstr "" + +#: doc/classes/Tween.xml +msgid "" +"The animation is interpolated with a quintic (to the power of 5) function." +msgstr "" + +#: doc/classes/Tween.xml +msgid "" +"The animation is interpolated with a quartic (to the power of 4) function." +msgstr "" + +#: doc/classes/Tween.xml +msgid "" +"The animation is interpolated with a quadratic (to the power of 2) function." +msgstr "" + +#: doc/classes/Tween.xml +msgid "" +"The animation is interpolated with an exponential (to the power of x) " +"function." +msgstr "" + +#: doc/classes/Tween.xml +msgid "" +"The animation is interpolated with elasticity, wiggling around the edges." +msgstr "" + +#: doc/classes/Tween.xml +msgid "" +"The animation is interpolated with a cubic (to the power of 3) function." +msgstr "" + +#: doc/classes/Tween.xml +msgid "The animation is interpolated with a function using square roots." +msgstr "" + +#: doc/classes/Tween.xml +msgid "The animation is interpolated by bouncing at the end." +msgstr "" + +#: doc/classes/Tween.xml +msgid "The animation is interpolated backing out at ends." +msgstr "" + +#: doc/classes/Tween.xml +msgid "The interpolation starts slowly and speeds up towards the end." +msgstr "" + +#: doc/classes/Tween.xml +msgid "The interpolation starts quickly and slows down towards the end." +msgstr "" + +#: doc/classes/Tween.xml +msgid "" +"A combination of [constant EASE_IN] and [constant EASE_OUT]. The " +"interpolation is slowest at both ends." +msgstr "" + +#: doc/classes/Tween.xml +msgid "" +"A combination of [constant EASE_IN] and [constant EASE_OUT]. The " +"interpolation is fastest at both ends." +msgstr "" + +#: doc/classes/Tweener.xml +msgid "Abstract class for all Tweeners used by [SceneTreeTween]." +msgstr "" + +#: doc/classes/Tweener.xml +msgid "" +"Tweeners are objects that perform a specific animating task, e.g. " +"interpolating a property or calling a method at a given time. A [Tweener] " +"can't be created manually, you need to use a dedicated method from " +"[SceneTreeTween]." +msgstr "" + +#: doc/classes/Tweener.xml +msgid "Emitted when the [Tweener] has just finished its job." +msgstr "" + +#: doc/classes/UDPServer.xml +msgid "Helper class to implement a UDP server." +msgstr "" + +#: doc/classes/UDPServer.xml +msgid "" +"A simple server that opens a UDP socket and returns connected " +"[PacketPeerUDP] upon receiving new packets. See also [method PacketPeerUDP." +"connect_to_host].\n" +"After starting the server ([method listen]), you will need to [method poll] " +"it at regular intervals (e.g. inside [method Node._process]) for it to " +"process new packets, delivering them to the appropriate [PacketPeerUDP], and " +"taking new connections.\n" +"Below a small example of how it can be used:\n" +"[codeblock]\n" +"# server.gd\n" +"extends Node\n" +"\n" +"var server := UDPServer.new()\n" +"var peers = []\n" +"\n" +"func _ready():\n" +" server.listen(4242)\n" +"\n" +"func _process(delta):\n" +" server.poll() # Important!\n" +" if server.is_connection_available():\n" +" var peer : PacketPeerUDP = server.take_connection()\n" +" var pkt = peer.get_packet()\n" +" print(\"Accepted peer: %s:%s\" % [peer.get_packet_ip(), peer." +"get_packet_port()])\n" +" print(\"Received data: %s\" % [pkt.get_string_from_utf8()])\n" +" # Reply so it knows we received the message.\n" +" peer.put_packet(pkt)\n" +" # Keep a reference so we can keep contacting the remote peer.\n" +" peers.append(peer)\n" +"\n" +" for i in range(0, peers.size()):\n" +" pass # Do something with the connected peers.\n" +"\n" +"[/codeblock]\n" +"[codeblock]\n" +"# client.gd\n" +"extends Node\n" +"\n" +"var udp := PacketPeerUDP.new()\n" +"var connected = false\n" +"\n" +"func _ready():\n" +" udp.connect_to_host(\"127.0.0.1\", 4242)\n" +"\n" +"func _process(delta):\n" +" if !connected:\n" +" # Try to contact server\n" +" udp.put_packet(\"The answer is... 42!\".to_utf8())\n" +" if udp.get_available_packet_count() > 0:\n" +" print(\"Connected: %s\" % udp.get_packet().get_string_from_utf8())\n" +" connected = true\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/UDPServer.xml +msgid "" +"Returns [code]true[/code] if a packet with a new address/port combination " +"was received on the socket." +msgstr "" + +#: doc/classes/UDPServer.xml +msgid "" +"Returns [code]true[/code] if the socket is open and listening on a port." +msgstr "" + +#: doc/classes/UDPServer.xml +msgid "" +"Starts the server by opening a UDP socket listening on the given port. You " +"can optionally specify a [code]bind_address[/code] to only listen for " +"packets sent to that address. See also [method PacketPeerUDP.listen]." +msgstr "" + +#: doc/classes/UDPServer.xml +msgid "" +"Call this method at regular intervals (e.g. inside [method Node._process]) " +"to process new packets. And packet from known address/port pair will be " +"delivered to the appropriate [PacketPeerUDP], any packet received from an " +"unknown address/port pair will be added as a pending connection (see [method " +"is_connection_available], [method take_connection]). The maximum number of " +"pending connection is defined via [member max_pending_connections]." +msgstr "" + +#: doc/classes/UDPServer.xml +msgid "" +"Stops the server, closing the UDP socket if open. Will close all connected " +"[PacketPeerUDP] accepted via [method take_connection] (remote peers will not " +"be notified)." +msgstr "" + +#: doc/classes/UDPServer.xml +msgid "" +"Returns the first pending connection (connected to the appropriate address/" +"port). Will return [code]null[/code] if no new connection is available. See " +"also [method is_connection_available], [method PacketPeerUDP." +"connect_to_host]." +msgstr "" + +#: doc/classes/UDPServer.xml +msgid "" +"Define the maximum number of pending connections, during [method poll], any " +"new pending connection exceeding that value will be automatically dropped. " +"Setting this value to [code]0[/code] effectively prevents any new pending " +"connection to be accepted (e.g. when all your players have connected)." +msgstr "" + +#: doc/classes/UndoRedo.xml +msgid "Helper to manage undo/redo operations in the editor or custom tools." +msgstr "" + +#: doc/classes/UndoRedo.xml +msgid "" +"Helper to manage undo/redo operations in the editor or custom tools. It " +"works by registering methods and property changes inside \"actions\".\n" +"Common behavior is to create an action, then add do/undo calls to functions " +"or property changes, then committing the action.\n" +"Here's an example on how to add an action to the Godot editor's own " +"[UndoRedo], from a plugin:\n" +"[codeblock]\n" +"var undo_redo = get_undo_redo() # Method of EditorPlugin.\n" +"\n" +"func do_something():\n" +" pass # Put your code here.\n" +"\n" +"func undo_something():\n" +" pass # Put here the code that reverts what's done by " +"\"do_something()\".\n" +"\n" +"func _on_MyButton_pressed():\n" +" var node = get_node(\"MyNode2D\")\n" +" undo_redo.create_action(\"Move the node\")\n" +" undo_redo.add_do_method(self, \"do_something\")\n" +" undo_redo.add_undo_method(self, \"undo_something\")\n" +" undo_redo.add_do_property(node, \"position\", Vector2(100,100))\n" +" undo_redo.add_undo_property(node, \"position\", node.position)\n" +" undo_redo.commit_action()\n" +"[/codeblock]\n" +"[method create_action], [method add_do_method], [method add_undo_method], " +"[method add_do_property], [method add_undo_property], and [method " +"commit_action] should be called one after the other, like in the example. " +"Not doing so could lead to crashes.\n" +"If you don't need to register a method, you can leave [method add_do_method] " +"and [method add_undo_method] out; the same goes for properties. You can also " +"register more than one method/property." +msgstr "" + +#: doc/classes/UndoRedo.xml +msgid "Register a method that will be called when the action is committed." +msgstr "" + +#: doc/classes/UndoRedo.xml +msgid "Register a property value change for \"do\"." +msgstr "" + +#: doc/classes/UndoRedo.xml +msgid "" +"Register a reference for \"do\" that will be erased if the \"do\" history is " +"lost. This is useful mostly for new nodes created for the \"do\" call. Do " +"not use for resources." +msgstr "" + +#: doc/classes/UndoRedo.xml +msgid "Register a method that will be called when the action is undone." +msgstr "" + +#: doc/classes/UndoRedo.xml +msgid "Register a property value change for \"undo\"." +msgstr "" + +#: doc/classes/UndoRedo.xml +msgid "" +"Register a reference for \"undo\" that will be erased if the \"undo\" " +"history is lost. This is useful mostly for nodes removed with the \"do\" " +"call (not the \"undo\" call!)." +msgstr "" + +#: doc/classes/UndoRedo.xml +msgid "" +"Clear the undo/redo history and associated references.\n" +"Passing [code]false[/code] to [code]increase_version[/code] will prevent the " +"version number to be increased from this." +msgstr "" + +#: doc/classes/UndoRedo.xml +msgid "" +"Commit the action. All \"do\" methods/properties are called/set when this " +"function is called." +msgstr "" + +#: doc/classes/UndoRedo.xml +msgid "" +"Create a new action. After this is called, do all your calls to [method " +"add_do_method], [method add_undo_method], [method add_do_property], and " +"[method add_undo_property], then commit the action with [method " +"commit_action].\n" +"The way actions are merged is dictated by the [code]merge_mode[/code] " +"argument. See [enum MergeMode] for details." +msgstr "" + +#: doc/classes/UndoRedo.xml +msgid "Gets the name of the current action." +msgstr "" + +#: doc/classes/UndoRedo.xml +msgid "" +"Gets the version. Every time a new action is committed, the [UndoRedo]'s " +"version number is increased automatically.\n" +"This is useful mostly to check if something changed from a saved version." +msgstr "" + +#: doc/classes/UndoRedo.xml +msgid "" +"Returns [code]true[/code] if the [UndoRedo] is currently committing the " +"action, i.e. running its \"do\" method or property change (see [method " +"commit_action])." +msgstr "" + +#: doc/classes/UndoRedo.xml +msgid "Redo the last action." +msgstr "" + +#: doc/classes/UndoRedo.xml +msgid "Undo the last action." +msgstr "" + +#: doc/classes/UndoRedo.xml +msgid "Called when [method undo] or [method redo] was called." +msgstr "" + +#: doc/classes/UndoRedo.xml +msgid "Makes \"do\"/\"undo\" operations stay in separate actions." +msgstr "" + +#: doc/classes/UndoRedo.xml +msgid "" +"Makes so that the action's \"do\" operation is from the first action created " +"and the \"undo\" operation is from the last subsequent action with the same " +"name." +msgstr "" + +#: doc/classes/UndoRedo.xml +msgid "Makes subsequent actions with the same name be merged into one." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" +"[codeblock]\n" +"var upnp = UPNP.new()\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" +"[/codeblock]\n" +"To close a specific port (e.g. after you have finished using it):\n" +"[codeblock]\n" +"upnp.delete_port_mapping(port)\n" +"[/codeblock]\n" +"[b]Note:[/b] UPnP discovery blocks the current thread. To perform discovery " +"without blocking the main thread, use [Thread]s like this:\n" +"[codeblock]\n" +"# Emitted when UPnP port mapping setup is completed (regardless of success " +"or failure).\n" +"signal upnp_completed(error)\n" +"\n" +"# Replace this with your own server port number between 1024 and 65535.\n" +"const SERVER_PORT = 3928\n" +"var thread = null\n" +"\n" +"func _upnp_setup(server_port):\n" +" # UPNP queries take some time.\n" +" var upnp = UPNP.new()\n" +" var err = upnp.discover()\n" +"\n" +" if err != OK:\n" +" push_error(str(err))\n" +" emit_signal(\"upnp_completed\", err)\n" +" return\n" +"\n" +" if upnp.get_gateway() and upnp.get_gateway().is_valid_gateway():\n" +" upnp.add_port_mapping(server_port, server_port, ProjectSettings." +"get_setting(\"application/config/name\"), \"UDP\")\n" +" upnp.add_port_mapping(server_port, server_port, ProjectSettings." +"get_setting(\"application/config/name\"), \"TCP\")\n" +" emit_signal(\"upnp_completed\", OK)\n" +"\n" +"func _ready():\n" +" thread = Thread.new()\n" +" thread.start(self, \"_upnp_setup\", SERVER_PORT)\n" +"\n" +"func _exit_tree():\n" +" # Wait for thread finish here to handle game exit while the thread is " +"running.\n" +" thread.wait_to_finish()\n" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "Adds the given [UPNPDevice] to the list of discovered devices." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "" +"Adds a mapping to forward the external [code]port[/code] (between 1 and " +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" +"If [code]internal_port[/code] is [code]0[/code] (the default), the same port " +"number is used for both the external and the internal port (the [code]port[/" +"code] value).\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" +"See [enum UPNPResult] for possible return values." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "Clears the list of discovered devices." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "" +"Deletes the port mapping for the given port and protocol combination on the " +"default gateway (see [method get_gateway]) if one exists. [code]port[/code] " +"must be a valid port between 1 and 65535, [code]proto[/code] can be either " +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "" +"Discovers local [UPNPDevice]s. Clears the list of previously discovered " +"devices.\n" +"Filters for IGD (InternetGatewayDevice) type devices by default, as those " +"manage port forwarding. [code]timeout[/code] is the time to wait for " +"responses in milliseconds. [code]ttl[/code] is the time-to-live; only touch " +"this if you know what you're doing.\n" +"See [enum UPNPResult] for possible return values." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "Returns the [UPNPDevice] at the given [code]index[/code]." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "Returns the number of discovered [UPNPDevice]s." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "" +"Returns the default gateway. That is the first discovered [UPNPDevice] that " +"is also a valid IGD (InternetGatewayDevice)." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "" +"Returns the external [IP] address of the default gateway (see [method " +"get_gateway]) as string. Returns an empty string on error." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "" +"Removes the device at [code]index[/code] from the list of discovered devices." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "" +"Sets the device at [code]index[/code] from the list of discovered devices to " +"[code]device[/code]." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "If [code]true[/code], IPv6 is used for [UPNPDevice] discovery." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "" +"If [code]0[/code], the local port to use for discovery is chosen " +"automatically by the system. If [code]1[/code], discovery will be done from " +"the source port 1900 (same as destination port). Otherwise, the value will " +"be used as the port." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "" +"Multicast interface to use for discovery. Uses the default multicast " +"interface if empty." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "UPNP command or discovery was successful." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "" +"Not authorized to use the command on the [UPNPDevice]. May be returned when " +"the user disabled UPNP on their router." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "" +"No port mapping was found for the given port, protocol combination on the " +"given [UPNPDevice]." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "Inconsistent parameters." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "" +"No such entry in array. May be returned if a given port, protocol " +"combination is not found on an [UPNPDevice]." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "The action failed." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "" +"The [UPNPDevice] does not allow wildcard values for the source IP address." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "The [UPNPDevice] does not allow wildcard values for the external port." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "The [UPNPDevice] does not allow wildcard values for the internal port." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "The remote host value must be a wildcard." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "The external port value must be a wildcard." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "" +"No port maps are available. May also be returned if port mapping " +"functionality is not available." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "" +"Conflict with other mechanism. May be returned instead of [constant " +"UPNP_RESULT_CONFLICT_WITH_OTHER_MAPPING] if a port mapping conflicts with an " +"existing one." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "Conflict with an existing port mapping." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "External and internal port values must be the same." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "" +"Only permanent leases are supported. Do not use the [code]duration[/code] " +"parameter when adding port mappings." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "Invalid gateway." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "Invalid port." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "Invalid protocol." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "Invalid duration." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "Invalid arguments." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "Invalid response." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "Invalid parameter." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml modules/upnp/doc_classes/UPNPDevice.xml +msgid "HTTP error." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "Socket error." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "Error allocating memory." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "" +"No gateway available. You may need to call [method discover] first, or " +"discovery didn't detect any valid IGDs (InternetGatewayDevices)." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml +msgid "" +"No devices available. You may need to call [method discover] first, or " +"discovery didn't detect any valid [UPNPDevice]s." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml modules/upnp/doc_classes/UPNPDevice.xml +msgid "Unknown error." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml +msgid "Universal Plug and Play (UPnP) device." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml +msgid "" +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml +msgid "" +"Adds a port mapping to forward the given external port on this [UPNPDevice] " +"for the given protocol to the local machine. See [method UPNP." +"add_port_mapping]." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml +msgid "" +"Deletes the port mapping identified by the given port and protocol " +"combination on this device. See [method UPNP.delete_port_mapping]." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml +msgid "" +"Returns [code]true[/code] if this is a valid IGD (InternetGatewayDevice) " +"which potentially supports port forwarding." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml +msgid "" +"Returns the external IP address of this [UPNPDevice] or an empty string." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml +msgid "URL to the device description." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml +msgid "IDG control URL." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml +msgid "" +"Address of the local machine in the network connecting it to this " +"[UPNPDevice]." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml +msgid "IGD service type." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml +msgid "IGD status. See [enum IGDStatus]." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml +msgid "Service type." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml +msgid "OK." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml +msgid "Empty HTTP response." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml +msgid "Returned response contained no URLs." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml +msgid "Not a valid IGD." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml +msgid "Disconnected." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml +msgid "Unknown device." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml +msgid "Invalid control." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml +msgid "Memory allocation error." +msgstr "" + +#: doc/classes/Variant.xml +msgid "The most important data type in Godot." +msgstr "" + +#: doc/classes/Variant.xml +msgid "" +"In computer programming, a Variant class is a class that is designed to " +"store a variety of other types. Dynamic programming languages like PHP, Lua, " +"JavaScript and GDScript like to use them to store variables' data on the " +"backend. With these Variants, properties are able to change value types " +"freely.\n" +"[codeblock]\n" +"var foo = 2 # foo is dynamically an integer\n" +"foo = \"Now foo is a string!\"\n" +"foo = Reference.new() # foo is an Object\n" +"var bar: int = 2 # bar is a statically typed integer.\n" +"# bar = \"Uh oh! I can't make static variables become a different type!\"\n" +"[/codeblock]\n" +"Godot tracks all scripting API variables within Variants. Without even " +"realizing it, you use Variants all the time. When a particular language " +"enforces its own rules for keeping data typed, then that language is " +"applying its own custom logic over the base Variant scripting API.\n" +"- GDScript automatically wrap values in them. It keeps all data in plain " +"Variants by default and then optionally enforces custom static typing rules " +"on variable types.\n" +"- VisualScript tracks properties inside Variants as well, but it also uses " +"static typing. The GUI interface enforces that properties have a particular " +"type that doesn't change over time.\n" +"- C# is statically typed, but uses the Mono [code]object[/code] type in " +"place of Godot's Variant class when it needs to represent a dynamic value. " +"[code]object[/code] is the Mono runtime's equivalent of the same concept.\n" +"- The statically-typed language NativeScript C++ does not define a built-in " +"Variant-like class. Godot's GDNative bindings provide their own godot::" +"Variant class for users; Any point at which the C++ code starts interacting " +"with the Godot runtime is a place where you might have to start wrapping " +"data inside Variant objects.\n" +"The global [method @GDScript.typeof] function returns the enumerated value " +"of the Variant type stored in the current variable (see [enum Variant." +"Type]).\n" +"[codeblock]\n" +"var foo = 2\n" +"match typeof(foo):\n" +" TYPE_NIL:\n" +" print(\"foo is null\")\n" +" TYPE_INTEGER:\n" +" print(\"foo is an integer\")\n" +" TYPE_OBJECT:\n" +" # Note that Objects are their own special category.\n" +" # To get the name of the underlying Object type, you need the " +"`get_class()` method.\n" +" print(\"foo is a(n) %s\" % foo.get_class()) # inject the class name " +"into a formatted string.\n" +" # Note also that there is not yet any way to get a script's " +"`class_name` string easily.\n" +" # To fetch that value, you need to dig deeply into a hidden " +"ProjectSettings setting: an Array of Dictionaries called " +"\"_global_script_classes\".\n" +" # Open your project.godot file to see it up close.\n" +"[/codeblock]\n" +"A Variant takes up only 20 bytes and can store almost any engine datatype " +"inside of it. Variants are rarely used to hold information for long periods " +"of time. Instead, they are used mainly for communication, editing, " +"serialization and moving data around.\n" +"Godot has specifically invested in making its Variant class as flexible as " +"possible; so much so that it is used for a multitude of operations to " +"facilitate communication between all of Godot's systems.\n" +"A Variant:\n" +"- Can store almost any datatype.\n" +"- Can perform operations between many variants. GDScript uses Variant as its " +"atomic/native datatype.\n" +"- Can be hashed, so it can be compared quickly to other variants.\n" +"- Can be used to convert safely between datatypes.\n" +"- Can be used to abstract calling methods and their arguments. Godot exports " +"all its functions through variants.\n" +"- Can be used to defer calls or move data between threads.\n" +"- Can be serialized as binary and stored to disk, or transferred via " +"network.\n" +"- Can be serialized to text and use it for printing values and editable " +"settings.\n" +"- Can work as an exported property, so the editor can edit it universally.\n" +"- Can be used for dictionaries, arrays, parsers, etc.\n" +"[b]Containers (Array and Dictionary):[/b] Both are implemented using " +"variants. A [Dictionary] can match any datatype used as key to any other " +"datatype. An [Array] just holds an array of Variants. Of course, a Variant " +"can also hold a [Dictionary] and an [Array] inside, making it even more " +"flexible.\n" +"Modifications to a container will modify all references to it. A [Mutex] " +"should be created to lock it if multi-threaded access is desired." +msgstr "" + +#: doc/classes/VBoxContainer.xml +msgid "Vertical box container." +msgstr "" + +#: doc/classes/VBoxContainer.xml +msgid "Vertical box container. See [BoxContainer]." +msgstr "" + +#: doc/classes/VBoxContainer.xml +msgid "The vertical space between the [VBoxContainer]'s elements." +msgstr "" + +#: doc/classes/Vector2.xml +msgid "Vector used for 2D math." +msgstr "" + +#: doc/classes/Vector2.xml +msgid "" +"2-element structure that can be used to represent positions in 2D space or " +"any other pair of numeric values.\n" +"[b]Note:[/b] In a boolean context, a Vector2 will evaluate to [code]false[/" +"code] if it's equal to [code]Vector2(0, 0)[/code]. Otherwise, a Vector2 will " +"always evaluate to [code]true[/code]." +msgstr "" + +#: doc/classes/Vector2.xml doc/classes/Vector3.xml +msgid "3Blue1Brown Essence of Linear Algebra" +msgstr "" + +#: doc/classes/Vector2.xml +msgid "" +"Constructs a new Vector2 from the given [code]x[/code] and [code]y[/code]." +msgstr "" + +#: doc/classes/Vector2.xml doc/classes/Vector3.xml +msgid "" +"Returns a new vector with all components in absolute values (i.e. positive)." +msgstr "" + +#: doc/classes/Vector2.xml +msgid "" +"Returns this vector's angle with respect to the positive X axis, or [code]" +"(1, 0)[/code] vector, in radians.\n" +"For example, [code]Vector2.RIGHT.angle()[/code] will return zero, " +"[code]Vector2.DOWN.angle()[/code] will return [code]PI / 2[/code] (a quarter " +"turn, or 90 degrees), and [code]Vector2(1, -1).angle()[/code] will return " +"[code]-PI / 4[/code] (a negative eighth turn, or -45 degrees).\n" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/" +"vector2_angle.png]Illustration of the returned angle.[/url]\n" +"Equivalent to the result of [method @GDScript.atan2] when called with the " +"vector's [member y] and [member x] as parameters: [code]atan2(y, x)[/code]." +msgstr "" + +#: doc/classes/Vector2.xml +msgid "" +"Returns the angle to the given vector, in radians.\n" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/" +"vector2_angle_to.png]Illustration of the returned angle.[/url]" +msgstr "" + +#: doc/classes/Vector2.xml +msgid "" +"Returns the angle between the line connecting the two points and the X axis, " +"in radians.\n" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/stable/img/" +"vector2_angle_to_point.png]Illustration of the returned angle.[/url]" +msgstr "" + +#: doc/classes/Vector2.xml +msgid "" +"Returns the aspect ratio of this vector, the ratio of [member x] to [member " +"y]." +msgstr "" + +#: doc/classes/Vector2.xml doc/classes/Vector3.xml +msgid "" +"Returns the vector \"bounced off\" from a plane defined by the given normal." +msgstr "" + +#: doc/classes/Vector2.xml doc/classes/Vector3.xml +msgid "" +"Returns a new vector with all components rounded up (towards positive " +"infinity)." +msgstr "" + +#: doc/classes/Vector2.xml +msgid "" +"Deprecated, please use [method limit_length] instead.\n" +"Returns the vector with a maximum length by limiting its length to " +"[code]length[/code]." +msgstr "" + +#: doc/classes/Vector2.xml +msgid "" +"Returns the 2D analog of the cross product for this vector and [code]with[/" +"code].\n" +"This is the signed area of the parallelogram formed by the two vectors. If " +"the second vector is clockwise from the first vector, then the cross product " +"is the positive area. If counter-clockwise, the cross product is the " +"negative area.\n" +"[b]Note:[/b] Cross product is not defined in 2D mathematically. This method " +"embeds the 2D vectors in the XY plane of 3D space and uses their cross " +"product's Z component as the analog." +msgstr "" + +#: doc/classes/Vector2.xml +msgid "" +"Cubically interpolates between this vector and [code]b[/code] using " +"[code]pre_a[/code] and [code]post_b[/code] as handles, and returns the " +"result at position [code]weight[/code]. [code]weight[/code] is on the range " +"of 0.0 to 1.0, representing the amount of interpolation." +msgstr "" + +#: doc/classes/Vector2.xml doc/classes/Vector3.xml +msgid "" +"Returns the normalized vector pointing from this vector to [code]b[/code]. " +"This is equivalent to using [code](b - a).normalized()[/code]." +msgstr "" + +#: doc/classes/Vector2.xml doc/classes/Vector3.xml +msgid "" +"Returns the squared distance between this vector and [code]b[/code].\n" +"This method runs faster than [method distance_to], so prefer it if you need " +"to compare vectors or need the squared distance for some formula." +msgstr "" + +#: doc/classes/Vector2.xml +msgid "Returns the distance between this vector and [code]to[/code]." +msgstr "" + +#: doc/classes/Vector2.xml +msgid "" +"Returns the dot product of this vector and [code]with[/code]. This can be " +"used to compare the angle between two vectors. For example, this can be used " +"to determine whether an enemy is facing the player.\n" +"The dot product will be [code]0[/code] for a straight angle (90 degrees), " +"greater than 0 for angles narrower than 90 degrees and lower than 0 for " +"angles wider than 90 degrees.\n" +"When using unit (normalized) vectors, the result will always be between " +"[code]-1.0[/code] (180 degree angle) when the vectors are facing opposite " +"directions, and [code]1.0[/code] (0 degree angle) when the vectors are " +"aligned.\n" +"[b]Note:[/b] [code]a.dot(b)[/code] is equivalent to [code]b.dot(a)[/code]." +msgstr "" + +#: doc/classes/Vector2.xml doc/classes/Vector3.xml +msgid "" +"Returns a new vector with all components rounded down (towards negative " +"infinity)." +msgstr "" + +#: doc/classes/Vector2.xml doc/classes/Vector3.xml +msgid "" +"Returns [code]true[/code] if this vector and [code]v[/code] are " +"approximately equal, by running [method @GDScript.is_equal_approx] on each " +"component." +msgstr "" + +#: doc/classes/Vector2.xml doc/classes/Vector3.xml +msgid "" +"Returns [code]true[/code] if the vector is normalized, [code]false[/code] " +"otherwise." +msgstr "" + +#: doc/classes/Vector2.xml doc/classes/Vector3.xml +msgid "Returns the length (magnitude) of this vector." +msgstr "" + +#: doc/classes/Vector2.xml doc/classes/Vector3.xml +msgid "" +"Returns the squared length (squared magnitude) of this vector.\n" +"This method runs faster than [method length], so prefer it if you need to " +"compare vectors or need the squared distance for some formula." +msgstr "" + +#: doc/classes/Vector2.xml doc/classes/Vector3.xml +msgid "" +"Returns the vector with a maximum length by limiting its length to " +"[code]length[/code]." +msgstr "" + +#: doc/classes/Vector2.xml +msgid "" +"Returns the result of the linear interpolation between this vector and " +"[code]to[/code] by amount [code]weight[/code]. [code]weight[/code] is on the " +"range of 0.0 to 1.0, representing the amount of interpolation." +msgstr "" + +#: doc/classes/Vector2.xml doc/classes/Vector3.xml +msgid "" +"Returns a new vector moved toward [code]to[/code] by the fixed [code]delta[/" +"code] amount. Will not go past the final value." +msgstr "" + +#: doc/classes/Vector2.xml doc/classes/Vector3.xml +msgid "" +"Returns the vector scaled to unit length. Equivalent to [code]v / v.length()" +"[/code]." +msgstr "" + +#: doc/classes/Vector2.xml doc/classes/Vector3.xml +msgid "" +"Returns a vector composed of the [method @GDScript.fposmod] of this vector's " +"components and [code]mod[/code]." +msgstr "" + +#: doc/classes/Vector2.xml doc/classes/Vector3.xml +msgid "" +"Returns a vector composed of the [method @GDScript.fposmod] of this vector's " +"components and [code]modv[/code]'s components." +msgstr "" + +#: doc/classes/Vector2.xml doc/classes/Vector3.xml +msgid "Returns this vector projected onto the vector [code]b[/code]." +msgstr "" + +#: doc/classes/Vector2.xml +msgid "" +"Returns the vector reflected (i.e. mirrored, or symmetric) over a line " +"defined by the given direction vector [code]n[/code]." +msgstr "" + +#: doc/classes/Vector2.xml +msgid "" +"Returns the vector rotated by [code]angle[/code] (in radians). See also " +"[method @GDScript.deg2rad]." +msgstr "" + +#: doc/classes/Vector2.xml doc/classes/Vector3.xml +msgid "" +"Returns a new vector with all components rounded to the nearest integer, " +"with halfway cases rounded away from zero." +msgstr "" + +#: doc/classes/Vector2.xml doc/classes/Vector3.xml +msgid "" +"Returns a new vector with each component set to one or negative one, " +"depending on the signs of the components. If a component is zero, it returns " +"positive one." +msgstr "" + +#: doc/classes/Vector2.xml doc/classes/Vector3.xml +msgid "" +"Returns the result of spherical linear interpolation between this vector and " +"[code]to[/code], by amount [code]weight[/code]. [code]weight[/code] is on " +"the range of 0.0 to 1.0, representing the amount of interpolation.\n" +"[b]Note:[/b] Both vectors must be normalized." +msgstr "" + +#: doc/classes/Vector2.xml doc/classes/Vector3.xml +msgid "Returns this vector slid along a plane defined by the given normal." +msgstr "" + +#: doc/classes/Vector2.xml doc/classes/Vector3.xml +msgid "" +"Returns this vector with each component snapped to the nearest multiple of " +"[code]step[/code]. This can also be used to round to an arbitrary number of " +"decimals." +msgstr "" + +#: doc/classes/Vector2.xml +msgid "" +"Returns a perpendicular vector rotated 90 degrees counter-clockwise compared " +"to the original, with the same length." +msgstr "" + +#: doc/classes/Vector2.xml doc/classes/Vector3.xml +msgid "" +"The vector's X component. Also accessible by using the index position [code]" +"[0][/code]." +msgstr "" + +#: doc/classes/Vector2.xml doc/classes/Vector3.xml +msgid "" +"The vector's Y component. Also accessible by using the index position [code]" +"[1][/code]." +msgstr "" + +#: doc/classes/Vector2.xml +msgid "Enumerated value for the X axis." +msgstr "" + +#: doc/classes/Vector2.xml +msgid "Enumerated value for the Y axis." +msgstr "" + +#: doc/classes/Vector2.xml doc/classes/Vector3.xml +msgid "Zero vector, a vector with all components set to [code]0[/code]." +msgstr "" + +#: doc/classes/Vector2.xml doc/classes/Vector3.xml +msgid "One vector, a vector with all components set to [code]1[/code]." +msgstr "" + +#: doc/classes/Vector2.xml doc/classes/Vector3.xml +msgid "" +"Infinity vector, a vector with all components set to [constant @GDScript." +"INF]." +msgstr "" + +#: doc/classes/Vector2.xml +msgid "Left unit vector. Represents the direction of left." +msgstr "" + +#: doc/classes/Vector2.xml +msgid "Right unit vector. Represents the direction of right." +msgstr "" + +#: doc/classes/Vector2.xml +msgid "Up unit vector. Y is down in 2D, so this vector points -Y." +msgstr "" + +#: doc/classes/Vector2.xml +msgid "Down unit vector. Y is down in 2D, so this vector points +Y." +msgstr "" + +#: doc/classes/Vector3.xml +msgid "Vector used for 3D math." +msgstr "" + +#: doc/classes/Vector3.xml +msgid "" +"3-element structure that can be used to represent positions in 3D space or " +"any other triplet of numeric values.\n" +"[b]Note:[/b] In a boolean context, a Vector3 will evaluate to [code]false[/" +"code] if it's equal to [code]Vector3(0, 0, 0)[/code]. Otherwise, a Vector3 " +"will always evaluate to [code]true[/code]." +msgstr "" + +#: doc/classes/Vector3.xml +msgid "Returns a Vector3 with the given components." +msgstr "" + +#: doc/classes/Vector3.xml +msgid "Returns the unsigned minimum angle to the given vector, in radians." +msgstr "" + +#: doc/classes/Vector3.xml +msgid "Returns the cross product of this vector and [code]b[/code]." +msgstr "" + +#: doc/classes/Vector3.xml +msgid "" +"Performs a cubic interpolation between this vector and [code]b[/code] using " +"[code]pre_a[/code] and [code]post_b[/code] as handles, and returns the " +"result at position [code]weight[/code]. [code]weight[/code] is on the range " +"of 0.0 to 1.0, representing the amount of interpolation." +msgstr "" + +#: doc/classes/Vector3.xml +msgid "Returns the distance between this vector and [code]b[/code]." +msgstr "" + +#: doc/classes/Vector3.xml +msgid "" +"Returns the dot product of this vector and [code]b[/code]. This can be used " +"to compare the angle between two vectors. For example, this can be used to " +"determine whether an enemy is facing the player.\n" +"The dot product will be [code]0[/code] for a straight angle (90 degrees), " +"greater than 0 for angles narrower than 90 degrees and lower than 0 for " +"angles wider than 90 degrees.\n" +"When using unit (normalized) vectors, the result will always be between " +"[code]-1.0[/code] (180 degree angle) when the vectors are facing opposite " +"directions, and [code]1.0[/code] (0 degree angle) when the vectors are " +"aligned.\n" +"[b]Note:[/b] [code]a.dot(b)[/code] is equivalent to [code]b.dot(a)[/code]." +msgstr "" + +#: doc/classes/Vector3.xml +msgid "" +"Returns the inverse of the vector. This is the same as [code]Vector3( 1.0 / " +"v.x, 1.0 / v.y, 1.0 / v.z )[/code]." +msgstr "" + +#: doc/classes/Vector3.xml +msgid "" +"Returns the result of the linear interpolation between this vector and " +"[code]to[/code] by amount [code]t[/code]. [code]weight[/code] is on the " +"range of 0.0 to 1.0, representing the amount of interpolation." +msgstr "" + +#: doc/classes/Vector3.xml +msgid "" +"Returns the axis of the vector's largest value. See [code]AXIS_*[/code] " +"constants. If all components are equal, this method returns [constant " +"AXIS_X]." +msgstr "" + +#: doc/classes/Vector3.xml +msgid "" +"Returns the axis of the vector's smallest value. See [code]AXIS_*[/code] " +"constants. If all components are equal, this method returns [constant " +"AXIS_Z]." +msgstr "" + +#: doc/classes/Vector3.xml +msgid "Returns the outer product with [code]b[/code]." +msgstr "" + +#: doc/classes/Vector3.xml +msgid "Returns this vector reflected from a plane defined by the given normal." +msgstr "" + +#: doc/classes/Vector3.xml +msgid "" +"Rotates this vector around a given axis by [code]angle[/code] (in radians). " +"The axis must be a normalized vector." +msgstr "" + +#: doc/classes/Vector3.xml +msgid "" +"Returns the signed angle to the given vector, in radians. The sign of the " +"angle is positive in a counter-clockwise direction and negative in a " +"clockwise direction when viewed from the side specified by the [code]axis[/" +"code]." +msgstr "" + +#: doc/classes/Vector3.xml +msgid "" +"Returns a diagonal matrix with the vector as main diagonal.\n" +"This is equivalent to a Basis with no rotation or shearing and this vector's " +"components set as the scale." +msgstr "" + +#: doc/classes/Vector3.xml +msgid "" +"The vector's Z component. Also accessible by using the index position [code]" +"[2][/code]." +msgstr "" + +#: doc/classes/Vector3.xml +msgid "" +"Enumerated value for the X axis. Returned by [method max_axis] and [method " +"min_axis]." +msgstr "" + +#: doc/classes/Vector3.xml +msgid "" +"Enumerated value for the Y axis. Returned by [method max_axis] and [method " +"min_axis]." +msgstr "" + +#: doc/classes/Vector3.xml +msgid "" +"Enumerated value for the Z axis. Returned by [method max_axis] and [method " +"min_axis]." +msgstr "" + +#: doc/classes/Vector3.xml +msgid "" +"Left unit vector. Represents the local direction of left, and the global " +"direction of west." +msgstr "" + +#: doc/classes/Vector3.xml +msgid "" +"Right unit vector. Represents the local direction of right, and the global " +"direction of east." +msgstr "" + +#: doc/classes/Vector3.xml +msgid "Up unit vector." +msgstr "" + +#: doc/classes/Vector3.xml +msgid "Down unit vector." +msgstr "" + +#: doc/classes/Vector3.xml +msgid "" +"Forward unit vector. Represents the local direction of forward, and the " +"global direction of north." +msgstr "" + +#: doc/classes/Vector3.xml +msgid "" +"Back unit vector. Represents the local direction of back, and the global " +"direction of south." +msgstr "" + +#: doc/classes/VehicleBody.xml +msgid "Physics body that simulates the behavior of a car." +msgstr "" + +#: doc/classes/VehicleBody.xml +msgid "" +"This node implements all the physics logic needed to simulate a car. It is " +"based on the raycast vehicle system commonly found in physics engines. You " +"will need to add a [CollisionShape] for the main body of your vehicle and " +"add [VehicleWheel] nodes for the wheels. You should also add a " +"[MeshInstance] to this node for the 3D model of your car but this model " +"should not include meshes for the wheels. You should control the vehicle by " +"using the [member brake], [member engine_force], and [member steering] " +"properties and not change the position or orientation of this node " +"directly.\n" +"[b]Note:[/b] The origin point of your VehicleBody will determine the center " +"of gravity of your vehicle so it is better to keep this low and move the " +"[CollisionShape] and [MeshInstance] upwards.\n" +"[b]Note:[/b] This class has known issues and isn't designed to provide " +"realistic 3D vehicle physics. If you want advanced vehicle physics, you will " +"probably have to write your own physics integration using another " +"[PhysicsBody] class." +msgstr "" + +#: doc/classes/VehicleBody.xml +msgid "" +"Slows down the vehicle by applying a braking force. The vehicle is only " +"slowed down if the wheels are in contact with a surface. The force you need " +"to apply to adequately slow down your vehicle depends on the [member " +"RigidBody.mass] of the vehicle. For a vehicle with a mass set to 1000, try a " +"value in the 25 - 30 range for hard braking." +msgstr "" + +#: doc/classes/VehicleBody.xml +msgid "" +"Accelerates the vehicle by applying an engine force. The vehicle is only " +"sped up if the wheels that have [member VehicleWheel.use_as_traction] set to " +"[code]true[/code] and are in contact with a surface. The [member RigidBody." +"mass] of the vehicle has an effect on the acceleration of the vehicle. For a " +"vehicle with a mass set to 1000, try a value in the 25 - 50 range for " +"acceleration.\n" +"[b]Note:[/b] The simulation does not take the effect of gears into account, " +"you will need to add logic for this if you wish to simulate gears.\n" +"A negative value will result in the vehicle reversing." +msgstr "" + +#: doc/classes/VehicleBody.xml +msgid "" +"The steering angle for the vehicle. Setting this to a non-zero value will " +"result in the vehicle turning when it's moving. Wheels that have [member " +"VehicleWheel.use_as_steering] set to [code]true[/code] will automatically be " +"rotated." +msgstr "" + +#: doc/classes/VehicleWheel.xml +msgid "Physics object that simulates the behavior of a wheel." +msgstr "" + +#: doc/classes/VehicleWheel.xml +msgid "" +"This node needs to be used as a child node of [VehicleBody] and simulates " +"the behavior of one of its wheels. This node also acts as a collider to " +"detect if the wheel is touching a surface.\n" +"[b]Note:[/b] This class has known issues and isn't designed to provide " +"realistic 3D vehicle physics. If you want advanced vehicle physics, you will " +"probably have to write your own physics integration using another " +"[PhysicsBody] class." +msgstr "" + +#: doc/classes/VehicleWheel.xml +msgid "" +"Returns the contacting body node if valid in the tree, as [Spatial]. At the " +"moment, [GridMap] is not supported so the node will be always of type " +"[PhysicsBody].\n" +"Returns [code]null[/code] if the wheel is not in contact with a surface, or " +"the contact body is not a [PhysicsBody]." +msgstr "" + +#: doc/classes/VehicleWheel.xml +msgid "Returns the rotational speed of the wheel in revolutions per minute." +msgstr "" + +#: doc/classes/VehicleWheel.xml +msgid "" +"Returns a value between 0.0 and 1.0 that indicates whether this wheel is " +"skidding. 0.0 is skidding (the wheel has lost grip, e.g. icy terrain), 1.0 " +"means not skidding (the wheel has full grip, e.g. dry asphalt road)." +msgstr "" + +#: doc/classes/VehicleWheel.xml +msgid "Returns [code]true[/code] if this wheel is in contact with a surface." +msgstr "" + +#: doc/classes/VehicleWheel.xml +msgid "" +"Slows down the wheel by applying a braking force. The wheel is only slowed " +"down if it is in contact with a surface. The force you need to apply to " +"adequately slow down your vehicle depends on the [member RigidBody.mass] of " +"the vehicle. For a vehicle with a mass set to 1000, try a value in the 25 - " +"30 range for hard braking." +msgstr "" + +#: doc/classes/VehicleWheel.xml +msgid "" +"The damping applied to the spring when the spring is being compressed. This " +"value should be between 0.0 (no damping) and 1.0. A value of 0.0 means the " +"car will keep bouncing as the spring keeps its energy. A good value for this " +"is around 0.3 for a normal car, 0.5 for a race car." +msgstr "" + +#: doc/classes/VehicleWheel.xml +msgid "" +"The damping applied to the spring when relaxing. This value should be " +"between 0.0 (no damping) and 1.0. This value should always be slightly " +"higher than the [member damping_compression] property. For a [member " +"damping_compression] value of 0.3, try a relaxation value of 0.5." +msgstr "" + +#: doc/classes/VehicleWheel.xml +msgid "" +"Accelerates the wheel by applying an engine force. The wheel is only sped up " +"if it is in contact with a surface. The [member RigidBody.mass] of the " +"vehicle has an effect on the acceleration of the vehicle. For a vehicle with " +"a mass set to 1000, try a value in the 25 - 50 range for acceleration.\n" +"[b]Note:[/b] The simulation does not take the effect of gears into account, " +"you will need to add logic for this if you wish to simulate gears.\n" +"A negative value will result in the wheel reversing." +msgstr "" + +#: doc/classes/VehicleWheel.xml +msgid "" +"The steering angle for the wheel. Setting this to a non-zero value will " +"result in the vehicle turning when it's moving." +msgstr "" + +#: doc/classes/VehicleWheel.xml +msgid "" +"The maximum force the spring can resist. This value should be higher than a " +"quarter of the [member RigidBody.mass] of the [VehicleBody] or the spring " +"will not carry the weight of the vehicle. Good results are often obtained by " +"a value that is about 3× to 4× this number." +msgstr "" + +#: doc/classes/VehicleWheel.xml +msgid "" +"This value defines the stiffness of the suspension. Use a value lower than " +"50 for an off-road car, a value between 50 and 100 for a race car and try " +"something around 200 for something like a Formula 1 car." +msgstr "" + +#: doc/classes/VehicleWheel.xml +msgid "" +"This is the distance the suspension can travel. As Godot units are " +"equivalent to meters, keep this setting relatively low. Try a value between " +"0.1 and 0.3 depending on the type of car." +msgstr "" + +#: doc/classes/VehicleWheel.xml +msgid "" +"If [code]true[/code], this wheel will be turned when the car steers. This " +"value is used in conjunction with [member VehicleBody.steering] and ignored " +"if you are using the per-wheel [member steering] value instead." +msgstr "" + +#: doc/classes/VehicleWheel.xml +msgid "" +"If [code]true[/code], this wheel transfers engine force to the ground to " +"propel the vehicle forward. This value is used in conjunction with [member " +"VehicleBody.engine_force] and ignored if you are using the per-wheel [member " +"engine_force] value instead." +msgstr "" + +#: doc/classes/VehicleWheel.xml +msgid "" +"This determines how much grip this wheel has. It is combined with the " +"friction setting of the surface the wheel is in contact with. 0.0 means no " +"grip, 1.0 is normal grip. For a drift car setup, try setting the grip of the " +"rear wheels slightly lower than the front wheels, or use a lower value to " +"simulate tire wear.\n" +"It's best to set this to 1.0 when starting out." +msgstr "" + +#: doc/classes/VehicleWheel.xml +msgid "The radius of the wheel in meters." +msgstr "" + +#: doc/classes/VehicleWheel.xml +msgid "" +"This is the distance in meters the wheel is lowered from its origin point. " +"Don't set this to 0.0 and move the wheel into position, instead move the " +"origin point of your wheel (the gizmo in Godot) to the position the wheel " +"will take when bottoming out, then use the rest length to move the wheel " +"down to the position it should be in when the car is in rest." +msgstr "" + +#: doc/classes/VehicleWheel.xml +msgid "" +"This value affects the roll of your vehicle. If set to 1.0 for all wheels, " +"your vehicle will be prone to rolling over, while a value of 0.0 will resist " +"body roll." +msgstr "" + +#: doc/classes/VFlowContainer.xml +msgid "Vertical flow container." +msgstr "" + +#: doc/classes/VFlowContainer.xml +msgid "Vertical version of [FlowContainer]." +msgstr "" + +#: doc/classes/VideoPlayer.xml +msgid "Control for playing video streams." +msgstr "" + +#: doc/classes/VideoPlayer.xml +msgid "" +"Control node for playing video streams using [VideoStream] resources.\n" +"Supported video formats are [url=https://www.webmproject.org/]WebM[/url] " +"([code].webm[/code], [VideoStreamWebm]), [url=https://www.theora.org/]Ogg " +"Theora[/url] ([code].ogv[/code], [VideoStreamTheora]), and any format " +"exposed via a GDNative plugin using [VideoStreamGDNative].\n" +"[b]Note:[/b] Due to a bug, VideoPlayer does not support localization " +"remapping yet.\n" +"[b]Warning:[/b] On HTML5, video playback [i]will[/i] perform poorly due to " +"missing architecture-specific assembly optimizations, especially for VP8/VP9." +msgstr "" + +#: doc/classes/VideoPlayer.xml +msgid "" +"Returns the video stream's name, or [code]\"<No Stream>\"[/code] if no video " +"stream is assigned." +msgstr "" + +#: doc/classes/VideoPlayer.xml +msgid "Returns the current frame as a [Texture]." +msgstr "" + +#: doc/classes/VideoPlayer.xml +msgid "" +"Returns [code]true[/code] if the video is playing.\n" +"[b]Note:[/b] The video is still considered playing if paused during playback." +msgstr "" + +#: doc/classes/VideoPlayer.xml +msgid "" +"Starts the video playback from the beginning. If the video is paused, this " +"will not unpause the video." +msgstr "" + +#: doc/classes/VideoPlayer.xml +msgid "" +"Stops the video playback and sets the stream position to 0.\n" +"[b]Note:[/b] Although the stream position will be set to 0, the first frame " +"of the video stream won't become the current frame." +msgstr "" + +#: doc/classes/VideoPlayer.xml +msgid "The embedded audio track to play." +msgstr "" + +#: doc/classes/VideoPlayer.xml +msgid "If [code]true[/code], playback starts when the scene loads." +msgstr "" + +#: doc/classes/VideoPlayer.xml +msgid "Amount of time in milliseconds to store in buffer while playing." +msgstr "" + +#: doc/classes/VideoPlayer.xml +msgid "Audio bus to use for sound playback." +msgstr "" + +#: doc/classes/VideoPlayer.xml +msgid "" +"If [code]true[/code], the video scales to the control size. Otherwise, the " +"control minimum size will be automatically adjusted to match the video " +"stream's dimensions." +msgstr "" + +#: doc/classes/VideoPlayer.xml +msgid "If [code]true[/code], the video is paused." +msgstr "" + +#: doc/classes/VideoPlayer.xml +msgid "The assigned video stream. See description for supported formats." +msgstr "" + +#: doc/classes/VideoPlayer.xml +msgid "" +"The current position of the stream, in seconds.\n" +"[b]Note:[/b] Changing this value won't have any effect as seeking is not " +"implemented yet, except in video formats implemented by a GDNative add-on." +msgstr "" + +#: doc/classes/VideoPlayer.xml +msgid "Audio volume as a linear value." +msgstr "" + +#: doc/classes/VideoPlayer.xml +msgid "Audio volume in dB." +msgstr "" + +#: doc/classes/VideoPlayer.xml +msgid "Emitted when playback is finished." +msgstr "" + +#: doc/classes/VideoStream.xml +msgid "Base resource for video streams." +msgstr "" + +#: doc/classes/VideoStream.xml +msgid "" +"Base resource type for all video streams. Classes that derive from " +"[VideoStream] can all be used as resource types to play back videos in " +"[VideoPlayer]." +msgstr "" + +#: modules/gdnative/doc_classes/VideoStreamGDNative.xml +msgid "[VideoStream] resource for video formats implemented via GDNative." +msgstr "" + +#: modules/gdnative/doc_classes/VideoStreamGDNative.xml +msgid "" +"[VideoStream] resource for video formats implemented via GDNative.\n" +"It can be used via [url=https://github.com/KidRigger/godot-" +"videodecoder]godot-videodecoder[/url] which uses the [url=https://ffmpeg." +"org]FFmpeg[/url] library." +msgstr "" + +#: modules/gdnative/doc_classes/VideoStreamGDNative.xml +msgid "Returns the video file handled by this [VideoStreamGDNative]." +msgstr "" + +#: modules/gdnative/doc_classes/VideoStreamGDNative.xml +msgid "" +"Sets the video file that this [VideoStreamGDNative] resource handles. The " +"supported extensions depend on the GDNative plugins used to expose video " +"formats." +msgstr "" + +#: modules/theora/doc_classes/VideoStreamTheora.xml +msgid "[VideoStream] resource for Ogg Theora videos." +msgstr "" + +#: modules/theora/doc_classes/VideoStreamTheora.xml +msgid "" +"[VideoStream] resource handling the [url=https://www.theora.org/]Ogg Theora[/" +"url] video format with [code].ogv[/code] extension. The Theora codec is less " +"efficient than [VideoStreamWebm]'s VP8 and VP9, but it requires less CPU " +"resources to decode. The Theora codec is decoded on the CPU.\n" +"[b]Note:[/b] While Ogg Theora videos can also have an [code].ogg[/code] " +"extension, you will have to rename the extension to [code].ogv[/code] to use " +"those videos within Godot." +msgstr "" + +#: modules/theora/doc_classes/VideoStreamTheora.xml +msgid "Returns the Ogg Theora video file handled by this [VideoStreamTheora]." +msgstr "" + +#: modules/theora/doc_classes/VideoStreamTheora.xml +msgid "" +"Sets the Ogg Theora video file that this [VideoStreamTheora] resource " +"handles. The [code]file[/code] name should have the [code].ogv[/code] " +"extension." +msgstr "" + +#: modules/webm/doc_classes/VideoStreamWebm.xml +msgid "[VideoStream] resource for WebM videos." +msgstr "" + +#: modules/webm/doc_classes/VideoStreamWebm.xml +msgid "" +"[VideoStream] resource handling the [url=https://www.webmproject.org/]WebM[/" +"url] video format with [code].webm[/code] extension. Both the VP8 and VP9 " +"codecs are supported. The VP8 and VP9 codecs are more efficient than " +"[VideoStreamTheora], but they require more CPU resources to decode " +"(especially VP9). Both the VP8 and VP9 codecs are decoded on the CPU.\n" +"[b]Note:[/b] Alpha channel (also known as transparency) is not supported. " +"The video will always appear to have a black background, even if it " +"originally contains an alpha channel.\n" +"[b]Note:[/b] There are known bugs and performance issues with WebM video " +"playback in Godot. If you run into problems, try using the Ogg Theora format " +"instead: [VideoStreamTheora]" +msgstr "" + +#: modules/webm/doc_classes/VideoStreamWebm.xml +msgid "Returns the WebM video file handled by this [VideoStreamWebm]." +msgstr "" + +#: modules/webm/doc_classes/VideoStreamWebm.xml +msgid "" +"Sets the WebM video file that this [VideoStreamWebm] resource handles. The " +"[code]file[/code] name should have the [code].webm[/code] extension." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Creates a sub-view into the screen." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"A Viewport creates a different view into the screen, or a sub-view inside " +"another viewport. Children 2D Nodes will display on it, and children Camera " +"3D nodes will render on it too.\n" +"Optionally, a viewport can have its own 2D or 3D world, so they don't share " +"what they draw with other viewports.\n" +"If a viewport is a child of a [ViewportContainer], it will automatically " +"take up its size, otherwise it must be set manually.\n" +"Viewports can also choose to be audio listeners, so they generate positional " +"audio depending on a 2D or 3D camera child of it.\n" +"Also, viewports can be assigned to different screens in case the devices " +"have multiple screens.\n" +"Finally, viewports can also behave as render targets, in which case they " +"will not be visible unless the associated texture is used to draw.\n" +"[b]Note:[/b] By default, a newly created Viewport in Godot 3.x will appear " +"to be upside down. Enabling [member render_target_v_flip] will display the " +"Viewport with the correct orientation." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Viewports tutorial index" +msgstr "" + +#: doc/classes/Viewport.xml doc/classes/ViewportTexture.xml +msgid "3D in 2D Demo" +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Screen Capture Demo" +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Dynamic Split Screen Demo" +msgstr "" + +#: doc/classes/Viewport.xml doc/classes/ViewportTexture.xml +msgid "3D Viewport Scaling Demo" +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"Returns the first valid [World] for this viewport, searching the [member " +"world] property of itself and any Viewport ancestor." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"Returns the first valid [World2D] for this viewport, searching the [member " +"world_2d] property of itself and any Viewport ancestor." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Returns the active 3D camera." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Returns the total transform of the viewport." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Returns the topmost modal in the stack." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"Returns the mouse's position in this [Viewport] using the coordinate system " +"of this [Viewport]." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Returns information about the viewport from the rendering pipeline." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Returns the [enum ShadowAtlasQuadrantSubdiv] of the specified quadrant." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Returns the size override set with [method set_size_override]." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"Returns the viewport's texture.\n" +"[b]Note:[/b] Due to the way OpenGL works, the resulting [ViewportTexture] is " +"flipped vertically. You can use [method Image.flip_y] on the result of " +"[method Texture.get_data] to flip it back, for example:\n" +"[codeblock]\n" +"var img = get_viewport().get_texture().get_data()\n" +"img.flip_y()\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Returns the viewport's RID from the [VisualServer]." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Returns the visible rectangle in global screen coordinates." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"Returns the drag data from the GUI, that was previously returned by [method " +"Control.get_drag_data]." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Returns [code]true[/code] if there are visible modals on-screen." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Returns [code]true[/code] if the drag operation is successful." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"Returns [code]true[/code] if the viewport is currently performing a drag " +"operation.\n" +"Alternative to [constant Node.NOTIFICATION_DRAG_BEGIN] and [constant Node." +"NOTIFICATION_DRAG_END] when you prefer polling the value." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"Returns [code]true[/code] if the size override is enabled. See [method " +"set_size_override]." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"Attaches this [Viewport] to the root [Viewport] with the specified " +"rectangle. This bypasses the need for another node to display this " +"[Viewport] but makes you responsible for updating the position of this " +"[Viewport] manually." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Stops the input from propagating further down the [SceneTree]." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"Sets the number of subdivisions to use in the specified quadrant. A higher " +"number of subdivisions allows you to have more shadows in the scene at once, " +"but reduces the quality of the shadows. A good practice is to have quadrants " +"with a varying number of subdivisions and to have as few subdivisions as " +"possible." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"Sets the size override of the viewport. If the [code]enable[/code] parameter " +"is [code]true[/code] the override is used, otherwise it uses the default " +"size. If the size parameter is [code](-1, -1)[/code], it won't update the " +"size." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Forces update of the 2D and 3D worlds." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"Moves the mouse pointer to the specified position in this [Viewport] using " +"the coordinate system of this [Viewport]." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "If [code]true[/code], the viewport will be used in AR/VR process." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "If [code]true[/code], the viewport will process 2D audio streams." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "If [code]true[/code], the viewport will process 3D audio streams." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"The canvas transform of the viewport, useful for changing the on-screen " +"positions of all child [CanvasItem]s. This is relative to the global canvas " +"transform of the viewport." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"If [code]true[/code], uses a fast post-processing filter to make banding " +"significantly less visible. In some cases, debanding may introduce a " +"slightly noticeable dithering pattern. It's recommended to enable debanding " +"only when actually needed since the dithering pattern will make lossless-" +"compressed screenshots larger.\n" +"[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " +"[code]true[/code] for debanding to be effective." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "The overlay mode for test rendered geometry in debug purposes." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"If [code]true[/code], the viewport will disable 3D rendering. For actual " +"disabling use [code]usage[/code]." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"Enables fast approximate antialiasing. FXAA is a popular screen-space " +"antialiasing method, which is fast but will make the image look blurry, " +"especially at lower resolutions. It can still work relatively well at large " +"resolutions such as 1440p and 4K. Some of the lost sharpness can be " +"recovered by enabling contrast-adaptive sharpening (see [member " +"sharpen_intensity])." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"The global canvas transform of the viewport. The canvas transform is " +"relative to this." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "If [code]true[/code], the viewport will not receive input events." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"If [code]true[/code], the GUI controls on the viewport will lay pixel " +"perfectly." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"If [code]true[/code], the viewport rendering will receive benefits from High " +"Dynamic Range algorithm. High Dynamic Range allows the viewport to receive " +"values that are outside the 0-1 range. In Godot, HDR uses half floating-" +"point precision (16-bit) by default. To use full floating-point precision " +"(32-bit), enable [member use_32_bpc_depth].\n" +"[b]Note:[/b] Requires [member usage] to be set to [constant USAGE_3D] or " +"[constant USAGE_3D_NO_EFFECTS], since HDR is not supported for 2D.\n" +"[b]Note:[/b] Only available on the GLES3 backend." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"If [code]true[/code], the result after 3D rendering will not have a linear " +"to sRGB color conversion applied. This is important when the viewport is " +"used as a render target where the result is used as a texture on a 3D object " +"rendered in another viewport. It is also important if the viewport is used " +"to create data that is not color based (noise, heightmaps, pickmaps, etc.). " +"Do not enable this when the viewport is used as a texture on a 2D object or " +"if the viewport is your final output. For the GLES2 driver this will convert " +"the sRGB output to linear, this should only be used for VR plugins that " +"require input in linear color space!" +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"The multisample anti-aliasing mode. A higher number results in smoother " +"edges at the cost of significantly worse performance. A value of 4 is best " +"unless targeting very high-end systems." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"If [code]true[/code], the viewport will use a unique copy of the [World] " +"defined in [member world]." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"If [code]true[/code], the objects rendered by viewport become subjects of " +"mouse picking process." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"If [code]true[/code], renders the Viewport directly to the screen instead of " +"to the root viewport. Only available in GLES2. This is a low-level " +"optimization and should not be used in most cases. If used, reading from the " +"Viewport or from [code]SCREEN_TEXTURE[/code] becomes unavailable. For more " +"information see [method VisualServer.viewport_set_render_direct_to_screen]." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"The clear mode when viewport used as a render target.\n" +"[b]Note:[/b] This property is intended for 2D usage." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "The update mode when viewport used as a render target." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"If [code]true[/code], the result of rendering will be flipped vertically. " +"Since Viewports in Godot 3.x render upside-down, it's recommended to set " +"this to [code]true[/code] in most situations." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "The subdivision amount of the first quadrant on the shadow atlas." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "The subdivision amount of the second quadrant on the shadow atlas." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "The subdivision amount of the third quadrant on the shadow atlas." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "The subdivision amount of the fourth quadrant on the shadow atlas." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"The shadow atlas' resolution (used for omni and spot lights). The value will " +"be rounded up to the nearest power of 2.\n" +"[b]Note:[/b] If this is set to [code]0[/code], both point [i]and[/i] " +"directional shadows won't be visible. Since user-created viewports default " +"to a value of [code]0[/code], this value must be set above [code]0[/code] " +"manually (typically at least [code]256[/code])." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"If set to a value greater than [code]0.0[/code], contrast-adaptive " +"sharpening will be applied to the 3D viewport. This has a low performance " +"cost and can be used to recover some of the sharpness lost from using FXAA. " +"Values around [code]0.5[/code] generally give the best results. See also " +"[member fxaa]." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"The width and height of viewport. Must be set to a value greater than or " +"equal to 2 pixels on both dimensions. Otherwise, nothing will be displayed." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "If [code]true[/code], the size override affects stretch as well." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"If [code]true[/code], the viewport should render its background as " +"transparent." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"The rendering mode of viewport.\n" +"[b]Note:[/b] If set to [constant USAGE_2D] or [constant " +"USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " +"HDR is not supported for 2D." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"If [code]true[/code], allocates the viewport's framebuffer with full " +"floating-point precision (32-bit) instead of half floating-point precision " +"(16-bit). Only effective when [member hdr] is also enabled.\n" +"[b]Note:[/b] Enabling this setting does not improve rendering quality. Using " +"full floating-point precision is slower, and is generally only needed for " +"advanced shaders that require a high level of precision. To reduce banding, " +"enable [member debanding] instead.\n" +"[b]Note:[/b] Only available on the GLES3 backend." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "The custom [World] which can be used as 3D environment source." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "The custom [World2D] which can be used as 2D environment source." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Emitted when a Control node grabs keyboard focus." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"Emitted when the size of the viewport is changed, whether by [method " +"set_size_override], resize of window, or some other means." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Do not update the render target." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"Update the render target once, then switch to [constant UPDATE_DISABLED]." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"Update the render target only when it is visible. This is the default value." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Always update the render target." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "This quadrant will not be used." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "This quadrant will only be used by one shadow map." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "This quadrant will be split in 4 and used by up to 4 shadow maps." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "This quadrant will be split 16 ways and used by up to 16 shadow maps." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "This quadrant will be split 64 ways and used by up to 64 shadow maps." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"This quadrant will be split 256 ways and used by up to 256 shadow maps. " +"Unless the [member shadow_atlas_size] is very high, the shadows in this " +"quadrant will be very low resolution." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"This quadrant will be split 1024 ways and used by up to 1024 shadow maps. " +"Unless the [member shadow_atlas_size] is very high, the shadows in this " +"quadrant will be very low resolution." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Represents the size of the [enum ShadowAtlasQuadrantSubdiv] enum." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Amount of objects in frame." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Amount of vertices in frame." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Amount of material changes in frame." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Amount of shader changes in frame." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Amount of surface changes in frame." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Amount of draw calls in frame." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Amount of items or joined items in frame." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Represents the size of the [enum RenderInfo] enum." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Objects are displayed normally." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Objects are displayed without light information." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"Objected are displayed semi-transparent with additive blending so you can " +"see where they intersect." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Objects are displayed in wireframe style." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Multisample anti-aliasing mode disabled. This is the default value." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Use 2x Multisample Antialiasing." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Use 4x Multisample Antialiasing." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"Use 8x Multisample Antialiasing. Likely unsupported on low-end and older " +"hardware." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"Use 16x Multisample Antialiasing. Likely unsupported on medium and low-end " +"hardware." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"Allocates all buffers needed for drawing 2D scenes. This takes less VRAM " +"than the 3D usage modes. Note that 3D rendering effects such as glow and HDR " +"are not available when using this mode." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"Allocates buffers needed for 2D scenes without allocating a buffer for " +"screen copy. Accordingly, you cannot read from the screen. Of the [enum " +"Usage] types, this requires the least VRAM. Note that 3D rendering effects " +"such as glow and HDR are not available when using this mode." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"Allocates full buffers for drawing 3D scenes and all 3D effects including " +"buffers needed for 2D scenes and effects." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"Allocates buffers needed for drawing 3D scenes. But does not allocate " +"buffers needed for reading from the screen and post-processing effects. " +"Saves some VRAM." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Always clear the render target before drawing." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "Never clear the render target." +msgstr "" + +#: doc/classes/Viewport.xml +msgid "" +"Clear the render target next frame, then switch to [constant " +"CLEAR_MODE_NEVER]." +msgstr "" + +#: doc/classes/ViewportContainer.xml +msgid "Control for holding [Viewport]s." +msgstr "" + +#: doc/classes/ViewportContainer.xml +msgid "" +"A [Container] node that holds a [Viewport], automatically setting its size.\n" +"[b]Note:[/b] Changing a ViewportContainer's [member Control.rect_scale] will " +"cause its contents to appear distorted. To change its visual size without " +"causing distortion, adjust the node's margins instead (if it's not already " +"in a container)." +msgstr "" + +#: doc/classes/ViewportContainer.xml +msgid "" +"If [code]true[/code], the viewport will be scaled to the control's size." +msgstr "" + +#: doc/classes/ViewportContainer.xml +msgid "" +"Divides the viewport's effective resolution by this value while preserving " +"its scale. This can be used to speed up rendering.\n" +"For example, a 1280×720 viewport with [member stretch_shrink] set to " +"[code]2[/code] will be rendered at 640×360 while occupying the same size in " +"the container.\n" +"[b]Note:[/b] [member stretch] must be [code]true[/code] for this property to " +"work." +msgstr "" + +#: doc/classes/ViewportTexture.xml +msgid "Texture which displays the content of a [Viewport]." +msgstr "" + +#: doc/classes/ViewportTexture.xml +msgid "" +"Displays the content of a [Viewport] node as a dynamic [Texture]. This can " +"be used to mix controls, 2D, and 3D elements in the same scene.\n" +"To create a ViewportTexture in code, use the [method Viewport.get_texture] " +"method on the target viewport." +msgstr "" + +#: doc/classes/ViewportTexture.xml +msgid "" +"The path to the [Viewport] node to display. This is relative to the scene " +"root, not to the node which uses the texture." +msgstr "" + +#: doc/classes/VisibilityEnabler.xml doc/classes/VisibilityEnabler2D.xml +msgid "Enables certain nodes only when approximately visible." +msgstr "" + +#: doc/classes/VisibilityEnabler.xml +msgid "" +"The VisibilityEnabler will disable [RigidBody] and [AnimationPlayer] nodes " +"when they are not visible. It will only affect other nodes within the same " +"scene as the VisibilityEnabler itself.\n" +"If you just want to receive notifications, use [VisibilityNotifier] " +"instead.\n" +"[b]Note:[/b] VisibilityEnabler uses an approximate heuristic for performance " +"reasons. It doesn't take walls and other occlusion into account (unless you " +"are using [Portal]s). The heuristic is an implementation detail and may " +"change in future versions. If you need precise visibility checking, use " +"another method such as adding an [Area] node as a child of a [Camera] node " +"and/or [method Vector3.dot].\n" +"[b]Note:[/b] VisibilityEnabler will not affect nodes added after scene " +"initialization." +msgstr "" + +#: doc/classes/VisibilityEnabler.xml doc/classes/VisibilityEnabler2D.xml +msgid "" +"Returns whether the enabler identified by given [enum Enabler] constant is " +"active." +msgstr "" + +#: doc/classes/VisibilityEnabler.xml doc/classes/VisibilityEnabler2D.xml +msgid "" +"Sets active state of the enabler identified by given [enum Enabler] constant." +msgstr "" + +#: doc/classes/VisibilityEnabler.xml +msgid "If [code]true[/code], [RigidBody] nodes will be paused." +msgstr "" + +#: doc/classes/VisibilityEnabler.xml doc/classes/VisibilityEnabler2D.xml +msgid "If [code]true[/code], [AnimationPlayer] nodes will be paused." +msgstr "" + +#: doc/classes/VisibilityEnabler.xml doc/classes/VisibilityEnabler2D.xml +msgid "This enabler will pause [AnimationPlayer] nodes." +msgstr "" + +#: doc/classes/VisibilityEnabler.xml +msgid "This enabler will freeze [RigidBody] nodes." +msgstr "" + +#: doc/classes/VisibilityEnabler.xml doc/classes/VisibilityEnabler2D.xml +msgid "Represents the size of the [enum Enabler] enum." +msgstr "" + +#: doc/classes/VisibilityEnabler2D.xml +msgid "" +"The VisibilityEnabler2D will disable [RigidBody2D], [AnimationPlayer], and " +"other nodes when they are not visible. It will only affect nodes with the " +"same root node as the VisibilityEnabler2D, and the root node itself.\n" +"If you just want to receive notifications, use [VisibilityNotifier2D] " +"instead.\n" +"[b]Note:[/b] For performance reasons, VisibilityEnabler2D uses an " +"approximate heuristic with precision determined by [member ProjectSettings." +"world/2d/cell_size]. If you need precise visibility checking, use another " +"method such as adding an [Area2D] node as a child of a [Camera2D] node.\n" +"[b]Note:[/b] VisibilityEnabler2D will not affect nodes added after scene " +"initialization." +msgstr "" + +#: doc/classes/VisibilityEnabler2D.xml +msgid "If [code]true[/code], [RigidBody2D] nodes will be paused." +msgstr "" + +#: doc/classes/VisibilityEnabler2D.xml +msgid "If [code]true[/code], [AnimatedSprite] nodes will be paused." +msgstr "" + +#: doc/classes/VisibilityEnabler2D.xml +msgid "If [code]true[/code], [Particles2D] nodes will be paused." +msgstr "" + +#: doc/classes/VisibilityEnabler2D.xml +msgid "" +"If [code]true[/code], the parent's [method Node._physics_process] will be " +"stopped." +msgstr "" + +#: doc/classes/VisibilityEnabler2D.xml +msgid "" +"If [code]true[/code], the parent's [method Node._process] will be stopped." +msgstr "" + +#: doc/classes/VisibilityEnabler2D.xml +msgid "This enabler will freeze [RigidBody2D] nodes." +msgstr "" + +#: doc/classes/VisibilityEnabler2D.xml +msgid "This enabler will stop [Particles2D] nodes." +msgstr "" + +#: doc/classes/VisibilityEnabler2D.xml +msgid "This enabler will stop the parent's [method Node._process] function." +msgstr "" + +#: doc/classes/VisibilityEnabler2D.xml +msgid "" +"This enabler will stop the parent's [method Node._physics_process] function." +msgstr "" + +#: doc/classes/VisibilityEnabler2D.xml +msgid "This enabler will stop [AnimatedSprite] nodes animations." +msgstr "" + +#: doc/classes/VisibilityNotifier.xml doc/classes/VisibilityNotifier2D.xml +msgid "Detects approximately when the node is visible on screen." +msgstr "" + +#: doc/classes/VisibilityNotifier.xml +msgid "" +"The VisibilityNotifier detects when it is visible on the screen. It also " +"notifies when its bounding rectangle enters or exits the screen or a " +"[Camera]'s view.\n" +"If you want nodes to be disabled automatically when they exit the screen, " +"use [VisibilityEnabler] instead.\n" +"[b]Note:[/b] VisibilityNotifier uses an approximate heuristic for " +"performance reasons. It doesn't take walls and other occlusion into account " +"(unless you are using [Portal]s). The heuristic is an implementation detail " +"and may change in future versions. If you need precise visibility checking, " +"use another method such as adding an [Area] node as a child of a [Camera] " +"node and/or [method Vector3.dot]." +msgstr "" + +#: doc/classes/VisibilityNotifier.xml +msgid "" +"If [code]true[/code], the bounding box is on the screen.\n" +"[b]Note:[/b] It takes one frame for the node's visibility to be assessed " +"once added to the scene tree, so this method will return [code]false[/code] " +"right after it is instantiated, even if it will be on screen in the draw " +"pass." +msgstr "" + +#: doc/classes/VisibilityNotifier.xml +msgid "The VisibilityNotifier's bounding box." +msgstr "" + +#: doc/classes/VisibilityNotifier.xml +msgid "" +"In addition to checking whether a node is on screen or within a [Camera]'s " +"view, VisibilityNotifier can also optionally check whether a node is within " +"a specified maximum distance when using a [Camera] with perspective " +"projection. This is useful for throttling the performance requirements of " +"nodes that are far away.\n" +"[b]Note:[/b] This feature will be disabled if set to 0.0." +msgstr "" + +#: doc/classes/VisibilityNotifier.xml +msgid "Emitted when the VisibilityNotifier enters a [Camera]'s view." +msgstr "" + +#: doc/classes/VisibilityNotifier.xml +msgid "Emitted when the VisibilityNotifier exits a [Camera]'s view." +msgstr "" + +#: doc/classes/VisibilityNotifier.xml +msgid "Emitted when the VisibilityNotifier enters the screen." +msgstr "" + +#: doc/classes/VisibilityNotifier.xml +msgid "Emitted when the VisibilityNotifier exits the screen." +msgstr "" + +#: doc/classes/VisibilityNotifier2D.xml +msgid "" +"The VisibilityNotifier2D detects when it is visible on the screen. It also " +"notifies when its bounding rectangle enters or exits the screen or a " +"viewport.\n" +"If you want nodes to be disabled automatically when they exit the screen, " +"use [VisibilityEnabler2D] instead.\n" +"[b]Note:[/b] For performance reasons, VisibilityNotifier2D uses an " +"approximate heuristic with precision determined by [member ProjectSettings." +"world/2d/cell_size]. If you need precise visibility checking, use another " +"method such as adding an [Area2D] node as a child of a [Camera2D] node." +msgstr "" + +#: doc/classes/VisibilityNotifier2D.xml +msgid "" +"If [code]true[/code], the bounding rectangle is on the screen.\n" +"[b]Note:[/b] It takes one frame for the node's visibility to be assessed " +"once added to the scene tree, so this method will return [code]false[/code] " +"right after it is instantiated, even if it will be on screen in the draw " +"pass." +msgstr "" + +#: doc/classes/VisibilityNotifier2D.xml +msgid "The VisibilityNotifier2D's bounding rectangle." +msgstr "" + +#: doc/classes/VisibilityNotifier2D.xml +msgid "Emitted when the VisibilityNotifier2D enters the screen." +msgstr "" + +#: doc/classes/VisibilityNotifier2D.xml +msgid "Emitted when the VisibilityNotifier2D exits the screen." +msgstr "" + +#: doc/classes/VisibilityNotifier2D.xml +msgid "Emitted when the VisibilityNotifier2D enters a [Viewport]'s view." +msgstr "" + +#: doc/classes/VisibilityNotifier2D.xml +msgid "Emitted when the VisibilityNotifier2D exits a [Viewport]'s view." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "Parent of all visual 3D nodes." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"The [VisualInstance] is used to connect a resource to a visual " +"representation. All visual 3D nodes inherit from the [VisualInstance]. In " +"general, you should not access the [VisualInstance] properties directly as " +"they are accessed and managed by the nodes that inherit from " +"[VisualInstance]. [VisualInstance] is the node representation of the " +"[VisualServer] instance." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"Returns the [AABB] (also known as the bounding box) for this " +"[VisualInstance]. See also [method get_transformed_aabb]." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"Returns the RID of the resource associated with this [VisualInstance]. For " +"example, if the Node is a [MeshInstance], this will return the RID of the " +"associated [Mesh]." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"Returns the RID of this instance. This RID is the same as the RID returned " +"by [method VisualServer.instance_create]. This RID is needed if you want to " +"call [VisualServer] functions directly on this [VisualInstance]." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"Returns [code]true[/code] when the specified layer is enabled in [member " +"layers] and [code]false[/code] otherwise." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"Returns the transformed [AABB] (also known as the bounding box) for this " +"[VisualInstance].\n" +"Transformed in this case means the [AABB] plus the position, rotation, and " +"scale of the [Spatial]'s [Transform]. See also [method get_aabb]." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"Sets the resource that is instantiated by this [VisualInstance], which " +"changes how the engine handles the [VisualInstance] under the hood. " +"Equivalent to [method VisualServer.instance_set_base]." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "Enables a particular layer in [member layers]." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"The render layer(s) this [VisualInstance] is drawn on.\n" +"This object will only be visible for [Camera]s whose cull mask includes the " +"render object this [VisualInstance] is set to." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "A script implemented in the Visual Script programming environment." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "" +"A script implemented in the Visual Script programming environment. The " +"script extends the functionality of all objects that instance it.\n" +"[method Object.set_script] extends an existing object, if that object's " +"class matches one of the script's base classes.\n" +"You are most likely to use this class via the Visual Script editor or when " +"writing plugins for it." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Add a custom signal with the specified name to the VisualScript." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Add a function with the specified name to the VisualScript." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Add a node to a function of the VisualScript." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "" +"Add a variable to the VisualScript, optionally giving it a default value or " +"marking it as exported." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "" +"Add an argument to a custom signal added with [method add_custom_signal]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Get the count of a custom signal's arguments." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Get the name of a custom signal's argument." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Get the type of a custom signal's argument." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Remove a specific custom signal's argument." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Rename a custom signal's argument." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Change the type of a custom signal's argument." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Swap two of the arguments of a custom signal." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "" +"Connect two data ports. The value of [code]from_node[/code]'s " +"[code]from_port[/code] would be fed into [code]to_node[/code]'s " +"[code]to_port[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "" +"Disconnect two data ports previously connected with [method data_connect]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Returns the id of a function's entry point node." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Returns the position of the center of the screen for a given function." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Returns a node given its id and its function." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Returns a node's position in pixels." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Returns the default (initial) value of a variable." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Returns whether a variable is exported." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "" +"Returns the information for a given variable as a dictionary. The " +"information includes its name, type, hint and usage." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Returns whether a signal exists with the specified name." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Returns whether the specified data ports are connected." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Returns whether a function exists with the specified name." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Returns whether a node exists with the given id." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Returns whether the specified sequence ports are connected." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Returns whether a variable exists with the specified name." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Remove a custom signal with the given name." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Remove a specific function and its nodes from the script." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Remove a specific node." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Remove a variable with the given name." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Change the name of a custom signal." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Change the name of a function." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Change the name of a variable." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "" +"Connect two sequence ports. The execution will flow from of [code]from_node[/" +"code]'s [code]from_output[/code] into [code]to_node[/code].\n" +"Unlike [method data_connect], there isn't a [code]to_port[/code], since the " +"target node can have only one sequence port." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "" +"Disconnect two sequence ports previously connected with [method " +"sequence_connect]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Position the center of the screen for a function." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Set the base type of the script." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Position a node on the screen." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Change the default (initial) value of a variable." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Change whether a variable is exported." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "" +"Set a variable's info, using the same format as [method get_variable_info]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml +msgid "Emitted when the ports of a node are changed." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBasicTypeConstant.xml +msgid "A Visual Script node representing a constant from the base types." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBasicTypeConstant.xml +msgid "" +"A Visual Script node representing a constant from base types, such as " +"[constant Vector3.AXIS_X]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBasicTypeConstant.xml +msgid "The type to get the constant from." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBasicTypeConstant.xml +msgid "The name of the constant to return." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "A Visual Script node used to call built-in functions." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "" +"A built-in function used inside a [VisualScript]. It is usually a math " +"function or an utility function.\n" +"See also [@GDScript], for the same functions in the GDScript language." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "The function to be executed." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Return the sine of the input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Return the cosine of the input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Return the tangent of the input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Return the hyperbolic sine of the input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Return the hyperbolic cosine of the input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Return the hyperbolic tangent of the input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Return the arc sine of the input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Return the arc cosine of the input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Return the arc tangent of the input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "" +"Return the arc tangent of the input, using the signs of both parameters to " +"determine the exact angle." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Return the square root of the input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "" +"Return the remainder of one input divided by the other, using floating-point " +"numbers." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "" +"Return the positive remainder of one input divided by the other, using " +"floating-point numbers." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Return the input rounded down." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Return the input rounded up." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Return the input rounded to the nearest integer." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Return the absolute value of the input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "" +"Return the sign of the input, turning it into 1, -1, or 0. Useful to " +"determine if the input is positive or negative." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Return the input raised to a given power." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "" +"Return the natural logarithm of the input. Note that this is not the typical " +"base-10 logarithm function calculators use." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "" +"Return the mathematical constant [b]e[/b] raised to the specified power of " +"the input. [b]e[/b] has an approximate value of 2.71828." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "" +"Return whether the input is NaN (Not a Number) or not. NaN is usually " +"produced by dividing 0 by 0, though other ways exist." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "" +"Return whether the input is an infinite floating-point number or not. " +"Infinity is usually produced by dividing a number by 0, though other ways " +"exist." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "" +"Easing function, based on exponent. 0 is constant, 1 is linear, 0 to 1 is " +"ease-in, 1+ is ease out. Negative values are in-out/out in." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "" +"Return the number of digit places after the decimal that the first non-zero " +"digit occurs." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Return the input snapped to a given step." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "" +"Return a number linearly interpolated between the first two inputs, based on " +"the third input. Uses the formula [code]a + (a - b) * t[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Moves the number toward a value, based on the third input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "" +"Return the result of [code]value[/code] decreased by [code]step[/code] * " +"[code]amount[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "" +"Randomize the seed (or the internal state) of the random number generator. " +"Current implementation reseeds using a number based on time." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "" +"Return a random 32 bits integer value. To obtain a random value between 0 to " +"N (where N is smaller than 2^32 - 1), you can use it with the remainder " +"function." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "" +"Return a random floating-point value between 0 and 1. To obtain a random " +"value between 0 to N, you can use it with multiplication." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Return a random floating-point value between the two inputs." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Set the seed for the random number generator." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Return a random value from the given seed, along with the new seed." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Convert the input from degrees to radians." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Convert the input from radians to degrees." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Convert the input from linear volume to decibel volume." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Convert the input from decibel volume to linear volume." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Return the greater of the two numbers, also known as their maximum." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Return the lesser of the two numbers, also known as their minimum." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "" +"Return the input clamped inside the given range, ensuring the result is " +"never outside it. Equivalent to [code]min(max(input, range_low), range_high)" +"[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Return the nearest power of 2 to the input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Create a [WeakRef] from the input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Create a [FuncRef] from the input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Convert between types." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "" +"Return the type of the input as an integer. Check [enum Variant.Type] for " +"the integers that might be returned." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Checks if a type is registered in the [ClassDB]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Return a character with the given ascii value." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Convert the input to a string." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Print the given string to the output window." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Print the given string to the standard error output." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "" +"Print the given string to the standard output, without adding a newline." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Serialize a [Variant] to a string." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "" +"Deserialize a [Variant] from a string serialized using [constant VAR_TO_STR]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Serialize a [Variant] to a [PoolByteArray]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "" +"Deserialize a [Variant] from a [PoolByteArray] serialized using [constant " +"VAR_TO_BYTES]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "" +"Return the [Color] with the given name and alpha ranging from 0 to 1.\n" +"[b]Note:[/b] Names are defined in [code]color_names.inc[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "" +"Return a number smoothly interpolated between the first two inputs, based on " +"the third input. Similar to [constant MATH_LERP], but interpolates faster at " +"the beginning and slower at the end. Using Hermite interpolation formula:\n" +"[codeblock]\n" +"var t = clamp((weight - from) / (to - from), 0.0, 1.0)\n" +"return t * t * (3.0 - 2.0 * t)\n" +"[/codeblock]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +msgid "Represents the size of the [enum BuiltinFunc] enum." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptClassConstant.xml +msgid "Gets a constant from a given class." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptClassConstant.xml +msgid "" +"This node returns a constant from a given class, such as [constant " +"TYPE_INT]. See the given class' documentation for available constants.\n" +"[b]Input Ports:[/b]\n" +"none\n" +"[b]Output Ports:[/b]\n" +"- Data (variant): [code]value[/code]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptClassConstant.xml +msgid "The constant's parent class." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptClassConstant.xml +msgid "" +"The constant to return. See the given class for its available constants." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptComment.xml +msgid "A Visual Script node used to annotate the script." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptComment.xml +msgid "" +"A Visual Script node used to display annotations in the script, so that code " +"may be documented.\n" +"Comment nodes can be resized so they encompass a group of nodes." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptComment.xml +msgid "The text inside the comment node." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptComment.xml +msgid "The comment node's size (in pixels)." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptComment.xml +msgid "The comment node's title." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptComposeArray.xml +msgid "A Visual Script Node used to create array from a list of items." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptComposeArray.xml +msgid "" +"A Visual Script Node used to compose array from the list of elements " +"provided with custom in-graph UI hard coded in the VisualScript Editor." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCondition.xml +msgid "A Visual Script node which branches the flow." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCondition.xml +msgid "" +"A Visual Script node that checks a [bool] input port. If [code]true[/code], " +"it will exit via the \"true\" sequence port. If [code]false[/code], it will " +"exit via the \"false\" sequence port. After exiting either, it exits via the " +"\"done\" port. Sequence ports may be left disconnected.\n" +"[b]Input Ports:[/b]\n" +"- Sequence: [code]if (cond) is[/code]\n" +"- Data (boolean): [code]cond[/code]\n" +"[b]Output Ports:[/b]\n" +"- Sequence: [code]true[/code]\n" +"- Sequence: [code]false[/code]\n" +"- Sequence: [code]done[/code]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptConstant.xml +msgid "Gets a contant's value." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptConstant.xml +msgid "" +"This node returns a constant's value.\n" +"[b]Input Ports:[/b]\n" +"none\n" +"[b]Output Ports:[/b]\n" +"- Data (variant): [code]get[/code]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptConstant.xml +msgid "The constant's type." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptConstant.xml +msgid "The constant's value." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptConstructor.xml +msgid "A Visual Script node which calls a base type constructor." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptConstructor.xml +msgid "" +"A Visual Script node which calls a base type constructor. It can be used for " +"type conversion as well." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml +msgid "A scripted Visual Script node." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml +msgid "A custom Visual Script node which can be scripted in powerful ways." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml +msgid "Return the node's title." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml +msgid "Return the node's category." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml +msgid "Return the count of input value ports." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml +msgid "" +"Return the specified input port's hint. See the [enum @GlobalScope." +"PropertyHint] hints." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml +msgid "Return the specified input port's hint string." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml +msgid "Return the specified input port's name." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml +msgid "" +"Return the specified input port's type. See the [enum Variant.Type] values." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml +msgid "Return the amount of output [b]sequence[/b] ports." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml +msgid "Return the specified [b]sequence[/b] output's name." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml +msgid "Return the amount of output value ports." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml +msgid "" +"Return the specified output port's hint. See the [enum @GlobalScope." +"PropertyHint] hints." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml +msgid "Return the specified output port's hint string." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml +msgid "Return the specified output port's name." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml +msgid "" +"Return the specified output port's type. See the [enum Variant.Type] values." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml +msgid "" +"Return the custom node's text, which is shown right next to the input " +"[b]sequence[/b] port (if there is none, on the place that is usually taken " +"by it)." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml +msgid "" +"Return the size of the custom node's working memory. See [method _step] for " +"more details." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml +msgid "Return whether the custom node has an input [b]sequence[/b] port." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml +msgid "" +"Execute the custom node's logic, returning the index of the output sequence " +"port to use or a [String] when there is an error.\n" +"The [code]inputs[/code] array contains the values of the input ports.\n" +"[code]outputs[/code] is an array whose indices should be set to the " +"respective outputs.\n" +"The [code]start_mode[/code] is usually [constant START_MODE_BEGIN_SEQUENCE], " +"unless you have used the [code]STEP_*[/code] constants.\n" +"[code]working_mem[/code] is an array which can be used to persist " +"information between runs of the custom node. The size needs to be predefined " +"using [method _get_working_memory_size].\n" +"When returning, you can mask the returned value with one of the " +"[code]STEP_*[/code] constants." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml +msgid "The start mode used the first time when [method _step] is called." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml +msgid "" +"The start mode used when [method _step] is called after coming back from a " +"[constant STEP_PUSH_STACK_BIT]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml +msgid "" +"The start mode used when [method _step] is called after resuming from " +"[constant STEP_YIELD_BIT]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml +msgid "" +"Hint used by [method _step] to tell that control should return to it when " +"there is no other node left to execute.\n" +"This is used by [VisualScriptCondition] to redirect the sequence to the " +"\"Done\" port after the [code]true[/code]/[code]false[/code] branch has " +"finished execution." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml +msgid "" +"Hint used by [method _step] to tell that control should return back, either " +"hitting a previous [constant STEP_PUSH_STACK_BIT] or exiting the function." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml +msgid "" +"Hint used by [method _step] to tell that control should stop and exit the " +"function." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml +msgid "" +"Hint used by [method _step] to tell that the function should be yielded.\n" +"Using this requires you to have at least one working memory slot, which is " +"used for the [VisualScriptFunctionState]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptDeconstruct.xml +msgid "" +"A Visual Script node which deconstructs a base type instance into its parts." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptDeconstruct.xml +msgid "The type to deconstruct." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptEditor.xml +msgid "" +"Add a custom Visual Script node to the editor. It'll be placed under " +"\"Custom Nodes\" with the [code]category[/code] as the parameter." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptEditor.xml +msgid "" +"Remove a custom Visual Script node from the editor. Custom nodes already " +"placed on scripts won't be removed." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptEditor.xml +msgid "Emitted when a custom Visual Script node is added or removed." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptEmitSignal.xml +msgid "Emits a specified signal." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptEmitSignal.xml +msgid "" +"Emits a specified signal when it is executed.\n" +"[b]Input Ports:[/b]\n" +"- Sequence: [code]emit[/code]\n" +"[b]Output Ports:[/b]\n" +"- Sequence" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptEmitSignal.xml +msgid "The signal to emit." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptEngineSingleton.xml +msgid "A Visual Script node returning a singleton from [@GlobalScope]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptEngineSingleton.xml +msgid "The singleton's name." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptExpression.xml +msgid "A Visual Script node that can execute a custom expression." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptExpression.xml +msgid "" +"A Visual Script node that can execute a custom expression. Values can be " +"provided for the input and the expression result can be retrieved from the " +"output." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptFunction.xml +msgid "A Visual Script node representing a function." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptFunction.xml +msgid "" +"[VisualScriptFunction] represents a function header. It is the starting " +"point for the function body and can be used to tweak the function's " +"properties (e.g. RPC mode)." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml +msgid "A Visual Script node for calling a function." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml +msgid "" +"[VisualScriptFunctionCall] is created when you add or drag and drop a " +"function onto the Visual Script graph. It allows to tweak parameters of the " +"call, e.g. what object the function is called on." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml +msgid "" +"The script to be used when [member call_mode] is set to [constant " +"CALL_MODE_INSTANCE]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml +#: modules/visual_script/doc_classes/VisualScriptYieldSignal.xml +msgid "" +"The base type to be used when [member call_mode] is set to [constant " +"CALL_MODE_INSTANCE]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml +msgid "" +"The type to be used when [member call_mode] is set to [constant " +"CALL_MODE_BASIC_TYPE]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml +msgid "" +"[code]call_mode[/code] determines the target object on which the method will " +"be called. See [enum CallMode] for options." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml +msgid "The name of the function to be called." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml +#: modules/visual_script/doc_classes/VisualScriptYieldSignal.xml +msgid "" +"The node path to use when [member call_mode] is set to [constant " +"CALL_MODE_NODE_PATH]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml +msgid "" +"The mode for RPC calls. See [method Node.rpc] for more details and [enum " +"RPCCallMode] for available options." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml +msgid "" +"The singleton to call the method on. Used when [member call_mode] is set to " +"[constant CALL_MODE_SINGLETON]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml +msgid "" +"Number of default arguments that will be used when calling the function. " +"Can't be higher than the number of available default arguments in the " +"method's declaration." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml +msgid "" +"If [code]false[/code], call errors (e.g. wrong number of arguments) will be " +"ignored." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml +msgid "The method will be called on this [Object]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml +msgid "The method will be called on the given [Node] in the scene tree." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml +msgid "" +"The method will be called on an instanced node with the given type and " +"script." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml +msgid "The method will be called on a GDScript basic type (e.g. [Vector2])." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml +msgid "The method will be called on a singleton." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml +msgid "The method will be called locally." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml +msgid "The method will be called remotely." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml +msgid "The method will be called remotely using an unreliable protocol." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml +msgid "The method will be called remotely for the given peer." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml +msgid "" +"The method will be called remotely for the given peer, using an unreliable " +"protocol." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptFunctionState.xml +msgid "A Visual Script node representing a function state." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptFunctionState.xml +msgid "" +"[VisualScriptFunctionState] is returned from [VisualScriptYield] and can be " +"used to resume a paused function call." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptFunctionState.xml +msgid "" +"Connects this [VisualScriptFunctionState] to a signal in the given object to " +"automatically resume when it's emitted." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptFunctionState.xml +msgid "Returns whether the function state is valid." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptFunctionState.xml +msgid "Resumes the function to run from the point it was yielded." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptGlobalConstant.xml +msgid "A Visual Script node returning a constant from [@GlobalScope]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptGlobalConstant.xml +msgid "The constant to be used." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptIndexGet.xml +msgid "A Visual Script node for getting a value from an array or a dictionary." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptIndexGet.xml +msgid "" +"[VisualScriptIndexGet] will return the value stored in an array or a " +"dictionary under the given index." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptIndexSet.xml +msgid "A Visual Script node for setting a value in an array or a dictionary." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptIndexSet.xml +msgid "" +"[VisualScriptIndexSet] will set the value stored in an array or a dictionary " +"under the given index to the provided new value." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptInputAction.xml +msgid "A Visual Script node returning a state of an action." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptInputAction.xml +msgid "" +"[VisualScriptInputAction] can be used to check if an action is pressed or " +"released." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptInputAction.xml +msgid "Name of the action." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptInputAction.xml +msgid "State of the action to check. See [enum Mode] for options." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptInputAction.xml +msgid "[code]True[/code] if action is pressed." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptInputAction.xml +msgid "[code]True[/code] if action is released (i.e. not pressed)." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptInputAction.xml +msgid "[code]True[/code] on the frame the action was pressed." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptInputAction.xml +msgid "[code]True[/code] on the frame the action was released." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptIterator.xml +msgid "Steps through items in a given input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptIterator.xml +msgid "" +"This node steps through each item in a given input. Input can be any " +"sequence data type, such as an [Array] or [String]. When each item has been " +"processed, execution passed out the [code]exit[/code] Sequence port.\n" +"[b]Input Ports:[/b]\n" +"- Sequence: [code]for (elem) in (input)[/code]\n" +"- Data (variant): [code]input[/code]\n" +"[b]Output Ports:[/b]\n" +"- Sequence: [code]each[/code]\n" +"- Sequence: [code]exit[/code]\n" +"- Data (variant): [code]elem[/code]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptLists.xml +msgid "A Visual Script virtual class for in-graph editable nodes." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptLists.xml +msgid "" +"A Visual Script virtual class that defines the shape and the default " +"behavior of the nodes that have to be in-graph editable nodes." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptLists.xml +msgid "Adds an input port to the Visual Script node." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptLists.xml +msgid "Adds an output port to the Visual Script node." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptLists.xml +msgid "Removes an input port from the Visual Script node." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptLists.xml +msgid "Removes an output port from the Visual Script node." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptLists.xml +msgid "Sets the name of an input port." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptLists.xml +msgid "Sets the type of an input port." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptLists.xml +msgid "Sets the name of an output port." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptLists.xml +msgid "Sets the type of an output port." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptLocalVar.xml +msgid "Gets a local variable's value." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptLocalVar.xml +msgid "" +"Returns a local variable's value. \"Var Name\" must be supplied, with an " +"optional type.\n" +"[b]Input Ports:[/b]\n" +"none\n" +"[b]Output Ports:[/b]\n" +"- Data (variant): [code]get[/code]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptLocalVar.xml +#: modules/visual_script/doc_classes/VisualScriptLocalVarSet.xml +msgid "The local variable's type." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptLocalVar.xml +#: modules/visual_script/doc_classes/VisualScriptLocalVarSet.xml +msgid "The local variable's name." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptLocalVarSet.xml +msgid "Changes a local variable's value." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptLocalVarSet.xml +msgid "" +"Changes a local variable's value to the given input. The new value is also " +"provided on an output Data port.\n" +"[b]Input Ports:[/b]\n" +"- Sequence\n" +"- Data (variant): [code]set[/code]\n" +"[b]Output Ports:[/b]\n" +"- Sequence\n" +"- Data (variant): [code]get[/code]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptMathConstant.xml +msgid "Commonly used mathematical constants." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptMathConstant.xml +msgid "" +"Provides common math constants, such as Pi, on an output Data port.\n" +"[b]Input Ports:[/b]\n" +"none\n" +"[b]Output Ports:[/b]\n" +"- Data (variant): [code]get[/code]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptMathConstant.xml +msgid "The math constant." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptMathConstant.xml +msgid "Unity: [code]1[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptMathConstant.xml +msgid "Pi: [code]3.141593[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptMathConstant.xml +msgid "Pi divided by two: [code]1.570796[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptMathConstant.xml +msgid "Tau: [code]6.283185[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptMathConstant.xml +msgid "" +"Mathematical constant [code]e[/code], the natural log base: [code]2.718282[/" +"code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptMathConstant.xml +msgid "Square root of two: [code]1.414214[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptMathConstant.xml +msgid "Infinity: [code]inf[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptMathConstant.xml +msgid "Not a number: [code]nan[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptMathConstant.xml +msgid "Represents the size of the [enum MathConstant] enum." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptNode.xml +msgid "A node which is part of a [VisualScript]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptNode.xml +msgid "" +"A node which is part of a [VisualScript]. Not to be confused with [Node], " +"which is a part of a [SceneTree]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptNode.xml +msgid "" +"Returns the default value of a given port. The default value is used when " +"nothing is connected to the port." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptNode.xml +msgid "Returns the [VisualScript] instance the node is bound to." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptNode.xml +msgid "" +"Notify that the node's ports have changed. Usually used in conjunction with " +"[VisualScriptCustomNode] ." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptNode.xml +msgid "Change the default value of a given port." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptNode.xml +msgid "Emitted when the available input/output ports are changed." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptOperator.xml +msgid "A Visual Script node that performs an operation on two values." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptOperator.xml +msgid "" +"[b]Input Ports:[/b]\n" +"- Data (variant): [code]A[/code]\n" +"- Data (variant): [code]B[/code]\n" +"[b]Output Ports:[/b]\n" +"- Data (variant): [code]result[/code]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptOperator.xml +msgid "" +"The operation to be performed. See [enum Variant.Operator] for available " +"options." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptOperator.xml +msgid "" +"The type of the values for this operation. See [enum Variant.Type] for " +"available options." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPreload.xml +msgid "Creates a new [Resource] or loads one from the filesystem." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPreload.xml +msgid "" +"Creates a new [Resource] or loads one from the filesystem.\n" +"[b]Input Ports:[/b]\n" +"none\n" +"[b]Output Ports:[/b]\n" +"- Data (object): [code]res[/code]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPreload.xml +msgid "The [Resource] to load." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertyGet.xml +msgid "A Visual Script node returning a value of a property from an [Object]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertyGet.xml +msgid "" +"[VisualScriptPropertyGet] can return a value of any property from the " +"current object or other objects." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertyGet.xml +#: modules/visual_script/doc_classes/VisualScriptPropertySet.xml +msgid "" +"The script to be used when [member set_mode] is set to [constant " +"CALL_MODE_INSTANCE]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertyGet.xml +#: modules/visual_script/doc_classes/VisualScriptPropertySet.xml +msgid "" +"The base type to be used when [member set_mode] is set to [constant " +"CALL_MODE_INSTANCE]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertyGet.xml +#: modules/visual_script/doc_classes/VisualScriptPropertySet.xml +msgid "" +"The type to be used when [member set_mode] is set to [constant " +"CALL_MODE_BASIC_TYPE]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertyGet.xml +msgid "" +"The indexed name of the property to retrieve. See [method Object." +"get_indexed] for details." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertyGet.xml +#: modules/visual_script/doc_classes/VisualScriptPropertySet.xml +msgid "" +"The node path to use when [member set_mode] is set to [constant " +"CALL_MODE_NODE_PATH]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertyGet.xml +msgid "" +"The name of the property to retrieve. Changing this will clear [member " +"index]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertyGet.xml +msgid "" +"[code]set_mode[/code] determines the target object from which the property " +"will be retrieved. See [enum CallMode] for options." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertyGet.xml +msgid "The property will be retrieved from this [Object]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertyGet.xml +msgid "The property will be retrieved from the given [Node] in the scene tree." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertyGet.xml +msgid "" +"The property will be retrieved from an instanced node with the given type " +"and script." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertyGet.xml +msgid "" +"The property will be retrieved from a GDScript basic type (e.g. [Vector2])." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertySet.xml +msgid "A Visual Script node that sets a property of an [Object]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertySet.xml +msgid "" +"[VisualScriptPropertySet] can set the value of any property from the current " +"object or other objects." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertySet.xml +msgid "" +"The additional operation to perform when assigning. See [enum AssignOp] for " +"options." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertySet.xml +msgid "" +"The indexed name of the property to set. See [method Object.set_indexed] for " +"details." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertySet.xml +msgid "" +"The name of the property to set. Changing this will clear [member index]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertySet.xml +msgid "" +"[code]set_mode[/code] determines the target object on which the property " +"will be set. See [enum CallMode] for options." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertySet.xml +msgid "The property will be set on this [Object]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertySet.xml +msgid "The property will be set on the given [Node] in the scene tree." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertySet.xml +msgid "" +"The property will be set on an instanced node with the given type and script." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertySet.xml +msgid "The property will be set on a GDScript basic type (e.g. [Vector2])." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertySet.xml +msgid "The property will be assigned regularly." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertySet.xml +msgid "" +"The value will be added to the property. Equivalent of doing [code]+=[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertySet.xml +msgid "" +"The value will be subtracted from the property. Equivalent of doing [code]-" +"=[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertySet.xml +msgid "" +"The property will be multiplied by the value. Equivalent of doing [code]*=[/" +"code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertySet.xml +msgid "" +"The property will be divided by the value. Equivalent of doing [code]/=[/" +"code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertySet.xml +msgid "" +"A modulo operation will be performed on the property and the value. " +"Equivalent of doing [code]%=[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertySet.xml +msgid "" +"The property will be binarly shifted to the left by the given value. " +"Equivalent of doing [code]<<[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertySet.xml +msgid "" +"The property will be binarly shifted to the right by the given value. " +"Equivalent of doing [code]>>[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertySet.xml +msgid "" +"A binary [code]AND[/code] operation will be performed on the property. " +"Equivalent of doing [code]&=[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertySet.xml +msgid "" +"A binary [code]OR[/code] operation will be performed on the property. " +"Equivalent of doing [code]|=[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPropertySet.xml +msgid "" +"A binary [code]XOR[/code] operation will be performed on the property. " +"Equivalent of doing [code]^=[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptReturn.xml +msgid "Exits a function and returns an optional value." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptReturn.xml +msgid "" +"Ends the execution of a function and returns control to the calling " +"function. Optionally, it can return a [Variant] value.\n" +"[b]Input Ports:[/b]\n" +"- Sequence\n" +"- Data (variant): [code]result[/code] (optional)\n" +"[b]Output Ports:[/b]\n" +"none" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptReturn.xml +msgid "If [code]true[/code], the [code]return[/code] input port is available." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptReturn.xml +msgid "The return value's data type." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptSceneNode.xml +msgid "Node reference." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptSceneNode.xml +msgid "" +"A direct reference to a node.\n" +"[b]Input Ports:[/b]\n" +"none\n" +"[b]Output Ports:[/b]\n" +"- Data: [code]node[/code] (obj)" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptSceneNode.xml +msgid "The node's path in the scene tree." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptSceneTree.xml +msgid "A Visual Script node for accessing [SceneTree] methods." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptSelect.xml +msgid "Chooses between two input values." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptSelect.xml +msgid "" +"Chooses between two input values based on a Boolean condition.\n" +"[b]Input Ports:[/b]\n" +"- Data (boolean): [code]cond[/code]\n" +"- Data (variant): [code]a[/code]\n" +"- Data (variant): [code]b[/code]\n" +"[b]Output Ports:[/b]\n" +"- Data (variant): [code]out[/code]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptSelect.xml +msgid "The input variables' type." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptSelf.xml +msgid "Outputs a reference to the current instance." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptSelf.xml +msgid "" +"Provides a reference to the node running the visual script.\n" +"[b]Input Ports:[/b]\n" +"none\n" +"[b]Output Ports:[/b]\n" +"- Data (object): [code]instance[/code]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptSequence.xml +msgid "Executes a series of Sequence ports." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptSequence.xml +msgid "" +"Steps through a series of one or more output Sequence ports. The " +"[code]current[/code] data port outputs the currently executing item.\n" +"[b]Input Ports:[/b]\n" +"- Sequence: [code]in order[/code]\n" +"[b]Output Ports:[/b]\n" +"- Sequence: [code]1[/code]\n" +"- Sequence: [code]2 - n[/code] (optional)\n" +"- Data (int): [code]current[/code]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptSequence.xml +msgid "The number of steps in the sequence." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptSubCall.xml +msgid "Calls a method called [code]_subcall[/code] in this object." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptSubCall.xml +msgid "" +"[VisualScriptSubCall] will call method named [code]_subcall[/code] in the " +"current script. It will fail if the method doesn't exist or the provided " +"arguments are wrong." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptSubCall.xml +msgid "Called by this node." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptSwitch.xml +msgid "Branches program flow based on a given input's value." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptSwitch.xml +msgid "" +"Branches the flow based on an input's value. Use [b]Case Count[/b] in the " +"Inspector to set the number of branches and each comparison's optional " +"type.\n" +"[b]Input Ports:[/b]\n" +"- Sequence: [code]'input' is[/code]\n" +"- Data (variant): [code]=[/code]\n" +"- Data (variant): [code]=[/code] (optional)\n" +"- Data (variant): [code]input[/code]\n" +"[b]Output Ports:[/b]\n" +"- Sequence\n" +"- Sequence (optional)\n" +"- Sequence: [code]done[/code]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptTypeCast.xml +msgid "A Visual Script node that casts the given value to another type." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptTypeCast.xml +msgid "" +"[VisualScriptTypeCast] will perform a type conversion to an [Object]-derived " +"type." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptTypeCast.xml +msgid "" +"The target script class to be converted to. If none, only the [member " +"base_type] will be used." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptTypeCast.xml +msgid "The target type to be converted to." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptVariableGet.xml +msgid "Gets a variable's value." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptVariableGet.xml +msgid "" +"Returns a variable's value. \"Var Name\" must be supplied, with an optional " +"type.\n" +"[b]Input Ports:[/b]\n" +"none\n" +"[b]Output Ports:[/b]\n" +"- Data (variant): [code]value[/code]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptVariableGet.xml +#: modules/visual_script/doc_classes/VisualScriptVariableSet.xml +msgid "The variable's name." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptVariableSet.xml +msgid "Changes a variable's value." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptVariableSet.xml +msgid "" +"Changes a variable's value to the given input.\n" +"[b]Input Ports:[/b]\n" +"- Sequence\n" +"- Data (variant): [code]set[/code]\n" +"[b]Output Ports:[/b]\n" +"- Sequence" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptWhile.xml +msgid "Conditional loop." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptWhile.xml +msgid "" +"Loops while a condition is [code]true[/code]. Execution continues out the " +"[code]exit[/code] Sequence port when the loop terminates.\n" +"[b]Input Ports:[/b]\n" +"- Sequence: [code]while(cond)[/code]\n" +"- Data (bool): [code]cond[/code]\n" +"[b]Output Ports:[/b]\n" +"- Sequence: [code]repeat[/code]\n" +"- Sequence: [code]exit[/code]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptYield.xml +msgid "A Visual Script node used to pause a function execution." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptYield.xml +msgid "" +"[VisualScriptYield] will pause the function call and return " +"[VisualScriptFunctionState], which can be used to resume the function." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptYield.xml +msgid "" +"The mode to use for yielding. See [enum YieldMode] for available options." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptYield.xml +msgid "The time to wait when [member mode] is set to [constant YIELD_WAIT]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptYield.xml +msgid "Yields during an idle frame." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptYield.xml +msgid "Yields during a physics frame." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptYield.xml +msgid "Yields a function and waits the given time." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptYieldSignal.xml +msgid "A Visual Script node yielding for a signal." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptYieldSignal.xml +msgid "" +"[VisualScriptYieldSignal] will pause the function execution until the " +"provided signal is emitted." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptYieldSignal.xml +msgid "" +"[code]call_mode[/code] determines the target object to wait for the signal " +"emission. See [enum CallMode] for options." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptYieldSignal.xml +msgid "The signal name to be waited for." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptYieldSignal.xml +msgid "A signal from this [Object] will be used." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptYieldSignal.xml +msgid "A signal from the given [Node] in the scene tree will be used." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptYieldSignal.xml +msgid "A signal from an instanced node with the given type will be used." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Server for anything visible." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Server for anything visible. The visual server is the API backend for " +"everything visible. The whole scene system mounts on it to display.\n" +"The visual server is completely opaque, the internals are entirely " +"implementation specific and cannot be accessed.\n" +"The visual server can be used to bypass the scene system entirely.\n" +"Resources are created using the [code]*_create[/code] functions.\n" +"All objects are drawn to a viewport. You can use the [Viewport] attached to " +"the [SceneTree] or you can create one yourself with [method " +"viewport_create]. When using a custom scenario or canvas, the scenario or " +"canvas needs to be attached to the viewport using [method " +"viewport_set_scenario] or [method viewport_attach_canvas].\n" +"In 3D, all visual objects must be associated with a scenario. The scenario " +"is a visual representation of the world. If accessing the visual server from " +"a running game, the scenario can be accessed from the scene tree from any " +"[Spatial] node with [method Spatial.get_world]. Otherwise, a scenario can be " +"created with [method scenario_create].\n" +"Similarly, in 2D, a canvas is needed to draw all canvas items.\n" +"In 3D, all visible objects are comprised of a resource and an instance. A " +"resource can be a mesh, a particle system, a light, or any other 3D object. " +"In order to be visible resources must be attached to an instance using " +"[method instance_set_base]. The instance must also be attached to the " +"scenario using [method instance_set_scenario] in order to be visible.\n" +"In 2D, all visible objects are some form of canvas item. In order to be " +"visible, a canvas item needs to be the child of a canvas attached to a " +"viewport, or it needs to be the child of another canvas item that is " +"eventually attached to the canvas." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets images to be rendered in the window margin." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets margin size, where black bars (or images, if [method " +"black_bars_set_images] was used) are rendered." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Creates a camera and adds it to the VisualServer. It can be accessed with " +"the RID that is returned. This RID will be used in all [code]camera_*[/code] " +"VisualServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"VisualServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the cull mask associated with this camera. The cull mask describes " +"which 3D layers are rendered by this camera. Equivalent to [member Camera." +"cull_mask]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the environment used by this camera. Equivalent to [member Camera." +"environment]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets camera to use frustum projection. This mode allows adjusting the " +"[code]offset[/code] argument to create \"tilted frustum\" effects." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets camera to use orthogonal projection, also known as orthographic " +"projection. Objects remain the same size on the screen no matter how far " +"away they are." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets camera to use perspective projection. Objects on the screen becomes " +"smaller when they are far away." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets [Transform] of camera." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"If [code]true[/code], preserves the horizontal aspect ratio which is " +"equivalent to [constant Camera.KEEP_WIDTH]. If [code]false[/code], preserves " +"the vertical aspect ratio which is equivalent to [constant Camera." +"KEEP_HEIGHT]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Creates a canvas and returns the assigned [RID]. It can be accessed with the " +"RID that is returned. This RID will be used in all [code]canvas_*[/code] " +"VisualServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"VisualServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Adds a circle command to the [CanvasItem]'s draw commands." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"If ignore is [code]true[/code], the VisualServer does not perform clipping." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Adds a line command to the [CanvasItem]'s draw commands." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Adds a mesh command to the [CanvasItem]'s draw commands." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Adds a [MultiMesh] to the [CanvasItem]'s draw commands. Only affects its " +"aabb at the moment." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Adds a nine patch image to the [CanvasItem]'s draw commands.\n" +"See [NinePatchRect] for more explanation." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Adds a particle system to the [CanvasItem]'s draw commands." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Adds a polygon to the [CanvasItem]'s draw commands." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Adds a polyline, which is a line from multiple points with a width, to the " +"[CanvasItem]'s draw commands." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Adds a primitive to the [CanvasItem]'s draw commands." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Adds a rectangle to the [CanvasItem]'s draw commands." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Adds a [Transform2D] command to the [CanvasItem]'s draw commands.\n" +"This sets the extra_matrix uniform when executed. This affects the later " +"commands of the canvas item." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Adds a textured rect to the [CanvasItem]'s draw commands." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Adds a texture rect with region setting to the [CanvasItem]'s draw commands." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Adds a triangle array to the [CanvasItem]'s draw commands." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Clears the [CanvasItem] and removes all commands in it." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Creates a new [CanvasItem] and returns its [RID]. It can be accessed with " +"the RID that is returned. This RID will be used in all [code]canvas_item_*[/" +"code] VisualServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"VisualServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets clipping for the [CanvasItem]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the [CanvasItem] to copy a rect to the backbuffer." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Defines a custom drawing rectangle for the [CanvasItem]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Enables the use of distance fields for GUI elements that are rendering " +"distance field based fonts." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets [CanvasItem] to be drawn behind its parent." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the index for the [CanvasItem]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"The light mask. See [LightOccluder2D] for more information on light masks." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets a new material to the [CanvasItem]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the color that modulates the [CanvasItem] and its children." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the parent for the [CanvasItem]. The parent can be another canvas item, " +"or it can be the root canvas that is attached to the viewport." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the color that modulates the [CanvasItem] without children." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets if [CanvasItem]'s children should be sorted by y-position." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the [CanvasItem]'s [Transform2D]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets if the [CanvasItem] uses its parent's material." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets if the canvas item (including its children) is visible." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"If this is enabled, the Z index of the parent will be added to the " +"children's Z index." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the [CanvasItem]'s Z index, i.e. its draw order (lower indexes are " +"drawn first)." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Attaches the canvas light to the canvas. Removes it from its previous canvas." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Creates a canvas light and adds it to the VisualServer. It can be accessed " +"with the RID that is returned. This RID will be used in all " +"[code]canvas_light_*[/code] VisualServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"VisualServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Attaches a light occluder to the canvas. Removes it from its previous canvas." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Creates a light occluder and adds it to the VisualServer. It can be accessed " +"with the RID that is returned. This RID will be used in all " +"[code]canvas_light_ocluder_*[/code] VisualServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"VisualServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Enables or disables light occluder." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets a light occluder's polygon." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets a light occluder's [Transform2D]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the color for a light." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Enables or disables a canvas light." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets a canvas light's energy." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets a canvas light's height." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"The binary mask used to determine which layers this canvas light's shadows " +"affects. See [LightOccluder2D] for more information on light masks." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The layer range that gets rendered with this light." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The mode of the light, see [enum CanvasLightMode] constants." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the texture's scale factor of the light. Equivalent to [member Light2D." +"texture_scale]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the width of the shadow buffer, size gets scaled to the next power of " +"two for this." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the color of the canvas light's shadow." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Enables or disables the canvas light's shadow." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the canvas light's shadow's filter, see [enum CanvasLightShadowFilter] " +"constants." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the length of the shadow's gradient." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Smoothens the shadow. The lower, the smoother." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets texture to be used by light. Equivalent to [member Light2D.texture]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the offset of the light's texture. Equivalent to [member Light2D." +"offset]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the canvas light's [Transform2D]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the Z range of objects that will be affected by this light. Equivalent " +"to [member Light2D.range_z_min] and [member Light2D.range_z_max]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Creates a new light occluder polygon and adds it to the VisualServer. It can " +"be accessed with the RID that is returned. This RID will be used in all " +"[code]canvas_occluder_polygon_*[/code] VisualServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"VisualServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets an occluder polygons cull mode. See [enum " +"CanvasOccluderPolygonCullMode] constants." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the shape of the occluder polygon." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the shape of the occluder polygon as lines." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"A copy of the canvas item will be drawn with a local offset of the mirroring " +"[Vector2]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Modulates all colors in the given canvas." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Creates a directional light and adds it to the VisualServer. It can be " +"accessed with the RID that is returned. This RID can be used in most " +"[code]light_*[/code] VisualServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"VisualServer's [method free_rid] static method.\n" +"To place in a scene, attach this directional light to an instance using " +"[method instance_set_base] using the returned RID." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Draws a frame. [i]This method is deprecated[/i], please use [method " +"force_draw] instead." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Creates an environment and adds it to the VisualServer. It can be accessed " +"with the RID that is returned. This RID will be used in all " +"[code]environment_*[/code] VisualServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"VisualServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the values to be used with the \"Adjustment\" post-process effect. See " +"[Environment] for more details." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the ambient light parameters. See [Environment] for more details." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the [i]BGMode[/i] of the environment. Equivalent to [member Environment." +"background_mode]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Color displayed for clear areas of the scene (if using Custom color or " +"Color+Sky background modes)." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the intensity of the background color." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the maximum layer to use if using Canvas background mode." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the values to be used with the \"DoF Far Blur\" post-process effect. " +"See [Environment] for more details." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the values to be used with the \"DoF Near Blur\" post-process effect. " +"See [Environment] for more details." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the variables to be used with the scene fog. See [Environment] for more " +"details." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the variables to be used with the fog depth effect. See [Environment] " +"for more details." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the variables to be used with the fog height effect. See [Environment] " +"for more details." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the variables to be used with the \"glow\" post-process effect. See " +"[Environment] for more details." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the [Sky] to be used as the environment's background when using " +"[i]BGMode[/i] sky. Equivalent to [member Environment.background_sky]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets a custom field of view for the background [Sky]. Equivalent to [member " +"Environment.background_sky_custom_fov]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the rotation of the background [Sky] expressed as a [Basis]. Equivalent " +"to [member Environment.background_sky_orientation]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the variables to be used with the \"Screen Space Ambient Occlusion " +"(SSAO)\" post-process effect. See [Environment] for more details." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the variables to be used with the \"screen space reflections\" post-" +"process effect. See [Environment] for more details." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the variables to be used with the \"tonemap\" post-process effect. See " +"[Environment] for more details." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Removes buffers and clears testcubes." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Forces a frame to be drawn when the function is called. Drawing a frame " +"updates all [Viewport]s that are set to update. Use with extreme caution." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Synchronizes threads." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Tries to free an object in the VisualServer." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns a certain information, see [enum RenderInfo] for options." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the id of the test cube. Creates one if none exists." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the id of the test texture. Creates one if none exists." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Returns the name of the video adapter (e.g. \"GeForce GTX 1080/PCIe/" +"SSE2\").\n" +"[b]Note:[/b] When running a headless or server binary, this function returns " +"an empty string." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Returns the vendor of the video adapter (e.g. \"NVIDIA Corporation\").\n" +"[b]Note:[/b] When running a headless or server binary, this function returns " +"an empty string." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the id of a white texture. Creates one if none exists." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Creates a GI probe and adds it to the VisualServer. It can be accessed with " +"the RID that is returned. This RID will be used in all [code]gi_probe_*[/" +"code] VisualServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"VisualServer's [method free_rid] static method.\n" +"To place in a scene, attach this GI probe to an instance using [method " +"instance_set_base] using the returned RID." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Returns the bias value for the GI probe. Bias is used to avoid self " +"occlusion. Equivalent to [member GIProbeData.bias]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Returns the axis-aligned bounding box that covers the full extent of the GI " +"probe." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the cell size set by [method gi_probe_set_cell_size]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the data used by the GI probe." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Returns the dynamic range set for this GI probe. Equivalent to [member " +"GIProbe.dynamic_range]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Returns the energy multiplier for this GI probe. Equivalent to [member " +"GIProbe.energy]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Returns the normal bias for this GI probe. Equivalent to [member GIProbe." +"normal_bias]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Returns the propagation value for this GI probe. Equivalent to [member " +"GIProbe.propagation]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the Transform set by [method gi_probe_set_to_cell_xform]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Returns [code]true[/code] if the GI probe data associated with this GI probe " +"is compressed. Equivalent to [member GIProbe.compress]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Returns [code]true[/code] if the GI probe is set to interior, meaning it " +"does not account for sky light. Equivalent to [member GIProbe.interior]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the bias value to avoid self-occlusion. Equivalent to [member GIProbe." +"bias]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the axis-aligned bounding box that covers the extent of the GI probe." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the size of individual cells within the GI probe." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the compression setting for the GI probe data. Compressed data will " +"take up less space but may look worse. Equivalent to [member GIProbe." +"compress]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the data to be used in the GI probe for lighting calculations. Normally " +"this is created and called internally within the [GIProbe] node. You should " +"not try to set this yourself." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the dynamic range of the GI probe. Dynamic range sets the limit for how " +"bright lights can be. A smaller range captures greater detail but limits how " +"bright lights can be. Equivalent to [member GIProbe.dynamic_range]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the energy multiplier for this GI probe. A higher energy makes the " +"indirect light from the GI probe brighter. Equivalent to [member GIProbe." +"energy]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the interior value of this GI probe. A GI probe set to interior does " +"not include the sky when calculating lighting. Equivalent to [member GIProbe." +"interior]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the normal bias for this GI probe. Normal bias behaves similar to the " +"other form of bias and may help reduce self-occlusion. Equivalent to [member " +"GIProbe.normal_bias]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the propagation of light within this GI probe. Equivalent to [member " +"GIProbe.propagation]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the to cell [Transform] for this GI probe." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Returns [code]true[/code] if changes have been made to the VisualServer's " +"data. [method draw] is usually called if this happens.\n" +"As changes are registered as either high or low priority (e.g. dynamic " +"shaders), this function takes an optional argument to query either low or " +"high priority changes, or any changes." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Not yet implemented. Always returns [code]false[/code]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Returns [code]true[/code] if the OS supports a certain feature. Features " +"might be [code]s3tc[/code], [code]etc[/code], [code]etc2[/code], " +"[code]pvrtc[/code] and [code]skinning_fallback[/code].\n" +"When rendering with GLES2, returns [code]true[/code] with " +"[code]skinning_fallback[/code] in case the hardware doesn't support the " +"default GPU skinning process." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets up [ImmediateGeometry] internals to prepare for drawing. Equivalent to " +"[method ImmediateGeometry.begin]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Clears everything that was set up between [method immediate_begin] and " +"[method immediate_end]. Equivalent to [method ImmediateGeometry.clear]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the color to be used with next vertex. Equivalent to [method " +"ImmediateGeometry.set_color]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Creates an immediate geometry and adds it to the VisualServer. It can be " +"accessed with the RID that is returned. This RID will be used in all " +"[code]immediate_*[/code] VisualServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"VisualServer's [method free_rid] static method.\n" +"To place in a scene, attach this immediate geometry to an instance using " +"[method instance_set_base] using the returned RID." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Ends drawing the [ImmediateGeometry] and displays it. Equivalent to [method " +"ImmediateGeometry.end]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the material assigned to the [ImmediateGeometry]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the normal to be used with next vertex. Equivalent to [method " +"ImmediateGeometry.set_normal]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the material to be used to draw the [ImmediateGeometry]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the tangent to be used with next vertex. Equivalent to [method " +"ImmediateGeometry.set_tangent]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the UV to be used with next vertex. Equivalent to [method " +"ImmediateGeometry.set_uv]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the UV2 to be used with next vertex. Equivalent to [method " +"ImmediateGeometry.set_uv2]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Adds the next vertex using the information provided in advance. Equivalent " +"to [method ImmediateGeometry.add_vertex]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Adds the next vertex using the information provided in advance. This is a " +"helper class that calls [method immediate_vertex] under the hood. Equivalent " +"to [method ImmediateGeometry.add_vertex]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Initializes the visual server. This function is called internally by " +"platform-dependent code during engine initialization. If called from a " +"running game, it will not do anything." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Attaches a unique Object ID to instance. Object ID must be attached to " +"instance for proper culling with [method instances_cull_aabb], [method " +"instances_cull_convex], and [method instances_cull_ray]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Attaches a skeleton to an instance. Removes the previous skeleton from the " +"instance." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Creates a visual instance and adds it to the VisualServer. It can be " +"accessed with the RID that is returned. This RID will be used in all " +"[code]instance_*[/code] VisualServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"VisualServer's [method free_rid] static method.\n" +"An instance is a way of placing a 3D object in the scenario. Objects like " +"particles, meshes, and reflection probes need to be associated with an " +"instance to be visible in the scenario using [method instance_set_base]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Creates a visual instance, adds it to the VisualServer, and sets both base " +"and scenario. It can be accessed with the RID that is returned. This RID " +"will be used in all [code]instance_*[/code] VisualServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"VisualServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Not implemented in Godot 3.x." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the shadow casting setting to one of [enum ShadowCastingSetting]. " +"Equivalent to [member GeometryInstance.cast_shadow]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the flag for a given [enum InstanceFlags]. See [enum InstanceFlags] for " +"more details." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets a material that will be rendered for all surfaces on top of active " +"materials for the mesh associated with this instance. Equivalent to [member " +"GeometryInstance.material_overlay]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets a material that will override the material for all surfaces on the mesh " +"associated with this instance. Equivalent to [member GeometryInstance." +"material_override]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the base of the instance. A base can be any of the 3D objects that are " +"created in the VisualServer that can be displayed. For example, any of the " +"light types, mesh, multimesh, immediate geometry, particle system, " +"reflection probe, lightmap capture, and the GI probe are all types that can " +"be set as the base of an instance in order to be displayed in the scenario." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the weight for a given blend shape associated with this instance." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets a custom AABB to use when culling objects from the view frustum. " +"Equivalent to [method GeometryInstance.set_custom_aabb]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Function not implemented in Godot 3.x." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets a margin to increase the size of the AABB when culling objects from the " +"view frustum. This allows you to avoid culling objects that fall outside the " +"view frustum. Equivalent to [member GeometryInstance.extra_cull_margin]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the render layers that this instance will be drawn to. Equivalent to " +"[member VisualInstance.layers]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the scenario that the instance is in. The scenario is the 3D world that " +"the objects will be displayed in." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the material of a specific surface. Equivalent to [method MeshInstance." +"set_surface_material]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the world space transform of the instance. Equivalent to [member " +"Spatial.transform]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the lightmap to use with this instance." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets whether an instance is drawn or not. Equivalent to [member Spatial." +"visible]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Returns an array of object IDs intersecting with the provided AABB. Only " +"visual 3D nodes are considered, such as [MeshInstance] or " +"[DirectionalLight]. Use [method @GDScript.instance_from_id] to obtain the " +"actual nodes. A scenario RID must be provided, which is available in the " +"[World] you want to query. This forces an update for all resources queued to " +"update.\n" +"[b]Warning:[/b] This function is primarily intended for editor usage. For in-" +"game use cases, prefer physics collision." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Returns an array of object IDs intersecting with the provided convex shape. " +"Only visual 3D nodes are considered, such as [MeshInstance] or " +"[DirectionalLight]. Use [method @GDScript.instance_from_id] to obtain the " +"actual nodes. A scenario RID must be provided, which is available in the " +"[World] you want to query. This forces an update for all resources queued to " +"update.\n" +"[b]Warning:[/b] This function is primarily intended for editor usage. For in-" +"game use cases, prefer physics collision." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Returns an array of object IDs intersecting with the provided 3D ray. Only " +"visual 3D nodes are considered, such as [MeshInstance] or " +"[DirectionalLight]. Use [method @GDScript.instance_from_id] to obtain the " +"actual nodes. A scenario RID must be provided, which is available in the " +"[World] you want to query. This forces an update for all resources queued to " +"update.\n" +"[b]Warning:[/b] This function is primarily intended for editor usage. For in-" +"game use cases, prefer physics collision." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"If [code]true[/code], this directional light will blend between shadow map " +"splits resulting in a smoother transition between them. Equivalent to " +"[member DirectionalLight.directional_shadow_blend_splits]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the shadow depth range mode for this directional light. Equivalent to " +"[member DirectionalLight.directional_shadow_depth_range]. See [enum " +"LightDirectionalShadowDepthRangeMode] for options." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the shadow mode for this directional light. Equivalent to [member " +"DirectionalLight.directional_shadow_mode]. See [enum " +"LightDirectionalShadowMode] for options." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets whether to use vertical or horizontal detail for this omni light. This " +"can be used to alleviate artifacts in the shadow map. Equivalent to [member " +"OmniLight.omni_shadow_detail]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets whether to use a dual paraboloid or a cubemap for the shadow map. Dual " +"paraboloid is faster but may suffer from artifacts. Equivalent to [member " +"OmniLight.omni_shadow_mode]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the bake mode for this light, see [enum LightBakeMode] for options. The " +"bake mode affects how the light will be baked in [BakedLightmap]s and " +"[GIProbe]s." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the color of the light. Equivalent to [member Light.light_color]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the cull mask for this Light. Lights only affect objects in the " +"selected layers. Equivalent to [member Light.light_cull_mask]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"If [code]true[/code], light will subtract light instead of adding light. " +"Equivalent to [member Light.light_negative]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the specified light parameter. See [enum LightParam] for options. " +"Equivalent to [method Light.set_param]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"If [code]true[/code], reverses the backface culling of the mesh. This can be " +"useful when you have a flat mesh that has a light behind it. If you need to " +"cast a shadow on both sides of the mesh, set the mesh to use double sided " +"shadows with [method instance_geometry_set_cast_shadows_setting]. Equivalent " +"to [member Light.shadow_reverse_cull_face]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"If [code]true[/code], light will cast shadows. Equivalent to [member Light." +"shadow_enabled]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the color of the shadow cast by the light. Equivalent to [member Light." +"shadow_color]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets whether GI probes capture light information from this light. " +"[i]Deprecated method.[/i] Use [method light_set_bake_mode] instead. This " +"method is only kept for compatibility reasons and calls [method " +"light_set_bake_mode] internally, setting the bake mode to [constant " +"LIGHT_BAKE_DISABLED] or [constant LIGHT_BAKE_INDIRECT] depending on the " +"given parameter." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Creates a lightmap capture and adds it to the VisualServer. It can be " +"accessed with the RID that is returned. This RID will be used in all " +"[code]lightmap_capture_*[/code] VisualServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"VisualServer's [method free_rid] static method.\n" +"To place in a scene, attach this lightmap capture to an instance using " +"[method instance_set_base] using the returned RID." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the size of the lightmap capture area." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the energy multiplier used by the lightmap capture." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the octree used by the lightmap capture." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Returns the cell subdivision amount used by this lightmap capture's octree." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the cell transform for this lightmap capture's octree." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns [code]true[/code] if capture is in \"interior\" mode." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the size of the area covered by the lightmap capture. Equivalent to " +"[member BakedLightmapData.bounds]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the energy multiplier for this lightmap capture. Equivalent to [member " +"BakedLightmapData.energy]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the \"interior\" mode for this lightmap capture. Equivalent to [member " +"BakedLightmapData.interior]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the octree to be used by this lightmap capture. This function is " +"normally used by the [BakedLightmap] node. Equivalent to [member " +"BakedLightmapData.octree]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the subdivision level of this lightmap capture's octree. Equivalent to " +"[member BakedLightmapData.cell_subdiv]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the octree cell transform for this lightmap capture's octree. " +"Equivalent to [member BakedLightmapData.cell_space_transform]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Returns a mesh of a sphere with the given amount of horizontal and vertical " +"subdivisions." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Creates an empty material and adds it to the VisualServer. It can be " +"accessed with the RID that is returned. This RID will be used in all " +"[code]material_*[/code] VisualServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"VisualServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the value of a certain material's parameter." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Returns the default value for the param if available. Returns [code]null[/" +"code] otherwise." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Returns the shader of a certain material's shader. Returns an empty RID if " +"the material doesn't have a shader." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets a material's line width." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets an object's next material." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets a material's parameter." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets a material's render priority." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets a shader material's shader." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Adds a surface generated from the Arrays to a mesh. See [enum PrimitiveType] " +"constants for types." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Removes all surfaces from a mesh." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Creates a new mesh and adds it to the VisualServer. It can be accessed with " +"the RID that is returned. This RID will be used in all [code]mesh_*[/code] " +"VisualServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"VisualServer's [method free_rid] static method.\n" +"To place in a scene, attach this mesh to an instance using [method " +"instance_set_base] using the returned RID." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns a mesh's blend shape count." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns a mesh's blend shape mode." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns a mesh's custom aabb." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns a mesh's number of surfaces." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Removes a mesh's surface." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets a mesh's blend shape count." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets a mesh's blend shape mode." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets a mesh's custom aabb." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns a mesh's surface's aabb." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns a mesh's surface's vertex buffer." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns a mesh's surface's amount of indices." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns a mesh's surface's amount of vertices." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns a mesh's surface's buffer arrays." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns a mesh's surface's arrays for blend shapes." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the format of a mesh's surface." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Function is unused in Godot 3.x." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns a mesh's surface's index buffer." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns a mesh's surface's material." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the primitive type of a mesh's surface." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the aabb of a mesh's surface's skeleton." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets a mesh's surface's material." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Updates a specific region of a vertex buffer for the specified surface. " +"Warning: this function alters the vertex buffer directly with no safety " +"mechanisms, you can easily corrupt your mesh." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Allocates space for the multimesh data. Format parameters determine how the " +"data will be stored by OpenGL. See [enum MultimeshTransformFormat], [enum " +"MultimeshColorFormat], and [enum MultimeshCustomDataFormat] for usage. " +"Equivalent to [member MultiMesh.instance_count]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Creates a new multimesh on the VisualServer and returns an [RID] handle. " +"This RID will be used in all [code]multimesh_*[/code] VisualServer " +"functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"VisualServer's [method free_rid] static method.\n" +"To place in a scene, attach this multimesh to an instance using [method " +"instance_set_base] using the returned RID." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Calculates and returns the axis-aligned bounding box that encloses all " +"instances within the multimesh." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the number of instances allocated for this multimesh." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Returns the RID of the mesh that will be used in drawing this multimesh." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the number of visible instances for this multimesh." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the color by which the specified instance will be modulated." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the custom data associated with the specified instance." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the [Transform] of the specified instance." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Returns the [Transform2D] of the specified instance. For use when the " +"multimesh is set to use 2D transforms." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the color by which this instance will be modulated. Equivalent to " +"[method MultiMesh.set_instance_color]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the custom data for this instance. Custom data is passed as a [Color], " +"but is interpreted as a [code]vec4[/code] in the shader. Equivalent to " +"[method MultiMesh.set_instance_custom_data]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the [Transform] for this instance. Equivalent to [method MultiMesh." +"set_instance_transform]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the [Transform2D] for this instance. For use when multimesh is used in " +"2D. Equivalent to [method MultiMesh.set_instance_transform_2d]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets all data related to the instances in one go. This is especially useful " +"when loading the data from disk or preparing the data from GDNative.\n" +"\n" +"All data is packed in one large float array. An array may look like this: " +"Transform for instance 1, color data for instance 1, custom data for " +"instance 1, transform for instance 2, color data for instance 2, etc.\n" +"\n" +"[Transform] is stored as 12 floats, [Transform2D] is stored as 8 floats, " +"[code]COLOR_8BIT[/code] / [code]CUSTOM_DATA_8BIT[/code] is stored as 1 float " +"(4 bytes as is) and [code]COLOR_FLOAT[/code] / [code]CUSTOM_DATA_FLOAT[/" +"code] is stored as 4 floats." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the mesh to be drawn by the multimesh. Equivalent to [member MultiMesh." +"mesh]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the number of instances visible at a given time. If -1, all instances " +"that have been allocated are drawn. Equivalent to [member MultiMesh." +"visible_instance_count]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Creates a new omni light and adds it to the VisualServer. It can be accessed " +"with the RID that is returned. This RID can be used in most [code]light_*[/" +"code] VisualServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"VisualServer's [method free_rid] static method.\n" +"To place in a scene, attach this omni light to an instance using [method " +"instance_set_base] using the returned RID." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Creates a particle system and adds it to the VisualServer. It can be " +"accessed with the RID that is returned. This RID will be used in all " +"[code]particles_*[/code] VisualServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"VisualServer's [method free_rid] static method.\n" +"To place in a scene, attach these particles to an instance using [method " +"instance_set_base] using the returned RID." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Calculates and returns the axis-aligned bounding box that contains all the " +"particles. Equivalent to [method Particles.capture_aabb]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns [code]true[/code] if particles are currently set to emitting." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Returns [code]true[/code] if particles are not emitting and particles are " +"set to inactive." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Add particle system to list of particle systems that need to be updated. " +"Update will take place on the next frame, or on the next call to [method " +"instances_cull_aabb], [method instances_cull_convex], or [method " +"instances_cull_ray]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Reset the particles on the next update. Equivalent to [method Particles." +"restart]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the number of particles to be drawn and allocates the memory for them. " +"Equivalent to [member Particles.amount]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets a custom axis-aligned bounding box for the particle system. Equivalent " +"to [member Particles.visibility_aabb]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the draw order of the particles to one of the named enums from [enum " +"ParticlesDrawOrder]. See [enum ParticlesDrawOrder] for options. Equivalent " +"to [member Particles.draw_order]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the mesh to be used for the specified draw pass. Equivalent to [member " +"Particles.draw_pass_1], [member Particles.draw_pass_2], [member Particles." +"draw_pass_3], and [member Particles.draw_pass_4]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the number of draw passes to use. Equivalent to [member Particles." +"draw_passes]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the [Transform] that will be used by the particles when they first emit." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"If [code]true[/code], particles will emit over time. Setting to false does " +"not reset the particles, but only stops their emission. Equivalent to " +"[member Particles.emitting]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the explosiveness ratio. Equivalent to [member Particles.explosiveness]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the frame rate that the particle system rendering will be fixed to. " +"Equivalent to [member Particles.fixed_fps]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"If [code]true[/code], uses fractional delta which smooths the movement of " +"the particles. Equivalent to [member Particles.fract_delta]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the lifetime of each particle in the system. Equivalent to [member " +"Particles.lifetime]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"If [code]true[/code], particles will emit once and then stop. Equivalent to " +"[member Particles.one_shot]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the preprocess time for the particles' animation. This lets you delay " +"starting an animation until after the particles have begun emitting. " +"Equivalent to [member Particles.preprocess]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the material for processing the particles.\n" +"[b]Note:[/b] This is not the material used to draw the materials. Equivalent " +"to [member Particles.process_material]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the emission randomness ratio. This randomizes the emission of " +"particles within their phase. Equivalent to [member Particles.randomness]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the speed scale of the particle system. Equivalent to [member Particles." +"speed_scale]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"If [code]true[/code], particles use local coordinates. If [code]false[/code] " +"they use global coordinates. Equivalent to [member Particles.local_coords]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Creates a reflection probe and adds it to the VisualServer. It can be " +"accessed with the RID that is returned. This RID will be used in all " +"[code]reflection_probe_*[/code] VisualServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"VisualServer's [method free_rid] static method.\n" +"To place in a scene, attach this reflection probe to an instance using " +"[method instance_set_base] using the returned RID." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"If [code]true[/code], reflections will ignore sky contribution. Equivalent " +"to [member ReflectionProbe.interior_enable]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the render cull mask for this reflection probe. Only instances with a " +"matching cull mask will be rendered by this probe. Equivalent to [member " +"ReflectionProbe.cull_mask]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"If [code]true[/code], uses box projection. This can make reflections look " +"more correct in certain situations. Equivalent to [member ReflectionProbe." +"box_projection]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"If [code]true[/code], computes shadows in the reflection probe. This makes " +"the reflection much slower to compute. Equivalent to [member ReflectionProbe." +"enable_shadows]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the size of the area that the reflection probe will capture. Equivalent " +"to [member ReflectionProbe.extents]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the intensity of the reflection probe. Intensity modulates the strength " +"of the reflection. Equivalent to [member ReflectionProbe.intensity]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the ambient light color for this reflection probe when set to interior " +"mode. Equivalent to [member ReflectionProbe.interior_ambient_color]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the energy multiplier for this reflection probes ambient light " +"contribution when set to interior mode. Equivalent to [member " +"ReflectionProbe.interior_ambient_energy]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the contribution value for how much the reflection affects the ambient " +"light for this reflection probe when set to interior mode. Useful so that " +"ambient light matches the color of the room. Equivalent to [member " +"ReflectionProbe.interior_ambient_contrib]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the max distance away from the probe an object can be before it is " +"culled. Equivalent to [member ReflectionProbe.max_distance]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the origin offset to be used when this reflection probe is in box " +"project mode. Equivalent to [member ReflectionProbe.origin_offset]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets how often the reflection probe updates. Can either be once or every " +"frame. See [enum ReflectionProbeUpdateMode] for options." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Schedules a callback to the corresponding named [code]method[/code] on " +"[code]where[/code] after a frame has been drawn.\n" +"The callback method must use only 1 argument which will be called with " +"[code]userdata[/code]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Creates a scenario and adds it to the VisualServer. It can be accessed with " +"the RID that is returned. This RID will be used in all [code]scenario_*[/" +"code] VisualServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"VisualServer's [method free_rid] static method.\n" +"The scenario is the 3D world that all the visual instances exist in." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the [enum ScenarioDebugMode] for this scenario. See [enum " +"ScenarioDebugMode] for options." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the environment that will be used with this scenario." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the fallback environment to be used by this scenario. The fallback " +"environment is used if no environment is set. Internally, this is used by " +"the editor to provide a default environment." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the size of the reflection atlas shared by all reflection probes in " +"this scenario." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets a boot image. The color defines the background color. If [code]scale[/" +"code] is [code]true[/code], the image will be scaled to fit the screen size. " +"If [code]use_filter[/code] is [code]true[/code], the image will be scaled " +"with linear interpolation. If [code]use_filter[/code] is [code]false[/code], " +"the image will be scaled with nearest-neighbor interpolation." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"If [code]true[/code], the engine will generate wireframes for use with the " +"wireframe debug mode." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the default clear color which is used when a specific clear color has " +"not been selected." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"If asynchronous shader compilation is enabled, this controls whether " +"[constant SpatialMaterial.ASYNC_MODE_HIDDEN] is obeyed.\n" +"For instance, you may want to enable this temporarily before taking a " +"screenshot. This ensures everything is visible even if shaders with async " +"mode [i]hidden[/i] are not ready yet.\n" +"Reflection probes use this internally to ensure they capture everything " +"regardless the shaders are ready or not." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the scale to apply to the passage of time for the shaders' [code]TIME[/" +"code] builtin.\n" +"The default value is [code]1.0[/code], which means [code]TIME[/code] will " +"count the real time as it goes by, without narrowing or stretching it." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Enables or disables occlusion culling." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Creates an empty shader and adds it to the VisualServer. It can be accessed " +"with the RID that is returned. This RID will be used in all [code]shader_*[/" +"code] VisualServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"VisualServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns a shader's code." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns a default texture from a shader searched by name." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the parameters of a shader." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets a shader's code." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets a shader's default texture. Overwrites the texture given by name." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Allocates the GPU buffers for this skeleton." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the [Transform] set for a specific bone of this skeleton." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the [Transform2D] set for a specific bone of this skeleton." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the [Transform] for a specific bone of this skeleton." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the [Transform2D] for a specific bone of this skeleton." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Creates a skeleton and adds it to the VisualServer. It can be accessed with " +"the RID that is returned. This RID will be used in all [code]skeleton_*[/" +"code] VisualServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"VisualServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the number of bones allocated for this skeleton." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Creates an empty sky and adds it to the VisualServer. It can be accessed " +"with the RID that is returned. This RID will be used in all [code]sky_*[/" +"code] VisualServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"VisualServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets a sky's texture." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Creates a spot light and adds it to the VisualServer. It can be accessed " +"with the RID that is returned. This RID can be used in most [code]light_*[/" +"code] VisualServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"VisualServer's [method free_rid] static method.\n" +"To place in a scene, attach this spot light to an instance using [method " +"instance_set_base] using the returned RID." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Allocates the GPU memory for the texture." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Binds the texture to a texture slot." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Creates an empty texture and adds it to the VisualServer. It can be accessed " +"with the RID that is returned. This RID will be used in all [code]texture_*[/" +"code] VisualServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"VisualServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Creates a texture, allocates the space for an image, and fills in the image." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns a list of all the textures and their information." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Returns a copy of a texture's image unless it's a CubeMap, in which case it " +"returns the [RID] of the image at one of the cubes sides." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the depth of the texture." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the flags of a texture." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the format of the texture's image." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the texture's height." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the texture's path." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the opengl id of the texture's image." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the type of the texture, can be any of the [enum TextureType]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the texture's width." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the texture's image data. If it's a CubeMap, it sets the image data at " +"a cube side." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets a part of the data for a texture. Warning: this function calls the " +"underlying graphics API directly and may corrupt your texture if used " +"improperly." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the texture's flags. See [enum TextureFlags] for options." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the texture's path." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Creates an update link between two textures, similar to how " +"[ViewportTexture]s operate. When the base texture is the texture of a " +"[Viewport], every time the viewport renders a new frame, the proxy texture " +"automatically receives an update.\n" +"For example, this code links a generic [ImageTexture] to the texture output " +"of the [Viewport] using the VisualServer API:\n" +"[codeblock]\n" +"func _ready():\n" +" var viewport_rid = get_viewport().get_viewport_rid()\n" +" var viewport_texture_rid = VisualServer." +"viewport_get_texture(viewport_rid)\n" +"\n" +" var proxy_texture = ImageTexture.new()\n" +" var viewport_texture_image_data = VisualServer." +"texture_get_data(viewport_texture_rid)\n" +"\n" +" proxy_texture.create_from_image(viewport_texture_image_data)\n" +" var proxy_texture_rid = proxy_texture.get_rid()\n" +" VisualServer.texture_set_proxy(proxy_texture_rid, viewport_texture_rid)\n" +"\n" +" $TextureRect.texture = proxy_texture\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"If [code]true[/code], sets internal processes to shrink all image data to " +"half the size." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"If [code]true[/code], the image will be stored in the texture's images array " +"if overwritten." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets a viewport's camera." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets a viewport's canvas." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Copies viewport to a region of the screen specified by [code]rect[/code]. If " +"[member Viewport.render_direct_to_screen] is [code]true[/code], then " +"viewport does not use a framebuffer and the contents of the viewport are " +"rendered directly to screen. However, note that the root viewport is drawn " +"last, therefore it will draw over the screen. Accordingly, you must set the " +"root viewport to an area that does not cover the area that you have attached " +"this viewport to.\n" +"For example, you can set the root viewport to not render at all with the " +"following code:\n" +"[codeblock]\n" +"func _ready():\n" +" get_viewport().set_attach_to_screen_rect(Rect2())\n" +" $Viewport.set_attach_to_screen_rect(Rect2(0, 0, 600, 600))\n" +"[/codeblock]\n" +"Using this can result in significant optimization, especially on lower-end " +"devices. However, it comes at the cost of having to manage your viewports " +"manually. For further optimization, see [method " +"viewport_set_render_direct_to_screen]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Creates an empty viewport and adds it to the VisualServer. It can be " +"accessed with the RID that is returned. This RID will be used in all " +"[code]viewport_*[/code] VisualServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"VisualServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Detaches the viewport from the screen." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Returns a viewport's render information. For options, see the [enum " +"ViewportRenderInfo] constants." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Returns the viewport's last rendered frame." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Detaches a viewport from a canvas and vice versa." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "If [code]true[/code], sets the viewport active, else sets it inactive." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the stacking order for a viewport's canvas.\n" +"[code]layer[/code] is the actual canvas layer, while [code]sublayer[/code] " +"specifies the stacking order of the canvas among those in the same layer." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the transformation of a viewport's canvas." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the clear mode of a viewport. See [enum ViewportClearMode] for options." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the debug draw mode of a viewport. See [enum ViewportDebugDraw] for " +"options." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "If [code]true[/code], a viewport's 3D rendering is disabled." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"If [code]true[/code], rendering of a viewport's environment is disabled." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the viewport's global transformation matrix." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"If [code]true[/code], the viewport renders to high dynamic range (HDR) " +"instead of standard dynamic range (SDR). See also [method " +"viewport_set_use_32_bpc_depth].\n" +"[b]Note:[/b] Only available on the GLES3 backend." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "If [code]true[/code], the viewport's canvas is not rendered." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Currently unimplemented in Godot 3.x." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the anti-aliasing mode. See [enum ViewportMSAA] for options." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the viewport's parent to another viewport." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"If [code]true[/code], render the contents of the viewport directly to " +"screen. This allows a low-level optimization where you can skip drawing a " +"viewport to the root viewport. While this optimization can result in a " +"significant increase in speed (especially on older devices), it comes at a " +"cost of usability. When this is enabled, you cannot read from the viewport " +"or from the [code]SCREEN_TEXTURE[/code]. You also lose the benefit of " +"certain window settings, such as the various stretch modes. Another " +"consequence to be aware of is that in 2D the rendering happens in window " +"coordinates, so if you have a viewport that is double the size of the " +"window, and you set this, then only the portion that fits within the window " +"will be drawn, no automatic scaling is possible, even if your game scene is " +"significantly larger than the window size." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets a viewport's scenario.\n" +"The scenario contains information about the [enum ScenarioDebugMode], " +"environment information, reflection atlas etc." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the shadow atlas quadrant's subdivision." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the size of the shadow atlas's images (used for omni and spot lights). " +"The value will be rounded up to the nearest power of 2." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the sharpening [code]intensity[/code] for the [code]viewport[/code]. If " +"set to a value greater than [code]0.0[/code], contrast-adaptive sharpening " +"will be applied to the 3D viewport. This has a low performance cost and can " +"be used to recover some of the sharpness lost from using FXAA. Values around " +"[code]0.5[/code] generally give the best results. See also [method " +"viewport_set_use_fxaa]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sets the viewport's width and height." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"If [code]true[/code], the viewport renders its background as transparent." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets when the viewport should be updated. See [enum ViewportUpdateMode] " +"constants for options." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Sets the viewport's 2D/3D mode. See [enum ViewportUsage] constants for " +"options." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"If [code]true[/code], allocates the viewport's framebuffer with full " +"floating-point precision (32-bit) instead of half floating-point precision " +"(16-bit). Only effective if [method viewport_set_use_32_bpc_depth] is used " +"on the same [Viewport] to set HDR to [code]true[/code].\n" +"[b]Note:[/b] Only available on the GLES3 backend." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"If [code]true[/code], the viewport uses augmented or virtual reality " +"technologies. See [ARVRInterface]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"If [code]true[/code], uses a fast post-processing filter to make banding " +"significantly less visible. In some cases, debanding may introduce a " +"slightly noticeable dithering pattern. It's recommended to enable debanding " +"only when actually needed since the dithering pattern will make lossless-" +"compressed screenshots larger.\n" +"[b]Note:[/b] Only available on the GLES3 backend. [member Viewport.hdr] must " +"also be [code]true[/code] for debanding to be effective." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Enables fast approximate antialiasing for this viewport. FXAA is a popular " +"screen-space antialiasing method, which is fast but will make the image look " +"blurry, especially at lower resolutions. It can still work relatively well " +"at large resolutions such as 1440p and 4K. Some of the lost sharpness can be " +"recovered by enabling contrast-adaptive sharpening (see [method " +"viewport_set_sharpen_intensity])." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "If [code]true[/code], the viewport's rendering is flipped vertically." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"If [code]false[/code], disables rendering completely, but the engine logic " +"is still being processed. You can call [method force_draw] to draw a frame " +"even with rendering disabled." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Emitted at the end of the frame, after the VisualServer has finished " +"updating all the Viewports." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Emitted at the beginning of the frame, before the VisualServer updates all " +"the Viewports." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Marks an error that shows that the index array is empty." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Number of weights/bones per vertex." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The minimum Z-layer for canvas items." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The maximum Z-layer for canvas items." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Max number of glow levels that can be used with glow post-process effect." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Unused enum in Godot 3.x." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The minimum renderpriority of all materials." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The maximum renderpriority of all materials." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Marks the left side of a cubemap." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Marks the right side of a cubemap." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Marks the bottom side of a cubemap." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Marks the top side of a cubemap." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Marks the front side of a cubemap." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Marks the back side of a cubemap." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Normal texture with 2 dimensions, width and height." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Texture made up of six faces, can be looked up with a [code]vec3[/code] in " +"shader." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "An array of 2-dimensional textures." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "A 3-dimensional texture with width, height, and depth." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Repeats the texture (instead of clamp to edge)." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Repeats the texture with alternate sections mirrored." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Default flags. [constant TEXTURE_FLAG_MIPMAPS], [constant " +"TEXTURE_FLAG_REPEAT] and [constant TEXTURE_FLAG_FILTER] are enabled." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Shader is a 3D shader." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Shader is a 2D shader." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Shader is a particle shader." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Represents the size of the [enum ShaderMode] enum." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Array is a vertex array." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Array is a normal array." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Array is a tangent array." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Array is a color array." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Array is an UV coordinates array." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Array is an UV coordinates array for the second UV coordinates." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Array contains bone information." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Array is weight information." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Array is index array." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Flag used to mark a vertex array." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Flag used to mark a normal array." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Flag used to mark a tangent array." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Flag used to mark a color array." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Flag used to mark an UV coordinates array." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Flag used to mark an UV coordinates array for the second UV coordinates." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Flag used to mark a bone information array." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Flag used to mark a weights array." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Flag used to mark an index array." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " +"ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " +"ARRAY_COMPRESS_TEX_UV], [constant ARRAY_COMPRESS_TEX_UV2], [constant " +"ARRAY_COMPRESS_WEIGHTS], and [constant " +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Primitive to draw consists of points." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Primitive to draw consists of lines." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Primitive to draw consists of a line strip from start to end." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Primitive to draw consists of a line loop (a line strip with a line between " +"the last and the first vertex)." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Primitive to draw consists of triangles." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Primitive to draw consists of a triangle strip (the last 3 vertices are " +"always combined to make a triangle)." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Primitive to draw consists of a triangle strip (the last 2 vertices are " +"always combined with the first to make a triangle)." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Represents the size of the [enum PrimitiveType] enum." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Is a directional (sun) light." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Is an omni light." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Is a spot light." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The light's energy." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Secondary multiplier used with indirect light (light bounces)." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"The light's size, currently only used for soft shadows in baked lightmaps." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The light's influence on specularity." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The light's range." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The light's attenuation." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The spotlight's angle." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The spotlight's attenuation." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Scales the shadow color." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Max distance that shadows will be rendered." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Proportion of shadow atlas occupied by the first split." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Proportion of shadow atlas occupied by the second split." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Proportion of shadow atlas occupied by the third split. The fourth split " +"occupies the rest." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Normal bias used to offset shadow lookup by object normal. Can be used to " +"fix self-shadowing artifacts." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Bias the shadow lookup to fix self-shadowing artifacts." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Increases bias on further splits to fix self-shadowing that only occurs far " +"away from the camera." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Represents the size of the [enum LightParam] enum." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Use a dual paraboloid shadow map for omni lights." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Use a cubemap shadow map for omni lights. Slower but better quality than " +"dual paraboloid." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Use more detail vertically when computing shadow map." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Use more detail horizontally when computing shadow map." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Use orthogonal shadow projection for directional light." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Use 2 splits for shadow projection when using directional light." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Use 4 splits for shadow projection when using directional light." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Keeps shadows stable as camera moves but has lower effective resolution." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Optimize use of shadow maps, increasing the effective resolution. But may " +"result in shadows moving or flickering slightly." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Do not update the viewport." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Update the viewport once then set to disabled." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Update the viewport whenever it is visible." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Always update the viewport." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The viewport is always cleared before drawing." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The viewport is never cleared before drawing." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"The viewport is cleared once, then the clear mode is set to [constant " +"VIEWPORT_CLEAR_NEVER]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Multisample antialiasing is disabled." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Multisample antialiasing is set to 2×." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Multisample antialiasing is set to 4×." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Multisample antialiasing is set to 8×." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Multisample antialiasing is set to 16×." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Multisample antialiasing is set to 2× on external texture. Special mode for " +"GLES2 Android VR (Oculus Quest and Go)." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Multisample antialiasing is set to 4× on external texture. Special mode for " +"GLES2 Android VR (Oculus Quest and Go)." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The Viewport does not render 3D but samples." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The Viewport does not render 3D and does not sample." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The Viewport renders 3D with effects." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The Viewport renders 3D but without effects." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Number of objects drawn in a single frame." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Number of vertices drawn in a single frame." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Number of material changes during this frame." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Number of shader changes during this frame." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Number of surface changes during this frame." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Number of draw calls during this frame." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Number of 2d items drawn this frame." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Number of 2d draw calls during this frame." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Represents the size of the [enum ViewportRenderInfo] enum." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Debug draw is disabled. Default setting." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Debug draw sets objects to unshaded." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Overwrites clear color to [code](0,0,0,0)[/code]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Debug draw draws objects in wireframe." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Do not use a debug mode." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Draw all objects as wireframe models." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Draw all objects in a way that displays how much overdraw is occurring. " +"Overdraw occurs when a section of pixels is drawn and shaded and then " +"another object covers it up. To optimize a scene, you should reduce overdraw." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Draw all objects without shading. Equivalent to setting all objects shaders " +"to [code]unshaded[/code]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The instance does not have a type." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The instance is a mesh." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The instance is a multimesh." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The instance is an immediate geometry." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The instance is a particle emitter." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The instance is a light." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The instance is a reflection probe." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The instance is a GI probe." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The instance is a lightmap capture." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Represents the size of the [enum InstanceType] enum." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"A combination of the flags of geometry instances (mesh, multimesh, immediate " +"and particles)." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Allows the instance to be used in baked lighting." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "When set, manually requests to draw geometry on next frame." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Represents the size of the [enum InstanceFlags] enum." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Disable shadows from this instance." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Cast shadows from this instance." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Disable backface culling when rendering the shadow of the object. This is " +"slightly slower but may result in more correct shadows." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Only render the shadows from the object. The object itself will not be drawn." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The nine patch gets stretched where needed." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The nine patch gets filled with tiles where needed." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"The nine patch gets filled with tiles where needed and stretches them a bit " +"if needed." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Adds light color additive to the canvas." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Adds light color subtractive to the canvas." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The light adds color depending on transparency." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The light adds color depending on mask." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Do not apply a filter to canvas light shadows." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Use PCF3 filtering to filter canvas light shadows." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Use PCF5 filtering to filter canvas light shadows." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Use PCF7 filtering to filter canvas light shadows." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Use PCF9 filtering to filter canvas light shadows." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Use PCF13 filtering to filter canvas light shadows." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Culling of the canvas occluder is disabled." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Culling of the canvas occluder is clockwise." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Culling of the canvas occluder is counterclockwise." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The amount of objects in the frame." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The amount of vertices in the frame." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The amount of modified materials in the frame." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The amount of shader rebinds in the frame." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"The peak amount of shaders that have been under compilation in the frame.\n" +"This is useful to know when asynchronous shader compilation has finished for " +"the current shaders on screen.\n" +"[b]Note:[/b] For complete certainty, only assume there are no outstanding " +"compilations when this value is zero for at least two frames in a row.\n" +"Unimplemented in the GLES2 rendering backend, always returns 0." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The amount of surface changes in the frame." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The amount of draw calls in frame." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The amount of 2d items in the frame." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "The amount of 2d draw calls in frame." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Hardware supports shaders. This enum is currently unused in Godot 3.x." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Hardware supports multithreading. This enum is currently unused in Godot 3.x." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Use [Transform2D] to store MultiMesh transform." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Use [Transform] to store MultiMesh transform." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "MultiMesh does not use per-instance color." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"MultiMesh color uses 8 bits per component. This packs the color into a " +"single float." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "MultiMesh color uses a float per channel." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "MultiMesh does not use custom data." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"MultiMesh custom data uses 8 bits per component. This packs the 4-component " +"custom data into a single float." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "MultiMesh custom data uses a float per component." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Reflection probe will update reflections once and then stop." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Reflection probe will update each frame. This mode is necessary to capture " +"moving objects." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Draw particles in the order that they appear in the particles array." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sort particles based on their lifetime." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Sort particles based on their distance to the camera." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Use the clear color as background." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Use a specified color as the background." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Use a sky resource for the background." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Use a custom color for background, but use a sky for shading and reflections." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Use a specified canvas layer as the background. This can be useful for " +"instantiating a 2D scene in a 3D world." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Do not clear the background, use whatever was rendered last frame as the " +"background." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Represents the size of the [enum EnvironmentBG] enum." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Use lowest blur quality. Fastest, but may look bad." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Use medium blur quality." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Used highest blur quality. Looks the best, but is the slowest." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Add the effect of the glow on top of the scene." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Blends the glow effect with the screen. Does not get as bright as additive." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Produces a subtle color disturbance around objects." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Shows the glow effect by itself without the underlying scene." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Output color as they came in. This can cause bright lighting to look blown " +"out, with noticeable clipping in the output colors." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Use the Reinhard tonemapper. Performs a variation on rendered pixels' colors " +"by this formula: [code]color = color / (1 + color)[/code]. This avoids " +"clipping bright highlights, but the resulting image can look a bit dull." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Use the filmic tonemapper. This avoids clipping bright highlights, with a " +"resulting image that usually looks more vivid than [constant " +"ENV_TONE_MAPPER_REINHARD]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Use the legacy Godot version of the Academy Color Encoding System " +"tonemapper. Unlike [constant ENV_TONE_MAPPER_ACES_FITTED], this version of " +"ACES does not handle bright lighting in a physically accurate way. ACES " +"typically has a more contrasted output compared to [constant " +"ENV_TONE_MAPPER_REINHARD] and [constant ENV_TONE_MAPPER_FILMIC].\n" +"[b]Note:[/b] This tonemapping operator will be removed in Godot 4.0 in favor " +"of the more accurate [constant ENV_TONE_MAPPER_ACES_FITTED]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Use the Academy Color Encoding System tonemapper. ACES is slightly more " +"expensive than other options, but it handles bright lighting in a more " +"realistic fashion by desaturating it as it becomes brighter. ACES typically " +"has a more contrasted output compared to [constant ENV_TONE_MAPPER_REINHARD] " +"and [constant ENV_TONE_MAPPER_FILMIC]." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Lowest quality of screen space ambient occlusion." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Medium quality screen space ambient occlusion." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Highest quality screen space ambient occlusion." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Disables the blur set for SSAO. Will make SSAO look noisier." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Perform a 1x1 blur on the SSAO output." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Performs a 2x2 blur on the SSAO output." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Performs a 3x3 blur on the SSAO output. Use this for smoothest SSAO." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Used to query for any changes that request a redraw, whatever the priority." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "" +"Registered changes which have low priority can be optionally prevented from " +"causing editor redraws. Examples might include dynamic shaders (typically " +"using the [code]TIME[/code] built-in)." +msgstr "" + +#: doc/classes/VisualServer.xml +msgid "Registered changes which can cause a redraw default to high priority." +msgstr "" + +#: doc/classes/VisualShader.xml +msgid "A custom shader program with a visual editor." +msgstr "" + +#: doc/classes/VisualShader.xml +msgid "" +"This class allows you to define a custom shader program that can be used for " +"various materials to render objects.\n" +"The visual shader editor creates the shader." +msgstr "" + +#: doc/classes/VisualShader.xml +msgid "Adds the specified node to the shader." +msgstr "" + +#: doc/classes/VisualShader.xml +msgid "" +"Returns [code]true[/code] if the specified nodes and ports can be connected " +"together." +msgstr "" + +#: doc/classes/VisualShader.xml +msgid "Connects the specified nodes and ports." +msgstr "" + +#: doc/classes/VisualShader.xml +msgid "" +"Connects the specified nodes and ports, even if they can't be connected. " +"Such connection is invalid and will not function properly." +msgstr "" + +#: doc/classes/VisualShader.xml +msgid "" +"Returns the shader node instance with specified [code]type[/code] and " +"[code]id[/code]." +msgstr "" + +#: doc/classes/VisualShader.xml +msgid "Returns the list of connected nodes with the specified type." +msgstr "" + +#: doc/classes/VisualShader.xml +msgid "Returns the list of all nodes in the shader with the specified type." +msgstr "" + +#: doc/classes/VisualShader.xml +msgid "Returns the position of the specified node within the shader graph." +msgstr "" + +#: doc/classes/VisualShader.xml +msgid "" +"Returns [code]true[/code] if the specified node and port connection exist." +msgstr "" + +#: doc/classes/VisualShader.xml +msgid "Removes the specified node from the shader." +msgstr "" + +#: doc/classes/VisualShader.xml +msgid "Sets the mode of this shader." +msgstr "" + +#: doc/classes/VisualShader.xml +msgid "Sets the position of the specified node." +msgstr "" + +#: doc/classes/VisualShader.xml +msgid "The offset vector of the whole graph." +msgstr "" + +#: doc/classes/VisualShader.xml +msgid "A vertex shader, operating on vertices." +msgstr "" + +#: doc/classes/VisualShader.xml +msgid "A fragment shader, operating on fragments (pixels)." +msgstr "" + +#: doc/classes/VisualShader.xml +msgid "A shader for light calculations." +msgstr "" + +#: doc/classes/VisualShader.xml +msgid "Represents the size of the [enum Type] enum." +msgstr "" + +#: doc/classes/VisualShaderNode.xml +msgid "Base class for nodes in a visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNode.xml +msgid "" +"Visual shader graphs consist of various nodes. Each node in the graph is a " +"separate object and they are represented as a rectangular boxes with title " +"and a set of properties. Each node has also connection ports that allow to " +"connect it to another nodes and control the flow of the shader." +msgstr "" + +#: doc/classes/VisualShaderNode.xml +msgid "" +"Returns an [Array] containing default values for all of the input ports of " +"the node in the form [code][index0, value0, index1, value1, ...][/code]." +msgstr "" + +#: doc/classes/VisualShaderNode.xml +msgid "Returns the default value of the input [code]port[/code]." +msgstr "" + +#: doc/classes/VisualShaderNode.xml +msgid "" +"Sets the default input ports values using an [Array] of the form [code]" +"[index0, value0, index1, value1, ...][/code]. For example: [code][0, " +"Vector3(0, 0, 0), 1, Vector3(0, 0, 0)][/code]." +msgstr "" + +#: doc/classes/VisualShaderNode.xml +msgid "Sets the default value for the selected input [code]port[/code]." +msgstr "" + +#: doc/classes/VisualShaderNode.xml +msgid "" +"Sets the output port index which will be showed for preview. If set to " +"[code]-1[/code] no port will be open for preview." +msgstr "" + +#: doc/classes/VisualShaderNode.xml +msgid "" +"Emitted when the node requests an editor refresh. Currently called only in " +"setter of [member VisualShaderNodeTexture.source], " +"[VisualShaderNodeTexture], and [VisualShaderNodeCubeMap] (and their " +"derivatives)." +msgstr "" + +#: doc/classes/VisualShaderNode.xml +msgid "" +"Floating-point scalar. Translated to [code]float[/code] type in shader code." +msgstr "" + +#: doc/classes/VisualShaderNode.xml +msgid "" +"3D vector of floating-point values. Translated to [code]vec3[/code] type in " +"shader code." +msgstr "" + +#: doc/classes/VisualShaderNode.xml +msgid "Boolean type. Translated to [code]bool[/code] type in shader code." +msgstr "" + +#: doc/classes/VisualShaderNode.xml +msgid "Transform type. Translated to [code]mat4[/code] type in shader code." +msgstr "" + +#: doc/classes/VisualShaderNode.xml +msgid "" +"Sampler type. Translated to reference of sampler uniform in shader code. Can " +"only be used for input ports in non-uniform nodes." +msgstr "" + +#: doc/classes/VisualShaderNode.xml +msgid "Represents the size of the [enum PortType] enum." +msgstr "" + +#: doc/classes/VisualShaderNodeBooleanConstant.xml +msgid "A boolean constant to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeBooleanConstant.xml +msgid "" +"Has only one output port and no inputs.\n" +"Translated to [code]bool[/code] in the shader language." +msgstr "" + +#: doc/classes/VisualShaderNodeBooleanConstant.xml +msgid "A boolean constant which represents a state of this node." +msgstr "" + +#: doc/classes/VisualShaderNodeBooleanUniform.xml +msgid "A boolean uniform to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeBooleanUniform.xml +msgid "Translated to [code]uniform bool[/code] in the shader language." +msgstr "" + +#: doc/classes/VisualShaderNodeBooleanUniform.xml +#: doc/classes/VisualShaderNodeColorUniform.xml +#: doc/classes/VisualShaderNodeScalarUniform.xml +#: doc/classes/VisualShaderNodeTransformUniform.xml +#: doc/classes/VisualShaderNodeVec3Uniform.xml +msgid "A default value to be assigned within the shader." +msgstr "" + +#: doc/classes/VisualShaderNodeBooleanUniform.xml +#: doc/classes/VisualShaderNodeColorUniform.xml +#: doc/classes/VisualShaderNodeScalarUniform.xml +#: doc/classes/VisualShaderNodeTransformUniform.xml +#: doc/classes/VisualShaderNodeVec3Uniform.xml +msgid "Enables usage of the [member default_value]." +msgstr "" + +#: doc/classes/VisualShaderNodeColorConstant.xml +msgid "A [Color] constant to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeColorConstant.xml +msgid "" +"Has two output ports representing RGB and alpha channels of [Color].\n" +"Translated to [code]vec3 rgb[/code] and [code]float alpha[/code] in the " +"shader language." +msgstr "" + +#: doc/classes/VisualShaderNodeColorConstant.xml +msgid "A [Color] constant which represents a state of this node." +msgstr "" + +#: doc/classes/VisualShaderNodeColorFunc.xml +msgid "A [Color] function to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeColorFunc.xml +msgid "" +"Accept a [Color] to the input port and transform it according to [member " +"function]." +msgstr "" + +#: doc/classes/VisualShaderNodeColorFunc.xml +msgid "" +"A function to be applied to the input color. See [enum Function] for options." +msgstr "" + +#: doc/classes/VisualShaderNodeColorFunc.xml +msgid "" +"Converts the color to grayscale using the following formula:\n" +"[codeblock]\n" +"vec3 c = input;\n" +"float max1 = max(c.r, c.g);\n" +"float max2 = max(max1, c.b);\n" +"float max3 = max(max1, max2);\n" +"return vec3(max3, max3, max3);\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/VisualShaderNodeColorFunc.xml +msgid "" +"Applies sepia tone effect using the following formula:\n" +"[codeblock]\n" +"vec3 c = input;\n" +"float r = (c.r * 0.393) + (c.g * 0.769) + (c.b * 0.189);\n" +"float g = (c.r * 0.349) + (c.g * 0.686) + (c.b * 0.168);\n" +"float b = (c.r * 0.272) + (c.g * 0.534) + (c.b * 0.131);\n" +"return vec3(r, g, b);\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/VisualShaderNodeColorOp.xml +msgid "A [Color] operator to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeColorOp.xml +msgid "Applies [member operator] to two color inputs." +msgstr "" + +#: doc/classes/VisualShaderNodeColorOp.xml +msgid "" +"An operator to be applied to the inputs. See [enum Operator] for options." +msgstr "" + +#: doc/classes/VisualShaderNodeColorOp.xml +msgid "" +"Produce a screen effect with the following formula:\n" +"[codeblock]\n" +"result = vec3(1.0) - (vec3(1.0) - a) * (vec3(1.0) - b);\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/VisualShaderNodeColorOp.xml +msgid "" +"Produce a difference effect with the following formula:\n" +"[codeblock]\n" +"result = abs(a - b);\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/VisualShaderNodeColorOp.xml +msgid "" +"Produce a darken effect with the following formula:\n" +"[codeblock]\n" +"result = min(a, b);\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/VisualShaderNodeColorOp.xml +msgid "" +"Produce a lighten effect with the following formula:\n" +"[codeblock]\n" +"result = max(a, b);\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/VisualShaderNodeColorOp.xml +msgid "" +"Produce an overlay effect with the following formula:\n" +"[codeblock]\n" +"for (int i = 0; i < 3; i++) {\n" +" float base = a[i];\n" +" float blend = b[i];\n" +" if (base < 0.5) {\n" +" result[i] = 2.0 * base * blend;\n" +" } else {\n" +" result[i] = 1.0 - 2.0 * (1.0 - blend) * (1.0 - base);\n" +" }\n" +"}\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/VisualShaderNodeColorOp.xml +msgid "" +"Produce a dodge effect with the following formula:\n" +"[codeblock]\n" +"result = a / (vec3(1.0) - b);\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/VisualShaderNodeColorOp.xml +msgid "" +"Produce a burn effect with the following formula:\n" +"[codeblock]\n" +"result = vec3(1.0) - (vec3(1.0) - a) / b;\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/VisualShaderNodeColorOp.xml +msgid "" +"Produce a soft light effect with the following formula:\n" +"[codeblock]\n" +"for (int i = 0; i < 3; i++) {\n" +" float base = a[i];\n" +" float blend = b[i];\n" +" if (base < 0.5) {\n" +" result[i] = base * (blend + 0.5);\n" +" } else {\n" +" result[i] = 1.0 - (1.0 - base) * (1.0 - (blend - 0.5));\n" +" }\n" +"}\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/VisualShaderNodeColorOp.xml +msgid "" +"Produce a hard light effect with the following formula:\n" +"[codeblock]\n" +"for (int i = 0; i < 3; i++) {\n" +" float base = a[i];\n" +" float blend = b[i];\n" +" if (base < 0.5) {\n" +" result[i] = base * (2.0 * blend);\n" +" } else {\n" +" result[i] = 1.0 - (1.0 - base) * (1.0 - 2.0 * (blend - 0.5));\n" +" }\n" +"}\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/VisualShaderNodeColorUniform.xml +msgid "A [Color] uniform to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeColorUniform.xml +msgid "Translated to [code]uniform vec4[/code] in the shader language." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml +msgid "A comparison function for common types within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml +msgid "" +"Compares [code]a[/code] and [code]b[/code] of [member type] by [member " +"function]. Returns a boolean scalar. Translates to [code]if[/code] " +"instruction in shader code." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml +msgid "" +"Extra condition which is applied if [member type] is set to [constant " +"CTYPE_VECTOR]." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml +msgid "A comparison function. See [enum Function] for options." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml +msgid "" +"The type to be used in the comparison. See [enum ComparisonType] for options." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml +msgid "A floating-point scalar." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml +msgid "A 3D vector type." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml +msgid "A boolean type." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml +msgid "A transform ([code]mat4[/code]) type." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml +msgid "Comparison for equality ([code]a == b[/code])." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml +msgid "Comparison for inequality ([code]a != b[/code])." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml +msgid "" +"Comparison for greater than ([code]a > b[/code]). Cannot be used if [member " +"type] set to [constant CTYPE_BOOLEAN] or [constant CTYPE_TRANSFORM]." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml +msgid "" +"Comparison for greater than or equal ([code]a >= b[/code]). Cannot be used " +"if [member type] set to [constant CTYPE_BOOLEAN] or [constant " +"CTYPE_TRANSFORM]." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml +msgid "" +"Comparison for less than ([code]a < b[/code]). Cannot be used if [member " +"type] set to [constant CTYPE_BOOLEAN] or [constant CTYPE_TRANSFORM]." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml +msgid "" +"Comparison for less than or equal ([code]a < b[/code]). Cannot be used if " +"[member type] set to [constant CTYPE_BOOLEAN] or [constant CTYPE_TRANSFORM]." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml +msgid "" +"The result will be true if all of component in vector satisfy the comparison " +"condition." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml +msgid "" +"The result will be true if any of component in vector satisfy the comparison " +"condition." +msgstr "" + +#: doc/classes/VisualShaderNodeCubeMap.xml +msgid "A [CubeMap] sampling node to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeCubeMap.xml +msgid "" +"Translated to [code]texture(cubemap, vec3)[/code] in the shader language. " +"Returns a color vector and alpha channel as scalar." +msgstr "" + +#: doc/classes/VisualShaderNodeCubeMap.xml +msgid "" +"The [CubeMap] texture to sample when using [constant SOURCE_TEXTURE] as " +"[member source]." +msgstr "" + +#: doc/classes/VisualShaderNodeCubeMap.xml +msgid "" +"Defines which source should be used for the sampling. See [enum Source] for " +"options." +msgstr "" + +#: doc/classes/VisualShaderNodeCubeMap.xml +#: doc/classes/VisualShaderNodeTextureUniform.xml +msgid "" +"Defines the type of data provided by the source texture. See [enum " +"TextureType] for options." +msgstr "" + +#: doc/classes/VisualShaderNodeCubeMap.xml +msgid "" +"Use the [CubeMap] set via [member cube_map]. If this is set to [member " +"source], the [code]samplerCube[/code] port is ignored." +msgstr "" + +#: doc/classes/VisualShaderNodeCubeMap.xml +msgid "" +"Use the [CubeMap] sampler reference passed via the [code]samplerCube[/code] " +"port. If this is set to [member source], the [member cube_map] texture is " +"ignored." +msgstr "" + +#: doc/classes/VisualShaderNodeCubeMap.xml +#: doc/classes/VisualShaderNodeTexture.xml +#: doc/classes/VisualShaderNodeTextureUniform.xml +msgid "No hints are added to the uniform declaration." +msgstr "" + +#: doc/classes/VisualShaderNodeCubeMap.xml +#: doc/classes/VisualShaderNodeTexture.xml +#: doc/classes/VisualShaderNodeTextureUniform.xml +msgid "" +"Adds [code]hint_albedo[/code] as hint to the uniform declaration for proper " +"sRGB to linear conversion." +msgstr "" + +#: doc/classes/VisualShaderNodeCubeMap.xml +#: doc/classes/VisualShaderNodeTexture.xml +#: doc/classes/VisualShaderNodeTextureUniform.xml +msgid "" +"Adds [code]hint_normal[/code] as hint to the uniform declaration, which " +"internally converts the texture for proper usage as normal map." +msgstr "" + +#: doc/classes/VisualShaderNodeCubeMapUniform.xml +msgid "A [CubeMap] uniform node to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeCubeMapUniform.xml +msgid "" +"Translated to [code]uniform samplerCube[/code] in the shader language. The " +"output value can be used as port for [VisualShaderNodeCubeMap]." +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml +msgid "" +"Virtual class to define custom [VisualShaderNode]s for use in the Visual " +"Shader Editor." +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml +msgid "" +"By inheriting this class you can create a custom [VisualShader] script addon " +"which will be automatically added to the Visual Shader Editor. The " +"[VisualShaderNode]'s behavior is defined by overriding the provided virtual " +"methods.\n" +"In order for the node to be registered as an editor addon, you must use the " +"[code]tool[/code] keyword and provide a [code]class_name[/code] for your " +"custom script. For example:\n" +"[codeblock]\n" +"tool\n" +"extends VisualShaderNodeCustom\n" +"class_name VisualShaderNodeNoise\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml +msgid "" +"Override this method to define the category of the associated custom node in " +"the Visual Shader Editor's members dialog. The path may look like " +"[code]\"MyGame/MyFunctions/Noise\"[/code].\n" +"Defining this method is [b]optional[/b]. If not overridden, the node will be " +"filed under the \"Custom\" category." +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml +msgid "" +"Override this method to define the actual shader code of the associated " +"custom node. The shader code should be returned as a string, which can have " +"multiple lines (the [code]\"\"\"[/code] multiline string construct can be " +"used for convenience).\n" +"The [code]input_vars[/code] and [code]output_vars[/code] arrays contain the " +"string names of the various input and output variables, as defined by " +"[code]_get_input_*[/code] and [code]_get_output_*[/code] virtual methods in " +"this class.\n" +"The output ports can be assigned values in the shader code. For example, " +"[code]return output_vars[0] + \" = \" + input_vars[0] + \";\"[/code].\n" +"You can customize the generated code based on the shader [code]mode[/code] " +"(see [enum Shader.Mode]) and/or [code]type[/code] (see [enum VisualShader." +"Type]).\n" +"Defining this method is [b]required[/b]." +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml +msgid "" +"Override this method to define the description of the associated custom node " +"in the Visual Shader Editor's members dialog.\n" +"Defining this method is [b]optional[/b]." +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml +msgid "" +"Override this method to add shader code on top of the global shader, to " +"define your own standard library of reusable methods, varyings, constants, " +"uniforms, etc. The shader code should be returned as a string, which can " +"have multiple lines (the [code]\"\"\"[/code] multiline string construct can " +"be used for convenience).\n" +"Be careful with this functionality as it can cause name conflicts with other " +"custom nodes, so be sure to give the defined entities unique names.\n" +"You can customize the generated code based on the shader [code]mode[/code] " +"(see [enum Shader.Mode]).\n" +"Defining this method is [b]optional[/b]." +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml +msgid "" +"Override this method to define the amount of input ports of the associated " +"custom node.\n" +"Defining this method is [b]required[/b]. If not overridden, the node has no " +"input ports." +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml +msgid "" +"Override this method to define the names of input ports of the associated " +"custom node. The names are used both for the input slots in the editor and " +"as identifiers in the shader code, and are passed in the [code]input_vars[/" +"code] array in [method _get_code].\n" +"Defining this method is [b]optional[/b], but recommended. If not overridden, " +"input ports are named as [code]\"in\" + str(port)[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml +msgid "" +"Override this method to define the returned type of each input port of the " +"associated custom node (see [enum VisualShaderNode.PortType] for possible " +"types).\n" +"Defining this method is [b]optional[/b], but recommended. If not overridden, " +"input ports will return the [constant VisualShaderNode.PORT_TYPE_SCALAR] " +"type." +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml +msgid "" +"Override this method to define the name of the associated custom node in the " +"Visual Shader Editor's members dialog and graph.\n" +"Defining this method is [b]optional[/b], but recommended. If not overridden, " +"the node will be named as \"Unnamed\"." +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml +msgid "" +"Override this method to define the amount of output ports of the associated " +"custom node.\n" +"Defining this method is [b]required[/b]. If not overridden, the node has no " +"output ports." +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml +msgid "" +"Override this method to define the names of output ports of the associated " +"custom node. The names are used both for the output slots in the editor and " +"as identifiers in the shader code, and are passed in the [code]output_vars[/" +"code] array in [method _get_code].\n" +"Defining this method is [b]optional[/b], but recommended. If not overridden, " +"output ports are named as [code]\"out\" + str(port)[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml +msgid "" +"Override this method to define the returned type of each output port of the " +"associated custom node (see [enum VisualShaderNode.PortType] for possible " +"types).\n" +"Defining this method is [b]optional[/b], but recommended. If not overridden, " +"output ports will return the [constant VisualShaderNode.PORT_TYPE_SCALAR] " +"type." +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml +msgid "" +"Override this method to define the return icon of the associated custom node " +"in the Visual Shader Editor's members dialog.\n" +"Defining this method is [b]optional[/b]. If not overridden, no return icon " +"is shown." +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml +msgid "" +"Override this method to define the subcategory of the associated custom node " +"in the Visual Shader Editor's members dialog.\n" +"Defining this method is [b]optional[/b]. If not overridden, the node will be " +"filed under the root of the main category (see [method _get_category])." +msgstr "" + +#: doc/classes/VisualShaderNodeDeterminant.xml +msgid "" +"Calculates the determinant of a [Transform] within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeDeterminant.xml +msgid "Translates to [code]determinant(x)[/code] in the shader language." +msgstr "" + +#: doc/classes/VisualShaderNodeDotProduct.xml +msgid "Calculates a dot product of two vectors within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeDotProduct.xml +msgid "Translates to [code]dot(a, b)[/code] in the shader language." +msgstr "" + +#: doc/classes/VisualShaderNodeExpression.xml +msgid "" +"A custom visual shader graph expression written in Godot Shading Language." +msgstr "" + +#: doc/classes/VisualShaderNodeExpression.xml +msgid "" +"Custom Godot Shading Language expression, with a custom amount of input and " +"output ports.\n" +"The provided code is directly injected into the graph's matching shader " +"function ([code]vertex[/code], [code]fragment[/code], or [code]light[/" +"code]), so it cannot be used to declare functions, varyings, uniforms, or " +"global constants. See [VisualShaderNodeGlobalExpression] for such global " +"definitions." +msgstr "" + +#: doc/classes/VisualShaderNodeExpression.xml +msgid "" +"An expression in Godot Shading Language, which will be injected at the start " +"of the graph's matching shader function ([code]vertex[/code], " +"[code]fragment[/code], or [code]light[/code]), and thus cannot be used to " +"declare functions, varyings, uniforms, or global constants." +msgstr "" + +#: doc/classes/VisualShaderNodeFaceForward.xml +msgid "" +"Returns the vector that points in the same direction as a reference vector " +"within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeFaceForward.xml +msgid "" +"Translates to [code]faceforward(N, I, Nref)[/code] in the shader language. " +"The function has three vector parameters: [code]N[/code], the vector to " +"orient, [code]I[/code], the incident vector, and [code]Nref[/code], the " +"reference vector. If the dot product of [code]I[/code] and [code]Nref[/code] " +"is smaller than zero the return value is [code]N[/code]. Otherwise, [code]-" +"N[/code] is returned." +msgstr "" + +#: doc/classes/VisualShaderNodeFresnel.xml +msgid "A Fresnel effect to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeFresnel.xml +msgid "" +"Returns falloff based on the dot product of surface normal and view " +"direction of camera (pass associated inputs to it)." +msgstr "" + +#: doc/classes/VisualShaderNodeGlobalExpression.xml +msgid "" +"A custom global visual shader graph expression written in Godot Shading " +"Language." +msgstr "" + +#: doc/classes/VisualShaderNodeGlobalExpression.xml +msgid "" +"Custom Godot Shader Language expression, which is placed on top of the " +"generated shader. You can place various function definitions inside to call " +"later in [VisualShaderNodeExpression]s (which are injected in the main " +"shader functions). You can also declare varyings, uniforms and global " +"constants." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml +msgid "" +"Base class for a family of nodes with variable amount of input and output " +"ports within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml +msgid "Currently, has no direct usage, use the derived classes instead." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml +msgid "" +"Adds an input port with the specified [code]type[/code] (see [enum " +"VisualShaderNode.PortType]) and [code]name[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml +msgid "" +"Adds an output port with the specified [code]type[/code] (see [enum " +"VisualShaderNode.PortType]) and [code]name[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml +msgid "Removes all previously specified input ports." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml +msgid "Removes all previously specified output ports." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml +msgid "" +"Returns a free input port ID which can be used in [method add_input_port]." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml +msgid "" +"Returns a free output port ID which can be used in [method add_output_port]." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml +msgid "" +"Returns the number of input ports in use. Alternative for [method " +"get_free_input_port_id]." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml +msgid "" +"Returns a [String] description of the input ports as a colon-separated list " +"using the format [code]id,type,name;[/code] (see [method add_input_port])." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml +msgid "" +"Returns the number of output ports in use. Alternative for [method " +"get_free_output_port_id]." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml +msgid "" +"Returns a [String] description of the output ports as a colon-separated list " +"using the format [code]id,type,name;[/code] (see [method add_output_port])." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml +msgid "Returns [code]true[/code] if the specified input port exists." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml +msgid "Returns [code]true[/code] if the specified output port exists." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml +msgid "" +"Returns [code]true[/code] if the specified port name does not override an " +"existed port name and is valid within the shader." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml +msgid "Removes the specified input port." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml +msgid "Removes the specified output port." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml +msgid "Renames the specified input port." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml +msgid "" +"Sets the specified input port's type (see [enum VisualShaderNode.PortType])." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml +msgid "" +"Defines all input ports using a [String] formatted as a colon-separated " +"list: [code]id,type,name;[/code] (see [method add_input_port])." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml +msgid "Renames the specified output port." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml +msgid "" +"Sets the specified output port's type (see [enum VisualShaderNode.PortType])." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml +msgid "" +"Defines all output ports using a [String] formatted as a colon-separated " +"list: [code]id,type,name;[/code] (see [method add_output_port])." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml +msgid "The size of the node in the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeInput.xml +msgid "" +"Gives access to input variables (built-ins) available for the shader. See " +"the shading reference for the list of available built-ins for each shader " +"type (check [code]Tutorials[/code] section for link)." +msgstr "" + +#: doc/classes/VisualShaderNodeInput.xml +msgid "" +"One of the several input constants in lower-case style like: " +"\"vertex\"([code]VERTEX[/code]) or \"point_size\"([code]POINT_SIZE[/code])." +msgstr "" + +#: doc/classes/VisualShaderNodeIs.xml +msgid "" +"A boolean comparison operator to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeIs.xml +msgid "" +"Returns the boolean result of the comparison between [code]INF[/code] or " +"[code]NaN[/code] and a scalar parameter." +msgstr "" + +#: doc/classes/VisualShaderNodeIs.xml +msgid "The comparison function. See [enum Function] for options." +msgstr "" + +#: doc/classes/VisualShaderNodeIs.xml +msgid "Comparison with [code]INF[/code] (Infinity)." +msgstr "" + +#: doc/classes/VisualShaderNodeIs.xml +msgid "" +"Comparison with [code]NaN[/code] (Not a Number; denotes invalid numeric " +"results, e.g. division by zero)." +msgstr "" + +#: doc/classes/VisualShaderNodeOuterProduct.xml +msgid "" +"Calculates an outer product of two vectors within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeOuterProduct.xml +msgid "" +"[code]OuterProduct[/code] treats the first parameter [code]c[/code] as a " +"column vector (matrix with one column) and the second parameter [code]r[/" +"code] as a row vector (matrix with one row) and does a linear algebraic " +"matrix multiply [code]c * r[/code], yielding a matrix whose number of rows " +"is the number of components in [code]c[/code] and whose number of columns is " +"the number of components in [code]r[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeOutput.xml +msgid "Represents the output shader parameters within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeOutput.xml +msgid "" +"This visual shader node is present in all shader graphs in form of " +"\"Output\" block with multiple output value ports." +msgstr "" + +#: doc/classes/VisualShaderNodeScalarClamp.xml +msgid "Clamps a scalar value within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeScalarClamp.xml +msgid "" +"Constrains a value to lie between [code]min[/code] and [code]max[/code] " +"values." +msgstr "" + +#: doc/classes/VisualShaderNodeScalarDerivativeFunc.xml +msgid "Calculates a scalar derivative within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeScalarDerivativeFunc.xml +#: doc/classes/VisualShaderNodeVectorDerivativeFunc.xml +msgid "" +"This node is only available in [code]Fragment[/code] and [code]Light[/code] " +"visual shaders." +msgstr "" + +#: doc/classes/VisualShaderNodeScalarDerivativeFunc.xml +msgid "The derivative type. See [enum Function] for options." +msgstr "" + +#: doc/classes/VisualShaderNodeScalarDerivativeFunc.xml +#: doc/classes/VisualShaderNodeVectorDerivativeFunc.xml +msgid "Sum of absolute derivative in [code]x[/code] and [code]y[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeScalarDerivativeFunc.xml +#: doc/classes/VisualShaderNodeVectorDerivativeFunc.xml +msgid "Derivative in [code]x[/code] using local differencing." +msgstr "" + +#: doc/classes/VisualShaderNodeScalarDerivativeFunc.xml +#: doc/classes/VisualShaderNodeVectorDerivativeFunc.xml +msgid "Derivative in [code]y[/code] using local differencing." +msgstr "" + +#: doc/classes/VisualShaderNodeScalarInterp.xml +msgid "" +"Linearly interpolates between two scalars within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeScalarInterp.xml +msgid "Translates to [code]mix(a, b, weight)[/code] in the shader language." +msgstr "" + +#: doc/classes/VisualShaderNodeScalarSmoothStep.xml +msgid "Calculates a scalar SmoothStep function within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeScalarSmoothStep.xml +msgid "" +"Translates to [code]smoothstep(edge0, edge1, x)[/code] in the shader " +"language.\n" +"Returns [code]0.0[/code] if [code]x[/code] is smaller than [code]edge0[/" +"code] and [code]1.0[/code] if [code]x[/code] is larger than [code]edge1[/" +"code]. Otherwise the return value is interpolated between [code]0.0[/code] " +"and [code]1.0[/code] using Hermite polynomials." +msgstr "" + +#: doc/classes/VisualShaderNodeScalarSwitch.xml +msgid "A boolean/scalar function for use within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeScalarSwitch.xml +msgid "" +"Returns an associated scalar if the provided boolean value is [code]true[/" +"code] or [code]false[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeScalarUniform.xml +msgid "" +"A hint applied to the uniform, which controls the values it can take when " +"set through the inspector." +msgstr "" + +#: doc/classes/VisualShaderNodeScalarUniform.xml +msgid "" +"Minimum value for range hints. Used if [member hint] is set to [constant " +"HINT_RANGE] or [constant HINT_RANGE_STEP]." +msgstr "" + +#: doc/classes/VisualShaderNodeScalarUniform.xml +msgid "" +"Maximum value for range hints. Used if [member hint] is set to [constant " +"HINT_RANGE] or [constant HINT_RANGE_STEP]." +msgstr "" + +#: doc/classes/VisualShaderNodeScalarUniform.xml +msgid "" +"Step (increment) value for the range hint with step. Used if [member hint] " +"is set to [constant HINT_RANGE_STEP]." +msgstr "" + +#: doc/classes/VisualShaderNodeScalarUniform.xml +msgid "No hint used." +msgstr "" + +#: doc/classes/VisualShaderNodeScalarUniform.xml +msgid "" +"A range hint for scalar value, which limits possible input values between " +"[member min] and [member max]. Translated to [code]hint_range(min, max)[/" +"code] in shader code." +msgstr "" + +#: doc/classes/VisualShaderNodeScalarUniform.xml +msgid "" +"A range hint for scalar value with step, which limits possible input values " +"between [member min] and [member max], with a step (increment) of [member " +"step]). Translated to [code]hint_range(min, max, step)[/code] in shader code." +msgstr "" + +#: doc/classes/VisualShaderNodeScalarUniform.xml +msgid "Represents the size of the [enum Hint] enum." +msgstr "" + +#: doc/classes/VisualShaderNodeSwitch.xml +msgid "A boolean/vector function for use within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeSwitch.xml +msgid "" +"Returns an associated vector if the provided boolean value is [code]true[/" +"code] or [code]false[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeTexture.xml +msgid "Performs a texture lookup within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeTexture.xml +msgid "" +"Performs a lookup operation on the provided texture, with support for " +"multiple texture sources to choose from." +msgstr "" + +#: doc/classes/VisualShaderNodeTexture.xml +msgid "Determines the source for the lookup. See [enum Source] for options." +msgstr "" + +#: doc/classes/VisualShaderNodeTexture.xml +msgid "The source texture, if needed for the selected [member source]." +msgstr "" + +#: doc/classes/VisualShaderNodeTexture.xml +msgid "" +"Specifies the type of the texture if [member source] is set to [constant " +"SOURCE_TEXTURE]. See [enum TextureType] for options." +msgstr "" + +#: doc/classes/VisualShaderNodeTexture.xml +msgid "Use the texture given as an argument for this function." +msgstr "" + +#: doc/classes/VisualShaderNodeTexture.xml +msgid "Use the current viewport's texture as the source." +msgstr "" + +#: doc/classes/VisualShaderNodeTexture.xml +msgid "" +"Use the texture from this shader's texture built-in (e.g. a texture of a " +"[Sprite])." +msgstr "" + +#: doc/classes/VisualShaderNodeTexture.xml +msgid "Use the texture from this shader's normal map built-in." +msgstr "" + +#: doc/classes/VisualShaderNodeTexture.xml +msgid "Use the depth texture available for this shader." +msgstr "" + +#: doc/classes/VisualShaderNodeTexture.xml +msgid "Use the texture provided in the input port for this function." +msgstr "" + +#: doc/classes/VisualShaderNodeTextureUniform.xml +msgid "Performs a uniform texture lookup within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeTextureUniform.xml +msgid "" +"Performs a lookup operation on the texture provided as a uniform for the " +"shader." +msgstr "" + +#: doc/classes/VisualShaderNodeTextureUniform.xml +msgid "Sets the default color if no texture is assigned to the uniform." +msgstr "" + +#: doc/classes/VisualShaderNodeTextureUniform.xml +msgid "" +"Adds [code]hint_aniso[/code] as hint to the uniform declaration to use for a " +"flowmap." +msgstr "" + +#: doc/classes/VisualShaderNodeTextureUniform.xml +msgid "Defaults to white color." +msgstr "" + +#: doc/classes/VisualShaderNodeTextureUniform.xml +msgid "Defaults to black color." +msgstr "" + +#: doc/classes/VisualShaderNodeTextureUniformTriplanar.xml +msgid "" +"Performs a uniform texture lookup with triplanar within the visual shader " +"graph." +msgstr "" + +#: doc/classes/VisualShaderNodeTextureUniformTriplanar.xml +msgid "" +"Performs a lookup operation on the texture provided as a uniform for the " +"shader, with support for triplanar mapping." +msgstr "" + +#: doc/classes/VisualShaderNodeTransformCompose.xml +msgid "" +"Composes a [Transform] from four [Vector3]s within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeTransformCompose.xml +msgid "" +"Creates a 4x4 transform matrix using four vectors of type [code]vec3[/code]. " +"Each vector is one row in the matrix and the last column is a [code]vec4(0, " +"0, 0, 1)[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeTransformConstant.xml +msgid "A [Transform] constant for use within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeTransformConstant.xml +msgid "A constant [Transform], which can be used as an input node." +msgstr "" + +#: doc/classes/VisualShaderNodeTransformConstant.xml +msgid "A [Transform] constant which represents the state of this node." +msgstr "" + +#: doc/classes/VisualShaderNodeTransformDecompose.xml +msgid "" +"Decomposes a [Transform] into four [Vector3]s within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeTransformDecompose.xml +msgid "" +"Takes a 4x4 transform matrix and decomposes it into four [code]vec3[/code] " +"values, one from each row of the matrix." +msgstr "" + +#: doc/classes/VisualShaderNodeTransformFunc.xml +msgid "Computes a [Transform] function within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeTransformFunc.xml +msgid "Computes an inverse or transpose function on the provided [Transform]." +msgstr "" + +#: doc/classes/VisualShaderNodeTransformFunc.xml +msgid "The function to be computed. See [enum Function] for options." +msgstr "" + +#: doc/classes/VisualShaderNodeTransformFunc.xml +msgid "Perform the inverse operation on the [Transform] matrix." +msgstr "" + +#: doc/classes/VisualShaderNodeTransformFunc.xml +msgid "Perform the transpose operation on the [Transform] matrix." +msgstr "" + +#: doc/classes/VisualShaderNodeTransformMult.xml +msgid "Multiplies [Transform] by [Transform] within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeTransformMult.xml +msgid "" +"A multiplication operation on two transforms (4x4 matrices), with support " +"for different multiplication operators." +msgstr "" + +#: doc/classes/VisualShaderNodeTransformMult.xml +msgid "" +"The multiplication type to be performed on the transforms. See [enum " +"Operator] for options." +msgstr "" + +#: doc/classes/VisualShaderNodeTransformMult.xml +msgid "Multiplies transform [code]a[/code] by the transform [code]b[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeTransformMult.xml +msgid "Multiplies transform [code]b[/code] by the transform [code]a[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeTransformMult.xml +msgid "" +"Performs a component-wise multiplication of transform [code]a[/code] by the " +"transform [code]b[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeTransformMult.xml +msgid "" +"Performs a component-wise multiplication of transform [code]b[/code] by the " +"transform [code]a[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeTransformUniform.xml +msgid "A [Transform] uniform for use within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeTransformUniform.xml +msgid "Translated to [code]uniform mat4[/code] in the shader language." +msgstr "" + +#: doc/classes/VisualShaderNodeTransformVecMult.xml +msgid "" +"Multiplies a [Transform] and a [Vector3] within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeTransformVecMult.xml +msgid "" +"A multiplication operation on a transform (4x4 matrix) and a vector, with " +"support for different multiplication operators." +msgstr "" + +#: doc/classes/VisualShaderNodeTransformVecMult.xml +msgid "" +"The multiplication type to be performed. See [enum Operator] for options." +msgstr "" + +#: doc/classes/VisualShaderNodeTransformVecMult.xml +msgid "Multiplies transform [code]a[/code] by the vector [code]b[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeTransformVecMult.xml +msgid "Multiplies vector [code]b[/code] by the transform [code]a[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeTransformVecMult.xml +msgid "" +"Multiplies transform [code]a[/code] by the vector [code]b[/code], skipping " +"the last row and column of the transform." +msgstr "" + +#: doc/classes/VisualShaderNodeTransformVecMult.xml +msgid "" +"Multiplies vector [code]b[/code] by the transform [code]a[/code], skipping " +"the last row and column of the transform." +msgstr "" + +#: doc/classes/VisualShaderNodeUniform.xml +msgid "A base type for the uniforms within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeUniform.xml +msgid "" +"A uniform represents a variable in the shader which is set externally, i.e. " +"from the [ShaderMaterial]. Uniforms are exposed as properties in the " +"[ShaderMaterial] and can be assigned from the inspector or from a script." +msgstr "" + +#: doc/classes/VisualShaderNodeUniform.xml +msgid "" +"Name of the uniform, by which it can be accessed through the " +"[ShaderMaterial] properties." +msgstr "" + +#: doc/classes/VisualShaderNodeUniformRef.xml +msgid "A reference to an existing [VisualShaderNodeUniform]." +msgstr "" + +#: doc/classes/VisualShaderNodeUniformRef.xml +msgid "" +"Creating a reference to a [VisualShaderNodeUniform] allows you to reuse this " +"uniform in different shaders or shader stages easily." +msgstr "" + +#: doc/classes/VisualShaderNodeUniformRef.xml +msgid "The name of the uniform which this reference points to." +msgstr "" + +#: doc/classes/VisualShaderNodeVec3Constant.xml +msgid "A [Vector3] constant to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeVec3Constant.xml +msgid "A constant [Vector3], which can be used as an input node." +msgstr "" + +#: doc/classes/VisualShaderNodeVec3Constant.xml +msgid "A [Vector3] constant which represents the state of this node." +msgstr "" + +#: doc/classes/VisualShaderNodeVec3Uniform.xml +msgid "A [Vector3] uniform to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeVec3Uniform.xml +msgid "Translated to [code]uniform vec3[/code] in the shader language." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorClamp.xml +msgid "Clamps a vector value within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorClamp.xml +msgid "" +"Constrains a value to lie between [code]min[/code] and [code]max[/code] " +"values. The operation is performed on each component of the vector " +"individually." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorCompose.xml +msgid "Composes a [Vector3] from three scalars within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorCompose.xml +msgid "" +"Creates a [code]vec3[/code] using three scalar values that can be provided " +"from separate inputs." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorDecompose.xml +msgid "" +"Decomposes a [Vector3] into three scalars within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorDecompose.xml +msgid "" +"Takes a [code]vec3[/code] and decomposes it into three scalar values that " +"can be used as separate inputs." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorDerivativeFunc.xml +msgid "Calculates a vector derivative within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorDerivativeFunc.xml +msgid "A derivative type. See [enum Function] for options." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorDistance.xml +msgid "" +"Returns the distance between two points. To be used within the visual shader " +"graph." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorDistance.xml +msgid "" +"Calculates distance from point represented by vector [code]p0[/code] to " +"vector [code]p1[/code].\n" +"Translated to [code]distance(p0, p1)[/code] in the shader language." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "A vector function to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "A visual shader node able to perform different functions using vectors." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "The function to be performed. See [enum Function] for options." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "" +"Normalizes the vector so that it has a length of [code]1[/code] but points " +"in the same direction." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Clamps the value between [code]0.0[/code] and [code]1.0[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Returns the opposite value of the parameter." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Returns [code]1/vector[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Converts RGB vector to HSV equivalent." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Converts HSV vector to RGB equivalent." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Returns the absolute value of the parameter." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Returns the arc-cosine of the parameter." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Returns the inverse hyperbolic cosine of the parameter." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Returns the arc-sine of the parameter." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Returns the inverse hyperbolic sine of the parameter." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Returns the arc-tangent of the parameter." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Returns the inverse hyperbolic tangent of the parameter." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "" +"Finds the nearest integer that is greater than or equal to the parameter." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Returns the cosine of the parameter." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Returns the hyperbolic cosine of the parameter." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Converts a quantity in radians to degrees." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Base-e Exponential." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Base-2 Exponential." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Finds the nearest integer less than or equal to the parameter." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Computes the fractional part of the argument." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Returns the inverse of the square root of the parameter." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Natural logarithm." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Base-2 logarithm." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Converts a quantity in degrees to radians." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Finds the nearest integer to the parameter." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Finds the nearest even integer to the parameter." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "" +"Extracts the sign of the parameter, i.e. returns [code]-1[/code] if the " +"parameter is negative, [code]1[/code] if it's positive and [code]0[/code] " +"otherwise." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Returns the sine of the parameter." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Returns the hyperbolic sine of the parameter." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Returns the square root of the parameter." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Returns the tangent of the parameter." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Returns the hyperbolic tangent of the parameter." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "" +"Returns a value equal to the nearest integer to the parameter whose absolute " +"value is not larger than the absolute value of the parameter." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorFunc.xml +msgid "Returns [code]1.0 - vector[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorInterp.xml +msgid "" +"Linearly interpolates between two vectors within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorInterp.xml +msgid "" +"Translates to [code]mix(a, b, weight)[/code] in the shader language, where " +"[code]weight[/code] is a [Vector3] with weights for each component." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorLen.xml +msgid "Returns the length of a [Vector3] within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorLen.xml +msgid "Translated to [code]length(p0)[/code] in the shader language." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorOp.xml +msgid "A vector operator to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorOp.xml +msgid "" +"A visual shader node for use of vector operators. Operates on vector " +"[code]a[/code] and vector [code]b[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorOp.xml +msgid "The operator to be used. See [enum Operator] for options." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorOp.xml +msgid "Adds two vectors." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorOp.xml +msgid "Subtracts a vector from a vector." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorOp.xml +msgid "Multiplies two vectors." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorOp.xml +msgid "Divides vector by vector." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorOp.xml +msgid "Returns the remainder of the two vectors." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorOp.xml +msgid "" +"Returns the value of the first parameter raised to the power of the second, " +"for each component of the vectors." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorOp.xml +msgid "Returns the greater of two values, for each component of the vectors." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorOp.xml +msgid "Returns the lesser of two values, for each component of the vectors." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorOp.xml +msgid "Calculates the cross product of two vectors." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorOp.xml +msgid "Returns the arc-tangent of the parameters." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorOp.xml +msgid "" +"Returns the vector that points in the direction of reflection. [code]a[/" +"code] is incident vector and [code]b[/code] is the normal vector." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorOp.xml +msgid "" +"Vector step operator. Returns [code]0.0[/code] if [code]a[/code] is smaller " +"than [code]b[/code] and [code]1.0[/code] otherwise." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorRefract.xml +msgid "" +"Returns the [Vector3] that points in the direction of refraction. For use " +"within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorRefract.xml +msgid "" +"Translated to [code]refract(I, N, eta)[/code] in the shader language, where " +"[code]I[/code] is the incident vector, [code]N[/code] is the normal vector " +"and [code]eta[/code] is the ratio of the indices of the refraction." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorScalarMix.xml +msgid "" +"Linearly interpolates between two vectors using a scalar. For use within the " +"visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorScalarMix.xml +msgid "" +"Translates to [code]mix(a, b, weight)[/code] in the shader language, where " +"[code]a[/code] and [code]b[/code] are vectors and [code]weight[/code] is a " +"scalar." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorScalarSmoothStep.xml +msgid "" +"Calculates a vector SmoothStep function using scalar within the visual " +"shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorScalarSmoothStep.xml +msgid "" +"Translates to [code]smoothstep(edge0, edge1, x)[/code] in the shader " +"language, where [code]x[/code] is a scalar.\n" +"Returns [code]0.0[/code] if [code]x[/code] is smaller than [code]edge0[/" +"code] and [code]1.0[/code] if [code]x[/code] is larger than [code]edge1[/" +"code]. Otherwise the return value is interpolated between [code]0.0[/code] " +"and [code]1.0[/code] using Hermite polynomials." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorScalarStep.xml +msgid "Calculates a vector Step function within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorScalarStep.xml +msgid "" +"Translates to [code]step(edge, x)[/code] in the shader language.\n" +"Returns [code]0.0[/code] if [code]x[/code] is smaller than [code]edge[/code] " +"and [code]1.0[/code] otherwise." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorSmoothStep.xml +msgid "Calculates a vector SmoothStep function within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeVectorSmoothStep.xml +msgid "" +"Translates to [code]smoothstep(edge0, edge1, x)[/code] in the shader " +"language, where [code]x[/code] is a vector.\n" +"Returns [code]0.0[/code] if [code]x[/code] is smaller than [code]edge0[/" +"code] and [code]1.0[/code] if [code]x[/code] is larger than [code]edge1[/" +"code]. Otherwise the return value is interpolated between [code]0.0[/code] " +"and [code]1.0[/code] using Hermite polynomials." +msgstr "" + +#: doc/classes/VScrollBar.xml +msgid "Vertical scroll bar." +msgstr "" + +#: doc/classes/VScrollBar.xml +msgid "" +"Vertical version of [ScrollBar], which goes from top (min) to bottom (max)." +msgstr "" + +#: doc/classes/VScrollBar.xml +msgid "" +"Icon used as a button to scroll the [ScrollBar] up. Supports custom step " +"using the [member ScrollBar.custom_step] property." +msgstr "" + +#: doc/classes/VScrollBar.xml +msgid "" +"Icon used as a button to scroll the [ScrollBar] down. Supports custom step " +"using the [member ScrollBar.custom_step] property." +msgstr "" + +#: doc/classes/VSeparator.xml +msgid "Vertical version of [Separator]." +msgstr "" + +#: doc/classes/VSeparator.xml +msgid "" +"Vertical version of [Separator]. Even though it looks vertical, it is used " +"to separate objects horizontally." +msgstr "" + +#: doc/classes/VSeparator.xml +msgid "" +"The width of the area covered by the separator. Effectively works like a " +"minimum width." +msgstr "" + +#: doc/classes/VSeparator.xml +msgid "" +"The style for the separator line. Works best with [StyleBoxLine] (remember " +"to enable [member StyleBoxLine.vertical])." +msgstr "" + +#: doc/classes/VSlider.xml +msgid "Vertical slider." +msgstr "" + +#: doc/classes/VSlider.xml +msgid "" +"Vertical slider. See [Slider]. This one goes from bottom (min) to top " +"(max).\n" +"[b]Note:[/b] The [signal Range.changed] and [signal Range.value_changed] " +"signals are part of the [Range] class which this class inherits from." +msgstr "" + +#: doc/classes/VSlider.xml +msgid "The background of the area below the grabber." +msgstr "" + +#: doc/classes/VSlider.xml +msgid "" +"The background for the whole slider. Determines the width of the " +"[code]grabber_area[/code]." +msgstr "" + +#: doc/classes/VSplitContainer.xml +msgid "Vertical split container." +msgstr "" + +#: doc/classes/VSplitContainer.xml +msgid "" +"Vertical split container. See [SplitContainer]. This goes from top to bottom." +msgstr "" + +#: doc/classes/WeakRef.xml +msgid "" +"Holds an [Object], but does not contribute to the reference count if the " +"object is a reference." +msgstr "" + +#: doc/classes/WeakRef.xml +msgid "" +"A weakref can hold a [Reference], without contributing to the reference " +"counter. A weakref can be created from an [Object] using [method @GDScript." +"weakref]. If this object is not a reference, weakref still works, however, " +"it does not have any effect on the object. Weakrefs are useful in cases " +"where multiple classes have variables that refer to each other. Without " +"weakrefs, using these classes could lead to memory leaks, since both " +"references keep each other from being released. Making part of the variables " +"a weakref can prevent this cyclic dependency, and allows the references to " +"be released." +msgstr "" + +#: doc/classes/WeakRef.xml +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml +msgid "Closes this data channel, notifying the other peer." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml +msgid "" +"Returns the number of bytes currently queued to be sent over this channel." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml +msgid "" +"Returns the id assigned to this channel during creation (or auto-assigned " +"during negotiation).\n" +"If the channel is not negotiated out-of-band the id will only be available " +"after the connection is established (will return [code]65535[/code] until " +"then)." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml +msgid "Returns the label assigned to this channel during creation." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml +msgid "" +"Returns the [code]maxPacketLifeTime[/code] value assigned to this channel " +"during creation.\n" +"Will be [code]65535[/code] if not specified." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml +msgid "" +"Returns the [code]maxRetransmits[/code] value assigned to this channel " +"during creation.\n" +"Will be [code]65535[/code] if not specified." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml +msgid "" +"Returns the sub-protocol assigned to this channel during creation. An empty " +"string if not specified." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml +msgid "Returns the current state of this channel, see [enum ChannelState]." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml +msgid "" +"Returns [code]true[/code] if this channel was created with out-of-band " +"configuration." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml +msgid "" +"Returns [code]true[/code] if this channel was created with ordering enabled " +"(default)." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml +msgid "Reserved, but not used for now." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml +msgid "" +"Returns [code]true[/code] if the last received packet was transferred as " +"text. See [member write_mode]." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml +msgid "" +"The transfer mode to use when sending outgoing packet. Either text or binary." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml +msgid "" +"Tells the channel to send data over this channel as text. An external peer " +"(non-Godot) would receive this as a string." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml +msgid "" +"Tells the channel to send data over this channel as binary. An external peer " +"(non-Godot) would receive this as array buffer or blob." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml +msgid "The channel was created, but it's still trying to connect." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml +msgid "The channel is currently open, and data can flow over it." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml +msgid "" +"The channel is being closed, no new messages will be accepted, but those " +"already in queue will be flushed." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml +msgid "The channel was closed, or connection failed." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCMultiplayer.xml +msgid "" +"A simple interface to create a peer-to-peer mesh network composed of " +"[WebRTCPeerConnection] that is compatible with the [MultiplayerAPI]." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCMultiplayer.xml +msgid "" +"This class constructs a full mesh of [WebRTCPeerConnection] (one connection " +"for each peer) that can be used as a [member MultiplayerAPI.network_peer].\n" +"You can add each [WebRTCPeerConnection] via [method add_peer] or remove them " +"via [method remove_peer]. Peers must be added in [constant " +"WebRTCPeerConnection.STATE_NEW] state to allow it to create the appropriate " +"channels. This class will not create offers nor set descriptions, it will " +"only poll them, and notify connections and disconnections.\n" +"[signal NetworkedMultiplayerPeer.connection_succeeded] and [signal " +"NetworkedMultiplayerPeer.server_disconnected] will not be emitted unless " +"[code]server_compatibility[/code] is [code]true[/code] in [method " +"initialize]. Beside that data transfer works like in a " +"[NetworkedMultiplayerPeer]." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCMultiplayer.xml +msgid "" +"Add a new peer to the mesh with the given [code]peer_id[/code]. The " +"[WebRTCPeerConnection] must be in state [constant WebRTCPeerConnection." +"STATE_NEW].\n" +"Three channels will be created for reliable, unreliable, and ordered " +"transport. The value of [code]unreliable_lifetime[/code] will be passed to " +"the [code]maxPacketLifetime[/code] option when creating unreliable and " +"ordered channels (see [method WebRTCPeerConnection.create_data_channel])." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCMultiplayer.xml +msgid "Close all the add peer connections and channels, freeing all resources." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCMultiplayer.xml +msgid "" +"Return a dictionary representation of the peer with given [code]peer_id[/" +"code] with three keys. [code]connection[/code] containing the " +"[WebRTCPeerConnection] to this peer, [code]channels[/code] an array of three " +"[WebRTCDataChannel], and [code]connected[/code] a boolean representing if " +"the peer connection is currently connected (all three channels are open)." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCMultiplayer.xml +msgid "" +"Returns a dictionary which keys are the peer ids and values the peer " +"representation as in [method get_peer]." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCMultiplayer.xml +msgid "" +"Returns [code]true[/code] if the given [code]peer_id[/code] is in the peers " +"map (it might not be connected though)." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCMultiplayer.xml +msgid "" +"Initialize the multiplayer peer with the given [code]peer_id[/code] (must be " +"between 1 and 2147483647).\n" +"If [code]server_compatibilty[/code] is [code]false[/code] (default), the " +"multiplayer peer will be immediately in state [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTED] and [signal " +"NetworkedMultiplayerPeer.connection_succeeded] will not be emitted.\n" +"If [code]server_compatibilty[/code] is [code]true[/code] the peer will " +"suppress all [signal NetworkedMultiplayerPeer.peer_connected] signals until " +"a peer with id [constant NetworkedMultiplayerPeer.TARGET_PEER_SERVER] " +"connects and then emit [signal NetworkedMultiplayerPeer." +"connection_succeeded]. After that the signal [signal " +"NetworkedMultiplayerPeer.peer_connected] will be emitted for every already " +"connected peer, and any new peer that might connect. If the server peer " +"disconnects after that, signal [signal NetworkedMultiplayerPeer." +"server_disconnected] will be emitted and state will become [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTED]." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCMultiplayer.xml +msgid "" +"Remove the peer with given [code]peer_id[/code] from the mesh. If the peer " +"was connected, and [signal NetworkedMultiplayerPeer.peer_connected] was " +"emitted for it, then [signal NetworkedMultiplayerPeer.peer_disconnected] " +"will be emitted." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml +msgid "Interface to a WebRTC peer connection." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml +msgid "" +"A WebRTC connection between the local computer and a remote peer. Provides " +"an interface to connect, maintain and monitor the connection.\n" +"Setting up a WebRTC connection between two peers from now on) may not seem a " +"trivial task, but it can be broken down into 3 main steps:\n" +"- The peer that wants to initiate the connection ([code]A[/code] from now " +"on) creates an offer and send it to the other peer ([code]B[/code] from now " +"on).\n" +"- [code]B[/code] receives the offer, generate and answer, and sends it to " +"[code]A[/code]).\n" +"- [code]A[/code] and [code]B[/code] then generates and exchange ICE " +"candidates with each other.\n" +"After these steps, the connection should become connected. Keep on reading " +"or look into the tutorial for more information." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml +msgid "" +"Add an ice candidate generated by a remote peer (and received over the " +"signaling server). See [signal ice_candidate_created]." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml +msgid "" +"Close the peer connection and all data channels associated with it.\n" +"[b]Note:[/b] You cannot reuse this object for a new connection unless you " +"call [method initialize]." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml +msgid "" +"Returns a new [WebRTCDataChannel] (or [code]null[/code] on failure) with " +"given [code]label[/code] and optionally configured via the [code]options[/" +"code] dictionary. This method can only be called when the connection is in " +"state [constant STATE_NEW].\n" +"There are two ways to create a working data channel: either call [method " +"create_data_channel] on only one of the peer and listen to [signal " +"data_channel_received] on the other, or call [method create_data_channel] on " +"both peers, with the same values, and the [code]negotiated[/code] option set " +"to [code]true[/code].\n" +"Valid [code]options[/code] are:\n" +"[codeblock]\n" +"{\n" +" \"negotiated\": true, # When set to true (default off), means the " +"channel is negotiated out of band. \"id\" must be set too. " +"\"data_channel_received\" will not be called.\n" +" \"id\": 1, # When \"negotiated\" is true this value must also be set to " +"the same value on both peer.\n" +"\n" +" # Only one of maxRetransmits and maxPacketLifeTime can be specified, not " +"both. They make the channel unreliable (but also better at real time).\n" +" \"maxRetransmits\": 1, # Specify the maximum number of attempt the peer " +"will make to retransmits packets if they are not acknowledged.\n" +" \"maxPacketLifeTime\": 100, # Specify the maximum amount of time before " +"giving up retransmitions of unacknowledged packets (in milliseconds).\n" +" \"ordered\": true, # When in unreliable mode (i.e. either " +"\"maxRetransmits\" or \"maxPacketLifetime\" is set), \"ordered\" (true by " +"default) specify if packet ordering is to be enforced.\n" +"\n" +" \"protocol\": \"my-custom-protocol\", # A custom sub-protocol string for " +"this channel.\n" +"}\n" +"[/codeblock]\n" +"[b]Note:[/b] You must keep a reference to channels created this way, or it " +"will be closed." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml +msgid "" +"Creates a new SDP offer to start a WebRTC connection with a remote peer. At " +"least one [WebRTCDataChannel] must have been created before calling this " +"method.\n" +"If this functions returns [constant OK], [signal " +"session_description_created] will be called when the session is ready to be " +"sent." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml +msgid "Returns the connection state. See [enum ConnectionState]." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml +msgid "" +"Re-initialize this peer connection, closing any previously active " +"connection, and going back to state [constant STATE_NEW]. A dictionary of " +"[code]options[/code] can be passed to configure the peer connection.\n" +"Valid [code]options[/code] are:\n" +"[codeblock]\n" +"{\n" +" \"iceServers\": [\n" +" {\n" +" \"urls\": [ \"stun:stun.example.com:3478\" ], # One or more STUN " +"servers.\n" +" },\n" +" {\n" +" \"urls\": [ \"turn:turn.example.com:3478\" ], # One or more TURN " +"servers.\n" +" \"username\": \"a_username\", # Optional username for the TURN " +"server.\n" +" \"credential\": \"a_password\", # Optional password for the TURN " +"server.\n" +" }\n" +" ]\n" +"}\n" +"[/codeblock]" +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml +msgid "" +"Call this method frequently (e.g. in [method Node._process] or [method Node." +"_physics_process]) to properly receive signals." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml +msgid "" +"Sets the SDP description of the local peer. This should be called in " +"response to [signal session_description_created].\n" +"After calling this function the peer will start emitting [signal " +"ice_candidate_created] (unless an [enum Error] different from [constant OK] " +"is returned)." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml +msgid "" +"Sets the SDP description of the remote peer. This should be called with the " +"values generated by a remote peer and received over the signaling server.\n" +"If [code]type[/code] is [code]offer[/code] the peer will emit [signal " +"session_description_created] with the appropriate answer.\n" +"If [code]type[/code] is [code]answer[/code] the peer will start emitting " +"[signal ice_candidate_created]." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml +msgid "" +"Emitted when a new in-band channel is received, i.e. when the channel was " +"created with [code]negotiated: false[/code] (default).\n" +"The object will be an instance of [WebRTCDataChannel]. You must keep a " +"reference of it or it will be closed automatically. See [method " +"create_data_channel]." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml +msgid "" +"Emitted when a new ICE candidate has been created. The three parameters are " +"meant to be passed to the remote peer over the signaling server." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml +msgid "" +"Emitted after a successful call to [method create_offer] or [method " +"set_remote_description] (when it generates an answer). The parameters are " +"meant to be passed to [method set_local_description] on this object, and " +"sent to the remote peer over the signaling server." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml +msgid "" +"The connection is new, data channels and an offer can be created in this " +"state." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml +msgid "" +"The peer is connecting, ICE is in progress, none of the transports has " +"failed." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml +msgid "The peer is connected, all ICE transports are connected." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml +msgid "At least one ICE transport is disconnected." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml +msgid "One or more of the ICE transports failed." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml +msgid "" +"The peer connection is closed (after calling [method close] for example)." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketClient.xml +msgid "A WebSocket client implementation." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketClient.xml +msgid "" +"This class implements a WebSocket client compatible with any RFC 6455-" +"compliant WebSocket server.\n" +"This client can be optionally used as a network peer for the " +"[MultiplayerAPI].\n" +"After starting the client ([method connect_to_url]), you will need to " +"[method NetworkedMultiplayerPeer.poll] it at regular intervals (e.g. inside " +"[method Node._process]).\n" +"You will receive appropriate signals when connecting, disconnecting, or when " +"new data is available." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketClient.xml +msgid "" +"Connects to the given URL requesting one of the given [code]protocols[/code] " +"as sub-protocol. If the list empty (default), no sub-protocol will be " +"requested.\n" +"If [code]true[/code] is passed as [code]gd_mp_api[/code], the client will " +"behave like a network peer for the [MultiplayerAPI], connections to non-" +"Godot servers will not work, and [signal data_received] will not be " +"emitted.\n" +"If [code]false[/code] is passed instead (default), you must call " +"[PacketPeer] functions ([code]put_packet[/code], [code]get_packet[/code], " +"etc.) on the [WebSocketPeer] returned via [code]get_peer(1)[/code] and not " +"on this object directly (e.g. [code]get_peer(1).put_packet(data)[/code]).\n" +"You can optionally pass a list of [code]custom_headers[/code] to be added to " +"the handshake HTTP request.\n" +"[b]Note:[/b] To avoid mixed content warnings or errors in HTML5, you may " +"have to use a [code]url[/code] that starts with [code]wss://[/code] (secure) " +"instead of [code]ws://[/code]. When doing so, make sure to use the fully " +"qualified domain name that matches the one defined in the server's SSL " +"certificate. Do not connect directly via the IP address for [code]wss://[/" +"code] connections, as it won't match with the SSL certificate.\n" +"[b]Note:[/b] Specifying [code]custom_headers[/code] is not supported in " +"HTML5 exports due to browsers restrictions." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketClient.xml +msgid "" +"Disconnects this client from the connected host. See [method WebSocketPeer." +"close] for more information." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketClient.xml +msgid "Return the IP address of the currently connected host." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketClient.xml +msgid "Return the IP port of the currently connected host." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketClient.xml +msgid "" +"If specified, this [X509Certificate] will be the only one accepted when " +"connecting to an SSL host. Any other certificate provided by the server will " +"be regarded as invalid.\n" +"[b]Note:[/b] Specifying a custom [code]trusted_ssl_certificate[/code] is not " +"supported in HTML5 exports due to browsers restrictions." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketClient.xml +msgid "" +"If [code]true[/code], SSL certificate verification is enabled.\n" +"[b]Note:[/b] You must specify the certificates to be used in the Project " +"Settings for it to work when exported." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketClient.xml +msgid "" +"Emitted when the connection to the server is closed. [code]was_clean_close[/" +"code] will be [code]true[/code] if the connection was shutdown cleanly." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketClient.xml +msgid "Emitted when the connection to the server fails." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketClient.xml +msgid "" +"Emitted when a connection with the server is established, [code]protocol[/" +"code] will contain the sub-protocol agreed with the server." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketClient.xml +msgid "" +"Emitted when a WebSocket message is received.\n" +"[b]Note:[/b] This signal is [i]not[/i] emitted when used as high-level " +"multiplayer peer." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketClient.xml +msgid "" +"Emitted when the server requests a clean close. You should keep polling " +"until you get a [signal connection_closed] signal to achieve the clean " +"close. See [method WebSocketPeer.close] for more details." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketMultiplayerPeer.xml +msgid "Base class for WebSocket server and client." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketMultiplayerPeer.xml +msgid "" +"Base class for WebSocket server and client, allowing them to be used as " +"network peer for the [MultiplayerAPI]." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketMultiplayerPeer.xml +msgid "" +"Returns the [WebSocketPeer] associated to the given [code]peer_id[/code]." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketMultiplayerPeer.xml +msgid "" +"Configures the buffer sizes for this WebSocket peer. Default values can be " +"specified in the Project Settings under [code]network/limits[/code]. For " +"server, values are meant per connected peer.\n" +"The first two parameters define the size and queued packets limits of the " +"input buffer, the last two of the output buffer.\n" +"Buffer sizes are expressed in KiB, so [code]4 = 2^12 = 4096 bytes[/code]. " +"All parameters will be rounded up to the nearest power of two.\n" +"[b]Note:[/b] HTML5 exports only use the input buffer since the output one is " +"managed by browsers." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketMultiplayerPeer.xml +msgid "" +"Emitted when a packet is received from a peer.\n" +"[b]Note:[/b] This signal is only emitted when the client or server is " +"configured to use Godot multiplayer API." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketPeer.xml +msgid "A class representing a specific WebSocket connection." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketPeer.xml +msgid "" +"This class represents a specific WebSocket connection, allowing you to do " +"lower level operations with it.\n" +"You can choose to write to the socket in binary or text mode, and you can " +"recognize the mode used for writing by the other peer." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketPeer.xml +msgid "" +"Closes this WebSocket connection. [code]code[/code] is the status code for " +"the closure (see RFC 6455 section 7.4 for a list of valid status codes). " +"[code]reason[/code] is the human readable reason for closing the connection " +"(can be any UTF-8 string that's smaller than 123 bytes).\n" +"[b]Note:[/b] To achieve a clean close, you will need to keep polling until " +"either [signal WebSocketClient.connection_closed] or [signal WebSocketServer." +"client_disconnected] is received.\n" +"[b]Note:[/b] The HTML5 export might not support all status codes. Please " +"refer to browser-specific documentation for more details." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketPeer.xml +msgid "" +"Returns the IP address of the connected peer.\n" +"[b]Note:[/b] Not available in the HTML5 export." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketPeer.xml +msgid "" +"Returns the remote port of the connected peer.\n" +"[b]Note:[/b] Not available in the HTML5 export." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketPeer.xml +msgid "" +"Returns the current amount of data in the outbound websocket buffer. [b]Note:" +"[/b] HTML5 exports use WebSocket.bufferedAmount, while other platforms use " +"an internal buffer." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketPeer.xml +msgid "Gets the current selected write mode. See [enum WriteMode]." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketPeer.xml +msgid "Returns [code]true[/code] if this peer is currently connected." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketPeer.xml +msgid "" +"Disable Nagle's algorithm on the underling TCP socket (default). See [method " +"StreamPeerTCP.set_no_delay] for more information.\n" +"[b]Note:[/b] Not available in the HTML5 export." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketPeer.xml +msgid "Sets the socket to use the given [enum WriteMode]." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketPeer.xml +msgid "" +"Returns [code]true[/code] if the last received packet was sent as a text " +"payload. See [enum WriteMode]." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketPeer.xml +msgid "" +"Specifies that WebSockets messages should be transferred as text payload " +"(only valid UTF-8 is allowed)." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketPeer.xml +msgid "" +"Specifies that WebSockets messages should be transferred as binary payload " +"(any byte combination is allowed)." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml +msgid "A WebSocket server implementation." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml +msgid "" +"This class implements a WebSocket server that can also support the high-" +"level multiplayer API.\n" +"After starting the server ([method listen]), you will need to [method " +"NetworkedMultiplayerPeer.poll] it at regular intervals (e.g. inside [method " +"Node._process]). When clients connect, disconnect, or send data, you will " +"receive the appropriate signal.\n" +"[b]Note:[/b] Not available in HTML5 exports." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml +msgid "" +"Disconnects the peer identified by [code]id[/code] from the server. See " +"[method WebSocketPeer.close] for more information." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml +msgid "Returns [code]true[/code] if a peer with the given ID is connected." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml +msgid "" +"Returns [code]true[/code] if the server is actively listening on a port." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml +msgid "" +"Starts listening on the given port.\n" +"You can specify the desired subprotocols via the \"protocols\" array. If the " +"list empty (default), no sub-protocol will be requested.\n" +"If [code]true[/code] is passed as [code]gd_mp_api[/code], the server will " +"behave like a network peer for the [MultiplayerAPI], connections from non-" +"Godot clients will not work, and [signal data_received] will not be " +"emitted.\n" +"If [code]false[/code] is passed instead (default), you must call " +"[PacketPeer] functions ([code]put_packet[/code], [code]get_packet[/code], " +"etc.), on the [WebSocketPeer] returned via [code]get_peer(id)[/code] to " +"communicate with the peer with given [code]id[/code] (e.g. " +"[code]get_peer(id).get_available_packet_count[/code])." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml +msgid "" +"Sets additional headers to be sent to clients during the HTTP handshake." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml +msgid "Stops the server and clear its state." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml +msgid "" +"When not set to [code]*[/code] will restrict incoming connections to the " +"specified IP address. Setting [code]bind_ip[/code] to [code]127.0.0.1[/code] " +"will cause the server to listen only to the local host." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml +msgid "" +"When using SSL (see [member private_key] and [member ssl_certificate]), you " +"can set this to a valid [X509Certificate] to be provided as additional CA " +"chain information during the SSL handshake." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml +msgid "" +"The time in seconds before a pending client (i.e. a client that has not yet " +"finished the HTTP handshake) is considered stale and forcefully disconnected." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml +msgid "" +"When set to a valid [CryptoKey] (along with [member ssl_certificate]) will " +"cause the server to require SSL instead of regular TCP (i.e. the [code]wss://" +"[/code] protocol)." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml +msgid "" +"When set to a valid [X509Certificate] (along with [member private_key]) will " +"cause the server to require SSL instead of regular TCP (i.e. the [code]wss://" +"[/code] protocol)." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml +msgid "" +"Emitted when a client requests a clean close. You should keep polling until " +"you get a [signal client_disconnected] signal with the same [code]id[/code] " +"to achieve the clean close. See [method WebSocketPeer.close] for more " +"details." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml +msgid "" +"Emitted when a new client connects. \"protocol\" will be the sub-protocol " +"agreed with the client." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml +msgid "" +"Emitted when a client disconnects. [code]was_clean_close[/code] will be " +"[code]true[/code] if the connection was shutdown cleanly." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml +msgid "" +"Emitted when a new message is received.\n" +"[b]Note:[/b] This signal is [i]not[/i] emitted when used as high-level " +"multiplayer peer." +msgstr "" + +#: modules/webxr/doc_classes/WebXRInterface.xml +msgid "AR/VR interface using WebXR." +msgstr "" + +#: modules/webxr/doc_classes/WebXRInterface.xml +msgid "" +"WebXR is an open standard that allows creating VR and AR applications that " +"run in the web browser.\n" +"As such, this interface is only available when running in an HTML5 export.\n" +"WebXR supports a wide range of devices, from the very capable (like Valve " +"Index, HTC Vive, Oculus Rift and Quest) down to the much less capable (like " +"Google Cardboard, Oculus Go, GearVR, or plain smartphones).\n" +"Since WebXR is based on Javascript, it makes extensive use of callbacks, " +"which means that [WebXRInterface] is forced to use signals, where other AR/" +"VR interfaces would instead use functions that return a result immediately. " +"This makes [WebXRInterface] quite a bit more complicated to initialize than " +"other AR/VR interfaces.\n" +"Here's the minimum code required to start an immersive VR session:\n" +"[codeblock]\n" +"extends Spatial\n" +"\n" +"var webxr_interface\n" +"var vr_supported = false\n" +"\n" +"func _ready():\n" +" # We assume this node has a button as a child.\n" +" # This button is for the user to consent to entering immersive VR mode.\n" +" $Button.connect(\"pressed\", self, \"_on_Button_pressed\")\n" +"\n" +" webxr_interface = ARVRServer.find_interface(\"WebXR\")\n" +" if webxr_interface:\n" +" # Map to the standard button/axis ids when possible.\n" +" webxr_interface.xr_standard_mapping = true\n" +"\n" +" # WebXR uses a lot of asynchronous callbacks, so we connect to " +"various\n" +" # signals in order to receive them.\n" +" webxr_interface.connect(\"session_supported\", self, " +"\"_webxr_session_supported\")\n" +" webxr_interface.connect(\"session_started\", self, " +"\"_webxr_session_started\")\n" +" webxr_interface.connect(\"session_ended\", self, " +"\"_webxr_session_ended\")\n" +" webxr_interface.connect(\"session_failed\", self, " +"\"_webxr_session_failed\")\n" +"\n" +" # This returns immediately - our _webxr_session_supported() method\n" +" # (which we connected to the \"session_supported\" signal above) " +"will\n" +" # be called sometime later to let us know if it's supported or not.\n" +" webxr_interface.is_session_supported(\"immersive-vr\")\n" +"\n" +"func _webxr_session_supported(session_mode, supported):\n" +" if session_mode == 'immersive-vr':\n" +" vr_supported = supported\n" +"\n" +"func _on_Button_pressed():\n" +" if not vr_supported:\n" +" OS.alert(\"Your browser doesn't support VR\")\n" +" return\n" +"\n" +" # We want an immersive VR session, as opposed to AR ('immersive-ar') or " +"a\n" +" # simple 3DoF viewer ('viewer').\n" +" webxr_interface.session_mode = 'immersive-vr'\n" +" # 'bounded-floor' is room scale, 'local-floor' is a standing or sitting\n" +" # experience (it puts you 1.6m above the ground if you have 3DoF " +"headset),\n" +" # whereas as 'local' puts you down at the ARVROrigin.\n" +" # This list means it'll first try to request 'bounded-floor', then\n" +" # fallback on 'local-floor' and ultimately 'local', if nothing else is\n" +" # supported.\n" +" webxr_interface.requested_reference_space_types = 'bounded-floor, local-" +"floor, local'\n" +" # In order to use 'local-floor' or 'bounded-floor' we must also\n" +" # mark the features as required or optional.\n" +" webxr_interface.required_features = 'local-floor'\n" +" webxr_interface.optional_features = 'bounded-floor'\n" +"\n" +" # This will return false if we're unable to even request the session,\n" +" # however, it can still fail asynchronously later in the process, so we\n" +" # only know if it's really succeeded or failed when our\n" +" # _webxr_session_started() or _webxr_session_failed() methods are " +"called.\n" +" if not webxr_interface.initialize():\n" +" OS.alert(\"Failed to initialize\")\n" +" return\n" +"\n" +"func _webxr_session_started():\n" +" $Button.visible = false\n" +" # This tells Godot to start rendering to the headset.\n" +" get_viewport().arvr = true\n" +" # This will be the reference space type you ultimately got, out of the\n" +" # types that you requested above. This is useful if you want the game " +"to\n" +" # work a little differently in 'bounded-floor' versus 'local-floor'.\n" +" print (\"Reference space type: \" + webxr_interface." +"reference_space_type)\n" +"\n" +"func _webxr_session_ended():\n" +" $Button.visible = true\n" +" # If the user exits immersive mode, then we tell Godot to render to the " +"web\n" +" # page again.\n" +" get_viewport().arvr = false\n" +"\n" +"func _webxr_session_failed(message):\n" +" OS.alert(\"Failed to initialize: \" + message)\n" +"[/codeblock]\n" +"There are several ways to handle \"controller\" input:\n" +"- Using [ARVRController] nodes and their [signal ARVRController." +"button_pressed] and [signal ARVRController.button_release] signals. This is " +"how controllers are typically handled in AR/VR apps in Godot, however, this " +"will only work with advanced VR controllers like the Oculus Touch or Index " +"controllers, for example. The buttons codes are defined by [url=https://" +"immersive-web.github.io/webxr-gamepads-module/#xr-standard-gamepad-" +"mapping]Section 3.3 of the WebXR Gamepads Module[/url].\n" +"- Using [method Node._unhandled_input] and [InputEventJoypadButton] or " +"[InputEventJoypadMotion]. This works the same as normal joypads, except the " +"[member InputEvent.device] starts at 100, so the left controller is 100 and " +"the right controller is 101, and the button codes are also defined by " +"[url=https://immersive-web.github.io/webxr-gamepads-module/#xr-standard-" +"gamepad-mapping]Section 3.3 of the WebXR Gamepads Module[/url].\n" +"- Using the [signal select], [signal squeeze] and related signals. This " +"method will work for both advanced VR controllers, and non-traditional " +"\"controllers\" like a tap on the screen, a spoken voice command or a button " +"press on the device itself. The [code]controller_id[/code] passed to these " +"signals is the same id as used in [member ARVRController.controller_id].\n" +"You can use one or all of these methods to allow your game or app to support " +"a wider or narrower set of devices and input methods, or to allow more " +"advanced interactions with more advanced devices." +msgstr "" + +#: modules/webxr/doc_classes/WebXRInterface.xml +msgid "How to make a VR game for WebXR with Godot" +msgstr "" + +#: modules/webxr/doc_classes/WebXRInterface.xml +msgid "" +"Gets an [ARVRPositionalTracker] for the given [code]controller_id[/code].\n" +"In the context of WebXR, a \"controller\" can be an advanced VR controller " +"like the Oculus Touch or Index controllers, or even a tap on the screen, a " +"spoken voice command or a button press on the device itself. When a non-" +"traditional controller is used, interpret the position and orientation of " +"the [ARVRPositionalTracker] as a ray pointing at the object the user wishes " +"to interact with.\n" +"Use this method to get information about the controller that triggered one " +"of these signals:\n" +"- [signal selectstart]\n" +"- [signal select]\n" +"- [signal selectend]\n" +"- [signal squeezestart]\n" +"- [signal squeeze]\n" +"- [signal squeezestart]" +msgstr "" + +#: modules/webxr/doc_classes/WebXRInterface.xml +msgid "" +"Returns the target ray mode for the given [code]controller_id[/code].\n" +"This can help interpret the input coming from that controller. See " +"[url=https://developer.mozilla.org/en-US/docs/Web/API/XRInputSource/" +"targetRayMode]XRInputSource.targetRayMode[/url] for more information." +msgstr "" + +#: modules/webxr/doc_classes/WebXRInterface.xml +msgid "" +"Checks if the given [code]session_mode[/code] is supported by the user's " +"browser.\n" +"Possible values come from [url=https://developer.mozilla.org/en-US/docs/Web/" +"API/XRSessionMode]WebXR's XRSessionMode[/url], including: [code]\"immersive-" +"vr\"[/code], [code]\"immersive-ar\"[/code], and [code]\"inline\"[/code].\n" +"This method returns nothing, instead it emits the [signal session_supported] " +"signal with the result." +msgstr "" + +#: modules/webxr/doc_classes/WebXRInterface.xml +msgid "" +"The vertices of a polygon which defines the boundaries of the user's play " +"area.\n" +"This will only be available if [member reference_space_type] is " +"[code]\"bounded-floor\"[/code] and only on certain browsers and devices that " +"support it.\n" +"The [signal reference_space_reset] signal may indicate when this changes." +msgstr "" + +#: modules/webxr/doc_classes/WebXRInterface.xml +msgid "" +"A comma-seperated list of optional features used by [method ARVRInterface." +"initialize] when setting up the WebXR session.\n" +"If a user's browser or device doesn't support one of the given features, " +"initialization will continue, but you won't be able to use the requested " +"feature.\n" +"This doesn't have any effect on the interface when already initialized.\n" +"Possible values come from [url=https://developer.mozilla.org/en-US/docs/Web/" +"API/XRReferenceSpaceType]WebXR's XRReferenceSpaceType[/url]. If you want to " +"use a particular reference space type, it must be listed in either [member " +"required_features] or [member optional_features]." +msgstr "" + +#: modules/webxr/doc_classes/WebXRInterface.xml +msgid "" +"The reference space type (from the list of requested types set in the " +"[member requested_reference_space_types] property), that was ultimately used " +"by [method ARVRInterface.initialize] when setting up the WebXR session.\n" +"Possible values come from [url=https://developer.mozilla.org/en-US/docs/Web/" +"API/XRReferenceSpaceType]WebXR's XRReferenceSpaceType[/url]. If you want to " +"use a particular reference space type, it must be listed in either [member " +"required_features] or [member optional_features]." +msgstr "" + +#: modules/webxr/doc_classes/WebXRInterface.xml +msgid "" +"A comma-seperated list of reference space types used by [method " +"ARVRInterface.initialize] when setting up the WebXR session.\n" +"The reference space types are requested in order, and the first on supported " +"by the users device or browser will be used. The [member " +"reference_space_type] property contains the reference space type that was " +"ultimately used.\n" +"This doesn't have any effect on the interface when already initialized.\n" +"Possible values come from [url=https://developer.mozilla.org/en-US/docs/Web/" +"API/XRReferenceSpaceType]WebXR's XRReferenceSpaceType[/url]. If you want to " +"use a particular reference space type, it must be listed in either [member " +"required_features] or [member optional_features]." +msgstr "" + +#: modules/webxr/doc_classes/WebXRInterface.xml +msgid "" +"A comma-seperated list of required features used by [method ARVRInterface." +"initialize] when setting up the WebXR session.\n" +"If a user's browser or device doesn't support one of the given features, " +"initialization will fail and [signal session_failed] will be emitted.\n" +"This doesn't have any effect on the interface when already initialized.\n" +"Possible values come from [url=https://developer.mozilla.org/en-US/docs/Web/" +"API/XRReferenceSpaceType]WebXR's XRReferenceSpaceType[/url]. If you want to " +"use a particular reference space type, it must be listed in either [member " +"required_features] or [member optional_features]." +msgstr "" + +#: modules/webxr/doc_classes/WebXRInterface.xml +msgid "" +"The session mode used by [method ARVRInterface.initialize] when setting up " +"the WebXR session.\n" +"This doesn't have any effect on the interface when already initialized.\n" +"Possible values come from [url=https://developer.mozilla.org/en-US/docs/Web/" +"API/XRSessionMode]WebXR's XRSessionMode[/url], including: [code]\"immersive-" +"vr\"[/code], [code]\"immersive-ar\"[/code], and [code]\"inline\"[/code]." +msgstr "" + +#: modules/webxr/doc_classes/WebXRInterface.xml +msgid "" +"Indicates if the WebXR session's imagery is visible to the user.\n" +"Possible values come from [url=https://developer.mozilla.org/en-US/docs/Web/" +"API/XRVisibilityState]WebXR's XRVisibilityState[/url], including " +"[code]\"hidden\"[/code], [code]\"visible\"[/code], and [code]\"visible-" +"blurred\"[/code]." +msgstr "" + +#: modules/webxr/doc_classes/WebXRInterface.xml +msgid "" +"If set to true, the button and axes ids will be converted to match the " +"standard ids used by other AR/VR interfaces, when possible.\n" +"Otherwise, the ids will be passed through unaltered from WebXR." +msgstr "" + +#: modules/webxr/doc_classes/WebXRInterface.xml +msgid "" +"Emitted to indicate that the reference space has been reset or " +"reconfigured.\n" +"When (or whether) this is emitted depends on the user's browser or device, " +"but may include when the user has changed the dimensions of their play space " +"(which you may be able to access via [member bounds_geometry]) or pressed/" +"held a button to recenter their position.\n" +"See [url=https://developer.mozilla.org/en-US/docs/Web/API/XRReferenceSpace/" +"reset_event]WebXR's XRReferenceSpace reset event[/url] for more information." +msgstr "" + +#: modules/webxr/doc_classes/WebXRInterface.xml +msgid "" +"Emitted after one of the \"controllers\" has finished its \"primary " +"action\".\n" +"Use [method get_controller] to get more information about the controller." +msgstr "" + +#: modules/webxr/doc_classes/WebXRInterface.xml +msgid "" +"Emitted when one of the \"controllers\" has finished its \"primary " +"action\".\n" +"Use [method get_controller] to get more information about the controller." +msgstr "" + +#: modules/webxr/doc_classes/WebXRInterface.xml +msgid "" +"Emitted when one of the \"controllers\" has started its \"primary action\".\n" +"Use [method get_controller] to get more information about the controller." +msgstr "" + +#: modules/webxr/doc_classes/WebXRInterface.xml +msgid "" +"Emitted when the user ends the WebXR session (which can be done using UI " +"from the browser or device).\n" +"At this point, you should do [code]get_viewport().arvr = false[/code] to " +"instruct Godot to resume rendering to the screen." +msgstr "" + +#: modules/webxr/doc_classes/WebXRInterface.xml +msgid "" +"Emitted by [method ARVRInterface.initialize] if the session fails to start.\n" +"[code]message[/code] may optionally contain an error message from WebXR, or " +"an empty string if no message is available." +msgstr "" + +#: modules/webxr/doc_classes/WebXRInterface.xml +msgid "" +"Emitted by [method ARVRInterface.initialize] if the session is successfully " +"started.\n" +"At this point, it's safe to do [code]get_viewport().arvr = true[/code] to " +"instruct Godot to start rendering to the AR/VR device." +msgstr "" + +#: modules/webxr/doc_classes/WebXRInterface.xml +msgid "" +"Emitted by [method is_session_supported] to indicate if the given " +"[code]session_mode[/code] is supported or not." +msgstr "" + +#: modules/webxr/doc_classes/WebXRInterface.xml +msgid "" +"Emitted after one of the \"controllers\" has finished its \"primary squeeze " +"action\".\n" +"Use [method get_controller] to get more information about the controller." +msgstr "" + +#: modules/webxr/doc_classes/WebXRInterface.xml +msgid "" +"Emitted when one of the \"controllers\" has finished its \"primary squeeze " +"action\".\n" +"Use [method get_controller] to get more information about the controller." +msgstr "" + +#: modules/webxr/doc_classes/WebXRInterface.xml +msgid "" +"Emitted when one of the \"controllers\" has started its \"primary squeeze " +"action\".\n" +"Use [method get_controller] to get more information about the controller." +msgstr "" + +#: modules/webxr/doc_classes/WebXRInterface.xml +msgid "Emitted when [member visibility_state] has changed." +msgstr "" + +#: modules/webxr/doc_classes/WebXRInterface.xml +msgid "We don't know the target ray mode." +msgstr "" + +#: modules/webxr/doc_classes/WebXRInterface.xml +msgid "" +"Target ray originates at the viewer's eyes and points in the direction they " +"are looking." +msgstr "" + +#: modules/webxr/doc_classes/WebXRInterface.xml +msgid "Target ray from a handheld pointer, most likely a VR touch controller." +msgstr "" + +#: modules/webxr/doc_classes/WebXRInterface.xml +msgid "Target ray from touch screen, mouse or other tactile input device." +msgstr "" + +#: doc/classes/WindowDialog.xml +msgid "Base class for window dialogs." +msgstr "" + +#: doc/classes/WindowDialog.xml +msgid "" +"Windowdialog is the base class for all window-based dialogs. It's a by-" +"default toplevel [Control] that draws a window decoration and allows motion " +"and resizing." +msgstr "" + +#: doc/classes/WindowDialog.xml +msgid "" +"Returns the close [TextureButton].\n" +"[b]Warning:[/b] This is a required internal node, removing and freeing it " +"may cause a crash. If you wish to hide it or any of its children, use their " +"[member CanvasItem.visible] property." +msgstr "" + +#: doc/classes/WindowDialog.xml +msgid "If [code]true[/code], the user can resize the window." +msgstr "" + +#: doc/classes/WindowDialog.xml +msgid "The text displayed in the window's title bar." +msgstr "" + +#: doc/classes/WindowDialog.xml +msgid "The color of the title text." +msgstr "" + +#: doc/classes/WindowDialog.xml +msgid "The horizontal offset of the close button." +msgstr "" + +#: doc/classes/WindowDialog.xml +msgid "" +"The thickness of the border that can be dragged when scaling the window (if " +"[member resizable] is enabled)." +msgstr "" + +#: doc/classes/WindowDialog.xml +msgid "The vertical offset of the title text." +msgstr "" + +#: doc/classes/WindowDialog.xml +msgid "The font used to draw the title." +msgstr "" + +#: doc/classes/WindowDialog.xml +msgid "The icon for the close button." +msgstr "" + +#: doc/classes/WindowDialog.xml +msgid "" +"The icon used for the close button when it's hovered with the mouse cursor." +msgstr "" + +#: doc/classes/WindowDialog.xml +msgid "" +"The style for both the content background of the [WindowDialog] and the " +"title bar. The title bar is created with a top border and an expand margin " +"using the [code]panel[/code] stylebox." +msgstr "" + +#: doc/classes/World.xml +msgid "Class that has everything pertaining to a world." +msgstr "" + +#: doc/classes/World.xml +msgid "" +"Class that has everything pertaining to a world. A physics space, a visual " +"scenario, a navigation map and a sound space. Spatial nodes register their " +"resources into the current world." +msgstr "" + +#: doc/classes/World.xml +msgid "" +"Direct access to the world's physics 3D space state. Used for querying " +"current and potential collisions." +msgstr "" + +#: doc/classes/World.xml +msgid "The World's [Environment]." +msgstr "" + +#: doc/classes/World.xml +msgid "" +"The World's fallback environment will be used if [member environment] fails " +"or is missing." +msgstr "" + +#: doc/classes/World.xml +msgid "" +"The [RID] of this world's navigation map. Used by the [NavigationServer]." +msgstr "" + +#: doc/classes/World.xml +msgid "The World's visual scenario." +msgstr "" + +#: doc/classes/World.xml +msgid "The World's physics space." +msgstr "" + +#: doc/classes/World2D.xml +msgid "Class that has everything pertaining to a 2D world." +msgstr "" + +#: doc/classes/World2D.xml +msgid "" +"Class that has everything pertaining to a 2D world. A physics space, a " +"visual scenario, a navigation map and a sound space. 2D nodes register their " +"resources into the current 2D world." +msgstr "" + +#: doc/classes/World2D.xml +msgid "" +"The [RID] of this world's canvas resource. Used by the [VisualServer] for 2D " +"drawing." +msgstr "" + +#: doc/classes/World2D.xml +msgid "" +"Direct access to the world's physics 2D space state. Used for querying " +"current and potential collisions. When using multi-threaded physics, access " +"is limited to [code]_physics_process(delta)[/code] in the main thread." +msgstr "" + +#: doc/classes/World2D.xml +msgid "" +"The [RID] of this world's navigation map. Used by the [Navigation2DServer]." +msgstr "" + +#: doc/classes/World2D.xml +msgid "" +"The [RID] of this world's physics space resource. Used by the " +"[Physics2DServer] for 2D physics, treating it as both a space and an area." +msgstr "" + +#: doc/classes/WorldEnvironment.xml +msgid "" +"Default environment properties for the entire scene (post-processing " +"effects, lighting and background settings)." +msgstr "" + +#: doc/classes/WorldEnvironment.xml +msgid "" +"The [WorldEnvironment] node is used to configure the default [Environment] " +"for the scene.\n" +"The parameters defined in the [WorldEnvironment] can be overridden by an " +"[Environment] node set on the current [Camera]. Additionally, only one " +"[WorldEnvironment] may be instanced in a given scene at a time.\n" +"The [WorldEnvironment] allows the user to specify default lighting " +"parameters (e.g. ambient lighting), various post-processing effects (e.g. " +"SSAO, DOF, Tonemapping), and how to draw the background (e.g. solid color, " +"skybox). Usually, these are added in order to improve the realism/color " +"balance of the scene." +msgstr "" + +#: doc/classes/WorldEnvironment.xml +msgid "" +"The [Environment] resource used by this [WorldEnvironment], defining the " +"default properties." +msgstr "" + +#: doc/classes/X509Certificate.xml +msgid "An X509 certificate (e.g. for SSL)." +msgstr "" + +#: doc/classes/X509Certificate.xml +msgid "" +"The X509Certificate class represents an X509 certificate. Certificates can " +"be loaded and saved like any other [Resource].\n" +"They can be used as the server certificate in [method StreamPeerSSL." +"accept_stream] (along with the proper [CryptoKey]), and to specify the only " +"certificate that should be accepted when connecting to an SSL server via " +"[method StreamPeerSSL.connect_to_stream]." +msgstr "" + +#: doc/classes/X509Certificate.xml +msgid "Loads a certificate from [code]path[/code] (\"*.crt\" file)." +msgstr "" + +#: doc/classes/X509Certificate.xml +msgid "" +"Saves a certificate to the given [code]path[/code] (should be a \"*.crt\" " +"file)." +msgstr "" + +#: doc/classes/XMLParser.xml +msgid "" +"Low-level class for creating parsers for [url=https://en.wikipedia.org/wiki/" +"XML]XML[/url] files." +msgstr "" + +#: doc/classes/XMLParser.xml +msgid "" +"This class can serve as base to make custom XML parsers. Since XML is a very " +"flexible standard, this interface is low-level so it can be applied to any " +"possible schema." +msgstr "" + +#: doc/classes/XMLParser.xml +msgid "Gets the amount of attributes in the current element." +msgstr "" + +#: doc/classes/XMLParser.xml +msgid "" +"Gets the name of the attribute specified by the index in [code]idx[/code] " +"argument." +msgstr "" + +#: doc/classes/XMLParser.xml +msgid "" +"Gets the value of the attribute specified by the index in [code]idx[/code] " +"argument." +msgstr "" + +#: doc/classes/XMLParser.xml +msgid "Gets the current line in the parsed file (currently not implemented)." +msgstr "" + +#: doc/classes/XMLParser.xml +msgid "" +"Gets the value of a certain attribute of the current element by name. This " +"will raise an error if the element has no such attribute." +msgstr "" + +#: doc/classes/XMLParser.xml +msgid "" +"Gets the value of a certain attribute of the current element by name. This " +"will return an empty [String] if the attribute is not found." +msgstr "" + +#: doc/classes/XMLParser.xml +msgid "" +"Gets the contents of a text node. This will raise an error in any other type " +"of node." +msgstr "" + +#: doc/classes/XMLParser.xml +msgid "" +"Gets the name of the current element node. This will raise an error if the " +"current node type is neither [constant NODE_ELEMENT] nor [constant " +"NODE_ELEMENT_END]." +msgstr "" + +#: doc/classes/XMLParser.xml +msgid "" +"Gets the byte offset of the current node since the beginning of the file or " +"buffer." +msgstr "" + +#: doc/classes/XMLParser.xml +msgid "" +"Gets the type of the current node. Compare with [enum NodeType] constants." +msgstr "" + +#: doc/classes/XMLParser.xml +msgid "Check whether the current element has a certain attribute." +msgstr "" + +#: doc/classes/XMLParser.xml +msgid "" +"Check whether the current element is empty (this only works for completely " +"empty tags, e.g. [code]<element \\>[/code])." +msgstr "" + +#: doc/classes/XMLParser.xml +msgid "Opens an XML file for parsing. This returns an error code." +msgstr "" + +#: doc/classes/XMLParser.xml +msgid "Opens an XML raw buffer for parsing. This returns an error code." +msgstr "" + +#: doc/classes/XMLParser.xml +msgid "Reads the next node of the file. This returns an error code." +msgstr "" + +#: doc/classes/XMLParser.xml +msgid "" +"Moves the buffer cursor to a certain offset (since the beginning) and read " +"the next node there. This returns an error code." +msgstr "" + +#: doc/classes/XMLParser.xml +msgid "" +"Skips the current section. If the node contains other elements, they will be " +"ignored and the cursor will go to the closing of the current element." +msgstr "" + +#: doc/classes/XMLParser.xml +msgid "There's no node (no file or buffer opened)." +msgstr "" + +#: doc/classes/XMLParser.xml +msgid "Element (tag)." +msgstr "" + +#: doc/classes/XMLParser.xml +msgid "End of element." +msgstr "" + +#: doc/classes/XMLParser.xml +msgid "Text node." +msgstr "" + +#: doc/classes/XMLParser.xml +msgid "Comment node." +msgstr "" + +#: doc/classes/XMLParser.xml +msgid "CDATA content." +msgstr "" + +#: doc/classes/XMLParser.xml +msgid "Unknown node." +msgstr "" + +#: doc/classes/YSort.xml +msgid "Sort all child nodes based on their Y positions." +msgstr "" + +#: doc/classes/YSort.xml +msgid "" +"Sort all child nodes based on their Y positions. The child node must inherit " +"from [CanvasItem] for it to be sorted. Nodes that have a higher Y position " +"will be drawn later, so they will appear on top of nodes that have a lower Y " +"position.\n" +"Nesting of YSort nodes is possible. Children YSort nodes will be sorted in " +"the same space as the parent YSort, allowing to better organize a scene or " +"divide it in multiple ones, yet keep the unique sorting." +msgstr "" + +#: doc/classes/YSort.xml +msgid "" +"If [code]true[/code], child nodes are sorted, otherwise sorting is disabled." +msgstr "" diff --git a/doc/translations/extract.py b/doc/translations/extract.py index 5708e0072d..ce645436d9 100644 --- a/doc/translations/extract.py +++ b/doc/translations/extract.py @@ -60,7 +60,7 @@ BASE_STRINGS = [ ## <xml-line-number-hack from="https://stackoverflow.com/a/36430270/10846399"> import sys -sys.modules["_elementtree"] = None +sys.modules["_elementtree"] = None # type: ignore import xml.etree.ElementTree as ET ## override the parser to get the line number diff --git a/doc/translations/fa.po b/doc/translations/fa.po index 7416d80072..31077d1e54 100644 --- a/doc/translations/fa.po +++ b/doc/translations/fa.po @@ -16,12 +16,15 @@ # Seyed Fazel Alavi <fazel8195@gmail.com>, 2022. # Giga hertz <gigahertzyt@gmail.com>, 2022. # ilia khormali <iliakhormaly1384@gmail.com>, 2022. +# John Smith <pkafsharix@gmail.com>, 2022. +# LordProfo (Nima) <nimaentity30@gmail.com>, 2022. +# Ali Jafari <ali.jafari.sn@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-06-21 15:55+0000\n" -"Last-Translator: ilia khormali <iliakhormaly1384@gmail.com>\n" +"PO-Revision-Date: 2022-09-18 04:25+0000\n" +"Last-Translator: Ali Jafari <ali.jafari.sn@gmail.com>\n" "Language-Team: Persian <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/fa/>\n" "Language: fa\n" @@ -29,7 +32,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.13.1-dev\n" +"X-Generator: Weblate 4.14.1\n" #: doc/tools/make_rst.py msgid "Description" @@ -45,7 +48,7 @@ msgstr "خصوصیات" #: doc/tools/make_rst.py msgid "Methods" -msgstr "روش ها" +msgstr "روش‌ها" #: doc/tools/make_rst.py msgid "Theme Properties" @@ -57,11 +60,11 @@ msgstr "سیگنال ها" #: doc/tools/make_rst.py msgid "Enumerations" -msgstr "شمارش ها" +msgstr "شمارش‌ها" #: doc/tools/make_rst.py msgid "Constants" -msgstr "ثابت ها" +msgstr "ثابت‌ها" #: doc/tools/make_rst.py msgid "Property Descriptions" @@ -77,15 +80,15 @@ msgstr "ØªÙˆØ¶ÛŒØØ§Øª ویژگی تم" #: doc/tools/make_rst.py msgid "Inherits:" -msgstr "" +msgstr "ارث می‌برد از:" #: doc/tools/make_rst.py msgid "Inherited By:" -msgstr "" +msgstr "ارث برده شده توسط:" #: doc/tools/make_rst.py msgid "(overrides %s)" -msgstr "" +msgstr "( %s را لغو Ù…ÛŒ کند)" #: doc/tools/make_rst.py msgid "Default" @@ -101,7 +104,7 @@ msgstr "مقدار" #: doc/tools/make_rst.py msgid "Getter" -msgstr "" +msgstr "گیرنده" #: doc/tools/make_rst.py msgid "" @@ -119,16 +122,20 @@ msgstr "" msgid "" "This method accepts any number of arguments after the ones described here." msgstr "" +"این متد هر تعداد آرگومان را پس از آنهایی Ú©Ù‡ اینجا ØªÙˆØ¶ÛŒØ Ø¯Ø§Ø¯Ù‡ شده اند قبول " +"می‌کند." #: doc/tools/make_rst.py msgid "This method is used to construct a type." -msgstr "" +msgstr "این متد برای ساختن یک تایپ Ø§Ø³ØªÙØ§Ø¯Ù‡ میشود." #: doc/tools/make_rst.py msgid "" "This method doesn't need an instance to be called, so it can be called " "directly using the class name." msgstr "" +"این متد برای صدا زده شدن نیازی به یک مورد ندارد، پس می‌تواند مستقیماً با " +"Ø§Ø³ØªÙØ§Ø¯Ù‡ از نام کلاس صدا زده شود." #: doc/tools/make_rst.py msgid "" @@ -786,8 +793,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -797,7 +805,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -875,7 +884,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -887,7 +897,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" "با یک مقدار نرمال شده بین دو مقدار درون یابی Ù…ÛŒ کند. این مخال٠[روش " "inverse_lerp] است.\n" @@ -1460,10 +1471,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -5280,19 +5296,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -5313,21 +5331,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -5336,9 +5358,10 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -5990,9 +6013,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -6166,8 +6189,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -6878,7 +6901,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -7115,7 +7143,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -7763,7 +7796,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -9169,8 +9210,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -9221,10 +9263,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9466,12 +9518,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -10017,7 +10063,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10178,12 +10229,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10331,6 +10386,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10471,7 +10541,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -12149,7 +12222,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -12242,7 +12315,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -12270,9 +12345,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12769,13 +12844,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -12801,8 +12877,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -13115,12 +13193,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13165,8 +13243,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -13214,8 +13294,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -13277,7 +13360,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13402,7 +13485,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -14107,17 +14193,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -14424,12 +14510,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14466,12 +14553,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -15631,7 +15719,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -15657,7 +15753,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -16398,7 +16498,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -19123,7 +19225,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -19272,16 +19376,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19426,18 +19531,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -24344,8 +24437,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24965,7 +25062,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26549,10 +26648,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27959,8 +28061,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -30260,11 +30362,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -31109,7 +31214,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -31121,6 +31230,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33478,14 +33597,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33493,21 +33612,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34783,8 +34902,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -34829,7 +34952,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -35084,9 +35210,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35545,7 +35671,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36663,7 +36791,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37478,13 +37606,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -38053,7 +38193,7 @@ msgstr "" #: doc/classes/Node.xml msgid "Nodes and Scenes" -msgstr "" +msgstr "نودها Ùˆ صØÙ†Ù‡â€ŒÙ‡Ø§" #: doc/classes/Node.xml msgid "All Demos" @@ -41148,7 +41288,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46524,7 +46666,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46763,7 +46907,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47492,7 +47638,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -50173,8 +50323,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51981,7 +52142,7 @@ msgstr "" #: doc/classes/Resource.xml msgid "Resources" -msgstr "" +msgstr "منابع" #: doc/classes/Resource.xml msgid "" @@ -53754,11 +53915,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -54195,7 +54360,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -54339,13 +54506,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -54668,6 +54841,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -54680,7 +54865,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55535,7 +55723,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -56154,6 +56345,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56488,7 +56687,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57921,7 +58122,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -59186,6 +59387,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -59247,6 +59451,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -59269,7 +59476,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60406,6 +60616,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60435,6 +60649,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60476,7 +60694,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -61826,37 +62046,38 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61875,14 +62096,15 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61893,14 +62115,14 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" @@ -61913,7 +62135,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" @@ -61921,7 +62143,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61933,13 +62155,13 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." +"[code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61951,17 +62173,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -61974,9 +62198,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -61984,8 +62208,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -62000,7 +62224,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -62018,15 +62242,17 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -62038,29 +62264,33 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -62088,87 +62318,87 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -65341,21 +65571,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65368,7 +65602,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65397,7 +65631,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65407,22 +65673,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65435,8 +65714,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65634,16 +65915,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -71737,6 +72018,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -74273,7 +74558,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/fi.po b/doc/translations/fi.po index b1d940aa14..811d77f710 100644 --- a/doc/translations/fi.po +++ b/doc/translations/fi.po @@ -615,8 +615,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -626,7 +627,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -680,7 +682,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -692,7 +695,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1107,10 +1111,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4922,19 +4931,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4955,21 +4966,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4979,9 +4994,10 @@ msgstr "Palauttaa parametrin tangentin." #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -5633,9 +5649,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -5809,8 +5825,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -6527,7 +6543,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -6764,7 +6785,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -7412,7 +7438,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -8818,8 +8852,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8870,10 +8905,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9116,12 +9161,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9667,7 +9706,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9828,12 +9872,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9981,6 +10029,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10121,7 +10184,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11802,7 +11868,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11895,7 +11961,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11923,9 +11991,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12427,13 +12495,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -12459,8 +12528,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12773,12 +12844,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12823,8 +12894,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12872,8 +12945,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12935,7 +13011,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13060,7 +13136,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -13765,17 +13844,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -14083,12 +14162,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14125,12 +14205,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -15290,7 +15371,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -15316,7 +15405,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -16057,7 +16150,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18788,7 +18883,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18937,16 +19034,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19092,18 +19190,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml #, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "Palauttaa parametrin arkussinin." @@ -24018,8 +24104,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24640,7 +24730,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26228,10 +26320,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27647,8 +27742,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -29950,11 +30045,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30800,7 +30898,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30812,6 +30914,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33173,14 +33285,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33188,22 +33300,26 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "Palauttaa kahden vektorin jäännöksen." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "Laskee kahden vektorin ristitulon." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "Laskee kahden vektorin ristitulon." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." -msgstr "" +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." +msgstr "Laskee kahden vektorin ristitulon." #: doc/classes/Line2D.xml msgid "" @@ -34479,8 +34595,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -34525,7 +34645,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -34780,9 +34903,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35243,7 +35366,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36375,7 +36500,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37201,13 +37326,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40877,7 +41014,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46251,7 +46390,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "Laskee kahden vektorin ristitulon." #: doc/classes/PopupMenu.xml @@ -46490,7 +46631,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47220,7 +47363,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49901,8 +50048,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53480,11 +53638,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -53921,7 +54083,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -54065,13 +54229,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -54394,6 +54564,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -54406,7 +54588,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55261,7 +55446,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55881,6 +56069,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56215,7 +56411,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57649,7 +57847,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58916,6 +59114,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -58977,6 +59178,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -58999,7 +59203,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60136,6 +60343,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Laskee kahden vektorin ristitulon." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60166,6 +60378,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Laskee kahden vektorin ristitulon." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60207,7 +60424,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -61565,39 +61784,46 @@ msgid "Clears all values on the theme." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Laskee kahden vektorin ristitulon." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Laskee kahden vektorin ristitulon." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Laskee kahden vektorin ristitulon." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." -msgstr "" +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." +msgstr "Laskee kahden vektorin ristitulon." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Laskee kahden vektorin ristitulon." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." -msgstr "" +"theme has [code]theme_type[/code]." +msgstr "Laskee kahden vektorin ristitulon." #: doc/classes/Theme.xml msgid "" @@ -61614,15 +61840,17 @@ msgid "Sets the theme's values to a copy of a given theme." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Laskee kahden vektorin ristitulon." #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61634,16 +61862,17 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "Laskee kahden vektorin ristitulon." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Laskee kahden vektorin ristitulon." #: doc/classes/Theme.xml msgid "" @@ -61654,16 +61883,17 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." -msgstr "" +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." +msgstr "Laskee kahden vektorin ristitulon." #: doc/classes/Theme.xml msgid "" @@ -61672,16 +61902,18 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." -msgstr "" +"[code]theme_type[/code]." +msgstr "Laskee kahden vektorin ristitulon." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." -msgstr "" +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." +msgstr "Laskee kahden vektorin ristitulon." #: doc/classes/Theme.xml msgid "" @@ -61692,17 +61924,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -61715,9 +61949,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -61725,8 +61959,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -61741,7 +61975,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -61758,18 +61992,22 @@ msgid "" msgstr "Laskee kahden vektorin ristitulon." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." -msgstr "" +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "Laskee kahden vektorin ristitulon." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." -msgstr "" +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "Laskee kahden vektorin ristitulon." #: doc/classes/Theme.xml msgid "" @@ -61778,31 +62016,38 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." -msgstr "" +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "Laskee kahden vektorin ristitulon." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." -msgstr "" +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "Laskee kahden vektorin ristitulon." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." -msgstr "" +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "Laskee kahden vektorin ristitulon." #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61831,87 +62076,88 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." -msgstr "" +msgstr "Laskee kahden vektorin ristitulon." #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -65091,21 +65337,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65118,7 +65368,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65147,7 +65397,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65157,22 +65439,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65185,8 +65480,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65384,16 +65681,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -71515,6 +71812,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -74056,7 +74357,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/fil.po b/doc/translations/fil.po index 42ab5537f4..2bbab40941 100644 --- a/doc/translations/fil.po +++ b/doc/translations/fil.po @@ -549,8 +549,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -560,7 +561,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -614,7 +616,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -626,7 +629,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1041,10 +1045,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4855,19 +4864,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4888,21 +4899,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4911,9 +4926,10 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -5565,9 +5581,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -5741,8 +5757,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -6453,7 +6469,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -6690,7 +6711,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -7338,7 +7364,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -8744,8 +8778,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8796,10 +8831,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9041,12 +9086,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9592,7 +9631,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9753,12 +9797,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9906,6 +9954,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10046,7 +10109,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11724,7 +11790,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11817,7 +11883,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11845,9 +11913,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12344,13 +12412,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -12376,8 +12445,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12690,12 +12761,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12740,8 +12811,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12789,8 +12862,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12852,7 +12928,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12977,7 +13053,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -13682,17 +13761,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -13999,12 +14078,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14041,12 +14121,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -15206,7 +15287,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -15232,7 +15321,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -15973,7 +16066,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18698,7 +18793,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18847,16 +18944,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19001,18 +19099,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23919,8 +24005,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24540,7 +24630,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26124,10 +26216,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27534,8 +27629,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -29835,11 +29930,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30684,7 +30782,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30696,6 +30798,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33053,14 +33165,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33068,21 +33180,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34358,8 +34470,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -34404,7 +34520,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -34659,9 +34778,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35120,7 +35239,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36232,7 +36353,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37047,13 +37168,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40717,7 +40850,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46081,7 +46216,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46320,7 +46457,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47049,7 +47188,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49730,8 +49873,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53307,11 +53461,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -53748,7 +53906,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53892,13 +54052,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -54221,6 +54387,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -54233,7 +54411,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55088,7 +55269,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55707,6 +55891,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56041,7 +56233,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57474,7 +57668,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58739,6 +58933,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -58800,6 +58997,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -58822,7 +59022,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -59959,6 +60162,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -59988,6 +60195,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60029,7 +60240,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -61379,37 +61592,38 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61428,14 +61642,15 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61446,14 +61661,14 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" @@ -61466,7 +61681,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" @@ -61474,7 +61689,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61486,13 +61701,13 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." +"[code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61504,17 +61719,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -61527,9 +61744,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -61537,8 +61754,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -61553,7 +61770,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -61571,15 +61788,17 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61591,29 +61810,33 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61641,87 +61864,87 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -64894,21 +65117,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64921,7 +65148,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -64950,7 +65177,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -64960,22 +65219,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -64988,8 +65260,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65187,16 +65461,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -71290,6 +71564,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -73826,7 +74104,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/fr.po b/doc/translations/fr.po index 44d40e1bd5..e22ff9db67 100644 --- a/doc/translations/fr.po +++ b/doc/translations/fr.po @@ -61,7 +61,7 @@ msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-08-04 05:23+0000\n" +"PO-Revision-Date: 2022-08-19 12:56+0000\n" "Last-Translator: Maxime Leroy <lisacintosh@gmail.com>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/fr/>\n" @@ -632,8 +632,8 @@ msgstr "" "nombre à virgule flottante, avec des valeurs spécifiques conduisant aux " "comportements suivants:\n" "[codeblock]\n" -"- Inférieur à -1.0 (exclus) : Plus lent au début et à la fin (\"ease in-out\"" -")\n" +"- Inférieur à -1.0 (exclus) : Plus lent au début et à la fin (\"ease in-" +"out\")\n" "- 1.0 : Linéaire\n" "- Entre -1.0 et 0.0 (exclus) : Plus rapide au début et à la fin (\"ease out-" "in\")\n" @@ -876,6 +876,7 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Returns an interpolation or extrapolation factor considering the range " "specified in [code]from[/code] and [code]to[/code], and the interpolated " @@ -883,8 +884,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -894,7 +896,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" "Retourne le facteur d'interpolation ou d'extrapolation suivant l'intervalle " "spécifié dans [code]from[/code] et [code]to[/code], et la valeur interpolée " @@ -985,12 +988,14 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Linearly interpolates between two values by the factor defined in " "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -1002,7 +1007,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" "L'interpolation linéaire entre deux valeurs avec un facteur défini par " "[code]weight[/code]. Pour faire une interpolation, [code]weight[/code] doit " @@ -1733,17 +1739,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" -"Permet de trouver la valeur correspondante dans l'intervalle [code][ostart, " -"ostop][/code] de la valeur [code]value[/code] appartenant à l'intervalle " -"[code][istart, istop][/code].\n" -"[codeblock]\n" -"range_lerp(75, 0, 100, -1, 1) # Renvoie la valeur 0.5\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1849,26 +1854,27 @@ msgid "" "-1.6521) return values[/url]" msgstr "" "Retourne le résultat de l'interpolation douce de la valeur [code]s[/code] " -"entre [code]0[/code] et [code]1[/code], basée sur la position de " -"[code]s[/code] entre [code]from[/code] et [code]to[/code].\n" +"entre [code]0[/code] et [code]1[/code], basée sur la position de [code]s[/" +"code] entre [code]from[/code] et [code]to[/code].\n" "La valeur retournée est [code]0[/code] si [code]s <= from[/code], et " "[code]1[/code] si [code]s >= to[/code]. Si [code]s[/code] se trouve entre " "[code]from[/code] et [code]to[/code], la valeur retournée suit une courbe en " "S qui représente les positions de [code]s[/code] entre[code]0[/code] et " "[code]1[/code].\n" "Cette courbe en S est l'interpolation cubique d'Hermite, obtenu par la " -"fonction mathématique [code]f(y) = 3*y^2 - 2*y^3[/code] où [code]y = (x-from)" -" / (to-from)[/code].\n" +"fonction mathématique [code]f(y) = 3*y^2 - 2*y^3[/code] où [code]y = (x-" +"from) / (to-from)[/code].\n" "[codeblock]\n" "smoothstep(0, 2, -5.0) # Retourne 0.0\n" "smoothstep(0, 2, 0.5) # Retourne 0.15625\n" "smoothstep(0, 2, 1.0) # Retourne 0.5\n" "smoothstep(0, 2, 2.0) # Retourne 1.0\n" "[/codeblock]\n" -"Comparé à l'utilisateur [method ease] avec une valeur de courbe de [code]-1." -"6521[/code], [method smoothstep] retourne la courbe la plus douce possible, " -"sans changement brusque de dérivée. Si vous avez besoin d'effectuer des " -"transitions plus avancées, utilisez [Tween] ou [AnimationPlayer].\n" +"Comparé à l'utilisateur [method ease] avec une valeur de courbe de " +"[code]-1.6521[/code], [method smoothstep] retourne la courbe la plus douce " +"possible, sans changement brusque de dérivée. Si vous avez besoin " +"d'effectuer des transitions plus avancées, utilisez [Tween] ou " +"[AnimationPlayer].\n" "[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" "smoothstep_ease_comparison.png]Comparaison entre les valeurs retournées par " "smoothstep() et ease(x, -1.6521)[/url]" @@ -4008,7 +4014,6 @@ msgid "VR Controller analog trigger." msgstr "Gâchette analogique de la manette VR." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "VR Controller analog grip (side buttons)." msgstr "Bouton guide du contrôleur de jeu SDL." @@ -6418,25 +6423,22 @@ msgstr "" "[AnimationRootNode], sinon les éditeurs n'afficheront pas le nÅ“ud pour ajout." #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." -msgstr "Obtient la légende pour ce nÅ“ud (utilisé par certains éditeurs)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." +msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" -"Obtient un nÅ“ud enfant par son index (utilisé par les éditeurs héritant " -"d'[AnimationRootNode])." #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" -"Obtient tous les nÅ“uds enfants dans l'ordre en tant que dictionnaire " -"[code]name: node[/code]. Utile uniquement lorsque [AnimationRootNode] est " -"hérité." #: doc/classes/AnimationNode.xml msgid "" @@ -6460,17 +6462,22 @@ msgstr "" "réutilisé dans plusieurs arbres de nÅ“uds." #: doc/classes/AnimationNode.xml +#, fuzzy msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" "Obtient la valeur par défaut d'un paramètre. Les paramètres sont la mémoire " "locale personnalisé utilisé pour vos nÅ“uds, étant donné qu'une ressource " "peut être réutilisé dans plusieurs arbres de nÅ“uds." #: doc/classes/AnimationNode.xml +#, fuzzy msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" @@ -6480,9 +6487,11 @@ msgstr "" "format est similaire à [method Object.get_property_list]." #: doc/classes/AnimationNode.xml +#, fuzzy msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" "Renvoie [code]true[/code] si vous souhaitez que l'éditeur de mélange d'arbre " "affiche l'édition de filtre sur ce nÅ“ud." @@ -6492,10 +6501,12 @@ msgid "Returns whether the given path is filtered." msgstr "Retourne quand un chemin donné est filtré." #: doc/classes/AnimationNode.xml +#, fuzzy msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -7317,13 +7328,14 @@ msgstr "" "court." #: doc/classes/AnimationNodeStateMachineTransition.xml +#, fuzzy msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -7568,9 +7580,10 @@ msgstr "" "Retourne le nom de [code]animation[/code] ou un chaine vide si n'existe pas." #: doc/classes/AnimationPlayer.xml +#, fuzzy msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" "Retourne le [Animation] avec la clé [code]name[/code] ou [code]null[/code] " "s'il n'est pas trouvé." @@ -8491,12 +8504,13 @@ msgstr "Une aire 3D pour la détection et les influences physiques et audio." msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" -"La zone 3D qui détecte nÅ“uds [CollisionObject] qui se chevauchent, entrent " -"ou sortent. Peut également modifier ou surcharger les paramètres de physique " -"locale (gravité, amortissement) et passer l'audio à des bus audio " -"personnalisés." #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml #: doc/classes/ViewportTexture.xml @@ -8827,7 +8841,12 @@ msgstr "Une aire 2D pour la détection et les influences physiques et audio." msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -9842,6 +9861,7 @@ msgid "" msgstr "" #: doc/classes/ArrayMesh.xml +#, fuzzy msgid "" "Creates a new surface.\n" "Surfaces are created to be rendered using a [code]primitive[/code], which " @@ -9856,7 +9876,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" "Crée une nouvelle surface.\n" "Les surfaces sont créées pour être rendues en utilisant une [code]primitive[/" @@ -11868,8 +11896,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "Démo d'enregistrement du microphone" @@ -11928,12 +11957,22 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" +msgstr "Bus audio" + #: doc/classes/AudioEffectCapture.xml msgid "" "Returns [code]true[/code] if at least [code]frames[/code] audio frames are " @@ -12218,12 +12257,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "Bus audio" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "L'intensité de la distorsion. Cette valeur est comprise entre 0 et 1." @@ -12455,7 +12488,6 @@ msgid "Gain amount of the frequencies after the filter." msgstr "La valeur du gain de fréquences après le filtre." #: doc/classes/AudioEffectFilter.xml -#, fuzzy msgid "Amount of boost in the frequency range near the cutoff frequency." msgstr "" "Quantité de boost dans les harmoniques près de la fréquence de coupure." @@ -12906,9 +12938,13 @@ msgstr "" "[code]at_position[/code]." #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" -"Retourne le nom de tous les appareils d'entrée audio détectés par le système." #: doc/classes/AudioServer.xml msgid "Generates an [AudioBusLayout] using the available buses and effects." @@ -13095,13 +13131,18 @@ msgid "Number of available audio buses." msgstr "Nombre de bus audio disponibles." #: doc/classes/AudioServer.xml +#, fuzzy msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" "Le nom du périphérique actuel pour l'entrée audio (voir [method " "get_device_list)]. Sur les systèmes avec plusieurs entrées audio (comme " @@ -13309,6 +13350,21 @@ msgstr "" "langages compilés avec GDNative, mais [method push_frame] peut être " "[i]moins[/i] efficace avec GDScript." +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "Le pilote de flux audio MP3." @@ -13462,8 +13518,12 @@ msgid "Plays positional sound in 2D space." msgstr "Joue un son localisé dans un espace 2D." #: doc/classes/AudioStreamPlayer2D.xml +#, fuzzy msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -15631,7 +15691,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -15755,7 +15815,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -15788,14 +15850,10 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" -"La taille de la caméra mesurée comme la moitié de la largeur ou de la " -"hauteur. N'est applicable qu'en modes orthogonal et frustum. Comme [member " -"keep_aspect] verrouille l'axe, [code]size[/code] fixe la longueur de la " -"taille sur l'autre axe." #: doc/classes/Camera.xml msgid "The vertical (Y) offset of the camera viewport." @@ -16045,18 +16103,16 @@ msgid "" "Left margin needed to drag the camera. A value of [code]1[/code] makes the " "camera move only when reaching the edge of the screen." msgstr "" -"La marge gauche nécessaire pour glisser la caméra. Une valeur de " -"[code]1[/code] ne déplace la caméra que lorsqu'elle atteint le bord de " -"l'écran." +"La marge gauche nécessaire pour glisser la caméra. Une valeur de [code]1[/" +"code] ne déplace la caméra que lorsqu'elle atteint le bord de l'écran." #: doc/classes/Camera2D.xml msgid "" "Right margin needed to drag the camera. A value of [code]1[/code] makes the " "camera move only when reaching the edge of the screen." msgstr "" -"La marge droite nécessaire pour glisser la caméra. Une valeur de " -"[code]1[/code] ne déplace la caméra que lorsqu'elle atteint le bord de " -"l'écran." +"La marge droite nécessaire pour glisser la caméra. Une valeur de [code]1[/" +"code] ne déplace la caméra que lorsqu'elle atteint le bord de l'écran." #: doc/classes/Camera2D.xml msgid "" @@ -16425,18 +16481,20 @@ msgid "Base class of anything 2D." msgstr "Classe de base de tout ce qui est 2D." #: doc/classes/CanvasItem.xml +#, fuzzy msgid "" "Base class of anything 2D. Canvas items are laid out in a tree; children " "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -16488,10 +16546,19 @@ msgid "Custom drawing in 2D" msgstr "" #: doc/classes/CanvasItem.xml +#, fuzzy msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" +"Appelé lorsque le nÅ“ud entre dans la [SceneTree] (par exemple en étant " +"instancié, au changement de scène, ou après avoir appelé [method add_child] " +"dans un script). Si le nÅ“ud a des enfants, sa méthode [méthod enter_tree] " +"sera appelée d'abord, puis ensuite celle de ses enfants.\n" +"Correspond à la notification [constant NOTIFICATION_ENTER_TREE] dans [method " +"Object._notification]." #: doc/classes/CanvasItem.xml msgid "" @@ -16637,7 +16704,6 @@ msgstr "" "avec anti-crénelage." #: doc/classes/CanvasItem.xml -#, fuzzy msgid "" "Draws multiple disconnected lines with a uniform [code]width[/code] and " "segment-by-segment coloring. Colors assigned to line segments match by index " @@ -16982,12 +17048,13 @@ msgstr "" "Retourne [code]true[/code] si les notification des transformations globales " "sont communiquées aux enfants." -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml +#, fuzzy msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" "Retourne [code]true[/code] si le nÅ“ud est présent dans le [SceneTree], que " "sa propriété [member visible] est [code]true[/code] et que tous ses parents " @@ -17055,11 +17122,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" -"Ajoute le [CanvasItem] pour être mis à jour. [constant NOTIFICATION_DRAW] " -"sera émise sur le temps inoccupé pour demander la mise à jour." #: doc/classes/CanvasItem.xml msgid "" @@ -17117,12 +17184,12 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" -"Émis lorsque le [CanvasItem] doit être redessiné. Ça ne peut être que " -"connecté qu'en temps réel, puisque le différer peut ne pas permettre le " -"dessin." #: doc/classes/CanvasItem.xml msgid "Emitted when becoming hidden." @@ -17194,7 +17261,8 @@ msgstr "" "reçue que si elle est activée par [method set_notify_local_transform]." #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +#, fuzzy +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "Le [CanvasItem] est demandé de dessiner." #: doc/classes/CanvasItem.xml @@ -17348,7 +17416,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -18267,11 +18338,12 @@ msgid "Removes the given shape owner." msgstr "Supprime le propriétaire de la forme donnée." #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml +#, fuzzy msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" "Si [code]value[/code] est [code]true[/code], définit le [code]bit[/code] " "spécifié dans le calque [member collision_layer].\n" @@ -18279,11 +18351,12 @@ msgstr "" "spécifié dans le calque [member collision_layer]." #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml +#, fuzzy msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" "Si [code]value[/code] est [code]true[/code]], définit le [code]bit[/code] " "spécifié dans le masque [nom collision_mask].\n" @@ -18706,13 +18779,15 @@ msgstr "" "NÅ“ud qui représente les données de forme de collision dans l’espace 3D." #: doc/classes/CollisionShape.xml +#, fuzzy msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" "Un élément d'aide de l'éditeur pour créer et modifier des formes de " "collision dans l'espace 3D. Vous pouvez utiliser ce nÅ“ud pour représenter " @@ -18760,13 +18835,15 @@ msgstr "" "Le nÅ“ud qui représente les données de forme de collision dans l'espace 2D." #: doc/classes/CollisionShape2D.xml +#, fuzzy msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" "Un élément d'aide de l'éditeur pour créer et modifier des formes de " "collision dans l'espace 2D. Vous pouvez utiliser ce nÅ“ud pour représenter " @@ -19277,12 +19354,10 @@ msgid "Antique white color." msgstr "Couleur blanc antique." #: doc/classes/Color.xml -#, fuzzy msgid "Aqua color." msgstr "Couleur aqua." #: doc/classes/Color.xml -#, fuzzy msgid "Aquamarine color." msgstr "Couleur aigue-marine." @@ -19363,7 +19438,6 @@ msgid "Dark cyan color." msgstr "Couleur cyan foncé." #: doc/classes/Color.xml -#, fuzzy msgid "Dark goldenrod color." msgstr "Couleur verge d'or foncé." @@ -19436,7 +19510,6 @@ msgid "Dim gray color." msgstr "Couleur gris pâle." #: doc/classes/Color.xml -#, fuzzy msgid "Dodger blue color." msgstr "Couleur bleue Dodger." @@ -19457,7 +19530,6 @@ msgid "Fuchsia color." msgstr "Couleur fuchsia." #: doc/classes/Color.xml -#, fuzzy msgid "Gainsboro color." msgstr "Couleur Gainsboro." @@ -19470,7 +19542,6 @@ msgid "Gold color." msgstr "Couleur or." #: doc/classes/Color.xml -#, fuzzy msgid "Goldenrod color." msgstr "Couleur verge d'or." @@ -19599,7 +19670,6 @@ msgid "Maroon color." msgstr "Couleur marron." #: doc/classes/Color.xml -#, fuzzy msgid "Medium aquamarine color." msgstr "Couleur bleu-marine moyenne." @@ -19684,7 +19754,6 @@ msgid "Orchid color." msgstr "Couleur d’orchidée." #: doc/classes/Color.xml -#, fuzzy msgid "Pale goldenrod color." msgstr "Couleur verge d'or pâle." @@ -19729,7 +19798,6 @@ msgid "Purple color." msgstr "Couleur violette." #: doc/classes/Color.xml -#, fuzzy msgid "Rebecca purple color." msgstr "Couleur violette Rebecca." @@ -19766,7 +19834,6 @@ msgid "Seashell color." msgstr "Couleur coquillage." #: doc/classes/Color.xml -#, fuzzy msgid "Sienna color." msgstr "Couleur Sienne." @@ -19807,7 +19874,6 @@ msgid "Teal color." msgstr "Couleur sarcelle." #: doc/classes/Color.xml -#, fuzzy msgid "Thistle color." msgstr "Couleur chardon." @@ -20181,15 +20247,16 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" -"Une ressource en forme de polygone concave, qui peut être utilisée dans un " -"[PhysicsBody] ou une aire. Cette forme est créée à partir d'une liste de " -"triangles.\n" -"[b]Note :[/b] Lorsque qu'elle est utilisée pour les collisions, " -"[ConcavePolygonShape] ne fonctionnera qu'avec les nÅ“uds statiques " -"[PhysicsBody] comme les [StaticBody] et non pas avec [KinematicBody] ou " -"[RigidBody] quand ils ne sont pas en mode Static." #: doc/classes/ConcavePolygonShape.xml msgid "Returns the faces (an array of triangles)." @@ -20204,6 +20271,7 @@ msgid "Concave polygon 2D shape resource for physics." msgstr "Ressource de forme de polygone concave 2D pour la physique." #: doc/classes/ConcavePolygonShape2D.xml +#, fuzzy msgid "" "Concave polygon 2D shape resource for physics. It is made out of segments " "and is optimal for complex polygonal concave collisions. However, it is not " @@ -20214,7 +20282,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" "Une ressource en forme de polygone concave pour la physique 2D. Elle est " "composée de segments et est optimal pour les collisions complexes de " @@ -20259,7 +20331,6 @@ msgstr "" "Plus c'est haut, plus c'est rapide." #: doc/classes/ConeTwistJoint.xml doc/classes/PhysicsServer.xml -#, fuzzy msgid "" "Defines, how fast the swing- and twist-speed-difference on both sides gets " "synced." @@ -21405,10 +21476,10 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" -"Voler le focus d'un autre contrôle et devenir le contrôle focalisé (voir " -"[member focus_mode])." #: doc/classes/Control.xml msgid "" @@ -22990,10 +23061,10 @@ msgid "" "variables, like [member anchor_left]. To change all 4 anchors at once, use " "[method set_anchors_preset]." msgstr "" -"Magnétise l'un des 4 côtés d'ancrage à l'origine de l'ancrage " -"[code]Rect[/code], en haut à gauche. Utilisez-le avec l'une des variables " -"membres [code]anchor_*[/code], comme [member anchor_left]. Pour modifier les " -"4 ancres à la fois, utilisez [method set_anchors_preset]." +"Magnétise l'un des 4 côtés d'ancrage à l'origine de l'ancrage [code]Rect[/" +"code], en haut à gauche. Utilisez-le avec l'une des variables membres " +"[code]anchor_*[/code], comme [member anchor_left]. Pour modifier les 4 " +"ancres à la fois, utilisez [method set_anchors_preset]." #: doc/classes/Control.xml msgid "" @@ -25097,10 +25168,13 @@ msgid "A mathematic curve." msgstr "Une courbe mathématique." #: doc/classes/Curve.xml +#, fuzzy msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" "Une courbe qui peut être sauvegardée et réutilisée pour d'autres objets. Par " "défaut, elle va de [code]0[/code] à [code]1[/code] selon l'axe Y et les " @@ -25286,26 +25360,28 @@ msgstr "" "Ça garde un cache des points calculés le long de la courbe, pour accélérer " "les calculs ultérieurs." -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml +#, fuzzy msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" "Ajoute un point à une courbe à la [code]position[/code] par rapport à la " -"position de la [Curve2D], avec des points de contrôle d'entrée " -"[code]in[/code] et de sortie [code]out[/code].\n" +"position de la [Curve2D], avec des points de contrôle d'entrée [code]in[/" +"code] et de sortie [code]out[/code].\n" "Si [code]at_position[/code] est spécifié, le point est inséré juste avant ce " "numéro de point [code]at_position[/code], en déplaçant ce point (et tous les " -"autres points qui suivent) après le point inséré. Si [code]at_position[/code]" -" n'est pas donné, ou est une valeur invalide ([code]at_position < 0[/code] " -"ou [code]at_position >= [method get_point_count][/code]), le point sera " -"ajouté en dernier." +"autres points qui suivent) après le point inséré. Si [code]at_position[/" +"code] n'est pas donné, ou est une valeur invalide ([code]at_position < 0[/" +"code] ou [code]at_position >= [method get_point_count][/code]), le point " +"sera ajouté en dernier." #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" @@ -25520,27 +25596,6 @@ msgstr "" "accélérer de nouveaux calculs." #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" -"Ajoute un point à la courbe à [code]position[/code] par rapport à la " -"position [Curve3D], avec des points de contrôle [code]in[/code] et " -"[code]out[/code].\n" -"Si [code]at_position[/code] est spécifiée, le point est inséré avant le " -"numéro de point [code]at_position[/code], deplaçant ce point (et tous les " -"suivants) après le point inséré. Si [code]at_position[/code] n'est pas " -"spécifiée, ou est une valeur invalide ([code]at_position <0[/code] ou " -"[code]at_position >= [method get_point_count][/code]), le point sera ajouté " -"à la fin de la liste des points." - -#: doc/classes/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "Retourne le cache de points sous forme de [PoolVector3Array]." @@ -26418,8 +26473,8 @@ msgstr "" "Change le dossier actuellement ouvert par celui donné en argument. " "L'argument peut être relatif au répertoire actuel (par exemple " "[code]nouveau_dossier[/code] ou [code]./dossier[/code]), ou être un chemin " -"absolu (par exemple [code]/tmp/dossier[/code] ou [code]res://parent/" -"dossier[/code]).\n" +"absolu (par exemple [code]/tmp/dossier[/code] ou [code]res://parent/dossier[/" +"code]).\n" "Retourne une des constantes de code [enum Error] (et [code]OK[/code] en cas " "de succès)." @@ -31794,7 +31849,6 @@ msgid "" msgstr "" #: doc/classes/Environment.xml -#, fuzzy msgid "The screen-space ambient occlusion color." msgstr "Le rayon d'occlusion ambiante de l'espace de l'écran primaire." @@ -31852,7 +31906,6 @@ msgid "" msgstr "" #: doc/classes/Environment.xml -#, fuzzy msgid "The default exposure used for tonemapping." msgstr "L’exposition par défaut utilisée pour tonifier." @@ -32292,11 +32345,13 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" -"Retourne le fichier complet en [String].\n" -"Le texte est interprété comme étant encodé en UTF-8." #: doc/classes/File.xml msgid "Returns next [code]len[/code] bytes of the file as a [PoolByteArray]." @@ -32959,7 +33014,6 @@ msgid "" msgstr "" #: doc/classes/FlowContainer.xml -#, fuzzy msgid "Base class for flow containers." msgstr "La classe de base pour les conteneurs de flux." @@ -33013,7 +33067,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -33984,20 +34040,19 @@ msgid "" msgstr "" "Gonfle ou dégonfle [code]polygon[/code] par la quantité [code]delta[/code] " "unités (pixels) dans toutes les directions. Si [code]delta[/code] est " -"positif, le polygone décale chaque sommet vers l'extérieur. Si " -"[code]delta[/code] est négatif, décale chaque sommet vers l'intérieur. " -"Retourne une liste des polygones parce que gonflage/dégonflage peut produire " -"plusieurs polygones distinctes. Retourne un tableau vide si " -"[code]delta[/code] est négatif et la valeur absolue de celui-ci dépasse " -"approximativement les dimensions du rectangle minimal englobant du polygone." -"\n" +"positif, le polygone décale chaque sommet vers l'extérieur. Si [code]delta[/" +"code] est négatif, décale chaque sommet vers l'intérieur. Retourne une liste " +"des polygones parce que gonflage/dégonflage peut produire plusieurs " +"polygones distinctes. Retourne un tableau vide si [code]delta[/code] est " +"négatif et la valeur absolue de celui-ci dépasse approximativement les " +"dimensions du rectangle minimal englobant du polygone.\n" "Les sommets de chaque polygone sont arrondis suivant [code]join_type[/code], " "voir [enum PolyJoinType].\n" "L'opération peut fournir un polygone extérieur (la limite extérieure) et " "plusieurs polygones à intérieur (représentant les trous) qui pourraient être " "distingués en appelant [method is_polygon_clockwise].\n" -"[b]Note :[/b] Pour transformer les sommets en polygone, utilisez la méthode [" -"method Transform2D.xform]:\n" +"[b]Note :[/b] Pour transformer les sommets en polygone, utilisez la méthode " +"[method Transform2D.xform]:\n" "[codeblock]\n" "var polygon = PoolVector2Array([Vector2(0, 0), Vector2(100, 0), Vector2(100, " "100), Vector2(0, 100)])\n" @@ -34030,8 +34085,8 @@ msgstr "" "vide.\n" "Les sommets de chaque polygone sont arrondis suivant [code]join_type[/code], " "voir [enum PolyJoinType].\n" -"Chaque point d'extrémité du polygone sera arrondi suivant " -"[code]end_type[/code], voir [enum PolyEndType].\n" +"Chaque point d'extrémité du polygone sera arrondi suivant [code]end_type[/" +"code], voir [enum PolyEndType].\n" "L'opération peut fournir un polygone extérieur (la limite extérieur) et " "plusieurs polygones à intérieur (représentant les trous) qui pourraient être " "distingués en appelant [method is_polygon_clockwise]." @@ -34861,12 +34916,16 @@ msgstr "" "des couleurs entre des points de couleur définis par l'utilisateur." #: doc/classes/Gradient.xml +#, fuzzy msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" "À partir d'un ensemble de couleurs, cette ressource les interpolera dans " "l'ordre. Cela signifie que si vous avez la couleur 1, la couleur 2 et la " @@ -35581,8 +35640,8 @@ msgstr "" "[code]custom_left[/code]/[code]right[/code] est une texture personnalisée " "pour le port de ce côté.\n" "[b]Note :[/b] Cette méthode ne définit que les propriétés de l'emplacement. " -"Pour créer l'emplacement, ajoutez un enfant dérivé de [Control] au GraphNode." -"\n" +"Pour créer l'emplacement, ajoutez un enfant dérivé de [Control] au " +"GraphNode.\n" "Les propriétés individuelles peuvent être définies en utilisant l'une des " "méthodes [code]set_slot_*[/code]. Vous devez activer au moins un côté de " "l'emplacement pour le faire." @@ -36245,7 +36304,6 @@ msgid "Horizontal version of [FlowContainer]." msgstr "La version horizontale du [FlowContainer]." #: doc/classes/HingeJoint.xml -#, fuzzy msgid "A hinge between two 3D PhysicsBodies." msgstr "Une articulation de torsion entre deux corps 3D." @@ -36503,7 +36561,6 @@ msgid "" msgstr "" #: doc/classes/HScrollBar.xml doc/classes/VScrollBar.xml -#, fuzzy msgid "Used when the mouse hovers over the grabber." msgstr "Utilisé lorsque la souris survole le glisseur." @@ -36615,11 +36672,12 @@ msgid "Low-level hyper-text transfer protocol client." msgstr "Client de protocole de transfert hypertexte de bas niveau." #: doc/classes/HTTPClient.xml +#, fuzzy msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -37675,12 +37733,12 @@ msgstr "" "des fichiers ou du contenu web via HTTP.\n" "[b]Avertissement :[/b] Voir les notes et avertissements du [HTTPClient] pour " "les limites, notamment concernant la sécurité SSL.\n" -"[b]Exemple pour contacter une API REST et afficher les champs retournés :[/b]" -"\n" +"[b]Exemple pour contacter une API REST et afficher les champs retournés :[/" +"b]\n" "[codeblock]\n" "func _ready():\n" -" # Créer un nÅ“ud de requête HTTP et le connecter au signal de complétion." -"\n" +" # Créer un nÅ“ud de requête HTTP et le connecter au signal de " +"complétion.\n" " var http_request = HTTPRequest.new()\n" " add_child(http_request)\n" " http_request.connect(\"request_completed\", self, " @@ -37716,8 +37774,8 @@ msgstr "" "HTTPRequest:[/b]\n" "[codeblock]\n" "func _ready():\n" -" # Créer un nÅ“ud de requête HTTP et le connecter au signal de complétion." -"\n" +" # Créer un nÅ“ud de requête HTTP et le connecter au signal de " +"complétion.\n" " var http_request = HTTPRequest.new()\n" " add_child(http_request)\n" " http_request.connect(\"request_completed\", self, " @@ -39364,11 +39422,14 @@ msgstr "Arrête la vibration du joypad." #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -40298,7 +40359,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -40310,6 +40375,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -42409,8 +42484,8 @@ msgid "" msgstr "" "Définit la priorité de rendu pour la bordure du texte. Les objets les plus " "prioritaires seront affichés par-dessus des objets les moins prioritaires.\n" -"[b]Note :[/b] Cela ne s'applique que si [member alpha_cut] est défini à [" -"constant ALPHA_CUT_DISABLED] (c'est la valeur par défaut).\n" +"[b]Note :[/b] Cela ne s'applique que si [member alpha_cut] est défini à " +"[constant ALPHA_CUT_DISABLED] (c'est la valeur par défaut).\n" "[b]Note :[/b] Cela ne s'applique qu'au tri des objets transparents. Cela " "n'affectera pas la façon dont les objets transparents sont triés par rapport " "aux objets opaques. C'est parce que les objets opaques ne sont pas triés, " @@ -42434,8 +42509,8 @@ msgid "" msgstr "" "Définit la priorité de rendu pour le texte. Les objets les plus prioritaires " "seront affichés par-dessus des objets les moins prioritaires.\n" -"[b]Note :[/b] Cela ne s'applique que si [member alpha_cut] est défini à [" -"constant ALPHA_CUT_DISABLED] (c'est la valeur par défaut).\n" +"[b]Note :[/b] Cela ne s'applique que si [member alpha_cut] est défini à " +"[constant ALPHA_CUT_DISABLED] (c'est la valeur par défaut).\n" "[b]Note :[/b] Cela ne s'applique qu'au tri des objets transparents. Cela " "n'affectera pas la façon dont les objets transparents sont triés par rapport " "aux objets opaques. C'est parce que les objets opaques ne sont pas triés, " @@ -43121,44 +43196,40 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" -"Ajoute un point au [code]position[/code]. Ajoute le point à la fin de la " -"ligne.\n" -"Si [code]at_position[/code] est donné, le point est inséré avant l'indice " -"[code]at_position[/code], en déplaçant ce point (et chaque point après) " -"après le point inséré. Si [code]at_position[/code] n'est pas donné, ou est " -"une valeur invalide ([code]at_position < 0[/code] ou [code]at_position >= " -"[method get_point_count][/code]), le point sera ajouté à la fin de la liste " -"des points." #: doc/classes/Line2D.xml msgid "Removes all points from the line." msgstr "Retire tous les points de la ligne." #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "Renvoie le nombre de points de la Ligne2D." +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "Retourne le nombre d'os dans ce squelette." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "Renvoie la position du point [code]i[/code]." +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "Retourne la position du point à l'index [code]point[/code]." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." msgstr "Supprime le point à l'index [code]i[/code] de la ligne." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" "Remplace la position du point [code]i[/code] par la [code]position[/code] " "spécifiée." @@ -43262,8 +43333,8 @@ msgid "" "The texture used for the line's texture. Uses [code]texture_mode[/code] for " "drawing style." msgstr "" -"La texture utilisée pour la texture de la ligne. Utilise " -"[code]texture_mode[/code] pour le style de dessin." +"La texture utilisée pour la texture de la ligne. Utilise [code]texture_mode[/" +"code] pour le style de dessin." #: doc/classes/Line2D.xml msgid "" @@ -43572,22 +43643,22 @@ msgid "" "# `text_change_rejected` is emitted with \"bye\" as parameter.\n" "[/codeblock]" msgstr "" -"La quantité maximale de caractères qui peuvent être entré dans ce " -"[LineEdit]. Si [code]0[/code], il n'y a aucune limite.\n" +"La quantité maximale de caractères qui peuvent être entré dans le " +"[LineEdit]. Aucune limite si [code]0[/code].\n" "Quand une limite est définie, le texte est tronqué aux [member max_length] " -"premiers caractères. Ça arrive pour le [member text] existant lorsque la " -"longueur maximale est définie, ou quand un nouveau texte est inséré dans le " +"premiers caractères. Cela s'applique au [member text] existant lorsque la " +"longueur maximale est définie ou quand un nouveau texte est inséré dans le " "[LineEdit], en étant par exemple collé. Si le texte est tronqué, le signal " "[signal text_change_rejected] est émis avec le reste du texte tronqué passé " "en paramètre.\n" -"[b]Example:[/b]\n" +"[b]Exemple:[/b]\n" "[codeblock]\n" "text = \"Salut le monde\"\n" "max_length = 5\n" "# `text` est tronqué à \"Salut\".\n" "max_length = 11\n" "text += \" l'univers\"\n" -"# `text` becomes \"Salut l'uni\".\n" +"# `text` devient \"Salut l'uni\".\n" "# `text_change_rejected` est émis avec \"vers\" passé en paramètre.\n" "[/codeblock]" @@ -44593,18 +44664,24 @@ msgid "" "Returns a [Material] in a given surface. Surface is rendered using this " "material." msgstr "" +"Retourne le [Material] pour une surface donnée. Le rendu de la surface est " +"fait en utilisant ce matériau." #: doc/classes/Mesh.xml msgid "" "Sets a [Material] for a given surface. Surface will be rendered using this " "material." msgstr "" +"Définit un [Material] pour une surface donnée. Le rendu de la surface sera " +"faite utilisant ce matériau." #: doc/classes/Mesh.xml msgid "" "Sets a hint to be used for lightmap resolution in [BakedLightmap]. Overrides " "[member BakedLightmap.default_texels_per_unit]." msgstr "" +"Définit un indice à utiliser pour la résolution de la lightmap dans " +"[BakedLightmap]. Surcharge [member BakedLightmap.default_texels_per_unit]." #: doc/classes/Mesh.xml msgid "Render array as points (one vertex equals one point)." @@ -44616,11 +44693,13 @@ msgstr "Rend le tableau en ligne (une ligne est créée tous les deux sommets)." #: doc/classes/Mesh.xml msgid "Render array as line strip." -msgstr "" +msgstr "Fait le rendu du tableau comme une suite de lignes." #: doc/classes/Mesh.xml msgid "Render array as line loop (like line strip, but closed)." msgstr "" +"Fait le rendu du tableau comme une boucle de ligne (une suite de lignes, " +"mais fermée)." #: doc/classes/Mesh.xml msgid "Render array as triangles (every three vertices a triangle is created)." @@ -44629,11 +44708,11 @@ msgstr "" #: doc/classes/Mesh.xml msgid "Render array as triangle strips." -msgstr "" +msgstr "Fait le rendu du tableau comme une suite de triangles." #: doc/classes/Mesh.xml msgid "Render array as triangle fans." -msgstr "" +msgstr "Fait le rendu du tableau comme un éventail de triangles." #: doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "Blend shapes are normalized." @@ -44699,6 +44778,8 @@ msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "Flag used to mark a compressed (half float) normal array." msgstr "" +"Le drapeau utilisé pour marquer que le tableau de normales est compressé " +"(avec des demi-flottants)." #: doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "Flag used to mark a compressed (half float) tangent array." @@ -44706,11 +44787,13 @@ msgstr "" "Drapeau utilisé pour marquer un tableau compressé (demi flottant) de " "tangentes." -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" -"Drapeau utilisé pour marquer un tableau compressé (demi flottant) de " -"couleurs." #: doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "Flag used to mark a compressed (half float) UV coordinates array." @@ -44755,12 +44838,16 @@ msgstr "" "vecteurs normaux et tangents plutôt que cartésienne." #: doc/classes/Mesh.xml +#, fuzzy msgid "" "Used to set flags [constant ARRAY_COMPRESS_VERTEX], [constant " "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" "Utilisé pour marquer rapidement l'usage de [constant ARRAY_COMPRESS_VERTEX], " "[constant ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], " @@ -44959,8 +45046,8 @@ msgid "" msgstr "" "Retourne le format du [Mesh]. Le format est un entier composé des drapeaux " "de format du [Mesh]. Par exemple, un maillage contenant à la fois des " -"sommets et des normales retournerait un format de [code]3[/code] parce que [" -"constant ArrayMesh.ARRAY_FORMAT_VERTEX] est [code]1[/code] et [constant " +"sommets et des normales retournerait un format de [code]3[/code] parce que " +"[constant ArrayMesh.ARRAY_FORMAT_VERTEX] est [code]1[/code] et [constant " "ArrayMesh.ARRAY_FORMAT_NORMAL] est [code]2[/code].\n" "Voir [enum ArrayMesh.ArrayFormat] pour une liste de drapeaux de format." @@ -45069,13 +45156,14 @@ msgid "Node that instances meshes into a scenario." msgstr "NÅ“ud qui instancie des meshes dans un scénario." #: doc/classes/MeshInstance.xml +#, fuzzy msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" "MeshInstance est un nÅ“ud qui prend une ressource [Mesh] et l'ajoute au " "scénario actuel en créant une instance. C'est la classe la plus souvent " @@ -45112,6 +45200,9 @@ msgid "" "This helper creates a [MeshInstance] child node with gizmos at every vertex " "calculated from the mesh geometry. It's mainly used for testing." msgstr "" +"Cett aide crée un nÅ“ud [MeshInstance] enfant avec des manipulateur à chaque " +"sommet calculé à partir de la géométrie de maillages. C'est principalement " +"utilisé pour les essais." #: doc/classes/MeshInstance.xml msgid "" @@ -45119,6 +45210,10 @@ msgid "" "[ConvexPolygonShape] collision shapes calculated from the mesh geometry via " "convex decomposition. It's mainly used for testing." msgstr "" +"Cett aide crée un nÅ“ud [StaticBody] enfant avec plusieurs formes de " +"collision [ConvexPolygonShape] calculées à partir de la géométrie de " +"maillage via la décomposition de convexes. C'est principalement utilisé pour " +"les essais." #: doc/classes/MeshInstance.xml msgid "" @@ -45126,6 +45221,9 @@ msgid "" "collision shape calculated from the mesh geometry. It's mainly used for " "testing." msgstr "" +"Cette aide crée un nÅ“ud [StaticBody] enfant avec une forme de collision " +"[ConcavePolygonShape] calculée à partir de la géométrie de maillages. C'est " +"principalement utilisé pour les essais." #: doc/classes/MeshInstance.xml msgid "" @@ -45135,6 +45233,12 @@ msgid "" "[Material] defined in the [Mesh]. For example, if [member GeometryInstance." "material_override] is used, all surfaces will return the override material." msgstr "" +"Retourne le [Material] qui sera utilisé par le [Mesh] lors de l'affichage. " +"Ceci peut renvoyer le [member GeometryInstance.material_override], la " +"surcharge de surface [Material] définie dans ce [MeshInstance], ou la " +"surface [Material] définie dans le [Mesh]. Par exemple, si [member " +"GeometryInstance.material_override] est utilisé, toutes les surfaces " +"retourneront le matériau de surcharge." #: doc/classes/MeshInstance.xml msgid "" @@ -45163,8 +45267,8 @@ msgid "" "each surface must match, in terms of material, attributes and vertex format." msgstr "" "Retourne [code]true[/code] si cette [MeshInstance] peut être fusionnée avec " -"l'autre instance [code]other_mesh_instance[/code], en utilisant la fonction [" -"method MeshInstance.merge_meshes].\n" +"l'autre instance [code]other_mesh_instance[/code], en utilisant la fonction " +"[method MeshInstance.merge_meshes].\n" "Pour pouvoir être fusionnées, les propriétés des [MeshInstance] doivent " "correspondre, et chaque surface doit correspondre, en termes de matériau, " "d'attributs et de format des sommets." @@ -45256,6 +45360,11 @@ msgid "" "toolbar. Select the [Sprite] node, then choose [b]Sprite > Convert to " "MeshInstance2D[/b] at the top of the 2D editor viewport." msgstr "" +"Le nÅ“ud utilisé pour afficher un [Mesh] en 2D. Un [MeshInstance2D] peut être " +"automatiquement créé à partir d'un [Sprite] existant via un outil dans la " +"barre d'outils d'éditeur. Sélectionnez le nÅ“ud [Sprite], puis choisissez " +"[b]Sprite > Convertir en MeshInstance2D[/b] en haut de la fenêtre " +"d'affichage 2D." #: doc/classes/MeshInstance2D.xml msgid "The [Mesh] that will be drawn by the [MeshInstance2D]." @@ -45269,12 +45378,22 @@ msgid "" "Normal_Map_Technical_Details#Common_Swizzle_Coordinates]this page[/url] for " "a comparison of normal map coordinates expected by popular engines." msgstr "" +"La carte de normales qui sera utilisée si vous utilisez le " +"[CanvasItemMaterial] par défaut.\n" +"[b]Note :[/b] Godot s'attend à ce que la carte normale utilise les " +"coordonnées X+, Y+ et Z+. Voir [url=http://wiki.polycount.com/wiki/" +"Normal_Map_Technical_Details#Common_Swizzle_Coordinates]cette page[/url] " +"pour une comparaison des coordonnées des cartes de normales attendues par " +"certains moteurs populaires." #: doc/classes/MeshInstance2D.xml doc/classes/MultiMeshInstance2D.xml msgid "" "The [Texture] that will be used if using the default [CanvasItemMaterial]. " "Can be accessed as [code]TEXTURE[/code] in CanvasItem shader." msgstr "" +"La [Texture] qui sera utilisée si vous utilisez le [CanvasItemMaterial] par " +"défaut. Peut être accédée via [code]TEXTURE[/code] dans le shader du " +"CanvasItem." #: doc/classes/MeshInstance2D.xml doc/classes/MultiMeshInstance2D.xml msgid "Emitted when the [member texture] is changed." @@ -45290,6 +45409,10 @@ msgid "" "and ID. Each item can also include collision and navigation shapes. This " "resource is used in [GridMap]." msgstr "" +"Une bibliothèque de maillages. Contient une liste des ressources [Mesh], " +"chacune avec un nom et un identifiant. Chaque article peut également inclure " +"des formes de collision et de navigation. Cette ressource est utilisée dans " +"[GridMap]." #: doc/classes/MeshLibrary.xml msgid "Clears the library." @@ -45300,6 +45423,9 @@ msgid "" "Creates a new item in the library with the given ID.\n" "You can get an unused ID from [method get_last_unused_item_id]." msgstr "" +"Crée un nouvel article dans la bibliothèque avec l'identifiant donné.\n" +"Vous pouvez obtenir un identifiant inutilisé via [method " +"get_last_unused_item_id]." #: doc/classes/MeshLibrary.xml msgid "Returns the first item with the given name." @@ -45315,7 +45441,7 @@ msgstr "Retourne le maillage de l'élément." #: doc/classes/MeshLibrary.xml msgid "Returns the transform applied to the item's mesh." -msgstr "" +msgstr "Retourne la transformation appliquée au maillage de l'objet." #: doc/classes/MeshLibrary.xml msgid "Returns the item's name." @@ -45338,12 +45464,20 @@ msgid "" "set_item_preview]. Returns an empty [Texture] if no preview was manually set " "in a running project." msgstr "" +"Lors de l'exécution dans l'éditeur, retourne l'aperçu généré d'un élément " +"(un rendu 3D dans la perspective isométrique). Lorsqu'il est utilisé dans un " +"projet en cours d'exécution, retourne l'aperçu personnalisé de l'élément qui " +"peut être défini en utilisant [method set_item_preview]. Retourne une " +"[Texture] vide si aucun aperçu n'a été défini manuellement dans un projet en " +"cours d'exécution." #: doc/classes/MeshLibrary.xml msgid "" "Returns an item's collision shapes.\n" "The array consists of each [Shape] followed by its [Transform]." msgstr "" +"Retourne les formes de collision.\n" +"Le tableau contient chaque [Shape] aussitôt suivie de sa [Transform]." #: doc/classes/MeshLibrary.xml msgid "Gets an unused ID for a new item." @@ -45359,7 +45493,7 @@ msgstr "Définit le maillage de l'élément." #: doc/classes/MeshLibrary.xml msgid "Sets the transform to apply to the item's mesh." -msgstr "" +msgstr "Régle la transformation à appliquer au maillage de l'objet." #: doc/classes/MeshLibrary.xml msgid "" @@ -45367,6 +45501,9 @@ msgid "" "This name is shown in the editor. It can also be used to look up the item " "later using [method find_item_by_name]." msgstr "" +"Définit le nom de l'objet.\n" +"Ce nom est indiqué dans l'éditeur. Il peut également être utilisé pour " +"retrouver l'élément par la suite en utilisant [method find_item_by_name]." #: doc/classes/MeshLibrary.xml msgid "Sets the item's navigation mesh." @@ -45379,7 +45516,7 @@ msgstr "" #: doc/classes/MeshLibrary.xml msgid "Sets a texture to use as the item's preview icon in the editor." -msgstr "" +msgstr "Définit la texture pour l'icône d'aperçu de l'élément dans l'éditeur." #: doc/classes/MeshLibrary.xml msgid "" @@ -45388,6 +45525,10 @@ msgid "" "that will be applied to it. For shapes that should not have a transform, use " "[constant Transform.IDENTITY]." msgstr "" +"Définit les formes de collision d'un objet.\n" +"Le tableau doit être composé d'objets [Shape], chacun aussitôt suivi d'une " +"[Transform] qui lui sera appliqué. Pour les formes qui ne devraient pas " +"avoir une transformation, utilisez [constant Transform.IDENTITY]." #: doc/classes/MeshTexture.xml msgid "Simple texture that uses a mesh to draw itself." @@ -45398,6 +45539,9 @@ msgid "" "Simple texture that uses a mesh to draw itself. It's limited because flags " "can't be changed and region drawing is not supported." msgstr "" +"Une texture simple qui utilise un maillage pour se dessiner elle-même. C'est " +"assez limité parce que les drapeaux ne peuvent pas être modifiés et que " +"l'affichage uniquement de cette région n'est pas supporté." #: doc/classes/MeshTexture.xml msgid "Sets the base texture that the Mesh will use to draw." @@ -45417,6 +45561,8 @@ msgstr "" msgid "" "Interpolates an abstract value and supplies it to a method called over time." msgstr "" +"Interpole une valeur abstraite et la fournit à une méthode appelée dans le " +"temps." #: doc/classes/MethodTweener.xml msgid "" @@ -45428,6 +45574,13 @@ msgid "" "create [MethodTweener]. Any [MethodTweener] created manually will not " "function correctly." msgstr "" +"[MethodTweener] est comme une combinaison de [CallbackTweener] et de " +"[PropertyTweener]. Il appelle une méthode en fournissant une valeur " +"interpolée comme paramètre. Voir [method SceneTreeTween.tween_method] pour " +"plus d'informations d'utilisation.\n" +"[b]Note :[/b] [method SceneTreeTween.tween_method] est le seul moyen correct " +"de créer un [MethodTweener]. Tout [MethodTweener] créé manuellement ne " +"fonctionnera pas correctement." #: doc/classes/MethodTweener.xml msgid "" @@ -45442,6 +45595,9 @@ msgid "" "Sets the type of used easing from [enum Tween.EaseType]. If not set, the " "default easing is used from the [SceneTreeTween] that contains this Tweener." msgstr "" +"Définit le type de comportement utilisé pour [enum Tween.EaseType]. Si n'est " +"pas défini, le comportement par défaut sera celui utilisé dans le " +"[SceneTreeTween] qui contient ce Tweener." #: doc/classes/MethodTweener.xml doc/classes/PropertyTweener.xml msgid "" @@ -45449,6 +45605,9 @@ msgid "" "set, the default transition is used from the [SceneTreeTween] that contains " "this Tweener." msgstr "" +"Définit le type de transition utilisée pour [enum Tween.TransitionType]. Si " +"n'est pas définie, la transition par défaut sera celle utilisée dans le " +"[SceneTreeTween] qui contient ce Tweener." #: modules/mobile_vr/doc_classes/MobileVRInterface.xml msgid "Generic mobile VR implementation." @@ -45470,6 +45629,20 @@ msgid "" " get_viewport().arvr = true\n" "[/codeblock]" msgstr "" +"Il s'agit d'une implémentation VR mobile générique où vous devez fournir des " +"détails sur le téléphone et le HMD utilisés. Il ne repose sur aucune " +"bibliothèque existante. C'est l'interface la plus basique que nous avons. " +"Pour un meilleur résultat, vous avez besoin d'un téléphone mobile avec un " +"gyroscope et un accéléromètre intégrés.\n" +"Notez que même s'il n'y a pas de suivi de la position, la caméra suppose que " +"le casque est à une hauteur de 1.85 mètres. Vous pouvez changer cela en " +"définissant [member eye_height].\n" +"Vous pouvez initialiser cette interface ainsi :\n" +"[codeblock]\n" +"var interface = ARVRServer.find_interface(\"Native mobile\")\n" +"if interface and interface.initialize():\n" +" get_viewport().arvr = true\n" +"[/codeblock]" #: modules/mobile_vr/doc_classes/MobileVRInterface.xml msgid "" @@ -45537,12 +45710,25 @@ msgid "" "Since instances may have any behavior, the AABB used for visibility must be " "provided by the user." msgstr "" +"MultiMesh fournit un moyen d'instancier des maillages en bas niveau. " +"L'affichage des milliers de nÅ“uds [MeshInstance] peuvent être lent, puisque " +"chaque objet est envoyé au GPU puis dessiné individuellement.\n" +"MultiMesh est beaucoup plus rapide puisqu'il peut dessiner des milliers " +"d'instances avec un seul appel, ce qui réduit la charge sur l'API.\n" +"Un des inconvénients c'est que si les instances sont trop éloignées les unes " +"des autres, les performances peuvent être réduites car chaque instance sera " +"rendu individuellemen (elles sont indexés spatialement comme étant une " +"seule, mais pour l'objet entier).\n" +"Comme les instances peuvent avoir différents comportements, l'AABB utilisée " +"pour la visibilité doit être fournie par l'utilisateur." #: doc/classes/MultiMesh.xml msgid "" "Returns the visibility axis-aligned bounding box in local space. See also " "[method VisualInstance.get_transformed_aabb]." msgstr "" +"Retourne la boîte englobante, alignée sur les axes, de visibilité dans " +"l'espace local. Voir aussi [method VisualInstance.get_transformed_aabb]." #: doc/classes/MultiMesh.xml msgid "Gets a specific instance's color." @@ -45570,6 +45756,12 @@ msgid "" "used when initially placing an instance such as a bullet to prevent " "graphical glitches." msgstr "" +"En utilisant [i]l'interpolation physique[/i], cette fonction vous permet " +"d'empêcher l'interpolation sur une instance durant la trame physique " +"actuelle.\n" +"Cela vous permet de déplacer les instances instantanément, et devrait " +"généralement être utilisé lors du placement initial d'une instance telle " +"qu'une balle pour éviter les incohérences graphiques." #: doc/classes/MultiMesh.xml msgid "" @@ -45619,12 +45811,15 @@ msgstr "" "l'interpolation." #: doc/classes/MultiMesh.xml +#, fuzzy msgid "" "Sets the color of a specific instance by [i]multiplying[/i] the mesh's " "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" "Définit la couleur d'une instance spécifique en [i]multipliant[/i] les " "couleurs des sommets existants du maillage.\n" @@ -45747,12 +45942,19 @@ msgid "" "8 bits can only represent values between 0 and 1, numbers outside that range " "will be clamped." msgstr "" +"Compresse les données personnalisées en 8 bits pour les passer au shader. " +"Cela utilise moins de mémoire et peut être plus rapide, mais réduit la " +"précision et l'intervalle. Les flottans réduits à 8 bits ne peuvent " +"représenter que des valeurs entre 0 et 1, les nombres en dehors de cet " +"intervalle seront limités à ces valeurs." #: doc/classes/MultiMesh.xml msgid "" "The [Color] passed into [method set_instance_custom_data] will use 4 floats. " "Use this for highest precision." msgstr "" +"La [Color] passée dans [method set_instance_custom_data] utilisera 4 " +"flottants. Utilisez ce mode pour utiliser la plus haute précision possible." #: doc/classes/MultiMesh.xml msgid "" @@ -45765,6 +45967,8 @@ msgid "" "Attempt to interpolate using Basis slerping (spherical linear interpolation) " "where possible, otherwise fall back to lerping." msgstr "" +"Tente d'interpoler à l'aide de l'interpolation linéaire sphérique de Basis " +"si possible, sinon utilise l'interpolation basique." #: doc/classes/MultiMeshInstance.xml msgid "Node that instances a [MultiMesh]." @@ -45777,12 +45981,19 @@ msgid "" "This is useful to optimize the rendering of a high amount of instances of a " "given mesh (for example trees in a forest or grass strands)." msgstr "" +"[MultiMeshInstance] est un nÅ“ud spécialisé pour l'instance de " +"[GeometryInstance] basé sur une ressource [MultiMesh].\n" +"Ceci est utile pour optimiser le rendu d'une grande quantité d'instances " +"avec un maillage donné (par exemple des arbres dans une forêt ou des brins " +"d'herbe)." #: doc/classes/MultiMeshInstance.xml msgid "" "The [MultiMesh] resource that will be used and shared among all instances of " "the [MultiMeshInstance]." msgstr "" +"La ressource [MultiMesh] qui sera utilisée et partagée entre toutes les " +"instances de la [MultiMeshInstance]." #: doc/classes/MultiMeshInstance2D.xml msgid "Node that instances a [MultiMesh] in 2D." @@ -45825,12 +46036,16 @@ msgid "" "Clears the current MultiplayerAPI network state (you shouldn't call this " "unless you know what you are doing)." msgstr "" +"Efface l'état actuel du réseau MultiplayerAPI (vous ne devriez pas appeler " +"ceci à moins que vous ne sachiez ce que vous faites)." #: doc/classes/MultiplayerAPI.xml msgid "" "Returns the peer IDs of all connected peers of this MultiplayerAPI's [member " "network_peer]." msgstr "" +"Retourne les identifiants de tous les pairs connectés à [member " +"network_peer] de ce MultiplayerAPI." #: doc/classes/MultiplayerAPI.xml msgid "" @@ -45844,6 +46059,9 @@ msgid "" "Returns the sender's peer ID for the RPC currently being executed.\n" "[b]Note:[/b] If not inside an RPC this method will return 0." msgstr "" +"Retourne l'identification par les pairs de l'expéditeur pour le RPC en cours " +"d'exécution.\n" +"[b]Note :[/b] Si n'est à l'intérieur d'un RPC, cette méthode retournera 0." #: doc/classes/MultiplayerAPI.xml doc/classes/SceneTree.xml msgid "Returns [code]true[/code] if there is a [member network_peer] set." @@ -45855,6 +46073,8 @@ msgid "" "Returns [code]true[/code] if this MultiplayerAPI's [member network_peer] is " "in server mode (listening for connections)." msgstr "" +"Retourne [code]true[/code] si le [member network_peer] de ce MultiplayerAPI " +"est en mode serveur (en attente de nouvelles connections)." #: doc/classes/MultiplayerAPI.xml msgid "" @@ -45866,6 +46086,14 @@ msgid "" "will be executed in the same context of this function (e.g. [code]_process[/" "code], [code]physics[/code], [Thread])." msgstr "" +"La méthode utilisée pour vérifier régulièrement le MultijoueurAPI. Vous " +"n'avez qu'à vous soucier de cela si vous utilisez la surcharge [member Node." +"custom_multiplayer] ou que vous définissez [member SceneTree." +"multiplayer_poll] à [code]false[/code]. Par défaut, [SceneTree] polluera son " +"MultijoueurAPI pour vous.\n" +"[b]Note :[/b] Cette méthode permet d'appeler les RPC et RSET, de sorte " +"qu'ils seront exécutés dans le même contexte de cette fonction (par " +"exemple : [code]_process[/code], [code]physics[/code], [Thread])." #: doc/classes/MultiplayerAPI.xml msgid "" @@ -45873,6 +46101,10 @@ msgid "" "[code]id[/code] (see [method NetworkedMultiplayerPeer.set_target_peer]). " "Default ID is [code]0[/code], i.e. broadcast to all peers." msgstr "" +"Envoie le code brut [code]bytes[/code] à un pair spécifique identifié par " +"[code]id[/code] (voir [method NetworkedMultiplayerPeer.set_target_peer]). " +"L'identifiant par défaut est [code]0[/code], c'est-à -dire envoyé à tous les " +"pairs." #: doc/classes/MultiplayerAPI.xml msgid "" @@ -45983,6 +46215,9 @@ msgid "" "method or property for all RPC calls, making it unavailable. Default for all " "methods." msgstr "" +"Utilisé avec [method Node.rpc_config] ou [method Node.rset_config] pour " +"désactiver une méthode ou une propriété pour tous les appels RPC, la rendant " +"indisponible. C'est la valeur par défaut pour toutes les méthodes." #: doc/classes/MultiplayerAPI.xml msgid "" @@ -46025,8 +46260,8 @@ msgid "" "change locally. Analogous to the [code]remotesync[/code] keyword." msgstr "" "Se comporte comme [constant RPC_MODE_REMOTE] mais fait aussi l'appel ou le " -"changement d'un propriété en local. Similaire au mot-clé " -"[code]remotesync[/code]." +"changement d'un propriété en local. Similaire au mot-clé [code]remotesync[/" +"code]." #: doc/classes/MultiplayerAPI.xml msgid "" @@ -46042,8 +46277,8 @@ msgid "" "change locally. Analogous to the [code]mastersync[/code] keyword." msgstr "" "Se comporte comme [constant RPC_MODE_MASTER] mais fait aussi l'appel ou le " -"changement d'une propriété en local. Similaire au mot-clé " -"[code]mastersync[/code]." +"changement d'une propriété en local. Similaire au mot-clé [code]mastersync[/" +"code]." #: doc/classes/MultiplayerAPI.xml msgid "" @@ -46051,8 +46286,8 @@ msgid "" "change locally. Analogous to the [code]puppetsync[/code] keyword." msgstr "" "Se comporte comme [constant RPC_MODE_PUPPET] mais fait aussi l'appel ou le " -"changement d'une propriété en local. Similaire au mot-clé " -"[code]puppetsync[/code]." +"changement d'une propriété en local. Similaire au mot-clé [code]puppetsync[/" +"code]." #: doc/classes/Mutex.xml msgid "A synchronization mutex (mutual exclusion)." @@ -46065,6 +46300,11 @@ msgid "" "that only one thread can ever acquire the lock at a time. A mutex can be " "used to protect a critical section; however, be careful to avoid deadlocks." msgstr "" +"Un mutex de synchronisation (une exclusion mutuelle). Ceci est utilisé pour " +"synchroniser plusieurs [Thread], et est équivalent à un [Semaphore] binaire. " +"Il garantit qu'un seul fil d'exécution peut imposer un blocage à la fois. Un " +"mutex peut être utilisé pour protéger une section critique ; cependant, " +"soyez prudent pour éviter le blocage total de l'exécution." #: doc/classes/Mutex.xml msgid "" @@ -46072,6 +46312,10 @@ msgid "" "[b]Note:[/b] This function returns without blocking if the thread already " "has ownership of the mutex." msgstr "" +"Verrouille ce [Mutex], le bloque jusqu'à ce qu'il soit déverrouillé par le " +"propriétaire actuel.\n" +"[b]Note :[/b] Cette fonction retourne sans bloquer si ce fil d'exécution est " +"déjà le propriétaire du mutex." #: doc/classes/Mutex.xml msgid "" @@ -46092,6 +46336,11 @@ msgid "" "times while already having ownership of the mutex, it must also call [method " "unlock] the same number of times in order to unlock it correctly." msgstr "" +"Débloque ce [Mutex], le laissant à d'autres fils d'exécution.\n" +"[b]Note :[/b] Si un fil d'exécution a appelé [method lock] ou [method " +"try_lock] plusieurs fois en étant déjà propriétaire du mutex, il doit " +"également appeler [method unlock] un nombre de fois identifique pour le " +"déverrouiller correctement." #: modules/gdnative/doc_classes/NativeScript.xml msgid "" @@ -46133,10 +46382,15 @@ msgid "" "passed to the native constructor function. This will change with in a future " "API extension." msgstr "" +"Construit un nouvel objet du type de base avec un script de ce type déjà " +"attaché.\n" +"[b]Note :[/b] Tout argument passé à cette fonction sera ignoré et ne sera " +"pas transmis à la fonction native du constructeur. Cela va changer avec dans " +"une future extension de l'API." #: doc/classes/Navigation.xml msgid "Mesh-based navigation and pathfinding node." -msgstr "" +msgstr "Noeuds de navigation à base de maillages et de cheminement." #: doc/classes/Navigation.xml msgid "" @@ -46149,6 +46403,14 @@ msgid "" "class also assists with aligning navigation agents with the meshes they are " "navigating on." msgstr "" +"[i]Obsolète.[/i] Le nÅ“ud [Navigation] et la méthode [method get_simple_path] " +"sont rendues obsolètes et seront retiré dans une prochaine version. Utilisez " +"plutôt [method NavigationServer.map_get_path].\n" +"Fournit la navigation et le cheminement dans une collection de " +"[NavigationMesh]. Par défaut, ceux-ci seront automatiquement récupérés " +"auprès des [NavigationMeshInstance] enfants. En plus du cheminement de base, " +"cette classe aide également à aligner les agents de navigation sur les " +"maillages sur lesquels ils naviguent." #: doc/classes/Navigation.xml doc/classes/NavigationMesh.xml #: doc/classes/NavigationServer.xml @@ -46160,6 +46422,8 @@ msgid "" "Returns the navigation point closest to the point given. Points are in local " "coordinate space." msgstr "" +"Retourne le point de navigation le plus proche du point donné. Les points " +"sont dans les coordonnées locales." #: doc/classes/Navigation.xml msgid "" @@ -46167,6 +46431,9 @@ msgid "" "given. Useful for rotating a navigation agent according to the navigation " "mesh it moves on." msgstr "" +"Retourne la normale de la surface au point de navigation le plus proche du " +"point donné. Utile pour la rotation d'un agent de navigation selon " +"l'inclinaison du maillage de navigation sur lequel il se déplace." #: doc/classes/Navigation.xml msgid "" @@ -46184,10 +46451,16 @@ msgid "" "between segment and navigation meshes. If multiple intersection points are " "found, the one closest to the segment start point is returned." msgstr "" +"Retourne le point de navigation le plus proche du segment de ligne donné. " +"Quand [code]use_collision[/code] est activé, ne considère que les points " +"d'intersection entre le segment et les maillages de navigation. Si plusieurs " +"points d'intersection sont trouvés, celui le plus proche du point de départ " +"du segment est retourné." #: doc/classes/Navigation.xml msgid "Returns the [RID] of the navigation map on the [NavigationServer]." msgstr "" +"Retourne le [RID] de la carte de navigation dans le [NavigationServer]." #: doc/classes/Navigation.xml msgid "" @@ -46200,8 +46473,8 @@ msgid "" "etc.) are considered in the path calculation, otherwise they are ignored." msgstr "" "[i]Obsolète.[/i] Le nÅ“ud [Navigation] la méthode [method get_simple_path] " -"sont obsolètes se seront retiré dans une prochaine version. Utilisez plutôt [" -"method NavigationServer.map_get_path].\n" +"sont obsolètes se seront retiré dans une prochaine version. Utilisez plutôt " +"[method NavigationServer.map_get_path].\n" "Retourne le chemin entre deux points donnés. Les points sont des coordonées " "locales. Si [code]optimize[/code] est [code]true[/code] (par défaut), les " "propriétés de l'agent associées à chaque [NavigationMesh] (rayon, hauteur, " @@ -46219,6 +46492,8 @@ msgstr "" msgid "" "This value is used to detect the near edges to connect compatible regions." msgstr "" +"Cette valeur est utilisée pour détecter les bords proches pour relier les " +"régions compatibles." #: doc/classes/Navigation.xml msgid "" @@ -46244,7 +46519,7 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "2D navigation and pathfinding node." -msgstr "" +msgstr "NÅ“uds de navigation et de cheminement en 2D." #: doc/classes/Navigation2D.xml msgid "" @@ -46255,6 +46530,13 @@ msgid "" "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." msgstr "" +"[i]Obsolète.[/i] Le nÅ“ud [Navigation2D] et la méthode [method " +"get_simple_path] sont rendues obsolètes et seront retiré dans une prochaine " +"version. Utilisez plutôt [method NavigationServer.map_get_path].\n" +"Navigation2D fournit la navigation et le cheminement dans une zone en 2D, " +"spécifiée comme une collection de ressources [NavigationPolygon]. Par " +"défaut, elles sont automatiquement récupérées à partir de nÅ“uds " +"[NavigationPolygonInstance] enfants." #: doc/classes/Navigation2D.xml doc/classes/Navigation2DServer.xml #: doc/classes/NavigationPolygon.xml @@ -46267,6 +46549,9 @@ msgid "" "point closest to the point given. This is usually a " "[NavigationPolygonInstance]." msgstr "" +"Retourne le propriétaire du [NavigationPolygon] qui contient le point de " +"navigation le plus proche du point donné. C'est généralement une " +"[NavigationPolygonInstance]." #: doc/classes/Navigation2D.xml msgid "" @@ -46277,10 +46562,17 @@ msgid "" "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." msgstr "" +"[i]Obsolète.[/i] Le nÅ“ud [Navigation2D] et la méthode [method " +"get_simple_path] sont rendues obsolètes et seront retiré dans une prochaine " +"version. Utilisez plutôt [method NavigationServer.map_get_path].\n" +"Retourne le chemin entre deux points donnés. Les points sont dans les " +"coordonnées locales. Si [code]optimize[/code] est [code]true[/code] (par " +"défaut), le chemin est lissé en fusionnant les segments du chemin quand " +"c'est possible." #: doc/classes/Navigation2D.xml msgid "The XY plane cell size to use for fields." -msgstr "" +msgstr "La taille des cellules sur le plan XY pour les champs." #: doc/classes/Navigation2D.xml msgid "" @@ -46290,10 +46582,9 @@ msgstr "" #: doc/classes/Navigation2DServer.xml msgid "Server interface for low-level 2D navigation access." -msgstr "" +msgstr "L'Interface serveur pour un accès bas niveau de la navigation 2D." #: doc/classes/Navigation2DServer.xml -#, fuzzy msgid "" "Navigation2DServer is the server responsible for all 2D navigation. It " "handles several objects, namely maps, regions and agents.\n" @@ -46322,26 +46613,36 @@ msgid "" "phase. This means that you can request any change to the map, using any " "thread, without worrying." msgstr "" -"Le NavigationServer2D est le serveur responsable pour toutes les navigation " -"en 2D. Il gère différents objets, nommés carte, régions et agents.\n" -"Les cartes (\"maps\") sont faites de régions, qui sont faites de maillages " -"de navigation. Ensemble, ces cartes définissent les aires navigables dans le " -"monde 2D. Pour que deux régions soient connectées entre elles, elles doivent " -"avoir une bordure en commun. Une bordure (\"edge\") est considérée connectée " -"à une autre si elles ont deux sommets rapprochés de moins de la distance [" -"member Navigation.edge_connection_margin].\n" -"Pour utiliser le système d'évitement, vous devez utiliser des agents. Vous " -"pouvez définir la vitesse cible d'un agent, puis le serveur émettra une " +"Le NavigationServer2D est le serveur responsable de la navigation 2D. Il " +"gère différents objets appelés cartes, régions et agents.\n" +"Les cartes (\"maps\") sont constituées de régions qui sont faites d'un " +"maillage de polygones de navigation. Ensemble, elles définissent les zones " +"navigables du monde 2D.\n" +"[b]Note :[/b] La plupart des changements effectués sur un NavigationServer " +"ne prennent pas effet immédiatement mais après la frame de physique " +"suivante. Cela inclut tous les changements faits aux cartes, régions ou " +"agents par des nÅ“uds liés à la navigation dans l'arborescence de la scène ou " +"par des scripts.\n" +"Pour que deux régions soient connectées entre elles, celles-ci doivent avoir " +"une bordure en commun. Une bordure (\"edge\") est considérée connectée à une " +"autre si ses deux sommets ont une distance inférieure à [member Navigation." +"edge_connection_margin] des sommets respectifs de l'autre bordure.\n" +"Vous pouvez assigner des couches de navigation aux régions avec [method " +"Navigation2DServer.region_set_navigation_layers], qui pourra ensuite être " +"utilisé en faisant une requête de chemin avec [method Navigation2DServer." +"map_get_path]. Cela permet d'autoriser ou d'interdire certaines zones aux " +"objets 2D.\n" +"Pour utiliser le système d'évitement, vous pouvez utiliser des agents. Vous " +"pouvez définir la vitesse cible d'un agent, le serveur émettra ensuite une " "méthode de rappel avec la vitesse modifiée.\n" "[b]Note :[/b] Le système d'évitement des collisions ignorent les régions. " -"Utiliser la vitesse modifiée telle quelle peut déplacer un agent hors de la " -"surface de navigable. C'est une limite du système d'évitement des " -"collisions, et certaines situations plus complexes peuvent nécessiter " -"l'utilisation du moteur physique.\n" -"Le serveur garde en mémoire tous les appels et les exécutent durant la phase " -"de synchronisation. Cela veut dire que vous pouvez demander n'importe quel " -"changement sur l'ensemble des cartes, via n'importe quel fil d'exécution, " -"sans soucis." +"Utiliser la vitesse modifiée telle quelle peut faire sortir un agent d'une " +"zone navigable. C'est une limite du système d'évitement des collisions et " +"certaines situations plus complexes peuvent nécessiter l'utilisation du " +"moteur physique.\n" +"Le serveur garde en mémoire tous les appels et les exécute durant la phase " +"de synchronisation. Ainsi, vous pouvez demander n'importe quel changement " +"sur la carte, depuis n'importe quel fil d'exécution sans problème." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Creates the agent." @@ -46358,6 +46659,7 @@ msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Returns [code]true[/code] if the map got changed the previous frame." msgstr "" +"Retourne [code]true[/code] si la carte a changé lors de la trame précédente." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" @@ -46389,7 +46691,7 @@ msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the maximum speed of the agent. Must be positive." -msgstr "" +msgstr "Définit la vitesse maximale de l'agent. Ça doit être positif." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" @@ -46404,7 +46706,7 @@ msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the position of the agent in world space." -msgstr "" +msgstr "Définit la position de l'agent dans l'espace global." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the radius of the agent." @@ -46429,7 +46731,7 @@ msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the current velocity of the agent." -msgstr "" +msgstr "Définit la vitesse actuelle de l'agent." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Destroys the given RID." @@ -46483,8 +46785,8 @@ msgstr "" "Cette fonction peut être utilisée pour calculer immédiatement tous les " "maillages de navigation et les connexions entre les régions de la carte de " "navigation. Cela permet d'interroger un chemin de navigation pour une carte " -"modifiée immédiatement et dans la même trame (plusieurs fois si nécessaire)." -"\n" +"modifiée immédiatement et dans la même trame (plusieurs fois si " +"nécessaire).\n" "En raison de restrictions techniques, la file de commandes actuelle de " "NavigationServer sera exécutée aussitôt. Cela signifie que toutes les " "commandes de mise à jour en attente pour cette trame de physique seront " @@ -46518,6 +46820,8 @@ msgstr "" #: doc/classes/Navigation2DServer.xml msgid "Returns the map cell height. [b]Note:[/b] Currently not implemented." msgstr "" +"Retourne la hauteur de la cellule. [b]Note :[/b] N'est pas implémenté pour " +"l'instant." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Returns the map cell size." @@ -46567,7 +46871,7 @@ msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Returns [code]true[/code] if the map is active." -msgstr "" +msgstr "Retourne [code]true[/code] si la carte est active." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the map active." @@ -46578,10 +46882,14 @@ msgid "" "Set the map cell height used to weld the navigation mesh polygons. [b]Note:[/" "b] Currently not implemented." msgstr "" +"Définit la hauteur de la cellule de carte utilisée pour souder les polygones " +"de maillage de navigation. [b]Note :[/b] N'est pas implémenté pour l'instant." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Set the map cell size used to weld the navigation mesh polygons." msgstr "" +"Définit la taille de la cellule de carte utilisée pour souder les polygones " +"de maillage de navigation." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" @@ -46609,8 +46917,9 @@ msgid "" "an index between 0 and the return value of [method " "region_get_connections_count]." msgstr "" -"Retourne le point de départ d'une porte de connexion. [code]connection[/code]" -" est un indice entre 0 et la valeur de [method region_get_connections_count]." +"Retourne le point de départ d'une porte de connexion. [code]connection[/" +"code] est un indice entre 0 et la valeur de [method " +"region_get_connections_count]." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" @@ -46622,15 +46931,15 @@ msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Returns the [code]enter_cost[/code] of this [code]region[/code]." -msgstr "" +msgstr "Retourne le [code]enter_cost[/code] de cette [code]region[/code]." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" "Returns the navigation map [RID] the requested [code]region[/code] is " "currently assigned to." msgstr "" -"Retourne le [RID] de la carte de navigation à laquelle la [code]region[/code]" -" spécifiée est actuellement assignée." +"Retourne le [RID] de la carte de navigation à laquelle la [code]region[/" +"code] spécifiée est actuellement assignée." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Returns the region's navigation layers." @@ -46638,7 +46947,7 @@ msgstr "Retourne les calques de navigation de la région." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." -msgstr "" +msgstr "Retourne le [code]travel_cost[/code] de cette [code]region[/code]." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" @@ -46673,7 +46982,7 @@ msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." -msgstr "" +msgstr "Définit le [code]enter_cost[/code] pour cette [code]region[/code]." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the map for the region." @@ -46698,7 +47007,7 @@ msgstr "Retourne la transformation globale de cette région." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the [code]travel_cost[/code] for this [code]region[/code]." -msgstr "" +msgstr "Définit le [code]travel_cost[/code] pour cette [code]region[/code]." #: doc/classes/NavigationAgent.xml msgid "3D agent used in navigation for collision avoidance." @@ -46834,12 +47143,16 @@ msgid "" "Returns the user-defined target location (set with [method " "set_target_location])." msgstr "" +"Retourne l'emplacement de la cible défini par l'utilisateur (défini avec " +"[method set_target_location])." #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Returns [code]true[/code] if the navigation path's final location has been " "reached." msgstr "" +"Retourne [code]true[/code] si l'emplacement final du parcours de navigation " +"a été atteint." #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" @@ -46856,6 +47169,11 @@ msgid "" "possible to reach the target location. It should always be possible to reach " "the final location though. See [method get_final_location]." msgstr "" +"Retourne [code]true[/code] si l'emplacement cible est atteint. L'emplacement " +"cible est défini en utilisant [method set_target_location]. Il peut parfois " +"ne pas être possible d'atteindre l'emplacement cible. Par contre, il devrait " +"toujours être possible d'atteindre l'emplacement final. Voir [method " +"get_final_location]." #: doc/classes/NavigationAgent.xml msgid "" @@ -46937,7 +47255,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "The maximum number of neighbors for the agent to consider." -msgstr "" +msgstr "Le nombre maximum de voisins à considérer par l'agent." #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "The maximum speed that an agent can move." @@ -46956,7 +47274,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "The distance to search for other agents." -msgstr "" +msgstr "La distance pour chercher d'autres agents." #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" @@ -47036,7 +47354,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "Notifies when the final location is reached." -msgstr "" +msgstr "Notifie quand l'emplacement final est atteint." #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" @@ -47055,9 +47373,10 @@ msgstr "" "set_target_location], est atteinte." #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +#, fuzzy msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" "Notifie quand la vitesse d'évitement de collision est calculée après un " "appel à [method set_velocity]." @@ -47167,6 +47486,8 @@ msgstr "" #: doc/classes/NavigationMesh.xml msgid "A mesh to approximate the walkable areas and obstacles." msgstr "" +"Un maillage pour l'approximation des zones où l'on peut marcher et des " +"obstacles." #: doc/classes/NavigationMesh.xml msgid "" @@ -47174,12 +47495,17 @@ msgid "" "environment are traversable to aid agents in pathfinding through complicated " "spaces." msgstr "" +"Un maillage de navigation est une collection de polygones qui définissent " +"les zones d'un environnement qui peuvent être traversés pour aider les " +"agents dans leur cheminement dans les espaces compliqués." #: doc/classes/NavigationMesh.xml doc/classes/NavigationPolygon.xml msgid "" "Adds a polygon using the indices of the vertices you get when calling " "[method get_vertices]." msgstr "" +"Ajoute un polygone en utilisant les indices des sommets que obtenus avec " +"[method get_vertices]." #: doc/classes/NavigationMesh.xml msgid "" @@ -47192,12 +47518,16 @@ msgid "" "Initializes the navigation mesh by setting the vertices and indices " "according to a [Mesh]." msgstr "" +"Initialise le maillage de navigation en définissant les sommets et les " +"indices dans un [Mesh]." #: doc/classes/NavigationMesh.xml msgid "" "Returns whether the specified [code]bit[/code] of the [member " "geometry_collision_mask] is set." msgstr "" +"Retourne si le [code]bit[/code] spécifié de [member geometry_collision_mask] " +"est défini." #: doc/classes/NavigationMesh.xml doc/classes/NavigationPolygon.xml msgid "" @@ -47209,7 +47539,7 @@ msgstr "" #: doc/classes/NavigationMesh.xml msgid "Returns the number of polygons in the navigation mesh." -msgstr "" +msgstr "Retourne le nombre de polygones dans le maillage de navigation." #: doc/classes/NavigationMesh.xml msgid "" @@ -47236,6 +47566,8 @@ msgid "" "Sets the vertices that can be then indexed to create polygons with the " "[method add_polygon] method." msgstr "" +"Définit les sommets qui peuvent ensuite être indexés pour créer des " +"polygones avec la méthode [method add_polygon]." #: doc/classes/NavigationMesh.xml msgid "" @@ -47244,6 +47576,10 @@ msgid "" "[b]Note:[/b] While baking, this value will be rounded up to the nearest " "multiple of [member cell_height]." msgstr "" +"La hauteur minimale entre le sol et le plafond qui permettra toujours que la " +"surface au sol soit considérée comme pouvant être traversée.\n" +"[b]Note :[/b] Pendant le pré-calcul, cette valeur sera arrondie au multiple " +"le plus proche de [member cell_height]." #: doc/classes/NavigationMesh.xml msgid "" @@ -47251,10 +47587,15 @@ msgid "" "[b]Note:[/b] While baking, this value will be rounded down to the nearest " "multiple of [member cell_height]." msgstr "" +"La hauteur minimale de haie qui est considérée comme toujours pouvant être " +"traversée.\n" +"[b]Note :[/b] Pendant le pré-calcul, cette valeur sera arrondie au multiple " +"le plus proche de [member cell_height]." #: doc/classes/NavigationMesh.xml msgid "The maximum slope that is considered walkable, in degrees." msgstr "" +"La pente maximale qui est considérée comme pouvant être traversée, en degrés." #: doc/classes/NavigationMesh.xml msgid "" @@ -47266,24 +47607,30 @@ msgstr "" #: doc/classes/NavigationMesh.xml msgid "The Y axis cell size to use for fields." -msgstr "" +msgstr "La taille de la cellule suivant l'axe Y pour les champs." #: doc/classes/NavigationMesh.xml msgid "" "The sampling distance to use when generating the detail mesh, in cell unit." msgstr "" +"La distance d'échantillonnage à utiliser pour générer le maillage de détail, " +"dans l'unité des cellules." #: doc/classes/NavigationMesh.xml msgid "" "The maximum distance the detail mesh surface should deviate from " "heightfield, in cell unit." msgstr "" +"La distance maximale de la surface de maillage de détail devrait s'écarter " +"du champ de hauteur, dans l'unité des cellules." #: doc/classes/NavigationMesh.xml msgid "" "The maximum distance a simplfied contour's border edges should deviate the " "original raw contour." msgstr "" +"La distance maximale qu'un contour simplifié peut dévier du contour brut " +"d'origine." #: doc/classes/NavigationMesh.xml msgid "" @@ -47291,6 +47638,10 @@ msgid "" "[b]Note:[/b] While baking, this value will be rounded up to the nearest " "multiple of [member cell_size]." msgstr "" +"La longueur maximale autorisée pour les bords de contour le long de la " +"bordure du maillage.\n" +"[b]Note :[/b] Pendant le pré-calcul, cette valeur sera arrondie au multiple " +"le plus proche de [member cell_height]." #: doc/classes/NavigationMesh.xml msgid "" @@ -47301,6 +47652,7 @@ msgstr "" #: doc/classes/NavigationMesh.xml msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." msgstr "" +"Le décalage de position appliqué au [AABB] de [member filter_baking_aabb]." #: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." @@ -47341,6 +47693,8 @@ msgid "" "The source of the geometry used when baking. See [enum SourceGeometryMode] " "for possible values." msgstr "" +"La source de la géométrie utilisée lors du pré-calcul. Voir [enum " +"SourceGeometryMode] pour les valeurs possibles." #: doc/classes/NavigationMesh.xml msgid "" @@ -47589,6 +47943,8 @@ msgid "" "Removes all polygons and vertices from the provided [code]nav_mesh[/code] " "resource." msgstr "" +"Enlève tous les polygones et les sommets de la ressource [code]nav_mesh[/" +"code] fournie." #: doc/classes/NavigationMeshInstance.xml msgid "An instance of a [NavigationMesh]." @@ -47664,10 +48020,10 @@ msgid "" "identify the [NavigationMeshInstance] closest to a point on the merged " "navigation map." msgstr "" -"Retourne le [RID] de cette région sur [NavigationServer]. Combiné avec [" -"method NavigationServer.map_get_closest_point_owner], peut être utilisé pour " -"identifier le [NavigationMeshInstance] le plus proche d'un point d'une carte " -"de navigation fusionnée." +"Retourne le [RID] de cette région sur [NavigationServer]. Combiné avec " +"[method NavigationServer.map_get_closest_point_owner], peut être utilisé " +"pour identifier le [NavigationMeshInstance] le plus proche d'un point d'une " +"carte de navigation fusionnée." #: doc/classes/NavigationMeshInstance.xml msgid "Determines if the [NavigationMeshInstance] is enabled or disabled." @@ -47707,6 +48063,8 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml msgid "Notifies when the navigation mesh bake operation is completed." msgstr "" +"Notifie quand l'opération de pré-calcul de maillage de navigation est " +"terminée." #: doc/classes/NavigationMeshInstance.xml msgid "Notifies when the [NavigationMesh] has changed." @@ -47844,8 +48202,8 @@ msgid "" "$NavigationPolygonInstance.navpoly = polygon\n" "[/codeblock]" msgstr "" -"Il y a deux façons de créer des polygones. Soit en utilisant la méthode [" -"method add_outline], soit en utilisant la méthode [method add_polygon].\n" +"Il y a deux façons de créer des polygones. Soit en utilisant la méthode " +"[method add_outline], soit en utilisant la méthode [method add_polygon].\n" "Avec [method add_outline] :\n" "[codeblock]\n" "var polygon = NavigationPolygon.new()\n" @@ -47955,20 +48313,20 @@ msgid "" "Removes an outline created in the editor or by script. You have to call " "[method make_polygons_from_outlines] for the polygons to update." msgstr "" -"Enlève un aperçu créé dans l'éditeur ou par un script. Vous devez appeler [" -"method make_polygons_from_outlines] pour mettre à jour les polygones." +"Enlève un aperçu créé dans l'éditeur ou par un script. Vous devez appeler " +"[method make_polygons_from_outlines] pour mettre à jour les polygones." #: doc/classes/NavigationPolygon.xml msgid "" "Changes an outline created in the editor or by script. You have to call " "[method make_polygons_from_outlines] for the polygons to update." msgstr "" -"Change un aperçu créé dans l'éditeur ou par un script. Vous devez appeler [" -"method make_polygons_from_outlines] pour mettre à jour les polygones." +"Change un aperçu créé dans l'éditeur ou par un script. Vous devez appeler " +"[method make_polygons_from_outlines] pour mettre à jour les polygones." #: doc/classes/NavigationPolygonInstance.xml msgid "A region of the 2D navigation map." -msgstr "" +msgstr "Une région de la carte de navigation 2D." #: doc/classes/NavigationPolygonInstance.xml msgid "" @@ -47997,8 +48355,8 @@ msgstr "" "la carte de navigation du nÅ“ud de navigation.\n" "Deux régions peuvent être reliées l'une à l'autre si elles partagent un bord " "similaire. Vous pouvez définir la distance minimale entre deux sommets " -"nécessaires pour connecter deux bords en utilisant [method Navigation2DServer" -".map_set_edge_connection_margin]\n" +"nécessaires pour connecter deux bords en utilisant [method " +"Navigation2DServer.map_set_edge_connection_margin]\n" "[b]Note :[/b] Embiquer deux régions ne suffit pas pour relier ces deux " "régions. Elles doivent partager un bord similaire.\n" "Le coût de cheminement de cette région vers une autre peut être contrôlé " @@ -48015,10 +48373,10 @@ msgid "" "identify the [NavigationPolygonInstance] closest to a point on the merged " "navigation map." msgstr "" -"Retourne le [RID] de cette région sur le [Navigation2DServer]. Combiné avec [" -"method Navigation2DServer.map_get_closest_point_propriétaire] peut permettre " -"d'identifier le [NavigationPolygonInstance] le plus proche d'un point sur la " -"carte de navigation fusionnée." +"Retourne le [RID] de cette région sur le [Navigation2DServer]. Combiné avec " +"[method Navigation2DServer.map_get_closest_point_propriétaire] peut " +"permettre d'identifier le [NavigationPolygonInstance] le plus proche d'un " +"point sur la carte de navigation fusionnée." #: doc/classes/NavigationPolygonInstance.xml msgid "Determines if the [NavigationPolygonInstance] is enabled or disabled." @@ -48038,10 +48396,9 @@ msgstr "La ressource [NavigationPolygon] à utiliser." #: doc/classes/NavigationServer.xml msgid "Server interface for low-level 3D navigation access." -msgstr "" +msgstr "Interface serveur pour un accès de navigation 3D de bas niveau." #: doc/classes/NavigationServer.xml -#, fuzzy msgid "" "NavigationServer is the server responsible for all 3D navigation. It handles " "several objects, namely maps, regions and agents.\n" @@ -48089,12 +48446,14 @@ msgstr "" #: doc/classes/NavigationServer.xml msgid "Returns the map cell height." -msgstr "" +msgstr "Retourne la hauteur de la cellule de la carte." #: doc/classes/NavigationServer.xml msgid "" "Returns the normal for the point returned by [method map_get_closest_point]." msgstr "" +"Retourne la normale pour le point retourné par [method " +"map_get_closest_point]." #: doc/classes/NavigationServer.xml msgid "" @@ -48118,6 +48477,8 @@ msgstr "Retourne la direction haut de la carte." #: doc/classes/NavigationServer.xml msgid "Set the map cell height used to weld the navigation mesh polygons." msgstr "" +"Définit la hauteur de la cellule de carte utilisée pour souder les polygones " +"de maillage de navigation." #: doc/classes/NavigationServer.xml msgid "Sets the map up direction." @@ -48157,6 +48518,8 @@ msgid "" "A [NetworkedMultiplayerPeer] implementation that can be controlled from a " "script." msgstr "" +"Une implémentation de [NetworkedMultiplayerPeer] qui peut être contrôlée à " +"partir d'un script." #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" @@ -48165,6 +48528,11 @@ msgid "" "Its purpose is to allow adding a new backend for the high-Level multiplayer " "API without needing to use GDNative." msgstr "" +"Une implémentation de [NetworkedMultiplayerPeer] qui peut être utilisée " +"comme un [member MultiplayerAPI.network_peer] et contrôlée à partir d'un " +"script.\n" +"Son but est de permettre d'ajouter un nouveau backend haut niveau pour l'API " +"multijoueur sans avoir besoin d'utiliser GDNative." #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" @@ -48173,24 +48541,38 @@ msgid "" "(originating from the [signal packet_generated] signal on the sending peer), " "passing it to this method will deliver it locally." msgstr "" +"Envoie un paquet au [MultiplayerAPI] local.\n" +"Lorsque votre script reçoit un paquet d'autres pairs sur le réseau (à partir " +"du signal [signal packet_generated] sur le pair que l'envoie), il le " +"transmet à cette méthode en local." #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" -"Retourne l'état actuel de la connexion. Voir [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." #: doc/classes/NetworkedMultiplayerCustom.xml msgid "Set the max packet size that this peer can handle." -msgstr "" +msgstr "Définit la taille maximale du paquet que ce pair peut traiter." #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" @@ -48199,6 +48581,10 @@ msgid "" "the network (which should call [method deliver_packet] with the data when " "it's received)." msgstr "" +"Émis lorsque le [MultiplayerAPI] local génère un paquet.\n" +"Votre script devrait prendre ce paquet et l'envoyer au pair spécifié sur le " +"réseau (qui devrait appeler [method deliver_packet] avec les données " +"lorsqu'il reçoit)." #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml msgid "" @@ -48282,9 +48668,9 @@ msgstr "" "client a été créé, [constant ERR_ALREADY_IN_USE] si ce " "NetworkedMultiplayerENet a déjà une connexion ouverte (dans quel cas vous " "devez appeler [method close_connection] d'abord) ou [constant " -"ERR_CANT_CREATE] si le client ne peut pas être créé. Si " -"[code]client_port[/code] est spécifié, le client écoutera également le port " -"donné ; ceci est utile pour certaines techniques NAT transversale." +"ERR_CANT_CREATE] si le client ne peut pas être créé. Si [code]client_port[/" +"code] est spécifié, le client écoutera également le port donné ; ceci est " +"utile pour certaines techniques NAT transversale." #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml msgid "" @@ -48340,8 +48726,8 @@ msgid "" "Returns the channel of the next packet that will be retrieved via [method " "PacketPeer.get_packet]." msgstr "" -"Retourne le canal du prochain paquet qui sera récupéré via [method PacketPeer" -".get_packet]." +"Retourne le canal du prochain paquet qui sera récupéré via [method " +"PacketPeer.get_packet]." #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml #: modules/websocket/doc_classes/WebSocketServer.xml @@ -49449,11 +49835,11 @@ msgid "" "[method get_node] instead. To avoid using [method find_parent] too often, " "consider caching the node reference into a variable." msgstr "" -"Trouve le premier parent de ce nÅ“ud dont le nom correspond à " -"[code]mask[/code] suivant le même fonctionnement que pour [method String." -"match] (c'est-à -dire sensible à la casse, que [code]\"*\"[/code] correspond " -"à un zéro au un seul caractère, et que [code]\"?\"[/code] correspond à " -"n'importe quel unique caractère sauf [code]\".\"[/code]).\n" +"Trouve le premier parent de ce nÅ“ud dont le nom correspond à [code]mask[/" +"code] suivant le même fonctionnement que pour [method String.match] (c'est-à -" +"dire sensible à la casse, que [code]\"*\"[/code] correspond à un zéro au un " +"seul caractère, et que [code]\"?\"[/code] correspond à n'importe quel unique " +"caractère sauf [code]\".\"[/code]).\n" "[b]Note :[/b] La correspondance ne se fait pas sur le chemin complet mais " "juste les noms des nÅ“uds.\n" "[b]Note :[/b] Comme cette méthode liste tous les parents d'un nÅ“ud, c'est le " @@ -49669,9 +50055,9 @@ msgid "" "processing unless the frames per second is changed via [member Engine." "iterations_per_second]." msgstr "" -"Retourne le temps écoulé (en secondes) depuis la dernière trame physique (" -"voir [method _physics_process]). C'est toujours une valeur constante dans le " -"traitement de la physique à moins que les trames par seconde ne soient " +"Retourne le temps écoulé (en secondes) depuis la dernière trame physique " +"(voir [method _physics_process]). C'est toujours une valeur constante dans " +"le traitement de la physique à moins que les trames par seconde ne soient " "changés via [member Engine.iterations_per_second]." #: doc/classes/Node.xml @@ -49746,6 +50132,8 @@ msgid "" "Returns [code]true[/code] if the given node occurs later in the scene " "hierarchy than the current node." msgstr "" +"Retourne [code]true[/code] si le nÅ“ud donné apparait plus tard dans la " +"hiérarchie de la scène que le nÅ“ud actuel." #: doc/classes/Node.xml msgid "" @@ -49790,8 +50178,8 @@ msgid "" "See [member SceneTree.physics_interpolation] and [member ProjectSettings." "physics/common/physics_interpolation]." msgstr "" -"Retourne [code]true[/code] si l'interpolation physique est activée (voir [" -"member physics_interpolation_mode]) [b]et[/b] activée dans [SceneTree].\n" +"Retourne [code]true[/code] si l'interpolation physique est activée (voir " +"[member physics_interpolation_mode]) [b]et[/b] activée dans [SceneTree].\n" "Il s'agit d'une version pratique de [method is_physics_interpolated] qui " "vérifie également si l'interpolation physique est activée globalement.\n" "Voir [member SceneTree.physics_interpolation] et [member ProjectSettings." @@ -50127,13 +50515,13 @@ msgid "" "By default, methods are not exposed to networking (and RPCs). See also " "[method rset] and [method rset_config] for properties." msgstr "" -"Change le mode RPC pour la [code]method[/code] donné pour le " -"[code]mode[/code] spécifié. Voir [enum MultiplayerAPI.RPCMode]. Une " -"alternative est d'annoter les méthodes et les propriétés avec les mots-clés " -"correspondants ([code]remote[/code], [code]master[/code], [code]puppet[/code]" -", [code]remotesync[/code], [code]mastersync[/code], [code]puppetsync[/code])" -". Par défaut, les méthodes ne sont pas exposées au réseaut (et aux RPC). " -"Voir aussi [method rset] et [method rset_config] pour les propriétés." +"Change le mode RPC pour la [code]method[/code] donné pour le [code]mode[/" +"code] spécifié. Voir [enum MultiplayerAPI.RPCMode]. Une alternative est " +"d'annoter les méthodes et les propriétés avec les mots-clés correspondants " +"([code]remote[/code], [code]master[/code], [code]puppet[/code], " +"[code]remotesync[/code], [code]mastersync[/code], [code]puppetsync[/code]). " +"Par défaut, les méthodes ne sont pas exposées au réseaut (et aux RPC). Voir " +"aussi [method rset] et [method rset_config] pour les propriétés." #: doc/classes/Node.xml msgid "" @@ -50187,22 +50575,26 @@ msgstr "" "Change le mode RPC pour la [code]property[/code] donnée au [code]mode[/code] " "spécifié. Voir [enum MultiplayerAPI.RPCMode]. Une alternative est " "l'annotation des méthodes et des propriétés avec les mots-clés " -"correspondants ([code]remote[/code], [code]master[/code], [code]puppet[/code]" -", [code]remotesync[/code], [code]mastersync[/code], [code]puppetsync[/code])" -". Par défaut, les propriétés ne sont pas exposées au réseau (et au RPC). " -"Voir aussi [method rpc] et [method rpc_config] pour les méthodes." +"correspondants ([code]remote[/code], [code]master[/code], [code]puppet[/" +"code], [code]remotesync[/code], [code]mastersync[/code], [code]puppetsync[/" +"code]). Par défaut, les propriétés ne sont pas exposées au réseau (et au " +"RPC). Voir aussi [method rpc] et [method rpc_config] pour les méthodes." #: doc/classes/Node.xml msgid "" "Remotely changes the property's value on a specific peer identified by " "[code]peer_id[/code] (see [method NetworkedMultiplayerPeer.set_target_peer])." msgstr "" +"Modifie à distance de la valeur de la propriété indiquée par [code]peer_id[/" +"code] (voir [method NetworkedMultiplayerPeer.set_target_peer])." #: doc/classes/Node.xml msgid "" "Remotely changes the property's value on other peers (and locally) using an " "unreliable protocol." msgstr "" +"Modifie à distance la valeur de propriété enregistrée sur d'autres pairs (et " +"localement) en utilisant un protocole non fiable." #: doc/classes/Node.xml msgid "" @@ -50210,10 +50602,13 @@ msgid "" "[code]peer_id[/code] using an unreliable protocol (see [method " "NetworkedMultiplayerPeer.set_target_peer])." msgstr "" +"Modifie à distance de la valeur de la propriété suivante sur un pair " +"spécifique identifié par [code]peer_id[/code] en utilisant un protocole non " +"fiable (voir [method NetworkedMultiplayerPeer.set_target_peer])." #: doc/classes/Node.xml msgid "Sets the folded state of the node in the Scene dock." -msgstr "" +msgstr "Définit l'état réduit du nÅ“ud dans le dock de Scène." #: doc/classes/Node.xml msgid "" @@ -50224,6 +50619,12 @@ msgid "" "defaults to peer ID 1 (the server). If [code]recursive[/code], the given " "peer is recursively set as the master for all children of this node." msgstr "" +"Définit le nÅ“ud maître du réseau au pair avec l'identifiant de pair donné. " +"Le maître du réseau est le pair qui a autorité sur le nÅ“ud sur le réseau. " +"Utile avec les mots-clés [code]master[/code] et [code]puppet[/code]. " +"Inhérité du nÅ“ud parent par défaut, qui a par défaut l'identifiant 1 (le " +"serveur). Si [code]recursive[/code], le pair donné est récursivement défini " +"comme le maître pour tous les enfants de ce nÅ“ud." #: doc/classes/Node.xml msgid "" @@ -50235,6 +50636,13 @@ msgid "" "if [method _physics_process] is overridden. Any calls to this before [method " "_ready] will be ignored." msgstr "" +"Active ou désactive le traitement physique (c'est-à -dire les trames fixes). " +"Lorsqu'un nÅ“ud est en cours de traitement, il recevra la notification " +"[constant NOTIFICATION_PHYSICS_PROCESS] à un intervalle fixe (généralement " +"60 FPS, voir [member Engine.iterations_per_second] pour le changer), et le " +"callback [method physique_process] sera appelé s'il existe. Est activé " +"automatiquement si [method physique_process] est surchargé. Tout appel à " +"cela avant [method _ready] sera ignoré." #: doc/classes/Node.xml msgid "" @@ -50293,11 +50701,16 @@ msgid "" "_unhandled_key_input] is overridden. Any calls to this before [method " "_ready] will be ignored." msgstr "" +"Permet un traitement des touches d'entrée non traitées. Activé " +"automatiquement si [method unhandled_key_input] est surchargé. Tout appel à " +"cela avant [method _ready] sera ignoré." #: doc/classes/Node.xml msgid "" "Sets whether this is an instance load placeholder. See [InstancePlaceholder]." msgstr "" +"Définit s'il s'agit d'un chargeur fictif d'instance. Voir " +"[InstancePlaceholder]." #: doc/classes/Node.xml msgid "" @@ -50305,12 +50718,17 @@ msgid "" "Use [method _get_configuration_warning] to setup the warning message to " "display." msgstr "" +"Met à jour l'avertissement affiché pour ce nÅ“ud dans le dock de Scène.\n" +"Utilisez [method get_configuration_warning] pour configurer le message " +"d'avertissement à afficher." #: doc/classes/Node.xml msgid "" "The override to the default [MultiplayerAPI]. Set to [code]null[/code] to " "use the default [SceneTree] one." msgstr "" +"La surcharge de la valeur par défaut du [MultiplayerAPI]. Définissez-le à " +"[code]null[/code] pour utiliser la valeur par défaut de [SceneTree]." #: doc/classes/Node.xml msgid "" @@ -50319,12 +50737,19 @@ msgid "" "[code]res://levels/1.tscn[/code]). Otherwise, [member filename] is set to an " "empty string." msgstr "" +"Si une scène est instanciée à partir d'un fichier, son nÅ“ud le plus haut " +"contient le chemin de fichier absolu à partir duquel elle a été chargée " +"depuis [member filename] (par exemple [code]res://levels/1.tscn[/code]). " +"Sinon, [member filename] sera une chaîne vide." #: doc/classes/Node.xml msgid "" "The [MultiplayerAPI] instance associated with this node. Either the [member " "custom_multiplayer], or the default SceneTree one (if inside tree)." msgstr "" +"L'instance [MultiplayerAPI] associée à ce nÅ“ud. Soit le [member " +"custom_multiplayer], ou la SceneTree par défaut (si l'intérieur de " +"l'arborescence)." #: doc/classes/Node.xml msgid "" @@ -50376,6 +50801,11 @@ msgid "" "process priority value is [i]lower[/i] will have their processing callbacks " "executed first." msgstr "" +"La priorité du nÅ“ud dans l'ordre d'exécution des appels de traitement " +"activés (c'est-à -dire [constant NOTIFICATION_PROCESS], [constant " +"NOTIFICATION_PHYSICS_PROCESS] et leurs homologues internes). Les nÅ“uds dont " +"la valeur de priorité d'exécution est [i]plus basse[/i] auront leurs appels " +"de traitement exécutés en premier." #: doc/classes/Node.xml msgid "" @@ -50393,6 +50823,10 @@ msgid "" "This signal is emitted [i]after[/i] the child node's own [constant " "NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" +"Émis lorsqu'un nÅ“ud enfant entre dans l'arborescence, soit parce qu'il est " +"entré seul ou parce que ce nÅ“ud est entré avec lui.\n" +"Ce signal est émis [i]après[/i] [constant NOTIFICATION_ENTER_TREE] et " +"[signal tree_entered] de cet enfant." #: doc/classes/Node.xml msgid "" @@ -50403,6 +50837,12 @@ msgid "" "tree and valid. This signal is emitted [i]after[/i] the child node's own " "[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" +"Émis lorsqu'un nÅ“ud d'enfant var quitter l'arborescence, soit parce qu'il " +"est enlevé ou libéré directement, soit parce que ce nÅ“ud sort de " +"l'arborescence.\n" +"Lorsque ce signal est reçu, le [code]node[/code] enfant est toujours dans " +"l'arborescence et valide. Ce signal est émis [i]après[/i] [signal " +"tree_exiting] et [constant NOTIFICATION_EXIT_TREE] de cet enfant." #: doc/classes/Node.xml msgid "Emitted when the node is ready." @@ -50418,6 +50858,9 @@ msgid "" "This signal is emitted [i]after[/i] the related [constant " "NOTIFICATION_ENTER_TREE] notification." msgstr "" +"Émis quand le nÅ“ud entre dans l'arborescence.\n" +"Ce signal est émis [i]après[/i] la notification correspondante [constant " +"NOTIFICATION_ENTER_TREE]." #: doc/classes/Node.xml msgid "Emitted after the node exits the tree and is no longer active." @@ -50430,12 +50873,19 @@ msgid "" "This signal is emitted [i]before[/i] the related [constant " "NOTIFICATION_EXIT_TREE] notification." msgstr "" +"Émis quand le nÅ“ud est encore actif mais sur le point de quitter " +"l'arborescence. C'est le bon endroit pour la de-initialisation (ou d'appel " +"au \"destructeur\").\n" +"Ce signal est émis [i]avant[/i] la notification correspondante [constant " +"NOTIFICATION_EXIT_TREE]." #: doc/classes/Node.xml msgid "" "Notification received when the node enters a [SceneTree].\n" "This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" +"La notification reçue lorsque le nÅ“ud entre dans un [SceneTree].\n" +"Cette notification est émise [i]avant[/i] la [signal tree_entered]." #: doc/classes/Node.xml msgid "" @@ -50467,24 +50917,34 @@ msgid "" "Notification received every frame when the physics process flag is set (see " "[method set_physics_process])." msgstr "" +"La notification reçue chaque trame lorsque le drapeau du processus de " +"physique est défini (voir [method set_physics_process])." #: doc/classes/Node.xml msgid "" "Notification received every frame when the process flag is set (see [method " "set_process])." msgstr "" +"La notification a reçu chaque trame lorsque le drapeau de processus est " +"défini (voir [method set_process])." #: doc/classes/Node.xml msgid "" "Notification received when a node is set as a child of another node.\n" "[b]Note:[/b] This doesn't mean that a node entered the [SceneTree]." msgstr "" +"La notification reçue lorsqu'un nÅ“ud est défini comme un enfant d'un autre " +"nÅ“ud.\n" +"[b]Note :[/b] Cela ne signifie pas que le nÅ“ud est nécessairement entré dans " +"le [SceneTree]." #: doc/classes/Node.xml msgid "" "Notification received when a node is unparented (parent removed it from the " "list of children)." msgstr "" +"La notification reçue lorsqu'un nÅ“ud n'a plus de parent (le parent l'a " +"retiré de sa liste d'enfants)." #: doc/classes/Node.xml msgid "Notification received when the node is instanced." @@ -50504,6 +50964,9 @@ msgid "" "Notification received when a drag operation ends.\n" "Use [method Viewport.gui_is_drag_successful] to check if the drag succeeded." msgstr "" +"La notification reçue à la fin d'une opération de déposé-glissé.\n" +"Utilisez [method Viewport.gui_is_drag_successful] pour vérifier si " +"l'opération a réussi." #: doc/classes/Node.xml msgid "Notification received when the node's [NodePath] changed." @@ -50514,12 +50977,16 @@ msgid "" "Notification received every frame when the internal process flag is set (see " "[method set_process_internal])." msgstr "" +"La notification a reçu chaque trame lorsque le drapeau interne du processus " +"est défini (voir [method set_process_internal])." #: doc/classes/Node.xml msgid "" "Notification received every frame when the internal physics process flag is " "set (see [method set_physics_process_internal])." msgstr "" +"La notification a reçu chaque trame lorsque le drapeau du processus physique " +"interne est défini (voir [method set_physics_process_internal])." #: doc/classes/Node.xml msgid "" @@ -50527,12 +50994,18 @@ msgid "" "NOTIFICATION_READY] is received. Unlike the latter, it's sent every time the " "node enters tree, instead of only once." msgstr "" +"La notification reçue lorsque le nÅ“ud est prêt, juste avant que [constant " +"NOTIFICATION_READY] soit reçue. Contrairement à cette dernière, cette " +"notification est envoyée chaque fois que le nÅ“ud entre dans l'arborescence, " +"et pas juste une seule fois." #: doc/classes/Node.xml msgid "" "Notification received when [method reset_physics_interpolation] is called on " "the node or parent nodes." msgstr "" +"La notification reçue lorsque [method reset_physics_interpolation] est " +"appelée sur le nÅ“ud ou les nÅ“uds parents." #: doc/classes/Node.xml msgid "" @@ -50546,25 +51019,32 @@ msgstr "Arrête la mise à jour quand le [SceneTree] est en pause." #: doc/classes/Node.xml msgid "Continue to process regardless of the [SceneTree] pause state." -msgstr "" +msgstr "Continuer le processus peu importe l'état de pause de la [SceneTree]." #: doc/classes/Node.xml msgid "" "Inherits physics interpolation mode from the node's parent. For the root " "node, it is equivalent to [constant PHYSICS_INTERPOLATION_MODE_ON]. Default." msgstr "" +"Inhérit le mode d'interpolation physique de la part du nÅ“ud parent. Pour le " +"nÅ“ud racine, c'est équivalent à [constant PHYSICS_INTERPOLATION_MODE_ON]. " +"C'est la valeur par défaut." #: doc/classes/Node.xml msgid "" "Turn off physics interpolation in this node and children set to [constant " "PHYSICS_INTERPOLATION_MODE_INHERIT]." msgstr "" +"Désactive l'interpolation physique de ce nÅ“ud et ses enfants qui sont " +"définis à [constant PHYSICS_INTERPOLATION_MODE_INHERIT]." #: doc/classes/Node.xml msgid "" "Turn on physics interpolation in this node and children set to [constant " "PHYSICS_INTERPOLATION_MODE_INHERIT]." msgstr "" +"Active l'interpolation physique de ce nÅ“ud et ses enfants qui sont définis à " +"[constant PHYSICS_INTERPOLATION_MODE_INHERIT]." #: doc/classes/Node.xml msgid "Duplicate the node's signals." @@ -50584,12 +51064,17 @@ msgid "" "An instance stays linked to the original so when the original changes, the " "instance changes too." msgstr "" +"Duplique via instanciation.\n" +"Une instance reste liée à l'original de sorte que lorsque l'original change, " +"l'instance change aussi." #: doc/classes/Node2D.xml msgid "" "A 2D game object, inherited by all 2D-related nodes. Has a position, " "rotation, scale, and Z index." msgstr "" +"Un objet de jeu 2D, hérité de tous les nÅ“uds 2D. A une position, une " +"rotation, une mise à l'échelle et un indice de profondeur Z." #: doc/classes/Node2D.xml msgid "" @@ -50598,6 +51083,11 @@ msgid "" "Node2D as a parent node to move, scale and rotate children in a 2D project. " "Also gives control of the node's render order." msgstr "" +"Un objet 2D de jeu, avec une transformation (position, rotation et mise à " +"l'échelle). Tous les nÅ“uds 2D, y compris les objets de physique et les " +"sprites, héritent de Node2D. Utilisez Node2D comme nÅ“ud parent pour " +"déplacer, mettre à l'échelle et pivoter des enfants dans un projet 2D. donne " +"également le contrôle sur l'ordre de rendu des nÅ“uds." #: doc/classes/Node2D.xml doc/classes/Vector2.xml msgid "All 2D Demos" @@ -50614,6 +51104,9 @@ msgid "" "[url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/" "node2d_get_angle_to.png]Illustration of the returned angle.[/url]" msgstr "" +"Retourne l'angle entre le nÅ“ud et le [code]point[/code] en radians.\n" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/" +"nÅ“ud2d_get_angle_to.png]Illustration de l'angle retourné.[/url]" #: doc/classes/Node2D.xml msgid "Returns the [Transform2D] relative to this node's parent." @@ -50630,6 +51123,8 @@ msgid "" "Rotates the node so it points towards the [code]point[/code], which is " "expected to use global coordinates." msgstr "" +"Pivote le nÅ“ud pour qu'il pointe vers [code]point[/code], en supposant ça se " +"passe avec des coordonnées globales." #: doc/classes/Node2D.xml msgid "" @@ -50637,6 +51132,9 @@ msgid "" "_process]'s [code]delta[/code]. If [code]scaled[/code] is [code]false[/" "code], normalizes the movement." msgstr "" +"Applique un déplacement locale selon l'axe X du nÅ“ud suivant [code]delta[/" +"code] depuis [method Node._process]. Si [code]scaled[/code] est [code]false[/" +"code], le déplacement sera normalisé." #: doc/classes/Node2D.xml msgid "" @@ -50644,12 +51142,16 @@ msgid "" "_process]'s [code]delta[/code]. If [code]scaled[/code] is [code]false[/" "code], normalizes the movement." msgstr "" +"Applique un déplacement locale selon l'axe Y du nÅ“ud suivant [code]delta[/" +"code] depuis [method Node._process]. Si [code]scaled[/code] est [code]false[/" +"code], le déplacement sera normalisé." #: doc/classes/Node2D.xml msgid "" "Applies a rotation to the node, in radians, starting from its current " "rotation." msgstr "" +"Applique une rotation au nÅ“ud, en radians, à partir de son actuelle rotation." #: doc/classes/Node2D.xml msgid "" @@ -50698,7 +51200,7 @@ msgstr "[Transform2D] global." #: doc/classes/Node2D.xml msgid "Position, relative to the node's parent." -msgstr "" +msgstr "La position, relative au nÅ“ud parent." #: doc/classes/Node2D.xml msgid "Rotation in radians, relative to the node's parent." @@ -50728,6 +51230,9 @@ msgid "" "index. If this node's Z index is 2 and its parent's effective Z index is 3, " "then this node's effective Z index will be 2 + 3 = 5." msgstr "" +"Si [code]true[/code], l'indice n'est pas défini comme étant relatif à " +"l'indice Z. Si l'indice Z du nÅ“ud est de 2 et que l'indice Z actuel du " +"parent est de 3, l'indice Z de ce nÅ“ud sera au final 2 + 3 = 5." #: doc/classes/Node2D.xml msgid "" @@ -50736,6 +51241,10 @@ msgid "" "VisualServer.CANVAS_ITEM_Z_MIN] and [constant VisualServer." "CANVAS_ITEM_Z_MAX] (inclusive)." msgstr "" +"Indice Z. Control l'ordre dans lequel les nÅ“uds sont affichés. Un nÅ“ud avec " +"un indice Z supérieur s'affichera devant les autres. Doit être définit entre " +"[constant VisualServer.CANVAS_ITEM_Z_MIN] et [constant VisualServer." +"CANVAS_ITEM_Z_MAX] (inclus)." #: doc/classes/NodePath.xml msgid "Pre-parsed scene tree path." @@ -50885,6 +51394,19 @@ msgid "" "print(property_path) # :position:x\n" "[/codeblock]" msgstr "" +"Retourne un chemin de nÅ“ud avec un caractère deux points ([code]:[/code]) " +"ajouté, le transformant en un chemin de propriété pur sans nom de nÅ“ud (par " +"défaut de résolution du nÅ“ud actuel).\n" +"[codeblock]\n" +"# Ce sera interprété comme un chemin de nÅ“ud vers la propriété \"x\" dans le " +"nÅ“ud \"position\".\n" +"d'appel au nÅ“ud_path = NodePath).\n" +"var node_path = NodePath(\"position:x\")\n" +"# Cela sera interprété comme un chemin de nÅ“ud vers le composant \"x\" de la " +"propriété \"position\" du nÅ“ud actuel.\n" +"var property_path = node_path.get_as_property_path()\n" +"print(property_path) # :position:x\n" +"[/codeblock]" #: doc/classes/NodePath.xml msgid "" @@ -50929,6 +51451,9 @@ msgid "" "get_subname_count]) are not included.\n" "For example, [code]\"Path2D/PathFollow2D/Sprite\"[/code] has 3 names." msgstr "" +"Retourne le nombre de noms de nÅ“uds qui composent le chemin. Les sous-noms " +"(voir [method get_subname_count]) ne sont pas inclus.\n" +"Par exemple, [code]\"Path2D/PathFollow2D/Sprite\"[/code] a 3 noms." #: doc/classes/NodePath.xml msgid "" @@ -50956,6 +51481,11 @@ msgid "" "For example, [code]\"Path2D/PathFollow2D/Sprite:texture:load_path\"[/code] " "has 2 subnames." msgstr "" +"Retourne le nombre de noms de ressources ou de propriétés (\"sous-noms\") " +"dans le chemin. Chaque sous-nom est répertorié après deux points ([code]:[/" +"code]) dans le chemin du nÅ“ud.\n" +"Par exemple, [code]\"Path2D/PathFollow2D/Sprite:texture:load_path\"[/code] a " +"2 sous-noms." #: doc/classes/NodePath.xml msgid "" @@ -50965,6 +51495,11 @@ msgid "" "root\"[/code]) or autoloads (e.g. [code]\"/global\"[/code] if a \"global\" " "autoload was registered)." msgstr "" +"Retourne [code]true[/code] si le chemin du nÅ“ud est absolu (et non relatif), " +"ce qui signifie qu'il commence par une barre oblique ([code]/[/code]). Les " +"chemins de nÅ“uds absolus peuvent être utilisés pour accéder au nÅ“ud racine " +"([code]\"/root\"[/code]) ou pour les chargements automatiques (par exemple " +"[code]\"/global\"[/code] si \"global\" est chargé automatiquement)." #: doc/classes/NodePath.xml msgid "Returns [code]true[/code] if the node path is empty." @@ -51010,12 +51545,17 @@ msgid "" "If [code]true[/code], the resulting texture contains a normal map created " "from the original noise interpreted as a bump map." msgstr "" +"Si [code]true[/code], la texture résultante contient une carte normale créée " +"à partir du bruit original interprété comme une carte de bosse." #: modules/opensimplex/doc_classes/NoiseTexture.xml msgid "" "Strength of the bump maps used in this texture. A higher value will make the " "bump maps appear larger while a lower value will make them appear softer." msgstr "" +"L'intensité des cartes de bosse utilisées dans cette texture. Une valeur " +"plus élevée rendra les cartes de bosse plus grandes alors qu'une valeur plus " +"basse les rendra plus douces." #: modules/opensimplex/doc_classes/NoiseTexture.xml msgid "Height of the generated texture." @@ -51031,6 +51571,9 @@ msgid "" "of the generated noise. This value is ignored if [member seamless] is " "enabled." msgstr "" +"Un décalage utilisé pour préciser la coordonnées de l'espace de bruit du " +"coin supérieur gauche du bruit généré. Cette valeur est ignorée si [member " +"seamless] est activé." #: modules/opensimplex/doc_classes/NoiseTexture.xml msgid "" @@ -51139,6 +51682,10 @@ msgid "" "Returns the given property. Returns [code]null[/code] if the [code]property[/" "code] does not exist." msgstr "" +"Une méthode virtuelle qui peut être surchargée pour personnaliser la valeur " +"de retour de [method get].\n" +"Retourne la propriété donnée. Retourne [code]null[/code] si [code]property[/" +"code] n'existe pas." #: doc/classes/Object.xml msgid "" @@ -51161,6 +51708,12 @@ msgid "" "class. If any other means (such as [method PackedScene.instance]) is used, " "then initialization will fail." msgstr "" +"Appelé lorsque l'objet est initialisé en mémoire. Peut prendre des " +"paramètres, qui sont passés dans lors de la construction.\n" +"[b]Note :[/b] Si [method _init] est défini avec les paramètres requis, alors " +"la construction explicite (via le code) est le seul moyen valable de créer " +"un objet de cette classe. Si d'autres moyens (comme [method PackedScene." +"instance]) sont utilisés, l'initialisation échouera." #: doc/classes/Object.xml msgid "" @@ -51170,6 +51723,11 @@ msgid "" "NOTIFICATION_PREDELETE], but subclasses such as [Node] define a lot more " "notifications which are also received by this method." msgstr "" +"Appelé chaque fois que l'objet reçoit une notification, qui est identifiée " +"par [code]what[/code] qui est une constante. Le [Object] de base a deux " +"constantes [constant NOTIFICATION_POSTINITIALIZE] et [constant " +"NOTIFICATION_PREDELETE], mais les sous-classes comme [Node] définissent " +"beaucoup plus de notifications qui sont également reçues par cette méthode." #: doc/classes/Object.xml msgid "" @@ -51178,6 +51736,10 @@ msgid "" "Sets a property. Returns [code]true[/code] if the [code]property[/code] " "exists." msgstr "" +"La méthode virtuelle qui peut être surchargée pour personnaliser la valeur " +"de retour de [method set].\n" +"Définit une propriété. Retourne [code]true[/code] si la [code]property[/" +"code] existe." #: doc/classes/Object.xml msgid "" @@ -51187,6 +51749,12 @@ msgid "" "Returns a [String] representing the object. If not overridden, defaults to " "[code]\"[ClassName:RID]\"[/code]." msgstr "" +"Une méthode virtuelle qui peut être remplacée pour personnaliser la valeur " +"de retour de [method to_string], et donc la représentation de l'objet s'il " +"est converti en chaîne de caractère, par exemple avec [code]print(obj)[/" +"code].\n" +"Retourne une [String] représentant l'objet. Si ce n'est pas le cas, le " +"format [code]\"[ClassName:RID]\"[/code] se retourné par défaut." #: doc/classes/Object.xml msgid "" @@ -51269,6 +51837,8 @@ msgid "" "Returns [code]true[/code] if the object can translate strings. See [method " "set_message_translation] and [method tr]." msgstr "" +"Retourne [code]true[/code] si l'objet peut traduire des chaînes de " +"caractères. Voir [method set_message_translation] et [method tr]." #: doc/classes/Object.xml msgid "" @@ -51345,6 +51915,11 @@ msgid "" "print an error. Use [method is_connected] to ensure that the connection " "exists." msgstr "" +"Déconnecte le [code]signal[/code] d'une [code]method[/code] pour la cible " +"[code]target[/code] donnée.\n" +"Si vous essayez de déconnecter une connexion qui n'existe pas, la méthode " +"affichera une erreur. Utiliser [method is_connected] pour s'assurer que la " +"connexion existe." #: doc/classes/Object.xml msgid "" @@ -51357,6 +51932,15 @@ msgid "" "emit_signal(\"game_over\")\n" "[/codeblock]" msgstr "" +"Émet le [code]signal[/code] donné. Le signal doit exister, de sorte qu'il " +"doit être un signal intégré de cette classe ou une de ses classes parentes, " +"ou un signal défini par l'utilisateur. Cette méthode prend en charge un " +"nombre variable d'arguments, de sorte que les paramètres sont passés comme " +"une liste séparée par des virgules. Exemple :\n" +"[codeblock]\n" +"emit_signal(\"hit\", weapon_type, damage)\n" +"emit_signal(\"game_over\")\n" +"[/codeblock]" #: doc/classes/Object.xml msgid "" @@ -51387,6 +51971,11 @@ msgid "" "declarations into account. If the object has a [code]class_name[/code] " "defined, the base class name will be returned instead." msgstr "" +"Retourne la classe de l'objet en tant que [String]. Voir aussi [method " +"is_class].\n" +"[b]Note :[/b] [method get_class] ignore les déclarations [code]class_name[/" +"code]. Si l'objet a un [code]class_name[/code] défini, le nom de classe de " +"base sera retourné à la place." #: doc/classes/Object.xml msgid "" @@ -51398,6 +51987,13 @@ msgid "" "- [code]method_name[/code] is the name of the method to which the signal is " "connected." msgstr "" +"Retourne un [Array] de dictionnaires avec des informations sur les signaux " +"qui sont connectés à l'objet.\n" +"Chaque [Dictionary] contient trois entrées en String :\n" +"- [code]source[/code] est une référence à l'émetteur de signal.\n" +"- [code]signal_name[/code] est le nom du signal connecté.\n" +"- [code]method_name[/code] est le nom de la méthode à laquelle le signal est " +"connecté." #: doc/classes/Object.xml msgid "" @@ -51417,6 +52013,10 @@ msgid "" "This ID can be saved in [EncodedObjectAsID], and can be used to retrieve the " "object instance with [method @GDScript.instance_from_id]." msgstr "" +"Retourne l'identifiant de l'instance unique de l'objet.\n" +"Cet identifiant peut être enregistré dans [EncodedObjectAsID] et peut être " +"utilisé pour récupérer l'objet de l'instance avec [method @GDScript." +"instance_from_id]." #: doc/classes/Object.xml msgid "" @@ -51424,6 +52024,10 @@ msgid "" "Throws error if the entry does not exist, unless [code]default[/code] is not " "[code]null[/code] (in which case the default value will be returned)." msgstr "" +"Retourne l'entrée de métadonnées de l'objet [code]name[/code] spécifié.\n" +"Affiche une erreur si l'entrée n'existe pas, sauf si [code]default[/code] " +"n'est pas [code]null[/code] (dans quel cas la valeur par défaut sera " +"retournée)." #: doc/classes/Object.xml msgid "Returns the object's metadata as a [PoolStringArray]." @@ -51442,6 +52046,13 @@ msgid "" "[code]hint_string: String[/code], and [code]usage: int[/code] (see [enum " "PropertyUsageFlags])." msgstr "" +"Retourne la liste de propriétés de l'objet dans un [Array] de " +"dictionnaires.\n" +"Chaque propriété [Dictionary] contient au moins [code]name: String[/code] et " +"[code]type: int[/code] (voir [enum Variant.Type]). En option, il peut " +"également inclure [code]hint: int[/code] (voir [enum PropertyHint]), " +"[code]hint_string: String[/code], et [code]usage: int[/code] (voir [enum " +"PropertyUsageFlags])." #: doc/classes/Object.xml msgid "" @@ -51485,6 +52096,9 @@ msgid "" "exists. Only signals added using [method add_user_signal] are taken into " "account." msgstr "" +"Retourne [code]true[/code] si le [code]signal[/code] défini par " +"l'utilisateur existe. Seuls les signaux ajoutés à [method add_user_signal] " +"sont pris en compte." #: doc/classes/Object.xml msgid "Returns [code]true[/code] if signal emission blocking is enabled." @@ -51498,6 +52112,11 @@ msgid "" "declarations into account. If the object has a [code]class_name[/code] " "defined, [method is_class] will return [code]false[/code] for that name." msgstr "" +"Retourne [code]true[/code] si l'objet hérite de la [code]class[/code] " +"donnée. Voir aussi [method get_class].\n" +"[b]Note :[/b] [method is_class] ne prend pas en compte les déclarations " +"[code]class_name[/code]. Si l'objet a un [code]class_name[/code] défini, " +"[method is_class] retournera [code]false[/code] pour ce nom." #: doc/classes/Object.xml msgid "" @@ -51579,12 +52198,23 @@ msgid "" "print(position) # (42, -10)\n" "[/codeblock]" msgstr "" +"Assigne une nouvelle valeur à la propriété identifiée par le [NodePath]. Le " +"chemin nÅ“ud devrait être relatif à l'objet courant et peut utiliser le " +"caractère des deux points ([code]:[/code]) pour accéder aux propriétés " +"imbriquées. Par exemple :\n" +"[codeblock]\n" +"set_indexed(\"position\", Vector2(42, 0))\n" +"set_indexed(\"position:y\", -10)\n" +"print(position) # (42, -10)\n" +"[/codeblock]" #: doc/classes/Object.xml msgid "" "Defines whether the object can translate strings (with calls to [method " "tr]). Enabled by default." msgstr "" +"Définit si l'objet peut traduire des chaînes (avec des appels à [method " +"tr]). Activé par défaut." #: doc/classes/Object.xml msgid "" @@ -51604,6 +52234,11 @@ msgid "" "freed and its variables and state will be lost. The new script's [method " "_init] method will be called." msgstr "" +"Attribue un script à l'objet. Chaque objet peut avoir un seul script qui lui " +"est assigné, qui sont utilisés pour étendre ses fonctionnalités.\n" +"Si l'objet avait déjà un script, l'instance de script précédente sera " +"libérée, ses variables et son état seront perdus. La méthode [method _init] " +"du nouveau script sera appelée." #: doc/classes/Object.xml msgid "" @@ -51612,6 +52247,10 @@ msgid "" "Override the method [method _to_string] to customize the [String] " "representation." msgstr "" +"Retourne une [String] représentant l'objet. Si ce n'est pas le cas, au " +"format par défaut [code]\"[ClassName:RID]\"[/code].\n" +"Surcharger la méthode [method to_string] pour personnaliser la " +"représentation en [String] affichée." #: doc/classes/Object.xml msgid "" @@ -51621,6 +52260,11 @@ msgid "" "otherwise it returns the [code]message[/code] unchanged. See [method " "set_message_translation]." msgstr "" +"Traduit un message en utilisant le catalogue de translations définit dans " +"les réglages du projet.\n" +"Ne fonctionne que si la traduction de message est activée (par défaut), " +"sinon elle retourne le [code]message[/code] inchangé. Voir [method " +"set_message_translation]." #: doc/classes/Object.xml msgid "Emitted whenever the object's script is changed." @@ -51662,6 +52306,9 @@ msgid "" "connected several times to the same target, and will only be fully " "disconnected once no references are left." msgstr "" +"Connectez un signal avec un compteur de référence. Cela signifie qu'un " +"signal donné peut être connecté plusieurs fois à la même cible, et ne sera " +"complètement déconnecté qu'une fois déconnecté de toutes les références." #: doc/classes/Occluder.xml msgid "Allows [OccluderShape]s to be used for occlusion culling." @@ -51700,6 +52347,8 @@ msgid "" "Editor facility that helps you draw a 2D polygon used as resource for " "[LightOccluder2D]." msgstr "" +"Aide de l'édition pour dessiner un polygone 2D utilisé comme ressource pour " +"un [LightOccluder2D]." #: doc/classes/OccluderPolygon2D.xml msgid "" @@ -51707,6 +52356,10 @@ msgid "" "occludes the light coming from any direction. An opened OccluderPolygon2D " "occludes the light only at its outline's direction." msgstr "" +"Si [code]true[/code], ferme (boucle) le polygone. Un OccluderPolygon2D fermé " +"bloque la lumière provenant de n'importe quelle direction. Un " +"OccluderPolygon2D ouvert ne bloque que la lumière qui vient en direction de " +"son alignement." #: doc/classes/OccluderPolygon2D.xml msgid "The culling mode to use." @@ -51718,6 +52371,9 @@ msgid "" "[b]Note:[/b] The returned value is a copy of the underlying array, rather " "than a reference." msgstr "" +"Un tableau de [Vector2] avec l'indice pour les positions des sommets.\n" +"[b]Note :[/b] La valeur retournée est une copie du tableau sous-jacent, et " +"non pas une référence." #: doc/classes/OccluderPolygon2D.xml msgid "Culling is disabled. See [member cull_mode]." @@ -51743,6 +52399,8 @@ msgstr "" #: doc/classes/OccluderShape.xml msgid "[Occluder]s can use any primitive shape derived from [OccluderShape]." msgstr "" +"Les [Occluder] peuvent utiliser toute forme primitive dérivée de " +"[OccluderShape]." #: doc/classes/OccluderShapePolygon.xml msgid "Polygon occlusion primitive for use with the [Occluder] node." @@ -51765,7 +52423,6 @@ msgid "" msgstr "" #: doc/classes/OccluderShapePolygon.xml -#, fuzzy msgid "Sets an individual hole point position." msgstr "Définit la position d'un trou simple." @@ -51775,17 +52432,19 @@ msgstr "Définit la position d'un seul point d'un polygone." #: doc/classes/OccluderShapePolygon.xml msgid "Allows changing the hole geometry from code." -msgstr "" +msgstr "Permet de changer la géométrie du trou depuis le code." #: doc/classes/OccluderShapePolygon.xml msgid "Allows changing the polygon geometry from code." -msgstr "" +msgstr "Permet de changer la géométrie de polygone depuis le code." #: doc/classes/OccluderShapePolygon.xml msgid "" "Specifies whether the occluder should operate from both sides. If " "[code]false[/code], the occluder will operate one way only." msgstr "" +"Précise si l'occulteur devrait fonctionner des deux côtés. Si [code]false[/" +"code], l'occulteur ne fonctionnera que dans un sens." #: doc/classes/OccluderShapeSphere.xml msgid "Spherical occlusion primitive for use with the [Occluder] node." @@ -51815,6 +52474,9 @@ msgid "" "each sphere is stored in the [code]normal[/code], and the radius is stored " "in the [code]d[/code] value of the plane." msgstr "" +"Les données de la sphère peuvent être obtenues dans un de tableau de " +"[Plane]. La position de chaque sphère est enregistrée dans [code]normal[/" +"code], et le rayon dans la valeur [code]d[/code] du plan." #: doc/classes/OmniLight.xml msgid "Omnidirectional light, such as a light bulb or a candle." @@ -51867,6 +52529,8 @@ msgid "" "Shadows are rendered to a dual-paraboloid texture. Faster than [constant " "SHADOW_CUBE], but lower-quality." msgstr "" +"Les ombres sont rendues dans une texture dual-paraboloïde. Plus rapide que " +"[constant SHADOW_CUBE], mais de qualité inférieure." #: doc/classes/OmniLight.xml msgid "" @@ -51874,6 +52538,9 @@ msgid "" "SHADOW_DUAL_PARABOLOID], but higher-quality. Only supported on GPUs that " "feature support for depth cubemaps." msgstr "" +"Les ombres sont rendues à un CubeMap. Plus lent que [constant " +"SHADOW_DUAL_PARABOLOID], mais de qualité supérieure. Seulement pris en " +"charge sur les GPU qui disposent du support pour les CubeMap de profondeur." #: doc/classes/OmniLight.xml msgid "Use more detail vertically when computing the shadow." @@ -51908,6 +52575,25 @@ msgid "" "print(noise.get_noise_4d(0.5, 1.9, 4.7, 0.0))\n" "[/codeblock]" msgstr "" +"Cette ressource vous permet de configurer et d'échantillonner un espace de " +"bruit fractal. Voici un court exemple d'utilisation qui configure un " +"OpenSimplexNoise et obtient des échantillons à différentes positions et " +"dimensions :\n" +"[codeblock]\n" +"var noise = OpenSimplexNoise.new()\n" +"\n" +"# Configuration\n" +"noise.seed = randi()\n" +"noise.octaves = 4\n" +"noise.period = 20.0\n" +"noise.persistence = 0.8\n" +"\n" +"# Échantionnage\n" +"print(\"Valeurs :\")\n" +"print(noise.get_noise_2d(1.0, 1.0))\n" +"print(noise.get_noise_3d(0.5, 3.0, 15.0))\n" +"print(noise.get_noise_4d(0.5, 1.9, 4.7, 0.0))\n" +"[/codeblock]" #: modules/opensimplex/doc_classes/OpenSimplexNoise.xml msgid "" @@ -51917,6 +52603,10 @@ msgid "" "value is used as the coordinates of the top-left corner of the generated " "noise." msgstr "" +"Générer une image de bruit au format [constant Image.FORMAT_L8] à la taille " +"[code]width[/code] sur [code]height[/code], basé sur les paramètres de bruit " +"actuels. Si [code]noise_offset[/code] est spécifié, le décalage sera utilisé " +"comme coordonnées du coin supérieur gauche du bruit généré." #: modules/opensimplex/doc_classes/OpenSimplexNoise.xml msgid "" @@ -51924,6 +52614,10 @@ msgid "" "[b]Note:[/b] This method actually returns the 2D noise value [code][-1,1][/" "code] with fixed y-coordinate value 0.0." msgstr "" +"Retourne le code de valeur de bruit 1D dans l'intervalle [code][-1,1][/code] " +"pour la coordonnée x donnée.\n" +"[b]Note :[/b] Cette méthode retourne en fait la valeur de bruit 2D dans " +"l'intervalle [code][-1,1][/code] mais avec la coordonnée y fixée à 0.0." #: modules/opensimplex/doc_classes/OpenSimplexNoise.xml msgid "Returns the 2D noise value [code][-1,1][/code] at the given position." @@ -51967,6 +52661,8 @@ msgid "" "Period of the base octave. A lower period results in a higher-frequency " "noise (more value changes across the same distance)." msgstr "" +"La période de l'octave de base. Une période inférieure entraîne un bruit de " +"fréquence plus élevée (plus de valeur change sur la même distance)." #: modules/opensimplex/doc_classes/OpenSimplexNoise.xml msgid "" @@ -51974,12 +52670,18 @@ msgid "" "value of 1 means all the octaves have the same contribution, a value of 0.5 " "means each octave contributes half as much as the previous one." msgstr "" +"Le facteur de contribution des différentes octaves. Une valeur " +"[code]persistence[/code] de 1 signifie que toutes les octaves ont la même " +"contribution, une valeur de 0,5 signifie chaque octave contribue à la moitié " +"de la précédente." #: modules/opensimplex/doc_classes/OpenSimplexNoise.xml msgid "" "Seed used to generate random values, different seeds will generate different " "noise maps." msgstr "" +"La graine utilisée pour générer des valeurs aléatoires, différentes graines " +"généreront différentes cartes de bruit." #: doc/classes/OptionButton.xml msgid "Button control that provides selectable options when pressed." @@ -51993,6 +52695,11 @@ msgid "" "See also [BaseButton] which contains common properties and methods " "associated with this node." msgstr "" +"OptionButton est un type de bouton qui fournit une liste d'éléments " +"lorsqu'il est pressé. L'élément sélectionné devient l'élément \"actuel\" et " +"s'affiche comme le texte du bouton.\n" +"Voir aussi [BaseButton] qui contient des propriétés et des méthodes communes " +"associées à ce nÅ“ud." #: doc/classes/OptionButton.xml msgid "" @@ -52000,6 +52707,10 @@ msgid "" "(optionally) [code]id[/code]. If no [code]id[/code] is passed, the item " "index will be used as the item's ID. New items are appended at the end." msgstr "" +"Ajoute un élément, avec une icône [code]texture[/code], un texte " +"[code]label[/code] et (en option) un [code]id[/code]. Si aucun [code]id[/" +"code] n'est spécifié, l'index de l'élément sera utilisé comme identifiant de " +"l'élément. Les nouveaux éléments sont placés à la fin de la liste." #: doc/classes/OptionButton.xml msgid "" @@ -52007,12 +52718,19 @@ msgid "" "If no [code]id[/code] is passed, the item index will be used as the item's " "ID. New items are appended at the end." msgstr "" +"Ajoute un élément, avec le texte [code]label[/code] et (en option) un " +"[code]id[/code]. Si aucun [code]id[/code] n'est spécifié, l'index de " +"l'élément sera utilisé comme identifiant de l'élément. Les nouveaux éléments " +"sont placés à la fin de la liste." #: doc/classes/OptionButton.xml msgid "" "Adds a separator to the list of items. Separators help to group items. " "Separator also takes up an index and is appended at the end." msgstr "" +"Ajoute un séparateur à la liste des articles. Les séparateurs aident à " +"regrouper les éléments. Le séparateur prend également un index et est ajouté " +"à la fin." #: doc/classes/OptionButton.xml msgid "Clears all the items in the [OptionButton]." @@ -52065,6 +52783,8 @@ msgid "" "Gets the metadata of the selected item. Metadata for items can be set using " "[method set_item_metadata]." msgstr "" +"Retourne les métadonnées de l'élément sélectionné. Les métadonnées peuvent " +"être définies en utilisant [method set_item_metadata]." #: doc/classes/OptionButton.xml msgid "" @@ -52083,6 +52803,10 @@ msgid "" "if the item is disabled.\n" "Passing [code]-1[/code] as the index deselects any currently selected item." msgstr "" +"Sélectionne un élément par son index et en fait l'élément actuel. Cela " +"fonctionnera même si l'élément est désactivé.\n" +"Passer [code]-1[/code] en index désélectionne tout élément actuellement " +"sélectionné." #: doc/classes/OptionButton.xml msgid "" @@ -52091,6 +52815,11 @@ msgid "" "by the user. If the current selected item is set as disabled, it will remain " "selected." msgstr "" +"Définit si l'élément à l'index [code]idx[/code] est désactivé.\n" +"Les éléments désactivés sont dessinés différemment dans la liste déroulante " +"et ne peuvent pas être sélectionnés par l'utilisateur. Si l'élément " +"sélectionné actuel est définit comme désactivé, il restera tout de même " +"sélectionné." #: doc/classes/OptionButton.xml msgid "Sets the icon of the item at index [code]idx[/code]." @@ -52105,6 +52834,9 @@ msgid "" "Sets the metadata of an item. Metadata may be of any type and can be used to " "store extra information about an item, such as an external string ID." msgstr "" +"Définit les métadonnées d'un élément. Les métadonnées peuvent être de " +"n'importe quel type et peuvent être utilisées pour stocker des informations " +"supplémentaires sur un élément, comme un identifiant de chaîne externe." #: doc/classes/OptionButton.xml doc/classes/PopupMenu.xml msgid "Sets the text of the item at index [code]idx[/code]." @@ -52119,6 +52851,8 @@ msgid "" "The index of the currently selected item, or [code]-1[/code] if no item is " "selected." msgstr "" +"L'index de l'élément actuellement sélectionné, ou [code]-1[/code] si aucun " +"élément n'est sélectionné." #: doc/classes/OptionButton.xml msgid "" @@ -52126,12 +52860,17 @@ msgid "" "[code]ui_down[/code] actions. The index of the item selected is passed as " "argument." msgstr "" +"Émis lorsque l'utilisateur navigue vers un élément utilisant les actions " +"[code]ui_up[/code] ou [code]ui_down[/code]. L'index de l'élément sélectionné " +"est passé comme argument." #: doc/classes/OptionButton.xml msgid "" "Emitted when the current item has been changed by the user. The index of the " "item selected is passed as argument." msgstr "" +"Émis lorsque l'élément actuel a été modifié par l'utilisateur. L'index de " +"l'élément sélectionné est passé en argument." #: doc/classes/OptionButton.xml msgid "Default text [Color] of the [OptionButton]." @@ -52147,6 +52886,9 @@ msgid "" "normal text color of the button. Disabled, hovered, and pressed states take " "precedence over this color." msgstr "" +"La [Color] du texte utilisée quand le [OptionButton] a le focus. Ne remplace " +"que la couleur normale du texte du bouton. Les états désactivés, survolés et " +"pressés sont prioritaires sur cette couleur." #: doc/classes/OptionButton.xml msgid "Text [Color] used when the [OptionButton] is being hovered." @@ -52184,6 +52926,9 @@ msgid "" "current [StyleBox], so using [StyleBoxEmpty] will just disable the focus " "visual effect." msgstr "" +"Le [StyleBox] utilisé lorsque [OptionButton] a le focus. Elle est affichée " +"sur la [StyleBox] actuelle, dont utiliser [StyleBoxEmpty] va tout simplement " +"désactiver l'effet visuel de focus." #: doc/classes/OptionButton.xml msgid "[StyleBox] used when the [OptionButton] is being hovered." @@ -52219,6 +52964,8 @@ msgid "" "Displays a modal dialog box using the host OS' facilities. Execution is " "blocked until the dialog is closed." msgstr "" +"Affiche une boîte de dialogue modal en utilisant le système d'exploitation " +"hôte. L'exécution est bloquée jusqu'à ce que le dialogue soit fermé." #: doc/classes/OS.xml msgid "Returns [code]true[/code] if the host OS allows drawing." @@ -52236,13 +52983,15 @@ msgstr "" #: doc/classes/OS.xml msgid "Centers the window on the screen if in windowed mode." -msgstr "" +msgstr "Centre la fenêtre à l'écran si en mode fenêtre." #: doc/classes/OS.xml msgid "" "Shuts down system MIDI driver.\n" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" +"Ferme le système de pilote MIDI.\n" +"[b]Note :[/b] Cette méthode est implémenté sur Linux, macOS et Windows." #: doc/classes/OS.xml msgid "" @@ -52252,6 +53001,12 @@ msgid "" "order of preference) [method @GDScript.assert], [method @GDScript." "push_error] or [method alert]. See also [method kill]." msgstr "" +"Fait planter le moteur (ou l'éditeur si appelé dans un script avec " +"[code]tool[/code]). Ceci ne devrait être [i]seulement[/i] utilisé pour " +"tester le gestionnaire de plantage du système, et non pour toute autre " +"raison. Pour la déclaration d'erreur générale, utilisez (dans l'ordre des " +"préférences) : [method @GDScript.assert], [method @GDScript.push_error] ou " +"[method alert]. Voir aussi [method kill]." #: doc/classes/OS.xml msgid "" @@ -52396,7 +53151,7 @@ msgstr "" #: doc/classes/OS.xml msgid "Returns the scancode of the given string (e.g. \"Escape\")." -msgstr "" +msgstr "Retourne le scancode de la chaîne donnée (par exemple \"Escape\")." #: doc/classes/OS.xml msgid "Returns the total number of available audio drivers." @@ -52404,7 +53159,7 @@ msgstr "Retourne le nombre total de périphériques audio." #: doc/classes/OS.xml msgid "Returns the audio driver name for the given index." -msgstr "" +msgstr "Retourne le nom du pilote audio à l'index donné." #: doc/classes/OS.xml msgid "" @@ -52463,12 +53218,18 @@ msgid "" "previously been initialised with [method open_midi_inputs].\n" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" +"Retourne un tableau de noms de périphériques MIDI.\n" +"Le tableau retourné sera vide si le pilote MIDI n'a pas déjà été initialisé " +"avec [method open_midi_inputs].\n" +"[b]Note :[/b] Cette méthode est implémentée sur Linux, macOS et Windows." #: doc/classes/OS.xml msgid "" "Returns the currently used video driver, using one of the values from [enum " "VideoDriver]." msgstr "" +"Retourne le pilote vidéo actuellement utilisé, en utilisant une des valeurs " +"de [enum VideoDriver]." #: doc/classes/OS.xml msgid "" @@ -52543,6 +53304,9 @@ msgid "" "been granted to the Android application.\n" "[b]Note:[/b] This method is implemented on Android." msgstr "" +"Avec cette fonction, vous pouvez obtenir la liste des autorisations " +"dangereuses qui ont été accordées à cette application Android.\n" +"[b]Note :[/b] Cette méthode est implémentée sur Android." #: doc/classes/OS.xml msgid "" @@ -52552,6 +53316,11 @@ msgid "" "notify it of changes to the IME cursor position.\n" "[b]Note:[/b] This method is implemented on macOS." msgstr "" +"Retourne la position de curseur IME (la partie actuellement éditée de la " +"chaîne) par rapport aux caractères de la chaîne de composition.\n" +"[constant MainLoop.NOTIFICATION_OS_IME_UPDATE] est envoyé à l'application " +"pour l'informer des modifications apportées à la position du curseur IME.\n" +"[b]Note :[/b] Cette méthode est implémentée sur macOS." #: doc/classes/OS.xml msgid "" @@ -52560,6 +53329,10 @@ msgid "" "notify it of changes to the IME composition string.\n" "[b]Note:[/b] This method is implemented on macOS." msgstr "" +"Retourne la chaîne de composition intermédiaire IME.\n" +"[constant MainLoop.NOTIFICATION_OS_IME_UPDATE] est envoyé à l'application " +"pour l'informer des modifications apportées à la chaîne de composition IME.\n" +"[b]Note :[/b] Cette méthode est implémentée sur macOS." #: doc/classes/OS.xml msgid "" @@ -52607,6 +53380,10 @@ msgid "" "[b]Note:[/b] Thread IDs are not deterministic and may be reused across " "application restarts." msgstr "" +"Retourne l'identifiant du fil d'exécution principal. Voir [method " +"get_thread_caller_id].\n" +"[b]Note :[/b] Les identifiants des Thread ne sont pas déterministes mais " +"peuvent parfois être réutilisés même après des redémarrages de l'application." #: doc/classes/OS.xml msgid "" @@ -52614,6 +53391,9 @@ msgid "" "[b]Note:[/b] This method is implemented on Android and iOS. Returns " "[code]\"GenericDevice\"[/code] on unsupported platforms." msgstr "" +"Retourne le nom du modèle de l'appareil actuel.\n" +"[b]Note :[/b] Cette méthode est implémentée sur Android et iOS. Retourne " +"[code]\"GénériqueDevice\"[/code] sur les plateformes non supportées." #: doc/classes/OS.xml msgid "" @@ -52633,6 +53413,10 @@ msgid "" "[b]Note:[/b] This method is implemented on Linux and Windows (other OSs will " "soon be supported)." msgstr "" +"Retourne les pointeurs de structure internes pour une utilisation dans les " +"greffons GDNative.\n" +"[b]Note :[/b] Cette méthode est implémentée sur Linux et Windows (d'autres " +"OS seront bientôt pris en charge)." #: doc/classes/OS.xml msgid "" @@ -52640,6 +53424,9 @@ msgid "" "[code]-1[/code] if power state is unknown.\n" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" +"Retourne la quantité de batterie restante dans l'appareil en pourcentage. " +"Retourne [code]-1[/code] si l'état de la batterie est inconnu.\n" +"[b]Note :[/b] Cette méthode est implémentée sur Linux, macOS et Windows." #: doc/classes/OS.xml msgid "" @@ -52647,6 +53434,10 @@ msgid "" "of battery. Returns [code]-1[/code] if power state is unknown.\n" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" +"Retourne une estimation du temps restant en secondes avant que l'appareil " +"n'ait plus de batterie. Retourne [code]-1[/code] si l'état de la batterie " +"est inconnu.\n" +"[b]Note :[/b] Cette méthode est implémentée sur Linux, macOS et Windows." #: doc/classes/OS.xml msgid "" @@ -52664,6 +53455,9 @@ msgid "" "[b]Note:[/b] This method is implemented on Android, iOS, Linux, macOS and " "Windows." msgstr "" +"Retourne l'identifiant du processus du projet.\n" +"[b]Note :[/b] Cette méthode est implémentée sur Android, iOS, Linux, macOS " +"et Windows." #: doc/classes/OS.xml msgid "" @@ -52671,6 +53465,9 @@ msgid "" "machine. On CPUs with HyperThreading enabled, this number will be greater " "than the number of [i]physical[/i] CPU cores." msgstr "" +"Retourne le nombre de cÅ“urs [i]logiques[/i] du CPU disponibles sur la " +"machine hôte. Sur les processeurs avec le mode HyperThreading activé, ce " +"nombre sera supérieur au nombre de cÅ“urs [i]physiques[/i] du CPU." #: doc/classes/OS.xml msgid "" @@ -52680,6 +53477,11 @@ msgid "" "iOS. On Android, HTML5 and UWP, [method get_processor_name] returns an empty " "string." msgstr "" +"Retourne le nom du modèle CPU sur la machine hôte (par exemple \"Intel(R) " +"Core(TM) i7-6700K CPU @ 4.00GHz\").\n" +"[b]Note :[/b] Cette méthode n'est implémentée que sur Windows, MacOS, Linux " +"et iOS. Sur Android, HTML5 et UWP, [method get_processor_name] renvoie une " +"chaîne vide." #: doc/classes/OS.xml msgid "Returns the window size including decorations like window borders." @@ -52694,6 +53496,10 @@ msgid "" "See also [member InputEventKey.scancode] and [method InputEventKey." "get_scancode_with_modifiers]." msgstr "" +"Retourne le scancode spécifié sous forme de chaîne (par exemple valeurs de " +"retour : [code]\"Escape\"[/code], [code]\"Shift+Escape\"[/code]).\n" +"Voir aussi [member InputEventKey.scancode] et [method InputEventKey." +"get_scancode_with_modifiers]." #: doc/classes/OS.xml msgid "Returns the number of displays attached to the host machine." @@ -52745,6 +53551,11 @@ msgid "" "other cases.\n" "[b]Note:[/b] This method is implemented on macOS." msgstr "" +"Retourner le plus grand facteur d'échelle de tous les écrans.\n" +"[b]Note :[/b] Sur macOS la valeur retournée est [code]2.0[/code] s'il y a au " +"moins un écran hiDPI (Retina) dans le système, et [code]1.0[/code] dans tous " +"les autres cas.\n" +"[b]Note :[/b] Cette méthode est implémentée sur macOS." #: doc/classes/OS.xml msgid "" @@ -52772,6 +53583,20 @@ msgid "" " refresh_rate = 60.0\n" "[/codeblock]" msgstr "" +"Retourne le taux de rafraîchissement actuel de l'écran spécifié. Si " +"[code]screen[/code] est [code]-1[/code] (la valeur par défaut), l'écran " +"actuel sera utilisé.\n" +"[b]Note :[/b] Retourne [code]-1.0[/code] si Godot ne trouve pas le taux de " +"rafraîchissement pour l'écran spécifié. Sur HTML5, [method " +"get_screen_refresh_rate] retournera toujours [code]-1.0[/code] car il n'y a " +"aucun moyen de récupérer le taux de rafraîchissement sur cette plate-forme.\n" +"Pour utiliser un taux de rafraîchissement par défaut si la méthode échoue, " +"essayez :\n" +"[codeblock]\n" +"var refresh_rate = OS.get_screen_refresh_rate()\n" +"if refresh_rate < 0:\n" +" refresh_rate = 60.0\n" +"[/codeblock]" #: doc/classes/OS.xml msgid "" @@ -52782,6 +53607,12 @@ msgid "" "screen, and [code]1.0[/code] for all other cases.\n" "[b]Note:[/b] This method is implemented on macOS." msgstr "" +"Retourner le facteur d'échelle de l'écran spécifié à l'index. Si " +"[code]screen[/code] est [code]-1[/code] (la valeur par défaut), l'écran " +"actuel sera utilisé.\n" +"[b]Note :[/b] Sur macOS la valeur retournée est [code]2.0[/code] pour les " +"écrans hiDPI (Retina) et [code]1.0[/code] pour tous les autres écrans.\n" +"[b]Note :[/b] Cette méthode est implémentée sous macOS." #: doc/classes/OS.xml msgid "" @@ -52810,6 +53641,8 @@ msgid "" "Returns the amount of static memory being used by the program in bytes (only " "works in debug)." msgstr "" +"Retourne la quantité de mémoire statique utilisée par le programme en octets " +"(seulement pour les versions avec débogage)." #: doc/classes/OS.xml msgid "" @@ -52821,6 +53654,14 @@ msgid "" "differentiate between app specific and shared directories. Shared " "directories have additional restrictions on Android." msgstr "" +"Retourne le chemin réel aux dossiers couramment utilisés sur différentes " +"plateformes. Les emplacements disponibles sont spécifiés dans [enum " +"SystemDir].\n" +"[b]Note :[/b] Cette méthode est implémentée sur Android, Linux, macOS et " +"Windows.\n" +"[b]Note :[/b] Le stockage partagé est implémenté sur Android et permet de " +"différencier entre les applications spécifiques et les dossiers partagés. " +"Les dossiers partagés ont des restrictions supplémentaires sur Android." #: doc/classes/OS.xml msgid "Returns the epoch time of the operating system in milliseconds." @@ -52881,11 +53722,16 @@ msgid "" "Deprecated, use [method Time.get_time_dict_from_system] instead.\n" "Returns current time as a dictionary of keys: hour, minute, second." msgstr "" +"Obsolète, utilisez plutôt [method Time.get_time_dict_from_system].\n" +"Retourne l'heure actuelle dans un dictionnaire avec les clés : \"hour\", " +"\"minute\", \"second\"." #: doc/classes/OS.xml msgid "" "Returns the current time zone as a dictionary with the keys: bias and name." msgstr "" +"Retourne l'actuel fuseau horaire dans un dictionnaire avec les clés : biais " +"et nom." #: doc/classes/OS.xml msgid "" @@ -52899,6 +53745,17 @@ msgid "" "[b]Note:[/b] Returns an empty string on HTML5 and UWP, as this method isn't " "implemented on those platforms yet." msgstr "" +"Retourne une chaîne de caractères unique à l'appareil.\n" +"[b]Note :[/b] Cette chaîne peut changer sans préavis si l'utilisateur " +"réinstalle ou met à jour son système d'exploitation ou modifie son matériel. " +"Cela signifie qu'il ne devrait généralement pas être utilisé pour chiffrer " +"les données persistantes car des données enregistrées avant ce changement " +"d'identifiant deviendront inaccessibles. La chaîne retournée peut également " +"être modifiée manuellement en utilisant des programmes externes, donc ne pas " +"compter sur la chaîne retournée par [method get_unique_id] pour la " +"sécurisation.\n" +"[b]Note :[/b] Retourne une chaîne vide sur HTML5 et UWP, car cette méthode " +"n'est pas encore implémentée sur ces plateformes." #: doc/classes/OS.xml msgid "" @@ -52908,7 +53765,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -52948,6 +53807,8 @@ msgstr "" #: doc/classes/OS.xml msgid "Returns the number of video drivers supported on the current platform." msgstr "" +"Retourne le nombre de pilotes vidéo pris en charge sur la plateforme " +"actuelle." #: doc/classes/OS.xml msgid "" @@ -52955,18 +53816,25 @@ msgid "" "index. This index is a value from [enum VideoDriver], and you can use " "[method get_current_video_driver] to get the current backend's index." msgstr "" +"Retourne le nom du pilote vidéo correspondant à l'index [code]driver[/code] " +"donné. Cet index est une valeur de [enum VideoDriver], et vous pouvez " +"utiliser [method get_current_video_driver] pour obtenir l'index du backend." #: doc/classes/OS.xml msgid "" "Returns the on-screen keyboard's height in pixels. Returns 0 if there is no " "keyboard or if it is currently hidden." msgstr "" +"Retourne la hauteur du clavier virtuel à l'écran en pixels. Retourne 0 s'il " +"n'y a pas de clavier ou s'il est actuellement caché." #: doc/classes/OS.xml msgid "" "Returns unobscured area of the window where interactive controls should be " "rendered." msgstr "" +"Retourne la zone sûre de la fenêtre où les contrôles interactifs doivent " +"être placés." #: doc/classes/OS.xml msgid "" @@ -52974,18 +53842,26 @@ msgid "" "item to the macOS dock icon menu.\n" "[b]Note:[/b] This method is implemented on macOS." msgstr "" +"Ajoute un nouvel élément avec le texte \"label\" au menu global. Utilisez le " +"menu \"_dock\" pour ajouter l'élément au menu du dock sous macOS.\n" +"[b]Note :[/b] Cette méthode est implémentée sur macOS." #: doc/classes/OS.xml msgid "" "Add a separator between items. Separators also occupy an index.\n" "[b]Note:[/b] This method is implemented on macOS." msgstr "" +"Ajoute un séparateur entre les éléments. Les séparateurs occupent également " +"un index.\n" +"[b]Note :[/b] Cette méthode est implémentée sur macOS." #: doc/classes/OS.xml msgid "" "Clear the global menu, in effect removing all items.\n" "[b]Note:[/b] This method is implemented on macOS." msgstr "" +"Efface le menu global, en supprimant tous les éléments.\n" +"[b]Note :[/b] Cette méthode est implémentée sur macOS." #: doc/classes/OS.xml msgid "" @@ -52993,6 +53869,9 @@ msgid "" "indexes of items after the removed item are going to be shifted by one.\n" "[b]Note:[/b] This method is implemented on macOS." msgstr "" +"Retire l'élément à l'index \"idx\" du menu global. Notez que les index des " +"éléments après l'élément supprimé seront déplacés de un.\n" +"[b]Note :[/b] Cette méthode est implémentée sur macOS." #: doc/classes/OS.xml msgid "Returns [code]true[/code] if there is content on the clipboard." @@ -53005,6 +53884,11 @@ msgid "" "[b]Note:[/b] Double-check the casing of [code]variable[/code]. Environment " "variable names are case-sensitive on all platforms except Windows." msgstr "" +"Retourne [code]true[/code] si la variable d'environnement avec le nom " +"[code]variable[/code] existe.\n" +"[b]Note :[/b] Vérifiez à deux fois la casse de [code]variable[/code]. Les " +"noms variables d'environnement sont sensibles à la casse sur toutes les " +"plateformes sauf Windows." #: doc/classes/OS.xml msgid "" @@ -53069,6 +53953,8 @@ msgid "" "Returns [code]true[/code] if the input scancode corresponds to a Unicode " "character." msgstr "" +"Retourne [code]true[/code] si le code d'entrée correspond à un caractère " +"Unicode." #: doc/classes/OS.xml msgid "" @@ -53084,6 +53970,10 @@ msgid "" "that its state is the same after a player quits and starts the game again. " "Relevant to the HTML5 platform, where this persistence may be unavailable." msgstr "" +"Si [code]true[/code], le système de fichiers dans [code]user://[/code] est " +"persistant, que son état est le même après qu'un joueur quitte et relance le " +"jeu. Pertinent pour la plate-forme HTML5, où cette persistance peut être " +"indisponible." #: doc/classes/OS.xml msgid "" @@ -53099,12 +53989,17 @@ msgid "" "[b]Note:[/b] Only implemented on desktop platforms. On other platforms, it " "will always return [code]true[/code]." msgstr "" +"Retourne [code]true[/code] si la fenêtre a actuellement le focus.\n" +"[b]Note :[/b] Seulement implémenté sur les ordinateur de bureau. Sur " +"d'autres plateformes, il retournera toujours [code]true[/code]." #: doc/classes/OS.xml msgid "" "Returns active keyboard layout index.\n" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" +"Retourne l'index de la disposition du clavier actif.\n" +"[b]Note :[/b] Cette méthode est implémentée sur Linux, macOS et Windows." #: doc/classes/OS.xml msgid "" @@ -53120,6 +54015,9 @@ msgid "" "[code]index[/code].\n" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" +"Retourne le code de langue ISO-639/BCP-47 de la disposition du clavier à la " +"position [code]index[/code].\n" +"[b]Note :[/b] Cette méthode est implémentée sur Linux, macOS et Windows." #: doc/classes/OS.xml msgid "" @@ -53127,6 +54025,9 @@ msgid "" "code].\n" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" +"Retourne le nom localisé de la disposition du clavier à la position " +"[code]index[/code].\n" +"[b]Note :[/b] Cette méthode est implémentée sur Linux, macOS et Windows." #: doc/classes/OS.xml msgid "" @@ -53134,12 +54035,17 @@ msgid "" "keyboard layout.\n" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" +"Convertit un [code]scancode[/code] physique (US QWERTY) en un dans la " +"disposition du clavier actif.\n" +"[b]Note :[/b] Cette méthode est implémentée sur Linux, macOS et Windows." #: doc/classes/OS.xml msgid "" "Sets active keyboard layout.\n" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" +"Définit la disposition active du clavier.\n" +"[b]Note :[/b] Cette méthode est implémentée sur Linux, macOS et Windows." #: doc/classes/OS.xml msgid "" @@ -53151,6 +54057,13 @@ msgid "" "[b]Note:[/b] This method is implemented on Android, iOS, Linux, macOS and " "Windows." msgstr "" +"Tue (termine) le processus à partir de l'identifiant spécifié ([code]pid[/" +"code]), c'est-à -dire par celui retourné par [method execute] en mode non-" +"blocant. Voir aussi [method crash].\n" +"[b]Note :[/b] Cette méthode peut également être utilisée pour tuer des " +"processus qui n'ont pas été créés par le jeu.\n" +"[b]Note :[/b] Cette méthode est implémentée sur Android, iOS, Linux, macOS " +"et Windows." #: doc/classes/OS.xml msgid "" @@ -53166,18 +54079,34 @@ msgid "" "OS.move_to_trash(ProjectSettings.globalize_path(file_to_remove))\n" "[/codeblock]" msgstr "" +"Déplace le fichier ou le dossier dans la corbeille du système. Voir aussi " +"[method Directory.remove].\n" +"La méthode ne prend que des chemins globaux, donc vous pouvez avoir besoin " +"d'utiliser [method ProjectSettings.globalize_path]. Ne l'utilisez pas pour " +"les fichiers dans [code]res://[/code] car ça ne fonctionnera pas dans le " +"projet exporté.\n" +"[b]Note :[/b] Si l'utilisateur a désactivé la corbeille sur son système, le " +"fichier sera définitivement supprimé.\n" +"[codeblock]\n" +"var file_to_remove = \"user://slot1.sav\"\n" +"OS.move_to_trash(ProjectSettings.globalize_path(file_to_remove))\n" +"[/codeblock]" #: doc/classes/OS.xml msgid "" "Moves the window to the front.\n" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" +"Déplace la fenêtre vers l'avant.\n" +"[b]Note :[/b] Cette méthode est implémentée sur Linux, macOS et Windows." #: doc/classes/OS.xml msgid "" "Returns [code]true[/code] if native video is playing.\n" "[b]Note:[/b] This method is only implemented on iOS." msgstr "" +"Retourne [code]true[/code] si la vidéo native joue.\n" +"[b]Note :[/b] Cette méthode n'est implémenté que sur iOS." #: doc/classes/OS.xml msgid "" @@ -53193,6 +54122,9 @@ msgid "" "audio and subtitle tracks.\n" "[b]Note:[/b] This method is only implemented on iOS." msgstr "" +"Joue la vidéo native depuis le chemin spécifié, au volume donné et avec des " +"pistes audio et sous-titres.\n" +"[b]Note :[/b] Cette méthode n'est implémenté que sur iOS." #: doc/classes/OS.xml msgid "" @@ -53215,12 +54147,17 @@ msgid "" "Initialises the singleton for the system MIDI driver.\n" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" +"Initialise le singleton pour le système de pilote MIDI.\n" +"[b]Note :[/b] Cette méthode est implémentée sur Linux, macOS et Windows." #: doc/classes/OS.xml msgid "" "Shows all resources in the game. Optionally, the list can be written to a " "file by specifying a file path in [code]tofile[/code]." msgstr "" +"Affiche toutes les ressources dans le jeu. En option, la liste peut être " +"écrite à un fichier en spécifiant un chemin de fichier dans [code]tofile[/" +"code]." #: doc/classes/OS.xml msgid "Shows the list of loaded textures sorted by size in memory." @@ -53241,12 +54178,19 @@ msgid "" "Windows or bounce the dock icon on OSX.\n" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" +"Demandez l'attention de l'utilisateur sur cette fenêtre. Ça fait clignoter " +"le bouton de la barre de tâches sur Windows ou fait rebondir l'icône du dock " +"sur macOS.\n" +"[b]Note :[/b] Cette méthode est implémentée sur Linux, macOS et Windows." #: doc/classes/OS.xml msgid "" "At the moment this function is only used by [code]AudioDriverOpenSL[/code] " "to request permission for [code]RECORD_AUDIO[/code] on Android." msgstr "" +"Pour le moment cette fonction est uniquement utilisée par " +"[code]AudioDriverOpenSL[/code] pour demande la permission " +"[code]RECORD_AUDIO[/code] sur Android." #: doc/classes/OS.xml msgid "" @@ -53255,6 +54199,10 @@ msgid "" "applications.\n" "[b]Note:[/b] This method is implemented on Android." msgstr "" +"Avec cette fonction, vous pouvez demander des permissions dangereuses " +"puisque les autorisations normales sont automatiquement accordées à " +"l'installation dans les applications Android.\n" +"[b]Note :[/b] Cette méthode est implémentée sur Android." #: doc/classes/OS.xml msgid "" @@ -53274,6 +54222,12 @@ msgid "" "dialog. Image is scaled as needed.\n" "[b]Note:[/b] This method is implemented on HTML5, Linux, macOS and Windows." msgstr "" +"Définit l'icône du jeu en utilisant une ressource [Image].\n" +"La même image est utilisée pour l'icône de la fenêtre, la barre de tâches ou " +"du dock et le dialogue de sélection de la fenêtre. L'image est " +"redimensionnée au besoin.\n" +"[b]Note :[/b] Cette méthode est implémentée sur HTML5, Linux, macOS et " +"Windows." #: doc/classes/OS.xml msgid "" @@ -53291,6 +54245,9 @@ msgid "" "Sets position of IME suggestion list popup (in window coordinates).\n" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" +"Définit la position de la fenêtre surgissante avec la liste de suggestions " +"IME (dans les coordonnées de la fenêtre).\n" +"[b]Note :[/b] Cette méthode est implémentée sur Linux, macOS et Windows." #: doc/classes/OS.xml msgid "" @@ -53460,12 +54417,18 @@ msgid "" "If [code]true[/code], the engine optimizes for low processor usage by only " "refreshing the screen if needed. Can improve battery consumption on mobile." msgstr "" +"Si [code]true[/code], le moteur réduit la consommation du processeur en " +"rafraîchissant l'écran uniquement quand nécessaire. Peut améliorer la durée " +"de batterie sur mobile." #: doc/classes/OS.xml msgid "" "The amount of sleeping between frames when the low-processor usage mode is " "enabled (in microseconds). Higher values will result in lower CPU usage." msgstr "" +"La quantité d'inactivité entre les trames lorsque le mode de réduction du " +"processeur est activé (en microsecondes). Des valeurs plus élevées " +"limiteront l'utilisation du processeur." #: doc/classes/OS.xml msgid "" @@ -53473,6 +54436,9 @@ msgid "" "decorations). Does not affect fullscreen mode. Set to [code](0, 0)[/code] to " "reset to the system default value." msgstr "" +"La taille maximale de la fenêtre (sans compter les décorations du " +"gestionnaire de fenêtre). N'affecte pas le mode plein écran. Réglez à [code]" +"(0, 0)[/code] pour réinitialiser la valeur par défaut du système." #: doc/classes/OS.xml msgid "" @@ -53513,6 +54479,9 @@ msgid "" "[b]Note:[/b] Setting [code]window_borderless[/code] to [code]false[/code] " "disables per-pixel transparency." msgstr "" +"Si [code]true[/code], supprime le cadre autour de la fenêtre.\n" +"[b]Note :[/b] Le réglage [code]window_borderless[/code] à [code]false[/code] " +"désactivera la transparence par pixel." #: doc/classes/OS.xml msgid "If [code]true[/code], the window is fullscreen." @@ -53545,6 +54514,8 @@ msgid "" "The window position relative to the screen, the origin is the top left " "corner, +Y axis goes to the bottom and +X axis goes to the right." msgstr "" +"La position de la fenêtre par rapport à l'écran, l'origine étant le coin " +"supérieur gauche, l'axe +Y va vers le bas et l'axe +X va à droite." #: doc/classes/OS.xml msgid "If [code]true[/code], the window is resizable by the user." @@ -53560,12 +54531,16 @@ msgid "" "The GLES2 rendering backend. It uses OpenGL ES 2.0 on mobile devices, OpenGL " "2.1 on desktop platforms and WebGL 1.0 on the web." msgstr "" +"Le backend de rendu GLES2. Cela utilise OpenGL ES 2.0 sur les appareils " +"mobiles, OpenGL 2.1 sur les plateformes de bureau et WebGL 1.0 sur le web." #: doc/classes/OS.xml msgid "" "The GLES3 rendering backend. It uses OpenGL ES 3.0 on mobile devices, OpenGL " "3.3 on desktop platforms and WebGL 2.0 on the web." msgstr "" +"Le backend de rendu GLES3. Cela utilise OpenGL ES 3.0 sur les appareils " +"mobiles, OpenGL 3.3 sur les plateformes de bureau et WebGL 2.0 sur le web." #: doc/classes/OS.xml msgid "Sunday." @@ -53651,6 +54626,11 @@ msgid "" "implemented)\n" "- Android: [code]JNIEnv*[/code] of the application (not yet implemented)" msgstr "" +"Les points de départ de l'application :\n" +"- Windows : [code]HINSTANCE[/code] de l'application\n" +"- MacOS : [code]NSApplication*[/code] de l'application (non encore " +"implémenté)\n" +"- Android : [code]JNIEnv*[/code] de l'application (pas encore implémenté)" #: doc/classes/OS.xml msgid "" @@ -53788,7 +54768,7 @@ msgstr "Version de référence de [PackedDataContainer]." #: doc/classes/PackedScene.xml msgid "An abstraction of a serialized scene." -msgstr "" +msgstr "Une abstraction d'une scène sérialisée." #: doc/classes/PackedScene.xml msgid "" @@ -53899,6 +54879,9 @@ msgid "" "instantiation(s). Triggers a [constant Node.NOTIFICATION_INSTANCED] " "notification on the root node." msgstr "" +"Instancie l'arborescence de la scène. Déclenche l'instanciation des enfants " +"de la scène. Déclenche une notification [constant Node." +"NOTIFICATION_INSTANCED] sur le nÅ“ud racine." #: doc/classes/PackedScene.xml msgid "" @@ -53918,6 +54901,8 @@ msgstr "" #: doc/classes/PackedScene.xml msgid "If passed to [method instance], blocks edits to the scene state." msgstr "" +"S'il est passé à [method instance], bloque les modifications de l'état de la " +"scène." #: doc/classes/PackedScene.xml msgid "" @@ -53925,6 +54910,9 @@ msgid "" "scene.\n" "[b]Note:[/b] Only available in editor builds." msgstr "" +"S'il est passé à [method instance], fournit des ressources de scène locale à " +"la scène locale.\n" +"[b]Note :[/b] Seulement disponible dans les éditeurs." #: doc/classes/PackedScene.xml msgid "" @@ -53932,6 +54920,10 @@ msgid "" "scene. Only the main scene should receive the main edit state.\n" "[b]Note:[/b] Only available in editor builds." msgstr "" +"S'il est passé à [method instance], fournit des ressources de scène locale à " +"la scène locale. Seule la scène principale devrait recevoir l'état principal " +"d'édition.\n" +"[b]Note :[/b] Seulement disponible dans les éditeurs." #: doc/classes/PackedScene.xml msgid "" @@ -53939,6 +54931,9 @@ msgid "" "scene is being instantiated to be the base of another one.\n" "[b]Note:[/b] Only available in editor builds." msgstr "" +"C'est similaire à [constant GEN_EDIT_STATE_MAIN], mais pour le cas où la " +"scène est instanciée pour être la base d'une autre.\n" +"[b]Note :[/b] Seulement disponible dans les éditeurs." #: modules/gltf/doc_classes/PackedSceneGLTF.xml msgid "" @@ -53947,6 +54942,10 @@ msgid "" "to [PackedSceneGLTF] within a script will cause an error in an exported " "project." msgstr "" +"[b]Note :[/b] Cette classe n'est compilée que dans les éditeurs. Le " +"chargement et l'enregistrement de glTF n'est [i]pas[/i] disponible dans les " +"projets exportés. Les références à [PackedSceneGLTF] dans un script " +"causeront une erreur dans les projets exportés." #: doc/classes/PacketPeer.xml msgid "Abstraction and base class for packet-based protocols." @@ -54076,6 +55075,9 @@ msgid "" "Poll the connection to check for incoming packets. Call this frequently to " "update the status and keep the connection working." msgstr "" +"Sondez la connexion pour vérifier les paquets entrants. Appelez cela " +"fréquemment pour mettre à jour le statut et garder la connexion " +"fonctionnelle." #: doc/classes/PacketPeerDTLS.xml msgid "A status representing a [PacketPeerDTLS] that is disconnected." @@ -54086,6 +55088,8 @@ msgid "" "A status representing a [PacketPeerDTLS] that is currently performing the " "handshake with a remote peer." msgstr "" +"Un statut représentant un [PacketPeerDTLS] qui effectue actuellement la " +"poignée de main avec un pair distant." #: doc/classes/PacketPeerDTLS.xml msgid "" @@ -54104,6 +55108,8 @@ msgid "" "An error status that shows a mismatch in the DTLS certificate domain " "presented by the host and the domain requested for validation." msgstr "" +"Un statut d'erreur qui montre une erreur dans le domaine de certificat DTLS " +"présenté par l'hôte et le domaine demandé pour validation." #: doc/classes/PacketPeerStream.xml msgid "Wrapper to use a PacketPeer over a StreamPeer." @@ -54129,10 +55135,12 @@ msgstr "Homologue de paquet UDP." msgid "" "UDP packet peer. Can be used to send raw UDP packets as well as [Variant]s." msgstr "" +"Un pair de paquet UDP. Peut être utilisé pour envoyer des paquets UDP bruts " +"mais aussi des [Variant]." #: doc/classes/PacketPeerUDP.xml msgid "Closes the UDP socket the [PacketPeerUDP] is currently listening on." -msgstr "" +msgstr "Ferme la prise UDP [PacketPeerUDP] qui est actuellement à l'écoute." #: doc/classes/PacketPeerUDP.xml msgid "" @@ -54155,18 +55163,24 @@ msgid "" "Returns the IP of the remote peer that sent the last packet(that was " "received with [method PacketPeer.get_packet] or [method PacketPeer.get_var])." msgstr "" +"Retourne l'IP du pair distant qui a envoyé le dernier paquet (qui a été reçu " +"avec [method PacketPeer.get_packet] ou [method PacketPeer.get_var])." #: doc/classes/PacketPeerUDP.xml msgid "" "Returns the port of the remote peer that sent the last packet(that was " "received with [method PacketPeer.get_packet] or [method PacketPeer.get_var])." msgstr "" +"Retourne le port du pair distant qui a envoyé le dernier paquet (qui a été " +"reçu avec [method PacketPeer.get_packet] ou [method PacketPeer.get_var])." #: doc/classes/PacketPeerUDP.xml msgid "" "Returns [code]true[/code] if the UDP socket is open and has been connected " "to a remote address. See [method connect_to_host]." msgstr "" +"Retourne [code]true[/code] si le socket UDP est ouverte et a été connectée à " +"une adresse distante. Voir [method connect_to_host]." #: doc/classes/PacketPeerUDP.xml msgid "Returns whether this [PacketPeerUDP] is listening." @@ -54181,12 +55195,21 @@ msgid "" "[b]Note:[/b] Some Android devices might require the " "[code]CHANGE_WIFI_MULTICAST_STATE[/code] permission for multicast to work." msgstr "" +"Joins le groupe multicast spécifié par [code]multicast_address[/code] en " +"utilisant l'interface identifiée par [code]interface_name[/code].\n" +"Vous pouvez rejoindre le même groupe multicast avec plusieurs interfaces. " +"Utilisez [method IP.get_local_interfaces] pour savoir lesquelles sont " +"disponibles.\n" +"[b]Note :[/b] Certains appareils Android pourraient nécessiter la permission " +"[code]CHANGE_WIFI_MULTICAST_STATE[/code] pour faire fonctionner le multicast." #: doc/classes/PacketPeerUDP.xml msgid "" "Removes the interface identified by [code]interface_name[/code] from the " "multicast group specified by [code]multicast_address[/code]." msgstr "" +"Supprime l'interface identifiée par [code]interface_name[/code] du groupe " +"multicast spécifié par [code]multicast_address[/code]." #: doc/classes/PacketPeerUDP.xml msgid "" @@ -54202,6 +55225,18 @@ msgid "" "only listen on the interface with that addresses (or fail if no interface " "with the given address exists)." msgstr "" +"Fait que ce [PacketPeerUDP] écoute le [code]port[/code] connecté à " +"[code]bind_address[/code] avec une taille de mémoire tampon de " +"[code]recv_buf_size[/code].\n" +"Si [code]bind_address[/code] est défini à [code]\"*\"[/code] (par défaut), " +"le pair écoutera toutes les adresses disponibles (IPv4 et IPv6.)\n" +"Si [code]bind_address[/code] est défini à [code]\"0.0.0.0\"[/code] (pour " +"IPv4) ou [code]\"::\"[/code] (pour IPv6), le pair écoutera toutes les " +"adresses disponibles correspondant à ce type d'IP.\n" +"Si [code]bind_address[/code] est défini à toute adresse valide (par exemple " +"[code]\"192.168.1.101\"[/code], [code]\"::1\"[/code], etc), le pair " +"n'écoutera que l'interface avec ces adresses (ou échouera si aucune " +"interface avec l'adresse donnée n'existe)." #: doc/classes/PacketPeerUDP.xml msgid "" @@ -54212,6 +55247,12 @@ msgid "" "[code]CHANGE_WIFI_MULTICAST_STATE[/code] permission and this option to be " "enabled to receive broadcast packets too." msgstr "" +"Active ou désactive l'envoi de paquets de diffusion (par exemple " +"[code]set_dest_address(\"255.255.255.255\", 4343)[/code]. Cette option est " +"désactivée par défaut.\n" +"[b]Note :[/b] Certains appareils Android peuvent nécessiter la permission " +"[code]CHANGE_WIFI_MULTICAST_STATE[/code] et cette option pour être activée " +"pour recevoir aussi des paquets de diffusion." #: doc/classes/PacketPeerUDP.xml msgid "" @@ -54220,6 +55261,11 @@ msgid "" "[b]Note:[/b] [method set_broadcast_enabled] must be enabled before sending " "packets to a broadcast address (e.g. [code]255.255.255.255[/code])." msgstr "" +"Définit l'adresse de destination et le port pour envoyer des paquets et des " +"variables. Un nom d'hôte sera résolu en utilisant le DNS si nécessaire.\n" +"[b]Note :[/b] [method set_broadcast_enabled] doit être activé avant " +"d'envoyer des paquets à une adresse de diffusion (par exemple " +"[code]255.255.255[/code])." #: doc/classes/PacketPeerUDP.xml msgid "" @@ -54264,6 +55310,8 @@ msgid "" "Panel is a [Control] that displays an opaque background. It's commonly used " "as a parent and container for other types of [Control] nodes." msgstr "" +"Le panneau est un [Control] qui affiche un fond opaque. Il est couramment " +"utilisé comme parent et conteneur pour d'autres types de nÅ“uds [Control]." #: doc/classes/Panel.xml msgid "2D Finite State Machine Demo" @@ -54286,6 +55334,9 @@ msgid "" "Panel container type. This container fits controls inside of the delimited " "area of a stylebox. It's useful for giving controls an outline." msgstr "" +"Le type de conteneur. Ce conteneur s'adapte aux contrôles à l'intérieur de " +"la zone délimitée d'une boîte de style. C'est utile pour donner un contour " +"aux contrôles." #: doc/classes/PanelContainer.xml msgid "The style of [PanelContainer]'s background." @@ -56030,7 +57081,6 @@ msgid "Returns the value of a damped spring joint parameter." msgstr "" #: doc/classes/Physics2DServer.xml -#, fuzzy msgid "" "Sets a damped spring joint parameter. See [enum DampedStringParam] for a " "list of available parameters." @@ -56402,12 +57452,10 @@ msgid "Constant to set/get whether the body can sleep." msgstr "La constante pour définir/obtenir si le corps peut être au repos." #: doc/classes/Physics2DServer.xml -#, fuzzy msgid "Constant to create pin joints." msgstr "Constante pour créer des joints d’épingle." #: doc/classes/Physics2DServer.xml -#, fuzzy msgid "Constant to create groove joints." msgstr "Constante pour créer des joints de rainure." @@ -57373,7 +58421,6 @@ msgid "If [code]true[/code], the query will take [PhysicsBody]s into account." msgstr "Si [code]true[/code], le requête prendra les [PhysicsBody] en compte." #: doc/classes/PinJoint.xml -#, fuzzy msgid "Pin joint for 3D PhysicsBodies." msgstr "Joint d’épingle pour les formes 3D." @@ -57402,7 +58449,6 @@ msgid "" msgstr "" #: doc/classes/PinJoint2D.xml -#, fuzzy msgid "Pin Joint for 2D shapes." msgstr "Joint d’épingle pour les formes 2D." @@ -58810,8 +59856,13 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +#, fuzzy +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" +"Retourne la position de l’élément qui a actuellement le focus. Ou retourne " +"[code]-1[/code] si aucun n'a le focus." #: doc/classes/PopupMenu.xml msgid "Hides the [PopupMenu] when the window loses focus." @@ -59067,7 +60118,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -59605,8 +60658,8 @@ msgid "" "Returns the specified property's initial value. Returns [code]null[/code] if " "the property does not exist." msgstr "" -"Retourne la valeur initiale de la propriété spécifiée. Retourne " -"[code]null[/code] si la propriété n'existe pas." +"Retourne la valeur initiale de la propriété spécifiée. Retourne [code]null[/" +"code] si la propriété n'existe pas." #: doc/classes/ProjectSettings.xml msgid "" @@ -59731,9 +60784,9 @@ msgid "" "nearest-neighbor interpolation (recommended for pixel art)." msgstr "" "Si [code]true[/code], applique le filtrage linéaire pour l'étirement de " -"l'image (recommandé pour les images à haute résolution.) Si " -"[code]false[/code], utilise l'interpolation la plus proche (recommandée pour " -"le pixel-art)." +"l'image (recommandé pour les images à haute résolution.) Si [code]false[/" +"code], utilise l'interpolation la plus proche (recommandée pour le pixel-" +"art)." #: doc/classes/ProjectSettings.xml msgid "" @@ -59748,9 +60801,9 @@ msgid "" "for this to take effect." msgstr "" "Ce dossier utilisateur est utilisé pour stocker des données persistantes (le " -"système de fichiers [code]user://[/code]). Si laissé vide, " -"[code]user://[/code] va pointer vers un dossier spécifique au projet suivant " -"la configuration de Godot (voir [method OS.get_user_data_dir]). Si un nom de " +"système de fichiers [code]user://[/code]). Si laissé vide, [code]user://[/" +"code] va pointer vers un dossier spécifique au projet suivant la " +"configuration de Godot (voir [method OS.get_user_data_dir]). Si un nom de " "dossier personnalisé est défini, ce nom sera utilisé à la place, puis ajouté " "au dossier de données utilisateur spécifique au système (le même dossier " "parent que celui configuration Godot documenté dans [method OS." @@ -59830,9 +60883,9 @@ msgid "" "default can impact compatibility with some external tools or plugins which " "expect the default [code].import[/code] folder." msgstr "" -"Si [code]true[/code], le projet utilisera un dossier caché ([code]." -"import[/code]) pour stocker des données spécifiques au projet (métadonnées, " -"cache des shaders, etc.)\n" +"Si [code]true[/code], le projet utilisera un dossier caché ([code].import[/" +"code]) pour stocker des données spécifiques au projet (métadonnées, cache " +"des shaders, etc.)\n" "Si [code]false[/code], un dossier non caché ([code]import[/code]) sera " "utilisé à la place.\n" "[b]Note :[/b] Vous devez redémarrer l'application après avoir modifié ce " @@ -59961,7 +61014,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -61807,9 +62864,9 @@ msgid "" "Desktop override for [member logging/file_logging/enable_file_logging], as " "log files are not readily accessible on mobile/Web platforms." msgstr "" -"Le surcharge du bureau pour [member logging/file_logging/enable_file_logging]" -", car les fichiers de journaux ne sont pas facilement accessibles sur les " -"plateformes mobiles et web." +"Le surcharge du bureau pour [member logging/file_logging/" +"enable_file_logging], car les fichiers de journaux ne sont pas facilement " +"accessibles sur les plateformes mobiles et web." #: doc/classes/ProjectSettings.xml msgid "" @@ -61857,42 +62914,57 @@ msgid "" "map_set_cell_height].\n" "[b]Note:[/b] Currently not implemented." msgstr "" +"La hauteur de la cellule par défaut pour les cartes de navigation 2D. Voir " +"[method Navigation2DServer.map_set_cell_height]\n" +"[b]Note :[/b] N'est pas actuellement implémenté." #: doc/classes/ProjectSettings.xml msgid "" "Default cell size for 2D navigation maps. See [method Navigation2DServer." "map_set_cell_size]." msgstr "" +"La taille par défaut pour les cartes de navigation 2D. Voir [method " +"Navigation2DServer.map_set_cell_size]." #: doc/classes/ProjectSettings.xml msgid "" "Default edge connection margin for 2D navigation maps. See [method " "Navigation2DServer.map_set_edge_connection_margin]." msgstr "" +"La marge par défaut de connexion des bordures pour les cartes de navigation " +"2D. Voir [method Navigation2DServer.map_set_edge_connection_margin]." #: doc/classes/ProjectSettings.xml msgid "" "Default cell height for 3D navigation maps. See [method NavigationServer." "map_set_cell_height]." msgstr "" +"La hauteur par défaut pour les cartes de navigation 3D. Voir [method " +"NavigationServer.map_set_cell_height]." #: doc/classes/ProjectSettings.xml msgid "" "Default cell size for 3D navigation maps. See [method NavigationServer." "map_set_cell_size]." msgstr "" +"La taille par défaut pour les cartes de navigation 3D. Voir [method " +"NavigationServer.map_set_cell_size]." #: doc/classes/ProjectSettings.xml msgid "" "Default edge connection margin for 3D navigation maps. See [method " "NavigationServer.map_set_edge_connection_margin]." msgstr "" +"La marge par défaut de connexion des bodures pour les cartes de navigation " +"3D. Voir [method NavigationServer.map_set_edge_connection_margin]." #: doc/classes/ProjectSettings.xml msgid "" "Default map up vector for 3D navigation maps. See [method NavigationServer." "map_set_up]." msgstr "" +"La carte par défaut du vecteur vers haut pour cartes de navigation 3D. Voir " +"[method NavigationServer.map_set_up]." #: doc/classes/ProjectSettings.xml msgid "" @@ -61900,6 +62972,9 @@ msgid "" "Over this value, content is dropped. This helps not to stall the debugger " "connection." msgstr "" +"La quantité maximale de caractères autorisés à envoyer sur la sortie du " +"débogueur. Une fois cette valeur dépassée, le nouveau contenu est ignoré. " +"Cela aide à ne pas bloquer la connexion du déboguer." #: doc/classes/ProjectSettings.xml msgid "" @@ -61907,6 +62982,9 @@ msgid "" "Over this value, content is dropped. This helps not to stall the debugger " "connection." msgstr "" +"Le nombre maximum d'erreurs autorisées à être envoyées à la sortie du " +"débogueur. Une fois cette valeur dépassée, le nouveau contenu est ignoré. " +"Cela aide à ne pas bloquer la connexion du déboguer." #: doc/classes/ProjectSettings.xml msgid "" @@ -61914,6 +62992,9 @@ msgid "" "this value, content is dropped. This helps not to stall the debugger " "connection." msgstr "" +"La quantité maximale de messages autorisés à être envoyés à la sortie du " +"débogueur. Une fois cette valeur dépassée, le nouveau contenu est ignoré. " +"Cela aide à ne pas bloquer la connexion du déboguer." #: doc/classes/ProjectSettings.xml msgid "" @@ -61921,6 +63002,9 @@ msgid "" "Over this value, content is dropped. This helps not to stall the debugger " "connection." msgstr "" +"Le nombre maximal d'avertissements autorisés à être envoyés à la sortie du " +"débogueur. Une fois cette valeur dépassée, le nouveau contenu est ignoré. " +"Cela aide à ne pas bloquer la connexion du déboguer." #: doc/classes/ProjectSettings.xml msgid "" @@ -61928,6 +63012,10 @@ msgid "" "specified as a power of two). The default value [code]16[/code] is equal to " "65,536 bytes. Over this size, data is dropped." msgstr "" +"La taille par défaut du flux par paire de paquets pour décoder les données " +"Godot (en octets, spécifié par une puissance de deux). La valeur par défaut " +"[code]16[/code] est égale à 65 536 octets. Une fois cette valeur dépassée, " +"le nouveau contenu est ignoré." #: doc/classes/ProjectSettings.xml msgid "Timeout (in seconds) for connection attempts using TCP." @@ -61937,6 +63025,8 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "Maximum size (in kiB) for the [WebRTCDataChannel] input buffer." msgstr "" +"La taille maximale (en kiB) de la mémoire du tampon d'entrée du " +"[WebRTCDataChannel]." #: doc/classes/ProjectSettings.xml msgid "Maximum size (in kiB) for the [WebSocketClient] input buffer." @@ -61985,6 +63075,9 @@ msgid "" "Amount of read ahead used by remote filesystem. Higher values decrease the " "effects of latency at the cost of higher bandwidth usage." msgstr "" +"La quantité de lecture en avance utilisée par le système de fichiers " +"distants. Des valeurs plus élevées diminuent les effets de latence mais " +"augmentent la bande passante." #: doc/classes/ProjectSettings.xml msgid "Page size used by remote filesystem (in bytes)." @@ -61999,18 +63092,28 @@ msgid "" "bundle will be used.\n" "If in doubt, leave this setting empty." msgstr "" +"Le pack de certificats CA à utiliser pour les connexions SSL. Si cela est " +"défini à une valeur non vide, cela [i]écrasera[/i] les certificats par " +"défaut de Godot venant du [url=https://github.com/godotengine/godot/blob/" +"master/third/certs/ca-certificates.crt]Pack de certificats de Mozilla[/ur]. " +"Si laissé vide, ce paquet de certificat par défaut sera utilisé.\n" +"En cas de doute, laissez ce réglage vide." #: doc/classes/ProjectSettings.xml msgid "" "When creating node names automatically, set the type of casing in this " "project. This is mostly an editor setting." msgstr "" +"Lorsque vous créez des noms de nÅ“uds automatiquement, définissez le type de " +"casse dans ce projet. C'est surtout un réglage de l'éditeur." #: doc/classes/ProjectSettings.xml msgid "" "What to use to separate node name from number. This is mostly an editor " "setting." msgstr "" +"Que faire pour séparer le nom de nÅ“ud du numéro. C'est surtout un réglage de " +"l'éditeur." #: doc/classes/ProjectSettings.xml msgid "" @@ -62066,6 +63169,14 @@ msgid "" "Physics2DServer.AREA_PARAM_GRAVITY, 98)\n" "[/codeblock]" msgstr "" +"La force de gravité par défaut en 2D (en pixels par seconde au carré).\n" +"[b]Note :[/b] Cette propriété est seulement lue au lancement du projet. Pour " +"modifier la gravité par défaut à l'exécution, utilisez le code suivant :\n" +"[codeblock]\n" +"# Réglez la force de gravité par défaut à 98.\n" +"Physics2DServer.area_set_param(get_viewport().find_world_2d().get_space(), " +"Physics2DServer.AREA_PARAM_GRAVITY, 98)\n" +"/[codeblock]" #: doc/classes/ProjectSettings.xml msgid "" @@ -62078,6 +63189,14 @@ msgid "" "Physics2DServer.AREA_PARAM_GRAVITY_VECTOR, Vector2(0, 1))\n" "[/codeblock]" msgstr "" +"La direction de la gravité par défaut en 2D.\n" +"[b]Note :[/b] Cette propriété est seulement lue au lancement du projet. Pour " +"modifier la gravité par défaut à l'exécution, utilisez le code suivant :\n" +"[codeblock]\n" +"# Définir la direction de gravité par défaut à `Vector2(0, 1)`.\n" +"Physics2DServer.area_set_param(get_viewport().find_world_2d().get_space(), " +"Physics2DServer.AREA_PARAM_GRAVITY_VECTOR, Vector2(0, 1))\n" +"/[codeblock]" #: doc/classes/ProjectSettings.xml msgid "" @@ -62139,18 +63258,25 @@ msgid "" "Time (in seconds) of inactivity before which a 2D physics body will put to " "sleep. See [constant Physics2DServer.SPACE_PARAM_BODY_TIME_TO_SLEEP]." msgstr "" +"Le temps (en secondes) d'inactivité avant lequel un corps de physique 2D " +"s'endormira. Voir [Constant Physics2DServer.SPACE_PARAM_BODY_TIME_TO_SLEEP]." #: doc/classes/ProjectSettings.xml msgid "" "Enables the use of bounding volume hierarchy instead of hash grid for 2D " "physics spatial partitioning. This may give better performance." msgstr "" +"Permet l'utilisation de la hiérarchie de volume englobant au lieu de la " +"grille de hachage pour le partitionnement spatial physique 2D. Cela peut " +"donner des meilleures performances." #: doc/classes/ProjectSettings.xml msgid "" "Sets whether the 3D physics world will be created with support for " "[SoftBody] physics. Only applies to the Bullet physics engine." msgstr "" +"Définit si le monde de physique 3D sera créé avec le support de la physique " +"[SoftBody]. Seulement s'applique au moteur de physique Bullet." #: doc/classes/ProjectSettings.xml msgid "" @@ -62393,6 +63519,8 @@ msgid "" "When batching is on, this regularly prints a frame diagnosis log. Note that " "this will degrade performance." msgstr "" +"Lors de l'affichage en lots, cela affichera régulièrement un diagnostic des " +"trames. À noter que cela dégrade les performances." #: doc/classes/ProjectSettings.xml msgid "" @@ -62440,10 +63568,12 @@ msgid "" "Turns 2D batching on and off. Batching increases performance by reducing the " "amount of graphics API drawcalls." msgstr "" +"Active ou désactive l'affichage 2D par lots. son activation augmente la " +"performance en réduisant la quantité d'appels de dessins sur API." #: doc/classes/ProjectSettings.xml msgid "Switches on 2D batching within the editor." -msgstr "" +msgstr "Active l'affichage 2D par lots dans l'éditeur." #: doc/classes/ProjectSettings.xml msgid "" @@ -62451,6 +63581,10 @@ msgid "" "batches, but there are diminishing returns for the memory used. This should " "only have a minor effect on performance." msgstr "" +"La taille de la mémoire tampon réservé aux sommets par lots. Une plus grande " +"taille permet des lots plus importants, mais le rapport avec la mémoire " +"utilisée est plus faible. Cela ne devrait avoir qu'une petite influence sur " +"les performances." #: doc/classes/ProjectSettings.xml msgid "" @@ -62460,6 +63594,12 @@ msgid "" "code] above which vertices will be translated to colored format. A value of " "0 will always use colored vertices, 1 will never use colored vertices." msgstr "" +"Inclure la couleur dans le format des sommets a un coût, cependant, ne pas " +"l'inclure empêche le gestion par lots à travers les changements de couleur. " +"Ce seuil détermine le rapport de [code]nombre de changements de couleur / " +"nombre total de sommets[/code] à partir duquel les sommets auront un format " +"avec la couleur. Une valeur de 0 utilisera toujours des sommets colorés, et " +"1 n'en utilisera jamais." #: doc/classes/ProjectSettings.xml msgid "" @@ -62713,6 +63853,11 @@ msgid "" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" +"Une surcharge pour [member rendering/gles3/shaders/shader_compilation_mode], " +"de sorte que la compilation asynchrone peut être désactivée sur les plates-" +"formes mobiles.\n" +"Vous voudrez peut-être le faire puisque les GPU des mobiles ne supportent en " +"général pas les ubershaders en raison de leur complexité." #: doc/classes/ProjectSettings.xml msgid "" @@ -62721,6 +63866,12 @@ msgid "" "You may want to do that since certain browsers (especially on mobile " "platforms) generally won't support ubershaders due to their complexity." msgstr "" +"Une surcharge pour [member rendering/gles3/shaders/shader_compilation_mode], " +"de sorte que la compilation asynchrone peut être désactivée sur les " +"plateformes web.\n" +"Vous pouvez vouloir le faire puisque certains navigateurs (surtout sur les " +"plates-formes mobiles) ne supportent en général pas les ubershaders en " +"raison de leur complexité." #: doc/classes/ProjectSettings.xml msgid "" @@ -62751,8 +63902,8 @@ msgid "" "Max buffer size for drawing immediate objects (ImmediateGeometry nodes). " "Nodes using more than this size will not work." msgstr "" -"La capacity maximale de la mémoire tampon pour le dessin d'objets immédiats (" -"les nÅ“uds ImmediateGeometry). Les nÅ“uds utilisant plus que cette taille ne " +"La capacity maximale de la mémoire tampon pour le dessin d'objets immédiats " +"(les nÅ“uds ImmediateGeometry). Les nÅ“uds utilisant plus que cette taille ne " "fonctionneront pas." #: doc/classes/ProjectSettings.xml @@ -63009,8 +64160,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -63092,6 +64254,9 @@ msgid "" "Lower-end override for [member rendering/quality/lightmapping/" "use_bicubic_sampling] on mobile devices, in order to reduce bandwidth usage." msgstr "" +"Une surcharge pour les appareils d'entrée de gamme, comme les appareils " +"mobiles, pour [member rendering/quality/lightmapping/use_bicubic_sampling], " +"afin de réduire l'utilisation de bande passante." #: doc/classes/ProjectSettings.xml msgid "" @@ -63099,12 +64264,18 @@ msgid "" "higher visual quality, while a smaller size will be faster and take up less " "memory." msgstr "" +"La taille des atlas utilisés par les sondes de réflexion. Une taille plus " +"grande peut entraîner une qualité visuelle plus élevée, tandis qu'une taille " +"plus petite sera plus rapide et prendre moins de mémoire." #: doc/classes/ProjectSettings.xml msgid "" "Number of subdivisions to use for the reflection atlas. A higher number " "lowers the quality of each atlas, but allows you to use more." msgstr "" +"Le nombre de sous-divisions à utiliser pour l'atlas de réflexion. Un nombre " +"plus élevé réduit la qualité de chaque atlas, mais vous permet d'en utiliser " +"plus." #: doc/classes/ProjectSettings.xml msgid "" @@ -63112,6 +64283,10 @@ msgid "" "variants of reflection probes and panorama backgrounds (sky). Those blurred " "variants are used by rough materials." msgstr "" +"Si [code]true[/code], utilise une grande quantité d'échantillons pour créer " +"des variantes floues de sondes de réflexion et d'arrière-plans panoramiques " +"(les ciels). Ces variantes floues sont utilisées par des matériaux avec " +"rugosité." #: doc/classes/ProjectSettings.xml msgid "" @@ -63119,6 +64294,9 @@ msgid "" "high_quality_ggx] on mobile devices, due to performance concerns or driver " "support." msgstr "" +"Une surcharge pour les appareils d'entrée de gamme, comme les appareils " +"mobiles, pour [member rendering/quality/reflections/high_quality_ggx], à " +"cause des potentiels soucis liés aux performances ou aux pilotes." #: doc/classes/ProjectSettings.xml msgid "" @@ -63137,6 +64315,10 @@ msgid "" "probes and panorama backgrounds (sky). This reduces jitter noise on " "reflections, but costs more performance and memory." msgstr "" +"Si [code]true[/code], utilise des tableaux de texture au lieu de mipmaps " +"pour les sondes de réflexion et les arrière-plans en panorama (ciel). Cela " +"réduit les effets de bruit \"jitter\" sur les réflexions, mais à réduit les " +"performances et augmente la mémoire utilisée." #: doc/classes/ProjectSettings.xml msgid "" @@ -63144,12 +64326,18 @@ msgid "" "texture_array_reflections] on mobile devices, due to performance concerns or " "driver support." msgstr "" +"Une surcharge pour les appareils d'entrée de gamme, comme les appareils " +"mobiles, pour [member rendering/quality/reflections/" +"texture_array_reflections], à cause des potentiels soucis liés aux " +"performances ou aux pilotes." #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses faster but lower-quality Blinn model to generate " "blurred reflections instead of the GGX model." msgstr "" +"Si [code]true[/code], utilise le modèle Blinn plus rapide mais de moins " +"bonne qualité pour générer des réflexions floues au lieu du modèle GGX." #: doc/classes/ProjectSettings.xml msgid "" @@ -63157,12 +64345,17 @@ msgid "" "force_blinn_over_ggx] on mobile devices, due to performance concerns or " "driver support." msgstr "" +"Une surcharge pour les appareils d'entrée de gamme, comme les appareils " +"mobiles, pour [member rendering/quality/shading/force_blinn_over_ggx], à " +"cause des potentiels soucis liés aux performances ou aux pilotes." #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses faster but lower-quality Lambert material " "lighting model instead of Burley." msgstr "" +"Si [code]true[/code], utilise le modèle d'éclairage de matériaux Lambert " +"plus rapide mais de qualité inférieure au modèle Burley." #: doc/classes/ProjectSettings.xml msgid "" @@ -63170,6 +64363,9 @@ msgid "" "force_lambert_over_burley] on mobile devices, due to performance concerns or " "driver support." msgstr "" +"Une surcharge pour les appareils d'entrée de gamme, comme les appareils " +"mobiles, pour [member rendering/quality/shading/force_lambert_over_burley], " +"à cause des potentiels soucis liés aux performances ou aux pilotes." #: doc/classes/ProjectSettings.xml msgid "" @@ -63337,6 +64533,11 @@ msgid "" "Try enabling this option if you see any visual anomalies in 3D (such as " "incorrect object visibility)." msgstr "" +"Si [code]true[/code], une version sûre du BVH (\"Bounding Volume " +"Hierarchy\") entre fils d'exécution sera utilisée dans le rendu et la " +"physique de Godot.\n" +"Essayez d'activer cette option si vous voyez des anomalies visuelles en 3D " +"(comme un visibilité incorrecte pour un objet)." #: doc/classes/ProjectSettings.xml msgid "" @@ -63463,9 +64664,9 @@ msgstr "" "exemple :\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" -"tween.tween_property(self, \"position\", Vector2(200, 100), 1).from(Vector2(" -"100, 100) # Ça déplacera le nÅ“ud de la position (100, 100) jusqu'à (200, 100)" -"\n" +"tween.tween_property(self, \"position\", Vector2(200, 100), 1)." +"from(Vector2(100, 100) # Ça déplacera le nÅ“ud de la position (100, 100) " +"jusqu'à (200, 100)\n" "/[codeblock]" #: doc/classes/PropertyTweener.xml @@ -63486,10 +64687,10 @@ msgstr "" "départ. Ceci est pareil que [method from] avec la valeur actuelle. Ces deux " "appels sont identiques :\n" "[codeblock]\n" -"tween.tween_property(self, \"position\", Vector2(200, 100), 1).from(position)" -"\n" -"tween.tween_property(self, \"position\", Vector2(200, 100), 1).from_current()" -"\n" +"tween.tween_property(self, \"position\", Vector2(200, 100), 1)." +"from(position)\n" +"tween.tween_property(self, \"position\", Vector2(200, 100), 1)." +"from_current()\n" "/[codeblock]" #: doc/classes/PropertyTweener.xml @@ -63621,6 +64822,13 @@ msgid "" "[b]Note:[/b] This signal is [i]not[/i] emitted by default, as the default " "[member dispatch_mode] is [constant MODE_PROXY]." msgstr "" +"Émis lorsque l'utilisateur appelle la méthode [method broadcast] et a défini " +"[member dispatch_mode] à [constant MODE_SIGNAL].\n" +"La méthode donnée et ses paramètres sont transmis aux objets qui sont " +"connectés au signal de cet objet, ainsi qu'à tout nÅ“ud [ProximityGroup] où " +"ce nÅ“ud est groupé avec.\n" +"[b]Note :[/b] Ce signal n'est [i]pas[/i] émis par défaut, car le [member " +"dispatch_mode] par défaut est [constant MODE_PROXY]." #: doc/classes/ProximityGroup.xml msgid "This [ProximityGroup]'s parent will be target of [method broadcast]." @@ -63685,6 +64893,10 @@ msgid "" "angles (in the YXZ convention: when decomposing, first Z, then X, and Y " "last), given in the vector format as (X angle, Y angle, Z angle)." msgstr "" +"Construit un quaternion qui effectuera une rotation spécifiée par les angles " +"d'Euler (suivant la convention YXZ : lors de la décomposition, d'abord Z, " +"puis X, et enfin Y), donnée dans le format vectoriel comme (angle X, angle " +"Y, angle Z)." #: doc/classes/Quat.xml msgid "" @@ -63778,8 +64990,8 @@ msgid "" "convention: when decomposing, first Z, then X, and Y last), given in the " "vector format as (X angle, Y angle, Z angle)." msgstr "" -"Définit le quaternion avec une rotation spécifiée par les angles d'Euler (" -"selon la convention YXZ : lors de la décomposition, d'abord Z, puis X, et " +"Définit le quaternion avec une rotation spécifiée par les angles d'Euler " +"(selon la convention YXZ : lors de la décomposition, d'abord Z, puis X, et " "enfin Y), donnée dans le format vectoriel comme (angle X, angle Y, angle Z)." #: doc/classes/Quat.xml @@ -63789,8 +65001,8 @@ msgid "" "[b]Note:[/b] Both quaternions must be normalized." msgstr "" "Retourne le résultat de l'interpolation linéaire sphérique entre ce " -"quaternion et [code]to[/code] par la quantité [code]weight[/code] spécifiée." -"\n" +"quaternion et [code]to[/code] par la quantité [code]weight[/code] " +"spécifiée.\n" "[b]Note :[/b] Les deux quaternions doivent être normalisés." #: doc/classes/Quat.xml @@ -64023,11 +65235,11 @@ msgid "" "configured [member step] and [member page] size. See e.g. [ScrollBar] and " "[Slider] for examples of higher level nodes using Range." msgstr "" -"Range est une classe de base des nÅ“uds [Control] qui change une " -"[code]value[/code] flottante entre le [code]minimum[/code] et le " -"[code]maximum[/code], par étape [code]step[/code] et par [code]page[/code], " -"par exemple un [ScrollBar]. Voir [ScrollBar] et [Slider] pour des exemples " -"de nÅ“uds de haut niveau utilisant des Range." +"Range est une classe de base des nÅ“uds [Control] qui change une [code]value[/" +"code] flottante entre le [code]minimum[/code] et le [code]maximum[/code], " +"par étape [code]step[/code] et par [code]page[/code], par exemple un " +"[ScrollBar]. Voir [ScrollBar] et [Slider] pour des exemples de nÅ“uds de haut " +"niveau utilisant des Range." #: doc/classes/Range.xml msgid "" @@ -64108,6 +65320,10 @@ msgid "" "[code]value[/code] will first be rounded to a multiple of [code]step[/code] " "then rounded to the nearest integer." msgstr "" +"Si supérieure à 0, [code]value[/code] sera toujours arrondie à un multiple " +"de [code]step[/code]. Si [code]rounded[/code] est également [code]true[/" +"code], [code]value[/code] sera d'abord arrondie à un multiple de [code]step[/" +"code] puis arrondie à l'entier le plus proche." #: doc/classes/Range.xml msgid "Range's current value." @@ -64131,6 +65347,14 @@ msgid "" "value_changed] is also emitted when [code]value[/code] is set directly via " "code." msgstr "" +"Émis quand [member value] change. Lorsqu'il est utilisé pour un [Slider], " +"cela s'appelle en continu lors du glissage (voire à chaque trame). Si vous " +"effectuez une opération coûteuse dans une fonction connectée à [signal " +"value_changed], essayez d'utiliser un [Timer] pour appeler la fonction moins " +"souvent.\n" +"[b]Note :[/b] Contrairement aux signaux tels que [signal LineEdit." +"text_changed], [signal value_changed] est également émis lorsque " +"[code]value[/code] est défini directement par code." #: doc/classes/RayCast.xml doc/classes/RayCast2D.xml msgid "Query the closest object intersecting a ray." @@ -64159,12 +65383,16 @@ msgid "" "Adds a collision exception so the ray does not report collisions with the " "specified node." msgstr "" +"Ajoute une exception de collision afin que le rayon ne signale pas les " +"collisions avec le nÅ“ud spécifié." #: doc/classes/RayCast.xml doc/classes/RayCast2D.xml msgid "" "Adds a collision exception so the ray does not report collisions with the " "specified [RID]." msgstr "" +"Ajoute une exception de collision de sorte que le rayon ne signale pas les " +"collisions avec le [RID] spécifié." #: doc/classes/RayCast.xml doc/classes/RayCast2D.xml msgid "Removes all collision exceptions for this ray." @@ -64178,6 +65406,12 @@ msgid "" "changed state.\n" "[b]Note:[/b] [code]enabled[/code] is not required for this to work." msgstr "" +"Met à jour les informations de collision pour le rayon. Utilisez cette " +"méthode pour mettre à jour les informations de collision immédiatement au " +"lieu d'attendre le prochain appel à [code]_physics_process[/code], par " +"exemple si le rayon ou son parent a changé d'état.\n" +"[b]Note :[/b] [code]enabled[/code] n'est pas nécessaire pour que cela " +"fonctionne." #: doc/classes/RayCast.xml doc/classes/RayCast2D.xml msgid "" @@ -64185,6 +65419,9 @@ msgid "" "object is intersecting the ray (i.e. [method is_colliding] returns " "[code]false[/code])." msgstr "" +"Retourne le premier objet que le rayon intersecte, ou [code]null[/code] si " +"aucun objet n'intersecte le rayon (c'est-à -dire [method is_colliding] " +"retourne [code]false[/code])." #: doc/classes/RayCast.xml doc/classes/RayCast2D.xml msgid "" @@ -64214,10 +65451,10 @@ msgid "" "Returns the collision point at which the ray intersects the closest object.\n" "[b]Note:[/b] This point is in the [b]global[/b] coordinate system." msgstr "" -"Retourne le point de collision où le rayon intersecte l'objet le plus proche." -"\n" -"[b]Note :[/b] Ce point se trouve dans le système de coordonnées " -"[b]global[/b]." +"Retourne le point de collision où le rayon intersecte l'objet le plus " +"proche.\n" +"[b]Note :[/b] Ce point se trouve dans le système de coordonnées [b]global[/" +"b]." #: doc/classes/RayCast.xml doc/classes/RayCast2D.xml msgid "" @@ -64422,8 +65659,8 @@ msgid "" "are positive." msgstr "" "Retourne un [Rect2] avec la même position et aire, modifié de sorte que le " -"coin supérieur gauche est l'origine et [code]width[/code] et " -"[code]height[/code] soient positifs." +"coin supérieur gauche est l'origine et [code]width[/code] et [code]height[/" +"code] soient positifs." #: doc/classes/Rect2.xml msgid "Returns the intersection of this [Rect2] and b." @@ -64450,8 +65687,8 @@ msgstr "" "[codeblock]\n" "# position (-3, 2), size (1, 1)\n" "var rect = Rect2(Vector2(-3, 2), Vector2(1, 1))\n" -"# position (-3, -1), size (3, 4), contient donc à la fois `rect` et Vector2(" -"0, -1)\n" +"# position (-3, -1), size (3, 4), contient donc à la fois `rect` et " +"Vector2(0, -1)\n" "var rect2 = rect.expand(Vector2(0, -1))\n" "/[codeblock]" @@ -64498,8 +65735,8 @@ msgid "" "[b]Note:[/b] If the [Rect2] has a negative size and is not flat or empty, " "[method has_no_area] will return [code]true[/code]." msgstr "" -"Retourne [code]true[/code] si le [Rect2] est plat ou vide, ou " -"[code]false[/code] sinon. Voir aussi [method get_area].\n" +"Retourne [code]true[/code] si le [Rect2] est plat ou vide, ou [code]false[/" +"code] sinon. Voir aussi [method get_area].\n" "[b]Note :[/b] Si le [Rect2] a une taille négative et n'est pas plat ou vide, " "[method has_no_area] retournera [code]true[/code]." @@ -66292,8 +67529,8 @@ msgid "" "See [member ProjectSettings.physics/3d/default_angular_damp] for more " "details about damping." msgstr "" -"Amortit les forces de rotation du corps. Si cette valeur est différente de -" -"1.0, elle sera ajoutée aux amortissements obtenues du monde et des aires.\n" +"Amortit les forces de rotation du corps. Si cette valeur est différente de " +"-1.0, elle sera ajoutée aux amortissements obtenues du monde et des aires.\n" "Voir [membre ProjectSettings.physics/3d/default_angular_damp] pour plus de " "détails sur l'amortissement." @@ -66989,11 +68226,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -67448,7 +68689,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -67609,18 +68852,20 @@ msgstr "La scène actuelle." #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" -"Si [code]true[/code], les formes des collisions seront visibles lors du " -"lancement du jeu depuis l'éditeur pour aider au débogage." #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" -"Si [code]true[/code], les polygones de navigation seront visibles lors du " -"lancement du jeu depuis l'éditeur pour aider au débogage." #: doc/classes/SceneTree.xml msgid "The root of the edited scene." @@ -67971,6 +69216,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -67983,7 +69240,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" "[SceneTreeTween] est un tween géré par l'arborescence. Contrairement à un " "[Tween], il ne nécessite pas la création d'un nÅ“ud.\n" @@ -68425,14 +69685,14 @@ msgstr "" "tween.tween_property($Sprite, \"position\", Vector2(200, 300), 1)\n" "[/codeblock]\n" "déplacera la sprite de sa position actuelle à la position (100, 200) puis " -"ensuite à (200, 300). Si vous utilisez [method PropertyTweener.from] ou [" -"method PropertyTweener.from_current], la position de départ sera celle " +"ensuite à (200, 300). Si vous utilisez [method PropertyTweener.from] ou " +"[method PropertyTweener.from_current], la position de départ sera celle " "spécifiée et non l'actuelle. Voir les autres méthodes de [PropertyTweener] " "pour connaitre les possibilités.\n" "[b]Note :[/b] Vous pouvez trouver les noms corrects des propriétés en " "survolant ces propriétés dans l'inspecteur de Godot. Vous pouvez aussi " -"fournir un seul composant de cette propriété directement en utilisant [code]" -"\"property:component\"[/code] (ex. [code]position:x[/code]), alors " +"fournir un seul composant de cette propriété directement en utilisant " +"[code]\"property:component\"[/code] (ex. [code]position:x[/code]), alors " "l'interpolation ne se fera que sur cet unique composant.\n" "Exemple : déplacer un objet deux fois depuis la même position vers " "différentes positions, avec différents types de transition.\n" @@ -69036,8 +70296,11 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." -msgstr "Le biais du solveur personnalisé de la forme." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." +msgstr "" #: doc/classes/ShortCut.xml msgid "A shortcut for binding input." @@ -69414,6 +70677,8 @@ msgid "" "If [code]true[/code], the slider can be interacted with. If [code]false[/" "code], the value can be changed only by code." msgstr "" +"Si [code]true[/code], l'utilisateur peut intéragir avec le curseur. Si " +"[code]false[/code], la valeur ne peut être modifiée que par code." #: doc/classes/Slider.xml msgid "If [code]true[/code], the value can be changed using the mouse wheel." @@ -69426,12 +70691,16 @@ msgid "" "Number of ticks displayed on the slider, including border ticks. Ticks are " "uniformly-distributed value markers." msgstr "" +"Le nombre de marqueurs affichées sur le curseur, y compris les marqueurs sur " +"les bords. Les marqueurs représentent des valeurs distribués uniformément." #: doc/classes/Slider.xml msgid "" "If [code]true[/code], the slider will display ticks for minimum and maximum " "values." msgstr "" +"Si [code]true[/code], le curseur affichera des marqueurs pour les valeurs " +"minimales et maximales." #: doc/classes/Slider.xml msgid "" @@ -69614,6 +70883,8 @@ msgid "" "Returns the parent [Spatial], or an empty [Object] if no parent exists or " "parent is not of type [Spatial]." msgstr "" +"Retourne le [Spatial] parent, ou un [Object] vide si aucun parent n'existe " +"ou si le parent n'est pas de type [Spatial]." #: doc/classes/Spatial.xml msgid "" @@ -69626,6 +70897,9 @@ msgid "" "Rotates the global (world) transformation around axis, a unit [Vector3], by " "specified angle in radians. The rotation axis is in global coordinate system." msgstr "" +"Pivote la transformation globale autour de l'axe, un [Vector3] unitaire, par " +"angle spécifié en radians. L'axe de rotation est dans le système de " +"coordonnées global." #: doc/classes/Spatial.xml msgid "" @@ -69640,6 +70914,8 @@ msgid "" "Moves the global (world) transformation by [Vector3] offset. The offset is " "in global coordinate system." msgstr "" +"Déplace la transformation globale par le décalage [Vector3 offset]. Le " +"décalage est dans le système de coordonnées global." #: doc/classes/Spatial.xml msgid "" @@ -69653,12 +70929,16 @@ msgid "" "Returns whether node notifies about its local transformation changes. " "[Spatial] will not propagate this by default." msgstr "" +"Retourne si le nÅ“ud notifie ses changements de transformation locale. " +"[Spatial] ne le propage pas par défaut." #: doc/classes/Spatial.xml msgid "" "Returns whether this node uses a scale of [code](1, 1, 1)[/code] or its " "local transformation scale." msgstr "" +"Retourne si ce nÅ“ud utilise une échelle de [code](1, 1, 1)[/code] ou son " +"échelle de transformation locale." #: doc/classes/Spatial.xml msgid "" @@ -69671,6 +70951,20 @@ msgid "" "Returns whether the node notifies about its global and local transformation " "changes. [Spatial] will not propagate this by default." msgstr "" +"Retourne si le nÅ“ud notifie ses changements de transformation globale et " +"locale. [Spatial] ne le propage pas par défaut." + +#: doc/classes/Spatial.xml +msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" +"Retourne [code]true[/code] si le nÅ“ud est présent dans le [SceneTree], que " +"sa propriété [member visible] est [code]true[/code] et que tous ses parents " +"sont également visibles. Si un parent est caché, ce nÅ“ud ne sera pas visible " +"dans l'arborescence de la scène." #: doc/classes/Spatial.xml msgid "" @@ -69693,6 +70987,9 @@ msgid "" "itself to point toward the [code]target[/code] as per [method look_at]. " "Operations take place in global space." msgstr "" +"Déplace le nÅ“ud vers la [code]position[/code] spécifiée, puis pivote vers la " +"cible [code]target[/code] comme avec [method look_at]. Les opérations se " +"déroulent dans l'espace global." #: doc/classes/Spatial.xml msgid "" @@ -69706,12 +71003,17 @@ msgid "" "Rotates the local transformation around axis, a unit [Vector3], by specified " "angle in radians." msgstr "" +"Pivote la transformation locale autour de l'axe, un [Vector3] unitaire, par " +"angle spécifié en radians." #: doc/classes/Spatial.xml msgid "" "Rotates the local transformation around axis, a unit [Vector3], by specified " "angle in radians. The rotation axis is in object-local coordinate system." msgstr "" +"Pivote la transformation locale autour de l'axe, un [Vector3] unitaire, par " +"angle spécifié en radians. L'axe de rotation est dans le système de " +"coordonnées local à l'objet." #: doc/classes/Spatial.xml msgid "Rotates the local transformation around the X axis by angle in radians." @@ -69749,24 +71051,33 @@ msgid "" "transformation scale. Changes to the local transformation scale are " "preserved." msgstr "" +"Définit si le nÅ“ud utilise une échelle de [code](1, 1, 1)[/code] ou son " +"échelle de transformation locale. Les changements de l'échelle de " +"transformation locale sont préservés." #: doc/classes/Spatial.xml msgid "" "Reset all transformations for this node (sets its [Transform] to the " "identity matrix)." msgstr "" +"Réinitialise toutes les transformations pour ce nÅ“ud (définit sa [Transform] " +"avec une matrice d'identité)." #: doc/classes/Spatial.xml msgid "" "Sets whether the node ignores notification that its transformation (global " "or local) changed." msgstr "" +"Définit si le nÅ“ud ignore la notification que sa transformation (globale ou " +"locale) a changé." #: doc/classes/Spatial.xml msgid "" "Sets whether the node notifies about its local transformation changes. " "[Spatial] will not propagate this by default." msgstr "" +"Définit si le nÅ“ud notifie ses changements de transformation locale. " +"[Spatial] ne le propage pas par défaut." #: doc/classes/Spatial.xml msgid "" @@ -69774,6 +71085,9 @@ msgid "" "changes. [Spatial] will not propagate this by default, unless it is in the " "editor context and it has a valid gizmo." msgstr "" +"Définit si le nÅ“ud notifie ses changements de transformation globale et " +"locale. [Spatial] ne le propage pas par défaut, sauf dans le contexte de " +"l'éditeur et a un manipulateur valide." #: doc/classes/Spatial.xml msgid "" @@ -69844,6 +71158,8 @@ msgid "" "Global position of this node. This is equivalent to [code]global_transform." "origin[/code]." msgstr "" +"La position globale de ce nÅ“ud. Ceci est équivalent à [code]global_transform." +"origin[/code]." #: doc/classes/Spatial.xml msgid "" @@ -69863,6 +71179,8 @@ msgid "" "Rotation part of the local transformation in degrees, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle)." msgstr "" +"La partie rotation de la transformation locale, en degrés, spécifiée en " +"termes d'angles YXZ d'Euler dans le format (angle X, angle Y puis angle Z)." #: doc/classes/Spatial.xml msgid "" @@ -69995,6 +71313,9 @@ msgid "" "Sets the [Texture] to be used by the specified [enum TextureParam]. This " "function is called when setting members ending in [code]*_texture[/code]." msgstr "" +"Définit la [Texture] à utiliser par le [enum TextureParam] spécifié. Cette " +"fonction est appelée lorsque les membres se terminent par [code]*_texture[/" +"code]." #: doc/classes/SpatialMaterial.xml msgid "The material's base color." @@ -70025,7 +71346,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -70048,6 +71371,8 @@ msgid "" "If [code]true[/code], ambient occlusion is enabled. Ambient occlusion " "darkens areas based on the [member ao_texture]." msgstr "" +"Si [code]true[/code], l'occlusion ambiante est activée. L'occlusion ambiante " +"assombrit les zones basées sur [member ao_texture]." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70167,12 +71492,16 @@ msgstr "" msgid "" "Scales the depth offset effect. A higher number will create a larger depth." msgstr "" +"Met à l'échelle l'effet de décalage de profondeur. Un nombre plus élevé " +"créera une profondeur plus grande." #: doc/classes/SpatialMaterial.xml msgid "" "Texture used to determine depth at a given pixel. Depth is always stored in " "the red channel." msgstr "" +"La texture déterminant la profondeur à un pixel donné. La profondeur est " +"toujours enregistrée dans le canal pour la couleur rouge." #: doc/classes/SpatialMaterial.xml msgid "Texture that specifies the color of the detail overlay." @@ -70183,6 +71512,8 @@ msgid "" "Specifies how the [member detail_albedo] should blend with the current " "[code]ALBEDO[/code]. See [enum BlendMode] for options." msgstr "" +"Spécifie comment [member detail_albedo] devrait se mélanger avec l'actuel " +"[code]ALBEDO[/code]. Voir [enum BlendMode] pour les options." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70197,6 +71528,8 @@ msgid "" "Texture used to specify how the detail textures get blended with the base " "textures." msgstr "" +"La texture utilisée pour spécifier comment les textures de détail se " +"mélangent avec les textures de base." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70315,6 +71648,8 @@ msgid "" "If [code]true[/code], transparency is enabled on the body. See also [member " "params_blend_mode]." msgstr "" +"Si [code]true[/code], la transparence est activée sur le corps. Voir aussi " +"[member params_blend_mode]." #: doc/classes/SpatialMaterial.xml msgid "If [code]true[/code], the object is unaffected by lighting." @@ -70326,6 +71661,10 @@ msgid "" "[b]Note:[/b] This is only effective for objects whose geometry is point-" "based rather than triangle-based. See also [member params_point_size]." msgstr "" +"Si [code]true[/code], la taille de rendu des points peut être modifiée.\n" +"[b]Note :[/b] Ce n'est efficace que pour les objets dont la géométrie est " +"définie à partir de points plutôt que de triangles. Voir aussi [member " +"params_point_size]." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70400,11 +71739,11 @@ msgstr "" #: doc/classes/SpatialMaterial.xml msgid "If [code]true[/code], normal mapping is enabled." -msgstr "" +msgstr "Si [code]true[/code], la carte normale est activée." #: doc/classes/SpatialMaterial.xml msgid "The strength of the normal map's effect." -msgstr "" +msgstr "L'intensité de l'effet de la carte normale." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70452,23 +71791,30 @@ msgid "" "Which side of the object is not drawn when backfaces are rendered. See [enum " "CullMode]." msgstr "" +"Quel côté de l'objet n'est pas dessiné lorsque les faces arrière sont " +"rendues. Voir [enum CullMode]." #: doc/classes/SpatialMaterial.xml msgid "" "Determines when depth rendering takes place. See [enum DepthDrawMode]. See " "also [member flags_transparent]." msgstr "" +"Détermine quand le rendu de profondeur a lieu. Voir [enum DepthDrawMode]. " +"Voir aussi [member flags_transparent]." #: doc/classes/SpatialMaterial.xml msgid "" "The algorithm used for diffuse light scattering. See [enum DiffuseMode]." msgstr "" +"L'algorithme utilisé pour diffuser la lumière. Voir [enum DiffuseMode]." #: doc/classes/SpatialMaterial.xml msgid "" "If [code]true[/code], enables the vertex grow setting. See [member " "params_grow_amount]." msgstr "" +"Si [code]true[/code], active l'inflation des sommets. Voir [member " +"params_grow_amount]." #: doc/classes/SpatialMaterial.xml msgid "Grows object vertices in the direction of their normals." @@ -70491,6 +71837,8 @@ msgid "" "If [code]true[/code], the shader will discard all pixels that have an alpha " "value less than [member params_alpha_scissor_threshold]." msgstr "" +"Si [code]true[/code], le shadow ignorera tous les pixels ayant une valeur " +"d'opacité inférieure à [member params_alpha_scisor_threshold]." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70498,12 +71846,18 @@ msgid "" "when using [constant BILLBOARD_PARTICLES]. See [member " "params_billboard_mode]." msgstr "" +"Le nombre de trames horizontales dans la feuille de sprite de particules. " +"Seulement activé avec [constant BILLBOARD_PARTICLES]. Voir [member " +"params_billboard_mode]." #: doc/classes/SpatialMaterial.xml msgid "" "If [code]true[/code], particle animations are looped. Only enabled when " "using [constant BILLBOARD_PARTICLES]. See [member params_billboard_mode]." msgstr "" +"Si [code]true[/code], les animations de particules sont en boucle. Seulement " +"activé avec [constant BILLBOARD_PARTICLES]. Voir [member " +"params_billboard_mode]." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70511,12 +71865,17 @@ msgid "" "when using [constant BILLBOARD_PARTICLES]. See [member " "params_billboard_mode]." msgstr "" +"Le nombre de trames verticales dans la feuille de sprite de particules. " +"Seulement activé avec [constant BILLBOARD_PARTICLES]. Voir [member " +"params_billboard_mode]." #: doc/classes/SpatialMaterial.xml msgid "" "Distance over which the fade effect takes place. The larger the distance the " "longer it takes for an object to fade." msgstr "" +"Distance sur laquelle l'effet de disparition se produit. Plus la distance " +"est grande, plus l'objet disparait progressivement." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70537,6 +71896,8 @@ msgid "" "The strength of the refraction effect. Higher values result in a more " "distorted appearance for the refraction." msgstr "" +"L'intensité de l'effet de réfraction. Des valeurs plus élevées entraînent " +"une apparence plus déformée pour la réfraction." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70586,6 +71947,9 @@ msgid "" "while a value of [code]1[/code] completely blurs the reflection. See also " "[member metallic]." msgstr "" +"La réflexion de surface. Une valeur de [code]0[/code] représente un miroir " +"parfait alors qu'une valeur de [code]1[/code] rend le reflet complètement " +"flou. Voir aussi [member metallic]." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70616,6 +71980,8 @@ msgid "" "The color used by the transmission effect. Represents the light passing " "through an object." msgstr "" +"La couleur utilisée pour l'effet de transmission. Représente la lumière " +"passant à travers un objet." #: doc/classes/SpatialMaterial.xml msgid "If [code]true[/code], the transmission effect is enabled." @@ -70626,6 +71992,8 @@ msgid "" "Texture used to control the transmission effect per-pixel. Added to [member " "transmission]." msgstr "" +"La texture utilisée pour contrôler l'effet de transmission par pixel. Ajouté " +"à [member transmission]." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70633,12 +72001,17 @@ msgid "" "added to [code]UV[/code] in the vertex function. This can be used to offset " "a texture." msgstr "" +"La quantité des coordonnées [code]UV[/code] à décaler. Cette quantité sera " +"ajoutée à [code]UV[/code] dans la fonction \"vertex\". Cela peut être " +"utilisé pour décaler une texture." #: doc/classes/SpatialMaterial.xml msgid "" "How much to scale the [code]UV[/code] coordinates. This is multiplied by " "[code]UV[/code] in the vertex function." msgstr "" +"La mise à l'échelle des coordonnées [code]UV[/code]. Ceci est multiplié par " +"[code]UV[/code] dans la fonction \"vertex\"." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70666,12 +72039,17 @@ msgid "" "added to [code]UV2[/code] in the vertex function. This can be used to offset " "a texture." msgstr "" +"La quantité des coordonnées [code]UV2[/code] à décaler. Cette quantité sera " +"ajoutée à [code]UV2[/code] dans la fonction \"vertex\". Cela peut être " +"utilisé pour décaler une texture." #: doc/classes/SpatialMaterial.xml msgid "" "How much to scale the [code]UV2[/code] coordinates. This is multiplied by " "[code]UV2[/code] in the vertex function." msgstr "" +"La mise à l'échelle des coordonnées [code]UV2[/code]. Ceci est multiplié par " +"[code]UV2[/code] dans la fonction \"vertex\"." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70844,6 +72222,8 @@ msgid "" "Default blend mode. The color of the object is blended over the background " "based on the object's alpha value." msgstr "" +"Le mode de mélange par défaut. La couleur de l'objet est mélangée sur " +"l'arrière-plan en fonction de l'opacité de l'objet." #: doc/classes/SpatialMaterial.xml msgid "The color of the object is added to the background." @@ -70866,6 +72246,8 @@ msgstr "" #: doc/classes/SpatialMaterial.xml msgid "Depth draw is calculated for both opaque and transparent objects." msgstr "" +"Le dessin de la profondeur est calculé pour des objets opaques et aussi " +"transparents." #: doc/classes/SpatialMaterial.xml msgid "No depth draw." @@ -70876,6 +72258,8 @@ msgid "" "For transparent objects, an opaque pass is made first with the opaque parts, " "then transparency is drawn." msgstr "" +"Pour les objets transparents, une passe opaque est faite d'abord avec les " +"parties opaques, puis la transparence est dessinée." #: doc/classes/SpatialMaterial.xml msgid "Default cull mode. The back of the object is culled when not visible." @@ -70904,6 +72288,8 @@ msgid "" "Lighting is calculated per-vertex rather than per-pixel. This can be used to " "increase the speed of the shader at the cost of quality." msgstr "" +"L'éclairage est calculé par sommet plutôt que par pixel. Cela peut être " +"utilisé pour améliorer la vitesse du shader mais réduit la qualité visuelle." #: doc/classes/SpatialMaterial.xml msgid "Set [code]ALBEDO[/code] to the per-vertex color specified in the mesh." @@ -70916,6 +72302,8 @@ msgid "" "Vertex color is in sRGB space and needs to be converted to linear. Only " "applies in the GLES3 renderer." msgstr "" +"La couleur des sommets est dans l'espace sRGB et doit être convertie en " +"linéaire. Seulement ne s'applique qu'au rendu GLES3." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70923,11 +72311,16 @@ msgid "" "albedo texture lookup to use [code]POINT_COORD[/code] instead of [code]UV[/" "code]." msgstr "" +"Utilise la taille d'affichage des points pour modifier pour les primitives " +"de points. Change également la projection des textures albedo en utilisant " +"[code]POINT_COORD[/code] au lieu de [code]UV[/code]." #: doc/classes/SpatialMaterial.xml msgid "" "Object is scaled by depth so that it always appears the same size on screen." msgstr "" +"L'objet est mise à l'échelle suivant sa profondeur pour qu'il apparaisse " +"toujours la même taille à l'écran." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70935,6 +72328,9 @@ msgid "" "when billboarding. Only applies when [member params_billboard_mode] is " "[constant BILLBOARD_ENABLED]." msgstr "" +"Le shader gardera l'échelle pour le maillage. Sinon, la mise à l'échelle " +"sera ignoré lors de l'affichage en mode panneau. Ne s'applique que quand " +"[member params_billboard_mode] est [constant BILLBOARD_ENABLED]." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70978,6 +72374,8 @@ msgid "" "Use world coordinates in the triplanar texture lookup instead of local " "coordinates." msgstr "" +"Utilise les coordonnées globales pour la projection de la texture " +"triplanaire au lieu des coordonnées locales." #: doc/classes/SpatialMaterial.xml msgid "Forces the shader to convert albedo from sRGB space to linear space." @@ -71007,17 +72405,18 @@ msgid "Default diffuse scattering algorithm." msgstr "" #: doc/classes/SpatialMaterial.xml -#, fuzzy msgid "Diffuse scattering ignores roughness." msgstr "La diffusion diffuse ignore la rugosité." #: doc/classes/SpatialMaterial.xml msgid "Extends Lambert to cover more than 90 degrees when roughness increases." msgstr "" +"Étend le calcul Lambert pour couvrir plus de 90 degrés quand la rugosité " +"augmente." #: doc/classes/SpatialMaterial.xml msgid "Attempts to use roughness to emulate microsurfacing." -msgstr "" +msgstr "Tente d'utiliser la rugosité pour simuler le microsurfaçage." #: doc/classes/SpatialMaterial.xml msgid "Uses a hard cut for lighting, with smoothing affected by roughness." @@ -71042,7 +72441,6 @@ msgid "No specular blob." msgstr "Pas de blob spéculaire." #: doc/classes/SpatialMaterial.xml -#, fuzzy msgid "Billboard mode is disabled." msgstr "Le mode d'affichage est désactivé." @@ -71061,6 +72459,12 @@ msgid "" "The [member ParticlesMaterial.anim_speed] or [member CPUParticles." "anim_speed] should also be set to a positive value for the animation to play." msgstr "" +"Utilisé pour les systèmes de particules lorsqu'ils sont affectés aux nÅ“uds " +"[Particles] et [CPUParticles]. Active les propriétés [code]particles_anim_*[/" +"code].\n" +"[member ParticlesMaterial.anim_speed] ou [member CPUParticles.anim_speed] " +"devrait également être défini à une valeur positive pour que l'animation " +"soit jouée." #: doc/classes/SpatialMaterial.xml msgid "Used to read from the red channel of a texture." @@ -71095,6 +72499,8 @@ msgid "" "Smoothly fades the object out based on each pixel's distance from the camera " "using the alpha channel." msgstr "" +"Fait disparaitre doucement l'objet en fonction de la distance de chaque " +"pixel par rapport à la caméra en utilisant l'opacité." #: doc/classes/SpatialMaterial.xml msgid "" @@ -71145,6 +72551,10 @@ msgid "" "[b]Note:[/b] To get a regular hemisphere, the height and radius of the " "sphere must be equal." msgstr "" +"Si [code]true[/code], un hémisphère (une demi-sphère) est créé plutôt qu'une " +"sphère entière.\n" +"[b]Note :[/b] Pour obtenir un hémisphère uniforme, la hauteur et le rayon " +"doivent être identiques." #: doc/classes/SphereMesh.xml msgid "Number of radial segments on the sphere." @@ -71167,6 +72577,9 @@ msgid "" "Sphere shape for 3D collisions, which can be set into a [PhysicsBody] or " "[Area]. This shape is useful for modeling sphere-like 3D objects." msgstr "" +"Une forme sphérique pour les collisions 3D, qui peut être placée dans un " +"[PhysicsBody] ou une [Area]. Cette forme est utile pour modéliser des objets " +"3D sphériques." #: doc/classes/SphereShape.xml msgid "The sphere's radius. The shape's diameter is double the radius." @@ -71279,18 +72692,25 @@ msgid "" "Container for splitting two [Control]s vertically or horizontally, with a " "grabber that allows adjusting the split offset or ratio." msgstr "" +"Un conteneur pour diviser deux [Control] verticalement ou horizontalement, " +"avec un séparateur pour régler le décalage ou le rapport entre ces deux " +"contrôles." #: doc/classes/SplitContainer.xml msgid "" "Clamps the [member split_offset] value to not go outside the currently " "possible minimal and maximum values." msgstr "" +"Limite la valeur [member split_offset] pour rester dans l'intervalle défini " +"entre les valeurs minimale et maximale actuellement possibles." #: doc/classes/SplitContainer.xml msgid "" "If [code]true[/code], the area of the first [Control] will be collapsed and " "the dragger will be disabled." msgstr "" +"Si [code]true[/code], le premier [Control] sera masqué et le glisseur " +"désactivé." #: doc/classes/SplitContainer.xml msgid "" @@ -71305,6 +72725,8 @@ msgid "" "The initial offset of the splitting between the two [Control]s, with " "[code]0[/code] being at the end of the first [Control]." msgstr "" +"Le décalage initial de la séparation entre les deux [Control], avec [code]0[/" +"code] étant la fin du premier [Control]." #: doc/classes/SplitContainer.xml msgid "Emitted when the dragger is dragged by user." @@ -71315,7 +72737,6 @@ msgid "The split dragger is visible when the cursor hovers it." msgstr "Le dragueur fractionné est visible quand le curseur le survole." #: doc/classes/SplitContainer.xml -#, fuzzy msgid "The split dragger is never visible." msgstr "Le dragueur fractionné n’est jamais visible." @@ -71385,6 +72806,8 @@ msgid "" "Adds the [PhysicsBody] object with the given [RID] to the list of " "[PhysicsBody] objects excluded from the collision check." msgstr "" +"Ajoute l'objet [PhysicsBody] à la liste des objets [PhysicsBody] ignorés " +"lors de la vérification des collisions." #: doc/classes/SpringArm.xml msgid "" @@ -71402,6 +72825,8 @@ msgid "" "Removes the given [RID] from the list of [PhysicsBody] objects excluded from " "the collision check." msgstr "" +"Supprime le [RID] de la liste des objets [PhysicsBody] ignorés de la " +"vérification des collisions." #: doc/classes/SpringArm.xml msgid "" @@ -71410,6 +72835,10 @@ msgid "" "and-masks]Collision layers and masks[/url] in the documentation for more " "information." msgstr "" +"Les calques selon lesquels le contrôle des collisions doit être effectué. " +"Voir [url=$DOCS_URL/tutorials/physics/physics_introduction.html#collision-" +"layers-and-masks]Calques et masques de collision[/url] dans la documentation " +"pour plus d'informations." #: doc/classes/SpringArm.xml msgid "" @@ -71429,6 +72858,9 @@ msgid "" "When the shape is set, the SpringArm will cast the [Shape] on its z axis " "instead of performing a ray cast." msgstr "" +"La [Shape] à utiliser pour le SpringArm.\n" +"Lorsque la forme est définie, le SpringArm lancera le [Shape] sur son axe Z " +"au lieu d'exécuter un lancer de rayon." #: doc/classes/SpringArm.xml msgid "" @@ -71438,6 +72870,11 @@ msgid "" "To know more about how to perform a shape cast or a ray cast, please consult " "the [PhysicsDirectSpaceState] documentation." msgstr "" +"L'étendue maximale du SpringArm. Il s'agit d'une longueur tant pour le rayon " +"que pour la forme utilisée à l'intérieur pour calculer la position souhaitée " +"pour les nÅ“uds enfants du SpringArm.\n" +"Pour en savoir plus sur la façon d'effectuer un lancer de forme ou de rayon, " +"veuillez consulter la documentation de [PhysicsDirectSpaceState]." #: doc/classes/Sprite.xml msgid "General-purpose sprite node." @@ -71448,6 +72885,9 @@ msgid "" "A node that displays a 2D texture. The texture displayed can be a region " "from a larger atlas texture, or a frame from a sprite sheet animation." msgstr "" +"Un nÅ“ud qui affiche une texture 2D. La texture affichée peut être une région " +"à partir d'une texture plus grande de l'atlas, ou d'une trame d'une " +"animation de feuille de sprite." #: doc/classes/Sprite.xml msgid "" @@ -71461,6 +72901,16 @@ msgid "" " print(\"A click!\")\n" "[/codeblock]" msgstr "" +"Retourne un [Rect2] représentant la taille englobante du Sprite dans les " +"coordonnées locales. Peut être utilisé pour détecter si le Sprite a été " +"cliqué. Par exemple :\n" +"[codeblock]\n" +"func _input(event):\n" +" if event is InputEventMouseButton and event.pressed and event." +"button_index == BUTTON_LEFT:\n" +" if get_rect().has_point(to_local(event.position)):\n" +" print(\"Un clic !\")\n" +"[/codeblock]" #: doc/classes/Sprite.xml msgid "" @@ -71469,6 +72919,10 @@ msgid "" "[b]Note:[/b] It also returns [code]false[/code], if the sprite's texture is " "[code]null[/code] or if the given position is invalid." msgstr "" +"Retourne [code]true[/code], si le pixel à la position donnée est opaque, ou " +"[code]false[/code] sinon.\n" +"[b]Note :[/b] Retourne également [code]false[/code] si la texture du sprite " +"est [code]null[/code] ou si la position donnée est invalide." #: doc/classes/Sprite.xml msgid "If [code]true[/code], texture is centered." @@ -71479,6 +72933,8 @@ msgid "" "Current frame to display from sprite sheet. [member hframes] or [member " "vframes] must be greater than 1." msgstr "" +"La trame actuelle à afficher dans la feuille de sprite. [membres hframes] ou " +"[membres vframes] doivent être supérieurs à 1." #: doc/classes/Sprite.xml doc/classes/Sprite3D.xml msgid "" @@ -71486,6 +72942,9 @@ msgid "" "for the [member frame] property. [member hframes] or [member vframes] must " "be greater than 1." msgstr "" +"Les coordonnées de la trame à afficher de la feuille de sprite. Il s'agit " +"d'un raccourci de la propriété [member frame]. [membres hframes] ou [membres " +"vframes] doivent être supérieurs à 1." #: doc/classes/Sprite.xml doc/classes/Sprite3D.xml msgid "The number of columns in the sprite sheet." @@ -71546,6 +73005,9 @@ msgid "" "can be a region from a larger atlas texture, or a frame from a sprite sheet " "animation." msgstr "" +"Un nÅ“ud qui affiche une texture 2D dans un environnement 3D. La texture " +"affichée peut être une région à partir d'une texture plus grande de l'atlas, " +"ou d'une trame d'une animation de feuille de sprite." #: doc/classes/Sprite3D.xml msgid "" @@ -71556,10 +73018,13 @@ msgstr "" "atlas. Voir [member region_rect]." #: doc/classes/Sprite3D.xml +#, fuzzy msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" +"La [Texture] à dessiner. Si [member GeometryInstance.material_override] est " +"utilisé, cette dernière sera utilisée." #: doc/classes/SpriteBase3D.xml msgid "2D sprite node in 3D environment." @@ -71587,6 +73052,8 @@ msgid "" "If [code]true[/code], texture can be seen from the back as well, if " "[code]false[/code], it is invisible when looking at it from behind." msgstr "" +"Si [code]true[/code], la texture est aussi affichée de dos, si [code]false[/" +"code], elle est invisible de dos." #: doc/classes/SpriteBase3D.xml msgid "" @@ -71632,8 +73099,8 @@ msgid "" msgstr "" "Définit la priorité de rendu pour le texte. Les objets plus prioritaires " "seront affichés par-dessus les objets les moins prioritaites.\n" -"[b]Note :[/b] Cela ne s'applique que si [member alpha_cut] est défini à [" -"constant ALPHA_CUT_DISABLED] (c'est la valeur par défaut).\n" +"[b]Note :[/b] Cela ne s'applique que si [member alpha_cut] est défini à " +"[constant ALPHA_CUT_DISABLED] (c'est la valeur par défaut).\n" "[b]Note :[/b] Cela ne s'applique qu'au tri des objets transparents. Cela " "n'affectera pas la façon dont les objets transparents sont triés par rapport " "aux objets opaques. C'est parce que les objets opaques ne sont pas triés, " @@ -71645,33 +73112,43 @@ msgid "" "If [code]true[/code], the [Light] in the [Environment] has effects on the " "sprite." msgstr "" +"Si [code]true[/code], une [Light] dans le [Environment] a des effets sur le " +"sprite." #: doc/classes/SpriteBase3D.xml msgid "" "If [code]true[/code], the texture's transparency and the opacity are used to " "make those parts of the sprite invisible." msgstr "" +"Si [code]true[/code], la transparence et l'opacité des textures sont " +"utilisées pour rendre invisibles ces parties du sprite." #: doc/classes/SpriteBase3D.xml msgid "" "If set, the texture's transparency and the opacity are used to make those " "parts of the sprite invisible." msgstr "" +"Si elle est définie, la transparence de la texture et l'opacité sont " +"utilisées pour rendre invisibles ces parties du sprite." #: doc/classes/SpriteBase3D.xml msgid "If set, lights in the environment affect the sprite." -msgstr "" +msgstr "Si définies, les lumières dans l'environnement affecte le sprite." #: doc/classes/SpriteBase3D.xml msgid "" "If set, texture can be seen from the back as well, if not, it is invisible " "when looking at it from behind." msgstr "" +"Si défini, la texture est aussi visible de derrière, sinon, elle est " +"invisible quand on la regarde de derrière." #: doc/classes/SpriteBase3D.xml msgid "" "Sprite is scaled by depth so that it always appears the same size on screen." msgstr "" +"Sprite est mise à l'échelle suivant sa profondeur pour qu'elle apparaisse " +"toujours avec la même taille à l'écran." #: doc/classes/SpriteFrames.xml msgid "Sprite frame library for AnimatedSprite and AnimatedSprite3D." @@ -71708,6 +73185,8 @@ msgid "" "Returns [code]true[/code] if the given animation is configured to loop when " "it finishes playing. Otherwise, returns [code]false[/code]." msgstr "" +"Retourne [code]true[/code] si l'animation donnée est configurée pour boucler " +"lorsqu'elle termine de jouer. Sinon, retourne [code]false[/code]." #: doc/classes/SpriteFrames.xml msgid "" @@ -71785,12 +73264,16 @@ msgid "" "The body's constant angular velocity. This does not rotate the body, but " "affects other bodies that touch it, as if it was in a state of rotation." msgstr "" +"La vitesse angulaire constante du corps. Cela ne tourne pas le corps, mais " +"affecte les autres corps qui le touchent, comme s'il pivotait." #: doc/classes/StaticBody.xml msgid "" "The body's constant linear velocity. This does not move the body, but " "affects other bodies that touch it, as if it was in a state of movement." msgstr "" +"La vitesse linéaire constante du corps. Cela ne déplace pas le corps, mais " +"affecte les autres corps qui le touchent, comme s'il se déplaçait." #: doc/classes/StaticBody.xml msgid "" @@ -71827,12 +73310,16 @@ msgid "" "The body's constant angular velocity. This does not rotate the body, but " "affects colliding bodies, as if it were rotating." msgstr "" +"La vitesse angulaire constante du corps. Cela ne tourne pas le corps, mais " +"affecte les autres corps qui le touchent, comme s'il pivotait." #: doc/classes/StaticBody2D.xml msgid "" "The body's constant linear velocity. This does not move the body, but " "affects colliding bodies, as if it were moving." msgstr "" +"La vitesse linéaire constante du corps. Cela ne déplace pas le corps, mais " +"affecte les autres corps qui le touchent, comme s'il se déplaçait." #: doc/classes/StaticBody2D.xml msgid "" @@ -71841,6 +73328,10 @@ msgid "" "Deprecated, use [member PhysicsMaterial.friction] instead via [member " "physics_material_override]." msgstr "" +"Le frottement du corps. Les valeurs vont de [code]0[/code] (pas de friction) " +"à [code]1[/code] (friction complète).\n" +"Obsolète, utilisez plutôt [member PhysicsMaterial.friction] avec [member " +"physics_material_override]." #: doc/classes/StreamPeer.xml msgid "Abstraction and base class for stream-based protocols." @@ -71852,6 +73343,9 @@ msgid "" "as TCP). It provides an API for sending and receiving data through streams " "as raw data or strings." msgstr "" +"StreamPeer est une classe abstraite de base pour les protocoles à base de " +"flux (comme TCP). Elle fournit une API pour l'envoi et la réception de " +"données par les flux sous forme de données brutes ou textuelles." #: doc/classes/StreamPeer.xml msgid "Gets a signed 16-bit value from the stream." @@ -71881,6 +73375,11 @@ msgid "" "received. This function returns two values, an [enum @GlobalScope.Error] " "code and a data array." msgstr "" +"Retourne les morceaux de données avec les octets reçus. Le nombre d'octets à " +"recevoir peut être spécifié dans l'argument [code]bytes[/code]. Si pas assez " +"d'octets sont disponibles, la fonction bloquera jusqu'à ce que la quantité " +"demandée soit reçu. Cette fonction retourne deux valeurs : un code [enum " +"@GlobalScope.Error] et un tableau de données." #: doc/classes/StreamPeer.xml msgid "Gets a double-precision float from the stream." @@ -71898,6 +73397,11 @@ msgid "" "function returns two values, an [enum @GlobalScope.Error] code, and a data " "array." msgstr "" +"Retourne les morceaux de données avec les octets. Le nombre d'octets à " +"recevoir peut être spécifié dans l'argument [code]byts[/code]. Si pas assez " +"d'octets sont disponibles, la fonction retournera combien ont effectivement " +"été reçus. Cette fonction retourne deux valeurs : un code [enum @GlobalScope." +"Error] et un tableau de données." #: doc/classes/StreamPeer.xml msgid "" @@ -71905,6 +73409,9 @@ msgid "" "[code]bytes[/code] is negative (default) the length will be read from the " "stream using the reverse process of [method put_string]." msgstr "" +"Retourne une chaîne ASCII de longeur [code]octets[/code] du flux. Si " +"[code]bytes[/code] est négatif (par défaut) la longueur sera lue depuis le " +"flux en utilisant le processus inverse de [method put_string]." #: doc/classes/StreamPeer.xml msgid "Gets an unsigned 16-bit value from the stream." @@ -71929,6 +73436,10 @@ msgid "" "(default) the length will be read from the stream using the reverse process " "of [method put_utf8_string]." msgstr "" +"Retourne une chaîne UTF-8 de longueur [code]bytes[/code] du flux (ceci " +"décode la chaîne envoyée en UTF-8). Si [code]bytes[/code] est négatif (par " +"défaut) la longueur sera lue depuis le flux en utilisant le processus " +"inverse de [method put_utf8_string]." #: doc/classes/StreamPeer.xml msgid "" @@ -71938,6 +73449,12 @@ msgid "" "Do not use this option if the serialized object comes from untrusted sources " "to avoid potential security threats such as remote code execution." msgstr "" +"Retourne un Variant du flux. Si [code]allow_objects[/code] est [code]true[/" +"code], le décodage des objets sera autorisé.\n" +"[b]Avertissement :[/b] Les objets désérialisés peuvent contenir du code qui " +"sera exécuté. N'utilisez pas cette option si l'objet sérialisé provient de " +"sources non sûres pour éviter des risques de sécurité telles que l'exécution " +"de code à distance." #: doc/classes/StreamPeer.xml msgid "Puts a signed 16-bit value into the stream." @@ -71961,6 +73478,9 @@ msgid "" "the data is done sending. This function returns an [enum @GlobalScope.Error] " "code." msgstr "" +"Envoie un morceau de données à travers la connexion, en blocant si " +"nécessaire jusqu'à ce que les données soient envoyées. Cette fonction " +"retourne un code [enum @GlobalScope.Error]." #: doc/classes/StreamPeer.xml msgid "Puts a double-precision float into the stream." @@ -71977,6 +73497,10 @@ msgid "" "[enum @GlobalScope.Error] code and an integer, describing how much data was " "actually sent." msgstr "" +"Envoie un morceau de données par la connexion. Si toutes les données ne " +"peuvent pas être envoyées à la fois, seule une partie de celle-ci le sera. " +"Cette fonction retourne deux valeurs : un code [enum @GlobalScope.Error], et " +"un entier décrivant la quantité de données effectivement envoyées." #: doc/classes/StreamPeer.xml msgid "" @@ -71988,6 +73512,13 @@ msgid "" "put_data(\"Hello world\".to_ascii())\n" "[/codeblock]" msgstr "" +"Ajoute une chaîne ASCII (se terminant par le caractère nul) dans le flux " +"précédée par un entier de 32 bits représentant sa taille.\n" +"[b]Note :[/b] Pour mettre une chaîne ASCII sans la faire précéder par sa " +"taille, vous pouvez utiliser [method put_data] :\n" +"[codeblock]\n" +"put_data(\"Salut le monde\".to_ascii())\n" +"[/codeblock]" #: doc/classes/StreamPeer.xml msgid "Puts an unsigned 16-bit value into the stream." @@ -72015,18 +73546,30 @@ msgid "" "put_data(\"Hello world\".to_utf8())\n" "[/codeblock]" msgstr "" +"Ajoute une chaîne UTF-8 (se terminant par le caractère nul) dans le flux " +"précédée par un entier non signé de 32 bits représentant sa taille.\n" +"[b]Note :[/b] Pour mettre une chaîne UTF-8 sans la faire précéder par sa " +"taille, vous pouvez utiliser [method put_data] :\n" +"[codeblock]\n" +"put_data(\"Salut le monde\".to_utf8())\n" +"[/codeblock]" #: doc/classes/StreamPeer.xml msgid "" "Puts a Variant into the stream. If [code]full_objects[/code] is [code]true[/" "code] encoding objects is allowed (and can potentially include code)." msgstr "" +"Ajoute un Variant dans le flux. Si [code]full_objects[/code] est [code]true[/" +"code], le codage des objects est autorisé (ceux-ci peuvent potentiellement " +"contenir du code)." #: doc/classes/StreamPeer.xml msgid "" "If [code]true[/code], this [StreamPeer] will using big-endian format for " "encoding and decoding." msgstr "" +"Si [code]true[/code], ce [StreamPeer] utilisera le format big-endian pour " +"l'encodage et le décodage." #: doc/classes/StreamPeerBuffer.xml msgid "Data buffer stream peer." @@ -72050,6 +73593,8 @@ msgstr "Efface le [member data_array] et rétablit le curseur." msgid "" "Returns a new [StreamPeerBuffer] with the same [member data_array] content." msgstr "" +"Retourne un nouveau [StreamPeerBuffer] avec le même contenu de [member " +"data_array]." #: doc/classes/StreamPeerBuffer.xml msgid "Returns the current cursor position." @@ -72069,10 +73614,14 @@ msgid "" "Moves the cursor to the specified position. [code]position[/code] must be a " "valid index of [member data_array]." msgstr "" +"Déplace le curseur vers la position spécifiée. [code]position[/code] doit " +"être un index valide de [member data_array]." #: doc/classes/StreamPeerBuffer.xml msgid "The underlying data buffer. Setting this value resets the cursor." msgstr "" +"La mémoire tampon interne. Changer cette valeur réinitialise la position du " +"curseur." #: doc/classes/StreamPeerSSL.xml msgid "SSL stream peer." @@ -72083,6 +73632,8 @@ msgid "" "SSL stream peer. This object can be used to connect to an SSL server or " "accept a single SSL client connection." msgstr "" +"Un pair d'un flux SSL. Cet objet peut être utilisé pour se connecter à un " +"serveur SSL ou accepter une seule connexion avec un client SSL." #: doc/classes/StreamPeerSSL.xml msgid "" @@ -72091,6 +73642,10 @@ msgid "" "can pass the optional [code]chain[/code] parameter to provide additional CA " "chain information along with the certificate." msgstr "" +"Accepte une connexion par les pairs en tant que serveur en utilisant la " +"[code]private_key[/code] et en fournissant le [code]certificate[/code] donné " +"au client. Vous pouvez passer le paramètre optionnel [code]chain[/code] pour " +"fournir des informations supplémentaires sur la chaîne CA avec le certificat." #: doc/classes/StreamPeerSSL.xml msgid "" @@ -72101,6 +73656,13 @@ msgid "" "[b]Note:[/b] Specifying a custom [code]valid_certificate[/code] is not " "supported in HTML5 exports due to browsers restrictions." msgstr "" +"Se connecte à un pair en utilisant le [code]stream[/code] interne d'un " +"[StreamPeer]. Si [code]validate_certs[/code] est [code]true[/code], " +"[StreamPeerSSL] validera le certificat du pair pour s'assurer qu'il " +"correspond au [code]for_hostname[/code].\n" +"[b]Note :[/b] Spécifier un code personnalisé pour [code]valid_certificate[/" +"code] n'est pas pris en charge dans les exportations HTML5 en raison des " +"restrictions des navigateurs." #: doc/classes/StreamPeerSSL.xml doc/classes/StreamPeerTCP.xml msgid "Disconnects from host." @@ -72111,6 +73673,9 @@ msgid "" "Poll the connection to check for incoming bytes. Call this right before " "[method StreamPeer.get_available_bytes] for it to work properly." msgstr "" +"Sonde la connexion pour vérifier les octets entrants. Appelez ceci avant " +"[method StreamPeer.get_available_bytes] pour que ça puisse fonctionner " +"correctement." #: doc/classes/StreamPeerSSL.xml msgid "A status representing a [StreamPeerSSL] that is disconnected." @@ -72133,6 +73698,8 @@ msgid "" "An error status that shows a mismatch in the SSL certificate domain " "presented by the host and the domain requested for validation." msgstr "" +"Un statut d'erreur qui montre une erreur dans le domaine de certificat SSL " +"présenté par l'hôte et le domaine demandé pour validation." #: doc/classes/StreamPeerTCP.xml msgid "TCP stream peer." @@ -72143,6 +73710,8 @@ msgid "" "TCP stream peer. This object can be used to connect to TCP servers, or also " "is returned by a TCP server." msgstr "" +"Pair de flux TCP. Cet objet peut être utilisé pour se connecter aux serveurs " +"TCP, ou est également retourné par un serveur TCP." #: doc/classes/StreamPeerTCP.xml msgid "" @@ -72150,6 +73719,9 @@ msgid "" "resolved if valid. Returns [constant OK] on success or [constant FAILED] on " "failure." msgstr "" +"Se connecte au pair [code]host:port[/code] spécifié. Un nom d'hôte sera " +"résolu si valide. Retourne [constant OK] en cas de succès ou [constant " +"FAILED] en cas l'échec." #: doc/classes/StreamPeerTCP.xml msgid "Returns the IP of this peer." @@ -72229,6 +73801,11 @@ msgid "" "Strings are reference-counted and use a copy-on-write approach, so passing " "them around is cheap in resources." msgstr "" +"C'est la classe de chaîne intégrée (et celle utilisée par GDScript). Il " +"prend en charge l'Unicode et fournit tous les moyens nécessaires pour la " +"manipulation des chaînes. Les chaînes sont comptées par référence et " +"utilisent une approche de copie à l'écriture, donc les passer en argument ne " +"demande que très peu de ressources." #: doc/classes/String.xml msgid "Constructs a new String from the given [bool]." @@ -72387,6 +73964,13 @@ msgid "" "[b]Note:[/b] Unlike the GDScript parser, this method doesn't support the " "[code]\\uXXXX[/code] escape sequence." msgstr "" +"Retourne une copie de la chaîne avec des caractères échappés remplacés par " +"leurs significations. Les caracètres échappés supportés sont : [code]\\'[/" +"code], [code]\\\"[/code], [code]\\?[/code], [code]\\\\[/code], [code]\\a[/" +"code], [code]\\b[/code], [code]\\f[/code], [code]\\n[/code], [code]\\r[/" +"code], [code]\\t[/code] et [code]\\v[/code].\n" +"[b]Note :[/b] Contrairement au parseur GDScript, cette méthode ne supporte " +"pas la séquence d'échappement de caractères Unicode [code]\\uXXXX[/code]." #: doc/classes/String.xml msgid "" @@ -72397,6 +73981,12 @@ msgid "" "code], it will return [code]Capitalize Camel Case Mixed With Underscores[/" "code]." msgstr "" +"Change la casse de certaines lettres. Remplace les underscores avec des " +"espaces, ajoute des espaces avant les caractères majuscules en mots, " +"convertit toutes les lettres en minuscule, puis met en majuscule la première " +"lettre et chaque lettre suivant un caractère d'espace. Pour [code]unTexte en " +"majuscule avec_des_underscores[/code], cela retournera [code]Un Texte En " +"Majuscule Avec des Underscores[/code]." #: doc/classes/String.xml msgid "" @@ -72424,6 +74014,10 @@ msgid "" "[code]to[/code] equals 0 the whole string will be used. If only [code]to[/" "code] equals 0 the remained substring will be used." msgstr "" +"Retourne le nombre d'occurrences de la sous-chaîne [code]what[/code] entre " +"les positions [code]from[/code] et [code]to[/code]. Si [code]from[/code] et " +"[code]to[/code] sont égales à 0, la chaîne entière sera utilisée. Si " +"seulement [code]to[/code] est à 0, la sous-chaîne restante sera utilisée." #: doc/classes/String.xml msgid "" @@ -72432,6 +74026,11 @@ msgid "" "[code]from[/code] and [code]to[/code] equals 0 the whole string will be " "used. If only [code]to[/code] equals 0 the remained substring will be used." msgstr "" +"Retourne le nombre d'occurrences de la sous-chaîne [code]what[/code] (en " +"ignorant la casse) entre les positions [code]from[/code] et [code]to[/code]. " +"Si [code]from[/code] et [code]to[/code] sont égales à 0, la chaîne entière " +"sera utilisée. Si seulement [code]to[/code] est à 0, la sous-chaîne restante " +"sera utilisée." #: doc/classes/String.xml msgid "" @@ -72537,6 +74136,33 @@ msgid "" "\"Godot\"]]))\n" "[/codeblock]" msgstr "" +"Formate la chaîne en remplaçant toutes les occurrences de [code]placeholder[/" +"code] par les éléments de [code]values[/code].\n" +"[code]values[/code] peut être un [Dictionary] ou un [Array]. Toute occurence " +"de [code]placeholder[/code] sera remplacée par les clés correspondantes à " +"l'avance. Les éléments Array utilisent leur index comme clés.\n" +"[codeblock]\n" +"# Affiche : 'En attendant Godot' est une pièce de Samuel Beckett, et le " +"moteur Godot est nommé d'après elle.\n" +"var use_array_values = \"'En attendant {0}' est une pièce de {1}, et le " +"moteur {0} est nommé d'après elle.\"\n" +"print(use_array_values.format([\"Godot\", \"Samuel Beckett\"]))\n" +"\n" +"# Affiche : L'utilisateur 42 est Godot.\n" +"print(\"L'utilisateur {id} est {name}.\".format({\"id\": 42, \"name\": " +"\"Godot\"}))\n" +"[/codeblock]\n" +"Une manipulation supplémentaire est effectuée quand [code]values[/code] est " +"un tableau. Si [code]placeholder[/code] ne contient pas de underscore " +"(\"_\"), les éléments du tableau seront utilisés pour remplacer " +"l'occurrence ; Si un élément de tableau est un autre tableau de 2 éléments, " +"il sera interprété comme une paire de clé et valeur.\n" +"[codeblock]\n" +"# Affiche : L'utilisateur 42 est Godot.\n" +"print(\"L'utilisateur {} est {}.\".format([42, \"Godot\"], \"{}\"))\n" +"print(\"L'utilisateur {id} est {name}.\".format([[\"id\", 42], [\"name\", " +"\"Godot\"]]))\n" +"[/codeblock]" #: doc/classes/String.xml msgid "If the string is a valid file path, returns the base directory name." @@ -72600,6 +74226,15 @@ msgid "" "print(\"i/am/example/string\".get_slice(\"/\", 2)) # Prints 'example'.\n" "[/codeblock]" msgstr "" +"Divise une chaîne en utilisant un [code]delimiter[/code] et retourne une " +"sous-chaîne à l'index [code]slice[/code]. Retourne une chaîne vide si " +"l'index n'existe pas.\n" +"Il s'agit d'une alternative plus performante à [method split] pour les cas " +"où vous avez besoin d'un seul élément du tableau à un index fixe.\n" +"Exemple :\n" +"[codeblock]\n" +"print(\"je/suis/un/exemple\".get_slice(\"/\", 3)) # Affiche 'exemple'.\n" +"[/codeblock]" #: doc/classes/String.xml msgid "" @@ -72609,6 +74244,13 @@ msgid "" "does [i]not[/i] imply the strings are equal, because different strings can " "have identical hash values due to hash collisions." msgstr "" +"Retourne la valeur de hachage de 32 bits représentant le contenu de la " +"chaîne.\n" +"[b]Note :[/b] Les [String] avec un contenu identique produiront toujours des " +"valeurs de hachage identiques. Cependant, l'inverse n'est pas vrai. Des " +"valeurs de hachage identiques n'implique [i]pas[/i] que les chaînes le " +"soient aussi, car différentes chaînes peuvent avoir des valeurs de hachage " +"identiques en raison de collisions de hachage." #: doc/classes/String.xml msgid "" @@ -72651,6 +74293,12 @@ msgid "" "http_unescape())\n" "[/codeblock]" msgstr "" +"Échappe (décode) une chaine dans le format encodé pour les URL. Également " +"dénommé \"URL decode\".\n" +"[codeblock]\n" +"print(\"https://example.org/?escaped=\" + \"Godot%20Engine%3A%27docs%27\"." +"http_unescape())\n" +"[/codeblock]" #: doc/classes/String.xml msgid "" @@ -72664,6 +74312,16 @@ msgid "" "print(size) # prints \"127.5 MiB\"\n" "[/codeblock]" msgstr "" +"Convertit [code]size[/code] qui représente un taille en octets dans un " +"format lisible en utilisant un ensemble internationalisé d'unités de taille " +"de données, comme : o, Kio, Mio, Gio, Tio, Pio, Eio. Notez que l'unité " +"proche la plus petite est choisie automatiquement pour s'adapter aux " +"multiples de 1024.\n" +"[codeblock]\n" +"var bytes = 133790307\n" +"var size = String.humanize_size(bytes)\n" +"print(size) # Affiche \"127.5 Mio\"\n" +"[/codeblock]" #: doc/classes/String.xml msgid "" @@ -72674,6 +74332,14 @@ msgid "" "e.g. [code]\"# \"[/code]. See also [method dedent] to remove indentation.\n" "[b]Note:[/b] Empty lines are kept empty." msgstr "" +"Retourne une copie de la chaîne avec des lignes identées avec [code]prefix[/" +"code].\n" +"Par exemple, la chaîne peut être identée avec deux tabulations en utilisant " +"[code]\"\\t\\t\"[/code], ou quatre espaces en utilisant [code]\" \"[/" +"code]. Le préfixe peut être n'importe quelle chaîne de sorte qu'il peut " +"également être utilisé pour commenter les chaînes avec par exemple [code]\"# " +"\"[/code]. Voir aussi [method dedent] pour supprimer l'indentation.\n" +"[b]Note :[/b] Les lignes vides sont gardées vides." #: doc/classes/String.xml msgid "" @@ -72688,18 +74354,24 @@ msgid "" "If the string is a path to a file or directory, returns [code]true[/code] if " "the path is absolute." msgstr "" +"Si la chaîne est un chemin vers un fichier ou un dossier, retourne " +"[code]true[/code] si le chemin est absolu." #: doc/classes/String.xml msgid "" "If the string is a path to a file or directory, returns [code]true[/code] if " "the path is relative." msgstr "" +"Si la chaîne est un chemin vers un fichier ou un dossier, retourne " +"[code]true[/code] si le chemin est relatif." #: doc/classes/String.xml msgid "" "Returns [code]true[/code] if this string is a subsequence of the given " "string." msgstr "" +"Retourne [code]true[/code] si cette chaîne est une sous-séquence de la " +"chaîne donnée." #: doc/classes/String.xml msgid "" @@ -72715,6 +74387,9 @@ msgid "" "allowed in file names, those being:\n" "[code]: / \\ ? * \" | % < >[/code]" msgstr "" +"Retourne [code]true[/code] si cette chaîne est libre des caractères qui ne " +"sont pas autorisés dans les noms de fichiers, ceux-ci étant :\n" +"[code]: / \\ ? * \" | % < >[/code]" #: doc/classes/String.xml msgid "" @@ -72727,6 +74402,14 @@ msgid "" "print(\"Hello\".is_valid_float()) # Prints \"False\"\n" "[/codeblock]" msgstr "" +"Retourne [code]true[/code] si cette chaîne contient un flottant valide. Ceci " +"inclut les entiers, et supporte aussi les exposants :\n" +"[codeblock]\n" +"print(\"1.7\".is_valid_float()) # Affiche \"True\"\n" +"print(\"24\".is_valid_float()) # Affiche \"True\"\n" +"print(\"7e3\".is_valid_float()) # Affiche \"True\"\n" +"print(\"Hello\".is_valid_float()) # Affiche \"False\"\n" +"[/codeblock]" #: doc/classes/String.xml msgid "" @@ -72735,6 +74418,10 @@ msgid "" "the hexadecimal number is determined by [code]0x[/code] prefix, for " "instance: [code]0xDEADC0DE[/code]." msgstr "" +"Retourne [code]true[/code] si cette chaîne contient un numéro hexadécimal " +"valide. Si [code]with_prefix[/code] est [code]true[/code], alors le nombre " +"hexadécimal doit commencer par [code]0x[/code] pour être valide, comme par " +"exemple : [code]0xDEADC0DE[/code]." #: doc/classes/String.xml msgid "" @@ -72743,6 +74430,11 @@ msgid "" "[code]hsl()[/code] colors aren't considered valid by this method and will " "return [code]false[/code]." msgstr "" +"Retourne [code]true[/code] si cette chaîne contient une couleur valide dans " +"la notation HTML hexadécimale. D'autres notations HTML telles que les " +"couleurs nommées ou l'utilisation de [code]hsl()[/code] ne sont pas " +"considérées comme valides par cette méthode et retourneront toujours " +"[code]false[/code]." #: doc/classes/String.xml msgid "" @@ -72755,6 +74447,15 @@ msgid "" "print(\"bad_ident_#2\".is_valid_identifier()) # Prints \"False\"\n" "[/codeblock]" msgstr "" +"Retourne [code]true[/code] si cette chaîne est un identifiant valide. Un " +"identifiant valide ne peut contenir que des lettres, des chiffres et des " +"underlines ([code]_[/code]) et le premier caractère ne peut pas être un " +"chiffre. Ça représente un nom valide d'une variable ou d'une méthode.\n" +"[codeblock]\n" +"print(\"good_ident_1\".is_valid_identifier()) # Affiche \"True\"\n" +"print(\"1st_bad_ident\".is_valid_identifier()) # Affiche \"False\"\n" +"print(\"bad_ident_#2\".is_valid_identifier()) # Affiche \"False\"\n" +"[/codeblock]" #: doc/classes/String.xml msgid "" @@ -72767,6 +74468,14 @@ msgid "" "print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" +"Retourne [code]true[/code] si cette chaîne contient un entier valide.\n" +"[codeblock]\n" +"print(\"7\".is_valid_integer()) # Affiche \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Affiche \"False\"\n" +"print(\"L\".is_valid_integer()) # Affiche \"False\"\n" +"print(\"+3\".is_valid_integer()) # Affiche \"True\"\n" +"print(\"-12\".is_valid_integer()) # Affiche \"True\"\n" +"[/codeblock]" #: doc/classes/String.xml msgid "" @@ -72775,6 +74484,10 @@ msgid "" "Reserved_IP_addresses]reserved IP addresses[/url] such as [code]0.0.0.0[/" "code] as valid." msgstr "" +"Retourne [code]true[/code] si cette chaîne contient seulement une adresse " +"IPv4 ou IPv6 correctement formée. Cette méthode considère [url=https://en." +"wikipedia.org/wiki/Reserved_IP_addresses]les adresses IP réservées[/url] " +"comme [code]0.0.0.0[/code] comme étant valides." #: doc/classes/String.xml msgid "" @@ -72785,6 +74498,14 @@ msgid "" "print(\", \".join([\"One\", \"Two\", \"Three\", \"Four\"]))\n" "[/codeblock]" msgstr "" +"Retourner une [String] qui est la concaténation des éléments [code]parts[/" +"code]. Le séparateur entre les éléments est la chaîne qui appelle cette " +"méthode.\n" +"Exemple :\n" +"[codeblock]\n" +"print(\", \".join([\"Un\", \"deux\", \"trois\", \"quatre.\"])) # Affiche " +"\"Un, deux, trois, quatre.\"\n" +"[/codeblock]" #: doc/classes/String.xml msgid "" @@ -72819,6 +74540,11 @@ msgid "" "single character except a period ([code]\".\"[/code]). An empty string or " "empty expression always evaluates to [code]false[/code]." msgstr "" +"Fait une correspondance simple de l'expression sensible à la casse, où " +"[code]\"*\"[/code] correspond aucun, un seul ou plusieurs caractères " +"arbitraires, et [code]\"?\"[/code] correspond à un seule caracètre sauf un " +"point ([code]\".\"[/code]). Une chaîne ou expression vide est toujours " +"évaluée [code]false[/code]." #: doc/classes/String.xml msgid "" @@ -72827,10 +74553,15 @@ msgid "" "single character except a period ([code]\".\"[/code]). An empty string or " "empty expression always evaluates to [code]false[/code]." msgstr "" +"Fait une correspondance simple de l'expression insensible à la casse, où " +"[code]\"*\"[/code] correspond aucun, un seul ou plusieurs caractères " +"arbitraires, et [code]\"?\"[/code] correspond à un seule caracètre sauf un " +"point ([code]\".\"[/code]). Une chaîne ou expression vide est toujours " +"évaluée [code]false[/code]." #: doc/classes/String.xml msgid "Returns the MD5 hash of the string as an array of bytes." -msgstr "" +msgstr "Retourne le hachage MD5 de la chaîne dans un tableau d'octets." #: doc/classes/String.xml msgid "Returns the MD5 hash of the string as a string." @@ -72912,6 +74643,9 @@ msgid "" "Percent-encodes a string. Encodes parameters in a URL when sending a HTTP " "GET request (and bodies of form-urlencoded POST requests)." msgstr "" +"Encode avec des pourcentages une chaîne. Encode les paramètres dans une URL " +"lors de l'envoi d'une requête HTTP GET (et les corps de requêtes POST sous " +"forme codée)." #: doc/classes/String.xml msgid "" @@ -72919,6 +74653,9 @@ msgid "" "the string as a subpath. E.g. [code]\"this/is\".plus_file(\"path\") == " "\"this/is/path\"[/code]." msgstr "" +"Si la chaîne est un chemin, ajoute [code]file[/code] à la fin de la chaîne " +"comme sous-chemin. Par exemple : [code]\"vers/un\".plus_file(\"fichier\") == " +"\"vers/un/fichier\"[/code]." #: doc/classes/String.xml msgid "" @@ -72967,11 +74704,15 @@ msgstr "" "donnée." #: doc/classes/String.xml +#, fuzzy msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -73010,6 +74751,12 @@ msgid "" "trim_suffix] method that will remove a single suffix string rather than a " "set of characters." msgstr "" +"Retourne une copie de la chaîne avec des caractères retirés de la droite. " +"L'argument [code]chars[/code] est une chaîne spécifiant l'ensemble des " +"caractères à supprimer.\n" +"[b]Note :[/b] [code]chars[/code] n'est pas un suffixe. Voir la méthode " +"[method trim_suffix] qui supprimera une seule chaîne de suffixe plutôt qu'un " +"ensemble de caractères." #: doc/classes/String.xml msgid "Returns the SHA-1 hash of the string as an array of bytes." @@ -73064,9 +74811,13 @@ msgid "Returns a simplified canonical path." msgstr "" #: doc/classes/String.xml +#, fuzzy msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -73104,12 +74855,20 @@ msgstr "" "utilisez plutôt la classe [RegEx]." #: doc/classes/String.xml +#, fuzzy msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" +"Divise la chaîne en flottants en utilisant une chaîne comme délimiteur et " +"retourne un tableau des sous-chaînes.\n" +"Par exemple, [code]\"12,5,3\"[/code] retournera [code][1, 2.5, 3][/code] si " +"délimité par [code]\",\"[/code]." #: doc/classes/String.xml msgid "" @@ -73118,6 +74877,10 @@ msgid "" "end. The optional arguments are used to toggle stripping on the left and " "right edges respectively." msgstr "" +"Retourne une copie de la chaîne avec tous les caractères non imprimable " +"(soient les tabulations, les espaces et les retours à la ligne) supprimés en " +"début et en fin de chaîne. Les arguments optionnels permettent d'activer ou " +"non la suppression des caractères en début ou en fin respectivement." #: doc/classes/String.xml msgid "" @@ -73126,6 +74889,11 @@ msgid "" "32), such as tabulation ([code]\\t[/code] in C) and newline ([code]\\n[/" "code] and [code]\\r[/code]) characters, but not spaces." msgstr "" +"Retourne une copie de la chaîne avec tous les caractères d'échappement " +"supprimés. Il s'agit de tous les caractères de commande non-imprimables de " +"la première page de la table ASCII (< 32), tels que la tabulation " +"([code]\\t[/code] in C) et le retour à la ligne ([code]\\n[/code] et " +"[code]\\r[/code]), mais pas les espaces." #: doc/classes/String.xml msgid "" @@ -73133,6 +74901,10 @@ msgid "" "[code]len[/code]. Argument [code]len[/code] is optional and using [code]-1[/" "code] will return remaining characters from given position." msgstr "" +"Retourne une partie de la chaîne de la position [code]from[/code] avec la " +"longueur [code]len[/code]. L'argument [code]len[/code] est optionnel et " +"l'utilisation [code]-1[/code] renvoie les caractères restants à partir de la " +"position donnée." #: doc/classes/String.xml msgid "" @@ -73158,6 +74930,16 @@ msgid "" "print(\"1e3\".to_float()) # 1000\n" "[/codeblock]" msgstr "" +"Convertit une chaîne contenant un nombre décimal en [code]float[/code]. La " +"méthode s'arrêtera sur le premier caractère qui n'est pas un chiffre sauf le " +"premier [code].[/code] (point décimal), et [code]e[/code] qui est utilisé " +"pour l'exposant.\n" +"[codeblock]\n" +"print(\"12.3\".to_float()) # 12.3\n" +"print(\"1.2.3\".to_float()) # 1.2\n" +"print(\"12ab3\".to_float()) # 12\n" +"print(\"1e3\".to_float()) # 1*10^3 = 1000\n" +"[/codeblock]" #: doc/classes/String.xml msgid "" @@ -73170,6 +74952,14 @@ msgid "" "print(\"1.2.3\".to_int()) # 1\n" "[/codeblock]" msgstr "" +"Convertit une chaîne contenant un nombre entier en [code]int[/code]. La " +"méthode supprimera tout caractère qui n'est pas un chiffre et s'arrêtera si " +"elle rencontre un [code].[/code].\n" +"[codeblock]\n" +"print(\"123\".to_int()) # 123\n" +"print(\"a1b2c3\".to_int()) # 123\n" +"print(\"1.2.3\".to_int()) # 1\n" +"[/codeblock]" #: doc/classes/String.xml msgid "Returns the string converted to lowercase." @@ -73196,6 +74986,8 @@ msgid "" "Converts the String (which is an array of characters) to [PoolByteArray] " "(which is an array of bytes)." msgstr "" +"Convertit la String (qui est un tableau de caractères) en [PoolByteArray] " +"(un tableau d'octets)." #: doc/classes/String.xml msgid "" @@ -73219,6 +75011,9 @@ msgid "" "([code].[/code] [code]:[/code] [code]@[/code] [code]/[/code] [code]\"[/" "code])." msgstr "" +"Supprimer les caractères de la chaîne qui sont interdits dans les noms de " +"[Node] ([code].[/code] [code]:[/code] [code]@[/code] [code]/[/code] et " +"[code]\"[/code])." #: doc/classes/String.xml msgid "" @@ -73274,6 +75069,8 @@ msgid "" "Returns the [CanvasItem] that handles its [constant CanvasItem." "NOTIFICATION_DRAW] or [method CanvasItem._draw] callback at this moment." msgstr "" +"Retourne le [CanvasItem] qui gère sa [constant CanvasItem.NOTIFICATION_DRAW] " +"ou sa méthode [method CanvasItem._draw] actuellement." #: doc/classes/StyleBox.xml msgid "Returns the default value of the specified [enum Margin]." @@ -73284,6 +75081,9 @@ msgid "" "Returns the content margin offset for the specified [enum Margin].\n" "Positive values reduce size inwards, unlike [Control]'s margin values." msgstr "" +"Retourne le décalage de la marge de contenu pour la [enum Margin] spécifié.\n" +"Les valeurs positives réduisent la taille vers l'intérieur, contrairement " +"aux valeurs des marges de [Control]." #: doc/classes/StyleBox.xml msgid "Returns the minimum size that this stylebox can be shrunk to." @@ -73297,6 +75097,9 @@ msgid "" "equivalent to [code]Vector2(style.get_margin(MARGIN_LEFT), style." "get_margin(MARGIN_TOP))[/code]." msgstr "" +"Retourne le \"décalage\" d'une boîte de style. Cette fonction d'aide " +"retourne une valeur équivalente à [code]Vector2(style." +"get_margin(MARGIN_LEFT), style.get_margin(MARGIN_TOP))[/code]." #: doc/classes/StyleBox.xml msgid "" @@ -73333,6 +75136,9 @@ msgid "" "reduces the space available to the contents from the left.\n" "Refer to [member content_margin_bottom] for extra considerations." msgstr "" +"La marge gauche pour le contenu de cette boîte de style. L'augmentation de " +"cette valeur réduit l'espace disponible pour le contenu sur la gauche.\n" +"Voir [membrer content_margin_bottom] pour des considérations supplémentaires." #: doc/classes/StyleBox.xml msgid "" @@ -73340,6 +75146,9 @@ msgid "" "reduces the space available to the contents from the right.\n" "Refer to [member content_margin_bottom] for extra considerations." msgstr "" +"La marge droite pour le contenu de cette boîte de style. L'augmentation de " +"cette valeur réduit l'espace disponible pour le contenu sur la droite.\n" +"Voir [membrer content_margin_bottom] pour des considérations supplémentaires." #: doc/classes/StyleBox.xml msgid "" @@ -73347,6 +75156,9 @@ msgid "" "reduces the space available to the contents from the top.\n" "Refer to [member content_margin_bottom] for extra considerations." msgstr "" +"La marge supérieure pour le contenu de cette boîte de style. Augmenter cette " +"valeur réduit l'espace disponible pour le contenu en haut.\n" +"Voir [membrer content_margin_bottom] pour des considérations supplémentaires." #: doc/classes/StyleBoxEmpty.xml msgid "Empty stylebox (does not display anything)." @@ -73680,6 +75492,8 @@ msgid "" "The shadow offset in pixels. Adjusts the position of the shadow relatively " "to the stylebox." msgstr "" +"Le décalage de l'ombre en pixels. Ajuste la position de l'ombre relativement " +"à la boîte de style." #: doc/classes/StyleBoxFlat.xml msgid "The shadow size in pixels." @@ -73709,6 +75523,8 @@ msgid "" "[StyleBox] that displays a single line of a given color and thickness. It " "can be used to draw things like separators." msgstr "" +"Une [StyleBox] qui affiche simplement une ligne de couleur et d'épaisseur " +"données. Ça peut être utilisé pour dessiner des séparateurs par exemple." #: doc/classes/StyleBoxLine.xml msgid "The line's color." @@ -73773,12 +75589,18 @@ msgid "" "Controls how the stylebox's texture will be stretched or tiled horizontally. " "See [enum AxisStretchMode] for possible values." msgstr "" +"Contrôle la façon dont la texture de la boîte de style sera étirée ou " +"répétée horizontalement. Voir [enum AxisStretchMode] pour les valeurs " +"possibles." #: doc/classes/StyleBoxTexture.xml msgid "" "Controls how the stylebox's texture will be stretched or tiled vertically. " "See [enum AxisStretchMode] for possible values." msgstr "" +"Contrôle la façon dont la texture de la boîte de style sera étirée ou " +"répétée verticalement. Voir [enum AxisStretchMode] pour les valeurs " +"possibles." #: doc/classes/StyleBoxTexture.xml msgid "" @@ -73790,18 +75612,24 @@ msgid "" "Expands the bottom margin of this style box when drawing, causing it to be " "drawn larger than requested." msgstr "" +"Augmente la marge du bas de cette boite de style lors de l'affichage, pour " +"qu'elle soit plus grande que demandé." #: doc/classes/StyleBoxTexture.xml msgid "" "Expands the left margin of this style box when drawing, causing it to be " "drawn larger than requested." msgstr "" +"Augmente la marge gauche de cette boite de style lors de l'affichage, pour " +"qu'elle soit plus grande que demandé." #: doc/classes/StyleBoxTexture.xml msgid "" "Expands the right margin of this style box when drawing, causing it to be " "drawn larger than requested." msgstr "" +"Augmente la marge droite de cette boite de style lors de l'affichage, pour " +"qu'elle soit plus grande que demandé." #: doc/classes/StyleBoxTexture.xml msgid "" @@ -73819,6 +75647,12 @@ msgid "" "This is also the value used as fallback for [member StyleBox." "content_margin_bottom] if it is negative." msgstr "" +"Augmente la marge inférieure de la boîte de texture en 3×3.\n" +"Une valeur plus élevée signifie qu'une plus grande partie de la texture " +"source est considérée comme faisant partie de la bordure inférieure de la " +"boîte en 3×3.\n" +"C'est aussi la valeur de repli utilisée pour [member StyleBox." +"content_margin_bottom] si elle est négative." #: doc/classes/StyleBoxTexture.xml msgid "" @@ -73828,6 +75662,12 @@ msgid "" "This is also the value used as fallback for [member StyleBox." "content_margin_left] if it is negative." msgstr "" +"Augmente la marge gauche de la boîte de texture en 3×3.\n" +"Une valeur plus élevée signifie qu'une plus grande partie de la texture " +"source est considérée comme faisant partie de la bordure gauche de la boîte " +"3×3.\n" +"C'est aussi la valeur de repli utilisée pour [member StyleBox." +"content_margin_left] si elle est négative." #: doc/classes/StyleBoxTexture.xml msgid "" @@ -73837,6 +75677,12 @@ msgid "" "This is also the value used as fallback for [member StyleBox." "content_margin_right] if it is negative." msgstr "" +"Augmente la marge droite de la boîte de texture en 3×3.\n" +"Une valeur plus élevée signifie qu'une plus grande partie de la texture " +"source est considérée comme faisant partie de la droite frontière de la " +"boîte 3×3.\n" +"C'est aussi la valeur de repli utilisée pour [member StyleBox." +"content_margin_right] si elle est négative." #: doc/classes/StyleBoxTexture.xml msgid "" @@ -73846,10 +75692,17 @@ msgid "" "This is also the value used as fallback for [member StyleBox." "content_margin_top] if it is negative." msgstr "" +"Augmente la marge supérieure de la boîte de texture en 3×3.\n" +"Une valeur plus élevée signifie qu'une plus grande partie de la texture " +"source est considérée comme faisant partie de la bordure supérieure de la " +"boîte 3×3.\n" +"C'est aussi la valeur de repli utilisée pour [member StyleBox." +"content_margin_top] si elle est négative." #: doc/classes/StyleBoxTexture.xml msgid "Modulates the color of the texture when this style box is drawn." msgstr "" +"Module la couleur de la texture lorsque cette boîte de style est dessinée." #: doc/classes/StyleBoxTexture.xml msgid "" @@ -73866,6 +75719,9 @@ msgid "" "This is equivalent to first wrapping the texture in an [AtlasTexture] with " "the same region." msgstr "" +"Spécifié la sous-région de la texture à utiliser.\n" +"C'est l'équivalent à d'abord mettre la texture dans un [AtlasTexture] avec " +"la même région." #: doc/classes/StyleBoxTexture.xml msgid "The texture to use when drawing this style box." @@ -73880,6 +75736,9 @@ msgid "" "Stretch the stylebox's texture. This results in visible distortion unless " "the texture size matches the stylebox's size perfectly." msgstr "" +"Étire la texture de la boîte de style. Cela entraîne une distorsion visible " +"à moins que la taille de la texture ne corresponde parfaitement à la taille " +"de la boîte de style." #: doc/classes/StyleBoxTexture.xml msgid "" @@ -74004,6 +75863,10 @@ msgid "" "current index (if also using index arrays) should use smooth normals for " "normal calculation." msgstr "" +"Spécifie si les sommets actuels (uniquement si seulement des tableaux de " +"sommets sont utilisés) ou l'index courant (si des tableaux d'index sont " +"également utilisés) devraient utiliser des normales lisses dans le calcul " +"des normales." #: doc/classes/SurfaceTool.xml msgid "" @@ -74080,6 +75943,8 @@ msgid "" "Called before adding any vertices. Takes the primitive type as an argument " "(e.g. [constant Mesh.PRIMITIVE_TRIANGLES])." msgstr "" +"Appelé avant d'ajouter des sommets. Cela prend le type primitif comme " +"argument (par exemple [constant Mesh. PRIMITIVE_TRIANGES])." #: doc/classes/SurfaceTool.xml msgid "Clear all information passed into the surface tool so far." @@ -74214,6 +76079,9 @@ msgid "" "Returns [code]-1[/code] if the point is outside the control boundaries or if " "there's no tab at the queried position." msgstr "" +"Retourne l'index de l'onglet aux coordonnées [code]point[/code] locales. " +"Retourne [code]-1[/code] si le point est en dehors des limites du contrôle " +"ou s'il n'y a pas d'onglet à la position demandée." #: doc/classes/TabContainer.xml msgid "" @@ -74221,16 +76089,22 @@ msgid "" "default to the name of the indexed child node, but this can be overridden " "with [method set_tab_title]." msgstr "" +"Retourne le titre de l'onglet à l'index [code]tab_idx[/code]. Le titres des " +"onglets sont par défaut le nom des nÅ“uds enfants indexés, mais ça peut être " +"changé avec [method set_tab_title]." #: doc/classes/TabContainer.xml msgid "Returns the [TabContainer] rearrange group id." -msgstr "" +msgstr "Retourne l'identifiant du groupe de réarrangement du [TabContainer]." #: doc/classes/TabContainer.xml msgid "" "If set on a [Popup] node instance, a popup menu icon appears in the top-" "right corner of the [TabContainer]. Clicking it will expand the [Popup] node." msgstr "" +"Si défini sur une instance de nÅ“ud [Popup], une icône de menu apparaît dans " +"le coin supérieur droit du [TabContainer]. En cliquant dessus, le nÅ“ud " +"[Popup] sera développé." #: doc/classes/TabContainer.xml doc/classes/Tabs.xml msgid "" @@ -74257,6 +76131,8 @@ msgid "" "Sets a title for the tab at index [code]tab_idx[/code]. Tab titles default " "to the name of the indexed child node." msgstr "" +"Définit un titre pour l'onglet à l'index [code]tab_idx[/code]. Les titres " +"par défaut des onglets sont le nom des nÅ“ud indexés." #: doc/classes/TabContainer.xml msgid "" @@ -74264,12 +76140,18 @@ msgid "" "enable tab drag between [TabContainer]. Enable drag with [member " "drag_to_rearrange_enabled]." msgstr "" +"Définit l'identifiant de groupe de réarrangement, choisissez pour chaque " +"[TabContainer] la même valeur pour activer le déposé-glissé entre les " +"[TabContainer]. Activer le déposé-glissé avec [member " +"drag_to_rearrange_enabled]." #: doc/classes/TabContainer.xml msgid "" "If [code]true[/code], all tabs are drawn in front of the panel. If " "[code]false[/code], inactive tabs are drawn behind the panel." msgstr "" +"Si [code]true[/code], tous les onglets sont dessinés devant le panneau. Si " +"[code]false[/code], les onglets inactifs sont dessinés derrière le panneau." #: doc/classes/TabContainer.xml msgid "" @@ -74277,6 +76159,9 @@ msgid "" "[code]visible[/code] property is set to [code]true[/code] and all others are " "set to [code]false[/code]." msgstr "" +"L'index actuel de l'onglet. Quand définie, cette propriété [code]visible[/" +"code] du nÅ“ud [Control] pour cet index sera mis à [code]true[/code] et " +"toutes les autres seront à [code]false[/code]." #: doc/classes/TabContainer.xml doc/classes/Tabs.xml msgid "If [code]true[/code], tabs can be rearranged with mouse drag." @@ -74306,6 +76191,9 @@ msgid "" "minimum size take into account in the total, instead of only the currently " "visible one." msgstr "" +"Si [code]true[/code], les nÅ“uds [Control] enfants qui sont cachés auront " +"leur taille minimale qui sera prise en compte dans le total, au lieu de " +"seulement celle actuellement visible." #: doc/classes/TabContainer.xml msgid "" @@ -74365,6 +76253,10 @@ msgid "" "fit in the container width. When the button is disabled (i.e. the first tab " "is visible), it appears semi-transparent." msgstr "" +"L'icône pour le bouton flèche de gauche qui apparaît quand il y a trop " +"d'onglets à afficher dans le conteneur. Lorsque le bouton est désactivé " +"(c'est-à -dire le premier onglet est visible), il apparaît en semi-" +"transparent." #: doc/classes/TabContainer.xml doc/classes/Tabs.xml msgid "" @@ -74372,6 +76264,9 @@ msgid "" "fit in the container width. Used when the button is being hovered with the " "cursor." msgstr "" +"L'icône pour le bouton flèche de gauche qui apparaît quand il y a trop " +"d'onglets à afficher dans le conteneur. Utilisé quand le bouton est survolé " +"par le curseur." #: doc/classes/TabContainer.xml doc/classes/Tabs.xml msgid "" @@ -74379,6 +76274,10 @@ msgid "" "fit in the container width. When the button is disabled (i.e. the last tab " "is visible) it appears semi-transparent." msgstr "" +"L'icône pour le bouton flèche de droite qui apparaît quand il y a trop " +"d'onglets à afficher dans le conteneur. Lorsque le bouton est désactivé " +"(c'est-à -dire le dernier onglet est visible), il apparaît en semi-" +"transparent." #: doc/classes/TabContainer.xml doc/classes/Tabs.xml msgid "" @@ -74386,6 +76285,9 @@ msgid "" "fit in the container width. Used when the button is being hovered with the " "cursor." msgstr "" +"L'icône pour le bouton flèche de droite qui apparaît quand il y a trop " +"d'onglets à afficher dans le conteneur. Utilisé quand le bouton est survolé " +"par le curseur." #: doc/classes/TabContainer.xml msgid "The icon for the menu button (see [method set_popup])." @@ -74434,13 +76336,16 @@ msgstr "Ajoute un nouvel onglet." #: doc/classes/Tabs.xml msgid "Moves the scroll view to make the tab visible." -msgstr "" +msgstr "Déplace la vue de défilement pour rendre l'onglet visible." #: doc/classes/Tabs.xml msgid "" "Returns [code]true[/code] if the offset buttons (the ones that appear when " "there's not enough space for all tabs) are visible." msgstr "" +"Retourne [code]true[/code] si les boutons de décalage (les boutons qui " +"apparaissent lorsqu'il n'y a pas assez d'espace pour tous les onglets) sont " +"visibles." #: doc/classes/Tabs.xml msgid "Returns [code]true[/code] if select with right mouse button is enabled." @@ -74448,8 +76353,13 @@ msgstr "" "Retourne [code]true[/code] si la sélection avec le clic-droit est actif." #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Retourne le titre de l'onglet à la position [code]idx[/code]." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." -msgstr "" +msgstr "Retourne le nombre d'onglets cachés décalés vers la gauche." #: doc/classes/Tabs.xml msgid "Returns tab [Rect2] with local position and size." @@ -74461,7 +76371,7 @@ msgstr "Retourne le titre de l'onglet à la position [code]idx[/code]." #: doc/classes/Tabs.xml msgid "Returns the [Tabs]' rearrange group ID." -msgstr "" +msgstr "Retourne l'identifiant de groupe du [Tab]." #: doc/classes/Tabs.xml msgid "Moves a tab from [code]from[/code] to [code]to[/code]." @@ -74479,6 +76389,11 @@ msgstr "" "le clic droit." #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Définit une icône pour l'onglet à la position [code]tab_idx[/code]." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" "Définit une [code]icon[/code] pour l'onglet à la position [code]tab_idx[/" @@ -74506,6 +76421,8 @@ msgid "" "if [code]true[/code], the mouse's scroll wheel can be used to navigate the " "scroll view." msgstr "" +"si [code]true[/code], la roue de défilement de la souris permet de naviguer " +"dans la vue de défilement." #: doc/classes/Tabs.xml msgid "The alignment of all tabs. See [enum TabAlign] for details." @@ -74517,6 +76434,8 @@ msgid "" "Sets when the close button will appear on the tabs. See [enum " "CloseButtonDisplayPolicy] for details." msgstr "" +"Définit lorsque le bouton de fermeture apparaîtra sur les onglets. Voir " +"[enum CloseButtonDisplayPolicy] pour plus de détails." #: doc/classes/Tabs.xml msgid "" @@ -74527,8 +76446,12 @@ msgstr "" "drag_to_rearrange_enabled]." #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." -msgstr "Émis quand un onglet a été cliqué-droit." +#, fuzzy +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." +msgstr "" +"Émis lorsqu'un bouton personnalisé est pressé. Voir [method add_button]." #: doc/classes/Tabs.xml msgid "Emitted when a tab is clicked, even if it is the current tab." @@ -74597,6 +76520,8 @@ msgid "" "A TCP server. Listens to connections on a port and returns a [StreamPeerTCP] " "when it gets an incoming connection." msgstr "" +"Un serveur TCP. Ecoute les connexions sur un port et retourne un " +"[StreamPeerTCP] quand il obtient une connexion entrante." #: doc/classes/TCP_Server.xml msgid "Returns [code]true[/code] if a connection is available for taking." @@ -74654,6 +76579,7 @@ msgstr "" #: doc/classes/TextEdit.xml msgid "Adds color region (given the delimiters) and its colors." msgstr "" +"Ajoute une région de couleur (à partir des délimiteurs) et ses couleurs." #: doc/classes/TextEdit.xml msgid "Adds a [code]keyword[/code] and its [Color]." @@ -74664,18 +76590,25 @@ msgid "" "Returns if the given line is foldable, that is, it has indented lines right " "below it." msgstr "" +"Retourne si la ligne donnée peut être réduite, c'est-à -dire qu'elle indente " +"les lignes juste en dessous." #: doc/classes/TextEdit.xml msgid "" "Centers the viewport on the line the editing cursor is at. This also resets " "the [member scroll_horizontal] value to [code]0[/code]." msgstr "" +"Centre le fenêtre d'affichage sur la ligne où est le curseur d'édition. Cela " +"réinitialise également la valeur [member scroll_horizontal] à [code]0[/code]." #: doc/classes/TextEdit.xml msgid "" "Clears all custom syntax coloring information previously added with [method " "add_color_region] or [method add_keyword_color]." msgstr "" +"Efface toutes les informations de coloration de syntaxe personnalisées " +"précédemment ajoutées avec [method add_color_region] ou [method " +"add_keyword_color]." #: doc/classes/TextEdit.xml msgid "Clears the undo history." @@ -74699,6 +76632,9 @@ msgid "" "If [code]adjust_viewport[/code] is set to [code]true[/code], the viewport " "will center at the cursor position after the move occurs." msgstr "" +"Déplace le curseur à l'index [code]column[/code] spécifié.\n" +"Si [code]adjust_viewport[/code] est défini à [code]true[/code], le fenêtre " +"d'affichage se centrera à la position du curseur après le mouvement." #: doc/classes/TextEdit.xml msgid "" @@ -74720,10 +76656,11 @@ msgstr "Désélectionne la sélection actuelle." #: doc/classes/TextEdit.xml msgid "Folds all lines that are possible to be folded (see [method can_fold])." msgstr "" +"Réduit toutes les lignes qui peuvent être réduites (voir [method can_fold])." #: doc/classes/TextEdit.xml msgid "Folds the given line, if possible (see [method can_fold])." -msgstr "" +msgstr "Réduit la ligne donnée, si possible (voir [method can_fold])." #: doc/classes/TextEdit.xml msgid "Returns an array containing the line number of each breakpoint." @@ -74742,6 +76679,8 @@ msgid "" "Returns the line and column at the given position. In the returned vector, " "[code]x[/code] is the column, [code]y[/code] is the line." msgstr "" +"Retourne la ligne et la colonne à la position donnée. Dans le vecteur " +"retourné, [code]x[/code] est la colonne, [code]y[/code] est la ligne." #: doc/classes/TextEdit.xml msgid "Returns the amount of total lines in the text." @@ -74749,7 +76688,7 @@ msgstr "Retourne le nombre total de lignes dans le texte." #: doc/classes/TextEdit.xml msgid "Returns the height of a largest line." -msgstr "" +msgstr "Retourne la hauteur de la plus grande ligne." #: doc/classes/TextEdit.xml msgid "" @@ -74815,7 +76754,7 @@ msgstr "" #: doc/classes/TextEdit.xml msgid "Returns the total amount of lines that could be drawn." -msgstr "" +msgstr "Retourne le nombre total des lignes qui pourraient être affichées." #: doc/classes/TextEdit.xml msgid "Returns the number of visible lines, including wrapped text." @@ -74848,11 +76787,11 @@ msgstr "Insérer le texte spécifié à la position du curseur." #: doc/classes/TextEdit.xml msgid "Returns whether the line at the specified index is folded or not." -msgstr "" +msgstr "Retourne si la ligne à l'index spécifié est réduite ou non." #: doc/classes/TextEdit.xml msgid "Returns whether the line at the specified index is hidden or not." -msgstr "" +msgstr "Retourne si la ligne de l'index spécifié est cachée ou non." #: doc/classes/TextEdit.xml msgid "" @@ -74866,12 +76805,16 @@ msgid "" "Returns [code]true[/code] when the specified [code]line[/code] has a " "breakpoint." msgstr "" +"Retourne [code]true[/code] lorsque la ligne [code]line[/code] spécifié a un " +"point d'arrêt." #: doc/classes/TextEdit.xml msgid "" "Returns [code]true[/code] when the specified [code]line[/code] is marked as " "safe." msgstr "" +"Retourne [code]true[/code] lorsque la ligne [code]line[/code] spécifié est " +"marquée comme sûre." #: doc/classes/TextEdit.xml msgid "Returns if the given line is wrapped." @@ -74882,6 +76825,9 @@ msgid "" "Returns whether the mouse is over selection. If [code]edges[/code] is " "[code]true[/code], the edges are considered part of the selection." msgstr "" +"Retourne si la souris est sur la sélection. Si [code]edges[/code] est " +"[code]true[/code], les bords sont considérés comme faisant partie de la " +"sélection." #: doc/classes/TextEdit.xml msgid "Returns [code]true[/code] if the selection is active." @@ -74908,6 +76854,8 @@ msgid "" "Removes all the breakpoints. This will not fire the [signal " "breakpoint_toggled] signal." msgstr "" +"Retire tous les points d'arrêt. Cela n'émettra pas [signal " +"breakpoint_toggled]." #: doc/classes/TextEdit.xml msgid "" @@ -74942,6 +76890,9 @@ msgid "" "Perform selection, from line/column to line/column.\n" "If [member selecting_enabled] is [code]false[/code], no selection will occur." msgstr "" +"Effectue une sélection, de la ligne/colonne à la ligne/colonne.\n" +"Si [member selection_enabled] est [code]false[/code], aucune sélection ne " +"sera effectuée." #: doc/classes/TextEdit.xml msgid "" @@ -74962,9 +76913,9 @@ msgid "" "code]. Deletes the bookmark if [code]bookmark[/code] is [code]false[/code].\n" "Bookmarks are shown in the [member breakpoint_gutter]." msgstr "" -"Ajoute un marque-page pour la ligne [code]line[/code] si " -"[code]bookmark[/code] est [code]true[/code]. Supprime le marque-page si " -"[code]bookmark[/code] est [code]false[/code].\n" +"Ajoute un marque-page pour la ligne [code]line[/code] si [code]bookmark[/" +"code] est [code]true[/code]. Supprime le marque-page si [code]bookmark[/" +"code] est [code]false[/code].\n" "Les marque-pages sont affichés dans [member breakpoint_gutter]." #: doc/classes/TextEdit.xml @@ -74972,6 +76923,8 @@ msgid "" "Adds or removes the breakpoint in [code]line[/code]. Breakpoints are shown " "in the [member breakpoint_gutter]." msgstr "" +"Ajoute ou supprime le point d'arrêt à [code]line[/code]. Les points d'arrêt " +"sont indiqués dans le [member breakpoint_gutter]." #: doc/classes/TextEdit.xml msgid "If [code]true[/code], hides the line of the specified index." @@ -74983,10 +76936,13 @@ msgid "" "This will show the line number with the color provided in the " "[code]safe_line_number_color[/code] theme property." msgstr "" +"Si [code]true[/code], marque la [code]line[/code] comme sûre.\n" +"Cela montrera le numéro de ligne avec la couleur fournie dans la propriété " +"[code]safe_line_number_color[/code] du thème." #: doc/classes/TextEdit.xml msgid "Toggle the folding of the code block at the given line." -msgstr "" +msgstr "Réduit le bloc de code à la ligne donnée." #: doc/classes/TextEdit.xml msgid "Perform undo operation." @@ -75001,6 +76957,8 @@ msgid "" "Unhide all lines that were previously set to hidden by [method " "set_line_as_hidden]." msgstr "" +"Ré-affiche toutes les lignes qui étaient précédemment cachées par [method " +"set_line_as_hidden]." #: doc/classes/TextEdit.xml msgid "If [code]true[/code], the bookmark gutter is visible." @@ -75024,6 +76982,10 @@ msgid "" "before displaying the context menu.\n" "If [code]false[/code], the context menu disregards mouse location." msgstr "" +"Si [code]true[/code], un clic droit déplace le curseur à la position de la " +"souris avant d'afficher le menu contextuel.\n" +"Si [code]false[/code], la position du menu contextuel ignore l'emplacement " +"de la souris." #: doc/classes/TextEdit.xml msgid "If [code]true[/code], a right-click displays the context menu." @@ -75031,7 +76993,7 @@ msgstr "Si [code]true[/code], un clic droit affiche le menu contextuel." #: doc/classes/TextEdit.xml msgid "If [code]true[/code], allow drag and drop of selected text." -msgstr "" +msgstr "Si [code]true[/code], permet le déposé-glissé du texte sélectionné." #: doc/classes/TextEdit.xml msgid "" @@ -75056,6 +77018,8 @@ msgid "" "If [code]true[/code], all lines that have been set to hidden by [method " "set_line_as_hidden], will not be visible." msgstr "" +"Si [code]true[/code], toutes les lignes qui ont été cachées par [method " +"set_line_as_hidden] ne seront pas visibles." #: doc/classes/TextEdit.xml msgid "" @@ -75103,12 +77067,17 @@ msgid "" "If there is a horizontal scrollbar, this determines the current horizontal " "scroll value in pixels." msgstr "" +"S'il y a une barre de défilement horizontale, cela détermine le décalage de " +"défilement horizontal actuel en pixels." #: doc/classes/TextEdit.xml msgid "" "If there is a vertical scrollbar, this determines the current vertical " "scroll value in line numbers, starting at 0 for the top line." msgstr "" +"S'il y a une barre de défilement verticale, cela détermine le décalage de " +"défilement vertical actuel en nombres de lignes, en commençant par 0 pour la " +"ligne du haut." #: doc/classes/TextEdit.xml msgid "" @@ -75116,29 +77085,39 @@ msgid "" "If [code]false[/code], text can not be selected by the user or by the " "[method select] or [method select_all] methods." msgstr "" +"Si [code]true[/code], le texte peut être sélectionné.\n" +"Si [code]false[/code], le texte ne peut pas être sélectionné par " +"l'utilisateur ou par les méthodes [method select] ou [method select_all]." #: doc/classes/TextEdit.xml msgid "" "If [code]true[/code], shortcut keys for context menu items are enabled, even " "if the context menu is disabled." msgstr "" +"Si [code]true[/code], les touches de raccourcies pour les éléments de menu " +"contextuel sont activées, même si le menu contextuel est désactivé." #: doc/classes/TextEdit.xml msgid "" "If [code]true[/code], line numbers are displayed to the left of the text." msgstr "" +"Si [code]true[/code], les numéros de ligne sont affichés à gauche du texte." #: doc/classes/TextEdit.xml msgid "" "If [code]true[/code], sets the [code]step[/code] of the scrollbars to " "[code]0.25[/code] which results in smoother scrolling." msgstr "" +"Si [code]true[/code], définit le [code]step[/code] des barres de défilement " +"à [code]0.25[/code] qui permet de défiler plus facilement." #: doc/classes/TextEdit.xml msgid "" "If [code]true[/code], any custom color properties that have been set for " "this [TextEdit] will be visible." msgstr "" +"Si [code]true[/code], toutes les propriétés de couleur personnalisées qui " +"ont été définies pour ce [TextEdit] seront visibles." #: doc/classes/TextEdit.xml msgid "String value of the [TextEdit]." @@ -75153,6 +77132,8 @@ msgid "" "If [code]true[/code], enables text wrapping when it goes beyond the edge of " "what is visible." msgstr "" +"Si [code]true[/code], permet le retour à la ligne quand le texte dépasse ce " +"qui est visible." #: doc/classes/TextEdit.xml msgid "Emitted when a breakpoint is placed via the breakpoint gutter." @@ -75228,6 +77209,8 @@ msgid "" "Sets the [Color] of the breakpoints. [member breakpoint_gutter] has to be " "enabled." msgstr "" +"Définit la [Color] des points d'arrêt. [member breakpoint_gutter] doit être " +"activé." #: doc/classes/TextEdit.xml msgid "Sets the font [Color]." @@ -75353,18 +77336,28 @@ msgid "" "canvas_item_add_texture_rect] with a rect at [code]position[/code] and the " "size of this [Texture]." msgstr "" +"Dessine la texture en utilisant un [CanvasItem] avec l'API du [VisualServer] " +"à la [code]position[/code] spécifiée. Équivalent à [method VisualServer." +"canvas_item_add_texture_rect] avec un rectangle à [code]position[/code] et " +"la taille de cette [Texture]." #: doc/classes/Texture.xml msgid "" "Draws the texture using a [CanvasItem] with the [VisualServer] API. " "Equivalent to [method VisualServer.canvas_item_add_texture_rect]." msgstr "" +"Dessine la texture en utilisant un [CanvasItem] avec l'API du " +"[VisualServer]. Équivalent à [method VisualServer." +"canvas_item_add_texture_rect]." #: doc/classes/Texture.xml msgid "" "Draws a part of the texture using a [CanvasItem] with the [VisualServer] " "API. Equivalent to [method VisualServer.canvas_item_add_texture_rect_region]." msgstr "" +"Dessine une partie de la texture en utilisant un [CanvasItem] avec l'API du " +"[VisualServer]. Équivalent à [method VisualServer." +"canvas_item_add_texture_rect_region]." #: doc/classes/Texture.xml msgid "" @@ -75389,12 +77382,16 @@ msgstr "Renvoie la largeur de texture." #: doc/classes/Texture.xml msgid "Returns [code]true[/code] if this [Texture] has an alpha channel." msgstr "" +"Retourne [code]true[/code] si cette [Texture] a une transparence (canal " +"alpha)." #: doc/classes/Texture.xml msgid "" "The texture's [enum Flags]. [enum Flags] are used to set various properties " "of the [Texture]." msgstr "" +"Les [enum Flags] de la texture. [enum Flags] sont utilisés pour définir " +"différentes propriétés de la [Texture]." #: doc/classes/Texture.xml msgid "" @@ -75418,10 +77415,14 @@ msgid "" "[b]Note:[/b] Ignored when using an [AtlasTexture] as these don't support " "repetition." msgstr "" +"Répète la texture (au lieu de la limiter aux bords).\n" +"[b]Note :[/b] Ignoré avec les [AtlasTexture] puisqu'ils ne supportent pas la " +"répétition." #: doc/classes/Texture.xml doc/classes/VisualServer.xml msgid "Uses a magnifying filter, to enable smooth zooming in of the texture." msgstr "" +"Utilise un filtre grossissant, pour permettre un zoom lisse sur la texture." #: doc/classes/Texture.xml doc/classes/TextureLayered.xml #: doc/classes/VisualServer.xml @@ -75430,6 +77431,10 @@ msgid "" "texture with different aspect ratios.\n" "This results in better-looking textures when viewed from oblique angles." msgstr "" +"Utilise le filtrage de mipmap anisotrope. Génère des versions plus petites " +"de la même texture avec différents ratios d'aspect.\n" +"Cela donne des textures plus jolies lorsqu'elles sont vues à partir d'angles " +"obliques." #: doc/classes/Texture.xml doc/classes/VisualServer.xml msgid "Converts the texture to the sRGB color space." @@ -75441,6 +77446,9 @@ msgid "" "[b]Note:[/b] Ignored when using an [AtlasTexture] as these don't support " "repetition." msgstr "" +"Répète la texture avec en alternant des sections en miroir.\n" +"[b]Note :[/b] Ignoré avec les [AtlasTexture] puisqu'ils ne supportent pas la " +"répétition." #: doc/classes/Texture.xml doc/classes/VisualServer.xml msgid "Texture is a video surface." @@ -75448,7 +77456,7 @@ msgstr "La texture est une surface vidéo." #: doc/classes/Texture3D.xml msgid "Texture with 3 dimensions." -msgstr "" +msgstr "Une texture à 3 dimensions." #: doc/classes/Texture3D.xml msgid "" @@ -75641,6 +77649,8 @@ msgid "" "Texture to display by default, when the node is [b]not[/b] in the disabled, " "focused, hover or pressed state." msgstr "" +"La texture à afficher par défault, quand le nÅ“ud n'est [b]pas[/b] dans " +"l'état désactivé, avec focus, survolé or pressé." #: doc/classes/TextureButton.xml msgid "" @@ -75648,6 +77658,9 @@ msgid "" "focus and the player presses the Enter key or if the player presses the " "[member BaseButton.shortcut] key." msgstr "" +"La texture à afficher quand la souris appuie sur le nÅ“ud, si quand le nÅ“ud a " +"le focus du clavier et que l'utilisateur appuie sur la touche Entrée, ou " +"quand l'utilisateur appuie sur la touche [member BaseButton.shortcut]." #: doc/classes/TextureButton.xml doc/classes/TextureRect.xml msgid "Scale to fit the node's bounding rectangle." @@ -76032,39 +78045,57 @@ msgid "Clears all values on the theme." msgstr "Efface toutes les valeurs de ce thème." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Retourne le [code]enter_cost[/code] de cette [code]region[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" +"La constante mathématique [code]e[/code], la base du logarithme népérien : " +"[code]2.718282[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" +"Crée un BitmapFont depuis le fichier [code]*.fnt[/code] à l'emplacement " +"[code]path[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." msgstr "" +"Définit le périphérique à l'index [code]index[/code] dans la liste des " +"périphériques découverts à [code]device[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" +"Définit un [code]title[/code] pour l'onglet à la position [code]tab_idx[/" +"code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" +"Retourne [code]true[/code] si la [Font] nommée [code]name[/code] est dans " +"[code]node_type[/code].\n" +"Retourne [code]false[/code] si le thème n'a pas de [code]node_type[/code]." #: doc/classes/Theme.xml msgid "" @@ -76081,15 +78112,17 @@ msgid "Sets the theme's values to a copy of a given theme." msgstr "Définit les valeurs du thème à partir d'une copie d'un thème donné." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Retourne le [code]enter_cost[/code] de cette [code]region[/code]." #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -76099,15 +78132,16 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Retourne le [code]enter_cost[/code] de cette [code]region[/code]." #: doc/classes/Theme.xml msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" @@ -76119,16 +78153,21 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" +"Retourne l'entrée de métadonnées de l'objet [code]name[/code] spécifié.\n" +"Affiche une erreur si l'entrée n'existe pas, sauf si [code]default[/code] " +"n'est pas [code]null[/code] (dans quel cas la valeur par défaut sera " +"retournée)." #: doc/classes/Theme.xml msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -76138,15 +78177,18 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." +"[code]theme_type[/code]." msgstr "" +"Retourne le nom de la propriété à [code]prop_idx[/code] pour le nÅ“ud à " +"[code]idx[/code]." #: doc/classes/Theme.xml msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -76158,17 +78200,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -76181,9 +78225,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -76191,8 +78235,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -76207,7 +78251,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -76223,21 +78267,28 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" "Retourne [code]true[/code] si la [Color] nommée [code]name[/code] est dans " "[code]node_type[/code].\n" "Retourne [code]false[/code] si le thème n'a pas de [code]node_type[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" +"Retourne [code]true[/code] si la [Font] nommée [code]name[/code] est dans " +"[code]node_type[/code].\n" +"Retourne [code]false[/code] si le thème n'a pas de [code]node_type[/code]." #: doc/classes/Theme.xml msgid "" @@ -76246,35 +78297,52 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" "Retourne [code]true[/code] si la [Font] nommée [code]name[/code] est dans " "[code]node_type[/code].\n" "Retourne [code]false[/code] si le thème n'a pas de [code]node_type[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" +"Retourne [code]true[/code] si la [Font] nommée [code]name[/code] est dans " +"[code]node_type[/code].\n" +"Retourne [code]false[/code] si le thème n'a pas de [code]node_type[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" +"Retourne [code]true[/code] si la [Color] nommée [code]name[/code] est dans " +"[code]node_type[/code].\n" +"Retourne [code]false[/code] si le thème n'a pas de [code]node_type[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" +"Retourne [code]true[/code] si la [Font] nommée [code]name[/code] est dans " +"[code]node_type[/code].\n" +"Retourne [code]false[/code] si le thème n'a pas de [code]node_type[/code]." #: doc/classes/Theme.xml msgid "" @@ -76301,88 +78369,112 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"Retourne [code]true[/code] si la [Color] nommée [code]name[/code] est dans " +"[code]node_type[/code].\n" +"Retourne [code]false[/code] si le thème n'a pas de [code]node_type[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"Retourne [code]true[/code] si la [Font] nommée [code]name[/code] est dans " +"[code]node_type[/code].\n" +"Retourne [code]false[/code] si le thème n'a pas de [code]node_type[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"Retourne [code]true[/code] si la [Font] nommée [code]name[/code] est dans " +"[code]node_type[/code].\n" +"Retourne [code]false[/code] si le thème n'a pas de [code]node_type[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"Retourne [code]true[/code] si la [Font] nommée [code]name[/code] est dans " +"[code]node_type[/code].\n" +"Retourne [code]false[/code] si le thème n'a pas de [code]node_type[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"Retourne [code]true[/code] si la [Font] nommée [code]name[/code] est dans " +"[code]node_type[/code].\n" +"Retourne [code]false[/code] si le thème n'a pas de [code]node_type[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"Retourne [code]true[/code] si la [Color] nommée [code]name[/code] est dans " +"[code]node_type[/code].\n" +"Retourne [code]false[/code] si le thème n'a pas de [code]node_type[/code]." #: doc/classes/Theme.xml msgid "" @@ -76699,7 +78791,6 @@ msgid "If [code]true[/code], this TileMap bakes a navigation region." msgstr "" #: doc/classes/TileMap.xml -#, fuzzy msgid "If [code]true[/code], the cell's UVs will be clipped." msgstr "Si [code]true[/code], les UV de la cellule seront limités." @@ -78183,7 +80274,6 @@ msgid "Control to show a tree of items." msgstr "Un contrôle pour afficher l'arborescence d'éléments." #: doc/classes/Tree.xml -#, fuzzy msgid "" "This shows a tree of items that can be selected, expanded and collapsed. The " "tree can have multiple columns with custom controls like text editing, " @@ -79099,6 +81189,9 @@ msgid "" "using [method get_metadata]. This can be used, for example, to store a " "reference to the original data." msgstr "" +"Définit la valeur des métadonnées pour la colonne donnée, qui peut être " +"récupérée ultérieurement en utilisant [method get_metadata]. Cela peut être " +"utilisé, par exemple, pour stocker une référence aux données d'origine." #: doc/classes/TreeItem.xml msgid "Sets the value of a [constant CELL_MODE_RANGE] column." @@ -79111,6 +81204,10 @@ msgid "" "If [code]expr[/code] is [code]true[/code], the edit mode slider will use an " "exponential scale as with [member Range.exp_edit]." msgstr "" +"Définit la gamme de valeurs acceptées pour une colonne. La colonne doit être " +"dans le mode [constant CELL_MODE_RANGE].\n" +"Si [code]expr[/code] est [code]true[/code], le glisseur d'édition utilisera " +"une échelle exponentielle comme avec [member Range.exp_edit]." #: doc/classes/TreeItem.xml msgid "If [code]true[/code], the given column is selectable." @@ -79121,6 +81218,8 @@ msgid "" "Sets a string to be shown after a column's value (for example, a unit " "abbreviation)." msgstr "" +"Définit un texte à afficher après la valeur d'une colonne (par exemple, une " +"abréviation d'unité)." #: doc/classes/TreeItem.xml msgid "Sets the given column's text value." @@ -79131,6 +81230,8 @@ msgid "" "Sets the given column's text alignment. See [enum TextAlign] for possible " "values." msgstr "" +"Définit l'alignement du texte de la colonne donnée. Voir [enum TextAlign] " +"pour les valeurs possibles." #: doc/classes/TreeItem.xml msgid "Sets the given column's tooltip text." @@ -79240,6 +81341,15 @@ msgid "" "direction of the interpolation. See the class description for more " "information." msgstr "" +"Suit la méthode [code]method[/code] de [code]object[/code] et applique la " +"valeur retournée sur la méthode [code]target_method[/code] de [code]target[/" +"code], en partant de [code]initial_val[/code] pendant [code]duration[/code] " +"secondes, après [code]delay[/code] secondes. Les méthodes sont appelées avec " +"des valeurs consécutives.\n" +"Utilisez [enum TransitionType] pour le paramètres [code]trans_type[/code] et " +"[enum EaseType] pour [code]ease_type[/code]. Ces valeurs contrôlent le " +"comportement et la direction de l'interpolation. Voir la description de la " +"classe pour plus d'informations." #: doc/classes/Tween.xml msgid "" @@ -79252,6 +81362,14 @@ msgid "" "direction of the interpolation. See the class description for more " "information." msgstr "" +"Suit la propriété [code]property[/code] de [code]object[/code] et applique " +"la valeur retournée sur la propriété [code]target_property[/code] de " +"[code]target[/code], en partant de [code]initial_val[/code] pendant " +"[code]duration[/code] secondes, après [code]delay[/code] secondes.\n" +"Utilisez [enum TransitionType] pour le paramètres [code]trans_type[/code] et " +"[enum EaseType] pour [code]ease_type[/code]. Ces valeurs contrôlent le " +"comportement et la direction de l'interpolation. Voir la description de la " +"classe pour plus d'informations." #: doc/classes/Tween.xml msgid "" @@ -79259,6 +81377,10 @@ msgid "" "one lasting 10 seconds and the other 20 seconds, it would return 20 seconds, " "as by that time all tweens would have finished." msgstr "" +"Retourne le temps total nécessaire pour que tous les tweens finissent. Si " +"vous avez deux tweens, un de 10 secondes et les 20 autres secondes, il sera " +"retourné 20 secondes, car c'est la durée nécessaire pour que tous les tweens " +"se terminent." #: doc/classes/Tween.xml msgid "" @@ -79277,6 +81399,10 @@ msgid "" "[code]arg1[/code]-[code]arg5[/code] are arguments to be passed to the " "callback." msgstr "" +"Appelle la méthode [code]callback[/code] de [code]object[/code] après " +"[code]duration[/code] sur le fil d'exécution principal (similaire à [method " +"Object.call_deferred]). [code]arg1[/code]-[code]arg5[/code] sont les " +"arguments à passer lors de l'appel." #: doc/classes/Tween.xml msgid "" @@ -79289,6 +81415,14 @@ msgid "" "direction of the interpolation. See the class description for more " "information." msgstr "" +"Anime la méthode [code]method[/code] de [code]object[/code] de " +"[code]initial_val[/code] jusqu'à [code]final_val[/code] pendant " +"[code]duration[/code] secondes, après [code]delay[/code] secondes. Les " +"méthodes sont appelées avec des valeurs consécutives.\n" +"Utilisez [enum TransitionType] pour le paramètres [code]trans_type[/code] et " +"[enum EaseType] pour [code]ease_type[/code]. Ces valeurs contrôlent le " +"comportement et la direction de l'interpolation. Voir la description de la " +"classe pour plus d'informations." #: doc/classes/Tween.xml msgid "" @@ -79301,12 +81435,23 @@ msgid "" "direction of the interpolation. See the class description for more " "information." msgstr "" +"Anime la propriété [code]property[/code] de [code]object[/code] de " +"[code]initial_val[/code] jusqu'à [code]final_val[/code] pendant " +"[code]duration[/code] secondes, après [code]delay[/code] secondes. Définir " +"la valeur initiale à [code]null[/code] utilise l'actuelle valeur de la " +"propriété.\n" +"Utilisez [enum TransitionType] pour le paramètres [code]trans_type[/code] et " +"[enum EaseType] pour [code]ease_type[/code]. Ces valeurs contrôlent le " +"comportement et la direction de l'interpolation. Voir la description de la " +"classe pour plus d'informations." #: doc/classes/Tween.xml msgid "" "Returns [code]true[/code] if any tweens are currently running.\n" "[b]Note:[/b] This method doesn't consider tweens that have ended." msgstr "" +"Retourne [code]true[/code] si des tweens sont en cours d'exécution.\n" +"[b]Note :[/b] Cette méthode ne tient pas compte des tweens qui sont terminés." #: doc/classes/Tween.xml msgid "" @@ -79314,6 +81459,9 @@ msgid "" "pair. By default, all tweens are removed, unless [code]key[/code] is " "specified." msgstr "" +"Arrête l'animation et supprime un tween, compte tenu de son objet et de ses " +"propriétés/méthodes. Par défaut, tous les tweens sont supprimés, sauf si " +"[code]key[/code] est spécifié." #: doc/classes/Tween.xml msgid "Stops animation and removes all tweens." @@ -79325,6 +81473,9 @@ msgid "" "tween), given its object and property/method pair. By default, all tweens " "are reset, unless [code]key[/code] is specified." msgstr "" +"Réinitialise un tween à sa valeur initiale (celle donnée, pas celle avant le " +"tween), en donnant son objet et ses propriétés/méthodes. Par défaut, tous " +"les tweens sont réinitialisés, sauf si [code]key[/code] est spécifié." #: doc/classes/Tween.xml msgid "" @@ -79340,6 +81491,9 @@ msgid "" "pair. By default, all tweens are resumed, unless [code]key[/code] is " "specified." msgstr "" +"Continue d'animer un tween arrêté, à partir de son objet et des propriétés/" +"méthodes. Par défaut, tous les tweens sont repris, sauf si [code]key[/code] " +"est spécifié." #: doc/classes/Tween.xml msgid "Continues animating all stopped tweens." @@ -79360,12 +81514,15 @@ msgstr "" #: doc/classes/Tween.xml msgid "Starts the tween. You can define animations both before and after this." msgstr "" +"Lance le tween. Vous pouvez définir des animations avant et après cela." #: doc/classes/Tween.xml msgid "" "Stops a tween, given its object and property/method pair. By default, all " "tweens are stopped, unless [code]key[/code] is specified." msgstr "" +"Arrête un tween, à partir de son objet et de ses propriétés/méthodes. Par " +"défaut, tous les tweens sont arrêtés, sauf si [code]key[/code] est spécifié." #: doc/classes/Tween.xml msgid "Stops animating all tweens." @@ -79382,6 +81539,15 @@ msgid "" "direction of the interpolation. See the class description for more " "information." msgstr "" +"Anime la méthode [code]method[/code] de [code]object[/code] et applique la " +"valeur retournée sur la méthode [code]initial_method[/code] jusqu'à " +"[code]final_val[/code] pendant [code]duration[/code] secondes, après " +"[code]delay[/code] secondes. Les méthodes sont animées en les appelant avec " +"des valeurs consécutives.\n" +"Utilisez [enum TransitionType] pour le paramètres [code]trans_type[/code] et " +"[enum EaseType] pour [code]ease_type[/code]. Ces valeurs contrôlent le " +"comportement et la direction de l'interpolation. Voir la description de la " +"classe pour plus d'informations." #: doc/classes/Tween.xml msgid "" @@ -79394,6 +81560,14 @@ msgid "" "direction of the interpolation. See the class description for more " "information." msgstr "" +"Anime la propriété [code]property[/code] de [code]object[/code] et applique " +"la valeur retournée par la propriété [code]initial_val[/code] de " +"[code]initial[/code] jusqu'à [code]final_val[/code] pendant [code]duration[/" +"code] secondes, après [code]delay[/code] secondes.\n" +"Utilisez [enum TransitionType] pour le paramètres [code]trans_type[/code] et " +"[enum EaseType] pour [code]ease_type[/code]. Ces valeurs contrôlent le " +"comportement et la direction de l'interpolation. Voir la description de la " +"classe pour plus d'informations." #: doc/classes/Tween.xml msgid "Returns the current time of the tween." @@ -79411,6 +81585,11 @@ msgid "" "code] for half of the normal speed. A value of [code]0[/code] pauses the " "animation, but see also [method set_active] or [method stop_all] for this." msgstr "" +"Le multiplicateur de la vitesse du tween. Par exemple, [code]1.0[/code] " +"définit une vitesse normale, [code]2.0[/code] deux fois que la vitesse " +"normale, et [code]0.5[/code] la moitié de la vitesse normale. Une valeur de " +"[code]0[/code] met en pause l'animation, mais voir aussi [method set_active] " +"ou [method stop_all] pour cela." #: doc/classes/Tween.xml msgid "If [code]true[/code], the tween loops." @@ -79527,6 +81706,7 @@ msgstr "" #: doc/classes/Tweener.xml msgid "Abstract class for all Tweeners used by [SceneTreeTween]." msgstr "" +"Une classe abstraite pour tous les Tweener utilisés par [SceneTreeTween]." #: doc/classes/Tweener.xml msgid "" @@ -79535,6 +81715,10 @@ msgid "" "can't be created manually, you need to use a dedicated method from " "[SceneTreeTween]." msgstr "" +"Les tweeners sont des objets qui effectuent une tâche d'animation " +"spécifique, par exemple interpoler une propriété ou appeler une méthode à un " +"moment donné. Un [Tweener] ne peut pas être créé manuellement, vous devez " +"utiliser une méthode dédiée de [SceneTreeTween]." #: doc/classes/Tweener.xml msgid "Emitted when the [Tweener] has just finished its job." @@ -79675,6 +81859,10 @@ msgid "" "can optionally specify a [code]bind_address[/code] to only listen for " "packets sent to that address. See also [method PacketPeerUDP.listen]." msgstr "" +"Démarre le serveur en ouvrant un socket UDP écoutant du port donné. Vous " +"pouvez en option spécifier une [code]bind_address[/code] pour seulement " +"écouter les paquets envoyés à cette adresse. Voir aussi [method " +"PacketPeerUDP.listen]." #: doc/classes/UDPServer.xml msgid "" @@ -79795,6 +81983,7 @@ msgstr "" #: doc/classes/UndoRedo.xml msgid "Register a method that will be called when the action is committed." msgstr "" +"Enregistre une méthode qui sera appelée lorsque l'action sera exécutée." #: doc/classes/UndoRedo.xml msgid "Register a property value change for \"do\"." @@ -79806,6 +81995,9 @@ msgid "" "lost. This is useful mostly for new nodes created for the \"do\" call. Do " "not use for resources." msgstr "" +"Enregistre une référence pour \"faire\" qui sera effacée si l'historique de " +"\"faire\" est perdue. Ceci est utile surtout pour les nouveaux nÅ“uds créés " +"avec l'appel \"faire\". Ne pas l'utiliser pour les ressources." #: doc/classes/UndoRedo.xml msgid "Register a method that will be called when the action is undone." @@ -79821,6 +82013,9 @@ msgid "" "history is lost. This is useful mostly for nodes removed with the \"do\" " "call (not the \"undo\" call!)." msgstr "" +"Enregistre une référence pour \"annuler\" qui sera effacée si l'historique " +"\"annuler\" est perdue. Ceci est utile surtout pour les nÅ“uds retirés avec " +"l'appel \"faire\" (et non pas l'appel \"annuler\" !)." #: doc/classes/UndoRedo.xml msgid "" @@ -79828,12 +82023,17 @@ msgid "" "Passing [code]false[/code] to [code]increase_version[/code] will prevent the " "version number to be increased from this." msgstr "" +"Efface l'historique annuler/refaire et les références associées.\n" +"Passez [code]false[/code] pour [code]increase_version[/code] pour empêcher " +"le numéro de version d'être augmenté suite à ça." #: doc/classes/UndoRedo.xml msgid "" "Commit the action. All \"do\" methods/properties are called/set when this " "function is called." msgstr "" +"Exécute l'action. Toutes les méthodes et propriétés \"faire\" sont appelées/" +"définies lorsque cette fonction est appelée." #: doc/classes/UndoRedo.xml msgid "" @@ -79844,6 +82044,12 @@ msgid "" "The way actions are merged is dictated by the [code]merge_mode[/code] " "argument. See [enum MergeMode] for details." msgstr "" +"Crée une nouvelle action. Une fois appelé, faites tous vos appels avec " +"[method add_do_method], [method add_undo_method], [method add_do_property], " +"et [method add_undo_property], puis exécutez l'action avec [method " +"commit_action].\n" +"La façon dont les actions sont fusionnées est défini par l'argument " +"[code]merge_mode[/code]. Voir [enum MergeMode] pour plus de détails." #: doc/classes/UndoRedo.xml msgid "Gets the name of the current action." @@ -79855,6 +82061,10 @@ msgid "" "version number is increased automatically.\n" "This is useful mostly to check if something changed from a saved version." msgstr "" +"Retourne la version. Chaque fois qu'une nouvelle action est engagée, le " +"numéro de version du [UndoRedo] est augmenté automatiquement.\n" +"Ceci est surtout utile pour vérifier si quelque chose a changé par rapport à " +"une version sauvegardée." #: doc/classes/UndoRedo.xml msgid "" @@ -79862,6 +82072,9 @@ msgid "" "action, i.e. running its \"do\" method or property change (see [method " "commit_action])." msgstr "" +"Retourne [code]true[/code] si le [UndoRedo] engage actuellement l'action, " +"c'est-à -dire en exécutant sa méthode « faire » ou son changement de " +"propriété (voir [method commit_action])." #: doc/classes/UndoRedo.xml msgid "Redo the last action." @@ -79887,27 +82100,34 @@ msgid "" "and the \"undo\" operation is from the last subsequent action with the same " "name." msgstr "" +"Fait de sorte que l'opération action suivante \"faire\" est de la première " +"action créée, et que l'opération \"annuler\" est de l'action suivante avec " +"le même nom." #: doc/classes/UndoRedo.xml msgid "Makes subsequent actions with the same name be merged into one." msgstr "Fusionne les actions suivantes avec le même nom dans une seule." #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." -msgstr "Les fonctions de réseau UPNP." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." +msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -79920,7 +82140,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -79949,62 +82169,40 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" -msgstr "" -"Fournis un fonctionnalité UPNP pour découvrir des appareils [UPNPDevice] sur " -"le réseau local et lancer des commandes sur eux, comme la gestion des ports " -"(port forwarding) et requêter les adresses IP locales et distantes. À noter " -"que les méthodes de cette classe sont synchrones et bloquent le fil " -"d'exécution que les appelle.\n" -"Pour le forward d'un port :\n" -"[codeblock]\n" -"const PORT = 7777\n" -"var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" "[/codeblock]\n" -"Pour fermer le port spécifié (ex. après avoir fini de l'utiliser) :\n" -"[codeblock]\n" -"upnp.delete_port_mapping(port)\n" -"[/codeblock]\n" -"[b]Note :[/b] la découverte UPnP bloque le fil d'exécution que l'appelle. " -"Pour ne pas bloquer le fil d'exécution principal, utilisez les [Thread] " -"comme ceci :\n" -"[codeblock]\n" -"# Émis quand la configuration d'un port UPnP est fini (peu importe si c'est " -"un succès ou un échec).\n" -"signal upnp_completed(error)\n" -"\n" -"# Remplacer ceci avec le port de votre serveur compris entre 1025 et 65535.\n" -"const SERVER_PORT = 3928\n" -"var thread = null\n" -"\n" -"func _upnp_setup(server_port):\n" -" # Les requêtes UPNP prennent un peu de temps\n" -" var upnp = UPNP.new()\n" -" var err = upnp.discover()\n" -"\n" -" if err != OK:\n" -" push_error(str(err))\n" -" emit_signal(\"upnp_completed\", err)\n" -" return\n" -"\n" -" if upnp.get_gateway() and upnp.get_gateway().is_valid_gateway():\n" -" upnp.add_port_mapping(server_port, server_port, ProjectSettings." -"get_setting(\"application/config/name\"), \"UDP\")\n" -" upnp.add_port_mapping(server_port, server_port, ProjectSettings." -"get_setting(\"application/config/name\"), \"TCP\")\n" -" emit_signal(\"upnp_completed\", OK)\n" -"\n" -"func _ready():\n" -" thread = Thread.new()\n" -" thread.start(self, \"_upnp_setup\", SERVER_PORT)\n" -"\n" -"func _exit_tree():\n" -" # Attendre ici que le fil d'exécution se termine avant que le jeu ne " -"quitte.\n" -" thread.wait_to_finish()\n" -"[/codeblock]" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." +msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "Adds the given [UPNPDevice] to the list of discovered devices." @@ -80013,22 +82211,35 @@ msgstr "Ajouter le [UPNPDevice] spécifié à la liste des appareils découverts #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -80041,8 +82252,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -80055,6 +82268,13 @@ msgid "" "this if you know what you're doing.\n" "See [enum UPNPResult] for possible return values." msgstr "" +"Découvre les [UPNPDevice] locaux. Efface la liste des appareils précédemment " +"découverts.\n" +"Filtres pour les appareils de type IGD (InternetGatewayDevice) par défaut, " +"comme ceux gèrent le suivi de port. [code]timeout[/code] est la durée " +"d'attente des réponses en millisecondes. [code]ttl[/code] est le temps " +"laissé à vivre; changez-le seulement si vous savez ce que vous faites.\n" +"Voir [enum UPNPResult] pour les valeurs retournées possibles." #: modules/upnp/doc_classes/UPNP.xml msgid "Returns the [UPNPDevice] at the given [code]index[/code]." @@ -80070,12 +82290,16 @@ msgid "" "Returns the default gateway. That is the first discovered [UPNPDevice] that " "is also a valid IGD (InternetGatewayDevice)." msgstr "" +"Retourne la passerelle par défaut. Il s'agit du premier [UPNPDevice] " +"découvert qui est également un IGD (InternetGatewayDevice) valide." #: modules/upnp/doc_classes/UPNP.xml msgid "" "Returns the external [IP] address of the default gateway (see [method " "get_gateway]) as string. Returns an empty string on error." msgstr "" +"Retourne l'adresse [IP] externe de la passerelle par défaut (voir [method " +"get_gateway]) en tant que chaîne. Retourne une chaîne vide en cas d'erreur." #: modules/upnp/doc_classes/UPNP.xml msgid "" @@ -80104,12 +82328,18 @@ msgid "" "the source port 1900 (same as destination port). Otherwise, the value will " "be used as the port." msgstr "" +"Si [code]0[/code], le port local à utiliser pour la découverte est choisi " +"automatiquement par le système. Si [code]1[/code], la découverte sera faite " +"à partir du port source 1900 (même comme port de destination.) Sinon, la " +"valeur sera utilisée comme port." #: modules/upnp/doc_classes/UPNP.xml msgid "" "Multicast interface to use for discovery. Uses the default multicast " "interface if empty." msgstr "" +"L'interface multicast à utiliser pour la découverte. Utilise l'interface " +"multicast par défaut si vide." #: modules/upnp/doc_classes/UPNP.xml msgid "UPNP command or discovery was successful." @@ -80120,12 +82350,16 @@ msgid "" "Not authorized to use the command on the [UPNPDevice]. May be returned when " "the user disabled UPNP on their router." msgstr "" +"Non autorisé à utiliser la commande sur le [UPNPDevice]. Peut être retourné " +"lorsque l'utilisateur a désactivé UPNP sur son routeur." #: modules/upnp/doc_classes/UPNP.xml msgid "" "No port mapping was found for the given port, protocol combination on the " "given [UPNPDevice]." msgstr "" +"Aucune carte des ports n'a été trouvée pour le port donné, la combinaison de " +"protocole sur le [UPNPDevice] donné." #: modules/upnp/doc_classes/UPNP.xml msgid "Inconsistent parameters." @@ -80136,6 +82370,8 @@ msgid "" "No such entry in array. May be returned if a given port, protocol " "combination is not found on an [UPNPDevice]." msgstr "" +"Pas d'entrée dans le tableau. Peut être retourné si pour un port donné, la " +"combinaison de protocole n'est pas trouvée sur un [UPNPDevice]." #: modules/upnp/doc_classes/UPNP.xml msgid "The action failed." @@ -80145,6 +82381,7 @@ msgstr "L’action a échoué." msgid "" "The [UPNPDevice] does not allow wildcard values for the source IP address." msgstr "" +"Le [UPNPDevice] ne permet pas les valeurs joker pour l'adresse IP source." #: modules/upnp/doc_classes/UPNP.xml msgid "The [UPNPDevice] does not allow wildcard values for the external port." @@ -80169,6 +82406,8 @@ msgid "" "No port maps are available. May also be returned if port mapping " "functionality is not available." msgstr "" +"Aucune carte de ports n'est disponible. Peut également être retourné si la " +"fonctionnalité de carte des ports n'est pas disponible." #: modules/upnp/doc_classes/UPNP.xml msgid "" @@ -80176,10 +82415,13 @@ msgid "" "UPNP_RESULT_CONFLICT_WITH_OTHER_MAPPING] if a port mapping conflicts with an " "existing one." msgstr "" +"Est en conflit avec un autre mécanisme. Peut être retourné au lieu de " +"[constant UPNP_RESULT_CONFLICT_WITH_OTHER_MAPPING] si une carte des ports " +"est en conflit avec une carte existante." #: modules/upnp/doc_classes/UPNP.xml msgid "Conflict with an existing port mapping." -msgstr "" +msgstr "Est en conflit avec une carte des ports existante." #: modules/upnp/doc_classes/UPNP.xml msgid "External and internal port values must be the same." @@ -80190,6 +82432,8 @@ msgid "" "Only permanent leases are supported. Do not use the [code]duration[/code] " "parameter when adding port mappings." msgstr "" +"Seuls les baux permanents sont pris en charge. N'utilisez pas le paramètre " +"[code]duration[/code] lors de l'ajout de carte des ports." #: modules/upnp/doc_classes/UPNP.xml msgid "Invalid gateway." @@ -80236,29 +82480,41 @@ msgid "" "No gateway available. You may need to call [method discover] first, or " "discovery didn't detect any valid IGDs (InternetGatewayDevices)." msgstr "" +"Aucune passerelle disponible. Vous pouvez avoir besoin d'appeler [method " +"discover] d'abord, ou la découverte n'a pas détecté de IGD " +"(InternetGatewayDevices) valide." #: modules/upnp/doc_classes/UPNP.xml msgid "" "No devices available. You may need to call [method discover] first, or " "discovery didn't detect any valid [UPNPDevice]s." msgstr "" +"Aucun appareil disponible. Vous pouvez avoir besoin d'appeler [method " +"discover] d'abord, ou la découverte n'a pas détecté des [UPNPDevice] valides." #: modules/upnp/doc_classes/UPNP.xml modules/upnp/doc_classes/UPNPDevice.xml msgid "Unknown error." msgstr "Erreur inconnue." #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." -msgstr "Périphérique UPNP." +msgid "Universal Plug and Play (UPnP) device." +msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml +#, fuzzy msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" +"Un appareil UPNP. Voir [UPNP] pour les fonctions UPNP de découverte et " +"utilitaires. Fournit un accès de bas niveau aux commandes UPNP. Permet de " +"gérer les cartes de ports (suivi de port) et de demander des informations " +"réseau sur l'appareil (comme l'adresse IP locale et externe, et le statut). " +"Notez que les méthodes de cette classe sont synchrones et bloquent le fil " +"d'exécution dans lequel ces méthodes sont appelées." #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" @@ -80266,30 +82522,36 @@ msgid "" "for the given protocol to the local machine. See [method UPNP." "add_port_mapping]." msgstr "" +"Ajoute une carte des ports pour faire passer le port externe donné sur ce " +"[UPNPDevice] pour le protocole donné à la machine locale. Voir [method UPNP." +"add_port_mapping]." #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" "Deletes the port mapping identified by the given port and protocol " "combination on this device. See [method UPNP.delete_port_mapping]." msgstr "" +"Supprime la carte des ports identifiée par la combinaison de ports et le " +"protocole donnée sur cet appareil. Voir [method UPNP.delete_port_mapping]." #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" "Returns [code]true[/code] if this is a valid IGD (InternetGatewayDevice) " "which potentially supports port forwarding." msgstr "" +"Retourne [code]true[/code] si c'est un IGD (InternetGatewayDevice) valide " +"qui supporte potentiellement le suivi de port." #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" "Returns the external IP address of this [UPNPDevice] or an empty string." -msgstr "" +msgstr "Retourne l'adresse IP externe de ce [UPNPDevice], ou une chaîne vide." #: modules/upnp/doc_classes/UPNPDevice.xml msgid "URL to the device description." msgstr "URL de la description de l’appareil." #: modules/upnp/doc_classes/UPNPDevice.xml -#, fuzzy msgid "IDG control URL." msgstr "URL de contrôle IDG." @@ -80475,6 +82737,8 @@ msgstr "" msgid "" "Returns a new vector with all components in absolute values (i.e. positive)." msgstr "" +"Retourne un nouveau vecteur avec tous les composants en valeurs absolues " +"(c'est-à -dire toujours positif)." #: doc/classes/Vector2.xml msgid "" @@ -80496,6 +82760,9 @@ msgid "" "[url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/" "vector2_angle_to.png]Illustration of the returned angle.[/url]" msgstr "" +"Retourne l'angle au vecteur donné, en radians.\n" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/" +"vector2_angle_to.png]Illustration de l'angle retourné.[/url]" #: doc/classes/Vector2.xml msgid "" @@ -80504,6 +82771,10 @@ msgid "" "[url=https://raw.githubusercontent.com/godotengine/godot-docs/stable/img/" "vector2_angle_to_point.png]Illustration of the returned angle.[/url]" msgstr "" +"Retourne l'angle entre la ligne reliant les deux points et l'axe X, en " +"radians.\n" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/stable/img/" +"vector2_angle_to_point.png]Illustration de l'angle retourné.[/url]" #: doc/classes/Vector2.xml msgid "" @@ -80524,6 +82795,7 @@ msgid "" "Returns a new vector with all components rounded up (towards positive " "infinity)." msgstr "" +"Retourne un nouveau vecteur avec tous les composants arrondis (vers +infini)." #: doc/classes/Vector2.xml msgid "" @@ -80555,12 +82827,18 @@ msgid "" "result at position [code]weight[/code]. [code]weight[/code] is on the range " "of 0.0 to 1.0, representing the amount of interpolation." msgstr "" +"Fait une interpolation cubique entre ce vecteur et [code]b[/code] en " +"utilisant [code]pre_a[/code] et [code]post_b[/code] comme poignées, et " +"retourne le résultat suivant [code]weight[/code]. [code]weight[/code] est " +"dans l'intervalle de 0,0 à 1,0, représentant la quantité interpolée." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" "Returns the normalized vector pointing from this vector to [code]b[/code]. " "This is equivalent to using [code](b - a).normalized()[/code]." msgstr "" +"Retourne le vecteur normalisé de ce vecteur en direction de [code]b[/code]. " +"Ceci est équivalent à l'utilisation [code]b - a).normalized()[/code]." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" @@ -80568,6 +82846,10 @@ msgid "" "This method runs faster than [method distance_to], so prefer it if you need " "to compare vectors or need the squared distance for some formula." msgstr "" +"Retourne la distance entre ce vecteur et [code]b[/code].\n" +"Cette méthode est plus rapide que [method distance_to], alors préfèrez-le si " +"vous avez besoin de comparer des vecteurs ou besoin de la distance carrée " +"pour une formule." #: doc/classes/Vector2.xml msgid "Returns the distance between this vector and [code]to[/code]." @@ -80593,6 +82875,8 @@ msgid "" "Returns a new vector with all components rounded down (towards negative " "infinity)." msgstr "" +"Retourne un nouveau vecteur avec tous les composants arrondis à la valeur " +"inférieur (vers -infini)." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" @@ -80622,6 +82906,10 @@ msgid "" "This method runs faster than [method length], so prefer it if you need to " "compare vectors or need the squared distance for some formula." msgstr "" +"Retourne la longeur (magnitude) au carré de ce vecteur.\n" +"Cette méthode est plus rapide que [method length] donc préférez-le si vous " +"devez comparer des vecteurs ou avoir besoin de la distance carrée pour " +"certaines formules." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" @@ -80637,6 +82925,9 @@ msgid "" "[code]to[/code] by amount [code]weight[/code]. [code]weight[/code] is on the " "range of 0.0 to 1.0, representing the amount of interpolation." msgstr "" +"Retourne le résultat de l'interpolation linéaire entre ce vecteur et " +"[code]to[/code] par la quantité [code]weight[/code]. [code]weight[/code] est " +"compris entre 0,0 et 1,0, représentant la quantité d'interpolation." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" @@ -80651,18 +82942,24 @@ msgid "" "Returns the vector scaled to unit length. Equivalent to [code]v / v.length()" "[/code]." msgstr "" +"Retourne le vecteur de longueur unitaire. Équivalent à [code]v / v.length()[/" +"code]." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" "Returns a vector composed of the [method @GDScript.fposmod] of this vector's " "components and [code]mod[/code]." msgstr "" +"Retourne un vecteur composé de [method @GDScript.fposmod] de ces composants " +"vectoriels et [code]mod[/code]." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" "Returns a vector composed of the [method @GDScript.fposmod] of this vector's " "components and [code]modv[/code]'s components." msgstr "" +"Retourne un vecteur composé de [method @GDScript.fposmod] de ces composants " +"vectoriels et [code]modv[/code])." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "Returns this vector projected onto the vector [code]b[/code]." @@ -80673,14 +82970,16 @@ msgid "" "Returns the vector reflected (i.e. mirrored, or symmetric) over a line " "defined by the given direction vector [code]n[/code]." msgstr "" +"Retourne le vecteur réfléchi (c'est-à -dire en miroir ou symétrique) sur une " +"ligne définie par le vecteur de direction [code]n[/code] spécifié." #: doc/classes/Vector2.xml msgid "" "Returns the vector rotated by [code]angle[/code] (in radians). See also " "[method @GDScript.deg2rad]." msgstr "" -"Retourne le vecteur pivoté par [code]angle[/code] (en radians). Voir aussi [" -"method @GDScript.deg2rad]." +"Retourne le vecteur pivoté par [code]angle[/code] (en radians). Voir aussi " +"[method @GDScript.deg2rad]." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" @@ -80696,6 +82995,9 @@ msgid "" "depending on the signs of the components. If a component is zero, it returns " "positive one." msgstr "" +"Retourne un nouveau vecteur avec chaque composant défini à 1 ou -1, selon " +"les signes des composants. Si un composant est zéro, la valeur retournée " +"sera positive." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" @@ -80704,10 +83006,16 @@ msgid "" "the range of 0.0 to 1.0, representing the amount of interpolation.\n" "[b]Note:[/b] Both vectors must be normalized." msgstr "" +"Retourne le résultat de l'interpolation linéaire sphérique entre ce vecteur " +"et [code]to[/code], par la quantité [code]weight[/code]. [code]weight[/code] " +"est compris entre 0,0 et 1,0, représentant la quantité d'interpolation.\n" +"[b]Note :[/b] Les deux vecteurs doivent être normalisés." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "Returns this vector slid along a plane defined by the given normal." msgstr "" +"Retourne ce vecteur ayant glissé le long du plan défini par la normale " +"donnée." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" @@ -80715,6 +83023,9 @@ msgid "" "[code]step[/code]. This can also be used to round to an arbitrary number of " "decimals." msgstr "" +"Retourne ce vecteur avec chaque composant arrondis au multiple le plus " +"proche de [code]step[/code]. Cela peut également être utilisé pour arrondir " +"à un nombre arbitraire de décimales." #: doc/classes/Vector2.xml msgid "" @@ -80729,12 +83040,16 @@ msgid "" "The vector's X component. Also accessible by using the index position [code]" "[0][/code]." msgstr "" +"La composante vectorielle X. Également accessible en utilisant le code de " +"position index [code][0][/code]." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" "The vector's Y component. Also accessible by using the index position [code]" "[1][/code]." msgstr "" +"La composante vectorielle X. Également accessible en utilisant le code de " +"position index [code][1][/code]." #: doc/classes/Vector2.xml msgid "Enumerated value for the X axis." @@ -80747,10 +83062,13 @@ msgstr "Les valeurs énumérées pour l'axe Y." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "Zero vector, a vector with all components set to [code]0[/code]." msgstr "" +"Le vecteur zéro, un vecteur avec tous ses composants définis [code]0[/code]." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "One vector, a vector with all components set to [code]1[/code]." msgstr "" +"Le vecteur unitaire, un vecteur avec tous ses composants définis à [code]1[/" +"code]." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" @@ -80792,6 +83110,11 @@ msgid "" "code] if it's equal to [code]Vector3(0, 0, 0)[/code]. Otherwise, a Vector3 " "will always evaluate to [code]true[/code]." msgstr "" +"Une structure de 3 éléments qui peut être utilisée pour représenter des " +"positions dans l'espace 3D ou tout autre trio de valeurs numériques.\n" +"[b]Note :[/b] Avec des booléens, un Vector3 sera évalué ) [code]false[/code] " +"s'il est égal à [code]Vector3(0, 0, 0)[/code]. Sinon, un Vector3 sera " +"toujours évalué à [code]true[/code]." #: doc/classes/Vector3.xml msgid "Returns a Vector3 with the given components." @@ -80812,6 +83135,10 @@ msgid "" "result at position [code]weight[/code]. [code]weight[/code] is on the range " "of 0.0 to 1.0, representing the amount of interpolation." msgstr "" +"Exécute une interpolation cubique entre ce vecteur et [code]b[/code] en " +"utilisant [code]pre_a[/code] et [code]post_b[/code] comme poignées, et " +"retourne le résultat à la position [code]weight[/code]. [code]weight[/code] " +"est dans l'intervalle de 0,0 à 1,0, représentant la quantité d'interpolation." #: doc/classes/Vector3.xml msgid "Returns the distance between this vector and [code]b[/code]." @@ -80846,6 +83173,9 @@ msgid "" "[code]to[/code] by amount [code]t[/code]. [code]weight[/code] is on the " "range of 0.0 to 1.0, representing the amount of interpolation." msgstr "" +"Retourne le résultat de l'interpolation linéaire entre ce vecteur et " +"[code]to[/code] par la quantité [code]t[/code]. [code]weight[/code] est dans " +"l'intervalle 0,0 à 1,0, représentant la quantité d'interpolée." #: doc/classes/Vector3.xml msgid "" @@ -80853,6 +83183,9 @@ msgid "" "constants. If all components are equal, this method returns [constant " "AXIS_X]." msgstr "" +"Retourne l'axe de la valeur la plus importante du vecteur. Voir les " +"constantes[code]AXIS_*[/code]. Si tous les composants sont égaux, cette " +"méthode retourne [constant AXIS_X]." #: doc/classes/Vector3.xml msgid "" @@ -80860,6 +83193,9 @@ msgid "" "constants. If all components are equal, this method returns [constant " "AXIS_Z]." msgstr "" +"Retourne l'axe de la valeur vectorielle la plus petite. Voir les constantes " +"[code]AXIS_*[/code]. Si tous les composants sont égaux, cette méthode " +"retourne [constant AXIS_Z]." #: doc/classes/Vector3.xml msgid "Returns the outer product with [code]b[/code]." @@ -80867,7 +83203,7 @@ msgstr "" #: doc/classes/Vector3.xml msgid "Returns this vector reflected from a plane defined by the given normal." -msgstr "" +msgstr "Retourne ce vecteur réfléchi par un plan défini par la normale donnée." #: doc/classes/Vector3.xml msgid "" @@ -80884,6 +83220,9 @@ msgid "" "clockwise direction when viewed from the side specified by the [code]axis[/" "code]." msgstr "" +"Retourne l'angle signé du vecteur donné, en radians. Le signe de l'angle est " +"positif dans une direction horaire inversée et négatif dans l'autre " +"direction lorsqu'il est vu du côté spécifié par le [code]axis[/code]." #: doc/classes/Vector3.xml msgid "" @@ -80891,12 +83230,17 @@ msgid "" "This is equivalent to a Basis with no rotation or shearing and this vector's " "components set as the scale." msgstr "" +"Retourne une matrice diagonale avec ce vecteur comme diagonale principale.\n" +"Il s'agit d'une Basis qui n'a ni rotation ni déformation, et les composants " +"de ce vecteur représentent l'échelle." #: doc/classes/Vector3.xml msgid "" "The vector's Z component. Also accessible by using the index position [code]" "[2][/code]." msgstr "" +"Le composant vectoriel Z. Également accessible en utilisant l'index [code][2]" +"[/code]." #: doc/classes/Vector3.xml msgid "" @@ -81097,6 +83441,8 @@ msgid "" "The steering angle for the wheel. Setting this to a non-zero value will " "result in the vehicle turning when it's moving." msgstr "" +"L'angle de direction du volant pour la roue. Définit de cette valeur à une " +"valeur non nulle fera tourner le véhicule quand il se déplace." #: doc/classes/VehicleWheel.xml msgid "" @@ -81105,6 +83451,10 @@ msgid "" "will not carry the weight of the vehicle. Good results are often obtained by " "a value that is about 3× to 4× this number." msgstr "" +"La force maximale que le ressort peut résister. Cette valeur devrait être " +"supérieure à un quart du [member RigidBody.mass] du [VehicleBody] ou alors " +"le ressort ne portera pas le poids du véhicule. Les bons résultats sont " +"souvent obtenus par une valeur d'environ 3× à 4× ce nombre." #: doc/classes/VehicleWheel.xml msgid "" @@ -81112,6 +83462,10 @@ msgid "" "50 for an off-road car, a value between 50 and 100 for a race car and try " "something around 200 for something like a Formula 1 car." msgstr "" +"Cette valeur définit la rigidité de la suspension. Utilisez une valeur " +"inférieure à 50 pour une voiture tout terrain, une valeur entre 50 et 100 " +"pour une voiture de course et essayez quelque chose autour de 200 pour " +"quelque chose comme une voiture de Formule 1." #: doc/classes/VehicleWheel.xml msgid "" @@ -81119,6 +83473,9 @@ msgid "" "equivalent to meters, keep this setting relatively low. Try a value between " "0.1 and 0.3 depending on the type of car." msgstr "" +"C'est la distance que la suspension peut parcourir. Comme les unités Godot " +"sont équivalentes aux mètres, garder ce réglage relativement bas. Essayez " +"une valeur entre 0,1 et 0,3 selon le type de voiture." #: doc/classes/VehicleWheel.xml msgid "" @@ -81126,6 +83483,9 @@ msgid "" "value is used in conjunction with [member VehicleBody.steering] and ignored " "if you are using the per-wheel [member steering] value instead." msgstr "" +"Si [code]true[/code], cette roue sera tournée lorsque la voiture tourne. " +"Cette valeur est utilisée en conjonction avec [member VehicleBody.steering] " +"et ignorée si vous utilisez plutôt la valeur [member steering] par roue." #: doc/classes/VehicleWheel.xml msgid "" @@ -81134,6 +83494,10 @@ msgid "" "VehicleBody.engine_force] and ignored if you are using the per-wheel [member " "engine_force] value instead." msgstr "" +"Si [code]true[/code], cette roue transfère la force moteur au sol pour " +"propulser le véhicule vers l'avant. Cette valeur est utilisée en conjonction " +"avec [member VehicleBody.engine_force] et ignorée si vous utilisez plutôt la " +"valeur par roue [member engine_force]." #: doc/classes/VehicleWheel.xml msgid "" @@ -81164,6 +83528,9 @@ msgid "" "your vehicle will be prone to rolling over, while a value of 0.0 will resist " "body roll." msgstr "" +"Cette valeur affecte le roulade de votre véhicule. Si définit à 1.0 pour " +"toutes les roues, votre véhicule sera sujet aux roulades, tandis qu'une " +"valeur de 0.0 résistera au roulade du corps." #: doc/classes/VFlowContainer.xml msgid "Vertical flow container." @@ -81195,6 +83562,8 @@ msgid "" "Returns the video stream's name, or [code]\"<No Stream>\"[/code] if no video " "stream is assigned." msgstr "" +"Retourne le nom du flux vidéo, ou [code]\"<No Stream>\"[/code] si aucun flux " +"vidéo n'est assigné." #: doc/classes/VideoPlayer.xml msgid "Returns the current frame as a [Texture]." @@ -81205,12 +83574,17 @@ msgid "" "Returns [code]true[/code] if the video is playing.\n" "[b]Note:[/b] The video is still considered playing if paused during playback." msgstr "" +"Retourne [code]true[/code] si la vidéo joue.\n" +"[b]Note :[/b] La vidéo est toujours considérée comme en train de jouer si " +"elle est mise en pause pendant la lecture." #: doc/classes/VideoPlayer.xml msgid "" "Starts the video playback from the beginning. If the video is paused, this " "will not unpause the video." msgstr "" +"Commence la lecture vidéo dès le début. Si la vidéo est en pause, cela ne la " +"fera pas reprendre." #: doc/classes/VideoPlayer.xml msgid "" @@ -81218,6 +83592,9 @@ msgid "" "[b]Note:[/b] Although the stream position will be set to 0, the first frame " "of the video stream won't become the current frame." msgstr "" +"Arrête la lecture vidéo et fixe la position du flux à 0.\n" +"[b]Note :[/b] Bien que la position du flux soit définie à 0, la première " +"trame du flux vidéo ne deviendra pas le trame actuel." #: doc/classes/VideoPlayer.xml msgid "The embedded audio track to play." @@ -81242,6 +83619,9 @@ msgid "" "control minimum size will be automatically adjusted to match the video " "stream's dimensions." msgstr "" +"Si [code]true[/code], la taille des contrôles dépendront de la vidéo. Sinon, " +"la taille minimale des contrôles sera automatiquement ajustée pour " +"correspondre aux dimensions du flux vidéo." #: doc/classes/VideoPlayer.xml msgid "If [code]true[/code], the video is paused." @@ -81257,6 +83637,10 @@ msgid "" "[b]Note:[/b] Changing this value won't have any effect as seeking is not " "implemented yet, except in video formats implemented by a GDNative add-on." msgstr "" +"La position actuelle du flux, en secondes.\n" +"[b]Note :[/b] La modification de cette valeur n'a pas d'effet puisque le " +"progression de lecture n'est pas encore implémentée, sauf dans les formats " +"vidéo implémentés par un greffon GDNative." #: doc/classes/VideoPlayer.xml msgid "Audio volume as a linear value." @@ -81280,6 +83664,9 @@ msgid "" "[VideoStream] can all be used as resource types to play back videos in " "[VideoPlayer]." msgstr "" +"Le type de ressources de base pour tous les flux vidéos. Les classes qui " +"dérivent de [VideoStream] peuvent tous être utilisées comme types de " +"ressources pour lire des vidéos dans [VideoPlayer]." #: modules/gdnative/doc_classes/VideoStreamGDNative.xml msgid "[VideoStream] resource for video formats implemented via GDNative." @@ -81293,6 +83680,10 @@ msgid "" "videodecoder]godot-videodecoder[/url] which uses the [url=https://ffmpeg." "org]FFmpeg[/url] library." msgstr "" +"La ressource [VideoStream] pour les formats vidéo implémenté avec GDNative.\n" +"Il peut être utilisé via [url=https://github.com/KidRigger/godot-" +"videodecoder]godot-videodecoder[/url] utilisé par la bibliothèque " +"[url=https://ffmpeg.org]FFmpeg[/url]." #: modules/gdnative/doc_classes/VideoStreamGDNative.xml msgid "Returns the video file handled by this [VideoStreamGDNative]." @@ -81305,6 +83696,9 @@ msgid "" "supported extensions depend on the GDNative plugins used to expose video " "formats." msgstr "" +"Définit le fichier vidéo que cette ressource [VideoStreamGDNative] gère. Les " +"extensions supportées dépendent des greffons GDNative utilisés pour exposer " +"les formats vidéo." #: modules/theora/doc_classes/VideoStreamTheora.xml msgid "[VideoStream] resource for Ogg Theora videos." @@ -81363,6 +83757,9 @@ msgid "" "Sets the WebM video file that this [VideoStreamWebm] resource handles. The " "[code]file[/code] name should have the [code].webm[/code] extension." msgstr "" +"Définit le fichier vidéo WebM que cette ressource [VideoStreamWebm] gère. Le " +"nom de fichier [code]file[/code] devrait avoir l'extension [code].webm[/" +"code]." #: doc/classes/Viewport.xml msgid "Creates a sub-view into the screen." @@ -81441,6 +83838,8 @@ msgid "" "Returns the mouse's position in this [Viewport] using the coordinate system " "of this [Viewport]." msgstr "" +"Retourne la position de la souris dans ce [Viewport] en utilisant le système " +"de coordonnées de ce [Viewport]." #: doc/classes/Viewport.xml msgid "Returns information about the viewport from the rendering pipeline." @@ -81453,6 +83852,7 @@ msgstr "" #: doc/classes/Viewport.xml msgid "Returns the size override set with [method set_size_override]." msgstr "" +"Retourne la surcharge de taille définit avec [method set_size_override]." #: doc/classes/Viewport.xml msgid "" @@ -81465,6 +83865,15 @@ msgid "" "img.flip_y()\n" "[/codeblock]" msgstr "" +"Retourne la texture de la fenêtre d'affichage.\n" +"[b]Note :[/b] En raison de la façon dont OpenGL fonctionne, la " +"[ViewportTexture] finale est à l'envers verticalement. Vous pouvez utiliser " +"[method Image.flip_y] sur l'image de [method Texture.get_data] pour la " +"retourner, par exemple :\n" +"[codeblock]\n" +"var img = get_viewport().get_texture().get_data()\n" +"img.flip_y()\n" +"/[codeblock]" #: doc/classes/Viewport.xml msgid "Returns the viewport's RID from the [VisualServer]." @@ -81480,10 +83889,12 @@ msgid "" "Returns the drag data from the GUI, that was previously returned by [method " "Control.get_drag_data]." msgstr "" +"Retourne les données de déposé-glissé de l'interface graphique, qui a été " +"précédemment retourné par [method Control.get_drag_data]." #: doc/classes/Viewport.xml msgid "Returns [code]true[/code] if there are visible modals on-screen." -msgstr "" +msgstr "Retourne [code]true[/code] s'il y a des modales visibles à l'écran." #: doc/classes/Viewport.xml msgid "Returns [code]true[/code] if the drag operation is successful." @@ -81496,6 +83907,11 @@ msgid "" "Alternative to [constant Node.NOTIFICATION_DRAG_BEGIN] and [constant Node." "NOTIFICATION_DRAG_END] when you prefer polling the value." msgstr "" +"Retourne [code]true[/code] si la fenêtre d'affichage effectue actuellement " +"une opération de déposé-glissé.\n" +"C'est une alternative à [constant Node. NOTIFICATION_DRAG_BEGIN] and " +"[constant Node. NOTIFICATION_DRAG_END] lorsque vous préférez récupérer " +"directement la valeur." #: doc/classes/Viewport.xml msgid "" @@ -81512,6 +83928,9 @@ msgid "" "[Viewport] but makes you responsible for updating the position of this " "[Viewport] manually." msgstr "" +"Attaque ce [Viewport] au [Viewport] racine avec le rectangle spécifié. Cela " +"contourne le besoin d'un autre nÅ“ud pour afficher ce [Viewport] mais vous " +"devez mettre à jour de la position de ce [Viewport] manuellement." #: doc/classes/Viewport.xml msgid "Stops the input from propagating further down the [SceneTree]." @@ -81534,6 +83953,10 @@ msgid "" "size. If the size parameter is [code](-1, -1)[/code], it won't update the " "size." msgstr "" +"Définit la surcharge de la taille de la fenêtre d'affichage. Si le paramètre " +"[code]enable[/code] est [code]true[/code], le paramètre de surcharge sera " +"utilisé, sinon ça utilisera la taille par défaut. Si le paramètre de taille " +"est [code](-1, -1)[/code], sa taille ne sera pas mise à jour." #: doc/classes/Viewport.xml msgid "Forces update of the 2D and 3D worlds." @@ -81544,10 +83967,14 @@ msgid "" "Moves the mouse pointer to the specified position in this [Viewport] using " "the coordinate system of this [Viewport]." msgstr "" +"Déplace le pointeur de la souris à la position spécifiée dans ce [Viewport] " +"en utilisant le système de coordonnées de ce [Viewport]." #: doc/classes/Viewport.xml msgid "If [code]true[/code], the viewport will be used in AR/VR process." msgstr "" +"Si [code]true[/code], la fenêtre d'affichage sera utilisée dans le processus " +"AR/VR." #: doc/classes/Viewport.xml msgid "If [code]true[/code], the viewport will process 2D audio streams." @@ -81563,6 +83990,9 @@ msgid "" "positions of all child [CanvasItem]s. This is relative to the global canvas " "transform of the viewport." msgstr "" +"La transformation du canevas de la fenpetre d'affichage, utile pour changer " +"les positions à l'écran de tous les [CanvasItem] enfants. C'est relatif à la " +"transformation globale du canevas de la fenêtre d'affichage." #: doc/classes/Viewport.xml msgid "" @@ -81578,12 +84008,16 @@ msgstr "" #: doc/classes/Viewport.xml msgid "The overlay mode for test rendered geometry in debug purposes." msgstr "" +"Le mode de surcouche (\"overlay\") pour tester la géométrie rendue lors du " +"débogage." #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], the viewport will disable 3D rendering. For actual " "disabling use [code]usage[/code]." msgstr "" +"Si [code]true[/code], le viewport désactivera le rendu 3D. Pour le " +"désactiver réellement, utilisez [code]usage[/code]." #: doc/classes/Viewport.xml msgid "" @@ -81600,6 +84034,8 @@ msgid "" "The global canvas transform of the viewport. The canvas transform is " "relative to this." msgstr "" +"La transformation globale de la toile de cette fenêtre d'affichage. La " +"transformation en toile est relative à cela." #: doc/classes/Viewport.xml msgid "If [code]true[/code], the viewport will not receive input events." @@ -81612,6 +84048,8 @@ msgid "" "If [code]true[/code], the GUI controls on the viewport will lay pixel " "perfectly." msgstr "" +"Si [code]true[/code], les contrôles de l'interface graphique dans la fenêtre " +"d'affichage s'alignent au pixel près." #: doc/classes/Viewport.xml msgid "" @@ -81658,6 +84096,8 @@ msgid "" "If [code]true[/code], the objects rendered by viewport become subjects of " "mouse picking process." msgstr "" +"Si [code]true[/code], les objets rendus dans la fenêtre d'affichage peuvent " +"être sélectionnés par la souris." #: doc/classes/Viewport.xml msgid "" @@ -81673,10 +84113,15 @@ msgid "" "The clear mode when viewport used as a render target.\n" "[b]Note:[/b] This property is intended for 2D usage." msgstr "" +"Le mode clair quand la fenêtre d'affichage est utilisé comme cible de " +"rendu.\n" +"[b]Note :[/b] Cette propriété est destinée à une utilisation 2D." #: doc/classes/Viewport.xml msgid "The update mode when viewport used as a render target." msgstr "" +"Le mode de mise à jour lorsque la fenêtre d'affichage est utilisé comme " +"cible de rendu." #: doc/classes/Viewport.xml msgid "" @@ -81692,18 +84137,22 @@ msgstr "" #: doc/classes/Viewport.xml msgid "The subdivision amount of the first quadrant on the shadow atlas." msgstr "" +"La quantité de sous-division du premier quadrant de l'atlas de l'ombre." #: doc/classes/Viewport.xml msgid "The subdivision amount of the second quadrant on the shadow atlas." msgstr "" +"La quantité de sous-division du deuxième quadrant de l'atlas de l'ombre." #: doc/classes/Viewport.xml msgid "The subdivision amount of the third quadrant on the shadow atlas." msgstr "" +"La quantité de sous-division du troisième quadrant de l'atlas de l'ombre." #: doc/classes/Viewport.xml msgid "The subdivision amount of the fourth quadrant on the shadow atlas." msgstr "" +"La quantité de sous-division du quatrième quadrant de l'atlas de l'ombre." #: doc/classes/Viewport.xml msgid "" @@ -81729,10 +84178,15 @@ msgid "" "The width and height of viewport. Must be set to a value greater than or " "equal to 2 pixels on both dimensions. Otherwise, nothing will be displayed." msgstr "" +"La largeur et la hauteur de la fenêtre d'affichage. Doit être défini à une " +"valeur supérieure ou égale à 2 pixels dans les deux dimensions. Sinon, rien " +"ne sera affiché." #: doc/classes/Viewport.xml msgid "If [code]true[/code], the size override affects stretch as well." msgstr "" +"Si [code]true[/code], la surcharge de la taille affecte également " +"l'étirement." #: doc/classes/Viewport.xml msgid "" @@ -81765,6 +84219,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "The custom [World] which can be used as 3D environment source." msgstr "" +"Le [World] personnalisé qui peut être utilisée comme source d'environnement " +"en 3D." #: doc/classes/Viewport.xml msgid "The custom [World2D] which can be used as 2D environment source." @@ -81781,6 +84237,9 @@ msgid "" "Emitted when the size of the viewport is changed, whether by [method " "set_size_override], resize of window, or some other means." msgstr "" +"Émis lorsque la taille de la fenpetre d'affichage a changé, que ce soit par " +"[method set_size_override], en redimensionnant la fenêtre, ou par d'autres " +"moyens." #: doc/classes/Viewport.xml msgid "Do not update the render target." @@ -81797,6 +84256,8 @@ msgstr "" msgid "" "Update the render target only when it is visible. This is the default value." msgstr "" +"Met à jour la cible de rendu seulement quand elle est visible. C'est la " +"valeur par défaut." #: doc/classes/Viewport.xml msgid "Always update the render target." @@ -81804,11 +84265,11 @@ msgstr "Met toujours à jour la cible de rendu." #: doc/classes/Viewport.xml msgid "This quadrant will not be used." -msgstr "" +msgstr "Ce quadrant ne sera pas utilisé." #: doc/classes/Viewport.xml msgid "This quadrant will only be used by one shadow map." -msgstr "" +msgstr "Ce quadrant ne sera utilisé que par une seule carte d'ombre." #: doc/classes/Viewport.xml msgid "This quadrant will be split in 4 and used by up to 4 shadow maps." @@ -82283,8 +84744,8 @@ msgid "" "Returns [code]true[/code] when the specified layer is enabled in [member " "layers] and [code]false[/code] otherwise." msgstr "" -"Retourne [code]true[/code] si le calque spécifié est actif, ou " -"[code]false[/code] sinon." +"Retourne [code]true[/code] si le calque spécifié est actif, ou [code]false[/" +"code] sinon." #: doc/classes/VisualInstance.xml msgid "" @@ -82502,8 +84963,8 @@ msgid "" "target node can have only one sequence port." msgstr "" "Connecte deux ports d'une séquence. L'exécution passera de " -"[code]from_output[/code] de [code]from_node[/code] vers [code]to_node[/code]." -"\n" +"[code]from_output[/code] de [code]from_node[/code] vers [code]to_node[/" +"code].\n" "Contrairement à [method data_connect], il n'y a pas ∂e [code]to_port[/code], " "puisque le nÅ“ud cible ne peut avoir qu'un seul port dans la séquence." @@ -82555,8 +85016,8 @@ msgid "" "A Visual Script node representing a constant from base types, such as " "[constant Vector3.AXIS_X]." msgstr "" -"Un nÅ“ud Visual Script représentant une constante des types de base, comme [" -"constant Vector3.AXIS_X]." +"Un nÅ“ud Visual Script représentant une constante des types de base, comme " +"[constant Vector3.AXIS_X]." #: modules/visual_script/doc_classes/VisualScriptBasicTypeConstant.xml msgid "The type to get the constant from." @@ -82739,8 +85200,8 @@ msgid "" "the third input. Uses the formula [code]a + (a - b) * t[/code]." msgstr "" "Retourner un nombre linéairement interpolé entre les deux premières entrées, " -"basé sur la troisième entrée. Utilise la formule [code]a + (a - b) * " -"t[/code]." +"basé sur la troisième entrée. Utilise la formule [code]a + (a - b) * t[/" +"code]." #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml msgid "Moves the number toward a value, based on the third input." @@ -83365,8 +85826,8 @@ msgid "" "The mode for RPC calls. See [method Node.rpc] for more details and [enum " "RPCCallMode] for available options." msgstr "" -"Le mode pour les appels RPC. Voir [method Node.rpc] pour plus de détails et [" -"enum RPCCallMode] pour les options disponibles." +"Le mode pour les appels RPC. Voir [method Node.rpc] pour plus de détails et " +"[enum RPCCallMode] pour les options disponibles." #: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml msgid "" @@ -83840,8 +86301,8 @@ msgid "" "The node path to use when [member set_mode] is set to [constant " "CALL_MODE_NODE_PATH]." msgstr "" -"Le chemin du nÅ“ud à utiliser lorsque [member set_mode] est défini à [" -"constant CALL_MODE_NODE_PATH]." +"Le chemin du nÅ“ud à utiliser lorsque [member set_mode] est défini à " +"[constant CALL_MODE_NODE_PATH]." #: modules/visual_script/doc_classes/VisualScriptPropertyGet.xml msgid "" @@ -83913,7 +86374,8 @@ msgstr "" #: modules/visual_script/doc_classes/VisualScriptPropertySet.xml msgid "" "The name of the property to set. Changing this will clear [member index]." -msgstr "Le nom de la propriété à définir. Changer cela effecera [member index]." +msgstr "" +"Le nom de la propriété à définir. Changer cela effecera [member index]." #: modules/visual_script/doc_classes/VisualScriptPropertySet.xml msgid "" @@ -84290,7 +86752,8 @@ msgstr "Un signal depuis cet [Object] sera utilisé." #: modules/visual_script/doc_classes/VisualScriptYieldSignal.xml msgid "A signal from the given [Node] in the scene tree will be used." -msgstr "Un signal du [Node] donné dans l'arborescence de la scène sera utilisé." +msgstr "" +"Un signal du [Node] donné dans l'arborescence de la scène sera utilisé." #: modules/visual_script/doc_classes/VisualScriptYieldSignal.xml msgid "A signal from an instanced node with the given type will be used." @@ -84340,8 +86803,8 @@ msgid "" "Sets margin size, where black bars (or images, if [method " "black_bars_set_images] was used) are rendered." msgstr "" -"Définit la taille de la marge, où des barres noires (ou des images, si [" -"method black_bars_set_images] est utilisé) sont rendues." +"Définit la taille de la marge, où des barres noires (ou des images, si " +"[method black_bars_set_images] est utilisé) sont rendues." #: doc/classes/VisualServer.xml msgid "" @@ -84699,7 +87162,7 @@ msgid "" "texture_scale]." msgstr "" "Définit le facteur d'échelle de la texture de lumière. Équivalent à [member " -"Light2D.texture_scale]" +"Light2D.texture_scale]." #: doc/classes/VisualServer.xml msgid "" @@ -84925,7 +87388,7 @@ msgid "" "Environment.background_sky_custom_fov]." msgstr "" "Définit un angle de vue personnalisé pour le ciel [Sky] en arrière-plan. " -"Équivalent à [member Environnement.background_sky_custom_fov]" +"Équivalent à [member Environnement.background_sky_custom_fov]." #: doc/classes/VisualServer.xml msgid "" @@ -84933,7 +87396,7 @@ msgid "" "to [member Environment.background_sky_orientation]." msgstr "" "Définit la rotation du ciel [Sky] en arrière-plan exprimé avec une [Basis]. " -"Équivalent à [member Environnement.background_sky_orientation]" +"Équivalent à [member Environnement.background_sky_orientation]." #: doc/classes/VisualServer.xml msgid "" @@ -85006,8 +87469,8 @@ msgid "" "[b]Note:[/b] When running a headless or server binary, this function returns " "an empty string." msgstr "" -"Retourne le vendeur de l'adaptateur vidéo (par exemple \"NVIDIA Corporation\"" -").\n" +"Retourne le vendeur de l'adaptateur vidéo (par exemple \"NVIDIA " +"Corporation\").\n" "[b]Note :[/b] Lors de l'exécution d'une version sans graphique ou de " "serveur, cette fonction retourne une chaîne vide." @@ -85060,16 +87523,16 @@ msgid "" "Returns the dynamic range set for this GI probe. Equivalent to [member " "GIProbe.dynamic_range]." msgstr "" -"Retourne la gamme dynamique pour cette sonde GI. Équivalent à [member GIProbe" -".dynamic_range]" +"Retourne la gamme dynamique pour cette sonde GI. Équivalent à [member " +"GIProbe.dynamic_range]." #: doc/classes/VisualServer.xml msgid "" "Returns the energy multiplier for this GI probe. Equivalent to [member " "GIProbe.energy]." msgstr "" -"Retourne le multiplicateur d'énergie pour cette sonde GI. Équivalent à [" -"member GIProbe.energy]" +"Retourne le multiplicateur d'énergie pour cette sonde GI. Équivalent à " +"[member GIProbe.energy]." #: doc/classes/VisualServer.xml msgid "" @@ -85083,7 +87546,7 @@ msgid "" "GIProbe.propagation]." msgstr "" "Retourne la valeur de propagation de cette sonde GI. Équivalent à [member " -"GIProbe.propagation]" +"GIProbe.propagation]." #: doc/classes/VisualServer.xml msgid "Returns the Transform set by [method gi_probe_set_to_cell_xform]." @@ -85095,7 +87558,7 @@ msgid "" "is compressed. Equivalent to [member GIProbe.compress]." msgstr "" "Retourne [code]true[/code] si les données de cette sonde GI sont " -"compressées. Équivalent à [member GIProbe.compress]" +"compressées. Équivalent à [member GIProbe.compress]." #: doc/classes/VisualServer.xml msgid "" @@ -85741,12 +88204,10 @@ msgstr "" "utilisant la [method instance_set_base] utilisant le RID retourné." #: doc/classes/VisualServer.xml -#, fuzzy msgid "Returns a mesh's blend shape count." msgstr "Retourne le nombre de formes de mélange d’un maillage." #: doc/classes/VisualServer.xml -#, fuzzy msgid "Returns a mesh's blend shape mode." msgstr "Retourne le mode de forme de mélange d’un maillage." @@ -85763,7 +88224,6 @@ msgid "Removes a mesh's surface." msgstr "Supprime la surface d'un maillage." #: doc/classes/VisualServer.xml -#, fuzzy msgid "Sets a mesh's blend shape count." msgstr "Définit le nombre de formes de mélange d’un maillage." @@ -86907,11 +89367,13 @@ msgstr "Nombre de poids / os par sommet." #: doc/classes/VisualServer.xml msgid "The minimum Z-layer for canvas items." -msgstr "Le niveau minimal du calque de profondeur pour les éléments de canevas." +msgstr "" +"Le niveau minimal du calque de profondeur pour les éléments de canevas." #: doc/classes/VisualServer.xml msgid "The maximum Z-layer for canvas items." -msgstr "Le niveau maximal du calque de profondeur pour les éléments de canevas." +msgstr "" +"Le niveau maximal du calque de profondeur pour les éléments de canevas." #: doc/classes/VisualServer.xml msgid "" @@ -87079,6 +89541,12 @@ msgid "Flag used to mark an index array." msgstr "Le drapeau utilisé pour marquer un tableau d’index." #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" +"Drapeau utilisé pour marquer un tableau compressé (demi flottant) de " +"couleurs." + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -89273,7 +91741,6 @@ msgstr "" "ignorant la dernière ligne et colonne de la transformation." #: doc/classes/VisualShaderNodeUniform.xml -#, fuzzy msgid "A base type for the uniforms within the visual shader graph." msgstr "Le type de base pour les uniformes dans le graphe du Visual Shader." @@ -89822,10 +92289,13 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +#, fuzzy +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" -"Retourne le [Object] que cette référence faible ([code]weakref[/code]) " -"contient." +"Retourne la valeur initiale de la propriété spécifiée. Retourne [code]null[/" +"code] si la propriété n'existe pas." #: modules/webrtc/doc_classes/WebRTCDataChannel.xml msgid "Closes this data channel, notifying the other peer." diff --git a/doc/translations/gl.po b/doc/translations/gl.po index 207a818761..4ad17bba17 100644 --- a/doc/translations/gl.po +++ b/doc/translations/gl.po @@ -541,8 +541,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -552,7 +553,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -606,7 +608,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -618,7 +621,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1033,10 +1037,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4847,19 +4856,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4880,21 +4891,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4903,9 +4918,10 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -5557,9 +5573,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -5733,8 +5749,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -6445,7 +6461,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -6682,7 +6703,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -7330,7 +7356,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -8736,8 +8770,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8788,10 +8823,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9033,12 +9078,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9584,7 +9623,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9745,12 +9789,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9898,6 +9946,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10038,7 +10101,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11716,7 +11782,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11809,7 +11875,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11837,9 +11905,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12336,13 +12404,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -12368,8 +12437,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12682,12 +12753,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12732,8 +12803,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12781,8 +12854,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12844,7 +12920,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12969,7 +13045,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -13674,17 +13753,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -13991,12 +14070,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14033,12 +14113,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -15198,7 +15279,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -15224,7 +15313,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -15965,7 +16058,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18690,7 +18785,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18839,16 +18936,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -18993,18 +19091,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23908,8 +23994,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24529,7 +24619,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26113,10 +26205,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27523,8 +27618,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -29824,11 +29919,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30673,7 +30771,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30685,6 +30787,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33042,14 +33154,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33057,21 +33169,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34347,8 +34459,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -34393,7 +34509,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -34648,9 +34767,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35109,7 +35228,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36221,7 +36342,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37036,13 +37157,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40706,7 +40839,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46070,7 +46205,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46309,7 +46446,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47038,7 +47177,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49719,8 +49862,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53296,11 +53450,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -53737,7 +53895,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53881,13 +54041,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -54210,6 +54376,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -54222,7 +54400,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55077,7 +55258,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55696,6 +55880,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56030,7 +56222,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57463,7 +57657,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58728,6 +58922,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -58789,6 +58986,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -58811,7 +59011,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -59948,6 +60151,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -59977,6 +60184,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60018,7 +60229,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -61368,37 +61581,38 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61417,14 +61631,15 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61435,14 +61650,14 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" @@ -61455,7 +61670,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" @@ -61463,7 +61678,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61475,13 +61690,13 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." +"[code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61493,17 +61708,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -61516,9 +61733,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -61526,8 +61743,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -61542,7 +61759,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -61560,15 +61777,17 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61580,29 +61799,33 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61630,87 +61853,87 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -64883,21 +65106,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64910,7 +65137,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -64939,7 +65166,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -64949,22 +65208,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -64977,8 +65249,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65176,16 +65450,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -71279,6 +71553,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -73815,7 +74093,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/hi.po b/doc/translations/hi.po index 2df4b9bbe4..945befe58b 100644 --- a/doc/translations/hi.po +++ b/doc/translations/hi.po @@ -5,12 +5,13 @@ # # harvinder rathor <harvinderr09@gmail.com>, 2021. # Lalita mishra <yashkebacche1234@gmail.com>, 2022. +# Yan Chen <cyan97087@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-02-03 13:04+0000\n" -"Last-Translator: Lalita mishra <yashkebacche1234@gmail.com>\n" +"PO-Revision-Date: 2022-08-21 06:02+0000\n" +"Last-Translator: Yan Chen <cyan97087@gmail.com>\n" "Language-Team: Hindi <https://hosted.weblate.org/projects/godot-engine/godot-" "class-reference/hi/>\n" "Language: hi\n" @@ -18,7 +19,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.11-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -61,7 +62,6 @@ msgid "Method Descriptions" msgstr "Method Descriptions" #: doc/tools/make_rst.py -#, fuzzy msgid "Theme Property Descriptions" msgstr "थीम विशेषता" @@ -540,8 +540,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -551,7 +552,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -605,7 +607,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -617,7 +620,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1032,10 +1036,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4846,19 +4855,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4879,21 +4890,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4902,9 +4917,10 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -5556,9 +5572,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -5732,8 +5748,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -6444,7 +6460,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -6681,7 +6702,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -7329,7 +7355,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -8735,8 +8769,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8787,10 +8822,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9032,12 +9077,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9583,7 +9622,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9744,12 +9788,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9897,6 +9945,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10037,7 +10100,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11715,7 +11781,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11808,7 +11874,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11836,9 +11904,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12335,13 +12403,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -12367,8 +12436,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12681,12 +12752,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12731,8 +12802,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12780,8 +12853,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12843,7 +12919,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12968,7 +13044,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -13673,17 +13752,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -13990,12 +14069,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14032,12 +14112,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -15197,7 +15278,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -15223,7 +15312,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -15964,7 +16057,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18689,7 +18784,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18838,16 +18935,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -18992,18 +19090,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23907,8 +23993,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24528,7 +24618,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26112,10 +26204,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27522,8 +27617,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -29823,11 +29918,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30672,7 +30770,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30684,6 +30786,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33041,14 +33153,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33056,21 +33168,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34346,8 +34458,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -34392,7 +34508,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -34647,9 +34766,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35108,7 +35227,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36220,7 +36341,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37035,13 +37156,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40705,7 +40838,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46069,7 +46204,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46308,7 +46445,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47037,7 +47176,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49718,8 +49861,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53295,11 +53449,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -53736,7 +53894,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53880,13 +54040,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -54209,6 +54375,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -54221,7 +54399,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55076,7 +55257,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55695,6 +55879,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56029,7 +56221,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57462,7 +57656,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58727,6 +58921,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -58788,6 +58985,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -58810,7 +59010,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -59947,6 +60150,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -59976,6 +60183,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60017,7 +60228,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -61367,37 +61580,38 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61416,14 +61630,15 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61434,14 +61649,14 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" @@ -61454,7 +61669,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" @@ -61462,7 +61677,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61474,13 +61689,13 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." +"[code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61492,17 +61707,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -61515,9 +61732,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -61525,8 +61742,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -61541,7 +61758,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -61559,15 +61776,17 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61579,29 +61798,33 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61629,87 +61852,87 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -64882,21 +65105,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64909,7 +65136,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -64938,7 +65165,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -64948,22 +65207,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -64976,8 +65248,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65175,16 +65449,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -71278,6 +71552,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -73814,7 +74092,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/hu.po b/doc/translations/hu.po index 221206451a..a962de15e5 100644 --- a/doc/translations/hu.po +++ b/doc/translations/hu.po @@ -11,12 +11,13 @@ # Balázs Püspök-Kiss <pkblazsak@gmail.com>, 2021. # Szevin <kevingeiger25@gmail.com>, 2022. # 6Leoo6 <leo.takacs@yahoo.com>, 2022. +# thekeymethod <csokan.andras87@protonmail.ch>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-06-19 11:54+0000\n" -"Last-Translator: 6Leoo6 <leo.takacs@yahoo.com>\n" +"PO-Revision-Date: 2022-09-12 01:18+0000\n" +"Last-Translator: thekeymethod <csokan.andras87@protonmail.ch>\n" "Language-Team: Hungarian <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/hu/>\n" "Language: hu\n" @@ -24,7 +25,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.13.1-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -559,8 +560,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -570,7 +572,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -624,7 +627,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -636,7 +640,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1051,10 +1056,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4865,19 +4875,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4898,21 +4910,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4921,9 +4937,10 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -5575,9 +5592,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -5751,8 +5768,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -6463,7 +6480,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -6700,7 +6722,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -7348,7 +7375,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -8754,8 +8789,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8806,10 +8842,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9051,12 +9097,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9602,7 +9642,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9763,12 +9808,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9916,6 +9965,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10056,7 +10120,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11734,7 +11801,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11827,7 +11894,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11855,9 +11924,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12354,13 +12423,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -12386,8 +12456,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12700,12 +12772,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12750,8 +12822,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12799,8 +12873,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12862,7 +12939,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12987,7 +13064,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -13692,17 +13772,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -14009,12 +14089,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14051,12 +14132,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -15216,7 +15298,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -15242,7 +15332,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -15983,7 +16077,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18708,7 +18804,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18857,16 +18955,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19011,18 +19110,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23926,8 +24013,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24547,7 +24638,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26131,10 +26224,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27541,8 +27637,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -29842,11 +29938,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30691,7 +30790,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30703,6 +30806,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33060,14 +33173,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33075,21 +33188,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34365,8 +34478,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -34411,7 +34528,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -34666,9 +34786,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35127,7 +35247,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36239,7 +36361,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37054,13 +37176,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40724,7 +40858,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46088,7 +46224,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46327,7 +46465,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47056,7 +47196,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49737,8 +49881,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53314,11 +53469,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -53755,7 +53914,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53899,13 +54060,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -54228,6 +54395,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -54240,7 +54419,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55095,7 +55277,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55714,6 +55899,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56048,7 +56241,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57481,7 +57676,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58746,6 +58941,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -58807,6 +59005,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -58829,7 +59030,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -59966,6 +60170,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -59995,6 +60203,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60036,7 +60248,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -61386,37 +61600,38 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61435,14 +61650,15 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61453,14 +61669,14 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" @@ -61473,7 +61689,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" @@ -61481,7 +61697,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61493,13 +61709,13 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." +"[code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61511,17 +61727,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -61534,9 +61752,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -61544,8 +61762,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -61560,7 +61778,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -61578,15 +61796,17 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61598,29 +61818,33 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61648,87 +61872,87 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -64901,21 +65125,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64928,7 +65156,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -64957,7 +65185,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -64967,22 +65227,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -64995,8 +65268,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65194,16 +65469,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -71297,6 +71572,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -73833,7 +74112,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml @@ -75256,3 +75537,5 @@ msgstr "" msgid "" "If [code]true[/code], child nodes are sorted, otherwise sorting is disabled." msgstr "" +"Ha [code]true[/code], az al-csomópontok rendezve vannak, egyébként a sorba " +"rendezés kikapcsolva." diff --git a/doc/translations/id.po b/doc/translations/id.po index 39310a6160..249ed80079 100644 --- a/doc/translations/id.po +++ b/doc/translations/id.po @@ -16,12 +16,13 @@ # Reza Almanda <rezaalmanda27@gmail.com>, 2022. # Tsaqib Fadhlurrahman Soka <sokatsaqib@gmail.com>, 2022. # yusuf afandi <afandi.yusuf.04@gmail.com>, 2022. +# Yan Chen <cyan97087@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-07-09 21:12+0000\n" -"Last-Translator: yusuf afandi <afandi.yusuf.04@gmail.com>\n" +"PO-Revision-Date: 2022-08-14 04:02+0000\n" +"Last-Translator: Yan Chen <cyan97087@gmail.com>\n" "Language-Team: Indonesian <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/id/>\n" "Language: id\n" @@ -29,7 +30,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.13.1-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -134,13 +135,12 @@ msgstr "" "dipanggil langsung menggunakan nama class." #: doc/tools/make_rst.py -#, fuzzy msgid "" "This method describes a valid operator to use with this type as left-hand " "operand." msgstr "" -"Metode ini menjelaskan operator yang valid untuk digunakan dengan jenis ini " -"sebagai nilai pembilang." +"Metode ini menjelaskan operator yang valid untuk digunakan dengan tipe ini " +"sebagai operan kiri." #: modules/gdscript/doc_classes/@GDScript.xml msgid "Built-in GDScript functions." @@ -317,7 +317,6 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Returns the arc tangent of [code]y/x[/code] in radians. Use to get the angle " "of tangent [code]y/x[/code]. To compute the value, the method takes into " @@ -327,13 +326,13 @@ msgid "" "a = atan2(0, -1) # a is 3.141593\n" "[/codeblock]" msgstr "" -"Mengembalikan tangen busur [code]y/x[/code] dalam radian. Gunakan untuk " -"mendapatkan sudut tangen [kode]y/x[/kode]. Untuk menghitung nilai, metode " -"memperhitungkan tanda dari kedua argumen untuk menentukan kuadran.\n" +"Mengembalikan tangen busur dari [code]y/x[/code] dalam radian. Gunakan untuk " +"mendapatkan sudut tangen [code]y/x[/code]. Untuk menghitung nilai, metode " +"ini memperhitungkan tanda kedua argumen untuk menentukan kuadran.\n" "Catatan penting: Koordinat Y didahulukan, berdasarkan konvensi.\n" -"[blok kode]\n" +"[codeblock]\n" "a = atan2(0, -1) # a adalah 3.141593\n" -"[/blok kode]" +"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -789,8 +788,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -800,7 +800,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -880,7 +881,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -892,7 +894,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1434,19 +1437,18 @@ msgid "" msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" -"Memetakan sebuah [code] nilai[/code] dari jangkauan [code][istart, istop][/" -"code] ke [code][ostart, ostop][/code].\n" -"[codeblock]\n" -"range_lerp(75, 0, 100, -1, 1) # Mengembalikan 0.5\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -5263,19 +5265,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -5296,21 +5300,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -5320,9 +5328,10 @@ msgstr "Mengembalikan nilai hiperbolik tangen dari parameter." #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -5974,9 +5983,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -6150,8 +6159,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -6862,7 +6871,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -7099,7 +7113,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -7747,7 +7766,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -9153,8 +9180,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -9205,10 +9233,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9450,12 +9488,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -10001,7 +10033,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10162,12 +10199,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10315,6 +10356,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10455,7 +10511,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -12133,7 +12192,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -12226,7 +12285,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -12254,9 +12315,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12754,13 +12815,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -12786,8 +12848,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -13100,12 +13164,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13150,8 +13214,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -13199,8 +13265,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -13262,7 +13331,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13387,7 +13456,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -14092,17 +14164,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -14409,12 +14481,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14451,12 +14524,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -15616,7 +15690,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -15642,7 +15724,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -16383,7 +16469,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -19108,7 +19196,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -19257,16 +19347,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19411,18 +19502,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -24332,8 +24411,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24954,7 +25037,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26542,10 +26627,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27953,8 +28041,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -30254,11 +30342,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -31103,7 +31194,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -31115,6 +31210,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33472,14 +33577,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33487,22 +33592,26 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "Mengembalikan nilai hiperbolik tangen dari parameter." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "Mengembalikan nilai hiperbolik tangen dari parameter." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "Mengembalikan nilai hiperbolik tangen dari parameter." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." -msgstr "" +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." +msgstr "Mengembalikan nilai hiperbolik tangen dari parameter." #: doc/classes/Line2D.xml msgid "" @@ -34777,8 +34886,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -34823,7 +34936,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -35078,9 +35194,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35540,7 +35656,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36671,7 +36789,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37489,13 +37607,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -41162,7 +41292,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46543,7 +46675,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "Mengembalikan nilai hiperbolik tangen dari parameter." #: doc/classes/PopupMenu.xml @@ -46782,7 +46916,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47511,7 +47647,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -50192,8 +50332,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53770,11 +53921,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -54211,7 +54366,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -54355,13 +54512,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -54684,6 +54847,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -54696,7 +54871,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55551,7 +55729,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -56170,6 +56351,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56504,7 +56693,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57937,7 +58128,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -59204,6 +59395,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -59265,6 +59459,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -59287,7 +59484,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60424,6 +60624,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Mengembalikan nilai hiperbolik tangen dari parameter." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60453,6 +60658,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Mengembalikan nilai hiperbolik tangen dari parameter." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60494,7 +60704,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -61847,38 +62059,44 @@ msgid "Clears all values on the theme." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Mengembalikan nilai hiperbolik tangen dari parameter." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Mengembalikan nilai hiperbolik tangen dari parameter." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Mengembalikan nilai hiperbolik tangen dari parameter." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." -msgstr "" +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." +msgstr "Mengembalikan nilai hiperbolik tangen dari parameter." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Mengembalikan nilai hiperbolik tangen dari parameter." #: doc/classes/Theme.xml msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61896,15 +62114,17 @@ msgid "Sets the theme's values to a copy of a given theme." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Mengembalikan nilai hiperbolik tangen dari parameter." #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61914,15 +62134,16 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Mengembalikan nilai hiperbolik tangen dari parameter." #: doc/classes/Theme.xml msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" @@ -61935,7 +62156,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" @@ -61943,7 +62164,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61953,15 +62174,16 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." -msgstr "" +"[code]theme_type[/code]." +msgstr "Mengembalikan nilai hiperbolik tangen dari parameter." #: doc/classes/Theme.xml msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61973,17 +62195,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -61996,9 +62220,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -62006,8 +62230,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -62022,7 +62246,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -62040,15 +62264,17 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -62060,29 +62286,33 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -62110,87 +62340,87 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -65364,21 +65594,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65391,7 +65625,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65420,7 +65654,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65430,22 +65696,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65458,8 +65737,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65657,16 +65938,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -71765,6 +72046,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -74302,7 +74587,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/is.po b/doc/translations/is.po index e3080abf39..2facd468d9 100644 --- a/doc/translations/is.po +++ b/doc/translations/is.po @@ -540,8 +540,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -551,7 +552,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -605,7 +607,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -617,7 +620,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1032,10 +1036,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4846,19 +4855,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4879,21 +4890,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4902,9 +4917,10 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -5556,9 +5572,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -5732,8 +5748,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -6444,7 +6460,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -6681,7 +6702,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -7329,7 +7355,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -8735,8 +8769,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8787,10 +8822,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9032,12 +9077,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9583,7 +9622,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9744,12 +9788,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9897,6 +9945,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10037,7 +10100,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11715,7 +11781,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11808,7 +11874,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11836,9 +11904,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12335,13 +12403,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -12367,8 +12436,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12681,12 +12752,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12731,8 +12802,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12780,8 +12853,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12843,7 +12919,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12968,7 +13044,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -13673,17 +13752,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -13990,12 +14069,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14032,12 +14112,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -15197,7 +15278,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -15223,7 +15312,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -15964,7 +16057,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18689,7 +18784,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18838,16 +18935,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -18992,18 +19090,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23907,8 +23993,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24528,7 +24618,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26112,10 +26204,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27522,8 +27617,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -29823,11 +29918,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30672,7 +30770,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30684,6 +30786,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33041,14 +33153,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33056,21 +33168,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34346,8 +34458,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -34392,7 +34508,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -34647,9 +34766,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35108,7 +35227,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36220,7 +36341,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37035,13 +37156,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40705,7 +40838,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46069,7 +46204,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46308,7 +46445,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47037,7 +47176,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49718,8 +49861,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53295,11 +53449,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -53736,7 +53894,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53880,13 +54040,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -54209,6 +54375,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -54221,7 +54399,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55076,7 +55257,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55695,6 +55879,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56029,7 +56221,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57462,7 +57656,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58727,6 +58921,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -58788,6 +58985,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -58810,7 +59010,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -59947,6 +60150,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -59976,6 +60183,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60017,7 +60228,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -61367,37 +61580,38 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61416,14 +61630,15 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61434,14 +61649,14 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" @@ -61454,7 +61669,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" @@ -61462,7 +61677,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61474,13 +61689,13 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." +"[code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61492,17 +61707,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -61515,9 +61732,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -61525,8 +61742,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -61541,7 +61758,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -61559,15 +61776,17 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61579,29 +61798,33 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61629,87 +61852,87 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -64882,21 +65105,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64909,7 +65136,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -64938,7 +65165,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -64948,22 +65207,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -64976,8 +65248,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65175,16 +65449,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -71278,6 +71552,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -73814,7 +74092,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/it.po b/doc/translations/it.po index e07c906b29..ed4ec9ddc7 100644 --- a/doc/translations/it.po +++ b/doc/translations/it.po @@ -30,8 +30,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-07-31 16:43+0000\n" -"Last-Translator: Mirko <miknsop@gmail.com>\n" +"PO-Revision-Date: 2022-09-14 18:45+0000\n" +"Last-Translator: Federico Caprini <caprinifede@gmail.com>\n" "Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/it/>\n" "Language: it\n" @@ -39,7 +39,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -62,7 +62,6 @@ msgid "Theme Properties" msgstr "Proprietà del tema" #: doc/tools/make_rst.py -#, fuzzy msgid "Signals" msgstr "Segnali" @@ -211,7 +210,6 @@ msgstr "" "I nomi dei colori supportati sono uguali alle costanti definite in [Color]." #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Returns the absolute value of parameter [code]s[/code] (i.e. positive " "value).\n" @@ -514,7 +512,6 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Compares two values by checking their actual contents, recursing into any " "[Array] or [Dictionary] up to its deepest level.\n" @@ -535,7 +532,7 @@ msgid "" "code]." msgstr "" "Paragona due valori controllando il loro contenuto attuale, ricorrendo in " -"ogni `Array` o `Dictionary` fino al suo livello più profondo.\n" +"ogni [Array] o [Dictionary] fino al suo livello più profondo.\n" "Questo è simile a [code]==[/code] su molti aspetti:\n" "- Per [code]null[/code] , [code]int[/code], [code]float[/code], " "[code]String[/code], [code]Object[/code] and [code]RID[/code] sia " @@ -573,7 +570,6 @@ msgstr "" "in una istanza. Utile per la deserializzazione." #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Returns an \"eased\" value of [code]x[/code] based on an easing function " "defined with [code]curve[/code]. This easing function is based on an " @@ -848,8 +844,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -859,13 +856,18 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" "Ritorna un'interpolazione o un fattore estrapolato considerando il raggio " "specificato nel [code]from[/code] e [code]to[/code], e i valori interpolati " "specificati in [code]weight[/code]. Il valore di ritorno sarà in mezzo tra " "[code]0.0[/code] e [code]1.0[/code] se [code]weight[/code] si trova tra " -"[code]from[/code] e [code]to[/code] (inclusi).\n" +"[code]from[/code] e [code]to[/code] (inclusi). Se [code]weight[/code] si " +"trova fuori portata, allora un fattore di estrapolazione verrà ritornato " +"(ritorna un valore minore di [code]0.0[/code] o maggiore di [code]1.0[/" +"code]). Usa [method clamp] sul risultato di [method inverse_lerp] se è un " +"risultato non desiderato.\n" "[codeblock]\n" "# Il rapporto di interpolazione nella chiamata di `lerp()` è minore di " "0.75.\n" @@ -951,7 +953,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -963,7 +966,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" "Interpola linearmente tra due valori mediante un valore definito in " "[code]weight[/code]. Per interpolare, [code]weight[/code] dovrebbe rimanere " @@ -1640,20 +1644,57 @@ msgid "" "3\n" "[/codeblock]" msgstr "" +"Ritorna un array contenente l'intervallo dato. [method range] può essere " +"chiamato in tre modi:\n" +"[code]range(n:int)[/code]: Parte da 0, incrementa di 1 a ogni passaggio, e " +"si ferma [i]prima di[/i][code]n[/code]. L'argomento [code]n[/code] è " +"[b]esclusivo[/b].\n" +"[code]range(b: int, n: int)[/code]: Parte da [code]b[/code], incrementa di 1 " +"ad ogni passaggio, e si ferma [i]prima di[/i][code]n[/code].Gli argomenti " +"[code]b[/code] e [code]n[/code] sono, rispettivamente, [b]inclusivo[/b] ed " +"[b]esclusivo[/b].\n" +"[code]range(b: int, n: int, s: int)[/code]: Parte da [code]b[/code], aumenta/" +"diminuisce di [code]s[/code] ad ogni passaggio, e si ferma [i]prima di[/i]" +"[code]n[/code]. Gli argomenti [code]b[/code] e [code]n[/code] sono, " +"rispettivamente, [b]inclusivi[/b] ed [b]esclusivi[/b]. L'argomento [code]s[/" +"code] [b]può[/b] essere negativo, ma non [code]0[/code]. Se [code]s[/code] è " +"[code]0[/code], un messaggio di errore verrà stampato su schermo.\n" +"[method range] converte tutti gli argomenti a [int] prima di processarli.\n" +"[b]Nota:[/b] Ritorna un array vuoto se nessun valore soddisfa i requisiti " +"(es. [code]range(2, 5, -1)[/code] or [code]range(5, 5, 1)[/code]).\n" +"Esempi:\n" +"[codeblock]\n" +"print(range(4)) # Scrive [0, 1, 2, 3]\n" +"print(range(2, 5)) # Scrive [2, 3, 4]\n" +"print(range(0, 6, 2)) # Scrive [0, 2, 4]\n" +"print(range(4, 1, -1)) # Scrive [4, 3, 2]\n" +"[/codeblock]\n" +"Per iterare su un [Array] inverso, usare:\n" +"[codeblock]\n" +"var array = [3, 6, 9]\n" +"for i in range(array.size(), 0, -1):\n" +" print(array[i - 1])\n" +"[/codeblock]\n" +"Risultato:\n" +"[codeblock]\n" +"9\n" +"6\n" +"3\n" +"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" -"Effettua una mappatura di un valore [code]value[/code] da un intervallo " -"[code][istart, istop][/code] in [code][ostart, ostop][/code].\n" -"[codeblock]\n" -"range_lerp(75, 0, 100, -1, 1) # Restituisce 0.5\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -5848,19 +5889,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -5881,21 +5924,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -5905,9 +5952,10 @@ msgstr "Restituisce la tangente del parametro." #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -6559,9 +6607,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -6735,8 +6783,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -7463,7 +7511,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -7700,7 +7753,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -8348,7 +8406,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -9758,8 +9824,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -9810,10 +9877,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -10059,12 +10136,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -10610,7 +10681,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10771,12 +10847,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10927,6 +11007,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -11067,7 +11162,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -12749,7 +12847,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -12842,7 +12940,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -12870,9 +12970,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -13377,13 +13477,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -13409,8 +13510,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -13723,12 +13826,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13773,8 +13876,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -13822,8 +13927,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -13885,7 +13993,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -14010,7 +14118,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -14717,17 +14828,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -15035,12 +15146,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -15078,12 +15190,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -16300,7 +16413,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -16326,7 +16447,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -17071,7 +17196,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -19826,7 +19953,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -19975,16 +20104,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -20130,18 +20260,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml #, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "Restituisce l'arco-seno del parametro." @@ -25065,8 +25183,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -25690,7 +25812,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -27285,10 +27409,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -28711,8 +28838,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -31017,11 +31144,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -31869,7 +31999,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -31881,6 +32015,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -34256,14 +34400,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -34271,22 +34415,26 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "Restituisce il resto dei due vettori." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "Calcola il prodotto vettoriale di questo vettore e [code]b[/code]." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "Calcola il prodotto vettoriale di questo vettore e [code]with[/code]." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." -msgstr "" +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." +msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." #: doc/classes/Line2D.xml msgid "" @@ -35566,8 +35714,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -35612,7 +35764,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -35867,9 +36022,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -36330,7 +36485,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -37474,7 +37631,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -38308,13 +38465,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -41993,7 +42162,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -47400,7 +47571,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "Calcola il prodotto vettoriale di questo vettore e [code]with[/code]." #: doc/classes/PopupMenu.xml @@ -47639,7 +47812,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -48369,7 +48544,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51050,8 +51229,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -54636,11 +54826,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -55077,7 +55271,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -55223,13 +55419,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55552,6 +55754,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -55564,7 +55778,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -56419,7 +56636,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -57040,6 +57260,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -57374,7 +57602,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -58812,7 +59042,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -60082,6 +60312,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -60143,6 +60376,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -60165,7 +60401,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -61304,6 +61543,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Calcola il prodotto vettoriale di questo vettore e [code]b[/code]." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -61334,6 +61578,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Calcola il prodotto vettoriale di questo vettore e [code]b[/code]." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -61375,7 +61624,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -62750,42 +63001,44 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." #: doc/classes/Theme.xml #, fuzzy msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." #: doc/classes/Theme.xml #, fuzzy msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." #: doc/classes/Theme.xml #, fuzzy msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." #: doc/classes/Theme.xml #, fuzzy msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." -msgstr "" +"theme has [code]theme_type[/code]." +msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." #: doc/classes/Theme.xml msgid "" @@ -62804,15 +63057,17 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." -msgstr "" +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." +msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." #: doc/classes/Theme.xml msgid "" @@ -62823,16 +63078,17 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." #: doc/classes/Theme.xml msgid "" @@ -62843,16 +63099,17 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." -msgstr "" +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." +msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." #: doc/classes/Theme.xml msgid "" @@ -62864,14 +63121,15 @@ msgstr "" #, fuzzy msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." +"[code]theme_type[/code]." msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." -msgstr "" +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." +msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." #: doc/classes/Theme.xml msgid "" @@ -62882,17 +63140,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -62905,9 +63165,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -62915,8 +63175,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -62931,7 +63191,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -62951,18 +63211,23 @@ msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." #, fuzzy msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" "Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " "esiste, [code]false[/code] altrimenti." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" +"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " +"esiste, [code]false[/code] altrimenti." #: doc/classes/Theme.xml #, fuzzy @@ -62975,32 +63240,45 @@ msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." #, fuzzy msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" "Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " "esiste, [code]false[/code] altrimenti." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" +"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " +"esiste, [code]false[/code] altrimenti." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" +"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " +"esiste, [code]false[/code] altrimenti." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" +"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " +"esiste, [code]false[/code] altrimenti." #: doc/classes/Theme.xml #, fuzzy @@ -63028,90 +63306,113 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." -msgstr "" +msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." -msgstr "" +msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." -msgstr "" +msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." -msgstr "" +msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." -msgstr "" +msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " +"esiste, [code]false[/code] altrimenti." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " +"esiste, [code]false[/code] altrimenti." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " +"esiste, [code]false[/code] altrimenti." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " +"esiste, [code]false[/code] altrimenti." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " +"esiste, [code]false[/code] altrimenti." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " +"esiste, [code]false[/code] altrimenti." #: doc/classes/Theme.xml msgid "" @@ -66299,21 +66600,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -66326,7 +66631,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -66355,7 +66660,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -66365,22 +66702,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -66393,8 +66743,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -66601,17 +66953,16 @@ msgid "Unknown error." msgstr "Errore sconosciuto." #: modules/upnp/doc_classes/UPNPDevice.xml -#, fuzzy -msgid "UPNP device." -msgstr "Dispositivo UPNP." +msgid "Universal Plug and Play (UPnP) device." +msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -72766,6 +73117,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -75309,7 +75664,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/ja.po b/doc/translations/ja.po index fe76c741d0..f5217e9b83 100644 --- a/doc/translations/ja.po +++ b/doc/translations/ja.po @@ -814,6 +814,7 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Returns an interpolation or extrapolation factor considering the range " "specified in [code]from[/code] and [code]to[/code], and the interpolated " @@ -821,8 +822,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -832,7 +834,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" "[code]from[/code] 㨠[code]to[/code] ã§æŒ‡å®šã•れãŸç¯„囲ã¨ã€[code]weight[/code] " "ã§æŒ‡å®šã•れãŸè£œé–“値を考慮ã—ãŸã€è£œé–“ã¾ãŸã¯å¤–挿ã®ä¿‚æ•°ã‚’è¿”ã—ã¾ã™ã€‚[code]weight[/" @@ -918,12 +921,14 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Linearly interpolates between two values by the factor defined in " "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -935,7 +940,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" "ï¼’ã¤ã®å€¤ãŠã‚ˆã³æ£è¦åŒ–ã•れãŸå€¤ã‹ã‚‰ç·šå½¢è£œé–“ã—ã¾ã™ã€‚ã“れ㯠[method inverse_lerp] " "ã®é€†ã§ã™ã€‚\n" @@ -1598,16 +1604,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" -"範囲 [code][istart, istop][/code] ã®å€¤ [code]value[/code] ã‚’ã€ç¯„囲 [code]" -"[ostart, ostop][/code] ã¸ã¨ãƒžãƒƒãƒ—ã—ã¾ã™ã€‚\n" -"[codeblock]\n" -"range_lerp(75, 0, 100, -1, 1) # 0.5 ã¨è¿”ã™\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml #, fuzzy @@ -6218,24 +6224,22 @@ msgstr "" "åˆã«ã®ã¿æœ‰ç”¨ã§ã€ãã†ã§ãªã‘れã°ã‚¨ãƒ‡ã‚£ã‚¿ã¯è¿½åŠ ç”¨ãƒŽãƒ¼ãƒ‰ã‚’è¡¨ç¤ºã—ã¾ã›ã‚“。" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." -msgstr "ã“ã®ãƒŽãƒ¼ãƒ‰ã®ãƒ†ã‚ストã‚ャプションをå–å¾—ã—ã¾ã™ (特定ã®ã‚¨ãƒ‡ã‚£ã‚¿ã§ä½¿ç”¨)。" +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." +msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" -"åノードをインデックスã§å–å¾—ã—ã¾ã™ ([AnimationRootNode] を継承ã—ãŸã‚¨ãƒ‡ã‚£ã‚¿ã§" -"使用)。" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" -"ã™ã¹ã¦ã®åãƒŽãƒ¼ãƒ‰ã‚’é †ç•ªé€šã‚Šã« [code]name: node[/code] ã®è¾žæ›¸ã¨ã—ã¦å–å¾—ã—ã¾ã™ã€‚" -"[AnimationRootNode] を継承ã™ã‚‹å ´åˆã«ã®ã¿æœ‰ç”¨ã§ã™ã€‚" #: doc/classes/AnimationNode.xml msgid "" @@ -6256,16 +6260,21 @@ msgstr "" "ãƒãƒ¼ã‚«ãƒ«ãƒ¡ãƒ¢ãƒªã§ã€ä¸Žãˆã‚‰ã‚ŒãŸãƒªã‚½ãƒ¼ã‚¹ã¯è¤‡æ•°ã®ãƒ„リーã§å†åˆ©ç”¨ã§ãã¾ã™ã€‚" #: doc/classes/AnimationNode.xml +#, fuzzy msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" "特定ã®ãƒ‘ラメータã®ãƒ‡ãƒ•ォルト値をå–å¾—ã—ã¾ã™ã€‚パラメータã¯ãƒŽãƒ¼ãƒ‰ã«ä½¿ç”¨ã•れるカ" "スタムã®ãƒãƒ¼ã‚«ãƒ«ãƒ¡ãƒ¢ãƒªã§ã€ä¸Žãˆã‚‰ã‚ŒãŸãƒªã‚½ãƒ¼ã‚¹ã¯è¤‡æ•°ã®ãƒ„リーã§å†åˆ©ç”¨ã§ãã¾ã™ã€‚" #: doc/classes/AnimationNode.xml +#, fuzzy msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" @@ -6274,9 +6283,11 @@ msgstr "" "ã™ã€‚フォーマット㯠[method Object.get_property_list] ã«ä¼¼ã¦ã„ã¾ã™ã€‚" #: doc/classes/AnimationNode.xml +#, fuzzy msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" "ã“ã®ãƒŽãƒ¼ãƒ‰ã§ç·¨é›†ã™ã‚‹ãƒ•ィルターをã€ãƒ–レンドツリーエディタã«ã¦è¡¨ç¤ºã•ã›ãŸã„å ´åˆ" "㯠[code]true[/code] ã‚’è¿”ã™ã‚ˆã†ã«ã—ã¾ã™ã€‚" @@ -6288,10 +6299,12 @@ msgstr "" "指定ã—ãŸãƒ‘スãŒãƒ•ィルタリングã•れã¦ã„れ㰠[code]true[/code] ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/AnimationNode.xml +#, fuzzy msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -7089,9 +7102,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -7314,9 +7327,10 @@ msgstr "" "[code]animation[/code] ã®åå‰ã‚’è¿”ã—ã¾ã™ã€‚ã‚‚ã—ç„¡ã‘れã°ã€ç©ºã®æ–‡å—列を返ã—ã¾ã™ã€‚" #: doc/classes/AnimationPlayer.xml +#, fuzzy msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" "ã‚ー [code]name[/code] ã‚’æŒã¤ [Animation] ã‚’è¿”ã™ã‹ã€è¦‹ã¤ã‹ã‚‰ãªã„å ´åˆã¯ " "[code]null[/code] ã‚’è¿”ã—ã¾ã™ã€‚" @@ -8230,15 +8244,16 @@ msgid "3D area for detection and physics and audio influence." msgstr "検出ãŠã‚ˆã³2D物ç†ä½œç”¨ã®ãŸã‚ã®2Dエリアã§ã™ã€‚" #: doc/classes/Area.xml -#, fuzzy msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" -"[CollisionObject3D] ノードã®é‡ãªã‚Šåˆã„ã€é€²å…¥ã€é€€å‡ºã‚’検出ã™ã‚‹ãŸã‚ã®3Dエリアã§" -"ã™ã€‚ãƒãƒ¼ã‚«ãƒ«ç‰©ç†ãƒ‘ラメータ (gravity é‡åŠ›ã€damping 減衰) を変更ã—ãŸã‚Šä¸Šæ›¸ãã§" -"ãã¾ã™ã€‚" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml #: doc/classes/ViewportTexture.xml @@ -8574,15 +8589,16 @@ msgid "2D area for detection and physics and audio influence." msgstr "検出ãŠã‚ˆã³2D物ç†ä½œç”¨ã®ãŸã‚ã®2Dエリアã§ã™ã€‚" #: doc/classes/Area2D.xml -#, fuzzy msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" -"[CollisionObject2D] ノードã®é‡ãªã‚Šã€é€²å…¥ã€é€€å‡ºã‚’検出ã™ã‚‹ãŸã‚ã®2Dエリア。ã¾" -"ãŸã€ãƒãƒ¼ã‚«ãƒ«ã®ç‰©ç†ãƒ‘ラメータ (é‡åŠ›ã€æ¸›è¡°) ã‚’ã€å¤‰æ›´ã—ãŸã‚Šã‚ªãƒ¼ãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã—ãŸã‚Š" -"ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚" #: doc/classes/Area2D.xml msgid "Using Area2D" @@ -9501,7 +9517,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" "æ–°ã—ã„サーフェスを作æˆã—ã¾ã™ã€‚\n" "サーフェスã¯[code]primitive[/code]を使用ã—ã¦ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã•れるよã†ã«ä½œæˆã•" @@ -11197,8 +11221,9 @@ msgstr "" "オーディオãƒã‚¹ã®åŸºåº•リソース。リソースãŒé©ç”¨ã•れã¦ã„ã‚‹ãƒã‚¹ã«å¯¾ã—ã€ã‚ªãƒ¼ãƒ‡ã‚£ã‚ª" "エフェクトをé©ç”¨ã—ã¾ã™ã€‚" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -11258,10 +11283,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -11560,12 +11595,6 @@ msgstr "" "「耳ã–ã‚りã€ã«ãªã‚Šã¾ã™ã€‚ゲームã«ãŠã„ã¦ã¯ã€æ°´æ²¡ã—ãŸæ©Ÿå™¨ã‚„スピーカーãŒå‡ºã™ã‚ˆã†" "ãªéŸ³ã‚’éžå¸¸ã«åŠ¹çŽ‡çš„ã«ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ãƒˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "æªã¿ã®å¼·ã•。値ã®ç¯„囲ã¯0~1ã§ã™ã€‚" @@ -12252,8 +12281,13 @@ msgstr "" "ãƒ•ã‚§ã‚¯ãƒˆã‚’è¿½åŠ ã—ã¾ã™ã€‚" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." -msgstr "ã‚·ã‚¹ãƒ†ãƒ ä¸Šã§æ¤œå‡ºã•れãŸã™ã¹ã¦ã®ã‚ªãƒ¼ãƒ‡ã‚£ã‚ªå…¥åŠ›ãƒ‡ãƒã‚¤ã‚¹ã®åå‰ã‚’è¿”ã—ã¾ã™ã€‚" +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" #: doc/classes/AudioServer.xml msgid "Generates an [AudioBusLayout] using the available buses and effects." @@ -12444,12 +12478,16 @@ msgstr "利用å¯èƒ½ãªã‚ªãƒ¼ãƒ‡ã‚£ã‚ªãƒã‚¹ã®æ•°ã€‚" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -12607,6 +12645,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml #, fuzzy msgid "MP3 audio stream driver." @@ -12762,7 +12815,10 @@ msgstr "3D空間ã§3Dサウンドをå†ç”Ÿã—ã¾ã™ã€‚" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -14686,7 +14742,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -14779,7 +14835,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -14807,9 +14865,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -15319,13 +15377,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -15351,8 +15410,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -15668,12 +15729,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -15718,8 +15779,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -15767,8 +15830,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -15830,7 +15896,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -15967,7 +16033,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -16693,17 +16762,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -17040,12 +17109,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -17083,12 +17153,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -18249,7 +18320,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -18275,7 +18354,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -19020,7 +19103,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -21826,7 +21911,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -21975,16 +22062,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -22130,18 +22218,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml #, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "ブレンド軸上ã®ãƒã‚¤ãƒ³ãƒˆã®æ•°ã‚’è¿”ã—ã¾ã™ã€‚" @@ -27092,8 +27168,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -27716,7 +27796,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -29324,10 +29406,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -30766,8 +30851,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -33078,11 +33163,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -33934,7 +34022,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -33946,6 +34038,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -36376,14 +36478,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -36391,22 +36493,29 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "アニメーションã®ãƒˆãƒ©ãƒƒã‚¯æ•°ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "インデックス [code]point[/code] ã®ãƒã‚¤ãƒ³ãƒˆã®ä½ç½®ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" +"ブレンド空間ã‹ã‚‰ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ [code]point[/code] ã®ãƒã‚¤ãƒ³ãƒˆã‚’削除ã—ã¾ã™ã€‚" #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" +"インデックス [code]triangle[/code] ã®ä¸‰è§’形内ã«ã‚ã‚‹ã€ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ " +"[code]point[/code] ã®ãƒã‚¤ãƒ³ãƒˆã®ä½ç½®ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Line2D.xml msgid "" @@ -37685,8 +37794,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -37731,7 +37844,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -37986,9 +38102,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -38456,7 +38572,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -39618,7 +39736,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -40460,13 +40578,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -44155,7 +44285,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -49593,7 +49725,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" "与ãˆã‚‰ã‚ŒãŸ[code]id[/code]ã‚’æŒã¤ç‚¹ã®ä½ç½®[code]position[/code]ã‚’è¨å®šã—ã¾ã™ã€‚" @@ -49836,7 +49970,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -50572,7 +50708,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53264,8 +53404,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -56887,11 +57038,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -57329,7 +57484,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -57476,13 +57633,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -57806,6 +57969,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -57818,7 +57993,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58673,7 +58851,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -59302,6 +59483,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -59656,7 +59845,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -61345,7 +61536,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -62635,6 +62826,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -62696,6 +62890,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -62718,7 +62915,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -63868,6 +64068,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "インデックス [code]bus_idx[/code] ã®ãƒã‚¹ã®éŸ³é‡ã‚’ dB ã§è¿”ã—ã¾ã™ã€‚" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -63898,6 +64103,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "インデックス [code]bus_idx[/code] ã®ãƒã‚¹ã®éŸ³é‡ã‚’ dB ã§è¿”ã—ã¾ã™ã€‚" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -63940,8 +64150,13 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +#, fuzzy +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" +"ã‚«ã‚¹ã‚¿ãƒ ãƒœã‚¿ãƒ³ãŒæŠ¼ã•れãŸã¨ãã«è¡¨ç¤ºã•れã¾ã™ã€‚[method add_button] ã‚’å‚ç…§ã—ã¦ã" +"ã ã•ã„。" #: doc/classes/Tabs.xml msgid "Emitted when a tab is clicked, even if it is the current tab." @@ -65321,7 +65536,7 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" "与ãˆã‚‰ã‚ŒãŸ[code]id[/code]ã‚’æŒã¤ç‚¹ã®ä½ç½®[code]position[/code]ã‚’è¨å®šã—ã¾ã™ã€‚" @@ -65329,7 +65544,7 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" "é…列㫠[code]value[/code] ãŒå«ã¾ã‚Œã¦ã„れ㰠[code]true[/code] ã‚’è¿”ã—ã¾ã™ã€‚" @@ -65337,7 +65552,7 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" "[code]path[/code]ã«ã‚ã‚‹[code]*.fnt[/code]ファイルã‹ã‚‰ã€BitmapFontを作æˆã—ã¾" @@ -65346,23 +65561,26 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." msgstr "" "与ãˆã‚‰ã‚ŒãŸ[code]id[/code]ã‚’æŒã¤ç‚¹ã®ä½ç½®[code]position[/code]ã‚’è¨å®šã—ã¾ã™ã€‚" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" "é…列㫠[code]value[/code] ãŒå«ã¾ã‚Œã¦ã„れ㰠[code]true[/code] ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" +"é…列㫠[code]value[/code] ãŒå«ã¾ã‚Œã¦ã„れ㰠[code]true[/code] ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Theme.xml msgid "" @@ -65381,16 +65599,19 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" "é…列㫠[code]value[/code] ãŒå«ã¾ã‚Œã¦ã„れ㰠[code]true[/code] ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" +"é…列㫠[code]value[/code] ãŒå«ã¾ã‚Œã¦ã„れ㰠[code]true[/code] ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Theme.xml msgid "" @@ -65401,17 +65622,19 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" "é…列㫠[code]value[/code] ãŒå«ã¾ã‚Œã¦ã„れ㰠[code]true[/code] ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" +"é…列㫠[code]value[/code] ãŒå«ã¾ã‚Œã¦ã„れ㰠[code]true[/code] ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Theme.xml msgid "" @@ -65422,16 +65645,18 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" +"é…列㫠[code]value[/code] ãŒå«ã¾ã‚Œã¦ã„れ㰠[code]true[/code] ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Theme.xml msgid "" @@ -65443,16 +65668,19 @@ msgstr "" #, fuzzy msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." +"[code]theme_type[/code]." msgstr "" "インデックス [code]triangle[/code] ã®ä¸‰è§’形内ã«ã‚ã‚‹ã€ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ " "[code]point[/code] ã®ãƒã‚¤ãƒ³ãƒˆã®ä½ç½®ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" +"インデックス [code]triangle[/code] ã®ä¸‰è§’形内ã«ã‚ã‚‹ã€ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ " +"[code]point[/code] ã®ãƒã‚¤ãƒ³ãƒˆã®ä½ç½®ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Theme.xml msgid "" @@ -65463,17 +65691,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -65486,9 +65716,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -65496,8 +65726,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -65512,7 +65742,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -65532,18 +65762,23 @@ msgstr "与ãˆã‚‰ã‚ŒãŸ [code]id[/code] ã«ç´ã¥ã‘られãŸç‚¹ã®ä½ç½®ã‚’è¿”ã #, fuzzy msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" "[code]name[/code] ã¨ã„ã†åå‰ã§æŒ‡å®šã—ãŸè¨å®šãŒå˜åœ¨ã™ã‚‹å ´åˆã¯ [code]true[/" "code]ã€ãã†ã§ãªã„å ´åˆã¯ [code]false[/code] ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" +"[code]name[/code] ã¨ã„ã†åå‰ã§æŒ‡å®šã—ãŸè¨å®šãŒå˜åœ¨ã™ã‚‹å ´åˆã¯ [code]true[/" +"code]ã€ãã†ã§ãªã„å ´åˆã¯ [code]false[/code] ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Theme.xml #, fuzzy @@ -65557,32 +65792,45 @@ msgstr "" #, fuzzy msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" "[code]name[/code] ã¨ã„ã†åå‰ã§æŒ‡å®šã—ãŸè¨å®šãŒå˜åœ¨ã™ã‚‹å ´åˆã¯ [code]true[/" "code]ã€ãã†ã§ãªã„å ´åˆã¯ [code]false[/code] ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" +"[code]name[/code] ã¨ã„ã†åå‰ã§æŒ‡å®šã—ãŸè¨å®šãŒå˜åœ¨ã™ã‚‹å ´åˆã¯ [code]true[/" +"code]ã€ãã†ã§ãªã„å ´åˆã¯ [code]false[/code] ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" +"[code]name[/code] ã¨ã„ã†åå‰ã§æŒ‡å®šã—ãŸè¨å®šãŒå˜åœ¨ã™ã‚‹å ´åˆã¯ [code]true[/" +"code]ã€ãã†ã§ãªã„å ´åˆã¯ [code]false[/code] ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" +"[code]name[/code] ã¨ã„ã†åå‰ã§æŒ‡å®šã—ãŸè¨å®šãŒå˜åœ¨ã™ã‚‹å ´åˆã¯ [code]true[/" +"code]ã€ãã†ã§ãªã„å ´åˆã¯ [code]false[/code] ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Theme.xml #, fuzzy @@ -65610,90 +65858,120 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" +"é…列㫠[code]value[/code] ãŒå«ã¾ã‚Œã¦ã„れ㰠[code]true[/code] ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" +"é…列㫠[code]value[/code] ãŒå«ã¾ã‚Œã¦ã„れ㰠[code]true[/code] ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" +"[code]path[/code]ã«ã‚ã‚‹[code]*.fnt[/code]ファイルã‹ã‚‰ã€BitmapFontを作æˆã—ã¾" +"ã™ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" +"インデックス [code]triangle[/code] ã®ä¸‰è§’形内ã«ã‚ã‚‹ã€ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ " +"[code]point[/code] ã®ãƒã‚¤ãƒ³ãƒˆã®ä½ç½®ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" +"é…列㫠[code]value[/code] ãŒå«ã¾ã‚Œã¦ã„れ㰠[code]true[/code] ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"[code]name[/code] ã¨ã„ã†åå‰ã§æŒ‡å®šã—ãŸè¨å®šãŒå˜åœ¨ã™ã‚‹å ´åˆã¯ [code]true[/" +"code]ã€ãã†ã§ãªã„å ´åˆã¯ [code]false[/code] ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"[code]name[/code] ã¨ã„ã†åå‰ã§æŒ‡å®šã—ãŸè¨å®šãŒå˜åœ¨ã™ã‚‹å ´åˆã¯ [code]true[/" +"code]ã€ãã†ã§ãªã„å ´åˆã¯ [code]false[/code] ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"[code]name[/code] ã¨ã„ã†åå‰ã§æŒ‡å®šã—ãŸè¨å®šãŒå˜åœ¨ã™ã‚‹å ´åˆã¯ [code]true[/" +"code]ã€ãã†ã§ãªã„å ´åˆã¯ [code]false[/code] ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"[code]name[/code] ã¨ã„ã†åå‰ã§æŒ‡å®šã—ãŸè¨å®šãŒå˜åœ¨ã™ã‚‹å ´åˆã¯ [code]true[/" +"code]ã€ãã†ã§ãªã„å ´åˆã¯ [code]false[/code] ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"[code]name[/code] ã¨ã„ã†åå‰ã§æŒ‡å®šã—ãŸè¨å®šãŒå˜åœ¨ã™ã‚‹å ´åˆã¯ [code]true[/" +"code]ã€ãã†ã§ãªã„å ´åˆã¯ [code]false[/code] ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"[code]name[/code] ã¨ã„ã†åå‰ã§æŒ‡å®šã—ãŸè¨å®šãŒå˜åœ¨ã™ã‚‹å ´åˆã¯ [code]true[/" +"code]ã€ãã†ã§ãªã„å ´åˆã¯ [code]false[/code] ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Theme.xml msgid "" @@ -68905,21 +69183,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -68932,7 +69214,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -68961,7 +69243,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -68971,22 +69285,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -68999,8 +69326,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -69198,16 +69527,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -75437,6 +75766,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -77981,7 +78314,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/ko.po b/doc/translations/ko.po index ac9274cee6..a744804896 100644 --- a/doc/translations/ko.po +++ b/doc/translations/ko.po @@ -16,12 +16,14 @@ # 한수현 <shh1473@ajou.ac.kr>, 2022. # vrSono <global.sonogong@gmail.com>, 2022. # 김태우 <ogosengi3@gmail.com>, 2022. +# ì´ì§€ë¯¼ <jiminaleejung@gmail.com>, 2022. +# nulltable <un5450@naver.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-06-29 10:30+0000\n" -"Last-Translator: 김태우 <ogosengi3@gmail.com>\n" +"PO-Revision-Date: 2022-09-26 05:24+0000\n" +"Last-Translator: nulltable <un5450@naver.com>\n" "Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/ko/>\n" "Language: ko\n" @@ -29,7 +31,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.13.1-dev\n" +"X-Generator: Weblate 4.14.1\n" #: doc/tools/make_rst.py msgid "Description" @@ -479,11 +481,10 @@ msgid "" msgstr "" "[b]주ì˜:[/b] [code]dectime[/code] 는 ë” ì´ìƒ 사용ë˜ì§€ 않으며 Godot 4.0ì—서 ì‚" "ì œë 것 입니다. ëŒ€ì‹ , [method move_toward]를 사용하세요.\n" -"\n" "[code]value[/code]ì—서 [code]step[/code] * [code]amount[/code]를 뺀 ê°’ì„ ë°˜" "환.\n" "[codeblock]\n" -"a = dectime(60, 10, 0.1)) # a 는 59.0\n" +"a = dectime(60, 10, 0.1)) # a는 59.0\n" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml @@ -520,6 +521,8 @@ msgid "" "Converts a dictionary (previously created with [method inst2dict]) back to " "an instance. Useful for deserializing." msgstr "" +"([메서드 inst2dict]으로 ìƒì„±ëœ) 딕셔너리를 ì¸ìŠ¤í„´ìŠ¤ë¡œ 변경합니다. ì—ì§ë ¬í™”ì— " +"ìœ ìš©í•˜ê²Œ 사용ë©ë‹ˆë‹¤." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -570,7 +573,6 @@ msgid "" msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Returns the floating-point remainder of [code]a/b[/code], keeping the sign " "of [code]a[/code].\n" @@ -582,8 +584,7 @@ msgstr "" "[code]a[/code] ì˜ ë¶€í˜¸ë¥¼ ìœ ì§€í•œ 채로 [code]a/b[/code] ì˜ ë¶€ë™ ì†Œìˆ˜ì 나머지" "를 반환한다.\n" "[codeblock]\n" -"# 나머지는 1.5\n" -"var remainder = fmod(7, 5.5)\n" +"r = fmod(7, 5.5) # rì€ 1.5\n" "[/codeblock]\n" "ì •ìˆ˜ 나머지 ì—°ì‚°ì€, % ì—°ì‚°ìžë¥¼ 사용한다." @@ -690,8 +691,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -701,7 +703,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -725,11 +728,15 @@ msgid "" "Returns whether [code]instance[/code] is a valid object (e.g. has not been " "deleted from memory)." msgstr "" +"[code]ì¸ìŠ¤í„´ìŠ¤[/code]ê°€ ìœ íš¨í•œ ê°ì²´ì¸ì§€ 여부를 반환합니다 (예시. 메모리ì—서 " +"ì‚ì œë˜ì§€ 않았는지)." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Returns whether [code]s[/code] is a NaN (\"Not a Number\" or invalid) value." msgstr "" +"[code]s[/code]ê°€ NaN (\"Not a Number\" í˜¹ì€ ìœ íš¨í•˜ì§€ 않ì€) ê°’ì¸ì§€ 여부를 반환" +"합니다." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -737,6 +744,9 @@ msgid "" "This method is faster than using [method is_equal_approx] with one value as " "zero." msgstr "" +"[code]s[/code]ê°€ 0ì´ê±°ë‚˜ 0ì— ì¸ì ‘한 ê°’ì´ë©´ [code]true[/code]를 반환합니다. \n" +"ì´ ë©”ì„œë“œëŠ” [메서드 is_equal_approx]ì— 0ì„ ì¸ìžê°’으로 사용하는 경우보다 ë¹ ë¦…" +"니다." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -755,7 +765,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -767,7 +778,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1198,10 +1210,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -5019,19 +5036,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -5052,21 +5071,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -5076,9 +5099,10 @@ msgstr "ë§¤ê°œë³€ìˆ˜ì˜ íƒ„ì 트 ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -5730,9 +5754,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -5906,8 +5930,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -6618,7 +6642,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -6855,7 +6884,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -7504,7 +7538,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -8910,8 +8952,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8962,10 +9005,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9208,12 +9261,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9759,7 +9806,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9920,12 +9972,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10073,6 +10129,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10213,7 +10284,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11893,7 +11967,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11986,7 +12060,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -12014,9 +12090,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12517,13 +12593,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -12548,10 +12625,19 @@ msgid "Custom drawing in 2D" msgstr "" #: doc/classes/CanvasItem.xml +#, fuzzy msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" +"노드가 [SceneTree]ì— ë“¤ì–´ê°ˆ 때 호출ë©ë‹ˆë‹¤ (예를 들어 ì¸ìŠ¤í„´ì‹±ë˜ê±°ë‚˜, ì”¬ì´ ë°”" +"뀌거나 스í¬ë¦½íЏì—서 [method add_child]를 호출한 경우). 노드가 ìžì†ì„ ê°€ì§€ê³ " +"있다면 ìžì‹ ì˜ [method _enter_tree]ê°€ ë¨¼ì € ë¶ˆë¦¬ê³ ìžì†ì´ ê·¸ 다ìŒì— 불릴 것입니" +"다.\n" +"[method Object._notification]ì˜ [constant NOTIFICATION_ENTER_TREE] ë…¸í‹°ì— ëŒ€" +"ì‘합니다." #: doc/classes/CanvasItem.xml msgid "" @@ -12863,12 +12949,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12913,8 +12999,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12962,8 +13050,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -13025,7 +13116,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13150,7 +13241,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -13855,17 +13949,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -14172,12 +14266,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14214,12 +14309,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -15413,7 +15509,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -15439,7 +15543,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -16180,7 +16288,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18911,7 +19021,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -19060,16 +19172,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19215,18 +19328,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml #, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì•„í¬ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." @@ -24202,8 +24303,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24825,7 +24930,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26413,10 +26520,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27825,8 +27935,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -30134,11 +30244,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30984,7 +31097,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30996,6 +31113,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33357,14 +33484,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33372,22 +33499,26 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." -msgstr "" +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." +msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." #: doc/classes/Line2D.xml msgid "" @@ -34663,8 +34794,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -34709,7 +34844,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -34964,9 +35102,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35427,7 +35565,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36564,7 +36704,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37390,13 +37530,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -41192,7 +41344,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46578,7 +46732,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." #: doc/classes/PopupMenu.xml @@ -46817,7 +46973,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47547,7 +47705,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -50228,8 +50390,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53807,11 +53980,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -54248,7 +54425,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -54392,13 +54571,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -54721,6 +54906,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -54733,7 +54930,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55588,7 +55788,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -56207,6 +56410,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56541,7 +56752,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57974,7 +58187,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -59241,6 +59454,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -59302,6 +59518,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -59324,7 +59543,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60461,6 +60683,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60491,6 +60718,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60532,7 +60764,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -61889,38 +62123,44 @@ msgid "Clears all values on the theme." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "ë‘ ë²¡í„°ì˜ ë‚˜ë¨¸ì§€ë¥¼ 반환합니다." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "ë‘ ë²¡í„°ì˜ ë‚˜ë¨¸ì§€ë¥¼ 반환합니다." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." -msgstr "" +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." +msgstr "ë‘ ë²¡í„°ì˜ ë‚˜ë¨¸ì§€ë¥¼ 반환합니다." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "ë‘ ë²¡í„°ì˜ ë‚˜ë¨¸ì§€ë¥¼ 반환합니다." #: doc/classes/Theme.xml msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61938,15 +62178,17 @@ msgid "Sets the theme's values to a copy of a given theme." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "ë‘ ë²¡í„°ì˜ ë‚˜ë¨¸ì§€ë¥¼ 반환합니다." #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61956,15 +62198,16 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "ë‘ ë²¡í„°ì˜ ë‚˜ë¨¸ì§€ë¥¼ 반환합니다." #: doc/classes/Theme.xml msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" @@ -61977,7 +62220,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" @@ -61985,7 +62228,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61995,15 +62238,16 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." -msgstr "" +"[code]theme_type[/code]." +msgstr "ë‘ ë²¡í„°ì˜ ë‚˜ë¨¸ì§€ë¥¼ 반환합니다." #: doc/classes/Theme.xml msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -62015,17 +62259,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -62038,9 +62284,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -62048,8 +62294,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -62064,7 +62310,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -62083,15 +62329,17 @@ msgstr "ë‘ ë²¡í„°ì˜ ë‚˜ë¨¸ì§€ë¥¼ 반환합니다." #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -62103,29 +62351,33 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -62153,87 +62405,87 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -65413,21 +65665,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65440,7 +65696,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65469,7 +65725,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65479,22 +65767,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65507,8 +65808,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65706,16 +66009,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -71844,6 +72147,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -74383,7 +74690,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/lt.po b/doc/translations/lt.po index 79790f5e70..f744f60e12 100644 --- a/doc/translations/lt.po +++ b/doc/translations/lt.po @@ -550,8 +550,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -561,7 +562,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -615,7 +617,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -627,7 +630,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1042,10 +1046,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4856,19 +4865,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4889,21 +4900,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4912,9 +4927,10 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -5566,9 +5582,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -5742,8 +5758,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -6454,7 +6470,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -6691,7 +6712,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -7339,7 +7365,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -8745,8 +8779,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8797,10 +8832,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9042,12 +9087,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9593,7 +9632,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9754,12 +9798,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9907,6 +9955,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10047,7 +10110,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11725,7 +11791,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11818,7 +11884,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11846,9 +11914,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12345,13 +12413,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -12377,8 +12446,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12691,12 +12762,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12741,8 +12812,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12790,8 +12863,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12853,7 +12929,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12978,7 +13054,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -13683,17 +13762,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -14000,12 +14079,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14042,12 +14122,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -15207,7 +15288,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -15233,7 +15322,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -15974,7 +16067,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18699,7 +18794,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18848,16 +18945,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19002,18 +19100,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23917,8 +24003,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24538,7 +24628,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26122,10 +26214,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27532,8 +27627,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -29833,11 +29928,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30682,7 +30780,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30694,6 +30796,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33051,14 +33163,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33066,21 +33178,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34356,8 +34468,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -34402,7 +34518,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -34657,9 +34776,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35118,7 +35237,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36230,7 +36351,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37045,13 +37166,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40715,7 +40848,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46079,7 +46214,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46318,7 +46455,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47047,7 +47186,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49728,8 +49871,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53305,11 +53459,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -53746,7 +53904,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53890,13 +54050,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -54219,6 +54385,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -54231,7 +54409,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55086,7 +55267,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55705,6 +55889,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56039,7 +56231,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57472,7 +57666,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58737,6 +58931,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -58798,6 +58995,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -58820,7 +59020,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -59957,6 +60160,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -59986,6 +60193,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60027,7 +60238,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -61377,37 +61590,38 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61426,14 +61640,15 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61444,14 +61659,14 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" @@ -61464,7 +61679,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" @@ -61472,7 +61687,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61484,13 +61699,13 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." +"[code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61502,17 +61717,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -61525,9 +61742,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -61535,8 +61752,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -61551,7 +61768,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -61569,15 +61786,17 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61589,29 +61808,33 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61639,87 +61862,87 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -64892,21 +65115,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64919,7 +65146,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -64948,7 +65175,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -64958,22 +65217,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -64986,8 +65258,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65185,16 +65459,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -71288,6 +71562,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -73824,7 +74102,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/lv.po b/doc/translations/lv.po index 1f63bf69bb..1b6d5f9cd5 100644 --- a/doc/translations/lv.po +++ b/doc/translations/lv.po @@ -555,8 +555,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -566,7 +567,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -620,7 +622,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -632,7 +635,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1047,10 +1051,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4861,19 +4870,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4894,21 +4905,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4917,9 +4932,10 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -5571,9 +5587,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -5747,8 +5763,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -6459,7 +6475,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -6696,7 +6717,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -7344,7 +7370,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -8750,8 +8784,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8802,10 +8837,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9047,12 +9092,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9598,7 +9637,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9759,12 +9803,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9912,6 +9960,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10052,7 +10115,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11730,7 +11796,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11823,7 +11889,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11851,9 +11919,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12350,13 +12418,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -12382,8 +12451,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12696,12 +12767,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12746,8 +12817,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12795,8 +12868,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12858,7 +12934,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12983,7 +13059,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -13688,17 +13767,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -14005,12 +14084,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14047,12 +14127,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -15212,7 +15293,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -15238,7 +15327,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -15979,7 +16072,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18704,7 +18799,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18853,16 +18950,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19007,18 +19105,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23925,8 +24011,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24546,7 +24636,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26130,10 +26222,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27540,8 +27635,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -29841,11 +29936,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30690,7 +30788,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30702,6 +30804,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33059,14 +33171,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33074,21 +33186,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34364,8 +34476,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -34410,7 +34526,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -34665,9 +34784,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35126,7 +35245,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36238,7 +36359,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37053,13 +37174,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40723,7 +40856,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46087,7 +46222,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46326,7 +46463,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47055,7 +47194,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49736,8 +49879,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53313,11 +53467,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -53754,7 +53912,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53898,13 +54058,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -54227,6 +54393,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -54239,7 +54417,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55094,7 +55275,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55713,6 +55897,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56047,7 +56239,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57480,7 +57674,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58745,6 +58939,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -58806,6 +59003,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -58828,7 +59028,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -59965,6 +60168,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -59994,6 +60201,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60035,7 +60246,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -61385,37 +61598,38 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61434,14 +61648,15 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61452,14 +61667,14 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" @@ -61472,7 +61687,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" @@ -61480,7 +61695,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61492,13 +61707,13 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." +"[code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61510,17 +61725,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -61533,9 +61750,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -61543,8 +61760,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -61559,7 +61776,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -61577,15 +61794,17 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61597,29 +61816,33 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61647,87 +61870,87 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -64900,21 +65123,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64927,7 +65154,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -64956,7 +65183,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -64966,22 +65225,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -64994,8 +65266,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65193,16 +65467,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -71296,6 +71570,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -73832,7 +74110,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/mr.po b/doc/translations/mr.po index 32832a4d8f..3636dbf68f 100644 --- a/doc/translations/mr.po +++ b/doc/translations/mr.po @@ -538,8 +538,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -549,7 +550,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -603,7 +605,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -615,7 +618,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1030,10 +1034,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4844,19 +4853,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4877,21 +4888,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4900,9 +4915,10 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -5554,9 +5570,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -5730,8 +5746,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -6442,7 +6458,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -6679,7 +6700,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -7327,7 +7353,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -8733,8 +8767,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8785,10 +8820,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9030,12 +9075,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9581,7 +9620,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9742,12 +9786,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9895,6 +9943,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10035,7 +10098,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11713,7 +11779,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11806,7 +11872,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11834,9 +11902,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12333,13 +12401,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -12365,8 +12434,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12679,12 +12750,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12729,8 +12800,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12778,8 +12851,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12841,7 +12917,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12966,7 +13042,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -13671,17 +13750,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -13988,12 +14067,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14030,12 +14110,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -15195,7 +15276,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -15221,7 +15310,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -15962,7 +16055,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18687,7 +18782,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18836,16 +18933,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -18990,18 +19088,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23905,8 +23991,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24526,7 +24616,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26110,10 +26202,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27520,8 +27615,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -29821,11 +29916,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30670,7 +30768,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30682,6 +30784,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33039,14 +33151,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33054,21 +33166,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34344,8 +34456,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -34390,7 +34506,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -34645,9 +34764,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35106,7 +35225,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36218,7 +36339,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37033,13 +37154,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40703,7 +40836,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46067,7 +46202,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46306,7 +46443,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47035,7 +47174,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49716,8 +49859,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53293,11 +53447,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -53734,7 +53892,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53878,13 +54038,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -54207,6 +54373,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -54219,7 +54397,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55074,7 +55255,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55693,6 +55877,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56027,7 +56219,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57460,7 +57654,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58725,6 +58919,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -58786,6 +58983,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -58808,7 +59008,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -59945,6 +60148,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -59974,6 +60181,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60015,7 +60226,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -61365,37 +61578,38 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61414,14 +61628,15 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61432,14 +61647,14 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" @@ -61452,7 +61667,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" @@ -61460,7 +61675,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61472,13 +61687,13 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." +"[code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61490,17 +61705,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -61513,9 +61730,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -61523,8 +61740,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -61539,7 +61756,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -61557,15 +61774,17 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61577,29 +61796,33 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61627,87 +61850,87 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -64880,21 +65103,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64907,7 +65134,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -64936,7 +65163,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -64946,22 +65205,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -64974,8 +65246,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65173,16 +65447,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -71276,6 +71550,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -73812,7 +74090,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/nb.po b/doc/translations/nb.po index 42dca83c45..9a861d8287 100644 --- a/doc/translations/nb.po +++ b/doc/translations/nb.po @@ -550,8 +550,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -561,7 +562,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -615,7 +617,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -627,7 +630,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1042,10 +1046,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4856,19 +4865,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4889,21 +4900,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4912,9 +4927,10 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -5566,9 +5582,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -5742,8 +5758,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -6454,7 +6470,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -6691,7 +6712,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -7339,7 +7365,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -8745,8 +8779,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8797,10 +8832,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9042,12 +9087,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9593,7 +9632,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9754,12 +9798,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9907,6 +9955,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10047,7 +10110,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11725,7 +11791,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11818,7 +11884,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11846,9 +11914,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12345,13 +12413,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -12377,8 +12446,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12691,12 +12762,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12741,8 +12812,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12790,8 +12863,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12853,7 +12929,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12978,7 +13054,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -13683,17 +13762,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -14000,12 +14079,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14042,12 +14122,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -15207,7 +15288,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -15233,7 +15322,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -15974,7 +16067,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18699,7 +18794,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18848,16 +18945,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19002,18 +19100,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23917,8 +24003,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24538,7 +24628,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26122,10 +26214,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27532,8 +27627,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -29833,11 +29928,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30682,7 +30780,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30694,6 +30796,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33051,14 +33163,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33066,21 +33178,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34356,8 +34468,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -34402,7 +34518,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -34657,9 +34776,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35118,7 +35237,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36230,7 +36351,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37045,13 +37166,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40715,7 +40848,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46079,7 +46214,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46318,7 +46455,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47047,7 +47186,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49728,8 +49871,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53305,11 +53459,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -53746,7 +53904,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53890,13 +54050,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -54219,6 +54385,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -54231,7 +54409,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55086,7 +55267,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55705,6 +55889,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56039,7 +56231,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57472,7 +57666,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58737,6 +58931,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -58798,6 +58995,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -58820,7 +59020,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -59957,6 +60160,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -59986,6 +60193,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60027,7 +60238,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -61377,37 +61590,38 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61426,14 +61640,15 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61444,14 +61659,14 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" @@ -61464,7 +61679,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" @@ -61472,7 +61687,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61484,13 +61699,13 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." +"[code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61502,17 +61717,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -61525,9 +61742,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -61535,8 +61752,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -61551,7 +61768,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -61569,15 +61786,17 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61589,29 +61808,33 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61639,87 +61862,87 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -64892,21 +65115,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64919,7 +65146,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -64948,7 +65175,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -64958,22 +65217,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -64986,8 +65258,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65185,16 +65459,16 @@ msgid "Unknown error." msgstr "Ukjent feil." #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -71288,6 +71562,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -73824,7 +74102,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/ne.po b/doc/translations/ne.po index 0ba02ba939..84cf5c569c 100644 --- a/doc/translations/ne.po +++ b/doc/translations/ne.po @@ -538,8 +538,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -549,7 +550,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -603,7 +605,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -615,7 +618,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1030,10 +1034,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4844,19 +4853,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4877,21 +4888,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4900,9 +4915,10 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -5554,9 +5570,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -5730,8 +5746,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -6442,7 +6458,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -6679,7 +6700,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -7327,7 +7353,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -8733,8 +8767,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8785,10 +8820,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9030,12 +9075,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9581,7 +9620,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9742,12 +9786,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9895,6 +9943,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10035,7 +10098,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11713,7 +11779,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11806,7 +11872,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11834,9 +11902,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12333,13 +12401,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -12365,8 +12434,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12679,12 +12750,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12729,8 +12800,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12778,8 +12851,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12841,7 +12917,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12966,7 +13042,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -13671,17 +13750,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -13988,12 +14067,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14030,12 +14110,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -15195,7 +15276,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -15221,7 +15310,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -15962,7 +16055,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18687,7 +18782,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18836,16 +18933,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -18990,18 +19088,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23905,8 +23991,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24526,7 +24616,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26110,10 +26202,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27520,8 +27615,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -29821,11 +29916,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30670,7 +30768,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30682,6 +30784,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33039,14 +33151,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33054,21 +33166,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34344,8 +34456,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -34390,7 +34506,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -34645,9 +34764,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35106,7 +35225,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36218,7 +36339,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37033,13 +37154,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40703,7 +40836,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46067,7 +46202,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46306,7 +46443,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47035,7 +47174,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49716,8 +49859,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53293,11 +53447,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -53734,7 +53892,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53878,13 +54038,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -54207,6 +54373,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -54219,7 +54397,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55074,7 +55255,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55693,6 +55877,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56027,7 +56219,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57460,7 +57654,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58725,6 +58919,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -58786,6 +58983,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -58808,7 +59008,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -59945,6 +60148,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -59974,6 +60181,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60015,7 +60226,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -61365,37 +61578,38 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61414,14 +61628,15 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61432,14 +61647,14 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" @@ -61452,7 +61667,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" @@ -61460,7 +61675,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61472,13 +61687,13 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." +"[code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61490,17 +61705,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -61513,9 +61730,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -61523,8 +61740,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -61539,7 +61756,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -61557,15 +61774,17 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61577,29 +61796,33 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61627,87 +61850,87 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -64880,21 +65103,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64907,7 +65134,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -64936,7 +65163,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -64946,22 +65205,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -64974,8 +65246,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65173,16 +65447,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -71276,6 +71550,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -73812,7 +74090,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/nl.po b/doc/translations/nl.po index 3053cadb2b..6b89702dec 100644 --- a/doc/translations/nl.po +++ b/doc/translations/nl.po @@ -8,12 +8,13 @@ # Pierre Stempin <pierre.stempin@gmail.com>, 2020. # Daan van Luijk <daanvl@outlook.be>, 2021. # voylin <0voylin0@gmail.com>, 2022. +# Gert-dev <qnyasgjhapqyuhoibr@kiabws.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-03-15 01:57+0000\n" -"Last-Translator: voylin <0voylin0@gmail.com>\n" +"PO-Revision-Date: 2022-08-06 05:37+0000\n" +"Last-Translator: Gert-dev <qnyasgjhapqyuhoibr@kiabws.com>\n" "Language-Team: Dutch <https://hosted.weblate.org/projects/godot-engine/godot-" "class-reference/nl/>\n" "Language: nl\n" @@ -21,7 +22,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.12-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -599,8 +600,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -610,7 +612,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -664,7 +667,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -676,7 +680,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1091,10 +1096,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4913,19 +4923,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4946,21 +4958,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4969,9 +4985,10 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -5623,9 +5640,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -5799,8 +5816,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -6511,7 +6528,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -6748,7 +6770,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -7396,7 +7423,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -8802,8 +8837,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8854,10 +8890,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9099,12 +9145,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9650,7 +9690,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9811,12 +9856,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9964,6 +10013,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10104,7 +10168,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11782,7 +11849,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11875,7 +11942,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11903,9 +11972,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12402,13 +12471,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -12434,8 +12504,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12748,12 +12820,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12798,8 +12870,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12847,8 +12921,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12910,7 +12987,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13035,7 +13112,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -13740,17 +13820,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -14057,12 +14137,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14099,12 +14180,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -15264,7 +15346,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -15290,7 +15380,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -16031,7 +16125,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18756,7 +18852,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18905,16 +19003,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19059,18 +19158,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23977,8 +24064,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24598,7 +24689,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26182,10 +26275,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27592,8 +27688,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -29893,11 +29989,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30742,7 +30841,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30754,6 +30857,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33111,14 +33224,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33126,21 +33239,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34416,8 +34529,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -34462,7 +34579,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -34717,9 +34837,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35178,7 +35298,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36290,7 +36412,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37105,13 +37227,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -37680,7 +37814,7 @@ msgstr "" #: doc/classes/Node.xml msgid "Nodes and Scenes" -msgstr "" +msgstr "Noden en scènes" #: doc/classes/Node.xml msgid "All Demos" @@ -40775,7 +40909,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46139,7 +46275,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46378,7 +46516,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47107,7 +47247,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49788,8 +49932,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53366,11 +53521,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -53807,7 +53966,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53951,13 +54112,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -54280,6 +54447,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -54292,7 +54471,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55147,7 +55329,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55766,6 +55951,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56100,7 +56293,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57533,7 +57728,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58798,6 +58993,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -58859,6 +59057,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -58881,7 +59082,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60018,6 +60222,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60047,6 +60255,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60088,7 +60300,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -61438,37 +61652,38 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61487,14 +61702,15 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61505,14 +61721,14 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" @@ -61525,7 +61741,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" @@ -61533,7 +61749,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61545,13 +61761,13 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." +"[code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61563,17 +61779,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -61586,9 +61804,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -61596,8 +61814,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -61612,7 +61830,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -61630,15 +61848,17 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61650,29 +61870,33 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61700,87 +61924,87 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -64953,21 +65177,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64980,7 +65208,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65009,7 +65237,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65019,22 +65279,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65047,8 +65320,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65246,16 +65521,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -71349,6 +71624,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -73885,7 +74164,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/pl.po b/doc/translations/pl.po index 729b6a654c..0bc778f703 100644 --- a/doc/translations/pl.po +++ b/doc/translations/pl.po @@ -834,8 +834,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -845,7 +846,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -923,7 +925,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -935,7 +938,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" "Interpoluje liniowo pomiÄ™dzy dwoma wartoÅ›ciami poprzez znormalizowanÄ… " "wartość. Jest to odwrotność [method inverse_lerp].\n" @@ -1503,10 +1507,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -5349,19 +5358,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -5382,21 +5393,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -5406,9 +5421,10 @@ msgstr "Zwraca tangens parametru." #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -6060,9 +6076,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -6237,8 +6253,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -6956,7 +6972,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -7193,7 +7214,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -7841,7 +7867,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -9247,8 +9281,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -9299,10 +9334,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9545,12 +9590,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -10096,7 +10135,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10257,12 +10301,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10410,6 +10458,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10550,7 +10613,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -12231,7 +12297,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -12324,7 +12390,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -12352,9 +12420,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12862,13 +12930,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -12894,8 +12963,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -13208,12 +13279,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13258,8 +13329,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -13307,8 +13380,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -13370,7 +13446,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13495,7 +13571,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -14200,17 +14279,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -14518,12 +14597,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14560,12 +14640,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -15728,7 +15809,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -15754,7 +15843,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -16496,7 +16589,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -19227,7 +19322,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -19376,16 +19473,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19531,18 +19629,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml #, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "Zwraca arcus sinus parametru." @@ -24467,8 +24553,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -25089,7 +25179,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26680,10 +26772,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -28105,8 +28200,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -30409,11 +30504,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -31259,7 +31357,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -31271,6 +31373,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33652,14 +33764,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33667,22 +33779,26 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "Zwraca minimalny kÄ…t w radianach tego wektora." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]b[/code]." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]with[/code]." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." -msgstr "" +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." +msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]b[/code]." #: doc/classes/Line2D.xml msgid "" @@ -34963,8 +35079,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -35009,7 +35129,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -35264,9 +35387,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35727,7 +35850,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36877,7 +37002,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37708,13 +37833,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -41387,7 +41524,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46792,7 +46931,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]with[/code]." #: doc/classes/PopupMenu.xml @@ -47031,7 +47172,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47761,7 +47904,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -50442,8 +50589,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -54029,11 +54187,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -54470,7 +54632,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -54617,13 +54781,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -54946,6 +55116,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -54958,7 +55140,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55813,7 +55998,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -56433,6 +56621,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56767,7 +56963,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -58203,7 +58401,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -59470,6 +59668,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -59531,6 +59732,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -59553,7 +59757,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60690,6 +60897,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]b[/code]." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60720,6 +60932,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]b[/code]." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60761,7 +60978,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -62126,39 +62345,46 @@ msgid "Clears all values on the theme." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]with[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]with[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]with[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." -msgstr "" +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." +msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]with[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]with[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." -msgstr "" +"theme has [code]theme_type[/code]." +msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]with[/code]." #: doc/classes/Theme.xml msgid "" @@ -62175,15 +62401,17 @@ msgid "Sets the theme's values to a copy of a given theme." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]with[/code]." #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -62195,16 +62423,17 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]with[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]with[/code]." #: doc/classes/Theme.xml msgid "" @@ -62215,16 +62444,17 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." -msgstr "" +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." +msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]with[/code]." #: doc/classes/Theme.xml msgid "" @@ -62233,16 +62463,18 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." -msgstr "" +"[code]theme_type[/code]." +msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]with[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." -msgstr "" +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." +msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]with[/code]." #: doc/classes/Theme.xml msgid "" @@ -62253,17 +62485,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -62276,9 +62510,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -62286,8 +62520,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -62302,7 +62536,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -62319,18 +62553,22 @@ msgid "" msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]b[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." -msgstr "" +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]with[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." -msgstr "" +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]with[/code]." #: doc/classes/Theme.xml #, fuzzy @@ -62342,31 +62580,38 @@ msgstr "" "skrypcie ,podczas wywoÅ‚ania [method move_and_slide]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." -msgstr "" +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]with[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." -msgstr "" +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]with[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." -msgstr "" +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]with[/code]." #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -62395,87 +62640,88 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." -msgstr "" +msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]with[/code]." #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -65657,21 +65903,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65684,7 +65934,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65713,7 +65963,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65723,22 +66005,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65751,8 +66046,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65950,16 +66247,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -72098,6 +72395,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -74637,7 +74938,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/pt.po b/doc/translations/pt.po index c99a8e1cd6..fce62b474f 100644 --- a/doc/translations/pt.po +++ b/doc/translations/pt.po @@ -10,12 +10,16 @@ # Diogo Gomes <dgomes@graphnode.com>, 2022. # El_ExpertPlayer <xpertnathan37@gmail.com>, 2022. # Esdras Caleb Oliveira Silva <acheicaleb@gmail.com>, 2022. +# Rafael Testa <rafael1testa@gmail.com>, 2022. +# Lucas Campos <lucas@lcmps.dev>, 2022. +# Nathan Soares <eu@nathan.com.br>, 2022. +# Baiterson <baiter160@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-06-29 10:31+0000\n" -"Last-Translator: Esdras Caleb Oliveira Silva <acheicaleb@gmail.com>\n" +"PO-Revision-Date: 2022-08-25 13:04+0000\n" +"Last-Translator: Baiterson <baiter160@gmail.com>\n" "Language-Team: Portuguese <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/pt/>\n" "Language: pt\n" @@ -23,7 +27,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.13.1-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -513,6 +517,23 @@ msgid "" "want a true content-aware comparison, you have to use [code]deep_equal[/" "code]." msgstr "" +"Compara dois valores verificando seu conteúdo real, por meio de recursão em " +"um [Array] ou [Dictionary] em todos os seus nÃveis.\n" +"Esta função se asemelha ou difere de [code]==[/code] de diversas maneiras:\n" +"- Para [code]null[/code], [code]int[/code], [code]float[/code], " +"[code]String[/code], [code]Object[/code] e [code] RID[/code] tanto " +"[code]deep_equal[/code] quanto [code]==[/code] funcionam da mesma forma.\n" +"- Para [code]Dictionary[/code], [code]==[/code] considera-se igual se, e " +"somente se, ambas as variáveis apontarem para o mesmo [code]Dictionary[/" +"code], sem recursão ou checagem de seu conteúdo.\n" +"- Para [code]Array[/code], [code]==[/code] considera igual se, e somente se, " +"cada item no primeiro [code]Array[/code] for igual ao seu homólogo no " +"segundo [ code]Array[/code], conforme informado pelo próprio [code]==[/" +"code]. Isso implica que [code]==[/code] se faz a recursão em [code]Array[/" +"code], mas não em [code]Dictionary[/code].\n" +"Resumindo, sempre que um [code]Dictionary[/code] estiver potencialmente " +"envolvido, se você quiser uma comparação verdadeira com verificação de " +"conteúdo, você deve usar [code]deep_equal[/code]." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -802,6 +823,7 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Returns an interpolation or extrapolation factor considering the range " "specified in [code]from[/code] and [code]to[/code], and the interpolated " @@ -809,8 +831,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -820,7 +843,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" "Returna um fator de interpolação ou extrapolação considerando o alcance " "especifico em [code]from[/code] e [code]to[/code], e o valor interpolado " @@ -908,12 +932,14 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Linearly interpolates between two values by the factor defined in " "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -925,7 +951,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" "Interpola linearmente entre dois valores pelo fator definido em " "[code]weight[/code]. Para realizar a interpolação, [code]weight[/code] deve " @@ -1340,7 +1367,6 @@ msgstr "" "rastreamento de pilha quando um erro ou aviso é impresso ." #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Like [method print], but includes the current stack frame when running with " "the debugger turned on.\n" @@ -1350,11 +1376,12 @@ msgid "" " At: res://test.gd:15:_process()\n" "[/codeblock]" msgstr "" -"Imprime a pilha de chamadas no local do código, só funciona com o depurador " -"ativado.\n" -"SaÃda no console vai parecer assim:\n" +"Similar à [method print], mas inclui a pilha de chamadas no local do código " +"quando o depurador esta ativado.\n" +"A saÃda no console será exibida da seguinte maneira:\n" "[codeblock]\n" -"Frame 0 - res://test.gd:16 in function '_process'\n" +"Test print\n" +" At: res://test.gd:15:_process()\n" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1607,20 +1634,59 @@ msgid "" "3\n" "[/codeblock]" msgstr "" +"Retorna um [Array] com o intervalo fornecido. [method range] pode ser " +"invocado de três maneiras:\n" +"- [code]range(n: int)[/code]: inicia em 0, incrementa 1 passo até parar " +"[i]antes[/i] de [code]n[/code]. O argumento [code]n[/code] é [b]exclusivo[/" +"b].\n" +"[código]intervalo(b: int, n: int)[/código]: inicia em [código]b[/código], " +"incrementa 1 passo até parar [i]antes[/i] de [code]n[/code]. Os argumentos " +"[code]b[/code] e [code]n[/code] são [b]inclusivo[/b] e [b]exclusivo[/b], " +"respectivamente.\n" +"- [code]range(b: int, n: int, s: int)[/code]: inicia em [code]b[/code], " +"aumenta/diminui [code]s[/code] passos até parar [i]antes[/i] de [code]n[/" +"code]. Os argumentos [code]b[/code] e [code]n[/code] são [b]inclusivo[/b] e " +"[b]exclusivo[/b], respectivamente. O argumento [code]s[/code] [b]pode[/b] " +"ser negativo, mas não [code]0[/code]. Se [code]s[/code] for [code]0[/code], " +"uma mensagem de erro será exibida.\n" +"- [method range] converte todos os argumentos em [int] antes do " +"processamento.\n" +"[b]Observação:[/b] Retorna uma matriz vazia se nenhum valor atender à s " +"restrições do intervalo (por exemplo, [code]range(2, 5, -1)[/code] ou " +"[code]range(5, 5, 1)[/code]).\n" +"Exemplos:\n" +"[codeblock]\n" +"print(range(4)) # Escreve [0, 1, 2, 3]\n" +"print(range(2, 5)) # Escreve [2, 3, 4]\n" +"print(range(0, 6, 2)) # Escreve [0, 2, 4]\n" +"print(range(4, 1, -1)) # Escreve [4, 3, 2]\n" +"[/codeblock]\n" +"Para iterar sobre um [Array] para trás, use:\n" +"[codeblock]\n" +"var array = [3, 6, 9]\n" +"for i in range(array.size(), 0, -1):\n" +" print(array[i - 1])\n" +"[/codeblock]\n" +"SaÃda:\n" +"[codeblock]\n" +"9\n" +"6\n" +"3\n" +"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" -"Mapeia um [code]value[/code] do intervalo [code][istart, istop][/code] para " -"o intervalo [code][ostart, ostop][/code].\n" -"[codeblock]\n" -"range_lerp(75, 0, 100, -1, 1) # Retorna 0.5\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1633,6 +1699,14 @@ msgid "" "[/codeblock]\n" "See also [method floor], [method ceil], [method stepify], and [int]." msgstr "" +"Arredonda [code]s[/code] para o número inteiro mais próximo, com a metade " +"arredondada para cima.\n" +"[codeblock]\n" +"a = round(2.49) # a is 2.0\n" +"a = round(2.5) # a is 3.0\n" +"a = round(2.51) # a is 3.0\n" +"[/codeblock]\n" +"Veja também[method floor], [method ceil], [method stepify], e [int]." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1717,6 +1791,29 @@ msgid "" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" +"Retorna o resultado da interpolação suave do valor de [code]s[/code] entre " +"[code]0[/code] e [code]1[/code], na qual [code]s[/code] se encontra incluso " +"no intervalo dos limites [code]from[/code] e [code]to[/code].\n" +"O valor de retornado é [code]0[/code] se [code]s <= from[/code], e [code]1[/" +"code] se [code]s >= to[/code]. Se [code]s[/code] estiver entre [code]from[/" +"code] e [code]to[/code], o valor retornado segue uma curva em forma de S que " +"mapeia [code]s[/code] entre [ code]0[/code] e [code]1[/code].\n" +"Esta curva em forma de S é o interpolador cúbico de Hermite, dado por " +"[code]f(y) = 3*y^2 - 2*y^3[/code] na qual [code]y = (x-from) / (to -from)[/" +"code].\n" +"[codeblock]\n" +"smoothstep(0, 2, -5.0) # Retorna 0.0\n" +"smoothstep(0, 2, 0.5) # Retorna 0.15625\n" +"smoothstep(0, 2, 1.0) # Retorna 0.5\n" +"smoothstep(0, 2, 2.0) # Retorna 1.0\n" +"[/codeblock]\n" +"Comparado [method ease] com um valor de curva de [code]-1.6521[/code], " +"[method smoothstep] retorna a curva mais suave possÃvel sem mudanças " +"repentinas na derivada. Se você precisar realizar transições mais avançadas, " +"use [Tween] ou [AnimationPlayer].\n" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" +"smoothstep_ease_comparison.png]Comparação entre os valores retornados por " +"smoothstep() e ease(x, -1.6521)[/url]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1728,8 +1825,17 @@ msgid "" "[b]Note:[/b] Negative values of [code]s[/code] return NaN. If you need " "negative inputs, use [code]System.Numerics.Complex[/code] in C#." msgstr "" +"Retorna a raiz quadrada de [code]s[/code], onde [code]s[/code] é um número " +"não-negativo.\n" +"[codeblock]\n" +"sqrt(9) # Retorna 3\n" +"[/codeblock]\n" +"[b]Nota:[/b] Valores negativos de [code]s[/code] retornam NaN. Se você " +"necessita de inputs negativos, use [code]System.Numerics.Complex[/code] em " +"C#." #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Returns the position of the first non-zero digit, after the decimal point. " "Note that the maximum return value is 10, which is a design decision in the " @@ -1740,6 +1846,14 @@ msgid "" "n = step_decimals(0.000000005) # n is 9\n" "[/codeblock]" msgstr "" +"Retorna a posição do primeiro dÃgito diferente de 0 após o ponto decimal. " +"Note que o valor máximo retornado é 10, que é uma decisão de design na " +"implementação.\n" +"[codeblock]\n" +"n = step_decimals(5) # n é 0\n" +"n = step_decimals(1.0005) # n é 4\n" +"n = step_decimals(0.000000005) # n é 9\n" +"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1752,6 +1866,14 @@ msgid "" "[/codeblock]\n" "See also [method ceil], [method floor], [method round], and [int]." msgstr "" +"Fixa valor flutuante [code]s[/code] para um dado [code]step[/code]. Também " +"pode ser usado para arredondar um número flutuante para um número arbitrário " +"de decimais.\n" +"[codeblock]\n" +"stepify(100, 32) # Retorna 96.0\n" +"stepify(3.14159, 0.01) # Retorna 3.14\n" +"[/codeblock]\n" +"Veja também [method ceil], [method floor], [method round], e [int]." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1764,6 +1886,14 @@ msgid "" "len(b) # Returns 12\n" "[/codeblock]" msgstr "" +"Converte um ou mais argumentos de quaisquer tipos para string na melhor " +"maneira possÃvel.\n" +"[codeblock]\n" +"var a = [10, 20, 30]\n" +"var b = str(a);\n" +"len(a) # Retorna 3\n" +"len(b) # Retorna 12\n" +"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1803,6 +1933,11 @@ msgid "" "b = tanh(a) # b is 0.6\n" "[/codeblock]" msgstr "" +"Retorna a tangente hiperbólica de [code]s[/code].\n" +"[codeblock]\n" +"a = log(2.0) # a é 0.693147\n" +"b = tanh(a) # b é 0.6\n" +"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1845,6 +1980,11 @@ msgid "" "type_exists(\"Variant\") # Returns false\n" "[/codeblock]" msgstr "" +"Retorna se uma dada classe existe em [ClassDB].\n" +"[codeblock]\n" +"type_exists(\"Sprite\") # Retorna true\n" +"type_exists(\"Variant\") # Retorna false\n" +"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -2177,16 +2317,22 @@ msgid "Global scope constants and variables." msgstr "Constantes e variáveis de escopo global." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "" "Global scope constants and variables. This is all that resides in the " "globals, constants regarding error codes, scancodes, property hints, etc.\n" "Singletons are also documented here, since they can be accessed from " "anywhere." msgstr "" +"Constante e variáveis de escopo global. É tudo aquilo que reside no escopo " +"global, constantes relacionadas a códigos de erro, scancodes, dicas de " +"propriedades, etc.\n" +"Singletons também estão documentados aqui, uma vez que podem ser acessados " +"de qualquer lugar." #: doc/classes/@GlobalScope.xml msgid "The [ARVRServer] singleton." -msgstr "" +msgstr "O singleton [ARVRServer]." #: doc/classes/@GlobalScope.xml msgid "The [AudioServer] singleton." @@ -2206,7 +2352,7 @@ msgstr "O singleton [Engine]." #: doc/classes/@GlobalScope.xml msgid "The [Geometry] singleton." -msgstr "" +msgstr "O singleton [Geometry]." #: doc/classes/@GlobalScope.xml msgid "The [IP] singleton." @@ -2245,19 +2391,16 @@ msgid "The [Marshalls] singleton." msgstr "O singleton [Marshalls]." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "The [Navigation2DServer] singleton." -msgstr "O singleton [TranslationServer]." +msgstr "O singleton [Navigation2DServer]." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "The [NavigationMeshGenerator] singleton." -msgstr "O singleton [TranslationServer]." +msgstr "O singleton [NavigationMeshGenerator]." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "The [NavigationServer] singleton." -msgstr "O singleton [TranslationServer]." +msgstr "O singleton [NavigationServer]." #: doc/classes/@GlobalScope.xml msgid "The [OS] singleton." @@ -2269,11 +2412,11 @@ msgstr "O singleton [Performance]." #: doc/classes/@GlobalScope.xml msgid "The [Physics2DServer] singleton." -msgstr "" +msgstr "O singleton [Physics2DServer]." #: doc/classes/@GlobalScope.xml msgid "The [PhysicsServer] singleton." -msgstr "" +msgstr "O singleton [PhysicsServer]." #: doc/classes/@GlobalScope.xml msgid "The [ProjectSettings] singleton." @@ -2289,7 +2432,7 @@ msgstr "O singleton [ResourceSaver]." #: doc/classes/@GlobalScope.xml msgid "The [Time] singleton." -msgstr "" +msgstr "O singleton [Time]." #: doc/classes/@GlobalScope.xml msgid "The [TranslationServer] singleton." @@ -2301,7 +2444,7 @@ msgstr "O singleton [VisualScriptEditor]." #: doc/classes/@GlobalScope.xml msgid "The [VisualServer] singleton." -msgstr "" +msgstr "O singleton [VisualServer]." #: doc/classes/@GlobalScope.xml msgid "Left margin, usually used for [Control] or [StyleBox]-derived classes." @@ -2393,7 +2536,7 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "Scancodes with this bit applied are non-printable." -msgstr "" +msgstr "Scancodes com este bit aplicado não são printáveis." #: doc/classes/@GlobalScope.xml msgid "Escape key." @@ -2405,7 +2548,7 @@ msgstr "Tecla Tab." #: doc/classes/@GlobalScope.xml msgid "Shift+Tab key." -msgstr "" +msgstr "Tecla Shift+Tab." #: doc/classes/@GlobalScope.xml msgid "Backspace key." @@ -2665,8 +2808,9 @@ msgid "" msgstr "Tecla Voltar Media. Não confundir com tecla Voltar no device Android." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "Media forward key." -msgstr "" +msgstr "Tecla avançar MÃdia." #: doc/classes/@GlobalScope.xml msgid "Media stop key." @@ -2674,7 +2818,7 @@ msgstr "Tecla de parada de mÃdia." #: doc/classes/@GlobalScope.xml msgid "Media refresh key." -msgstr "" +msgstr "Tecla repetir MÃdia." #: doc/classes/@GlobalScope.xml msgid "Volume down key." @@ -3565,6 +3709,11 @@ msgid "" "- Linux: Up to 80 buttons.\n" "- Windows and macOS: Up to 128 buttons." msgstr "" +"O número máximo de botões de controle suportados pela engine. O limite poder " +"ser menor em plataformas especÃficas:\n" +"- Android: Até 36 botões.\n" +"- Linux: Até 80 botões.\n" +"- Windows e macOS: Até 128 botões." #: doc/classes/@GlobalScope.xml msgid "DualShock circle button." @@ -3584,35 +3733,35 @@ msgstr "Botão triângulo do Dualshock." #: doc/classes/@GlobalScope.xml msgid "Xbox controller B button." -msgstr "" +msgstr "Botão B do controle de Xbox." #: doc/classes/@GlobalScope.xml msgid "Xbox controller A button." -msgstr "" +msgstr "Botão A do controle de Xbox." #: doc/classes/@GlobalScope.xml msgid "Xbox controller X button." -msgstr "" +msgstr "Botão X do controle de Xbox." #: doc/classes/@GlobalScope.xml msgid "Xbox controller Y button." -msgstr "" +msgstr "Botão Y do controle de Xbox." #: doc/classes/@GlobalScope.xml msgid "Nintendo controller A button." -msgstr "" +msgstr "Botão A do controle da Nintendo." #: doc/classes/@GlobalScope.xml msgid "Nintendo controller B button." -msgstr "" +msgstr "Botão B do controle da Nintendo." #: doc/classes/@GlobalScope.xml msgid "Nintendo controller X button." -msgstr "" +msgstr "Botão X do controle da Nintendo." #: doc/classes/@GlobalScope.xml msgid "Nintendo controller Y button." -msgstr "" +msgstr "Botão Y do controle da Nintendo." #: doc/classes/@GlobalScope.xml msgid "Grip (side) buttons on a VR controller." @@ -3678,35 +3827,36 @@ msgstr "Botão direito no direcional do controle." #: doc/classes/@GlobalScope.xml msgid "Gamepad SDL guide button." -msgstr "" +msgstr "Botão guia do controle SDL." #: doc/classes/@GlobalScope.xml msgid "Gamepad SDL miscellaneous button." msgstr "Botão diverso SDL do controle." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "Gamepad SDL paddle 1 button." -msgstr "" +msgstr "Botão paddle 1 do controle SDL." #: doc/classes/@GlobalScope.xml msgid "Gamepad SDL paddle 2 button." -msgstr "" +msgstr "Botão paddle 2 do controle SDL." #: doc/classes/@GlobalScope.xml msgid "Gamepad SDL paddle 3 button." -msgstr "" +msgstr "Botão paddle 3 do controle SDL." #: doc/classes/@GlobalScope.xml msgid "Gamepad SDL paddle 4 button." -msgstr "" +msgstr "Botão paddle 4 do controle SDL." #: doc/classes/@GlobalScope.xml msgid "Gamepad SDL touchpad button." -msgstr "" +msgstr "Touchpad do controle SDL." #: doc/classes/@GlobalScope.xml msgid "Gamepad left Shoulder button." -msgstr "" +msgstr "Touchpad botão L1." #: doc/classes/@GlobalScope.xml msgid "Gamepad left trigger." @@ -3718,7 +3868,7 @@ msgstr "Clique na alavanca esquerda do controle." #: doc/classes/@GlobalScope.xml msgid "Gamepad right Shoulder button." -msgstr "" +msgstr "Touchpad botão L2." #: doc/classes/@GlobalScope.xml msgid "Gamepad right trigger." @@ -3785,8 +3935,9 @@ msgid "VR Controller analog trigger." msgstr "Gatilho analógico do controle VR." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "VR Controller analog grip (side buttons)." -msgstr "" +msgstr "VR Controle analógico (botões laterais)" #: doc/classes/@GlobalScope.xml msgid "" @@ -3809,30 +3960,38 @@ msgid "" "MIDI note OFF message. See the documentation of [InputEventMIDI] for " "information of how to use MIDI inputs." msgstr "" +"MIDI nota OFF mensagem. Ver na documentação [InputEventMIDI] como usar." #: doc/classes/@GlobalScope.xml msgid "" "MIDI note ON message. See the documentation of [InputEventMIDI] for " "information of how to use MIDI inputs." -msgstr "" +msgstr "MIDI nota ON mensagem. Ver na documentação [InputEventMIDI] como usar." #: doc/classes/@GlobalScope.xml msgid "" "MIDI aftertouch message. This message is most often sent by pressing down on " "the key after it \"bottoms out\"." msgstr "" +"MIDI aftertouch mensagem. Essa mensagem é mais enviada quando pressionada a " +"tecla e depois de \"bottons out\"." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "" "MIDI control change message. This message is sent when a controller value " "changes. Controllers include devices such as pedals and levers." msgstr "" +"MIDI control change mensagem. Essa mensagem é enviada quando um valor de um " +"controle muda. Controles do tipo pedais e alavancas." #: doc/classes/@GlobalScope.xml msgid "" "MIDI program change message. This message sent when the program patch number " "changes." msgstr "" +"MIDI program change message. Essa mensagem é enviada quando o número de um " +"patch de um programa." #: doc/classes/@GlobalScope.xml msgid "" @@ -3925,6 +4084,19 @@ msgid "" " print(\"Still failing!\")\n" "[/codeblock]" msgstr "" +"Métodos que retornam [enum Error] retornam [constant OK] quando nenhum erro " +"ocorre. Note que muitas funções não retornam um código de erro, mas " +"imprimirão mensagens de erro na saÃda padrão.\n" +"Uma vez que [constant OK] tem valor 0 e todos os outros códigos de erro são " +"inteiros positivos, também pode ser usado em uma checagem booleana, ex:\n" +"[codeblock]\n" +"var err = method_that_returns_error()\n" +"if err != OK:\n" +" print(\"Failure!\")\n" +"# Ou o equivalente:\n" +"if err:\n" +" print(\"Still failing!\")\n" +"[/codeblock]" #: doc/classes/@GlobalScope.xml msgid "Generic error." @@ -3932,31 +4104,34 @@ msgstr "Erro genérico." #: doc/classes/@GlobalScope.xml msgid "Unavailable error." -msgstr "" +msgstr "Erro não disponÃvel." #: doc/classes/@GlobalScope.xml msgid "Unconfigured error." -msgstr "" +msgstr "Erro não configurado." #: doc/classes/@GlobalScope.xml msgid "Unauthorized error." -msgstr "" +msgstr "Erro não autorizado." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "Parameter range error." -msgstr "" +msgstr "Erro de intervalo de parâmetro." #: doc/classes/@GlobalScope.xml msgid "Out of memory (OOM) error." -msgstr "" +msgstr "Erro de falta de memória (OOM)." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "File: Not found error." -msgstr "" +msgstr "Arquivo: Erro de arquivo não encontrado." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "File: Bad drive error." -msgstr "" +msgstr "Arquivo: Erro unidade defeituosa." #: doc/classes/@GlobalScope.xml msgid "File: Bad path error." @@ -3971,24 +4146,29 @@ msgid "File: Already in use error." msgstr "Ficheiro: Erro ficheiro já em uso." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "File: Can't open error." -msgstr "" +msgstr "Arquivo: Erro não foi possÃvel abrir." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "File: Can't write error." -msgstr "" +msgstr "Arquivo: Erro não foi possÃvel escrever." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "File: Can't read error." -msgstr "" +msgstr "Arquivo: Erro não foi possÃvel ler." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "File: Unrecognized error." -msgstr "" +msgstr "Arquivo: Erro não reconhecido." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "File: Corrupt error." -msgstr "" +msgstr "Arquivo: Erro corrompido." #: doc/classes/@GlobalScope.xml msgid "File: Missing dependencies error." @@ -3996,27 +4176,28 @@ msgstr "Ficheiro: Erro faltam dependências." #: doc/classes/@GlobalScope.xml msgid "File: End of file (EOF) error." -msgstr "" +msgstr "Arquivo: Erro fim do arquivo (EOF)." #: doc/classes/@GlobalScope.xml msgid "Can't open error." -msgstr "" +msgstr "Erro não foi possÃvel abrir." #: doc/classes/@GlobalScope.xml msgid "Can't create error." -msgstr "" +msgstr "Erro não foi possÃvel criar." #: doc/classes/@GlobalScope.xml msgid "Query failed error." -msgstr "" +msgstr "Erro falha na consulta." #: doc/classes/@GlobalScope.xml msgid "Already in use error." -msgstr "" +msgstr "Erro já está sendo utilizado." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "Locked error." -msgstr "" +msgstr "Erro Bloqueado (Locked error)." #: doc/classes/@GlobalScope.xml msgid "Timeout error." @@ -4024,7 +4205,7 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "Can't connect error." -msgstr "" +msgstr "Erro não foi possÃvel conectar." #: doc/classes/@GlobalScope.xml msgid "Can't resolve error." @@ -4036,15 +4217,15 @@ msgstr "Erro de conexão." #: doc/classes/@GlobalScope.xml msgid "Can't acquire resource error." -msgstr "" +msgstr "Erro não foi possÃvel adquirir o recurso." #: doc/classes/@GlobalScope.xml msgid "Can't fork process error." -msgstr "" +msgstr "Erro não foi possÃvel dividir o processo." #: doc/classes/@GlobalScope.xml msgid "Invalid data error." -msgstr "" +msgstr "Erro dados inválidos." #: doc/classes/@GlobalScope.xml msgid "Invalid parameter error." @@ -4079,8 +4260,9 @@ msgid "Linking failed error." msgstr "" #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "Script failed error." -msgstr "" +msgstr "Erro falha no script." #: doc/classes/@GlobalScope.xml msgid "Cycling link (import cycle) error." @@ -4095,8 +4277,9 @@ msgid "Duplicate symbol error." msgstr "Erro de sÃmbolo duplicado." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "Parse error." -msgstr "" +msgstr "Erro de parse." #: doc/classes/@GlobalScope.xml msgid "Busy error." @@ -4112,13 +4295,15 @@ msgstr "Erro de ajuda." #: doc/classes/@GlobalScope.xml msgid "Bug error." -msgstr "" +msgstr "Erro bug." #: doc/classes/@GlobalScope.xml msgid "" "Printer on fire error. (This is an easter egg, no engine methods return this " "error code.)" msgstr "" +"Erro impressora em chamas. (Isso é um easter egg, nenhum método da engine " +"retornará esse código de erro.)" #: doc/classes/@GlobalScope.xml msgid "No hint for the edited property." @@ -4165,12 +4350,17 @@ msgid "" msgstr "" #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "" "Hints that a float property should be edited via an exponential easing " "function. The hint string can include [code]\"attenuation\"[/code] to flip " "the curve horizontally and/or [code]\"inout\"[/code] to also include in/out " "easing." msgstr "" +"Sugere que uma propriedade float deve ser editada através de uma função de " +"suavização. A string de sugestão pode incluir [code]\"attenuation\"[/code] " +"para virar a curva horizontalmente e/ou [code]\"inout\"[/code] para incluir " +"também a suavização in/out." #: doc/classes/@GlobalScope.xml msgid "Deprecated hint, unused." @@ -5666,19 +5856,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -5699,21 +5891,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -5723,9 +5919,10 @@ msgstr "Retorna o RID do ecrã usada por essa camada." #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -6384,9 +6581,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -6560,8 +6757,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -7272,7 +7469,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -7509,7 +7711,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -8157,7 +8364,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -9563,8 +9778,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -9615,10 +9831,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9860,12 +10086,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "Poder de distorção. O valor pode variar de 0 a 1." @@ -10411,7 +10631,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10572,12 +10797,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10725,6 +10954,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10865,7 +11109,10 @@ msgstr "Reproduz um som posicional em espaço 2D." #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -12548,7 +12795,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -12641,7 +12888,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -12669,9 +12918,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -13171,13 +13420,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -13203,8 +13453,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -13517,12 +13769,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13567,8 +13819,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -13616,8 +13870,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -13683,7 +13940,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13819,10 +14076,12 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" -"Define que a camada irá seguir a janela para simular um efeito pseudo-3D." #: doc/classes/CanvasLayer.xml msgid "" @@ -14531,17 +14790,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -14848,12 +15107,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14890,12 +15150,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -16064,7 +16325,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -16090,7 +16359,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -16831,7 +17104,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -19568,7 +19843,9 @@ msgstr "Uma curva matemática." msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -19717,16 +19994,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19871,18 +20149,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -24797,8 +25063,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -25420,7 +25690,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -27008,10 +27280,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -28419,8 +28694,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -30720,11 +30995,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -31573,7 +31851,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -31585,6 +31867,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33954,14 +34246,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33969,22 +34261,28 @@ msgid "Removes all points from the line." msgstr "Remove todos os pontos da linha." #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +#, fuzzy +msgid "Returns the amount of points in the line." msgstr "Retorna a quantidade de pontos de uma Line2D." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "Retorna o tipo do nó em at [code]idx[/code]." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "Retorna o tipo do nó em at [code]idx[/code]." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" +"Retorna [code]true[/code] se a guia no Ãndice [code]tab_idx[/code] estiver " +"oculta." #: doc/classes/Line2D.xml msgid "" @@ -35261,8 +35559,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -35307,7 +35609,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -35562,9 +35867,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -36024,7 +36329,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -37160,7 +37467,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37985,13 +38292,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -38559,6 +38878,7 @@ msgid "" msgstr "" #: doc/classes/Node.xml +#, fuzzy msgid "Nodes and Scenes" msgstr "Nós e Cenas" @@ -41657,7 +41977,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -47026,7 +47348,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "Retorna o nome do nó em [code]idx[/code]." #: doc/classes/PopupMenu.xml @@ -47266,7 +47590,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47995,7 +48321,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -50739,8 +51069,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -54317,11 +54658,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -54758,7 +55103,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -54902,13 +55249,19 @@ msgstr "A cena atual." #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55233,6 +55586,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -55245,7 +55610,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -56101,7 +56469,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -56721,6 +57092,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -57055,7 +57434,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -58506,7 +58887,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -59773,6 +60154,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -59834,6 +60218,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -59856,7 +60243,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60995,6 +61385,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Retorna o tipo do nó em at [code]idx[/code]." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -61024,6 +61419,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Retorna o tipo do nó em at [code]idx[/code]." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -61065,8 +61465,13 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +#, fuzzy +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" +"Emitido quando um botão personalizado é pressionado. Veja [method " +"add_button]." #: doc/classes/Tabs.xml msgid "Emitted when a tab is clicked, even if it is the current tab." @@ -62418,40 +62823,52 @@ msgid "Clears all values on the theme." msgstr "Limpa todos os valores no tema." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" +"Limpa o Ãcone em [code]name[/code] se o tema tiver [code]node_type[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" +"Limpa o Ãcone em [code]name[/code] se o tema tiver [code]node_type[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" +"Limpa o Ãcone em [code]name[/code] se o tema tiver [code]node_type[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." msgstr "" "Limpa o Ãcone em [code]name[/code] se o tema tiver [code]node_type[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" +"Limpa o Ãcone em [code]name[/code] se o tema tiver [code]node_type[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" +"Limpa o Ãcone em [code]name[/code] se o tema tiver [code]node_type[/code]." #: doc/classes/Theme.xml msgid "" @@ -62468,15 +62885,18 @@ msgid "Sets the theme's values to a copy of a given theme." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" +"Limpa o Ãcone em [code]name[/code] se o tema tiver [code]node_type[/code]." #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -62486,15 +62906,17 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" +"Limpa o Ãcone em [code]name[/code] se o tema tiver [code]node_type[/code]." #: doc/classes/Theme.xml msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" @@ -62507,7 +62929,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" @@ -62515,7 +62937,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -62525,15 +62947,17 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." +"[code]theme_type[/code]." msgstr "" +"Limpa o Ãcone em [code]name[/code] se o tema tiver [code]node_type[/code]." #: doc/classes/Theme.xml msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -62545,17 +62969,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -62568,9 +62994,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -62578,8 +63004,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -62594,7 +63020,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -62611,18 +63037,26 @@ msgid "" msgstr "Retorna o produto cruzado deste vetor e [code]b[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" +"Retorna [code]true[/code] se o vetor for normalizado, [code]false[/code] " +"caso contrário." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" +"Retorna [code]true[/code] se o vetor for normalizado, [code]false[/code] " +"caso contrário." #: doc/classes/Theme.xml msgid "" @@ -62631,31 +63065,44 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" +"Retorna [code]true[/code] se o vetor for normalizado, [code]false[/code] " +"caso contrário." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" +"Retorna [code]true[/code] se o vetor for normalizado, [code]false[/code] " +"caso contrário." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" +"Retorna [code]true[/code] se o vetor for normalizado, [code]false[/code] " +"caso contrário." #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -62686,87 +63133,87 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -65948,21 +66395,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65975,7 +66426,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -66004,7 +66455,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -66014,22 +66497,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -66042,8 +66538,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -66241,16 +66739,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -72352,6 +72850,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -74893,7 +75395,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/pt_BR.po b/doc/translations/pt_BR.po index ea624fdf2c..f6705f5e4c 100644 --- a/doc/translations/pt_BR.po +++ b/doc/translations/pt_BR.po @@ -19,7 +19,7 @@ # Lucas E. <lukas.ed45@gmail.com>, 2021. # Júlio César <diolandajr@gmail.com>, 2021, 2022. # Kett Lovahr <vagnerlunes@gmail.com>, 2021. -# Jaide Alonso Ambrosio <jaide.sp@gmail.com>, 2021. +# Jaide Alonso Ambrosio <jaide.sp@gmail.com>, 2021, 2022. # DeeJayLSP <djlsplays@gmail.com>, 2021. # Douglas Leão <djlsplays@gmail.com>, 2021. # Cauê Henrique Sousa Ferrareto <caue313@gmail.com>, 2021. @@ -42,12 +42,13 @@ # Daniel Abrante <danielabrante@protonmail.com>, 2022. # lucas rossy brasil coelho <lucasrossy270@gmail.com>, 2022. # Felipe Kinoshita <kinofhek@gmail.com>, 2022. +# Mr.Albino <ricmorsoleto@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-08-04 06:40+0000\n" -"Last-Translator: Felipe Kinoshita <kinofhek@gmail.com>\n" +"PO-Revision-Date: 2022-08-21 06:02+0000\n" +"Last-Translator: Jaide Alonso Ambrosio <jaide.sp@gmail.com>\n" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/" "godot-engine/godot-class-reference/pt_BR/>\n" "Language: pt_BR\n" @@ -853,6 +854,7 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Returns an interpolation or extrapolation factor considering the range " "specified in [code]from[/code] and [code]to[/code], and the interpolated " @@ -860,8 +862,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -871,7 +874,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" "Retornar a interpolação ou extrapolação do fator considerando o ranger " "especÃfico [code ]para[/code]" @@ -945,12 +949,14 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Linearly interpolates between two values by the factor defined in " "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -962,7 +968,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" "Interpola linearmente entre dois valores pelo fator definido em " "[code]weight[/code]. Para realizar a interpolação, [code]weight[/code] deve " @@ -1642,16 +1649,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" -"Mapeia um [code]value[/code] do intervalo [code][istart, istop][/code] para " -"o intervalo [code][ostart, ostop][/code].\n" -"[codeblock]\n" -"range_lerp(75, 0, 100, -1, 1) # Retorna 0.5\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -5886,19 +5893,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -5919,21 +5928,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -5943,9 +5956,10 @@ msgstr "Retorna a tangente do parâmetro." #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -6604,9 +6618,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -6781,8 +6795,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -7509,7 +7523,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -7746,7 +7765,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -8394,7 +8418,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -9800,8 +9832,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -9852,10 +9885,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -10099,12 +10142,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "Poder de distorção. O valor pode variar de 0 a 1." @@ -10650,7 +10687,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10811,12 +10853,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10964,6 +11010,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -11104,7 +11165,10 @@ msgstr "Reproduz um som posicional em espaço 2D." #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -12789,7 +12853,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -12882,7 +12946,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -12910,9 +12976,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -13418,13 +13484,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -13450,8 +13517,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -13764,12 +13833,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13814,8 +13883,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -13863,8 +13934,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -13930,7 +14004,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -14067,10 +14141,12 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" -"Define que a camada irá seguir a janela para simular um efeito pseudo-3D." #: doc/classes/CanvasLayer.xml msgid "" @@ -14779,17 +14855,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -15097,12 +15173,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -15140,12 +15217,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -16353,7 +16431,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -16379,7 +16465,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -17121,7 +17211,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -19858,7 +19950,9 @@ msgstr "Uma curva matemática." msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -20007,16 +20101,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -20162,18 +20257,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml #, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "Retorna o arco-seno do parâmetro." @@ -25100,8 +25183,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -25723,7 +25810,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -27315,10 +27404,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -28748,8 +28840,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -31054,11 +31146,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -31908,7 +32003,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -31920,6 +32019,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -34300,14 +34409,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -34315,22 +34424,27 @@ msgid "Removes all points from the line." msgstr "Remove todos os pontos da linha." #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +#, fuzzy +msgid "Returns the amount of points in the line." msgstr "Retorna a quantidade de pontos de uma Line2D." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "Retorna o tipo do nó em at [code]idx[/code]." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "Retorna o nome do nó em [code]idx[/code]." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" +"Retorna a largura em pÃxeis de [code]wrap_index[/code] em [code]line[/code]." #: doc/classes/Line2D.xml msgid "" @@ -35608,8 +35722,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -35654,7 +35772,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -35909,9 +36030,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -36372,7 +36493,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -37520,7 +37643,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -38354,13 +38477,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -42032,7 +42167,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -47441,7 +47578,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "Retorna o nome do nó em [code]idx[/code]." #: doc/classes/PopupMenu.xml @@ -47682,7 +47821,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -48412,7 +48553,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51094,8 +51239,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -54680,11 +54836,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -55122,7 +55282,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -55266,13 +55428,19 @@ msgstr "A cena atual." #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55598,6 +55766,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -55610,7 +55790,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -56466,7 +56649,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -57088,6 +57274,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -57422,7 +57616,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -58876,7 +59072,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -60143,6 +60339,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -60204,6 +60403,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -60226,7 +60428,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -61365,6 +61570,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Retorna o tipo do nó em at [code]idx[/code]." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -61395,6 +61605,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Retorna o tipo do nó em at [code]idx[/code]." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -61436,8 +61651,13 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +#, fuzzy +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" +"Emitido quando um botão personalizado é pressionado. Veja [method " +"add_button]." #: doc/classes/Tabs.xml msgid "Emitted when a tab is clicked, even if it is the current tab." @@ -62808,40 +63028,52 @@ msgid "Clears all values on the theme." msgstr "Limpa todos os valores no tema." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" +"Retorna a [Cor] em [code]name[/code] se o tema tiver [code]node_type[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" +"Limpa o Ãcone em [code]name[/code] se o tema tiver [code]node_type[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" +"Limpa o Ãcone em [code]name[/code] se o tema tiver [code]node_type[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." msgstr "" "Limpa o Ãcone em [code]name[/code] se o tema tiver [code]node_type[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" +"Limpa o Ãcone em [code]name[/code] se o tema tiver [code]node_type[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" +"Limpa o Ãcone em [code]name[/code] se o tema tiver [code]node_type[/code]." #: doc/classes/Theme.xml msgid "" @@ -62858,17 +63090,21 @@ msgid "Sets the theme's values to a copy of a given theme." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" "Retorna a [Cor] em [code]name[/code] se o tema tiver [code]node_type[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" +"Retorna a [Cor] em [code]name[/code] se o tema tiver [code]node_type[/code]." #: doc/classes/Theme.xml msgid "" @@ -62877,19 +63113,23 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" "Retorna a constante em [code]name[/code] se o tema tiver [code]node_type[/" "code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" +"Retorna a constante em [code]name[/code] se o tema tiver [code]node_type[/" +"code]." #: doc/classes/Theme.xml msgid "" @@ -62900,16 +63140,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" +"Retorna a constante em [code]name[/code] se o tema tiver [code]node_type[/" +"code]." #: doc/classes/Theme.xml msgid "" @@ -62921,14 +63164,15 @@ msgstr "" #, fuzzy msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." +"[code]theme_type[/code]." msgstr "Retorna o nome do nó em [code]idx[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." -msgstr "" +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." +msgstr "Retorna o nome do nó em [code]idx[/code]." #: doc/classes/Theme.xml msgid "" @@ -62939,17 +63183,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -62962,9 +63208,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -62972,8 +63218,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -62988,7 +63234,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -63005,18 +63251,22 @@ msgid "" msgstr "Retorna o produto cruzado deste vetor e [code]b[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." -msgstr "" +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "Retorna [code]true[/code] se o script pode ser instanciado." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." -msgstr "" +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "Retorna [code]true[/code] se o script pode ser instanciado." #: doc/classes/Theme.xml #, fuzzy @@ -63026,31 +63276,38 @@ msgid "" msgstr "Retorna [code]true[/code] se o script pode ser instanciado." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." -msgstr "" +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "Retorna [code]true[/code] se o script pode ser instanciado." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." -msgstr "" +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "Retorna o nome do nó em [code]idx[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." -msgstr "" +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "Retorna [code]true[/code] se o script pode ser instanciado." #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -63077,89 +63334,95 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" +"Retorna a [Cor] em [code]name[/code] se o tema tiver [code]node_type[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" +"Retorna a constante em [code]name[/code] se o tema tiver [code]node_type[/" +"code]." #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." -msgstr "" +msgstr "Retorna o nome do nó em [code]idx[/code]." #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -66347,21 +66610,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -66374,7 +66641,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -66403,7 +66670,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -66413,22 +66712,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -66441,8 +66753,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -66640,16 +66954,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -72791,6 +73105,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -75332,7 +75650,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml @@ -76712,6 +77032,8 @@ msgid "" "Skips the current section. If the node contains other elements, they will be " "ignored and the cursor will go to the closing of the current element." msgstr "" +"Pula a seção atual. Se o nó contêm outros elementos, eles serão ignorados e " +"o cursor irá para o encerramento do elemento atual." #: doc/classes/XMLParser.xml msgid "There's no node (no file or buffer opened)." diff --git a/doc/translations/ro.po b/doc/translations/ro.po index 332dbd0801..04f1a17b66 100644 --- a/doc/translations/ro.po +++ b/doc/translations/ro.po @@ -566,8 +566,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -577,7 +578,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -631,7 +633,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -643,7 +646,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1058,10 +1062,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4876,19 +4885,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4909,21 +4920,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4932,9 +4947,10 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -5586,9 +5602,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -5762,8 +5778,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -6474,7 +6490,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -6711,7 +6732,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -7359,7 +7385,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -8765,8 +8799,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8817,10 +8852,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9062,12 +9107,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9613,7 +9652,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9774,12 +9818,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9927,6 +9975,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10067,7 +10130,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11745,7 +11811,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11838,7 +11904,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11866,9 +11934,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12365,13 +12433,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -12397,8 +12466,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12711,12 +12782,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12761,8 +12832,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12810,8 +12883,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12873,7 +12949,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12998,7 +13074,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -13703,17 +13782,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -14020,12 +14099,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14062,12 +14142,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -15227,7 +15308,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -15253,7 +15342,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -15994,7 +16087,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18719,7 +18814,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18868,16 +18965,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19022,18 +19120,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23940,8 +24026,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24561,7 +24651,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26145,10 +26237,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27555,8 +27650,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -29856,11 +29951,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30705,7 +30803,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30717,6 +30819,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33074,14 +33186,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33089,21 +33201,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34379,8 +34491,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -34425,7 +34541,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -34680,9 +34799,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35141,7 +35260,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36253,7 +36374,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37069,13 +37190,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40739,7 +40872,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46103,7 +46238,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46342,7 +46479,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47071,7 +47210,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49752,8 +49895,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53329,11 +53483,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -53770,7 +53928,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53914,13 +54074,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -54243,6 +54409,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -54255,7 +54433,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55110,7 +55291,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55729,6 +55913,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56063,7 +56255,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57496,7 +57690,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58761,6 +58955,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -58822,6 +59019,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -58844,7 +59044,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -59981,6 +60184,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60010,6 +60217,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60051,7 +60262,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -61401,37 +61614,38 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61450,14 +61664,15 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61468,14 +61683,14 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" @@ -61488,7 +61703,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" @@ -61496,7 +61711,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61508,13 +61723,13 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." +"[code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61526,17 +61741,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -61549,9 +61766,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -61559,8 +61776,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -61575,7 +61792,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -61593,15 +61810,17 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61613,29 +61832,33 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61663,87 +61886,87 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -64916,21 +65139,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64943,7 +65170,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -64972,7 +65199,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -64982,22 +65241,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65010,8 +65282,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65209,16 +65483,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -71312,6 +71586,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -73848,7 +74126,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/ru.po b/doc/translations/ru.po index b148868ce6..b590ff4014 100644 --- a/doc/translations/ru.po +++ b/doc/translations/ru.po @@ -5,7 +5,7 @@ # # Alex <Alex.Gorichev@protonmail.com>, 2020. # Nikita <Kulacnikita@ya.ru>, 2020. -# ÐлекÑей Смирнов <tir74@mail.ru>, 2020, 2021. +# ÐлекÑей Смирнов <tir74@mail.ru>, 2020, 2021, 2022. # Chaosus89 <chaosus89@gmail.com>, 2020. # John Smith <19georginos97@gmail.com>, 2020. # NeoLan Qu <it.bulla@mail.ru>, 2020. @@ -50,21 +50,25 @@ # МÐÐ69К <weblate@mah69k.net>, 2022. # Vadim Mitroshkin <Vadim7540@yandex.ru>, 2022. # SonicStalker Games <dmitriyusolsev1971@gmail.com>, 2022. +# Kedr <lava20121991@gmail.com>, 2022. +# Lost Net <pc.mirkn@gmail.com>, 2022. +# Vladimir Kirillovskiy <vladimir.kirillovskiy@gmail.com>, 2022. +# motismob <evt.mixail@ya.ru>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-08-04 06:40+0000\n" -"Last-Translator: SonicStalker Games <dmitriyusolsev1971@gmail.com>\n" +"PO-Revision-Date: 2022-09-16 07:12+0000\n" +"Last-Translator: Rish Alternative <ii4526668@gmail.com>\n" "Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/ru/>\n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.14-dev\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 4.14.1-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -862,6 +866,7 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Returns an interpolation or extrapolation factor considering the range " "specified in [code]from[/code] and [code]to[/code], and the interpolated " @@ -869,8 +874,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -880,7 +886,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" "Возвращает коÑффициент интерполÑции или ÑкÑтраполÑции Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ диапазона, " "указанного в [code]от[/code] и [code]до[/code], и интерполированное " @@ -972,12 +979,14 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Linearly interpolates between two values by the factor defined in " "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -989,7 +998,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" "Линейно интерполирует между Ð´Ð²ÑƒÐ¼Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñми Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ коÑффициента, " "определенного в [code]weight[/code]. Ð”Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð¿Ð¾Ð»Ñции [code]веÑ[/" @@ -1714,16 +1724,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" -"СопоÑтавлÑет [code]value[/code] из диапазона [code][istart, istop][/code] в " -"[code][ostart, ostop][/code].\n" -"[codeblock]\n" -"range_lerp(75, 0, 100, -1, 1) # Возвращает 0.5\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1849,13 +1859,13 @@ msgstr "" "smoothstep(0, 2, 2.0) # Returns 1.0\n" "[/codeblock]\n" "\n" -"Compared to [method ease] with a curve value of [code]-1.6521[/code], [" -"method smoothstep] returns the smoothest possible curve with no sudden " +"Compared to [method ease] with a curve value of [code]-1.6521[/code], " +"[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" "[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" -"smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, -1" -".6521) return values[/url]" +"smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " +"-1.6521) return values[/url]" #: modules/gdscript/doc_classes/@GDScript.xml #, fuzzy @@ -1902,7 +1912,6 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Snaps float value [code]s[/code] to a given [code]step[/code]. This can also " "be used to round a floating point number to an arbitrary number of " @@ -1919,10 +1928,10 @@ msgstr "" "[codeblock]\n" "stepify(100, 32) # Возвращает 96\n" "stepify(3.14159, 0.01) # Возвращает 3.14\n" -"[/codeblock]" +"[/codeblock]\n" +"Смотрите также [method ceil], [method floor], [method round], и [int]." #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Converts one or more arguments of any type to string in the best way " "possible.\n" @@ -1933,8 +1942,8 @@ msgid "" "len(b) # Returns 12\n" "[/codeblock]" msgstr "" -"Преобразует один или более аргументов в Ñтроку наилучшим возможным " -"образом. \n" +"Преобразует один или неÑколько аргументов любого типа в Ñтроку наилучшим из " +"возможных ÑпоÑобов.\n" "[codeblock]\n" "var a = [10, 20, 30]\n" "var b = str(a);\n" @@ -2373,23 +2382,21 @@ msgid "Global scope constants and variables." msgstr "КонÑтанты и переменные глобальной облаÑти видимоÑти." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "" "Global scope constants and variables. This is all that resides in the " "globals, constants regarding error codes, scancodes, property hints, etc.\n" "Singletons are also documented here, since they can be accessed from " "anywhere." msgstr "" -"КонÑтанты и переменные глобальной облаÑти видимоÑти. Ð’ÑÑ‘, что находитÑÑ Ð² " -"глобальных переменных, конÑтантах, каÑающихÑÑ ÐºÐ¾Ð´Ð¾Ð² ошибок, кодов клавиш, " -"подÑказок ÑвойÑтв и др.\n" -"ЗдеÑÑŒ также задокументированы Ñинглтоны, поÑкольку доÑтуп к ним можно " -"получить из любого меÑта." +"КонÑтанты и переменные глобальной облаÑти видимоÑти. Ðто вÑе, что находитÑÑ " +"в глобальной облаÑти видимоÑти, конÑтанты, каÑающиеÑÑ ÐºÐ¾Ð´Ð¾Ð² ошибок, " +"Ñканкодов, подÑказок ÑвойÑтв и Ñ‚.д.\n" +"Синглтоны также документируютÑÑ Ð·Ð´ÐµÑÑŒ, поÑкольку к ним можно получить доÑтуп " +"из любой точки." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "The [ARVRServer] singleton." -msgstr "Синглтон [XRServer]." +msgstr "Синглтон [ARVRServer]." #: doc/classes/@GlobalScope.xml msgid "The [AudioServer] singleton." @@ -2408,9 +2415,8 @@ msgid "The [Engine] singleton." msgstr "Синглтон [Engine]." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "The [Geometry] singleton." -msgstr "Синглтон [Geometry2D]." +msgstr "Синглтон [Geometry]." #: doc/classes/@GlobalScope.xml msgid "The [IP] singleton." @@ -2449,19 +2455,16 @@ msgid "The [Marshalls] singleton." msgstr "Синглтон [Marshalls]." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "The [Navigation2DServer] singleton." -msgstr "Синглтон [TranslationServer]." +msgstr "Синглтон [Navigation2DServer]." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "The [NavigationMeshGenerator] singleton." msgstr "Синглтон [NavigationMeshGenerator]." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "The [NavigationServer] singleton." -msgstr "Синглтон [TranslationServer]." +msgstr "Синглтон [NavigationServer]." #: doc/classes/@GlobalScope.xml msgid "The [OS] singleton." @@ -2472,14 +2475,12 @@ msgid "The [Performance] singleton." msgstr "Синглтон [Performance]." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "The [Physics2DServer] singleton." -msgstr "Синглтон [PhysicsServer2D]." +msgstr "Синглтон [Physics2DServer]." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "The [PhysicsServer] singleton." -msgstr "Синглтон [PhysicsServer2D]." +msgstr "Синглтон [PhysicsServer]." #: doc/classes/@GlobalScope.xml msgid "The [ProjectSettings] singleton." @@ -2494,9 +2495,8 @@ msgid "The [ResourceSaver] singleton." msgstr "Синглтон [ResourceSaver]." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "The [Time] singleton." -msgstr "Синглтон [Engine]." +msgstr "Синглтон [Time]." #: doc/classes/@GlobalScope.xml msgid "The [TranslationServer] singleton." @@ -2507,9 +2507,8 @@ msgid "The [VisualScriptEditor] singleton." msgstr "Синглтон [VisualScriptEditor]." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "The [VisualServer] singleton." -msgstr "Синглтон [DisplayServer]." +msgstr "Синглтон [VisualServer]." #: doc/classes/@GlobalScope.xml msgid "Left margin, usually used for [Control] or [StyleBox]-derived classes." @@ -2553,57 +2552,55 @@ msgid "Bottom-left corner." msgstr "Ðижний левый угол." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "" "General vertical alignment, usually used for [Separator], [ScrollBar], " "[Slider], etc." msgstr "" -"Общее выравнивание по вертикали, обычно иÑпользуемое Ð´Ð»Ñ [Separator], " +"Общее вертикальное выравнивание, обычно иÑпользуетÑÑ Ð´Ð»Ñ [Separator], " "[ScrollBar], [Slider] и Ñ‚.д." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "" "General horizontal alignment, usually used for [Separator], [ScrollBar], " "[Slider], etc." msgstr "" -"Общее выравнивание по горизонтали, обычно иÑпользуемое Ð´Ð»Ñ [Separator], " -"[ScrollBar], [Slider] и др." +"Общее горизонтальное выравнивание, обычно иÑпользуетÑÑ Ð´Ð»Ñ [Separator], " +"[ScrollBar], [Slider] и Ñ‚.д." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Horizontal left alignment, usually for text-derived classes." -msgstr "Выравнивание по горизонтали Ñлева, обычно Ð´Ð»Ñ Ñ‚ÐµÐºÑтовых клаÑÑов." +msgstr "" +"Горизонтальное выравнивание по левому краю, обычно Ð´Ð»Ñ ÐºÐ»Ð°ÑÑов, Ñодержащих " +"текÑÑ‚." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Horizontal center alignment, usually for text-derived classes." -msgstr "Выравнивание по центру по горизонтали, обычно Ð´Ð»Ñ Ñ‚ÐµÐºÑтовых клаÑÑов." +msgstr "" +"Горизонтальное выравнивание по центру, обычно Ð´Ð»Ñ ÐºÐ»Ð°ÑÑов, Ñодержащих текÑÑ‚." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Horizontal right alignment, usually for text-derived classes." -msgstr "Выравнивание по горизонтали Ñправа, обычно Ð´Ð»Ñ Ñ‚ÐµÐºÑтовых клаÑÑов." +msgstr "" +"Горизонтальное выравнивание по правому краю, обычно Ð´Ð»Ñ ÐºÐ»Ð°ÑÑов, Ñодержащих " +"текÑÑ‚." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Vertical top alignment, usually for text-derived classes." -msgstr "Выравнивание по вертикали Ñверху, обычно Ð´Ð»Ñ Ñ‚ÐµÐºÑтовых клаÑÑов." +msgstr "" +"Вертикальное выравнивание Ñверху, обычно Ð´Ð»Ñ ÐºÐ»Ð°ÑÑов, Ñодержащих текÑÑ‚." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Vertical center alignment, usually for text-derived classes." -msgstr "Выравнивание по центру по вертикали, обычно Ð´Ð»Ñ Ñ‚ÐµÐºÑтовых клаÑÑов." +msgstr "" +"Вертикальное выравнивание по центру, обычно Ð´Ð»Ñ ÐºÐ»Ð°ÑÑов, Ñодержащих текÑÑ‚." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Vertical bottom alignment, usually for text-derived classes." -msgstr "Выравнивание по вертикали внизу, обычно Ð´Ð»Ñ Ñ‚ÐµÐºÑтовых клаÑÑов." +msgstr "Вертикальное выравнивание Ñнизу, обычно Ð´Ð»Ñ ÐºÐ»Ð°ÑÑов, Ñодержащих текÑÑ‚." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Scancodes with this bit applied are non-printable." -msgstr "Коды клавиш Ñ Ñтим битом — не печатаемые." +msgstr "Сканкоды Ñ Ñ‚Ð°ÐºÐ¸Ð¼ битом непечатаемые." #: doc/classes/@GlobalScope.xml msgid "Escape key." @@ -2614,9 +2611,8 @@ msgid "Tab key." msgstr "Клавиша Tab." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Shift+Tab key." -msgstr "Клавиша Shift + Tab." +msgstr "Клавиша Shift+Tab." #: doc/classes/@GlobalScope.xml msgid "Backspace key." @@ -2877,7 +2873,7 @@ msgid "" "Media back key. Not to be confused with the Back button on an Android device." msgstr "" "ÐœÑƒÐ»ÑŒÑ‚Ð¸Ð¼ÐµÐ´Ð¸Ð¹Ð½Ð°Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ° \"Ðазад\". Ðе путать Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¾Ð¹ \"Ðазад\" на " -"уÑтройÑтвах Android" +"уÑтройÑтвах Android." #: doc/classes/@GlobalScope.xml #, fuzzy @@ -4128,42 +4124,59 @@ msgid "" "MIDI pitch bend message. This message is sent to indicate a change in the " "pitch bender (wheel or lever, typically)." msgstr "" +"Сообщение MIDI об изменении выÑоты тона. Ðто Ñообщение отправлÑетÑÑ Ð´Ð»Ñ " +"Ð¾Ð±Ð¾Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð¸Ñ‚Ñ‡-бенда ( как правило, колеÑо или рычаг)." #: doc/classes/@GlobalScope.xml msgid "" "MIDI system exclusive message. This has behavior exclusive to the device " "you're receiving input from. Getting this data is not implemented in Godot." msgstr "" +"ÐкÑклюзивное Ñообщение MIDI ÑиÑтемы. Ðто поведение ÑкÑклюзивно Ð´Ð»Ñ " +"уÑтройÑтва от которого вы получаете данные. Получение Ñтих данных не " +"реализовано в Godot." #: doc/classes/@GlobalScope.xml msgid "" "MIDI quarter frame message. Contains timing information that is used to " "synchronize MIDI devices. Getting this data is not implemented in Godot." msgstr "" +"MIDI Ñообщение о четверти кадра. Содержит информацию о времени, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ " +"иÑпользуетÑÑ Ð´Ð»Ñ Ñинхронизации MIDI-уÑтройÑтв. Получение Ñтих данных не " +"реализовано в Godot." #: doc/classes/@GlobalScope.xml msgid "" "MIDI song position pointer message. Gives the number of 16th notes since the " "start of the song. Getting this data is not implemented in Godot." msgstr "" +"MIDI Ñообщение ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¸ композиции. Дает чиÑло 16-ых нот Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° " +"начала композиции. Получение Ñтих данных не реализовано в Godot." #: doc/classes/@GlobalScope.xml msgid "" "MIDI song select message. Specifies which sequence or song is to be played. " "Getting this data is not implemented in Godot." msgstr "" +"MIDI Ñообщение о выборе композиции. Указывает, ÐºÐ°ÐºÐ°Ñ Ð¿Ð¾ÑледовательноÑть или " +"пеÑÐ½Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° быть воÑпроизведена. Получение Ñтих данных не реализовано в " +"Godot." #: doc/classes/@GlobalScope.xml msgid "" "MIDI tune request message. Upon receiving a tune request, all analog " "synthesizers should tune their oscillators." msgstr "" +"MIDI Ñообщение Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñом на подÑтройку. При получении запроÑа на подÑтройку " +"вÑе аналоговые Ñинтезаторы должны подÑтроить Ñвои оÑциллÑторы." #: doc/classes/@GlobalScope.xml msgid "" "MIDI timing clock message. Sent 24 times per quarter note when " "synchronization is required." msgstr "" +"MIDI Ñообщение Ñинхронизации времени. ОтправлÑетÑÑ 24 раза на четверть ноты, " +"когда требуетÑÑ ÑинхронизациÑ." #: doc/classes/@GlobalScope.xml msgid "" @@ -4177,7 +4190,7 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "MIDI stop message. Stop the current sequence." -msgstr "" +msgstr "MIDI Ñообщение об оÑтановке. ОÑтанавливает текущую поÑледовательноÑть." #: doc/classes/@GlobalScope.xml msgid "" @@ -4186,10 +4199,13 @@ msgid "" msgstr "" #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "" "MIDI system reset message. Reset all receivers in the system to power-up " "status. It should not be sent on power-up itself." msgstr "" +"MIDI Ñообщение о ÑброÑе ÑиÑтемы. СбраÑывает вÑе получатели ÑиÑтемы до " +"выключенного ÑтатуÑа. Ðе должен быть отправлен на включение Ñам по Ñебе." #: doc/classes/@GlobalScope.xml msgid "" @@ -6330,19 +6346,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -6363,21 +6381,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -6387,9 +6409,10 @@ msgstr "Возвращает [Texture2D] заданного кадра." #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -7041,9 +7064,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -7226,10 +7249,13 @@ msgid "" msgstr "" #: doc/classes/AnimationPlayer.xml +#, fuzzy msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" +"ВоÑпроизводит анимацию Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ [code]anim[/code]. ЕÑли [code]anim[/code] не " +"указан, воÑпроизводитÑÑ Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ." #: doc/classes/AnimationPlayer.xml msgid "Returns the list of stored animation names." @@ -7996,7 +8022,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -8233,7 +8264,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -9015,7 +9051,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -10422,8 +10466,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -10474,10 +10519,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -10725,12 +10780,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "Сила иÑкажениÑ. Значение может варьироватьÑÑ Ð¾Ñ‚ 0 до 1." @@ -11278,7 +11327,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -11439,12 +11493,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -11595,6 +11653,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -11735,7 +11808,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -13428,7 +13504,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -13521,7 +13597,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -13549,9 +13627,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -14058,13 +14136,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -14090,8 +14169,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -14407,12 +14488,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -14457,8 +14538,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -14506,8 +14589,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -14569,7 +14655,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -14700,7 +14786,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -15412,17 +15501,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -15731,12 +15820,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -15773,12 +15863,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -16939,7 +17030,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -16965,7 +17064,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -17783,7 +17886,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -19793,7 +19898,7 @@ msgstr "" #: modules/csg/doc_classes/CSGShape.xml modules/csg/doc_classes/CSGSphere.xml #: modules/csg/doc_classes/CSGTorus.xml msgid "Prototyping levels with CSG" -msgstr "" +msgstr "Прототипирование уровней Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ CSG" #: modules/csg/doc_classes/CSGBox.xml msgid "Depth of the box measured from the center of the box." @@ -20542,7 +20647,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -20691,16 +20798,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -20846,18 +20954,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml #, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "Возвращает аркÑÐ¸Ð½ÑƒÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°." @@ -25796,8 +25892,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -26419,7 +26519,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -28012,10 +28114,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -29439,8 +29544,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -31744,11 +31849,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -32597,7 +32705,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -32609,6 +32721,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -35006,14 +35128,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -35021,22 +35143,26 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "Возвращает количеÑтво дорожек в анимации." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "Возвращает ÑкалÑрное произведение Ñ Ð²ÐµÐºÑ‚Ð¾Ñ€Ð¾Ð¼ [code]b[/code]." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "Возвращает ÑкалÑрное произведение Ñ Ð²ÐµÐºÑ‚Ð¾Ñ€Ð¾Ð¼ [code]b[/code]." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." -msgstr "" +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." +msgstr "Возвращает ÑкалÑрное произведение Ñ Ð²ÐµÐºÑ‚Ð¾Ñ€Ð¾Ð¼ [code]b[/code]." #: doc/classes/Line2D.xml msgid "" @@ -36316,8 +36442,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -36362,7 +36492,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -36617,9 +36750,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -37080,7 +37213,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -38230,7 +38365,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -39078,13 +39213,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -42839,7 +42986,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -48273,7 +48422,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "Возвращает ÑкалÑрное произведение Ñ Ð²ÐµÐºÑ‚Ð¾Ñ€Ð¾Ð¼ [code]b[/code]." #: doc/classes/PopupMenu.xml @@ -48515,7 +48666,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -49251,7 +49404,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51939,8 +52096,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -55575,11 +55743,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -56016,7 +56188,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -56161,13 +56335,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -56490,6 +56670,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -56502,7 +56694,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -57357,7 +57552,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -57983,6 +58181,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -58317,7 +58523,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -59755,7 +59963,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -61050,6 +61258,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -61111,6 +61322,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -61133,7 +61347,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -62274,6 +62491,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Возвращает ÑкалÑрное произведение Ñ Ð²ÐµÐºÑ‚Ð¾Ñ€Ð¾Ð¼ [code]b[/code]." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -62304,6 +62526,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Возвращает ÑкалÑрное произведение Ñ Ð²ÐµÐºÑ‚Ð¾Ñ€Ð¾Ð¼ [code]b[/code]." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -62345,8 +62572,12 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +#, fuzzy +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" +"ИзлучаетÑÑ Ð¿Ñ€Ð¸ нажатии пользовательÑкой кнопки. Смотрите [method add_button]." #: doc/classes/Tabs.xml msgid "Emitted when a tab is clicked, even if it is the current tab." @@ -63715,7 +63946,7 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" "Сдвигает вектор к [code]to[/code] на фикÑированное значение [code]delta[/" @@ -63724,7 +63955,7 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" "Сдвигает вектор к [code]to[/code] на фикÑированное значение [code]delta[/" @@ -63733,7 +63964,7 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" "Сдвигает вектор к [code]to[/code] на фикÑированное значение [code]delta[/" @@ -63742,7 +63973,8 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." msgstr "" "Сдвигает вектор к [code]to[/code] на фикÑированное значение [code]delta[/" "code]." @@ -63750,15 +63982,18 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "Возвращает [code]true[/code] еÑли маÑÑив Ñодержит [code]value[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" +"Сдвигает вектор к [code]to[/code] на фикÑированное значение [code]delta[/" +"code]." #: doc/classes/Theme.xml msgid "" @@ -63777,15 +64012,17 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "Возвращает [code]true[/code] еÑли маÑÑив Ñодержит [code]value[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." -msgstr "" +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." +msgstr "Возвращает [code]true[/code] еÑли маÑÑив Ñодержит [code]value[/code]." #: doc/classes/Theme.xml msgid "" @@ -63796,16 +64033,17 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "Возвращает [code]true[/code] еÑли маÑÑив Ñодержит [code]value[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Возвращает [code]true[/code] еÑли маÑÑив Ñодержит [code]value[/code]." #: doc/classes/Theme.xml msgid "" @@ -63816,16 +64054,17 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." -msgstr "" +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." +msgstr "Возвращает [code]true[/code] еÑли маÑÑив Ñодержит [code]value[/code]." #: doc/classes/Theme.xml msgid "" @@ -63837,14 +64076,15 @@ msgstr "" #, fuzzy msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." +"[code]theme_type[/code]." msgstr "Возвращает [code]true[/code] еÑли маÑÑив Ñодержит [code]value[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." -msgstr "" +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." +msgstr "Возвращает [code]true[/code] еÑли маÑÑив Ñодержит [code]value[/code]." #: doc/classes/Theme.xml msgid "" @@ -63855,17 +64095,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -63878,9 +64120,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -63888,8 +64130,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -63904,7 +64146,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -63924,18 +64166,23 @@ msgstr "Возвращает [code]true[/code] еÑли маÑÑив ÑодерР#, fuzzy msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" "Возвращает [code]true[/code] еÑли [code]a[/code] и [code]b[/code] " "приблизительно равны друг другу." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" +"Возвращает [code]true[/code] еÑли [code]a[/code] и [code]b[/code] " +"приблизительно равны друг другу." #: doc/classes/Theme.xml #, fuzzy @@ -63948,32 +64195,45 @@ msgstr "Возвращает [code]true[/code] еÑли маÑÑив ÑодерР#, fuzzy msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" "Возвращает [code]true[/code] еÑли [code]a[/code] и [code]b[/code] " "приблизительно равны друг другу." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" +"Возвращает [code]true[/code] еÑли [code]a[/code] и [code]b[/code] " +"приблизительно равны друг другу." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" +"Возвращает [code]true[/code] еÑли [code]a[/code] и [code]b[/code] " +"приблизительно равны друг другу." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" +"Возвращает [code]true[/code] еÑли [code]a[/code] и [code]b[/code] " +"приблизительно равны друг другу." #: doc/classes/Theme.xml #, fuzzy @@ -64001,90 +64261,115 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." -msgstr "" +msgstr "Возвращает [code]true[/code] еÑли маÑÑив Ñодержит [code]value[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." -msgstr "" +msgstr "Возвращает [code]true[/code] еÑли маÑÑив Ñодержит [code]value[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" +"Сдвигает вектор к [code]to[/code] на фикÑированное значение [code]delta[/" +"code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." -msgstr "" +msgstr "Возвращает [code]true[/code] еÑли маÑÑив Ñодержит [code]value[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." -msgstr "" +msgstr "Возвращает [code]true[/code] еÑли маÑÑив Ñодержит [code]value[/code]." #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"Возвращает [code]true[/code] еÑли [code]a[/code] и [code]b[/code] " +"приблизительно равны друг другу." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"Возвращает [code]true[/code] еÑли [code]a[/code] и [code]b[/code] " +"приблизительно равны друг другу." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"Возвращает [code]true[/code] еÑли [code]a[/code] и [code]b[/code] " +"приблизительно равны друг другу." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"Возвращает [code]true[/code] еÑли [code]a[/code] и [code]b[/code] " +"приблизительно равны друг другу." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"Возвращает [code]true[/code] еÑли [code]a[/code] и [code]b[/code] " +"приблизительно равны друг другу." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" +"Возвращает [code]true[/code] еÑли [code]a[/code] и [code]b[/code] " +"приблизительно равны друг другу." #: doc/classes/Theme.xml msgid "" @@ -67285,21 +67570,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -67312,7 +67601,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -67341,7 +67630,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -67351,22 +67672,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -67379,8 +67713,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -67578,16 +67914,16 @@ msgid "Unknown error." msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°." #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -73867,6 +74203,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -74193,8 +74533,9 @@ msgid "" msgstr "" #: doc/classes/VisualServer.xml +#, fuzzy msgid "The instance does not have a type." -msgstr "" +msgstr "Данный ÑкземплÑÑ€ не имеет типа." #: doc/classes/VisualServer.xml msgid "The instance is a mesh." @@ -74205,28 +74546,32 @@ msgid "The instance is a multimesh." msgstr "" #: doc/classes/VisualServer.xml +#, fuzzy msgid "The instance is an immediate geometry." -msgstr "" +msgstr "Дынный ÑкземплÑÑ€ - геометричеÑÐºÐ°Ñ Ñ„Ð¸Ð³ÑƒÑ€Ð°." #: doc/classes/VisualServer.xml msgid "The instance is a particle emitter." -msgstr "" +msgstr "Данный ÑкземплÑÑ€ - иÑточник чаÑтиц." #: doc/classes/VisualServer.xml +#, fuzzy msgid "The instance is a light." -msgstr "" +msgstr "Данный ÑкземплÑÑ€ - иÑточник оÑвещениÑ." #: doc/classes/VisualServer.xml msgid "The instance is a reflection probe." -msgstr "" +msgstr "Данный ÑкземплÑÑ€ - проба отражениÑ." #: doc/classes/VisualServer.xml +#, fuzzy msgid "The instance is a GI probe." -msgstr "" +msgstr "Данный ÑкземплÑÑ€ - проба GI." #: doc/classes/VisualServer.xml +#, fuzzy msgid "The instance is a lightmap capture." -msgstr "" +msgstr "Данный ÑкземплÑÑ€ - Ð·Ð°Ñ…Ð²Ð°Ñ‡ÐµÐ½Ð½Ð°Ñ ÐºÐ°Ñ€Ñ‚Ð° оÑвещениÑ." #: doc/classes/VisualServer.xml msgid "Represents the size of the [enum InstanceType] enum." @@ -74252,7 +74597,7 @@ msgstr "" #: doc/classes/VisualServer.xml msgid "Disable shadows from this instance." -msgstr "" +msgstr "Отключает тени в данном ÑкземплÑре." #: doc/classes/VisualServer.xml msgid "Cast shadows from this instance." @@ -74300,8 +74645,9 @@ msgid "The light adds color depending on mask." msgstr "" #: doc/classes/VisualServer.xml +#, fuzzy msgid "Do not apply a filter to canvas light shadows." -msgstr "" +msgstr "Ðе применÑет фильтры на холÑÑ‚ теней." #: doc/classes/VisualServer.xml msgid "Use PCF3 filtering to filter canvas light shadows." @@ -74363,19 +74709,20 @@ msgstr "" #: doc/classes/VisualServer.xml msgid "The amount of surface changes in the frame." -msgstr "" +msgstr "КоличеÑтво изменений поверхноÑти в кадр." #: doc/classes/VisualServer.xml msgid "The amount of draw calls in frame." -msgstr "" +msgstr "КоличеÑтво вызовов отриÑовки в кадр." #: doc/classes/VisualServer.xml +#, fuzzy msgid "The amount of 2d items in the frame." -msgstr "" +msgstr "КоличеÑтво 2d-объектов в кадре." #: doc/classes/VisualServer.xml msgid "The amount of 2d draw calls in frame." -msgstr "" +msgstr "КоличеÑтво вызовов отриÑовки 2d в кадре." #: doc/classes/VisualServer.xml msgid "Hardware supports shaders. This enum is currently unused in Godot 3.x." @@ -74419,34 +74766,45 @@ msgid "" msgstr "" #: doc/classes/VisualServer.xml +#, fuzzy msgid "MultiMesh custom data uses a float per component." msgstr "" +"ПользовательÑкие данные MultiMesh иÑпользуют Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ‡Ð¸Ñло Ñ Ð¿Ð»Ð°Ð²Ð°ÑŽÑ‰ÐµÐ¹ " +"точкой." #: doc/classes/VisualServer.xml +#, fuzzy msgid "Reflection probe will update reflections once and then stop." -msgstr "" +msgstr "Проба Ð¾Ñ‚Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ обновлена единожды и затем оÑтановлена." #: doc/classes/VisualServer.xml +#, fuzzy msgid "" "Reflection probe will update each frame. This mode is necessary to capture " "moving objects." msgstr "" +"Проба Ð¾Ñ‚Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ обновлÑтьÑÑ ÐºÐ°Ð¶Ð´Ñ‹Ð¹ кадр. Режим нужен Ð´Ð»Ñ Ð·Ð°Ñ…Ð²Ð°Ñ‚Ð° " +"движущихÑÑ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð²." #: doc/classes/VisualServer.xml +#, fuzzy msgid "Draw particles in the order that they appear in the particles array." -msgstr "" +msgstr "ОтриÑует чаÑтицы иÑÑ…Ð¾Ð´Ñ Ð¸Ð· их раÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² маÑÑиве" #: doc/classes/VisualServer.xml +#, fuzzy msgid "Sort particles based on their lifetime." -msgstr "" +msgstr "ОтÑортирует чаÑтицы иÑÑ…Ð¾Ð´Ñ Ð¸Ð· их времени жизни." #: doc/classes/VisualServer.xml +#, fuzzy msgid "Sort particles based on their distance to the camera." -msgstr "" +msgstr "ОтÑортирует чаÑтицы иÑÑ…Ð¾Ð´Ñ Ð¸Ð· раÑÑтоÑÐ½Ð¸Ñ Ð¾Ñ‚ камеры" #: doc/classes/VisualServer.xml +#, fuzzy msgid "Use the clear color as background." -msgstr "" +msgstr "ИÑпользуйте Ñплошной цвет как задний фон." #: doc/classes/VisualServer.xml msgid "Use a specified color as the background." @@ -76410,7 +76768,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml @@ -77856,6 +78216,14 @@ msgid "" "the same space as the parent YSort, allowing to better organize a scene or " "divide it in multiple ones, yet keep the unique sorting." msgstr "" +"Сортировка вÑех дочерних узлов на оÑнове их Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ оÑи Y. Ð”Ð»Ñ " +"Ñортировки дочерний узел должен наÑледоватьÑÑ Ð¾Ñ‚ [CanvasItem]. Узлы, имеющие " +"более выÑокую позицию по Y, будут отриÑованы позже, поÑтому они поÑвÑÑ‚ÑÑ " +"поверх узлов, имеющих более низкую позицию по Y.\n" +"ВложенноÑть узлов YSort возможна. Дочерние узлы YSort будут отÑортированы в " +"том же проÑтранÑтве, что и родительÑкий YSort, что позволÑет лучше " +"организовать Ñцену или разделить ее на неÑколько, ÑохранÑÑ Ð¿Ñ€Ð¸ Ñтом " +"уникальную Ñортировку." #: doc/classes/YSort.xml msgid "" diff --git a/doc/translations/sk.po b/doc/translations/sk.po index ddcdeb10f1..e5562df057 100644 --- a/doc/translations/sk.po +++ b/doc/translations/sk.po @@ -541,8 +541,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -552,7 +553,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -606,7 +608,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -618,7 +621,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1033,10 +1037,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4847,19 +4856,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4880,21 +4891,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4903,9 +4918,10 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -5557,9 +5573,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -5733,8 +5749,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -6445,7 +6461,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -6682,7 +6703,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -7330,7 +7356,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -8736,8 +8770,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8788,10 +8823,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9033,12 +9078,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9584,7 +9623,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9745,12 +9789,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9898,6 +9946,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10038,7 +10101,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11716,7 +11782,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11809,7 +11875,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11837,9 +11905,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12336,13 +12404,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -12368,8 +12437,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12682,12 +12753,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12732,8 +12803,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12781,8 +12854,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12844,7 +12920,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12969,7 +13045,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -13674,17 +13753,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -13991,12 +14070,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14033,12 +14113,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -15198,7 +15279,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -15224,7 +15313,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -15965,7 +16058,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18690,7 +18785,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18839,16 +18936,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -18993,18 +19091,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23911,8 +23997,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24532,7 +24622,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26116,10 +26208,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27526,8 +27621,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -29827,11 +29922,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30676,7 +30774,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30688,6 +30790,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33045,14 +33157,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33060,21 +33172,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34350,8 +34462,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -34396,7 +34512,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -34651,9 +34770,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35112,7 +35231,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36224,7 +36345,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37039,13 +37160,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40709,7 +40842,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46073,7 +46208,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46312,7 +46449,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47041,7 +47180,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49722,8 +49865,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53299,11 +53453,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -53740,7 +53898,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53884,13 +54044,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -54213,6 +54379,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -54225,7 +54403,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55080,7 +55261,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55699,6 +55883,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56033,7 +56225,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57466,7 +57660,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58731,6 +58925,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -58792,6 +58989,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -58814,7 +59014,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -59951,6 +60154,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -59980,6 +60187,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60021,7 +60232,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -61371,37 +61584,38 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61420,14 +61634,15 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61438,14 +61653,14 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" @@ -61458,7 +61673,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" @@ -61466,7 +61681,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61478,13 +61693,13 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." +"[code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61496,17 +61711,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -61519,9 +61736,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -61529,8 +61746,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -61545,7 +61762,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -61563,15 +61780,17 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61583,29 +61802,33 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61633,87 +61856,87 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -64886,21 +65109,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64913,7 +65140,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -64942,7 +65169,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -64952,22 +65211,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -64980,8 +65252,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65179,16 +65453,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -71282,6 +71556,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -73818,7 +74096,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/sr_Cyrl.po b/doc/translations/sr_Cyrl.po index 6a336f195b..e202b72696 100644 --- a/doc/translations/sr_Cyrl.po +++ b/doc/translations/sr_Cyrl.po @@ -552,8 +552,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -563,7 +564,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -617,7 +619,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -629,7 +632,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1044,10 +1048,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4858,19 +4867,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4891,21 +4902,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4914,9 +4929,10 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -5568,9 +5584,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -5744,8 +5760,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -6456,7 +6472,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -6693,7 +6714,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -7341,7 +7367,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -8747,8 +8781,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8799,10 +8834,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9044,12 +9089,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9595,7 +9634,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9756,12 +9800,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9909,6 +9957,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10049,7 +10112,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11727,7 +11793,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11820,7 +11886,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11848,9 +11916,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12347,13 +12415,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -12379,8 +12448,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12693,12 +12764,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12743,8 +12814,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12792,8 +12865,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12855,7 +12931,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12980,7 +13056,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -13685,17 +13764,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -14002,12 +14081,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14044,12 +14124,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -15209,7 +15290,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -15235,7 +15324,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -15976,7 +16069,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18701,7 +18796,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18850,16 +18947,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19004,18 +19102,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23922,8 +24008,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24543,7 +24633,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26127,10 +26219,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27537,8 +27632,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -29838,11 +29933,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30687,7 +30785,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30699,6 +30801,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33056,14 +33168,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33071,21 +33183,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34361,8 +34473,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -34407,7 +34523,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -34662,9 +34781,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35123,7 +35242,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36235,7 +36356,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37050,13 +37171,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40720,7 +40853,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46084,7 +46219,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46323,7 +46460,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47052,7 +47191,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49733,8 +49876,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53310,11 +53464,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -53751,7 +53909,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53895,13 +54055,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -54224,6 +54390,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -54236,7 +54414,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55091,7 +55272,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55710,6 +55894,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56044,7 +56236,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57477,7 +57671,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58742,6 +58936,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -58803,6 +59000,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -58825,7 +59025,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -59962,6 +60165,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -59991,6 +60198,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60032,7 +60243,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -61382,37 +61595,38 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61431,14 +61645,15 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61449,14 +61664,14 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" @@ -61469,7 +61684,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" @@ -61477,7 +61692,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61489,13 +61704,13 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." +"[code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61507,17 +61722,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -61530,9 +61747,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -61540,8 +61757,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -61556,7 +61773,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -61574,15 +61791,17 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61594,29 +61813,33 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61644,87 +61867,87 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -64897,21 +65120,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64924,7 +65151,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -64953,7 +65180,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -64963,22 +65222,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -64991,8 +65263,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65190,16 +65464,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -71293,6 +71567,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -73829,7 +74107,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/sv.po b/doc/translations/sv.po index b582952401..1bd56a7518 100644 --- a/doc/translations/sv.po +++ b/doc/translations/sv.po @@ -542,8 +542,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -553,7 +554,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -607,7 +609,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -619,7 +622,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1034,10 +1038,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4848,19 +4857,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4881,21 +4892,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4904,9 +4919,10 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -5558,9 +5574,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -5734,8 +5750,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -6446,7 +6462,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -6683,7 +6704,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -7331,7 +7357,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -8737,8 +8771,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8789,10 +8824,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9034,12 +9079,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9585,7 +9624,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9746,12 +9790,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9899,6 +9947,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10039,7 +10102,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11717,7 +11783,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11810,7 +11876,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11838,9 +11906,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12337,13 +12405,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -12369,8 +12438,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12683,12 +12754,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12733,8 +12804,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12782,8 +12855,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12845,7 +12921,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12970,7 +13046,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -13675,17 +13754,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -13992,12 +14071,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14034,12 +14114,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -15199,7 +15280,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -15225,7 +15314,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -15966,7 +16059,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18691,7 +18786,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18840,16 +18937,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -18994,18 +19092,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23909,8 +23995,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24530,7 +24620,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26114,10 +26206,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27524,8 +27619,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -29825,11 +29920,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30674,7 +30772,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30686,6 +30788,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33043,14 +33155,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33058,21 +33170,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34348,8 +34460,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -34394,7 +34510,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -34649,9 +34768,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35110,7 +35229,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36222,7 +36343,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37037,13 +37158,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40707,7 +40840,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46071,7 +46206,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46310,7 +46447,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47039,7 +47178,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49720,8 +49863,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53297,11 +53451,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -53738,7 +53896,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53882,13 +54042,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -54211,6 +54377,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -54223,7 +54401,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55078,7 +55259,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55697,6 +55881,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56031,7 +56223,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57464,7 +57658,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58729,6 +58923,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -58790,6 +58987,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -58812,7 +59012,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -59949,6 +60152,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -59978,6 +60185,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60019,7 +60230,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -61369,37 +61582,38 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61418,14 +61632,15 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61436,14 +61651,14 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" @@ -61456,7 +61671,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" @@ -61464,7 +61679,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61476,13 +61691,13 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." +"[code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61494,17 +61709,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -61517,9 +61734,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -61527,8 +61744,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -61543,7 +61760,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -61561,15 +61778,17 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61581,29 +61800,33 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61631,87 +61854,87 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -64884,21 +65107,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64911,7 +65138,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -64940,7 +65167,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -64950,22 +65209,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -64978,8 +65250,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65177,16 +65451,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -71280,6 +71554,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -73816,7 +74094,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/th.po b/doc/translations/th.po index 3b8c2afd36..6253763623 100644 --- a/doc/translations/th.po +++ b/doc/translations/th.po @@ -619,8 +619,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -630,7 +631,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -684,7 +686,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -696,7 +699,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1118,10 +1122,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4948,19 +4957,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4981,21 +4992,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -5005,9 +5020,10 @@ msgstr "คืนค่าชื่à¸à¸‚à¸à¸‡à¸à¸¸à¸›à¸à¸£à¸“์เสีย #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -5660,9 +5676,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -5837,8 +5853,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -6550,7 +6566,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -6787,7 +6808,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -7435,7 +7461,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -8841,8 +8875,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8893,10 +8928,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9139,12 +9184,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9690,7 +9729,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9851,12 +9895,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10004,6 +10052,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10144,7 +10207,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11822,7 +11888,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11915,7 +11981,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11943,9 +12011,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12444,13 +12512,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -12476,8 +12545,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12790,12 +12861,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12840,8 +12911,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12889,8 +12962,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12952,7 +13028,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13077,7 +13153,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -13782,17 +13861,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -14099,12 +14178,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14141,12 +14221,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -15306,7 +15387,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -15332,7 +15421,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -16074,7 +16167,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18799,7 +18894,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18948,16 +19045,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19102,18 +19200,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -24022,8 +24108,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24644,7 +24734,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26231,10 +26323,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27642,8 +27737,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -29965,11 +30060,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30834,7 +30932,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30846,6 +30948,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33215,14 +33327,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33230,22 +33342,26 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "คืนค่าà¸à¸²à¸£à¸à¸³à¸«à¸™à¸”ค่าขà¸à¸‡à¸¥à¸³à¹‚พง" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "คืนค่าà¸à¸²à¸£à¸à¸³à¸«à¸™à¸”ค่าขà¸à¸‡à¸¥à¸³à¹‚พง" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "คืนค่าà¸à¸²à¸£à¸à¸³à¸«à¸™à¸”ค่าขà¸à¸‡à¸¥à¸³à¹‚พง" #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." -msgstr "" +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." +msgstr "คืนค่าà¸à¸²à¸£à¸à¸³à¸«à¸™à¸”ค่าขà¸à¸‡à¸¥à¸³à¹‚พง" #: doc/classes/Line2D.xml msgid "" @@ -34520,8 +34636,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -34566,7 +34686,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -34821,9 +34944,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35283,7 +35406,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36409,7 +36534,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37228,13 +37353,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40951,7 +41088,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46323,7 +46462,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "คืนค่าà¸à¸²à¸£à¸à¸³à¸«à¸™à¸”ค่าขà¸à¸‡à¸¥à¸³à¹‚พง" #: doc/classes/PopupMenu.xml @@ -46562,7 +46703,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47291,7 +47434,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49977,8 +50124,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53557,11 +53715,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -53998,7 +54160,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -54142,13 +54306,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -54471,6 +54641,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -54483,7 +54665,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55338,7 +55523,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55957,6 +56145,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56291,7 +56487,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57725,7 +57923,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58992,6 +59190,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -59053,6 +59254,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -59075,7 +59279,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60212,6 +60419,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "คืนค่าà¸à¸²à¸£à¸à¸³à¸«à¸™à¸”ค่าขà¸à¸‡à¸¥à¸³à¹‚พง" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60241,6 +60453,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "คืนค่าà¸à¸²à¸£à¸à¸³à¸«à¸™à¸”ค่าขà¸à¸‡à¸¥à¸³à¹‚พง" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60282,7 +60499,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -61635,38 +61854,44 @@ msgid "Clears all values on the theme." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "คืนค่าà¸à¸²à¸£à¸à¸³à¸«à¸™à¸”ค่าขà¸à¸‡à¸¥à¸³à¹‚พง" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "คืนค่าà¸à¸²à¸£à¸à¸³à¸«à¸™à¸”ค่าขà¸à¸‡à¸¥à¸³à¹‚พง" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "คืนค่าà¸à¸²à¸£à¸à¸³à¸«à¸™à¸”ค่าขà¸à¸‡à¸¥à¸³à¹‚พง" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." -msgstr "" +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." +msgstr "คืนค่าà¸à¸²à¸£à¸à¸³à¸«à¸™à¸”ค่าขà¸à¸‡à¸¥à¸³à¹‚พง" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "คืนค่าà¸à¸²à¸£à¸à¸³à¸«à¸™à¸”ค่าขà¸à¸‡à¸¥à¸³à¹‚พง" #: doc/classes/Theme.xml msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61684,15 +61909,17 @@ msgid "Sets the theme's values to a copy of a given theme." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "คืนค่าà¸à¸²à¸£à¸à¸³à¸«à¸™à¸”ค่าขà¸à¸‡à¸¥à¸³à¹‚พง" #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61702,15 +61929,16 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "คืนค่าà¸à¸²à¸£à¸à¸³à¸«à¸™à¸”ค่าขà¸à¸‡à¸¥à¸³à¹‚พง" #: doc/classes/Theme.xml msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" @@ -61723,7 +61951,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" @@ -61731,7 +61959,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61741,15 +61969,16 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." -msgstr "" +"[code]theme_type[/code]." +msgstr "คืนค่าà¸à¸²à¸£à¸à¸³à¸«à¸™à¸”ค่าขà¸à¸‡à¸¥à¸³à¹‚พง" #: doc/classes/Theme.xml msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61761,17 +61990,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -61784,9 +62015,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -61794,8 +62025,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -61810,7 +62041,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -61828,15 +62059,17 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61848,29 +62081,33 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61898,87 +62135,87 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -65152,21 +65389,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65179,7 +65420,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65208,7 +65449,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65218,22 +65491,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65246,8 +65532,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65445,16 +65733,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -71564,6 +71852,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -74103,7 +74395,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/tl.po b/doc/translations/tl.po index 6fe51a2de6..0dae96a014 100644 --- a/doc/translations/tl.po +++ b/doc/translations/tl.po @@ -617,8 +617,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -628,7 +629,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -682,7 +684,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -694,7 +697,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1109,10 +1113,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4923,19 +4932,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4956,21 +4967,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4979,9 +4994,10 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -5633,9 +5649,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -5809,8 +5825,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -6521,7 +6537,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -6758,7 +6779,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -7406,7 +7432,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -8812,8 +8846,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8864,10 +8899,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9109,12 +9154,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9664,7 +9703,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9825,12 +9869,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9978,6 +10026,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10118,7 +10181,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11796,7 +11862,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11889,7 +11955,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11917,9 +11985,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12419,13 +12487,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -12451,8 +12520,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12765,12 +12836,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12815,8 +12886,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12864,8 +12937,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12927,7 +13003,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13052,7 +13128,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -13757,17 +13836,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -14074,12 +14153,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14116,12 +14196,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -15281,7 +15362,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -15307,7 +15396,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -16048,7 +16141,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18773,7 +18868,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18922,16 +19019,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19076,18 +19174,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23997,8 +24083,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24618,7 +24708,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26202,10 +26294,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27612,8 +27707,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -29913,11 +30008,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30762,7 +30860,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30774,6 +30876,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33140,14 +33252,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33155,21 +33267,24 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" +"Kung [code]true[/code], ang mga child nodes ay inaayos, kung hindi ang pag-" +"so-sort ay hindi pinapagana." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34448,8 +34563,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -34494,7 +34613,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -34749,9 +34871,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35210,7 +35332,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36334,7 +36458,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37149,13 +37273,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40819,7 +40955,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46186,7 +46324,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46425,7 +46565,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47154,7 +47296,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49835,8 +49981,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53412,11 +53569,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -53853,7 +54014,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53997,13 +54160,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -54326,6 +54495,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -54338,7 +54519,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55193,7 +55377,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55812,6 +55999,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56146,7 +56341,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57579,7 +57776,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58844,6 +59041,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -58905,6 +59105,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -58927,7 +59130,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60064,6 +60270,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60093,6 +60303,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60134,7 +60348,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -61489,38 +61705,54 @@ msgid "Clears all values on the theme." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" +"Kung [code]true[/code], ang mga child nodes ay inaayos, kung hindi ang pag-" +"so-sort ay hindi pinapagana." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" +"Kung [code]true[/code], ang mga child nodes ay inaayos, kung hindi ang pag-" +"so-sort ay hindi pinapagana." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" +"Kung [code]true[/code], ang mga child nodes ay inaayos, kung hindi ang pag-" +"so-sort ay hindi pinapagana." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." msgstr "" +"Kung [code]true[/code], ang mga child nodes ay inaayos, kung hindi ang pag-" +"so-sort ay hindi pinapagana." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" +"Kung [code]true[/code], ang mga child nodes ay inaayos, kung hindi ang pag-" +"so-sort ay hindi pinapagana." #: doc/classes/Theme.xml msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61538,15 +61770,19 @@ msgid "Sets the theme's values to a copy of a given theme." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" +"Kung [code]true[/code], ang mga child nodes ay inaayos, kung hindi ang pag-" +"so-sort ay hindi pinapagana." #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61556,15 +61792,18 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" +"Kung [code]true[/code], ang mga child nodes ay inaayos, kung hindi ang pag-" +"so-sort ay hindi pinapagana." #: doc/classes/Theme.xml msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" @@ -61577,7 +61816,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" @@ -61585,7 +61824,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61595,15 +61834,18 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." +"[code]theme_type[/code]." msgstr "" +"Kung [code]true[/code], ang mga child nodes ay inaayos, kung hindi ang pag-" +"so-sort ay hindi pinapagana." #: doc/classes/Theme.xml msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -61615,17 +61857,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -61638,9 +61882,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -61648,8 +61892,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -61664,7 +61908,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -61682,15 +61926,17 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61702,29 +61948,33 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61752,87 +62002,87 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -65008,21 +65258,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65035,7 +65289,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65064,7 +65318,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65074,22 +65360,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65102,8 +65401,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65301,16 +65602,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -71407,6 +71708,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -73943,7 +74248,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/tr.po b/doc/translations/tr.po index ffa15621df..4e6f4096d5 100644 --- a/doc/translations/tr.po +++ b/doc/translations/tr.po @@ -21,12 +21,13 @@ # paledega <paledega@yandex.ru>, 2022. # Yekez <yasintonge@gmail.com>, 2022. # Deleted User <noreply+46858@weblate.org>, 2022. +# Mustafa Said AÄŸca <m.said.agca@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-07-23 03:56+0000\n" -"Last-Translator: Deleted User <noreply+46858@weblate.org>\n" +"PO-Revision-Date: 2022-08-08 15:59+0000\n" +"Last-Translator: Mustafa Said AÄŸca <m.said.agca@gmail.com>\n" "Language-Team: Turkish <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/tr/>\n" "Language: tr\n" @@ -90,7 +91,7 @@ msgstr "Kalıtılan:" #: doc/tools/make_rst.py msgid "(overrides %s)" -msgstr "" +msgstr "(%s'yi geçersiz kılar)" #: doc/tools/make_rst.py msgid "Default" @@ -808,8 +809,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -819,7 +821,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -899,7 +902,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -911,7 +915,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" "DoÄŸrusal olarak iki sayı arasında, sınırlandırma öğesine (0 ila 1 arasında) " "göre ara deÄŸer hesaplar (interpolate). [method inverse_lerp] yönteminin " @@ -1590,18 +1595,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" -"[code]value[/code] deÄŸerini [code][istart, istop][/code] aralığından yola " -"çıkarak [code][ostart, ostop][/code] aralığındaki karşılığına ölçekledirerek " -"yerleÅŸtirir (haritalandırır).\n" -"[codeblock]\n" -"range_lerp(75, 0, 100, -1, 1) # 0.5 sonucunu döndürür. value=75, ilk aralık " -"0 ila100, ikinci aralık -1 ila 1.\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml #, fuzzy @@ -5636,19 +5639,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -5669,21 +5674,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -5693,9 +5702,10 @@ msgstr "Verilen deÄŸerin tanjantını döndürür." #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -6347,9 +6357,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -6523,8 +6533,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -7235,7 +7245,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -7472,7 +7487,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -8120,7 +8140,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -9526,8 +9554,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -9578,10 +9607,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9824,12 +9863,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -10375,7 +10408,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10536,12 +10574,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10689,6 +10731,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10829,7 +10886,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -12509,7 +12569,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -12602,7 +12662,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -12630,9 +12692,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -13140,13 +13202,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -13172,8 +13235,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -13486,12 +13551,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13536,8 +13601,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -13585,8 +13652,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -13648,7 +13718,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13773,7 +13843,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -14478,17 +14551,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -14795,12 +14868,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14837,12 +14911,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -16004,7 +16079,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -16030,7 +16113,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -16771,7 +16858,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -19502,7 +19591,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -19651,16 +19742,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19806,18 +19898,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml #, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "Verilen bir deÄŸerin ark-sinüsünü döndürür." @@ -24736,8 +24816,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -25362,7 +25446,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26952,10 +27038,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -28368,8 +28457,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -30671,11 +30760,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -31521,7 +31613,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -31533,6 +31629,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33901,14 +34007,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33916,22 +34022,26 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "Verilen deÄŸerin sinüsünü döndürür." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "Verilen deÄŸerin sinüsünü döndürür." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "Verilen deÄŸerin sinüsünü döndürür." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." -msgstr "" +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." +msgstr "Verilen deÄŸerin sinüsünü döndürür." #: doc/classes/Line2D.xml msgid "" @@ -35210,8 +35320,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -35256,7 +35370,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -35511,9 +35628,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35974,7 +36091,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -37114,7 +37233,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37944,13 +38063,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -41620,7 +41751,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -47017,7 +47150,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "Verilen deÄŸerin sinüsünü döndürür." #: doc/classes/PopupMenu.xml @@ -47256,7 +47391,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47986,7 +48123,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -50667,8 +50808,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -54253,11 +54405,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -54694,7 +54850,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -54838,13 +54996,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55167,6 +55331,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -55179,7 +55355,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -56034,7 +56213,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -56653,6 +56835,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56987,7 +57177,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -58422,7 +58614,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -59689,6 +59881,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -59750,6 +59945,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -59772,7 +59970,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60909,6 +61110,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Verilen deÄŸerin sinüsünü döndürür." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60939,6 +61145,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Verilen deÄŸerin sinüsünü döndürür." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60980,7 +61191,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -62340,38 +62553,44 @@ msgid "Clears all values on the theme." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "İki vektörün kalanını döndürür." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Verilen deÄŸerin sinüsünü döndürür." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "İki vektörün kalanını döndürür." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." -msgstr "" +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." +msgstr "İki vektörün kalanını döndürür." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "İki vektörün kalanını döndürür." #: doc/classes/Theme.xml msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -62389,15 +62608,17 @@ msgid "Sets the theme's values to a copy of a given theme." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "İki vektörün kalanını döndürür." #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -62407,15 +62628,16 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "İki vektörün kalanını döndürür." #: doc/classes/Theme.xml msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" @@ -62428,7 +62650,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" @@ -62436,7 +62658,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -62446,15 +62668,16 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." -msgstr "" +"[code]theme_type[/code]." +msgstr "İki vektörün kalanını döndürür." #: doc/classes/Theme.xml msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -62466,17 +62689,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -62489,9 +62714,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -62499,8 +62724,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -62515,7 +62740,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -62534,15 +62759,17 @@ msgstr "İki vektörün kalanını döndürür." #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -62554,29 +62781,33 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -62604,87 +62835,87 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -65865,21 +66096,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65892,7 +66127,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65921,7 +66156,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65931,22 +66198,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65959,8 +66239,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -66158,16 +66440,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -72293,6 +72575,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -74832,7 +75118,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/uk.po b/doc/translations/uk.po index b1272c6b3e..613cc32ed3 100644 --- a/doc/translations/uk.po +++ b/doc/translations/uk.po @@ -13,12 +13,14 @@ # Vladyslav Anisimov <uniss@ua.fm>, 2022. # МироÑлав <hlopukmyroslav@gmail.com>, 2022. # Гліб Соколов <ramithes@i.ua>, 2022. +# Yan Chen <cyan97087@gmail.com>, 2022. +# Богдан Матвіїв <bomtvv@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-06-14 15:48+0000\n" -"Last-Translator: МироÑлав <hlopukmyroslav@gmail.com>\n" +"PO-Revision-Date: 2022-08-23 03:39+0000\n" +"Last-Translator: Богдан Матвіїв <bomtvv@gmail.com>\n" "Language-Team: Ukrainian <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/uk/>\n" "Language: uk\n" @@ -27,7 +29,7 @@ msgstr "" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -70,9 +72,8 @@ msgid "Method Descriptions" msgstr "ОпиÑи методів" #: doc/tools/make_rst.py -#, fuzzy msgid "Theme Property Descriptions" -msgstr "ОпиÑи ВлаÑтивоÑтей Теми" +msgstr "ОпиÑи тематичної нерухомоÑті" #: doc/tools/make_rst.py msgid "Inherits:" @@ -441,18 +442,15 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Returns the hyperbolic cosine of [code]s[/code] in radians.\n" "[codeblock]\n" "print(cosh(1)) # Prints 1.543081\n" "[/codeblock]" msgstr "" -"Повертає абÑолютне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ [code]s[/code] (тобто Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð±ÐµÐ· " -"знака, працює Ð´Ð»Ñ Ñ†Ñ–Ð»Ð¸Ñ… чиÑел Ñ– чиÑел із рухомою крапкою).\n" +"Повертає гіперболічний коÑÐ¸Ð½ÑƒÑ [code]s[/code] у радіанах.\n" "[codeblock]\n" -"# a дорівнює 1\n" -"a = abs(-1)\n" +"print(cosh(1)) # Виведе 1.543081\n" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml @@ -676,8 +674,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -687,7 +686,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -741,7 +741,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -753,7 +754,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -944,7 +946,6 @@ msgid "" msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Returns the result of [code]base[/code] raised to the power of [code]exp[/" "code].\n" @@ -952,12 +953,9 @@ msgid "" "pow(2, 5) # Returns 32.0\n" "[/codeblock]" msgstr "" -"Повертає аркÑÐ¸Ð½ÑƒÑ [code]s[/code] у радіанах. ВикориÑтовуєтьÑÑ Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ " -"кута ÑинуÑа [code]s[/code].\n" +"Повертає результат [code]base[/code], піднÑтий до Ñтепеню [code]exp[/code].\n" "[codeblock]\n" -"# s дорівнює 0.523599 або 30 градуÑів, Ñкщо конвертувати за допомогою " -"rad2deg(s)\n" -"s = asin(0.5)\n" +"pow(2, 5) # Повертає 32.0\n" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1176,10 +1174,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4998,19 +5001,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -5031,21 +5036,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -5055,9 +5064,10 @@ msgstr "Повертає Ñ‚Ð°Ð½Ð³ÐµÐ½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°." #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -5709,9 +5719,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -5885,8 +5895,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -6603,7 +6613,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -6840,7 +6855,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -7488,7 +7508,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -8894,8 +8922,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8946,12 +8975,22 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" +msgstr "Звукові шини" + #: doc/classes/AudioEffectCapture.xml msgid "" "Returns [code]true[/code] if at least [code]frames[/code] audio frames are " @@ -9192,12 +9231,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "Звукові шини" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9743,7 +9776,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9904,12 +9942,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10057,6 +10099,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10197,7 +10254,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11878,7 +11938,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11971,7 +12031,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11999,9 +12061,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12503,13 +12565,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -12535,8 +12598,10 @@ msgstr "ВлаÑне Ð¼Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð² 2D" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12849,12 +12914,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12899,8 +12964,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12948,8 +13015,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -13011,7 +13081,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13136,7 +13206,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -13841,17 +13914,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -14159,12 +14232,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14201,12 +14275,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -15366,7 +15441,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -15392,7 +15475,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -16133,7 +16220,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18864,7 +18953,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -19013,16 +19104,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19168,18 +19260,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml #, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "Повертає аркÑÐ¸Ð½ÑƒÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°." @@ -24091,8 +24171,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24713,7 +24797,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26301,10 +26387,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27720,8 +27809,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -30023,11 +30112,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30873,7 +30965,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30885,6 +30981,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33246,14 +33352,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33261,22 +33367,26 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "Повертає мінімальний кут до заданого вектора у радіанах." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "ОбчиÑлює векторний добуток цього вектора Ñ– [code]b[/code]." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "ОбчиÑлює векторний добуток двох векторів та [code]with[/code]." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." -msgstr "" +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." +msgstr "ОбчиÑлює векторний добуток цього вектора Ñ– [code]b[/code]." #: doc/classes/Line2D.xml msgid "" @@ -34552,8 +34662,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -34598,7 +34712,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -34853,9 +34970,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35316,7 +35433,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36455,7 +36574,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37281,13 +37400,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40957,7 +41088,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -41918,7 +42051,6 @@ msgid "" msgstr "" #: doc/classes/PacketPeer.xml -#, fuzzy msgid "" "[i]Deprecated.[/i] Use [code]get_var[/code] and [code]put_var[/code] " "parameters instead.\n" @@ -41928,12 +42060,14 @@ msgid "" "Do not use this option if the serialized object comes from untrusted sources " "to avoid potential security threats such as remote code execution." msgstr "" -"Декодує маÑив байтів назад у значеннÑ. Якщо [code]allow_objects[/code] " -"дорівнює [code]true[/code], Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ð±'єктів дозволено.\n" -"[b]ПОПЕРЕДЖЕÐÐЯ:[/b] деÑеріалізований об'єкт може міÑтити виконуваний код. " -"Ðе викориÑтовуйте цю опцію, Ñкщо Ñеріалізований об'єкт отримано із " -"неперевірених джерел Ð·Ð°Ð´Ð»Ñ ÑƒÐ½Ð¸ÐºÐ½ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‚ÐµÐ½Ñ†Ñ–Ð¹Ð½Ð¸Ñ… порушень безпеки " -"(віддаленого Ð²Ð¸ÐºÐ¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð´Ñƒ)." +"[i]ЗаÑтаріло.[/i] ÐатоміÑть викориÑтовуйте параметри [code]get_var[/code] Ñ– " +"[code]put_var[/code].\n" +"Якщо [code]true[/code], PacketPeer дозволить кодувати та декодувати об’єкт " +"за допомогою [method get_var] Ñ– [method put_var].\n" +"[b]ПопередженнÑ: [/b] ДеÑеріалізовані об’єкти можуть міÑтити код, Ñкий " +"виконуєтьÑÑ. Ðе викориÑтовуйте цей параметр, Ñкщо Ñеріалізований об’єкт " +"походить із ненадійних джерел, щоб уникнути потенційних загроз безпеці, " +"наприклад віддаленого Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð´Ñƒ." #: doc/classes/PacketPeer.xml msgid "" @@ -46345,7 +46479,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "ОбчиÑлює векторний добуток двох векторів та [code]with[/code]." #: doc/classes/PopupMenu.xml @@ -46584,7 +46720,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47314,7 +47452,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49995,8 +50137,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53574,11 +53727,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -54015,7 +54172,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -54159,13 +54318,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -54488,6 +54653,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -54500,7 +54677,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55355,7 +55535,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55975,6 +56158,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56309,7 +56500,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57743,7 +57936,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -59010,6 +59203,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -59071,6 +59267,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -59093,7 +59292,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60230,6 +60432,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "ОбчиÑлює векторний добуток цього вектора Ñ– [code]b[/code]." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60260,6 +60467,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "ОбчиÑлює векторний добуток цього вектора Ñ– [code]b[/code]." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60301,7 +60513,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -61659,39 +61873,46 @@ msgid "Clears all values on the theme." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "ОбчиÑлює векторний добуток двох векторів та [code]with[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "ОбчиÑлює векторний добуток двох векторів та [code]with[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "ОбчиÑлює векторний добуток двох векторів та [code]with[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." -msgstr "" +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." +msgstr "ОбчиÑлює векторний добуток двох векторів та [code]with[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "ОбчиÑлює векторний добуток двох векторів та [code]with[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." -msgstr "" +"theme has [code]theme_type[/code]." +msgstr "ОбчиÑлює векторний добуток двох векторів та [code]with[/code]." #: doc/classes/Theme.xml msgid "" @@ -61708,15 +61929,17 @@ msgid "Sets the theme's values to a copy of a given theme." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "ОбчиÑлює векторний добуток двох векторів та [code]with[/code]." #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61728,16 +61951,17 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "ОбчиÑлює векторний добуток двох векторів та [code]with[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "ОбчиÑлює векторний добуток двох векторів та [code]with[/code]." #: doc/classes/Theme.xml msgid "" @@ -61748,16 +61972,17 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." -msgstr "" +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." +msgstr "ОбчиÑлює векторний добуток двох векторів та [code]with[/code]." #: doc/classes/Theme.xml msgid "" @@ -61766,16 +61991,18 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." -msgstr "" +"[code]theme_type[/code]." +msgstr "ОбчиÑлює векторний добуток двох векторів та [code]with[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." -msgstr "" +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." +msgstr "ОбчиÑлює векторний добуток двох векторів та [code]with[/code]." #: doc/classes/Theme.xml msgid "" @@ -61786,17 +62013,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -61809,9 +62038,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -61819,8 +62048,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -61835,7 +62064,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -61852,18 +62081,22 @@ msgid "" msgstr "ОбчиÑлює векторний добуток цього вектора Ñ– [code]b[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." -msgstr "" +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "ОбчиÑлює векторний добуток двох векторів та [code]with[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." -msgstr "" +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "ОбчиÑлює векторний добуток двох векторів та [code]with[/code]." #: doc/classes/Theme.xml msgid "" @@ -61872,31 +62105,38 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." -msgstr "" +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "ОбчиÑлює векторний добуток двох векторів та [code]with[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." -msgstr "" +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "ОбчиÑлює векторний добуток двох векторів та [code]with[/code]." #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." -msgstr "" +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "ОбчиÑлює векторний добуток двох векторів та [code]with[/code]." #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61925,87 +62165,88 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." -msgstr "" +msgstr "ОбчиÑлює векторний добуток двох векторів та [code]with[/code]." #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -65185,21 +65426,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65212,7 +65457,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65241,7 +65486,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65251,22 +65528,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65279,8 +65569,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65478,16 +65770,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -71607,6 +71899,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -74150,7 +74446,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/vi.po b/doc/translations/vi.po index 60ab8769ab..3e74e52436 100644 --- a/doc/translations/vi.po +++ b/doc/translations/vi.po @@ -8,12 +8,13 @@ # Hung <hungthitkhia@gmail.com>, 2021. # Giacat Buile <hatconan20024@gmail.com>, 2021. # Quinn Le <quinnsgn@gmail.com>, 2021. +# TrieuPhong <trieuphong965@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-04-25 15:12+0000\n" -"Last-Translator: IoeCmcomc <hopdaigia2004@gmail.com>\n" +"PO-Revision-Date: 2022-09-09 12:42+0000\n" +"Last-Translator: TrieuPhong <trieuphong965@gmail.com>\n" "Language-Team: Vietnamese <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/vi/>\n" "Language: vi\n" @@ -21,7 +22,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.12.1-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -796,8 +797,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -807,7 +809,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -879,7 +882,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -891,7 +895,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1393,10 +1398,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -5298,19 +5308,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -5331,21 +5343,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -5355,9 +5371,10 @@ msgstr "Trả vá» [Texture2D] cá»§a khung hình được cho." #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -6009,9 +6026,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -6184,10 +6201,13 @@ msgid "" msgstr "" #: doc/classes/AnimationPlayer.xml +#, fuzzy msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" +"Chạy hoạt ảnh tên là [code]anim[/code]. Nếu không cung cấp [code]anim[/code] " +"nà o, thì chạy hoạt ảnh hiện tại." #: doc/classes/AnimationPlayer.xml msgid "Returns the list of stored animation names." @@ -6898,7 +6918,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -7135,7 +7160,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -7783,7 +7813,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -9189,8 +9227,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -9241,10 +9280,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9487,12 +9536,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -10038,7 +10081,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10199,12 +10247,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10352,6 +10404,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10492,7 +10559,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -12173,7 +12243,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -12266,7 +12336,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -12294,9 +12366,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12799,13 +12871,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -12831,8 +12904,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -13145,12 +13220,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13195,8 +13270,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -13244,8 +13321,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -13307,7 +13387,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13432,7 +13512,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -14138,17 +14221,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -14455,12 +14538,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14497,12 +14581,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -15663,7 +15748,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -15689,7 +15782,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -16431,7 +16528,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -19163,7 +19262,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -19312,16 +19413,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19467,18 +19569,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml #, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "Trả vá» sin nghịch đảo cá»§a tham số." @@ -24393,8 +24483,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -25015,7 +25109,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26603,10 +26699,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -28017,8 +28116,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -30321,11 +30420,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -31171,7 +31273,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -31183,6 +31289,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33546,14 +33662,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33561,22 +33677,26 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "Trả vá» sin cá»§a tham số." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "Trả vá» sin cá»§a tham số." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "Trả vá» sin cá»§a tham số." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." -msgstr "" +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." +msgstr "Trả vá» sin cá»§a tham số." #: doc/classes/Line2D.xml msgid "" @@ -34853,8 +34973,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -34899,7 +35023,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -35154,9 +35281,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35617,7 +35744,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36756,7 +36885,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37585,13 +37714,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -41261,7 +41402,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46657,7 +46800,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "Trả vá» sin cá»§a tham số." #: doc/classes/PopupMenu.xml @@ -46897,7 +47042,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47627,7 +47774,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -50311,8 +50462,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53895,11 +54057,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -54336,7 +54502,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -54480,13 +54648,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -54809,6 +54983,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -54821,7 +55007,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55676,7 +55865,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -56297,6 +56489,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56631,7 +56831,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -58066,7 +58268,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -59333,6 +59535,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -59394,6 +59599,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -59416,7 +59624,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60553,6 +60764,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Trả vá» sin cá»§a tham số." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60583,6 +60799,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Trả vá» sin cá»§a tham số." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60624,7 +60845,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -61983,38 +62206,44 @@ msgid "Clears all values on the theme." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Trả vá» phần dư cá»§a hai vector." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Trả vá» sin cá»§a tham số." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Trả vá» phần dư cá»§a hai vector." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." -msgstr "" +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." +msgstr "Trả vá» phần dư cá»§a hai vector." #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Trả vá» phần dư cá»§a hai vector." #: doc/classes/Theme.xml msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -62032,15 +62261,17 @@ msgid "Sets the theme's values to a copy of a given theme." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Trả vá» phần dư cá»§a hai vector." #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -62050,15 +62281,16 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "Trả vá» phần dư cá»§a hai vector." #: doc/classes/Theme.xml msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" @@ -62071,7 +62303,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" @@ -62079,7 +62311,7 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -62089,15 +62321,16 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." -msgstr "" +"[code]theme_type[/code]." +msgstr "Trả vá» phần dư cá»§a hai vector." #: doc/classes/Theme.xml msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" #: doc/classes/Theme.xml @@ -62109,17 +62342,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -62132,9 +62367,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -62142,8 +62377,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -62158,7 +62393,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -62177,15 +62412,17 @@ msgstr "Trả vá» phần dư cá»§a hai vector." #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -62197,29 +62434,33 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -62247,87 +62488,87 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -65511,21 +65752,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65538,7 +65783,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65567,7 +65812,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65577,22 +65854,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65605,8 +65895,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65804,16 +66096,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -71943,6 +72235,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -74489,7 +74785,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml @@ -75915,3 +76213,5 @@ msgstr "" msgid "" "If [code]true[/code], child nodes are sorted, otherwise sorting is disabled." msgstr "" +"Nếu [code] true [/code], các nút con sẽ được sắp xếp, nếu không, tÃnh năng " +"sắp xếp sẽ bị vô hiệu hóa." diff --git a/doc/translations/zh_CN.po b/doc/translations/zh_CN.po index 7647bf0081..cf0267429a 100644 --- a/doc/translations/zh_CN.po +++ b/doc/translations/zh_CN.po @@ -58,11 +58,12 @@ # è‹è½¼ <youwanyuyu@gmail.com>, 2021. # ErrorDreemurr <diandaokui@qq.com>, 2021. # 烧风 <hk-shao@foxmail.com>, 2022. +# Yan Chen <cyan97087@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-07-31 16:43+0000\n" +"PO-Revision-Date: 2022-09-26 05:24+0000\n" "Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "godot-engine/godot-class-reference/zh_Hans/>\n" @@ -71,7 +72,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1\n" #: doc/tools/make_rst.py msgid "Description" @@ -369,7 +370,7 @@ msgid "" "not use this option if the serialized object comes from untrusted sources to " "avoid potential security threats (remote code execution)." msgstr "" -"å°†å—节数组解ç 返回一个值。当 [code]allow_objects[/code] 为 [code]true[/code] " +"å°†å—节数组解ç 回一个值。当 [code]allow_objects[/code] 为 [code]true[/code] " "时,å…许解ç 对象。\n" "[b]è¦å‘Šï¼š[/b]ååºåˆ—化得到的对象å¯èƒ½åŒ…å«å¯æ‰§è¡Œçš„代ç 。如果åºåˆ—åŒ–çš„å¯¹è±¡çš„æ¥æºä¸" "å¯ä¿¡ï¼Œè¯·ä¸è¦æ¿€æ´»æ¤é€‰é¡¹ï¼Œä»¥é¿å…潜在的安全å¨èƒï¼ˆè¿œç¨‹æ‰§è¡Œä»£ç )。" @@ -834,8 +835,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -845,13 +847,15 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" "返回æ’å€¼æˆ–å¤–æŽ¨çš„å› å。范围用 [code]from[/code] å’Œ [code]to[/code] 指定,æ’值" "åŽçš„值用 [code]weight[/code] 指定。如果 [code]weight[/code] 在 [code]from[/" "code] å’Œ [code]to[/code] 之间(包å«ï¼‰ï¼Œé‚£ä¹ˆè¿”回的值在 [code]0.0[/code] å’Œ " "[code]1.0[/code] 之间。如果 [code]weight[/code] 在该范围之外,则返回的是外推" -"å› å(返回值å°äºŽ [code]0.0[/code] 或大于 [code]1.0[/code])。\n" +"å› å(返回值å°äºŽ [code]0.0[/code] 或大于 [code]1.0[/code])。如果ä¸å¸Œæœ›è¿™æ ·ï¼Œ" +"请对 [method inverse_lerp] 的结果使用 [method clamp]。\n" "[codeblock]\n" "# 下é¢çš„ `lerp()` 调用时的æ’值比例是 0.75。\n" "var middle = lerp(20, 30, 0.75)\n" @@ -927,7 +931,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -939,11 +944,13 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" "在两个值之间按照 [code]weight[/code] å®šä¹‰çš„å› æ•°è¿›è¡Œçº¿æ€§æ’值。进行æ’值时," "[code]weight[/code] 应该在 [code]0.0[/code] å’Œ [code]1.0[/code] 之间(包" -"å«ï¼‰ã€‚然而,在æ¤åŒºé—´å¤–的值也是å…许的,å¯ç”¨äºŽæ‰§è¡Œ[i]外推[/i]。\n" +"å«ï¼‰ã€‚然而,在æ¤åŒºé—´å¤–的值也是å…许的,å¯ç”¨äºŽæ‰§è¡Œ[i]外推[/i]。如果ä¸å¸Œæœ›è¿™æ ·ï¼Œ" +"请对 [method lerp] 的结果使用 [method clamp]。\n" "如果 [code]from[/code] å’Œ [code]to[/code] 傿•°ç±»åž‹æ˜¯ [int] 或 [float],返回值" "都是 [float]。\n" "如果两者都是相åŒçš„å‘é‡ç±»åž‹ï¼ˆ[Vector2]ã€[Vector3]或[Color]),返回值将是相åŒçš„" @@ -954,7 +961,8 @@ msgstr "" "lerp(Vector2(1, 5), Vector2(3, 2), 0.5) # 返回 Vector2(2, 3.5)\n" "[/codeblock]\n" "å¦è¯·å‚阅本æ“作的逆è¿ç®— [method inverse_lerp]ã€‚è¦æ‰§è¡Œç¼“动的 [method lerp] æ’" -"值,请将其与 [method ease] 或 [method smoothstep] 组åˆã€‚" +"值,请将其与 [method ease] 或 [method smoothstep] 组åˆã€‚å¦è¯·å‚阅 [method " +"range_lerp],å¯ä»¥å°†ä¸€ç³»åˆ—连ç»çš„å€¼æ˜ å°„åˆ°å¦ä¸€ä¸ªä¸Šã€‚" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1612,16 +1620,25 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" -"å°† [code]value[/code] 从范围 [code][istart, istop][/code] æ˜ å°„åˆ° [code]" -"[ostart, ostop][/code]。\n" +"将范围 [code][istart, istop][/code] ä¸çš„值 [code]value[/code] æ˜ å°„åˆ° [code]" +"[ostart, ostop][/code] ä¸ã€‚å¦è¯·å‚阅 [method lerp] å’Œ [method inverse_lerp]。" +"如果 [code]value[/code] 在 [code][istart, istop][/code] 之外,则结果也会在 " +"[code][ostart, ostop][/code] 之外。如果ä¸å¸Œæœ›è¿™æ ·ï¼Œè¯·å¯¹ [method range_lerp] " +"的结果使用 [method clamp]。\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # 返回 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"å¦‚æžœæ˜¯æ›´å¤æ‚的情况,è¦ç”¨åˆ°å¤šä¸ªèŒƒå›´ï¼Œè¯·è€ƒè™‘使用 [Curve] 或 [Gradient] 代替。" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -3706,19 +3723,19 @@ msgstr "æ¸¸æˆæ‰‹æŸ„ SDL æ‚项按钮。" #: doc/classes/@GlobalScope.xml msgid "Gamepad SDL paddle 1 button." -msgstr "æ¸¸æˆæ‰‹æŸ„ SDL 拨片1按钮。" +msgstr "æ¸¸æˆæ‰‹æŸ„ SDL 拨片 1 按钮。" #: doc/classes/@GlobalScope.xml msgid "Gamepad SDL paddle 2 button." -msgstr "æ¸¸æˆæ‰‹æŸ„ SDL 拨片2按钮。" +msgstr "æ¸¸æˆæ‰‹æŸ„ SDL 拨片 2 按钮。" #: doc/classes/@GlobalScope.xml msgid "Gamepad SDL paddle 3 button." -msgstr "æ¸¸æˆæ‰‹æŸ„ SDL 拨片3按钮。" +msgstr "æ¸¸æˆæ‰‹æŸ„ SDL 拨片 3 按钮。" #: doc/classes/@GlobalScope.xml msgid "Gamepad SDL paddle 4 button." -msgstr "æ¸¸æˆæ‰‹æŸ„ SDL 拨片4按钮。" +msgstr "æ¸¸æˆæ‰‹æŸ„ SDL 拨片 4 按钮。" #: doc/classes/@GlobalScope.xml msgid "Gamepad SDL touchpad button." @@ -3734,7 +3751,7 @@ msgstr "æ¸¸æˆæ‰‹æŸ„左扳机键。" #: doc/classes/@GlobalScope.xml msgid "Gamepad left stick click." -msgstr "æ¸¸æˆæ‰‹æŸ„左键点击。" +msgstr "æ¸¸æˆæ‰‹æŸ„左摇æ†ç‚¹å‡»ã€‚" #: doc/classes/@GlobalScope.xml msgid "Gamepad right Shoulder button." @@ -3746,7 +3763,7 @@ msgstr "æ¸¸æˆæ‰‹æŸ„çš„å³æ‰³æœºé”®ã€‚" #: doc/classes/@GlobalScope.xml msgid "Gamepad right stick click." -msgstr "æ¸¸æˆæ‰‹æŸ„å³é”®å•击。" +msgstr "æ¸¸æˆæ‰‹æŸ„峿‘‡æ†ç‚¹å‡»ã€‚" #: doc/classes/@GlobalScope.xml msgid "Gamepad left stick horizontal axis." @@ -4175,8 +4192,8 @@ msgid "" "above the max or below the min values. Example: [code]\"-360,360,1," "or_greater,or_lesser\"[/code]." msgstr "" -"通过æç¤ºä¸²[code]\"min,max\"[/code] 或[code]\"min,max,step\"[/code]æ¥æç¤ºä¸€ä¸ª" -"整数或浮点数属性应当è½åœ¨æŒ‡å®šèŒƒå›´å†…。æç¤ºä¸²å¯ä»¥é€‰æ‹©æ€§åœ°åŒ…å« " +"通过æç¤ºä¸² [code]\"min,max\"[/code] 或 [code]\"min,max,step\"[/code] æ¥æç¤ºä¸€" +"个整数或浮点数属性应当è½åœ¨æŒ‡å®šèŒƒå›´å†…。æç¤ºä¸²å¯ä»¥é€‰æ‹©æ€§åœ°åŒ…å« " "[code]\"or_greater\"[/code] 与/或 [code]\"or_lesser\"[/code] æ¥å…许手动输入的" "值超过或低于最大最å°å€¼ã€‚例如:[code]\"-360,360,1,or_greater,or_lesser\"[/" "code]。" @@ -4232,8 +4249,8 @@ msgid "" "easing." msgstr "" "æç¤ºä¸€ä¸ªæµ®ç‚¹æ•°å±žæ€§åº”当通过指数缓动函数æ¥ç¼–辑。æ¤å¤„çš„æç¤ºä¸²å¯ä»¥åŒ…å« " -"[code]\"attenuation\"[/code] æ¥ç¿»è½¬æ›²çº¿çš„æ°´å¹³æ–¹å‘,并且/或者也å¯ä»¥é€šè¿‡" -"[code]\"inout\"[/code]æ¥æŽ§åˆ¶æ˜¯å¦ç¼“入缓出。" +"[code]\"attenuation\"[/code] æ¥ç¿»è½¬æ›²çº¿çš„æ°´å¹³æ–¹å‘,并且/或者也å¯ä»¥é€šè¿‡ " +"[code]\"inout\"[/code] æ¥æŽ§åˆ¶æ˜¯å¦ç¼“入缓出。" #: doc/classes/@GlobalScope.xml msgid "Deprecated hint, unused." @@ -4328,8 +4345,8 @@ msgid "" "Editing it will show a popup menu of valid resource types to instantiate." msgstr "" "æç¤ºä¸€ä¸ªå±žæ€§æ˜¯ä¸€ä¸ª [Resource] 派生类的实例,å¯ä»¥é€šè¿‡æç¤ºå—符串指定(例如 " -"[code]\"Texture\"[/code])。编辑该属性时会显示一个列举了å¯ç”¨çš„待实例化的资æº" -"类型的弹出èœå•。" +"[code]\"Texture\"[/code])。编辑该属性时会显示一个弹出èœå•,列举了å¯ç”¨çš„待实" +"例化的资æºç±»åž‹ã€‚" #: doc/classes/@GlobalScope.xml msgid "" @@ -6002,22 +6019,27 @@ msgstr "" "[AnimationRootNode] æ—¶æ‰æœ‰ç”¨ï¼Œå¦åˆ™ç¼–辑器将ä¸ä¼šæ˜¾ç¤ºä½ çš„èŠ‚ç‚¹è¿›è¡Œæ·»åŠ ã€‚" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." -msgstr "èŽ·å–æ¤èŠ‚ç‚¹çš„æ–‡æœ¬æ ‡é¢˜ï¼ˆç”±æŸäº›ç¼–辑器使用)。" +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." +msgstr "" +"继承 [AnimationRootNode] 时,实现这个虚方法å¯ä»¥è¦†ç›–è¿™ä¸ªèŠ‚ç‚¹çš„æ ‡é¢˜æ–‡æœ¬ã€‚" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." -msgstr "按索引获å–一个å节点(由继承 [AnimationRootNode] 的编辑器使用)。" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." +msgstr "" +"继承 [AnimationRootNode] 时,实现这个虚方法å¯ä»¥æ ¹æ®åç§° [code]name[/code] æ¥" +"返回对应的å节点。" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" -"按照 [code]name: node[/code] å—典的顺åºèŽ·å–æ‰€æœ‰å节点。仅在继承 " -"[AnimationRootNode] 时有用。" +"继承 [AnimationRootNode] 时,实现这个虚方法å¯ä»¥ç”¨ [code]åç§°:节点[/code] å—å…¸" +"çš„å½¢å¼æŒ‰é¡ºåºè¿”回所有å节点。" #: doc/classes/AnimationNode.xml msgid "" @@ -6039,26 +6061,33 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" -"获å–ä¸€ä¸ªå‚æ•°çš„é»˜è®¤å€¼ã€‚å‚æ•°æ˜¯ç”¨äºŽèŠ‚ç‚¹çš„è‡ªå®šä¹‰æœ¬åœ°å†…å˜ï¼Œç»™å®šèµ„æºå¯ä»¥åœ¨å¤šä¸ªæ ‘ä¸" -"é‡ç”¨ã€‚" +"继承 [AnimationRootNode] 时,实现这个虚方法å¯ä»¥è¿”å›žå‚æ•°â€œ[code]name[/code]â€çš„" +"é»˜è®¤å€¼ã€‚å‚æ•°æ˜¯èŠ‚ç‚¹çš„è‡ªå®šä¹‰æœ¬åœ°å˜å‚¨ï¼Œèµ„æºå¯ä»¥åœ¨å¤šä¸ªæ ‘ä¸é‡ç”¨ã€‚" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" -"获å–傿•°çš„属性信æ¯ã€‚傿•°æ˜¯ä½ 的节点使用的自定义本地内å˜ï¼Œç»™å®šçš„资æºå¯ä»¥åœ¨å¤šä¸ª" -"æ ‘ä¸é‡å¤ä½¿ç”¨ã€‚æ ¼å¼ç±»ä¼¼äºŽ[method Object.get_property_list]。" +"继承 [AnimationRootNode] 时,实现这个虚方法å¯ä»¥è¿”å›žè¿™ä¸ªèŠ‚ç‚¹çš„å±žæ€§åˆ—è¡¨ã€‚å‚æ•°æ˜¯" +"节点的自定义本地å˜å‚¨ï¼Œèµ„æºå¯ä»¥åœ¨å¤šä¸ªæ ‘ä¸é‡ç”¨ã€‚æ ¼å¼ä¸Ž [method Object." +"get_property_list] 类似。" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." -msgstr "返回 [code]true[/code],是å¦å¸Œæœ›æ··åˆæ ‘编辑器在æ¤èŠ‚ç‚¹ä¸Šæ˜¾ç¤ºè¿‡æ»¤å™¨ç¼–è¾‘ã€‚" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." +msgstr "" +"继承 [AnimationRootNode] 时,实现这个虚方法å¯ä»¥è¿”å›žæ··åˆæ ‘编辑器是å¦åº”该在这个" +"节点上显示过滤器编辑。" #: doc/classes/AnimationNode.xml msgid "Returns whether the given path is filtered." @@ -6066,21 +6095,23 @@ msgstr "返回是å¦å¯¹ç»™å®šçš„路径进行过滤。" #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" "This function should return the time left for the current animation to " "finish (if unsure, pass the value from the main blend being called)." msgstr "" -"用户定义的回调,会在处ç†è‡ªå®šä¹‰èŠ‚ç‚¹æ—¶è°ƒç”¨ã€‚æ—¶é—´å‚æ•° [code]time[/code] 是一个相" -"对的增é‡ï¼Œé™¤éž [code]seek[/code] 是 [code]true[/code]ï¼Œæ¤æ—¶å®ƒæ˜¯ç»å¯¹çš„æ—¶é—´ã€‚\n" -"请在这里调用 [method blend_input]ã€[method blend_node] 或 [method " +"继承 [AnimationRootNode] 时,实现这个虚方法å¯ä»¥åœ¨è¿™ä¸ªèŠ‚ç‚¹è¿›è¡Œå¤„ç†æ—¶æ‰§è¡Œä»£ç 。" +"傿•° [code]time[/code] 是相对增é‡ï¼Œé™¤éž [code]seek[/code] 为 [code]true[/" +"code]ï¼Œæ¤æ—¶ä¸ºç»å¯¹æ—¶é—´ã€‚\n" +"请在æ¤å¤„调用 [method blend_input]ã€[method blend_node] 或 [method " "blend_animation] å‡½æ•°ã€‚ä½ ä¹Ÿå¯ä»¥ä½¿ç”¨ [method get_parameter] å’Œ [method " -"set_parameter] æ¥ä¿®æ”¹æœ¬åœ°å†…å˜ã€‚\n" -"这个函数应该返回当å‰åŠ¨ç”»å®Œæˆçš„剩余时间(如果ä¸ç¡®å®šï¼Œè¯·ä¼ 递被调用的主混åˆ" +"set_parameter] æ¥ä¿®æ”¹æœ¬åœ°å˜å‚¨ã€‚\n" +"这个函数应当返回当å‰åŠ¨ç”»è¿˜éœ€å¤šå°‘æ—¶é—´å®Œæˆï¼ˆä¸ç¡®å®šçš„è¯ï¼Œè¯·ä¼ 递调用主混åˆçš„" "值)。" #: doc/classes/AnimationNode.xml @@ -6810,19 +6841,19 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" "[/codeblock]" msgstr "" -"è®¾ç½®æ¤æ¡ä»¶ï¼Œå¼€å¯è‡ªåЍå‰è¿›ã€‚æä¾›çš„åç§°å°†æˆä¸º [AnimationTree] ä¸Šçš„ä¸€ä¸ªå¸ƒå°”å‚æ•°ï¼Œ" -"å¯ä»¥é€šè¿‡ä»£ç 控制,请å‚阅 [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]。例如,如果 [member AnimationTree." -"tree_root] 是一个 [AnimationNodeStateMachine],[member advance_condition] 被" -"设置为 [code]\"idle\"[/code]。\n" +"这个æ¡ä»¶ä¸ºçœŸæ—¶ï¼Œå°†å¼€å¯è‡ªåЍå‰è¿›ã€‚æä¾›çš„åç§°å°†æˆä¸º [AnimationTree] 上的布尔å‚" +"数,å¯ä»¥é€šè¿‡ä»£ç 控制,请å‚阅 [url=$DOCS_URL/tutorials/animation/" +"animation_tree.html#controlling-from-code]使用 AnimationTree[/url]。例如,如" +"æžœ [member AnimationTree.tree_root] 是一个 [AnimationNodeStateMachine]," +"[member advance_condition] 被设置为 [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -7031,11 +7062,11 @@ msgstr "返回 [code]animation[/code] çš„å称,如果没有找到,则返回 #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" -"返回键为 [code]name[/code] çš„ [Animation] 动画,未找到时为 [code]null[/" -"code]。" +"返回键为 [code]name[/code] çš„ [Animation] 动画。如果该动画ä¸å˜åœ¨ï¼Œå°†è¿”回 " +"[code]null[/code] 并在日志ä¸è®°å½•错误。" #: doc/classes/AnimationPlayer.xml msgid "Returns the list of stored animation names." @@ -7634,7 +7665,7 @@ msgstr "返回给定其åç§°çš„ OneShot 节点的淡出时间。" #: doc/classes/AnimationTreePlayer.xml msgid "Returns whether a OneShot node will auto restart given its name." -msgstr "返回OneShot节点是å¦ä¼šæ ¹æ®å…¶åç§°è‡ªåŠ¨é‡æ–°å¯åŠ¨ã€‚" +msgstr "返回 OneShot 节点是å¦ä¼šæ ¹æ®å…¶åç§°è‡ªåŠ¨é‡æ–°å¯åŠ¨ã€‚" #: doc/classes/AnimationTreePlayer.xml msgid "Returns whether a OneShot node is active given its name." @@ -7716,8 +7747,9 @@ msgid "" "If applied after a blend or mix, affects all input animations to that blend " "or mix." msgstr "" -"设置å称为 [code]id[/code] çš„TimeScale节点的时间缩放为[code]scale[/code]。\n" -"时间缩放节点用æ¥åŠ å¿«[Animation]的速度,如果缩放高于1ï¼Œå°±ä¼šå‡æ…¢å®ƒä»¬ã€‚\n" +"设置å称为 [code]id[/code] çš„ TimeScale 节点的时间缩放为 [code]scale[/" +"code]。\n" +"时间缩放节点用æ¥åŠ å¿« [Animation] 的速度,如果缩放高于1ï¼Œå°±ä¼šå‡æ…¢å®ƒä»¬ã€‚\n" "如果在混åˆåŽåº”用,会影å“到该混åˆçš„æ‰€æœ‰è¾“入动画。" #: doc/classes/AnimationTreePlayer.xml @@ -7727,9 +7759,9 @@ msgid "" "This functions as a seek in the [Animation] or the blend or mix of " "[Animation]s input in it." msgstr "" -"设置å称为 [code]id[/code] çš„TimeSeek节点的时间查寻值为[code]seconds[/" +"设置å称为 [code]id[/code] çš„ TimeSeek 节点的时间查寻值为 [code]seconds[/" "code]。\n" -"这在[Animation]或输入的[Animation]的混åˆä¸èµ·åˆ°æŸ¥å¯»çš„作用。" +"这在 [Animation] 或输入的 [Animation] 的混åˆä¸èµ·åˆ°æŸ¥å¯»çš„作用。" #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -7763,8 +7795,8 @@ msgid "" "transition node with name [code]id[/code] is set to automatically advance to " "the next input upon completion." msgstr "" -"如果过渡节点上å称为 [code]id[/code] çš„[code]input_idx[/code]的输入被设置为在" -"完æˆåŽè‡ªåЍå‰è¿›åˆ°ä¸‹ä¸€ä¸ªè¾“入,则返回 [code]true[/code]。" +"如果过渡节点上å称为 [code]id[/code] çš„ [code]input_idx[/code] 的输入被设置为" +"在完æˆåŽè‡ªåЍå‰è¿›åˆ°ä¸‹ä¸€ä¸ªè¾“入,则返回 [code]true[/code]。" #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -7778,8 +7810,8 @@ msgid "" "The transition node with name [code]id[/code] advances to its next input " "automatically when the input at [code]input_idx[/code] completes." msgstr "" -"当[code]input_idx[/code]处的输入完æˆåŽï¼Œå称为 [code]id[/code] 的过渡节点自动" -"进行到下一个输入。" +"当 [code]input_idx[/code] 处的输入完æˆåŽï¼Œå称为 [code]id[/code] 的过渡节点自" +"动进行到下一个输入。" #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -7792,13 +7824,13 @@ msgid "" "The transition node with name [code]id[/code] sets its cross fade time to " "[code]time_sec[/code]." msgstr "" -"å称为 [code]id[/code] çš„è¿‡æ¸¡èŠ‚ç‚¹å°†å…¶äº¤å‰æ·¡åŒ–时间设置为[code]time_sec[/" +"å称为 [code]id[/code] çš„è¿‡æ¸¡èŠ‚ç‚¹å°†å…¶äº¤å‰æ·¡åŒ–时间设置为 [code]time_sec[/" "code]。" #: doc/classes/AnimationTreePlayer.xml msgid "" "If [code]true[/code], the [AnimationTreePlayer] is able to play animations." -msgstr "如果为 [code]true[/code],[AnimationTreePlayer]å°±èƒ½å¤Ÿæ’æ”¾åŠ¨ç”»ã€‚" +msgstr "如果为 [code]true[/code],[AnimationTreePlayer] å°±èƒ½å¤Ÿæ’æ”¾åŠ¨ç”»ã€‚" #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -7807,7 +7839,7 @@ msgid "" "[AnimationPlayer] would point its Root Node at." msgstr "" "相对访问其他节点的节点。\n" -"它访问骨骼,应该指å‘[AnimationPlayer]将指å‘å…¶æ ¹èŠ‚ç‚¹çš„åŒä¸€ä¸ªèŠ‚ç‚¹ã€‚" +"å®ƒè®¿é—®éª¨éª¼ï¼Œåº”è¯¥æŒ‡å‘ [AnimationPlayer] 将指å‘å…¶æ ¹èŠ‚ç‚¹çš„åŒä¸€ä¸ªèŠ‚ç‚¹ã€‚" #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -7817,7 +7849,7 @@ msgid "" msgstr "" "通过 [AnimationPlayer] çš„è·¯å¾„ï¼Œæ¤ [AnimationTreePlayer] 将动画绑定到动画节" "点。\n" -"设置åŽï¼Œ[Animation]节点å¯ä»¥æ·»åŠ åˆ°[AnimationPlayer]。" +"设置åŽï¼Œ[Animation] 节点å¯ä»¥æ·»åŠ åˆ° [AnimationPlayer]。" #: doc/classes/AnimationTreePlayer.xml msgid "The thread in which to update animations." @@ -7871,10 +7903,13 @@ msgstr "用于检测和物ç†åŠéŸ³é¢‘å½±å“çš„ 3D 区域。" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" -"检测 [CollisionObject] 节点é‡å ã€è¿›å…¥æˆ–退出的 3D 区域。还å¯ä»¥æ”¹å˜æˆ–覆盖局部物" -"ç†å‚数(é‡åŠ›ã€é˜»å°¼ï¼‰ï¼Œå¹¶å°†éŸ³é¢‘路由到自定义音频总线。" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml #: doc/classes/ViewportTexture.xml @@ -7946,7 +7981,7 @@ msgid "" "details about damping." msgstr "" "物体在æ¤åŒºåŸŸåœæ¢æ—‹è½¬çš„速度。代表æ¯ç§’æŸå¤±çš„角速度.\n" -"关于阻尼的更多细节,è§[member ProjectSettings.physics/3d/" +"å…³äºŽé˜»å°¼çš„æ›´å¤šç»†èŠ‚ï¼Œè§ [member ProjectSettings.physics/3d/" "default_angular_damp]。" #: doc/classes/Area.xml doc/classes/Area2D.xml @@ -8051,7 +8086,7 @@ msgid "" "be set to [code]true[/code].\n" "[code]area[/code] the other Area." msgstr "" -"当å¦ä¸€ä¸ª Area 进入这个 Area 时触å‘。需è¦å°†ç›‘控 [member monitoring] 设置为 " +"当å¦ä¸€ä¸ª Area 进入这个 Area 时触å‘ã€‚éœ€è¦ [member monitoring] 被设置为 " "[code]true[/code]。\n" "[code]area[/code] 傿•°æ˜¯å¦å¤–一个 Area。" @@ -8061,9 +8096,9 @@ msgid "" "be set to [code]true[/code].\n" "[code]area[/code] the other Area." msgstr "" -"当å¦ä¸€ä¸ªåŒºåŸŸé€€å‡ºè¿™ä¸ªåŒºåŸŸæ—¶å‘å‡ºçš„ã€‚è¦æ±‚监控[member monitoring]被设置为 " +"当å¦ä¸€ä¸ªåŒºåŸŸé€€å‡ºè¿™ä¸ªåŒºåŸŸæ—¶å‘å‡ºçš„ã€‚è¦æ±‚ [member monitoring] 被设置为 " "[code]true[/code]。\n" -"[code]area[/code]傿•°æ˜¯å¦å¤–一个Area。" +"[code]area[/code] 傿•°æ˜¯å¦å¤–一个 Area。" #: doc/classes/Area.xml msgid "" @@ -8079,17 +8114,17 @@ msgid "" "the [PhysicsServer]. Get the [CollisionShape] node with [code]self." "shape_owner_get_owner(local_shape_index)[/code]." msgstr "" -"当å¦ä¸€ä¸ªåŒºåŸŸçš„一个[Shape]进入这个区域的一个[Shape]æ—¶å‘å‡ºçš„ã€‚è¦æ±‚[member " +"当å¦ä¸€ä¸ªåŒºåŸŸçš„一个 [Shape] 进入这个区域的一个 [Shape] æ—¶å‘å‡ºçš„ã€‚è¦æ±‚ [member " "monitoring] 被设置为 [code]true[/code]。\n" -"[code]area_rid[/code] [PhysicsServer]使用的其他区域的[CollisionObject]çš„" +"[code]area_rid[/code] [PhysicsServer]使用的其他区域的 [CollisionObject] çš„ " "[RID]。\n" "[code]area[/code] 其他区域。\n" -"[code]area_shape_index[/code] [PhysicsServer]使用的其他区域的[Shape]的索引。" -"用[code]area.shape_owner_get_owner(area_shape_index)[/code]获得" -"[CollisionShape]节点。\n" -"[code]local_shape_index[/code]是[PhysicsServer]使用的该区域的[Shape]的索引。" -"用[code]self.shape_owner_get_owner(local_shape_index)[/code]获得" -"[CollisionShape]节点。" +"[code]area_shape_index[/code] [PhysicsServer] 使用的其他区域的 [Shape] 的索" +"引。用 [code]area.shape_owner_get_owner(area_shape_index)[/code] 获得 " +"[CollisionShape] 节点。\n" +"[code]local_shape_index[/code] [PhysicsServer] 使用的该区域的 [Shape] 的索" +"引。用 [code]self.shape_owner_get_owner(local_shape_index)[/code] 获得 " +"[CollisionShape] 节点。" #: doc/classes/Area.xml msgid "" @@ -8143,7 +8178,7 @@ msgstr "" "[code]body[/code] [PhysicsBody] 或 [GridMap] çš„ [Node],如果它å˜åœ¨äºŽæ ‘ä¸çš„" "è¯ã€‚\n" "[code]body_shape_index[/code] [PhysicsServer] 使用的 [PhysicsBody] 或 " -"[GridMap] çš„ [Shape]的索引。用 [code]body." +"[GridMap] çš„ [Shape] 的索引。用 [code]body." "shape_owner_get_owner(body_shape_index)[/code] èŽ·å– [CollisionShape] 节点。\n" "[code]local_shape_index[/code] 这个区域的 [Shape] 的索引,由 [PhysicsServer] " "使用。用 [code]self.shape_owner_get_owner(local_shape_index)[/code] 获得 " @@ -8191,10 +8226,13 @@ msgstr "用于检测ã€ç‰©ç†å’ŒéŸ³é¢‘å½±å“çš„ 2D 区域。" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" -"检测 [CollisionObject2D] 节点é‡å ã€è¿›å…¥æˆ–退出的2D区域。还å¯ä»¥æ”¹å˜æˆ–覆盖局部物" -"ç†å‚数(é‡åŠ›ã€é˜»å°¼ï¼‰ï¼Œå¹¶å°†éŸ³é¢‘路由到一个自定义的音频总线。" #: doc/classes/Area2D.xml msgid "Using Area2D" @@ -8465,7 +8503,7 @@ msgstr "" "点。\n" "[code]local_shape_index[/code] 这个 Area2D çš„ [Shape2D] 的索引,由 " "[Physics2DServer] 使用。用 [code]self." -"shape_owner_get_owner(local_shape_index)[/code]获å–[CollisionShape2D]节点。" +"shape_owner_get_owner(local_shape_index)[/code]èŽ·å– [CollisionShape2D] 节点。" #: doc/classes/Array.xml msgid "A generic array datatype." @@ -8949,8 +8987,8 @@ msgid "" "size is smaller, elements are cleared, if bigger, new elements are " "[code]null[/code]." msgstr "" -"调整数组至包å«ä¸åŒæ•°é‡çš„å…ƒç´ ã€‚å¦‚æžœæ•°ç»„å˜å°åˆ™æ¸…é™¤å¤šä½™å…ƒç´ ï¼Œå˜å¤§åˆ™æ–°å…ƒç´ 为 " -"[code]null[/code]。" +"调整数组的大å°ï¼Œè®©åŒ…å«çš„å…ƒç´ æ•°é‡å‘生å˜åŒ–。如果数组å˜å°åˆ™æ¸…é™¤å¤šä½™å…ƒç´ ï¼Œå˜å¤§åˆ™" +"æ–°å…ƒç´ ä¸º [code]null[/code]。" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml #: doc/classes/PoolColorArray.xml doc/classes/PoolIntArray.xml @@ -8991,8 +9029,8 @@ msgid "" "and upper index are inclusive, with the [code]step[/code] describing the " "change between indices while slicing." msgstr "" -"å¤åˆ¶å‡½æ•°ä¸æè¿°çš„å集并以数组形å¼è¿”回,如果[code]deep[/code]为 [code]true[/" -"code],则深度å¤åˆ¶æ•°ç»„。下索引和上索引是包å«çš„,[code]step[/code]æè¿°äº†åˆ†ç‰‡æ—¶" +"å¤åˆ¶å‡½æ•°ä¸æè¿°çš„å集并以数组形å¼è¿”回,如果 [code]deep[/code] 为 [code]true[/" +"code],则深度å¤åˆ¶æ•°ç»„。下索引和上索引是包å«çš„,[code]step[/code] æè¿°äº†åˆ†ç‰‡æ—¶" "索引之间的å˜åŒ–。" #: doc/classes/Array.xml @@ -9109,9 +9147,8 @@ msgstr "" "var m = MeshInstance.new()\n" "m.mesh = arr_mesh\n" "[/codeblock]\n" -"这个 [MeshInstance] å·²ç»å‡†å¤‡å°±ç»ªï¼Œä»¥æ·»åŠ åˆ°è¦æ˜¾ç¤ºçš„ [SceneTree] ä¸ã€‚\n" -"程åºå¼å‡ 何体生æˆï¼Œè¯·å‚阅 [ImmediateGeometry]ã€[MeshDataTool]ã€" -"[SurfaceTool]。\n" +"这个 [MeshInstance] å°±å¯ä»¥æ·»åŠ åˆ°è¦æ˜¾ç¤ºçš„ [SceneTree] ä¸äº†ã€‚\n" +"程åºå¼å‡ 何体生æˆè¯·å‚阅 [ImmediateGeometry]ã€[MeshDataTool]ã€[SurfaceTool]。\n" "[b]注æ„:[/b]Godot 对三角形图元模å¼çš„æ£é¢ä½¿ç”¨é¡ºæ—¶é’ˆ[url=https://learnopengl-" "cn.github.io/04%20Advanced%20OpenGL/04%20Face%20culling/]环绕顺åº[/url]。" @@ -9124,6 +9161,7 @@ msgstr "" "åŠ æ›²é¢ä¹‹å‰è°ƒç”¨ã€‚" #: doc/classes/ArrayMesh.xml +#, fuzzy msgid "" "Creates a new surface.\n" "Surfaces are created to be rendered using a [code]primitive[/code], which " @@ -9138,7 +9176,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" "创建一个新的é¢ã€‚\n" "åˆ›å»ºé¢æ˜¯ä¸ºäº†ä½¿ç”¨ [code]primitive[/code] 进行渲染,å¯ä»¥æ˜¯ [enum Mesh." @@ -9549,7 +9595,7 @@ msgid "" "If provided by the [ARVRInterface], this returns a mesh associated with the " "controller. This can be used to visualize the controller." msgstr "" -"如果由 [ARVRInterface]æä¾›ï¼Œåˆ™è¿”å›žä¸ŽæŽ§åˆ¶å™¨ç›¸å…³çš„ç½‘æ ¼ã€‚è¿™å¯ç”¨äºŽå¯è§†åŒ–控制器。" +"如果由 [ARVRInterface] æä¾›ï¼Œåˆ™è¿”å›žä¸ŽæŽ§åˆ¶å™¨ç›¸å…³çš„ç½‘æ ¼ã€‚è¿™å¯ç”¨äºŽå¯è§†åŒ–控制器。" #: doc/classes/ARVRController.xml msgid "" @@ -9588,8 +9634,8 @@ msgid "" "This is a useful property to animate if you want the controller to vibrate " "for a limited duration." msgstr "" -"控制器振动的程度。范围从 [code]0.0[/code] 到 [code]1.0[/code]。如果更改," -"会相应地更新 [member ARVRPositionalTracker.rumble]。\n" +"控制器振动的程度。范围从 [code]0.0[/code] 到 [code]1.0[/code]。如果更改,会相" +"应地更新 [member ARVRPositionalTracker.rumble]。\n" "å¦‚æžœä½ æƒ³è®©æŽ§åˆ¶å™¨åœ¨é™å®šæ—¶é—´å†…振动,这是一个有用的属性,å¯ä»¥å°†å…¶åŠ¨ç”»åŒ–ã€‚" #: doc/classes/ARVRController.xml @@ -9685,8 +9731,8 @@ msgid "" msgstr "" "调用这个æ¥åˆå§‹åŒ–这个接å£ã€‚第一个被åˆå§‹åŒ–的接å£ç¡®å®šä¸ºä¸»æŽ¥å£ï¼Œç”¨äºŽæ¸²æŸ“输出。\n" "在åˆå§‹åŒ–了接å£ä¹‹åŽï¼Œéœ€è¦å¯ç”¨è§†çª—çš„ AR/VR 模å¼ï¼Œå°†å¼€å§‹æ¸²æŸ“。\n" -"[b]注æ„:[/b]对于任何使用Godot主输出的设备,如移动VRï¼Œä½ å¿…é¡»åœ¨ä¸»è§†çª—ä¸Šå¯ç”¨ " -"AR/VR 模å¼ã€‚\n" +"[b]注æ„:[/b]对于任何使用 Godot 主输出的设备,如移动 VRï¼Œä½ å¿…é¡»åœ¨ä¸»è§†çª—ä¸Šå¯" +"用 AR/VR 模å¼ã€‚\n" "å¦‚æžœä½ ä¸ºä¸€ä¸ªå¤„ç†è‡ªå·±è¾“出的平å°è¿™æ ·åšï¼ˆå¦‚ OpenVR),Godot 就会在å±å¹•ä¸Šåªæ˜¾ç¤ºä¸€" "åªçœ¼ç›è€Œä¸å¤±çœŸã€‚å¦å¤–ï¼Œä½ å¯ä»¥åœ¨åœºæ™¯ä¸æ·»åŠ ä¸€ä¸ªå•独的视窗节点,在该视窗上å¯ç”¨ " "AR/VR。它将被用æ¥è¾“出到 HMDï¼Œè®©ä½ åœ¨ä¸»çª—å£ä¸åšä½ 喜欢的事情,比如用一个å•独的相" @@ -10527,7 +10573,7 @@ msgstr "" "var res = astar.get_id_path(1, 3) # 返回 [1, 2, 3]\n" "[/codeblock]\n" "å¦‚æžœä½ æŠŠç¬¬ 2 点的æƒé‡æ”¹ä¸º 3ï¼Œé‚£ä¹ˆç»“æžœå°±ä¼šå˜æˆ [code][1, 4, 3][/code]ï¼Œå› ä¸ºçŽ°" -"在虽然è·ç¦»é•¿äº†ï¼Œä½†é€šè¿‡ç¬¬ 4 点比通过第 2 点 “容易â€ã€‚" +"在虽然è·ç¦»é•¿äº†ï¼Œä½†é€šè¿‡ç¬¬ 4 点比通过第 2 点“容易â€ã€‚" #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" @@ -10841,10 +10887,10 @@ msgid "" "[b]Note:[/b] This method is not thread-safe. If called from a [Thread], it " "will return an empty [PoolVector2Array] and will print an error message." msgstr "" -"返回一个数组,该数组包å«äº†AStar2D在给定点之间找到的路径ä¸çš„点。该数组从路径的" -"起点到终点排åºã€‚\n" -"[b]注æ„:[/b]è¿™ä¸ªæ–¹æ³•ä¸æ˜¯çº¿ç¨‹å®‰å…¨çš„。如果从一个[Thread]线程ä¸è°ƒç”¨ï¼Œå®ƒå°†è¿”回一" -"个空的[PoolVector2Array],并打å°ä¸€ä¸ªé”™è¯¯ä¿¡æ¯ã€‚" +"返回一个数组,该数组包å«äº† AStar2D 在给定点之间找到的路径ä¸çš„点。该数组从路径" +"的起点到终点排åºã€‚\n" +"[b]注æ„:[/b]è¿™ä¸ªæ–¹æ³•ä¸æ˜¯çº¿ç¨‹å®‰å…¨çš„。如果从 [Thread] 线程ä¸è°ƒç”¨ï¼Œå®ƒå°†è¿”回一个" +"空的 [PoolVector2Array],并打å°ä¸€ä¸ªé”™è¯¯ä¿¡æ¯ã€‚" #: doc/classes/AtlasTexture.xml msgid "" @@ -10914,7 +10960,7 @@ msgid "" "the connections between buses. See [AudioServer] for usage." msgstr "" "å˜å‚¨ä½ç½®ã€é™éŸ³ã€ç‹¬å¥ã€æ—é€šã€æ•ˆæžœã€æ•ˆæžœä½ç½®ã€éŸ³é‡ä»¥åŠæ€»çº¿ä¹‹é—´çš„连接。使用方法" -"å‚阅 [AudioServer] 。" +"è§ [AudioServer] 。" #: doc/classes/AudioEffect.xml msgid "Audio effect for audio." @@ -10926,8 +10972,9 @@ msgid "" "resource is applied on." msgstr "音频总线的基础资æºã€‚åœ¨è¯¥èµ„æºæ‰€åº”用的总线上应用音频效果。" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "音频麦克风录音演示" @@ -10986,28 +11033,42 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" "AudioEffectCapture æ˜¯ä¸€ç§ AudioEffect,å¯å°†æ‰€é™„音频效果总线的所有音频帧å¤åˆ¶åˆ°" "其内部的环形缓冲器ä¸ã€‚\n" "应用程åºä»£ç 应使用 [method get_buffer] ä»Žè¯¥çŽ¯å½¢ç¼“å†²å™¨ä¸æ¶ˆè€—è¿™äº›éŸ³é¢‘å¸§ï¼Œå¹¶æ ¹æ®" -"需è¦è¿›è¡Œå¤„ç†ï¼Œä¾‹å¦‚从麦克风æ•获数æ®ã€å®žçŽ°åº”ç”¨ç¨‹åºå®šä¹‰çš„æ•ˆæžœæˆ–é€šè¿‡ç½‘ç»œä¼ è¾“éŸ³" -"频。从麦克风æ•èŽ·éŸ³é¢‘æ•°æ®æ—¶ï¼Œæ ·æœ¬çš„æ ¼å¼ä¸ºç«‹ä½“声 32 使µ®ç‚¹æ•° PCM。" +"需è¦è¿›è¡Œå¤„ç†ï¼Œä¾‹å¦‚从 [AudioStreamMicrophone] æ•获数æ®ã€å®žçŽ°åº”ç”¨ç¨‹åºå®šä¹‰çš„æ•ˆæžœ" +"æˆ–é€šè¿‡ç½‘ç»œä¼ è¾“éŸ³é¢‘ã€‚ä»Žéº¦å…‹é£Žæ•èŽ·éŸ³é¢‘æ•°æ®æ—¶ï¼Œæ ·æœ¬çš„æ ¼å¼ä¸ºç«‹ä½“声 32 使µ®ç‚¹æ•° " +"PCM。\n" +"[b]注æ„:[/b][member ProjectSettings.audio/enable_audio_input] 必须为 " +"[code]true[/code] 音频输入æ‰èƒ½æ£å¸¸å·¥ä½œã€‚å¦è¯·å‚阅该设置项的æè¿°ï¼Œäº†è§£æƒé™å’Œæ“" +"作系统éšç§è®¾ç½®ç›¸å…³çš„说明。" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" +msgstr "音频总线" #: doc/classes/AudioEffectCapture.xml msgid "" "Returns [code]true[/code] if at least [code]frames[/code] audio frames are " "available to read in the internal ring buffer." msgstr "" -"如果内部环缓冲器ä¸è‡³å°‘有[code]frames[/code]音频帧å¯ä¾›è¯»å–,则返回 " +"如果内部环形缓冲区ä¸è‡³å°‘有 [code]frames[/code] 个音频帧å¯ä¾›è¯»å–,则返回 " "[code]true[/code]。" #: doc/classes/AudioEffectCapture.xml msgid "Clears the internal ring buffer." -msgstr "清除内部环缓冲区。" +msgstr "清除内部环形缓冲区。" #: doc/classes/AudioEffectCapture.xml msgid "" @@ -11017,13 +11078,13 @@ msgid "" "samples if available, or an empty [PoolVector2Array] if insufficient data " "was available." msgstr "" -"从内部环缓冲区获å–下一个[code]frames[/code]éŸ³é¢‘æ ·æœ¬ã€‚\n" -"如果有的è¯ï¼Œè¿”回一个æ£å¥½åŒ…å«[code]frames[/code]éŸ³é¢‘æ ·æœ¬çš„[PoolVector2Array]," -"如果没有足够的数æ®ï¼Œåˆ™è¿”回一个空[PoolVector2Array]。" +"从内部环形缓冲区获å–åŽç» [code]frames[/code] ä¸ªéŸ³é¢‘æ ·æœ¬ã€‚\n" +"如果有的è¯ï¼Œè¿”回一个æ£å¥½åŒ…å« [code]frames[/code] ä¸ªéŸ³é¢‘æ ·æœ¬çš„ " +"[PoolVector2Array],如果没有足够的数æ®ï¼Œåˆ™è¿”回一个空 [PoolVector2Array]。" #: doc/classes/AudioEffectCapture.xml msgid "Returns the total size of the internal ring buffer in frames." -msgstr "返回内部环缓冲区的总大å°ï¼Œä»¥å¸§ä¸ºå•ä½ã€‚" +msgstr "返回内部环形缓冲区的总大å°ï¼Œä»¥å¸§ä¸ºå•ä½ã€‚" #: doc/classes/AudioEffectCapture.xml msgid "" @@ -11045,7 +11106,7 @@ msgid "" "Length of the internal ring buffer, in seconds. Setting the buffer length " "will have no effect if already initialized." msgstr "" -"内部环缓冲区的长度,å•使˜¯ç§’。如果已ç»åˆå§‹åŒ–,设置缓冲区长度将没有效果。" +"内部环形缓冲区的长度,å•ä½ä¸ºç§’。如果已ç»åˆå§‹åŒ–,设置缓冲区长度将没有效果。" #: doc/classes/AudioEffectChorus.xml msgid "Adds a chorus audio effect." @@ -11270,12 +11331,6 @@ msgstr "" "é€šè¿‡æ‰æ›²æ³¢å½¢ï¼Œé¢‘率内容会å‘生å˜åŒ–ï¼Œè¿™é€šå¸¸ä¼šä½¿å£°éŸ³â€œæ¸…è„†â€æˆ–“粗糙â€ã€‚对于游æˆï¼Œå®ƒ" "å¯ä»¥éžå¸¸æœ‰æ•ˆåœ°æ¨¡æ‹Ÿæ¥è‡ªä¸€äº›é¥±å’Œè®¾å¤‡æˆ–扬声器的声音。" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "音频总线" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "失真度。值的范围å¯åœ¨ 0 到 1 之间。" @@ -11932,8 +11987,17 @@ msgstr "" "[AudioEffect] 效果。" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." -msgstr "返回系统上检测到的所有音频输入设备的å称。" +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" +"è¿”å›žç³»ç»Ÿä¸æ£€æµ‹åˆ°çš„æ‰€æœ‰éŸ³é¢‘输入设备的å称。\n" +"[b]注æ„:[/b][member ProjectSettings.audio/enable_audio_input] 必须为 " +"[code]true[/code] 音频输入æ‰èƒ½æ£å¸¸å·¥ä½œã€‚å¦è¯·å‚阅该设置项的æè¿°ï¼Œäº†è§£æƒé™å’Œæ“" +"作系统éšç§è®¾ç½®ç›¸å…³çš„说明。" #: doc/classes/AudioServer.xml msgid "Generates an [AudioBusLayout] using the available buses and effects." @@ -12092,7 +12156,7 @@ msgid "" "Sets the volume of the bus at index [code]bus_idx[/code] to [code]volume_db[/" "code]." msgstr "" -"将索引 [code]bus_idx[/code] 处的总线容é‡è®¾ç½®ä¸º [code]volume_db[/code]。" +"将索引 [code]bus_idx[/code] 处的总线音é‡è®¾ç½®ä¸º [code]volume_db[/code]。" #: doc/classes/AudioServer.xml msgid "Swaps the position of two effects in bus [code]bus_idx[/code]." @@ -12110,17 +12174,24 @@ msgstr "å¯ç”¨éŸ³é¢‘总线的数é‡ã€‚" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." -msgstr "" -"当å‰éŸ³é¢‘输出设备的åç§°ï¼ˆè§ [method get_device_list])。在具有多个音频输出的系" -"统ä¸ï¼ˆä¾‹å¦‚模拟ã€USBã€HDMI 音频),å¯ç”¨äºŽé€‰æ‹©éŸ³é¢‘输出设备。为 " +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" +"当å‰éŸ³é¢‘输出设备的åç§°ï¼ˆè§ [method capture_get_device_list])。在具有多个音频" +"输出的系统ä¸ï¼ˆä¾‹å¦‚模拟ã€USBã€HDMI 音频),å¯ç”¨äºŽé€‰æ‹©éŸ³é¢‘输出设备。为 " "[code]\"Default\"[/code] æ—¶ä¼šä»Žç³»ç»Ÿé»˜è®¤çš„éŸ³é¢‘è¾“å‡ºæ’æ”¾éŸ³é¢‘ã€‚å¦‚æžœè®¾ç½®äº†æ— æ•ˆçš„è®¾" -"备å称,该值会被æ¢å¤ä¸º [code]\"Default\"[/code]。" +"备å称,该值会被æ¢å¤ä¸º [code]\"Default\"[/code]。\n" +"[b]注æ„:[/b][member ProjectSettings.audio/enable_audio_input] 必须为 " +"[code]true[/code] 音频输入æ‰èƒ½æ£å¸¸å·¥ä½œã€‚å¦è¯·å‚阅该设置项的æè¿°ï¼Œäº†è§£æƒé™å’Œæ“" +"作系统éšç§è®¾ç½®ç›¸å…³çš„说明。" #: doc/classes/AudioServer.xml msgid "" @@ -12304,6 +12375,26 @@ msgstr "" "[method push_buffer] 效率低,但在 GDScript ä¸ [method push_frame] å¯èƒ½[i]更高" "效[/i]。" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "æ’æ”¾å®žæ—¶éŸ³é¢‘输入数æ®ã€‚" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" +"在 [AudioStreamPlayer] 节点ä¸ç›´æŽ¥ä½¿ç”¨æ—¶ï¼Œ[AudioStreamMicrophone] ä¼šå®žæ—¶æ’æ”¾éº¦" +"克风的输入。å¯ä»¥ä¸Ž [AudioEffectCapture] é…åˆä½¿ç”¨ï¼Œå¯¹æ•°æ®è¿›è¡Œå¤„ç†æˆ–ä¿å˜ã€‚\n" +"[b]注æ„:[/b][member ProjectSettings.audio/enable_audio_input] 必须为 " +"[code]true[/code] 音频输入æ‰èƒ½æ£å¸¸å·¥ä½œã€‚å¦è¯·å‚阅该设置项的æè¿°ï¼Œäº†è§£æƒé™å’Œæ“" +"作系统éšç§è®¾ç½®ç›¸å…³çš„说明。" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "MP3 音频æµé©±åŠ¨ç¨‹åºã€‚" @@ -12323,7 +12414,7 @@ msgstr "如果为 [code]true[/code],当æµåˆ°è¾¾æœ«å°¾æ—¶å°†è‡ªåŠ¨å¾ªçŽ¯ã€‚" #: modules/minimp3/doc_classes/AudioStreamMP3.xml #: modules/stb_vorbis/doc_classes/AudioStreamOGGVorbis.xml msgid "Time in seconds at which the stream starts after being looped." -msgstr "å¾ªçŽ¯åŽæµå¼€å§‹çš„æ—¶é—´ï¼ˆç§’)。" +msgstr "循环时,æµå¼€å§‹çš„æ—¶é—´ï¼Œå•ä½ä¸ºç§’。" #: modules/stb_vorbis/doc_classes/AudioStreamOGGVorbis.xml msgid "OGG Vorbis audio stream driver." @@ -12456,18 +12547,23 @@ msgstr "在 2D ç©ºé—´ä¸æ’放与ä½ç½®ç›¸å…³çš„声音。" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " "[member volume_db] to a very low value like [code]-100[/code] (which isn't " "audible to human hearing)." msgstr "" -"æ’æ”¾éŸ³é¢‘,éšç€ä¸Žå±å¹•ä¸å¿ƒçš„è·ç¦»è€Œå‡å¼±ã€‚\n" -"å‚阅 [AudioStreamPlayer] æ¥æ’放éžä½ç½®æ€§çš„声音。\n" -"[b]注æ„:[/b]éšè—一个 [AudioStreamPlayer2D] 节点并ä¸èƒ½ç¦ç”¨å…¶éŸ³é¢‘è¾“å‡ºã€‚è¦æš‚æ—¶" -"ç¦ç”¨ [AudioStreamPlayer2D] 的音频输出,请将 [member volume_db] 设置为一个éžå¸¸" -"低的值,如[code]-100[/code](人的å¬è§‰å¬ä¸åˆ°ï¼‰ã€‚" +"æ’æ”¾éŸ³é¢‘,éšç€ä¸Žç»™å®šä½ç½®çš„è·ç¦»è€Œå‡å¼±ã€‚\n" +"默认情况下,音频是从å±å¹•ä¸å¿ƒæ”¶å¬çš„。è¦ä¿®æ”¹è¿™ä¸ªä½ç½®ï¼Œå¯ä»¥åœ¨åœºæ™¯ä¸æ·»åŠ ä¸€ä¸ª " +"[Listener2D] 节点,并通过调用 [method Listener2D.make_current] 将其å¯ç”¨ã€‚\n" +"å¦è¯·å‚阅 [AudioStreamPlayer] æ¥æ’放éžä½ç½®æ€§çš„声音。\n" +"[b]注æ„:[/b]éšè— [AudioStreamPlayer2D] 节点并ä¸èƒ½ç¦ç”¨å…¶éŸ³é¢‘è¾“å‡ºã€‚è¦æš‚æ—¶ç¦ç”¨ " +"[AudioStreamPlayer2D] 的音频输出,请将 [member volume_db] 设置为éžå¸¸ä½Žçš„值," +"如 [code]-100[/code](人的å¬è§‰å¬ä¸åˆ°ï¼‰ã€‚" #: doc/classes/AudioStreamPlayer2D.xml doc/classes/AudioStreamPlayer3D.xml msgid "Returns the position in the [AudioStream]." @@ -12530,14 +12626,14 @@ msgid "" "audible to human hearing)." msgstr "" "æ’æ”¾å…·æœ‰å®šå‘性的声音效果,如果需è¦ï¼Œå¯éšç€è·ç¦»çš„å¢žåŠ è€Œå‡å¼±ï¼Œäº§ç”Ÿç©ºé—´ä¸å¯å¬åˆ°" -"çš„ä½ç½®æ•ˆæžœã€‚为了更逼真,低通滤波器会自动应用于远处的声音。这å¯ä»¥é€šè¿‡è®¾ç½®" -"[member attenuation_filter_cutoff_hz]为[code]20500[/code]æ¥ç¦ç”¨ã€‚\n" -"默认情况下,音频是从相机的ä½ç½®å¬åˆ°çš„,这å¯ä»¥é€šè¿‡åœ¨åœºæ™¯ä¸æ·»åŠ ä¸€ä¸ª[Listener]节" -"点,并通过对其调用[method Listener.make_current]æ¥å¯ç”¨å®ƒï¼Œä»¥æ”¹å˜ã€‚\n" -"å‚阅[AudioStreamPlayer]æ¥æ’放éžä½ç½®çš„声音。\n" -"[b]注æ„:[/b]éšè—一个[AudioStreamPlayer3D]节点并ä¸èƒ½ç¦ç”¨å…¶éŸ³é¢‘è¾“å‡ºã€‚è¦æš‚æ—¶ç¦" -"用[AudioStreamPlayer3D]的音频输出,请将[member unit_db]设置为一个éžå¸¸ä½Žçš„值," -"如[code]-100[/code](人的å¬è§‰å¬ä¸åˆ°ï¼‰ã€‚" +"çš„ä½ç½®æ•ˆæžœã€‚为了更逼真,低通滤波器会自动应用于远处的声音。这å¯ä»¥é€šè¿‡è®¾ç½® " +"[member attenuation_filter_cutoff_hz] 为 [code]20500[/code] æ¥ç¦ç”¨ã€‚\n" +"默认情况下,音频是从相机的ä½ç½®å¬åˆ°çš„,这å¯ä»¥é€šè¿‡åœ¨åœºæ™¯ä¸æ·»åŠ ä¸€ä¸ª [Listener] " +"节点,并通过对其调用 [method Listener.make_current] æ¥å¯ç”¨å®ƒï¼Œä»¥æ”¹å˜ã€‚\n" +"å‚阅 [AudioStreamPlayer] æ¥æ’放éžä½ç½®çš„声音。\n" +"[b]注æ„:[/b]éšè—一个 [AudioStreamPlayer3D] 节点并ä¸èƒ½ç¦ç”¨å…¶éŸ³é¢‘è¾“å‡ºã€‚è¦æš‚æ—¶" +"ç¦ç”¨ [AudioStreamPlayer3D] 的音频输出,请将 [member unit_db] 设置为一个éžå¸¸ä½Ž" +"的值,如 [code]-100[/code](人的å¬è§‰å¬ä¸åˆ°ï¼‰ã€‚" #: doc/classes/AudioStreamPlayer3D.xml msgid "" @@ -12609,8 +12705,9 @@ msgid "" "doppler_tracking] property is set to a value other than [constant Camera." "DOPPLER_TRACKING_DISABLED]." msgstr "" -"决定 [url=https://en.wikipedia.org/wiki/Doppler_effect]多普勒效应[/url] 应该" -"在哪一æ¥è®¡ç®—。\n" +"决定[url=https://zh.wikipedia.org/wiki/" +"%E5%A4%9A%E6%99%AE%E5%8B%92%E6%95%88%E5%BA%94]多普勒效应[/url]应该在哪一æ¥è®¡" +"算。\n" "[b]注æ„:[/b]ä»…å½“å½“å‰ [Camera] çš„ [member Camera.doppler_tracking] 属性设置" "为 [constant Camera.DOPPLER_TRACKING_DISABLED] 以外的值时有效。" @@ -12640,7 +12737,7 @@ msgstr "设置声级的ç»å¯¹æœ€å¤§å€¼ï¼Œä»¥åˆ†è´ä¸ºå•ä½ã€‚" msgid "" "Sets the distance from which the [member out_of_range_mode] takes effect. " "Has no effect if set to 0." -msgstr "设置[member out_of_range_mode]生效的è·ç¦»ã€‚设置为0时没有效果。" +msgstr "设置 [member out_of_range_mode] 生效的è·ç¦»ã€‚设置为 0 时没有效果。" #: doc/classes/AudioStreamPlayer3D.xml msgid "" @@ -12785,7 +12882,7 @@ msgstr "" #: doc/classes/AudioStreamSample.xml msgid "Audio format. See [enum Format] constants for values." -msgstr "éŸ³é¢‘æ ¼å¼ã€‚å‚阅 [enum Format] 常é‡çš„值。" +msgstr "éŸ³é¢‘æ ¼å¼ã€‚å–å€¼è§ [enum Format] 常é‡ã€‚" #: doc/classes/AudioStreamSample.xml msgid "" @@ -13151,7 +13248,7 @@ msgid "" "When enabled, a lightmap denoiser will be used to reduce the noise inherent " "to Monte Carlo based global illumination." msgstr "" -"å¯ç”¨åŽï¼Œå°†ä½¿ç”¨å…‰ç…§è´´å›¾é™å™ªå™¨æ¥å‡å°‘基于Monte Carlo的全局照明固有的噪声。" +"å¯ç”¨åŽï¼Œå°†ä½¿ç”¨å…‰ç…§è´´å›¾é™å™ªå™¨æ¥å‡å°‘基于 Monte Carlo 的全局照明固有的噪声。" #: doc/classes/BakedLightmap.xml msgid "" @@ -13197,12 +13294,12 @@ msgid "" "Returns if no viable save path is found. This can happen where an [member " "image_path] is not specified or when the save location is invalid." msgstr "" -"如果没有找到åˆé€‚çš„ä¿å˜è·¯å¾„,则返回。这å¯èƒ½å‘生在没有指定[member image_path]或" -"者ä¿å˜ä½ç½®æ— 效的情况下。" +"如果没有找到åˆé€‚çš„ä¿å˜è·¯å¾„,则返回。这å¯èƒ½å‘生在没有指定 [member image_path] " +"或者ä¿å˜ä½ç½®æ— 效的情况下。" #: doc/classes/BakedLightmap.xml doc/classes/SpatialMaterial.xml msgid "Currently unused." -msgstr "当剿œªä½¿ç”¨." +msgstr "当剿œªä½¿ç”¨ã€‚" #: doc/classes/BakedLightmap.xml msgid "Returns when the baker cannot save per-mesh textures to file." @@ -13753,7 +13850,7 @@ msgstr "" #: doc/classes/BitMap.xml msgid "" "Creates a bitmap with the specified size, filled with [code]false[/code]." -msgstr "创建一个指定尺寸的ä½å›¾ï¼Œç”¨[code]false[/code]填充。" +msgstr "创建一个指定尺寸的ä½å›¾ï¼Œç”¨ [code]false[/code] 填充。" #: doc/classes/BitMap.xml msgid "" @@ -13777,7 +13874,7 @@ msgstr "返回ä½å›¾çš„尺寸。" #: doc/classes/BitMap.xml msgid "" "Returns the amount of bitmap elements that are set to [code]true[/code]." -msgstr "返回设置为 [code]true[/code]çš„ä½å›¾å…ƒç´ 的数é‡ã€‚" +msgstr "返回设置为 [code]true[/code] çš„ä½å›¾å…ƒç´ 的数é‡ã€‚" #: doc/classes/BitMap.xml msgid "" @@ -13811,9 +13908,9 @@ msgid "" "bmfont/]BMFont[/url] format.\n" "Handles files with the [code].fnt[/code] extension." msgstr "" -"使用[url=https://www.angelcode.com/products/bmfont/]BMFont[/url]æ ¼å¼çš„å—体æ¥" -"渲染文本。\n" -"å¤„ç†æ‰©å±•å为[code].fnt[/code]的文件。" +"使用 [url=https://www.angelcode.com/products/bmfont/]BMFont[/url] æ ¼å¼çš„å—体" +"æ¥æ¸²æŸ“文本。\n" +"å¤„ç†æ‰©å±•å为 [code].fnt[/code] 的文件。" #: doc/classes/BitmapFont.xml msgid "" @@ -14262,7 +14359,7 @@ msgstr "将文本å‘左对é½ã€‚" #: doc/classes/Button.xml msgid "Align the text to the center." -msgstr "将文本居ä¸å¯¹é½ã€‚。" +msgstr "将文本居ä¸å¯¹é½ã€‚" #: doc/classes/Button.xml msgid "Align the text to the right." @@ -14413,7 +14510,7 @@ msgid "" "[code]enable_next[/code] is [code]true[/code], request to make the next " "camera current, if any." msgstr "" -"如果这是当å‰ç›¸æœºï¼Œåˆ™å°†å…¶ä»Žå½“å‰ç›¸æœºä¸ç§»é™¤ã€‚如果[code]enable_next[/code]是" +"如果这是当å‰ç›¸æœºï¼Œåˆ™å°†å…¶ä»Žå½“å‰ç›¸æœºä¸ç§»é™¤ã€‚如果 [code]enable_next[/code] 为 " "[code]true[/code],请求使下一个相机æˆä¸ºå½“å‰ç›¸æœºï¼ˆå¦‚果有)。" #: doc/classes/Camera.xml @@ -14436,8 +14533,8 @@ msgid "" "Returns [code]true[/code] if the given [code]layer[/code] in the [member " "cull_mask] is enabled, [code]false[/code] otherwise." msgstr "" -"如果[member cull_mask]ä¸ç»™å®šçš„[code]layer[/code]被å¯ç”¨ï¼Œè¿”回 [code]true[/" -"code],å¦åˆ™è¿”回 [code]false[/code]。" +"如果 [member cull_mask] ä¸ç»™å®šçš„ [code]layer[/code] 被å¯ç”¨ï¼Œåˆ™è¿”回 " +"[code]true[/code],å¦åˆ™è¿”回 [code]false[/code]。" #: doc/classes/Camera.xml msgid "" @@ -14507,18 +14604,19 @@ msgstr "" #: doc/classes/Camera.xml msgid "" "Enables or disables the given [code]layer[/code] in the [member cull_mask]." -msgstr "å¯ç”¨æˆ–ç¦ç”¨[member cull_mask]ä¸ç»™å®šçš„[code]layer[/code]。" +msgstr "å¯ç”¨æˆ–ç¦ç”¨ [member cull_mask] ä¸ç»™å®šçš„ [code]layer[/code]。" #: doc/classes/Camera.xml msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" "é€šè¿‡æŒ‡å®šå¤§å° [code]size[/code] ã€åç§»é‡ [code]offset[/code] 以åŠä»¥ä¸–界空间为" "å•ä½çš„ [code]z_near[/code] å’Œ [code]z_far[/code] è£å‰ªå¹³é¢ï¼Œå°†ç›¸æœºæŠ•影设置为视" -"锥模å¼ï¼ˆè¯·å‚阅 [constant PROJECTION_FRUSTUM])。" +"锥模å¼ï¼ˆè¯·å‚阅 [constant PROJECTION_FRUSTUM])。å¦è¯·å‚阅 [member " +"frustum_offset]。" #: doc/classes/Camera.xml msgid "" @@ -14646,10 +14744,14 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" -"相机的机身å移。å¯ä»¥æ›´æ”¹é»˜è®¤å€¼ï¼Œä»¥åˆ›å»º \"倾斜frustum \"效果,如[url=https://" -"zdoom.org/wiki/Y-shearing]Y-shearing[/url]。" +"相机的机身å移。å¯ä»¥æ›´æ”¹é»˜è®¤å€¼ï¼Œä»¥åˆ›å»ºâ€œå€¾æ–œå¹³æˆªå¤´ä½“â€æ•ˆæžœï¼Œå¦‚ [url=https://" +"zdoom.org/wiki/Y-shearing]Y-shearing[/url]。\n" +"[b]注æ„:[/b]仅在 [member projection] 为 [constant PROJECTION_FRUSTUM] 时有" +"效。" #: doc/classes/Camera.xml msgid "The horizontal (X) offset of the camera viewport." @@ -14680,12 +14782,12 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" -"相机的尺寸,以 1/2 的宽度或高度为å•ä½ã€‚仅适用于æ£äº¤åŠè§†é”¥æ¨¡å¼ã€‚由于 [member " -"keep_aspect] é”å®šåœ¨è½´ä¸Šï¼Œå› æ¤ [code]size[/code] 设置其他轴的尺寸长度。" +"该相机的大å°ï¼Œå•ä½ä¸ºç±³ï¼Œæè¿°çš„æ˜¯å®Œæ•´çš„宽度或者高度,å–决于 [member " +"keep_aspect]。仅适用于æ£äº¤å’Œå¹³æˆªå¤´ä½“模å¼ã€‚" #: doc/classes/Camera.xml msgid "The vertical (Y) offset of the camera viewport." @@ -14860,7 +14962,7 @@ msgstr "" msgid "" "Make this the current 2D camera for the scene (viewport and layer), in case " "there are many cameras in the scene." -msgstr "使之æˆä¸ºåœºæ™¯ï¼ˆè§†çª—å’Œå›¾å±‚ï¼‰çš„å½“å‰ 2D ç›¸æœºï¼Œä»¥é˜²åœºæ™¯ä¸æœ‰å¾ˆå¤šç›¸æœºã€‚" +msgstr "使之æˆä¸ºè¯¥åœºæ™¯ï¼ˆè§†åŒºå’Œå›¾å±‚ï¼‰çš„å½“å‰ 2D ç›¸æœºï¼Œä»¥é˜²åœºæ™¯ä¸æœ‰å¾ˆå¤šç›¸æœºã€‚" #: doc/classes/Camera2D.xml msgid "" @@ -14906,8 +15008,8 @@ msgid "" "The custom [Viewport] node attached to the [Camera2D]. If [code]null[/code] " "or not a [Viewport], uses the default viewport instead." msgstr "" -"连接到[Camera2D]的自定义[Viewport]节点。如果[code]null[/code]æˆ–ä¸æ˜¯" -"[Viewport],则使用默认的 Viewpor。" +"连接到 [Camera2D] 的自定义 [Viewport] 节点。如果为 [code]null[/code] 或者ä¸" +"是 [Viewport],则使用默认的视区。" #: doc/classes/Camera2D.xml msgid "" @@ -15038,7 +15140,7 @@ msgstr "" #: doc/classes/Camera2D.xml msgid "The camera's process callback. See [enum Camera2DProcessMode]." -msgstr "相机的过程回调。请å‚阅[enum Camera2DProcessMode]。" +msgstr "ç›¸æœºçš„è¿‡ç¨‹å›žè°ƒã€‚è§ [enum Camera2DProcessMode]。" #: doc/classes/Camera2D.xml msgid "If [code]true[/code], the camera view rotates with the target." @@ -15269,13 +15371,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -15292,13 +15395,13 @@ msgstr "" "任何 2D 对象的基类。画布项目(Canvas Itemï¼‰ä»¥æ ‘çŠ¶æŽ’åˆ—ï¼›å节点继承并扩展其父节" "ç‚¹çš„å˜æ¢ã€‚[CanvasItem] ç”± [Control] 扩展为任何 GUI 相关的东西,由 [Node2D] 扩" "展为任何 2D 引擎相关的东西。\n" -"任何 [CanvasItem] 都å¯ä»¥ç»˜å›¾ã€‚è¦ç»˜å›¾å°±å¿…须调用 [method update],然åŽå°±ä¼šåœ¨ç©º" -"闲时接收到 [constant NOTIFICATION_DRAW] æ¥è¯·æ±‚é‡ç»˜ã€‚å› æ¤ç”»å¸ƒé¡¹ç›®ä¸éœ€è¦æ¯ä¸€å¸§" -"都é‡ç»˜ï¼Œå¤§å¤§æå‡äº†æ€§èƒ½ã€‚æä¾›äº†å‡ 个用于在 [CanvasItem] 上绘图的函数(请å‚阅 " -"[code]draw_*[/code] 函数)。但是,它们åªèƒ½åœ¨ [method Object._notification]ã€" -"ä¿¡å·æˆ–虚函数 [method _draw] 内部使用。\n" -"ç”»å¸ƒé¡¹ç›®æ˜¯æŒ‰æ ‘çŠ¶é¡ºåºç»˜åˆ¶çš„。默认情况下,åé¡¹ç›®åœ¨å…¶çˆ¶é¡¹ç›®çš„é¡¶éƒ¨ï¼Œå› æ¤æ ¹" -"[CanvasItem]将被画在所有项目的åŽé¢ã€‚è¿™ç§è¡Œä¸ºå¯ä»¥åœ¨æ¯ä¸ªé¡¹ç›®çš„基础上进行更" +"任何 [CanvasItem] 都å¯ä»¥ç»˜å›¾ã€‚绘图时,引擎会调用 [method update],然åŽå°±ä¼šåœ¨" +"空闲时接收到 [constant NOTIFICATION_DRAW] æ¥è¯·æ±‚é‡ç»˜ã€‚å› æ¤ç”»å¸ƒé¡¹ç›®ä¸éœ€è¦æ¯ä¸€" +"帧都é‡ç»˜ï¼Œå¤§å¤§æå‡äº†æ€§èƒ½ã€‚æä¾›äº†å‡ 个用于在 [CanvasItem] 上绘图的函数(请å‚阅 " +"[code]draw_*[/code] 函数)。ä¸è¿‡å®ƒä»¬éƒ½åªèƒ½åœ¨ [method _draw] åŠå…¶å¯¹åº”çš„ " +"[method Object._notification] 或 [signal draw] 内部使用。\n" +"ç”»å¸ƒé¡¹ç›®æ˜¯æŒ‰æ ‘çŠ¶é¡ºåºç»˜åˆ¶çš„。默认情况下,åé¡¹ç›®åœ¨å…¶çˆ¶é¡¹ç›®çš„é¡¶éƒ¨ï¼Œå› æ¤æ ¹ " +"[CanvasItem] 将被画在所有项目的åŽé¢ã€‚è¿™ç§è¡Œä¸ºå¯ä»¥åœ¨æ¯ä¸ªé¡¹ç›®çš„基础上进行更" "改。\n" "[CanvasItem] 也å¯ä»¥è¢«éšè—,这也将éšè—å…¶å项目。它æä¾›äº†è®¸å¤šæ–¹æ³•æ¥æ”¹å˜å‚数,如" "调制(对它自己和它的å项目)和自调制(åªå¯¹å®ƒè‡ªå·±ï¼‰ï¼Œä»¥åŠå®ƒçš„æ··åˆæ¨¡å¼ã€‚\n" @@ -15318,9 +15421,14 @@ msgstr "2D ä¸çš„自定义绘图" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." -msgstr "引擎调用的å¯è¦†ç›–函数(如果定义了)æ¥ç»˜åˆ¶ç”»å¸ƒé¡¹ç›®ã€‚" +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." +msgstr "" +"当 [CanvasItem] 被请求é‡ç»˜æ—¶è°ƒç”¨ï¼ˆæ‰‹åŠ¨è°ƒç”¨æˆ–è€…å¼•æ“Žè°ƒç”¨ [method update] " +"时)。\n" +"对应于 [method Object._notification] ä¸çš„ [constant NOTIFICATION_DRAW] 通知。" #: doc/classes/CanvasItem.xml msgid "" @@ -15624,9 +15732,10 @@ msgid "" "[/codeblock]\n" "See also [method Font.draw]." msgstr "" -"使用指定的[code]font[/code]在[code]position[/code]绘制[code]text[/code](左下" -"角作为å—体的基线)。该文本的颜色将乘以[code]modulate[/code]。如果" -"[code]clip_w[/code]大于或ç‰äºŽ0,文本超过了指定的宽度,将被è£å‰ªã€‚\n" +"使用指定的å—体 [code]font[/code] 在 [code]position[/code] ä½ç½®ç»˜åˆ¶ " +"[code]text[/code](ä½ç½®ä¸ºå—体基线的左下角)。该文本的颜色将乘以 " +"[code]modulate[/code]。如果 [code]clip_w[/code] 大于ç‰äºŽ 0,文本超过了指定的" +"宽度时会被è£å‰ªã€‚\n" "[b]使用项目默认å—体的例å:[/b]\n" "[codeblock]\n" "# å¦‚æžœåœ¨ä¸æ–é‡ç»˜çš„脚本ä¸ä½¿ç”¨æ¤æ–¹æ³•,\n" @@ -15635,7 +15744,7 @@ msgstr "" "var default_font = Control.new().get_font(\"font\")\n" "draw_string(default_font, Vector2(64, 64), \"Hello world\")\n" "[/codeblock]\n" -"å‚阅[method Font.draw]。" +"å¦è¯·å‚阅 [method Font.draw]。" #: doc/classes/CanvasItem.xml msgid "Draws a styled rectangle." @@ -15721,7 +15830,7 @@ msgstr "è¿”å›žè¿™ä¸ªé¡¹ç›®ç›¸å¯¹äºŽè§†åŒºçš„å˜æ¢ã€‚" #: doc/classes/CanvasItem.xml msgid "Returns the [World2D] where this item is in." -msgstr "返回æ¤ç‰©å“所在的[World2D]。" +msgstr "返回æ¤ç‰©å“所在的 [World2D]。" #: doc/classes/CanvasItem.xml msgid "" @@ -15742,7 +15851,7 @@ msgid "" "Returns [code]true[/code] if the node is set as top-level. See [method " "set_as_toplevel]." msgstr "" -"如果节点设置为顶层,则返回 [code]true[/code]。å‚阅 [method set_as_toplevel]。" +"如果节点设置为顶层,则返回 [code]true[/code]ã€‚è§ [method set_as_toplevel]。" #: doc/classes/CanvasItem.xml msgid "" @@ -15750,16 +15859,16 @@ msgid "" "to children." msgstr "å¦‚æžœå°†å…¨å±€å˜æ¢é€šçŸ¥ä¼ 达给å级,则返回 [code]true[/code]。" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" "如果该节点ä½äºŽ [SceneTree] ä¸ï¼Œå¹¶ä¸”å…¶ [member visible] 属性为 [code]true[/" "code],并且其所有上层节点也å‡å¯è§ï¼Œåˆ™è¿”回 [code]true[/code]。如果任何上层节点" -"被éšè—ï¼Œåˆ™è¯¥èŠ‚ç‚¹åœ¨åœºæ™¯æ ‘ä¸å°†ä¸å¯è§ã€‚" +"被éšè—ï¼Œåˆ™è¯¥èŠ‚ç‚¹åœ¨åœºæ™¯æ ‘ä¸å°†ä¸å¯è§ï¼Œå› æ¤ä¹Ÿä¸ä¼šè¿›è¡Œç»˜åˆ¶ï¼ˆè§ [method _draw])。" #: doc/classes/CanvasItem.xml msgid "Assigns [code]screen_point[/code] as this node's new local transform." @@ -15814,11 +15923,14 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" -"å°† [CanvasItem] 排队ç‰å¾…更新。在空闲时间将调用 [constant NOTIFICATION_DRAW] " -"以请求é‡ç»˜ã€‚" +"将该 [CanvasItem] åŠ å…¥é‡ç»˜é˜Ÿåˆ—。空闲时,如果 [CanvasItem] å¯è§ï¼Œåˆ™ä¼šå‘é€ " +"[constant NOTIFICATION_DRAW] 并调用 [method _draw]。å³ä¾¿å¤šæ¬¡è°ƒç”¨è¿™ä¸ªæ–¹æ³•,æ¯" +"帧也都åªä¼šå‘生[b]一次[/b]绘制。" #: doc/classes/CanvasItem.xml msgid "" @@ -15865,18 +15977,23 @@ msgid "" "visible is to call one of the multiple [code]popup*()[/code] functions " "instead." msgstr "" -"如果为 [code]true[/code],这个[CanvasItem]è¢«ç»˜åˆ¶ã€‚åªæœ‰å½“它的所有父节点也å¯è§" -"æ—¶ï¼Œè¯¥èŠ‚ç‚¹æ‰æ˜¯å¯è§çš„(æ¢å¥è¯è¯´ï¼Œ[method is_visible_in_tree]必须返回 " +"如果为 [code]true[/code],这个 [CanvasItem] è¢«ç»˜åˆ¶ã€‚åªæœ‰å½“它的所有父节点也å¯" +"è§æ—¶ï¼Œè¯¥èŠ‚ç‚¹æ‰æ˜¯å¯è§çš„(æ¢å¥è¯è¯´ï¼Œ[method is_visible_in_tree] 必须返回 " "[code]true[/code])。\n" -"[b]注æ„:[/b]对于继承了[Popup]的控件,使其å¯è§çš„æ£ç¡®æ–¹æ³•æ˜¯è°ƒç”¨å¤šä¸ª" -"[code]popup*()[/code]函数之一。" +"[b]注æ„:[/b]对于继承了 [Popup] 的控件,使其å¯è§çš„æ£ç¡®æ–¹æ³•æ˜¯è°ƒç”¨å¤šä¸ª " +"[code]popup*()[/code] 函数之一。" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" -"当 [CanvasItem] å¿…é¡»é‡ç»˜æ—¶å‘出。这åªèƒ½æ˜¯å®žæ—¶è¿žæŽ¥ï¼Œå› 为延迟将ä¸å…许绘制。" +"当该 [CanvasItem] å¿…é¡»é‡ç»˜æ—¶å‘出,å‘生在相关的 [constant NOTIFICATION_DRAW] " +"通知[i]之åŽ[/i],调用 [method _draw] [i]之å‰[/i]。\n" +"[b]注æ„:[/b]å»¶è¿Ÿè¿žæŽ¥æ— æ³•ä½¿ç”¨ [code]draw_*[/code] 方法进行绘制。" #: doc/classes/CanvasItem.xml msgid "Emitted when becoming hidden." @@ -15945,20 +16062,20 @@ msgstr "" "set_notify_local_transform] å¯ç”¨æ—¶ï¼Œæ‰ä¼šæ”¶åˆ°è¿™ä¸ªé€šçŸ¥ã€‚" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." -msgstr "è¦æ±‚绘制[CanvasItem]。" +msgid "The [CanvasItem] is requested to draw (see [method _draw])." +msgstr "è¦æ±‚绘制该 [CanvasItem]ï¼ˆè§ [method _draw])。" #: doc/classes/CanvasItem.xml msgid "The [CanvasItem]'s visibility has changed." -msgstr "[CanvasItem]çš„å¯è§æ€§å·²æ›´æ”¹ã€‚" +msgstr "该 [CanvasItem] çš„å¯è§æ€§å·²æ›´æ”¹ã€‚" #: doc/classes/CanvasItem.xml msgid "The [CanvasItem] has entered the canvas." -msgstr "[CanvasItem]已进入画布。" +msgstr "该 [CanvasItem] 已进入画布。" #: doc/classes/CanvasItem.xml msgid "The [CanvasItem] has exited the canvas." -msgstr "[CanvasItem]已退出画布。" +msgstr "该 [CanvasItem] 已退出画布。" #: doc/classes/CanvasItemMaterial.xml msgid "A material for [CanvasItem]s." @@ -16097,9 +16214,15 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." -msgstr "将图层设置为跟éšè§†åŒºï¼Œä»¥æ¨¡æ‹Ÿä¼ª 3D 效果。" +msgstr "" +"å¯ç”¨æ—¶ï¼Œè¯¥ [CanvasLayer] ä¼šä½¿ç”¨è§†åŒºçš„å˜æ¢ï¼Œæ‰€ä»¥å®ƒä¼šéšç›¸æœºç§»åŠ¨ï¼Œè€Œä¸æ˜¯ä¿æŒåœ¨å±" +"幕上的æŸä¸ªå›ºå®šä½ç½®ã€‚\n" +"与 [member follow_viewport_scale] é…åˆå¯ä»¥å®žçŽ°ä¼ª 3D 效果。" #: doc/classes/CanvasLayer.xml msgid "" @@ -16642,10 +16765,10 @@ msgid "" "[b]Note:[/b] In exported release builds the debug info is not available, so " "the returned dictionaries will contain only method names." msgstr "" -"如果[code]no_inheritance[/code]是[code]false[/code],返回一个包å«" -"[code]class[/code]或其父级所有方法的数组。数组的æ¯ä¸ªå…ƒç´ 都是一个" -"[Dictionary],其键值如:[code]args[/code], [code]default_args[/code], " -"[code]flags[/code], [code]id[/code], [code]name[/code], [code]return:" +"如果 [code]no_inheritance[/code] 为 [code]false[/code]ï¼Œè¿”å›žä¸€ä¸ªåŒ…å« " +"[code]class[/code] 或其父级所有方法的数组。数组的æ¯ä¸ªå…ƒç´ 都是一个 " +"[Dictionary],包å«çš„键有:[code]args[/code]ã€[code]default_args[/code]ã€" +"[code]flags[/code]ã€[code]id[/code]ã€[code]name[/code]ã€[code]return:" "(class_name, hint, hint_string, name, type, usage)[/code]。\n" "[b]注æ„:[/b]在导出的å‘布版本ä¸ï¼Œè°ƒè¯•ä¿¡æ¯ä¸å¯ç”¨ï¼Œæ‰€ä»¥è¿”回的å—典将åªåŒ…嫿–¹æ³•å" "称。" @@ -16729,25 +16852,25 @@ msgstr "返回所有å¯ç”¨ç±»çš„å称。" msgid "" "Returns the names of all the classes that directly or indirectly inherit " "from [code]class[/code]." -msgstr "返回直接或间接继承自[code]class[/code]的所有类的å称。" +msgstr "返回所有直接或间接继承自 [code]class[/code] 的类的å称。" #: doc/classes/ClassDB.xml msgid "Returns the parent class of [code]class[/code]." -msgstr "返回 [code]class[/code]的父类。" +msgstr "返回 [code]class[/code] 的父类。" #: doc/classes/ClassDB.xml msgid "Creates an instance of [code]class[/code]." -msgstr "创建[code]class[/code]的实例。" +msgstr "创建 [code]class[/code] 的实例。" #: doc/classes/ClassDB.xml msgid "Returns whether this [code]class[/code] is enabled or not." -msgstr "返回是å¦å¯ç”¨æ¤[code]class[/code]。" +msgstr "返回这个 [code]class[/code] 是å¦å·²å¯ç”¨ã€‚" #: doc/classes/ClassDB.xml msgid "" "Returns whether [code]inherits[/code] is an ancestor of [code]class[/code] " "or not." -msgstr "返回 [code]inherits[/code]æ˜¯å¦æ˜¯[code]class[/code]的祖先。" +msgstr "返回 [code]inherits[/code] 是å¦ä¸º [code]class[/code] 的祖先。" #: doc/classes/ClippedCamera.xml msgid "A [Camera] that includes collision." @@ -16787,7 +16910,7 @@ msgid "" "[b]Note:[/b] Bit indices range from 0-19." msgstr "" "如果指定的ä½ç´¢å¼•打开,则返回 [code]true[/code]。\n" -"[b]注æ„:[/b]ä½ç´¢å¼•的范围是0-19。" +"[b]注æ„:[/b]ä½ç´¢å¼•的范围是 0-19。" #: doc/classes/ClippedCamera.xml msgid "Removes a collision exception with the specified node." @@ -16802,8 +16925,8 @@ msgid "" "Sets the specified bit index to the [code]value[/code].\n" "[b]Note:[/b] Bit indices range from 0-19." msgstr "" -"将指定的ä½ç´¢å¼•设置为[code]value[/code]。\n" -"[b]注æ„:[/b]ä½ç´¢å¼•的范围是0-19。" +"将指定的ä½ç´¢å¼•设置为 [code]value[/code]。\n" +"[b]注æ„:[/b]ä½ç´¢å¼•的范围是 0-19。" #: doc/classes/ClippedCamera.xml msgid "If [code]true[/code], the camera stops on contact with [Area]s." @@ -16832,7 +16955,7 @@ msgstr "相机的碰撞è·ç¦»ã€‚相机与碰撞物体的è·ç¦»ä¸èƒ½è¶…过这个 #: doc/classes/ClippedCamera.xml msgid "The camera's process callback. See [enum ProcessMode]." -msgstr "相机的过程回调。请å‚阅 [enum ProcessMode]。" +msgstr "相机的处ç†å›žè°ƒã€‚è§ [enum ProcessMode]。" #: doc/classes/CollisionObject.xml msgid "Base node for collision objects." @@ -16876,14 +16999,14 @@ msgid "" "Returns whether or not the specified [code]bit[/code] of the [member " "collision_layer] is set." msgstr "" -"返回是å¦è®¾ç½®äº†ç¢°æ’žå±‚ [member collision_layer] 的指定ä½[code]bit[/code]。" +"返回是å¦è®¾ç½®äº†ç¢°æ’žå±‚ [member collision_layer] çš„æŒ‡å®šä½ [code]bit[/code]。" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "Returns whether or not the specified [code]bit[/code] of the [member " "collision_mask] is set." msgstr "" -"返回是å¦è®¾ç½®äº†ç¢°æ’žæŽ©ç [member collision_mask] 的指定ä½[code]bit[/code]。" +"返回是å¦è®¾ç½®äº†ç¢°æ’žæŽ©ç [member collision_mask] çš„æŒ‡å®šä½ [code]bit[/code]。" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml #: doc/classes/Navigation2D.xml @@ -16895,8 +17018,8 @@ msgid "" "Returns an [Array] of [code]owner_id[/code] identifiers. You can use these " "ids in other methods that take [code]owner_id[/code] as an argument." msgstr "" -"返回一个[code]owner_id[/code]æ ‡è¯†ç¬¦çš„[Array]ã€‚ä½ å¯ä»¥åœ¨å…¶ä»–使用" -"[code]owner_id[/code]ä½œä¸ºå‚æ•°çš„æ–¹æ³•ä¸ä½¿ç”¨è¿™äº›id。" +"返回一个 [code]owner_id[/code] æ ‡è¯†ç¬¦çš„ [Array]ã€‚ä½ å¯ä»¥åœ¨å…¶ä»–使用 " +"[code]owner_id[/code] ä½œä¸ºå‚æ•°çš„æ–¹æ³•ä¸ä½¿ç”¨è¿™äº› ID。" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "If [code]true[/code], the shape owner and its shapes are disabled." @@ -16907,32 +17030,34 @@ msgid "Removes the given shape owner." msgstr "移除给定形状的所有者。" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml +#, fuzzy msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" -"如果[code]value[/code]为 [code]true[/code],则设置[member collision_layer]ä¸" -"指定的[code]bit[/code]ä½ã€‚\n" -"如果[code]value[/code]为 [code]false[/code],清除[member collision_layer]䏿Œ‡" -"定的 [code]bit[/code]ä½ã€‚" +"如果 [code]value[/code] 为 [code]true[/code],则设置 [member " +"collision_layer] 䏿Œ‡å®šçš„ [code]bit[/code] ä½ã€‚\n" +"如果 [code]value[/code] 为 [code]false[/code],清除 [member collision_layer] " +"䏿Œ‡å®šçš„ [code]bit[/code] ä½ã€‚" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml +#, fuzzy msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" -"如果[code]value[/code]为 [code]true[/code],则设置[member collision_mask]䏿Œ‡" -"定的[code]bit[/code]ä½ã€‚\n" -"如果[code]value[/code]为 [code]false[/code],清除[member collision_mask]䏿Œ‡" -"定的 [code]bit[/code]ä½ã€‚" +"如果 [code]value[/code] 为 [code]true[/code],则设置 [member collision_mask] " +"䏿Œ‡å®šçš„ [code]bit[/code] ä½ã€‚\n" +"如果 [code]value[/code] 为 [code]false[/code],清除 [member collision_mask] " +"䏿Œ‡å®šçš„ [code]bit[/code] ä½ã€‚" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "Returns the [code]owner_id[/code] of the given shape." -msgstr "返回指定形状的[code]owner_id[/code]。" +msgstr "返回指定形状的 [code]owner_id[/code]。" #: doc/classes/CollisionObject.xml msgid "Adds a [Shape] to the shape owner." @@ -17302,13 +17427,15 @@ msgid "Node that represents collision shape data in 3D space." msgstr "表示 3D 空间ä¸çš„碰撞形状数æ®çš„节点。" #: doc/classes/CollisionShape.xml +#, fuzzy msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" "用于在 3D 空间ä¸åˆ›å»ºå’Œç¼–辑碰撞形状的编辑工具。您å¯ä»¥ä½¿ç”¨æ¤èŠ‚ç‚¹è¡¨ç¤ºå„ç§ç¢°æ’žå½¢" "çŠ¶ï¼Œä¾‹å¦‚ï¼Œå°†å…¶æ·»åŠ åˆ° [Area] ä»¥ä½¿å…¶å…·æœ‰æ£€æµ‹å½¢çŠ¶ï¼Œæˆ–å°†å…¶æ·»åŠ åˆ°ç‰©ç†ä½“ " @@ -17348,13 +17475,15 @@ msgid "Node that represents collision shape data in 2D space." msgstr "表示2D空间ä¸çš„碰撞形状数æ®çš„节点。" #: doc/classes/CollisionShape2D.xml +#, fuzzy msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" "编辑器功能,用于在2D空间ä¸åˆ›å»ºå’Œç¼–辑碰撞形状。您å¯ä»¥ä½¿ç”¨æ¤èŠ‚ç‚¹è¡¨ç¤ºå„ç§ç¢°æ’žå½¢" "çŠ¶ï¼Œä¾‹å¦‚ï¼Œå°†å…¶æ·»åŠ åˆ° [Area2D] 以æä¾›æ£€æµ‹å½¢çŠ¶ï¼Œæˆ–å°†å…¶æ·»åŠ åˆ° [PhysicsBody2D] 以" @@ -17546,10 +17675,10 @@ msgid "" "var darkgreen = green.darkened(0.2) # 20% darker than regular green\n" "[/codeblock]" msgstr "" -"返回一个新的颜色,这个颜色按指定的百分比(比例从0 到 1ï¼‰å˜æš—。\n" +"返回一个新的颜色,这个颜色按指定的百分比(比例从 0 到 1ï¼‰å˜æš—。\n" "[codeblock]\n" "var green = Color(0.0, 1.0, 0.0)\n" -"var darkgreen = green.darkened(0.2) # 20% darker than regular green\n" +"var darkgreen = green.darkened(0.2) # 比普通的绿色深 20%\n" "[/codeblock]" #: doc/classes/Color.xml @@ -18688,13 +18817,16 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" -"凹多边形形状资æºï¼Œå¯è®¾ç½®ä¸º[PhysicsBody]或区域。这个形状是通过æä¾›ä¸€ä¸ªä¸‰è§’形列" -"表æ¥åˆ›å»ºçš„。\n" -"[b]注æ„:[/b]用于碰撞时,[ConcavePolygonShape] æ—¨åœ¨ä¸Žé™æ€ [PhysicsBody] 节点" -"一起使用,如 [StaticBody],并且ä¸é€‚用于具有éžé™æ€æ¨¡å¼çš„ [KinematicBody] 或 " -"[RigidBody]。" #: doc/classes/ConcavePolygonShape.xml msgid "Returns the faces (an array of triangles)." @@ -18709,6 +18841,7 @@ msgid "Concave polygon 2D shape resource for physics." msgstr "凹é¢å¤šè¾¹å½¢2D形状资æºç”¨äºŽç‰©ç†ã€‚" #: doc/classes/ConcavePolygonShape2D.xml +#, fuzzy msgid "" "Concave polygon 2D shape resource for physics. It is made out of segments " "and is optimal for complex polygonal concave collisions. However, it is not " @@ -18719,7 +18852,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" "凹é¢å¤šè¾¹å½¢2D形状资æºç”¨äºŽç‰©ç†ã€‚它是由线段组æˆçš„ï¼Œæ˜¯å¤æ‚的多边形凹é¢ç¢°æ’žçš„æœ€ä½³" "选择。但是,建议ä¸è¦å°†å…¶ç”¨äºŽ[RigidBody2D]节点。建议使用凸分解模å¼ï¼ˆå®žä½“)或多" @@ -19799,8 +19936,13 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." -msgstr "从å¦ä¸€ä¸ªæŽ§ä»¶ä¸çªƒå–焦点,并æˆä¸ºç„¦ç‚¹æŽ§ä»¶ï¼ˆè¯·å‚阅[member focus_mode])。" +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." +msgstr "" +"从别的控件上窃å–焦点,æˆä¸ºèšç„¦çš„æŽ§ä»¶ï¼ˆè§ [member focus_mode])。\n" +"[b]注æ„:[/b]这个方法与 [method Object.call_deferred] é…åˆä½¿ç”¨æ›´åŠ å¯é ,尤其" +"是在 [method Node._ready] ä¸ä½¿ç”¨æ—¶ã€‚" #: doc/classes/Control.xml msgid "" @@ -19955,9 +20097,9 @@ msgid "" "changed. Setting [member rect_min_size] directly calls this method " "automatically." msgstr "" -"使æ¤èŠ‚ç‚¹å’Œçˆ¶èŠ‚ç‚¹ï¼ˆç›´è‡³æœ€é«˜çº§åˆ«ï¼‰ä¸çš„大å°ç¼“å˜æ— 效。打算在更改返回值时与" -"[method get_minimum_size]一起使用。设置[member rect_min_size]直接直接自动调用" -"æ¤æ–¹æ³•。" +"使这个节点åŠå…¶ç›´è‡³æœ€é¡¶å±‚çš„å„级父节点ä¸çš„大å°ç¼“å˜å¤±æ•ˆã€‚应在 [method " +"get_minimum_size] 的返回值å‘生å˜åŒ–æ—¶é…åˆä½¿ç”¨ã€‚直接设置 [member " +"rect_min_size] 会自动调用这个方法。" #: doc/classes/Control.xml msgid "" @@ -20300,10 +20442,10 @@ msgid "" "must be a [Control]. If this property is not set, Godot will give focus to " "the closest [Control] to the bottom of this one." msgstr "" -"告诉Godot,默认情况下,如果用户按下键盘上的å‘下ç®å¤´æˆ–æ¸¸æˆæ‰‹æŸ„上的å‘下ç®å¤´ï¼Œåˆ™" -"应将焦点对准哪个节点。您å¯ä»¥é€šè¿‡ç¼–辑[code]ui_down[/code]输入æ“ä½œæ¥æ›´æ”¹é”®ã€‚该" -"节点必须是[Control]。如果未设置æ¤å±žæ€§ï¼Œåˆ™Godot会将焦点放在该控件底部最接近的" -"[Control]。" +"告诉 Godot,默认情况下,如果用户按下键盘上的å‘下ç®å¤´æˆ–æ¸¸æˆæ‰‹æŸ„上的å‘下ç®å¤´ï¼Œ" +"则应将焦点对准哪个节点。您å¯ä»¥é€šè¿‡ç¼–辑 [code]ui_down[/code] 输入æ“ä½œæ¥æ›´æ”¹" +"键。该节点必须是 [Control]。如果未设置æ¤å±žæ€§ï¼Œåˆ™ Godot 会将焦点放在该控件底部" +"最接近的 [Control]。" #: doc/classes/Control.xml msgid "" @@ -20313,10 +20455,10 @@ msgid "" "must be a [Control]. If this property is not set, Godot will give focus to " "the closest [Control] to the left of this one." msgstr "" -"告诉Godot,默认情况下,如果用户按下键盘上的å‘å·¦ç®å¤´æˆ–æ¸¸æˆæ‰‹æŸ„上的å‘左键,应该" -"将焦点对准键盘上的哪个节点。您å¯ä»¥é€šè¿‡ç¼–辑[code]ui_left[/code]输入æ“ä½œæ¥æ›´æ”¹" -"键。该节点必须是[Control]。如果未设置æ¤å±žæ€§ï¼Œåˆ™Godot会将焦点放在该控件左侧最" -"接近的[Control]。" +"告诉 Godot,默认情况下,如果用户按下键盘上的å‘å·¦ç®å¤´æˆ–æ¸¸æˆæ‰‹æŸ„上的å‘左键,应" +"该将焦点对准键盘上的哪个节点。您å¯ä»¥é€šè¿‡ç¼–辑 [code]ui_left[/code] 输入æ“作æ¥" +"更改键。该节点必须是 [Control]。如果未设置æ¤å±žæ€§ï¼Œåˆ™ Godot 会将焦点放在该控件" +"左侧最接近的 [Control]。" #: doc/classes/Control.xml msgid "" @@ -20326,10 +20468,10 @@ msgid "" "must be a [Control]. If this property is not set, Godot will give focus to " "the closest [Control] to the bottom of this one." msgstr "" -"告诉Godot,如果用户按键盘上的å³é”®æˆ–é»˜è®¤çš„æ¸¸æˆæ‰‹æŸ„上的å³é”®ï¼Œå®ƒåº”该把键盘焦点给" -"å“ªä¸ªèŠ‚ç‚¹ã€‚ä½ å¯ä»¥é€šè¿‡ç¼–辑[code]ui_right[/code]è¾“å…¥åŠ¨ä½œæ¥æ”¹å˜è¿™ä¸ªé”®ã€‚该节点必须" -"是一个[Control]。如果没有设置这个属性,Godot将把焦点交给离这个节点底部最近的" -"[Control]。" +"告诉 Godot,如果用户按键盘上的å³é”®æˆ–é»˜è®¤çš„æ¸¸æˆæ‰‹æŸ„上的å³é”®ï¼Œå®ƒåº”该把键盘焦点" +"ç»™å“ªä¸ªèŠ‚ç‚¹ã€‚ä½ å¯ä»¥é€šè¿‡ç¼–辑 [code]ui_right[/code] è¾“å…¥åŠ¨ä½œæ¥æ”¹å˜è¿™ä¸ªé”®ã€‚该节点" +"必须是一个 [Control]。如果没有设置这个属性,Godot 将把焦点交给离这个节点底部" +"最近的 [Control]。" #: doc/classes/Control.xml msgid "" @@ -20339,10 +20481,10 @@ msgid "" "[Control]. If this property is not set, Godot will give focus to the closest " "[Control] to the bottom of this one." msgstr "" -"告诉Godot默认情况下,如果用户按下键盘上的顶部ç®å¤´æˆ–æ¸¸æˆæ‰‹æŸ„上的顶部,则应该将" -"焦点对准键盘上的哪个节点。您å¯ä»¥é€šè¿‡ç¼–辑[code]ui_top[/code]输入æ“ä½œæ¥æ›´æ”¹é”®ã€‚" -"该节点必须是[Control]。如果未设置æ¤å±žæ€§ï¼Œåˆ™Godot会将焦点放在该控件底部最接近" -"çš„[Control]。" +"告诉 Godot 默认情况下,如果用户按下键盘上的顶部ç®å¤´æˆ–æ¸¸æˆæ‰‹æŸ„上的顶部,则应该" +"将焦点对准键盘上的哪个节点。您å¯ä»¥é€šè¿‡ç¼–辑 [code]ui_top[/code] 输入æ“ä½œæ¥æ›´æ”¹" +"键。该节点必须是 [Control]。如果未设置æ¤å±žæ€§ï¼Œåˆ™ Godot 会将焦点放在该控件底部" +"最接近的 [Control]。" #: doc/classes/Control.xml msgid "" @@ -20352,9 +20494,9 @@ msgid "" "If this property is not set, Godot will select a \"best guess\" based on " "surrounding nodes in the scene tree." msgstr "" -"告诉Godot,如果用户默认按键盘上的Tabé”®ï¼Œå®ƒåº”è¯¥æŠŠé”®ç›˜ç„¦ç‚¹ç»™å“ªä¸ªèŠ‚ç‚¹ã€‚ä½ å¯ä»¥é€š" -"过编辑[code]ui_focus_next[/code]è¾“å…¥åŠ¨ä½œæ¥æ”¹å˜è¿™ä¸ªé”®ã€‚\n" -"如果这个属性没有设置,Godotä¼šæ ¹æ®åœºæ™¯æ ‘ä¸çš„周围节点选择一个 \"最佳猜测\"。" +"告诉 Godot,如果用户默认按键盘上的 Tab é”®ï¼Œå®ƒåº”è¯¥æŠŠé”®ç›˜ç„¦ç‚¹ç»™å“ªä¸ªèŠ‚ç‚¹ã€‚ä½ å¯ä»¥" +"通过编辑 [code]ui_focus_next[/code] è¾“å…¥åŠ¨ä½œæ¥æ”¹å˜è¿™ä¸ªé”®ã€‚\n" +"如果这个属性没有设置,Godot ä¼šæ ¹æ®åœºæ™¯æ ‘ä¸çš„周围节点选择一个“最佳猜测â€ã€‚" #: doc/classes/Control.xml msgid "" @@ -20364,9 +20506,9 @@ msgid "" "If this property is not set, Godot will select a \"best guess\" based on " "surrounding nodes in the scene tree." msgstr "" -"告诉Godot,如果用户按键盘上的Shift+Tab键,它应该把键盘焦点给哪个节点,这是默" -"è®¤ã€‚ä½ å¯ä»¥é€šè¿‡ç¼–辑[code]ui_focus_prev[/code]è¾“å…¥åŠ¨ä½œæ¥æ”¹å˜è¿™ä¸ªé”®ã€‚\n" -"如果没有设置这个属性,Godotä¼šæ ¹æ®åœºæ™¯æ ‘ä¸çš„周围节点选择一个 \"最佳猜测\"。" +"告诉 Godot,如果用户按键盘上的 Shift+Tab 键,它应该把键盘焦点给哪个节点,这是" +"é»˜è®¤ã€‚ä½ å¯ä»¥é€šè¿‡ç¼–辑 [code]ui_focus_prev[/code] è¾“å…¥åŠ¨ä½œæ¥æ”¹å˜è¿™ä¸ªé”®ã€‚\n" +"如果没有设置这个属性,Godot ä¼šæ ¹æ®åœºæ™¯æ ‘ä¸çš„周围节点选择一个“最佳猜测â€ã€‚" #: doc/classes/Control.xml msgid "" @@ -20409,18 +20551,19 @@ msgid "" "[/codeblock]" msgstr "" "改å˜å·¥å…·æç¤ºçš„æ–‡æœ¬ã€‚å½“ç”¨æˆ·çš„é¼ æ ‡å…‰æ ‡åœ¨è¿™ä¸ªæŽ§ä»¶ä¸Šåœç•™ç‰‡åˆ»ï¼Œå·¥å…·æç¤ºå°±ä¼šå‡ºçŽ°ï¼Œ" -"å‰ææ˜¯[member mouse_filter]属性éž[constant MOUSE_FILTER_IGNORE]ã€‚ä½ å¯ä»¥ç”¨é¡¹ç›®" -"设置ä¸çš„[code]gui/timers/tooltip_delay_sec[/code]选项改å˜å·¥å…·æç¤ºå‡ºçŽ°çš„æ—¶" -"间。\n" -"工具æç¤ºçš„å¼¹å‡ºå°†ä½¿ç”¨é»˜è®¤çš„å®žçŽ°ï¼Œæˆ–è€…ä½ å¯ä»¥é€šè¿‡è¦†ç›–[method " -"_make_custom_tooltip]æä¾›ä¸€ä¸ªè‡ªå®šä¹‰çš„实现。默认的工具æç¤ºåŒ…括一个[PopupPanel]" -"å’Œ[Label],其主题属性å¯ä»¥é€šè¿‡[code]\"TooltipPanel\"[/code]å’Œ" -"[code]\"TooltipLabel\"[/code]方法分别进行自定义。如:\n" +"å‰ææ˜¯ [member mouse_filter] å±žæ€§éž [constant MOUSE_FILTER_IGNORE]ã€‚ä½ å¯ä»¥ç”¨" +"项目设置ä¸çš„ [code]gui/timers/tooltip_delay_sec[/code] 选项改å˜å·¥å…·æç¤ºå‡ºçŽ°çš„" +"时间。\n" +"工具æç¤ºçš„å¼¹å‡ºå°†ä½¿ç”¨é»˜è®¤çš„å®žçŽ°ï¼Œæˆ–è€…ä½ å¯ä»¥é€šè¿‡è¦†ç›– [method " +"_make_custom_tooltip] æä¾›ä¸€ä¸ªè‡ªå®šä¹‰çš„实现。默认的工具æç¤ºåŒ…括一个 " +"[PopupPanel] å’Œ [Label],其主题属性å¯ä»¥é€šè¿‡ [Theme] 的方法对 " +"[code]\"TooltipPanel\"[/code] å’Œ [code]\"TooltipLabel\"[/code] 分别进行自定" +"义。如:\n" "[codeblock]\n" "var style_box = StyleBoxFlat.new()\n" "style_box.set_bg_color(Color(1, 1, 0))\n" "style_box.set_border_width_all(2)\n" -"# 我们在这里å‡è®¾`theme`属性已ç»è¢«äº‹å…ˆåˆ†é…了一个自定义的Theme。\n" +"# 我们在这里å‡è®¾`theme`属性已ç»è¢«äº‹å…ˆåˆ†é…了一个自定义的 Theme。\n" "theme.set_stylebox(\"panel\", \"TooltipPanel\", style_box)\n" "theme.set_color(\"font_color\", \"TooltipLabel\", Color(0, 1, 1))\n" "[/codeblock]" @@ -20432,9 +20575,9 @@ msgid "" "handling. The viewport first hides the modal and after marks the input as " "handled." msgstr "" -"å¯ç”¨å½“ä½ å…³é—æŽ§ä»¶æ¨¡æ€æ—¶ï¼Œè¾“入是å¦ä¼ æ’。\n" -"如果为 [code]false[/code]ï¼Œåœ¨è§†åŒºè¾“å…¥äº‹ä»¶å¤„ç†æ—¶å°†åœæ¢äº‹ä»¶å¤„ç†ã€‚视区首先éšè—模" -"æ€ï¼Œä¹‹åŽå°†è¾“å…¥æ ‡è®°ä¸ºå·²å¤„ç†ã€‚" +"关闿¨¡æ€æŽ§ä»¶æ—¶ï¼Œè¾“入是å¦ä¼ æ’。\n" +"如果为 [code]false[/code],事件处ç†å°†åœæ¢åœ¨è§†åŒºçš„输入事件处ç†ã€‚该视区会先将模" +"æ€æŽ§ä»¶éšè—,然åŽå†å°†è¾“å…¥æ ‡è®°ä¸ºå·²å¤„ç†ã€‚" #: doc/classes/Control.xml msgid "" @@ -21324,7 +21467,7 @@ msgstr "返回由 [enum Parameter] æŒ‡å®šçš„å‚æ•°çš„éšæœºæ€§ç³»æ•°ã€‚" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "" "Returns the enabled state of the given flag (see [enum Flags] for options)." -msgstr "è¿”å›žç»™å®šæ ‡å¿—çš„å¯ç”¨çжæ€ï¼ˆæœ‰å…³é€‰é¡¹ï¼Œè¯·å‚阅 [enum Flags])。" +msgstr "è¿”å›žç»™å®šæ ‡å¿—çš„å¯ç”¨çжæ€ï¼ˆå¯é€‰é¡¹è§ [enum Flags])。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "Restarts the particle emitter." @@ -21345,7 +21488,7 @@ msgstr "设置 [enum Parameter] æŒ‡å®šçš„å‚æ•°çš„éšæœºæ€§å› å。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "Enables or disables the given flag (see [enum Flags] for options)." -msgstr "å¯ç”¨æˆ–ç¦ç”¨ç»™å®šæ ‡å¿—(有关选项,请å‚阅 [enum Flags])。" +msgstr "å¯ç”¨æˆ–ç¦ç”¨ç»™å®šæ ‡å¿—(å¯é€‰é¡¹è§ [enum Flags])。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/Particles.xml doc/classes/Particles2D.xml @@ -21463,7 +21606,7 @@ msgstr "指定粒åå‘å°„æ–¹å‘çš„å•ä½å‘é‡ã€‚" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/Particles.xml doc/classes/Particles2D.xml msgid "Particle draw order. Uses [enum DrawOrder] values." -msgstr "ç²’å绘制顺åºã€‚使用 [enum DrawOrder] 值。" +msgstr "ç²’å绘制顺åºã€‚使用 [enum DrawOrder] 的值。" #: doc/classes/CPUParticles.xml msgid "" @@ -21611,7 +21754,7 @@ msgstr "色相å˜åŒ–éšæœºçŽ‡ã€‚" msgid "" "Initial velocity magnitude for each particle. Direction comes from [member " "spread] and the node's orientation." -msgstr "æ¯ä¸ªç²’åçš„åˆå§‹é€Ÿåº¦å¤§å°ã€‚æ–¹å‘æ¥è‡ª[member spread]和节点的方å‘。" +msgstr "æ¯ä¸ªç²’åçš„åˆå§‹é€Ÿåº¦å¤§å°ã€‚æ–¹å‘å–决于 [member spread] 和该节点的æœå‘。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/ParticlesMaterial.xml @@ -21621,7 +21764,7 @@ msgstr "åˆå§‹é€Ÿåº¦éšæœºçŽ‡ã€‚" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/Particles.xml doc/classes/Particles2D.xml msgid "The amount of time each particle will exist (in seconds)." -msgstr "æ¯ä¸ªç²’åå˜åœ¨çš„æ—¶é—´ï¼Œä»¥ç§’为å•ä½ã€‚" +msgstr "æ¯ä¸ªç²’åå˜åœ¨çš„æ—¶é—´ï¼ˆä»¥ç§’为å•ä½ï¼‰ã€‚" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/ParticlesMaterial.xml @@ -21677,7 +21820,7 @@ msgid "" msgstr "" "应用于æ¯ä¸ªç²’å的轨é“速度。使粒å在局部XYå¹³é¢ä¸Šç»•原点旋转。用æ¯ç§’绕原点旋转的" "次数æ¥è¡¨ç¤ºã€‚\n" -"åªæœ‰å½“[member flag_disable_z]为 [code]true[/code] 时,æ¤å±žæ€§æ‰å¯ç”¨ã€‚" +"åªæœ‰å½“ [member flag_disable_z] 为 [code]true[/code] 时,æ¤å±žæ€§æ‰å¯ç”¨ã€‚" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "Each particle's orbital velocity will vary along this [Curve]." @@ -21998,8 +22141,8 @@ msgid "" "the value to 2 will make the particles render at 2 frames per second. Note " "this does not slow down the simulation of the particle system itself." msgstr "" -"ç²’å系统的帧速率固定为一个值。例如,将值更改为2将使粒å以æ¯ç§’2帧的速度渲染。" -"注æ„,这ä¸ä¼šå‡æ…¢ç²’å系统本身的仿真速度。" +"ç²’å系统的帧速率固定为一个值。例如,将值更改为 2 将使粒å以æ¯ç§’ 2 帧的速度渲" +"染。注æ„,这ä¸ä¼šå‡æ…¢ç²’å系统本身的仿真速度。" #: doc/classes/CPUParticles2D.xml doc/classes/Particles2D.xml msgid "" @@ -22146,8 +22289,8 @@ msgid "" "[b]Note:[/b] The maximum size of accepted ciphertext is limited by the key " "size." msgstr "" -"用æä¾›çš„ç§äºº[code]key[/code]解密给定的[code]ciphertext[/code]。\n" -"[b]注æ„:[/b]所接å—çš„å¯†ç æ–‡æœ¬çš„æœ€å¤§å°ºå¯¸å—到密钥大å°é™åˆ¶ã€‚" +"用æä¾›çš„ç§é’¥ [code]key[/code] 解密给定的密文 [code]ciphertext[/code]。\n" +"[b]注æ„:[/b]所接å—的密文的最大尺寸å—到密钥大å°çš„é™åˆ¶ã€‚" #: doc/classes/Crypto.xml msgid "" @@ -22156,8 +22299,8 @@ msgid "" "[b]Note:[/b] The maximum size of accepted plaintext is limited by the key " "size." msgstr "" -"用æä¾›çš„公钥 [code]key[/code] åŠ å¯†ç»™å®šçš„[code]plaintext[/code]。\n" -"[b]注æ„:[/b]接å—的明文的最大尺寸å—到密钥大å°çš„é™åˆ¶ã€‚" +"用æä¾›çš„公钥 [code]key[/code] åŠ å¯†ç»™å®šçš„æ˜Žæ–‡ [code]plaintext[/code]。\n" +"[b]注æ„:[/b]所接å—的明文的最大尺寸å—到密钥大å°çš„é™åˆ¶ã€‚" #: doc/classes/Crypto.xml msgid "" @@ -22217,9 +22360,9 @@ msgid "" "Currently, only [constant HashingContext.HASH_SHA256] and [constant " "HashingContext.HASH_SHA1] are supported." msgstr "" -"使用 [code]key[/code] ç”Ÿæˆ [code]msg[/code] çš„ [url=https://en.wikipedia.org/" -"wiki/HMAC]HMAC[/url] 摘è¦ã€‚[code]hash_type[/code] 傿•°æ˜¯ç”¨äºŽå†…部和外部哈希的" -"哈希算法。\n" +"使用密钥 [code]key[/code] ç”Ÿæˆ [code]msg[/code] çš„ [url=https://en.wikipedia." +"org/wiki/HMAC]HMAC[/url] 摘è¦ã€‚[code]hash_type[/code] 傿•°æ˜¯ç”¨äºŽå†…部和外部哈" +"希的哈希算法。\n" "ç›®å‰ä»…æ”¯æŒ [constant HashingContext.HASH_SHA256] å’Œ [constant HashingContext." "HASH_SHA1]。" @@ -22591,7 +22734,7 @@ msgid "" "coordinates will match geometry exactly with no tiling." msgstr "" "当 [member mode] 为 [constant MODE_PATH] 时,这是纹ç†åæ ‡æ²¿ç€è·¯å¾„çš„è·ç¦»ï¼Œä»¥ç±³" -"为å•ä½ï¼Œå°†è¿›è¡Œå¹³é“ºã€‚当设置为0时,纹ç†åæ ‡å°†ä¸Žå‡ ä½•å›¾å½¢å®Œå…¨åŒ¹é…,没有平铺。" +"为å•ä½ï¼Œå°†è¿›è¡Œå¹³é“ºã€‚当设置为 0 时,纹ç†åæ ‡å°†ä¸Žå‡ ä½•å›¾å½¢å®Œå…¨åŒ¹é…,没有平铺。" #: modules/csg/doc_classes/CSGPolygon.xml msgid "" @@ -22671,16 +22814,16 @@ msgid "" "will determine the distance, in meters, each interval of the path will " "extrude." msgstr "" -"当 [member mode] 被设置为路径[constant MODE_PATH] 时,[member path_interval] " -"将决定路径的æ¯ä¸ªé—´éš”将被挤出的è·ç¦»ï¼Œå•ä½ä¸ºç±³ã€‚" +"当 [member mode] 被设置为 [constant MODE_PATH] 时,[member path_interval] å°†" +"决定路径的æ¯ä¸ªé—´éš”将被挤出的è·ç¦»ï¼Œå•ä½ä¸ºç±³ã€‚" #: modules/csg/doc_classes/CSGPolygon.xml msgid "" "When [member mode] is set to [constant MODE_PATH], [member path_interval] " "will subdivide the polygons along the path." msgstr "" -"当 [member mode] 被设置为路径 [constant MODE_PATH]时,[member path_interval] " -"将沿ç€è·¯å¾„细分多边形。" +"当 [member mode] 被设置为 [constant MODE_PATH]时,[member path_interval] 将沿" +"ç€è·¯å¾„细分多边形。" #: modules/csg/doc_classes/CSGPrimitive.xml msgid "Base class for CSG primitives." @@ -22806,8 +22949,8 @@ msgid "" "CSG child node as the operation is between this node and the previous child " "of this nodes parent." msgstr "" -"在æ¤å½¢çŠ¶ä¸Šæ‰§è¡Œçš„æ“作。对于第一个CSGåèŠ‚ç‚¹ï¼Œå°†å¿½ç•¥æ¤æ“ä½œï¼Œå› ä¸ºæ“作是在æ¤èŠ‚ç‚¹ä¸Ž" -"该节点父级的上一个å级之间进行的。" +"在æ¤å½¢çŠ¶ä¸Šæ‰§è¡Œçš„æ“作。对于第一个 CSG åèŠ‚ç‚¹ï¼Œå°†å¿½ç•¥æ¤æ“ä½œï¼Œå› ä¸ºæ“作是在æ¤èŠ‚ç‚¹" +"与该节点父级的上一个å级之间进行的。" #: modules/csg/doc_classes/CSGShape.xml msgid "" @@ -22824,8 +22967,8 @@ msgid "" "always act like a static body. Note that the collision shape is still active " "even if the CSG shape itself is hidden." msgstr "" -"为我们的 CSG 形状å‘物ç†å¼•æ“Žæ·»åŠ ç¢°æ’žå½¢çŠ¶ã€‚è¿™å°†å§‹ç»ˆåƒä¸€ä¸ªé™æ€ç‰©ä½“。请注æ„,å³ä½¿" -"CSG形状本身被éšè—,碰撞形状ä»å¤„于活动状æ€ã€‚" +"为我们的 CSG 形状å‘物ç†å¼•æ“Žæ·»åŠ ç¢°æ’žå½¢çŠ¶ã€‚è¿™å°†å§‹ç»ˆåƒä¸€ä¸ªé™æ€ç‰©ä½“。请注æ„,å³" +"使 CSG 形状本身被éšè—,碰撞形状ä»å¤„于活动状æ€ã€‚" #: modules/csg/doc_classes/CSGShape.xml msgid "" @@ -22930,8 +23073,8 @@ msgid "" "effect making the torus seem rounded. If [code]false[/code] the torus will " "have a flat shaded look." msgstr "" -"如果[code]true[/code]设置圆环的法线以æä¾›å¹³æ»‘æ•ˆæžœï¼Œåˆ™ä½¿åœ†çŽ¯çœ‹èµ·æ¥æ˜¯åœ†å½¢çš„。如" -"果为 [code]false[/code],则圆环将具有平å¦çš„阴影表现。" +"如果 [code]true[/code] 设置圆环的法线以æä¾›å¹³æ»‘æ•ˆæžœï¼Œåˆ™ä½¿åœ†çŽ¯çœ‹èµ·æ¥æ˜¯åœ†å½¢çš„。" +"如果为 [code]false[/code],则圆环将具有平å¦çš„阴影表现。" #: modules/mono/doc_classes/CSharpScript.xml msgid "" @@ -23243,10 +23386,13 @@ msgstr "æ•°å¦æ›²çº¿ã€‚" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" "å¯ä»¥ä¿å˜å¹¶é‡æ–°ç”¨äºŽå…¶ä»–对象的曲线。默认情况下,它在 Y 轴上的范围在 [code]0[/" -"code] 到 [code]1[/code] 之间,并且ä½ç½®ç‚¹ç›¸å¯¹äºŽ [code]0.5[/code] Y ä½ç½®ã€‚" +"code] 到 [code]1[/code] 之间,并且ä½ç½®ç‚¹ç›¸å¯¹äºŽ [code]0.5[/code] Y ä½ç½®ã€‚\n" +"å¦è¯·å‚阅为颜色æ’值设计的 [Gradient]。å¦è¯·å‚阅 [Curve2D] å’Œ [Curve3D]。" #: doc/classes/Curve.xml msgid "" @@ -23407,24 +23553,24 @@ msgstr "" "åŠ¨é‡‡æ ·ç”¨äºŽå…¶ä»–ç›®çš„ã€‚\n" "它ä¿ç•™äº†æ²¿æ›²çº¿çš„预计算点的缓å˜ï¼Œä»¥åŠ å¿«è¿›ä¸€æ¥çš„计算。" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" -"在曲线的 [code]position[/code] ä¸Šæ·»åŠ ä¸€ä¸ªç‚¹ï¼Œç›¸å¯¹äºŽè¯¥ [Curve2D] çš„ä½ç½®ï¼Œä»¥åŠ" -"控制点 [code]in[/code] å’Œ [code]out[/code]。\n" -"如果给定了 [code]at_position[/code],这个点会被æ’å…¥åˆ°ç‚¹å· [code]at_position[/" -"code] 之å‰ï¼Œå¹¶å°†è¿™ä¸ªç‚¹ï¼ˆä»¥åŠä¹‹åŽçš„æ¯ä¸€ä¸ªç‚¹ï¼‰ç§»åˆ°è¢«æ’入点之åŽã€‚如果 " -"[code]at_position[/code] æ²¡æœ‰ç»™å®šï¼Œæˆ–è€…æ˜¯éžæ³•值([code]at_position <0[/code] " -"或 [code]at_position >= [method get_point_count][/code]ï¼‰ï¼Œè¯¥ç‚¹å°†è¢«è¿½åŠ åœ¨ç‚¹åˆ—" -"表的最åŽã€‚" +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." +msgstr "" +"在指定的ä½ç½® [code]position[/code] ä¸Šæ·»åŠ ä¸€ä¸ªç‚¹ï¼Œç›¸å¯¹äºŽè¯¥æ›²çº¿è‡ªèº«çš„ä½ç½®ï¼ŒæŽ§åˆ¶" +"点为 [code]in[/code] å’Œ [code]out[/code]ã€‚æ–°çš„ç‚¹ä¼šè¢«åŠ å…¥åˆ°ç‚¹çš„åˆ—è¡¨æœ«å°¾ã€‚\n" +"如果给定了索引 [code]index[/code],这个新点会被æ’入到 [code]index[/code] 所对" +"应的现å˜ç‚¹ä¹‹å‰ã€‚从 [code]index[/code] å¾€åŽçš„æ‰€æœ‰çްå˜ç‚¹éƒ½ä¼šåœ¨åˆ—表ä¸å¾€åŽç§»ä¸€" +"ä½ã€‚该索引必须大于ç‰äºŽ [code]0[/code],ä¸èƒ½å¤Ÿè¶…出线段上现å˜ç‚¹çš„æ•°é‡ã€‚è§ " +"[method get_point_count]。" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" @@ -23476,8 +23622,8 @@ msgid "" "console, and returns [code](0, 0)[/code]." msgstr "" "返回从顶点 [code]idx[/code] 引出的控制点ä½ç½®ã€‚返回的ä½ç½®æ˜¯ç›¸å¯¹äºŽé¡¶ç‚¹ " -"[code]idx[/code]ã€‚å¦‚æžœç´¢å¼•è¶Šç•Œï¼Œå‡½æ•°ä¼šå‘æŽ§åˆ¶å°å‘é€é”™è¯¯ï¼Œå¹¶è¿”回 [code](0, " -"0)[/code]。" +"[code]idx[/code]ã€‚å¦‚æžœç´¢å¼•è¶Šç•Œï¼Œå‡½æ•°ä¼šå‘æŽ§åˆ¶å°å‘é€é”™è¯¯ï¼Œå¹¶è¿”回 [code](0, 0)[/" +"code]。" #: doc/classes/Curve2D.xml msgid "" @@ -23621,25 +23767,6 @@ msgstr "" "它沿曲线ä¿ç•™äº†ä¸€ä¸ªé¢„先计算好的点缓å˜ï¼Œä»¥åŠ å¿«è¿›ä¸€æ¥çš„计算。" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" -"在曲线的 [code]position[/code] ä¸Šæ·»åŠ ä¸€ä¸ªç‚¹ï¼Œç›¸å¯¹äºŽè¯¥ [Curve2D] çš„ä½ç½®ï¼Œä»¥åŠ" -"控制点 [code]in[/code] å’Œ [code]out[/code]。\n" -"如果给定了 [code]at_position[/code],这个点会被æ’å…¥åˆ°ç‚¹å· [code]at_position[/" -"code] 之å‰ï¼Œå¹¶å°†è¿™ä¸ªç‚¹ï¼ˆä»¥åŠä¹‹åŽçš„æ¯ä¸€ä¸ªç‚¹ï¼‰ç§»åˆ°è¢«æ’入点之åŽã€‚如果 " -"[code]at_position[/code] æ²¡æœ‰ç»™å®šï¼Œæˆ–è€…æ˜¯éžæ³•值([code]at_position <0[/code] " -"或 [code]at_position >= [method get_point_count][/code]ï¼‰ï¼Œè¯¥ç‚¹å°†è¢«è¿½åŠ åœ¨ç‚¹åˆ—" -"表的最åŽã€‚" - -#: doc/classes/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "以 [PoolVector3Array] 的形å¼è¿”回缓å˜çš„点。" @@ -24599,7 +24726,7 @@ msgid "" "Returns one of the [enum Error] code constants ([code]OK[/code] on success)." msgstr "" "åˆ›å»ºä¸€ä¸ªç›®å½•ã€‚å‚æ•°å¯ä»¥æ˜¯å½“å‰ç›®å½•的相对路径,也å¯ä»¥æ˜¯ç»å¯¹è·¯å¾„ã€‚ç›®æ ‡ç›®å½•åº”è¯¥æ”¾" -"置在一个已ç»å˜åœ¨çš„目录ä¸ï¼ˆå¦‚æžœè¦é€’归创建完整的路径,请å‚阅[method " +"置在一个已ç»å˜åœ¨çš„目录ä¸ï¼ˆå¦‚æžœè¦é€’归创建完整的路径,请å‚阅 [method " "make_dir_recursive])。\n" "返回 [enum Error] 代ç 常é‡ä¹‹ä¸€ï¼ˆæˆåŠŸæ—¶è¿”å›ž [code]OK[/code])。" @@ -24886,11 +25013,11 @@ msgstr "返回给定 [code]type[/code] 的间è·ï¼ˆè§ [enum SpacingType])。" #: doc/classes/DynamicFont.xml msgid "Removes the fallback font at index [code]idx[/code]." -msgstr "移除ä½äºŽç´¢å¼•[code]idx[/code]处的åŽå¤‡å—体。" +msgstr "移除ä½äºŽç´¢å¼• [code]idx[/code] 处的åŽå¤‡å—体。" #: doc/classes/DynamicFont.xml msgid "Sets the fallback font at index [code]idx[/code]." -msgstr "设置索引[code]idx[/code]处的åŽå¤‡å—体。" +msgstr "设置索引 [code]idx[/code] 处的åŽå¤‡å—体。" #: doc/classes/DynamicFont.xml msgid "" @@ -25013,7 +25140,7 @@ msgstr "矢é‡å—体文件的路径。" #: doc/classes/DynamicFontData.xml msgid "The font hinting mode used by FreeType. See [enum Hinting] for options." -msgstr "FreeType 使用的å—体æç¤ºæ¨¡å¼ã€‚å‚阅 [enum Hinting] 选项。" +msgstr "FreeType 使用的å—体æç¤ºæ¨¡å¼ã€‚å¯é€‰é¡¹è§ [enum Hinting]。" #: doc/classes/DynamicFontData.xml msgid "" @@ -25237,8 +25364,8 @@ msgid "" "specified by [code]class_name[/code]." msgstr "" "如果 [code]class_name[/code] 指定的类ä¸çš„ [code]property[/code] 属性被ç¦ç”¨ï¼Œ" -"则返回 [code]true[/code]。ç¦ç”¨æŸä¸€å±žæ€§åŽï¼Œå½“选ä¸ç»§æ‰¿è‡ª " -"[code]class_name[/code] 类的节点时,该属性将ä¸ä¼šå‡ºçŽ°åœ¨æ£€æŸ¥å™¨ä¸ã€‚" +"则返回 [code]true[/code]。ç¦ç”¨æŸä¸€å±žæ€§åŽï¼Œå½“选ä¸ç»§æ‰¿è‡ª [code]class_name[/" +"code] 类的节点时,该属性将ä¸ä¼šå‡ºçŽ°åœ¨æ£€æŸ¥å™¨ä¸ã€‚" #: doc/classes/EditorFeatureProfile.xml msgid "" @@ -25254,9 +25381,8 @@ msgid "" "format obtained by using the feature profile manager's [b]Export[/b] button " "or the [method save_to_file] method." msgstr "" -"从文件ä¸åŠ è½½ä¸€ä¸ªç¼–è¾‘å™¨åŠŸèƒ½é…置文件。该文件必须éµå¾ª JSON " -"æ ¼å¼ï¼Œé€šè¿‡ä½¿ç”¨åŠŸèƒ½é…置文件管ç†å™¨çš„[b]导出[/b]按钮或 [method save_to_file] " -"方法获得。" +"从文件ä¸åŠ è½½ä¸€ä¸ªç¼–è¾‘å™¨åŠŸèƒ½é…置文件。该文件必须éµå¾ª JSON æ ¼å¼ï¼Œé€šè¿‡ä½¿ç”¨åŠŸèƒ½é…" +"置文件管ç†å™¨çš„[b]导出[/b]按钮或 [method save_to_file] 方法获得。" #: doc/classes/EditorFeatureProfile.xml msgid "" @@ -25264,9 +25390,8 @@ msgid "" "imported using the feature profile manager's [b]Import[/b] button or the " "[method load_from_file] method." msgstr "" -"将编辑器的功能é…ç½®ä¿å˜åˆ° JSON " -"æ ¼å¼çš„æ–‡ä»¶ä¸ã€‚ç„¶åŽå¯ä»¥ä½¿ç”¨åŠŸèƒ½é…置文件管ç†å™¨çš„[b]导入[/b]按钮或 [method " -"load_from_file] 方法导入它。" +"将编辑器的功能é…ç½®ä¿å˜åˆ° JSON æ ¼å¼çš„æ–‡ä»¶ä¸ã€‚ç„¶åŽå¯ä»¥ä½¿ç”¨åŠŸèƒ½é…置文件管ç†å™¨çš„" +"[b]导入[/b]按钮或 [method load_from_file] 方法导入它。" #: doc/classes/EditorFeatureProfile.xml msgid "" @@ -25274,9 +25399,8 @@ msgid "" "by [code]class_name[/code]. When disabled, the class won't appear in the " "Create New Node dialog." msgstr "" -"如果 [code]disable[/code] 为 [code]true[/code],则ç¦ç”¨ " -"[code]class_name[/code] 指定的类。ç¦ç”¨åŽï¼Œè¯¥ç±»ä¸ä¼šå‡ºçŽ°åœ¨â€œåˆ›å»ºæ–° " -"Nodeâ€å¯¹è¯æ¡†ä¸ã€‚" +"如果 [code]disable[/code] 为 [code]true[/code],则ç¦ç”¨ [code]class_name[/" +"code] 指定的类。ç¦ç”¨åŽï¼Œè¯¥ç±»ä¸ä¼šå‡ºçŽ°åœ¨â€œåˆ›å»ºæ–° Nodeâ€å¯¹è¯æ¡†ä¸ã€‚" #: doc/classes/EditorFeatureProfile.xml msgid "" @@ -25285,9 +25409,9 @@ msgid "" "appear in the Create New Node dialog but the inspector will be read-only " "when selecting a node that extends the class." msgstr "" -"如果 [code]disable[/code] 为 [code]true[/code],则ç¦ç”¨ " -"[code]class_name[/code] 指定的类的编辑。ç¦ç”¨åŽï¼Œè¯¥ç±»ä»ç„¶ä¼šå‡ºçŽ°åœ¨â€œåˆ›å»ºæ–° " -"Nodeâ€å¯¹è¯æ¡†ä¸ï¼Œä½†åœ¨é€‰ä¸ç»§æ‰¿çš„节点时,检查器将åªè¯»ã€‚" +"如果 [code]disable[/code] 为 [code]true[/code],则ç¦ç”¨ [code]class_name[/" +"code] 指定的类的编辑。ç¦ç”¨åŽï¼Œè¯¥ç±»ä»ç„¶ä¼šå‡ºçŽ°åœ¨â€œåˆ›å»ºæ–° Nodeâ€å¯¹è¯æ¡†ä¸ï¼Œä½†åœ¨é€‰ä¸" +"继承的节点时,检查器将åªè¯»ã€‚" #: doc/classes/EditorFeatureProfile.xml msgid "" @@ -25296,10 +25420,9 @@ msgid "" "When a property is disabled, it won't appear in the inspector when selecting " "a node that extends the class specified by [code]class_name[/code]." msgstr "" -"如果 [code]disable[/code] 为 [code]true[/code],则ç¦ç”¨ " -"[code]class_name[/code] 指定的类ä¸çš„ [code]property[/code] " -"属性的编辑。ç¦ç”¨æŸä¸€å±žæ€§åŽï¼Œé€‰ä¸ç»§æ‰¿è‡ª [code]class_name[/code] " -"指定的类的节点时,这个属性将ä¸ä¼šå‡ºçŽ°åœ¨æ£€æŸ¥å™¨ä¸ã€‚" +"如果 [code]disable[/code] 为 [code]true[/code],则ç¦ç”¨ [code]class_name[/" +"code] 指定的类ä¸çš„ [code]property[/code] 属性的编辑。ç¦ç”¨æŸä¸€å±žæ€§åŽï¼Œé€‰ä¸ç»§æ‰¿" +"自 [code]class_name[/code] 指定的类的节点时,这个属性将ä¸ä¼šå‡ºçŽ°åœ¨æ£€æŸ¥å™¨ä¸ã€‚" #: doc/classes/EditorFeatureProfile.xml msgid "" @@ -29688,8 +29811,8 @@ msgid "" "HDR values to be suitable for rendering on a SDR display. (Godot doesn't " "support rendering on HDR displays yet.)" msgstr "" -"è¦ä½¿ç”¨çš„è‰²è°ƒæ˜ å°„æ¨¡å¼ã€‚è‰²è°ƒæ˜ å°„æ˜¯å°† HDR 值“转æ¢â€ä¸ºé€‚åˆåœ¨ SDR " -"显示器上呈现的值过程。(Godot å°šä¸æ”¯æŒåœ¨ HDR 显示器上进行渲染。)" +"è¦ä½¿ç”¨çš„è‰²è°ƒæ˜ å°„æ¨¡å¼ã€‚è‰²è°ƒæ˜ å°„æ˜¯å°† HDR 值“转æ¢â€ä¸ºé€‚åˆåœ¨ SDR 显示器上呈现的值" +"过程。(Godot å°šä¸æ”¯æŒåœ¨ HDR 显示器上进行渲染。)" #: doc/classes/Environment.xml msgid "" @@ -30146,11 +30269,17 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" -"将整个文件作为 [String] å—符串返回。\n" -"将按照 UTF-8 ç¼–ç è§£æžæ–‡æœ¬ã€‚" +"以 [String] å½¢å¼è¿”回整个文件。文本会按照 UTF-8 ç¼–ç è§£æžã€‚\n" +"如果 [code]skip_cr[/code] 为 [code]true[/code]ï¼Œè§£æž UTF-8 时会忽略回车符" +"([code]\\r[/code],CR),åªä½¿ç”¨æ¢è¡Œç¬¦ï¼ˆ[code]\\n[/code],LF)表示新一行的开" +"始(Unix 规范)。" #: doc/classes/File.xml msgid "Returns next [code]len[/code] bytes of the file as a [PoolByteArray]." @@ -30938,13 +31067,17 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" "使用å—体在画布项目的指定ä½ç½®ç»˜åˆ¶å—符 [code]char[/code],使用的颜色是 " "[code]modulate[/code]ï¼Œå¹¶ä¸”ä¼šæ ¹æ®å®½åº¦åšè£å‰ªï¼Œå¦‚æžœä¼ å…¥äº† [code]next[/code] 还" "会利用到å—å¶è·ã€‚[code]position[/code] æŒ‡å®šçš„æ˜¯åŸºçº¿ï¼Œè€Œä¸æ˜¯é¡¶éƒ¨ã€‚è¦ä»Žé¡¶éƒ¨ç»˜" "制,必须在 Y è½´ä¸ŠåŠ ä¸Š[i]å—体的å‡éƒ¨å¤§å°[/i]。该函数返回的是å—符所使用的宽度," -"å› æ¤ç”¨æ¥é€å—符绘制å—符串éžå¸¸æ–¹ä¾¿ã€‚" +"å› æ¤ç”¨æ¥é€å—符绘制å—符串éžå¸¸æ–¹ä¾¿ã€‚\n" +"如果 [code]outline[/code] 为 [code]true[/code],则绘制的是该å—ç¬¦çš„è½®å»“è€Œä¸æ˜¯" +"该å—符本身。" #: doc/classes/Font.xml msgid "Returns the font ascent (number of pixels above the baseline)." @@ -31005,7 +31138,7 @@ msgstr "返回å—体的å‡å°‘é‡ï¼ˆä½ŽäºŽåŸºçº¿çš„åƒç´ 数)。" #: doc/classes/Font.xml msgid "Returns the total font height (ascent plus descent) in pixels." -msgstr "返回总体å—ä½“çš„é«˜åº¦ï¼ˆå¢žåŠ å’Œå‡å°‘),å•使˜¯åƒç´ 。" +msgstr "返回å—体的总高度(å‡éƒ¨åŠ é™éƒ¨ï¼‰ï¼Œå•ä½ä¸ºåƒç´ 。" #: doc/classes/Font.xml msgid "" @@ -31905,11 +32038,11 @@ msgid "" "(hole) produced which could be distinguished by calling [method " "is_polygon_clockwise]." msgstr "" -"å°†[code]polygon_a[/code]与[code]polygon_b[/code]相交并返回相交的多边形数组。" -"这在多边形之间执行[constant OPERATION_INTERSECTION]。æ¢å¥è¯è¯´ï¼Œè¿”回多边形共享" -"的公共区域。如果没有å‘生相交,则返回一个空数组。\n" -"该æ“作å¯èƒ½å¯¼è‡´äº§ç”Ÿå¤–部多边形(边界)和内部多边形(å”),å¯ä»¥é€šè¿‡è°ƒç”¨[method " -"is_polygon_clockwise]æ¥åŒºåˆ†ã€‚" +"å°† [code]polygon_a[/code] 与 [code]polygon_b[/code] 相交并返回相交的多边形数" +"组。这在多边形之间执行 [constant OPERATION_INTERSECTION]。æ¢å¥è¯è¯´ï¼Œè¿”回多边" +"形共享的公共区域。如果没有å‘生相交,则返回一个空数组。\n" +"该æ“作å¯èƒ½å¯¼è‡´äº§ç”Ÿå¤–部多边形(边界)和内部多边形(å”),å¯ä»¥é€šè¿‡è°ƒç”¨ [method " +"is_polygon_clockwise] æ¥åŒºåˆ†ã€‚" #: doc/classes/Geometry.xml msgid "" @@ -31968,10 +32101,9 @@ msgid "" "[Vector2] that specifies the positions of each tile, [code]size[/code] " "contains the overall size of the whole atlas as [Vector2]." msgstr "" -"给定表示图å—çš„ [Vector2] " -"数组,构建一个地图集。返回的å—典有两个键:[code]points[/code] 是 [Vector2] " -"的数组,用于指定æ¯ä¸ªå›¾å—çš„ä½ç½®ï¼Œ[code]size[/code] åŒ…å«æ•´ä¸ªå›¾é›†çš„æ•´ä½“大å°ï¼Œ" -"是一个 [Vector2]。" +"给定表示图å—çš„ [Vector2] 数组,构建一个地图集。返回的å—典有两个键:" +"[code]points[/code] 是 [Vector2] 的数组,用于指定æ¯ä¸ªå›¾å—çš„ä½ç½®ï¼Œ[code]size[/" +"code] åŒ…å«æ•´ä¸ªå›¾é›†çš„æ•´ä½“大å°ï¼Œæ˜¯ä¸€ä¸ª [Vector2]。" #: doc/classes/Geometry.xml msgid "" @@ -32047,14 +32179,14 @@ msgid "" "(hole) produced which could be distinguished by calling [method " "is_polygon_clockwise]." msgstr "" -"通过[code]delta[/code]å•ä½ï¼ˆåƒç´ )对[code]多边形线polyline[/code]进行充气或放" -"气,产生多边形。如果[code]delta[/code]ä¸ºæ£æ•°ï¼Œåˆ™ä½¿å¤šæ®µçº¿å‘外增长。返回一个多" -"è¾¹å½¢æ•°ç»„ï¼Œå› ä¸ºå……æ°”/放气å¯èƒ½å¯¼è‡´å¤šä¸ªç¦»æ•£çš„多边形。如果[code]delta[/code]为负" -"数,返回一个空数组。\n" -"æ¯ä¸ªå¤šè¾¹å½¢çš„顶点将由[code]join_type[/code]决定,è§[enum PolyJoinType]。\n" -"æ¯ä¸ªå¤šè¾¹å½¢çš„端点将由[code]end_type[/code]决定,è§[enum PolyEndType]。\n" -"该æ“作å¯èƒ½ä¼šäº§ç”Ÿä¸€ä¸ªå¤–部多边形(边界)和内部多边形(å”),å¯ä»¥é€šè¿‡è°ƒç”¨" -"[method is_polygon_clockwise]æ¥åŒºåˆ†ã€‚" +"对多段线 [code]polyline[/code]进行 [code]delta[/code] 个å•ä½ï¼ˆåƒç´ )的充气或" +"放气,产生多边形。如果 [code]delta[/code] ä¸ºæ£æ•°ï¼Œåˆ™ä½¿å¤šæ®µçº¿å‘外增长。返回一" +"ä¸ªå¤šè¾¹å½¢æ•°ç»„ï¼Œå› ä¸ºå……æ°”/放气å¯èƒ½å¯¼è‡´å¤šä¸ªç¦»æ•£çš„多边形。如果 [code]delta[/code] " +"为负数,返回一个空数组。\n" +"æ¯ä¸ªå¤šè¾¹å½¢çš„顶点将由 [code]join_type[/code] å†³å®šï¼Œè§ [enum PolyJoinType]。\n" +"æ¯ä¸ªå¤šè¾¹å½¢çš„端点将由 [code]end_type[/code] å†³å®šï¼Œè§ [enum PolyEndType]。\n" +"该æ“作å¯èƒ½ä¼šäº§ç”Ÿä¸€ä¸ªå¤–部多边形(边界)和内部多边形(å”),å¯ä»¥é€šè¿‡è°ƒç”¨ " +"[method is_polygon_clockwise] æ¥åŒºåˆ†ã€‚" #: doc/classes/Geometry.xml msgid "" @@ -32071,9 +32203,9 @@ msgid "" "[code]b[/code] and [code]c[/code]. If yes, returns the point of intersection " "as [Vector3]. If no intersection takes place, an empty [Variant] is returned." msgstr "" -"测试从[code]from[/code]开始,方å‘为[code]dir[/code]çš„3D射线是å¦ä¸Ž[code]a[/" -"code]ã€[code]b[/code]å’Œ[code]c[/code]指定的三角形相交。如果是,返回相交点为" -"[Vector3]。如果没有å‘生相交,将返回一个空的[Variant]。" +"测试从 [code]from[/code] 开始,方å‘为 [code]dir[/code] çš„ 3D 射线是å¦ä¸Ž " +"[code]a[/code]ã€[code]b[/code] å’Œ [code]c[/code] 指定的三角形相交。如果是,返" +"回相交点为 [Vector3]。如果没有å‘生相交,将返回一个空的 [Variant]。" #: doc/classes/Geometry.xml msgid "" @@ -32895,15 +33027,19 @@ msgstr "颜色æ’值器资æºï¼Œå¯ç”¨äºŽåœ¨ç”¨æˆ·å®šä¹‰çš„é¢œè‰²ç‚¹ä¹‹é—´ç”Ÿæˆ #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" "给定一组颜色,这个资æºå°†ä¾æ¬¡ä¸¤ä¸¤æ’值。这æ„味ç€ï¼Œå¦‚æžœä½ æœ‰é¢œè‰² 1ã€é¢œè‰² 2和颜色 " "3,æ¸å˜å°†ä»Žé¢œè‰² 1 æ’值到颜色2ã€ä»Žé¢œè‰² 2 æ’值到颜色 3。æ¸å˜æœ€åˆæœ‰ä¸¤ç§é¢œè‰²ï¼ˆé»‘" "色和白色),一ç§ï¼ˆé»‘色)ä½äºŽæ¸å˜è¾ƒä½Žçš„åç§»é‡ 0 处,å¦ä¸€ç§ï¼ˆç™½è‰²ï¼‰ä½äºŽæ¸å˜è¾ƒé«˜" -"çš„åç§»é‡ 1 处。" +"çš„åç§»é‡ 1 处。\n" +"å¦è¯·å‚阅 [Curve]ï¼Œæ”¯æŒæ›´å¤šå¤æ‚çš„ç¼“åŠ¨å‡½æ•°ï¼Œä½†ä¸æ”¯æŒé¢œè‰²ã€‚" #: doc/classes/Gradient.xml msgid "" @@ -33204,8 +33340,8 @@ msgid "" "Makes it not possible to connect between two different slot types. The type " "is defined with the [method GraphNode.set_slot] method." msgstr "" -"使得两个ä¸åŒæ§½åž‹ä¹‹é—´çš„连接æˆä¸ºä¸å¯èƒ½ã€‚该类型是通过[method GraphNode.set_slot]" -"方法定义的。" +"使得两个ä¸åŒæ§½åž‹ä¹‹é—´çš„连接æˆä¸ºä¸å¯èƒ½ã€‚该类型是通过 [method GraphNode." +"set_slot] 方法定义的。" #: doc/classes/GraphEdit.xml msgid "" @@ -33231,7 +33367,7 @@ msgstr "" #: doc/classes/GraphEdit.xml msgid "Sets the specified [code]node[/code] as the one selected." -msgstr "选ä¸ä¸€ä¸ªç‰¹å®šçš„节点 [code]node[/code]." +msgstr "将指定的 [code]node[/code] 节点设置为选ä¸çš„节点。" #: doc/classes/GraphEdit.xml msgid "If [code]true[/code], the minimap is visible." @@ -33251,7 +33387,8 @@ msgstr "å°å›¾çŸ©å½¢çš„大å°ã€‚åœ°å›¾è‡ªèº«åŸºäºŽç½‘æ ¼åŒºåŸŸçš„å¤§å°ï¼Œå¹¶è¢« msgid "" "If [code]true[/code], enables disconnection of existing connections in the " "GraphEdit by dragging the right end." -msgstr "如果为 [code]true[/code],通过拖动å³ç«¯ï¼Œå¯ä»¥æ–å¼€ GraphEdit ä¸çŽ°æœ‰çš„è¿žæŽ¥ã€‚" +msgstr "" +"如果为 [code]true[/code],通过拖动å³ç«¯ï¼Œå¯ä»¥æ–å¼€ GraphEdit ä¸çŽ°æœ‰çš„è¿žæŽ¥ã€‚" #: doc/classes/GraphEdit.xml msgid "The scroll offset." @@ -33501,7 +33638,7 @@ msgstr "返回槽[code]idx[/code]的左边(输入)颜色[Color]。" #: doc/classes/GraphNode.xml msgid "Returns the right (output) [Color] of the slot [code]idx[/code]." -msgstr "返回槽[code]idx[/code]çš„å³è¾¹ï¼ˆè¾“出)颜色[Color]。" +msgstr "返回槽[code]idx[/code]çš„å³è¾¹ï¼ˆè¾“出)颜色 [Color]。" #: doc/classes/GraphNode.xml msgid "Returns the left (input) type of the slot [code]idx[/code]." @@ -33539,17 +33676,17 @@ msgid "" "Individual properties can be set using one of the [code]set_slot_*[/code] " "methods. You must enable at least one side of the slot to do so." msgstr "" -"设置ID为[code]idx[/code]çš„æ’æ§½çš„属性。\n" -"如果[code]enable_left[/code]/[code]right[/code],就会出现一个端å£ï¼Œè¯¥æ’槽就å¯" -"以从这一侧连接。\n" -"[code]type_left[/code]/[code]right[/code]是端å£çš„一个任æ„ç±»åž‹ã€‚åªæœ‰å…·æœ‰ç›¸åŒç±»" -"åž‹å€¼çš„ç«¯å£æ‰èƒ½è¢«è¿žæŽ¥ã€‚\n" -"[code]color_left[/code]/[code]right[/code]是端å£åœ¨è¿™ä¸€ä¾§çš„å›¾æ ‡çš„è‰²è°ƒã€‚\n" -"[code]custom_left[/code]/[code]right[/code]是这一侧的端å£çš„自定义纹ç†ã€‚\n" -"[b]注æ„:[/b]这个方法åªè®¾ç½®æ§½çš„属性。è¦åˆ›å»ºæ§½ï¼Œéœ€è¦åœ¨GraphNode䏿·»åŠ ä¸€ä¸ª" -"[Control]的派生类。\n" -"å¯ä»¥ä½¿ç”¨[code]set_slot_*[/code]方法之一æ¥è®¾ç½®å•ä¸ªå±žæ€§ã€‚ä½ å¿…é¡»è‡³å°‘å¯ç”¨æ’槽的一" -"è¾¹æ‰èƒ½è¿™æ ·åšã€‚" +"设置 ID 为 [code]idx[/code] çš„æ’æ§½çš„属性。\n" +"如果 [code]enable_left[/code]/[code]right[/code],就会出现一个端å£ï¼Œè¯¥æ’槽就" +"å¯ä»¥ä»Žè¿™ä¸€ä¾§è¿žæŽ¥ã€‚\n" +"[code]type_left[/code]/[code]right[/code] 是端å£çš„一个任æ„ç±»åž‹ã€‚åªæœ‰å…·æœ‰ç›¸åŒ" +"ç±»åž‹å€¼çš„ç«¯å£æ‰èƒ½è¢«è¿žæŽ¥ã€‚\n" +"[code]color_left[/code]/[code]right[/code] 是端å£åœ¨è¿™ä¸€ä¾§çš„å›¾æ ‡çš„è‰²è°ƒã€‚\n" +"[code]custom_left[/code]/[code]right[/code] 是这一侧的端å£çš„自定义纹ç†ã€‚\n" +"[b]注æ„:[/b]这个方法åªè®¾ç½®æ§½çš„属性。è¦åˆ›å»ºæ§½ï¼Œéœ€è¦åœ¨ GraphNode 䏿·»åŠ ä¸€ä¸ª " +"[Control] 的派生类。\n" +"å¯ä»¥ä½¿ç”¨ [code]set_slot_*[/code] 方法之一æ¥è®¾ç½®å•ä¸ªå±žæ€§ã€‚ä½ å¿…é¡»è‡³å°‘å¯ç”¨æ’槽的" +"一边æ‰èƒ½è¿™æ ·åšã€‚" #: doc/classes/GraphNode.xml msgid "" @@ -33563,7 +33700,8 @@ msgstr "" msgid "" "Sets the [Color] of the right (output) side of the slot [code]idx[/code] to " "[code]color_right[/code]." -msgstr "å°†æ’æ§½ [code]idx[/code] çš„å³ä¾§ï¼ˆè¾“出)的颜色 [Color] 设置为 " +msgstr "" +"å°†æ’æ§½ [code]idx[/code] çš„å³ä¾§ï¼ˆè¾“出)的颜色 [Color] 设置为 " "[code]color_right[/code]。" #: doc/classes/GraphNode.xml @@ -33622,9 +33760,9 @@ msgid "" "[b]Note:[/b] Dragging the handle will only emit the [signal resize_request] " "signal, the GraphNode needs to be resized manually." msgstr "" -"如果为 [code]true[/code],用户å¯ä»¥è°ƒæ•´å›¾å½¢èŠ‚ç‚¹GraphNode的大å°ã€‚\n" -"[b]注æ„:[/b]拖动手柄åªä¼šå‘出 [signal resize_request] ä¿¡å·ï¼Œå›¾å½¢èŠ‚ç‚¹GraphNode" -"éœ€è¦æ‰‹åŠ¨è°ƒæ•´å¤§å°ã€‚" +"如果为 [code]true[/code],用户å¯ä»¥è°ƒæ•´ GraphNode 的大å°ã€‚\n" +"[b]注æ„:[/b]拖动手柄åªä¼šå‘出 [signal resize_request] ä¿¡å·ï¼ŒGraphNode éœ€è¦æ‰‹" +"动调整大å°ã€‚" #: doc/classes/GraphNode.xml msgid "If [code]true[/code], the GraphNode is selected." @@ -33637,7 +33775,7 @@ msgid "" "the GraphNode needs to be removed manually." msgstr "" "如果为 [code]true[/code]ï¼Œåˆ™å…³é—æŒ‰é’®å°†å¯è§ã€‚\n" -"[b]注æ„:[/b]按下它åªä¼šå‘出[signal close_request]ä¿¡å·ï¼Œéœ€è¦æ‰‹åŠ¨åˆ é™¤å›¾å½¢èŠ‚ç‚¹" +"[b]注æ„:[/b]按下它åªä¼šå‘出 [signal close_request] ä¿¡å·ï¼Œéœ€è¦æ‰‹åŠ¨åˆ é™¤ " "GraphNode。" #: doc/classes/GraphNode.xml @@ -34564,8 +34702,8 @@ msgstr "ä½Žçº§åˆ«çš„è¶…æ–‡æœ¬ä¼ è¾“å议客户端。" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -34595,8 +34733,8 @@ msgid "" "managed certificates with a short validity period." msgstr "" "è¶…æ–‡æœ¬ä¼ è¾“å议客户端,有时称为“用户代ç†â€ã€‚用于å‘出 HTTP 请求,以下载网络内" -"容ã€ä¸Šä¼ 文件和其他数æ®ï¼Œæˆ–与å„ç§æœåŠ¡è¿›è¡Œé€šä¿¡ï¼Œä»¥åŠå…¶ä»–情况。[b]更高级的替代方" -"案请å‚阅 [HTTPRequest] 节点[/b] 。\n" +"容ã€ä¸Šä¼ 文件和其他数æ®ï¼Œæˆ–与å„ç§æœåŠ¡è¿›è¡Œé€šä¿¡ï¼Œä»¥åŠå…¶ä»–情况。\n" +"更高级的替代方案请å‚阅 [HTTPRequest] 节点。\n" "[b]注æ„:[/b]这个客户端åªéœ€è¦è¿žæŽ¥ä¸»æœºä¸€æ¬¡å°±å¯ä»¥å‘é€å¤šä¸ªè¯·æ±‚,å‚阅 [method " "connect_to_host]ã€‚å› æ¤ï¼ŒèŽ·å– URL 的方法通常åªèŽ·å–主机åŽé¢çš„éƒ¨åˆ†ï¼Œè€Œä¸æ˜¯å®Œæ•´" "çš„ URLï¼Œå› ä¸ºå®¢æˆ·ç«¯å·²ç»è¿žæŽ¥åˆ°äº†ä¸€ä¸ªä¸»æœºã€‚å‚阅 [method request]以获得完整的例" @@ -37088,7 +37226,7 @@ msgstr "下一个顶点的 UV。" #: doc/classes/ImmediateGeometry.xml msgid "The next vertex's second layer UV." -msgstr "下一个顶点的第二层UV。" +msgstr "下一个顶点的第二层 UV。" #: doc/classes/Input.xml msgid "A singleton that deals with inputs." @@ -37163,13 +37301,13 @@ msgid "" "measurement for each axis is m/s² while on iOS and UWP it's a multiple of " "the Earth's gravitational acceleration [code]g[/code] (~9.81 m/s²)." msgstr "" -"å¦‚æžœè®¾å¤‡æœ‰åŠ é€Ÿåº¦ä¼ æ„Ÿå™¨ï¼Œåˆ™è¿”å›žè®¾å¤‡çš„åŠ é€Ÿåº¦ã€‚å¦åˆ™ï¼Œè¯¥æ–¹æ³•返回[constant " +"å¦‚æžœè®¾å¤‡æœ‰åŠ é€Ÿåº¦ä¼ æ„Ÿå™¨ï¼Œåˆ™è¿”å›žè®¾å¤‡çš„åŠ é€Ÿåº¦ã€‚å¦åˆ™ï¼Œè¯¥æ–¹æ³•返回 [constant " "Vector3.ZERO]。\n" -"请注æ„,å³ä½¿ä½ çš„è®¾å¤‡æœ‰ä¸€ä¸ªåŠ é€Ÿåº¦è®¡ï¼Œå½“ä»Žç¼–è¾‘å™¨è¿è¡Œæ—¶ï¼Œè¯¥æ–¹æ³•也会返回一个空的" -"[Vector3]ã€‚ä½ å¿…é¡»å°†é¡¹ç›®å¯¼å‡ºåˆ°ä¸€ä¸ªæ”¯æŒçš„è®¾å¤‡ä¸Šï¼Œä»¥ä¾¿ä»ŽåŠ é€Ÿåº¦è®¡ä¸Šè¯»å–æ•°å€¼ã€‚\n" -"[b]注æ„:[/b]这个方法åªåœ¨iOSã€Androidå’ŒUWP上工作。在其他平å°ä¸Šï¼Œå®ƒæ€»æ˜¯è¿”回" -"[constant Vector3.ZERO]。在Android上,æ¯ä¸ªè½´çš„æµ‹é‡å•使˜¯m/s²,而在iOSå’ŒUWP" -"上,它是地çƒé‡åŠ›åŠ é€Ÿåº¦çš„å€æ•°[code]g[/code](~9.81 m/s²)。" +"请注æ„,å³ä½¿ä½ çš„è®¾å¤‡æœ‰åŠ é€Ÿåº¦è®¡ï¼Œå½“ä»Žç¼–è¾‘å™¨è¿è¡Œæ—¶ï¼Œè¯¥æ–¹æ³•也会返回空的 " +"[Vector3]ã€‚ä½ å¿…é¡»å°†é¡¹ç›®å¯¼å‡ºåˆ°æ”¯æŒçš„设备上,æ‰èƒ½ä»ŽåŠ é€Ÿåº¦è®¡ä¸Šè¯»åˆ°æ•°å€¼ã€‚\n" +"[b]注æ„:[/b]这个方法åªåœ¨ iOSã€Android å’Œ UWP 上有效。在其他平å°ä¸Šï¼Œå®ƒæ€»æ˜¯è¿”" +"回 [constant Vector3.ZERO]。在 Android 上,æ¯ä¸ªè½´çš„æµ‹é‡å•使˜¯ m/s²,而在 iOS " +"å’Œ UWP 上,它是地çƒé‡åŠ›åŠ é€Ÿåº¦çš„å€æ•° [code]g[/code](~9.81 m/s²)。" #: doc/classes/Input.xml msgid "" @@ -37321,9 +37459,9 @@ msgid "" "[b]Note:[/b] This method only works on Android, iOS and UWP. On other " "platforms, it always returns [constant Vector3.ZERO]." msgstr "" -"如果设备有ç£åŠ›ä¼ æ„Ÿå™¨ï¼Œåˆ™è¿”å›žè®¾å¤‡æ‰€æœ‰è½´çš„ç£åœºå¼ºåº¦ï¼Œå¾®ç‰¹æ–¯æ‹‰ã€‚å¦åˆ™ï¼Œè¯¥æ–¹æ³•返回" -"[constant Vector3.ZERO]。\n" -"[b]注æ„:[/b]这个方法åªåœ¨Androidã€iOSå’ŒUWP上有效。在其他平å°ä¸Šï¼Œæ€»æ˜¯è¿”回" +"如果设备有ç£åŠ›ä¼ æ„Ÿå™¨ï¼Œåˆ™è¿”å›žè®¾å¤‡æ‰€æœ‰è½´çš„ç£åœºå¼ºåº¦ï¼Œå•ä½ä¸ºå¾®ç‰¹æ–¯æ‹‰ã€‚å¦åˆ™ï¼Œè¯¥æ–¹" +"法返回 [constant Vector3.ZERO]。\n" +"[b]注æ„:[/b]这个方法åªåœ¨ Androidã€iOS å’Œ UWP 上有效。在其他平å°ä¸Šï¼Œæ€»æ˜¯è¿”回 " "[constant Vector3.ZERO]。" #: doc/classes/Input.xml @@ -37422,7 +37560,7 @@ msgid "" "Returns [code]true[/code] if you are pressing the joypad button (see [enum " "JoystickList])." msgstr "" -"å¦‚æžœä½ æ£åœ¨æŒ‰ä¸‹æ‰‹æŸ„按钮,则返回 [code]true[/code],å‚阅[enum JoystickList]。" +"å¦‚æžœä½ æ£åœ¨æŒ‰ä¸‹æ‰‹æŸ„按钮,则返回 [code]true[/code]ï¼ˆè§ [enum JoystickList])。" #: doc/classes/Input.xml msgid "" @@ -37642,16 +37780,21 @@ msgstr "åœæ¢æ¸¸æˆæ‰‹æŸ„的振动。" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" -"振动 Android å’Œ iOS 设备。\n" +"振动手æŒè®¾å¤‡ã€‚\n" +"[b]注æ„:[/b]这个方法在 Androidã€iOS åŠ HTML5 上实现。\n" "[b]注æ„:[/b]Android 需è¦å¯¼å‡ºè®¾ç½®ä¸çš„ [code]VIBRATE[/code] æƒé™ã€‚iOS 䏿”¯æŒæŒ" "ç»æ—¶é—´ã€‚\n" -"[b]注æ„:[/b]在 iOS å¹³å°ä¸Šï¼ŒiOS 13 åŠä¹‹åŽçš„ç‰ˆæœ¬æ‰æ”¯æŒæŒ‡å®šæŒç»æ—¶é—´ã€‚" +"[b]注æ„:[/b]在 iOS å¹³å°ä¸Šï¼ŒiOS 13 åŠä¹‹åŽçš„ç‰ˆæœ¬æ‰æ”¯æŒæŒ‡å®šæŒç»æ—¶é—´ã€‚\n" +"[b]注æ„:[/b]Safari å’Œ Firefox çš„ Android 版本ç‰éƒ¨åˆ†æµè§ˆå™¨ä¸æ”¯æŒè¿™ä¸ªæ–¹æ³•。" #: doc/classes/Input.xml msgid "" @@ -37824,13 +37967,13 @@ msgstr "ç§»åŠ¨å…‰æ ‡ã€‚è¡¨ç¤ºé‚£äº›ä¸œè¥¿å¯ä»¥ç§»åŠ¨ã€‚" msgid "" "Vertical split mouse cursor. On Windows, it's the same as [constant " "CURSOR_VSIZE]." -msgstr "åž‚ç›´æ‹†åˆ†é¼ æ ‡å…‰æ ‡ã€‚åœ¨ Windows 上,它与 [constant CURSOR_VSIZE] 相åŒã€‚" +msgstr "åž‚ç›´æ‹†åˆ†é¼ æ ‡å…‰æ ‡ã€‚åœ¨ Windows 上与 [constant CURSOR_VSIZE] 相åŒã€‚" #: doc/classes/Input.xml msgid "" "Horizontal split mouse cursor. On Windows, it's the same as [constant " "CURSOR_HSIZE]." -msgstr "æ°´å¹³åˆ†å‰²çš„é¼ æ ‡å…‰æ ‡ã€‚åœ¨ Windows 上,它与 [constant CURSOR_HSIZE] 相åŒã€‚" +msgstr "æ°´å¹³åˆ†å‰²çš„é¼ æ ‡å…‰æ ‡ã€‚åœ¨ Windows 上与 [constant CURSOR_HSIZE] 相åŒã€‚" #: doc/classes/Input.xml msgid "Help cursor. Usually a question mark." @@ -38093,7 +38236,7 @@ msgid "" "Input event type for gamepad joysticks and other motions. For buttons, see " "[code]InputEventJoypadButton[/code]." msgstr "" -"ç”¨äºŽæ¸¸æˆæ¿æ“纵æ†å’Œå…¶ä»–动作的输入事件类型。对于按钮,è§" +"ç”¨äºŽæ¸¸æˆæ¿æ“纵æ†å’Œå…¶ä»–åŠ¨ä½œçš„è¾“å…¥äº‹ä»¶ç±»åž‹ã€‚å¯¹äºŽæŒ‰é’®ï¼Œè§ " "[code]InputEventJoypadButton[/code]。" #: doc/classes/InputEventJoypadMotion.xml @@ -38124,7 +38267,7 @@ msgstr "键盘事件的输入事件类型。" msgid "" "Stores key presses on the keyboard. Supports key presses, key releases and " "[member echo] events." -msgstr "å˜å‚¨é”®ç›˜ä¸Šçš„æŒ‰é”®ã€‚æ”¯æŒæŒ‰é”®ã€æŒ‰é”®é‡Šæ”¾å’Œ[member echo]回显事件。" +msgstr "å˜å‚¨é”®ç›˜ä¸Šçš„æŒ‰é”®ã€‚æ”¯æŒæŒ‰é”®ã€æŒ‰é”®é‡Šæ”¾å’Œ [member echo] 回显事件。" #: doc/classes/InputEventKey.xml msgid "" @@ -38712,8 +38855,17 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." -msgstr "䏿˜¯çº¿ç¨‹å®‰å…¨çš„。如果从线程调用,请使用 [method Object.call_deferred]。" +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." +msgstr "" +"è°ƒç”¨è¿™ä¸ªæ–¹æ³•ä¼šå®žé™…è½½å…¥èŠ‚ç‚¹ã€‚åˆ›å»ºçš„èŠ‚ç‚¹ä¼šè¢«æ”¾ç½®åœ¨åœºæ™¯æ ‘ä¸è¯¥ " +"[InstancePlaceholder] çš„[i]上方[/i]。出于方便的考虑,还会返回该 [Node] 的引" +"用。\n" +"[b]注æ„:[/b][method create_instance] 䏿˜¯çº¿ç¨‹å®‰å…¨çš„。从线程ä¸è°ƒç”¨æ—¶è¯·ä½¿ç”¨ " +"[method Object.call_deferred]。" #: doc/classes/InstancePlaceholder.xml msgid "" @@ -38726,6 +38878,20 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" +"返回在调用 [method create_instance] 时会应用到节点上的属性列表。\n" +"如果 [code]with_order[/code] 为 [code]true[/code],会在å—å…¸ä¸åŠ å…¥ [code]." +"order[/code] å—æ®µï¼ˆæ³¨æ„有个å‰ç¼€çš„点)。这个 [code].order[/code] å—æ®µæ˜¯å±žæ€§å" +"ç§° [String] çš„ [Array],指定属性的应用顺åºï¼ˆç´¢å¼•为 0 的是第一个)。" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -38892,8 +39058,8 @@ msgid "" "Removes all of a [code]hostname[/code]'s cached references. If no " "[code]hostname[/code] is given, all cached IP addresses are removed." msgstr "" -"移除所有[code]hostname[/code]主机å的缓å˜å¼•用。如果没有给出[code]hostname[/" -"code],所有缓å˜çš„IP地å€å°†è¢«åˆ 除。" +"移除所有 [code]hostname[/code] 主机å的缓å˜å¼•用。如果没有给出 " +"[code]hostname[/code],所有缓å˜çš„ IP 地å€å°†è¢«åˆ 除。" #: doc/classes/IP.xml msgid "" @@ -38939,7 +39105,7 @@ msgid "" "[method get_resolve_item_status])." msgstr "" "给定队列 [code]id[/code],返回排队主机åçš„ IP 地å€ã€‚出现错误或解æžå°šæœªå‘生时" -"返回一个空å—符串(å‚阅 [method get_resolve_item_status])。" +"返回一个空å—ç¬¦ä¸²ï¼ˆè§ [method get_resolve_item_status])。" #: doc/classes/IP.xml msgid "" @@ -39460,11 +39626,11 @@ msgstr "指导线的颜色[Color]。指导线是在æ¯è¡Œé¡¹ç›®ä¹‹é—´ç”»çš„一æ #: doc/classes/ItemList.xml msgid "The horizontal spacing between items." -msgstr "项目èœå•之间的水平间è·ã€‚" +msgstr "项目之间的水平间è·ã€‚" #: doc/classes/ItemList.xml msgid "The spacing between item's icon and text." -msgstr "项目èœå•çš„å›¾æ ‡å’Œæ–‡æœ¬ä¹‹é—´çš„é—´è·ã€‚" +msgstr "é¡¹ç›®çš„å›¾æ ‡å’Œæ–‡æœ¬ä¹‹é—´çš„é—´è·ã€‚" #: doc/classes/ItemList.xml msgid "The vertical spacing between each line of text." @@ -39482,31 +39648,31 @@ msgstr "项目文本的å—体 [Font] 。" msgid "" "Default [StyleBox] for the [ItemList], i.e. used when the control is not " "being focused." -msgstr "[ItemList] çš„é»˜è®¤æ ·å¼ç›’ [StyleBox],å³åœ¨æŽ§ä»¶æœªèŽ·å¾—ç„¦ç‚¹æ—¶ä½¿ç”¨ã€‚" +msgstr "该 [ItemList] çš„é»˜è®¤æ ·å¼ç›’ [StyleBox],å³ä¼šåœ¨è¯¥æŽ§ä»¶æœªèŽ·å¾—ç„¦ç‚¹æ—¶ä½¿ç”¨ã€‚" #: doc/classes/ItemList.xml msgid "[StyleBox] used when the [ItemList] is being focused." -msgstr "当 [ItemList] 被èšç„¦æ—¶ä½¿ç”¨çš„æ ·å¼ç›’ [StyleBox]。" +msgstr "当该 [ItemList] èŽ·å¾—ç„¦ç‚¹æ—¶æ‰€ä½¿ç”¨çš„æ ·å¼ç›’ [StyleBox]。" #: doc/classes/ItemList.xml msgid "[StyleBox] used for the cursor, when the [ItemList] is being focused." -msgstr "当 [ItemList] 被èšç„¦æ—¶ï¼Œç”¨äºŽå…‰æ ‡çš„æ ·å¼ç›’ [StyleBox]。" +msgstr "当该 [ItemList] èŽ·å¾—ç„¦ç‚¹æ—¶ï¼Œç”¨ä½œå…‰æ ‡çš„æ ·å¼ç›’ [StyleBox]。" #: doc/classes/ItemList.xml msgid "" "[StyleBox] used for the cursor, when the [ItemList] is not being focused." -msgstr "当 [ItemList] 没有被èšç„¦æ—¶ï¼Œç”¨äºŽå…‰æ ‡çš„æ ·å¼ç›’ [StyleBox]。" +msgstr "当该 [ItemList] æœªèŽ·å¾—ç„¦ç‚¹æ—¶ï¼Œç”¨ä½œå…‰æ ‡çš„æ ·å¼ç›’ [StyleBox]。" #: doc/classes/ItemList.xml msgid "" "[StyleBox] for the selected items, used when the [ItemList] is not being " "focused." -msgstr "æ‰€é€‰é¡¹çš„æ ·å¼ç›’ [StyleBox],当 [ItemList] 没有获得焦点时使用。" +msgstr "æ‰€é€‰é¡¹çš„æ ·å¼ç›’ [StyleBox],当该 [ItemList] 未获得焦点时使用。" #: doc/classes/ItemList.xml msgid "" "[StyleBox] for the selected items, used when the [ItemList] is being focused." -msgstr "æ‰€é€‰é¡¹çš„æ ·å¼ç›’ [StyleBox],当 [ItemList] 没有获得焦点时使用。" +msgstr "æ‰€é€‰é¡¹çš„æ ·å¼ç›’ [StyleBox],当该 [ItemList] 获得焦点时使用。" #: doc/classes/JavaScript.xml msgid "" @@ -39538,8 +39704,8 @@ msgid "" "JavaScript. The reference must be kept until the callback happens, or it " "won't be called at all. See [JavaScriptObject] for usage." msgstr "" -"创建脚本函数的引用,å¯ä»¥è¢«JavaScriptç”¨ä½œå›žè°ƒã€‚è¿™ä¸ªå¼•ç”¨å¿…é¡»ä¿æŒåˆ°å›žè°ƒå‘生为" -"æ¢ï¼Œå¦åˆ™å®ƒå°±ä¸ä¼šè¢«è°ƒç”¨ã€‚使用方法å‚阅[JavaScriptObject]。" +"创建脚本函数的引用,å¯ä»¥è¢« JavaScript ç”¨ä½œå›žè°ƒã€‚è¿™ä¸ªå¼•ç”¨å¿…é¡»ä¿æŒåˆ°å›žè°ƒå‘生为" +"æ¢ï¼Œå¦åˆ™å®ƒå°±ä¸ä¼šè¢«è°ƒç”¨ã€‚ä½¿ç”¨æ–¹æ³•è§ [JavaScriptObject]。" #: doc/classes/JavaScript.xml msgid "" @@ -39547,8 +39713,9 @@ msgid "" "[code]object[/code] must a valid property of the JavaScript [code]window[/" "code]. See [JavaScriptObject] for usage." msgstr "" -"使用[code]new[/code]æž„é€ å‡½æ•°åˆ›å»ºæ–°çš„JavaScript对象。[code]object[/code]必须是" -"JavaScript[code]window[/code]的有效属性。使用方法å‚阅[JavaScriptObject]。" +"使用 [code]new[/code] æž„é€ å‡½æ•°åˆ›å»ºæ–°çš„ JavaScript 对象。[code]object[/code] " +"必须是 JavaScript [code]window[/code] çš„æœ‰æ•ˆå±žæ€§ã€‚ä½¿ç”¨æ–¹æ³•è§ " +"[JavaScriptObject]。" #: doc/classes/JavaScript.xml msgid "" @@ -39563,12 +39730,12 @@ msgid "" "[b]Note:[/b] Browsers might ask the user for permission or block the " "download if multiple download requests are made in a quick succession." msgstr "" -"æç¤ºç”¨æˆ·ä¸‹è½½ä¸€ä¸ªåŒ…嫿Œ‡å®š[code]buffer[/code]缓冲区的文件。该文件将具有给定的" -"[code]name[/code]å’Œ[code]mime[/code]类型。\n" -"[b]注æ„:[/b]æµè§ˆå™¨å¯èƒ½ä¼šæ ¹æ®æ–‡ä»¶[code]name[/code]的扩展å,覆盖所æä¾›çš„" -"[url=https://en.wikipedia.org/wiki/Media_type]MIME类型[/url]。\n" -"[b]注æ„:[/b]如果[method download_buffer]䏿˜¯ç”±ç”¨æˆ·äº¤äº’调用,如点击按钮,æµè§ˆ" -"器å¯èƒ½ä¼šé˜»æ¢ä¸‹è½½ã€‚\n" +"æç¤ºç”¨æˆ·ä¸‹è½½ä¸€ä¸ªåŒ…嫿Œ‡å®š [code]buffer[/code] 缓冲区的文件。该文件将具有给定" +"çš„ [code]name[/code] å’Œ [code]mime[/code] 类型。\n" +"[b]注æ„:[/b]æµè§ˆå™¨å¯èƒ½ä¼šæ ¹æ®æ–‡ä»¶ [code]name[/code] 的扩展å,覆盖所æä¾›çš„ " +"[url=https://en.wikipedia.org/wiki/Media_type]MIME 类型[/url]。\n" +"[b]注æ„:[/b]如果 [method download_buffer] 䏿˜¯ç”±ç”¨æˆ·äº¤äº’调用,如点击按钮,æµ" +"览器å¯èƒ½ä¼šé˜»æ¢ä¸‹è½½ã€‚\n" "[b]注æ„:[/b]å¦‚æžœå¿«é€Ÿè¿žç»æå‡ºå¤šä¸ªä¸‹è½½è¯·æ±‚ï¼Œæµè§ˆå™¨å¯èƒ½ä¼šè¦æ±‚ç”¨æˆ·åŒæ„或阻æ¢ä¸‹" "载。" @@ -39582,10 +39749,11 @@ msgid "" "evaluated in the execution context of a function within the engine's runtime " "environment." msgstr "" -"在æµè§ˆå™¨çª—å£ä¸æ‰§è¡Œå—符串[code]code[/code]作为JavaScript代ç 。这是对实际的全局" -"JavaScript函数[code]eval()[/code]的调用。\n" -"如果[code]use_global_execution_context[/code]是[code]true[/code],代ç 将在全" -"局执行环境ä¸è¢«æ±‚值。å¦åˆ™ï¼Œå®ƒå°†åœ¨å¼•擎è¿è¡Œæ—¶çŽ¯å¢ƒä¸å‡½æ•°çš„æ‰§è¡Œä¸Šä¸‹æ–‡ä¸è¿›è¡Œæ±‚值。" +"在æµè§ˆå™¨çª—å£ä¸å°† [code]code[/code] å—符串作为 JavaScript ä»£ç æ‰§è¡Œã€‚这是对实际" +"的全局 JavaScript 函数 [code]eval()[/code] 的调用。\n" +"如果 [code]use_global_execution_context[/code] 为 [code]true[/code],代ç 将在" +"全局执行环境ä¸è¢«æ±‚值。å¦åˆ™ï¼Œå®ƒå°†åœ¨å¼•擎è¿è¡Œæ—¶çŽ¯å¢ƒä¸å‡½æ•°çš„æ‰§è¡Œä¸Šä¸‹æ–‡ä¸è¿›è¡Œæ±‚" +"值。" #: doc/classes/JavaScript.xml msgid "" @@ -39595,9 +39763,9 @@ msgid "" "which will contain the JavaScript [code]arguments[/code]. See " "[JavaScriptObject] for usage." msgstr "" -"返回å¯ä»¥è¢«è„šæœ¬ä½¿ç”¨çš„JavaScript对象的接å£ã€‚这个[code]interface[/code]必须是" -"JavaScript[code]window[/code]的一个有效属性。回调必须接å—一个[Array]傿•°ï¼Œå®ƒ" -"将包å«JavaScript [code]arguments[/code]。å‚阅[JavaScriptObject]的用法。" +"返回å¯ä»¥è¢«è„šæœ¬ä½¿ç”¨çš„ JavaScript 对象的接å£ã€‚这个 [code]interface[/code] å¿…é¡»" +"是 JavaScript [code]window[/code] 的一个有效属性。回调必须接å—一个 [Array] å‚" +"数,它将包å«JavaScript [code]arguments[/code]ã€‚ç”¨æ³•è§ [JavaScriptObject]。" #: doc/classes/JavaScript.xml msgid "" @@ -39796,7 +39964,8 @@ msgstr "" #: doc/classes/Joint2D.xml msgid "" "If [code]true[/code], [member node_a] and [member node_b] can not collide." -msgstr "如果为 [code]true[/code],[member node_a]å’Œ[member node_b]ä¸èƒ½ç¢°æ’žã€‚" +msgstr "" +"如果为 [code]true[/code],则 [member node_a] å’Œ [member node_b] æ— æ³•ç¢°æ’žã€‚" #: doc/classes/Joint2D.xml msgid "The first body attached to the joint. Must derive from [PhysicsBody2D]." @@ -39805,7 +39974,7 @@ msgstr "连接到关节的第一个实体。必须继承自 [PhysicsBody2D] 。" #: doc/classes/Joint2D.xml msgid "" "The second body attached to the joint. Must derive from [PhysicsBody2D]." -msgstr "连接到关节的第二实体。必须继承自 [PhysicsBody2D]。" +msgstr "连接到关节的第二个实体。必须继承自 [PhysicsBody2D]。" #: doc/classes/JSON.xml msgid "Helper class for parsing JSON data." @@ -40009,10 +40178,10 @@ msgid "" "standard on top of [Dictionary]; you will have to convert between a " "[Dictionary] and [JSON] with other functions." msgstr "" -"[url=https://www.jsonrpc.org/]JSON-RPC[/url]æ˜¯ä¸€ä¸ªæ ‡å‡†ï¼Œå®ƒå°†ä¸€ä¸ªæ–¹æ³•è°ƒç”¨åŒ…è£…" -"在一个[JSON]对象ä¸ã€‚è¯¥å¯¹è±¡æœ‰ä¸€ä¸ªç‰¹å®šçš„ç»“æž„ï¼Œå¹¶æ ‡è¯†å‡ºå“ªä¸ªæ–¹æ³•è¢«è°ƒç”¨ï¼Œè¯¥å‡½æ•°çš„" -"傿•°ï¼Œå¹¶æºå¸¦ä¸€ä¸ªIDæ¥è·Ÿè¸ªå“应。这个类在[Dictionary]ä¹‹ä¸Šå®žçŽ°äº†è¯¥æ ‡å‡†ï¼›ä½ å¿…é¡»ç”¨" -"其他函数在[Dictionary]å’Œ[JSON]之间进行转æ¢ã€‚" +"[url=https://www.jsonrpc.org/]JSON-RPC[/url] æ˜¯ä¸€é¡¹æ ‡å‡†ï¼Œå®ƒå°†æ–¹æ³•è°ƒç”¨åŒ…è£…åœ¨ä¸€" +"个 [JSON] 对象ä¸ã€‚è¯¥å¯¹è±¡æœ‰ä¸€ä¸ªç‰¹å®šçš„ç»“æž„ï¼Œå¹¶æ ‡è¯†å‡ºå“ªä¸ªæ–¹æ³•è¢«è°ƒç”¨ï¼Œè¯¥å‡½æ•°çš„å‚" +"数,并æºå¸¦ä¸€ä¸ª ID æ¥è·Ÿè¸ªå“应。这个类在 [Dictionary] ä¹‹ä¸Šå®žçŽ°äº†è¯¥æ ‡å‡†ï¼›ä½ å¿…é¡»" +"用其他函数在 [Dictionary] å’Œ [JSON] 之间进行转æ¢ã€‚" #: doc/classes/JSONRPC.xml msgid "" @@ -40154,8 +40323,8 @@ msgid "" "move_and_slide_with_snap] and when [method is_on_floor] returns [code]true[/" "code]." msgstr "" -"返回最åŽä¸€ä¸ªç¢°æ’žç‚¹çš„地æ¿çš„è¡¨é¢æ³•çº¿ã€‚åªæœ‰åœ¨è°ƒç”¨[method move_and_slide]或" -"[method move_and_slide_with_snap]åŽï¼Œä»¥åŠ[method is_on_floor]返回 " +"返回最åŽä¸€ä¸ªç¢°æ’žç‚¹çš„地æ¿çš„è¡¨é¢æ³•çº¿ã€‚åªæœ‰åœ¨è°ƒç”¨ [method move_and_slide] 或 " +"[method move_and_slide_with_snap] åŽï¼Œä»¥åŠ [method is_on_floor] 返回 " "[code]true[/code] æ—¶æ‰æœ‰æ•ˆã€‚" #: doc/classes/KinematicBody.xml doc/classes/KinematicBody2D.xml @@ -40326,8 +40495,8 @@ msgid "" "[code]lock[/code]. See also [member move_lock_x], [member move_lock_y] and " "[member move_lock_z]." msgstr "" -"æ ¹æ®[code]lock[/code]的值,é”å®šæˆ–è§£é”æŒ‡å®šçš„[code]axis[/code]。å‚阅[member " -"move_lock_x]ã€[member move_lock_y]å’Œ[member move_lock_z]。" +"æ ¹æ® [code]lock[/code] 的值,é”å®šæˆ–è§£é”æŒ‡å®šçš„ [code]axis[/code]。å¦è¯·å‚阅 " +"[member move_lock_x]ã€[member move_lock_y] å’Œ [member move_lock_z]。" #: doc/classes/KinematicBody.xml msgid "" @@ -40369,8 +40538,8 @@ msgid "" "scale to avoid visible jittering, or for stability with a stack of kinematic " "bodies." msgstr "" -"在è¿åŠ¨å‡½æ•°ä¸ç”¨äºŽç¢°æ’žæ¢å¤çš„é¢å¤–è¾¹è·ï¼Œå‚阅 [method move_and_collide]ã€[method " -"move_and_slide]ã€[method move_and_slide_with_snap]。\n" +"在è¿åŠ¨å‡½æ•°ä¸ç”¨äºŽç¢°æ’žæ¢å¤çš„é¢å¤–è¾¹è·ï¼ˆè§ [method move_and_collide]ã€[method " +"move_and_slide]ã€[method move_and_slide_with_snap])。\n" "如果物体离å¦ä¸€ä¸ªç‰©ä½“至少这么近,它就会认为它们æ£åœ¨å‘生碰撞,并在执行实际è¿åЍ" "之å‰è¢«æŽ¨å¼€ã€‚\n" "一个较高的值æ„味ç€å®ƒåœ¨æ£€æµ‹ç¢°æ’žæ—¶æ›´åŠ çµæ´»ï¼Œè¿™æœ‰åŠ©äºŽæŒç»æ£€æµ‹å¢™å£å’Œåœ°æ¿ã€‚\n" @@ -40384,9 +40553,9 @@ msgid "" "for example on moving platforms. Do [b]not[/b] use together with [method " "move_and_slide] or [method move_and_collide] functions." msgstr "" -"如果为 [code]true[/code],则物体的è¿åŠ¨å°†ä¸Žç‰©ç†å¸§åŒæ¥ã€‚当通过[AnimationPlayer]" -"为è¿åŠ¨è®¾ç½®åŠ¨ç”»æ—¶ï¼Œä¾‹å¦‚åœ¨ç§»åŠ¨å¹³å°ä¸Šï¼Œè¿™ä¸ªåŠŸèƒ½å¾ˆæœ‰ç”¨ã€‚è¯·[b]ä¸è¦[/b]与 [method " -"move_and_slide] 或 [method move_and_collide] 函数一起使用。" +"如果为 [code]true[/code],则物体的è¿åŠ¨å°†ä¸Žç‰©ç†å¸§åŒæ¥ã€‚当通过 " +"[AnimationPlayer] 为è¿åŠ¨è®¾ç½®åŠ¨ç”»æ—¶ï¼Œä¾‹å¦‚åœ¨ç§»åŠ¨å¹³å°ä¸Šï¼Œè¿™ä¸ªåŠŸèƒ½å¾ˆæœ‰ç”¨ã€‚è¯·[b]ä¸" +"è¦[/b]与 [method move_and_slide] 或 [method move_and_collide] 函数一起使用。" #: doc/classes/KinematicBody.xml msgid "" @@ -40455,14 +40624,14 @@ msgid "" "characters that collide against a world, but don't require advanced physics." msgstr "" "è¿åŠ¨ä½“æ˜¯ç‰¹æ®Šç±»åž‹çš„ç‰©ä½“ï¼Œæ—¨åœ¨è®©ç”¨æˆ·æŽ§åˆ¶ã€‚å®ƒä»¬å®Œå…¨ä¸å—物ç†å½±å“;对于其他类型的" -"ç‰©ä½“ï¼Œå¦‚è§’è‰²æˆ–åˆšä½“ï¼Œå®ƒä»¬ä¸Žé™æ€ä½“ä¸€æ ·ã€‚ç„¶è€Œï¼Œå®ƒä»¬æœ‰ä¸¤ä¸ªä¸»è¦ç”¨é€”:\n" -"[b]模拟è¿åŠ¨ï¼š[/b]å½“è¿™äº›ç‰©ä½“è¢«æ‰‹åŠ¨ç§»åŠ¨æ—¶ï¼Œæ— è®ºæ˜¯ä»Žä»£ç 还是从" -"[AnimationPlayer],将[member AnimationPlayer.playback_process_mode]设置为 " -"\"physics\",物ç†å°†è‡ªåŠ¨è®¡ç®—å…¶çº¿æ€§å’Œè§’é€Ÿåº¦çš„ä¼°å€¼ã€‚è¿™ä½¿å¾—å®ƒä»¬å¯¹äºŽç§»åŠ¨å¹³å°æˆ–å…¶ä»–" -"AnimationPlayer控制的物体éžå¸¸æœ‰ç”¨ï¼Œæ¯”如一扇门ã€ä¸€åº§èƒ½æ‰“开的桥ç‰ã€‚\n" -"[b]è¿åŠ¨åž‹è§’è‰²ï¼š[/b] KinematicBody2D也有一个API用于移动物体([method " -"move_and_collide]å’Œ[method move_and_slide]æ–¹æ³•ï¼‰ï¼ŒåŒæ—¶è¿›è¡Œç¢°æ’žæµ‹è¯•。这使得它" -"们在实现对世界进行碰撞,但ä¸éœ€è¦é«˜çº§ç‰©ç†çš„角色时éžå¸¸æœ‰ç”¨ã€‚" +"ç‰©ä½“ï¼Œå¦‚è§’è‰²æˆ–åˆšä½“ï¼Œå®ƒä»¬ä¸Žé™æ€ä½“ä¸€æ ·ã€‚ç„¶è€Œï¼Œå®ƒä»¬æœ‰ä¸¤ä¸ªä¸»è¦ç”¨é€”:\n" +"[b]模拟è¿åŠ¨ï¼š[/b]å½“è¿™äº›ç‰©ä½“è¢«æ‰‹åŠ¨ç§»åŠ¨æ—¶ï¼Œæ— è®ºæ˜¯ä»Žä»£ç 还是从 " +"[AnimationPlayer],将 [member AnimationPlayer.playback_process_mode] 设置" +"为“physicsâ€ï¼Œç‰©ç†å°†è‡ªåŠ¨è®¡ç®—å…¶çº¿æ€§å’Œè§’é€Ÿåº¦çš„ä¼°å€¼ã€‚è¿™ä½¿å¾—å®ƒä»¬å¯¹äºŽç§»åŠ¨å¹³å°æˆ–å…¶" +"ä»– AnimationPlayer 控制的物体éžå¸¸æœ‰ç”¨ï¼Œæ¯”如门ã€åŠæ¡¥ç‰ã€‚\n" +"[b]è¿åЍå¦è§’色:[/b]KinematicBody2D 也有一个 API 用于移动物体([method " +"move_and_collide] å’Œ [method move_and_slide] æ–¹æ³•ï¼‰ï¼ŒåŒæ—¶è¿›è¡Œç¢°æ’žæµ‹è¯•。这使得" +"它们在实现对世界进行碰撞,但ä¸éœ€è¦é«˜çº§ç‰©ç†çš„角色时éžå¸¸æœ‰ç”¨ã€‚" #: doc/classes/KinematicBody2D.xml msgid "Using KinematicBody2D" @@ -41028,8 +41197,8 @@ msgid "" "sorted from back to front (subject to priority)." msgstr "" "设置文本轮廓的渲染优先级。优先级高的物体将被排åºåœ¨ä¼˜å…ˆçº§ä½Žçš„物体å‰é¢ã€‚\n" -"[b]注æ„:[/b]仅在 [member alpha_cut] 为 [constant " -"ALPHA_CUT_DISABLED](默认值)时适用。\n" +"[b]注æ„:[/b]仅在 [member alpha_cut] 为 [constant ALPHA_CUT_DISABLED](默认" +"值)时适用。\n" "[b]注æ„:[/b]ä»…é€‚ç”¨äºŽé€æ˜Žç‰©ä½“的排åºã€‚è¿™ä¸ä¼šå½±å“逿˜Žç‰©ä½“相对于ä¸é€æ˜Žç‰©ä½“的排åº" "æ–¹å¼ã€‚è¿™æ˜¯å› ä¸ºä¸é€æ˜Žå¯¹è±¡ä¸è¢«æŽ’åºï¼Œè€Œé€æ˜Žå¯¹è±¡åˆ™ä»ŽåŽå¾€å‰æŽ’åºï¼ˆå–决于优先级)。" @@ -41049,8 +41218,8 @@ msgid "" "sorted from back to front (subject to priority)." msgstr "" "设置文本的渲染优先级。优先级高的物体将被排åºåœ¨ä¼˜å…ˆçº§ä½Žçš„物体å‰é¢ã€‚\n" -"[b]注æ„:[/b]仅在 [member alpha_cut] 为 [constant " -"ALPHA_CUT_DISABLED](默认值)时适用。\n" +"[b]注æ„:[/b]仅在 [member alpha_cut] 为 [constant ALPHA_CUT_DISABLED](默认" +"值)时适用。\n" "[b]注æ„:[/b]ä»…é€‚ç”¨äºŽé€æ˜Žç‰©ä½“的排åºã€‚è¿™ä¸ä¼šå½±å“逿˜Žç‰©ä½“相对于ä¸é€æ˜Žç‰©ä½“的排åº" "æ–¹å¼ã€‚è¿™æ˜¯å› ä¸ºä¸é€æ˜Žå¯¹è±¡ä¸è¢«æŽ’åºï¼Œè€Œé€æ˜Žå¯¹è±¡åˆ™ä»ŽåŽå¾€å‰æŽ’åºï¼ˆå–决于优先级)。" @@ -41657,44 +41826,44 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" -"在 [code]position[/code] æ·»åŠ ç‚¹ã€‚å°†ç‚¹è¿½åŠ åˆ°ç›´çº¿çš„æœ«å°¾ã€‚\n" -"如果给定了ä½ç½® [code]at_position[/code],则在ä½ç½® [code]at_position[/code] 之" -"剿’入该点,并将该点(以åŠä¹‹åŽçš„æ¯ä¸ªç‚¹ï¼‰ç§»åŠ¨åˆ°æ’入点之åŽã€‚如果未给出ä½ç½®å¤„çš„ " -"[code]at_position[/code]ï¼Œæˆ–è€…æ˜¯éžæ³•值([code]at_position < 0[/code] 或 " -"[code]at_position >= [method get_point_count][/code]ï¼‰ï¼Œåˆ™è¯¥ç‚¹å°†è¿½åŠ åˆ°ç‚¹åˆ—è¡¨" -"的末尾。" +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." +msgstr "" +"在指定的ä½ç½® [code]position[/code] æ·»åŠ ä¸€ä¸ªç‚¹ï¼Œç›¸å¯¹äºŽè¯¥çº¿æ®µè‡ªèº«çš„ä½ç½®ã€‚新的点" +"ä¼šè¢«åŠ å…¥åˆ°ç‚¹çš„åˆ—è¡¨æœ«å°¾ã€‚\n" +"如果给定了索引 [code]index[/code],这个新点会被æ’入到 [code]index[/code] 所对" +"应的现å˜ç‚¹ä¹‹å‰ã€‚从 [code]index[/code] å¾€åŽçš„æ‰€æœ‰çްå˜ç‚¹éƒ½ä¼šåœ¨åˆ—表ä¸å¾€åŽç§»ä¸€" +"ä½ã€‚该索引必须大于ç‰äºŽ [code]0[/code],ä¸èƒ½å¤Ÿè¶…出线段上现å˜ç‚¹çš„æ•°é‡ã€‚è§ " +"[method get_point_count]。" #: doc/classes/Line2D.xml msgid "Removes all points from the line." msgstr "移除直线上的所有点。" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "返回该 Line2D 上点的数é‡ã€‚" +msgid "Returns the amount of points in the line." +msgstr "返回线段ä¸çš„点的数é‡ã€‚" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "返回点 [code]i[/code] çš„ä½ç½®ã€‚" +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "返回索引 [code]index[/code] 处的点的ä½ç½®ã€‚" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "将索引 [code]i[/code] 处的点从直线ä¸ç§»é™¤ã€‚" +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "将索引 [code]index[/code] 处的点从直线ä¸ç§»é™¤ã€‚" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" -"用æä¾›çš„ [code]position[/code] ä½ç½®è¦†ç›–索引 [code]i[/code] 处点的ä½ç½®ã€‚" +"用æä¾›çš„ [code]position[/code] ä½ç½®è¦†ç›–索引 [code]index[/code] 处点的ä½ç½®ã€‚" #: doc/classes/Line2D.xml msgid "" @@ -42323,7 +42492,7 @@ msgstr "" #: doc/classes/LinkButton.xml msgid "" "Determines when to show the underline. See [enum UnderlineMode] for options." -msgstr "决定何时显示下划线。å‚阅 [enum UnderlineMode] 的选项。" +msgstr "决定何时显示下划线。å¯é€‰é¡¹è§ [enum UnderlineMode]。" #: doc/classes/LinkButton.xml msgid "The LinkButton will always show an underline at the bottom of its text." @@ -42992,7 +43161,7 @@ msgstr "" #: doc/classes/MenuButton.xml msgid "Emitted when [PopupMenu] of this MenuButton is about to show." -msgstr "å½“æ¤ MenuButton çš„ [PopupMenu] å³å°†æ˜¾ç¤ºæ—¶è§¦å‘。" +msgstr "当这个 MenuButton çš„ [PopupMenu] å³å°†æ˜¾ç¤ºæ—¶è§¦å‘。" #: doc/classes/MenuButton.xml msgid "Default text [Color] of the [MenuButton]." @@ -43248,9 +43417,13 @@ msgstr "曾ç»ç”¨äºŽæ ‡è®°åŽ‹ç¼©ï¼ˆåŠç²¾åº¦æµ®ç‚¹ï¼‰æ³•呿•°ç»„çš„æ ‡å¿—ã€‚" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "曾ç»ç”¨äºŽæ ‡è®°åŽ‹ç¼©ï¼ˆåŠç²¾åº¦æµ®ç‚¹ï¼‰åˆ‡å‘æ•°ç»„çš„æ ‡å¿—ã€‚" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." -msgstr "æ›¾ç”¨äºŽæ ‡è®°åŽ‹ç¼©ï¼ˆåŠç²¾åº¦æµ®ç‚¹ï¼‰é¢œè‰²æ•°ç»„çš„æ ‡å¿—ã€‚" +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." +msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "Flag used to mark a compressed (half float) UV coordinates array." @@ -43289,12 +43462,16 @@ msgid "" msgstr "æ ‡å¿—ç”¨äºŽæ ‡è®°æ•°ç»„ä½¿ç”¨æ³•çº¿å’Œåˆ‡çº¿å‘é‡çš„å…«é¢è¡¨ç¤ºæ³•ï¼Œè€Œä¸æ˜¯ç¬›å¡å°”å¼ã€‚" #: doc/classes/Mesh.xml +#, fuzzy msgid "" "Used to set flags [constant ARRAY_COMPRESS_VERTEX], [constant " "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" "ç”¨äºŽå¿«é€Ÿè®¾ç½®æ ‡å¿— [constant ARRAY_COMPRESS_VERTEX]ã€[constant " "ARRAY_COMPRESS_NORMAL]ã€[constant ARRAY_COMPRESS_TANGENT]ã€[constant " @@ -43594,14 +43771,14 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" -"MeshInstance æ˜¯ä¸€ä¸ªèŠ‚ç‚¹ï¼Œå®ƒèŽ·å– [Mesh] 资æºå¹¶åˆ›å»ºä¸€ä¸ªå®žä¾‹ï¼Œå°†å…¶æ·»åŠ åˆ°å½“å‰åœºæ™¯" -"ä¸ã€‚è¿™æ˜¯æœ€å¸¸è¢«ç”¨æ¥æ¸²æŸ“ 3D å‡ ä½•ä½“çš„ç±»ï¼Œè¿™å¯ä»¥åœ¨å¾ˆå¤šåœ°æ–¹ä½¿ç”¨ [Mesh] 实例,它å…" -"许é‡å¤ä½¿ç”¨å‡ 何体并节çœèµ„æºã€‚当 [Mesh] å¿…é¡»åœ¨å¾ˆè¿‘çš„åœ°æ–¹è¢«å®žä¾‹åŒ–è¶…è¿‡æ•°åƒæ¬¡æ—¶ï¼Œ" -"å¯ä»¥è€ƒè™‘在 [MultiMeshInstance] ä¸ä½¿ç”¨ [MultiMesh] æ¥ä»£æ›¿ã€‚" +"MeshInstance 节点å¯ä»¥æºå¸¦ [Mesh] 资æºï¼Œåˆ›å»ºå…¶å®žä¾‹å¹¶æ·»åŠ åˆ°å½“å‰åœºæ™¯ä¸ã€‚这是渲" +"染 3D å‡ ä½•ä½“æ—¶æœ€å¸¸ç”¨çš„ç±»ï¼Œè¿™å¯ä»¥å°†å•个 [Mesh] åœ¨å¤šå¤„å®žä¾‹åŒ–ã€‚è¿™æ ·å°±èƒ½å¤Ÿé‡å¤ä½¿" +"ç”¨å‡ ä½•ä½“å¹¶èŠ‚çœèµ„æºã€‚当 [Mesh] å¿…é¡»åœ¨å¾ˆè¿‘çš„åœ°æ–¹è¢«å®žä¾‹åŒ–è¶…è¿‡æ•°åƒæ¬¡æ—¶ï¼Œå¯ä»¥è€ƒè™‘" +"在 [MultiMeshInstance] ä¸ä½¿ç”¨ [MultiMesh] æ¥ä»£æ›¿ã€‚" #: doc/classes/MeshInstance.xml msgid "" @@ -43798,8 +43975,8 @@ msgid "" "The [Texture] that will be used if using the default [CanvasItemMaterial]. " "Can be accessed as [code]TEXTURE[/code] in CanvasItem shader." msgstr "" -"如果使用默认的[CanvasItemMaterial],就会使用[Texture]。å¯ä»¥åœ¨CanvasItemç€è‰²å™¨" -"ä¸ä½œä¸º[code]TEXTURE[/code]访问。" +"如果使用默认的 [CanvasItemMaterial],就会使用 [Texture]。å¯ä»¥åœ¨ CanvasItem ç€" +"色器ä¸ä½œä¸º [code]TEXTURE[/code] 访问。" #: doc/classes/MeshInstance2D.xml doc/classes/MultiMeshInstance2D.xml msgid "Emitted when the [member texture] is changed." @@ -44174,12 +44351,15 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" -"通过[i]乘以[/i]ç½‘æ ¼çš„çŽ°æœ‰é¡¶ç‚¹é¢œè‰²æ¥è®¾ç½®ç‰¹å®šå®žä¾‹çš„颜色。\n" -"为了使颜色生效,请确ä¿[MultiMesh]上的[member color_format]䏿˜¯[code]null[/" -"code],并且[member SpatialMaterial.vertex_color_use_as_albedo]上的æè´¨æ˜¯" -"[code]true[/code]。" +"é€šè¿‡ä¸Žè¯¥ç½‘æ ¼çš„çŽ°æœ‰é¡¶ç‚¹é¢œè‰²åš[i]乘法[/i]æ¥è®¾ç½®æŒ‡å®šå®žä¾‹çš„颜色。\n" +"è¦è®©é¢œè‰²ç”Ÿæ•ˆï¼Œè¯·ç¡®ä¿è¯¥ [MultiMesh] çš„ [member color_format] éž [code]null[/" +"code],并且æè´¨çš„ [member SpatialMaterial.vertex_color_use_as_albedo] 为 " +"[code]true[/code]。如果颜色看上去ä¸å¯¹ï¼Œè¯·ç¡®ä¿æè´¨çš„å照率颜色为纯白" +"([code]Color(1, 1, 1)[/code])。" #: doc/classes/MultiMesh.xml msgid "" @@ -44435,7 +44615,7 @@ msgid "" "[code]id[/code] (see [method NetworkedMultiplayerPeer.set_target_peer]). " "Default ID is [code]0[/code], i.e. broadcast to all peers." msgstr "" -"将给定的原始å—节 [code]bytes[/code]å‘é€åˆ°ç”± [code]id[/code] 确定的特定对ç‰ä½“" +"将给定的原始å—节 [code]bytes[/code] å‘é€åˆ°ç”± [code]id[/code] 确定的特定对ç‰ä½“" "ï¼ˆè§ [method NetworkedMultiplayerPeer.set_target_peer])。默认 ID 是 " "[code]0[/code],å³å‘所有对ç‰ä½“广æ’。" @@ -44621,7 +44801,7 @@ msgid "" "Behave like [constant RPC_MODE_MASTER] but also make the call or property " "change locally. Analogous to the [code]mastersync[/code] keyword." msgstr "" -"类似于 [constant RPC_MODE_MASTER]ï¼Œä½†ä¹Ÿä½¿æ–¹æ³•è°ƒç”¨æˆ–å±žæ€§æ”¹å˜æœ¬åœ°ã€‚类似于 " +"行为类似于 [constant RPC_MODE_MASTER]ï¼Œä½†ä¹Ÿä½¿æ–¹æ³•è°ƒç”¨æˆ–å±žæ€§æ”¹å˜æœ¬åœ°ã€‚类似于 " "[code]mastersync[/code] 关键å—。" #: doc/classes/MultiplayerAPI.xml @@ -44663,9 +44843,9 @@ msgid "" "[b]Note:[/b] This function returns [constant OK] if the thread already has " "ownership of the mutex." msgstr "" -"试图é”定æ¤[Mutex],但并ä¸é˜»å¡žã€‚æˆåŠŸæ—¶è¿”å›ž[constant OK],å¦åˆ™è¿”回[constant " +"试图é”å®šæ¤ [Mutex],但并ä¸é˜»å¡žã€‚æˆåŠŸæ—¶è¿”å›ž [constant OK],å¦åˆ™è¿”回 [constant " "ERR_BUSY]。\n" -"[b]注æ„:[/b]å¦‚æžœçº¿ç¨‹å·²ç»æ‹¥æœ‰äº†è¯¥Mutex的所有æƒï¼Œè¯¥å‡½æ•°è¿”回[constant OK]。" +"[b]注æ„:[/b]å¦‚æžœçº¿ç¨‹å·²ç»æ‹¥æœ‰äº†è¯¥ Mutex 的所有æƒï¼Œè¯¥å‡½æ•°è¿”回 [constant OK]。" #: doc/classes/Mutex.xml msgid "" @@ -44720,7 +44900,7 @@ msgid "" msgstr "" "æž„å»ºåŸºç¡€ç±»åž‹çš„æ–°å¯¹è±¡ï¼Œå¹¶é™„åŠ æ¤ç±»åž‹çš„脚本。\n" "[b]注æ„:[/b]ä¼ é€’ç»™è¿™ä¸ªå‡½æ•°çš„ä»»ä½•å‚æ•°å°†è¢«å¿½ç•¥ï¼Œä¸ä¼šä¼ é€’ç»™å±€éƒ¨æž„é€ å‡½æ•°ã€‚è¿™å°†åœ¨" -"未æ¥çš„APIæ‰©å±•ä¸æ”¹å˜ã€‚" +"未æ¥çš„ API æ‰©å±•ä¸æ”¹å˜ã€‚" #: doc/classes/Navigation.xml msgid "Mesh-based navigation and pathfinding node." @@ -45475,7 +45655,7 @@ msgstr "忽略 Y 轴上的碰撞。在水平é¢ä¸Šç§»åŠ¨æ—¶å¿…é¡»ä¸º [code]true[ #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "The maximum number of neighbors for the agent to consider." -msgstr "ä»£ç†æ‰€éœ€è€ƒè™‘的最大邻居数。" +msgstr "è¯¥ä»£ç†æ‰€éœ€è€ƒè™‘的最大邻居数。" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "The maximum speed that an agent can move." @@ -45578,8 +45758,10 @@ msgstr "抵达由 [method set_target_location] è®¾ç½®çš„çŽ©å®¶å®šä¹‰ç›®æ ‡æ—¶å‘ #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." -msgstr "调用 [method set_velocity] åŽï¼Œè®¡ç®—出防撞速度时å‘出通知。" +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." +msgstr "" +"调用 [method set_velocity] åŽï¼Œè®¡ç®—出防撞速度时å‘出通知。仅在 [member " +"avoidance_enabled] 为真时å‘出。" #: doc/classes/NavigationAgent2D.xml msgid "2D agent used in navigation for collision avoidance." @@ -45680,14 +45862,14 @@ msgid "" "environment are traversable to aid agents in pathfinding through complicated " "spaces." msgstr "" -"å¯¼èˆªç½‘æ ¼æ˜¯å¤šè¾¹å½¢çš„é›†åˆï¼Œç”¨äºŽå®šä¹‰çŽ¯å¢ƒä¸çš„哪些区域是å¯é历的,以帮助代ç†åœ¨å¤æ‚" +"å¯¼èˆªç½‘æ ¼æ˜¯å¤šè¾¹å½¢çš„é›†åˆï¼Œç”¨äºŽå®šä¹‰çŽ¯å¢ƒä¸çš„哪些区域是å¯ä»¥ç©¿è¶Šçš„,帮助代ç†åœ¨å¤æ‚" "的空间ä¸å¯»è·¯ã€‚" #: doc/classes/NavigationMesh.xml doc/classes/NavigationPolygon.xml msgid "" "Adds a polygon using the indices of the vertices you get when calling " "[method get_vertices]." -msgstr "使用调用[method get_vertices]å¾—åˆ°çš„é¡¶ç‚¹çš„ç´¢å¼•æ·»åŠ ä¸€ä¸ªå¤šè¾¹å½¢ã€‚" +msgstr "使用调用 [method get_vertices] å¾—åˆ°çš„é¡¶ç‚¹çš„ç´¢å¼•æ·»åŠ ä¸€ä¸ªå¤šè¾¹å½¢ã€‚" #: doc/classes/NavigationMesh.xml msgid "" @@ -45711,7 +45893,7 @@ msgstr "" msgid "" "Returns a [PoolIntArray] containing the indices of the vertices of a created " "polygon." -msgstr "返回包å«åˆ›å»ºçš„多边形顶点索引的[PoolIntArray]。" +msgstr "返回包å«åˆ›å»ºçš„多边形顶点索引的 [PoolIntArray]。" #: doc/classes/NavigationMesh.xml msgid "Returns the number of polygons in the navigation mesh." @@ -45721,7 +45903,7 @@ msgstr "è¿”å›žå¯¼èˆªç½‘æ ¼ä¸çš„多边形数é‡ã€‚" msgid "" "Returns a [PoolVector3Array] containing all the vertices being used to " "create the polygons." -msgstr "返回包å«ç”¨äºŽåˆ›å»ºå¤šè¾¹å½¢çš„æ‰€æœ‰é¡¶ç‚¹çš„[PoolVector3Array]。" +msgstr "返回包å«ç”¨äºŽåˆ›å»ºå¤šè¾¹å½¢çš„æ‰€æœ‰é¡¶ç‚¹çš„ [PoolVector3Array]。" #: doc/classes/NavigationMesh.xml msgid "" @@ -45739,7 +45921,7 @@ msgstr "" msgid "" "Sets the vertices that can be then indexed to create polygons with the " "[method add_polygon] method." -msgstr "设置顶点,然åŽä½¿ç”¨ [method add_polygon] 方法创建多边形。" +msgstr "设置顶点,å¯ä»¥ä½¿ç”¨ [method add_polygon] 方法对其进行索引,创建多边形。" #: doc/classes/NavigationMesh.xml msgid "" @@ -45781,7 +45963,7 @@ msgstr "ç”¨äºŽå—æ®µ Y è½´å•元的尺寸。" #: doc/classes/NavigationMesh.xml msgid "" "The sampling distance to use when generating the detail mesh, in cell unit." -msgstr "生æˆç»†åˆ†ç½‘æ ¼æ—¶ä½¿ç”¨çš„é‡‡æ ·è·ç¦»ï¼Œä»¥å•元为å•ä½ã€‚" +msgstr "生æˆç»†åˆ†ç½‘æ ¼æ—¶ä½¿ç”¨çš„é‡‡æ ·è·ç¦»ï¼Œä»¥å•å…ƒæ ¼ä¸ºå•ä½ã€‚" #: doc/classes/NavigationMesh.xml msgid "" @@ -45802,7 +45984,7 @@ msgid "" "multiple of [member cell_size]." msgstr "" "æ²¿ç½‘æ ¼è¾¹ç•Œçš„è½®å»“çš„æœ€å¤§å…许长度。\n" -"[b]注æ„:[/b]烘焙时,这个值会å‘ä¸Šå–æ•´åˆ°æœ€æŽ¥è¿‘çš„[member cell_size]çš„å€æ•°ã€‚" +"[b]注æ„:[/b]烘焙时,这个值会å‘ä¸Šå–æ•´åˆ°æœ€æŽ¥è¿‘çš„ [member cell_size] çš„å€æ•°ã€‚" #: doc/classes/NavigationMesh.xml msgid "" @@ -45856,7 +46038,7 @@ msgstr "" msgid "" "The source of the geometry used when baking. See [enum SourceGeometryMode] " "for possible values." -msgstr "çƒ˜ç„™æ—¶ä½¿ç”¨çš„å‡ ä½•ä½“çš„æºã€‚å¯èƒ½çš„å–å€¼è§ [enum SourceGeometryMode]。" +msgstr "çƒ˜ç„™æ—¶ä½¿ç”¨çš„å‡ ä½•ä½“çš„æ¥æºã€‚å¯èƒ½çš„å–å€¼è§ [enum SourceGeometryMode]。" #: doc/classes/NavigationMesh.xml msgid "" @@ -45865,7 +46047,7 @@ msgid "" "SOURCE_GEOMETRY_GROUPS_WITH_CHILDREN] or [constant " "SOURCE_GEOMETRY_GROUPS_EXPLICIT]." msgstr "" -"è¦æ‰«æçš„å‡ ä½•ä½“ç»„çš„å称。\n" +"分组的åç§°ï¼Œä¼šåœ¨è¯¥åˆ†ç»„ä¸æ‰«æå‡ 何体。\n" "åªæœ‰å½“ [member geometry_source_geometry_mode] 是 [constant " "SOURCE_GEOMETRY_GROUPS_WITH_CHILDREN] 或 [constant " "SOURCE_GEOMETRY_GROUPS_EXPLICIT] æ—¶æ‰ä½¿ç”¨ã€‚" @@ -45884,8 +46066,8 @@ msgid "" "For example, a value of 20 will set the number of cells to 400." msgstr "" "如果å¯èƒ½çš„è¯ï¼Œä»»ä½•å°äºŽè¿™ä¸ªå°ºå¯¸çš„区域将与较大的区域åˆå¹¶ã€‚\n" -"[b]注æ„:[/b]这个值将被平方æ¥è®¡ç®—å•å…ƒæ ¼çš„æ•°é‡ã€‚例如,一个20的值将把å•å…ƒæ ¼çš„æ•°" -"é‡è®¾ä¸º400。" +"[b]注æ„:[/b]这个值将被平方æ¥è®¡ç®—å•å…ƒæ ¼çš„æ•°é‡ã€‚例如,值为 20 时将把å•å…ƒæ ¼çš„æ•°" +"é‡è®¾ä¸º 400。" #: doc/classes/NavigationMesh.xml msgid "" @@ -46093,13 +46275,13 @@ msgid "" "The cost of traveling distances inside this region can be controlled with " "the [member travel_cost] multiplier." msgstr "" -"[NavigationMesh] 的实例。[Navigation] èŠ‚ç‚¹æ ¹æ®å®ƒçš„ [NavigationMesh] " -"èµ„æºæ¥ç¡®å®šå“ªäº›å¯ä»¥è¿›è¡Œå¯¼èˆªã€å“ªäº›ä¸èƒ½ã€‚\n" +"[NavigationMesh] 的实例。[Navigation] èŠ‚ç‚¹æ ¹æ®å®ƒçš„ [NavigationMesh] èµ„æºæ¥ç¡®" +"定哪些å¯ä»¥è¿›è¡Œå¯¼èˆªã€å“ªäº›ä¸èƒ½ã€‚\n" "默认情况下,这个节点会在默认的 [World] 导航地图ä¸è¿›è¡Œæ³¨å†Œã€‚如果这个节点是 " "[Navigation] 节点的å项,就会在该导航节点的导航地图ä¸è¿›è¡Œæ³¨å†Œã€‚\n" "如果两个地图共享类似的边界,就å¯ä»¥ç›¸äº’è¿žæŽ¥ã€‚ä½ å¯ä»¥é€šè¿‡ [method " -"NavigationServer.map_set_edge_connection_margin] " -"设置两个顶点连接两æ¡è¾¹ç•Œæ‰€éœ€çš„æœ€å°è·ç¦»ã€‚\n" +"NavigationServer.map_set_edge_connection_margin] 设置两个顶点连接两æ¡è¾¹ç•Œæ‰€éœ€" +"的最å°è·ç¦»ã€‚\n" "[b]注æ„:[/b]å°†ä¸¤ä¸ªåœ°åŒºçš„å¯¼èˆªç½‘æ ¼ç›¸äº’é‡å å¹¶ä¸è¶³ä»¥å°†å…¶ç›¸è¿žã€‚它们必须共享类似的" "边界。\n" "从å¦ä¸€ä¸ªåœ°åŒºè¿›å…¥è¿™ä¸ªåœ°å›¾çš„æ¶ˆè€—å¯ä»¥é€šè¿‡ [member enter_cost] 进行控制。\n" @@ -46430,13 +46612,13 @@ msgid "" "The pathfinding cost of traveling distances inside this region can be " "controlled with the [member travel_cost] multiplier." msgstr "" -"导航地图上的地区。[Navigation2DServer] æ ¹æ®å®ƒçš„ [NavigationPolygon] " -"èµ„æºæ¥ç¡®å®šå“ªäº›å¯ä»¥è¿›è¡Œå¯¼èˆªã€å“ªäº›ä¸èƒ½ã€‚\n" +"导航地图上的地区。[Navigation2DServer] æ ¹æ®å®ƒçš„ [NavigationPolygon] èµ„æºæ¥ç¡®" +"定哪些å¯ä»¥è¿›è¡Œå¯¼èˆªã€å“ªäº›ä¸èƒ½ã€‚\n" "默认情况下,这个节点会在默认的 [World2D] 导航地图ä¸è¿›è¡Œæ³¨å†Œã€‚如果这个节点是 " "[Navigation2D] 节点的å项,就会在该导航节点的导航地图ä¸è¿›è¡Œæ³¨å†Œã€‚\n" "如果两个地图共享类似的边界,就å¯ä»¥ç›¸äº’è¿žæŽ¥ã€‚ä½ å¯ä»¥é€šè¿‡ [method " -"Navigation2DServer.map_set_edge_connection_margin] " -"设置两个顶点连接两æ¡è¾¹ç•Œæ‰€éœ€çš„æœ€å°è·ç¦»ã€‚\n" +"Navigation2DServer.map_set_edge_connection_margin] 设置两个顶点连接两æ¡è¾¹ç•Œæ‰€" +"需的最å°è·ç¦»ã€‚\n" "[b]注æ„:[/b]å°†ä¸¤ä¸ªåœ°åŒºçš„å¯¼èˆªç½‘æ ¼ç›¸äº’é‡å å¹¶ä¸è¶³ä»¥å°†å…¶ç›¸è¿žã€‚它们必须共享类似的" "边界。\n" "从å¦ä¸€ä¸ªåœ°åŒºè¿›å…¥è¿™ä¸ªåœ°å›¾çš„寻路消耗å¯ä»¥é€šè¿‡ [member enter_cost] 进行控制。\n" @@ -46610,15 +46792,39 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." -msgstr "使用给定的 [code]peer_id[/code] åˆå§‹åŒ–该对ç‰ä½“(必须在 1 å’Œ 2147483647 " -"之间)。" +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." +msgstr "" +"使用给定的 [code]peer_id[/code] åˆå§‹åŒ–该对ç‰ä½“(必须在 1 å’Œ 2147483647 之" +"间)。\n" +"åªèƒ½åœ¨è¿žæŽ¥çжæ€ä¸º [constant NetworkedMultiplayerPeer.CONNECTION_CONNECTING] æ—¶" +"è°ƒç”¨ã€‚è§ [method set_connection_status]。" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." -msgstr "设置连接的状æ€ã€‚è§ [enum NetworkedMultiplayerPeer.ConnectionStatus]。" +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." +msgstr "" +"设置连接的状æ€ã€‚è§ [enum NetworkedMultiplayerPeer.ConnectionStatus]。\n" +"æ ¹æ®çжæ€çš„ä¸åŒï¼Œä»¥åŠè¯¥å¯¹ç‰ä½“的唯一网络 ID 是å¦ä¸º [code]1[/code]ï¼Œä¼šè§¦å‘ " +"[signal NetworkedMultiplayerPeer.connection_succeeded]ã€[signal " +"NetworkedMultiplayerPeer.connection_failed] 或 [signal " +"NetworkedMultiplayerPeer.server_disconnected] ä¿¡å·ã€‚\n" +"从 [constant NetworkedMultiplayerPeer.CONNECTION_DISCONNECTED] æ‰èƒ½å˜åˆ° " +"[constant NetworkedMultiplayerPeer.CONNECTION_CONNECTING],从 [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING] æ‰èƒ½å˜åˆ° [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTED]。" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "Set the max packet size that this peer can handle." @@ -46632,15 +46838,15 @@ msgid "" "it's received)." msgstr "" "当本地 [MultiplayerAPI] ç”Ÿæˆæ•°æ®åŒ…时触å‘。\n" -"ä½ çš„è„šæœ¬åº”å½“èŽ·å–这个数æ®åŒ…并将其通过网络å‘é€ç»™è¯·æ±‚的对ç‰ä½“(" -"å¯¹æ–¹æ”¶åˆ°è¯¥æ•°æ®æ—¶åº”当调用 [method deliver_packet])。" +"ä½ çš„è„šæœ¬åº”å½“èŽ·å–这个数æ®åŒ…并将其通过网络å‘é€ç»™è¯·æ±‚的对ç‰ä½“ï¼ˆå¯¹æ–¹æ”¶åˆ°è¯¥æ•°æ®æ—¶" +"应当调用 [method deliver_packet])。" #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml msgid "" "PacketPeer implementation using the [url=http://enet.bespin.org/index." "html]ENet[/url] library." msgstr "" -"使用[url=http://enet.bespin.org/index.html]ENet[/url]库实现PacketPeer。" +"使用 [url=http://enet.bespin.org/index.html]ENet[/url] 库实现 PacketPeer。" #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml msgid "" @@ -46772,8 +46978,9 @@ msgid "" "needs to be in IPv4 or IPv6 address format, for example: " "[code]\"192.168.1.1\"[/code]." msgstr "" -"创建æœåŠ¡å™¨æ—¶ä½¿ç”¨çš„IP。默认情况下,这被设置为通é…符[code]\"*\"[/code],它绑定" -"到所有å¯ç”¨çš„æŽ¥å£ã€‚IPåœ°å€æ ¼å¼ä¸ºIPv4或IPv6,例如:[code]\"192.168.1.1\"[/code]。" +"创建æœåŠ¡å™¨æ—¶ä½¿ç”¨çš„ IP。默认情况下,这被设置为通é…符 [code]\"*\"[/code],它绑" +"定到所有å¯ç”¨çš„æŽ¥å£ã€‚给定的 IP åœ°å€æ ¼å¼éœ€è¦æ˜¯ IPv4 或 IPv6,例如:" +"[code]\"192.168.1.1\"[/code]。" #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml msgid "" @@ -46932,8 +47139,8 @@ msgid "" "requiring the fewest CPU resources. This option may also be used to make " "network debugging using tools like Wireshark easier." msgstr "" -"æ— åŽ‹ç¼©ã€‚è¿™ä½¿ç”¨æœ€å¤šçš„å¸¦å®½ï¼Œä½†å…·æœ‰å 用最少 CPU 资æºçš„好处。这个选项å¯ä»¥ç”¨äºŽ" -"Wiresharkç‰å·¥å…·ä½¿ç”¨ï¼Œæ›´å®¹æ˜“进行网络调试。" +"æ— åŽ‹ç¼©ã€‚è¿™ä½¿ç”¨æœ€å¤šçš„å¸¦å®½ï¼Œä½†å…·æœ‰å 用最少 CPU 资æºçš„好处。这个选项å¯ä»¥ç”¨äºŽ " +"Wireshark ç‰å·¥å…·ä½¿ç”¨ï¼Œæ›´å®¹æ˜“进行网络调试。" #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml msgid "" @@ -46960,13 +47167,13 @@ msgid "" "packets smaller than 4 KB. Therefore, it's recommended to use other " "compression algorithms in most cases." msgstr "" -"[url=https://www.zlib.net/]Zlib[/url]压缩。与 [constant COMPRESS_FASTLZ] 相" +"[url=https://www.zlib.net/]Zlib[/url] 压缩。与 [constant COMPRESS_FASTLZ] 相" "比,这个选项使用较少的带宽,但代价是使用更多的 CPU 资æºã€‚请注æ„,这ç§ç®—法对å°" "于4KB的数æ®åŒ…䏿˜¯å¾ˆæœ‰æ•ˆã€‚å› æ¤ï¼Œå»ºè®®åœ¨å¤§å¤šæ•°æƒ…况下使用其他压缩算法。" #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml msgid "[url=https://facebook.github.io/zstd/]Zstandard[/url] compression." -msgstr "[url=https://facebook.github.io/zstd/]Zstandard[/url]压缩。" +msgstr "[url=https://facebook.github.io/zstd/]Zstandard[/url] 压缩。" #: doc/classes/NetworkedMultiplayerPeer.xml msgid "A high-level network interface to simplify multiplayer interactions." @@ -47068,8 +47275,8 @@ msgid "" "consider whether the order matters." msgstr "" "æ•°æ®åŒ…ä¸è¢«ç¡®è®¤ï¼Œå¯¹ä¸¢å¤±çš„æ•°æ®åŒ…ä¸è¿›è¡Œé‡å‘å°è¯•。数æ®åŒ…å¯ä»¥ä»¥ä»»ä½•顺åºåˆ°è¾¾ã€‚å¯èƒ½" -"比[constant TRANSFER_MODE_UNRELIABLE_ORDERED]快。用于éžå…³é”®æ•°æ®ï¼Œå¹¶æ³¨æ„考虑顺" -"åºæ˜¯å¦é‡è¦ã€‚" +"比 [constant TRANSFER_MODE_UNRELIABLE_ORDERED] 快。用于éžå…³é”®æ•°æ®ï¼Œå¹¶æ³¨æ„考虑" +"é¡ºåºæ˜¯å¦é‡è¦ã€‚" #: doc/classes/NetworkedMultiplayerPeer.xml msgid "" @@ -47080,8 +47287,8 @@ msgid "" "example movement and positional data." msgstr "" "æ•°æ®åŒ…ä¸è¢«ç¡®è®¤ï¼Œå¯¹ä¸¢å¤±çš„æ•°æ®åŒ…ä¸è¿›è¡Œé‡å‘å°è¯•。数æ®åŒ…按其å‘é€é¡ºåºæŽ¥æ”¶ã€‚有å¯èƒ½" -"比[constant TRANSFER_MODE_RELIABLE]快。用于éžå…³é”®æ•°æ®æˆ–由于é‡å‘å°è¯•而迟迟ä¸èƒ½" -"收到的数æ®ï¼Œä¾‹å¦‚è¿åŠ¨å’Œä½ç½®æ•°æ®ã€‚" +"比 [constant TRANSFER_MODE_RELIABLE] 快。用于éžå…³é”®æ•°æ®æˆ–由于é‡å‘å°è¯•而迟迟ä¸" +"能收到的数æ®ï¼Œä¾‹å¦‚è¿åŠ¨å’Œä½ç½®æ•°æ®ã€‚" #: doc/classes/NetworkedMultiplayerPeer.xml msgid "" @@ -47094,8 +47301,8 @@ msgid "" msgstr "" "æ•°æ®åŒ…必须被接收,并应进行é‡å‘å°è¯•,直到数æ®åŒ…被确认。数æ®åŒ…必须按照其å‘é€çš„" "é¡ºåºæŽ¥æ”¶ã€‚æœ€å¯é çš„ä¼ è¾“æ¨¡å¼ï¼Œä½†ç”±äºŽå¼€é”€å¾ˆå¤§ï¼Œå¯èƒ½æ˜¯æœ€æ…¢çš„。用于必须按顺åºä¼ 输" -"和到达的关键数æ®ï¼Œä¾‹å¦‚,æ£åœ¨è§¦å‘的能力或èŠå¤©ä¿¡æ¯ã€‚ä»”ç»†è€ƒè™‘ä¿¡æ¯æ˜¯å¦çœŸçš„æ˜¯å…³é”®" -"的,并尽é‡å°‘用。" +"和到达的关键数æ®ï¼Œä¾‹å¦‚触å‘的能力或èŠå¤©ä¿¡æ¯ã€‚ä»”ç»†è€ƒè™‘ä¿¡æ¯æ˜¯å¦çœŸçš„æ˜¯å…³é”®çš„,并" +"å°½é‡å°‘用。" #: doc/classes/NetworkedMultiplayerPeer.xml msgid "The ongoing connection disconnected." @@ -47444,8 +47651,8 @@ msgstr "" "set_input_as_handled]。\n" "对于游æˆè¾“入,[method _unhandled_input] å’Œ [method _unhandled_key_input] 通常" "更适åˆï¼Œå› 为它们å…许 GUI 首先拦截事件。\n" -"[b]注æ„:[/b]è¿™ä¸ªæ–¹æ³•åªæœ‰åœ¨èŠ‚ç‚¹å˜åœ¨äºŽåœºæ™¯æ ‘䏿—¶æ‰ä¼šè¢«è°ƒç”¨ï¼ˆä¹Ÿå°±æ˜¯è¯´ï¼Œå¦‚果它" -"éžâ€œå¤å„¿â€ï¼‰ã€‚" +"[b]注æ„:[/b]è¿™ä¸ªæ–¹æ³•åªæœ‰åœ¨èŠ‚ç‚¹å˜åœ¨äºŽåœºæ™¯æ ‘䏿—¶æ‰ä¼šè¢«è°ƒç”¨ï¼ˆä¹Ÿå°±æ˜¯è¯´ï¼Œå¦‚果它ä¸" +"是“å¤å„¿â€ï¼‰ã€‚" #: doc/classes/Node.xml msgid "" @@ -47508,8 +47715,8 @@ msgid "" "call with [method request_ready], which may be called anywhere before adding " "the node again." msgstr "" -"å½“èŠ‚ç‚¹â€œå°±ç»ªâ€æ—¶è¢«è°ƒç”¨ã€‚å节点的 [method _ready] 回调会首先被触å‘,而父节点会在" -"ä¹‹åŽæ”¶åˆ°å°±ç»ªé€šçŸ¥ã€‚\n" +"å½“è¯¥èŠ‚ç‚¹â€œå°±ç»ªâ€æ—¶è¢«è°ƒç”¨ã€‚å节点的 [method _ready] 回调会首先被触å‘,而父节点会" +"åœ¨ä¹‹åŽæ”¶åˆ°å°±ç»ªé€šçŸ¥ã€‚\n" "对应于 [method Object._notification] ä¸çš„ [constant NOTIFICATION_READY] 通" "知。也请å‚阅å˜é‡çš„ [code]onready[/code] 关键å—。\n" "通常用于åˆå§‹åŒ–。对于更早的åˆå§‹åŒ–,å¯ä»¥ä½¿ç”¨ [method Object._init]。也请å‚阅 " @@ -47625,10 +47832,10 @@ msgid "" "will have a human-readable name based on the name of the node being " "instanced instead of its type." msgstr "" -"æ·»åŠ [code]child_node[/code]作为å节点。该å节点在å节点列表ä¸è¢«ç½®äºŽç»™å®šçš„" -"[code]node[/code]之下。\n" -"如果[code]legible_unique_name[/code]是[code]true[/code],å节点将有一个基于被" -"实例化的节点åç§°ï¼Œè€Œä¸æ˜¯å…¶ç±»åž‹å¯è¯»çš„å称。" +"å°† [code]child_node[/code] æ·»åŠ ä¸ºå节点。该å节点在å节点列表ä¸è¢«ç½®äºŽç»™å®šçš„ " +"[code]node[/code] 之下。\n" +"如果 [code]legible_unique_name[/code] 为 [code]true[/code],å节点将有一个基" +"于被实例化的节点åç§°ï¼Œè€Œä¸æ˜¯å…¶ç±»åž‹å¯è¯»çš„å称。" #: doc/classes/Node.xml msgid "" @@ -47685,10 +47892,10 @@ msgid "" "constructor arguments (i.e. needs to supply arguments to [method Object." "_init] method). In that case, the node will be duplicated without a script." msgstr "" -"å¤åˆ¶èŠ‚ç‚¹ï¼Œè¿”å›žä¸€ä¸ªæ–°çš„èŠ‚ç‚¹ã€‚\n" -"ä½ å¯ä»¥ä½¿ç”¨[code]flags[/code]æ¥å¾®è°ƒè¿™ä¸ªè¡Œä¸ºï¼ˆè§[enum DuplicateFlags])。\n" -"[b]注æ„:[/b]如果节点包å«ä¸€ä¸ªå¸¦æœ‰æž„é€ å‚æ•°çš„脚本(å³éœ€è¦å‘[method Object." -"_init]方法æä¾›å‚数),它将ä¸èƒ½æ£å¸¸å·¥ä½œã€‚åœ¨è¿™ç§æƒ…况下,节点将被å¤åˆ¶è€Œæ²¡æœ‰è„š" +"å¤åˆ¶è¯¥èŠ‚ç‚¹ï¼Œè¿”å›žä¸€ä¸ªæ–°çš„èŠ‚ç‚¹ã€‚\n" +"ä½ å¯ä»¥ä½¿ç”¨ [code]flags[/code] æ¥å¾®è°ƒè¿™ä¸ªè¡Œä¸ºï¼ˆè§ [enum DuplicateFlags])。\n" +"[b]注æ„:[/b]如果节点包å«ä¸€ä¸ªå¸¦æœ‰æž„é€ å‚æ•°çš„脚本(å³éœ€è¦å‘ [method Object." +"_init] 方法æä¾›å‚数),它将ä¸èƒ½æ£å¸¸å·¥ä½œã€‚åœ¨è¿™ç§æƒ…况下,节点将被å¤åˆ¶è€Œæ²¡æœ‰è„š" "本。" #: doc/classes/Node.xml @@ -47746,9 +47953,9 @@ msgid "" "method is often used for iterating all children of a node.\n" "To access a child node via its name, use [method get_node]." msgstr "" -"按索引返回一个å节点(è§[method get_child_count])。这个方法ç»å¸¸è¢«ç”¨äºŽé历一" +"按索引返回一个åèŠ‚ç‚¹ï¼ˆè§ [method get_child_count])。这个方法ç»å¸¸è¢«ç”¨äºŽé历一" "个节点的所有å节点。\n" -"è¦é€šè¿‡ä¸€ä¸ªå节点的åå—访问它,请使用[method get_node]。" +"è¦é€šè¿‡ä¸€ä¸ªå节点的åå—访问它,请使用 [method get_node]。" #: doc/classes/Node.xml msgid "Returns the number of child nodes." @@ -47793,13 +48000,13 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Returns the node's index, i.e. its position among the siblings of its parent." -msgstr "返回节点的索引,å³å®ƒåœ¨å…¶çˆ¶èŠ‚ç‚¹çš„å…„å¼ŸèŠ‚ç‚¹ä¸çš„ä½ç½®ã€‚" +msgstr "返回该节点的索引,å³å®ƒåœ¨å…¶çˆ¶èŠ‚ç‚¹çš„å…„å¼ŸèŠ‚ç‚¹ä¸çš„ä½ç½®ã€‚" #: doc/classes/Node.xml msgid "" "Returns the peer ID of the network master for this node. See [method " "set_network_master]." -msgstr "返回æ¤èŠ‚ç‚¹çš„ç½‘ç»œä¸»èŠ‚ç‚¹çš„å¯¹ç‰ IDã€‚è§ [method set_network_master]。" +msgstr "è¿”å›žè¿™ä¸ªèŠ‚ç‚¹çš„ç½‘ç»œä¸»èŠ‚ç‚¹çš„å¯¹ç‰ IDã€‚è§ [method set_network_master]。" #: doc/classes/Node.xml msgid "" @@ -47990,7 +48197,7 @@ msgstr "如果给定节点是当å‰èŠ‚ç‚¹çš„ç›´æŽ¥æˆ–é—´æŽ¥å节点,则返回 msgid "" "Returns [code]true[/code] if the node is folded (collapsed) in the Scene " "dock." -msgstr "如果节点在场景dockä¸æŠ˜å (collapsed),则返回 [code]true[/code]。" +msgstr "å¦‚æžœè¯¥èŠ‚ç‚¹åœ¨åœºæ™¯é¢æ¿ä¸æŠ˜å ,则返回 [code]true[/code]。" #: doc/classes/Node.xml msgid "" @@ -48225,10 +48432,10 @@ msgid "" "of it. After using [code]raise[/code], a Control will be drawn on top of its " "siblings." msgstr "" -"å°†æ¤èŠ‚ç‚¹ç§»åˆ°çˆ¶èŠ‚ç‚¹çš„å节点层次的底部。这在GUI([Control]节点)ä¸é€šå¸¸å¾ˆæœ‰ç”¨ï¼Œ" -"å› ä¸ºå®ƒä»¬çš„ç»˜åˆ¶é¡ºåºå–å†³äºŽå®ƒä»¬åœ¨æ ‘ä¸çš„顺åºã€‚最上é¢çš„节点首先被绘制出æ¥ï¼Œç„¶åŽåœ¨" -"å±‚æ¬¡ç»“æž„ä¸æœ€ä¸Šé¢çš„节点下é¢çš„æ‰€æœ‰åŒçº§è¢«ä¾æ¬¡ç»˜åˆ¶åœ¨å®ƒçš„上é¢ã€‚使用[code]raise[/" -"code]åŽï¼Œä¸€ä¸ªæŽ§ä»¶å°†è¢«ç»˜åˆ¶åœ¨å…¶åŒçº§çš„上é¢ã€‚" +"将这个节点移到父节点的å节点层次的底部。这在 GUI([Control]节点)ä¸é€šå¸¸å¾ˆæœ‰" +"ç”¨ï¼Œå› ä¸ºå®ƒä»¬çš„ç»˜åˆ¶é¡ºåºå–å†³äºŽå®ƒä»¬åœ¨æ ‘ä¸çš„顺åºã€‚最上é¢çš„节点首先被绘制出æ¥ï¼Œç„¶" +"åŽåœ¨å±‚æ¬¡ç»“æž„ä¸æœ€ä¸Šé¢çš„节点下é¢çš„æ‰€æœ‰åŒçº§è¢«ä¾æ¬¡ç»˜åˆ¶åœ¨å®ƒçš„上é¢ã€‚使用 " +"[code]raise[/code] åŽï¼ŒæŽ§ä»¶å°†è¢«ç»˜åˆ¶åœ¨å…¶åŒçº§ä¹‹ä¸Šã€‚" #: doc/classes/Node.xml msgid "" @@ -48595,8 +48802,8 @@ msgid "" "character, which is reserved for unique names when using [method add_child]. " "When setting the name manually, any [code]@[/code] will be removed." msgstr "" -"节点的å称。æ¤å称在兄弟节点(æ¥è‡ªåŒä¸€çˆ¶èŠ‚ç‚¹çš„å…¶ä»–åèŠ‚ç‚¹ï¼‰ä¸æ˜¯å”¯ä¸€çš„。当设置" -"为现有å称时,节点将自动é‡å‘½å。\n" +"该节点的å称。这个å称在兄弟节点(æ¥è‡ªåŒä¸€çˆ¶èŠ‚ç‚¹çš„å…¶ä»–åèŠ‚ç‚¹ï¼‰ä¸æ˜¯å”¯ä¸€çš„。当" +"设置为现有å称时,节点将自动é‡å‘½å。\n" "[b]注æ„:[/b]自动生æˆçš„åç§°å¯èƒ½åŒ…å« [code]@[/code] å—符,在使用 [method " "add_child] æ—¶ä¿ç•™è¯¥å—符用于唯一å称。手动设置åç§°æ—¶ï¼Œå°†åˆ é™¤ä»»ä½• [code]@[/" "code]。" @@ -48617,9 +48824,10 @@ msgid "" "will not be visible in the scene tree, though it will be visible in the " "2D/3D view." msgstr "" -"节点的所有者。节点的所有者å¯ä»¥æ˜¯ä»»ä½•å…¶ä»–èŠ‚ç‚¹ï¼ˆéœ€è¦æ˜¯çˆ¶èŠ‚ç‚¹æˆ–ç¥–çˆ¶èŠ‚ç‚¹ç‰ï¼Œå³åœº" -"æ™¯æ ‘ä¸Šçš„ç¥–å…ˆï¼‰ã€‚ï¼ˆé€šè¿‡ [PackedScene])ä¿å˜ä¸€ä¸ªèŠ‚ç‚¹æ—¶ï¼Œå®ƒæ‹¥æœ‰çš„æ‰€æœ‰èŠ‚ç‚¹ä¹Ÿä¼šéš" -"之ä¿å˜ã€‚è¿™æ ·å°±å¯ä»¥åˆ›å»ºå¤æ‚çš„ [SceneTree],能够进行实例化与次实例化。\n" +"该节点的所有者。节点的所有者å¯ä»¥æ˜¯ä»»ä½•å…¶ä»–èŠ‚ç‚¹ï¼ˆéœ€è¦æ˜¯æ²¿åœºæ™¯æ ‘å‘上的有效节" +"点,如父节点ã€ç¥–父节点ç‰ï¼‰ã€‚(通过 [PackedScene])ä¿å˜èŠ‚ç‚¹æ—¶ï¼Œå®ƒæ‹¥æœ‰çš„æ‰€æœ‰èŠ‚" +"点也会éšä¹‹ä¿å˜ã€‚è¿™æ ·å°±å¯ä»¥åˆ›å»ºå¤æ‚çš„ [SceneTree],能够进行实例化与次实例" +"化。\n" "[b]注æ„:[/b]如果想è¦å°†å节点æŒä¹…化进 [PackedScene],除了调用 [method " "add_child] ä¹‹å¤–ä½ è¿˜å¿…é¡»è®¾ç½® [member owner]。通常在[url=$DOCS_URL/tutorials/" "plugins/running_code_in_the_editor.html]工具脚本[/url]å’Œ[url=$DOCS_URL/" @@ -48650,7 +48858,7 @@ msgid "" "process priority value is [i]lower[/i] will have their processing callbacks " "executed first." msgstr "" -"节点在已å¯ç”¨çš„处ç†å›žè°ƒï¼ˆå³ [constant NOTIFICATION_PROCESS]ã€[constant " +"该节点在已å¯ç”¨çš„处ç†å›žè°ƒï¼ˆå³ [constant NOTIFICATION_PROCESS]ã€[constant " "NOTIFICATION_PHYSICS_PROCESS] åŠå…¶å†…部对应物)的执行顺åºä¸çš„优先级。进程优先" "级值[i]较低[/i]的节点将首先执行其处ç†å›žè°ƒã€‚" @@ -50342,8 +50550,8 @@ msgid "" msgstr "" "为这个 [OmniLight] 使用的阴影渲染模å¼ã€‚è§ [enum ShadowMode]。\n" "[b]注æ„:[/b]在 GLES2 ä¸ï¼Œåªæœ‰æ”¯æŒæ·±åº¦ç«‹æ–¹ä½“贴图功能的 GPU æ‰æ”¯æŒ [constant " -"SHADOW_CUBE]。Radeon HD 4000 系列ç‰è¾ƒè€çš„ GPU " -"䏿”¯æŒç«‹æ–¹ä½“è´´å›¾é˜´å½±ï¼Œå› æ¤ä¼šå›žé€€åˆ°ä½¿ç”¨åŒæŠ›ç‰©é¢é˜´å½±ã€‚" +"SHADOW_CUBE]。Radeon HD 4000 系列ç‰è¾ƒè€çš„ GPU 䏿”¯æŒç«‹æ–¹ä½“è´´å›¾é˜´å½±ï¼Œå› æ¤ä¼šå›ž" +"é€€åˆ°ä½¿ç”¨åŒæŠ›ç‰©é¢é˜´å½±ã€‚" #: doc/classes/OmniLight.xml msgid "" @@ -50358,8 +50566,8 @@ msgid "" "SHADOW_DUAL_PARABOLOID], but higher-quality. Only supported on GPUs that " "feature support for depth cubemaps." msgstr "" -"阴影被渲染至一个立方体贴图。比 [constant SHADOW_DUAL_PARABOLOID] " -"æ…¢ï¼Œä½†è´¨é‡æ›´é«˜ã€‚ä»…åœ¨æ”¯æŒæ·±åº¦ç«‹æ–¹ä½“贴图功能的 GPU 上支æŒã€‚" +"阴影被渲染至一个立方体贴图。比 [constant SHADOW_DUAL_PARABOLOID] æ…¢ï¼Œä½†è´¨é‡æ›´" +"é«˜ã€‚ä»…åœ¨æ”¯æŒæ·±åº¦ç«‹æ–¹ä½“贴图功能的 GPU 上支æŒã€‚" #: doc/classes/OmniLight.xml msgid "Use more detail vertically when computing the shadow." @@ -50488,8 +50696,8 @@ msgid "" "value of 1 means all the octaves have the same contribution, a value of 0.5 " "means each octave contributes half as much as the previous one." msgstr "" -"ä¸åŒå…«åº¦éŸ³é˜¶çš„è´¡çŒ®å› å。[code]persistence[/code]值为1表示所有的八度有相åŒçš„è´¡" -"献,值为0.5表示æ¯ä¸ªå…«åº¦çš„贡献是å‰ä¸€ä¸ªçš„一åŠã€‚" +"ä¸åŒå…«åº¦çš„è´¡çŒ®å› å。[code]persistence[/code] 值为 1 表示所有的八度有相åŒçš„è´¡" +"献,值为 0.5 表示æ¯ä¸ªå…«åº¦çš„贡献是å‰ä¸€ä¸ªçš„一åŠã€‚" #: modules/opensimplex/doc_classes/OpenSimplexNoise.xml msgid "" @@ -51614,13 +51822,17 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" "以秒为å•ä½è¿”回当å‰çš„ UNIX 纪元时间戳。\n" "[b]é‡è¦ï¼š[/b]这是用户å¯ä»¥æ‰‹åŠ¨è®¾ç½®çš„ç³»ç»Ÿæ—¶é’Ÿã€‚[b]永远ä¸è¦ä½¿ç”¨[/b]è¿™ç§æ–¹æ³•进行" "ç²¾ç¡®çš„æ—¶é—´è®¡ç®—ï¼Œå› ä¸ºå®ƒçš„ç»“æžœä¹Ÿä¼šå—到æ“作系统的自动调整。[b]始终使用[/b] " "[method get_ticks_usec] 或 [method get_ticks_msec] è¿›è¡Œç²¾ç¡®æ—¶é—´è®¡ç®—ï¼Œå› ä¸ºå®ƒä»¬" -"ä¿è¯æ˜¯å•è°ƒçš„ï¼ˆå³æ°¸ä¸å‡å°‘)。" +"ä¿è¯æ˜¯å•è°ƒçš„ï¼ˆå³æ°¸ä¸å‡å°‘)。\n" +"[b]注æ„:[/b]如果è¦èŽ·å–精度比秒更高的浮点数时间戳,请使用 [method Time." +"get_unix_time_from_system]。" #: doc/classes/OS.xml msgid "" @@ -51798,12 +52010,12 @@ msgid "" "template (debug or release), use [code]OS.has_feature(\"standalone\")[/code] " "instead." msgstr "" -"如果用于è¿è¡Œé¡¹ç›®çš„Godot二进制文件是[i]debug[/i]导出,或在编辑器ä¸è¿è¡Œæ—¶ï¼Œè¿”" -"回 [code]true[/code]。\n" -"如果用于è¿è¡Œé¡¹ç›®çš„Godot二进制文件是[i]release[/i]导出,则返回 [code]false[/" -"code]。\n" -"è¦æ£€æŸ¥ç”¨äºŽè¿è¡Œé¡¹ç›®çš„GodotäºŒè¿›åˆ¶æ–‡ä»¶æ˜¯å¦æ˜¯è¢«å¯¼å‡ºç‰ˆæœ¬ï¼ˆè°ƒè¯•或å‘布),请使用" -"[code]OS.has_feature(\"standalone\")[/code]代替。" +"如果用于è¿è¡Œé¡¹ç›®çš„ Godot 二进制文件是[i]调试[/i]导出模æ¿ï¼Œæˆ–是在编辑器ä¸è¿è¡Œ" +"时,则返回 [code]true[/code]。\n" +"如果用于è¿è¡Œé¡¹ç›®çš„ Godot 二进制文件是[i]å‘布[/i]导出模æ¿ï¼Œåˆ™è¿”回 " +"[code]false[/code]。\n" +"è¦æ£€æŸ¥ç”¨äºŽè¿è¡Œé¡¹ç›®çš„ Godot 二进制文件是å¦ä¸ºå¯¼å‡ºæ¨¡æ¿ï¼ˆè°ƒè¯•或å‘布),请使用 " +"[code]OS.has_feature(\"standalone\")[/code] 代替。" #: doc/classes/OS.xml msgid "" @@ -52904,10 +53116,9 @@ msgid "" "[constant ERR_OUT_OF_MEMORY]." msgstr "" "ç¼–ç [Variant] æ—¶å…许的最大缓冲区大å°ã€‚æé«˜æ¤å€¼ä»¥æ”¯æŒæ›´å¤§çš„内å˜åˆ†é…。\n" -"[method put_var] æ–¹æ³•åœ¨å †æ ˆä¸Šåˆ†é…内å˜ï¼Œä½¿ç”¨çš„缓冲区将自动增长到最接近的二次" -"æ–¹ï¼Œä»¥åŒ¹é… [Variant] 的大å°ã€‚如果 [Variant] 大于 " -"[code]encode_buffer_max_size[/code],则该方法将以 [constant " -"ERR_OUT_OF_MEMORY] 出错。" +"[method put_var] æ–¹æ³•åœ¨æ ˆä¸Šåˆ†é…内å˜ï¼Œä½¿ç”¨çš„缓冲区将自动增长到最接近的二次方," +"ä»¥åŒ¹é… [Variant] 的大å°ã€‚如果 [Variant] 大于 [code]encode_buffer_max_size[/" +"code],则该方法将以 [constant ERR_OUT_OF_MEMORY] 出错。" #: doc/classes/PacketPeerDTLS.xml msgid "DTLS packet peer." @@ -54632,7 +54843,7 @@ msgstr "" "返回一个包å«è¿åŠ¨çš„å®‰å…¨å’Œä¸å®‰å…¨æ¯”例(0 到 1 之间)的数组。安全比例是在没有碰撞" "的情况下å¯ä»¥è¿›è¡Œçš„è¿åŠ¨çš„æœ€å¤§æ¯”ä¾‹ã€‚ä¸å®‰å…¨æ¯”例是碰撞必须移动的è·ç¦»çš„æœ€å°éƒ¨åˆ†ã€‚" "如果没有检测到碰撞,将返回 [code][1.0, 1.0][/code] 的结果。\n" -"[b]注æ„:[/b]任何已ç»ç¢°æ’žçš„[Shape2D](比如内部的)会被忽略。使用 [method " +"[b]注æ„:[/b]任何已ç»ç¢°æ’žçš„ [Shape2D](比如内部的)会被忽略。使用 [method " "collide_shape] 确定形状已ç»ç¢°æ’žçš„ [Shape2D]。" #: doc/classes/Physics2DDirectSpaceState.xml @@ -54667,20 +54878,20 @@ msgid "" "[code]rid[/code]: The intersecting object's [RID].\n" "[code]shape[/code]: The shape index of the colliding shape." msgstr "" -"通过[Physics2DShapeQueryParameters]对象给出的形状与空间的检查交点。如果它与一" -"个以上的形状å‘生碰撞,则选择最近的一个。如果该形状没有与任何对象相交,那么将" -"返回一个空å—典。\n" -"[b]注æ„:[/b]这个方法ä¸è€ƒè™‘对象的[code]motion[/code]属性。返回的对象是包å«ä»¥" -"䏋嗿®µçš„å—典。\n" -"[code]collider_id[/code]:碰撞对象的ID。\n" -"[code]linear_velocity[/code]:碰撞物体的速度[Vector2]。如果对象是一个" -"[Area2D],结果是[code](0, 0)[/code]。\n" -"[code]metadata[/code]:相交形状的元数æ®ã€‚这个元数æ®ä¸Ž[method Object.get_meta]" -"ä¸åŒï¼Œå®ƒæ˜¯ç”¨[method Physics2DServer.shape_set_data]设置的。\n" -"[code]normal[/code]:ç‰©ä½“åœ¨äº¤ç‚¹å¤„çš„è¡¨é¢æ³•线。\n" -"[code]point[/code]:相交点。\n" -"[code]rid[/code]:相交物体的[RID]。\n" -"[code]shape[/code]:碰撞形状的形状索引。" +"通过 [Physics2DShapeQueryParameters] 对象给出的形状与空间的检查交点。如果它与" +"一个以上的形状å‘生碰撞,则选择最近的一个。如果该形状没有与任何对象相交,那么" +"将返回一个空å—典。\n" +"[b]注æ„:[/b]这个方法ä¸è€ƒè™‘对象的 [code]motion[/code] 属性。返回的对象是包å«" +"以䏋嗿®µçš„å—典。\n" +"[code]collider_id[/code]:碰撞对象的 ID。\n" +"[code]linear_velocity[/code]:碰撞物体的速度 [Vector2]。如果对象是一个 " +"[Area2D],结果是 [code](0, 0)[/code]。\n" +"[code]metadata[/code]:相交形状的元数æ®ã€‚这个元数æ®ä¸Ž [method Object." +"get_meta] ä¸åŒï¼Œå®ƒæ˜¯ç”¨ [method Physics2DServer.shape_set_data] 设置的。\n" +"[code]normal[/code]ï¼šç‰©ä½“åœ¨äº¤ç‚¹å¤„çš„è¡¨é¢æ³•线。\n" +"[code]point[/code]:相交点。\n" +"[code]rid[/code]:相交物体的 [RID]。\n" +"[code]shape[/code]:碰撞形状的形状索引。" #: doc/classes/Physics2DDirectSpaceState.xml msgid "" @@ -55912,7 +56123,7 @@ msgstr "" "返回一个包å«è¿åŠ¨çš„å®‰å…¨å’Œä¸å®‰å…¨æ¯”例(0 到 1 之间)的数组。安全比例是在没有碰撞" "的情况下å¯ä»¥è¿›è¡Œçš„è¿åŠ¨çš„æœ€å¤§æ¯”ä¾‹ã€‚ä¸å®‰å…¨æ¯”例是碰撞必须移动的è·ç¦»çš„æœ€å°éƒ¨åˆ†ã€‚" "如果未检测到碰撞,将返回 [code][1.0, 1.0][/code] 的结果。\n" -"[b]注æ„:[/b]任何已ç»ç¢°æ’žçš„[Shape2D](比如内部的)会被忽略。使用 [method " +"[b]注æ„:[/b]任何已ç»ç¢°æ’žçš„ [Shape2D](比如内部的)会被忽略。使用 [method " "collide_shape] 确定形状已ç»ç¢°æ’žçš„ [Shape]。" #: doc/classes/PhysicsDirectSpaceState.xml @@ -57622,7 +57833,8 @@ msgid "" "Returns a [String] with each element of the array joined with the given " "[code]delimiter[/code]." msgstr "" -"返回一个[String],数组的æ¯ä¸ªå…ƒç´ 都用给定的[code]delimiter[/code]分隔符连接。" +"返回一个 [String],数组的æ¯ä¸ªå…ƒç´ 都用给定的 [code]delimiter[/code] 分隔符连" +"接。" #: doc/classes/PoolStringArray.xml msgid "Appends a string element at end of the array." @@ -58270,8 +58482,12 @@ msgstr "" "[b]注æ„:[/b]被移除项åŽçš„é¡¹çš„ç´¢å¼•å°†è¢«ç§»ä½ 1。" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." -msgstr "将当å‰èšç„¦é¡¹ç›®è®¾ç½®ä¸ºç»™å®šçš„索引 [code]index[/code]。" +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." +msgstr "" +"将当å‰èšç„¦é¡¹ç›®è®¾ç½®ä¸ºç»™å®šçš„索引 [code]index[/code]。\n" +"å°† [code]-1[/code] ä½œä¸ºç´¢å¼•ä¼ å…¥ä¸ä¼šèšç„¦ä»»ä½•项目。" #: doc/classes/PopupMenu.xml msgid "Hides the [PopupMenu] when the window loses focus." @@ -58532,11 +58748,15 @@ msgstr "ç”¨äºŽæ˜¾ç¤ºå¸¦æœ‰é¢æ¿èƒŒæ™¯çš„弹出窗å£çš„类。" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" "ç”¨äºŽæ˜¾ç¤ºå…·æœ‰é¢æ¿èƒŒæ™¯çš„弹出窗å£çš„类。在æŸäº›æƒ…况下,它å¯èƒ½æ¯” [Popup] 更容易使" "ç”¨ï¼Œå› ä¸ºå®ƒæä¾›äº†ä¸€ä¸ªå¯é…ç½®çš„èƒŒæ™¯ã€‚å¦‚æžœä½ æ£åœ¨åˆ¶ä½œçª—å£ï¼Œæœ€å¥½æ˜¯æŸ¥çœ‹ " -"[WindowDialog]。" +"[WindowDialog]。\n" +"ä»»ä½•æ·»åŠ ä¸ºè¿™ä¸ª [PopupPanel] å项的 [Control] éƒ½ä¼šè¢«æ‹‰ä¼¸åˆ°ä¸Žé¢æ¿ä¸€æ ·çš„大å°" +"(与 [PanelContainer] 类似)。" #: doc/classes/PopupPanel.xml msgid "The background panel style of this [PopupPanel]." @@ -59490,10 +59710,17 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." -msgstr "" -"如果为 [code]true[/code],将å…许麦克风输入。导出到 Android 或 iOS 时须设置适" -"当的æƒé™ã€‚" +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." +msgstr "" +"如果为 [code]true[/code],会å…许麦克风输入。导出到 Android å’Œ iOS 时需è¦è®¾ç½®" +"åˆé€‚çš„æƒé™ã€‚\n" +"[b]注æ„:[/b]如果æ“ä½œç³»ç»Ÿï¼ˆæ ¹æ®è¯¥ç”¨æˆ·çš„éšç§è®¾ç½®ï¼‰é˜»æ¢äº†å¯¹éŸ³é¢‘输入设备的访问," +"那么音频æ•获åªä¼šè¿”回é™éŸ³ã€‚自 Windows 10 起,请确ä¿åœ¨æ“作系统的éšç§è®¾ç½®ä¸å…许" +"应用对麦克风的访问。" #: doc/classes/ProjectSettings.xml msgid "" @@ -59878,7 +60105,7 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "Maximum call stack allowed for debugging GDScript." -msgstr "调试GDScriptæ—¶å…è®¸çš„æœ€å¤§è°ƒç”¨å †æ ˆã€‚" +msgstr "调试 GDScript æ—¶å…è®¸çš„æœ€å¤§è°ƒç”¨å †æ ˆã€‚" #: doc/classes/ProjectSettings.xml msgid "" @@ -62805,11 +63032,29 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." -msgstr "" -"用于å¯ç”¨å„å‘异性的纹ç†çš„æœ€å¤§å„å‘异性过滤器级别。从倾斜角度查看时,较高的值将" -"导致更清晰的纹ç†ï¼Œä½†ä¼šç‰ºç‰²æ€§èƒ½ã€‚åªæœ‰äºŒçš„æŒ‡æ•°å€çš„值是有效(如 2ã€4ã€8ã€16)。" +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." +msgstr "" +"纹ç†å¼€å¯å„å‘异性时,所使用的å„å‘异性过滤的最大级别。值越高,斜视角观察到的纹" +"ç†è¶Šé”利,但性能消耗也更大。å–值åªå…许二的幂([code]2[/code]ã€[code]4[/" +"code]ã€[code]8[/code]ã€[code]16[/code]),例外是 [code]1[/code]ã€‚å– [code]1[/" +"code] 时会ç¦ç”¨å„å‘异性过滤,å³ä¾¿çº¹ç†ä¸Šæ˜¯å¯ç”¨çжæ€ã€‚\n" +"[b]注æ„:[/b]å‡ºäºŽæ€§èƒ½çš„åŽŸå› ï¼Œçº¹ç†[i]默认没有开å¯[/i]å„å‘异性过滤。è¦è®©è¿™ä¸ªè®¾" +"置起效,å¯ä»¥å¯ç”¨çº¹ç†çš„å„å‘异性过滤:在“文件系统â€é¢æ¿é‡Œé€‰ä¸çº¹ç†ï¼Œå†åˆ°â€œå¯¼å…¥â€é¢" +"æ¿ä¸å‹¾é€‰[b]å„å‘异性[/b]å¤é€‰æ¡†ï¼Œå†ç‚¹å‡»[b]釿–°å¯¼å…¥[/b]。ä¸è¿‡ï¼Œå„å‘异性过滤在 " +"2D 䏿²¡ä»€ä¹ˆç”¨ï¼Œæ‰€ä»¥è¯·åœ¨æœ‰å¯è§å·®åˆ«æ—¶æ‰åœ¨ 2D 纹ç†ä¸Šå¯ç”¨ã€‚\n" +"[b]注æ„:[/b]这个属性åªåœ¨é¡¹ç›®å¯åŠ¨æ—¶è¯»å–ã€‚ç›®å‰æ²¡æœ‰åœ¨è¿è¡Œæ—¶ä¿®æ”¹çš„æ–¹æ³•。" #: doc/classes/ProjectSettings.xml msgid "" @@ -63863,7 +64108,7 @@ msgstr "" "pcg-random.org/]PCG32[/url]。\n" "[b]注æ„:[/b]åº•å±‚ç®—æ³•æ˜¯å®žçŽ°ç»†èŠ‚ã€‚å› æ¤ï¼Œè·¨ Godot 版本的å¯é‡å¤éšæœºæµä¸åº”该ä¾èµ–" "于æ¤ã€‚\n" -"è¦æ ¹æ®æ—¶é—´ç›¸å…³ç§å生æˆéšæœºæµ®ç‚¹æ•°ï¼Œåœ¨ç»™å®šèŒƒå›´å†…ï¼š\n" +"è¦æ ¹æ®æ—¶é—´ç›¸å…³ç§å生æˆï¼ˆç»™å®šèŒƒå›´å†…çš„ï¼‰éšæœºæµ®ç‚¹æ•°ï¼š\n" "[codeblock]\n" "var rng = RandomNumberGenerator.new()\n" "func _ready():\n" @@ -63883,14 +64128,14 @@ msgid "" "Generates a pseudo-random float between [code]0.0[/code] and [code]1.0[/" "code] (inclusive)." msgstr "" -"生æˆä¸€ä¸ª[code]0.0[/code]å’Œ[code]1.0[/code]ï¼ˆåŒ…æ‹¬ç«¯ç‚¹ï¼‰ä¹‹é—´çš„ä¼ªéšæœºæµ®ç‚¹æ•°ã€‚" +"生æˆä¸€ä¸ª [code]0.0[/code] å’Œ [code]1.0[/code]ï¼ˆåŒ…æ‹¬ç«¯ç‚¹ï¼‰ä¹‹é—´çš„ä¼ªéšæœºæµ®ç‚¹æ•°ã€‚" #: doc/classes/RandomNumberGenerator.xml msgid "" "Generates a pseudo-random float between [code]from[/code] and [code]to[/" "code] (inclusive)." msgstr "" -"生æˆä¸€ä¸ª[code]from[/code]å’Œ[code]to[/code]ï¼ˆåŒ…æ‹¬ç«¯ç‚¹ï¼‰ä¹‹é—´çš„ä¼ªéšæœºæµ®ç‚¹æ•°ã€‚" +"生æˆä¸€ä¸ª [code]from[/code] å’Œ [code]to[/code]ï¼ˆåŒ…æ‹¬ç«¯ç‚¹ï¼‰ä¹‹é—´çš„ä¼ªéšæœºæµ®ç‚¹æ•°ã€‚" #: doc/classes/RandomNumberGenerator.xml msgid "" @@ -64040,14 +64285,14 @@ msgid "" "Maximum value. Range is clamped if [code]value[/code] is greater than " "[code]max_value[/code]." msgstr "" -"最大值。如果[code]value[/code]大于[code]max_value[/code],则会被范围é™åˆ¶ã€‚" +"最大值。如果 [code]value[/code] 大于 [code]max_value[/code],则会被范围é™åˆ¶ã€‚" #: doc/classes/Range.xml msgid "" "Minimum value. Range is clamped if [code]value[/code] is less than " "[code]min_value[/code]." msgstr "" -"最å°å€¼ã€‚如果[code]value[/code]å°äºŽ[code]min_value[/code],则会被范围é™åˆ¶ã€‚" +"最å°å€¼ã€‚如果 [code]value[/code] å°äºŽ [code]min_value[/code],则会被范围é™åˆ¶ã€‚" #: doc/classes/Range.xml msgid "" @@ -64593,7 +64838,7 @@ msgstr "" #: doc/classes/ReferenceRect.xml msgid "Reference frame for GUI." -msgstr "GUI的引用框架。" +msgstr "GUI çš„å‚考框。" #: doc/classes/ReferenceRect.xml msgid "" @@ -64607,21 +64852,21 @@ msgstr "" #: doc/classes/ReferenceRect.xml msgid "Sets the border [Color] of the [ReferenceRect]." -msgstr "设置 [ReferenceRect] 的边框 [Color]。" +msgstr "设置该 [ReferenceRect] 的边框 [Color]。" #: doc/classes/ReferenceRect.xml msgid "" "Sets the border width of the [ReferenceRect]. The border grows both inwards " "and outwards with respect to the rectangle box." -msgstr "设置 [ReferenceRect] 的边框宽度。边界相对于矩形框å‘内和å‘外生长。" +msgstr "设置该 [ReferenceRect] çš„è¾¹æ¡†å®½åº¦ã€‚è¾¹ç•Œç›¸å¯¹äºŽçŸ©å½¢æ¡†åŒæ—¶å‘内å‘外伸长。" #: doc/classes/ReferenceRect.xml msgid "" "If set to [code]true[/code], the [ReferenceRect] will only be visible while " "in editor. Otherwise, [ReferenceRect] will be visible in game." msgstr "" -"如果设置为 [code]true[/code],[ReferenceRect]å°†åªåœ¨ç¼–辑器ä¸å¯è§ã€‚å¦åˆ™ï¼Œ" -"[ReferenceRect]将在游æˆä¸å¯è§ã€‚" +"如果设置为 [code]true[/code],该 [ReferenceRect] å°†åªåœ¨ç¼–辑器ä¸å¯è§ã€‚å¦åˆ™ï¼Œ" +"[ReferenceRect] 将在游æˆä¸å¯è§ã€‚" #: doc/classes/ReflectionProbe.xml msgid "" @@ -64729,7 +64974,7 @@ msgstr "定义å射强度。" msgid "" "Sets the ambient light color to be used when this probe is set to [member " "interior_enable]." -msgstr "è®¾ç½®çŽ¯å¢ƒå…‰çš„é¢œè‰²ï¼Œå½“æ¤æŽ¢é’ˆè¢«è®¾ç½®ä¸º[member interior_enable]时使用。" +msgstr "è®¾ç½®çŽ¯å¢ƒå…‰çš„é¢œè‰²ï¼Œå½“æ¤æŽ¢é’ˆè¢«è®¾ç½®ä¸º [member interior_enable] 时使用。" #: doc/classes/ReflectionProbe.xml msgid "" @@ -64745,7 +64990,7 @@ msgid "" "Sets the energy multiplier for this reflection probe's ambient light " "contribution when set to [member interior_enable]." msgstr "" -"当设置为[member interior_enable]时,为该å射探针的环境光贡献设置能é‡ä¹˜æ•°ã€‚" +"当设置为 [member interior_enable] 时,为该å射探针的环境光贡献设置能é‡ä¹˜æ•°ã€‚" #: doc/classes/ReflectionProbe.xml msgid "" @@ -64753,8 +64998,8 @@ msgid "" "lighting is then controlled by the [code]interior_ambient_*[/code] " "properties." msgstr "" -"如果为 [code]true[/code],å射将忽略天空的贡献。然åŽçŽ¯å¢ƒç…§æ˜Žç”±" -"[code]internal_ambient_*[/code]属性控制。" +"如果为 [code]true[/code],å射将忽略天空的贡献。然åŽçŽ¯å¢ƒç…§æ˜Žç”± " +"[code]internal_ambient_*[/code] 属性控制。" #: doc/classes/ReflectionProbe.xml msgid "" @@ -64787,7 +65032,7 @@ msgid "" "Sets how frequently the [ReflectionProbe] is updated. Can be [constant " "UPDATE_ONCE] or [constant UPDATE_ALWAYS]." msgstr "" -"设置 [ReflectionProbe] 的更新频率。å¯ä»¥æ˜¯ [constant UPDATE_ONCE] 或 " +"设置该 [ReflectionProbe] 的更新频率。å¯ä»¥æ˜¯ [constant UPDATE_ONCE] 或 " "[constant UPDATE_ALWAYS]。" #: doc/classes/ReflectionProbe.xml @@ -65059,9 +65304,9 @@ msgid "" "Returns -1 if the group did not match or doesn't exist." msgstr "" "返回æºå—符串ä¸åŒ¹é…的起始ä½ç½®ã€‚æ•获组的起始ä½ç½®å¯ä»¥é€šè¿‡æä¾›å®ƒçš„组å·ä½œä¸ºä¸€ä¸ªæ•´" -"数或它的å—符串å称(如果它是一个命åç»„ï¼‰æ¥æ£€ç´¢ã€‚默认值为0,指的是整个表达" +"数或它的å—符串å称(如果它是一个命åç»„ï¼‰æ¥æ£€ç´¢ã€‚默认值为 0,指的是整个表达" "å¼ã€‚\n" -"å¦‚æžœç»„æ²¡æœ‰åŒ¹é…æˆ–ä¸å˜åœ¨ï¼Œè¿”回-1。" +"å¦‚æžœç»„æ²¡æœ‰åŒ¹é…æˆ–ä¸å˜åœ¨ï¼Œè¿”回 -1。" #: modules/regex/doc_classes/RegExMatch.xml msgid "" @@ -65072,7 +65317,7 @@ msgid "" "Returns an empty string if the group did not match or doesn't exist." msgstr "" "返回æºå—符串ä¸åŒ¹é…çš„å串。æ•获组å¯ä»¥é€šè¿‡æä¾›å®ƒçš„组å·ä½œä¸ºæ•´æ•°æˆ–它的å—符串åç§°" -"(如果它是一个命åç»„ï¼‰æ¥æ£€ç´¢ã€‚默认值为0,指的是整个表达å¼ã€‚\n" +"(如果它是一个命åç»„ï¼‰æ¥æ£€ç´¢ã€‚默认值为 0,指的是整个表达å¼ã€‚\n" "å¦‚æžœç»„æ²¡æœ‰åŒ¹é…æˆ–ä¸å˜åœ¨ï¼Œåˆ™è¿”回一个空å—符串。" #: modules/regex/doc_classes/RegExMatch.xml @@ -65164,7 +65409,7 @@ msgid "" msgstr "" "RemoteTransform2D 将自己的 [Transform2D] 推é€åˆ°åœºæ™¯ä¸å¦ä¸€ä¸ª [CanvasItem] 派生" "的节点(称为远程节点)。\n" -"它å¯ä»¥è¢«è®¾ç½®ä¸ºæ›´æ–°å¦ä¸€ä¸ªNodeçš„ä½ç½®ã€æ—‹è½¬æˆ–比例。它å¯ä»¥ä½¿ç”¨å…¨å±€åæ ‡æˆ–å±€éƒ¨å" +"它å¯ä»¥è¢«è®¾ç½®ä¸ºæ›´æ–°å¦ä¸€ä¸ª Node çš„ä½ç½®ã€æ—‹è½¬æˆ–比例。它å¯ä»¥ä½¿ç”¨å…¨å±€åæ ‡æˆ–å±€éƒ¨å" "æ ‡ã€‚" #: doc/classes/RemoteTransform2D.xml @@ -65237,12 +65482,13 @@ msgid "" msgstr "" "å¤åˆ¶èµ„æºï¼Œè¿”回一个å¤åˆ¶äº†å¯¼å‡ºæˆå‘˜å±žæ€§çš„æ–°èµ„æºã€‚[b]注æ„:[/b]为了å¤åˆ¶èµ„æºï¼Œæž„é€ " "å‡½æ•°è¢«è°ƒç”¨ï¼Œæ²¡æœ‰å‚æ•°ã€‚å½“æž„é€ å‡½æ•°æ²¡æœ‰é»˜è®¤å€¼æ—¶ï¼Œè¿™ä¸ªæ–¹æ³•ä¼šå‡ºé”™ã€‚\n" -"默认情况下,为了æé«˜æ•ˆçŽ‡ï¼Œå资æºåœ¨èµ„æºå‰¯æœ¬ä¹‹é—´è¢«å…±äº«ã€‚è¿™å¯ä»¥é€šè¿‡å‘" -"[code]subresources[/code]傿•°ä¼ 递[code]true[/code]æ¥æ”¹å˜ï¼Œå®ƒå°†å¤åˆ¶å资æºã€‚\n" -"[b]注æ„:[/b]如果[code]subresources[/code]是[code]true[/code]ï¼Œè¿™ä¸ªæ–¹æ³•å°†åªæ‰§" -"行一个浅层拷è´ã€‚å资æºä¸çš„嵌套资æºä¸ä¼šè¢«å¤åˆ¶ï¼Œä»ç„¶ä¼šè¢«å…±äº«ã€‚\n" -"[b]注æ„:[/b]当å¤åˆ¶ä¸€ä¸ªèµ„æºæ—¶ï¼Œåªæœ‰å¯¼å‡º[code]export[/code]的属性被å¤åˆ¶ã€‚å…¶ä»–" -"属性将被设置为新资æºä¸çš„默认值。" +"默认情况下,为了æé«˜æ•ˆçŽ‡ï¼Œå资æºåœ¨èµ„æºå‰¯æœ¬ä¹‹é—´è¢«å…±äº«ã€‚è¿™å¯ä»¥é€šè¿‡å‘ " +"[code]subresources[/code] 傿•°ä¼ 递 [code]true[/code] æ¥æ”¹å˜ï¼Œå®ƒå°†å¤åˆ¶å资" +"æºã€‚\n" +"[b]注æ„:[/b]如果 [code]subresources[/code] 为 [code]true[/code],这个方法将" +"åªæ‰§è¡Œä¸€ä¸ªæµ…层拷è´ã€‚å资æºä¸çš„嵌套资æºä¸ä¼šè¢«å¤åˆ¶ï¼Œä»ç„¶ä¼šè¢«å…±äº«ã€‚\n" +"[b]注æ„:[/b]当å¤åˆ¶ä¸€ä¸ªèµ„æºæ—¶ï¼Œåªæœ‰å¯¼å‡º [code]export[/code] 的属性被å¤åˆ¶ã€‚å…¶" +"他属性将被设置为新资æºä¸çš„默认值。" #: doc/classes/Resource.xml msgid "" @@ -65480,7 +65726,7 @@ msgid "" "Returns the list of extensions available for saving the resource object, " "provided it is recognized (see [method recognize])." msgstr "" -"返回å¯ç”¨äºŽä¿å˜èµ„æºå¯¹è±¡çš„æ‰©å±•åˆ—è¡¨ï¼Œå‰ææ˜¯å®ƒè¢«è¯†åˆ«ï¼ˆè§[method recognize])。" +"返回å¯ç”¨äºŽä¿å˜èµ„æºå¯¹è±¡çš„æ‰©å±•åˆ—è¡¨ï¼Œå‰ææ˜¯å®ƒè¢«è¯†åˆ«ï¼ˆè§ [method recognize])。" #: doc/classes/ResourceFormatSaver.xml msgid "Returns whether the given resource object can be saved by this saver." @@ -65509,7 +65755,7 @@ msgid "" "[EditorImportPlugin]." msgstr "" "è¿™æ˜¯åœ¨æ ¸å¿ƒéƒ¨åˆ†å®žçŽ°çš„èµ„æºå¯¼å…¥å™¨çš„基类。è¦ä½¿ç”¨ç¼–辑器æ’ä»¶å®žçŽ°ä½ è‡ªå·±çš„èµ„æºå¯¼å…¥" -"器,请å‚阅[EditorImportPlugin]。" +"å™¨ï¼Œè§ [EditorImportPlugin]。" #: doc/classes/ResourceImporter.xml msgid "Import plugins" @@ -65574,11 +65820,11 @@ msgid "" "Returns another [enum Error] code if the poll has failed." msgstr "" "å¯¹åŠ è½½æ“作进行轮询,å³åŠ è½½ä¸€ä¸ªæ•°æ®å—到下一个阶段。\n" -"如果轮询æˆåŠŸï¼Œä½†åŠ è½½æ“作还没有完æˆï¼ˆä¸é—´é˜¶æ®µï¼‰ï¼Œåˆ™è¿”回[constant OK]。这æ„味ç€" -"[method poll]å°†ä¸å¾—ä¸å†æ¬¡è¢«è°ƒç”¨ï¼Œç›´åˆ°æœ€åŽé˜¶æ®µå®Œæˆã€‚\n" -"å¦‚æžœåŠ è½½æ“ä½œå·²ç»æˆåŠŸå®Œæˆï¼Œè¿”回[constant ERR_FILE_EOF]。å¯ä»¥é€šè¿‡è°ƒç”¨[method " -"get_resource]èŽ·å¾—åŠ è½½çš„èµ„æºã€‚\n" -"如果轮询失败,返回å¦ä¸€ä¸ª[enum Error]错误代ç 。" +"如果轮询æˆåŠŸï¼Œä½†åŠ è½½æ“作还没有完æˆï¼ˆä¸é—´é˜¶æ®µï¼‰ï¼Œåˆ™è¿”回 [constant OK]。这æ„味" +"ç€ [method poll] å°†ä¸å¾—ä¸å†æ¬¡è¢«è°ƒç”¨ï¼Œç›´åˆ°æœ€åŽé˜¶æ®µå®Œæˆã€‚\n" +"å¦‚æžœåŠ è½½æ“ä½œå·²ç»æˆåŠŸå®Œæˆï¼Œè¿”回 [constant ERR_FILE_EOF]。å¯ä»¥é€šè¿‡è°ƒç”¨ [method " +"get_resource] èŽ·å¾—åŠ è½½çš„èµ„æºã€‚\n" +"如果轮询失败,返回å¦ä¸€ä¸ª [enum Error] 错误代ç 。" #: doc/classes/ResourceInteractiveLoader.xml msgid "" @@ -65590,10 +65836,10 @@ msgid "" "Returns another [enum Error] code if a poll has failed, aborting the " "operation." msgstr "" -"连ç»åœ°å¯¹åŠ è½½æ“作进行轮询,直到资æºè¢«å®Œå…¨åŠ è½½æˆ–æ–¹æ³•[method poll]轮询失败。\n" -"å¦‚æžœåŠ è½½æ“作æˆåŠŸå®Œæˆï¼Œè¿”回[constant ERR_FILE_EOF]。å¯ä»¥é€šè¿‡è°ƒç”¨[method " -"get_resource]èŽ·å¾—åŠ è½½çš„èµ„æºã€‚\n" -"如果轮询失败,返回å¦ä¸€ä¸ª[enum Error]错误代ç ï¼Œä¸æ¢æ“作。" +"连ç»åœ°å¯¹åŠ è½½æ“作进行轮询,直到资æºè¢«å®Œå…¨åŠ è½½æˆ–æ–¹æ³• [method poll] 轮询失败。\n" +"å¦‚æžœåŠ è½½æ“作æˆåŠŸå®Œæˆï¼Œè¿”回 [constant ERR_FILE_EOF]。å¯ä»¥é€šè¿‡è°ƒç”¨ [method " +"get_resource] èŽ·å¾—åŠ è½½çš„èµ„æºã€‚\n" +"如果轮询失败,返回å¦ä¸€ä¸ª [enum Error] 错误代ç ï¼Œä¸æ¢æ“作。" #: doc/classes/ResourceLoader.xml msgid "Singleton used to load resource files." @@ -65607,7 +65853,7 @@ msgid "" "them to a format that can be used by the engine." msgstr "" "ç”¨äºŽä»Žæ–‡ä»¶ç³»ç»ŸåŠ è½½èµ„æºæ–‡ä»¶çš„å•例。\n" -"å®ƒä½¿ç”¨åœ¨å¼•æ“Žä¸æ³¨å†Œçš„许多[ResourceFormatLoader]ç±»ï¼ˆæ— è®ºæ˜¯å†…ç½®çš„è¿˜æ˜¯æ¥è‡ªæ’ä»¶" +"å®ƒä½¿ç”¨åœ¨å¼•æ“Žä¸æ³¨å†Œçš„许多 [ResourceFormatLoader] ç±»ï¼ˆæ— è®ºæ˜¯å†…ç½®çš„è¿˜æ˜¯æ¥è‡ªæ’ä»¶" "的)æ¥å°†æ–‡ä»¶åŠ è½½åˆ°å†…å˜ä¸ï¼Œå¹¶å°†å®ƒä»¬è½¬æ¢ä¸ºå¼•擎å¯ä»¥ä½¿ç”¨çš„æ ¼å¼ã€‚" #: doc/classes/ResourceLoader.xml @@ -65646,10 +65892,10 @@ msgid "" "can be overridden by using [method Resource.take_over_path] on a new " "resource for that same path." msgstr "" -"返回给定路径[code]path[/code]的缓å˜èµ„æºæ˜¯å¦å¯ç”¨ã€‚\n" -"一旦资æºè¢«å¼•æ“ŽåŠ è½½ï¼Œå®ƒå°±ä¼šè¢«ç¼“å˜åœ¨å†…å˜ä¸ï¼Œä»¥ä¾¿æ›´å¿«åœ°è®¿é—®ï¼Œæœªæ¥å¯¹[method load]" -"或[method load_interactive]方法的调用将使用缓å˜çš„版本。缓å˜çš„资æºå¯ä»¥é€šè¿‡å¯¹åŒ" -"一路径的新资æºä½¿ç”¨[method Resource.take_over_path]æ¥è¦†ç›–。" +"返回给定路径 [code]path[/code] 的缓å˜èµ„æºæ˜¯å¦å¯ç”¨ã€‚\n" +"一旦资æºè¢«å¼•æ“ŽåŠ è½½ï¼Œå®ƒå°±ä¼šè¢«ç¼“å˜åœ¨å†…å˜ä¸ï¼Œä»¥ä¾¿æ›´å¿«åœ°è®¿é—®ï¼Œæœªæ¥å¯¹ [method " +"load] 或 [method load_interactive] 方法的调用将使用缓å˜çš„版本。缓å˜çš„资æºå¯ä»¥" +"通过对åŒä¸€è·¯å¾„的新资æºä½¿ç”¨ [method Resource.take_over_path] æ¥è¦†ç›–。" #: doc/classes/ResourceLoader.xml msgid "" @@ -65671,17 +65917,17 @@ msgid "" "be used in most situations, leaving the use of [ResourceLoader] for more " "advanced scenarios." msgstr "" -"在给定的路径[code]path[/code]ä¸ŠåŠ è½½ä¸€ä¸ªèµ„æºï¼Œç¼“å˜ç»“果以便进一æ¥è®¿é—®ã€‚\n" -"便¬¡æŸ¥è¯¢æ³¨å†Œçš„[ResourceFormatLoader],找到第一个å¯ä»¥å¤„ç†è¯¥æ–‡ä»¶æ‰©å±•åçš„åŠ è½½" -"器,然åŽå°è¯•åŠ è½½ã€‚å¦‚æžœåŠ è½½å¤±è´¥ï¼Œå…¶ä½™çš„ResourceFormatLoaders也会被å°è¯•。\n" -"一个å¯é€‰çš„[code]type_hint[/code]类型æç¤ºå¯ä»¥ç”¨æ¥è¿›ä¸€æ¥æŒ‡å®š" -"[ResourceFormatLoader]应处ç†çš„[Resource]资æºç±»åž‹ã€‚任何继承自[Resource]的东西" -"都å¯ä»¥è¢«ç”¨ä½œç±»åž‹æç¤ºï¼Œä¾‹å¦‚图åƒ[Image]。\n" -"如果[code]no_cache[/code]是[code]true[/code],资æºç¼“å˜å°†è¢«ç»•过,资æºå°†è¢«é‡æ–°" -"åŠ è½½ã€‚å¦åˆ™ï¼Œå¦‚果缓å˜çš„资æºå˜åœ¨ï¼Œå°†è¢«è¿”回。\n" -"如果没有[ResourceFormatLoader]å¯ä»¥å¤„ç†è¯¥æ–‡ä»¶ï¼Œåˆ™è¿”回一个空资æºã€‚\n" -"GDScript有一个简化的[method @GDScript.load]内置方法,å¯ä»¥åœ¨å¤§å¤šæ•°æƒ…况下使用," -"把[ResourceLoader]的使用留给更高级的场景。" +"在给定的路径 [code]path[/code] ä¸ŠåŠ è½½ä¸€ä¸ªèµ„æºï¼Œç¼“å˜ç»“果以便进一æ¥è®¿é—®ã€‚\n" +"便¬¡æŸ¥è¯¢æ³¨å†Œçš„ [ResourceFormatLoader],找到第一个å¯ä»¥å¤„ç†è¯¥æ–‡ä»¶æ‰©å±•åçš„åŠ è½½" +"器,然åŽå°è¯•åŠ è½½ã€‚å¦‚æžœåŠ è½½å¤±è´¥ï¼Œå…¶ä½™çš„ ResourceFormatLoader 也会被å°è¯•。\n" +"一个å¯é€‰çš„ [code]type_hint[/code] 类型æç¤ºå¯ä»¥ç”¨æ¥è¿›ä¸€æ¥æŒ‡å®š " +"[ResourceFormatLoader] 应处ç†çš„ [Resource] 资æºç±»åž‹ã€‚任何继承自 [Resource] çš„" +"东西都å¯ä»¥è¢«ç”¨ä½œç±»åž‹æç¤ºï¼Œä¾‹å¦‚ [Image]。\n" +"如果 [code]no_cache[/code] 是 [code]true[/code],资æºç¼“å˜å°†è¢«ç»•过,资æºå°†è¢«é‡" +"æ–°åŠ è½½ã€‚å¦åˆ™ï¼Œå¦‚果缓å˜çš„资æºå˜åœ¨ï¼Œå°†è¢«è¿”回。\n" +"如果没有 [ResourceFormatLoader] å¯ä»¥å¤„ç†è¯¥æ–‡ä»¶ï¼Œåˆ™è¿”回一个空资æºã€‚\n" +"GDScript 有一个简化的 [method @GDScript.load] 内置方法,å¯ä»¥åœ¨å¤§å¤šæ•°æƒ…况下使" +"用,把 [ResourceLoader] 的使用留给更高级的场景。" #: doc/classes/ResourceLoader.xml msgid "" @@ -65694,11 +65940,11 @@ msgid "" "Anything that inherits from [Resource] can be used as a type hint, for " "example [Image]." msgstr "" -"开始交互å¼åŠ è½½ä¸€ä¸ªèµ„æºã€‚返回的[ResourceInteractiveLoader]对象å…è®¸ä»¥é«˜ç²’åº¦åŠ " -"载,连ç»è°ƒç”¨å…¶[method ResourceInteractiveLoader.poll]轮询方法æ¥åŠ è½½åˆ†å—。\n" -"一个å¯é€‰çš„[code]type_hint[/code]类型æç¤ºå¯ä»¥ç”¨æ¥è¿›ä¸€æ¥æŒ‡å®šåº”该由" -"[ResourceFormatLoader]处ç†çš„资æº[Resource]类型。任何继承自[Resource]的东西都" -"å¯ä»¥è¢«ç”¨ä½œç±»åž‹æç¤ºï¼Œä¾‹å¦‚[Image]。" +"开始交互å¼åŠ è½½ä¸€ä¸ªèµ„æºã€‚返回的 [ResourceInteractiveLoader] 对象å…è®¸ä»¥é«˜ç²’åº¦åŠ " +"载,连ç»è°ƒç”¨å…¶ [method ResourceInteractiveLoader.poll] 轮询方法æ¥åŠ è½½åˆ†å—。\n" +"一个å¯é€‰çš„ [code]type_hint[/code] 类型æç¤ºå¯ä»¥ç”¨æ¥è¿›ä¸€æ¥æŒ‡å®šåº”该由 " +"[ResourceFormatLoader] 处ç†çš„èµ„æº [Resource] 类型。任何继承自 [Resource] 的东" +"西都å¯ä»¥è¢«ç”¨ä½œç±»åž‹æç¤ºï¼Œä¾‹å¦‚ [Image]。" #: doc/classes/ResourceLoader.xml msgid "" @@ -65731,9 +65977,9 @@ msgid "" "will be renamed to \"[code]name[/code] N\" where N is an incrementing number " "starting from 2." msgstr "" -"å°†ä¸€ä¸ªèµ„æºæ·»åŠ åˆ°é¢„åŠ è½½å™¨ä¸ï¼Œå¹¶ç»™å‡º[code]name[/code]。如果给定的[code]name[/" -"code]的资æºå·²ç»å˜åœ¨ï¼Œæ–°çš„资æºå°†è¢«é‡å‘½å为\"[code]name[/code] N\",其ä¸N是一个" -"从2开始的递增数å—。" +"å°†ä¸€ä¸ªèµ„æºæ·»åŠ åˆ°é¢„åŠ è½½å™¨ä¸ï¼Œå¹¶ç»™å‡º [code]name[/code]。如果给定的 [code]name[/" +"code] 的资æºå·²ç»å˜åœ¨ï¼Œæ–°çš„资æºå°†è¢«é‡å‘½å为 \"[code]name[/code] N\"ï¼Œå…¶ä¸ N 是" +"一个从 2 开始的递增数å—。" #: doc/classes/ResourcePreloader.xml msgid "Returns the resource associated to [code]name[/code]." @@ -65748,22 +65994,23 @@ msgid "" "Returns [code]true[/code] if the preloader contains a resource associated to " "[code]name[/code]." msgstr "" -"å¦‚æžœé¢„åŠ è½½å™¨åŒ…å«ä¸€ä¸ªä¸Ž[code]name[/code]相关的资æºï¼Œåˆ™è¿”回 [code]true[/code]。" +"å¦‚æžœé¢„åŠ è½½å™¨åŒ…å«ä¸€ä¸ªä¸Ž [code]name[/code] 相关的资æºï¼Œåˆ™è¿”回 [code]true[/" +"code]。" #: doc/classes/ResourcePreloader.xml msgid "" "Removes the resource associated to [code]name[/code] from the preloader." -msgstr "ä»Žé¢„åŠ è½½å™¨ä¸åˆ 除与[code]name[/code]有关的资æºã€‚" +msgstr "ä»Žé¢„åŠ è½½å™¨ä¸åˆ 除与 [code]name[/code] 有关的资æºã€‚" #: doc/classes/ResourcePreloader.xml msgid "" "Renames a resource inside the preloader from [code]name[/code] to " "[code]newname[/code]." -msgstr "å°†é¢„åŠ è½½å™¨ä¸çš„资æºä»Ž[code]name[/code]é‡å‘½å为[code]newname[/code]。" +msgstr "å°†é¢„åŠ è½½å™¨ä¸çš„资æºä»Ž [code]name[/code] é‡å‘½å为 [code]newname[/code]。" #: doc/classes/ResourceSaver.xml msgid "Singleton for saving Godot-specific resource types." -msgstr "用于ä¿å˜Godot特定资æºç±»åž‹çš„å•例。" +msgstr "用于ä¿å˜ Godot 特定资æºç±»åž‹çš„å•例。" #: doc/classes/ResourceSaver.xml msgid "" @@ -65773,10 +66020,10 @@ msgid "" "text-based (e.g. [code].tres[/code] or [code].tscn[/code]) or binary files " "(e.g. [code].res[/code] or [code].scn[/code])." msgstr "" -"用于将Godot特定的资æºç±»åž‹ä¿å˜åˆ°æ–‡ä»¶ç³»ç»Ÿçš„å•例。\n" -"å®ƒä½¿ç”¨åœ¨å¼•æ“Žä¸æ³¨å†Œçš„许多[ResourceFormatSaver]ç±»ï¼ˆæ— è®ºæ˜¯å†…ç½®çš„è¿˜æ˜¯æ¥è‡ªæ’ä»¶" -"çš„ï¼‰ï¼Œå°†å¼•æ“Žç‰¹å®šçš„èµ„æºæ•°æ®ä¿å˜åˆ°åŸºäºŽæ–‡æœ¬ï¼ˆå¦‚[code].res[/code]或[code].tscn[/" -"code])或二进制文件(如[code].res[/code]或[code].scn[/code])。" +"用于将 Godot 特定的资æºç±»åž‹ä¿å˜åˆ°æ–‡ä»¶ç³»ç»Ÿçš„å•例。\n" +"å®ƒä½¿ç”¨åœ¨å¼•æ“Žä¸æ³¨å†Œçš„许多 [ResourceFormatSaver] ç±»ï¼ˆæ— è®ºæ˜¯å†…ç½®çš„è¿˜æ˜¯æ¥è‡ªæ’ä»¶" +"çš„ï¼‰ï¼Œå°†å¼•æ“Žç‰¹å®šçš„èµ„æºæ•°æ®ä¿å˜åˆ°åŸºäºŽæ–‡æœ¬ï¼ˆå¦‚ [code].res[/code] 或 [code]." +"tscn[/code])或二进制文件(如 [code].res[/code] 或 [code].scn[/code])。" #: doc/classes/ResourceSaver.xml msgid "" @@ -65792,9 +66039,9 @@ msgid "" "behavior.\n" "Returns [constant OK] on success." msgstr "" -"使用识别资æºå¯¹è±¡çš„[ResourceFormatSaver]将资æºä¿å˜åˆ°ç»™å®šè·¯å¾„çš„ç£ç›˜ã€‚\n" +"使用识别资æºå¯¹è±¡çš„ [ResourceFormatSaver] 将资æºä¿å˜åˆ°ç»™å®šè·¯å¾„çš„ç£ç›˜ã€‚\n" "å¯ä»¥æŒ‡å®š [code]flags[/code] ä½æŽ©ç æ¥è‡ªå®šä¹‰ä¿å˜è¡Œä¸ºã€‚\n" -"æˆåŠŸåŽè¿”回[constant OK]。" +"æˆåŠŸåŽè¿”回 [constant OK]。" #: doc/classes/ResourceSaver.xml msgid "Save the resource with a path relative to the scene which uses it." @@ -65869,8 +66116,8 @@ msgid "" "successfully. If the method returns [code]false[/code], it will skip " "transformation to avoid displaying broken text." msgstr "" -"覆盖这个方法æ¥ä¿®æ”¹[code]char_fx[/code]ä¸çš„属性。如果å—符å¯ä»¥è¢«æˆåŠŸè½¬æ¢ï¼Œè¯¥æ–¹" -"法必须返回 [code]true[/code]。如果该方法返回 [code]false[/code],它将跳过转" +"覆盖这个方法æ¥ä¿®æ”¹ [code]char_fx[/code] ä¸çš„属性。如果å—符å¯ä»¥è¢«æˆåŠŸè½¬æ¢ï¼Œè¯¥" +"方法必须返回 [code]true[/code]。如果该方法返回 [code]false[/code],它将跳过转" "æ¢ï¼Œä»¥é¿å…æ˜¾ç¤ºç ´ç¢Žçš„æ–‡æœ¬ã€‚" #: doc/classes/RichTextLabel.xml @@ -65902,9 +66149,9 @@ msgid "" "characters instead. This will be resolved in Godot 4.0." msgstr "" "富文本å¯ä»¥åŒ…å«è‡ªå®šä¹‰æ–‡æœ¬ã€å—体ã€å›¾åƒå’Œä¸€äº›åŸºæœ¬æ ¼å¼ã€‚è¯¥æ ‡ç¾ä¼šå°†è¿™äº›ä»¥å†…éƒ¨æ ‡ç¾" -"å †æ ˆçš„å½¢å¼è¿›è¡Œç®¡ç†ã€‚它还å¯ä»¥é€‚应给定的宽度/高度。\n" -"[b]注æ„:[/b]为 [member bbcode_text] è®¾ç½®å†…å®¹ä¼šæ¸…é™¤æ ‡ç¾å †æ ˆå¹¶æ ¹æ®è¯¥å±žæ€§çš„内容" -"é‡å»ºã€‚对 [member bbcode_text] 所åšçš„ä»»ä½•ç¼–è¾‘éƒ½å°†åˆ é™¤å…ˆå‰ä»Žå…¶ä»–æ‰‹åŠ¨æ¥æºï¼ˆä¾‹å¦‚ " +"æ ˆçš„å½¢å¼è¿›è¡Œç®¡ç†ã€‚它还å¯ä»¥é€‚应给定的宽度/高度。\n" +"[b]注æ„:[/b]为 [member bbcode_text] è®¾ç½®å†…å®¹ä¼šæ¸…é™¤æ ‡ç¾æ ˆå¹¶æ ¹æ®è¯¥å±žæ€§çš„内容é‡" +"建。对 [member bbcode_text] 所åšçš„ä»»ä½•ç¼–è¾‘éƒ½å°†åˆ é™¤å…ˆå‰ä»Žå…¶ä»–æ‰‹åŠ¨æ¥æºï¼ˆä¾‹å¦‚ " "[method append_bbcode] å’Œ [code]push_*[/code] / [method pop] 方法)所åšçš„ç¼–" "辑。\n" "[b]注æ„:[/b]RichTextLabel 䏿”¯æŒçº ç¼ çš„ BBCode æ ‡ç¾ã€‚例如,ä¸è¦ä½¿ç”¨ [code]" @@ -65934,7 +66181,7 @@ msgid "" "If [code]width[/code] or [code]height[/code] is set to 0, the image size " "will be adjusted in order to keep the original aspect ratio." msgstr "" -"将图åƒçš„å¼€å¤´å’Œç»“å°¾æ ‡ç¾æ·»åŠ åˆ°æ ‡ç¾å †ä¸ï¼Œå¯ä»¥é€‰æ‹©æä¾› [code]width[/code] å’Œ " +"将图åƒçš„å¼€å¤´å’Œç»“å°¾æ ‡ç¾æ·»åŠ åˆ°æ ‡ç¾æ ˆä¸ï¼Œå¯ä»¥é€‰æ‹©æä¾› [code]width[/code] å’Œ " "[code]height[/code] æ¥è°ƒæ•´å›¾åƒçš„大å°ã€‚\n" "如果 [code]width[/code] 或 [code]height[/code] 被设置为 0,图åƒçš„大å°è¢«è°ƒæ•´ä¸º" "ä¿æŒåŽŸå§‹é•¿å®½æ¯”ã€‚" @@ -65955,7 +66202,7 @@ msgid "" "[b]Note:[/b] This method internals' can't possibly fail, but an error code " "is returned for backwards compatibility, which will always be [constant OK]." msgstr "" -"è§£æž [code]bbcode[/code] å¹¶æ ¹æ®éœ€è¦å°†æ ‡ç¾æ·»åŠ åˆ°æ ‡ç¾å †æ ˆä¸ã€‚\n" +"è§£æž [code]bbcode[/code] å¹¶æ ¹æ®éœ€è¦å°†æ ‡ç¾æ·»åŠ åˆ°æ ‡ç¾æ ˆä¸ã€‚\n" "[b]注æ„:[/b]ä½¿ç”¨æ¤æ–¹æ³•ï¼Œæ‚¨æ— æ³•å…³é—在之å‰çš„ [method append_bbcode] è°ƒç”¨ä¸æ‰“å¼€" "çš„æ ‡ç¾ã€‚è¿™æ ·åšæ˜¯ä¸ºäº†æé«˜æ€§èƒ½ï¼Œç‰¹åˆ«æ˜¯åœ¨æ›´æ–°å¤§åž‹ RichTextLabel æ—¶ï¼Œå› ä¸ºæ¯æ¬¡é‡å»º" "整个 BBCode 会更慢。如果您ç»å¯¹éœ€è¦åœ¨å°†æ¥çš„æ–¹æ³•调用ä¸å…³é—æ ‡ç¾ï¼Œè¯·é™„åŠ [member " @@ -65965,7 +66212,7 @@ msgstr "" #: doc/classes/RichTextLabel.xml msgid "Clears the tag stack and sets [member bbcode_text] to an empty string." -msgstr "æ¸…é™¤æ ‡è®°å †æ ˆå¹¶å°† [member bbcode_text] 设置为空å—符串。" +msgstr "æ¸…é™¤æ ‡ç¾æ ˆå¹¶å°† [member bbcode_text] 设置为空å—符串。" #: doc/classes/RichTextLabel.xml msgid "Returns the height of the content." @@ -66000,7 +66247,7 @@ msgstr "" #: doc/classes/RichTextLabel.xml msgid "Adds a newline tag to the tag stack." -msgstr "åœ¨æ ‡ç¾å †ä¸æ·»åŠ ä¸€ä¸ªæ¢è¡Œæ ‡ç¾ã€‚" +msgstr "åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ªæ¢è¡Œæ ‡ç¾ã€‚" #: doc/classes/RichTextLabel.xml msgid "" @@ -66039,40 +66286,40 @@ msgid "" "the same as adding a [code][b][/code] tag if not currently in a [code][i][/" "code] tag." msgstr "" -"åœ¨æ ‡ç¾å †ä¸æ·»åŠ ä¸€ä¸ª[code][font][/code]æ ‡ç¾ï¼Œå—ä½“ä¸ºé»‘ä½“ã€‚å¦‚æžœå½“å‰æ²¡æœ‰[code][i]" -"[/code]æ ‡ç¾ï¼Œè¿™ä¸Žæ·»åŠ ä¸€ä¸ª[code][b][/code]æ ‡ç¾ç›¸åŒã€‚" +"åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ª [code][font][/code] æ ‡ç¾ï¼Œå—ä½“ä¸ºé»‘ä½“ã€‚å¦‚æžœå½“å‰æ²¡æœ‰ [code]" +"[i][/code] æ ‡ç¾ï¼Œè¿™ä¸Žæ·»åŠ ä¸€ä¸ª [code][b][/code] æ ‡ç¾ç›¸åŒã€‚" #: doc/classes/RichTextLabel.xml msgid "" "Adds a [code][font][/code] tag with a bold italics font to the tag stack." -msgstr "åœ¨æ ‡ç¾å †ä¸æ·»åŠ ä¸€ä¸ª[code][font][/code]æ ‡ç¾ï¼Œå—体为粗斜体。" +msgstr "åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ª [code][font][/code] æ ‡ç¾ï¼Œå—体为粗斜体。" #: doc/classes/RichTextLabel.xml msgid "" "Adds a [code][cell][/code] tag to the tag stack. Must be inside a [code]" "[table][/code] tag. See [method push_table] for details." msgstr "" -"将一个[code][cell][/code]æ ‡ç¾æ·»åŠ åˆ°æ ‡ç¾å †ä¸ã€‚必须在一个[code][table][/code]æ ‡" -"ç¾å†…。详情è§[method push_table]。" +"åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ª [code][cell][/code] æ ‡ç¾ã€‚å¿…é¡»ä½äºŽ [code][table][/code] æ ‡" +"ç¾å†…ã€‚è¯¦è§ [method push_table]。" #: doc/classes/RichTextLabel.xml msgid "Adds a [code][color][/code] tag to the tag stack." -msgstr "将一个[code][color][/code]æ ‡ç¾æ·»åŠ åˆ°æ ‡ç¾å †ã€‚" +msgstr "åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ª [code][color][/code] æ ‡ç¾ã€‚" #: doc/classes/RichTextLabel.xml msgid "" "Adds a [code][font][/code] tag to the tag stack. Overrides default fonts for " "its duration." msgstr "" -"将一个[code][font][/code]æ ‡ç¾æ·»åŠ åˆ°æ ‡ç¾å †ä¸ã€‚在其有效期内覆盖默认å—体。" +"åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ª [code][font][/code] æ ‡ç¾ã€‚在其有效期内覆盖默认å—体。" #: doc/classes/RichTextLabel.xml msgid "" "Adds an [code][indent][/code] tag to the tag stack. Multiplies [code]level[/" "code] by current [member tab_size] to determine new margin length." msgstr "" -"å°† [code][indent][/code] æ ‡ç¾æ·»åŠ åˆ°æ ‡ç¾å †æ ˆã€‚å°† [code]level[/code] ä¹˜ä»¥å½“å‰ " -"[member tab_size] 以确定新的边è·é•¿åº¦ã€‚" +"åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ª [code][indent][/code] æ ‡ç¾ã€‚å°† [code]level[/code] 乘以当" +"å‰ [member tab_size] 以确定新的边è·é•¿åº¦ã€‚" #: doc/classes/RichTextLabel.xml msgid "" @@ -66080,8 +66327,8 @@ msgid "" "the same as adding a [code][i][/code] tag if not currently in a [code][b][/" "code] tag." msgstr "" -"åœ¨æ ‡ç¾å †ä¸æ·»åŠ ä¸€ä¸ª[code][font][/code]æ ‡ç¾ï¼Œå—ä½“ä¸ºæ–œä½“ã€‚å¦‚æžœå½“å‰æ²¡æœ‰[code][b]" -"[/code]æ ‡ç¾ï¼Œè¿™ä¸Žæ·»åŠ [code][i][/code]æ ‡ç¾ç›¸åŒã€‚" +"åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ª [code][font][/code] æ ‡ç¾ï¼Œå—ä½“ä¸ºæ–œä½“ã€‚å¦‚æžœå½“å‰æ²¡æœ‰ [code]" +"[b][/code] æ ‡ç¾ï¼Œè¿™ä¸Žæ·»åŠ [code][i][/code] æ ‡ç¾ç›¸åŒã€‚" #: doc/classes/RichTextLabel.xml msgid "" @@ -66089,36 +66336,36 @@ msgid "" "[code][ol][/code] or [code][ul][/code], but supports more list types. Not " "fully implemented!" msgstr "" -"åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ª[code][list][/code]æ ‡ç¾ã€‚类似于BBCodes [code][ol][/code] " -"或 [code][ul][/code] ï¼Œä½†æ”¯æŒæ›´å¤šçš„列表类型。未完全实现!" +"åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ª [code][list][/code] æ ‡ç¾ã€‚类似于 BBCode çš„ [code][ol][/" +"code] 或 [code][ul][/code] ï¼Œä½†æ”¯æŒæ›´å¤šçš„列表类型。未完全实现ï¼" #: doc/classes/RichTextLabel.xml msgid "" "Adds a [code][meta][/code] tag to the tag stack. Similar to the BBCode [code]" "[url=something]{text}[/url][/code], but supports non-[String] metadata types." msgstr "" -"æ·»åŠ ä¸€ä¸ª[code][meta][/code]æ ‡ç¾åˆ°æ ‡ç¾å †ä¸ã€‚类似于BBCode [code][url=something]" -"{text}[/url][/code],但支æŒéž[String]元数æ®ç±»åž‹ã€‚" +"åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ª [code][meta][/code] æ ‡ç¾ã€‚类似于BBCode çš„ [code]" +"[url=something]{text}[/url][/code],但支æŒéž [String] 元数æ®ç±»åž‹ã€‚" #: doc/classes/RichTextLabel.xml msgid "Adds a [code][font][/code] tag with a monospace font to the tag stack." -msgstr "åœ¨æ ‡ç¾å †ä¸æ·»åŠ ä¸€ä¸ª[code][font][/code]æ ‡ç¾ï¼Œè¯¥æ ‡ç¾ä¸ºç‰å®½å—体。" +msgstr "åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ª [code][font][/code] æ ‡ç¾ï¼Œè¯¥æ ‡ç¾ä¸ºç‰å®½å—体。" #: doc/classes/RichTextLabel.xml msgid "Adds a [code][font][/code] tag with a normal font to the tag stack." -msgstr "åœ¨æ ‡ç¾å †ä¸æ·»åŠ ä¸€ä¸ªå…·æœ‰æ£å¸¸å—体的[code][font][/code]æ ‡ç¾ã€‚" +msgstr "åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ªå…·æœ‰æ£å¸¸å—体的 [code][font][/code] æ ‡ç¾ã€‚" #: doc/classes/RichTextLabel.xml msgid "Adds a [code][s][/code] tag to the tag stack." -msgstr "将一个[code][s][/code]æ ‡ç¾æ·»åŠ åˆ°æ ‡ç¾å †ä¸ã€‚" +msgstr "åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ª [code][s][/code] æ ‡ç¾ã€‚" #: doc/classes/RichTextLabel.xml msgid "Adds a [code][table=columns][/code] tag to the tag stack." -msgstr "将一个[code][table=columns][/code]æ ‡ç¾æ·»åŠ åˆ°æ ‡ç¾æ ˆã€‚" +msgstr "åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ª [code][table=columns][/code] æ ‡ç¾ã€‚" #: doc/classes/RichTextLabel.xml msgid "Adds a [code][u][/code] tag to the tag stack." -msgstr "将一个[code][u][/code]æ ‡ç¾æ·»åŠ åˆ°æ ‡ç¾å †ä¸ã€‚" +msgstr "åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ª [code][u][/code] æ ‡ç¾ã€‚" #: doc/classes/RichTextLabel.xml msgid "" @@ -66259,7 +66506,7 @@ msgid "" "Does not parse BBCodes. Does not modify [member bbcode_text]." msgstr "" "æ ‡ç¾çš„原始文本。\n" -"设置åŽï¼Œæ¸…é™¤æ ‡ç¾å †æ ˆå¹¶åœ¨å…¶é¡¶éƒ¨æ·»åŠ ä¸€ä¸ªåŽŸå§‹æ–‡æœ¬æ ‡ç¾ã€‚ä¸è§£æž BBCode。ä¸ä¿®æ”¹ " +"设置åŽï¼Œæ¸…é™¤æ ‡ç¾æ ˆå¹¶åœ¨å…¶é¡¶éƒ¨æ·»åŠ ä¸€ä¸ªåŽŸå§‹æ–‡æœ¬æ ‡ç¾ã€‚ä¸è§£æž BBCode。ä¸ä¿®æ”¹ " "[member bbcode_text]。" #: doc/classes/RichTextLabel.xml @@ -66283,7 +66530,7 @@ msgid "" msgstr "" "å½“ç”¨æˆ·ç‚¹å‡»å…ƒæ ‡è®°ä¹‹é—´çš„å†…å®¹æ—¶è§¦å‘。如果元是在文本ä¸å®šä¹‰çš„,例如[code]" "[url={\"data\"=\"hi\"}]hi[/url][/code],则该信å·çš„傿•°ä¸º[String]类型。如果需" -"è¦ç‰¹å®šç±»åž‹æˆ–对象,则必须使用 [method push_meta] æ–¹æ³•å°†æ•°æ®æ‰‹åЍæ’å…¥æ ‡ç¾å †æ ˆã€‚" +"è¦ç‰¹å®šç±»åž‹æˆ–对象,则必须使用 [method push_meta] æ–¹æ³•å°†æ•°æ®æ‰‹åЍæ’å…¥æ ‡ç¾æ ˆã€‚" #: doc/classes/RichTextLabel.xml msgid "Triggers when the mouse exits a meta tag." @@ -66892,8 +67139,8 @@ msgid "" "Rigid body mode. This is the \"natural\" state of a rigid body. It is " "affected by forces, and can move, rotate, and be affected by user code." msgstr "" -"刚体模å¼ã€‚这是一个刚体的“自然â€çжæ€ã€‚它å—到力的影å“,å¯ä»¥ç§»åŠ¨ã€æ—‹è½¬ï¼Œå¹¶å—到用" -"户代ç 的影å“。" +"刚体模å¼ã€‚这是刚体的“自然â€çжæ€ã€‚它å—到力的影å“,å¯ä»¥ç§»åŠ¨ã€æ—‹è½¬ï¼Œå¹¶å—到用户代" +"ç 的影å“。" #: doc/classes/RigidBody.xml msgid "" @@ -67003,7 +67250,7 @@ msgid "" "collision (should there be one)." msgstr "" "如果在给定的å‘é‡ä¸ç§»åŠ¨ä¼šå¯¼è‡´ç¢°æ’žï¼Œåˆ™è¿”å›ž [code]true[/code]。[code]margin[/" -"code]å¢žåŠ å‚与碰撞检测的形状的大å°ï¼Œ[code]result[/code] 是一个 " +"code] å¢žåŠ å‚与碰撞检测的形状的大å°ï¼Œ[code]result[/code] 是一个 " "[Physics2DTestMotionResult] 类型的对象,它包å«å…³äºŽç¢°æ’žçš„é¢å¤–ä¿¡æ¯ï¼ˆå¦‚果有的" "è¯ï¼‰ã€‚" @@ -67552,14 +67799,19 @@ msgstr "" "以é¿å…混淆。有关 portal 模å¼çš„完整说明,请å‚阅 [CullInstance]。" #: doc/classes/RoomManager.xml +#, fuzzy msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" "打开和关é—å…¥å£å‰”除系统。\n" "éœ€è¦æ³¨æ„的是,当入å£å‰”é™¤å¤„äºŽæ´»åŠ¨çŠ¶æ€æ—¶ï¼Œå®ƒè´Ÿè´£[b]所有[/b] 3d 剔除。æŸäº›ç¼–辑器" @@ -67725,8 +67977,8 @@ msgid "" msgstr "" "在转æ¢è¿‡ç¨‹ä¸ï¼Œ[Room] å†…å¯¹è±¡çš„å‡ ä½•å½¢çŠ¶ï¼Œæˆ–è‡ªå®šä¹‰æŒ‡å®šçš„æ‰‹åŠ¨ç»‘å®šï¼Œç”¨äºŽç”Ÿæˆ [b]凸" "多边形绑定[/b]。\n" -"这个凸多边形在å¯è§æ€§ç³»ç»Ÿä¸æ˜¯ [b]必需的[/b],并且用于许多目的。最é‡è¦çš„æ˜¯ï¼Œå®ƒ" -"用于决定[Camera](或物体)是å¦åœ¨[Room]内。凸多边形生æˆç®—法很好,但有时它会创" +"这个凸多边形在å¯è§æ€§ç³»ç»Ÿä¸æ˜¯[b]必需的[/b],并且用于许多目的。最é‡è¦çš„æ˜¯ï¼Œå®ƒç”¨" +"于决定 [Camera](或物体)是å¦åœ¨ [Room] 内。凸多边形生æˆç®—法很好,但有时它会创" "建太多(或太少)的平é¢ï¼Œæ— 法很好地表示空间体积。\n" "[code]room_simplify[/code] 值å¯ç”¨äºŽå¯¹è¯¥è¿‡ç¨‹è¿›è¡Œç²¾ç»†æŽ§åˆ¶ã€‚它决定了如何相似平é¢" "æ‰èƒ½å°†å®ƒä»¬è§†ä¸ºç›¸åŒï¼ˆå¹¶åˆ 除é‡å¤é¡¹ï¼‰ã€‚该值å¯ä»¥è®¾ç½®åœ¨ 0ï¼ˆæ— ç®€åŒ–ï¼‰å’Œ 1(最大简" @@ -68144,13 +68396,16 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" "å°†æ£åœ¨è¿è¡Œçš„场景改å˜ä¸ºç»™å®šçš„ [PackedScene] 的新实例。\n" "æˆåŠŸæ—¶è¿”å›ž [constant OK],如果场景ä¸èƒ½è¢«å®žä¾‹åŒ–,则返回 [constant " "ERR_CANT_CREATE]。\n" -"[b]注æ„:[/b]åœºæ™¯æ”¹å˜æœ‰å»¶è¿Ÿï¼Œå³æ–°çš„åœºæ™¯èŠ‚ç‚¹æ˜¯åœ¨ä¸‹ä¸€ä¸ªç©ºé—²å¸§ä¸æ·»åŠ çš„ã€‚åœ¨ " -"[method change_scene_to] 调用之åŽï¼Œä½ æ— æ³•ç«‹å³è®¿é—®åˆ°å®ƒã€‚" +"[b]注æ„:[/b]åœºæ™¯æ”¹å˜æœ‰å»¶è¿Ÿï¼Œæ–°çš„åœºæ™¯èŠ‚ç‚¹æ˜¯åœ¨ä¸‹ä¸€ä¸ªç©ºé—²å¸§ä¸æ·»åŠ çš„ã€‚åœ¨ " +"[method change_scene_to] 调用之åŽï¼Œä½ æ— æ³•ç«‹å³è®¿é—®åˆ°å®ƒã€‚\n" +"[b]注æ„:[/b]å‘è¯¥æ–¹æ³•ä¼ å…¥ [code]null[/code] 会å¸è½½å½“å‰åœºæ™¯ï¼Œä¸ä¼šåŠ è½½æ–°åœºæ™¯ã€‚" #: doc/classes/SceneTree.xml msgid "" @@ -68331,18 +68586,26 @@ msgstr "当å‰åœºæ™¯ã€‚" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" -"如果为 [code]true[/code],以调试为目的从编辑器è¿è¡Œæ¸¸æˆæ—¶ï¼Œç¢°æ’žå½¢çŠ¶å°†æ˜¯å¯è§" -"的。" +"如果为 [code]true[/code],从编辑器ä¸è¿è¡Œæ¸¸æˆæ—¶ä¼šæ˜¾ç¤ºç¢°æ’žå½¢çŠ¶ï¼Œæ–¹ä¾¿è°ƒè¯•ã€‚\n" +"[b]注æ„:[/b]这个属性ä¸åº”在è¿è¡Œæ—¶æ›´æ”¹ã€‚在è¿è¡Œé¡¹ç›®æ—¶æ›´æ”¹ [member " +"debug_collisions_hint] 的值ä¸ä¼šæœ‰æƒ³è¦çš„æ•ˆæžœã€‚" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" -"如果为 [code]true[/code],以调试为目的从编辑器è¿è¡Œæ¸¸æˆæ—¶ï¼Œå¯¼èˆªå¤šè¾¹å½¢å°†æ˜¯å¯è§" -"的。" +"如果为 [code]true[/code],从编辑器ä¸è¿è¡Œæ¸¸æˆæ—¶ä¼šæ˜¾ç¤ºå¯¼èˆªå¤šè¾¹å½¢ï¼Œæ–¹ä¾¿è°ƒè¯•。\n" +"[b]注æ„:[/b]这个属性ä¸åº”在è¿è¡Œæ—¶æ›´æ”¹ã€‚在è¿è¡Œé¡¹ç›®æ—¶æ›´æ”¹ [member " +"debug_navigation_hint] 的值ä¸ä¼šæœ‰æƒ³è¦çš„æ•ˆæžœã€‚" #: doc/classes/SceneTree.xml msgid "The root of the edited scene." @@ -68665,6 +68928,7 @@ msgid "" msgstr "通过脚本进行通用动画的轻é‡çº§å¯¹è±¡ï¼Œä½¿ç”¨ [Tweener]。" #: doc/classes/SceneTreeTween.xml +#, fuzzy msgid "" "[SceneTreeTween] is a tween managed by the scene tree. As opposed to " "[Tween], it does not require the instantiation of a node.\n" @@ -68723,6 +68987,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -68735,7 +69011,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" "[SceneTreeTween] æ˜¯ç”±åœºæ™¯æ ‘ç®¡ç†çš„补间动画。与 [Tween] 相对,ä¸éœ€è¦å®žä¾‹åŒ–节" "点。\n" @@ -69930,8 +70209,14 @@ msgstr "" "[code]color[/code]。确切的绘制方法是æ¯ä¸ªå½¢çŠ¶ç‰¹æœ‰çš„ï¼Œæ— æ³•é…置。" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." -msgstr "形状的自定义求解器å置。" +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." +msgstr "" +"该形状的的自定义求解器å差。定义了强制接触分离涉åŠåˆ°è¿™ä¸ªå½¢çŠ¶æ—¶ï¼Œç‰©ä½“ä¼šåšå‡ºå¤š" +"大的å应。\n" +"设为 [code]0.0[/code] 时,会使用默认的 [code]0.3[/code]。" #: doc/classes/ShortCut.xml msgid "A shortcut for binding input." @@ -70688,24 +70973,35 @@ msgstr "" msgid "" "Returns whether this node uses a scale of [code](1, 1, 1)[/code] or its " "local transformation scale." -msgstr "返回该节点是å¦ä½¿ç”¨[code](1, 1, 1)[/code]çš„æ¯”ä¾‹æˆ–å…¶æœ¬åœ°è½¬æ¢æ¯”例。" +msgstr "返回该节点是å¦ä½¿ç”¨ [code](1, 1, 1)[/code] çš„æ¯”ä¾‹æˆ–å…¶æœ¬åœ°å˜æ¢æ¯”例。" #: doc/classes/Spatial.xml msgid "" "Returns whether this node is set as Toplevel, that is whether it ignores its " "parent nodes transformations." -msgstr "返回该节点是å¦è¢«è®¾ç½®ä¸ºToplevel,也就是是å¦å¿½ç•¥å…¶çˆ¶èŠ‚ç‚¹çš„å˜æ¢ã€‚" +msgstr "返回该节点是å¦è¢«è®¾ç½®ä¸ºé¡¶å±‚(Toplevelï¼‰ï¼Œå³æ˜¯å¦å¿½ç•¥å…¶çˆ¶èŠ‚ç‚¹çš„å˜æ¢ã€‚" #: doc/classes/Spatial.xml msgid "" "Returns whether the node notifies about its global and local transformation " "changes. [Spatial] will not propagate this by default." msgstr "" -"返回节点是å¦é€šçŸ¥å…¶å…¨å±€å’Œå±€éƒ¨çš„å˜æ¢å˜åŒ–。默认情况下,[Spatial]ä¸ä¼šå¯¹æ¤è¿›è¡Œä¼ " +"返回节点是å¦é€šçŸ¥å…¶å…¨å±€å’Œå±€éƒ¨çš„å˜æ¢å˜åŒ–。默认情况下 [Spatial] ä¸ä¼šå¯¹æ¤è¿›è¡Œä¼ " "æ’。" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" +"如果该节点ä½äºŽ [SceneTree] ä¸ï¼Œå¹¶ä¸”å…¶ [member visible] 属性为 [code]true[/" +"code],并且其所有上层节点也å‡å¯è§ï¼Œåˆ™è¿”回 [code]true[/code]。如果任何上层节点" +"被éšè—ï¼Œåˆ™è¯¥èŠ‚ç‚¹åœ¨åœºæ™¯æ ‘ä¸å°†ä¸å¯è§ã€‚" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -70733,8 +71029,8 @@ msgid "" "itself to point toward the [code]target[/code] as per [method look_at]. " "Operations take place in global space." msgstr "" -"将节点移动到指定的[code]position[/code]ï¼Œç„¶åŽæŒ‰ç…§[method look_at]çš„è¦æ±‚旋转自" -"己以指å‘[code]target[/code]。æ“作是在全局空间进行的。" +"将节点移动到指定的 [code]position[/code]ï¼Œç„¶åŽæŒ‰ç…§ [method look_at] çš„è¦æ±‚æ—‹" +"è½¬è‡ªå·±ä»¥æŒ‡å‘ [code]target[/code]。æ“作是在全局空间进行的。" #: doc/classes/Spatial.xml msgid "" @@ -70756,7 +71052,7 @@ msgid "" "Rotates the local transformation around axis, a unit [Vector3], by specified " "angle in radians. The rotation axis is in object-local coordinate system." msgstr "" -"围绕轴(å•ä½ [Vector3]ï¼‰æ—‹è½¬æœ¬åœ°å˜æ¢ï¼ŒæŒ‡å®šè§’度(弧度)。旋转轴是在物体的本地" +"围绕轴(å•ä½ [Vector3]ï¼‰æ—‹è½¬å±€éƒ¨å˜æ¢ï¼ŒæŒ‡å®šè§’度(弧度)。旋转轴是在物体的本地" "åæ ‡ç³»ä¸ã€‚" #: doc/classes/Spatial.xml @@ -70979,9 +71275,9 @@ msgid "" msgstr "" "å½“ç©ºé—´èŠ‚ç‚¹çš„å…¨å±€å˜æ¢å‘生å˜åŒ–时,空间节点会收到这个通知。这æ„味ç€å½“å‰èŠ‚ç‚¹æˆ–çˆ¶" "节点改å˜äº†å®ƒçš„å˜æ¢ã€‚\n" -"为了使[constant NOTIFICATION_TRANSFORM_CHANGED]生效,用户首先需è¦ç”¨[method " -"set_notify_transform]å‘é€è¯·æ±‚。如果节点是在编辑器的上下文ä¸ï¼Œå¹¶ä¸”它有一个有效" -"çš„gizmo,那么该通知也会被å‘é€ã€‚" +"为了使 [constant NOTIFICATION_TRANSFORM_CHANGED] 生效,用户首先需è¦ç”¨ " +"[method set_notify_transform] å‘é€è¯·æ±‚。如果节点是在编辑器的上下文ä¸ï¼Œå¹¶ä¸”它" +"有一个有效的控制器(Gizmo),那么该通知也会被å‘é€ã€‚" #: doc/classes/Spatial.xml msgid "" @@ -71033,8 +71329,7 @@ msgid "" "Returns [code]true[/code], if the specified flag is enabled. See [enum " "Flags] enumerator for options." msgstr "" -"å¦‚æžœæŒ‡å®šçš„æ ‡å¿—è¢«å¯ç”¨ï¼Œè¿”回 [code]true[/code]。å‚阅 [enum Flags] 枚举器的选" -"项。" +"å¦‚æžœæŒ‡å®šçš„æ ‡å¿—è¢«å¯ç”¨ï¼Œè¿”回 [code]true[/code]ã€‚é€‰é¡¹è§ [enum Flags] 枚举值。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71063,8 +71358,8 @@ msgid "" msgstr "" "如果为 [code]true[/code],则å¯ç”¨æŒ‡å®šçš„æ ‡å¿—ã€‚æ ‡å¿—æ˜¯å¯ä»¥æ‰“开和关é—çš„å¯é€‰è¡Œä¸ºã€‚" "使用该函数一次åªèƒ½å¯ç”¨ä¸€ä¸ªæ ‡å¿—,ä¸èƒ½å°†æ ‡å¿—枚举值åƒä½æŽ©ç ä¸€æ ·è¿›è¡Œåˆå¹¶ï¼Œä¸€æ¬¡å¯" -"用或ç¦ç”¨å¤šä¸ªæ ‡å¿—。也å¯ä»¥é€šè¿‡å°†ç›¸åº”æˆå‘˜è®¾ç½®ä¸º [code]true[/code] æ¥å¯ç”¨æ ‡å¿—。有" -"关选项,请å‚阅 [enum Flags] 枚举器。" +"用或ç¦ç”¨å¤šä¸ªæ ‡å¿—。也å¯ä»¥é€šè¿‡å°†ç›¸åº”æˆå‘˜è®¾ç½®ä¸º [code]true[/code] æ¥å¯ç”¨æ ‡å¿—。选" +"é¡¹è§ [enum Flags] 枚举值。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71103,7 +71398,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" "如果为 [code]true[/code],则å¯ç”¨å„å‘异性。å„å‘异性会改å˜é•œé¢å射斑点的形状并" "将其与切线空间对其。å¯ç”¨äºŽæ‹‰ä¸é“æå’Œæ¯›å‘å射。\n" @@ -71111,7 +71408,8 @@ msgstr "" "效果就会看上去有问题。\n" "[b]注æ„:[/b]æè´¨çš„å„å‘异性ä¸åº”与纹ç†çš„å„å‘异性过滤相混淆。纹ç†å„å‘异性过滤的" "å¯ç”¨æ–¹æ³•是,在“文件系统â€é¢æ¿ä¸é€‰ä¸çº¹ç†ï¼Œç„¶åŽåœ¨â€œå¯¼å…¥â€é¢æ¿ä¸å‹¾é€‰[b]å„å‘异性[/b]" -"å¤é€‰æ¡†ï¼Œç„¶åŽç‚¹å‡»[b]釿–°å¯¼å…¥[/b]。" +"å¤é€‰æ¡†ï¼Œç„¶åŽç‚¹å‡»[b]釿–°å¯¼å…¥[/b]。å„å‘异性过滤级别å¯ä»¥é€šè¿‡ [member " +"ProjectSettings.rendering/quality/filters/anisotropic_filter_level] 调整。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71391,7 +71689,7 @@ msgstr "指定è¦ä½¿ç”¨çš„æ·¡å…¥æ·¡å‡ºç±»åž‹ã€‚å¯ä»¥æ˜¯ä»»ä½•一个 [enum Dista #: doc/classes/SpatialMaterial.xml msgid "The emitted light's color. See [member emission_enabled]." -msgstr "å‘出的光的颜色。å‚阅 [member emission_enabled]。" +msgstr "å‘å‡ºçš„å…‰çš„é¢œè‰²ã€‚è§ [member emission_enabled]。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71428,7 +71726,7 @@ msgstr "纹ç†ï¼ŒæŒ‡å®šæŸç‚¹çš„表é¢å‘光的程度。" msgid "" "Forces a conversion of the [member albedo_texture] from sRGB space to linear " "space." -msgstr "强制将 [member albedo_texture] 从sRGB空间转æ¢ä¸ºçº¿æ€§ç©ºé—´ã€‚" +msgstr "强制将 [member albedo_texture] 从 sRGB 空间转æ¢ä¸ºçº¿æ€§ç©ºé—´ã€‚" #: doc/classes/SpatialMaterial.xml msgid "Enables signed distance field rendering shader." @@ -71464,7 +71762,7 @@ msgid "" "If [code]true[/code], transparency is enabled on the body. See also [member " "params_blend_mode]." msgstr "" -"如果为 [code]true[/code],则å¯ç”¨ç‰©ä½“çš„é€æ˜Žåº¦ã€‚å‚阅 [member " +"如果为 [code]true[/code],则å¯ç”¨ç‰©ä½“çš„é€æ˜Žåº¦ã€‚å¦è¯·å‚阅 [member " "params_blend_mode]。" #: doc/classes/SpatialMaterial.xml @@ -71565,7 +71863,7 @@ msgstr "" msgid "" "Texture used to specify metallic for an object. This is multiplied by " "[member metallic]." -msgstr "用于指定对象的金属质感。æ¤å€¼ä¹˜ [member metallic]。" +msgstr "用于指定对象的金属质感。这个值会与 [member metallic] 相乘。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71634,9 +71932,9 @@ msgid "" "head instead of on the table. See [url=https://github.com/godotengine/godot/" "issues/41567]GitHub issue #41567[/url] for details." msgstr "" -"控制对象如何é¢å‘æ‘„åƒæœºã€‚å‚阅[enum BillboardMode]。\n" -"[b]注æ„:[/b]广告牌模å¼ä¸é€‚åˆVRï¼Œå› ä¸ºå½“å±å¹•è´´åœ¨ä½ çš„å¤´éƒ¨è€Œä¸æ˜¯åœ¨æ¡Œå上时,摄åƒ" -"机的左å³å‘é‡ä¸æ˜¯æ°´å¹³çš„。å‚阅[url=https://github.com/godotengine/godot/" +"控制对象如何é¢å‘æ‘„åƒæœºã€‚è§ [enum BillboardMode]。\n" +"[b]注æ„:[/b]广告牌模å¼ä¸é€‚åˆ VRï¼Œå› ä¸ºå½“å±å¹•è´´åœ¨ä½ çš„å¤´éƒ¨è€Œä¸æ˜¯åœ¨æ¡Œå上时,摄" +"åƒæœºçš„å·¦å³å‘é‡ä¸æ˜¯æ°´å¹³çš„ã€‚è¯¦è§ [url=https://github.com/godotengine/godot/" "issues/41567]GitHub issue #41567[/url]。" #: doc/classes/SpatialMaterial.xml @@ -71646,7 +71944,7 @@ msgid "" "transparent pipeline. See [enum BlendMode]." msgstr "" "æè´¨çš„æ··åˆæ¨¡å¼ã€‚\n" -"[b]注æ„:[/b]除 [code]Mix[/code] ä»¥å¤–çš„å€¼ä¼šå¼ºåˆ¶å¯¹è±¡è¿›å…¥é€æ˜Žç®¡é“。å‚阅 [enum " +"[b]注æ„:[/b]除 [code]Mix[/code] ä»¥å¤–çš„å€¼ä¼šå¼ºåˆ¶å¯¹è±¡è¿›å…¥é€æ˜Žç®¡é“ã€‚è§ [enum " "BlendMode]。" #: doc/classes/SpatialMaterial.xml @@ -71673,7 +71971,7 @@ msgid "" "If [code]true[/code], enables the vertex grow setting. See [member " "params_grow_amount]." msgstr "" -"如果为 [code]true[/code],å¯ç”¨é¡¶ç‚¹ç”Ÿé•¿è®¾ç½®ã€‚å‚è§[member params_grow_amount]。" +"如果为 [code]true[/code],å¯ç”¨é¡¶ç‚¹ç”Ÿé•¿è®¾ç½®ã€‚è§ [member params_grow_amount]。" #: doc/classes/SpatialMaterial.xml msgid "Grows object vertices in the direction of their normals." @@ -71685,19 +71983,19 @@ msgstr "ç›®å‰åœ¨ Godot 䏿œªå®žçŽ°ã€‚" #: doc/classes/SpatialMaterial.xml msgid "The point size in pixels. See [member flags_use_point_size]." -msgstr "点的大å°ï¼Œä»¥åƒç´ 为å•ä½ã€‚å‚è§[member flags_use_point_size]。" +msgstr "点的大å°ï¼Œä»¥åƒç´ 为å•ä½ã€‚è§ [member flags_use_point_size]。" #: doc/classes/SpatialMaterial.xml msgid "The method for rendering the specular blob. See [enum SpecularMode]." -msgstr "镜é¢å射斑点的渲染方法。请å‚阅 [enum SpecularMode]。" +msgstr "镜é¢åå°„æ–‘ç‚¹çš„æ¸²æŸ“æ–¹æ³•ã€‚è§ [enum SpecularMode]。" #: doc/classes/SpatialMaterial.xml msgid "" "If [code]true[/code], the shader will discard all pixels that have an alpha " "value less than [member params_alpha_scissor_threshold]." msgstr "" -"如果为 [code]true[/code],ç€è‰²å™¨å°†ä¸¢å¼ƒæ‰€æœ‰alpha值å°äºŽ[member " -"params_alpha_scissor_threshold]çš„åƒç´ 。" +"如果为 [code]true[/code],ç€è‰²å™¨å°†ä¸¢å¼ƒæ‰€æœ‰ Alpha 值å°äºŽ [member " +"params_alpha_scissor_threshold] çš„åƒç´ 。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71705,7 +72003,7 @@ msgid "" "when using [constant BILLBOARD_PARTICLES]. See [member " "params_billboard_mode]." msgstr "" -"ç²’åç²¾çµè¡¨ä¸çš„æ°´å¹³å¸§æ•°ã€‚仅在使用 [constant BILLBOARD_PARTICLES] æ—¶å¯ç”¨ã€‚å‚阅" +"ç²’åç²¾çµè¡¨ä¸çš„æ°´å¹³å¸§æ•°ã€‚仅在使用 [constant BILLBOARD_PARTICLES] æ—¶å¯ç”¨ã€‚è§ " "[member params_billboard_mode]。" #: doc/classes/SpatialMaterial.xml @@ -71714,7 +72012,7 @@ msgid "" "using [constant BILLBOARD_PARTICLES]. See [member params_billboard_mode]." msgstr "" "如果为 [code]true[/code],循环粒å动画。仅在使用 [constant " -"BILLBOARD_PARTICLES] æ—¶å¯ç”¨ã€‚å‚阅[member params_billboard_mode]。" +"BILLBOARD_PARTICLES] æ—¶å¯ç”¨ã€‚è§ [member params_billboard_mode]。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71722,7 +72020,7 @@ msgid "" "when using [constant BILLBOARD_PARTICLES]. See [member " "params_billboard_mode]." msgstr "" -"ç²’åç²¾çµè¡¨ä¸çš„垂直帧数。仅在使用 [constant BILLBOARD_PARTICLES] æ—¶å¯ç”¨ã€‚å‚阅" +"ç²’åç²¾çµè¡¨ä¸çš„垂直帧数。仅在使用 [constant BILLBOARD_PARTICLES] æ—¶å¯ç”¨ã€‚è§ " "[member params_billboard_mode]。" #: doc/classes/SpatialMaterial.xml @@ -71760,7 +72058,7 @@ msgstr "æŠ˜å°„æ•ˆæžœçš„å¼ºåº¦ã€‚è¾ƒé«˜çš„å€¼ä¼šä½¿æŠ˜å°„çš„è¡¨çŽ°æ›´åŠ æ‰æ›²ã€‚ msgid "" "Texture that controls the strength of the refraction per-pixel. Multiplied " "by [member refraction_scale]." -msgstr "控制æ¯ä¸ªåƒç´ 折射强度的纹ç†ã€‚乘以[member refraction_scale]。" +msgstr "控制æ¯ä¸ªåƒç´ 折射强度的纹ç†ã€‚会与 [member refraction_scale] 相乘。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71770,9 +72068,9 @@ msgid "" "stored metallic in the red channel, roughness in the blue, and ambient " "occlusion in the green you could reduce the number of textures you use." msgstr "" -"指定å˜å‚¨æŠ˜å°„ä¿¡æ¯çš„[member refraction_texture]的通é“ã€‚å½“ä½ åœ¨çº¹ç†ä¸å˜å‚¨å¤šç§æ•ˆæžœ" -"çš„ä¿¡æ¯æ—¶ï¼Œè¿™å¾ˆæœ‰ç”¨ã€‚ä¾‹å¦‚ï¼Œå¦‚æžœä½ åœ¨çº¢è‰²é€šé“ä¸å˜å‚¨é‡‘属效果,在è“色通é“ä¸å˜å‚¨ç²—" -"糙度,在绿色通é“ä¸å˜å‚¨çŽ¯å¢ƒé®æŒ¡ï¼Œå°±å¯ä»¥å‡å°‘使用纹ç†çš„æ•°é‡ã€‚" +"指定å˜å‚¨æŠ˜å°„ä¿¡æ¯çš„ [member refraction_texture] 的通é“ã€‚å½“ä½ åœ¨çº¹ç†ä¸å˜å‚¨å¤šç§æ•ˆ" +"æžœçš„ä¿¡æ¯æ—¶ï¼Œè¿™å¾ˆæœ‰ç”¨ã€‚ä¾‹å¦‚ï¼Œå¦‚æžœä½ åœ¨çº¢è‰²é€šé“ä¸å˜å‚¨é‡‘属效果,在è“色通é“ä¸å˜å‚¨" +"粗糙度,在绿色通é“ä¸å˜å‚¨çŽ¯å¢ƒé®æŒ¡ï¼Œå°±å¯ä»¥å‡å°‘使用纹ç†çš„æ•°é‡ã€‚" #: doc/classes/SpatialMaterial.xml msgid "Sets the strength of the rim lighting effect." @@ -71794,7 +72092,7 @@ msgstr "" msgid "" "Texture used to set the strength of the rim lighting effect per-pixel. " "Multiplied by [member rim]." -msgstr "纹ç†ç”¨äºŽè®¾ç½®æ¯ä¸ªåƒç´ 的边缘光照效果的强度。乘以 [member rim]。" +msgstr "纹ç†ç”¨äºŽè®¾ç½®æ¯ä¸ªåƒç´ 的边缘光照效果的强度。会与 [member rim] 相乘。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71818,7 +72116,7 @@ msgstr "" msgid "" "Texture used to control the roughness per-pixel. Multiplied by [member " "roughness]." -msgstr "用于控制æ¯ä¸ªåƒç´ 粗糙度的纹ç†ã€‚乘以 [member roughness]。" +msgstr "用于控制æ¯ä¸ªåƒç´ 粗糙度的纹ç†ã€‚会与 [member roughness] 相乘。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71837,8 +72135,8 @@ msgid "" "Texture used to control the subsurface scattering strength. Stored in the " "red texture channel. Multiplied by [member subsurf_scatter_strength]." msgstr "" -"ç”¨äºŽæŽ§åˆ¶æ¬¡è¡¨é¢æ•£å°„强度的纹ç†ã€‚å˜å‚¨åœ¨çº¢è‰²çº¹ç†é€šé“ä¸ã€‚乘以 [member " -"subsurf_scatter_strength]。" +"ç”¨äºŽæŽ§åˆ¶æ¬¡è¡¨é¢æ•£å°„强度的纹ç†ã€‚å˜å‚¨åœ¨çº¢è‰²çº¹ç†é€šé“ä¸ã€‚会与 [member " +"subsurf_scatter_strength] 相乘。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71854,7 +72152,7 @@ msgstr "如果为 [code]true[/code],则å¯ç”¨ä¼ 输效果。" msgid "" "Texture used to control the transmission effect per-pixel. Added to [member " "transmission]." -msgstr "纹ç†ç”¨äºŽæŽ§åˆ¶æ¯ä¸ªåƒç´ çš„ä¼ è¾“æ•ˆæžœã€‚æ·»åŠ åˆ° [member transmission]。" +msgstr "纹ç†ç”¨äºŽæŽ§åˆ¶æ¯ä¸ªåƒç´ çš„ä¼ è¾“æ•ˆæžœã€‚ä¼šä¸Ž [member transmission] ç›¸åŠ ã€‚" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71862,7 +72160,7 @@ msgid "" "added to [code]UV[/code] in the vertex function. This can be used to offset " "a texture." msgstr "" -"[code]UV[/code]åæ ‡çš„åç§»é‡ã€‚这个é‡å°†è¢«æ·»åŠ åˆ°é¡¶ç‚¹å‡½æ•°ä¸çš„ [code]UV[/code] " +"[code]UV[/code] åæ ‡çš„åç§»é‡ã€‚这个é‡å°†è¢«æ·»åŠ åˆ°é¡¶ç‚¹å‡½æ•°ä¸çš„ [code]UV[/code] " "ä¸ã€‚è¿™å¯ä»¥ç”¨æ¥å移纹ç†ã€‚" #: doc/classes/SpatialMaterial.xml @@ -71870,7 +72168,7 @@ msgid "" "How much to scale the [code]UV[/code] coordinates. This is multiplied by " "[code]UV[/code] in the vertex function." msgstr "" -"缩放 [code]UV[/code] åæ ‡çš„多少。这个值乘以顶点函数ä¸çš„ [code]UV[/code]。" +"[code]UV[/code] åæ ‡çš„缩放é‡ã€‚这个值会与顶点函数ä¸çš„ [code]UV[/code] 相乘。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71912,7 +72210,7 @@ msgid "" "How much to scale the [code]UV2[/code] coordinates. This is multiplied by " "[code]UV2[/code] in the vertex function." msgstr "" -"缩放 [code]UV[/code] åæ ‡çš„多少。这个值乘以顶点函数ä¸çš„ [code]UV[/code]。" +"[code]UV2[/code] åæ ‡çš„缩放é‡ã€‚这个值会与顶点函数ä¸çš„ [code]UV2[/code] 相乘。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71979,7 +72277,7 @@ msgstr "指定æ¯ä¸ªåƒç´ æµå›¾æ–¹å‘的纹ç†ï¼Œç”¨äºŽ [member anisotropy]。" #: doc/classes/SpatialMaterial.xml msgid "Texture specifying per-pixel ambient occlusion value." -msgstr "指定æ¯ä¸ªåƒç´ çŽ¯å¢ƒé®æŒ¡å€¼çš„纹ç†ã€‚" +msgstr "指定æ¯ä¸ªåƒç´ 环境光é®è”½çš„纹ç†ã€‚" #: doc/classes/SpatialMaterial.xml msgid "Texture specifying per-pixel depth." @@ -71987,7 +72285,7 @@ msgstr "指定æ¯ä¸ªåƒç´ 深度的纹ç†ã€‚" #: doc/classes/SpatialMaterial.xml msgid "Texture specifying per-pixel subsurface scattering." -msgstr "指定æ¯ä¸ªåƒç´ çš„äºšè¡¨é¢æ•£å°„的纹ç†ã€‚" +msgstr "指定æ¯ä¸ªåƒç´ çš„æ¬¡è¡¨é¢æ•£å°„的纹ç†ã€‚" #: doc/classes/SpatialMaterial.xml msgid "Texture specifying per-pixel transmission color." @@ -72097,7 +72395,7 @@ msgstr "ä¸é€æ˜Žå’Œé€æ˜Žçš„对象都è¦è®¡ç®—深度绘制。" #: doc/classes/SpatialMaterial.xml msgid "No depth draw." -msgstr "没有深度的绘制。" +msgstr "ä¸è¿›è¡Œæ·±åº¦ç»˜åˆ¶ã€‚" #: doc/classes/SpatialMaterial.xml msgid "" @@ -72107,7 +72405,7 @@ msgstr "å¯¹äºŽé€æ˜Žå¯¹è±¡ï¼Œé¦–先对ä¸é€æ˜Žéƒ¨åˆ†è¿›è¡Œä¸é€æ˜Žä¼ 递,然 #: doc/classes/SpatialMaterial.xml msgid "Default cull mode. The back of the object is culled when not visible." -msgstr "默认的è£å‰ªæ¨¡å¼ã€‚当ä¸å¯è§æ—¶ï¼Œå¯¹è±¡çš„背é¢ä¼šè¢«å‰”除。" +msgstr "默认的剔除模å¼ã€‚对象的背é¢ä¼šåœ¨ä¸å¯è§æ—¶è¢«å‰”除。" #: doc/classes/SpatialMaterial.xml msgid "The front of the object is culled when not visible." @@ -72259,11 +72557,11 @@ msgstr "广告牌模å¼è¢«ç¦ç”¨ã€‚" #: doc/classes/SpatialMaterial.xml msgid "The object's Z axis will always face the camera." -msgstr "对象的Z轴将始终é¢å‘相机。" +msgstr "对象的 Z 轴将始终é¢å‘相机。" #: doc/classes/SpatialMaterial.xml msgid "The object's X axis will always face the camera." -msgstr "对象的X轴将始终é¢å‘相机。" +msgstr "对象的 X 轴将始终é¢å‘相机。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -72319,7 +72617,7 @@ msgid "" "faster than [constant DISTANCE_FADE_PIXEL_ALPHA]." msgstr "" "æ ¹æ®æ¯ä¸ªåƒç´ 与相机的è·ç¦»ï¼Œä½¿ç”¨æŠ–åŠ¨æ–¹æ³•å¹³æ»‘åœ°æ·¡åŒ–å¯¹è±¡ã€‚æŠ–åŠ¨ä¼šæ ¹æ®è®¾å®šçš„æ¨¡å¼ä¸¢" -"弃åƒç´ ,在ä¸å¯ç”¨é€æ˜Žçš„æƒ…况下平滑淡化。在æŸäº›ç¡¬ä»¶ä¸Šï¼Œè¿™æ¯” [constant " +"弃åƒç´ ,在ä¸å¯ç”¨é€æ˜Žçš„æƒ…况下平滑淡化。在æŸäº›ç¡¬ä»¶ä¸Šæ¯” [constant " "DISTANCE_FADE_PIXEL_ALPHA] 更快。" #: doc/classes/SpatialMaterial.xml @@ -72330,8 +72628,8 @@ msgid "" "faster than [constant DISTANCE_FADE_PIXEL_ALPHA]." msgstr "" "æ ¹æ®å¯¹è±¡ä¸Žç›¸æœºçš„è·ç¦»ï¼Œä½¿ç”¨æŠ–åŠ¨çš„æ–¹æ³•å¹³æ»‘åœ°æ·¡åŒ–å¯¹è±¡ã€‚æŠ–åŠ¨æ ¹æ®è®¾å®šçš„æ¨¡å¼ä¸¢å¼ƒåƒ" -"ç´ ï¼Œåœ¨ä¸å¯ç”¨é€æ˜Žåº¦çš„æƒ…况下平滑淡化。在æŸäº›ç¡¬ä»¶ä¸Šï¼Œè¿™å¯èƒ½æ¯”[constant " -"DISTANCE_FADE_PIXEL_ALPHA]更快。" +"ç´ ï¼Œåœ¨ä¸å¯ç”¨é€æ˜Žåº¦çš„æƒ…况下平滑淡化。在æŸäº›ç¡¬ä»¶ä¸Šå¯èƒ½æ¯” [constant " +"DISTANCE_FADE_PIXEL_ALPHA] 更快。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -72828,10 +73126,10 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" -"è¦ç»˜åˆ¶çš„ [Texture] 对象。如果 [member GeometryInstance.material_override] 被" -"使用,这将被覆盖。" +"è¦ç»˜åˆ¶çš„ [Texture] 对象。如果使用了 [member GeometryInstance." +"material_override],这将被覆盖。ä»ä¼šä½¿ç”¨å…¶å¤§å°ä¿¡æ¯ã€‚" #: doc/classes/SpriteBase3D.xml msgid "2D sprite node in 3D environment." @@ -72919,8 +73217,8 @@ msgid "" "sorted from back to front (subject to priority)." msgstr "" "设置该精çµçš„æ¸²æŸ“优先级。优先级高的物体将被排åºåœ¨ä¼˜å…ˆçº§ä½Žçš„物体å‰é¢ã€‚\n" -"[b]注æ„:[/b]仅在 [member alpha_cut] 为 [constant " -"ALPHA_CUT_DISABLED](默认值)时适用。\n" +"[b]注æ„:[/b]仅在 [member alpha_cut] 为 [constant ALPHA_CUT_DISABLED](默认" +"值)时适用。\n" "[b]注æ„:[/b]ä»…é€‚ç”¨äºŽé€æ˜Žç‰©ä½“的排åºã€‚è¿™ä¸ä¼šå½±å“逿˜Žç‰©ä½“相对于ä¸é€æ˜Žç‰©ä½“的排åº" "æ–¹å¼ã€‚è¿™æ˜¯å› ä¸ºä¸é€æ˜Žå¯¹è±¡ä¸è¢«æŽ’åºï¼Œè€Œé€æ˜Žå¯¹è±¡åˆ™ä»ŽåŽå¾€å‰æŽ’åºï¼ˆå–决于优先级)。" @@ -73703,7 +74001,7 @@ msgstr "" msgid "" "Returns a copy of the string with special characters escaped using the C " "language standard." -msgstr "返回一个使用Cè¯è¨€æ ‡å‡†è½¬ä¹‰çš„特殊å—符的å—符串的副本。" +msgstr "返回一个使用 C è¯è¨€æ ‡å‡†è½¬ä¹‰çš„特殊å—符的å—符串的副本。" #: doc/classes/String.xml msgid "" @@ -74426,6 +74724,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -74441,6 +74742,8 @@ msgstr "" "从å³ä¾§å¼€å§‹ï¼Œé€šè¿‡ [code]delimiter[/code] å—符串拆分å—符串并返回åå—符串数" "组。\n" "返回数组ä¸çš„æ‹†åˆ†æŒ‰ä¸ŽåŽŸå§‹å—符串相åŒçš„顺åºä»Žå·¦åˆ°å³æŽ’åºã€‚\n" +"如果 [code]allow_empty[/code] 为 [code]true[/code],并且该å—符串ä¸å˜åœ¨ä¸¤ä¸ªè¿ž" +"ç»çš„分隔符,就会将一个空å—ç¬¦ä¸²åŠ å…¥åˆ°åå—符串数组的这个ä½ç½®ä¸ã€‚\n" "如果指定了 [code]maxsplit[/code],它定义了从å³è¾¹åˆ° [code]maxsplit[/code] 的分" "割数。默认值 0 è¡¨ç¤ºæ‰€æœ‰é¡¹ç›®éƒ½è¢«æ‹†åˆ†ï¼Œå› æ¤ç»™å‡ºä¸Ž [method split] 相åŒçš„结果。\n" "例å:\n" @@ -74513,6 +74816,9 @@ msgstr "返回简化的规范路径。" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -74531,6 +74837,8 @@ msgid "" msgstr "" "通过 [code]delimiter[/code] å—符串拆分å—符串并返回åå—符串数组。" "[code]delimiter[/code] å¯ä»¥æ˜¯ä»»æ„长度。\n" +"如果 [code]allow_empty[/code] 为 [code]true[/code],并且该å—符串ä¸å˜åœ¨ä¸¤ä¸ªè¿ž" +"ç»çš„分隔符,就会将一个空å—ç¬¦ä¸²åŠ å…¥åˆ°åå—符串数组的这个ä½ç½®ä¸ã€‚\n" "如果指定了 [code]maxsplit[/code],它定义了从左边到 [code]maxsplit[/code] 的分" "割次数。默认值 [code]0[/code] 表示所有项目都被拆分。\n" "å¦‚æžœä½ åªéœ€è¦è¯¥æ•°ç»„ä¸çš„æŸä¸ªå…ƒç´ ï¼Œ[method get_slice] 是一个效率更高的选项。\n" @@ -74549,11 +74857,16 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" "使用分隔符å—符串将å—符串拆分为浮点数,并返回åå—符串数组。\n" "例如,如果被 [code]\",\"[/code] 分割,[code]\"1,2.5,3\"[/code] 将返回 [code]" -"[1,2.5,3][/code] 。" +"[1,2.5,3][/code] 。\n" +"如果 [code]allow_empty[/code] 为 [code]true[/code],并且该å—符串ä¸å˜åœ¨ä¸¤ä¸ªè¿ž" +"ç»çš„分隔符,就会将一个空å—ç¬¦ä¸²åŠ å…¥åˆ°åå—符串数组的这个ä½ç½®ä¸ã€‚" #: doc/classes/String.xml msgid "" @@ -75970,6 +76283,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "如果å¯ç”¨é¼ æ ‡å³é”®é€‰æ‹©ï¼Œåˆ™è¿”回 [code]true[/code]。" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "返回索引 [code]tab_idx[/code] 处的选项å¡çš„æŒ‰é’®å›¾æ ‡ã€‚" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "返回å‘å·¦å移的éšè—选项å¡çš„æ•°é‡ã€‚" @@ -75999,6 +76316,10 @@ msgid "" msgstr "如果为 [code]true[/code],å¯ç”¨é¼ æ ‡å³é”®é€‰æ‹©é€‰é¡¹å¡ã€‚" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "为索引 [code]tab_idx[/code] 处的选项å¡è®¾ç½®æŒ‰é’®å›¾æ ‡ã€‚" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "为索引 [code]tab_idx[/code] 处的选项å¡è®¾ç½® [code]icon[/code]。" @@ -76012,8 +76333,8 @@ msgid "" "dragging tabs between [Tabs]. Enable drag with [member " "drag_to_rearrange_enabled]." msgstr "" -"å®šä¹‰é‡æ–°æŽ’列组的ID。为æ¯ä¸ª[Tabs]选择相åŒçš„值,以便在[Tabs]ä¹‹é—´æ‹–åŠ¨æ ‡ç¾ã€‚用" -"[member drag_to_rearrange_enabled]å¯ç”¨æ‹–动。" +"å®šä¹‰é‡æ–°æŽ’列组的 ID。为æ¯ä¸ª [Tabs] 选择相åŒçš„值,以便在 [Tabs] ä¹‹é—´æ‹–åŠ¨æ ‡ç¾ã€‚" +"用 [member drag_to_rearrange_enabled] å¯ç”¨æ‹–动。" #: doc/classes/Tabs.xml msgid "Select tab at index [code]tab_idx[/code]." @@ -76042,12 +76363,13 @@ msgid "" "Emitted when the active tab is rearranged via mouse drag. See [member " "drag_to_rearrange_enabled]." msgstr "" -"é€šè¿‡é¼ æ ‡æ‹–åŠ¨é‡æ–°æŽ’åˆ—æ´»åŠ¨é€‰é¡¹å¡æ—¶å‘出。å‚阅 [member " -"drag_to_rearrange_enabled]。" +"é€šè¿‡é¼ æ ‡æ‹–åŠ¨é‡æ–°æŽ’åˆ—æ´»åŠ¨é€‰é¡¹å¡æ—¶å‘å‡ºã€‚è§ [member drag_to_rearrange_enabled]。" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." -msgstr "当选项å¡è¢«å³é”®å•击时å‘出。" +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." +msgstr "选项å¡çš„å³ä¾§æŒ‰é’®è¢«æŒ‰ä¸‹æ—¶å‘å‡ºã€‚è§ [method set_tab_button_icon]。" #: doc/classes/Tabs.xml msgid "Emitted when a tab is clicked, even if it is the current tab." @@ -76473,13 +76795,13 @@ msgid "" " var res_column = result[TextEdit.SEARCH_RESULT_COLUMN]\n" "[/codeblock]" msgstr "" -"在文本内部进行æœç´¢ã€‚æœç´¢æ ‡å¿—å¯ä»¥åœ¨[enum SearchFlags]æžšä¸¾ä¸æŒ‡å®šã€‚\n" -"如果没有找到结果,返回一个空的[code]PoolIntArray[/code]。å¦åˆ™ï¼Œå¯ä»¥é€šè¿‡[enum " -"SearchResult]æžšä¸¾ä¸æŒ‡å®šçš„索引访问结果行和列,例如。\n" +"在文本内部进行æœç´¢ã€‚æœç´¢æ ‡å¿—å¯ä»¥ç”¨ [enum SearchFlags] 枚举指定。\n" +"如果没有找到结果,返回一个空的 [code]PoolIntArray[/code]。å¦åˆ™ï¼Œå¯ä»¥é€šè¿‡ " +"[enum SearchResult] æžšä¸¾ä¸æŒ‡å®šçš„索引访问结果行和列,例如:\n" "[codeblock]\n" "var result = search(key, flags, line, column)\n" "if result.size() > 0:\n" -" # 找到的结果。\n" +" # 找到结果。\n" " var res_line = result[TextEdit.SEARCH_RESULT_LINE)\n" " var res_column = result[TextEdit.SEARCH_RESULT_COLUMN]\n" "[/codeblock]" @@ -76510,8 +76832,8 @@ msgid "" "code]. Deletes the bookmark if [code]bookmark[/code] is [code]false[/code].\n" "Bookmarks are shown in the [member breakpoint_gutter]." msgstr "" -"如果 [code]bookmark[/code] 为 [code]true[/code],则为行 [code]line[/code] " -"设置书ç¾ã€‚如果 [code]bookmark[/code] 为 [code]false[/code]ï¼Œåˆ™åˆ é™¤è¯¥ä¹¦ç¾ã€‚\n" +"如果 [code]bookmark[/code] 为 [code]true[/code],则为行 [code]line[/code] 设" +"置书ç¾ã€‚如果 [code]bookmark[/code] 为 [code]false[/code]ï¼Œåˆ™åˆ é™¤è¯¥ä¹¦ç¾ã€‚\n" "ä¹¦ç¾æ˜¾ç¤ºåœ¨ [member breakpoint_gutter] ä¸ã€‚" #: doc/classes/TextEdit.xml @@ -76944,7 +77266,7 @@ msgid "" "Returns an [Image] that is a copy of data from this [Texture]. [Image]s can " "be accessed and manipulated directly." msgstr "" -"返回一个 [Image]ï¼Œå®ƒæ˜¯æ¤ [Texture] 䏿•°æ®çš„副本。[Image] 图åƒå¯ä»¥ç›´æŽ¥è®¿é—®å’Œæ“" +"返回一个 [Image],它是这个 [Texture] 䏿•°æ®çš„副本。[Image] å¯ä»¥ç›´æŽ¥è®¿é—®å’Œæ“" "作。" #: doc/classes/Texture.xml @@ -77290,7 +77612,7 @@ msgstr "返回纹ç†çš„高度。高度通常由Y轴表示。" #: doc/classes/TextureLayered.xml msgid "" "Returns an [Image] resource with the data from specified [code]layer[/code]." -msgstr "返回一个带有指定[code]layer[/code]层数æ®çš„[Image]图åƒèµ„æºã€‚" +msgstr "返回一个带有指定 [code]layer[/code] 层数æ®çš„ [Image] 图åƒèµ„æºã€‚" #: doc/classes/TextureLayered.xml msgid "" @@ -77639,46 +77961,53 @@ msgid "Clears all values on the theme." msgstr "清除主题上的所有值。" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" "å¦‚æžœä¸»é¢˜åŒ…å« [code]node_type[/code],则清除å为 [code]name[/code] çš„ [Color]" "颜色。" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" "å¦‚æžœä¸»é¢˜åŒ…å« [code]node_type[/code],则清除å为 [code]name[/code] 的常é‡ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" "å¦‚æžœä¸»é¢˜åŒ…å« [code]node_type[/code],则清除å为 [code]name[/code] çš„ [Font]å—" "体。" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." msgstr "" "å¦‚æžœä¸»é¢˜åŒ…å« [code]node_type[/code],则清除å为 [code]name[/code] çš„å›¾æ ‡ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" "å¦‚æžœä¸»é¢˜åŒ…å« [code]node_type[/code],则清除å为 [code]name[/code] çš„ " "[StyleBox]æ ·å¼ç›’。" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." +"theme has [code]theme_type[/code]." msgstr "" "如果主题具有 [code]node_type[/code],则清除 [code]name[/code] 处的 " "[code]data_type[/code] 主题项。" @@ -77700,15 +78029,18 @@ msgid "Sets the theme's values to a copy of a given theme." msgstr "将主题的å–值设置为指定主题的副本。" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "如果主题有[code]node_type[/code],返回 [code]name[/code]处的[Color]。" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" "如果主题有[code]node_type[/code],将所有的[Color]作为[PoolStringArray]返回," "å¹¶å¡«å……æ¯ä¸ª[Color]çš„å称,用于[method get_color]使用。" @@ -77722,15 +78054,17 @@ msgstr "" "[method get_color] å’Œ/或 [method get_color_list] 使用。" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "如果主题有 [code]node_type[/code],返回 [code]name[/code] 处的常é‡ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" "如果主题有 [code]node_type[/code],将所有常é‡ä½œä¸º [PoolStringArray] 返回,并" @@ -77746,8 +78080,9 @@ msgstr "" "get_constant]å’Œ/或[method get_constant_list]使用。" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" @@ -77756,9 +78091,10 @@ msgstr "" "体。" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" "如果主题有 [code]node_type[/code],将所有的 [Font] 作为 [PoolStringArray] è¿”" "回,并填入æ¯ä¸ª [Font] çš„å称,以供 [method get_font] 使用。" @@ -77772,16 +78108,18 @@ msgstr "" "get_font]å’Œ/或[method get_font_list]使用。" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." +"[code]theme_type[/code]." msgstr "" "如果主题有[code]node_type[/code],返回 [code]name[/code]å¤„çš„å›¾æ ‡[Texture]。" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" "如果主题有[code]node_type[/code]ï¼Œåˆ™è¿”å›žæ‰€æœ‰çš„å›¾æ ‡ä¸ºä¸€ä¸ª[PoolStringArray],并" "å¡«å…¥æ¯ä¸ª[Texture]çš„å称,以供[method get_icon]使用。" @@ -77795,22 +78133,26 @@ msgstr "" "get_icon]å’Œ/或[method get_icon_list]使用。" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" "如果主题有[code]node_type[/code],返回 [code]name[/code]处的[StyleBox]。\n" "å¯ä»¥ä½¿ç”¨[method get_stylebox_list]找到有效的[code]name[/code]。å¯ä»¥é€šè¿‡" "[method get_stylebox_types]æ¥æ‰¾åˆ°æœ‰æ•ˆçš„[code]node_type[/code]。" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" "如果主题有[code]node_type[/code],则返回所有[StyleBox]çš„[PoolStringArray],并" "å¡«å…¥æ¯ä¸ª[StyleBox]çš„å称,以供[method get_stylebox]使用。\n" @@ -77826,11 +78168,12 @@ msgstr "" "[method get_stylebox]å’Œ/或[method get_stylebox_list]使用。" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" "如果主题有 [code]node_type[/code],则以 [code]name[/code] 返回 " @@ -77840,11 +78183,12 @@ msgstr "" "法,找到有效的 [code]node_type[/code]。" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" "返回所有[code]data_type[/code]的主题项目,以[PoolStringArray]的形å¼å¡«å…¥æ¯ä¸ªä¸»" @@ -77864,10 +78208,11 @@ msgstr "" "或数æ®ç±»åž‹ç‰¹å®šæ–¹æ³•使用。" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" "将所有的主题类型作为一个[PoolStringArray]返回,其ä¸å¡«å…¥äº†å”¯ä¸€çš„类型å称,以供" @@ -77888,20 +78233,24 @@ msgid "" msgstr "返回给定的基础类型 [code]base_type[/code] 的所有类型å˜ç§ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" "如果带有[code]name[/code]çš„[Color]在[code]node_type[/code]ä¸ï¼Œåˆ™è¿”回 " "[code]true[/code]。\n" "如果主题没有[code]node_type[/code],则返回 [code]false[/code]。" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" "如果带有[code]name[/code]的常é‡åœ¨[code]node_type[/code]ä¸ï¼Œåˆ™è¿”回 " "[code]true[/code]。\n" @@ -77915,40 +78264,48 @@ msgstr "" "如果这个主题有一个有效的[member default_font]值,返回 [code]true[/code]。" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" "如果带有[code]name[/code]çš„[Font]在[code]node_type[/code]ä¸ï¼Œåˆ™è¿”回 " "[code]true[/code]。\n" "如果主题没有[code]node_type[/code],则返回 [code]false[/code]。" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" "如果带有[code]name[/code]çš„å›¾æ ‡[Texture]在[code]node_type[/code]ä¸ï¼Œåˆ™è¿”回 " "[code]true[/code]。\n" "如果主题没有[code]node_type[/code],则返回 [code]false[/code]。" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" "如果带有[code]name[/code]çš„[StyleBox]在[code]node_type[/code]ä¸ï¼Œè¿”回 " "[code]true[/code]。\n" "如果主题没有[code]node_type[/code],则返回 [code]false[/code]。" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" "如果一个 [code]data_type[/code] 的主题项目与 [code]name[/code] 在 " "[code]node_type[/code] ä¸ï¼Œåˆ™è¿”回 [code]true[/code]。\n" @@ -77984,54 +78341,60 @@ msgstr "" "被消除。如果该类型为类型å˜ç§çš„基础类型,则那些å˜ç§ä¼šå¤±åŽ»å…¶åŸºç¡€ç±»åž‹ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" "如果主题有 [code]node_type[/code],则将 [code]old_name[/code] çš„ [Color] é‡å‘½" "å为 [code]name[/code]。如果 [code]name[/code] å·²ç»è¢«å ç”¨ï¼Œåˆ™æ¤æ–¹æ³•将失败。" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" "如果主题有 [code]node_type[/code],则将 [code]old_name[/code] 的常é‡é‡å‘½å为 " "[code]name[/code]。如果 [code]name[/code] å·²ç»è¢«å ç”¨ï¼Œåˆ™æ¤æ–¹æ³•失败。" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" "如果主题有 [code]node_type[/code],则将 [code]old_name[/code] çš„ [Font] é‡å‘½" "å为 [code]name[/code]。如果 [code]name[/code] å·²ç»è¢«å ç”¨ï¼Œåˆ™æ¤æ–¹æ³•失败。" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" "如果主题有 [code]node_type[/code],则将 [code]old_name[/code] çš„å›¾æ ‡é‡å‘½å为 " "[code]name[/code]。如果 [code]name[/code] å·²ç»è¢«å ç”¨ï¼Œåˆ™æ¤æ–¹æ³•失败。" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" "如果主题有 [code]node_type[/code],则将 [StyleBox] 在 [code]old_name[/code] " "é‡å‘½å为 [code]name[/code]。如果 [code]name[/code] å·²ç»è¢«å ç”¨ï¼Œæ¤æ–¹æ³•会失败。" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" "如果主题具有 [code]node_type[/code],则将 [code]old_name[/code] 处的 " @@ -78039,62 +78402,68 @@ msgstr "" "code] å·²ç»è¢«å ç”¨ï¼Œåˆ™æ¤æ–¹æ³•失败。" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" "在 [code]node_type[/code] ä¸çš„ [code]name[/code] 处,设置主题的[Color]为" "[code]color[/code]。\n" "如果主题没有[code]node_type[/code],则创建该节点。" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" "在 [code]node_type[/code] ä¸çš„ [code]name[/code] 处,将主题的常é‡è®¾ç½®ä¸º" "[code]constant[/code]。\n" "如果主题没有,则创建[code]node_type[/code]。" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" "在 [code]node_type[/code] ä¸çš„ [code]name[/code] 处将主题的 [Font] 设置为" "[code]font[/code]。\n" "如果主题没有[code]node_type[/code],则创建该节点。" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" "在 [code]node_type[/code] ä¸çš„ [code]name[/code] å¤„è®¾ç½®ä¸»é¢˜çš„å›¾æ ‡[Texture]为" "[code]texture[/code]。\n" "如果主题没有[code]node_type[/code],则创建该节点。" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" "将主题的[StyleBox]设置为[code]stylebox[/code],在[code]node_type[/code]çš„" "[code]name[/code]处。\n" "如果主题没有[code]node_type[/code],则创建该节点。" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" "å°†[code]data_type[/code]的主题项目设置为[code]value[/code],在" "[code]node_type[/code]ä¸çš„[code]name[/code]。\n" @@ -78335,14 +78704,14 @@ msgid "" "Returns a [Vector2] array with the positions of all cells containing a tile " "from the tileset (i.e. a tile index different from [code]-1[/code])." msgstr "" -"返回一个[Vector2]数组,其ä¸åŒ…å«å›¾å—集䏿‰€æœ‰å•å…ƒæ ¼çš„ä½ç½®ï¼ˆå›¾å—索引éž[code]-1[/" -"code])。" +"返回一个 [Vector2] 数组,其ä¸åŒ…å«å›¾å—集䏿‰€æœ‰å•å…ƒæ ¼çš„ä½ç½®ï¼ˆå›¾å—ç´¢å¼•éž " +"[code]-1[/code])。" #: doc/classes/TileMap.xml msgid "" "Returns an array of all cells with the given tile index specified in " "[code]id[/code]." -msgstr "返回所有具有[code]id[/code]䏿Œ‡å®šçš„图å—索引的å•å…ƒæ ¼çš„æ•°ç»„ã€‚" +msgstr "返回所有具有 [code]id[/code] 䏿Œ‡å®šçš„图å—索引的å•å…ƒæ ¼çš„æ•°ç»„ã€‚" #: doc/classes/TileMap.xml msgid "Returns a rectangle enclosing the used (non-empty) tiles of the map." @@ -79678,7 +80047,7 @@ msgid "" "[b]Note:[/b] This is a \"pass-by\" (not \"bypass\") press mode." msgstr "" "如果为 [code]true[/code],åªè¦æŒ‰ä¸‹çš„æ‰‹æŒ‡è¿›å‡ºæŒ‰é’®ï¼Œå°±ä¼šå‘出 [signal pressed] " -"å’Œ[signal released] ]ä¿¡å·ï¼Œå³ä½¿åŽ‹åŠ›å¼€å§‹äºŽæŒ‰é’®çš„æœ‰æ•ˆåŒºåŸŸä¹‹å¤–ã€‚\n" +"å’Œ [signal released] ä¿¡å·ï¼Œå³ä½¿åŽ‹åŠ›å¼€å§‹äºŽæŒ‰é’®çš„æœ‰æ•ˆåŒºåŸŸä¹‹å¤–ã€‚\n" "[b]注æ„:[/b]这是一ç§â€œpass-byâ€çš„æŒ‰åŽ‹æ¨¡å¼ ï¼Œè€Œä¸æ˜¯â€œbypassâ€ã€‚" #: doc/classes/TouchScreenButton.xml @@ -81989,21 +82358,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "使具有相åŒåç§°çš„åŽç»åŠ¨ä½œåˆå¹¶ä¸ºä¸€ä¸ªã€‚" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." -msgstr "UPNP 网络功能。" +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." +msgstr "é€šç”¨å³æ’å³ç”¨ï¼ˆUPnP)功能,用于网络设备的å‘çŽ°ã€æŸ¥è¯¢åŠç«¯å£æ˜ 射。" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -82016,7 +82389,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -82045,34 +82418,66 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" -msgstr "" -"æä¾› UPNP 功能æ¥å‘现本地网络上的 [UPNPDevice],并对它们执行指令,如管ç†ç«¯å£æ˜ " -"射(端å£è½¬å‘)和查询本地和远程网络 IP 地å€ã€‚注æ„ï¼Œè¿™ä¸ªç±»çš„æ–¹æ³•æ˜¯åŒæ¥çš„,会阻" -"塞调用线程。\n" -"è¦è½¬å‘一个特定的端å£ï¼š\n" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." +msgstr "" +"这个类å¯ç”¨äºŽåœ¨æœ¬åœ°ç½‘络ä¸å‘现兼容的 [UPNPDevice] 并在这些设备上执行命令,如管" +"ç†ç«¯å£æ˜ 射(用于端å£è½¬å‘/NAT ç©¿é€ï¼‰å’ŒæŸ¥è¯¢æœ¬åœ°åŠè¿œç¨‹ç½‘络 IP 地å€ã€‚请注æ„,这个" +"ç±»çš„æ–¹æ³•éƒ½æ˜¯åŒæ¥çš„,会阻塞调用线程。\n" +"è¦è½¬å‘指定端å£ï¼ˆæ¤å¤„为 [code]7777[/code]ï¼Œè¯·æ³¨æ„ [method discover] å’Œ " +"[method add_port_mapping] 都å¯èƒ½è¿”回错误,应进行检查):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" -"è¦å…³é—一个特定的端å£ï¼ˆä¾‹å¦‚ï¼Œåœ¨ä½ ä½¿ç”¨å®Œå®ƒä¹‹åŽï¼‰ï¼š\n" +"è¦å…³é—指定端å£ï¼ˆä¾‹å¦‚结æŸä½¿ç”¨åŽï¼‰ï¼š\n" "[codeblock]\n" "upnp.delete_port_mapping(port)\n" "[/codeblock]\n" -"[b]注æ„:[/b]UPnP å‘现会阻塞当å‰çº¿ç¨‹ã€‚è¦åœ¨ä¸é˜»å¡žä¸»çº¿ç¨‹çš„æƒ…况下执行å‘现,å¯ä»¥" -"åƒè¿™æ ·ä½¿ç”¨ [Thread]:\n" +"[b]注æ„:[/b]UPnP å‘现会阻塞当å‰çº¿ç¨‹ã€‚è¦åœ¨ä¸é˜»å¡žä¸»çº¿ç¨‹çš„å‰æä¸‹æ‰§è¡Œå‘现,请åƒ" +"è¿™æ ·ä½¿ç”¨ [Thread]:\n" "[codeblock]\n" -"# å½“å®Œæˆ UPnP ç«¯å£æ˜ 射设置时å‘å‡ºï¼ˆæ— è®ºæˆåŠŸæˆ–å¤±è´¥ï¼‰ã€‚\n" +"# UPnP ç«¯å£æ˜ å°„å»ºç«‹å®Œæˆæ—¶å‘å‡ºï¼ˆæ— è®ºæˆè´¥ï¼‰ã€‚\n" "signal upnp_completed(error)\n" "\n" -"# 将其替æ¢ä¸ºæ‚¨è‡ªå·±çš„æœåŠ¡å™¨ç«¯å£å·ï¼ˆä»‹äºŽ 1025 å’Œ 65535之间)。\n" +"# 请将其替æ¢ä¸ºä½ 自己的æœåŠ¡å™¨ç«¯å£å·ï¼Œåœ¨ 1024 å’Œ 65535 之间。\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" "func _upnp_setup(server_port):\n" -" # UPNP 查询需è¦ä¸€äº›æ—¶é—´ã€‚\n" +" # UPNP 查询比较耗时。\n" " var upnp = UPNP.new()\n" " var err = upnp.discover()\n" "\n" @@ -82093,9 +82498,34 @@ msgstr "" " thread.start(self, \"_upnp_setup\", SERVER_PORT)\n" "\n" "func _exit_tree():\n" -" # 当线程æ£åœ¨è¿è¡Œæ—¶ï¼Œåœ¨è¿™é‡Œç‰å¾…çº¿ç¨‹ç»“æŸæ¥å¤„ç†æ¸¸æˆé€€å‡ºã€‚\n" +" # 游æˆé€€å‡ºä½†çº¿ç¨‹è¿˜åœ¨è¿è¡Œæ—¶ï¼Œåœ¨æ¤å¤„ç‰å¾…线程完æˆã€‚\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]术è¯ï¼š[/b]UPnP 网络ä¸ï¼Œâ€œç½‘å…³â€ï¼ˆgateway,或称“互è”网网关设备â€ï¼Œinternet " +"gateway device,简称 IGD)指的是在局域网ä¸è®©è®¡ç®—机能够访问互è”网(“广域网â€ï¼Œ" +"wide area network,WAN)的网络设备。这些网关ç»å¸¸ä¹Ÿå«åšâ€œè·¯ç”±å™¨â€ã€‚\n" +"[b]陷阱:[/b]\n" +"- 剿–‡è§£é‡Šè¿‡ï¼Œè¿™äº›è°ƒç”¨éƒ½æ˜¯é˜»å¡žçš„,ä¸åº”该在主线程上执行,一次就能阻塞上很多" +"秒。用用线程å§ï¼\n" +"- 网络是实打实的混乱。数æ®åŒ…å¯èƒ½ä¼šåœ¨ä¼ 输过程ä¸ä¸¢å¤±æˆ–者被过滤掉,地å€ã€ç©ºé—²ç«¯" +"å£ã€ç«¯å£æ˜ 射有å¯èƒ½å‘生å˜åŒ–,设备å¯ä»¥éšæ—¶ç¦»å¼€æˆ–è€…åŠ å…¥ç½‘ç»œã€‚è¯·è€ƒè™‘å‘¨å…¨ï¼Œè€è€å®ž" +"实地检查错误并进行处ç†ï¼Œå¤„ç†é”™è¯¯æ—¶è¯·å°½é‡å‹å¥½ï¼šæ·»åŠ ç®€æ´çš„æŠ¥é”™ UIã€è¶…时处ç†ã€é‡" +"试机制。\n" +"- ç«¯å£æ˜ å°„æ˜¯éšæ—¶ä¼šå˜çš„(也å¯ä»¥è¢«åˆ 除),网关的远程/外部 IP 也å¯èƒ½å‘生改å˜ã€‚ä½ " +"åº”è¯¥è€ƒè™‘å®šæœŸé‡æ–°æŸ¥è¯¢å¤–部 IPã€å°è¯•æ›´æ–°/åˆ·æ–°ç«¯å£æ˜ 射(例如æ¯éš” 5 分钟或者在å‘生" +"网络错误时执行)。\n" +"- 并䏿˜¯æ‰€æœ‰çš„è®¾å¤‡éƒ½æ”¯æŒ UPnP,有些用户还会ç¦ç”¨ UPnP 支æŒã€‚ä½ éœ€è¦å¤„ç†è¿™ç§æƒ…况" +"ï¼ˆä¾‹å¦‚ç¼–å†™æ–‡æ¡£ï¼Œè¦æ±‚ç”¨æˆ·æ‰‹åŠ¨è¿›è¡Œç«¯å£æ˜ å°„ï¼Œæˆ–è€…åŠ å…¥æŽ¥åŠ›/é•œåƒæœåС噍ã€NAT 打洞ã€" +"STUN/TURN ç‰ NAT ç©¿é€çš„备用方案)。\n" +"- è¯·è€ƒè™‘æ˜ å°„å†²çªæ—¶è¯¥æ€Žä¹ˆåŠžã€‚å¯èƒ½åœ¨åŒä¸€ä¸ªç½‘ç»œä¸ŠåŒæ—¶æœ‰å¤šä¸ªç”¨æˆ·æƒ³è¦æ¥çŽ©ä½ çš„æ¸¸" +"æˆï¼Œæˆ–者有其他应用程åºç”¨äº†ä¸€æ ·çš„端å£ã€‚请把端å£å·åšæˆå¯é…置的,最好能够自动选" +"择(失败时é‡è¯•其他端å£ï¼‰ã€‚\n" +"[b]拓展阅读:[/b]å¦‚æžœä½ æƒ³äº†è§£æ›´å¤šå…³äºŽ UPnP(尤其是 Internet Gateway Device" +"(IGD)和 Port Control Protocol(PCP)),å¯ä»¥é¦–先查看[url=https://en." +"wikipedia.org/wiki/Universal_Plug_and_Play]维基百科[/url],技术规范å¯ä»¥åœ¨ " +"[url=https://openconnectivity.org/developer/specifications/upnp-resources/" +"upnp/]Open Connectivity 基金会[/url]找到,Godot 的实现基于的是 [url=https://" +"github.com/miniupnp/miniupnp]MiniUPnP 客户端[/url]。" #: modules/upnp/doc_classes/UPNP.xml msgid "Adds the given [UPNPDevice] to the list of discovered devices." @@ -82104,36 +82534,58 @@ msgstr "将给定的 [UPNPDevice] æ·»åŠ åˆ°å·²å‘现设备的列表ä¸ã€‚" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" -"æ·»åŠ ä¸€ä¸ªæ˜ å°„ï¼Œå°†é»˜è®¤ç½‘å…³ä¸Šçš„å¤–éƒ¨[code]port[/code],介于1å’Œ65535之间,转å‘到本" -"地机器上的[code]internal_port[/code],用于指定åè®®[code]proto[/code],å³" -"[code]TCP[/code]或[code]UDP[/code],默认为UDP。如果该网关设备上已ç»å˜åœ¨ç»™å®šç«¯" -"å£å’Œå议组åˆçš„ç«¯å£æ˜ 射,该方法将å°è¯•覆盖它。如果ä¸å¸Œæœ›è¿™æ ·ï¼Œä½ å¯ä»¥ç”¨[method " -"get_gateway]手动检索该网关,如果有的è¯ï¼Œå°±è°ƒç”¨[method add_port_mapping]。\n" -"如果[code]internal_port[/code]是[code]0[/code](默认值),外部和内部端å£éƒ½ä½¿" -"用相åŒçš„端å£å·ï¼ˆ[code]port[/code]值)。\n" -"æè¿°ï¼ˆ[code]desc[/code])显示在一些路由器的UIä¸ï¼Œå¯ä»¥ç”¨æ¥æŒ‡å‡ºæ˜¯å“ªä¸ªåº”ç”¨æ·»åŠ äº†" -"æ˜ å°„ã€‚å¯ä»¥é€šè¿‡æŒ‡å®š[code]duration[/code](å•ä½ï¼šç§’)æ¥é™åˆ¶æ˜ 射的租用期é™ã€‚ç„¶" -"而,有些路由器与其ä¸çš„个别ä¸å…¼å®¹ï¼Œæ‰€ä»¥è¦è°¨æ…Žä½¿ç”¨ï¼Œå¹¶åœ¨å‡ºé”™æ—¶æ·»åŠ å›žé€€é€»è¾‘ï¼Œå¦‚" -"果有疑问,å¯ä»¥åœ¨æ²¡æœ‰å®ƒä»¬çš„æƒ…况下é‡è¯•。\n" -"å‚阅[method get_gateway]。å‚阅[enum UPNPResult],了解å¯èƒ½çš„返回值。" +"æ·»åŠ æ˜ å°„ï¼Œé’ˆå¯¹ç»™å®šçš„åè®® [code]proto[/code]([code]TCP[/code] 或 [code]UDP[/" +"code],默认为 UDPï¼‰ï¼Œå°†é»˜è®¤ç½‘å…³ï¼ˆè§ [method get_gateway]ï¼‰ä¸Šçš„å¤–éƒ¨ç«¯å£ " +"[code]port[/code](在 1 到 65535 之间,ä¸è¿‡æŽ¨è使用 1024 以上的端å£ï¼‰æ˜ 射到本" +"æœºä¸Šçš„å†…éƒ¨ç«¯å£ [code]internal_port[/code]。如果该网关上已ç»å˜åœ¨ç»™å®šçš„端å£ä¸Žå" +"议的组åˆï¼Œè¿™ä¸ªæ–¹æ³•会å°è¯•进行覆盖。如果ä¸å¸Œæœ›å¦‚æ¤ï¼Œä½ å¯ä»¥ä½¿ç”¨ [method " +"get_gateway] 手动获å–网关,获å–到åŽè°ƒç”¨å…¶ [method add_port_mapping] 方法。请" +"注æ„,使用 UPnP 转å‘公认端å£ï¼ˆ1024 以下)在有些设备上å¯èƒ½ä¼šå¤±è´¥ã€‚\n" +"如果端å£çš„æ˜ å°„å·²å˜åœ¨ï¼Œæœ‰äº›ç½‘关设备å¯èƒ½ä¼šå¯¹å…¶è¿›è¡Œæ›´æ–°ï¼Œæœ‰äº›åˆ™ä¼šå› 为冲çªè€Œæ‹’ç»" +"è¿™ä¸ªå‘½ä»¤ï¼Œå°¤å…¶å½“çŽ°æœ‰ç«¯å£æ˜ 射䏿˜¯ç”± UPnP 创建的,或者指å‘的是别的网络地å€ï¼ˆæˆ–" +"设备)的时候。\n" +"如果 [code]internal_port[/code] 为 [code]0[/code](默认),表示内外部端å£ç›¸åŒ" +"(使用 [code]port[/code] 的值)。\n" +"æè¿°ï¼ˆ[code]desc[/code])会显示在一些路由器的管ç†ç•Œé¢ä¸Šï¼Œå¯ä»¥ç”¨æ¥è¯†åˆ«æ·»åŠ æ˜ å°„" +"的程åºã€‚\n" +"æ˜ å°„çš„ç§Ÿèµæ—¶é•¿ [code]duration[/code] å¯ä»¥é€šè¿‡æŒ‡å®šç§’æ•°æ¥é™å®šã€‚默认的 [code]0[/" +"code] è¡¨ç¤ºæ²¡æœ‰æ—¶é•¿ï¼Œå³æ°¸ä¹…ç§Ÿèµï¼Œæœ‰äº›è®¾å¤‡åªæ”¯æŒè¿™ç§æ°¸ä¹…ç§Ÿèµã€‚请注æ„ï¼Œæ— è®ºæ˜¯å¦" +"æ°¸ä¹…éƒ½åªæ˜¯ä¸€ç§è¯·æ±‚,网关ä»ç„¶å¯ä»¥éšæ—¶ç§»é™¤æ˜ å°„ï¼ˆé€šå¸¸å‘生在é‡å¯ç½‘å…³åŽå¤–部 IP 地" +"å€å‘生å˜åŒ–时,也有些型å·ä¼šåœ¨æ˜ å°„ä¸å†æ´»åŠ¨ï¼Œå³è‹¥å¹²åˆ†é’Ÿæ— æµé‡æ—¶ç§»é™¤ï¼‰ã€‚å¦‚æžœéž " +"[code]0[/code]ï¼ˆæ°¸ä¹…ï¼‰ï¼ŒæŠ€æœ¯è§„æ ¼æ‰€å…许的范围是 [code]120[/code](2 分钟)到 " +"[code]86400[/code] 秒(24 å°æ—¶ï¼‰ã€‚\n" +"å¯èƒ½çš„è¿”å›žå€¼è§ [enum UPNPResult]。" #: modules/upnp/doc_classes/UPNP.xml msgid "Clears the list of discovered devices." @@ -82144,13 +82596,16 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" -"如果默认网关上å˜åœ¨ç»™å®šçš„端å£å’Œå议组åˆçš„ç«¯å£æ˜ å°„ï¼ˆè§ [method get_gateway])," +"å¦‚æžœé»˜è®¤ç½‘å…³ä¸Šï¼ˆè§ [method get_gateway])å˜åœ¨ç»™å®šçš„端å£å’Œå议组åˆçš„ç«¯å£æ˜ 射," "åˆ™å°†å…¶åˆ é™¤ã€‚[code]port[/code] 必须是 1 到 65535 之间的有效端å£ï¼Œ[code]proto[/" -"code] å¯ä»¥æ˜¯ [code]TCP[/code] 或 [code]UDP[/code]。å¯èƒ½çš„è¿”å›žå€¼è§ [enum " -"UPNPResult]。" +"code] å¯ä»¥æ˜¯ [code]TCP[/code] 或 [code]UDP[/code]。拒ç»çš„åŽŸå› å¯èƒ½æ˜¯æ˜ 射指å‘çš„" +"䏿˜¯æœ¬æœºåœ°å€ã€ä½¿ç”¨çš„æ˜¯å…¬è®¤ç«¯å£ï¼ˆ1024 ä»¥ä¸‹ï¼‰ã€æˆ–è€…æ˜ å°„ä¸æ˜¯ç”± UPnP æ·»åŠ çš„ã€‚å¯èƒ½" +"çš„è¿”å›žå€¼è§ [enum UPNPResult]。" #: modules/upnp/doc_classes/UPNP.xml msgid "" @@ -82371,20 +82826,20 @@ msgid "Unknown error." msgstr "未知错误。" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." -msgstr "UPNP 设备。" +msgid "Universal Plug and Play (UPnP) device." +msgstr "é€šç”¨å³æ’å³ç”¨ï¼ˆUPnP)设备。" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" -"UPNP 设备。å‚阅 [UPNP] 了解 UPNP å‘现和实用功能。æä¾›å¯¹ UPNP 控制命令的低层访" -"问。å…许管ç†ç«¯å£æ˜ 射(端å£è½¬å‘)和查询设备的网络信æ¯ï¼Œå¦‚本地和外部IP地å€å’Œçж" -"æ€ã€‚请注æ„ï¼Œè¿™ä¸ªç±»çš„æ–¹æ³•æ˜¯åŒæ¥çš„,会阻塞调用线程。" +"é€šç”¨å³æ’å³ç”¨ï¼ˆUPnP)设备。UPnP å‘现åŠå·¥å…·å‡½æ•°è§ [UPNP]。æä¾›å¯¹ UPNP 控制命令" +"的低层访问。å…许管ç†ç«¯å£æ˜ 射(端å£è½¬å‘)和查询设备的网络信æ¯ï¼ˆå¦‚本地和外部 " +"IP 地å€å’Œçжæ€ï¼‰ã€‚请注æ„ï¼Œè¿™ä¸ªç±»çš„æ–¹æ³•æ˜¯åŒæ¥çš„,会阻塞调用线程。" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" @@ -82468,7 +82923,7 @@ msgstr "未知设备。" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "Invalid control." -msgstr "æ— æ•ˆæŽ§ä»¶ã€‚" +msgstr "æ— æ•ˆæŽ§åˆ¶ã€‚" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "Memory allocation error." @@ -82891,8 +83346,8 @@ msgid "" "Returns a vector composed of the [method @GDScript.fposmod] of this vector's " "components and [code]modv[/code]'s components." msgstr "" -"返回一个由这个å‘é‡çš„[code]modv[/code]分é‡å’Œ[method @GDScript.fposmod]分é‡ç»„æˆ" -"çš„å‘é‡ã€‚" +"返回一个由这个å‘é‡çš„ [code]modv[/code] 分é‡å’Œ [method @GDScript.fposmod] 分é‡" +"组æˆçš„å‘é‡ã€‚" #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "Returns this vector projected onto the vector [code]b[/code]." @@ -82958,7 +83413,7 @@ msgstr "" msgid "" "Returns a perpendicular vector rotated 90 degrees counter-clockwise compared " "to the original, with the same length." -msgstr "返回一个与原æ¥ç›¸æ¯”逆时针旋转90度的垂直å‘é‡ï¼Œé•¿åº¦ä¸å˜ã€‚" +msgstr "返回一个与原æ¥ç›¸æ¯”逆时针旋转 90 度的垂直å‘é‡ï¼Œé•¿åº¦ä¸å˜ã€‚" #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" @@ -83320,8 +83775,9 @@ msgid "" "skidding. 0.0 is skidding (the wheel has lost grip, e.g. icy terrain), 1.0 " "means not skidding (the wheel has full grip, e.g. dry asphalt road)." msgstr "" -"返回一个介于0.0å’Œ1.0ä¹‹é—´çš„å€¼ï¼Œè¡¨ç¤ºè¿™ä¸ªè½®åæ˜¯å¦æ‰“滑。0.0表示打滑,å³è½¦è½®å¤±åŽ»äº†" -"抓地力,例如冰雪地形,1.0è¡¨ç¤ºä¸æ‰“滑,å³è½¦è½®æœ‰å……分的抓地力,例如干燥的沥é’路。" +"返回一个介于 0.0 å’Œ 1.0 ä¹‹é—´çš„å€¼ï¼Œè¡¨ç¤ºè¿™ä¸ªè½®åæ˜¯å¦æ‰“滑。0.0 表示打滑(车轮失" +"去了抓地力,例如冰雪地形),1.0 è¡¨ç¤ºä¸æ‰“滑(车轮有充分的抓地力,例如干燥的沥" +"é’路)。" #: doc/classes/VehicleWheel.xml msgid "Returns [code]true[/code] if this wheel is in contact with a surface." @@ -84069,10 +84525,10 @@ msgid "" "Viewport or from [code]SCREEN_TEXTURE[/code] becomes unavailable. For more " "information see [method VisualServer.viewport_set_render_direct_to_screen]." msgstr "" -"如果为 [code]true[/code],会直接将 Viewport 渲染到å±å¹•ä¸Šï¼Œè€Œä¸æ˜¯æ¸²æŸ“åˆ°æ ¹è§†çª—" -"上。åªåœ¨ GLES2 ä¸å¯ç”¨ã€‚这是一个低级别的优化,在大多数情况下ä¸åº”该使用。如果使" -"用,从 Viewport 或从 [code]SCREEN_TEXTURE[/code] 读å–å°†å˜å¾—ä¸å¯ç”¨ã€‚更多信æ¯å‚" -"阅 [method VisualServer.viewport_set_render_direct_to_screen]。" +"如果为 [code]true[/code],会直接将该 Viewport 渲染到å±å¹•ä¸Šï¼Œè€Œä¸æ˜¯æ¸²æŸ“åˆ°æ ¹è§†" +"窗上。åªåœ¨ GLES2 ä¸å¯ç”¨ã€‚这是一个低级别的优化,在大多数情况下ä¸åº”该使用。如果" +"使用,从该 Viewport 或从 [code]SCREEN_TEXTURE[/code] 读å–å°†å˜å¾—ä¸å¯ç”¨ã€‚更多信" +"æ¯å‚阅 [method VisualServer.viewport_set_render_direct_to_screen]。" #: doc/classes/Viewport.xml msgid "" @@ -84133,17 +84589,17 @@ msgid "" "Values around [code]0.5[/code] generally give the best results. See also " "[member fxaa]." msgstr "" -"如果设置为大于[code]0.0[/code]的值,对比度适应性é”化将被应用到3D视窗ä¸ã€‚这具" -"æœ‰è¾ƒä½Žçš„æ€§èƒ½æˆæœ¬ï¼Œå¯ä»¥ç”¨æ¥æ¢å¤ä½¿ç”¨FXAA所æŸå¤±çš„一些é”度。一般æ¥è¯´ï¼Œ[code]0.5[/" -"code]å·¦å³çš„æ•°å€¼å¯ä»¥å¾—到最好的效果。å‚阅[member fxaa]。" +"如果设置为大于 [code]0.0[/code] 的值,对比度适应性é”化将被应用到3D视窗ä¸ã€‚è¿™" +"å…·æœ‰è¾ƒä½Žçš„æ€§èƒ½æˆæœ¬ï¼Œå¯ä»¥ç”¨æ¥æ¢å¤ä½¿ç”¨ FXAA 所æŸå¤±çš„一些é”度。一般æ¥è¯´ï¼Œ" +"[code]0.5[/code] å·¦å³çš„æ•°å€¼å¯ä»¥å¾—到最好的效果。å¦è¯·å‚阅 [member fxaa]。" #: doc/classes/Viewport.xml msgid "" "The width and height of viewport. Must be set to a value greater than or " "equal to 2 pixels on both dimensions. Otherwise, nothing will be displayed." msgstr "" -"视窗的宽度和高度。必须在两个维度上设置为大于或ç‰äºŽ2åƒç´ 的值。å¦åˆ™ï¼Œå°†ä¸ä¼šæ˜¾ç¤º" -"任何东西。" +"视窗的宽度和高度。必须在两个维度上设置为大于或ç‰äºŽ 2 åƒç´ 的值。å¦åˆ™ï¼Œå°†ä¸ä¼šæ˜¾" +"示任何东西。" #: doc/classes/Viewport.xml msgid "If [code]true[/code], the size override affects stretch as well." @@ -84201,7 +84657,7 @@ msgid "" "Emitted when the size of the viewport is changed, whether by [method " "set_size_override], resize of window, or some other means." msgstr "" -"当视窗的大å°è¢«æ”¹å˜æ—¶ï¼Œæ— 论是通过[method set_size_override],调整窗å£çš„大å°ï¼Œ" +"当视窗的大å°è¢«æ”¹å˜æ—¶ï¼Œæ— 论是通过 [method set_size_override]ã€è°ƒæ•´çª—å£çš„大å°ï¼Œ" "还是其他方å¼ï¼Œéƒ½ä¼šè§¦å‘。" #: doc/classes/Viewport.xml @@ -84236,11 +84692,11 @@ msgstr "æ¤è±¡é™å°†åˆ†ä¸º 4 个,最多使用 4 个阴影贴图。" #: doc/classes/Viewport.xml msgid "This quadrant will be split 16 ways and used by up to 16 shadow maps." -msgstr "æ¤è±¡é™å°†è¢«åˆ†æˆ16个方å‘,并被最多16å¼ é˜´å½±è´´å›¾ä½¿ç”¨ã€‚" +msgstr "æ¤è±¡é™å°†è¢«åˆ†æˆ 16 个方å‘,并被最多 16 å¼ é˜´å½±è´´å›¾ä½¿ç”¨ã€‚" #: doc/classes/Viewport.xml msgid "This quadrant will be split 64 ways and used by up to 64 shadow maps." -msgstr "这个象é™å°†è¢«åˆ†æˆ64个方å‘,并被最多64å¼ é˜´å½±è´´å›¾ä½¿ç”¨ã€‚" +msgstr "这个象é™å°†è¢«åˆ†æˆ 64 个方å‘,并被最多 64 å¼ é˜´å½±è´´å›¾ä½¿ç”¨ã€‚" #: doc/classes/Viewport.xml msgid "" @@ -84248,7 +84704,7 @@ msgid "" "Unless the [member shadow_atlas_size] is very high, the shadows in this " "quadrant will be very low resolution." msgstr "" -"这个象é™å°†è¢«åˆ†æˆ256个方å‘,并被最多256ä¸ªé˜´å½±è´´å›¾ä½¿ç”¨ã€‚é™¤éž [member " +"这个象é™å°†è¢«åˆ†æˆ 256 个方å‘,并被最多 256 ä¸ªé˜´å½±è´´å›¾ä½¿ç”¨ã€‚é™¤éž [member " "shadow_atlas_size] éžå¸¸é«˜ï¼Œå¦åˆ™è¿™ä¸ªè±¡é™å†…的阴影分辨率会éžå¸¸ä½Žã€‚" #: doc/classes/Viewport.xml @@ -84257,12 +84713,12 @@ msgid "" "Unless the [member shadow_atlas_size] is very high, the shadows in this " "quadrant will be very low resolution." msgstr "" -"这个象é™å°†è¢«åˆ†æˆ1024个方å‘,并被最多1024ä¸ªé˜´å½±è´´å›¾ä½¿ç”¨ã€‚é™¤éž [member " +"这个象é™å°†è¢«åˆ†æˆ 1024 个方å‘,并被最多 1024 ä¸ªé˜´å½±è´´å›¾ä½¿ç”¨ã€‚é™¤éž [member " "shadow_atlas_size] éžå¸¸é«˜ï¼Œå¦åˆ™è¿™ä¸ªè±¡é™å†…的阴影分辨率会éžå¸¸ä½Žã€‚" #: doc/classes/Viewport.xml msgid "Represents the size of the [enum ShadowAtlasQuadrantSubdiv] enum." -msgstr "代表[enum ShadowAtlasQuadrantSubdiv]枚举的大å°ã€‚" +msgstr "代表 [enum ShadowAtlasQuadrantSubdiv] 枚举的大å°ã€‚" #: doc/classes/Viewport.xml msgid "Amount of objects in frame." @@ -84882,7 +85338,7 @@ msgstr "返回给定函数的å±å¹•ä¸å¿ƒçš„ä½ç½®ã€‚" #: modules/visual_script/doc_classes/VisualScript.xml msgid "Returns a node given its id and its function." -msgstr "返回一个节点,指定它的id和它的函数。" +msgstr "返回一个节点,指定它的 id 和它的函数。" #: modules/visual_script/doc_classes/VisualScript.xml msgid "Returns a node's position in pixels." @@ -85175,7 +85631,7 @@ msgid "" "Return a number linearly interpolated between the first two inputs, based on " "the third input. Uses the formula [code]a + (a - b) * t[/code]." msgstr "" -"返回一个在å‰ä¸¤ä¸ªè¾“入之间线性æ’值的数å—,以第三个输入为基础。使用公å¼[code]a " +"返回一个在å‰ä¸¤ä¸ªè¾“入之间线性æ’值的数å—ï¼Œä»¥ç¬¬ä¸‰ä¸ªè¾“å…¥ä¸ºåŸºç¡€ã€‚ä½¿ç”¨å…¬å¼ [code]a " "+ (a - b) * t[/code]。" #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml @@ -85203,16 +85659,16 @@ msgid "" "N (where N is smaller than 2^32 - 1), you can use it with the remainder " "function." msgstr "" -"è¿”å›žä¸€ä¸ªéšæœºçš„32使•´æ•°å€¼ã€‚为了获得0到Nä¹‹é—´çš„éšæœºå€¼ï¼ˆå…¶ä¸Nå°äºŽ2^32 - 1ï¼‰ï¼Œä½ å¯" -"以将其与余数函数一起使用。" +"è¿”å›žä¸€ä¸ªéšæœºçš„ 32 使•´æ•°å€¼ã€‚为了获得 0 到 N ä¹‹é—´çš„éšæœºå€¼ï¼ˆå…¶ä¸ N å°äºŽ 2^32 - " +"1ï¼‰ï¼Œä½ å¯ä»¥å°†å…¶ä¸Žä½™æ•°å‡½æ•°ä¸€èµ·ä½¿ç”¨ã€‚" #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml msgid "" "Return a random floating-point value between 0 and 1. To obtain a random " "value between 0 to N, you can use it with multiplication." msgstr "" -"返回一个介于0 到 1ä¹‹é—´çš„éšæœºæµ®ç‚¹å€¼ã€‚è¦èŽ·å¾—ä¸€ä¸ªä»‹äºŽ0到Nä¹‹é—´çš„éšæœºå€¼ï¼Œå¯ä»¥å°†å…¶" -"与乘法结åˆä½¿ç”¨ã€‚" +"返回一个介于 0 到 1 ä¹‹é—´çš„éšæœºæµ®ç‚¹å€¼ã€‚è¦èŽ·å¾—ä¸€ä¸ªä»‹äºŽ 0 到 N ä¹‹é—´çš„éšæœºå€¼ï¼Œå¯" +"以将其与乘法结åˆä½¿ç”¨ã€‚" #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml msgid "Return a random floating-point value between the two inputs." @@ -85347,7 +85803,7 @@ msgid "" "[/codeblock]" msgstr "" "返回一个在å‰ä¸¤ä¸ªè¾“入之间平滑内æ’的数å—,基于第三个输入。类似于 [constant " -"MATH_LERP],但在开始时æ’å€¼è¾ƒå¿«ï¼Œç»“æŸæ—¶æ’值较慢。使用Hermiteæ’值公å¼ã€‚\n" +"MATH_LERP],但在开始时æ’å€¼è¾ƒå¿«ï¼Œç»“æŸæ—¶æ’值较慢。使用 Hermite æ’值公å¼ã€‚\n" "[codeblock]\n" "var t = clamp((weight - from) / (to - from), 0.0, 1.0)\n" "return t * t * (3.0 - 2.0 * t)\n" @@ -85592,15 +86048,15 @@ msgid "" "When returning, you can mask the returned value with one of the " "[code]STEP_*[/code] constants." msgstr "" -"执行自定义节点的逻辑,返回è¦ä½¿ç”¨çš„输出åºåˆ—端å£çš„索引,或者在有错误时返回一个" +"执行自定义节点的逻辑,返回è¦ä½¿ç”¨çš„输出åºåˆ—端å£çš„索引,或者在有错误时返回一个 " "[String]。\n" -"[code]inputs[/code]数组包å«è¾“入端å£çš„值。\n" -"[code]output[/code]是一个数组,其索引应被设置为相应的输出。\n" -"[code]start_mode[/code]通常是[constant START_MODE_BEGIN_SEQUENCE],除éžä½ 使用" -"了[code]STEP_*[/code]常é‡ã€‚\n" -"[code]working_mem[/code]是一个数组,å¯ä»¥ç”¨æ¥åœ¨è‡ªå®šä¹‰èŠ‚ç‚¹çš„è¿è¡Œä¹‹é—´æŒç»ä¿å˜ä¿¡" -"æ¯ã€‚其大å°éœ€è¦ç”¨[method _get_working_memory_size]æ¥é¢„定义。\n" -"å½“è¿”å›žæ—¶ï¼Œä½ å¯ä»¥ç”¨[code]STEP_*[/code]ä¸çš„ä¸€ä¸ªå¸¸é‡æ¥å±è”½è¿”回值。" +"[code]inputs[/code] 数组包å«è¾“入端å£çš„值。\n" +"[code]output[/code] 是一个数组,其索引应被设置为相应的输出。\n" +"[code]start_mode[/code] 通常是[constant START_MODE_BEGIN_SEQUENCE],除éžä½ 使" +"用了 [code]STEP_*[/code] 常é‡ã€‚\n" +"[code]working_mem[/code] 是一个数组,å¯ä»¥ç”¨æ¥åœ¨è‡ªå®šä¹‰èŠ‚ç‚¹çš„è¿è¡Œä¹‹é—´æŒç»ä¿å˜ä¿¡" +"æ¯ã€‚其大å°éœ€è¦ç”¨ [method _get_working_memory_size] æ¥é¢„定义。\n" +"å½“è¿”å›žæ—¶ï¼Œä½ å¯ä»¥ç”¨ [code]STEP_*[/code] ä¸çš„ä¸€ä¸ªå¸¸é‡æ¥å±è”½è¿”回值。" #: modules/visual_script/doc_classes/VisualScriptCustomNode.xml msgid "The start mode used the first time when [method _step] is called." @@ -86103,7 +86559,7 @@ msgstr "æ•°å¦å¸¸é‡ã€‚" #: modules/visual_script/doc_classes/VisualScriptMathConstant.xml msgid "Unity: [code]1[/code]." -msgstr "Unity:[code]1[/code]。" +msgstr "å•ä½ä¸€ï¼š[code]1[/code]。" #: modules/visual_script/doc_classes/VisualScriptMathConstant.xml msgid "Pi: [code]3.141593[/code]." @@ -86438,7 +86894,7 @@ msgid "" "[b]Output Ports:[/b]\n" "none" msgstr "" -"结æŸä¸€ä¸ªå‡½æ•°çš„æ‰§è¡Œå¹¶å°†æŽ§åˆ¶æƒè¿”回给调用函数。å¯é€‰ï¼Œå®ƒå¯ä»¥è¿”回一个[Variant]" +"结æŸä¸€ä¸ªå‡½æ•°çš„æ‰§è¡Œå¹¶å°†æŽ§åˆ¶æƒè¿”回给调用函数。å¯é€‰ï¼Œå®ƒå¯ä»¥è¿”回一个 [Variant] " "值。\n" "[b]输入端å£ï¼š[/b]\n" "- åºåˆ—\n" @@ -89274,9 +89730,8 @@ msgid "" "viewport_set_use_32_bpc_depth].\n" "[b]Note:[/b] Only available on the GLES3 backend." msgstr "" -"如果为 " -"[code]true[/code],该视区会渲染至高动æ€èŒƒå›´ï¼ˆHDRï¼‰è€Œä¸æ˜¯æ ‡å‡†åЍæ€èŒƒå›´ï¼ˆSDR)。" -"å¦è¯·å‚阅 [method viewport_set_use_32_bpc_depth]。\n" +"如果为 [code]true[/code],该视区会渲染至高动æ€èŒƒå›´ï¼ˆHDRï¼‰è€Œä¸æ˜¯æ ‡å‡†åЍæ€èŒƒå›´" +"(SDR)。å¦è¯·å‚阅 [method viewport_set_use_32_bpc_depth]。\n" "[b]注æ„:[/b]仅在 GLES3 åŽç«¯å¯ç”¨ã€‚" #: doc/classes/VisualServer.xml @@ -89382,8 +89837,8 @@ msgid "" "on the same [Viewport] to set HDR to [code]true[/code].\n" "[b]Note:[/b] Only available on the GLES3 backend." msgstr "" -"如果为 [code]true[/code],分é…该视区的帧缓冲时将使用完整浮点数精度(32 " -"ä½ï¼‰è€Œä¸æ˜¯åŠæµ®ç‚¹æ•°ç²¾åº¦ï¼ˆ16 ä½ï¼‰ã€‚åªæœ‰åœ¨åŒä¸€ä¸ª [Viewport] 上通过 [method " +"如果为 [code]true[/code],分é…该视区的帧缓冲时将使用完整浮点数精度(32 ä½ï¼‰è€Œ" +"䏿˜¯åŠæµ®ç‚¹æ•°ç²¾åº¦ï¼ˆ16 ä½ï¼‰ã€‚åªæœ‰åœ¨åŒä¸€ä¸ª [Viewport] 上通过 [method " "viewport_set_use_32_bpc_depth] å°† HDR 设为 [code]true[/code] 时有效。\n" "[b]注æ„:[/b]仅在 GLES3 åŽç«¯ä¸å¯ç”¨ã€‚" @@ -89630,6 +90085,10 @@ msgid "Flag used to mark an index array." msgstr "ç”¨äºŽæ ‡è®°ç´¢å¼•æ•°ç»„çš„æ ‡å¿—ã€‚" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "æ›¾ç”¨äºŽæ ‡è®°åŽ‹ç¼©ï¼ˆåŠç²¾åº¦æµ®ç‚¹ï¼‰é¢œè‰²æ•°ç»„çš„æ ‡å¿—ã€‚" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -90873,8 +91332,8 @@ msgid "" "function]. Returns a boolean scalar. Translates to [code]if[/code] " "instruction in shader code." msgstr "" -"通过 [member function] 比较[code]a[/code]å’Œ[code]b[/code]çš„ [member type]。返" -"å›žä¸€ä¸ªå¸ƒå°”æ ‡é‡ã€‚在ç€è‰²å™¨ä»£ç ä¸è½¬æ¢æˆ[code]if[/code]指令。" +"通过 [member function] 比较 [code]a[/code] å’Œ [code]b[/code] çš„ [member " +"type]ã€‚è¿”å›žä¸€ä¸ªå¸ƒå°”æ ‡é‡ã€‚在ç€è‰²å™¨ä»£ç ä¸è½¬æ¢æˆ [code]if[/code] 指令。" #: doc/classes/VisualShaderNodeCompare.xml msgid "" @@ -91397,12 +91856,12 @@ msgstr "ç§»é™¤æ‰€æœ‰å…ˆå‰æŒ‡å®šçš„输出端å£ã€‚" #: doc/classes/VisualShaderNodeGroupBase.xml msgid "" "Returns a free input port ID which can be used in [method add_input_port]." -msgstr "返回一个空闲的输入端å£ID,å¯ä»¥åœ¨[method add_input_port]ä¸ä½¿ç”¨ã€‚" +msgstr "è¿”å›žä¸€ä¸ªç©ºé—²çš„è¾“å…¥ç«¯å£ ID,å¯ä»¥åœ¨ [method add_input_port] ä¸ä½¿ç”¨ã€‚" #: doc/classes/VisualShaderNodeGroupBase.xml msgid "" "Returns a free output port ID which can be used in [method add_output_port]." -msgstr "返回一个空闲的输出端å£ID,å¯ä»¥åœ¨[method add_output_port]ä¸ä½¿ç”¨ã€‚" +msgstr "è¿”å›žä¸€ä¸ªç©ºé—²çš„è¾“å‡ºç«¯å£ ID,å¯ä»¥åœ¨ [method add_output_port] ä¸ä½¿ç”¨ã€‚" #: doc/classes/VisualShaderNodeGroupBase.xml msgid "" @@ -92509,8 +92968,12 @@ msgstr "" "ä¾èµ–,并å…许引用被释放。" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." -msgstr "返回æ¤å¼±å¼•用所指的 [Object]。" +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." +msgstr "" +"返回这个弱引用所引用的 [Object]。如果该对象ä¸å¤å˜åœ¨ï¼Œåˆ™è¿”回 [code]null[/" +"code]。" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml msgid "Closes this data channel, notifying the other peer." @@ -93353,7 +93816,7 @@ msgstr "" #: modules/websocket/doc_classes/WebSocketServer.xml msgid "Returns [code]true[/code] if a peer with the given ID is connected." -msgstr "如果一个具有给定ID的对ç‰ä½“被连接,则返回 [code]true[/code]。" +msgstr "如果一个具有给定 ID 的对ç‰ä½“被连接,则返回 [code]true[/code]。" #: modules/websocket/doc_classes/WebSocketServer.xml msgid "" @@ -93473,8 +93936,8 @@ msgid "" "[b]Note:[/b] This signal is [i]not[/i] emitted when used as high-level " "multiplayer peer." msgstr "" -"å½“æ”¶åˆ°ä¸€ä¸ªæ–°æ¶ˆæ¯æ—¶è§¦å‘。\n" -"[b]注æ„:[/b]这个信å·åœ¨ç”¨ä½œé«˜çº§å¤šäººå¯¹ç‰çš„æ—¶å€™ï¼Œ[i]ä¸ä¼š[/i]触å‘。" +"å½“æ”¶åˆ°æ–°æ¶ˆæ¯æ—¶è§¦å‘。\n" +"[b]注æ„:[/b]这个信å·[i]ä¸ä¼š[/i]在用作高级多人对ç‰ä½“时触å‘。" #: modules/webxr/doc_classes/WebXRInterface.xml msgid "AR/VR interface using WebXR." @@ -93936,10 +94399,10 @@ msgid "" msgstr "" "å‘出该消æ¯ä»¥è¡¨æ˜Žå¼•用空间已被é‡ç½®æˆ–釿–°é…置。\n" "何时或是å¦å‘出å–决于用户的æµè§ˆå™¨æˆ–设备,但å¯èƒ½åŒ…括当用户改å˜äº†ä»–们的游æˆç©ºé—´" -"çš„å°ºå¯¸ï¼Œä½ å¯ä»¥é€šè¿‡[member bounds_geometry]访问,或按下/按ä½ä¸€ä¸ªæŒ‰é’®æ¥é‡æ–°å®šä½" -"他们的ä½ç½®ã€‚\n" -"å‚阅[url=https://developer.mozilla.org/en-US/docs/Web/API/XRReferenceSpace/" -"reset_event]WebXRçš„XRReferenceSpaceé‡ç½®äº‹ä»¶[/url]。" +"çš„å°ºå¯¸ï¼Œä½ å¯ä»¥é€šè¿‡ [member bounds_geometry] 访问,或按下/按ä½ä¸€ä¸ªæŒ‰é’®æ¥é‡æ–°å®š" +"ä½ä»–们的ä½ç½®ã€‚\n" +"è¯¦æƒ…è§ [url=https://developer.mozilla.org/en-US/docs/Web/API/" +"XRReferenceSpace/reset_event]WebXR çš„ XRReferenceSpace é‡ç½®äº‹ä»¶[/url]。" #: modules/webxr/doc_classes/WebXRInterface.xml msgid "" @@ -94275,7 +94738,7 @@ msgstr "从 [code]path[/code] è·¯å¾„åŠ è½½è¯ä¹¦ï¼ˆâ€œ*.crtâ€æ–‡ä»¶ï¼‰ã€‚" msgid "" "Saves a certificate to the given [code]path[/code] (should be a \"*.crt\" " "file)." -msgstr "将一个è¯ä¹¦ä¿å˜åˆ°ç»™å®šçš„ [code]path[/code],应是一个“*.crtâ€æ–‡ä»¶ã€‚" +msgstr "å°†è¯ä¹¦ä¿å˜åˆ°ç»™å®šçš„ [code]path[/code](应是“*.crtâ€æ–‡ä»¶ï¼‰ã€‚" #: doc/classes/XMLParser.xml msgid "" @@ -94291,8 +94754,8 @@ msgid "" "flexible standard, this interface is low-level so it can be applied to any " "possible schema." msgstr "" -"这个类å¯ä»¥ä½œä¸ºåˆ¶ä½œè‡ªå®šä¹‰ XML è§£æžå™¨çš„基础。由于 XML 是一个éžå¸¸çµæ´»çš„æ ‡å‡†ï¼Œè¿™" -"个接å£ä¹Ÿæ˜¯åº•层的,å¯è¢«åº”用于任何å¯èƒ½çš„æ¨¡å¼ã€‚" +"这个类å¯ä»¥ä½œä¸ºåˆ¶ä½œè‡ªå®šä¹‰ XML è§£æžå™¨çš„基础。由于 XML 是éžå¸¸çµæ´»çš„æ ‡å‡†ï¼Œè¿™ä¸ªæŽ¥" +"å£ä¹Ÿæ˜¯åº•层的,å¯è¢«åº”用于任何å¯èƒ½çš„æ¨¡å¼ã€‚" #: doc/classes/XMLParser.xml msgid "Gets the amount of attributes in the current element." @@ -94398,7 +94861,7 @@ msgstr "没有节点,未打开文件或缓冲区。" #: doc/classes/XMLParser.xml msgid "Element (tag)." -msgstr "å…ƒç´ ï¼Œå³æ ‡ç¾ã€‚" +msgstr "å…ƒç´ ï¼ˆæ ‡ç¾ï¼‰ã€‚" #: doc/classes/XMLParser.xml msgid "End of element." @@ -94437,7 +94900,7 @@ msgstr "" "æ ¹æ®å节点的 Y åæ ‡å¯¹æ‰€æœ‰å节点进行排åºã€‚å节点必须继承自 [CanvasItem],æ‰èƒ½" "进行排åºã€‚Y åæ ‡è¾ƒé«˜çš„节点将åŽç»˜åˆ¶ï¼Œå› æ¤å®ƒä»¬å°†å‡ºçŽ°åœ¨ Y åæ ‡è¾ƒä½Žçš„节点之上。\n" "YSort 节点å¯ä»¥åµŒå¥—。å节点将与父节点在相åŒçš„空间内进行排åºï¼Œè¿™æ ·å¯ä»¥æ›´å¥½åœ°ç»„" -"织一个场景或将其分为多个场景,但åˆèƒ½ä¿æŒå”¯ä¸€çš„æŽ’åºã€‚" +"织场景或将其分为多个场景,但åˆèƒ½ä¿æŒå”¯ä¸€çš„æŽ’åºã€‚" #: doc/classes/YSort.xml msgid "" diff --git a/doc/translations/zh_TW.po b/doc/translations/zh_TW.po index 59cd8b199b..fb62e692a7 100644 --- a/doc/translations/zh_TW.po +++ b/doc/translations/zh_TW.po @@ -14,12 +14,13 @@ # 曹æ©é€¢ <nelson22768384@gmail.com>, 2022. # Otis Kao <momoslim@gmail.com>, 2022. # YuChiang Chang <chiang.c.tw@gmail.com>, 2022. +# Hugel <qihu@nfschina.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-05-31 22:35+0000\n" -"Last-Translator: YuChiang Chang <chiang.c.tw@gmail.com>\n" +"PO-Revision-Date: 2022-08-25 13:04+0000\n" +"Last-Translator: Hugel <qihu@nfschina.com>\n" "Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/" "godot-engine/godot-class-reference/zh_Hant/>\n" "Language: zh_TW\n" @@ -27,7 +28,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -87,7 +88,7 @@ msgstr "" #: doc/tools/make_rst.py msgid "Default" -msgstr "" +msgstr "默èª" #: doc/tools/make_rst.py msgid "Setter" @@ -119,7 +120,7 @@ msgstr "" #: doc/tools/make_rst.py msgid "This method is used to construct a type." -msgstr "" +msgstr "æ¤æ–¹æ³•ç”¨æ–¼æ§‹é€ é¡žåž‹ã€‚" #: doc/tools/make_rst.py msgid "" @@ -634,8 +635,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -645,7 +647,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -700,7 +703,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\n" "If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " @@ -712,7 +716,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "**fdffffffffffffffwsfsdfsdfsfdsdf**" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1134,10 +1139,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4956,19 +4966,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4989,21 +5001,25 @@ msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the default value of a parameter. Parameters are custom local memory " -"used for your nodes, given a resource can be reused in multiple trees." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. Parameters are custom local " "memory used for your nodes, given a resource can be reused in multiple " "trees. Format is similar to [method Object.get_property_list]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -5013,9 +5029,10 @@ msgstr "å›žå‚³åƒæ•¸çš„æ£åˆ‡å€¼ã€‚" #: doc/classes/AnimationNode.xml msgid "" -"User-defined callback called when a custom node is processed. The " -"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " -"[code]true[/code], in which case it is absolute.\n" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this node is processed. The [code]time[/code] parameter " +"is a relative delta, unless [code]seek[/code] is [code]true[/code], in which " +"case it is absolute.\n" "Here, call the [method blend_input], [method blend_node] or [method " "blend_animation] functions. You can also use [method get_parameter] and " "[method set_parameter] to modify local memory.\n" @@ -5667,9 +5684,9 @@ msgid "" "Turn on auto advance when this condition is set. The provided name will " "become a boolean parameter on the [AnimationTree] that can be controlled " "from code (see [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]). For example, if [member AnimationTree." -"tree_root] is an [AnimationNodeStateMachine] and [member advance_condition] " -"is set to [code]\"idle\"[/code]:\n" +"html#controlling-from-code]Using AnimationTree[/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -5843,8 +5860,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -6558,7 +6575,12 @@ msgstr "" msgid "" "3D area that detects [CollisionObject] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to custom audio buses." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape] or a [CollisionPolygon] " +"node as a [i]direct[/i] child (or add multiple such nodes as direct " +"children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " +"warning about possibly unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml @@ -6795,7 +6817,12 @@ msgstr "" msgid "" "2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " -"damping) and route audio to a custom audio bus." +"damping) and route audio to a custom audio bus.\n" +"To give the area its shape, add a [CollisionShape2D] or a " +"[CollisionPolygon2D] node as a [i]direct[/i] child (or add multiple such " +"nodes as direct children) of the area.\n" +"[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " +"unexpected behavior when using that shape for an area." msgstr "" #: doc/classes/Area2D.xml @@ -7443,7 +7470,15 @@ msgid "" "mode\" where the vertex and other arrays become the sources of data and the " "index array defines the vertex order. All sub-arrays must have the same " "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " -"it is used." +"it is used.\n" +"[code]compress_flags[/code] is a bitfield made of [enum Mesh.ArrayFormat] " +"values. It defaults to [constant Mesh.ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] The default [code]compress_flags[/code] enable [constant Mesh." +"ARRAY_COMPRESS_COLOR], which makes vertex colors stored as 8-bit unsigned " +"integers. This will clamp overbright vertex colors to [code]Color(1, 1, 1, 1)" +"[/code] and reduce their precision. To store HDR vertex colors, remove the " +"vertex color compression flag by passing [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ " +"Mesh.ARRAY_COMPRESS_COLOR[/code] as the value of [code]compress_flags[/code]." msgstr "" #: doc/classes/ArrayMesh.xml @@ -8849,8 +8884,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8901,10 +8937,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9147,12 +9193,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9698,7 +9738,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9859,12 +9904,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10012,6 +10061,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10152,7 +10216,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11833,7 +11900,7 @@ msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" "code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " -"world space units." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11926,7 +11993,9 @@ msgstr "" msgid "" "The camera's frustum offset. This can be changed from the default to create " "\"tilted frustum\" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-" -"shearing[/url]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11954,9 +12023,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12458,13 +12527,14 @@ msgid "" "inherit and extend their parent's transform. [CanvasItem] is extended by " "[Control] for anything GUI-related, and by [Node2D] for anything related to " "the 2D engine.\n" -"Any [CanvasItem] can draw. For this, [method update] must be called, then " -"[constant NOTIFICATION_DRAW] will be received on idle time to request " -"redraw. Because of this, canvas items don't need to be redrawn on every " -"frame, improving the performance significantly. Several functions for " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request redraw. Because of this, canvas items don't need to be redrawn on " +"every frame, improving the performance significantly. Several functions for " "drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " -"functions). However, they can only be used inside the [method Object." -"_notification], signal or [method _draw] virtual functions.\n" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\n" "Canvas items are drawn in tree order. By default, children are on top of " "their parents so a root [CanvasItem] will be drawn behind everything. This " "behavior can be changed on a per-item basis.\n" @@ -12490,8 +12560,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12804,12 +12876,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12854,8 +12926,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12903,8 +12977,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12966,7 +13043,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13091,7 +13168,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -13796,17 +13876,17 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_layer].\n" +"code] in the [member collision_layer].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_layer]." +"code] in the [member collision_layer]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" -"code] in the the [member collision_mask].\n" +"code] in the [member collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" -"code] in the the [member collision_mask]." +"code] in the [member collision_mask]." msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml @@ -14114,12 +14194,13 @@ msgstr "" #: doc/classes/CollisionShape.xml msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 3D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area] to give it a detection shape, or add it to a " +"[PhysicsBody] to create a solid object." msgstr "" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml @@ -14156,12 +14237,13 @@ msgstr "" #: doc/classes/CollisionShape2D.xml msgid "" -"Editor facility for creating and editing collision shapes in 2D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area2D] to give it a detection shape, or add it to a " -"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " -"Editor-only helper to create shapes, use [method CollisionObject2D." -"shape_owner_get_shape] to get the actual shape." +"Editor facility for creating and editing collision shapes in 2D space. Set " +"the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " +"is an Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape.\n" +"You can use this node to represent all sorts of collision shapes, for " +"example, add this to an [Area2D] to give it a detection shape, or add it to " +"a [PhysicsBody2D] to create a solid object." msgstr "" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml @@ -15321,7 +15403,15 @@ msgid "" "area. This shape is created by feeding a list of triangles.\n" "[b]Note:[/b] When used for collision, [ConcavePolygonShape] is intended to " "work with static [PhysicsBody] nodes like [StaticBody] and will not work " -"with [KinematicBody] or [RigidBody] with a mode other than Static." +"with [KinematicBody] or [RigidBody] with a mode other than Static.\n" +"[b]Warning:[/b] Using this shape for an [Area] (via a [CollisionShape] node, " +"created e.g. by using the [i]Create Trimesh Collision Sibling[/i] option in " +"the [i]Mesh[/i] menu that appears when selecting a [MeshInstance] node) may " +"give unexpected results: when using Godot Physics, the area will only detect " +"collisions with the triangle faces in the [ConcavePolygonShape] (and not " +"with any \"inside\" of the shape, for example), and when using Bullet " +"Physics the area will not detect any collisions with the concave shape at " +"all (this is a known bug)." msgstr "" #: doc/classes/ConcavePolygonShape.xml @@ -15347,7 +15437,11 @@ msgid "" "The main difference between a [ConvexPolygonShape2D] and a " "[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " "uses a more complex method of collision detection, and a convex one forces " -"itself to be convex in order to speed up collision detection." +"itself to be convex in order to speed up collision detection.\n" +"[b]Warning:[/b] Using this shape for an [Area2D] (via a [CollisionShape2D] " +"node) may give unexpected results: the area will only detect collisions with " +"the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " +"the shape, for example)." msgstr "" #: doc/classes/ConcavePolygonShape2D.xml @@ -16088,7 +16182,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18819,7 +18915,9 @@ msgstr "" msgid "" "A curve that can be saved and re-used for other objects. By default, it " "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " -"points relative to the [code]0.5[/code] Y position." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18968,16 +19066,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19123,18 +19222,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, with control points [code]in[/code] and [code]out[/code].\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." -msgstr "" - -#: doc/classes/Curve3D.xml #, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "å›žå‚³åƒæ•¸çš„åæ£å¼¦å€¼ã€‚" @@ -24049,8 +24136,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24671,7 +24762,9 @@ msgid "" "[code]next[/code] is passed. clipping the width. [code]position[/code] " "specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " "must be added to the Y axis. The width used by the character is returned, " -"making this function useful for drawing strings character by character." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26259,10 +26352,13 @@ msgstr "" #: doc/classes/Gradient.xml msgid "" "Given a set of colors, this resource will interpolate them in order. This " -"means that if you have color 1, color 2 and color 3, the ramp will " -"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " -"will initially have 2 colors (black and white), one (black) at ramp lower " -"offset 0 and the other (white) at the ramp higher offset 1." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27678,8 +27774,8 @@ msgstr "" msgid "" "Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " "to make HTTP requests to download web content, upload files and other data " -"or to communicate with various services, among other use cases. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a higher-level alternative.\n" "[b]Note:[/b] This client only needs to connect to a host once (see [method " "connect_to_host]) to send multiple requests. Because of this, methods that " "take URLs usually take just the part after the host instead of the full URL, " @@ -29981,11 +30077,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30831,7 +30930,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30843,6 +30946,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33204,14 +33317,14 @@ msgstr "" #: doc/classes/Line2D.xml msgid "" -"Adds a point at the [code]position[/code]. Appends the point at the end of " -"the line.\n" -"If [code]at_position[/code] is given, the point is inserted before the point " -"number [code]at_position[/code], moving that point (and every point after) " -"after the inserted point. If [code]at_position[/code] is not given, or is an " -"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " -"get_point_count][/code]), the point will be appended at the end of the point " -"list." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33219,22 +33332,26 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "å›žå‚³åƒæ•¸çš„æ£å¼¦å€¼ã€‚" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "計算兩個å‘é‡çš„外ç©ã€‚" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "計算兩個å‘é‡çš„外ç©ã€‚" #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." -msgstr "" +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." +msgstr "計算兩個å‘é‡çš„外ç©ã€‚" #: doc/classes/Line2D.xml msgid "" @@ -34510,8 +34627,12 @@ msgstr "" msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml doc/classes/VisualServer.xml -msgid "Flag used to mark a compressed (half float) color array." +#: doc/classes/Mesh.xml +msgid "" +"Flag used to mark a compressed (half float) color array.\n" +"[b]Note:[/b] If this flag is enabled, vertex colors will be stored as 8-bit " +"unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " +"1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml @@ -34556,7 +34677,10 @@ msgid "" "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " "ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly.\n" +"[b]Note:[/b] Since this flag enables [constant ARRAY_COMPRESS_COLOR], vertex " +"colors will be stored as 8-bit unsigned integers. This will clamp overbright " +"colors to [code]Color(1, 1, 1, 1)[/code] and reduce colors' precision." msgstr "" #: doc/classes/Mesh.xml @@ -34811,9 +34935,9 @@ msgid "" "MeshInstance is a node that takes a [Mesh] resource and adds it to the " "current scenario by creating an instance of it. This is the class most often " "used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"in many places. This allows reusing geometry, which can save on resources. " +"When a [Mesh] has to be instanced more than thousands of times at close " +"proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35274,7 +35398,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36412,7 +36538,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37238,13 +37364,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40914,7 +41052,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46300,7 +46440,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "計算兩個å‘é‡çš„外ç©ã€‚" #: doc/classes/PopupMenu.xml @@ -46539,7 +46681,9 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47269,7 +47413,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49950,8 +50098,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53529,11 +53688,15 @@ msgstr "" msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " -"responsible for [b]all[/b] the 3d culling. Some editor functionality may be " -"more difficult to use, so switching the active flag is intended to be used " -"to make sure your [Room] / [Portal] layout works within the editor.\n" +"responsible for [b]all[/b] the 3d culling. Some editor visual debugging " +"helpers may not be available when active, so switching the active flag is " +"intended to be used to ensure your [Room] / [Portal] layout works within the " +"editor.\n" "Switching to [code]active[/code] will have no effect when the [code]room " -"graph[/code] is unloaded (the rooms have not yet been converted)." +"graph[/code] is unloaded (the rooms have not yet been converted).\n" +"[b]Note:[/b] For efficiency, the portal system is designed to work with only " +"the core visual object types. In particular, only nodes derived from " +"[VisualInstance] are expected to show when the system is active." msgstr "" #: doc/classes/RoomManager.xml @@ -53970,7 +54133,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -54114,13 +54279,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -54443,6 +54614,18 @@ msgid "" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" +"You should avoid using more than one [SceneTreeTween] per object's property. " +"If two or more tweens animate one property at the same time, the last one " +"created will take priority and assign the final value. If you want to " +"interrupt and restart an animation, consider assigning the [SceneTreeTween] " +"to a variable:\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/codeblock]\n" "Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " @@ -54455,7 +54638,10 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it is created." +"immediately after it is created.\n" +"[b]Note:[/b] [SceneTreeTween]s are processing after all of nodes in the " +"current frame, i.e. after [method Node._process] or [method Node." +"_physics_process] (depending on [enum Tween.TweenProcessMode])." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55310,7 +55496,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55930,6 +56119,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56264,7 +56461,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57698,7 +57897,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58965,6 +59164,9 @@ msgid "" "the substrings, starting from right.\n" "The splits in the returned array are sorted in the same order as the " "original string, from left to right.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the right up to [code]maxsplit[/code]. The default value of 0 means " "that all items are split, thus giving the same result as [method split].\n" @@ -59026,6 +59228,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\n" "If [code]maxsplit[/code] is specified, it defines the number of splits to do " "from the left up to [code]maxsplit[/code]. The default value of [code]0[/" "code] means that all items are split.\n" @@ -59048,7 +59253,10 @@ msgid "" "Splits the string in floats by using a delimiter string and returns an array " "of the substrings.\n" "For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " -"split by [code]\",\"[/code]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60185,6 +60393,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "計算兩個å‘é‡çš„外ç©ã€‚" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60215,6 +60428,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "計算兩個å‘é‡çš„外ç©ã€‚" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60256,7 +60474,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -61614,39 +61834,46 @@ msgid "Clears all values on the theme." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "計算兩個å‘é‡çš„外ç©ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the constant at [code]name[/code] if the theme has [code]node_type[/" +"Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "計算兩個å‘é‡çš„外ç©ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "計算兩個å‘é‡çš„外ç©ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." -msgstr "" +"Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" +"code]." +msgstr "計算兩個å‘é‡çš„外ç©ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "計算兩個å‘é‡çš„外ç©ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code]." -msgstr "" +"theme has [code]theme_type[/code]." +msgstr "計算兩個å‘é‡çš„外ç©ã€‚" #: doc/classes/Theme.xml msgid "" @@ -61663,15 +61890,17 @@ msgid "Sets the theme's values to a copy of a given theme." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" -"Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "計算兩個å‘é‡çš„外ç©ã€‚" #: doc/classes/Theme.xml msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " -"name, for use in [method get_color], if the theme has [code]node_type[/code]." +"name, for use in [method get_color], if the theme has [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61683,16 +61912,17 @@ msgstr "" #: doc/classes/Theme.xml #, fuzzy msgid "" -"Returns the constant at [code]name[/code] if the theme has [code]node_type[/" +"Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "計算兩個å‘é‡çš„外ç©ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " -"name, for use in [method get_constant], if the theme has [code]node_type[/" +"name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." -msgstr "" +msgstr "計算兩個å‘é‡çš„外ç©ã€‚" #: doc/classes/Theme.xml msgid "" @@ -61703,16 +61933,17 @@ msgstr "" #: doc/classes/Theme.xml msgid "" -"Returns the [Font] at [code]name[/code] if the theme has [code]node_type[/" +"Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " -"name, for use in [method get_font], if the theme has [code]node_type[/code]." -msgstr "" +"name, for use in [method get_font], if the theme has [code]theme_type[/code]." +msgstr "計算兩個å‘é‡çš„外ç©ã€‚" #: doc/classes/Theme.xml msgid "" @@ -61721,16 +61952,18 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " -"[code]node_type[/code]." -msgstr "" +"[code]theme_type[/code]." +msgstr "計算兩個å‘é‡çš„外ç©ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " -"name, for use in [method get_icon], if the theme has [code]node_type[/code]." -msgstr "" +"name, for use in [method get_icon], if the theme has [code]theme_type[/code]." +msgstr "計算兩個å‘é‡çš„外ç©ã€‚" #: doc/classes/Theme.xml msgid "" @@ -61741,17 +61974,19 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " -"[code]node_type[/code].\n" +"[code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_stylebox_list]. " -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " -"[code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method get_stylebox_types]." +"[code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " +"get_stylebox_types]." msgstr "" #: doc/classes/Theme.xml @@ -61764,9 +61999,9 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " -"theme has [code]node_type[/code].\n" +"theme has [code]theme_type[/code].\n" "Valid [code]name[/code]s may be found using [method get_theme_item_list] or " -"a data type specific method. Valid [code]node_type[/code]s may be found " +"a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" @@ -61774,8 +62009,8 @@ msgstr "" msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " -"data type specific method, if the theme has [code]node_type[/code].\n" -"Valid [code]node_type[/code]s may be found using [method " +"data type specific method, if the theme has [code]theme_type[/code].\n" +"Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" @@ -61790,7 +62025,7 @@ msgstr "" msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" -"[b]Note:[/b] [code]node_type[/code] has no effect and will be removed in " +"[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" @@ -61807,18 +62042,22 @@ msgid "" msgstr "計算兩個å‘é‡çš„外ç©ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." -msgstr "" +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "計算兩個å‘é‡çš„外ç©ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." -msgstr "" +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "計算兩個å‘é‡çš„外ç©ã€‚" #: doc/classes/Theme.xml msgid "" @@ -61827,31 +62066,38 @@ msgid "" msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." -msgstr "" +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "計算兩個å‘é‡çš„外ç©ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." -msgstr "" +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "計算兩個å‘é‡çš„外ç©ã€‚" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " -"[code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." -msgstr "" +"[code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." +msgstr "計算兩個å‘é‡çš„外ç©ã€‚" #: doc/classes/Theme.xml msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " -"[code]name[/code] is in [code]node_type[/code].\n" -"Returns [code]false[/code] if the theme does not have [code]node_type[/code]." +"[code]name[/code] is in [code]theme_type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]theme_type[/" +"code]." msgstr "" #: doc/classes/Theme.xml @@ -61880,87 +62126,88 @@ msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml +#, fuzzy msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." -msgstr "" +msgstr "計算兩個å‘é‡çš„外ç©ã€‚" #: doc/classes/Theme.xml msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " -"has [code]node_type[/code]. If [code]name[/code] is already taken, this " +"has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " -"theme has [code]node_type[/code]. If [code]name[/code] is already taken, " +"theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " -"[code]name[/code] if the theme has [code]node_type[/code]. If [code]name[/" +"[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " -"in [code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"in [code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " -"[code]node_type[/code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"[code]theme_type[/code].\n" +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " -"[code]name[/code] in [code]node_type[/code].\n" +"[code]name[/code] in [code]theme_type[/code].\n" "Does nothing if the [code]value[/code] type does not match [code]data_type[/" "code].\n" -"Creates [code]node_type[/code] if the theme does not have it." +"Creates [code]theme_type[/code] if the theme does not have it." msgstr "" #: doc/classes/Theme.xml @@ -65140,21 +65387,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" -"Provides UPNP functionality to discover [UPNPDevice]s on the local network " -"and execute commands on them, like managing port mappings (port forwarding) " -"and querying the local and remote network IP address. Note that methods on " -"this class are synchronous and block the calling thread.\n" -"To forward a specific port:\n" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) and querying the local and remote network IP " +"address. Note that methods on this class are synchronous and block the " +"calling thread.\n" +"To forward a specific port (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65167,7 +65418,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65196,7 +65447,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65206,22 +65489,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Adds a mapping to forward the external [code]port[/code] (between 1 and " -"65535) on the default gateway (see [method get_gateway]) to the " -"[code]internal_port[/code] on the local machine for the given protocol " -"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " -"being the default). If a port mapping for the given port and protocol " -"combination already exists on that gateway device, this method tries to " -"overwrite it. If that is not desired, you can retrieve the gateway manually " -"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"65535, although recommended to use port 1024 or above) on the default " +"gateway (see [method get_gateway]) to the [code]internal_port[/code] on the " +"local machine for the given protocol [code]proto[/code] (either [code]TCP[/" +"code] or [code]UDP[/code], with UDP being the default). If a port mapping " +"for the given port and protocol combination already exists on that gateway " +"device, this method tries to overwrite it. If that is not desired, you can " +"retrieve the gateway manually with [method get_gateway] and call [method " +"add_port_mapping] on it, if any. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\n" "If [code]internal_port[/code] is [code]0[/code] (the default), the same port " "number is used for both the external and the internal port (the [code]port[/" "code] value).\n" -"The description ([code]desc[/code]) is shown in some router UIs and can be " -"used to point out which application added the mapping. The mapping's lease " -"duration can be limited by specifying a [code]duration[/code] (in seconds). " -"However, some routers are incompatible with one or both of these, so use " -"with caution and add fallback logic in case of errors to retry without them " -"if in doubt.\n" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65234,8 +65530,10 @@ msgid "" "Deletes the port mapping for the given port and protocol combination on the " "default gateway (see [method get_gateway]) if one exists. [code]port[/code] " "must be a valid port between 1 and 65535, [code]proto[/code] can be either " -"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " -"return values." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65433,16 +65731,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" -"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " -"low-level access to UPNP control commands. Allows to manage port mappings " -"(port forwarding) and to query network information of the device (like local " -"and external IP address and status). Note that methods on this class are " -"synchronous and block the calling thread." +"Universal Plug and Play (UPnP) device. See [UPNP] for UPnP discovery and " +"utility functions. Provides low-level access to UPNP control commands. " +"Allows to manage port mappings (port forwarding) and to query network " +"information of the device (like local and external IP address and status). " +"Note that methods on this class are synchronous and block the calling thread." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -71564,6 +71862,10 @@ msgid "Flag used to mark an index array." msgstr "" #: doc/classes/VisualServer.xml +msgid "Flag used to mark a compressed (half float) color array." +msgstr "" + +#: doc/classes/VisualServer.xml msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -74101,7 +74403,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/drivers/gles3/environment/fog.cpp b/drivers/gles3/environment/fog.cpp index 02d88f6871..8587c5f9f7 100644 --- a/drivers/gles3/environment/fog.cpp +++ b/drivers/gles3/environment/fog.cpp @@ -43,7 +43,7 @@ RID Fog::fog_volume_allocate() { void Fog::fog_volume_initialize(RID p_rid) { } -void Fog::fog_free(RID p_rid) { +void Fog::fog_volume_free(RID p_rid) { } void Fog::fog_volume_set_shape(RID p_fog_volume, RS::FogVolumeShape p_shape) { diff --git a/drivers/gles3/environment/fog.h b/drivers/gles3/environment/fog.h index 350eb459cf..fcde7399dd 100644 --- a/drivers/gles3/environment/fog.h +++ b/drivers/gles3/environment/fog.h @@ -46,7 +46,7 @@ public: virtual RID fog_volume_allocate() override; virtual void fog_volume_initialize(RID p_rid) override; - virtual void fog_free(RID p_rid) override; + virtual void fog_volume_free(RID p_rid) override; virtual void fog_volume_set_shape(RID p_fog_volume, RS::FogVolumeShape p_shape) override; virtual void fog_volume_set_extents(RID p_fog_volume, const Vector3 &p_extents) override; diff --git a/drivers/gles3/rasterizer_canvas_gles3.cpp b/drivers/gles3/rasterizer_canvas_gles3.cpp index 8d4954136e..0ffede0992 100644 --- a/drivers/gles3/rasterizer_canvas_gles3.cpp +++ b/drivers/gles3/rasterizer_canvas_gles3.cpp @@ -198,7 +198,8 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_ int item_count = 0; bool backbuffer_cleared = false; bool time_used = false; - bool material_screen_texture_found = false; + bool material_screen_texture_cached = false; + bool material_screen_texture_mipmaps_cached = false; Rect2 back_buffer_rect; bool backbuffer_copy = false; bool backbuffer_gen_mipmaps = false; @@ -223,10 +224,12 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_ GLES3::CanvasMaterialData *md = static_cast<GLES3::CanvasMaterialData *>(material_storage->material_get_data(material, RS::SHADER_CANVAS_ITEM)); if (md && md->shader_data->valid) { if (md->shader_data->uses_screen_texture && canvas_group_owner == nullptr) { - if (!material_screen_texture_found) { + if (!material_screen_texture_cached) { backbuffer_copy = true; back_buffer_rect = Rect2(); backbuffer_gen_mipmaps = md->shader_data->uses_screen_texture_mipmaps; + } else if (!material_screen_texture_mipmaps_cached) { + backbuffer_gen_mipmaps = md->shader_data->uses_screen_texture_mipmaps; } } @@ -287,7 +290,16 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_ texture_storage->render_target_copy_to_back_buffer(p_to_render_target, back_buffer_rect, backbuffer_gen_mipmaps); backbuffer_copy = false; - material_screen_texture_found = true; //after a backbuffer copy, screen texture makes no further copies + backbuffer_gen_mipmaps = false; + material_screen_texture_cached = true; // After a backbuffer copy, screen texture makes no further copies. + material_screen_texture_mipmaps_cached = backbuffer_gen_mipmaps; + } + + if (backbuffer_gen_mipmaps) { + texture_storage->render_target_gen_back_buffer_mipmaps(p_to_render_target, back_buffer_rect); + + backbuffer_gen_mipmaps = false; + material_screen_texture_mipmaps_cached = true; } // just add all items for now diff --git a/drivers/gles3/rasterizer_gles3.cpp b/drivers/gles3/rasterizer_gles3.cpp index cc96294ca5..3575837794 100644 --- a/drivers/gles3/rasterizer_gles3.cpp +++ b/drivers/gles3/rasterizer_gles3.cpp @@ -280,11 +280,6 @@ void RasterizerGLES3::_blit_render_target_to_screen(RID p_render_target, Display GLES3::RenderTarget *rt = texture_storage->get_render_target(p_render_target); ERR_FAIL_COND(!rt); - // TODO: do we need a keep 3d linear option? - - // Make sure we are drawing to the right context. - DisplayServer::get_singleton()->gl_window_make_current(p_screen); - if (rt->external.fbo != 0) { glBindFramebuffer(GL_READ_FRAMEBUFFER, rt->external.fbo); } else { @@ -298,9 +293,6 @@ void RasterizerGLES3::_blit_render_target_to_screen(RID p_render_target, Display // is this p_screen useless in a multi window environment? void RasterizerGLES3::blit_render_targets_to_screen(DisplayServer::WindowID p_screen, const BlitToScreen *p_render_targets, int p_amount) { - // All blits are going to the system framebuffer, so just bind once. - glBindFramebuffer(GL_FRAMEBUFFER, GLES3::TextureStorage::system_fbo); - for (int i = 0; i < p_amount; i++) { const BlitToScreen &blit = p_render_targets[i]; diff --git a/drivers/gles3/rasterizer_scene_gles3.cpp b/drivers/gles3/rasterizer_scene_gles3.cpp index dae26b1e5f..82d054ac59 100644 --- a/drivers/gles3/rasterizer_scene_gles3.cpp +++ b/drivers/gles3/rasterizer_scene_gles3.cpp @@ -34,7 +34,6 @@ #include "servers/rendering/rendering_server_default.h" #include "servers/rendering/rendering_server_globals.h" #include "storage/config.h" -#include "storage/light_storage.h" #include "storage/mesh_storage.h" #include "storage/texture_storage.h" @@ -70,7 +69,7 @@ void RasterizerSceneGLES3::GeometryInstanceGLES3::pair_light_instances(const RID spot_lights.clear(); for (uint32_t i = 0; i < p_light_instance_count; i++) { - RS::LightType type = RasterizerSceneGLES3::get_singleton()->light_instance_get_type(p_light_instances[i]); + RS::LightType type = GLES3::LightStorage::get_singleton()->light_instance_get_type(p_light_instances[i]); switch (type) { case RS::LIGHT_OMNI: { if (omni_light_count < (uint32_t)config->max_lights_per_object) { @@ -399,32 +398,6 @@ void RasterizerSceneGLES3::_geometry_instance_update(RenderGeometryInstance *p_g ginstance->dirty_list_element.remove_from_list(); } -/* SHADOW ATLAS API */ - -RID RasterizerSceneGLES3::shadow_atlas_create() { - return RID(); -} - -void RasterizerSceneGLES3::shadow_atlas_set_size(RID p_atlas, int p_size, bool p_16_bits) { -} - -void RasterizerSceneGLES3::shadow_atlas_set_quadrant_subdivision(RID p_atlas, int p_quadrant, int p_subdivision) { -} - -bool RasterizerSceneGLES3::shadow_atlas_update_light(RID p_atlas, RID p_light_intance, float p_coverage, uint64_t p_light_version) { - return false; -} - -void RasterizerSceneGLES3::directional_shadow_atlas_set_size(int p_size, bool p_16_bits) { -} - -int RasterizerSceneGLES3::get_directional_light_shadow_size(RID p_light_intance) { - return 0; -} - -void RasterizerSceneGLES3::set_directional_shadow_count(int p_count) { -} - /* SKY API */ void RasterizerSceneGLES3::_free_sky_data(Sky *p_sky) { @@ -625,7 +598,7 @@ void RasterizerSceneGLES3::_setup_sky(const RenderDataGLES3 *p_render_data, cons if (shader_data->uses_light) { sky_globals.directional_light_count = 0; for (int i = 0; i < (int)p_lights.size(); i++) { - LightInstance *li = light_instance_owner.get_or_null(p_lights[i]); + GLES3::LightInstance *li = GLES3::LightStorage::get_singleton()->get_light_instance(p_lights[i]); if (!li) { continue; } @@ -683,6 +656,7 @@ void RasterizerSceneGLES3::_setup_sky(const RenderDataGLES3 *p_render_data, cons light_data_dirty = true; for (uint32_t i = sky_globals.directional_light_count; i < sky_globals.max_directional_lights; i++) { sky_globals.directional_lights[i].enabled = false; + sky_globals.last_frame_directional_lights[i].enabled = false; } } @@ -736,7 +710,6 @@ void RasterizerSceneGLES3::_draw_sky(RID p_env, const Projection &p_projection, RS::EnvironmentBG background = environment_get_background(p_env); if (sky) { - ERR_FAIL_COND(!sky); sky_material = sky->material; if (sky_material.is_valid()) { @@ -1084,38 +1057,6 @@ void RasterizerSceneGLES3::positional_soft_shadow_filter_set_quality(RS::ShadowQ void RasterizerSceneGLES3::directional_soft_shadow_filter_set_quality(RS::ShadowQuality p_quality) { } -RID RasterizerSceneGLES3::light_instance_create(RID p_light) { - RID li = light_instance_owner.make_rid(LightInstance()); - - LightInstance *light_instance = light_instance_owner.get_or_null(li); - - light_instance->self = li; - light_instance->light = p_light; - light_instance->light_type = RSG::light_storage->light_get_type(p_light); - - return li; -} - -void RasterizerSceneGLES3::light_instance_set_transform(RID p_light_instance, const Transform3D &p_transform) { - LightInstance *light_instance = light_instance_owner.get_or_null(p_light_instance); - ERR_FAIL_COND(!light_instance); - - light_instance->transform = p_transform; -} - -void RasterizerSceneGLES3::light_instance_set_aabb(RID p_light_instance, const AABB &p_aabb) { - LightInstance *light_instance = light_instance_owner.get_or_null(p_light_instance); - ERR_FAIL_COND(!light_instance); - - light_instance->aabb = p_aabb; -} - -void RasterizerSceneGLES3::light_instance_set_shadow_transform(RID p_light_instance, const Projection &p_projection, const Transform3D &p_transform, float p_far, float p_split, int p_pass, float p_shadow_texel_size, float p_bias_scale, float p_range_begin, const Vector2 &p_uv_scale) { -} - -void RasterizerSceneGLES3::light_instance_mark_visible(RID p_light_instance) { -} - RID RasterizerSceneGLES3::fog_volume_instance_create(RID p_fog_volume) { return RID(); } @@ -1134,57 +1075,6 @@ Vector3 RasterizerSceneGLES3::fog_volume_instance_get_position(RID p_fog_volume_ return Vector3(); } -RID RasterizerSceneGLES3::reflection_atlas_create() { - return RID(); -} - -int RasterizerSceneGLES3::reflection_atlas_get_size(RID p_ref_atlas) const { - return 0; -} - -void RasterizerSceneGLES3::reflection_atlas_set_size(RID p_ref_atlas, int p_reflection_size, int p_reflection_count) { -} - -RID RasterizerSceneGLES3::reflection_probe_instance_create(RID p_probe) { - return RID(); -} - -void RasterizerSceneGLES3::reflection_probe_instance_set_transform(RID p_instance, const Transform3D &p_transform) { -} - -void RasterizerSceneGLES3::reflection_probe_release_atlas_index(RID p_instance) { -} - -bool RasterizerSceneGLES3::reflection_probe_instance_needs_redraw(RID p_instance) { - return false; -} - -bool RasterizerSceneGLES3::reflection_probe_instance_has_reflection(RID p_instance) { - return false; -} - -bool RasterizerSceneGLES3::reflection_probe_instance_begin_render(RID p_instance, RID p_reflection_atlas) { - return false; -} - -bool RasterizerSceneGLES3::reflection_probe_instance_postprocess_step(RID p_instance) { - return true; -} - -RID RasterizerSceneGLES3::decal_instance_create(RID p_decal) { - return RID(); -} - -void RasterizerSceneGLES3::decal_instance_set_transform(RID p_decal, const Transform3D &p_transform) { -} - -RID RasterizerSceneGLES3::lightmap_instance_create(RID p_lightmap) { - return RID(); -} - -void RasterizerSceneGLES3::lightmap_instance_set_transform(RID p_lightmap, const Transform3D &p_transform) { -} - RID RasterizerSceneGLES3::voxel_gi_instance_create(RID p_voxel_gi) { return RID(); } @@ -1257,13 +1147,13 @@ void RasterizerSceneGLES3::_fill_render_list(RenderListType p_render_list, const if (inst->omni_light_count) { inst->omni_light_gl_cache.resize(inst->omni_light_count); for (uint32_t j = 0; j < inst->omni_light_count; j++) { - inst->omni_light_gl_cache[j] = light_instance_get_gl_id(inst->omni_lights[j]); + inst->omni_light_gl_cache[j] = GLES3::LightStorage::get_singleton()->light_instance_get_gl_id(inst->omni_lights[j]); } } if (inst->spot_light_count) { inst->spot_light_gl_cache.resize(inst->spot_light_count); for (uint32_t j = 0; j < inst->spot_light_count; j++) { - inst->spot_light_gl_cache[j] = light_instance_get_gl_id(inst->spot_lights[j]); + inst->spot_light_gl_cache[j] = GLES3::LightStorage::get_singleton()->light_instance_get_gl_id(inst->spot_lights[j]); } } } @@ -1501,7 +1391,7 @@ void RasterizerSceneGLES3::_setup_lights(const RenderDataGLES3 *p_render_data, b int num_lights = lights.size(); for (int i = 0; i < num_lights; i++) { - LightInstance *li = light_instance_owner.get_or_null(lights[i]); + GLES3::LightInstance *li = GLES3::LightStorage::get_singleton()->get_light_instance(lights[i]); if (!li) { continue; } @@ -1606,12 +1496,12 @@ void RasterizerSceneGLES3::_setup_lights(const RenderDataGLES3 *p_render_data, b } if (r_omni_light_count) { - SortArray<InstanceSort<LightInstance>> sorter; + SortArray<InstanceSort<GLES3::LightInstance>> sorter; sorter.sort(scene_state.omni_light_sort, r_omni_light_count); } if (r_spot_light_count) { - SortArray<InstanceSort<LightInstance>> sorter; + SortArray<InstanceSort<GLES3::LightInstance>> sorter; sorter.sort(scene_state.spot_light_sort, r_spot_light_count); } @@ -1619,7 +1509,7 @@ void RasterizerSceneGLES3::_setup_lights(const RenderDataGLES3 *p_render_data, b uint32_t index = (i < r_omni_light_count) ? i : i - (r_omni_light_count); LightData &light_data = (i < r_omni_light_count) ? scene_state.omni_lights[index] : scene_state.spot_lights[index]; RS::LightType type = (i < r_omni_light_count) ? RS::LIGHT_OMNI : RS::LIGHT_SPOT; - LightInstance *li = (i < r_omni_light_count) ? scene_state.omni_light_sort[index].instance : scene_state.spot_light_sort[index].instance; + GLES3::LightInstance *li = (i < r_omni_light_count) ? scene_state.omni_light_sort[index].instance : scene_state.spot_light_sort[index].instance; RID base = li->light; Transform3D light_transform = li->transform; @@ -1718,7 +1608,7 @@ void RasterizerSceneGLES3::_setup_lights(const RenderDataGLES3 *p_render_data, b glBindBuffer(GL_UNIFORM_BUFFER, 0); } -void RasterizerSceneGLES3::render_scene(const Ref<RenderSceneBuffers> &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray<RenderGeometryInstance *> &p_instances, const PagedArray<RID> &p_lights, const PagedArray<RID> &p_reflection_probes, const PagedArray<RID> &p_voxel_gi_instances, const PagedArray<RID> &p_decals, const PagedArray<RID> &p_lightmaps, const PagedArray<RID> &p_fog_volumes, RID p_environment, RID p_camera_attributes, RID p_shadow_atlas, RID p_occluder_debug_tex, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, const RenderShadowData *p_render_shadows, int p_render_shadow_count, const RenderSDFGIData *p_render_sdfgi_regions, int p_render_sdfgi_region_count, const RenderSDFGIUpdateData *p_sdfgi_update_data, RendererScene::RenderInfo *r_render_info) { +void RasterizerSceneGLES3::render_scene(const Ref<RenderSceneBuffers> &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray<RenderGeometryInstance *> &p_instances, const PagedArray<RID> &p_lights, const PagedArray<RID> &p_reflection_probes, const PagedArray<RID> &p_voxel_gi_instances, const PagedArray<RID> &p_decals, const PagedArray<RID> &p_lightmaps, const PagedArray<RID> &p_fog_volumes, RID p_environment, RID p_camera_attributes, RID p_shadow_atlas, RID p_occluder_debug_tex, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, const RenderShadowData *p_render_shadows, int p_render_shadow_count, const RenderSDFGIData *p_render_sdfgi_regions, int p_render_sdfgi_region_count, const RenderSDFGIUpdateData *p_sdfgi_update_data, RenderingMethod::RenderInfo *r_render_info) { GLES3::TextureStorage *texture_storage = GLES3::TextureStorage::get_singleton(); GLES3::Config *config = GLES3::Config::get_singleton(); RENDER_TIMESTAMP("Setup 3D Scene"); @@ -2042,7 +1932,7 @@ void RasterizerSceneGLES3::_render_list_template(RenderListParameters *p_params, } break; } - if (p_pass_mode == PASS_MODE_COLOR || p_pass_mode == PASS_MODE_COLOR_TRANSPARENT) { + if constexpr (p_pass_mode == PASS_MODE_COLOR || p_pass_mode == PASS_MODE_COLOR_TRANSPARENT) { glActiveTexture(GL_TEXTURE0 + config->max_texture_image_units - 2); GLuint texture_to_bind = texture_storage->get_texture(texture_storage->texture_gl_get_default(GLES3::DEFAULT_GL_TEXTURE_CUBEMAP_BLACK))->tex_id; if (p_render_data->environment.is_valid()) { @@ -2073,7 +1963,7 @@ void RasterizerSceneGLES3::_render_list_template(RenderListParameters *p_params, GLES3::SceneMaterialData *material_data; void *mesh_surface; - if (p_pass_mode == PASS_MODE_SHADOW) { + if constexpr (p_pass_mode == PASS_MODE_SHADOW) { shader = surf->shader_shadow; material_data = surf->material_shadow; mesh_surface = surf->surface_shadow; @@ -2087,7 +1977,7 @@ void RasterizerSceneGLES3::_render_list_template(RenderListParameters *p_params, continue; } - if (p_pass_mode == PASS_MODE_COLOR_TRANSPARENT) { + if constexpr (p_pass_mode == PASS_MODE_COLOR_TRANSPARENT) { if (scene_state.current_depth_test != shader->depth_test) { if (shader->depth_test == GLES3::SceneShaderData::DEPTH_TEST_DISABLED) { glDisable(GL_DEPTH_TEST); @@ -2114,9 +2004,9 @@ void RasterizerSceneGLES3::_render_list_template(RenderListParameters *p_params, scene_state.current_depth_draw = shader->depth_draw; } - if (p_pass_mode == PASS_MODE_COLOR_TRANSPARENT || p_pass_mode == PASS_MODE_COLOR_ADDITIVE) { + if constexpr (p_pass_mode == PASS_MODE_COLOR_TRANSPARENT || p_pass_mode == PASS_MODE_COLOR_ADDITIVE) { GLES3::SceneShaderData::BlendMode desired_blend_mode; - if (p_pass_mode == PASS_MODE_COLOR_ADDITIVE) { + if constexpr (p_pass_mode == PASS_MODE_COLOR_ADDITIVE) { desired_blend_mode = GLES3::SceneShaderData::BLEND_MODE_ADD; } else { desired_blend_mode = shader->blend_mode; @@ -2240,9 +2130,9 @@ void RasterizerSceneGLES3::_render_list_template(RenderListParameters *p_params, if (prev_shader != shader || prev_variant != instance_variant) { material_storage->shaders.scene_shader.version_bind_shader(shader->version, instance_variant); float opaque_prepass_threshold = 0.0; - if (p_pass_mode == PASS_MODE_DEPTH) { + if constexpr (p_pass_mode == PASS_MODE_DEPTH) { opaque_prepass_threshold = 0.99; - } else if (p_pass_mode == PASS_MODE_SHADOW) { + } else if constexpr (p_pass_mode == PASS_MODE_SHADOW) { opaque_prepass_threshold = 0.1; } @@ -2390,10 +2280,8 @@ bool RasterizerSceneGLES3::free(RID p_rid) { ERR_FAIL_COND_V(!sky, false); _free_sky_data(sky); sky_owner.free(p_rid); - } else if (light_instance_owner.owns(p_rid)) { - LightInstance *light_instance = light_instance_owner.get_or_null(p_rid); - ERR_FAIL_COND_V(!light_instance, false); - light_instance_owner.free(p_rid); + } else if (GLES3::LightStorage::get_singleton()->owns_light_instance(p_rid)) { + GLES3::LightStorage::get_singleton()->light_instance_free(p_rid); } else if (RSG::camera_attributes->owns_camera_attributes(p_rid)) { //not much to delete, just free it RSG::camera_attributes->camera_attributes_free(p_rid); @@ -2433,13 +2321,13 @@ RasterizerSceneGLES3::RasterizerSceneGLES3() { uint32_t light_buffer_size = config->max_renderable_lights * sizeof(LightData); scene_state.omni_lights = memnew_arr(LightData, config->max_renderable_lights); - scene_state.omni_light_sort = memnew_arr(InstanceSort<LightInstance>, config->max_renderable_lights); + scene_state.omni_light_sort = memnew_arr(InstanceSort<GLES3::LightInstance>, config->max_renderable_lights); glGenBuffers(1, &scene_state.omni_light_buffer); glBindBuffer(GL_UNIFORM_BUFFER, scene_state.omni_light_buffer); glBufferData(GL_UNIFORM_BUFFER, light_buffer_size, nullptr, GL_STREAM_DRAW); scene_state.spot_lights = memnew_arr(LightData, config->max_renderable_lights); - scene_state.spot_light_sort = memnew_arr(InstanceSort<LightInstance>, config->max_renderable_lights); + scene_state.spot_light_sort = memnew_arr(InstanceSort<GLES3::LightInstance>, config->max_renderable_lights); glGenBuffers(1, &scene_state.spot_light_buffer); glBindBuffer(GL_UNIFORM_BUFFER, scene_state.spot_light_buffer); glBufferData(GL_UNIFORM_BUFFER, light_buffer_size, nullptr, GL_STREAM_DRAW); @@ -2480,7 +2368,7 @@ RasterizerSceneGLES3::RasterizerSceneGLES3() { scene_globals.default_shader = material_storage->shader_allocate(); material_storage->shader_initialize(scene_globals.default_shader); material_storage->shader_set_code(scene_globals.default_shader, R"( -// Default 3D material shader (clustered). +// Default 3D material shader. shader_type spatial; diff --git a/drivers/gles3/rasterizer_scene_gles3.h b/drivers/gles3/rasterizer_scene_gles3.h index 881fc5615c..d11dc14080 100644 --- a/drivers/gles3/rasterizer_scene_gles3.h +++ b/drivers/gles3/rasterizer_scene_gles3.h @@ -44,6 +44,7 @@ #include "shader_gles3.h" #include "shaders/cubemap_filter.glsl.gen.h" #include "shaders/sky.glsl.gen.h" +#include "storage/light_storage.h" #include "storage/material_storage.h" #include "storage/render_scene_buffers_gles3.h" #include "storage/utilities.h" @@ -124,7 +125,7 @@ struct RenderDataGLES3 { uint32_t spot_light_count = 0; uint32_t omni_light_count = 0; - RendererScene::RenderInfo *render_info = nullptr; + RenderingMethod::RenderInfo *render_info = nullptr; }; class RasterizerCanvasGLES3; @@ -183,34 +184,6 @@ private: }; static_assert(sizeof(DirectionalLightData) % 16 == 0, "DirectionalLightData size must be a multiple of 16 bytes"); - struct LightInstance { - RS::LightType light_type = RS::LIGHT_DIRECTIONAL; - - AABB aabb; - RID self; - RID light; - Transform3D transform; - - Vector3 light_vector; - Vector3 spot_vector; - float linear_att = 0.0; - - uint64_t shadow_pass = 0; - uint64_t last_scene_pass = 0; - uint64_t last_scene_shadow_pass = 0; - uint64_t last_pass = 0; - uint32_t cull_mask = 0; - uint32_t light_directional_index = 0; - - Rect2 directional_rect; - - uint32_t gl_id = -1; - - LightInstance() {} - }; - - mutable RID_Owner<LightInstance> light_instance_owner; - class GeometryInstanceGLES3; // Cached data for drawing surfaces @@ -304,12 +277,13 @@ private: }; enum { - INSTANCE_DATA_FLAGS_NON_UNIFORM_SCALE = 1 << 5, - INSTANCE_DATA_FLAG_USE_GI_BUFFERS = 1 << 6, - INSTANCE_DATA_FLAG_USE_LIGHTMAP_CAPTURE = 1 << 8, - INSTANCE_DATA_FLAG_USE_LIGHTMAP = 1 << 9, - INSTANCE_DATA_FLAG_USE_SH_LIGHTMAP = 1 << 10, - INSTANCE_DATA_FLAG_USE_VOXEL_GI = 1 << 11, + INSTANCE_DATA_FLAGS_NON_UNIFORM_SCALE = 1 << 4, + INSTANCE_DATA_FLAG_USE_GI_BUFFERS = 1 << 5, + INSTANCE_DATA_FLAG_USE_LIGHTMAP_CAPTURE = 1 << 7, + INSTANCE_DATA_FLAG_USE_LIGHTMAP = 1 << 8, + INSTANCE_DATA_FLAG_USE_SH_LIGHTMAP = 1 << 9, + INSTANCE_DATA_FLAG_USE_VOXEL_GI = 1 << 10, + INSTANCE_DATA_FLAG_PARTICLES = 1 << 11, INSTANCE_DATA_FLAG_MULTIMESH = 1 << 12, INSTANCE_DATA_FLAG_MULTIMESH_FORMAT_2D = 1 << 13, INSTANCE_DATA_FLAG_MULTIMESH_HAS_COLOR = 1 << 14, @@ -397,8 +371,8 @@ private: LightData *omni_lights = nullptr; LightData *spot_lights = nullptr; - InstanceSort<LightInstance> *omni_light_sort; - InstanceSort<LightInstance> *spot_light_sort; + InstanceSort<GLES3::LightInstance> *omni_light_sort; + InstanceSort<GLES3::LightInstance> *spot_light_sort; GLuint omni_light_buffer = 0; GLuint spot_light_buffer = 0; uint32_t omni_light_count = 0; @@ -604,17 +578,6 @@ public: uint32_t geometry_instance_get_pair_mask() override; - /* SHADOW ATLAS API */ - - RID shadow_atlas_create() override; - void shadow_atlas_set_size(RID p_atlas, int p_size, bool p_16_bits = true) override; - void shadow_atlas_set_quadrant_subdivision(RID p_atlas, int p_quadrant, int p_subdivision) override; - bool shadow_atlas_update_light(RID p_atlas, RID p_light_intance, float p_coverage, uint64_t p_light_version) override; - - void directional_shadow_atlas_set_size(int p_size, bool p_16_bits = true) override; - int get_directional_light_shadow_size(RID p_light_intance) override; - void set_directional_shadow_count(int p_count) override; - /* SDFGI UPDATE */ void sdfgi_update(const Ref<RenderSceneBuffers> &p_render_buffers, RID p_environment, const Vector3 &p_world_position) override {} @@ -665,45 +628,12 @@ public: void positional_soft_shadow_filter_set_quality(RS::ShadowQuality p_quality) override; void directional_soft_shadow_filter_set_quality(RS::ShadowQuality p_quality) override; - RID light_instance_create(RID p_light) override; - void light_instance_set_transform(RID p_light_instance, const Transform3D &p_transform) override; - void light_instance_set_aabb(RID p_light_instance, const AABB &p_aabb) override; - void light_instance_set_shadow_transform(RID p_light_instance, const Projection &p_projection, const Transform3D &p_transform, float p_far, float p_split, int p_pass, float p_shadow_texel_size, float p_bias_scale = 1.0, float p_range_begin = 0, const Vector2 &p_uv_scale = Vector2()) override; - void light_instance_mark_visible(RID p_light_instance) override; - - _FORCE_INLINE_ RS::LightType light_instance_get_type(RID p_light_instance) { - LightInstance *li = light_instance_owner.get_or_null(p_light_instance); - return li->light_type; - } - _FORCE_INLINE_ uint32_t light_instance_get_gl_id(RID p_light_instance) { - LightInstance *li = light_instance_owner.get_or_null(p_light_instance); - return li->gl_id; - } - RID fog_volume_instance_create(RID p_fog_volume) override; void fog_volume_instance_set_transform(RID p_fog_volume_instance, const Transform3D &p_transform) override; void fog_volume_instance_set_active(RID p_fog_volume_instance, bool p_active) override; RID fog_volume_instance_get_volume(RID p_fog_volume_instance) const override; Vector3 fog_volume_instance_get_position(RID p_fog_volume_instance) const override; - RID reflection_atlas_create() override; - int reflection_atlas_get_size(RID p_ref_atlas) const override; - void reflection_atlas_set_size(RID p_ref_atlas, int p_reflection_size, int p_reflection_count) override; - - RID reflection_probe_instance_create(RID p_probe) override; - void reflection_probe_instance_set_transform(RID p_instance, const Transform3D &p_transform) override; - void reflection_probe_release_atlas_index(RID p_instance) override; - bool reflection_probe_instance_needs_redraw(RID p_instance) override; - bool reflection_probe_instance_has_reflection(RID p_instance) override; - bool reflection_probe_instance_begin_render(RID p_instance, RID p_reflection_atlas) override; - bool reflection_probe_instance_postprocess_step(RID p_instance) override; - - RID decal_instance_create(RID p_decal) override; - void decal_instance_set_transform(RID p_decal, const Transform3D &p_transform) override; - - RID lightmap_instance_create(RID p_lightmap) override; - void lightmap_instance_set_transform(RID p_lightmap, const Transform3D &p_transform) override; - RID voxel_gi_instance_create(RID p_voxel_gi) override; void voxel_gi_instance_set_transform_to_data(RID p_probe, const Transform3D &p_xform) override; bool voxel_gi_needs_update(RID p_probe) const override; @@ -711,7 +641,7 @@ public: void voxel_gi_set_quality(RS::VoxelGIQuality) override; - void render_scene(const Ref<RenderSceneBuffers> &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray<RenderGeometryInstance *> &p_instances, const PagedArray<RID> &p_lights, const PagedArray<RID> &p_reflection_probes, const PagedArray<RID> &p_voxel_gi_instances, const PagedArray<RID> &p_decals, const PagedArray<RID> &p_lightmaps, const PagedArray<RID> &p_fog_volumes, RID p_environment, RID p_camera_attributes, RID p_shadow_atlas, RID p_occluder_debug_tex, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, const RenderShadowData *p_render_shadows, int p_render_shadow_count, const RenderSDFGIData *p_render_sdfgi_regions, int p_render_sdfgi_region_count, const RenderSDFGIUpdateData *p_sdfgi_update_data = nullptr, RendererScene::RenderInfo *r_render_info = nullptr) override; + void render_scene(const Ref<RenderSceneBuffers> &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray<RenderGeometryInstance *> &p_instances, const PagedArray<RID> &p_lights, const PagedArray<RID> &p_reflection_probes, const PagedArray<RID> &p_voxel_gi_instances, const PagedArray<RID> &p_decals, const PagedArray<RID> &p_lightmaps, const PagedArray<RID> &p_fog_volumes, RID p_environment, RID p_camera_attributes, RID p_shadow_atlas, RID p_occluder_debug_tex, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, const RenderShadowData *p_render_shadows, int p_render_shadow_count, const RenderSDFGIData *p_render_sdfgi_regions, int p_render_sdfgi_region_count, const RenderSDFGIUpdateData *p_sdfgi_update_data = nullptr, RenderingMethod::RenderInfo *r_render_info = nullptr) override; void render_material(const Transform3D &p_cam_transform, const Projection &p_cam_projection, bool p_cam_orthogonal, const PagedArray<RenderGeometryInstance *> &p_instances, RID p_framebuffer, const Rect2i &p_region) override; void render_particle_collider_heightfield(RID p_collider, const Transform3D &p_transform, const PagedArray<RenderGeometryInstance *> &p_instances) override; diff --git a/drivers/gles3/shaders/canvas.glsl b/drivers/gles3/shaders/canvas.glsl index 7334100575..8dae28b6ef 100644 --- a/drivers/gles3/shaders/canvas.glsl +++ b/drivers/gles3/shaders/canvas.glsl @@ -127,6 +127,8 @@ void main() { } #endif + vec2 color_texture_pixel_size = draw_data[draw_data_instance].color_texture_pixel_size.xy; + #ifdef USE_POINT_SIZE float point_size = 1.0; #endif @@ -393,6 +395,8 @@ void main() { vec2 screen_uv = vec2(0.0); #endif + vec2 color_texture_pixel_size = draw_data[draw_data_instance].color_texture_pixel_size.xy; + vec3 light_vertex = vec3(vertex, 0.0); vec2 shadow_vertex = vertex; diff --git a/drivers/gles3/shaders/scene.glsl b/drivers/gles3/shaders/scene.glsl index c7fdd6ebd8..efd6036ba9 100644 --- a/drivers/gles3/shaders/scene.glsl +++ b/drivers/gles3/shaders/scene.glsl @@ -629,11 +629,12 @@ void light_compute(vec3 N, vec3 L, vec3 V, float A, vec3 light_color, float atte float diffuse_brdf_NL; // BRDF times N.L for calculating diffuse radiance #if defined(DIFFUSE_LAMBERT_WRAP) - // energy conserving lambert wrap shader - diffuse_brdf_NL = max(0.0, (NdotL + roughness) / ((1.0 + roughness) * (1.0 + roughness))); + // Energy conserving lambert wrap shader. + // https://web.archive.org/web/20210228210901/http://blog.stevemcauley.com/2011/12/03/energy-conserving-wrapped-diffuse/ + diffuse_brdf_NL = max(0.0, (NdotL + roughness) / ((1.0 + roughness) * (1.0 + roughness))) * (1.0 / M_PI); #elif defined(DIFFUSE_TOON) - diffuse_brdf_NL = smoothstep(-roughness, max(roughness, 0.01), NdotL); + diffuse_brdf_NL = smoothstep(-roughness, max(roughness, 0.01), NdotL) * (1.0 / M_PI); #elif defined(DIFFUSE_BURLEY) diff --git a/drivers/gles3/shaders/sky.glsl b/drivers/gles3/shaders/sky.glsl index 21f01d2a8f..4c0fe47f6b 100644 --- a/drivers/gles3/shaders/sky.glsl +++ b/drivers/gles3/shaders/sky.glsl @@ -104,6 +104,15 @@ uniform uint directional_light_count; layout(location = 0) out vec4 frag_color; +#ifdef USE_DEBANDING +// https://www.iryoku.com/next-generation-post-processing-in-call-of-duty-advanced-warfare +vec3 interleaved_gradient_noise(vec2 pos) { + const vec3 magic = vec3(0.06711056f, 0.00583715f, 52.9829189f); + float res = fract(magic.z * fract(dot(pos, magic.xy))) * 2.0 - 1.0; + return vec3(res, -res, res) / 255.0; +} +#endif + void main() { vec3 cube_normal; cube_normal.z = -1.0; @@ -168,4 +177,8 @@ void main() { frag_color.rgb = color; frag_color.a = alpha; + +#ifdef USE_DEBANDING + frag_color.rgb += interleaved_gradient_noise(gl_FragCoord.xy); +#endif } diff --git a/drivers/gles3/storage/light_storage.cpp b/drivers/gles3/storage/light_storage.cpp index 6411590aee..b6bd4a2760 100644 --- a/drivers/gles3/storage/light_storage.cpp +++ b/drivers/gles3/storage/light_storage.cpp @@ -333,6 +333,46 @@ AABB LightStorage::light_get_aabb(RID p_light) const { ERR_FAIL_V(AABB()); } +/* LIGHT INSTANCE API */ + +RID LightStorage::light_instance_create(RID p_light) { + RID li = light_instance_owner.make_rid(LightInstance()); + + LightInstance *light_instance = light_instance_owner.get_or_null(li); + + light_instance->self = li; + light_instance->light = p_light; + light_instance->light_type = light_get_type(p_light); + + return li; +} + +void LightStorage::light_instance_free(RID p_light_instance) { + LightInstance *light_instance = light_instance_owner.get_or_null(p_light_instance); + ERR_FAIL_COND(!light_instance); + light_instance_owner.free(p_light_instance); +} + +void LightStorage::light_instance_set_transform(RID p_light_instance, const Transform3D &p_transform) { + LightInstance *light_instance = light_instance_owner.get_or_null(p_light_instance); + ERR_FAIL_COND(!light_instance); + + light_instance->transform = p_transform; +} + +void LightStorage::light_instance_set_aabb(RID p_light_instance, const AABB &p_aabb) { + LightInstance *light_instance = light_instance_owner.get_or_null(p_light_instance); + ERR_FAIL_COND(!light_instance); + + light_instance->aabb = p_aabb; +} + +void LightStorage::light_instance_set_shadow_transform(RID p_light_instance, const Projection &p_projection, const Transform3D &p_transform, float p_far, float p_split, int p_pass, float p_shadow_texel_size, float p_bias_scale, float p_range_begin, const Vector2 &p_uv_scale) { +} + +void LightStorage::light_instance_mark_visible(RID p_light_instance) { +} + /* PROBE API */ RID LightStorage::reflection_probe_allocate() { @@ -419,6 +459,53 @@ float LightStorage::reflection_probe_get_mesh_lod_threshold(RID p_probe) const { return 0.0; } +/* REFLECTION ATLAS */ + +RID LightStorage::reflection_atlas_create() { + return RID(); +} + +void LightStorage::reflection_atlas_free(RID p_ref_atlas) { +} + +int LightStorage::reflection_atlas_get_size(RID p_ref_atlas) const { + return 0; +} + +void LightStorage::reflection_atlas_set_size(RID p_ref_atlas, int p_reflection_size, int p_reflection_count) { +} + +/* REFLECTION PROBE INSTANCE */ + +RID LightStorage::reflection_probe_instance_create(RID p_probe) { + return RID(); +} + +void LightStorage::reflection_probe_instance_free(RID p_instance) { +} + +void LightStorage::reflection_probe_instance_set_transform(RID p_instance, const Transform3D &p_transform) { +} + +void LightStorage::reflection_probe_release_atlas_index(RID p_instance) { +} + +bool LightStorage::reflection_probe_instance_needs_redraw(RID p_instance) { + return false; +} + +bool LightStorage::reflection_probe_instance_has_reflection(RID p_instance) { + return false; +} + +bool LightStorage::reflection_probe_instance_begin_render(RID p_instance, RID p_reflection_atlas) { + return false; +} + +bool LightStorage::reflection_probe_instance_postprocess_step(RID p_instance) { + return true; +} + /* LIGHTMAP CAPTURE */ RID LightStorage::lightmap_allocate() { @@ -484,6 +571,18 @@ float LightStorage::lightmap_get_probe_capture_update_speed() const { return 0; } +/* LIGHTMAP INSTANCE */ + +RID LightStorage::lightmap_instance_create(RID p_lightmap) { + return RID(); +} + +void LightStorage::lightmap_instance_free(RID p_lightmap) { +} + +void LightStorage::lightmap_instance_set_transform(RID p_lightmap, const Transform3D &p_transform) { +} + /* LIGHT SHADOW MAPPING */ /* @@ -584,4 +683,36 @@ void LightStorage::canvas_light_occluder_set_polylines(RID p_occluder, const Poo } */ +/* SHADOW ATLAS API */ + +RID LightStorage::shadow_atlas_create() { + return RID(); +} + +void LightStorage::shadow_atlas_free(RID p_atlas) { +} + +void LightStorage::shadow_atlas_set_size(RID p_atlas, int p_size, bool p_16_bits) { +} + +void LightStorage::shadow_atlas_set_quadrant_subdivision(RID p_atlas, int p_quadrant, int p_subdivision) { +} + +bool LightStorage::shadow_atlas_update_light(RID p_atlas, RID p_light_intance, float p_coverage, uint64_t p_light_version) { + return false; +} + +void LightStorage::shadow_atlas_update(RID p_atlas) { +} + +void LightStorage::directional_shadow_atlas_set_size(int p_size, bool p_16_bits) { +} + +int LightStorage::get_directional_light_shadow_size(RID p_light_intance) { + return 0; +} + +void LightStorage::set_directional_shadow_count(int p_count) { +} + #endif // !GLES3_ENABLED diff --git a/drivers/gles3/storage/light_storage.h b/drivers/gles3/storage/light_storage.h index f054f0fdc6..12cb2c4393 100644 --- a/drivers/gles3/storage/light_storage.h +++ b/drivers/gles3/storage/light_storage.h @@ -36,6 +36,7 @@ #include "core/templates/local_vector.h" #include "core/templates/rid_owner.h" #include "core/templates/self_list.h" +#include "drivers/gles3/storage/texture_storage.h" #include "servers/rendering/renderer_compositor.h" #include "servers/rendering/storage/light_storage.h" #include "servers/rendering/storage/utilities.h" @@ -75,6 +76,33 @@ struct Light { Dependency dependency; }; +/* Light instance */ +struct LightInstance { + RS::LightType light_type = RS::LIGHT_DIRECTIONAL; + + AABB aabb; + RID self; + RID light; + Transform3D transform; + + Vector3 light_vector; + Vector3 spot_vector; + float linear_att = 0.0; + + uint64_t shadow_pass = 0; + uint64_t last_scene_pass = 0; + uint64_t last_scene_shadow_pass = 0; + uint64_t last_pass = 0; + uint32_t cull_mask = 0; + uint32_t light_directional_index = 0; + + Rect2 directional_rect; + + uint32_t gl_id = -1; + + LightInstance() {} +}; + /* REFLECTION PROBE */ struct ReflectionProbe { @@ -127,6 +155,9 @@ private: /* LIGHT */ mutable RID_Owner<Light, true> light_owner; + /* Light instance */ + mutable RID_Owner<LightInstance> light_instance_owner; + /* REFLECTION PROBE */ mutable RID_Owner<ReflectionProbe, true> reflection_probe_owner; @@ -246,7 +277,7 @@ public: const Light *light = light_owner.get_or_null(p_light); ERR_FAIL_COND_V(!light, RS::LIGHT_DIRECTIONAL); - return light_owner.owns(light->projector); + return TextureStorage::get_singleton()->owns_texture(light->projector); } _FORCE_INLINE_ bool light_is_negative(RID p_light) const { @@ -267,6 +298,28 @@ public: virtual uint32_t light_get_max_sdfgi_cascade(RID p_light) override { return 0; } virtual uint64_t light_get_version(RID p_light) const override; + /* LIGHT INSTANCE API */ + + LightInstance *get_light_instance(RID p_rid) { return light_instance_owner.get_or_null(p_rid); }; + bool owns_light_instance(RID p_rid) { return light_instance_owner.owns(p_rid); }; + + virtual RID light_instance_create(RID p_light) override; + virtual void light_instance_free(RID p_light_instance) override; + + virtual void light_instance_set_transform(RID p_light_instance, const Transform3D &p_transform) override; + virtual void light_instance_set_aabb(RID p_light_instance, const AABB &p_aabb) override; + virtual void light_instance_set_shadow_transform(RID p_light_instance, const Projection &p_projection, const Transform3D &p_transform, float p_far, float p_split, int p_pass, float p_shadow_texel_size, float p_bias_scale = 1.0, float p_range_begin = 0, const Vector2 &p_uv_scale = Vector2()) override; + virtual void light_instance_mark_visible(RID p_light_instance) override; + + _FORCE_INLINE_ RS::LightType light_instance_get_type(RID p_light_instance) { + LightInstance *li = light_instance_owner.get_or_null(p_light_instance); + return li->light_type; + } + _FORCE_INLINE_ uint32_t light_instance_get_gl_id(RID p_light_instance) { + LightInstance *li = light_instance_owner.get_or_null(p_light_instance); + return li->gl_id; + } + /* PROBE API */ virtual RID reflection_probe_allocate() override; @@ -297,6 +350,24 @@ public: virtual float reflection_probe_get_origin_max_distance(RID p_probe) const override; virtual bool reflection_probe_renders_shadows(RID p_probe) const override; + /* REFLECTION ATLAS */ + + virtual RID reflection_atlas_create() override; + virtual void reflection_atlas_free(RID p_ref_atlas) override; + virtual int reflection_atlas_get_size(RID p_ref_atlas) const override; + virtual void reflection_atlas_set_size(RID p_ref_atlas, int p_reflection_size, int p_reflection_count) override; + + /* REFLECTION PROBE INSTANCE */ + + virtual RID reflection_probe_instance_create(RID p_probe) override; + virtual void reflection_probe_instance_free(RID p_instance) override; + virtual void reflection_probe_instance_set_transform(RID p_instance, const Transform3D &p_transform) override; + virtual void reflection_probe_release_atlas_index(RID p_instance) override; + virtual bool reflection_probe_instance_needs_redraw(RID p_instance) override; + virtual bool reflection_probe_instance_has_reflection(RID p_instance) override; + virtual bool reflection_probe_instance_begin_render(RID p_instance, RID p_reflection_atlas) override; + virtual bool reflection_probe_instance_postprocess_step(RID p_instance) override; + /* LIGHTMAP CAPTURE */ Lightmap *get_lightmap(RID p_rid) { return lightmap_owner.get_or_null(p_rid); }; @@ -337,6 +408,26 @@ public: RID canvas_light_occluder_create(); void canvas_light_occluder_set_polylines(RID p_occluder, const LocalVector<Vector2> &p_lines); */ + + /* LIGHTMAP INSTANCE */ + + virtual RID lightmap_instance_create(RID p_lightmap) override; + virtual void lightmap_instance_free(RID p_lightmap) override; + virtual void lightmap_instance_set_transform(RID p_lightmap, const Transform3D &p_transform) override; + + /* SHADOW ATLAS API */ + + virtual RID shadow_atlas_create() override; + virtual void shadow_atlas_free(RID p_atlas) override; + virtual void shadow_atlas_set_size(RID p_atlas, int p_size, bool p_16_bits = true) override; + virtual void shadow_atlas_set_quadrant_subdivision(RID p_atlas, int p_quadrant, int p_subdivision) override; + virtual bool shadow_atlas_update_light(RID p_atlas, RID p_light_intance, float p_coverage, uint64_t p_light_version) override; + + virtual void shadow_atlas_update(RID p_atlas) override; + + virtual void directional_shadow_atlas_set_size(int p_size, bool p_16_bits = true) override; + virtual int get_directional_light_shadow_size(RID p_light_intance) override; + virtual void set_directional_shadow_count(int p_count) override; }; } // namespace GLES3 diff --git a/drivers/gles3/storage/material_storage.cpp b/drivers/gles3/storage/material_storage.cpp index 3dbc75392c..bbbad50b14 100644 --- a/drivers/gles3/storage/material_storage.cpp +++ b/drivers/gles3/storage/material_storage.cpp @@ -1379,9 +1379,9 @@ MaterialStorage::MaterialStorage() { actions.renames["POINT_SIZE"] = "gl_PointSize"; actions.renames["MODEL_MATRIX"] = "model_matrix"; - actions.renames["CANVAS_MATRIX"] = "canvas_data.canvas_transform"; - actions.renames["SCREEN_MATRIX"] = "canvas_data.screen_transform"; - actions.renames["TIME"] = "canvas_data.time"; + actions.renames["CANVAS_MATRIX"] = "canvas_transform"; + actions.renames["SCREEN_MATRIX"] = "screen_transform"; + actions.renames["TIME"] = "time"; actions.renames["PI"] = _MKSTR(Math_PI); actions.renames["TAU"] = _MKSTR(Math_TAU); actions.renames["E"] = _MKSTR(Math_E); @@ -1393,19 +1393,21 @@ MaterialStorage::MaterialStorage() { actions.renames["NORMAL_MAP"] = "normal_map"; actions.renames["NORMAL_MAP_DEPTH"] = "normal_map_depth"; actions.renames["TEXTURE"] = "color_texture"; - actions.renames["TEXTURE_PIXEL_SIZE"] = "draw_data.color_texture_pixel_size"; + actions.renames["TEXTURE_PIXEL_SIZE"] = "color_texture_pixel_size"; actions.renames["NORMAL_TEXTURE"] = "normal_texture"; actions.renames["SPECULAR_SHININESS_TEXTURE"] = "specular_texture"; actions.renames["SPECULAR_SHININESS"] = "specular_shininess"; actions.renames["SCREEN_UV"] = "screen_uv"; actions.renames["SCREEN_TEXTURE"] = "screen_texture"; - actions.renames["SCREEN_PIXEL_SIZE"] = "canvas_data.screen_pixel_size"; + actions.renames["SCREEN_PIXEL_SIZE"] = "screen_pixel_size"; actions.renames["FRAGCOORD"] = "gl_FragCoord"; actions.renames["POINT_COORD"] = "gl_PointCoord"; actions.renames["INSTANCE_ID"] = "gl_InstanceIndex"; actions.renames["VERTEX_ID"] = "gl_VertexIndex"; actions.renames["LIGHT_POSITION"] = "light_position"; + actions.renames["LIGHT_DIRECTION"] = "light_direction"; + actions.renames["LIGHT_IS_DIRECTIONAL"] = "is_directional"; actions.renames["LIGHT_COLOR"] = "light_color"; actions.renames["LIGHT_ENERGY"] = "light_energy"; actions.renames["LIGHT"] = "light"; @@ -1654,7 +1656,7 @@ ShaderCompiler::DefaultIdentifierActions actions; actions.render_mode_defines["disable_force"] = "#define DISABLE_FORCE\n"; actions.render_mode_defines["disable_velocity"] = "#define DISABLE_VELOCITY\n"; actions.render_mode_defines["keep_data"] = "#define ENABLE_KEEP_DATA\n"; - actions.render_mode_defines["collision_use_scale"] = "#define USE_COLLISON_SCALE\n"; + actions.render_mode_defines["collision_use_scale"] = "#define USE_COLLISION_SCALE\n"; actions.sampler_array_name = "material_samplers"; actions.base_texture_binding_index = 1; @@ -1715,6 +1717,7 @@ ShaderCompiler::DefaultIdentifierActions actions; actions.usage_defines["HALF_RES_COLOR"] = "\n#define USES_HALF_RES_COLOR\n"; actions.usage_defines["QUARTER_RES_COLOR"] = "\n#define USES_QUARTER_RES_COLOR\n"; actions.render_mode_defines["disable_fog"] = "#define DISABLE_FOG\n"; + actions.render_mode_defines["use_debanding"] = "#define USE_DEBANDING\n"; actions.default_filter = ShaderLanguage::FILTER_LINEAR_MIPMAP; actions.default_repeat = ShaderLanguage::REPEAT_ENABLE; diff --git a/drivers/gles3/storage/mesh_storage.cpp b/drivers/gles3/storage/mesh_storage.cpp index e54ecd51c4..22d84eba93 100644 --- a/drivers/gles3/storage/mesh_storage.cpp +++ b/drivers/gles3/storage/mesh_storage.cpp @@ -554,6 +554,21 @@ void MeshStorage::mesh_clear(RID p_mesh) { glDeleteBuffers(1, &s.index_buffer); s.index_buffer = 0; } + + if (s.versions) { + memfree(s.versions); //reallocs, so free with memfree. + } + + if (s.lod_count) { + for (uint32_t j = 0; j < s.lod_count; j++) { + if (s.lods[j].index_buffer != 0) { + glDeleteBuffers(1, &s.lods[j].index_buffer); + s.lods[j].index_buffer = 0; + } + } + memdelete_arr(s.lods); + } + memdelete(mesh->surfaces[i]); } if (mesh->surfaces) { diff --git a/drivers/gles3/storage/texture_storage.cpp b/drivers/gles3/storage/texture_storage.cpp index b8ab4d6839..8ea10539ec 100644 --- a/drivers/gles3/storage/texture_storage.cpp +++ b/drivers/gles3/storage/texture_storage.cpp @@ -666,6 +666,8 @@ void TextureStorage::texture_free(RID p_texture) { } void TextureStorage::texture_2d_initialize(RID p_texture, const Ref<Image> &p_image) { + ERR_FAIL_COND(p_image.is_null()); + Texture texture; texture.width = p_image->get_width(); texture.height = p_image->get_height(); @@ -1181,6 +1183,18 @@ AABB TextureStorage::decal_get_aabb(RID p_decal) const { return AABB(); } +/* DECAL INSTANCE API */ + +RID TextureStorage::decal_instance_create(RID p_decal) { + return RID(); +} + +void TextureStorage::decal_instance_free(RID p_decal_instance) { +} + +void TextureStorage::decal_instance_set_transform(RID p_decal, const Transform3D &p_transform) { +} + /* RENDER TARGET API */ GLuint TextureStorage::system_fbo = 0; @@ -1199,7 +1213,7 @@ void TextureStorage::_update_render_target(RenderTarget *rt) { rt->color_internal_format = rt->is_transparent ? GL_RGBA8 : GL_RGB10_A2; rt->color_format = GL_RGBA; - rt->color_type = rt->is_transparent ? GL_BYTE : GL_UNSIGNED_INT_2_10_10_10_REV; + rt->color_type = rt->is_transparent ? GL_UNSIGNED_BYTE : GL_UNSIGNED_INT_2_10_10_10_REV; rt->image_format = Image::FORMAT_RGBA8; glDisable(GL_SCISSOR_TEST); diff --git a/drivers/gles3/storage/texture_storage.h b/drivers/gles3/storage/texture_storage.h index 4f4032723b..16bf406845 100644 --- a/drivers/gles3/storage/texture_storage.h +++ b/drivers/gles3/storage/texture_storage.h @@ -509,6 +509,12 @@ public: virtual void texture_add_to_decal_atlas(RID p_texture, bool p_panorama_to_dp = false) override {} virtual void texture_remove_from_decal_atlas(RID p_texture, bool p_panorama_to_dp = false) override {} + /* DECAL INSTANCE */ + + virtual RID decal_instance_create(RID p_decal) override; + virtual void decal_instance_free(RID p_decal_instance) override; + virtual void decal_instance_set_transform(RID p_decal, const Transform3D &p_transform) override; + /* RENDER TARGET API */ static GLuint system_fbo; diff --git a/drivers/png/image_loader_png.cpp b/drivers/png/image_loader_png.cpp index 8d2f8a7ed6..165de34c71 100644 --- a/drivers/png/image_loader_png.cpp +++ b/drivers/png/image_loader_png.cpp @@ -36,7 +36,7 @@ #include <string.h> -Error ImageLoaderPNG::load_image(Ref<Image> p_image, Ref<FileAccess> f, uint32_t p_flags, float p_scale) { +Error ImageLoaderPNG::load_image(Ref<Image> p_image, Ref<FileAccess> f, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale) { const uint64_t buffer_size = f->get_length(); Vector<uint8_t> file_buffer; Error err = file_buffer.resize(buffer_size); diff --git a/drivers/png/image_loader_png.h b/drivers/png/image_loader_png.h index 91c3c8925f..a247d77310 100644 --- a/drivers/png/image_loader_png.h +++ b/drivers/png/image_loader_png.h @@ -40,7 +40,7 @@ private: static Ref<Image> load_mem_png(const uint8_t *p_png, int p_size); public: - virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> f, uint32_t p_flags, float p_scale); + virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> f, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale); virtual void get_recognized_extensions(List<String> *p_extensions) const; ImageLoaderPNG(); }; diff --git a/drivers/register_driver_types.cpp b/drivers/register_driver_types.cpp index 504ef9843a..53a7f7aa4f 100644 --- a/drivers/register_driver_types.cpp +++ b/drivers/register_driver_types.cpp @@ -34,11 +34,11 @@ #include "drivers/png/image_loader_png.h" #include "drivers/png/resource_saver_png.h" -static ImageLoaderPNG *image_loader_png; +static Ref<ImageLoaderPNG> image_loader_png; static Ref<ResourceSaverPNG> resource_saver_png; void register_core_driver_types() { - image_loader_png = memnew(ImageLoaderPNG); + image_loader_png.instantiate(); ImageLoader::add_image_format_loader(image_loader_png); resource_saver_png.instantiate(); @@ -46,9 +46,8 @@ void register_core_driver_types() { } void unregister_core_driver_types() { - if (image_loader_png) { - memdelete(image_loader_png); - } + ImageLoader::remove_image_format_loader(image_loader_png); + image_loader_png.unref(); ResourceSaver::remove_resource_format_saver(resource_saver_png); resource_saver_png.unref(); diff --git a/drivers/unix/dir_access_unix.cpp b/drivers/unix/dir_access_unix.cpp index 55ea952696..c25ceba44d 100644 --- a/drivers/unix/dir_access_unix.cpp +++ b/drivers/unix/dir_access_unix.cpp @@ -30,7 +30,7 @@ #include "dir_access_unix.h" -#if defined(UNIX_ENABLED) || defined(LIBC_FILEIO_ENABLED) +#if defined(UNIX_ENABLED) #include "core/os/memory.h" #include "core/os/os.h" @@ -41,10 +41,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> - -#ifndef ANDROID_ENABLED #include <sys/statvfs.h> -#endif #ifdef HAVE_MNTENT #include <mntent.h> @@ -475,17 +472,12 @@ Error DirAccessUnix::create_link(String p_source, String p_target) { } uint64_t DirAccessUnix::get_space_left() { -#ifndef NO_STATVFS struct statvfs vfs; if (statvfs(current_dir.utf8().get_data(), &vfs) != 0) { return 0; } return (uint64_t)vfs.f_bavail * (uint64_t)vfs.f_frsize; -#else - // FIXME: Implement this. - return 0; -#endif } String DirAccessUnix::get_filesystem_type() const { @@ -516,4 +508,4 @@ DirAccessUnix::~DirAccessUnix() { list_dir_end(); } -#endif // UNIX_ENABLED || LIBC_FILEIO_ENABLED +#endif // UNIX_ENABLED diff --git a/drivers/unix/dir_access_unix.h b/drivers/unix/dir_access_unix.h index f5dca7c282..4db24a27b9 100644 --- a/drivers/unix/dir_access_unix.h +++ b/drivers/unix/dir_access_unix.h @@ -31,7 +31,7 @@ #ifndef DIR_ACCESS_UNIX_H #define DIR_ACCESS_UNIX_H -#if defined(UNIX_ENABLED) || defined(LIBC_FILEIO_ENABLED) +#if defined(UNIX_ENABLED) #include "core/io/dir_access.h" @@ -90,6 +90,6 @@ public: ~DirAccessUnix(); }; -#endif // UNIX_ENABLED || LIBC_FILEIO_ENABLED +#endif // UNIX_ENABLED #endif // DIR_ACCESS_UNIX_H diff --git a/drivers/unix/file_access_unix.cpp b/drivers/unix/file_access_unix.cpp index 388ad479b9..0df645c4e5 100644 --- a/drivers/unix/file_access_unix.cpp +++ b/drivers/unix/file_access_unix.cpp @@ -30,24 +30,20 @@ #include "file_access_unix.h" -#if defined(UNIX_ENABLED) || defined(LIBC_FILEIO_ENABLED) +#if defined(UNIX_ENABLED) #include "core/os/os.h" #include "core/string/print_string.h" +#include <errno.h> +#include <fcntl.h> #include <sys/stat.h> #include <sys/types.h> -#include <errno.h> - #if defined(UNIX_ENABLED) #include <unistd.h> #endif -#ifndef ANDROID_ENABLED -#include <sys/statvfs.h> -#endif - #ifdef MSVC #define S_ISREG(m) ((m)&_S_IFREG) #include <io.h> @@ -56,12 +52,6 @@ #define S_ISREG(m) ((m)&S_IFREG) #endif -#ifndef NO_FCNTL -#include <fcntl.h> -#else -#include <sys/ioctl.h> -#endif - void FileAccessUnix::check_errors() const { ERR_FAIL_COND_MSG(!f, "File must be opened before use."); @@ -70,7 +60,7 @@ void FileAccessUnix::check_errors() const { } } -Error FileAccessUnix::_open(const String &p_path, int p_mode_flags) { +Error FileAccessUnix::open_internal(const String &p_path, int p_mode_flags) { _close(); path_src = p_path; @@ -131,13 +121,8 @@ Error FileAccessUnix::_open(const String &p_path, int p_mode_flags) { int fd = fileno(f); if (fd != -1) { -#if defined(NO_FCNTL) - unsigned long par = 0; - ioctl(fd, FIOCLEX, &par); -#else int opts = fcntl(fd, F_GETFD); fcntl(fd, F_SETFD, opts | FD_CLOEXEC); -#endif } last_error = OK; @@ -339,4 +324,4 @@ FileAccessUnix::~FileAccessUnix() { _close(); } -#endif // UNIX_ENABLED || LIBC_FILEIO_ENABLED +#endif // UNIX_ENABLED diff --git a/drivers/unix/file_access_unix.h b/drivers/unix/file_access_unix.h index 297c34e454..8c9afe75e7 100644 --- a/drivers/unix/file_access_unix.h +++ b/drivers/unix/file_access_unix.h @@ -36,7 +36,7 @@ #include <stdio.h> -#if defined(UNIX_ENABLED) || defined(LIBC_FILEIO_ENABLED) +#if defined(UNIX_ENABLED) typedef void (*CloseNotificationFunc)(const String &p_file, int p_flags); @@ -54,7 +54,7 @@ class FileAccessUnix : public FileAccess { public: static CloseNotificationFunc close_notification_func; - virtual Error _open(const String &p_path, int p_mode_flags) override; ///< open a file + virtual Error open_internal(const String &p_path, int p_mode_flags) override; ///< open a file virtual bool is_open() const override; ///< true when file is open virtual String get_path() const override; /// returns the path for the current open file @@ -86,6 +86,6 @@ public: virtual ~FileAccessUnix(); }; -#endif // UNIX_ENABLED || LIBC_FILEIO_ENABLED +#endif // UNIX_ENABLED #endif // FILE_ACCESS_UNIX_H diff --git a/drivers/unix/net_socket_posix.cpp b/drivers/unix/net_socket_posix.cpp index 86adf33d62..72ae609fb4 100644 --- a/drivers/unix/net_socket_posix.cpp +++ b/drivers/unix/net_socket_posix.cpp @@ -30,32 +30,30 @@ #include "net_socket_posix.h" +// Some proprietary Unix-derived platforms don't expose Unix sockets +// so this allows skipping this file to reimplement this API differently. #ifndef UNIX_SOCKET_UNAVAILABLE + #if defined(UNIX_ENABLED) #include <errno.h> +#include <fcntl.h> #include <netdb.h> +#include <netinet/in.h> +#include <netinet/tcp.h> #include <poll.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/ioctl.h> +#include <sys/socket.h> #include <sys/types.h> #include <unistd.h> -#ifndef NO_FCNTL -#include <fcntl.h> -#else -#include <sys/ioctl.h> -#endif -#include <netinet/in.h> -#include <sys/socket.h> #ifdef WEB_ENABLED #include <arpa/inet.h> #endif -#include <netinet/tcp.h> - // BSD calls this flag IPV6_JOIN_GROUP #if !defined(IPV6_ADD_MEMBERSHIP) && defined(IPV6_JOIN_GROUP) #define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP @@ -93,7 +91,7 @@ #define SIO_UDP_NETRESET _WSAIOW(IOC_VENDOR, 15) #endif -#endif +#endif // UNIX_ENABLED size_t NetSocketPosix::_set_addr_storage(struct sockaddr_storage *p_addr, const IPAddress &p_ip, uint16_t p_port, IP::Type p_ip_type) { memset(p_addr, 0, sizeof(struct sockaddr_storage)); @@ -309,14 +307,9 @@ void NetSocketPosix::_set_socket(SOCKET_TYPE p_sock, IP::Type p_ip_type, bool p_ void NetSocketPosix::_set_close_exec_enabled(bool p_enabled) { #ifndef WINDOWS_ENABLED // Enable close on exec to avoid sharing with subprocesses. Off by default on Windows. -#if defined(NO_FCNTL) - unsigned long par = p_enabled ? 1 : 0; - SOCK_IOCTL(_sock, FIOCLEX, &par); -#else int opts = fcntl(_sock, F_GETFD); fcntl(_sock, F_SETFD, opts | FD_CLOEXEC); #endif -#endif } Error NetSocketPosix::open(Type p_sock_type, IP::Type &ip_type) { @@ -658,7 +651,7 @@ void NetSocketPosix::set_blocking_enabled(bool p_enabled) { ERR_FAIL_COND(!is_open()); int ret = 0; -#if defined(WINDOWS_ENABLED) || defined(NO_FCNTL) +#if defined(WINDOWS_ENABLED) unsigned long par = p_enabled ? 0 : 1; ret = SOCK_IOCTL(_sock, FIONBIO, &par); #else @@ -781,4 +774,5 @@ Error NetSocketPosix::join_multicast_group(const IPAddress &p_multi_address, Str Error NetSocketPosix::leave_multicast_group(const IPAddress &p_multi_address, String p_if_name) { return _change_multicast_group(p_multi_address, p_if_name, false); } -#endif + +#endif // UNIX_SOCKET_UNAVAILABLE diff --git a/drivers/unix/os_unix.cpp b/drivers/unix/os_unix.cpp index 384f46c8df..748b48d316 100644 --- a/drivers/unix/os_unix.cpp +++ b/drivers/unix/os_unix.cpp @@ -51,7 +51,6 @@ #include <sys/sysctl.h> #endif -#include <assert.h> #include <dlfcn.h> #include <errno.h> #include <poll.h> @@ -104,10 +103,6 @@ static void _setup_clock() { } #endif -void OS_Unix::debug_break() { - assert(false); -} - static void handle_interrupt(int sig) { if (!EngineDebugger::is_active()) { return; @@ -131,9 +126,7 @@ int OS_Unix::unix_initialize_audio(int p_audio_driver) { } void OS_Unix::initialize_core() { -#if !defined(NO_THREADS) init_thread_posix(); -#endif FileAccess::make_default<FileAccessUnix>(FileAccess::ACCESS_RESOURCES); FileAccess::make_default<FileAccessUnix>(FileAccess::ACCESS_USERDATA); @@ -142,10 +135,8 @@ void OS_Unix::initialize_core() { DirAccess::make_default<DirAccessUnix>(DirAccess::ACCESS_USERDATA); DirAccess::make_default<DirAccessUnix>(DirAccess::ACCESS_FILESYSTEM); -#ifndef NO_NETWORK NetSocketPosix::make_default(); IPUnix::make_default(); -#endif _setup_clock(); } @@ -175,6 +166,7 @@ Error OS_Unix::get_entropy(uint8_t *r_buffer, int p_bytes) { left -= chunk; ofs += chunk; } while (left > 0); +// Define this yourself if you don't want to fall back to /dev/urandom. #elif !defined(NO_URANDOM) int r = open("/dev/urandom", O_RDONLY); ERR_FAIL_COND_V(r < 0, FAILED); @@ -194,13 +186,21 @@ String OS_Unix::get_name() const { return "Unix"; } +String OS_Unix::get_distribution_name() const { + return ""; +} + +String OS_Unix::get_version() const { + return ""; +} + double OS_Unix::get_unix_time() const { struct timeval tv_now; gettimeofday(&tv_now, nullptr); return (double)tv_now.tv_sec + double(tv_now.tv_usec) / 1000000; } -OS::Date OS_Unix::get_date(bool p_utc) const { +OS::DateTime OS_Unix::get_datetime(bool p_utc) const { time_t t = time(nullptr); struct tm lt; if (p_utc) { @@ -208,7 +208,7 @@ OS::Date OS_Unix::get_date(bool p_utc) const { } else { localtime_r(&t, <); } - Date ret; + DateTime ret; ret.year = 1900 + lt.tm_year; // Index starting at 1 to match OS_Unix::get_date // and Windows SYSTEMTIME and tm_mon follows the typical structure @@ -216,24 +216,11 @@ OS::Date OS_Unix::get_date(bool p_utc) const { ret.month = (Month)(lt.tm_mon + 1); ret.day = lt.tm_mday; ret.weekday = (Weekday)lt.tm_wday; - ret.dst = lt.tm_isdst; - - return ret; -} - -OS::Time OS_Unix::get_time(bool p_utc) const { - time_t t = time(nullptr); - struct tm lt; - if (p_utc) { - gmtime_r(&t, <); - } else { - localtime_r(&t, <); - } - Time ret; ret.hour = lt.tm_hour; ret.minute = lt.tm_min; ret.second = lt.tm_sec; - get_time_zone_info(); + ret.dst = lt.tm_isdst; + return ret; } diff --git a/drivers/unix/os_unix.h b/drivers/unix/os_unix.h index f4609a565b..ce81ca0aca 100644 --- a/drivers/unix/os_unix.h +++ b/drivers/unix/os_unix.h @@ -53,7 +53,7 @@ public: virtual String get_stdin_string(bool p_block) override; - virtual Error get_entropy(uint8_t *r_buffer, int p_bytes) override; // Should return cryptographycally-safe random bytes. + virtual Error get_entropy(uint8_t *r_buffer, int p_bytes) override; virtual Error open_dynamic_library(const String p_path, void *&p_library_handle, bool p_also_set_library_path = false, String *r_resolved_path = nullptr) override; virtual Error close_dynamic_library(void *p_library_handle) override; @@ -62,9 +62,10 @@ public: virtual Error set_cwd(const String &p_cwd) override; virtual String get_name() const override; + virtual String get_distribution_name() const override; + virtual String get_version() const override; - virtual Date get_date(bool p_utc) const override; - virtual Time get_time(bool p_utc) const override; + virtual DateTime get_datetime(bool p_utc) const override; virtual TimeZoneInfo get_time_zone_info() const override; virtual double get_unix_time() const override; @@ -85,7 +86,6 @@ public: virtual int get_processor_count() const override; - virtual void debug_break() override; virtual void initialize_debugging() override; virtual String get_executable_path() const override; diff --git a/drivers/unix/thread_posix.cpp b/drivers/unix/thread_posix.cpp index cb5f261e6e..6292d8b3bc 100644 --- a/drivers/unix/thread_posix.cpp +++ b/drivers/unix/thread_posix.cpp @@ -28,7 +28,7 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#if (defined(UNIX_ENABLED) || defined(PTHREAD_ENABLED)) && !defined(NO_THREADS) +#if defined(UNIX_ENABLED) || defined(PTHREAD_ENABLED) #include "thread_posix.h" @@ -73,4 +73,4 @@ void init_thread_posix() { Thread::_set_platform_funcs(&set_name, nullptr); } -#endif +#endif // UNIX_ENABLED || PTHREAD_ENABLED diff --git a/drivers/unix/thread_posix.h b/drivers/unix/thread_posix.h index 672adcba72..87e42b3870 100644 --- a/drivers/unix/thread_posix.h +++ b/drivers/unix/thread_posix.h @@ -31,8 +31,6 @@ #ifndef THREAD_POSIX_H #define THREAD_POSIX_H -#if !defined(NO_THREADS) void init_thread_posix(); -#endif #endif // THREAD_POSIX_H diff --git a/drivers/vulkan/rendering_device_vulkan.cpp b/drivers/vulkan/rendering_device_vulkan.cpp index 73ae108961..f0f70b62e0 100644 --- a/drivers/vulkan/rendering_device_vulkan.cpp +++ b/drivers/vulkan/rendering_device_vulkan.cpp @@ -4152,8 +4152,8 @@ RID RenderingDeviceVulkan::framebuffer_create_multipass(const Vector<RID> &p_tex size.height = texture->height; size_set = true; } else if (texture->usage_flags & TEXTURE_USAGE_VRS_ATTACHMENT_BIT) { - // If this is not the first attachement we assume this is used as the VRS attachment. - // In this case this texture will be 1/16th the size of the color attachement. + // If this is not the first attachment we assume this is used as the VRS attachment. + // In this case this texture will be 1/16th the size of the color attachment. // So we skip the size check. } else { ERR_FAIL_COND_V_MSG((uint32_t)size.width != texture->width || (uint32_t)size.height != texture->height, RID(), @@ -4828,7 +4828,7 @@ Vector<uint8_t> RenderingDeviceVulkan::shader_compile_binary_from_spirv(const Ve for (uint32_t j = 0; j < binding_count; j++) { const SpvReflectDescriptorBinding &binding = *bindings[j]; - RenderingDeviceVulkanShaderBinaryDataBinding info; + RenderingDeviceVulkanShaderBinaryDataBinding info{}; bool need_array_dimensions = false; bool need_block_size = false; @@ -4979,7 +4979,7 @@ Vector<uint8_t> RenderingDeviceVulkan::shader_compile_binary_from_spirv(const Ve for (uint32_t j = 0; j < sc_count; j++) { int32_t existing = -1; - RenderingDeviceVulkanShaderBinarySpecializationConstant sconst; + RenderingDeviceVulkanShaderBinarySpecializationConstant sconst{}; SpvReflectSpecializationConstant *spc = spec_constants[j]; sconst.constant_id = spc->constant_id; @@ -9367,10 +9367,10 @@ void RenderingDeviceVulkan::initialize(VulkanContext *p_context, bool p_local_de // NOTE: If adding new project settings here, also duplicate their definition in // rendering_server.cpp for headless doctool. - staging_buffer_block_size = GLOBAL_DEF("rendering/vulkan/staging_buffer/block_size_kb", 256); + staging_buffer_block_size = GLOBAL_DEF("rendering/rendering_device/staging_buffer/block_size_kb", 256); staging_buffer_block_size = MAX(4u, staging_buffer_block_size); staging_buffer_block_size *= 1024; // Kb -> bytes. - staging_buffer_max_size = GLOBAL_DEF("rendering/vulkan/staging_buffer/max_size_mb", 128); + staging_buffer_max_size = GLOBAL_DEF("rendering/rendering_device/staging_buffer/max_size_mb", 128); staging_buffer_max_size = MAX(1u, staging_buffer_max_size); staging_buffer_max_size *= 1024 * 1024; @@ -9378,7 +9378,7 @@ void RenderingDeviceVulkan::initialize(VulkanContext *p_context, bool p_local_de // Validate enough blocks. staging_buffer_max_size = staging_buffer_block_size * 4; } - texture_upload_region_size_px = GLOBAL_DEF("rendering/vulkan/staging_buffer/texture_upload_region_size_px", 64); + texture_upload_region_size_px = GLOBAL_DEF("rendering/rendering_device/staging_buffer/texture_upload_region_size_px", 64); texture_upload_region_size_px = nearest_power_of_2_templated(texture_upload_region_size_px); frames_drawn = frame_count; // Start from frame count, so everything else is immediately old. @@ -9393,7 +9393,7 @@ void RenderingDeviceVulkan::initialize(VulkanContext *p_context, bool p_local_de ERR_CONTINUE(err != OK); } - max_descriptors_per_pool = GLOBAL_DEF("rendering/vulkan/descriptor_pools/max_descriptors_per_pool", 64); + max_descriptors_per_pool = GLOBAL_DEF("rendering/rendering_device/descriptor_pools/max_descriptors_per_pool", 64); // Check to make sure DescriptorPoolKey is good. static_assert(sizeof(uint64_t) * 3 >= UNIFORM_TYPE_MAX * sizeof(uint16_t)); diff --git a/drivers/vulkan/vulkan_context.cpp b/drivers/vulkan/vulkan_context.cpp index 99ef57abae..98adc0f16e 100644 --- a/drivers/vulkan/vulkan_context.cpp +++ b/drivers/vulkan/vulkan_context.cpp @@ -608,10 +608,10 @@ Error VulkanContext::_check_capabilities() { device_properties_func = (PFN_vkGetPhysicalDeviceProperties2)vkGetInstanceProcAddr(inst, "vkGetPhysicalDeviceProperties2KHR"); } if (device_properties_func != nullptr) { - VkPhysicalDeviceFragmentShadingRatePropertiesKHR vrsProperties; - VkPhysicalDeviceMultiviewProperties multiviewProperties; - VkPhysicalDeviceSubgroupProperties subgroupProperties; - VkPhysicalDeviceProperties2 physicalDeviceProperties; + VkPhysicalDeviceFragmentShadingRatePropertiesKHR vrsProperties{}; + VkPhysicalDeviceMultiviewProperties multiviewProperties{}; + VkPhysicalDeviceSubgroupProperties subgroupProperties{}; + VkPhysicalDeviceProperties2 physicalDeviceProperties{}; void *nextptr = nullptr; subgroupProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES; diff --git a/drivers/windows/dir_access_windows.cpp b/drivers/windows/dir_access_windows.cpp index 11fd29c8f5..3660e956e3 100644 --- a/drivers/windows/dir_access_windows.cpp +++ b/drivers/windows/dir_access_windows.cpp @@ -160,7 +160,7 @@ Error DirAccessWindows::make_dir(String p_dir) { p_dir = current_dir.path_join(p_dir); } - p_dir = p_dir.replace("/", "\\"); + p_dir = p_dir.simplify_path().replace("/", "\\"); bool success; int err; @@ -309,39 +309,13 @@ Error DirAccessWindows::remove(String p_path) { } } -/* - -FileType DirAccessWindows::get_file_type(const String& p_file) const { - WCHAR real_current_dir_name[2048]; - GetCurrentDirectoryW(2048, real_current_dir_name); - String prev_dir = Strong::utf16((const char16_t *)real_current_dir_name); - - bool worked = SetCurrentDirectoryW((LPCWSTR)(current_dir.utf16().get_data())); - - DWORD attr; - if (worked) { - WIN32_FILE_ATTRIBUTE_DATA fileInfo; - attr = GetFileAttributesExW((LPCWSTR)(p_file.utf16().get_data()), GetFileExInfoStandard, &fileInfo); - } - - SetCurrentDirectoryW((LPCWSTR)(prev_dir.utf16().get_data())); - - if (!worked) { - return FILE_TYPE_NONE; - } - - return (attr & FILE_ATTRIBUTE_DIRECTORY) ? FILE_TYPE_ -} - -*/ - uint64_t DirAccessWindows::get_space_left() { uint64_t bytes = 0; if (!GetDiskFreeSpaceEx(nullptr, (PULARGE_INTEGER)&bytes, nullptr, nullptr)) { return 0; } - //this is either 0 or a value in bytes. + // This is either 0 or a value in bytes. return bytes; } diff --git a/drivers/windows/file_access_windows.cpp b/drivers/windows/file_access_windows.cpp index 1a66d19373..095d936c78 100644 --- a/drivers/windows/file_access_windows.cpp +++ b/drivers/windows/file_access_windows.cpp @@ -58,7 +58,7 @@ void FileAccessWindows::check_errors() const { } } -Error FileAccessWindows::_open(const String &p_path, int p_mode_flags) { +Error FileAccessWindows::open_internal(const String &p_path, int p_mode_flags) { _close(); path_src = p_path; diff --git a/drivers/windows/file_access_windows.h b/drivers/windows/file_access_windows.h index 8629bb936b..d84c400775 100644 --- a/drivers/windows/file_access_windows.h +++ b/drivers/windows/file_access_windows.h @@ -51,7 +51,7 @@ class FileAccessWindows : public FileAccess { void _close(); public: - virtual Error _open(const String &p_path, int p_mode_flags) override; ///< open a file + virtual Error open_internal(const String &p_path, int p_mode_flags) override; ///< open a file virtual bool is_open() const override; ///< true when file is open virtual String get_path() const override; /// returns the path for the current open file diff --git a/editor/SCsub b/editor/SCsub index c217f162b4..32ad88add5 100644 --- a/editor/SCsub +++ b/editor/SCsub @@ -24,7 +24,7 @@ def _make_doc_data_class_path(to_path): g.close() -if env["tools"]: +if env.editor_build: # Register exporters reg_exporters_inc = '#include "register_exporters.h"\n' reg_exporters = "void register_exporters() {\n" diff --git a/editor/animation_bezier_editor.cpp b/editor/animation_bezier_editor.cpp index 219f3fdbe1..3b87b3e65e 100644 --- a/editor/animation_bezier_editor.cpp +++ b/editor/animation_bezier_editor.cpp @@ -667,8 +667,8 @@ void AnimationBezierTrackEdit::set_timeline(AnimationTimelineEdit *p_timeline) { void AnimationBezierTrackEdit::set_editor(AnimationTrackEditor *p_editor) { editor = p_editor; - connect("clear_selection", Callable(editor, "_clear_selection").bind(false)); - connect("select_key", Callable(editor, "_key_selected"), CONNECT_DEFERRED); + connect("clear_selection", callable_mp(editor, &AnimationTrackEditor::_clear_selection).bind(false)); + connect("select_key", callable_mp(editor, &AnimationTrackEditor::_key_selected), CONNECT_DEFERRED); } void AnimationBezierTrackEdit::_play_position_draw() { diff --git a/editor/animation_track_editor.cpp b/editor/animation_track_editor.cpp index 70b5501692..9529460ab1 100644 --- a/editor/animation_track_editor.cpp +++ b/editor/animation_track_editor.cpp @@ -1445,7 +1445,9 @@ void AnimationTimelineEdit::_anim_loop_pressed() { default: break; } + undo_redo->add_do_method(this, "update_values"); undo_redo->add_undo_method(animation.ptr(), "set_loop_mode", animation->get_loop_mode()); + undo_redo->add_undo_method(this, "update_values"); undo_redo->commit_action(); } else { String base_path = animation->get_path(); @@ -1913,6 +1915,8 @@ void AnimationTimelineEdit::_bind_methods() { ADD_SIGNAL(MethodInfo("timeline_changed", PropertyInfo(Variant::FLOAT, "position"), PropertyInfo(Variant::BOOL, "drag"), PropertyInfo(Variant::BOOL, "timeline_only"))); ADD_SIGNAL(MethodInfo("track_added", PropertyInfo(Variant::INT, "track"))); ADD_SIGNAL(MethodInfo("length_changed", PropertyInfo(Variant::FLOAT, "size"))); + + ClassDB::bind_method(D_METHOD("update_values"), &AnimationTimelineEdit::update_values); } AnimationTimelineEdit::AnimationTimelineEdit() { @@ -3420,9 +3424,6 @@ void AnimationTrackEditGroup::_zoom_changed() { queue_redraw(); } -void AnimationTrackEditGroup::_bind_methods() { -} - AnimationTrackEditGroup::AnimationTrackEditGroup() { set_mouse_filter(MOUSE_FILTER_PASS); } @@ -6050,10 +6051,9 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) { real_t to_diff = fmod(b - a, Math_TAU); to_v = a + fmod(2.0 * to_diff, Math_TAU) - to_diff; } - Variant delta_v; - Variant::sub(to_v, from_v, delta_v); + Variant delta_v = Animation::subtract_variant(to_v, from_v); double duration = to_t - from_t; - double fixed_duration = duration - 0.01; // Prevent to overwrap keys... + double fixed_duration = duration - UNIT_EPSILON; // Prevent to overwrap keys... for (double delta_t = dur_step; delta_t < fixed_duration; delta_t += dur_step) { Pair<real_t, Variant> keydata; keydata.first = from_t + delta_t; @@ -6458,16 +6458,11 @@ void AnimationTrackEditor::_select_all_tracks_for_copy() { } void AnimationTrackEditor::_bind_methods() { - ClassDB::bind_method(D_METHOD("_animation_update"), &AnimationTrackEditor::_animation_update); - ClassDB::bind_method(D_METHOD("_track_grab_focus"), &AnimationTrackEditor::_track_grab_focus); - ClassDB::bind_method(D_METHOD("_update_tracks"), &AnimationTrackEditor::_update_tracks); - ClassDB::bind_method(D_METHOD("_redraw_tracks"), &AnimationTrackEditor::_redraw_tracks); - ClassDB::bind_method(D_METHOD("_clear_selection_for_anim"), &AnimationTrackEditor::_clear_selection_for_anim); - ClassDB::bind_method(D_METHOD("_select_at_anim"), &AnimationTrackEditor::_select_at_anim); - - ClassDB::bind_method(D_METHOD("_key_selected"), &AnimationTrackEditor::_key_selected); // Still used by some connect_compat. - ClassDB::bind_method(D_METHOD("_key_deselected"), &AnimationTrackEditor::_key_deselected); // Still used by some connect_compat. - ClassDB::bind_method(D_METHOD("_clear_selection"), &AnimationTrackEditor::_clear_selection); // Still used by some connect_compat. + ClassDB::bind_method("_animation_update", &AnimationTrackEditor::_animation_update); + ClassDB::bind_method("_track_grab_focus", &AnimationTrackEditor::_track_grab_focus); + ClassDB::bind_method("_clear_selection_for_anim", &AnimationTrackEditor::_clear_selection_for_anim); + ClassDB::bind_method("_select_at_anim", &AnimationTrackEditor::_select_at_anim); + ClassDB::bind_method("_clear_selection", &AnimationTrackEditor::_clear_selection); ClassDB::bind_method(D_METHOD("_bezier_track_set_key_handle_mode", "animation", "track_idx", "key_idx", "key_handle_mode", "key_handle_set_mode"), &AnimationTrackEditor::_bezier_track_set_key_handle_mode, DEFVAL(Animation::HANDLE_SET_MODE_NONE)); diff --git a/editor/animation_track_editor.h b/editor/animation_track_editor.h index ac69b88e99..5c51921d93 100644 --- a/editor/animation_track_editor.h +++ b/editor/animation_track_editor.h @@ -280,7 +280,6 @@ class AnimationTrackEditGroup : public Control { void _zoom_changed(); protected: - static void _bind_methods(); void _notification(int p_what); public: @@ -407,7 +406,6 @@ class AnimationTrackEditor : public VBoxContainer { void _insert_key_from_track(float p_ofs, int p_track); void _add_method_key(const String &p_method); - void _clear_selection(bool p_update = false); void _clear_selection_for_anim(const Ref<Animation> &p_anim); void _select_at_anim(const Ref<Animation> &p_anim, int p_track, float p_pos); @@ -425,9 +423,6 @@ class AnimationTrackEditor : public VBoxContainer { RBMap<SelectedKey, KeyInfo> selection; - void _key_selected(int p_key, bool p_single, int p_track); - void _key_deselected(int p_key, int p_track); - bool moving_selection = false; float moving_selection_offset = 0.0f; void _move_selection_begin(); @@ -531,6 +526,11 @@ protected: void _notification(int p_what); public: + // Public for use with callable_mp. + void _clear_selection(bool p_update = false); + void _key_selected(int p_key, bool p_single, int p_track); + void _key_deselected(int p_key, int p_track); + enum { EDIT_COPY_TRACKS, EDIT_COPY_TRACKS_CONFIRM, diff --git a/editor/connections_dialog.cpp b/editor/connections_dialog.cpp index 861d05f17a..ddeb8643b8 100644 --- a/editor/connections_dialog.cpp +++ b/editor/connections_dialog.cpp @@ -238,6 +238,12 @@ void ConnectDialog::_notification(int p_what) { String type_name = Variant::get_type_name((Variant::Type)type_list->get_item_id(i)); type_list->set_item_icon(i, get_theme_icon(type_name, SNAME("EditorIcons"))); } + + Ref<StyleBox> style = get_theme_stylebox("normal", "LineEdit")->duplicate(); + if (style.is_valid()) { + style->set_default_margin(SIDE_TOP, style->get_default_margin(SIDE_TOP) + 1.0); + from_signal->add_theme_style_override("normal", style); + } } break; } } @@ -361,6 +367,10 @@ void ConnectDialog::popup_dialog(const String &p_for_signal) { error_label->set_visible(!_find_first_script(get_tree()->get_edited_scene_root(), get_tree()->get_edited_scene_root())); } + if (first_popup) { + first_popup = false; + _advanced_pressed(); + } popup_centered(); } @@ -383,6 +393,7 @@ void ConnectDialog::_advanced_pressed() { } _update_ok_enabled(); + EditorSettings::get_singleton()->set_project_metadata("editor_metadata", "use_advanced_connections", advanced->is_pressed()); popup_centered(); } @@ -465,30 +476,32 @@ ConnectDialog::ConnectDialog() { vbc_right->add_margin_child(TTR("Unbind Signal Arguments:"), unbind_count); - HBoxContainer *dstm_hb = memnew(HBoxContainer); - vbc_left->add_margin_child(TTR("Receiver Method:"), dstm_hb); - dst_method = memnew(LineEdit); dst_method->set_h_size_flags(Control::SIZE_EXPAND_FILL); dst_method->connect("text_submitted", callable_mp(this, &ConnectDialog::_text_submitted)); - dstm_hb->add_child(dst_method); + vbc_left->add_margin_child(TTR("Receiver Method:"), dst_method); advanced = memnew(CheckButton); - dstm_hb->add_child(advanced); + vbc_left->add_child(advanced); advanced->set_text(TTR("Advanced")); + advanced->set_h_size_flags(Control::SIZE_SHRINK_BEGIN | Control::SIZE_EXPAND); + advanced->set_pressed(EditorSettings::get_singleton()->get_project_metadata("editor_metadata", "use_advanced_connections", false)); advanced->connect("pressed", callable_mp(this, &ConnectDialog::_advanced_pressed)); + HBoxContainer *hbox = memnew(HBoxContainer); + vbc_right->add_child(hbox); + deferred = memnew(CheckBox); deferred->set_h_size_flags(0); deferred->set_text(TTR("Deferred")); deferred->set_tooltip_text(TTR("Defers the signal, storing it in a queue and only firing it at idle time.")); - vbc_right->add_child(deferred); + hbox->add_child(deferred); one_shot = memnew(CheckBox); one_shot->set_h_size_flags(0); - one_shot->set_text(TTR("Oneshot")); + one_shot->set_text(TTR("One Shot")); one_shot->set_tooltip_text(TTR("Disconnects the signal after its first emission.")); - vbc_right->add_child(one_shot); + hbox->add_child(one_shot); cdbinds = memnew(ConnectDialogBinds); @@ -810,7 +823,7 @@ void ConnectionsDock::_go_to_script(TreeItem &p_item) { } if (script.is_valid() && ScriptEditor::get_singleton()->script_goto_method(script, cd.method)) { - EditorNode::get_singleton()->call("_editor_select", EditorNode::EDITOR_SCRIPT); + EditorNode::get_singleton()->editor_select(EditorNode::EDITOR_SCRIPT); } } diff --git a/editor/connections_dialog.h b/editor/connections_dialog.h index e37246e7a0..db2f855617 100644 --- a/editor/connections_dialog.h +++ b/editor/connections_dialog.h @@ -112,6 +112,7 @@ private: LineEdit *dst_method = nullptr; ConnectDialogBinds *cdbinds = nullptr; bool edit_mode = false; + bool first_popup = true; NodePath dst_path; VBoxContainer *vbc_right = nullptr; diff --git a/editor/create_dialog.cpp b/editor/create_dialog.cpp index 4ac32d7317..a54d191a5b 100644 --- a/editor/create_dialog.cpp +++ b/editor/create_dialog.cpp @@ -126,10 +126,6 @@ bool CreateDialog::_should_hide_type(const String &p_type) const { return true; // Do not show editor nodes. } - if (p_type == base_type && !EditorNode::get_editor_data().get_custom_types().has(p_type)) { - return true; // Root is already added. - } - if (ClassDB::class_exists(p_type)) { if (!ClassDB::can_instantiate(p_type) || ClassDB::is_virtual(p_type)) { return true; // Can't create abstract or virtual class. @@ -296,6 +292,15 @@ void CreateDialog::_configure_search_option_item(TreeItem *r_item, const String r_item->set_icon(0, EditorNode::get_singleton()->get_class_icon(p_type, icon_fallback)); } + bool is_deprecated = EditorHelp::get_doc_data()->class_list[p_type].is_deprecated; + bool is_experimental = EditorHelp::get_doc_data()->class_list[p_type].is_experimental; + + if (is_deprecated) { + r_item->add_button(0, get_theme_icon("StatusError", SNAME("EditorIcons")), 0, false, TTR("This class is marked as deprecated.")); + } else if (is_experimental) { + r_item->add_button(0, get_theme_icon("NodeWarning", SNAME("EditorIcons")), 0, false, TTR("This class is marked as experimental.")); + } + if (!search_box->get_text().is_empty()) { r_item->set_collapsed(false); } else { @@ -334,6 +339,11 @@ String CreateDialog::_top_result(const Vector<String> p_candidates, const String } float CreateDialog::_score_type(const String &p_type, const String &p_search) const { + if (p_type == p_search) { + // Always favor an exact match (case-sensitive), since clicking a favorite will set the search text to the type. + return 1.0f; + } + float inverse_length = 1.f / float(p_type.length()); // Favor types where search term is a substring close to the start of the type. @@ -342,13 +352,13 @@ float CreateDialog::_score_type(const String &p_type, const String &p_search) co float score = (pos > -1) ? 1.0f - w * MIN(1, 3 * pos * inverse_length) : MAX(0.f, .9f - w); // Favor shorter items: they resemble the search term more. - w = 0.1f; - score *= (1 - w) + w * (p_search.length() * inverse_length); + w = 0.9f; + score *= (1 - w) + w * MIN(1.0f, p_search.length() * inverse_length); - score *= _is_type_preferred(p_type) ? 1.0f : 0.8f; + score *= _is_type_preferred(p_type) ? 1.0f : 0.9f; // Add score for being a favorite type. - score *= (favorite_list.find(p_type) > -1) ? 1.0f : 0.7f; + score *= (favorite_list.find(p_type) > -1) ? 1.0f : 0.8f; // Look through at most 5 recent items bool in_recent = false; @@ -358,7 +368,7 @@ float CreateDialog::_score_type(const String &p_type, const String &p_search) co break; } } - score *= in_recent ? 1.0f : 0.8f; + score *= in_recent ? 1.0f : 0.9f; return score; } diff --git a/editor/debugger/editor_debugger_inspector.cpp b/editor/debugger/editor_debugger_inspector.cpp index 6c0ba55ec8..7ea6cedd2b 100644 --- a/editor/debugger/editor_debugger_inspector.cpp +++ b/editor/debugger/editor_debugger_inspector.cpp @@ -36,7 +36,7 @@ #include "scene/debugger/scene_debugger.h" bool EditorDebuggerRemoteObject::_set(const StringName &p_name, const Variant &p_value) { - if (!editable || !prop_values.has(p_name) || String(p_name).begins_with("Constants/")) { + if (!prop_values.has(p_name) || String(p_name).begins_with("Constants/")) { return false; } @@ -85,14 +85,12 @@ void EditorDebuggerRemoteObject::_bind_methods() { ClassDB::bind_method(D_METHOD("get_variant"), &EditorDebuggerRemoteObject::get_variant); ClassDB::bind_method(D_METHOD("clear"), &EditorDebuggerRemoteObject::clear); ClassDB::bind_method(D_METHOD("get_remote_object_id"), &EditorDebuggerRemoteObject::get_remote_object_id); - ClassDB::bind_method(D_METHOD("_is_read_only"), &EditorDebuggerRemoteObject::_is_read_only); ADD_SIGNAL(MethodInfo("value_edited", PropertyInfo(Variant::INT, "object_id"), PropertyInfo(Variant::STRING, "property"), PropertyInfo("value"))); } EditorDebuggerInspector::EditorDebuggerInspector() { variables = memnew(EditorDebuggerRemoteObject); - variables->editable = false; } EditorDebuggerInspector::~EditorDebuggerInspector() { diff --git a/editor/debugger/editor_debugger_inspector.h b/editor/debugger/editor_debugger_inspector.h index c595e0acaa..d835f5fa42 100644 --- a/editor/debugger/editor_debugger_inspector.h +++ b/editor/debugger/editor_debugger_inspector.h @@ -43,14 +43,12 @@ protected: static void _bind_methods(); public: - bool editable = false; ObjectID remote_object_id; String type_name; List<PropertyInfo> prop_list; HashMap<StringName, Variant> prop_values; ObjectID get_remote_object_id() { return remote_object_id; }; - bool _is_read_only() { return true; }; String get_title(); Variant get_variant(const StringName &p_name); diff --git a/editor/debugger/editor_debugger_tree.h b/editor/debugger/editor_debugger_tree.h index 5b2df8abd5..5af3a0d84a 100644 --- a/editor/debugger/editor_debugger_tree.h +++ b/editor/debugger/editor_debugger_tree.h @@ -28,11 +28,11 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "scene/gui/tree.h" - #ifndef EDITOR_DEBUGGER_TREE_H #define EDITOR_DEBUGGER_TREE_H +#include "scene/gui/tree.h" + class SceneDebuggerTree; class EditorFileDialog; diff --git a/editor/debugger/editor_profiler.cpp b/editor/debugger/editor_profiler.cpp index cf48366bd3..a882275375 100644 --- a/editor/debugger/editor_profiler.cpp +++ b/editor/debugger/editor_profiler.cpp @@ -104,6 +104,10 @@ void EditorProfiler::clear() { updating_frame = false; hover_metric = -1; seeking = false; + + // Ensure button text (start, stop) is correct + _set_button_text(); + emit_signal(SNAME("enable_profiling"), activate->is_pressed()); } static String _get_percent_txt(float p_value, float p_total) { @@ -374,15 +378,23 @@ void EditorProfiler::_update_frame() { updating_frame = false; } -void EditorProfiler::_activate_pressed() { +void EditorProfiler::_set_button_text() { if (activate->is_pressed()) { activate->set_icon(get_theme_icon(SNAME("Stop"), SNAME("EditorIcons"))); activate->set_text(TTR("Stop")); - _clear_pressed(); } else { activate->set_icon(get_theme_icon(SNAME("Play"), SNAME("EditorIcons"))); activate->set_text(TTR("Start")); } +} + +void EditorProfiler::_activate_pressed() { + _set_button_text(); + + if (activate->is_pressed()) { + _clear_pressed(); + } + emit_signal(SNAME("enable_profiling"), activate->is_pressed()); } @@ -499,8 +511,12 @@ void EditorProfiler::_bind_methods() { ADD_SIGNAL(MethodInfo("break_request")); } -void EditorProfiler::set_enabled(bool p_enable) { +void EditorProfiler::set_enabled(bool p_enable, bool p_clear) { + activate->set_pressed(false); activate->set_disabled(!p_enable); + if (p_clear) { + clear(); + } } bool EditorProfiler::is_profiling() { diff --git a/editor/debugger/editor_profiler.h b/editor/debugger/editor_profiler.h index df92125258..e9ecc285ed 100644 --- a/editor/debugger/editor_profiler.h +++ b/editor/debugger/editor_profiler.h @@ -122,6 +122,7 @@ private: Timer *frame_delay = nullptr; Timer *plot_delay = nullptr; + void _set_button_text(); void _update_frame(); void _activate_pressed(); @@ -153,7 +154,7 @@ protected: public: void add_frame_metric(const Metric &p_metric, bool p_final = false); - void set_enabled(bool p_enable); + void set_enabled(bool p_enable, bool p_clear = true); bool is_profiling(); bool is_seeking() { return seeking; } void disable_seeking(); diff --git a/editor/debugger/script_editor_debugger.cpp b/editor/debugger/script_editor_debugger.cpp index 5baa9970af..6bc1536cb9 100644 --- a/editor/debugger/script_editor_debugger.cpp +++ b/editor/debugger/script_editor_debugger.cpp @@ -52,7 +52,6 @@ #include "editor/plugins/node_3d_editor_plugin.h" #include "main/performance.h" #include "scene/3d/camera_3d.h" -#include "scene/debugger/scene_debugger.h" #include "scene/gui/dialogs.h" #include "scene/gui/label.h" #include "scene/gui/line_edit.h" @@ -317,7 +316,7 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da if (!error.is_empty()) { tabs->set_current_tab(0); } - profiler->set_enabled(false); + profiler->set_enabled(false, false); inspector->clear_cache(); // Take a chance to force remote objects update. } else if (p_msg == "debug_exit") { @@ -327,7 +326,7 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da _update_buttons_state(); _set_reason_text(TTR("Execution resumed."), MESSAGE_SUCCESS); emit_signal(SNAME("breaked"), false, false, "", false); - profiler->set_enabled(true); + profiler->set_enabled(true, false); profiler->disable_seeking(); } else if (p_msg == "set_pid") { ERR_FAIL_COND(p_data.size() < 1); @@ -916,6 +915,8 @@ void ScriptEditorDebugger::start(Ref<RemoteDebuggerPeer> p_peer) { _clear_errors_list(); stop(); + profiler->set_enabled(true, true); + peer = p_peer; ERR_FAIL_COND(p_peer.is_null()); @@ -971,6 +972,8 @@ void ScriptEditorDebugger::stop() { res_path_cache.clear(); profiler_signature.clear(); + profiler->set_enabled(true, false); + inspector->edit(nullptr); _update_buttons_state(); } diff --git a/editor/dependency_editor.cpp b/editor/dependency_editor.cpp index 43961a7ceb..b0ea289bbe 100644 --- a/editor/dependency_editor.cpp +++ b/editor/dependency_editor.cpp @@ -286,7 +286,11 @@ void DependencyEditorOwners::_list_rmb_clicked(int p_item, const Vector2 &p_pos, file_options->clear(); file_options->reset_size(); if (p_item >= 0) { - file_options->add_item(TTR("Open"), FILE_OPEN); + if (owners->get_selected_items().size() == 1) { + file_options->add_icon_item(get_theme_icon(SNAME("Load"), SNAME("EditorIcons")), TTR("Open Scene"), FILE_OPEN); + } else { + file_options->add_icon_item(get_theme_icon(SNAME("Load"), SNAME("EditorIcons")), TTR("Open Scenes"), FILE_OPEN); + } } file_options->set_position(owners->get_screen_position() + p_pos); @@ -307,11 +311,14 @@ void DependencyEditorOwners::_select_file(int p_idx) { void DependencyEditorOwners::_file_option(int p_option) { switch (p_option) { case FILE_OPEN: { - int idx = owners->get_current(); - if (idx < 0 || idx >= owners->get_item_count()) { - break; + PackedInt32Array selected_items = owners->get_selected_items(); + for (int i = 0; i < selected_items.size(); i++) { + int item_idx = selected_items[i]; + if (item_idx < 0 || item_idx >= owners->get_item_count()) { + break; + } + _select_file(item_idx); } - _select_file(idx); } break; } } @@ -362,7 +369,7 @@ DependencyEditorOwners::DependencyEditorOwners() { file_options->connect("id_pressed", callable_mp(this, &DependencyEditorOwners::_file_option)); owners = memnew(ItemList); - owners->set_select_mode(ItemList::SELECT_SINGLE); + owners->set_select_mode(ItemList::SELECT_MULTI); owners->connect("item_clicked", callable_mp(this, &DependencyEditorOwners::_list_rmb_clicked)); owners->connect("item_activated", callable_mp(this, &DependencyEditorOwners::_select_file)); owners->set_allow_rmb_select(true); diff --git a/editor/doc_tools.cpp b/editor/doc_tools.cpp index ec9a744e57..7d6eb186dc 100644 --- a/editor/doc_tools.cpp +++ b/editor/doc_tools.cpp @@ -85,6 +85,9 @@ void DocTools::merge_from(const DocTools &p_data) { const DocData::ClassDoc &cf = p_data.class_list[c.name]; + c.is_deprecated = cf.is_deprecated; + c.is_experimental = cf.is_experimental; + c.description = cf.description; c.brief_description = cf.brief_description; c.tutorials = cf.tutorials; @@ -133,6 +136,8 @@ void DocTools::merge_from(const DocTools &p_data) { const DocData::MethodDoc &mf = cf.constructors[j]; m.description = mf.description; + m.is_deprecated = mf.is_deprecated; + m.is_experimental = mf.is_experimental; break; } } @@ -148,6 +153,8 @@ void DocTools::merge_from(const DocTools &p_data) { const DocData::MethodDoc &mf = cf.methods[j]; m.description = mf.description; + m.is_deprecated = mf.is_deprecated; + m.is_experimental = mf.is_experimental; break; } } @@ -162,6 +169,8 @@ void DocTools::merge_from(const DocTools &p_data) { const DocData::MethodDoc &mf = cf.signals[j]; m.description = mf.description; + m.is_deprecated = mf.is_deprecated; + m.is_experimental = mf.is_experimental; break; } } @@ -176,6 +185,8 @@ void DocTools::merge_from(const DocTools &p_data) { const DocData::ConstantDoc &mf = cf.constants[j]; m.description = mf.description; + m.is_deprecated = mf.is_deprecated; + m.is_experimental = mf.is_experimental; break; } } @@ -190,6 +201,8 @@ void DocTools::merge_from(const DocTools &p_data) { const DocData::MethodDoc &mf = cf.annotations[j]; m.description = mf.description; + m.is_deprecated = mf.is_deprecated; + m.is_experimental = mf.is_experimental; break; } } @@ -204,6 +217,8 @@ void DocTools::merge_from(const DocTools &p_data) { const DocData::PropertyDoc &pf = cf.properties[j]; p.description = pf.description; + p.is_deprecated = pf.is_deprecated; + p.is_experimental = pf.is_experimental; break; } } @@ -266,6 +281,8 @@ void DocTools::merge_from(const DocTools &p_data) { const DocData::MethodDoc &mf = cf.operators[j]; m.description = mf.description; + m.is_deprecated = mf.is_deprecated; + m.is_experimental = mf.is_experimental; break; } } @@ -1007,6 +1024,12 @@ static Error _parse_methods(Ref<XMLParser> &parser, Vector<DocData::MethodDoc> & if (parser->has_attribute("qualifiers")) { method.qualifiers = parser->get_attribute_value("qualifiers"); } + if (parser->has_attribute("is_deprecated")) { + method.is_deprecated = parser->get_attribute_value("is_deprecated").to_lower() == "true"; + } + if (parser->has_attribute("is_experimental")) { + method.is_experimental = parser->get_attribute_value("is_experimental").to_lower() == "true"; + } while (parser->read() == OK) { if (parser->get_node_type() == XMLParser::NODE_ELEMENT) { @@ -1138,6 +1161,14 @@ Error DocTools::_load(Ref<XMLParser> parser) { c.inherits = parser->get_attribute_value("inherits"); } + if (parser->has_attribute("is_deprecated")) { + c.is_deprecated = parser->get_attribute_value("is_deprecated").to_lower() == "true"; + } + + if (parser->has_attribute("is_experimental")) { + c.is_experimental = parser->get_attribute_value("is_experimental").to_lower() == "true"; + } + while (parser->read() == OK) { if (parser->get_node_type() == XMLParser::NODE_ELEMENT) { String name2 = parser->get_node_name(); @@ -1211,6 +1242,12 @@ Error DocTools::_load(Ref<XMLParser> parser) { if (parser->has_attribute("enum")) { prop2.enumeration = parser->get_attribute_value("enum"); } + if (parser->has_attribute("is_deprecated")) { + prop2.is_deprecated = parser->get_attribute_value("is_deprecated").to_lower() == "true"; + } + if (parser->has_attribute("is_experimental")) { + prop2.is_experimental = parser->get_attribute_value("is_experimental").to_lower() == "true"; + } if (!parser->is_empty()) { parser->read(); if (parser->get_node_type() == XMLParser::NODE_TEXT) { @@ -1275,6 +1312,12 @@ Error DocTools::_load(Ref<XMLParser> parser) { if (parser->has_attribute("is_bitfield")) { constant2.is_bitfield = parser->get_attribute_value("is_bitfield").to_lower() == "true"; } + if (parser->has_attribute("is_deprecated")) { + constant2.is_deprecated = parser->get_attribute_value("is_deprecated").to_lower() == "true"; + } + if (parser->has_attribute("is_experimental")) { + constant2.is_experimental = parser->get_attribute_value("is_experimental").to_lower() == "true"; + } if (!parser->is_empty()) { parser->read(); if (parser->get_node_type() == XMLParser::NODE_TEXT) { @@ -1327,7 +1370,15 @@ static void _write_method_doc(Ref<FileAccess> f, const String &p_name, Vector<Do qualifiers += " qualifiers=\"" + m.qualifiers.xml_escape() + "\""; } - _write_string(f, 2, "<" + p_name + " name=\"" + m.name.xml_escape() + "\"" + qualifiers + ">"); + String additional_attributes; + if (m.is_deprecated) { + additional_attributes += " is_deprecated=\"true\""; + } + if (m.is_experimental) { + additional_attributes += " is_experimental=\"true\""; + } + + _write_string(f, 2, "<" + p_name + " name=\"" + m.name.xml_escape() + "\"" + qualifiers + additional_attributes + ">"); if (!m.return_type.is_empty()) { String enum_text; @@ -1390,6 +1441,12 @@ Error DocTools::save_classes(const String &p_default_path, const HashMap<String, String header = "<class name=\"" + c.name + "\""; if (!c.inherits.is_empty()) { header += " inherits=\"" + c.inherits + "\""; + if (c.is_deprecated) { + header += " is_deprecated=\"true\""; + } + if (c.is_experimental) { + header += " is_experimental=\"true\""; + } } header += String(" version=\"") + VERSION_BRANCH + "\""; // Reference the XML schema so editors can provide error checking. @@ -1433,6 +1490,12 @@ Error DocTools::save_classes(const String &p_default_path, const HashMap<String, if (!c.properties[i].default_value.is_empty()) { additional_attributes += " default=\"" + c.properties[i].default_value.xml_escape(true) + "\""; } + if (c.properties[i].is_deprecated) { + additional_attributes += " is_deprecated=\"true\""; + } + if (c.properties[i].is_experimental) { + additional_attributes += " is_experimental=\"true\""; + } const DocData::PropertyDoc &p = c.properties[i]; @@ -1453,21 +1516,30 @@ Error DocTools::save_classes(const String &p_default_path, const HashMap<String, _write_string(f, 1, "<constants>"); for (int i = 0; i < c.constants.size(); i++) { const DocData::ConstantDoc &k = c.constants[i]; + + String additional_attributes; + if (c.constants[i].is_deprecated) { + additional_attributes += " is_deprecated=\"true\""; + } + if (c.constants[i].is_experimental) { + additional_attributes += " is_experimental=\"true\""; + } + if (k.is_value_valid) { if (!k.enumeration.is_empty()) { if (k.is_bitfield) { - _write_string(f, 2, "<constant name=\"" + k.name + "\" value=\"" + k.value + "\" enum=\"" + k.enumeration + "\" is_bitfield=\"true\">"); + _write_string(f, 2, "<constant name=\"" + k.name + "\" value=\"" + k.value + "\" enum=\"" + k.enumeration + "\" is_bitfield=\"true\"" + additional_attributes + ">"); } else { - _write_string(f, 2, "<constant name=\"" + k.name + "\" value=\"" + k.value + "\" enum=\"" + k.enumeration + "\">"); + _write_string(f, 2, "<constant name=\"" + k.name + "\" value=\"" + k.value + "\" enum=\"" + k.enumeration + "\"" + additional_attributes + ">"); } } else { - _write_string(f, 2, "<constant name=\"" + k.name + "\" value=\"" + k.value + "\">"); + _write_string(f, 2, "<constant name=\"" + k.name + "\" value=\"" + k.value + "\"" + additional_attributes + ">"); } } else { if (!k.enumeration.is_empty()) { - _write_string(f, 2, "<constant name=\"" + k.name + "\" value=\"platform-dependent\" enum=\"" + k.enumeration + "\">"); + _write_string(f, 2, "<constant name=\"" + k.name + "\" value=\"platform-dependent\" enum=\"" + k.enumeration + "\"" + additional_attributes + ">"); } else { - _write_string(f, 2, "<constant name=\"" + k.name + "\" value=\"platform-dependent\">"); + _write_string(f, 2, "<constant name=\"" + k.name + "\" value=\"platform-dependent\"" + additional_attributes + ">"); } } _write_string(f, 3, _translate_doc_string(k.description).strip_edges().xml_escape()); diff --git a/editor/editor_builders.py b/editor/editor_builders.py index e73fbc6107..696e3b64ec 100644 --- a/editor/editor_builders.py +++ b/editor/editor_builders.py @@ -9,6 +9,7 @@ import shutil import subprocess import tempfile import uuid +import zlib from platform_methods import subprocess_main @@ -28,7 +29,6 @@ def make_doc_header(target, source, env): buf = (docbegin + buf + docend).encode("utf-8") decomp_size = len(buf) - import zlib # Use maximum zlib compression level to further reduce file size # (at the cost of initial build times). @@ -88,9 +88,6 @@ def make_translations_header(target, source, env, category): g.write("#ifndef _{}_TRANSLATIONS_H\n".format(category.upper())) g.write("#define _{}_TRANSLATIONS_H\n".format(category.upper())) - import zlib - import os.path - sorted_paths = sorted(source, key=lambda path: os.path.splitext(os.path.basename(path))[0]) msgfmt_available = shutil.which("msgfmt") is not None diff --git a/editor/editor_command_palette.cpp b/editor/editor_command_palette.cpp index ba1f2fd6af..a0913265eb 100644 --- a/editor/editor_command_palette.cpp +++ b/editor/editor_command_palette.cpp @@ -130,7 +130,7 @@ void EditorCommandPalette::_update_command_search(const String &search_text) { ti->set_metadata(0, entries[i].key_name); ti->set_text_alignment(1, HORIZONTAL_ALIGNMENT_RIGHT); ti->set_text(1, shortcut_text); - Color c = Color(1, 1, 1, 0.5); + Color c = get_theme_color(SNAME("font_color"), SNAME("Editor")) * Color(1, 1, 1, 0.5); ti->set_custom_color(1, c); } diff --git a/editor/editor_feature_profile.cpp b/editor/editor_feature_profile.cpp index 708173ea26..9549ffb09b 100644 --- a/editor/editor_feature_profile.cpp +++ b/editor/editor_feature_profile.cpp @@ -763,7 +763,7 @@ void EditorFeatureProfileManager::_update_selected_profile() { TreeItem *root = class_list->create_item(); TreeItem *features = class_list->create_item(root); - TreeItem *last_feature; + TreeItem *last_feature = nullptr; features->set_text(0, TTR("Main Features:")); for (int i = 0; i < EditorFeatureProfile::FEATURE_MAX; i++) { TreeItem *feature; diff --git a/editor/editor_file_dialog.h b/editor/editor_file_dialog.h index 6d11cb10ed..2e7302aaf9 100644 --- a/editor/editor_file_dialog.h +++ b/editor/editor_file_dialog.h @@ -202,7 +202,6 @@ private: void _select_drive(int p_idx); void _dir_submitted(String p_dir); - void _file_submitted(const String &p_file); void _action_pressed(); void _save_confirm_pressed(); void _cancel_pressed(); @@ -240,6 +239,9 @@ protected: static void _bind_methods(); public: + // Public for use with callable_mp. + void _file_submitted(const String &p_file); + void popup_file_dialog(); void clear_filters(); void add_filter(const String &p_filter, const String &p_description = ""); diff --git a/editor/editor_file_system.cpp b/editor/editor_file_system.cpp index 177bc6d2b2..9153640115 100644 --- a/editor/editor_file_system.cpp +++ b/editor/editor_file_system.cpp @@ -690,7 +690,6 @@ void EditorFileSystem::scan() { _update_extensions(); - abort_scan = false; if (!use_threads) { scanning = true; scan_total = 0; @@ -1162,8 +1161,6 @@ void EditorFileSystem::scan_changes() { scanning_changes = true; scanning_changes_done = false; - abort_scan = false; - if (!use_threads) { if (filesystem) { EditorProgressBG pr("sources", TTR("ScanSources"), 1000); @@ -1195,8 +1192,6 @@ void EditorFileSystem::_notification(int p_what) { case NOTIFICATION_EXIT_TREE: { Thread &active_thread = thread.is_started() ? thread : thread_sources; if (use_threads && active_thread.is_started()) { - //abort thread if in progress - abort_scan = true; while (scanning) { OS::get_singleton()->delay_usec(1000); } @@ -2090,7 +2085,7 @@ void EditorFileSystem::reimport_files(const Vector<String> &p_files) { if (group_file_cache.has(file)) { //maybe the file itself is a group! groups_to_reimport.insert(file); - //groups do not belong to grups + //groups do not belong to groups group_file = String(); } else if (!group_file.is_empty()) { //it's a group file, add group to import and skip this file diff --git a/editor/editor_file_system.h b/editor/editor_file_system.h index f4e69b95e7..e06c6e4593 100644 --- a/editor/editor_file_system.h +++ b/editor/editor_file_system.h @@ -168,7 +168,6 @@ class EditorFileSystem : public Node { EditorFileSystemDirectory *new_filesystem = nullptr; - bool abort_scan = false; bool scanning = false; bool importing = false; bool first_scan = true; diff --git a/editor/editor_fonts.cpp b/editor/editor_fonts.cpp index fffe77f1c4..0262284cdf 100644 --- a/editor/editor_fonts.cpp +++ b/editor/editor_fonts.cpp @@ -96,6 +96,7 @@ void editor_register_fonts(Ref<Theme> p_theme) { TextServer::SubpixelPositioning font_subpixel_positioning = (TextServer::SubpixelPositioning)(int)EditorSettings::get_singleton()->get("interface/editor/font_subpixel_positioning"); TextServer::Hinting font_hinting; + TextServer::Hinting font_mono_hinting; switch (font_hinting_setting) { case 0: // The "Auto" setting uses the setting that best matches the OS' font rendering: @@ -104,18 +105,23 @@ void editor_register_fonts(Ref<Theme> p_theme) { // - Linux has configurable font hinting, but most distributions including Ubuntu default to "Light". #ifdef MACOS_ENABLED font_hinting = TextServer::HINTING_NONE; + font_mono_hinting = TextServer::HINTING_NONE; #else font_hinting = TextServer::HINTING_LIGHT; + font_mono_hinting = TextServer::HINTING_LIGHT; #endif break; case 1: font_hinting = TextServer::HINTING_NONE; + font_mono_hinting = TextServer::HINTING_NONE; break; case 2: font_hinting = TextServer::HINTING_LIGHT; + font_mono_hinting = TextServer::HINTING_LIGHT; break; default: font_hinting = TextServer::HINTING_NORMAL; + font_mono_hinting = TextServer::HINTING_LIGHT; break; } @@ -163,7 +169,7 @@ void editor_register_fonts(Ref<Theme> p_theme) { default_font_bold->set_fallbacks(fallbacks_bold); default_font_bold_msdf->set_fallbacks(fallbacks_bold); - Ref<FontFile> default_font_mono = load_internal_font(_font_JetBrainsMono_Regular, _font_JetBrainsMono_Regular_size, font_hinting, font_antialiasing, true, font_subpixel_positioning); + Ref<FontFile> default_font_mono = load_internal_font(_font_JetBrainsMono_Regular, _font_JetBrainsMono_Regular_size, font_mono_hinting, font_antialiasing, true, font_subpixel_positioning); default_font_mono->set_fallbacks(fallbacks); // Init base font configs and load custom fonts. @@ -260,7 +266,7 @@ void editor_register_fonts(Ref<Theme> p_theme) { Ref<FontVariation> mono_fc; mono_fc.instantiate(); if (custom_font_path_source.length() > 0 && dir->file_exists(custom_font_path_source)) { - Ref<FontFile> custom_font = load_external_font(custom_font_path_source, font_hinting, font_antialiasing, true, font_subpixel_positioning); + Ref<FontFile> custom_font = load_external_font(custom_font_path_source, font_mono_hinting, font_antialiasing, true, font_subpixel_positioning); { TypedArray<Font> fallback_custom; fallback_custom.push_back(default_font_mono); @@ -311,6 +317,24 @@ void editor_register_fonts(Ref<Theme> p_theme) { mono_other_fc->set_opentype_features(ftrs); } + // Use fake bold/italics to style the editor log's `print_rich()` output. + // Use stronger embolden strength to make bold easier to distinguish from regular text. + Ref<FontVariation> mono_other_fc_bold = mono_other_fc->duplicate(); + mono_other_fc_bold->set_variation_embolden(0.8); + + Ref<FontVariation> mono_other_fc_italic = mono_other_fc->duplicate(); + mono_other_fc_italic->set_variation_transform(Transform2D(1.0, 0.2, 0.0, 1.0, 0.0, 0.0)); + + Ref<FontVariation> mono_other_fc_bold_italic = mono_other_fc->duplicate(); + mono_other_fc_bold_italic->set_variation_embolden(0.8); + mono_other_fc_bold_italic->set_variation_transform(Transform2D(1.0, 0.2, 0.0, 1.0, 0.0, 0.0)); + + Ref<FontVariation> mono_other_fc_mono = mono_other_fc->duplicate(); + // Use a different font style to distinguish `[code]` in rich prints. + // This emulates the "faint" styling used in ANSI escape codes by using a slightly thinner font. + mono_other_fc_mono->set_variation_embolden(-0.25); + mono_other_fc_mono->set_variation_transform(Transform2D(1.0, 0.1, 0.0, 1.0, 0.0, 0.0)); + Ref<FontVariation> italic_fc = default_fc->duplicate(); italic_fc->set_variation_transform(Transform2D(1.0, 0.2, 0.0, 1.0, 0.0, 0.0)); @@ -380,6 +404,10 @@ void editor_register_fonts(Ref<Theme> p_theme) { p_theme->set_font_size("output_source_size", "EditorFonts", int(EDITOR_GET("run/output/font_size")) * EDSCALE); p_theme->set_font("output_source", "EditorFonts", mono_other_fc); + p_theme->set_font("output_source_bold", "EditorFonts", mono_other_fc_bold); + p_theme->set_font("output_source_italic", "EditorFonts", mono_other_fc_italic); + p_theme->set_font("output_source_bold_italic", "EditorFonts", mono_other_fc_bold_italic); + p_theme->set_font("output_source_mono", "EditorFonts", mono_other_fc_mono); p_theme->set_font_size("status_source_size", "EditorFonts", default_font_size); p_theme->set_font("status_source", "EditorFonts", mono_other_fc); diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp index b8f115e82e..745dcdd04c 100644 --- a/editor/editor_help.cpp +++ b/editor/editor_help.cpp @@ -276,6 +276,23 @@ String EditorHelp::_fix_constant(const String &p_constant) const { return p_constant; } +// Macros for assigning the deprecation/experimental information to class members +#define DEPRECATED_DOC_TAG \ + class_desc->push_color(get_theme_color(SNAME("error_color"), SNAME("Editor"))); \ + Ref<Texture2D> error_icon = get_theme_icon(SNAME("StatusError"), SNAME("EditorIcons")); \ + class_desc->add_text(" "); \ + class_desc->add_image(error_icon, error_icon->get_width(), error_icon->get_height()); \ + class_desc->add_text(" (" + TTR("Deprecated") + ")"); \ + class_desc->pop(); + +#define EXPERIMENTAL_DOC_TAG \ + class_desc->push_color(get_theme_color(SNAME("warning_color"), SNAME("Editor"))); \ + Ref<Texture2D> warning_icon = get_theme_icon(SNAME("NodeWarning"), SNAME("EditorIcons")); \ + class_desc->add_text(" "); \ + class_desc->add_image(warning_icon, warning_icon->get_width(), warning_icon->get_height()); \ + class_desc->add_text(" (" + TTR("Experimental") + ")"); \ + class_desc->pop(); + void EditorHelp::_add_method(const DocData::MethodDoc &p_method, bool p_overview) { method_line[p_method.name] = class_desc->get_paragraph_count() - 2; //gets overridden if description @@ -356,6 +373,14 @@ void EditorHelp::_add_method(const DocData::MethodDoc &p_method, bool p_overview class_desc->pop(); } + if (p_method.is_deprecated) { + DEPRECATED_DOC_TAG; + } + + if (p_method.is_experimental) { + EXPERIMENTAL_DOC_TAG; + } + if (p_overview) { class_desc->pop(); //cell } @@ -565,6 +590,17 @@ void EditorHelp::_update_doc() { class_desc->pop(); // color class_desc->pop(); // font size class_desc->pop(); // font + + if (cd.is_deprecated) { + class_desc->add_text(" "); + Ref<Texture2D> error_icon = get_theme_icon(SNAME("StatusError"), SNAME("EditorIcons")); + class_desc->add_image(error_icon, error_icon->get_width(), error_icon->get_height()); + } + if (cd.is_experimental) { + class_desc->add_text(" "); + Ref<Texture2D> warning_icon = get_theme_icon(SNAME("NodeWarning"), SNAME("EditorIcons")); + class_desc->add_image(warning_icon, warning_icon->get_width(), warning_icon->get_height()); + } class_desc->add_newline(); const String non_breaking_space = String::chr(160); @@ -627,6 +663,26 @@ void EditorHelp::_update_doc() { } } + // Note if deprecated. + if (cd.is_deprecated) { + Ref<Texture2D> error_icon = get_theme_icon(SNAME("StatusError"), SNAME("EditorIcons")); + class_desc->push_color(get_theme_color(SNAME("error_color"), SNAME("Editor"))); + class_desc->add_image(error_icon, error_icon->get_width(), error_icon->get_height()); + class_desc->add_text(String(" ") + TTR("This class is marked as deprecated. It will be removed in future versions.")); + class_desc->pop(); + class_desc->add_newline(); + } + + // Note if experimental. + if (cd.is_experimental) { + Ref<Texture2D> warning_icon = get_theme_icon(SNAME("NodeWarning"), SNAME("EditorIcons")); + class_desc->push_color(get_theme_color(SNAME("warning_color"), SNAME("Editor"))); + class_desc->add_image(warning_icon, warning_icon->get_width(), warning_icon->get_height()); + class_desc->add_text(String(" ") + TTR("This class is marked as experimental. It is subject to likely change or possible removal in future versions. Use at your own discretion.")); + class_desc->pop(); + class_desc->add_newline(); + } + class_desc->add_newline(); class_desc->add_newline(); @@ -817,6 +873,13 @@ void EditorHelp::_update_doc() { class_desc->pop(); } + if (cd.properties[i].is_deprecated) { + DEPRECATED_DOC_TAG; + } + if (cd.properties[i].is_experimental) { + EXPERIMENTAL_DOC_TAG; + } + class_desc->pop(); class_desc->pop(); // cell @@ -1066,6 +1129,14 @@ void EditorHelp::_update_doc() { class_desc->push_color(symbol_color); class_desc->add_text(")"); + + if (cd.signals[i].is_deprecated) { + DEPRECATED_DOC_TAG; + } + if (cd.signals[i].is_experimental) { + EXPERIMENTAL_DOC_TAG; + } + class_desc->pop(); class_desc->pop(); // end monofont if (!cd.signals[i].description.strip_edges().is_empty()) { @@ -1187,6 +1258,14 @@ void EditorHelp::_update_doc() { class_desc->pop(); class_desc->pop(); + if (enum_list[i].is_deprecated) { + DEPRECATED_DOC_TAG; + } + + if (enum_list[i].is_experimental) { + EXPERIMENTAL_DOC_TAG; + } + class_desc->add_newline(); if (!enum_list[i].description.strip_edges().is_empty()) { @@ -1258,6 +1337,14 @@ void EditorHelp::_update_doc() { class_desc->pop(); + if (constants[i].is_deprecated) { + DEPRECATED_DOC_TAG; + } + + if (constants[i].is_experimental) { + EXPERIMENTAL_DOC_TAG; + } + class_desc->add_newline(); if (!constants[i].description.strip_edges().is_empty()) { @@ -1438,6 +1525,13 @@ void EditorHelp::_update_doc() { class_desc->pop(); // color } + if (cd.properties[i].is_deprecated) { + DEPRECATED_DOC_TAG; + } + if (cd.properties[i].is_experimental) { + EXPERIMENTAL_DOC_TAG; + } + if (cd.is_script_doc && (!cd.properties[i].setter.is_empty() || !cd.properties[i].getter.is_empty())) { class_desc->push_color(symbol_color); class_desc->add_text(" [" + TTR("property:") + " "); diff --git a/editor/editor_help_search.cpp b/editor/editor_help_search.cpp index c82cff9081..73688fc2b7 100644 --- a/editor/editor_help_search.cpp +++ b/editor/editor_help_search.cpp @@ -329,10 +329,16 @@ bool EditorHelpSearch::Runner::_phase_match_classes_init() { } bool EditorHelpSearch::Runner::_phase_match_classes() { + if (!iterator_doc) { + return true; + } + DocData::ClassDoc &class_doc = iterator_doc->value; if (class_doc.name.is_empty()) { + ++iterator_doc; return false; } + if (!_is_class_disabled_by_feature_profile(class_doc.name)) { ClassMatch match; match.doc = &class_doc; @@ -412,7 +418,7 @@ bool EditorHelpSearch::Runner::_phase_class_items_init() { bool EditorHelpSearch::Runner::_phase_class_items() { if (!iterator_match) { - return false; + return true; } ClassMatch &match = iterator_match->value; @@ -439,10 +445,8 @@ bool EditorHelpSearch::Runner::_phase_member_items_init() { bool EditorHelpSearch::Runner::_phase_member_items() { ClassMatch &match = iterator_match->value; - if (!match.doc) { - return false; - } - if (match.doc->name.is_empty()) { + if (!match.doc || match.doc->name.is_empty()) { + ++iterator_match; return false; } @@ -601,6 +605,14 @@ TreeItem *EditorHelpSearch::Runner::_create_class_item(TreeItem *p_parent, const item->set_custom_color(1, disabled_color); } + if (p_doc->is_deprecated) { + Ref<Texture2D> error_icon = ui_service->get_theme_icon("StatusError", SNAME("EditorIcons")); + item->add_button(0, error_icon, 0, false, TTR("This class is marked as deprecated.")); + } else if (p_doc->is_experimental) { + Ref<Texture2D> warning_icon = ui_service->get_theme_icon("NodeWarning", SNAME("EditorIcons")); + item->add_button(0, warning_icon, 0, false, TTR("This class is marked as experimental.")); + } + _match_item(item, p_doc->name); return item; @@ -608,37 +620,37 @@ TreeItem *EditorHelpSearch::Runner::_create_class_item(TreeItem *p_parent, const TreeItem *EditorHelpSearch::Runner::_create_method_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const String &p_text, const DocData::MethodDoc *p_doc) { String tooltip = _build_method_tooltip(p_class_doc, p_doc); - return _create_member_item(p_parent, p_class_doc->name, "MemberMethod", p_doc->name, p_text, TTRC("Method"), "method", tooltip); + return _create_member_item(p_parent, p_class_doc->name, "MemberMethod", p_doc->name, p_text, TTRC("Method"), "method", tooltip, p_doc->is_deprecated, p_doc->is_experimental); } TreeItem *EditorHelpSearch::Runner::_create_signal_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const DocData::MethodDoc *p_doc) { String tooltip = _build_method_tooltip(p_class_doc, p_doc); - return _create_member_item(p_parent, p_class_doc->name, "MemberSignal", p_doc->name, p_doc->name, TTRC("Signal"), "signal", tooltip); + return _create_member_item(p_parent, p_class_doc->name, "MemberSignal", p_doc->name, p_doc->name, TTRC("Signal"), "signal", tooltip, p_doc->is_deprecated, p_doc->is_experimental); } TreeItem *EditorHelpSearch::Runner::_create_annotation_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const String &p_text, const DocData::MethodDoc *p_doc) { String tooltip = _build_method_tooltip(p_class_doc, p_doc); - return _create_member_item(p_parent, p_class_doc->name, "MemberAnnotation", p_doc->name, p_text, TTRC("Annotation"), "annotation", tooltip); + return _create_member_item(p_parent, p_class_doc->name, "MemberAnnotation", p_doc->name, p_text, TTRC("Annotation"), "annotation", tooltip, p_doc->is_deprecated, p_doc->is_experimental); } TreeItem *EditorHelpSearch::Runner::_create_constant_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const DocData::ConstantDoc *p_doc) { String tooltip = p_class_doc->name + "." + p_doc->name; - return _create_member_item(p_parent, p_class_doc->name, "MemberConstant", p_doc->name, p_doc->name, TTRC("Constant"), "constant", tooltip); + return _create_member_item(p_parent, p_class_doc->name, "MemberConstant", p_doc->name, p_doc->name, TTRC("Constant"), "constant", tooltip, p_doc->is_deprecated, p_doc->is_experimental); } TreeItem *EditorHelpSearch::Runner::_create_property_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const DocData::PropertyDoc *p_doc) { String tooltip = p_doc->type + " " + p_class_doc->name + "." + p_doc->name; tooltip += "\n " + p_class_doc->name + "." + p_doc->setter + "(value) setter"; tooltip += "\n " + p_class_doc->name + "." + p_doc->getter + "() getter"; - return _create_member_item(p_parent, p_class_doc->name, "MemberProperty", p_doc->name, p_doc->name, TTRC("Property"), "property", tooltip); + return _create_member_item(p_parent, p_class_doc->name, "MemberProperty", p_doc->name, p_doc->name, TTRC("Property"), "property", tooltip, p_doc->is_deprecated, p_doc->is_experimental); } TreeItem *EditorHelpSearch::Runner::_create_theme_property_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const DocData::ThemeItemDoc *p_doc) { String tooltip = p_doc->type + " " + p_class_doc->name + "." + p_doc->name; - return _create_member_item(p_parent, p_class_doc->name, "MemberTheme", p_doc->name, p_doc->name, TTRC("Theme Property"), "theme_item", tooltip); + return _create_member_item(p_parent, p_class_doc->name, "MemberTheme", p_doc->name, p_doc->name, TTRC("Theme Property"), "theme_item", tooltip, false, false); } -TreeItem *EditorHelpSearch::Runner::_create_member_item(TreeItem *p_parent, const String &p_class_name, const String &p_icon, const String &p_name, const String &p_text, const String &p_type, const String &p_metatype, const String &p_tooltip) { +TreeItem *EditorHelpSearch::Runner::_create_member_item(TreeItem *p_parent, const String &p_class_name, const String &p_icon, const String &p_name, const String &p_text, const String &p_type, const String &p_metatype, const String &p_tooltip, bool is_deprecated, bool is_experimental) { Ref<Texture2D> icon; String text; if (search_flags & SEARCH_SHOW_HIERARCHY) { @@ -657,6 +669,14 @@ TreeItem *EditorHelpSearch::Runner::_create_member_item(TreeItem *p_parent, cons item->set_tooltip_text(1, p_tooltip); item->set_metadata(0, "class_" + p_metatype + ":" + p_class_name + ":" + p_name); + if (is_deprecated) { + Ref<Texture2D> error_icon = ui_service->get_theme_icon("StatusError", SNAME("EditorIcons")); + item->add_button(0, error_icon, 0, false, TTR("This member is marked as deprecated.")); + } else if (is_experimental) { + Ref<Texture2D> warning_icon = ui_service->get_theme_icon("NodeWarning", SNAME("EditorIcons")); + item->add_button(0, warning_icon, 0, false, TTR("This member is marked as experimental.")); + } + _match_item(item, p_name); return item; diff --git a/editor/editor_help_search.h b/editor/editor_help_search.h index 1fd4533c74..a8bd219b89 100644 --- a/editor/editor_help_search.h +++ b/editor/editor_help_search.h @@ -158,7 +158,7 @@ class EditorHelpSearch::Runner : public RefCounted { TreeItem *_create_constant_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const DocData::ConstantDoc *p_doc); TreeItem *_create_property_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const DocData::PropertyDoc *p_doc); TreeItem *_create_theme_property_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const DocData::ThemeItemDoc *p_doc); - TreeItem *_create_member_item(TreeItem *p_parent, const String &p_class_name, const String &p_icon, const String &p_name, const String &p_text, const String &p_type, const String &p_metatype, const String &p_tooltip); + TreeItem *_create_member_item(TreeItem *p_parent, const String &p_class_name, const String &p_icon, const String &p_name, const String &p_text, const String &p_type, const String &p_metatype, const String &p_tooltip, bool is_deprecated, bool is_experimental); public: bool work(uint64_t slot = 100000); diff --git a/editor/editor_inspector.cpp b/editor/editor_inspector.cpp index 7bbdc16c61..65c65a517f 100644 --- a/editor/editor_inspector.cpp +++ b/editor/editor_inspector.cpp @@ -426,6 +426,9 @@ void EditorProperty::_set_read_only(bool p_read_only) { void EditorProperty::set_read_only(bool p_read_only) { read_only = p_read_only; + if (GDVIRTUAL_CALL(_set_read_only, p_read_only)) { + return; + } _set_read_only(p_read_only); } @@ -458,7 +461,7 @@ StringName EditorProperty::_get_revert_property() const { return property; } -void EditorProperty::update_revert_and_pin_status() { +void EditorProperty::update_editor_property_status() { if (property == StringName()) { return; //no property, so nothing to do } @@ -469,15 +472,26 @@ void EditorProperty::update_revert_and_pin_status() { CRASH_COND(!node); new_pinned = node->is_property_pinned(property); } + Variant current = object->get(_get_revert_property()); bool new_can_revert = EditorPropertyRevert::can_property_revert(object, property, ¤t) && !is_read_only(); - if (new_can_revert != can_revert || new_pinned != pinned) { + bool new_checked = checked; + if (checkable) { // for properties like theme overrides. + bool valid = false; + Variant value = object->get(property, &valid); + if (valid) { + new_checked = value.get_type() != Variant::NIL; + } + } + + if (new_can_revert != can_revert || new_pinned != pinned || new_checked != checked) { if (new_can_revert != can_revert) { emit_signal(SNAME("property_can_revert_changed"), property, new_can_revert); } can_revert = new_can_revert; pinned = new_pinned; + checked = new_checked; queue_redraw(); } } @@ -702,11 +716,11 @@ void EditorProperty::shortcut_input(const Ref<InputEvent> &p_event) { const Ref<InputEventKey> k = p_event; if (k.is_valid() && k->is_pressed()) { - if (ED_IS_SHORTCUT("property_editor/copy_property", p_event)) { - menu_option(MENU_COPY_PROPERTY); + if (ED_IS_SHORTCUT("property_editor/copy_value", p_event)) { + menu_option(MENU_COPY_VALUE); accept_event(); - } else if (ED_IS_SHORTCUT("property_editor/paste_property", p_event) && !is_read_only()) { - menu_option(MENU_PASTE_PROPERTY); + } else if (ED_IS_SHORTCUT("property_editor/paste_value", p_event) && !is_read_only()) { + menu_option(MENU_PASTE_VALUE); accept_event(); } else if (ED_IS_SHORTCUT("property_editor/copy_property_path", p_event)) { menu_option(MENU_COPY_PROPERTY_PATH); @@ -901,10 +915,10 @@ Control *EditorProperty::make_custom_tooltip(const String &p_text) const { void EditorProperty::menu_option(int p_option) { switch (p_option) { - case MENU_COPY_PROPERTY: { + case MENU_COPY_VALUE: { InspectorDock::get_inspector_singleton()->set_property_clipboard(object->get(property)); } break; - case MENU_PASTE_PROPERTY: { + case MENU_PASTE_VALUE: { emit_changed(property, InspectorDock::get_inspector_singleton()->get_property_clipboard()); } break; case MENU_COPY_PROPERTY_PATH: { @@ -974,7 +988,9 @@ void EditorProperty::_bind_methods() { ADD_SIGNAL(MethodInfo("selected", PropertyInfo(Variant::STRING, "path"), PropertyInfo(Variant::INT, "focusable_idx"))); GDVIRTUAL_BIND(_update_property) - ClassDB::bind_method(D_METHOD("_update_revert_and_pin_status"), &EditorProperty::update_revert_and_pin_status); + GDVIRTUAL_BIND(_set_read_only, "read_only") + + ClassDB::bind_method(D_METHOD("_update_editor_property_status"), &EditorProperty::update_editor_property_status); } EditorProperty::EditorProperty() { @@ -997,10 +1013,10 @@ void EditorProperty::_update_popup() { add_child(menu); menu->connect("id_pressed", callable_mp(this, &EditorProperty::menu_option)); } - menu->add_icon_shortcut(get_theme_icon(SNAME("ActionCopy"), SNAME("EditorIcons")), ED_GET_SHORTCUT("property_editor/copy_property"), MENU_COPY_PROPERTY); - menu->add_icon_shortcut(get_theme_icon(SNAME("ActionPaste"), SNAME("EditorIcons")), ED_GET_SHORTCUT("property_editor/paste_property"), MENU_PASTE_PROPERTY); + menu->add_icon_shortcut(get_theme_icon(SNAME("ActionCopy"), SNAME("EditorIcons")), ED_GET_SHORTCUT("property_editor/copy_value"), MENU_COPY_VALUE); + menu->add_icon_shortcut(get_theme_icon(SNAME("ActionPaste"), SNAME("EditorIcons")), ED_GET_SHORTCUT("property_editor/paste_value"), MENU_PASTE_VALUE); menu->add_icon_shortcut(get_theme_icon(SNAME("CopyNodePath"), SNAME("EditorIcons")), ED_GET_SHORTCUT("property_editor/copy_property_path"), MENU_COPY_PROPERTY_PATH); - menu->set_item_disabled(MENU_PASTE_PROPERTY, is_read_only()); + menu->set_item_disabled(MENU_PASTE_VALUE, is_read_only()); if (!pin_hidden) { menu->add_separator(); if (can_pin) { @@ -1127,11 +1143,10 @@ Control *EditorInspectorCategory::make_custom_tooltip(const String &p_text) cons } Size2 EditorInspectorCategory::get_minimum_size() const { - Ref<Font> font = get_theme_font(SNAME("font"), SNAME("Tree")); - int font_size = get_theme_font_size(SNAME("font_size"), SNAME("Tree")); + Ref<Font> font = get_theme_font(SNAME("bold"), SNAME("EditorFonts")); + int font_size = get_theme_font_size(SNAME("bold_size"), SNAME("EditorFonts")); Size2 ms; - ms.width = 1; ms.height = font->get_height(font_size); if (icon.is_valid()) { ms.height = MAX(icon->get_height(), ms.height); @@ -1602,7 +1617,7 @@ void EditorInspectorArray::_rmb_popup_id_pressed(int p_id) { case OPTION_RESIZE_ARRAY: new_size_spin_box->set_value(count); resize_dialog->get_ok_button()->set_disabled(true); - resize_dialog->popup_centered(Size2i(250, 0) * EDSCALE); + resize_dialog->popup_centered(Size2(250, 0) * EDSCALE); new_size_spin_box->get_line_edit()->grab_focus(); new_size_spin_box->get_line_edit()->select_all(); break; @@ -1651,6 +1666,10 @@ void EditorInspectorArray::_panel_draw(int p_index) { void EditorInspectorArray::_panel_gui_input(Ref<InputEvent> p_event, int p_index) { ERR_FAIL_INDEX(p_index, (int)array_elements.size()); + if (read_only) { + return; + } + Ref<InputEventKey> key_ref = p_event; if (key_ref.is_valid()) { const InputEventKey &key = **key_ref; @@ -2151,7 +2170,7 @@ void EditorInspectorArray::drop_data_fw(const Point2 &p_point, const Variant &p_ } bool EditorInspectorArray::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const { - if (!movable) { + if (!movable || read_only) { return false; } // First, update drawing. @@ -2271,7 +2290,9 @@ VBoxContainer *EditorInspectorArray::get_vbox(int p_index) { } } -EditorInspectorArray::EditorInspectorArray() { +EditorInspectorArray::EditorInspectorArray(bool p_read_only) { + read_only = p_read_only; + set_mouse_filter(Control::MOUSE_FILTER_STOP); odd_style.instantiate(); @@ -2297,6 +2318,7 @@ EditorInspectorArray::EditorInspectorArray() { add_button = EditorInspector::create_inspector_action_button(TTR("Add Element")); add_button->connect("pressed", callable_mp(this, &EditorInspectorArray::_add_button_pressed)); + add_button->set_disabled(read_only); vbox->add_child(add_button); control_dropping = memnew(Control); @@ -2317,6 +2339,7 @@ EditorInspectorArray::EditorInspectorArray() { new_size_spin_box->set_max(16384); new_size_spin_box->connect("value_changed", callable_mp(this, &EditorInspectorArray::_new_size_spin_box_value_changed)); new_size_spin_box->get_line_edit()->connect("text_submitted", callable_mp(this, &EditorInspectorArray::_new_size_spin_box_text_submitted)); + new_size_spin_box->set_editable(!read_only); resize_dialog_vbox->add_margin_child(TTRC("New Size:"), new_size_spin_box); vbox->connect("visibility_changed", callable_mp(this, &EditorInspectorArray::_vbox_visibility_changed)); @@ -2544,7 +2567,7 @@ void EditorInspector::_parse_added_editors(VBoxContainer *current_vbox, EditorIn ep->set_read_only(read_only); ep->update_property(); ep->_update_pin_flags(); - ep->update_revert_and_pin_status(); + ep->update_editor_property_status(); ep->set_deletable(deletable_properties); ep->update_cache(); } @@ -3030,7 +3053,7 @@ void EditorInspector::update_tree() { bool movable = true; bool numbered = false; bool foldable = use_folding; - String add_button_text; + String add_button_text = TTR("Add Element"); String swap_method; for (int i = (p.type == Variant::NIL ? 1 : 2); i < class_name_components.size(); i++) { if (class_name_components[i].begins_with("page_size") && class_name_components[i].get_slice_count("=") == 2) { @@ -3051,7 +3074,7 @@ void EditorInspector::update_tree() { if (p.type == Variant::NIL) { // Setup the array to use a method to create/move/delete elements. array_element_prefix = class_name_components[0]; - editor_inspector_array = memnew(EditorInspectorArray); + editor_inspector_array = memnew(EditorInspectorArray(all_read_only)); String array_label = path.contains("/") ? path.substr(path.rfind("/") + 1) : path; array_label = EditorPropertyNameProcessor::get_singleton()->process_name(property_label_string, property_name_style); @@ -3063,7 +3086,7 @@ void EditorInspector::update_tree() { // Setup the array to use the count property and built-in functions to create/move/delete elements. if (class_name_components.size() >= 2) { array_element_prefix = class_name_components[1]; - editor_inspector_array = memnew(EditorInspectorArray); + editor_inspector_array = memnew(EditorInspectorArray(all_read_only)); int page = per_array_page.has(array_element_prefix) ? per_array_page[array_element_prefix] : 0; editor_inspector_array->setup_with_count_property(object, class_name_components[0], p.name, array_element_prefix, page, c, foldable, movable, numbered, page_size, add_button_text, swap_method); @@ -3203,6 +3226,7 @@ void EditorInspector::update_tree() { // Use the existing one. ep->set_label(property_label_string); } + for (int j = 0; j < properties.size(); j++) { String prop = properties[j]; @@ -3250,7 +3274,7 @@ void EditorInspector::update_tree() { ep->set_doc_path(doc_info.path); ep->update_property(); ep->_update_pin_flags(); - ep->update_revert_and_pin_status(); + ep->update_editor_property_status(); ep->update_cache(); if (current_selected && ep->property == current_selected) { @@ -3289,7 +3313,7 @@ void EditorInspector::update_property(const String &p_prop) { for (EditorProperty *E : editor_property_map[p_prop]) { E->update_property(); - E->update_revert_and_pin_status(); + E->update_editor_property_status(); E->update_cache(); } } @@ -3439,7 +3463,7 @@ void EditorInspector::expand_revertable() { } } - // Climb up the hierachy doing double buffering with the sets. + // Climb up the hierarchy doing double buffering with the sets. int a = 0; int b = 1; while (sections_to_unfold[a].size()) { @@ -3632,7 +3656,7 @@ void EditorInspector::_edit_set(const String &p_name, const Variant &p_value, bo if (editor_property_map.has(p_name)) { for (EditorProperty *E : editor_property_map[p_name]) { - E->update_revert_and_pin_status(); + E->update_editor_property_status(); } } } @@ -3746,7 +3770,7 @@ void EditorInspector::_property_checked(const String &p_path, bool p_checked) { for (EditorProperty *E : editor_property_map[p_path]) { E->set_checked(p_checked); E->update_property(); - E->update_revert_and_pin_status(); + E->update_editor_property_status(); E->update_cache(); } } @@ -3770,8 +3794,8 @@ void EditorInspector::_property_pinned(const String &p_path, bool p_pinned) { undo_redo->add_undo_method(node, "_set_property_pinned", p_path, !p_pinned); if (editor_property_map.has(p_path)) { for (List<EditorProperty *>::Element *E = editor_property_map[p_path].front(); E; E = E->next()) { - undo_redo->add_do_method(E->get(), "_update_revert_and_pin_status"); - undo_redo->add_undo_method(E->get(), "_update_revert_and_pin_status"); + undo_redo->add_do_method(E->get(), "_update_editor_property_status"); + undo_redo->add_undo_method(E->get(), "_update_editor_property_status"); } } undo_redo->commit_action(); @@ -3779,7 +3803,7 @@ void EditorInspector::_property_pinned(const String &p_path, bool p_pinned) { node->set_property_pinned(p_path, p_pinned); if (editor_property_map.has(p_path)) { for (List<EditorProperty *>::Element *E = editor_property_map[p_path].front(); E; E = E->next()) { - E->get()->update_revert_and_pin_status(); + E->get()->update_editor_property_status(); } } } @@ -3860,7 +3884,7 @@ void EditorInspector::_notification(int p_what) { for (EditorProperty *E : F.value) { if (E && !E->is_cache_valid()) { E->update_property(); - E->update_revert_and_pin_status(); + E->update_editor_property_status(); E->update_cache(); } } @@ -3882,7 +3906,7 @@ void EditorInspector::_notification(int p_what) { if (editor_property_map.has(prop)) { for (EditorProperty *E : editor_property_map[prop]) { E->update_property(); - E->update_revert_and_pin_status(); + E->update_editor_property_status(); E->update_cache(); } } @@ -3975,13 +3999,7 @@ void EditorInspector::_check_meta_name(const String &p_name) { } else if (!p_name.is_valid_identifier()) { error = TTR("Metadata name must be a valid identifier."); } else if (object->has_meta(p_name)) { - Node *node = Object::cast_to<Node>(object); - if (node) { - error = vformat(TTR("Metadata with name \"%s\" already exists on \"%s\"."), p_name, node->get_name()); - } else { - // This should normally never be reached, but the error is set just in case. - error = vformat(TTR("Metadata with name \"%s\" already exists."), p_name, node->get_name()); - } + error = vformat(TTR("Metadata with name \"%s\" already exists."), p_name); } else if (p_name[0] == '_') { error = TTR("Names starting with _ are reserved for editor-only metadata."); } @@ -4001,14 +4019,6 @@ void EditorInspector::_show_add_meta_dialog() { if (!add_meta_dialog) { add_meta_dialog = memnew(ConfirmationDialog); - Node *node = Object::cast_to<Node>(object); - if (node) { - add_meta_dialog->set_title(vformat(TTR("Add Metadata Property for \"%s\""), node->get_name())); - } else { - // This should normally never be reached, but the title is set just in case. - add_meta_dialog->set_title(vformat(TTR("Add Metadata Property"), node->get_name())); - } - VBoxContainer *vbc = memnew(VBoxContainer); add_meta_dialog->add_child(vbc); HBoxContainer *hbc = memnew(HBoxContainer); @@ -4038,6 +4048,14 @@ void EditorInspector::_show_add_meta_dialog() { add_meta_name->connect("text_changed", callable_mp(this, &EditorInspector::_check_meta_name)); } + Node *node = Object::cast_to<Node>(object); + if (node) { + add_meta_dialog->set_title(vformat(TTR("Add Metadata Property for \"%s\""), node->get_name())); + } else { + // This should normally be reached when the object is derived from Resource. + add_meta_dialog->set_title(vformat(TTR("Add Metadata Property for \"%s\""), object->get_class())); + } + add_meta_dialog->popup_centered(); add_meta_name->set_text(""); _check_meta_name(""); @@ -4046,6 +4064,7 @@ void EditorInspector::_show_add_meta_dialog() { void EditorInspector::_bind_methods() { ClassDB::bind_method("_edit_request_change", &EditorInspector::_edit_request_change); + ClassDB::bind_method("get_selected_path", &EditorInspector::get_selected_path); ADD_SIGNAL(MethodInfo("property_selected", PropertyInfo(Variant::STRING, "property"))); ADD_SIGNAL(MethodInfo("property_keyed", PropertyInfo(Variant::STRING, "property"), PropertyInfo(Variant::NIL, "value", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NIL_IS_VARIANT), PropertyInfo(Variant::BOOL, "advance"))); @@ -4082,7 +4101,7 @@ EditorInspector::EditorInspector() { refresh_countdown = 0.33; } - ED_SHORTCUT("property_editor/copy_property", TTR("Copy Property"), KeyModifierMask::CMD_OR_CTRL | Key::C); - ED_SHORTCUT("property_editor/paste_property", TTR("Paste Property"), KeyModifierMask::CMD_OR_CTRL | Key::V); + ED_SHORTCUT("property_editor/copy_value", TTR("Copy Value"), KeyModifierMask::CMD_OR_CTRL | Key::C); + ED_SHORTCUT("property_editor/paste_value", TTR("Paste Value"), KeyModifierMask::CMD_OR_CTRL | Key::V); ED_SHORTCUT("property_editor/copy_property_path", TTR("Copy Property Path"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::C); } diff --git a/editor/editor_inspector.h b/editor/editor_inspector.h index d634eae23f..bada02e254 100644 --- a/editor/editor_inspector.h +++ b/editor/editor_inspector.h @@ -58,8 +58,8 @@ class EditorProperty : public Container { public: enum MenuItems { - MENU_COPY_PROPERTY, - MENU_PASTE_PROPERTY, + MENU_COPY_VALUE, + MENU_PASTE_VALUE, MENU_COPY_PROPERTY_PATH, MENU_PIN_VALUE, MENU_OPEN_DOCUMENTATION, @@ -120,6 +120,8 @@ private: HashMap<StringName, Variant> cache; GDVIRTUAL0(_update_property) + GDVIRTUAL1(_set_read_only, bool) + void _update_pin_flags(); protected: @@ -151,7 +153,7 @@ public: void set_doc_path(const String &p_doc_path); virtual void update_property(); - void update_revert_and_pin_status(); + void update_editor_property_status(); virtual bool use_keying_next() const; @@ -333,6 +335,7 @@ class EditorInspectorArray : public EditorInspectorSection { int begin_array_index = 0; int end_array_index = 0; + bool read_only = false; bool movable = true; bool numbered = false; @@ -404,7 +407,7 @@ public: void setup_with_count_property(Object *p_object, String p_label, const StringName &p_count_property, const StringName &p_array_element_prefix, int p_page, const Color &p_bg_color, bool p_foldable, bool p_movable = true, bool p_numbered = false, int p_page_length = 5, const String &p_add_item_text = "", const String &p_swap_method = ""); VBoxContainer *get_vbox(int p_index); - EditorInspectorArray(); + EditorInspectorArray(bool p_read_only); }; class EditorPaginator : public HBoxContainer { diff --git a/editor/editor_log.cpp b/editor/editor_log.cpp index 6e6a898757..0f2543f708 100644 --- a/editor/editor_log.cpp +++ b/editor/editor_log.cpp @@ -65,19 +65,34 @@ void EditorLog::_error_handler(void *p_self, const char *p_func, const char *p_f } void EditorLog::_update_theme() { - Ref<Font> normal_font = get_theme_font(SNAME("output_source"), SNAME("EditorFonts")); + const Ref<Font> normal_font = get_theme_font(SNAME("output_source"), SNAME("EditorFonts")); if (normal_font.is_valid()) { log->add_theme_font_override("normal_font", normal_font); } - log->add_theme_font_size_override("normal_font_size", get_theme_font_size(SNAME("output_source_size"), SNAME("EditorFonts"))); - log->add_theme_color_override("selection_color", get_theme_color(SNAME("accent_color"), SNAME("Editor")) * Color(1, 1, 1, 0.4)); - - Ref<Font> bold_font = get_theme_font(SNAME("bold"), SNAME("EditorFonts")); + const Ref<Font> bold_font = get_theme_font(SNAME("output_source_bold"), SNAME("EditorFonts")); if (bold_font.is_valid()) { log->add_theme_font_override("bold_font", bold_font); } + const Ref<Font> italics_font = get_theme_font(SNAME("output_source_italic"), SNAME("EditorFonts")); + if (italics_font.is_valid()) { + log->add_theme_font_override("italics_font", italics_font); + } + + const Ref<Font> bold_italics_font = get_theme_font(SNAME("output_source_bold_italic"), SNAME("EditorFonts")); + if (bold_italics_font.is_valid()) { + log->add_theme_font_override("bold_italics_font", bold_italics_font); + } + + const Ref<Font> mono_font = get_theme_font(SNAME("output_source_mono"), SNAME("EditorFonts")); + if (mono_font.is_valid()) { + log->add_theme_font_override("mono_font", mono_font); + } + + log->add_theme_font_size_override("normal_font_size", get_theme_font_size(SNAME("output_source_size"), SNAME("EditorFonts"))); + log->add_theme_color_override("selection_color", get_theme_color(SNAME("accent_color"), SNAME("Editor")) * Color(1, 1, 1, 0.4)); + type_filter_map[MSG_TYPE_STD]->toggle_button->set_icon(get_theme_icon(SNAME("Popup"), SNAME("EditorIcons"))); type_filter_map[MSG_TYPE_ERROR]->toggle_button->set_icon(get_theme_icon(SNAME("StatusError"), SNAME("EditorIcons"))); type_filter_map[MSG_TYPE_WARNING]->toggle_button->set_icon(get_theme_icon(SNAME("StatusWarning"), SNAME("EditorIcons"))); diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index 1d2540f0fd..6bc281c7e4 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -429,7 +429,7 @@ void EditorNode::_version_control_menu_option(int p_idx) { void EditorNode::_update_title() { const String appname = ProjectSettings::get_singleton()->get("application/config/name"); - String title = (appname.is_empty() ? TTR("Unnamed Project") : appname) + String(" - ") + VERSION_NAME; + String title = (appname.is_empty() ? TTR("Unnamed Project") : appname); const String edited = editor_data.get_edited_scene_root() ? editor_data.get_edited_scene_root()->get_scene_file_path() : String(); if (!edited.is_empty()) { // Display the edited scene name before the program name so that it can be seen in the OS task bar. @@ -439,8 +439,10 @@ void EditorNode::_update_title() { // Display the "modified" mark before anything else so that it can always be seen in the OS task bar. title = vformat("(*) %s", title); } - - DisplayServer::get_singleton()->window_set_title(title); + DisplayServer::get_singleton()->window_set_title(title + String(" - ") + VERSION_NAME); + if (project_title) { + project_title->set_text(title); + } } void EditorNode::shortcut_input(const Ref<InputEvent> &p_event) { @@ -465,15 +467,15 @@ void EditorNode::shortcut_input(const Ref<InputEvent> &p_event) { } if (ED_IS_SHORTCUT("editor/editor_2d", p_event)) { - _editor_select(EDITOR_2D); + editor_select(EDITOR_2D); } else if (ED_IS_SHORTCUT("editor/editor_3d", p_event)) { - _editor_select(EDITOR_3D); + editor_select(EDITOR_3D); } else if (ED_IS_SHORTCUT("editor/editor_script", p_event)) { - _editor_select(EDITOR_SCRIPT); + editor_select(EDITOR_SCRIPT); } else if (ED_IS_SHORTCUT("editor/editor_help", p_event)) { emit_signal(SNAME("request_help_search"), ""); } else if (ED_IS_SHORTCUT("editor/editor_assetlib", p_event) && AssetLibraryEditorPlugin::is_available()) { - _editor_select(EDITOR_ASSETLIB); + editor_select(EDITOR_ASSETLIB); } else if (ED_IS_SHORTCUT("editor/editor_next", p_event)) { _editor_select_next(); } else if (ED_IS_SHORTCUT("editor/editor_prev", p_event)) { @@ -584,7 +586,7 @@ void EditorNode::_update_from_settings() { void EditorNode::_select_default_main_screen_plugin() { if (EDITOR_3D < main_editor_buttons.size() && main_editor_buttons[EDITOR_3D]->is_visible()) { // If the 3D editor is enabled, use this as the default. - _editor_select(EDITOR_3D); + editor_select(EDITOR_3D); return; } @@ -593,12 +595,12 @@ void EditorNode::_select_default_main_screen_plugin() { for (int i = 0; i < main_editor_buttons.size(); i++) { Button *editor_button = main_editor_buttons[i]; if (editor_button->is_visible()) { - _editor_select(i); + editor_select(i); return; } } - _editor_select(-1); + editor_select(-1); } void EditorNode::_notification(int p_what) { @@ -659,6 +661,12 @@ void EditorNode::_notification(int p_what) { case NOTIFICATION_ENTER_TREE: { Engine::get_singleton()->set_editor_hint(true); + Window *window = static_cast<Window *>(get_tree()->get_root()); + if (window) { + // Handle macOS fullscreen and extend-to-title changes. + window->connect("titlebar_changed", callable_mp(this, &EditorNode::_titlebar_resized)); + } + OS::get_singleton()->set_low_processor_usage_mode_sleep_usec(int(EDITOR_GET("interface/editor/low_processor_mode_sleep_usec"))); get_tree()->get_root()->set_as_audio_listener_3d(false); get_tree()->get_root()->set_as_audio_listener_2d(false); @@ -713,6 +721,8 @@ void EditorNode::_notification(int p_what) { ProjectSettings::get_singleton()->save(); } + _titlebar_resized(); + /* DO NOT LOAD SCENES HERE, WAIT FOR FILE SCANNING AND REIMPORT TO COMPLETE */ } break; @@ -750,7 +760,8 @@ void EditorNode::_notification(int p_what) { EditorSettings::get_singleton()->check_changed_settings_in_group("text_editor/theme") || EditorSettings::get_singleton()->check_changed_settings_in_group("interface/editor/font") || EditorSettings::get_singleton()->check_changed_settings_in_group("interface/editor/main_font") || - EditorSettings::get_singleton()->check_changed_settings_in_group("interface/editor/code_font"); + EditorSettings::get_singleton()->check_changed_settings_in_group("interface/editor/code_font") || + EditorSettings::get_singleton()->check_changed_settings_in_group("filesystem/file_dialog/thumbnail_size"); if (theme_changed) { theme = create_custom_theme(theme_base->get_theme()); @@ -1169,6 +1180,18 @@ void EditorNode::_reload_project_settings() { void EditorNode::_vp_resized() { } +void EditorNode::_titlebar_resized() { + const Size2 &margin = DisplayServer::get_singleton()->window_get_safe_title_margins(DisplayServer::MAIN_WINDOW_ID); + if (left_menu_spacer) { + int w = (gui_base->is_layout_rtl()) ? margin.y : margin.x; + left_menu_spacer->set_custom_minimum_size(Size2(w, 0)); + } + if (right_menu_spacer) { + int w = (gui_base->is_layout_rtl()) ? margin.x : margin.y; + right_menu_spacer->set_custom_minimum_size(Size2(w, 0)); + } +} + void EditorNode::_version_button_pressed() { DisplayServer::get_singleton()->clipboard_set(version_btn->get_meta(META_TEXT_TO_COPY)); } @@ -1190,7 +1213,7 @@ void EditorNode::_editor_select_next() { } } while (!main_editor_buttons[editor]->is_visible()); - _editor_select(editor); + editor_select(editor); } void EditorNode::_open_command_palette() { @@ -1208,7 +1231,7 @@ void EditorNode::_editor_select_prev() { } } while (!main_editor_buttons[editor]->is_visible()); - _editor_select(editor); + editor_select(editor); } Error EditorNode::load_resource(const String &p_resource, bool p_ignore_broken_deps) { @@ -2321,10 +2344,7 @@ void EditorNode::_edit_current(bool p_skip_foreign) { } else { Node *selected_node = nullptr; - if (current_obj->is_class("EditorDebuggerRemoteObject")) { - editable_info = TTR("This is a remote object, so it's not editable.\nPlease read the documentation relevant to debugging to better understand this workflow."); - disable_folding = true; - } else if (current_obj->is_class("MultiNodeEdit")) { + if (current_obj->is_class("MultiNodeEdit")) { Node *scene = get_edited_scene(); if (scene) { MultiNodeEdit *multi_node_edit = Object::cast_to<MultiNodeEdit>(current_obj); @@ -2393,7 +2413,7 @@ void EditorNode::_edit_current(bool p_skip_foreign) { else if (main_plugin != editor_plugin_screen && (!ScriptEditor::get_singleton() || !ScriptEditor::get_singleton()->is_visible_in_tree() || ScriptEditor::get_singleton()->can_take_away_focus())) { // Update screen main_plugin. - _editor_select(plugin_index); + editor_select(plugin_index); main_plugin->edit(current_obj); } else { editor_plugin_screen->edit(current_obj); @@ -2453,7 +2473,7 @@ void EditorNode::_run(bool p_current, const String &p_custom) { write_movie_file = GLOBAL_GET("editor/movie_writer/movie_file"); } if (write_movie_file == String()) { - show_accept(TTR("Movie Maker mode is enabled, but no movie file path has been specified.\nA default movie file path can be specified in the project settings under the 'Editor/Movie Writer' category.\nAlternatively, for running single scenes, a 'movie_path' metadata can be added to the root node,\nspecifying the path to a movie file that will be used when recording that scene."), TTR("OK")); + show_accept(TTR("Movie Maker mode is enabled, but no movie file path has been specified.\nA default movie file path can be specified in the project settings under the Editor > Movie Writer category.\nAlternatively, for running single scenes, a `movie_file` string metadata can be added to the root node,\nspecifying the path to a movie file that will be used when recording that scene."), TTR("OK")); return; } } @@ -2766,18 +2786,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { } } else if (extensions.size()) { String root_name = scene->get_name(); - // Very similar to node naming logic. - switch (ProjectSettings::get_singleton()->get("editor/scene/scene_naming").operator int()) { - case SCENE_NAME_CASING_AUTO: - // Use casing of the root node. - break; - case SCENE_NAME_CASING_PASCAL_CASE: { - root_name = root_name.to_pascal_case(); - } break; - case SCENE_NAME_CASING_SNAKE_CASE: - root_name = root_name.replace("-", "_").to_snake_case(); - break; - } + root_name = EditorNode::adjust_scene_name_casing(root_name); file->set_current_path(root_name + "." + extensions.front()->get().to_lower()); } file->popup_file_dialog(); @@ -3083,8 +3092,8 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { case HELP_SUPPORT_GODOT_DEVELOPMENT: { OS::get_singleton()->shell_open("https://godotengine.org/donate"); } break; - case SET_RENDERING_DRIVER_SAVE_AND_RESTART: { - ProjectSettings::get_singleton()->set("rendering/driver/driver_name", rendering_driver_request); + case SET_RENDERER_NAME_SAVE_AND_RESTART: { + ProjectSettings::get_singleton()->set("rendering/renderer/rendering_method", renderer_request); ProjectSettings::get_singleton()->save(); save_all_scenes(); @@ -3093,6 +3102,19 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { } } +String EditorNode::adjust_scene_name_casing(const String &root_name) { + switch (ProjectSettings::get_singleton()->get("editor/scene/scene_naming").operator int()) { + case SCENE_NAME_CASING_AUTO: + // Use casing of the root node. + break; + case SCENE_NAME_CASING_PASCAL_CASE: + return root_name.to_pascal_case(); + case SCENE_NAME_CASING_SNAKE_CASE: + return root_name.replace("-", "_").to_snake_case(); + } + return root_name; +} + void EditorNode::_request_screenshot() { _screenshot(); } @@ -3306,7 +3328,7 @@ VBoxContainer *EditorNode::get_main_screen_control() { return main_screen_vbox; } -void EditorNode::_editor_select(int p_which) { +void EditorNode::editor_select(int p_which) { static bool selecting = false; if (selecting || changing_scene) { return; @@ -3360,7 +3382,7 @@ void EditorNode::select_editor_by_name(const String &p_name) { for (int i = 0; i < main_editor_buttons.size(); i++) { if (main_editor_buttons[i]->get_text() == p_name) { - _editor_select(i); + editor_select(i); return; } } @@ -3373,13 +3395,15 @@ void EditorNode::add_editor_plugin(EditorPlugin *p_editor, bool p_config_changed Button *tb = memnew(Button); tb->set_flat(true); tb->set_toggle_mode(true); - tb->connect("pressed", callable_mp(singleton, &EditorNode::_editor_select).bind(singleton->main_editor_buttons.size())); + tb->connect("pressed", callable_mp(singleton, &EditorNode::editor_select).bind(singleton->main_editor_buttons.size())); tb->set_name(p_editor->get_name()); tb->set_text(p_editor->get_name()); Ref<Texture2D> icon = p_editor->get_icon(); if (icon.is_valid()) { tb->set_icon(icon); + // Make sure the control is updated if the icon is reimported. + icon->connect("changed", callable_mp((Control *)tb, &Control::update_minimum_size)); } else if (singleton->gui_base->has_theme_icon(p_editor->get_name(), SNAME("EditorIcons"))) { tb->set_icon(singleton->gui_base->get_theme_icon(p_editor->get_name(), SNAME("EditorIcons"))); } @@ -3388,7 +3412,7 @@ void EditorNode::add_editor_plugin(EditorPlugin *p_editor, bool p_config_changed tb->add_theme_font_size_override("font_size", singleton->gui_base->get_theme_font_size(SNAME("main_button_font_size"), SNAME("EditorFonts"))); singleton->main_editor_buttons.push_back(tb); - singleton->main_editor_button_vb->add_child(tb); + singleton->main_editor_button_hb->add_child(tb); singleton->editor_table.push_back(p_editor); singleton->distraction_free->move_to_front(); @@ -3405,7 +3429,7 @@ void EditorNode::remove_editor_plugin(EditorPlugin *p_editor, bool p_config_chan for (int i = 0; i < singleton->main_editor_buttons.size(); i++) { if (p_editor->get_name() == singleton->main_editor_buttons[i]->get_text()) { if (singleton->main_editor_buttons[i]->is_pressed()) { - singleton->_editor_select(EDITOR_SCRIPT); + singleton->editor_select(EDITOR_SCRIPT); } memdelete(singleton->main_editor_buttons[i]); @@ -3629,7 +3653,7 @@ void EditorNode::_set_main_scene_state(Dictionary p_state, Node *p_for_scene) { int index = p_state["editor_index"]; if (current < 2) { // If currently in spatial/2d, only switch to spatial/2d. If currently in script, stay there. if (index < 2 || !get_edited_scene()) { - _editor_select(index); + editor_select(index); } } } @@ -3640,9 +3664,9 @@ void EditorNode::_set_main_scene_state(Dictionary p_state, Node *p_for_scene) { int n2d = 0, n3d = 0; _find_node_types(get_edited_scene(), n2d, n3d); if (n2d > n3d) { - _editor_select(EDITOR_2D); + editor_select(EDITOR_2D); } else if (n3d > n2d) { - _editor_select(EDITOR_3D); + editor_select(EDITOR_3D); } } } @@ -3669,10 +3693,6 @@ bool EditorNode::is_changing_scene() const { return changing_scene; } -void EditorNode::_clear_undo_history() { - get_undo_redo()->clear_history(false); -} - void EditorNode::set_current_scene(int p_idx) { // Save the folding in case the scene gets reloaded. if (editor_data.get_scene_path(p_idx) != "" && editor_data.get_edited_scene_root(p_idx)) { @@ -3933,7 +3953,7 @@ void EditorNode::edit_foreign_resource(Ref<Resource> p_resource) { InspectorDock::get_singleton()->call_deferred("edit_resource", p_resource); } -bool EditorNode::is_resource_read_only(Ref<Resource> p_resource) { +bool EditorNode::is_resource_read_only(Ref<Resource> p_resource, bool p_foreign_resources_are_writable) { ERR_FAIL_COND_V(p_resource.is_null(), false); String path = p_resource->get_path(); @@ -3945,7 +3965,11 @@ bool EditorNode::is_resource_read_only(Ref<Resource> p_resource) { // If the base resource is a packed scene, we treat it as read-only if it is not the currently edited scene. if (ResourceLoader::get_resource_type(base) == "PackedScene") { if (!get_tree()->get_edited_scene_root() || get_tree()->get_edited_scene_root()->get_scene_file_path() != base) { - return true; + // If we have not flagged foreign resources as writable or the base scene the resource is + // part was imported, it can be considered read-only. + if (!p_foreign_resources_are_writable || FileAccess::exists(base + ".import")) { + return true; + } } } else { // If a corresponding .import file exists for the base file, we assume it to be imported and should therefore treated as read-only. @@ -4854,7 +4878,7 @@ void EditorNode::_load_docks() { editor_data.set_plugin_window_layout(config); } -void EditorNode::_update_dock_slots_visibility() { +void EditorNode::_update_dock_slots_visibility(bool p_keep_selected_tabs) { if (!docks_visible) { for (int i = 0; i < DOCK_SLOT_MAX; i++) { dock_slot[i]->hide(); @@ -4889,9 +4913,11 @@ void EditorNode::_update_dock_slots_visibility() { } } - for (int i = 0; i < DOCK_SLOT_MAX; i++) { - if (dock_slot[i]->is_visible() && dock_slot[i]->get_tab_count()) { - dock_slot[i]->set_current_tab(0); + if (!p_keep_selected_tabs) { + for (int i = 0; i < DOCK_SLOT_MAX; i++) { + if (dock_slot[i]->is_visible() && dock_slot[i]->get_tab_count()) { + dock_slot[i]->set_current_tab(0); + } } } @@ -5504,7 +5530,7 @@ void EditorNode::_bottom_panel_switch(bool p_enable, int p_idx) { void EditorNode::set_docks_visible(bool p_show) { docks_visible = p_show; - _update_dock_slots_visibility(); + _update_dock_slots_visibility(true); } bool EditorNode::get_docks_visible() const { @@ -5879,27 +5905,27 @@ void EditorNode::_bottom_panel_raise_toggled(bool p_pressed) { top_split->set_visible(!p_pressed); } -void EditorNode::_update_rendering_driver_color() { - if (rendering_driver->get_text() == "opengl3") { - rendering_driver->add_theme_color_override("font_color", Color::hex(0x5586a4ff)); - } else if (rendering_driver->get_text() == "vulkan") { - rendering_driver->add_theme_color_override("font_color", theme_base->get_theme_color(SNAME("vulkan_color"), SNAME("Editor"))); +void EditorNode::_update_renderer_color() { + if (renderer->get_text() == "gl_compatibility") { + renderer->add_theme_color_override("font_color", Color::hex(0x5586a4ff)); + } else if (renderer->get_text() == "forward_plus" || renderer->get_text() == "mobile") { + renderer->add_theme_color_override("font_color", theme_base->get_theme_color(SNAME("vulkan_color"), SNAME("Editor"))); } } -void EditorNode::_rendering_driver_selected(int p_which) { - String driver = rendering_driver->get_item_metadata(p_which); +void EditorNode::_renderer_selected(int p_which) { + String rendering_method = renderer->get_item_metadata(p_which); - String current_driver = OS::get_singleton()->get_current_rendering_driver_name(); + String current_renderer = GLOBAL_GET("rendering/renderer/rendering_method"); - if (driver == current_driver) { + if (rendering_method == current_renderer) { return; } - rendering_driver_request = driver; + renderer_request = rendering_method; video_restart_dialog->popup_centered(); - rendering_driver->select(rendering_driver_current); - _update_rendering_driver_color(); + renderer->select(renderer_current); + _update_renderer_color(); } void EditorNode::_resource_saved(Ref<Resource> p_resource, const String &p_path) { @@ -5934,7 +5960,7 @@ void EditorNode::_feature_profile_changed() { if ((profile->is_feature_disabled(EditorFeatureProfile::FEATURE_3D) && singleton->main_editor_buttons[EDITOR_3D]->is_pressed()) || (profile->is_feature_disabled(EditorFeatureProfile::FEATURE_SCRIPT) && singleton->main_editor_buttons[EDITOR_SCRIPT]->is_pressed()) || (AssetLibraryEditorPlugin::is_available() && profile->is_feature_disabled(EditorFeatureProfile::FEATURE_ASSET_LIB) && singleton->main_editor_buttons[EDITOR_ASSETLIB]->is_pressed())) { - _editor_select(EDITOR_2D); + editor_select(EDITOR_2D); } } else { import_tabs->set_tab_hidden(import_tabs->get_tab_idx_from_control(ImportDock::get_singleton()), false); @@ -5957,19 +5983,14 @@ void EditorNode::_bind_methods() { GLOBAL_DEF("editor/scene/scene_naming", SCENE_NAME_CASING_SNAKE_CASE); ProjectSettings::get_singleton()->set_custom_property_info("editor/scene/scene_naming", PropertyInfo(Variant::INT, "editor/scene/scene_naming", PROPERTY_HINT_ENUM, "Auto,PascalCase,snake_case")); ClassDB::bind_method("edit_current", &EditorNode::edit_current); - ClassDB::bind_method("_editor_select", &EditorNode::_editor_select); - ClassDB::bind_method("_node_renamed", &EditorNode::_node_renamed); ClassDB::bind_method("edit_node", &EditorNode::edit_node); ClassDB::bind_method(D_METHOD("push_item", "object", "property", "inspector_only"), &EditorNode::push_item, DEFVAL(""), DEFVAL(false)); - ClassDB::bind_method("_get_scene_metadata", &EditorNode::_get_scene_metadata); ClassDB::bind_method("set_edited_scene", &EditorNode::set_edited_scene); ClassDB::bind_method("open_request", &EditorNode::open_request); ClassDB::bind_method("edit_foreign_resource", &EditorNode::edit_foreign_resource); ClassDB::bind_method("is_resource_read_only", &EditorNode::is_resource_read_only); - ClassDB::bind_method("_close_messages", &EditorNode::_close_messages); - ClassDB::bind_method("_show_messages", &EditorNode::_show_messages); ClassDB::bind_method("stop_child_process", &EditorNode::stop_child_process); @@ -5978,19 +5999,10 @@ void EditorNode::_bind_methods() { ClassDB::bind_method("_set_main_scene_state", &EditorNode::_set_main_scene_state); ClassDB::bind_method("_update_recent_scenes", &EditorNode::_update_recent_scenes); - ClassDB::bind_method("_clear_undo_history", &EditorNode::_clear_undo_history); - ClassDB::bind_method("edit_item_resource", &EditorNode::edit_item_resource); ClassDB::bind_method(D_METHOD("get_gui_base"), &EditorNode::get_gui_base); - ClassDB::bind_method(D_METHOD("_on_plugin_ready"), &EditorNode::_on_plugin_ready); // Still used by some connect_compat. - - ClassDB::bind_method("_screenshot", &EditorNode::_screenshot); - ClassDB::bind_method("_save_screenshot", &EditorNode::_save_screenshot); - - ClassDB::bind_method("_version_button_pressed", &EditorNode::_version_button_pressed); - ADD_SIGNAL(MethodInfo("play_pressed")); ADD_SIGNAL(MethodInfo("pause_pressed")); ADD_SIGNAL(MethodInfo("stop_pressed")); @@ -6602,14 +6614,14 @@ EditorNode::EditorNode() { if (can_expand) { // Add spacer to avoid other controls under window minimize/maximize/close buttons (left side). - Control *menu_spacer = memnew(Control); - menu_spacer->set_mouse_filter(Control::MOUSE_FILTER_PASS); - menu_spacer->set_custom_minimum_size(Size2(DisplayServer::get_singleton()->window_get_safe_title_margins(DisplayServer::MAIN_WINDOW_ID).x, 0)); - menu_hb->add_child(menu_spacer); + left_menu_spacer = memnew(Control); + left_menu_spacer->set_mouse_filter(Control::MOUSE_FILTER_PASS); + menu_hb->add_child(left_menu_spacer); } main_menu = memnew(MenuBar); menu_hb->add_child(main_menu); + main_menu->add_theme_style_override("hover", gui_base->get_theme_stylebox(SNAME("MenuHover"), SNAME("EditorStyles"))); main_menu->set_flat(true); main_menu->set_start_index(0); // Main menu, add to the start of global menu. @@ -6751,8 +6763,10 @@ EditorNode::EditorNode() { project_menu->add_separator(); project_menu->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/export", TTR("Export..."), Key::NONE, TTR("Export")), FILE_EXPORT_PROJECT); +#ifndef ANDROID_ENABLED project_menu->add_item(TTR("Install Android Build Template..."), FILE_INSTALL_ANDROID_SOURCE); project_menu->add_item(TTR("Open User Data Folder"), RUN_USER_DATA_FOLDER); +#endif project_menu->add_separator(); project_menu->add_item(TTR("Customize Engine Build Configuration..."), TOOLS_BUILD_PROFILE_MANAGER); @@ -6776,22 +6790,30 @@ EditorNode::EditorNode() { project_menu->add_shortcut(ED_GET_SHORTCUT("editor/quit_to_project_list"), RUN_PROJECT_MANAGER, true); // Spacer to center 2D / 3D / Script buttons. - Control *left_spacer = memnew(Control); + HBoxContainer *left_spacer = memnew(HBoxContainer); left_spacer->set_mouse_filter(Control::MOUSE_FILTER_PASS); + left_spacer->set_h_size_flags(Control::SIZE_EXPAND_FILL); menu_hb->add_child(left_spacer); - menu_hb->add_spacer(); + if (can_expand && global_menu) { + project_title = memnew(Label); + project_title->add_theme_font_override("font", gui_base->get_theme_font(SNAME("bold"), SNAME("EditorFonts"))); + project_title->add_theme_font_size_override("font_size", gui_base->get_theme_font_size(SNAME("bold_size"), SNAME("EditorFonts"))); + project_title->set_focus_mode(Control::FOCUS_NONE); + project_title->set_text_overrun_behavior(TextServer::OVERRUN_TRIM_ELLIPSIS); + project_title->set_vertical_alignment(VERTICAL_ALIGNMENT_CENTER); + project_title->set_h_size_flags(Control::SIZE_EXPAND_FILL); + left_spacer->add_child(project_title); + } - main_editor_button_vb = memnew(HBoxContainer); - menu_hb->add_child(main_editor_button_vb); + main_editor_button_hb = memnew(HBoxContainer); + menu_hb->add_child(main_editor_button_hb); // Options are added and handled by DebuggerEditorPlugin. debug_menu = memnew(PopupMenu); debug_menu->set_name(TTR("Debug")); main_menu->add_child(debug_menu); - menu_hb->add_spacer(); - settings_menu = memnew(PopupMenu); settings_menu->set_name(TTR("Editor")); main_menu->add_child(settings_menu); @@ -6815,12 +6837,14 @@ EditorNode::EditorNode() { settings_menu->set_item_tooltip(-1, TTR("Screenshots are stored in the Editor Data/Settings Folder.")); +#ifndef ANDROID_ENABLED ED_SHORTCUT_AND_COMMAND("editor/fullscreen_mode", TTR("Toggle Fullscreen"), KeyModifierMask::SHIFT | Key::F11); ED_SHORTCUT_OVERRIDE("editor/fullscreen_mode", "macos", KeyModifierMask::META | KeyModifierMask::CTRL | Key::F); settings_menu->add_shortcut(ED_GET_SHORTCUT("editor/fullscreen_mode"), SETTINGS_TOGGLE_FULLSCREEN); - +#endif settings_menu->add_separator(); +#ifndef ANDROID_ENABLED if (OS::get_singleton()->get_data_path() == OS::get_singleton()->get_config_path()) { // Configuration and data folders are located in the same place (Windows/MacOS). settings_menu->add_item(TTR("Open Editor Data/Settings Folder"), SETTINGS_EDITOR_DATA_FOLDER); @@ -6830,9 +6854,12 @@ EditorNode::EditorNode() { settings_menu->add_item(TTR("Open Editor Settings Folder"), SETTINGS_EDITOR_CONFIG_FOLDER); } settings_menu->add_separator(); +#endif settings_menu->add_item(TTR("Manage Editor Features..."), SETTINGS_MANAGE_FEATURE_PROFILES); +#ifndef ANDROID_ENABLED settings_menu->add_item(TTR("Manage Export Templates..."), SETTINGS_MANAGE_EXPORT_TEMPLATES); +#endif help_menu = memnew(PopupMenu); help_menu->set_name(TTR("Help")); @@ -6860,6 +6887,7 @@ EditorNode::EditorNode() { // Spacer to center 2D / 3D / Script buttons. Control *right_spacer = memnew(Control); right_spacer->set_mouse_filter(Control::MOUSE_FILTER_PASS); + right_spacer->set_h_size_flags(Control::SIZE_EXPAND_FILL); menu_hb->add_child(right_spacer); launch_pad = memnew(PanelContainer); @@ -6875,23 +6903,24 @@ EditorNode::EditorNode() { play_button->set_toggle_mode(true); play_button->set_focus_mode(Control::FOCUS_NONE); play_button->connect("pressed", callable_mp(this, &EditorNode::_menu_option).bind(RUN_PLAY)); + play_button->set_tooltip_text(TTR("Run the project's default scene.")); - ED_SHORTCUT_AND_COMMAND("editor/play", TTR("Play"), Key::F5); - ED_SHORTCUT_OVERRIDE("editor/play", "macos", KeyModifierMask::META | Key::B); - play_button->set_shortcut(ED_GET_SHORTCUT("editor/play")); + ED_SHORTCUT_AND_COMMAND("editor/run_project", TTR("Run Project"), Key::F5); + ED_SHORTCUT_OVERRIDE("editor/run_project", "macos", KeyModifierMask::META | Key::B); + play_button->set_shortcut(ED_GET_SHORTCUT("editor/run_project")); pause_button = memnew(Button); pause_button->set_flat(true); pause_button->set_toggle_mode(true); pause_button->set_icon(gui_base->get_theme_icon(SNAME("Pause"), SNAME("EditorIcons"))); pause_button->set_focus_mode(Control::FOCUS_NONE); - pause_button->set_tooltip_text(TTR("Pause the scene execution for debugging.")); + pause_button->set_tooltip_text(TTR("Pause the running project's execution for debugging.")); pause_button->set_disabled(true); launch_pad_hb->add_child(pause_button); - ED_SHORTCUT("editor/pause_scene", TTR("Pause Scene"), Key::F7); - ED_SHORTCUT_OVERRIDE("editor/pause_scene", "macos", KeyModifierMask::META | KeyModifierMask::CTRL | Key::Y); - pause_button->set_shortcut(ED_GET_SHORTCUT("editor/pause_scene")); + ED_SHORTCUT("editor/pause_running_project", TTR("Pause Running Project"), Key::F7); + ED_SHORTCUT_OVERRIDE("editor/pause_running_project", "macos", KeyModifierMask::META | KeyModifierMask::CTRL | Key::Y); + pause_button->set_shortcut(ED_GET_SHORTCUT("editor/pause_running_project")); stop_button = memnew(Button); stop_button->set_flat(true); @@ -6899,12 +6928,12 @@ EditorNode::EditorNode() { stop_button->set_focus_mode(Control::FOCUS_NONE); stop_button->set_icon(gui_base->get_theme_icon(SNAME("Stop"), SNAME("EditorIcons"))); stop_button->connect("pressed", callable_mp(this, &EditorNode::_menu_option).bind(RUN_STOP)); - stop_button->set_tooltip_text(TTR("Stop the scene.")); + stop_button->set_tooltip_text(TTR("Stop the currently running project.")); stop_button->set_disabled(true); - ED_SHORTCUT("editor/stop", TTR("Stop"), Key::F8); - ED_SHORTCUT_OVERRIDE("editor/stop", "macos", KeyModifierMask::META | Key::PERIOD); - stop_button->set_shortcut(ED_GET_SHORTCUT("editor/stop")); + ED_SHORTCUT("editor/stop_running_project", TTR("Stop Running Project"), Key::F8); + ED_SHORTCUT_OVERRIDE("editor/stop_running_project", "macos", KeyModifierMask::META | Key::PERIOD); + stop_button->set_shortcut(ED_GET_SHORTCUT("editor/stop_running_project")); run_native = memnew(EditorRunNative); launch_pad_hb->add_child(run_native); @@ -6916,10 +6945,11 @@ EditorNode::EditorNode() { play_scene_button->set_toggle_mode(true); play_scene_button->set_focus_mode(Control::FOCUS_NONE); play_scene_button->connect("pressed", callable_mp(this, &EditorNode::_menu_option).bind(RUN_PLAY_SCENE)); + play_scene_button->set_tooltip_text(TTR("Run the currently edited scene.")); - ED_SHORTCUT_AND_COMMAND("editor/play_scene", TTR("Play Scene"), Key::F6); - ED_SHORTCUT_OVERRIDE("editor/play_scene", "macos", KeyModifierMask::META | Key::R); - play_scene_button->set_shortcut(ED_GET_SHORTCUT("editor/play_scene")); + ED_SHORTCUT_AND_COMMAND("editor/run_current_scene", TTR("Run Current Scene"), Key::F6); + ED_SHORTCUT_OVERRIDE("editor/run_current_scene", "macos", KeyModifierMask::META | Key::R); + play_scene_button->set_shortcut(ED_GET_SHORTCUT("editor/run_current_scene")); play_custom_scene_button = memnew(Button); play_custom_scene_button->set_flat(true); @@ -6927,12 +6957,13 @@ EditorNode::EditorNode() { play_custom_scene_button->set_toggle_mode(true); play_custom_scene_button->set_focus_mode(Control::FOCUS_NONE); play_custom_scene_button->connect("pressed", callable_mp(this, &EditorNode::_menu_option).bind(RUN_PLAY_CUSTOM_SCENE)); + play_custom_scene_button->set_tooltip_text(TTR("Run a specific scene.")); _reset_play_buttons(); - ED_SHORTCUT_AND_COMMAND("editor/play_custom_scene", TTR("Play Custom Scene"), KeyModifierMask::CTRL | KeyModifierMask::SHIFT | Key::F5); - ED_SHORTCUT_OVERRIDE("editor/play_custom_scene", "macos", KeyModifierMask::META | KeyModifierMask::SHIFT | Key::R); - play_custom_scene_button->set_shortcut(ED_GET_SHORTCUT("editor/play_custom_scene")); + ED_SHORTCUT_AND_COMMAND("editor/run_specific_scene", TTR("Run Specific Scene"), KeyModifierMask::META | KeyModifierMask::SHIFT | Key::F5); + ED_SHORTCUT_OVERRIDE("editor/run_specific_scene", "macos", KeyModifierMask::META | KeyModifierMask::SHIFT | Key::R); + play_custom_scene_button->set_shortcut(ED_GET_SHORTCUT("editor/run_specific_scene")); write_movie_panel = memnew(PanelContainer); write_movie_panel->add_theme_style_override("panel", gui_base->get_theme_stylebox(SNAME("MovieWriterButtonNormal"), SNAME("EditorStyles"))); @@ -6956,58 +6987,54 @@ EditorNode::EditorNode() { HBoxContainer *right_menu_hb = memnew(HBoxContainer); menu_hb->add_child(right_menu_hb); - rendering_driver = memnew(OptionButton); - + renderer = memnew(OptionButton); // Hide the renderer selection dropdown until OpenGL support is more mature. // The renderer can still be changed in the project settings or using `--rendering-driver opengl3`. - rendering_driver->set_visible(false); + renderer->set_visible(false); + renderer->set_flat(true); + renderer->set_focus_mode(Control::FOCUS_NONE); + renderer->connect("item_selected", callable_mp(this, &EditorNode::_renderer_selected)); + renderer->add_theme_font_override("font", gui_base->get_theme_font(SNAME("bold"), SNAME("EditorFonts"))); + renderer->add_theme_font_size_override("font_size", gui_base->get_theme_font_size(SNAME("bold_size"), SNAME("EditorFonts"))); - rendering_driver->set_flat(true); - rendering_driver->set_focus_mode(Control::FOCUS_NONE); - rendering_driver->connect("item_selected", callable_mp(this, &EditorNode::_rendering_driver_selected)); - rendering_driver->add_theme_font_override("font", gui_base->get_theme_font(SNAME("bold"), SNAME("EditorFonts"))); - rendering_driver->add_theme_font_size_override("font_size", gui_base->get_theme_font_size(SNAME("bold_size"), SNAME("EditorFonts"))); - - right_menu_hb->add_child(rendering_driver); + right_menu_hb->add_child(renderer); if (can_expand) { // Add spacer to avoid other controls under the window minimize/maximize/close buttons (right side). - Control *menu_spacer = memnew(Control); - menu_spacer->set_mouse_filter(Control::MOUSE_FILTER_PASS); - menu_spacer->set_custom_minimum_size(Size2(DisplayServer::get_singleton()->window_get_safe_title_margins(DisplayServer::MAIN_WINDOW_ID).y, 0)); - menu_hb->add_child(menu_spacer); + right_menu_spacer = memnew(Control); + right_menu_spacer->set_mouse_filter(Control::MOUSE_FILTER_PASS); + menu_hb->add_child(right_menu_spacer); } - // Only display the render drivers that are available for this display driver. - int display_driver_idx = OS::get_singleton()->get_display_driver_id(); - Vector<String> render_drivers = DisplayServer::get_create_function_rendering_drivers(display_driver_idx); - String current_rendering_driver = OS::get_singleton()->get_current_rendering_driver_name(); + String current_renderer = GLOBAL_GET("rendering/renderer/rendering_method"); + + PackedStringArray renderers = ProjectSettings::get_singleton()->get_custom_property_info().get(StringName("rendering/renderer/rendering_method")).hint_string.split(",", false); // As we are doing string comparisons, keep in standard case to prevent problems with capitals // "vulkan" in particular uses lowercase "v" in the code, and uppercase in the UI. - current_rendering_driver = current_rendering_driver.to_lower(); + current_renderer = current_renderer.to_lower(); - for (int i = 0; i < render_drivers.size(); i++) { - String driver = render_drivers[i]; + for (int i = 0; i < renderers.size(); i++) { + String rendering_method = renderers[i]; - // Add the driver to the UI. - rendering_driver->add_item(driver); - rendering_driver->set_item_metadata(i, driver); + // Add the renderers name to the UI. + renderer->add_item(rendering_method); + renderer->set_item_metadata(i, rendering_method); // Lowercase for standard comparison. - driver = driver.to_lower(); + rendering_method = rendering_method.to_lower(); - if (current_rendering_driver == driver) { - rendering_driver->select(i); - rendering_driver_current = i; + if (current_renderer == rendering_method) { + renderer->select(i); + renderer_current = i; } } - _update_rendering_driver_color(); + _update_renderer_color(); video_restart_dialog = memnew(ConfirmationDialog); - video_restart_dialog->set_text(TTR("Changing the video driver requires restarting the editor.")); + video_restart_dialog->set_text(TTR("Changing the renderer requires restarting the editor.")); video_restart_dialog->set_ok_button_text(TTR("Save & Restart")); - video_restart_dialog->connect("confirmed", callable_mp(this, &EditorNode::_menu_option).bind(SET_RENDERING_DRIVER_SAVE_AND_RESTART)); + video_restart_dialog->connect("confirmed", callable_mp(this, &EditorNode::_menu_option).bind(SET_RENDERER_NAME_SAVE_AND_RESTART)); gui_base->add_child(video_restart_dialog); progress_hb = memnew(BackgroundProgress); @@ -7531,12 +7558,13 @@ EditorNode::EditorNode() { screenshot_timer->set_owner(get_owner()); // Adjust spacers to center 2D / 3D / Script buttons. - int max_w = MAX(launch_pad_hb->get_minimum_size().x + right_menu_hb->get_minimum_size().x, main_menu->get_minimum_size().x); + int max_w = MAX(launch_pad->get_minimum_size().x + right_menu_hb->get_minimum_size().x, main_menu->get_minimum_size().x); left_spacer->set_custom_minimum_size(Size2(MAX(0, max_w - main_menu->get_minimum_size().x), 0)); - right_spacer->set_custom_minimum_size(Size2(MAX(0, max_w - launch_pad_hb->get_minimum_size().x - right_menu_hb->get_minimum_size().x), 0)); + right_spacer->set_custom_minimum_size(Size2(MAX(0, max_w - launch_pad->get_minimum_size().x - right_menu_hb->get_minimum_size().x), 0)); // Extend menu bar to window title. if (can_expand) { + DisplayServer::get_singleton()->window_set_window_buttons_offset(Vector2i(menu_hb->get_minimum_size().y / 2, menu_hb->get_minimum_size().y / 2), DisplayServer::MAIN_WINDOW_ID); DisplayServer::get_singleton()->window_set_flag(DisplayServer::WINDOW_FLAG_EXTEND_TO_TITLE, true, DisplayServer::MAIN_WINDOW_ID); menu_hb->set_can_move_window(true); } @@ -7602,8 +7630,8 @@ EditorPlugin::AfterGUIInput EditorPluginList::forward_spatial_gui_input(Camera3D if (current_after == EditorPlugin::AFTER_GUI_INPUT_STOP) { after = EditorPlugin::AFTER_GUI_INPUT_STOP; } - if (after != EditorPlugin::AFTER_GUI_INPUT_STOP && current_after == EditorPlugin::AFTER_GUI_INPUT_DESELECT) { - after = EditorPlugin::AFTER_GUI_INPUT_DESELECT; + if (after != EditorPlugin::AFTER_GUI_INPUT_STOP && current_after == EditorPlugin::AFTER_GUI_INPUT_CUSTOM) { + after = EditorPlugin::AFTER_GUI_INPUT_CUSTOM; } } diff --git a/editor/editor_node.h b/editor/editor_node.h index df3d2ae0f8..3c236a1301 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -125,6 +125,12 @@ public: EDITOR_ASSETLIB }; + enum SceneNameCasing { + SCENE_NAME_CASING_AUTO, + SCENE_NAME_CASING_PASCAL_CASE, + SCENE_NAME_CASING_SNAKE_CASE + }; + struct ExecuteThreadArgs { String path; List<String> args; @@ -218,7 +224,7 @@ private: HELP_ABOUT, HELP_SUPPORT_GODOT_DEVELOPMENT, - SET_RENDERING_DRIVER_SAVE_AND_RESTART, + SET_RENDERER_NAME_SAVE_AND_RESTART, GLOBAL_NEW_WINDOW, GLOBAL_SCENE, @@ -233,12 +239,6 @@ private: MAX_BUILD_CALLBACKS = 128 }; - enum ScriptNameCasing { - SCENE_NAME_CASING_AUTO, - SCENE_NAME_CASING_PASCAL_CASE, - SCENE_NAME_CASING_SNAKE_CASE - }; - struct BottomPanelItem { String name; Control *control = nullptr; @@ -286,12 +286,12 @@ private: Control *theme_base = nullptr; Control *gui_base = nullptr; VBoxContainer *main_vbox = nullptr; - OptionButton *rendering_driver = nullptr; + OptionButton *renderer = nullptr; ConfirmationDialog *video_restart_dialog = nullptr; - int rendering_driver_current = 0; - String rendering_driver_request; + int renderer_current = 0; + String renderer_request; // Split containers. HSplitContainer *left_l_hsplit = nullptr; @@ -322,6 +322,9 @@ private: HBoxContainer *bottom_hb = nullptr; Control *vp_base = nullptr; + Label *project_title = nullptr; + Control *left_menu_spacer = nullptr; + Control *right_menu_spacer = nullptr; EditorTitleBar *menu_hb = nullptr; VBoxContainer *main_screen_vbox = nullptr; MenuBar *main_menu = nullptr; @@ -397,7 +400,7 @@ private: String current_path; MenuButton *update_spinner = nullptr; - HBoxContainer *main_editor_button_vb = nullptr; + HBoxContainer *main_editor_button_hb = nullptr; Vector<Button *> main_editor_buttons; Vector<EditorPlugin *> editor_table; @@ -543,7 +546,6 @@ private: void _update_file_menu_opened(); void _update_file_menu_closed(); - void _on_plugin_ready(Object *p_script, const String &p_activate_name); void _remove_plugin_from_enabled(const String &p_name); void _fs_changed(); @@ -553,7 +555,6 @@ private: void _node_renamed(); void _editor_select_next(); void _editor_select_prev(); - void _editor_select(int p_which); void _set_scene_metadata(const String &p_file, int p_idx = -1); void _get_scene_metadata(const String &p_file); void _update_title(); @@ -562,6 +563,7 @@ private: void _close_messages(); void _show_messages(); void _vp_resized(); + void _titlebar_resized(); void _version_button_pressed(); int _save_external_resources(); @@ -599,8 +601,8 @@ private: void _update_from_settings(); - void _rendering_driver_selected(int); - void _update_rendering_driver_color(); + void _renderer_selected(int); + void _update_renderer_color(); void _exit_editor(int p_exit_code); @@ -649,7 +651,7 @@ private: void _load_docks(); void _save_docks_to_config(Ref<ConfigFile> p_layout, const String &p_section); void _load_docks_from_config(Ref<ConfigFile> p_layout, const String &p_section); - void _update_dock_slots_visibility(); + void _update_dock_slots_visibility(bool p_keep_selected_tabs = false); void _dock_tab_changed(int p_tab); void _save_open_scenes_to_config(Ref<ConfigFile> p_layout, const String &p_section); @@ -658,8 +660,6 @@ private: void _update_layouts_menu(); void _layout_menu_option(int p_id); - void _clear_undo_history(); - void _update_addon_config(); void _toggle_distraction_free_mode(); @@ -703,7 +703,11 @@ protected: void set_current_tab(int p_tab); public: - void set_visible_editor(EditorTable p_table) { _editor_select(p_table); } + // Public for use with callable_mp. + void _on_plugin_ready(Object *p_script, const String &p_activate_name); + + void editor_select(int p_which); + void set_visible_editor(EditorTable p_table) { editor_select(p_table); } bool call_build(); @@ -720,6 +724,8 @@ public: static HBoxContainer *get_menu_hb() { return singleton->menu_hb; } static VSplitContainer *get_top_split() { return singleton->top_split; } + static String adjust_scene_name_casing(const String &root_name); + static bool has_unsaved_changes() { return singleton->unsaved_cache; } static void disambiguate_filenames(const Vector<String> p_full_paths, Vector<String> &r_filenames); static void add_io_error(const String &p_error); @@ -784,7 +790,7 @@ public: void open_request(const String &p_path); void edit_foreign_resource(Ref<Resource> p_resource); - bool is_resource_read_only(Ref<Resource> p_resource); + bool is_resource_read_only(Ref<Resource> p_resource, bool p_foreign_resources_are_writable = false); bool is_changing_scene() const; diff --git a/editor/editor_plugin.cpp b/editor/editor_plugin.cpp index f3ac8f4ba0..981dad2d2a 100644 --- a/editor/editor_plugin.cpp +++ b/editor/editor_plugin.cpp @@ -972,6 +972,10 @@ void EditorPlugin::_bind_methods() { BIND_ENUM_CONSTANT(DOCK_SLOT_RIGHT_UR); BIND_ENUM_CONSTANT(DOCK_SLOT_RIGHT_BR); BIND_ENUM_CONSTANT(DOCK_SLOT_MAX); + + BIND_ENUM_CONSTANT(AFTER_GUI_INPUT_PASS); + BIND_ENUM_CONSTANT(AFTER_GUI_INPUT_STOP); + BIND_ENUM_CONSTANT(AFTER_GUI_INPUT_CUSTOM); } Ref<EditorUndoRedoManager> EditorPlugin::get_undo_redo() { diff --git a/editor/editor_plugin.h b/editor/editor_plugin.h index fe01524bea..a048b174e4 100644 --- a/editor/editor_plugin.h +++ b/editor/editor_plugin.h @@ -204,7 +204,7 @@ public: enum AfterGUIInput { AFTER_GUI_INPUT_PASS, AFTER_GUI_INPUT_STOP, - AFTER_GUI_INPUT_DESELECT + AFTER_GUI_INPUT_CUSTOM }; //TODO: send a resource for editing to the editor node? @@ -312,6 +312,7 @@ public: VARIANT_ENUM_CAST(EditorPlugin::CustomControlContainer); VARIANT_ENUM_CAST(EditorPlugin::DockSlot); +VARIANT_ENUM_CAST(EditorPlugin::AfterGUIInput); typedef EditorPlugin *(*EditorPluginCreateFunc)(); diff --git a/editor/editor_plugin_settings.cpp b/editor/editor_plugin_settings.cpp index a8df486381..bd19df41fe 100644 --- a/editor/editor_plugin_settings.cpp +++ b/editor/editor_plugin_settings.cpp @@ -46,7 +46,7 @@ void EditorPluginSettings::_notification(int p_what) { } break; case Node::NOTIFICATION_READY: { - plugin_config_dialog->connect("plugin_ready", Callable(EditorNode::get_singleton(), "_on_plugin_ready")); + plugin_config_dialog->connect("plugin_ready", callable_mp(EditorNode::get_singleton(), &EditorNode::_on_plugin_ready)); plugin_list->connect("button_clicked", callable_mp(this, &EditorPluginSettings::_cell_button_pressed)); } break; } diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp index 7364258a07..3b99962435 100644 --- a/editor/editor_properties.cpp +++ b/editor/editor_properties.cpp @@ -1758,7 +1758,7 @@ void EditorPropertyVector2::_value_changed(double val, const String &p_name) { Vector2 v2; v2.x = spin[0]->get_value(); v2.y = spin[1]->get_value(); - emit_changed(get_edited_property(), v2, p_name); + emit_changed(get_edited_property(), v2, linked->is_pressed() ? "" : p_name); } void EditorPropertyVector2::update_property() { @@ -2005,7 +2005,7 @@ void EditorPropertyVector3::_value_changed(double val, const String &p_name) { v3.y = Math::deg_to_rad(v3.y); v3.z = Math::deg_to_rad(v3.z); } - emit_changed(get_edited_property(), v3, p_name); + emit_changed(get_edited_property(), v3, linked->is_pressed() ? "" : p_name); } void EditorPropertyVector3::update_property() { @@ -2171,7 +2171,7 @@ void EditorPropertyVector2i::_value_changed(double val, const String &p_name) { Vector2i v2; v2.x = spin[0]->get_value(); v2.y = spin[1]->get_value(); - emit_changed(get_edited_property(), v2, p_name); + emit_changed(get_edited_property(), v2, linked->is_pressed() ? "" : p_name); } void EditorPropertyVector2i::update_property() { @@ -2413,7 +2413,7 @@ void EditorPropertyVector3i::_value_changed(double val, const String &p_name) { v3.x = spin[0]->get_value(); v3.y = spin[1]->get_value(); v3.z = spin[2]->get_value(); - emit_changed(get_edited_property(), v3, p_name); + emit_changed(get_edited_property(), v3, linked->is_pressed() ? "" : p_name); } void EditorPropertyVector3i::update_property() { diff --git a/editor/editor_properties_array_dict.cpp b/editor/editor_properties_array_dict.cpp index ad84b30689..728a3b0f80 100644 --- a/editor/editor_properties_array_dict.cpp +++ b/editor/editor_properties_array_dict.cpp @@ -268,6 +268,7 @@ void EditorPropertyArray::update_property() { size_slider->set_step(1); size_slider->set_max(1000000); size_slider->set_h_size_flags(SIZE_EXPAND_FILL); + size_slider->set_read_only(is_read_only()); size_slider->connect("value_changed", callable_mp(this, &EditorPropertyArray::_length_changed)); hbox->add_child(size_slider); @@ -278,6 +279,7 @@ void EditorPropertyArray::update_property() { button_add_item = EditorInspector::create_inspector_action_button(TTR("Add Element")); button_add_item->set_icon(get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); button_add_item->connect(SNAME("pressed"), callable_mp(this, &EditorPropertyArray::_add_element)); + button_add_item->set_disabled(is_read_only()); vbox->add_child(button_add_item); paginator = memnew(EditorPaginator); @@ -328,6 +330,7 @@ void EditorPropertyArray::update_property() { Button *reorder_button = memnew(Button); reorder_button->set_icon(get_theme_icon(SNAME("TripleBar"), SNAME("EditorIcons"))); reorder_button->set_default_cursor_shape(Control::CURSOR_MOVE); + reorder_button->set_disabled(is_read_only()); reorder_button->connect("gui_input", callable_mp(this, &EditorPropertyArray::_reorder_button_gui_input)); reorder_button->connect("button_down", callable_mp(this, &EditorPropertyArray::_reorder_button_down).bind(i + offset)); reorder_button->connect("button_up", callable_mp(this, &EditorPropertyArray::_reorder_button_up)); @@ -358,6 +361,7 @@ void EditorPropertyArray::update_property() { prop->connect("property_changed", callable_mp(this, &EditorPropertyArray::_property_changed)); prop->connect("object_id_selected", callable_mp(this, &EditorPropertyArray::_object_id_selected)); prop->set_h_size_flags(SIZE_EXPAND_FILL); + prop->set_read_only(is_read_only()); hbox->add_child(prop); bool is_untyped_array = array.get_type() == Variant::ARRAY && subtype == Variant::NIL; @@ -366,10 +370,12 @@ void EditorPropertyArray::update_property() { Button *edit = memnew(Button); edit->set_icon(get_theme_icon(SNAME("Edit"), SNAME("EditorIcons"))); hbox->add_child(edit); + edit->set_disabled(is_read_only()); edit->connect("pressed", callable_mp(this, &EditorPropertyArray::_change_type).bind(edit, i + offset)); } else { Button *remove = memnew(Button); remove->set_icon(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons"))); + remove->set_disabled(is_read_only()); remove->connect("pressed", callable_mp(this, &EditorPropertyArray::_remove_pressed).bind(i + offset)); hbox->add_child(remove); } @@ -409,6 +415,10 @@ void EditorPropertyArray::_button_draw() { } bool EditorPropertyArray::_is_drop_valid(const Dictionary &p_drag_data) const { + if (is_read_only()) { + return false; + } + String allowed_type = Variant::get_type_name(subtype); // When the subtype is of type Object, an additional subtype may be specified in the hint string @@ -609,7 +619,7 @@ void EditorPropertyArray::setup(Variant::Type p_array_type, const String &p_hint } void EditorPropertyArray::_reorder_button_gui_input(const Ref<InputEvent> &p_event) { - if (reorder_from_index < 0) { + if (reorder_from_index < 0 || is_read_only()) { return; } @@ -646,6 +656,10 @@ void EditorPropertyArray::_reorder_button_gui_input(const Ref<InputEvent> &p_eve } void EditorPropertyArray::_reorder_button_down(int p_index) { + if (is_read_only()) { + return; + } + reorder_from_index = p_index; reorder_to_index = p_index; reorder_selected_element_hbox = Object::cast_to<HBoxContainer>(property_vbox->get_child(p_index % page_length)); @@ -656,6 +670,10 @@ void EditorPropertyArray::_reorder_button_down(int p_index) { } void EditorPropertyArray::_reorder_button_up() { + if (is_read_only()) { + return; + } + if (reorder_from_index != reorder_to_index) { // Move the element. Variant array = object->get_array(); @@ -1097,6 +1115,10 @@ void EditorPropertyDictionary::update_property() { } } + ERR_FAIL_COND(!prop); + + prop->set_read_only(is_read_only()); + if (i == amount) { PanelContainer *pc = memnew(PanelContainer); property_vbox->add_child(pc); @@ -1135,6 +1157,7 @@ void EditorPropertyDictionary::update_property() { prop->set_h_size_flags(SIZE_EXPAND_FILL); Button *edit = memnew(Button); edit->set_icon(get_theme_icon(SNAME("Edit"), SNAME("EditorIcons"))); + edit->set_disabled(is_read_only()); hbox->add_child(edit); edit->connect("pressed", callable_mp(this, &EditorPropertyDictionary::_change_type).bind(edit, change_index)); @@ -1143,6 +1166,7 @@ void EditorPropertyDictionary::update_property() { if (i == amount + 1) { button_add_item = EditorInspector::create_inspector_action_button(TTR("Add Key/Value Pair")); button_add_item->set_icon(get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); + button_add_item->set_disabled(is_read_only()); button_add_item->connect("pressed", callable_mp(this, &EditorPropertyDictionary::_add_key_value)); add_vbox->add_child(button_add_item); } diff --git a/editor/editor_quick_open.cpp b/editor/editor_quick_open.cpp index 539cb7cd8a..b4ec3bca15 100644 --- a/editor/editor_quick_open.cpp +++ b/editor/editor_quick_open.cpp @@ -31,6 +31,7 @@ #include "editor_quick_open.h" #include "core/os/keyboard.h" +#include "editor/editor_node.h" void EditorQuickOpen::popup_dialog(const StringName &p_base, bool p_enable_multi, bool p_dontclear) { base_type = p_base; @@ -57,17 +58,29 @@ void EditorQuickOpen::_build_search_cache(EditorFileSystemDirectory *p_efsd) { Vector<String> base_types = String(base_type).split(String(",")); for (int i = 0; i < p_efsd->get_file_count(); i++) { - String file_type = p_efsd->get_file_type(i); + String file = p_efsd->get_file_path(i); + String engine_type = p_efsd->get_file_type(i); + // TODO: Fix lack of caching for resource's script's global class name (if applicable). + String script_type; + if (_load_resources) { + Ref<Resource> res = ResourceLoader::load(file); + if (res.is_valid()) { + Ref<Script> scr = res->get_script(); + if (scr.is_valid()) { + script_type = scr->get_language()->get_global_class_name(file); + } + } + } + String actual_type = script_type.is_empty() ? engine_type : script_type; // Iterate all possible base types. for (String &parent_type : base_types) { - if (ClassDB::is_parent_class(file_type, parent_type)) { - String file = p_efsd->get_file_path(i); + if (ClassDB::is_parent_class(engine_type, parent_type) || EditorNode::get_editor_data().script_class_is_parent(script_type, parent_type)) { files.push_back(file.substr(6, file.length())); // Store refs to used icons. String ext = file.get_extension(); if (!icons.has(ext)) { - icons.insert(ext, get_theme_icon((has_theme_icon(file_type, SNAME("EditorIcons")) ? file_type : String("Object")), SNAME("EditorIcons"))); + icons.insert(ext, get_theme_icon((has_theme_icon(actual_type, SNAME("EditorIcons")) ? actual_type : String("Object")), SNAME("EditorIcons"))); } // Stop testing base types as soon as we got a match. diff --git a/editor/editor_quick_open.h b/editor/editor_quick_open.h index e41a8c7e75..83cbbd7cac 100644 --- a/editor/editor_quick_open.h +++ b/editor/editor_quick_open.h @@ -43,6 +43,7 @@ class EditorQuickOpen : public ConfirmationDialog { Tree *search_options = nullptr; StringName base_type; bool allow_multi_select = false; + bool _load_resources = false; // Prohibitively slow for now. Vector<String> files; OAHashMap<String, Ref<Texture2D>> icons; diff --git a/editor/editor_resource_picker.cpp b/editor/editor_resource_picker.cpp index 5346052f4d..f89aef4cc3 100644 --- a/editor/editor_resource_picker.cpp +++ b/editor/editor_resource_picker.cpp @@ -53,6 +53,7 @@ void EditorResourcePicker::_update_resource() { if (edited_resource.is_valid() && edited_resource->get_path().is_resource_file()) { resource_path = edited_resource->get_path() + "\n"; } + String class_name = _get_resource_type(edited_resource); if (preview_rect) { preview_rect->set_texture(Ref<Texture2D>()); @@ -64,16 +65,20 @@ void EditorResourcePicker::_update_resource() { assign_button->set_text(TTR("<empty>")); assign_button->set_tooltip_text(""); } else { - assign_button->set_icon(EditorNode::get_singleton()->get_object_icon(edited_resource.operator->(), "Object")); + assign_button->set_icon(EditorNode::get_singleton()->get_object_icon(edited_resource.operator->(), SNAME("Object"))); if (!edited_resource->get_name().is_empty()) { assign_button->set_text(edited_resource->get_name()); } else if (edited_resource->get_path().is_resource_file()) { assign_button->set_text(edited_resource->get_path().get_file()); } else { - assign_button->set_text(edited_resource->get_class()); + assign_button->set_text(class_name); } - assign_button->set_tooltip_text(resource_path + TTR("Type:") + " " + edited_resource->get_class()); + + if (edited_resource->get_path().is_resource_file()) { + resource_path = edited_resource->get_path() + "\n"; + } + assign_button->set_tooltip_text(resource_path + TTR("Type:") + " " + class_name); // Preview will override the above, so called at the end. EditorResourcePreview::get_singleton()->queue_edited_resource_preview(edited_resource, this, "_update_resource_preview", edited_resource->get_instance_id()); @@ -134,16 +139,29 @@ void EditorResourcePicker::_file_selected(const String &p_path) { if (!base_type.is_empty()) { bool any_type_matches = false; + String res_type = loaded_resource->get_class(); + Ref<Script> res_script = loaded_resource->get_script(); + bool is_global_class = false; + if (res_script.is_valid()) { + String script_type = EditorNode::get_editor_data().script_class_get_name(res_script->get_path()); + if (!script_type.is_empty()) { + is_global_class = true; + res_type = script_type; + } + } + for (int i = 0; i < base_type.get_slice_count(","); i++) { String base = base_type.get_slice(",", i); - if (loaded_resource->is_class(base)) { - any_type_matches = true; + + any_type_matches = is_global_class ? EditorNode::get_editor_data().script_class_is_parent(res_type, base) : loaded_resource->is_class(base); + + if (any_type_matches) { break; } } if (!any_type_matches) { - EditorNode::get_singleton()->show_warning(vformat(TTR("The selected resource (%s) does not match any type expected for this property (%s)."), loaded_resource->get_class(), base_type)); + EditorNode::get_singleton()->show_warning(vformat(TTR("The selected resource (%s) does not match any type expected for this property (%s)."), res_type, base_type)); return; } } @@ -186,7 +204,7 @@ void EditorResourcePicker::_update_menu_items() { // Add options for changing existing value of the resource. if (edited_resource.is_valid()) { // Determine if the edited resource is part of another scene (foreign) which was imported - bool is_edited_resource_foreign_import = EditorNode::get_singleton()->is_resource_read_only(edited_resource); + bool is_edited_resource_foreign_import = EditorNode::get_singleton()->is_resource_read_only(edited_resource, true); // If the resource is determined to be foreign and imported, change the menu entry's description to 'inspect' rather than 'edit' // since will only be able to view its properties in read-only mode. @@ -227,16 +245,19 @@ void EditorResourcePicker::_update_menu_items() { // Add options to copy/paste resource. Ref<Resource> cb = EditorSettings::get_singleton()->get_resource_clipboard(); bool paste_valid = false; - if (is_editable()) { - if (cb.is_valid()) { - if (base_type.is_empty()) { - paste_valid = true; - } else { - for (int i = 0; i < base_type.get_slice_count(","); i++) { - if (ClassDB::is_parent_class(cb->get_class(), base_type.get_slice(",", i))) { - paste_valid = true; - break; - } + if (is_editable() && cb.is_valid()) { + if (base_type.is_empty()) { + paste_valid = true; + } else { + String res_type = _get_resource_type(cb); + + for (int i = 0; i < base_type.get_slice_count(","); i++) { + String base = base_type.get_slice(",", i); + + paste_valid = ClassDB::is_parent_class(res_type, base) || EditorNode::get_editor_data().script_class_is_parent(res_type, base); + + if (!paste_valid) { + break; } } } @@ -281,6 +302,9 @@ void EditorResourcePicker::_edit_menu_cbk(int p_which) { for (int i = 0; i < base_type.get_slice_count(","); i++) { String base = base_type.get_slice(",", i); ResourceLoader::get_recognized_extensions_for_type(base, &extensions); + if (ScriptServer::is_global_class(base)) { + ResourceLoader::get_recognized_extensions_for_type(ScriptServer::get_global_class_native_base(base), &extensions); + } } HashSet<String> valid_extensions; @@ -408,13 +432,7 @@ void EditorResourcePicker::_edit_menu_cbk(int p_which) { Variant obj; if (ScriptServer::is_global_class(intype)) { - obj = ClassDB::instantiate(ScriptServer::get_global_class_native_base(intype)); - if (obj) { - Ref<Script> script = ResourceLoader::load(ScriptServer::get_global_class_path(intype)); - if (script.is_valid()) { - ((Object *)obj)->set_script(script); - } - } + obj = EditorNode::get_editor_data().script_class_instance(intype); } else { obj = ClassDB::instantiate(intype); } @@ -512,23 +530,40 @@ void EditorResourcePicker::_button_draw() { void EditorResourcePicker::_button_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid()) { - if (mb->is_pressed() && mb->get_button_index() == MouseButton::RIGHT) { - // Only attempt to update and show the menu if we have - // a valid resource or the Picker is editable, as - // there will otherwise be nothing to display. - if (edited_resource.is_valid() || is_editable()) { - _update_menu_items(); - - Vector2 pos = get_screen_position() + mb->get_position(); - edit_menu->reset_size(); - edit_menu->set_position(pos); - edit_menu->popup(); - } + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::RIGHT) { + // Only attempt to update and show the menu if we have + // a valid resource or the Picker is editable, as + // there will otherwise be nothing to display. + if (edited_resource.is_valid() || is_editable()) { + _update_menu_items(); + + Vector2 pos = get_screen_position() + mb->get_position(); + edit_menu->reset_size(); + edit_menu->set_position(pos); + edit_menu->popup(); } } } +String EditorResourcePicker::_get_resource_type(const Ref<Resource> &p_resource) const { + if (p_resource.is_null()) { + return String(); + } + String res_type = p_resource->get_class(); + + Ref<Script> res_script = p_resource->get_script(); + if (res_script.is_null()) { + return res_type; + } + + // TODO: Replace with EditorFileSystem when PR #60606 is merged to use cached resource type. + String script_type = EditorNode::get_editor_data().script_class_get_name(res_script->get_path()); + if (!script_type.is_empty()) { + res_type = script_type; + } + return res_type; +} + void EditorResourcePicker::_get_allowed_types(bool p_with_convert, HashSet<String> *p_vector) const { Vector<String> allowed_types = base_type.split(","); int size = allowed_types.size(); @@ -550,7 +585,9 @@ void EditorResourcePicker::_get_allowed_types(bool p_with_convert, HashSet<Strin List<StringName> allowed_subtypes; List<StringName> inheriters; - ClassDB::get_inheriters_from_class(base, &inheriters); + if (!ScriptServer::is_global_class(base)) { + ClassDB::get_inheriters_from_class(base, &inheriters); + } for (const StringName &subtype_name : inheriters) { p_vector->insert(subtype_name); allowed_subtypes.push_back(subtype_name); @@ -602,32 +639,29 @@ bool EditorResourcePicker::_is_drop_valid(const Dictionary &p_drag_data) const { } } else if (drag_data.has("type") && String(drag_data["type"]) == "resource") { res = drag_data["resource"]; + } else if (drag_data.has("type") && String(drag_data["type"]) == "files") { + Vector<String> files = drag_data["files"]; + + // TODO: Extract the typename of the dropped filepath's resource in a more performant way, without fully loading it. + if (files.size() == 1) { + String file = files[0]; + res = ResourceLoader::load(file); + } } HashSet<String> allowed_types; _get_allowed_types(true, &allowed_types); - if (res.is_valid() && _is_type_valid(res->get_class(), allowed_types)) { - return true; - } + if (res.is_valid()) { + String res_type = _get_resource_type(res); - if (res.is_valid() && res->get_script()) { - StringName custom_class = EditorNode::get_singleton()->get_object_custom_type_name(res->get_script()); - if (_is_type_valid(custom_class, allowed_types)) { + if (_is_type_valid(res_type, allowed_types)) { return true; } - } - - if (drag_data.has("type") && String(drag_data["type"]) == "files") { - Vector<String> files = drag_data["files"]; - - if (files.size() == 1) { - String file = files[0]; - String file_type = EditorFileSystem::get_singleton()->get_file_type(file); - if (!file_type.is_empty() && _is_type_valid(file_type, allowed_types)) { - return true; - } + StringName custom_class = EditorNode::get_singleton()->get_object_custom_type_name(res.ptr()); + if (_is_type_valid(custom_class, allowed_types)) { + return true; } } @@ -685,8 +719,10 @@ void EditorResourcePicker::drop_data_fw(const Point2 &p_point, const Variant &p_ HashSet<String> allowed_types; _get_allowed_types(false, &allowed_types); + String res_type = _get_resource_type(dropped_resource); + // If the accepted dropped resource is from the extended list, it requires conversion. - if (!_is_type_valid(dropped_resource->get_class(), allowed_types)) { + if (!_is_type_valid(res_type, allowed_types)) { for (const String &E : allowed_types) { String at = E.strip_edges(); diff --git a/editor/editor_resource_picker.h b/editor/editor_resource_picker.h index 3d6127e656..d1a20f04b7 100644 --- a/editor/editor_resource_picker.h +++ b/editor/editor_resource_picker.h @@ -91,6 +91,7 @@ class EditorResourcePicker : public HBoxContainer { void _button_draw(); void _button_input(const Ref<InputEvent> &p_event); + String _get_resource_type(const Ref<Resource> &p_resource) const; void _get_allowed_types(bool p_with_convert, HashSet<String> *p_vector) const; bool _is_drop_valid(const Dictionary &p_drag_data) const; bool _is_type_valid(const String p_type_name, HashSet<String> p_allowed_types) const; diff --git a/editor/editor_run.cpp b/editor/editor_run.cpp index b909129b18..99c8481d33 100644 --- a/editor/editor_run.cpp +++ b/editor/editor_run.cpp @@ -63,7 +63,7 @@ Error EditorRun::run(const String &p_scene, const String &p_write_movie) { args.push_back("--editor-pid"); args.push_back(itos(OS::get_singleton()->get_process_id())); - bool debug_collisions = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_collisons", false); + bool debug_collisions = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_collisions", false); bool debug_paths = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_paths", false); bool debug_navigation = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_navigation", false); if (debug_collisions) { @@ -260,7 +260,7 @@ Error EditorRun::run(const String &p_scene, const String &p_write_movie) { // Pass the debugger stop shortcut to the running instance(s). String shortcut; - VariantWriter::write_to_string(ED_GET_SHORTCUT("editor/stop"), shortcut); + VariantWriter::write_to_string(ED_GET_SHORTCUT("editor/stop_running_project"), shortcut); OS::get_singleton()->set_environment("__GODOT_EDITOR_STOP_SHORTCUT__", shortcut); printf("Running: %s", exec.utf8().get_data()); diff --git a/editor/editor_run_native.cpp b/editor/editor_run_native.cpp index 3e8f17085d..47a9661bcb 100644 --- a/editor/editor_run_native.cpp +++ b/editor/editor_run_native.cpp @@ -134,7 +134,7 @@ Error EditorRunNative::run_native(int p_idx, int p_platform) { bool deploy_debug_remote = is_deploy_debug_remote_enabled(); bool deploy_dumb = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_file_server", false); - bool debug_collisions = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_collisons", false); + bool debug_collisions = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_collisions", false); bool debug_navigation = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_navigation", false); if (deploy_debug_remote) { @@ -144,7 +144,7 @@ Error EditorRunNative::run_native(int p_idx, int p_platform) { flags |= EditorExportPlatform::DEBUG_FLAG_DUMB_CLIENT; } if (debug_collisions) { - flags |= EditorExportPlatform::DEBUG_FLAG_VIEW_COLLISONS; + flags |= EditorExportPlatform::DEBUG_FLAG_VIEW_COLLISIONS; } if (debug_navigation) { flags |= EditorExportPlatform::DEBUG_FLAG_VIEW_NAVIGATION; diff --git a/editor/editor_settings_dialog.cpp b/editor/editor_settings_dialog.cpp index ec67cde112..2c09543d92 100644 --- a/editor/editor_settings_dialog.cpp +++ b/editor/editor_settings_dialog.cpp @@ -416,45 +416,50 @@ void EditorSettingsDialog::_update_shortcuts() { List<String> slist; EditorSettings::get_singleton()->get_shortcut_list(&slist); + slist.sort(); // Sort alphabetically. const EditorPropertyNameProcessor::Style name_style = EditorPropertyNameProcessor::get_settings_style(); const EditorPropertyNameProcessor::Style tooltip_style = EditorPropertyNameProcessor::get_tooltip_style(name_style); + // Create all sections first. for (const String &E : slist) { Ref<Shortcut> sc = EditorSettings::get_singleton()->get_shortcut(E); - if (!sc->has_meta("original")) { + String section_name = E.get_slice("/", 0); + + if (sections.has(section_name)) { continue; } - // Shortcut Section + TreeItem *section = shortcuts->create_item(root); - TreeItem *section; - String section_name = E.get_slice("/", 0); + const String item_name = EditorPropertyNameProcessor::get_singleton()->process_name(section_name, name_style); + const String tooltip = EditorPropertyNameProcessor::get_singleton()->process_name(section_name, tooltip_style); - if (sections.has(section_name)) { - section = sections[section_name]; - } else { - section = shortcuts->create_item(root); - - const String item_name = EditorPropertyNameProcessor::get_singleton()->process_name(section_name, name_style); - const String tooltip = EditorPropertyNameProcessor::get_singleton()->process_name(section_name, tooltip_style); - - section->set_text(0, item_name); - section->set_tooltip_text(0, tooltip); - section->set_selectable(0, false); - section->set_selectable(1, false); - section->set_custom_bg_color(0, shortcuts->get_theme_color(SNAME("prop_subsection"), SNAME("Editor"))); - section->set_custom_bg_color(1, shortcuts->get_theme_color(SNAME("prop_subsection"), SNAME("Editor"))); - - if (collapsed.has(item_name)) { - section->set_collapsed(collapsed[item_name]); - } + section->set_text(0, item_name); + section->set_tooltip_text(0, tooltip); + section->set_selectable(0, false); + section->set_selectable(1, false); + section->set_custom_bg_color(0, shortcuts->get_theme_color(SNAME("prop_subsection"), SNAME("Editor"))); + section->set_custom_bg_color(1, shortcuts->get_theme_color(SNAME("prop_subsection"), SNAME("Editor"))); - sections[section_name] = section; + if (collapsed.has(item_name)) { + section->set_collapsed(collapsed[item_name]); } - // Shortcut Item + sections[section_name] = section; + } + // Add shortcuts to sections. + for (const String &E : slist) { + Ref<Shortcut> sc = EditorSettings::get_singleton()->get_shortcut(E); + if (!sc->has_meta("original")) { + continue; + } + + String section_name = E.get_slice("/", 0); + TreeItem *section = sections[section_name]; + + // Shortcut Item if (!shortcut_filter.is_subsequence_ofn(sc->get_name())) { continue; } @@ -552,6 +557,10 @@ void EditorSettingsDialog::_shortcut_cell_double_clicked() { const ShortcutButton edit_btn_id = EditorSettingsDialog::SHORTCUT_EDIT; const int edit_btn_col = 1; TreeItem *ti = shortcuts->get_selected(); + if (ti == nullptr) { + return; + } + String type = ti->get_meta("type"); int col = shortcuts->get_selected_column(); if (type == "shortcut" && col == 0) { @@ -763,6 +772,7 @@ EditorSettingsDialog::EditorSettingsDialog() { shortcut_editor = memnew(InputEventConfigurationDialog); shortcut_editor->connect("confirmed", callable_mp(this, &EditorSettingsDialog::_event_config_confirmed)); shortcut_editor->set_allowed_input_types(InputEventConfigurationDialog::InputType::INPUT_KEY); + shortcut_editor->set_close_on_escape(false); add_child(shortcut_editor); set_hide_on_ok(true); diff --git a/editor/editor_spin_slider.cpp b/editor/editor_spin_slider.cpp index 4cd046e811..5edb6d877c 100644 --- a/editor/editor_spin_slider.cpp +++ b/editor/editor_spin_slider.cpp @@ -398,7 +398,7 @@ void EditorSpinSlider::_draw_spin_slider() { grabbing_spinner_mouse_pos = get_global_position() + grabber_rect.get_center(); - bool display_grabber = (mouse_over_spin || mouse_over_grabber) && !grabbing_spinner && !(value_input_popup && value_input_popup->is_visible()); + bool display_grabber = (grabbing_grabber || mouse_over_spin || mouse_over_grabber) && !grabbing_spinner && !(value_input_popup && value_input_popup->is_visible()); if (grabber->is_visible() != display_grabber) { if (display_grabber) { grabber->show(); diff --git a/editor/editor_themes.cpp b/editor/editor_themes.cpp index 9e983839f9..f4c1f308cc 100644 --- a/editor/editor_themes.cpp +++ b/editor/editor_themes.cpp @@ -42,10 +42,15 @@ #include "modules/svg/image_loader_svg.h" #endif -HashMap<Color, Color> EditorColorMap::editor_color_map; +HashMap<Color, Color> EditorColorMap::color_conversion_map; +HashSet<StringName> EditorColorMap::color_conversion_exceptions; -void EditorColorMap::add_color_pair(const String p_from_color, const String p_to_color) { - editor_color_map[Color::html(p_from_color)] = Color::html(p_to_color); +void EditorColorMap::add_conversion_color_pair(const String p_from_color, const String p_to_color) { + color_conversion_map[Color::html(p_from_color)] = Color::html(p_to_color); +} + +void EditorColorMap::add_conversion_exception(const StringName p_icon_name) { + color_conversion_exceptions.insert(p_icon_name); } void EditorColorMap::create() { @@ -53,105 +58,139 @@ void EditorColorMap::create() { // This can be a basis for proper palette validation later. // Convert: FROM TO - add_color_pair("#478cbf", "#478cbf"); // Godot Blue - add_color_pair("#414042", "#414042"); // Godot Gray + add_conversion_color_pair("#478cbf", "#478cbf"); // Godot Blue + add_conversion_color_pair("#414042", "#414042"); // Godot Gray - add_color_pair("#ffffff", "#414141"); // Pure white - add_color_pair("#000000", "#bfbfbf"); // Pure black + add_conversion_color_pair("#ffffff", "#414141"); // Pure white + add_conversion_color_pair("#000000", "#bfbfbf"); // Pure black // Keep pure RGB colors as is, but list them for explicitly. - add_color_pair("#ff0000", "#ff0000"); // Pure red - add_color_pair("#00ff00", "#00ff00"); // Pure green - add_color_pair("#0000ff", "#0000ff"); // Pure blue + add_conversion_color_pair("#ff0000", "#ff0000"); // Pure red + add_conversion_color_pair("#00ff00", "#00ff00"); // Pure green + add_conversion_color_pair("#0000ff", "#0000ff"); // Pure blue // GUI Colors - add_color_pair("#e0e0e0", "#5a5a5a"); // Common icon color - add_color_pair("#fefefe", "#fefefe"); // Forced light color - add_color_pair("#808080", "#808080"); // GUI disabled color - add_color_pair("#b3b3b3", "#363636"); // GUI disabled light color - add_color_pair("#699ce8", "#699ce8"); // GUI highlight color - add_color_pair("#f9f9f9", "#606060"); // Scrollbar grabber highlight color - - add_color_pair("#c38ef1", "#a85de9"); // Animation - add_color_pair("#fc7f7f", "#cd3838"); // Spatial - add_color_pair("#8da5f3", "#3d64dd"); // 2D - add_color_pair("#4b70ea", "#1a3eac"); // 2D Dark - add_color_pair("#8eef97", "#2fa139"); // Control - - add_color_pair("#5fb2ff", "#0079f0"); // Selection (blue) - add_color_pair("#003e7a", "#2b74bb"); // Selection (darker blue) - add_color_pair("#f7f5cf", "#615f3a"); // Gizmo (yellow) + add_conversion_color_pair("#e0e0e0", "#5a5a5a"); // Common icon color + add_conversion_color_pair("#fefefe", "#fefefe"); // Forced light color + add_conversion_color_pair("#808080", "#808080"); // GUI disabled color + add_conversion_color_pair("#b3b3b3", "#363636"); // GUI disabled light color + add_conversion_color_pair("#699ce8", "#699ce8"); // GUI highlight color + add_conversion_color_pair("#f9f9f9", "#606060"); // Scrollbar grabber highlight color + + add_conversion_color_pair("#c38ef1", "#a85de9"); // Animation + add_conversion_color_pair("#fc7f7f", "#cd3838"); // Spatial + add_conversion_color_pair("#8da5f3", "#3d64dd"); // 2D + add_conversion_color_pair("#4b70ea", "#1a3eac"); // 2D Dark + add_conversion_color_pair("#8eef97", "#2fa139"); // Control + + add_conversion_color_pair("#5fb2ff", "#0079f0"); // Selection (blue) + add_conversion_color_pair("#003e7a", "#2b74bb"); // Selection (darker blue) + add_conversion_color_pair("#f7f5cf", "#615f3a"); // Gizmo (yellow) // Rainbow - add_color_pair("#ff4545", "#ff2929"); // Red - add_color_pair("#ffe345", "#ffe337"); // Yellow - add_color_pair("#80ff45", "#74ff34"); // Green - add_color_pair("#45ffa2", "#2cff98"); // Aqua - add_color_pair("#45d7ff", "#22ccff"); // Blue - add_color_pair("#8045ff", "#702aff"); // Purple - add_color_pair("#ff4596", "#ff2781"); // Pink + add_conversion_color_pair("#ff4545", "#ff2929"); // Red + add_conversion_color_pair("#ffe345", "#ffe337"); // Yellow + add_conversion_color_pair("#80ff45", "#74ff34"); // Green + add_conversion_color_pair("#45ffa2", "#2cff98"); // Aqua + add_conversion_color_pair("#45d7ff", "#22ccff"); // Blue + add_conversion_color_pair("#8045ff", "#702aff"); // Purple + add_conversion_color_pair("#ff4596", "#ff2781"); // Pink // Audio gradients - add_color_pair("#e1da5b", "#d6cf4b"); // Yellow + add_conversion_color_pair("#e1da5b", "#d6cf4b"); // Yellow - add_color_pair("#62aeff", "#1678e0"); // Frozen gradient top - add_color_pair("#75d1e6", "#41acc5"); // Frozen gradient middle - add_color_pair("#84ffee", "#49ccba"); // Frozen gradient bottom + add_conversion_color_pair("#62aeff", "#1678e0"); // Frozen gradient top + add_conversion_color_pair("#75d1e6", "#41acc5"); // Frozen gradient middle + add_conversion_color_pair("#84ffee", "#49ccba"); // Frozen gradient bottom - add_color_pair("#f70000", "#c91616"); // Color track red - add_color_pair("#eec315", "#d58c0b"); // Color track orange - add_color_pair("#dbee15", "#b7d10a"); // Color track yellow - add_color_pair("#288027", "#218309"); // Color track green + add_conversion_color_pair("#f70000", "#c91616"); // Color track red + add_conversion_color_pair("#eec315", "#d58c0b"); // Color track orange + add_conversion_color_pair("#dbee15", "#b7d10a"); // Color track yellow + add_conversion_color_pair("#288027", "#218309"); // Color track green // Resource groups - add_color_pair("#ffca5f", "#fea900"); // Mesh resource (orange) - add_color_pair("#2998ff", "#68b6ff"); // Shape resource (blue) - add_color_pair("#a2d2ff", "#4998e3"); // Shape resource (light blue) + add_conversion_color_pair("#ffca5f", "#fea900"); // Mesh resource (orange) + add_conversion_color_pair("#2998ff", "#68b6ff"); // Shape resource (blue) + add_conversion_color_pair("#a2d2ff", "#4998e3"); // Shape resource (light blue) // Animation editor tracks // The property track icon color is set by the common icon color. - add_color_pair("#ea7940", "#bd5e2c"); // 3D Position track - add_color_pair("#ff2b88", "#bd165f"); // 3D Rotation track - add_color_pair("#eac840", "#bd9d1f"); // 3D Scale track - add_color_pair("#3cf34e", "#16a827"); // Call Method track - add_color_pair("#2877f6", "#236be6"); // Bezier Curve track - add_color_pair("#eae440", "#9f9722"); // Audio Playback track - add_color_pair("#a448f0", "#9853ce"); // Animation Playback track - add_color_pair("#5ad5c4", "#0a9c88"); // Blend Shape track + add_conversion_color_pair("#ea7940", "#bd5e2c"); // 3D Position track + add_conversion_color_pair("#ff2b88", "#bd165f"); // 3D Rotation track + add_conversion_color_pair("#eac840", "#bd9d1f"); // 3D Scale track + add_conversion_color_pair("#3cf34e", "#16a827"); // Call Method track + add_conversion_color_pair("#2877f6", "#236be6"); // Bezier Curve track + add_conversion_color_pair("#eae440", "#9f9722"); // Audio Playback track + add_conversion_color_pair("#a448f0", "#9853ce"); // Animation Playback track + add_conversion_color_pair("#5ad5c4", "#0a9c88"); // Blend Shape track // Control layouts - add_color_pair("#d6d6d6", "#474747"); // Highlighted part - add_color_pair("#474747", "#d6d6d6"); // Background part - add_color_pair("#919191", "#6e6e6e"); // Border part + add_conversion_color_pair("#d6d6d6", "#474747"); // Highlighted part + add_conversion_color_pair("#474747", "#d6d6d6"); // Background part + add_conversion_color_pair("#919191", "#6e6e6e"); // Border part // TileSet editor icons - add_color_pair("#fce00e", "#aa8d24"); // New Single Tile - add_color_pair("#0e71fc", "#0350bd"); // New Autotile - add_color_pair("#c6ced4", "#828f9b"); // New Atlas + add_conversion_color_pair("#fce00e", "#aa8d24"); // New Single Tile + add_conversion_color_pair("#0e71fc", "#0350bd"); // New Autotile + add_conversion_color_pair("#c6ced4", "#828f9b"); // New Atlas // Visual script - add_color_pair("#41ecad", "#25e3a0"); // VisualScript variant - add_color_pair("#6f91f0", "#6d8eeb"); // VisualScript bool - add_color_pair("#5abbef", "#4fb2e9"); // VisualScript int - add_color_pair("#35d4f4", "#27ccf0"); // VisualScript float - add_color_pair("#4593ec", "#4690e7"); // VisualScript String - add_color_pair("#ac73f1", "#ad76ee"); // VisualScript Vector2 - add_color_pair("#f1738f", "#ee758e"); // VisualScript Rect2 - add_color_pair("#de66f0", "#dc6aed"); // VisualScript Vector3 - add_color_pair("#b9ec41", "#96ce1a"); // VisualScript Transform2D - add_color_pair("#f74949", "#f77070"); // VisualScript Plane - add_color_pair("#ec418e", "#ec69a3"); // VisualScript Quat - add_color_pair("#ee5677", "#ee7991"); // VisualScript AABB - add_color_pair("#e1ec41", "#b2bb19"); // VisualScript Basis - add_color_pair("#f68f45", "#f49047"); // VisualScript Transform - add_color_pair("#417aec", "#6993ec"); // VisualScript NodePath - add_color_pair("#41ec80", "#2ce573"); // VisualScript RID - add_color_pair("#55f3e3", "#12d5c3"); // VisualScript Object - add_color_pair("#54ed9e", "#57e99f"); // VisualScript Dictionary + add_conversion_color_pair("#41ecad", "#25e3a0"); // VisualScript variant + add_conversion_color_pair("#6f91f0", "#6d8eeb"); // VisualScript bool + add_conversion_color_pair("#5abbef", "#4fb2e9"); // VisualScript int + add_conversion_color_pair("#35d4f4", "#27ccf0"); // VisualScript float + add_conversion_color_pair("#4593ec", "#4690e7"); // VisualScript String + add_conversion_color_pair("#ac73f1", "#ad76ee"); // VisualScript Vector2 + add_conversion_color_pair("#f1738f", "#ee758e"); // VisualScript Rect2 + add_conversion_color_pair("#de66f0", "#dc6aed"); // VisualScript Vector3 + add_conversion_color_pair("#b9ec41", "#96ce1a"); // VisualScript Transform2D + add_conversion_color_pair("#f74949", "#f77070"); // VisualScript Plane + add_conversion_color_pair("#ec418e", "#ec69a3"); // VisualScript Quat + add_conversion_color_pair("#ee5677", "#ee7991"); // VisualScript AABB + add_conversion_color_pair("#e1ec41", "#b2bb19"); // VisualScript Basis + add_conversion_color_pair("#f68f45", "#f49047"); // VisualScript Transform + add_conversion_color_pair("#417aec", "#6993ec"); // VisualScript NodePath + add_conversion_color_pair("#41ec80", "#2ce573"); // VisualScript RID + add_conversion_color_pair("#55f3e3", "#12d5c3"); // VisualScript Object + add_conversion_color_pair("#54ed9e", "#57e99f"); // VisualScript Dictionary // Visual shaders - add_color_pair("#77ce57", "#67c046"); // Vector funcs - add_color_pair("#ea686c", "#d95256"); // Vector transforms - add_color_pair("#eac968", "#d9b64f"); // Textures and cubemaps - add_color_pair("#cf68ea", "#c050dd"); // Functions and expressions + add_conversion_color_pair("#77ce57", "#67c046"); // Vector funcs + add_conversion_color_pair("#ea686c", "#d95256"); // Vector transforms + add_conversion_color_pair("#eac968", "#d9b64f"); // Textures and cubemaps + add_conversion_color_pair("#cf68ea", "#c050dd"); // Functions and expressions + + // These icons should not be converted. + add_conversion_exception("EditorPivot"); + add_conversion_exception("EditorHandle"); + add_conversion_exception("Editor3DHandle"); + add_conversion_exception("EditorBoneHandle"); + add_conversion_exception("Godot"); + add_conversion_exception("Sky"); + add_conversion_exception("EditorControlAnchor"); + add_conversion_exception("DefaultProjectIcon"); + add_conversion_exception("GuiChecked"); + add_conversion_exception("GuiRadioChecked"); + add_conversion_exception("GuiIndeterminate"); + add_conversion_exception("GuiCloseCustomizable"); + add_conversion_exception("GuiGraphNodePort"); + add_conversion_exception("GuiResizer"); + add_conversion_exception("ZoomMore"); + add_conversion_exception("ZoomLess"); + add_conversion_exception("ZoomReset"); + add_conversion_exception("LockViewport"); + add_conversion_exception("GroupViewport"); + add_conversion_exception("StatusError"); + add_conversion_exception("StatusSuccess"); + add_conversion_exception("StatusWarning"); + add_conversion_exception("OverbrightIndicator"); + add_conversion_exception("GuiMiniCheckerboard"); + + /// Code Editor. + add_conversion_exception("GuiTab"); + add_conversion_exception("GuiSpace"); + add_conversion_exception("CodeFoldedRightArrow"); + add_conversion_exception("CodeFoldDownArrow"); + add_conversion_exception("TextEditorPlay"); + add_conversion_exception("Breakpoint"); } static Ref<StyleBoxTexture> make_stylebox(Ref<Texture2D> p_texture, float p_left, float p_top, float p_right, float p_bottom, float p_margin_left = -1, float p_margin_top = -1, float p_margin_right = -1, float p_margin_bottom = -1, bool p_draw_center = true) { @@ -191,25 +230,6 @@ static Ref<StyleBoxLine> make_line_stylebox(Color p_color, int p_thickness = 1, return style; } -static Ref<Texture2D> flip_icon(Ref<Texture2D> p_texture, bool p_flip_y = false, bool p_flip_x = false) { - if (!p_flip_y && !p_flip_x) { - return p_texture; - } - - Ref<Image> img = p_texture->get_image(); - ERR_FAIL_NULL_V(img, Ref<Texture2D>()); - img = img->duplicate(); - - if (p_flip_y) { - img->flip_y(); - } - if (p_flip_x) { - img->flip_x(); - } - - return ImageTexture::create_from_image(img); -} - #ifdef MODULE_SVG_ENABLED // See also `generate_icon()` in `scene/resources/default_theme.cpp`. static Ref<ImageTexture> editor_generate_icon(int p_index, float p_scale, float p_saturation, const HashMap<Color, Color> &p_convert_colors = HashMap<Color, Color>()) { @@ -225,67 +245,49 @@ static Ref<ImageTexture> editor_generate_icon(int p_index, float p_scale, float img->adjust_bcs(1.0, 1.0, p_saturation); } - // In this case filter really helps. return ImageTexture::create_from_image(img); } #endif -void editor_register_and_generate_icons(Ref<Theme> p_theme, bool p_dark_theme = true, int p_thumb_size = 32, bool p_only_thumbs = false, float p_icon_saturation = 1.0) { +void editor_register_and_generate_icons(Ref<Theme> p_theme, bool p_dark_theme, float p_icon_saturation, int p_thumb_size, bool p_only_thumbs = false) { #ifdef MODULE_SVG_ENABLED - HashMap<Color, Color> icon_color_map; - - // The names of the icons to never convert, even if one of their colors - // are contained in the dictionary above. - HashSet<StringName> exceptions; - + // Before we register the icons, we adjust their colors and saturation. + // Most icons follow the standard rules for color conversion to follow the editor + // theme's polarity (dark/light). We also adjust the saturation for most icons, + // following the editor setting. + // Some icons are excluded from this conversion, and instead use the configured + // accent color to replace their innate accent color to match the editor theme. + // And then some icons are completely excluded from the conversion. + + // Standard color conversion map. + HashMap<Color, Color> color_conversion_map; + // Icons by default are set up for the dark theme, so if the theme is light, + // we apply the dark-to-light color conversion map. if (!p_dark_theme) { - for (KeyValue<Color, Color> &E : EditorColorMap::get()) { - icon_color_map[E.key] = E.value; + for (KeyValue<Color, Color> &E : EditorColorMap::get_color_conversion_map()) { + color_conversion_map[E.key] = E.value; } - - exceptions.insert("EditorPivot"); - exceptions.insert("EditorHandle"); - exceptions.insert("Editor3DHandle"); - exceptions.insert("EditorBoneHandle"); - exceptions.insert("Godot"); - exceptions.insert("Sky"); - exceptions.insert("EditorControlAnchor"); - exceptions.insert("DefaultProjectIcon"); - exceptions.insert("GuiChecked"); - exceptions.insert("GuiRadioChecked"); - exceptions.insert("GuiIndeterminate"); - exceptions.insert("GuiCloseCustomizable"); - exceptions.insert("GuiGraphNodePort"); - exceptions.insert("GuiResizer"); - exceptions.insert("ZoomMore"); - exceptions.insert("ZoomLess"); - exceptions.insert("ZoomReset"); - exceptions.insert("LockViewport"); - exceptions.insert("GroupViewport"); - exceptions.insert("StatusError"); - exceptions.insert("StatusSuccess"); - exceptions.insert("StatusWarning"); - exceptions.insert("OverbrightIndicator"); - exceptions.insert("GuiMiniCheckerboard"); - - // Prevents Code Editor icons from changing - exceptions.insert("GuiTab"); - exceptions.insert("GuiSpace"); - exceptions.insert("CodeFoldedRightArrow"); - exceptions.insert("CodeFoldDownArrow"); - exceptions.insert("TextEditorPlay"); - exceptions.insert("Breakpoint"); } - - // These ones should be converted even if we are using a dark theme. + // These colors should be converted even if we are using a dark theme. const Color error_color = p_theme->get_color(SNAME("error_color"), SNAME("Editor")); const Color success_color = p_theme->get_color(SNAME("success_color"), SNAME("Editor")); const Color warning_color = p_theme->get_color(SNAME("warning_color"), SNAME("Editor")); - icon_color_map[Color::html("#ff5f5f")] = error_color; - icon_color_map[Color::html("#5fff97")] = success_color; - icon_color_map[Color::html("#ffdd65")] = warning_color; - - // Use the accent color for some icons (checkbox, radio, toggle, etc.). + color_conversion_map[Color::html("#ff5f5f")] = error_color; + color_conversion_map[Color::html("#5fff97")] = success_color; + color_conversion_map[Color::html("#ffdd65")] = warning_color; + + // The names of the icons to exclude from the standard color conversion. + HashSet<StringName> conversion_exceptions = EditorColorMap::get_color_conversion_exceptions(); + + // The names of the icons to exclude when adjusting for saturation. + HashSet<StringName> saturation_exceptions; + saturation_exceptions.insert("DefaultProjectIcon"); + saturation_exceptions.insert("Godot"); + saturation_exceptions.insert("Logo"); + + // Accent color conversion map. + // It is used on some icons (checkbox, radio, toggle, etc.), regardless of the dark + // or light mode. HashMap<Color, Color> accent_color_map; HashSet<StringName> accent_color_icons; @@ -311,16 +313,14 @@ void editor_register_and_generate_icons(Ref<Theme> p_theme, bool p_dark_theme = icon = editor_generate_icon(i, EDSCALE, 1.0, accent_color_map); } else { float saturation = p_icon_saturation; - - if (strcmp(editor_icons_names[i], "DefaultProjectIcon") == 0 || strcmp(editor_icons_names[i], "Godot") == 0 || strcmp(editor_icons_names[i], "Logo") == 0) { + if (saturation_exceptions.has(editor_icons_names[i])) { saturation = 1.0; } - const int is_exception = exceptions.has(editor_icons_names[i]); - if (is_exception) { + if (conversion_exceptions.has(editor_icons_names[i])) { icon = editor_generate_icon(i, EDSCALE, saturation); } else { - icon = editor_generate_icon(i, EDSCALE, saturation, icon_color_map); + icon = editor_generate_icon(i, EDSCALE, saturation, color_conversion_map); } } @@ -329,19 +329,26 @@ void editor_register_and_generate_icons(Ref<Theme> p_theme, bool p_dark_theme = } // Generate thumbnail icons with the given thumbnail size. - // We don't need filtering when generating at one of the default resolutions. - const bool force_filter = p_thumb_size != 64 && p_thumb_size != 32; + // See editor\icons\editor_icons_builders.py for the code that determines which icons are thumbnails. if (p_thumb_size >= 64) { const float scale = (float)p_thumb_size / 64.0 * EDSCALE; for (int i = 0; i < editor_bg_thumbs_count; i++) { const int index = editor_bg_thumbs_indices[i]; - const int is_exception = exceptions.has(editor_icons_names[index]); - Ref<ImageTexture> icon; - if (!p_dark_theme && !is_exception) { - icon = editor_generate_icon(index, scale, force_filter, icon_color_map); + + if (accent_color_icons.has(editor_icons_names[index])) { + icon = editor_generate_icon(index, scale, 1.0, accent_color_map); } else { - icon = editor_generate_icon(index, scale, force_filter); + float saturation = p_icon_saturation; + if (saturation_exceptions.has(editor_icons_names[index])) { + saturation = 1.0; + } + + if (conversion_exceptions.has(editor_icons_names[index])) { + icon = editor_generate_icon(index, scale, saturation); + } else { + icon = editor_generate_icon(index, scale, saturation, color_conversion_map); + } } p_theme->set_icon(editor_icons_names[index], SNAME("EditorIcons"), icon); @@ -350,13 +357,21 @@ void editor_register_and_generate_icons(Ref<Theme> p_theme, bool p_dark_theme = const float scale = (float)p_thumb_size / 32.0 * EDSCALE; for (int i = 0; i < editor_md_thumbs_count; i++) { const int index = editor_md_thumbs_indices[i]; - const bool is_exception = exceptions.has(editor_icons_names[index]); - Ref<ImageTexture> icon; - if (!p_dark_theme && !is_exception) { - icon = editor_generate_icon(index, scale, force_filter, icon_color_map); + + if (accent_color_icons.has(editor_icons_names[index])) { + icon = editor_generate_icon(index, scale, 1.0, accent_color_map); } else { - icon = editor_generate_icon(index, scale, force_filter); + float saturation = p_icon_saturation; + if (saturation_exceptions.has(editor_icons_names[index])) { + saturation = 1.0; + } + + if (conversion_exceptions.has(editor_icons_names[index])) { + icon = editor_generate_icon(index, scale, saturation); + } else { + icon = editor_generate_icon(index, scale, saturation, color_conversion_map); + } } p_theme->set_icon(editor_icons_names[index], SNAME("EditorIcons"), icon); @@ -447,6 +462,14 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { // Colors bool dark_theme = EditorSettings::get_singleton()->is_dark_theme(); +#ifdef MODULE_SVG_ENABLED + if (dark_theme) { + ImageLoaderSVG::set_forced_color_map(HashMap<Color, Color>()); + } else { + ImageLoaderSVG::set_forced_color_map(EditorColorMap::get_color_conversion_map()); + } +#endif + // Ensure base colors are in the 0..1 luminance range to avoid 8-bit integer overflow or text rendering issues. // Some places in the editor use 8-bit integer colors. const Color dark_color_1 = base_color.lerp(Color(0, 0, 0, 1), contrast).clamp(); @@ -486,9 +509,8 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { const Color highlight_color = Color(accent_color.r, accent_color.g, accent_color.b, 0.275); const Color disabled_highlight_color = highlight_color.lerp(dark_theme ? Color(0, 0, 0) : Color(1, 1, 1), 0.5); - float prev_icon_saturation = theme->has_color(SNAME("icon_saturation"), SNAME("Editor")) ? theme->get_color(SNAME("icon_saturation"), SNAME("Editor")).r : 1.0; - - theme->set_color("icon_saturation", "Editor", Color(icon_saturation, icon_saturation, icon_saturation)); // can't save single float in theme, so using color + // Can't save single float in theme, so using Color. + theme->set_color("icon_saturation", "Editor", Color(icon_saturation, icon_saturation, icon_saturation)); theme->set_color("accent_color", "Editor", accent_color); theme->set_color("highlight_color", "Editor", highlight_color); theme->set_color("disabled_highlight_color", "Editor", disabled_highlight_color); @@ -529,7 +551,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { Color readonly_warning_color = error_color.lerp(dark_theme ? Color(0, 0, 0) : Color(1, 1, 1), 0.25); if (!dark_theme) { - // Darken some colors to be readable on a light background + // Darken some colors to be readable on a light background. success_color = success_color.lerp(mono_color, 0.35); warning_color = warning_color.lerp(mono_color, 0.35); error_color = error_color.lerp(mono_color, 0.25); @@ -552,22 +574,43 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_constant("dark_theme", "Editor", dark_theme); theme->set_constant("color_picker_button_height", "Editor", 28 * EDSCALE); - // Register icons + font + // Register editor icons. + // If the settings are comparable to the old theme, then just copy them over. + // Otherwise, regenerate them. Also check if we need to regenerate "thumb" icons. + bool keep_old_icons = false; + bool regenerate_thumb_icons = true; + if (p_theme != nullptr) { + // We check editor scale, theme dark/light mode, icon saturation, and accent color. + + // That doesn't really work as expected, since theme constants are integers, and scales are floats. + // So this check will never work when changing between 100-199% values. + const float prev_scale = (float)p_theme->get_constant(SNAME("scale"), SNAME("Editor")); + const bool prev_dark_theme = (bool)p_theme->get_constant(SNAME("dark_theme"), SNAME("Editor")); + const Color prev_accent_color = p_theme->get_color(SNAME("accent_color"), SNAME("Editor")); + const float prev_icon_saturation = p_theme->get_color(SNAME("icon_saturation"), SNAME("Editor")).r; + + keep_old_icons = (Math::is_equal_approx(prev_scale, EDSCALE) && + prev_dark_theme == dark_theme && + prev_accent_color == accent_color && + prev_icon_saturation == icon_saturation); + + const double prev_thumb_size = (double)p_theme->get_constant(SNAME("thumb_size"), SNAME("Editor")); + + regenerate_thumb_icons = !Math::is_equal_approx(prev_thumb_size, thumb_size); + } - // The editor scale, icon color (dark_theme bool), icon saturation, and accent color has not changed, so we do not regenerate the icons. - if (p_theme != nullptr && fabs(p_theme->get_constant(SNAME("scale"), SNAME("Editor")) - EDSCALE) < 0.00001 && (bool)p_theme->get_constant(SNAME("dark_theme"), SNAME("Editor")) == dark_theme && prev_icon_saturation == icon_saturation && p_theme->get_color(SNAME("accent_color"), SNAME("Editor")) == accent_color) { - // Register already generated icons. + if (keep_old_icons) { for (int i = 0; i < editor_icons_count; i++) { theme->set_icon(editor_icons_names[i], SNAME("EditorIcons"), p_theme->get_icon(editor_icons_names[i], SNAME("EditorIcons"))); } } else { - editor_register_and_generate_icons(theme, dark_theme, thumb_size, false, icon_saturation); + editor_register_and_generate_icons(theme, dark_theme, icon_saturation, thumb_size, false); } - // Thumbnail size has changed, so we regenerate the medium sizes - if (p_theme != nullptr && fabs((double)p_theme->get_constant(SNAME("thumb_size"), SNAME("Editor")) - thumb_size) > 0.00001) { - editor_register_and_generate_icons(p_theme, dark_theme, thumb_size, true); + if (regenerate_thumb_icons) { + editor_register_and_generate_icons(theme, dark_theme, icon_saturation, thumb_size, true); } + // Register editor fonts. editor_register_fonts(theme); // Ensure borders are visible when using an editor scale below 100%. @@ -1559,14 +1602,13 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_stylebox("camera", "GraphEditMinimap", style_minimap_camera); theme->set_stylebox("node", "GraphEditMinimap", style_minimap_node); - Ref<Texture2D> minimap_resizer_icon = theme->get_icon(SNAME("GuiResizer"), SNAME("EditorIcons")); Color minimap_resizer_color; if (dark_theme) { minimap_resizer_color = Color(1, 1, 1, 0.65); } else { minimap_resizer_color = Color(0, 0, 0, 0.65); } - theme->set_icon("resizer", "GraphEditMinimap", flip_icon(minimap_resizer_icon, true, true)); + theme->set_icon("resizer", "GraphEditMinimap", theme->get_icon(SNAME("GuiResizerTopLeft"), SNAME("EditorIcons"))); theme->set_color("resizer_color", "GraphEditMinimap", minimap_resizer_color); // GraphNode diff --git a/editor/editor_themes.h b/editor/editor_themes.h index 37db8160fa..da5db95d0e 100644 --- a/editor/editor_themes.h +++ b/editor/editor_themes.h @@ -39,13 +39,18 @@ class EditorColorMap { // Godot Color values are used to avoid the ambiguity of strings // (where "#ffffff", "fff", and "white" are all equivalent). - static HashMap<Color, Color> editor_color_map; + static HashMap<Color, Color> color_conversion_map; + // The names of the icons to never convert, even if one of their colors + // are contained in the color map from above. + static HashSet<StringName> color_conversion_exceptions; public: static void create(); - static void add_color_pair(const String p_from_color, const String p_to_color); + static void add_conversion_color_pair(const String p_from_color, const String p_to_color); + static void add_conversion_exception(const StringName p_icon_name); - static HashMap<Color, Color> &get() { return editor_color_map; }; + static HashMap<Color, Color> &get_color_conversion_map() { return color_conversion_map; }; + static HashSet<StringName> &get_color_conversion_exceptions() { return color_conversion_exceptions; }; }; Ref<Theme> create_editor_theme(Ref<Theme> p_theme = nullptr); diff --git a/editor/editor_undo_redo_manager.cpp b/editor/editor_undo_redo_manager.cpp index eca2b3143b..064448fd96 100644 --- a/editor/editor_undo_redo_manager.cpp +++ b/editor/editor_undo_redo_manager.cpp @@ -124,19 +124,19 @@ void EditorUndoRedoManager::create_action(const String &p_name, UndoRedo::MergeM create_action_for_history(p_name, INVALID_HISTORY, p_mode); if (p_custom_context) { - // This assigns context to pending action. + // This assigns history to pending action. get_history_for_object(p_custom_context); } } void EditorUndoRedoManager::add_do_methodp(Object *p_object, const StringName &p_method, const Variant **p_args, int p_argcount) { UndoRedo *undo_redo = get_history_for_object(p_object).undo_redo; - undo_redo->add_do_methodp(p_object, p_method, p_args, p_argcount); + undo_redo->add_do_method(Callable(p_object, p_method).bindp(p_args, p_argcount)); } void EditorUndoRedoManager::add_undo_methodp(Object *p_object, const StringName &p_method, const Variant **p_args, int p_argcount) { UndoRedo *undo_redo = get_history_for_object(p_object).undo_redo; - undo_redo->add_undo_methodp(p_object, p_method, p_args, p_argcount); + undo_redo->add_undo_method(Callable(p_object, p_method).bindp(p_args, p_argcount)); } void EditorUndoRedoManager::_add_do_method(const Variant **p_args, int p_argcount, Callable::CallError &r_error) { @@ -218,7 +218,10 @@ void EditorUndoRedoManager::add_undo_reference(Object *p_object) { } void EditorUndoRedoManager::commit_action(bool p_execute) { - ERR_FAIL_COND(pending_action.history_id == INVALID_HISTORY); + if (pending_action.history_id == INVALID_HISTORY) { + return; // Empty action, do nothing. + } + is_committing = true; History &history = get_or_create_history(pending_action.history_id); diff --git a/editor/export/editor_export_platform.cpp b/editor/export/editor_export_platform.cpp index 2a444bb04f..c86114a140 100644 --- a/editor/export/editor_export_platform.cpp +++ b/editor/export/editor_export_platform.cpp @@ -77,7 +77,7 @@ bool EditorExportPlatform::fill_log_messages(RichTextLabel *p_log, Error p_err) } else { p_log->add_image(EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("StatusSuccess"), SNAME("EditorIcons")), 16 * EDSCALE, 16 * EDSCALE, Color(1.0, 1.0, 1.0), INLINE_ALIGNMENT_CENTER); p_log->add_text(" "); - p_log->add_text(TTR("Completed sucessfully.")); + p_log->add_text(TTR("Completed successfully.")); if (msg_count > 0) { has_messages = true; } @@ -176,7 +176,7 @@ void EditorExportPlatform::gen_debug_flags(Vector<String> &r_flags, int p_flags) } } - if (p_flags & DEBUG_FLAG_VIEW_COLLISONS) { + if (p_flags & DEBUG_FLAG_VIEW_COLLISIONS) { r_flags.push_back("--debug-collisions"); } @@ -710,7 +710,7 @@ String EditorExportPlatform::_export_customize(const String &p_path, LocalVector if (type == "PackedScene") { // Its a scene. Ref<PackedScene> ps = ResourceLoader::load(p_path, "PackedScene", ResourceFormatLoader::CACHE_MODE_IGNORE); ERR_FAIL_COND_V(ps.is_null(), p_path); - Node *node = ps->instantiate(); + Node *node = ps->instantiate(PackedScene::GEN_EDIT_STATE_INSTANCE); // Make sure the child scene root gets the correct inheritance chain. ERR_FAIL_COND_V(node == nullptr, p_path); if (customize_scenes_plugins.size()) { for (uint32_t i = 0; i < customize_scenes_plugins.size(); i++) { @@ -1609,7 +1609,7 @@ void EditorExportPlatform::gen_export_flags(Vector<String> &r_flags, int p_flags } } - if (p_flags & DEBUG_FLAG_VIEW_COLLISONS) { + if (p_flags & DEBUG_FLAG_VIEW_COLLISIONS) { r_flags.push_back("--debug-collisions"); } @@ -1619,21 +1619,24 @@ void EditorExportPlatform::gen_export_flags(Vector<String> &r_flags, int p_flags } bool EditorExportPlatform::can_export(const Ref<EditorExportPreset> &p_preset, String &r_error, bool &r_missing_templates) const { + bool valid = true; +#ifndef ANDROID_ENABLED String templates_error; - bool valid_export_configuration = has_valid_export_configuration(p_preset, templates_error, r_missing_templates); - - String project_configuration_error; - bool valid_project_configuration = has_valid_project_configuration(p_preset, project_configuration_error); + valid = valid && has_valid_export_configuration(p_preset, templates_error, r_missing_templates); if (!templates_error.is_empty()) { r_error += templates_error; } +#endif + + String project_configuration_error; + valid = valid && has_valid_project_configuration(p_preset, project_configuration_error); if (!project_configuration_error.is_empty()) { r_error += project_configuration_error; } - return valid_export_configuration && valid_project_configuration; + return valid; } EditorExportPlatform::EditorExportPlatform() { diff --git a/editor/export/editor_export_platform.h b/editor/export/editor_export_platform.h index 93bc54284f..88dc7bd5cd 100644 --- a/editor/export/editor_export_platform.h +++ b/editor/export/editor_export_platform.h @@ -210,7 +210,7 @@ public: DEBUG_FLAG_DUMB_CLIENT = 1, DEBUG_FLAG_REMOTE_DEBUG = 2, DEBUG_FLAG_REMOTE_DEBUG_LOCALHOST = 4, - DEBUG_FLAG_VIEW_COLLISONS = 8, + DEBUG_FLAG_VIEW_COLLISIONS = 8, DEBUG_FLAG_VIEW_NAVIGATION = 16, }; diff --git a/editor/export/project_export.cpp b/editor/export/project_export.cpp index 00a0e08d3a..43aac5e981 100644 --- a/editor/export/project_export.cpp +++ b/editor/export/project_export.cpp @@ -865,10 +865,10 @@ void ProjectExportDialog::_validate_export_path(const String &p_path) { if (invalid_path) { export_project->get_ok_button()->set_disabled(true); - export_project->get_line_edit()->disconnect("text_submitted", Callable(export_project, "_file_submitted")); + export_project->get_line_edit()->disconnect("text_submitted", callable_mp(export_project, &EditorFileDialog::_file_submitted)); } else { export_project->get_ok_button()->set_disabled(false); - export_project->get_line_edit()->connect("text_submitted", Callable(export_project, "_file_submitted")); + export_project->get_line_edit()->connect("text_submitted", callable_mp(export_project, &EditorFileDialog::_file_submitted)); } } @@ -901,9 +901,9 @@ void ProjectExportDialog::_export_project() { // with _validate_export_path. // FIXME: This is a hack, we should instead change EditorFileDialog to allow // disabling validation by the "text_submitted" signal. - if (!export_project->get_line_edit()->is_connected("text_submitted", Callable(export_project, "_file_submitted"))) { + if (!export_project->get_line_edit()->is_connected("text_submitted", callable_mp(export_project, &EditorFileDialog::_file_submitted))) { export_project->get_ok_button()->set_disabled(false); - export_project->get_line_edit()->connect("text_submitted", Callable(export_project, "_file_submitted")); + export_project->get_line_edit()->connect("text_submitted", callable_mp(export_project, &EditorFileDialog::_file_submitted)); } export_project->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE); @@ -932,8 +932,10 @@ void ProjectExportDialog::_export_project_to_path(const String &p_path) { } void ProjectExportDialog::_export_all_dialog() { +#ifndef ANDROID_ENABLED export_all_dialog->show(); export_all_dialog->popup_centered(Size2(300, 80)); +#endif } void ProjectExportDialog::_export_all_dialog_action(const String &p_str) { @@ -1194,11 +1196,16 @@ ProjectExportDialog::ProjectExportDialog() { set_cancel_button_text(TTR("Close")); set_ok_button_text(TTR("Export PCK/ZIP...")); + get_ok_button()->set_disabled(true); +#ifdef ANDROID_ENABLED + export_button = memnew(Button); + export_button->hide(); +#else export_button = add_button(TTR("Export Project..."), !DisplayServer::get_singleton()->get_swap_cancel_ok(), "export"); +#endif export_button->connect("pressed", callable_mp(this, &ProjectExportDialog::_export_project)); // Disable initially before we select a valid preset export_button->set_disabled(true); - get_ok_button()->set_disabled(true); export_all_dialog = memnew(ConfirmationDialog); add_child(export_all_dialog); @@ -1208,8 +1215,14 @@ ProjectExportDialog::ProjectExportDialog() { export_all_dialog->add_button(TTR("Debug"), true, "debug"); export_all_dialog->add_button(TTR("Release"), true, "release"); export_all_dialog->connect("custom_action", callable_mp(this, &ProjectExportDialog::_export_all_dialog_action)); +#ifdef ANDROID_ENABLED + export_all_dialog->hide(); + export_all_button = memnew(Button); + export_all_button->hide(); +#else export_all_button = add_button(TTR("Export All..."), !DisplayServer::get_singleton()->get_swap_cancel_ok(), "export"); +#endif export_all_button->connect("pressed", callable_mp(this, &ProjectExportDialog::_export_all_dialog)); export_all_button->set_disabled(true); diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp index 19b4932d3d..424eab2f02 100644 --- a/editor/filesystem_dock.cpp +++ b/editor/filesystem_dock.cpp @@ -1751,22 +1751,7 @@ void FileSystemDock::_tree_rmb_option(int p_option) { case FOLDER_COLLAPSE_ALL: { // Expand or collapse the folder if (selected_strings.size() == 1) { - bool is_collapsed = (p_option == FOLDER_COLLAPSE_ALL); - - Vector<TreeItem *> needs_check; - needs_check.push_back(tree->get_selected()); - - while (needs_check.size()) { - needs_check[0]->set_collapsed(is_collapsed); - - TreeItem *child = needs_check[0]->get_first_child(); - while (child) { - needs_check.push_back(child); - child = child->get_next(); - } - - needs_check.remove_at(0); - } + tree->get_selected()->set_collapsed_recursive(p_option == FOLDER_COLLAPSE_ALL); } } break; default: { diff --git a/editor/icons/GuiResizerTopLeft.svg b/editor/icons/GuiResizerTopLeft.svg new file mode 100644 index 0000000000..a67c2c0722 --- /dev/null +++ b/editor/icons/GuiResizerTopLeft.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 12c.55228 0 1-.44772 1-1v-6h6c.55228 0 1-.44772 1-1s-.44772-1-1-1h-7c-.55226.000055-.99994.44774-1 1v7c0 .55228.44772 1 1 1z" fill="#fff" fill-opacity=".58824"/></svg> diff --git a/editor/icons/MemberAnnotation.svg b/editor/icons/MemberAnnotation.svg index c73ebf7b9b..39bef6d9ee 100644 --- a/editor/icons/MemberAnnotation.svg +++ b/editor/icons/MemberAnnotation.svg @@ -1 +1 @@ -<svg width="16" height="16" version="1.0" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><script id="custom-useragent-string-page-script"/><path d="m13.821 12.756c-5.0033 3.9148-12.551 2.248-12.49-4.538 0.67424-11.471 17.312-7.4502 12.446 2.1173-1.0549 1.1955-2.0737 1.4617-3.1983 0.4329-0.21023-0.19282-0.44783-1.1594-0.3819-1.5089 0.35827-1.8946 1.0885-4.0778-0.72151-4.7234-2.4171-0.86457-4.5592 1.6495-4.9697 4.0193-0.47396 2.7343 2.284 3.3749 4.1487 1.9879 0.4553-0.36324 1.6433-1.3796 1.6806-1.9742" fill="none" stroke="#e0e0e0" stroke-linejoin="round" stroke-width="1.4928"/></svg> +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m13.821 12.756c-5.0033 3.9148-12.551 2.248-12.49-4.538.67424-11.471 17.312-7.4502 12.446 2.1173-1.0549 1.1955-2.0737 1.4617-3.1983.4329-.21023-.19282-.44783-1.1594-.3819-1.5089.35827-1.8946 1.0885-4.0778-.72151-4.7234-2.4171-.86457-4.5592 1.6495-4.9697 4.0193-.47396 2.7343 2.284 3.3749 4.1487 1.9879.4553-.36324 1.6433-1.3796 1.6806-1.9742" fill="none" stroke="#e0e0e0" stroke-linejoin="round" stroke-width="1.4928"/></svg> diff --git a/editor/icons/MethodOverride.svg b/editor/icons/MethodOverride.svg new file mode 100644 index 0000000000..004b9bf283 --- /dev/null +++ b/editor/icons/MethodOverride.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 4.2333332 4.2333332" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m.49005985 3.3580432.83285685-.0000001v-.7093212c.0027125-.6681099.2054076-1.1321001 1.0021593-1.1328214h.3207573v-.79375l1.3229167 1.0648649-1.3229167 1.0518017v-.79375h-.3364788c-.2888876 0-.4514151.2436282-.4573001.5980603 0 .2833012.0000193.4455045.0000289.7134508h.79375v.4907171l-2.15577345.00147z" fill="#5fb2ff"/></svg> diff --git a/editor/icons/MethodOverrideAndSlot.svg b/editor/icons/MethodOverrideAndSlot.svg new file mode 100644 index 0000000000..d3bd9f0253 --- /dev/null +++ b/editor/icons/MethodOverrideAndSlot.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 4.2333332 4.2333332" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m.15761184 3.636193h.37155483l.004252-.7093212c.0027092-.6681099.12999225-1.1321001.92674393-1.1328214h.1273374l.0042585-.7357171 1.3186582 1.006832-1.3229167 1.0700676v-.8531081h-.1260545c-.2888876 0-.3972562.2847204-.4031411.6391525 0 .2833012.0000193.4455045.0000289.7134508h1.2412654v.4907171h-2.14198686z" fill="#5fb2ff"/><path d="m2.38125.79375h1.5875v2.6458333h-1.5875v-.5291666h1.0583333v-1.5875h-1.0583333z" fill="#5fff97"/></svg> diff --git a/editor/icons/PreviewEnvironment.svg b/editor/icons/PreviewEnvironment.svg new file mode 100644 index 0000000000..e0b0257daf --- /dev/null +++ b/editor/icons/PreviewEnvironment.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm-1.7305 2.3125c-.83125 1.5372-1.2685 3.1037-1.2695 4.6816-.64057-.11251-1.3005-.27158-1.9766-.47266a5 5 0 0 1 3.2461-4.209zm3.4629.00391a5 5 0 0 1 3.2383 4.1875c-.65187.17448-1.3077.32867-1.9727.44922-.0084-1.5627-.44294-3.1141-1.2656-4.6367zm-1.7324.0078088c1.0126 1.593 1.5 3.1425 1.5 4.6758 0 .054042-.00662.10803-.00781.16211-.96392.096801-1.9566.1103-2.9844.027344-.00163-.063192-.00781-.12632-.00781-.18945 0-1.5333.48744-3.0828 1.5-4.6758zm4.8789 5.7578a5 5 0 0 1 -3.1484 3.6055002c.57106-1.0564.95277-2.1268 1.1367-3.2051002.68204-.10905 1.3556-.23789 2.0117-.40039zm-9.7461.033203c.68377.18153 1.3555.33345 2.0098.43164.18781 1.0551002.56647 2.1026002 1.125 3.1367002a5 5 0 0 1 -3.1348-3.5684002zm6.168.55469c-.22615.9886602-.65424 1.9884002-1.3008 3.0059002-.63811-1.0042-1.0645-1.9908-1.293-2.9668002.89027.054126 1.7517.029377 2.5938-.039062z"/><path d="m8 1v2.3242c1.0126 1.593 1.5 3.1425 1.5 4.6758 0 .054042-.00662.10803-.00781.16211-.4894.049148-.98713.077552-1.4922.082031v1.4922c.43915-.0076.87287-.031628 1.3008-.066406-.22615.98866-.65424 1.9884-1.3008 3.0059v2.3242a7 7 0 0 0 7.000001-7 7 7 0 0 0 -7.000001-7zm1.7324 2.3164a5 5 0 0 1 3.2383 4.1875c-.65187.17448-1.3077.32867-1.9727.44922-.00845-1.5627-.44294-3.1141-1.2656-4.6367zm3.1465 5.7656a5 5 0 0 1 -3.1484 3.6055c.57106-1.0564.95277-2.1268 1.1367-3.2051.68204-.10905 1.3556-.23789 2.0117-.40039z"/></g></svg> diff --git a/editor/icons/PreviewSun.svg b/editor/icons/PreviewSun.svg new file mode 100644 index 0000000000..a8c652be65 --- /dev/null +++ b/editor/icons/PreviewSun.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v3h2v-3zm-2.5352 2.0508-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm7.0703 0-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm-3.5352 1.9492c-1.6569 0-3 1.3432-3 3s1.3431 3 3 3 3-1.3432 3-3-1.3431-3-3-3zm-7 2v2h3v-2zm11 0v2h3v-2zm-7.5352 3.1211-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm7.0703 0-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm-4.5352 1.8789v3h2v-3z" fill="#e0e0e0"/></svg> diff --git a/editor/icons/VisualScriptComment.svg b/editor/icons/VisualScriptComment.svg deleted file mode 100644 index 3887853b58..0000000000 --- a/editor/icons/VisualScriptComment.svg +++ /dev/null @@ -1 +0,0 @@ -<svg height="14" viewBox="0 0 14 14" width="14" xmlns="http://www.w3.org/2000/svg"><path d="m3 1v2h-2v2h2v4h-2v2h2v2h2v-2h4v2h2v-2h2v-2h-2v-4h2v-2h-2v-2h-2v2h-4v-2zm2 4h4v4h-4z" fill="#e0e0e0"/></svg> diff --git a/editor/icons/VisualScriptExpression.svg b/editor/icons/VisualScriptExpression.svg deleted file mode 100644 index d6a3c2d9a8..0000000000 --- a/editor/icons/VisualScriptExpression.svg +++ /dev/null @@ -1 +0,0 @@ -<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m4.859536 3.0412379c-2.0539867 0-3.7190721 1.6650852-3.7190721 3.719072v6.1984521h2.4793814v-2.479381h2.4793814v-2.4793803h-2.4793814v-1.2396908c0-.6846622.5550285-1.2396907 1.2396907-1.2396907h1.2396907v-2.4793813z"/><path d="m7.5889175 3.0000003 2.5000005 4.9999997-2.5000005 5h2.5000005l1.135249-2.727 1.36475 2.727h2.499999l-2.499999-5 2.499999-4.9999997h-2.499999l-1.13525 2.7269998-1.364749-2.7269998zm7.4999985 9.9999997v-6.25z"/></g></svg> diff --git a/editor/import/collada.cpp b/editor/import/collada.cpp index 5d8e453395..7cf35c519b 100644 --- a/editor/import/collada.cpp +++ b/editor/import/collada.cpp @@ -2036,11 +2036,7 @@ void Collada::_merge_skeletons(VisualScene *p_vscene, Node *p_node) { ERR_CONTINUE(!state.scene_map.has(nodeid)); //weird, it should have it... -#ifdef NO_SAFE_CAST - NodeJoint *nj = static_cast<NodeJoint *>(state.scene_map[nodeid]); -#else NodeJoint *nj = dynamic_cast<NodeJoint *>(state.scene_map[nodeid]); -#endif ERR_CONTINUE(!nj); //broken collada ERR_CONTINUE(!nj->owner); //weird, node should have a skeleton owner @@ -2197,11 +2193,7 @@ bool Collada::_move_geometry_to_skeletons(VisualScene *p_vscene, Node *p_node, L String nodeid = ng->skeletons[0]; ERR_FAIL_COND_V(!state.scene_map.has(nodeid), false); //weird, it should have it... -#ifdef NO_SAFE_CAST - NodeJoint *nj = static_cast<NodeJoint *>(state.scene_map[nodeid]); -#else NodeJoint *nj = dynamic_cast<NodeJoint *>(state.scene_map[nodeid]); -#endif ERR_FAIL_COND_V(!nj, false); ERR_FAIL_COND_V(!nj->owner, false); //weird, node should have a skeleton owner diff --git a/editor/import/dynamic_font_import_settings.cpp b/editor/import/dynamic_font_import_settings.cpp index d1f37179f3..1e0f45419f 100644 --- a/editor/import/dynamic_font_import_settings.cpp +++ b/editor/import/dynamic_font_import_settings.cpp @@ -302,6 +302,7 @@ static UniRange unicode_ranges[] = { { 0x10D00, 0x10D3F, U"Hanifi Rohingya" }, { 0x10E60, 0x10E7F, U"Rumi Numeral Symbols" }, { 0x10E80, 0x10EBF, U"Yezidi" }, + { 0x10EC0, 0x10EFF, U"Arabic Extended-C" }, { 0x10F00, 0x10F2F, U"Old Sogdian" }, { 0x10F30, 0x10F6F, U"Sogdian" }, { 0x10F70, 0x10FAF, U"Old Uyghur" }, @@ -333,11 +334,13 @@ static UniRange unicode_ranges[] = { { 0x11A50, 0x11AAF, U"Soyombo" }, { 0x11AB0, 0x11ABF, U"Unified Canadian Aboriginal Syllabics Extended-A" }, { 0x11AC0, 0x11AFF, U"Pau Cin Hau" }, + { 0x11B00, 0x11B5F, U"Devanagari Extended-A" }, { 0x11C00, 0x11C6F, U"Bhaiksuki" }, { 0x11C70, 0x11CBF, U"Marchen" }, { 0x11D00, 0x11D5F, U"Masaram Gondi" }, { 0x11D60, 0x11DAF, U"Gunjala Gondi" }, { 0x11EE0, 0x11EFF, U"Makasar" }, + { 0x11F00, 0x11F5F, U"Kawi" }, { 0x11FB0, 0x11FBF, U"Lisu Supplement" }, { 0x11FC0, 0x11FFF, U"Tamil Supplement" }, { 0x12000, 0x123FF, U"Cuneiform" }, @@ -370,6 +373,7 @@ static UniRange unicode_ranges[] = { { 0x1D000, 0x1D0FF, U"Byzantine Musical Symbols" }, { 0x1D100, 0x1D1FF, U"Musical Symbols" }, { 0x1D200, 0x1D24F, U"Ancient Greek Musical Notation" }, + { 0x1D2C0, 0x1D2DF, U"Kaktovik Numerals" }, { 0x1D2E0, 0x1D2FF, U"Mayan Numerals" }, { 0x1D300, 0x1D35F, U"Tai Xuan Jing Symbols" }, { 0x1D360, 0x1D37F, U"Counting Rod Numerals" }, @@ -377,9 +381,11 @@ static UniRange unicode_ranges[] = { { 0x1D800, 0x1DAAF, U"Sutton SignWriting" }, { 0x1DF00, 0x1DFFF, U"Latin Extended-G" }, { 0x1E000, 0x1E02F, U"Glagolitic Supplement" }, + { 0x1E030, 0x1E08F, U"Cyrillic Extended-D" }, { 0x1E100, 0x1E14F, U"Nyiakeng Puachue Hmong" }, { 0x1E290, 0x1E2BF, U"Toto" }, { 0x1E2C0, 0x1E2FF, U"Wancho" }, + { 0x1E4D0, 0x1E4FF, U"Nag Mundari" }, { 0x1E7E0, 0x1E7FF, U"Ethiopic Extended-B" }, { 0x1E800, 0x1E8DF, U"Mende Kikakui" }, { 0x1E900, 0x1E95F, U"Adlam" }, @@ -409,6 +415,7 @@ static UniRange unicode_ranges[] = { { 0x2CEB0, 0x2EBEF, U"CJK Unified Ideographs Extension F" }, { 0x2F800, 0x2FA1F, U"CJK Compatibility Ideographs Supplement" }, { 0x30000, 0x3134F, U"CJK Unified Ideographs Extension G" }, + { 0x31350, 0x323AF, U"CJK Unified Ideographs Extension H" }, //{ 0xE0000, 0xE007F, U"Tags" }, //{ 0xE0100, 0xE01EF, U"Variation Selectors Supplement" }, { 0xF0000, 0xFFFFF, U"Supplementary Private Use Area-A" }, @@ -1002,6 +1009,7 @@ void DynamicFontImportSettings::open_settings(const String &p_path) { vars_list_root = vars_list->create_item(); + import_settings_data->settings.clear(); import_settings_data->defaults.clear(); for (List<ResourceImporter::ImportOption>::Element *E = options_general.front(); E; E = E->next()) { import_settings_data->defaults[E->get().option.name] = E->get().default_value; diff --git a/editor/import/resource_importer_scene.cpp b/editor/import/resource_importer_scene.cpp index 41061c3fc3..b5798a5784 100644 --- a/editor/import/resource_importer_scene.cpp +++ b/editor/import/resource_importer_scene.cpp @@ -1891,6 +1891,39 @@ void ResourceImporterScene::_replace_owner(Node *p_node, Node *p_scene, Node *p_ } } +Array ResourceImporterScene::_get_skinned_pose_transforms(ImporterMeshInstance3D *p_src_mesh_node) { + Array skin_pose_transform_array; + + const Ref<Skin> skin = p_src_mesh_node->get_skin(); + if (skin.is_valid()) { + NodePath skeleton_path = p_src_mesh_node->get_skeleton_path(); + const Node *node = p_src_mesh_node->get_node_or_null(skeleton_path); + const Skeleton3D *skeleton = Object::cast_to<Skeleton3D>(node); + if (skeleton) { + int bind_count = skin->get_bind_count(); + + for (int i = 0; i < bind_count; i++) { + Transform3D bind_pose = skin->get_bind_pose(i); + String bind_name = skin->get_bind_name(i); + + int bone_idx = bind_name.is_empty() ? skin->get_bind_bone(i) : skeleton->find_bone(bind_name); + ERR_FAIL_COND_V(bone_idx >= skeleton->get_bone_count(), Array()); + + Transform3D bp_global_rest; + if (bone_idx >= 0) { + bp_global_rest = skeleton->get_bone_global_pose(bone_idx); + } else { + bp_global_rest = skeleton->get_bone_global_pose(i); + } + + skin_pose_transform_array.push_back(bp_global_rest * bind_pose); + } + } + } + + return skin_pose_transform_array; +} + void ResourceImporterScene::_generate_meshes(Node *p_node, const Dictionary &p_mesh_data, bool p_generate_lods, bool p_create_shadow_meshes, LightBakeMode p_light_bake_mode, float p_lightmap_texel_size, const Vector<uint8_t> &p_src_lightmap_cache, Vector<Vector<uint8_t>> &r_lightmap_caches) { ImporterMeshInstance3D *src_mesh_node = Object::cast_to<ImporterMeshInstance3D>(p_node); if (src_mesh_node) { @@ -2007,7 +2040,8 @@ void ResourceImporterScene::_generate_meshes(Node *p_node, const Dictionary &p_m } if (generate_lods) { - src_mesh_node->get_mesh()->generate_lods(merge_angle, split_angle); + Array skin_pose_transform_array = _get_skinned_pose_transforms(src_mesh_node); + src_mesh_node->get_mesh()->generate_lods(merge_angle, split_angle, skin_pose_transform_array); } if (create_shadow_meshes) { diff --git a/editor/import/resource_importer_scene.h b/editor/import/resource_importer_scene.h index da37893cc5..386519bc59 100644 --- a/editor/import/resource_importer_scene.h +++ b/editor/import/resource_importer_scene.h @@ -34,11 +34,14 @@ #include "core/error/error_macros.h" #include "core/io/resource_importer.h" #include "core/variant/dictionary.h" -#include "scene/3d/node_3d.h" +#include "scene/3d/importer_mesh_instance_3d.h" #include "scene/resources/animation.h" +#include "scene/resources/box_shape_3d.h" +#include "scene/resources/capsule_shape_3d.h" +#include "scene/resources/cylinder_shape_3d.h" #include "scene/resources/mesh.h" #include "scene/resources/shape_3d.h" -#include "scene/resources/skin.h" +#include "scene/resources/sphere_shape_3d.h" class Material; class AnimationPlayer; @@ -208,6 +211,7 @@ class ResourceImporterScene : public ResourceImporter { SHAPE_TYPE_CAPSULE, }; + Array _get_skinned_pose_transforms(ImporterMeshInstance3D *p_src_mesh_node); void _replace_owner(Node *p_node, Node *p_scene, Node *p_new_owner); void _generate_meshes(Node *p_node, const Dictionary &p_mesh_data, bool p_generate_lods, bool p_create_shadow_meshes, LightBakeMode p_light_bake_mode, float p_lightmap_texel_size, const Vector<uint8_t> &p_src_lightmap_cache, Vector<Vector<uint8_t>> &r_lightmap_caches); void _add_shapes(Node *p_node, const Vector<Ref<Shape3D>> &p_shapes); @@ -309,11 +313,6 @@ public: virtual Node *import_scene(const String &p_path, uint32_t p_flags, const HashMap<StringName, Variant> &p_options, int p_bake_fps, List<String> *r_missing_deps, Error *r_err = nullptr) override; }; -#include "scene/resources/box_shape_3d.h" -#include "scene/resources/capsule_shape_3d.h" -#include "scene/resources/cylinder_shape_3d.h" -#include "scene/resources/sphere_shape_3d.h" - template <class M> Vector<Ref<Shape3D>> ResourceImporterScene::get_collision_shapes(const Ref<Mesh> &p_mesh, const M &p_options) { ShapeType generate_shape_type = SHAPE_TYPE_DECOMPOSE_CONVEX; diff --git a/editor/import/resource_importer_texture.cpp b/editor/import/resource_importer_texture.cpp index 17b94ec706..c06756ff0b 100644 --- a/editor/import/resource_importer_texture.cpp +++ b/editor/import/resource_importer_texture.cpp @@ -36,6 +36,8 @@ #include "core/version.h" #include "editor/editor_file_system.h" #include "editor/editor_node.h" +#include "editor/editor_scale.h" +#include "editor/editor_settings.h" void ResourceImporterTexture::_texture_reimport_roughness(const Ref<CompressedTexture2D> &p_tex, const String &p_normal_path, RS::TextureDetectRoughnessChannel p_channel) { ERR_FAIL_COND(p_tex.is_null()); @@ -233,6 +235,10 @@ void ResourceImporterTexture::get_import_options(const String &p_path, List<Impo if (p_path.get_extension() == "svg") { r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "svg/scale", PROPERTY_HINT_RANGE, "0.001,100,0.001"), 1.0)); + + // Editor use only, applies to SVG. + r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "editor/scale_with_editor_scale"), false)); + r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "editor/convert_colors_with_editor_theme"), false)); } } @@ -447,6 +453,14 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String scale = p_options["svg/scale"]; } + // Editor-specific options. + bool use_editor_scale = p_options.has("editor/scale_with_editor_scale") && p_options["editor/scale_with_editor_scale"]; + bool convert_editor_colors = p_options.has("editor/convert_colors_with_editor_theme") && p_options["editor/convert_colors_with_editor_theme"]; + + // Start importing images. + List<Ref<Image>> images_imported; + + // Load the normal image. Ref<Image> normal_image; Image::RoughnessChannel roughness_channel = Image::ROUGHNESS_CHANNEL_R; if (mipmaps && roughness > 1 && FileAccess::exists(normal_map)) { @@ -456,88 +470,117 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String } } + // Load the main image. Ref<Image> image; image.instantiate(); Error err = ImageLoader::load_image(p_source_file, image, nullptr, loader_flags, scale); if (err != OK) { return err; } + images_imported.push_back(image); - Array formats_imported; - - if (size_limit > 0 && (image->get_width() > size_limit || image->get_height() > size_limit)) { - //limit size - if (image->get_width() >= image->get_height()) { - int new_width = size_limit; - int new_height = image->get_height() * new_width / image->get_width(); - - image->resize(new_width, new_height, Image::INTERPOLATE_CUBIC); - } else { - int new_height = size_limit; - int new_width = image->get_width() * new_height / image->get_height(); + // Load the editor-only image. + Ref<Image> editor_image; + bool import_editor_image = use_editor_scale || convert_editor_colors; + if (import_editor_image) { + float editor_scale = scale; + if (use_editor_scale) { + editor_scale = scale * EDSCALE; + } - image->resize(new_width, new_height, Image::INTERPOLATE_CUBIC); + int32_t editor_loader_flags = loader_flags; + if (convert_editor_colors) { + editor_loader_flags |= ImageFormatLoader::FLAG_CONVERT_COLORS; } - if (normal == 1) { - image->normalize(); + editor_image.instantiate(); + err = ImageLoader::load_image(p_source_file, editor_image, nullptr, editor_loader_flags, editor_scale); + if (err != OK) { + WARN_PRINT("Failed to import an image resource for editor use from '" + p_source_file + "'"); + } else { + images_imported.push_back(editor_image); } } - if (fix_alpha_border) { - image->fix_alpha_edges(); - } + for (Ref<Image> &target_image : images_imported) { + // Apply the size limit. + if (size_limit > 0 && (target_image->get_width() > size_limit || target_image->get_height() > size_limit)) { + if (target_image->get_width() >= target_image->get_height()) { + int new_width = size_limit; + int new_height = target_image->get_height() * new_width / target_image->get_width(); - if (premult_alpha) { - image->premultiply_alpha(); - } + target_image->resize(new_width, new_height, Image::INTERPOLATE_CUBIC); + } else { + int new_height = size_limit; + int new_width = target_image->get_width() * new_height / target_image->get_height(); - if (normal_map_invert_y) { - // Inverting the green channel can be used to flip a normal map's direction. - // There's no standard when it comes to normal map Y direction, so this is - // sometimes needed when using a normal map exported from another program. - // See <http://wiki.polycount.com/wiki/Normal_Map_Technical_Details#Common_Swizzle_Coordinates>. - const int height = image->get_height(); - const int width = image->get_width(); + target_image->resize(new_width, new_height, Image::INTERPOLATE_CUBIC); + } - for (int i = 0; i < width; i++) { - for (int j = 0; j < height; j++) { - const Color color = image->get_pixel(i, j); - image->set_pixel(i, j, Color(color.r, 1 - color.g, color.b)); + if (normal == 1) { + target_image->normalize(); } } - } - if (hdr_clamp_exposure) { - // Clamp HDR exposure following Filament's tonemapping formula. - // This can be used to reduce fireflies in environment maps or reduce the influence - // of the sun from an HDRI panorama on environment lighting (when a DirectionalLight3D is used instead). - const int height = image->get_height(); - const int width = image->get_width(); - - // These values are chosen arbitrarily and seem to produce good results with 4,096 samples. - const float linear = 4096.0; - const float compressed = 16384.0; + // Fix alpha border. + if (fix_alpha_border) { + target_image->fix_alpha_edges(); + } - for (int i = 0; i < width; i++) { - for (int j = 0; j < height; j++) { - const Color color = image->get_pixel(i, j); - const float luma = color.get_luminance(); + // Premultiply the alpha. + if (premult_alpha) { + target_image->premultiply_alpha(); + } - Color clamped_color; - if (luma <= linear) { - clamped_color = color; - } else { - clamped_color = (color / luma) * ((linear * linear - compressed * luma) / (2 * linear - compressed - luma)); + // Invert the green channel of the image to flip the normal map it contains. + if (normal_map_invert_y) { + // Inverting the green channel can be used to flip a normal map's direction. + // There's no standard when it comes to normal map Y direction, so this is + // sometimes needed when using a normal map exported from another program. + // See <http://wiki.polycount.com/wiki/Normal_Map_Technical_Details#Common_Swizzle_Coordinates>. + const int height = target_image->get_height(); + const int width = target_image->get_width(); + + for (int i = 0; i < width; i++) { + for (int j = 0; j < height; j++) { + const Color color = target_image->get_pixel(i, j); + target_image->set_pixel(i, j, Color(color.r, 1 - color.g, color.b)); } + } + } - image->set_pixel(i, j, clamped_color); + // Clamp HDR exposure. + if (hdr_clamp_exposure) { + // Clamp HDR exposure following Filament's tonemapping formula. + // This can be used to reduce fireflies in environment maps or reduce the influence + // of the sun from an HDRI panorama on environment lighting (when a DirectionalLight3D is used instead). + const int height = target_image->get_height(); + const int width = target_image->get_width(); + + // These values are chosen arbitrarily and seem to produce good results with 4,096 samples. + const float linear = 4096.0; + const float compressed = 16384.0; + + for (int i = 0; i < width; i++) { + for (int j = 0; j < height; j++) { + const Color color = target_image->get_pixel(i, j); + const float luma = color.get_luminance(); + + Color clamped_color; + if (luma <= linear) { + clamped_color = color; + } else { + clamped_color = (color / luma) * ((linear * linear - compressed * luma) / (2 * linear - compressed - luma)); + } + + target_image->set_pixel(i, j, clamped_color); + } } } } if (compress_mode == COMPRESS_BASIS_UNIVERSAL && image->get_format() >= Image::FORMAT_RF) { - //basis universal does not support float formats, fall back + // Basis universal does not support float formats, fallback. compress_mode = COMPRESS_VRAM_COMPRESSED; } @@ -547,9 +590,11 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String bool force_normal = normal == 1; bool srgb_friendly_pack = pack_channels == 0; + Array formats_imported; + if (compress_mode == COMPRESS_VRAM_COMPRESSED) { - //must import in all formats, in order of priority (so platform choses the best supported one. IE, etc2 over etc). - //Android, GLES 2.x + // Must import in all formats, in order of priority (so platform choses the best supported one. IE, etc2 over etc). + // Android, GLES 2.x const bool is_hdr = (image->get_format() >= Image::FORMAT_RF && image->get_format() <= Image::FORMAT_RGBE9995); bool is_ldr = (image->get_format() >= Image::FORMAT_L8 && image->get_format() <= Image::FORMAT_RGB565); @@ -557,7 +602,7 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String const bool can_s3tc = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_s3tc"); if (can_bptc) { - //add to the list anyway + // Add to the list anyway. formats_imported.push_back("bptc"); } @@ -566,9 +611,9 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String if (is_hdr && can_compress_hdr) { if (has_alpha) { - //can compress hdr, but hdr with alpha is not compressible + // Can compress HDR, but HDR with alpha is not compressible. if (hdr_compression == 2) { - //but user selected to compress hdr anyway, so force an alpha-less format. + // But user selected to compress HDR anyway, so force an alpha-less format. if (image->get_format() == Image::FORMAT_RGBAF) { image->convert(Image::FORMAT_RGBF); } else if (image->get_format() == Image::FORMAT_RGBAH) { @@ -580,7 +625,7 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String } if (!can_compress_hdr) { - //fallback to RGBE99995 + // Fallback to RGBE99995. if (image->get_format() != Image::FORMAT_RGBE9995) { image->convert(Image::FORMAT_RGBE9995); } @@ -615,16 +660,31 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String EditorNode::add_io_error(vformat(TTR("%s: No suitable desktop VRAM compression algorithm enabled in Project Settings (S3TC or BPTC). This texture may not display correctly on desktop platforms."), p_source_file)); } } else { - //import normally + // Import normally. _save_ctex(image, p_save_path + ".ctex", compress_mode, lossy, Image::COMPRESS_S3TC /*this is ignored */, mipmaps, stream, detect_3d, detect_roughness, detect_normal, force_normal, srgb_friendly_pack, false, mipmap_limit, normal_image, roughness_channel); } + if (editor_image.is_valid()) { + _save_ctex(editor_image, p_save_path + ".editor.ctex", compress_mode, lossy, Image::COMPRESS_S3TC /*this is ignored */, mipmaps, stream, detect_3d, detect_roughness, detect_normal, force_normal, srgb_friendly_pack, false, mipmap_limit, normal_image, roughness_channel); + } + if (r_metadata) { Dictionary metadata; metadata["vram_texture"] = compress_mode == COMPRESS_VRAM_COMPRESSED; if (formats_imported.size()) { metadata["imported_formats"] = formats_imported; } + + if (editor_image.is_valid()) { + metadata["has_editor_variant"] = true; + if (use_editor_scale) { + metadata["editor_scale"] = EDSCALE; + } + if (convert_editor_colors) { + metadata["editor_dark_theme"] = EditorSettings::get_singleton()->is_dark_theme(); + } + } + *r_metadata = metadata; } return OK; @@ -657,13 +717,22 @@ bool ResourceImporterTexture::are_import_settings_valid(const String &p_path) co //will become invalid if formats are missing to import Dictionary metadata = ResourceFormatImporter::get_singleton()->get_resource_metadata(p_path); + if (metadata.has("has_editor_variant")) { + if (metadata.has("editor_scale") && (float)metadata["editor_scale"] != EDSCALE) { + return false; + } + if (metadata.has("editor_dark_theme") && (bool)metadata["editor_dark_theme"] != EditorSettings::get_singleton()->is_dark_theme()) { + return false; + } + } + if (!metadata.has("vram_texture")) { return false; } bool vram = metadata["vram_texture"]; if (!vram) { - return true; //do not care about non vram + return true; // Do not care about non-VRAM. } Vector<String> formats_imported; diff --git a/editor/plugins/animation_blend_tree_editor_plugin.cpp b/editor/plugins/animation_blend_tree_editor_plugin.cpp index f1e6c70549..ca7b2d0015 100644 --- a/editor/plugins/animation_blend_tree_editor_plugin.cpp +++ b/editor/plugins/animation_blend_tree_editor_plugin.cpp @@ -101,13 +101,13 @@ void AnimationNodeBlendTreeEditor::_property_changed(const StringName &p_propert undo_redo->create_action(TTR("Parameter Changed:") + " " + String(p_property), UndoRedo::MERGE_ENDS); undo_redo->add_do_property(tree, p_property, p_value); undo_redo->add_undo_property(tree, p_property, tree->get(p_property)); - undo_redo->add_do_method(this, "_update_graph"); - undo_redo->add_undo_method(this, "_update_graph"); + undo_redo->add_do_method(this, "update_graph"); + undo_redo->add_undo_method(this, "update_graph"); undo_redo->commit_action(); updating = false; } -void AnimationNodeBlendTreeEditor::_update_graph() { +void AnimationNodeBlendTreeEditor::update_graph() { if (updating || blend_tree.is_null()) { return; } @@ -364,8 +364,8 @@ void AnimationNodeBlendTreeEditor::_add_node(int p_idx) { to_slot = -1; } - undo_redo->add_do_method(this, "_update_graph"); - undo_redo->add_undo_method(this, "_update_graph"); + undo_redo->add_do_method(this, "update_graph"); + undo_redo->add_undo_method(this, "update_graph"); undo_redo->commit_action(); } @@ -416,8 +416,8 @@ void AnimationNodeBlendTreeEditor::_node_dragged(const Vector2 &p_from, const Ve undo_redo->create_action(TTR("Node Moved")); undo_redo->add_do_method(blend_tree.ptr(), "set_node_position", p_which, p_to / EDSCALE); undo_redo->add_undo_method(blend_tree.ptr(), "set_node_position", p_which, p_from / EDSCALE); - undo_redo->add_do_method(this, "_update_graph"); - undo_redo->add_undo_method(this, "_update_graph"); + undo_redo->add_do_method(this, "update_graph"); + undo_redo->add_undo_method(this, "update_graph"); undo_redo->commit_action(); updating = false; } @@ -437,8 +437,8 @@ void AnimationNodeBlendTreeEditor::_connection_request(const String &p_from, int undo_redo->create_action(TTR("Nodes Connected")); undo_redo->add_do_method(blend_tree.ptr(), "connect_node", p_to, p_to_index, p_from); undo_redo->add_undo_method(blend_tree.ptr(), "disconnect_node", p_to, p_to_index); - undo_redo->add_do_method(this, "_update_graph"); - undo_redo->add_undo_method(this, "_update_graph"); + undo_redo->add_do_method(this, "update_graph"); + undo_redo->add_undo_method(this, "update_graph"); undo_redo->commit_action(); } @@ -453,8 +453,8 @@ void AnimationNodeBlendTreeEditor::_disconnection_request(const String &p_from, undo_redo->create_action(TTR("Nodes Disconnected")); undo_redo->add_do_method(blend_tree.ptr(), "disconnect_node", p_to, p_to_index); undo_redo->add_undo_method(blend_tree.ptr(), "connect_node", p_to, p_to_index, p_from); - undo_redo->add_do_method(this, "_update_graph"); - undo_redo->add_undo_method(this, "_update_graph"); + undo_redo->add_do_method(this, "update_graph"); + undo_redo->add_undo_method(this, "update_graph"); undo_redo->commit_action(); updating = false; } @@ -468,8 +468,8 @@ void AnimationNodeBlendTreeEditor::_anim_selected(int p_index, Array p_options, undo_redo->create_action(TTR("Set Animation")); undo_redo->add_do_method(anim.ptr(), "set_animation", option); undo_redo->add_undo_method(anim.ptr(), "set_animation", anim->get_animation()); - undo_redo->add_do_method(this, "_update_graph"); - undo_redo->add_undo_method(this, "_update_graph"); + undo_redo->add_do_method(this, "update_graph"); + undo_redo->add_undo_method(this, "update_graph"); undo_redo->commit_action(); } @@ -491,8 +491,8 @@ void AnimationNodeBlendTreeEditor::_delete_request(const String &p_which) { } } - undo_redo->add_do_method(this, "_update_graph"); - undo_redo->add_undo_method(this, "_update_graph"); + undo_redo->add_do_method(this, "update_graph"); + undo_redo->add_undo_method(this, "update_graph"); undo_redo->commit_action(); } @@ -819,7 +819,7 @@ void AnimationNodeBlendTreeEditor::_notification(int p_what) { _update_theme(); if (is_visible_in_tree()) { - _update_graph(); + update_graph(); } } break; @@ -900,13 +900,28 @@ void AnimationNodeBlendTreeEditor::_scroll_changed(const Vector2 &p_scroll) { } void AnimationNodeBlendTreeEditor::_bind_methods() { - ClassDB::bind_method("_update_graph", &AnimationNodeBlendTreeEditor::_update_graph); + ClassDB::bind_method("update_graph", &AnimationNodeBlendTreeEditor::update_graph); ClassDB::bind_method("_update_filters", &AnimationNodeBlendTreeEditor::_update_filters); } AnimationNodeBlendTreeEditor *AnimationNodeBlendTreeEditor::singleton = nullptr; +// AnimationNode's "node_changed" signal means almost update_input. +void AnimationNodeBlendTreeEditor::_node_changed(const StringName &p_node_name) { + // TODO: + // Here is executed during the commit of EditorNode::undo_redo, it is not possible to create an undo_redo action here. + // The disconnect when the number of enabled inputs decreases is done in AnimationNodeBlendTree and update_graph(). + // This means that there is no place to register undo_redo actions. + // In order to implement undo_redo correctly, we may need to implement AnimationNodeEdit such as AnimationTrackKeyEdit + // and add it to _node_selected() with EditorNode::get_singleton()->push_item(AnimationNodeEdit). + update_graph(); +} + void AnimationNodeBlendTreeEditor::_node_renamed(const String &p_text, Ref<AnimationNode> p_node) { + if (blend_tree.is_null()) { + return; + } + String prev_name = blend_tree->get_node_name(p_node); ERR_FAIL_COND(prev_name.is_empty()); GraphNode *gn = Object::cast_to<GraphNode>(graph->get_node(prev_name)); @@ -936,8 +951,8 @@ void AnimationNodeBlendTreeEditor::_node_renamed(const String &p_text, Ref<Anima undo_redo->add_undo_method(blend_tree.ptr(), "rename_node", name, prev_name); undo_redo->add_do_method(AnimationTreeEditor::get_singleton()->get_tree(), "rename_parameter", base_path + prev_name, base_path + name); undo_redo->add_undo_method(AnimationTreeEditor::get_singleton()->get_tree(), "rename_parameter", base_path + name, base_path + prev_name); - undo_redo->add_do_method(this, "_update_graph"); - undo_redo->add_undo_method(this, "_update_graph"); + undo_redo->add_do_method(this, "update_graph"); + undo_redo->add_undo_method(this, "update_graph"); undo_redo->commit_action(); updating = false; gn->set_name(new_name); @@ -975,7 +990,7 @@ void AnimationNodeBlendTreeEditor::_node_renamed(const String &p_text, Ref<Anima } } - _update_graph(); // Needed to update the signal connections with the new name. + update_graph(); // Needed to update the signal connections with the new name. } void AnimationNodeBlendTreeEditor::_node_renamed_focus_out(Node *le, Ref<AnimationNode> p_node) { @@ -992,6 +1007,7 @@ bool AnimationNodeBlendTreeEditor::can_edit(const Ref<AnimationNode> &p_node) { void AnimationNodeBlendTreeEditor::edit(const Ref<AnimationNode> &p_node) { if (blend_tree.is_valid()) { + blend_tree->disconnect("node_changed", callable_mp(this, &AnimationNodeBlendTreeEditor::_node_changed)); blend_tree->disconnect("removed_from_graph", callable_mp(this, &AnimationNodeBlendTreeEditor::_removed_from_graph)); } @@ -1004,9 +1020,10 @@ void AnimationNodeBlendTreeEditor::edit(const Ref<AnimationNode> &p_node) { } else { read_only = EditorNode::get_singleton()->is_resource_read_only(blend_tree); + blend_tree->connect("node_changed", callable_mp(this, &AnimationNodeBlendTreeEditor::_node_changed)); blend_tree->connect("removed_from_graph", callable_mp(this, &AnimationNodeBlendTreeEditor::_removed_from_graph)); - _update_graph(); + update_graph(); } add_node->set_disabled(read_only); diff --git a/editor/plugins/animation_blend_tree_editor_plugin.h b/editor/plugins/animation_blend_tree_editor_plugin.h index 30a54930a2..46e0d18c69 100644 --- a/editor/plugins/animation_blend_tree_editor_plugin.h +++ b/editor/plugins/animation_blend_tree_editor_plugin.h @@ -71,8 +71,6 @@ class AnimationNodeBlendTreeEditor : public AnimationTreeNodeEditorPlugin { int to_slot = -1; String from_node = ""; - void _update_graph(); - struct AddOption { String name; String type; @@ -95,6 +93,7 @@ class AnimationNodeBlendTreeEditor : public AnimationTreeNodeEditorPlugin { void _node_dragged(const Vector2 &p_from, const Vector2 &p_to, const StringName &p_which); void _node_renamed(const String &p_text, Ref<AnimationNode> p_node); void _node_renamed_focus_out(Node *le, Ref<AnimationNode> p_node); + void _node_changed(const StringName &p_node_name); bool updating; @@ -150,6 +149,8 @@ public: virtual bool can_edit(const Ref<AnimationNode> &p_node) override; virtual void edit(const Ref<AnimationNode> &p_node) override; + void update_graph(); + AnimationNodeBlendTreeEditor(); }; diff --git a/editor/plugins/animation_player_editor_plugin.cpp b/editor/plugins/animation_player_editor_plugin.cpp index 5406aada09..e8caac565c 100644 --- a/editor/plugins/animation_player_editor_plugin.cpp +++ b/editor/plugins/animation_player_editor_plugin.cpp @@ -874,6 +874,11 @@ void AnimationPlayerEditor::_update_player() { onion_toggle->set_disabled(no_anims_found); onion_skinning->set_disabled(no_anims_found); + if (hack_disable_onion_skinning) { + onion_toggle->set_disabled(true); + onion_skinning->set_disabled(true); + } + _update_animation_list_icons(); updating = false; @@ -1678,6 +1683,16 @@ AnimationPlayerEditor::AnimationPlayerEditor(AnimationPlayerEditorPlugin *p_plug onion_skinning->get_popup()->add_check_item(TTR("Include Gizmos (3D)"), ONION_SKINNING_INCLUDE_GIZMOS); hb->add_child(onion_skinning); + // FIXME: Onion skinning disabled for now as it's broken and triggers fast + // flickering red/blue modulation (GH-53870). + if (hack_disable_onion_skinning) { + onion_toggle->set_disabled(true); + onion_toggle->set_tooltip_text(TTR("Onion Skinning temporarily disabled due to rendering bug.")); + + onion_skinning->set_disabled(true); + onion_skinning->set_tooltip_text(TTR("Onion Skinning temporarily disabled due to rendering bug.")); + } + hb->add_child(memnew(VSeparator)); pin = memnew(Button); diff --git a/editor/plugins/animation_player_editor_plugin.h b/editor/plugins/animation_player_editor_plugin.h index a37a9debef..06fd9455df 100644 --- a/editor/plugins/animation_player_editor_plugin.h +++ b/editor/plugins/animation_player_editor_plugin.h @@ -131,6 +131,8 @@ class AnimationPlayerEditor : public VBoxContainer { AnimationTrackEditor *track_editor = nullptr; static AnimationPlayerEditor *singleton; + bool hack_disable_onion_skinning = true; // Temporary hack for GH-53870. + // Onion skinning. struct { // Settings. diff --git a/editor/plugins/animation_tree_editor_plugin.cpp b/editor/plugins/animation_tree_editor_plugin.cpp index ed231c446b..1de4fbaabc 100644 --- a/editor/plugins/animation_tree_editor_plugin.cpp +++ b/editor/plugins/animation_tree_editor_plugin.cpp @@ -50,10 +50,18 @@ #include "scene/scene_string_names.h" void AnimationTreeEditor::edit(AnimationTree *p_tree) { + if (p_tree && !p_tree->is_connected("animation_player_changed", callable_mp(this, &AnimationTreeEditor::_animation_list_changed))) { + p_tree->connect("animation_player_changed", callable_mp(this, &AnimationTreeEditor::_animation_list_changed), CONNECT_DEFERRED); + } + if (tree == p_tree) { return; } + if (tree && tree->is_connected("animation_player_changed", callable_mp(this, &AnimationTreeEditor::_animation_list_changed))) { + tree->disconnect("animation_player_changed", callable_mp(this, &AnimationTreeEditor::_animation_list_changed)); + } + tree = p_tree; Vector<String> path; @@ -73,6 +81,13 @@ void AnimationTreeEditor::_path_button_pressed(int p_path) { } } +void AnimationTreeEditor::_animation_list_changed() { + AnimationNodeBlendTreeEditor *bte = AnimationNodeBlendTreeEditor::get_singleton(); + if (bte) { + bte->update_graph(); + } +} + void AnimationTreeEditor::_update_path() { while (path_hb->get_child_count() > 1) { memdelete(path_hb->get_child(1)); diff --git a/editor/plugins/animation_tree_editor_plugin.h b/editor/plugins/animation_tree_editor_plugin.h index a33d97f62f..9ef9fff8cd 100644 --- a/editor/plugins/animation_tree_editor_plugin.h +++ b/editor/plugins/animation_tree_editor_plugin.h @@ -65,6 +65,7 @@ class AnimationTreeEditor : public VBoxContainer { ObjectID current_root; void _path_button_pressed(int p_path); + void _animation_list_changed(); static Vector<String> get_animation_list(); diff --git a/editor/plugins/asset_library_editor_plugin.cpp b/editor/plugins/asset_library_editor_plugin.cpp index 436113093f..3c9486cdaa 100644 --- a/editor/plugins/asset_library_editor_plugin.cpp +++ b/editor/plugins/asset_library_editor_plugin.cpp @@ -648,7 +648,7 @@ void EditorAssetLibrary::shortcut_input(const Ref<InputEvent> &p_event) { const Ref<InputEventKey> key = p_event; if (key.is_valid() && key->is_pressed()) { - if (key->is_match(InputEventKey::create_reference(KeyModifierMask::CMD_OR_CTRL | Key::F))) { + if (key->is_match(InputEventKey::create_reference(KeyModifierMask::CMD_OR_CTRL | Key::F)) && is_visible_in_tree()) { filter->grab_focus(); filter->select_all(); accept_event(); diff --git a/editor/plugins/bone_map_editor_plugin.cpp b/editor/plugins/bone_map_editor_plugin.cpp index 46e2fe41af..60e8f5b44b 100644 --- a/editor/plugins/bone_map_editor_plugin.cpp +++ b/editor/plugins/bone_map_editor_plugin.cpp @@ -1309,7 +1309,7 @@ void BoneMapEditor::create_editors() { void BoneMapEditor::fetch_objects() { skeleton = nullptr; - // Hackey... but it may be the easist way to get a selected object from "ImporterScene". + // Hackey... but it may be the easiest way to get a selected object from "ImporterScene". SceneImportSettings *si = SceneImportSettings::get_singleton(); if (!si) { return; diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp index 070834b33b..84b8b4aed8 100644 --- a/editor/plugins/canvas_item_editor_plugin.cpp +++ b/editor/plugins/canvas_item_editor_plugin.cpp @@ -2535,30 +2535,32 @@ void CanvasItemEditor::_gui_input_viewport(const Ref<InputEvent> &p_event) { bool release_lmb = (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT); // Required to properly release some stuff (e.g. selection box) while panning. if (EditorSettings::get_singleton()->get("editors/panning/simple_panning") || !pan_pressed || release_lmb) { - if ((accepted = _gui_input_rulers_and_guides(p_event))) { + accepted = true; + if (_gui_input_rulers_and_guides(p_event)) { // print_line("Rulers and guides"); - } else if ((accepted = EditorNode::get_singleton()->get_editor_plugins_over()->forward_gui_input(p_event))) { + } else if (EditorNode::get_singleton()->get_editor_plugins_over()->forward_gui_input(p_event)) { // print_line("Plugin"); - } else if ((accepted = _gui_input_open_scene_on_double_click(p_event))) { + } else if (_gui_input_open_scene_on_double_click(p_event)) { // print_line("Open scene on double click"); - } else if ((accepted = _gui_input_scale(p_event))) { + } else if (_gui_input_scale(p_event)) { // print_line("Set scale"); - } else if ((accepted = _gui_input_pivot(p_event))) { + } else if (_gui_input_pivot(p_event)) { // print_line("Set pivot"); - } else if ((accepted = _gui_input_resize(p_event))) { + } else if (_gui_input_resize(p_event)) { // print_line("Resize"); - } else if ((accepted = _gui_input_rotate(p_event))) { + } else if (_gui_input_rotate(p_event)) { // print_line("Rotate"); - } else if ((accepted = _gui_input_move(p_event))) { + } else if (_gui_input_move(p_event)) { // print_line("Move"); - } else if ((accepted = _gui_input_anchors(p_event))) { + } else if (_gui_input_anchors(p_event)) { // print_line("Anchors"); - } else if ((accepted = _gui_input_select(p_event))) { + } else if (_gui_input_select(p_event)) { // print_line("Selection"); - } else if ((accepted = _gui_input_ruler_tool(p_event))) { + } else if (_gui_input_ruler_tool(p_event)) { // print_line("Measure"); } else { // print_line("Not accepted"); + accepted = false; } } @@ -4715,12 +4717,10 @@ void CanvasItemEditor::_reset_drag() { } void CanvasItemEditor::_bind_methods() { - ClassDB::bind_method(D_METHOD("_update_override_camera_button", "game_running"), &CanvasItemEditor::_update_override_camera_button); ClassDB::bind_method("_get_editor_data", &CanvasItemEditor::_get_editor_data); ClassDB::bind_method(D_METHOD("set_state"), &CanvasItemEditor::set_state); ClassDB::bind_method(D_METHOD("update_viewport"), &CanvasItemEditor::update_viewport); - ClassDB::bind_method(D_METHOD("_zoom_on_position"), &CanvasItemEditor::_zoom_on_position); ClassDB::bind_method("_set_owner_for_node_and_children", &CanvasItemEditor::_set_owner_for_node_and_children); @@ -4984,8 +4984,8 @@ CanvasItemEditor::CanvasItemEditor() { SceneTreeDock::get_singleton()->connect("node_created", callable_mp(this, &CanvasItemEditor::_node_created)); SceneTreeDock::get_singleton()->connect("add_node_used", callable_mp(this, &CanvasItemEditor::_reset_create_position)); - EditorNode::get_singleton()->call_deferred(SNAME("connect"), "play_pressed", Callable(this, "_update_override_camera_button").bind(true)); - EditorNode::get_singleton()->call_deferred(SNAME("connect"), "stop_pressed", Callable(this, "_update_override_camera_button").bind(false)); + EditorNode::get_singleton()->call_deferred(SNAME("connect"), callable_mp(this, &CanvasItemEditor::_update_override_camera_button).bind(true)); + EditorNode::get_singleton()->call_deferred(SNAME("connect"), "stop_pressed", callable_mp(this, &CanvasItemEditor::_update_override_camera_button).bind(false)); // A fluid container for all toolbars. HFlowContainer *main_flow = memnew(HFlowContainer); @@ -5883,9 +5883,6 @@ void CanvasItemEditorViewport::_notification(int p_what) { } } -void CanvasItemEditorViewport::_bind_methods() { -} - CanvasItemEditorViewport::CanvasItemEditorViewport(CanvasItemEditor *p_canvas_item_editor) { default_texture_node_type = "Sprite2D"; // Node2D diff --git a/editor/plugins/canvas_item_editor_plugin.h b/editor/plugins/canvas_item_editor_plugin.h index 0a840d6fd6..b731d3cc7d 100644 --- a/editor/plugins/canvas_item_editor_plugin.h +++ b/editor/plugins/canvas_item_editor_plugin.h @@ -618,8 +618,6 @@ class CanvasItemEditorViewport : public Control { void _show_resource_type_selector(); void _update_theme(); - static void _bind_methods(); - protected: void _notification(int p_what); diff --git a/editor/plugins/debugger_editor_plugin.cpp b/editor/plugins/debugger_editor_plugin.cpp index 40e7dfead2..dd6187c264 100644 --- a/editor/plugins/debugger_editor_plugin.cpp +++ b/editor/plugins/debugger_editor_plugin.cpp @@ -69,7 +69,7 @@ DebuggerEditorPlugin::DebuggerEditorPlugin(PopupMenu *p_debug_menu) { debug_menu->set_item_tooltip(-1, TTR("When this option is enabled, using one-click deploy for Android will only export an executable without the project data.\nThe filesystem will be provided from the project by the editor over the network.\nOn Android, deploying will use the USB cable for faster performance. This option speeds up testing for projects with large assets.")); debug_menu->add_separator(); - debug_menu->add_check_shortcut(ED_SHORTCUT("editor/visible_collision_shapes", TTR("Visible Collision Shapes")), RUN_DEBUG_COLLISONS); + debug_menu->add_check_shortcut(ED_SHORTCUT("editor/visible_collision_shapes", TTR("Visible Collision Shapes")), RUN_DEBUG_COLLISIONS); debug_menu->set_item_tooltip(-1, TTR("When this option is enabled, collision shapes and raycast nodes (for 2D and 3D) will be visible in the running project.")); debug_menu->add_check_shortcut(ED_SHORTCUT("editor/visible_paths", TTR("Visible Paths")), RUN_DEBUG_PATHS); @@ -150,10 +150,10 @@ void DebuggerEditorPlugin::_menu_option(int p_option) { EditorSettings::get_singleton()->set_project_metadata("debug_options", "run_deploy_remote_debug", !ischecked); } break; - case RUN_DEBUG_COLLISONS: { - bool ischecked = debug_menu->is_item_checked(debug_menu->get_item_index(RUN_DEBUG_COLLISONS)); - debug_menu->set_item_checked(debug_menu->get_item_index(RUN_DEBUG_COLLISONS), !ischecked); - EditorSettings::get_singleton()->set_project_metadata("debug_options", "run_debug_collisons", !ischecked); + case RUN_DEBUG_COLLISIONS: { + bool ischecked = debug_menu->is_item_checked(debug_menu->get_item_index(RUN_DEBUG_COLLISIONS)); + debug_menu->set_item_checked(debug_menu->get_item_index(RUN_DEBUG_COLLISIONS), !ischecked); + EditorSettings::get_singleton()->set_project_metadata("debug_options", "run_debug_collisions", !ischecked); } break; case RUN_DEBUG_PATHS: { @@ -190,7 +190,7 @@ void DebuggerEditorPlugin::_notification(int p_what) { void DebuggerEditorPlugin::_update_debug_options() { bool check_deploy_remote = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_deploy_remote_debug", false); bool check_file_server = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_file_server", false); - bool check_debug_collisions = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_collisons", false); + bool check_debug_collisions = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_collisions", false); bool check_debug_paths = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_paths", false); bool check_debug_navigation = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_navigation", false); bool check_live_debug = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_live_debug", true); @@ -204,7 +204,7 @@ void DebuggerEditorPlugin::_update_debug_options() { _menu_option(RUN_FILE_SERVER); } if (check_debug_collisions) { - _menu_option(RUN_DEBUG_COLLISONS); + _menu_option(RUN_DEBUG_COLLISIONS); } if (check_debug_paths) { _menu_option(RUN_DEBUG_PATHS); diff --git a/editor/plugins/debugger_editor_plugin.h b/editor/plugins/debugger_editor_plugin.h index d8871128c3..c706acdb5c 100644 --- a/editor/plugins/debugger_editor_plugin.h +++ b/editor/plugins/debugger_editor_plugin.h @@ -48,7 +48,7 @@ private: enum MenuOptions { RUN_FILE_SERVER, RUN_LIVE_DEBUG, - RUN_DEBUG_COLLISONS, + RUN_DEBUG_COLLISIONS, RUN_DEBUG_PATHS, RUN_DEBUG_NAVIGATION, RUN_DEPLOY_REMOTE_DEBUG, diff --git a/editor/plugins/font_config_plugin.cpp b/editor/plugins/font_config_plugin.cpp index 2df951518e..ba11479714 100644 --- a/editor/plugins/font_config_plugin.cpp +++ b/editor/plugins/font_config_plugin.cpp @@ -622,6 +622,16 @@ void EditorPropertyOTFeatures::update_property() { supported = fd->get_supported_feature_list(); } + if (supported.is_empty()) { + edit->set_text(vformat(TTR("No supported features"))); + if (container) { + set_bottom_editor(nullptr); + memdelete(container); + button_add = nullptr; + container = nullptr; + } + return; + } edit->set_text(vformat(TTR("Features (%d of %d set)"), dict.size(), supported.size())); bool unfolded = get_edited_object()->editor_is_section_unfolded(get_edited_property()); diff --git a/editor/plugins/mesh_instance_3d_editor_plugin.cpp b/editor/plugins/mesh_instance_3d_editor_plugin.cpp index c502d47669..d5cdb70ccf 100644 --- a/editor/plugins/mesh_instance_3d_editor_plugin.cpp +++ b/editor/plugins/mesh_instance_3d_editor_plugin.cpp @@ -270,6 +270,24 @@ void MeshInstance3DEditor::_menu_option(int p_option) { case MENU_OPTION_CREATE_OUTLINE_MESH: { outline_dialog->popup_centered(Vector2(200, 90)); } break; + case MENU_OPTION_CREATE_DEBUG_TANGENTS: { + Ref<EditorUndoRedoManager> ur = EditorNode::get_singleton()->get_undo_redo(); + ur->create_action(TTR("Create Debug Tangents")); + + MeshInstance3D *tangents = node->create_debug_tangents_node(); + + if (tangents) { + Node *owner = get_tree()->get_edited_scene_root(); + + ur->add_do_reference(tangents); + ur->add_do_method(node, "add_child", tangents, true); + ur->add_do_method(tangents, "set_owner", owner); + + ur->add_undo_method(node, "remove_child", tangents); + } + + ur->commit_action(); + } break; case MENU_OPTION_CREATE_UV2: { Ref<ArrayMesh> mesh2 = node->get_mesh(); if (!mesh2.is_valid()) { @@ -511,6 +529,7 @@ MeshInstance3DEditor::MeshInstance3DEditor() { options->get_popup()->add_separator(); options->get_popup()->add_item(TTR("Create Outline Mesh..."), MENU_OPTION_CREATE_OUTLINE_MESH); options->get_popup()->set_item_tooltip(options->get_popup()->get_item_count() - 1, TTR("Creates a static outline mesh. The outline mesh will have its normals flipped automatically.\nThis can be used instead of the StandardMaterial Grow property when using that property isn't possible.")); + options->get_popup()->add_item(TTR("Create Debug Tangents"), MENU_OPTION_CREATE_DEBUG_TANGENTS); options->get_popup()->add_separator(); options->get_popup()->add_item(TTR("View UV1"), MENU_OPTION_DEBUG_UV1); options->get_popup()->add_item(TTR("View UV2"), MENU_OPTION_DEBUG_UV2); diff --git a/editor/plugins/mesh_instance_3d_editor_plugin.h b/editor/plugins/mesh_instance_3d_editor_plugin.h index 7968176744..88800227d1 100644 --- a/editor/plugins/mesh_instance_3d_editor_plugin.h +++ b/editor/plugins/mesh_instance_3d_editor_plugin.h @@ -46,6 +46,7 @@ class MeshInstance3DEditor : public Control { MENU_OPTION_CREATE_MULTIPLE_CONVEX_COLLISION_SHAPES, MENU_OPTION_CREATE_NAVMESH, MENU_OPTION_CREATE_OUTLINE_MESH, + MENU_OPTION_CREATE_DEBUG_TANGENTS, MENU_OPTION_CREATE_UV2, MENU_OPTION_DEBUG_UV1, MENU_OPTION_DEBUG_UV2, diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp index b9f3015837..33aad0ac61 100644 --- a/editor/plugins/node_3d_editor_plugin.cpp +++ b/editor/plugins/node_3d_editor_plugin.cpp @@ -1360,8 +1360,8 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { if (discard == EditorPlugin::AFTER_GUI_INPUT_STOP) { return; } - if (discard == EditorPlugin::AFTER_GUI_INPUT_DESELECT) { - after = EditorPlugin::AFTER_GUI_INPUT_DESELECT; + if (discard == EditorPlugin::AFTER_GUI_INPUT_CUSTOM) { + after = EditorPlugin::AFTER_GUI_INPUT_CUSTOM; } } } @@ -1373,8 +1373,8 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { if (discard == EditorPlugin::AFTER_GUI_INPUT_STOP) { return; } - if (discard == EditorPlugin::AFTER_GUI_INPUT_DESELECT) { - after = EditorPlugin::AFTER_GUI_INPUT_DESELECT; + if (discard == EditorPlugin::AFTER_GUI_INPUT_CUSTOM) { + after = EditorPlugin::AFTER_GUI_INPUT_CUSTOM; } } } @@ -1601,7 +1601,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { break; } - if (after != EditorPlugin::AFTER_GUI_INPUT_DESELECT) { + if (after != EditorPlugin::AFTER_GUI_INPUT_CUSTOM) { //clicking is always deferred to either move or release clicked = _select_ray(b->get_position()); selection_in_progress = true; @@ -1622,7 +1622,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { break; } - if (after != EditorPlugin::AFTER_GUI_INPUT_DESELECT) { + if (after != EditorPlugin::AFTER_GUI_INPUT_CUSTOM) { selection_in_progress = false; if (clicked.is_valid()) { @@ -5516,8 +5516,8 @@ Dictionary Node3DEditor::get_state() const { pd["sun_color"] = sun_color->get_pick_color(); pd["sun_energy"] = sun_energy->get_value(); - pd["sun_disabled"] = sun_button->is_pressed(); - pd["environ_disabled"] = environ_button->is_pressed(); + pd["sun_enabled"] = sun_button->is_pressed(); + pd["environ_enabled"] = environ_button->is_pressed(); d["preview_sun_env"] = pd; } @@ -5648,8 +5648,8 @@ void Node3DEditor::set_state(const Dictionary &p_state) { sun_color->set_pick_color(pd["sun_color"]); sun_energy->set_value(pd["sun_energy"]); - sun_button->set_pressed(pd["sun_disabled"]); - environ_button->set_pressed(pd["environ_disabled"]); + sun_button->set_pressed(pd["sun_enabled"]); + environ_button->set_pressed(pd["environ_enabled"]); sun_environ_updating = false; @@ -5657,8 +5657,8 @@ void Node3DEditor::set_state(const Dictionary &p_state) { _update_preview_environment(); } else { _load_default_preview_settings(); - sun_button->set_pressed(false); - environ_button->set_pressed(false); + sun_button->set_pressed(true); + environ_button->set_pressed(true); _preview_settings_changed(); _update_preview_environment(); } @@ -7159,8 +7159,8 @@ void Node3DEditor::_update_theme() { view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT), get_theme_icon(SNAME("Panels3Alt"), SNAME("EditorIcons"))); view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS), get_theme_icon(SNAME("Panels4"), SNAME("EditorIcons"))); - sun_button->set_icon(get_theme_icon(SNAME("DirectionalLight3D"), SNAME("EditorIcons"))); - environ_button->set_icon(get_theme_icon(SNAME("WorldEnvironment"), SNAME("EditorIcons"))); + sun_button->set_icon(get_theme_icon(SNAME("PreviewSun"), SNAME("EditorIcons"))); + environ_button->set_icon(get_theme_icon(SNAME("PreviewEnvironment"), SNAME("EditorIcons"))); sun_environ_settings->set_icon(get_theme_icon(SNAME("GuiTabMenuHl"), SNAME("EditorIcons"))); sun_title->add_theme_font_override("font", get_theme_font(SNAME("title_font"), SNAME("Window"))); @@ -7636,7 +7636,7 @@ void Node3DEditor::_load_default_preview_settings() { } void Node3DEditor::_update_preview_environment() { - bool disable_light = directional_light_count > 0 || sun_button->is_pressed(); + bool disable_light = directional_light_count > 0 || !sun_button->is_pressed(); sun_button->set_disabled(directional_light_count > 0); @@ -7645,6 +7645,7 @@ void Node3DEditor::_update_preview_environment() { preview_sun->get_parent()->remove_child(preview_sun); sun_state->show(); sun_vb->hide(); + preview_sun_dangling = true; } if (directional_light_count > 0) { @@ -7658,13 +7659,14 @@ void Node3DEditor::_update_preview_environment() { add_child(preview_sun, true); sun_state->hide(); sun_vb->show(); + preview_sun_dangling = false; } } sun_angle_altitude->set_value(-Math::rad_to_deg(sun_rotation.x)); sun_angle_azimuth->set_value(180.0 - Math::rad_to_deg(sun_rotation.y)); - bool disable_env = world_env_count > 0 || environ_button->is_pressed(); + bool disable_env = world_env_count > 0 || !environ_button->is_pressed(); environ_button->set_disabled(world_env_count > 0); @@ -7673,6 +7675,7 @@ void Node3DEditor::_update_preview_environment() { preview_environment->get_parent()->remove_child(preview_environment); environ_state->show(); environ_vb->hide(); + preview_env_dangling = true; } if (world_env_count > 0) { environ_state->set_text(TTR("Scene contains\nWorldEnvironment.\nPreview disabled.")); @@ -7685,6 +7688,7 @@ void Node3DEditor::_update_preview_environment() { add_child(preview_environment); environ_state->hide(); environ_vb->show(); + preview_env_dangling = false; } } } @@ -7854,7 +7858,8 @@ Node3DEditor::Node3DEditor() { sun_button->set_toggle_mode(true); sun_button->set_flat(true); sun_button->connect("pressed", callable_mp(this, &Node3DEditor::_update_preview_environment), CONNECT_DEFERRED); - sun_button->set_disabled(true); + // Preview is enabled by default - ensure this applies on editor startup when there is no state yet. + sun_button->set_pressed(true); main_menu_hbox->add_child(sun_button); @@ -7863,7 +7868,8 @@ Node3DEditor::Node3DEditor() { environ_button->set_toggle_mode(true); environ_button->set_flat(true); environ_button->connect("pressed", callable_mp(this, &Node3DEditor::_update_preview_environment), CONNECT_DEFERRED); - environ_button->set_disabled(true); + // Preview is enabled by default - ensure this applies on editor startup when there is no state yet. + environ_button->set_pressed(true); main_menu_hbox->add_child(environ_button); @@ -8148,7 +8154,7 @@ Node3DEditor::Node3DEditor() { CenterContainer *sun_direction_center = memnew(CenterContainer); sun_direction = memnew(Control); - sun_direction->set_custom_minimum_size(Size2i(128, 128) * EDSCALE); + sun_direction->set_custom_minimum_size(Size2(128, 128) * EDSCALE); sun_direction_center->add_child(sun_direction); sun_vb->add_margin_child(TTR("Sun Direction"), sun_direction_center); sun_direction->connect("gui_input", callable_mp(this, &Node3DEditor::_sun_direction_input)); @@ -8329,6 +8335,12 @@ void fragment() { } Node3DEditor::~Node3DEditor() { memdelete(preview_node); + if (preview_sun_dangling && preview_sun) { + memdelete(preview_sun); + } + if (preview_env_dangling && preview_environment) { + memdelete(preview_environment); + } } void Node3DEditorPlugin::make_visible(bool p_visible) { diff --git a/editor/plugins/node_3d_editor_plugin.h b/editor/plugins/node_3d_editor_plugin.h index 580cb878ce..c76f534c22 100644 --- a/editor/plugins/node_3d_editor_plugin.h +++ b/editor/plugins/node_3d_editor_plugin.h @@ -763,7 +763,9 @@ private: Button *sun_environ_settings = nullptr; DirectionalLight3D *preview_sun = nullptr; + bool preview_sun_dangling = false; WorldEnvironment *preview_environment = nullptr; + bool preview_env_dangling = false; Ref<Environment> environment; Ref<CameraAttributesPhysical> camera_attributes; Ref<ProceduralSkyMaterial> sky_material; diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp index 0a111aeb49..a3f2c2509f 100644 --- a/editor/plugins/script_editor_plugin.cpp +++ b/editor/plugins/script_editor_plugin.cpp @@ -49,6 +49,7 @@ #include "editor/find_in_files.h" #include "editor/node_dock.h" #include "editor/plugins/shader_editor_plugin.h" +#include "editor/plugins/text_shader_editor.h" #include "scene/main/window.h" #include "scene/scene_string_names.h" #include "script_text_editor.h" @@ -227,6 +228,7 @@ void ScriptEditorBase::_bind_methods() { // TODO: This signal is no use for VisualScript. ADD_SIGNAL(MethodInfo("search_in_files_requested", PropertyInfo(Variant::STRING, "text"))); ADD_SIGNAL(MethodInfo("replace_in_files_requested", PropertyInfo(Variant::STRING, "text"))); + ADD_SIGNAL(MethodInfo("go_to_method", PropertyInfo(Variant::OBJECT, "script"), PropertyInfo(Variant::STRING, "method"))); } class EditorScriptCodeCompletionCache : public ScriptCodeCompletionCache { @@ -1123,6 +1125,7 @@ TypedArray<Script> ScriptEditor::_get_open_scripts() const { bool ScriptEditor::toggle_scripts_panel() { list_split->set_visible(!list_split->is_visible()); + EditorSettings::get_singleton()->set_project_metadata("scripts_panel", "show_scripts_panel", list_split->is_visible()); return list_split->is_visible(); } @@ -1298,26 +1301,15 @@ void ScriptEditor::_menu_option(int p_option) { break; } - if (script != nullptr) { - Vector<DocData::ClassDoc> documentations = script->get_documentation(); - for (int j = 0; j < documentations.size(); j++) { - const DocData::ClassDoc &doc = documentations.get(j); - if (EditorHelp::get_doc_data()->has_doc(doc.name)) { - EditorHelp::get_doc_data()->remove_doc(doc.name); - } - } + if (script.is_valid()) { + clear_docs_from_script(script); } EditorNode::get_singleton()->push_item(resource.ptr()); EditorNode::get_singleton()->save_resource_as(resource); - if (script != nullptr) { - Vector<DocData::ClassDoc> documentations = script->get_documentation(); - for (int j = 0; j < documentations.size(); j++) { - const DocData::ClassDoc &doc = documentations.get(j); - EditorHelp::get_doc_data()->add_doc(doc); - update_doc(doc.name); - } + if (script.is_valid()) { + update_docs_from_script(script); } } break; @@ -1610,7 +1602,7 @@ void ScriptEditor::_notification(int p_what) { EditorNode::get_singleton()->disconnect("stop_pressed", callable_mp(this, &ScriptEditor::_editor_stop)); } break; - case NOTIFICATION_WM_WINDOW_FOCUS_IN: { + case NOTIFICATION_APPLICATION_FOCUS_IN: { _test_script_times_on_disk(); _update_modified_scripts_for_external_editor(); } break; @@ -2133,16 +2125,6 @@ void ScriptEditor::_update_script_names() { _update_script_colors(); } -void ScriptEditor::_update_script_connections() { - for (int i = 0; i < tab_container->get_tab_count(); i++) { - ScriptTextEditor *ste = Object::cast_to<ScriptTextEditor>(tab_container->get_tab_control(i)); - if (!ste) { - continue; - } - ste->_update_connected_methods(); - } -} - Ref<TextFile> ScriptEditor::_load_text_file(const String &p_path, Error *r_error) const { if (r_error) { *r_error = ERR_FILE_CANT_OPEN; @@ -2380,6 +2362,7 @@ bool ScriptEditor::edit(const Ref<Resource> &p_resource, int p_line, int p_col, se->connect("request_save_history", callable_mp(this, &ScriptEditor::_save_history)); se->connect("search_in_files_requested", callable_mp(this, &ScriptEditor::_on_find_in_files_requested)); se->connect("replace_in_files_requested", callable_mp(this, &ScriptEditor::_on_replace_in_files_requested)); + se->connect("go_to_method", callable_mp(this, &ScriptEditor::script_goto_method)); //test for modification, maybe the script was not edited but was loaded @@ -2424,14 +2407,8 @@ void ScriptEditor::save_current_script() { return; } - if (script != nullptr) { - Vector<DocData::ClassDoc> documentations = script->get_documentation(); - for (int j = 0; j < documentations.size(); j++) { - const DocData::ClassDoc &doc = documentations.get(j); - if (EditorHelp::get_doc_data()->has_doc(doc.name)) { - EditorHelp::get_doc_data()->remove_doc(doc.name); - } - } + if (script.is_valid()) { + clear_docs_from_script(script); } if (resource->is_built_in()) { @@ -2446,13 +2423,8 @@ void ScriptEditor::save_current_script() { EditorNode::get_singleton()->save_resource(resource); } - if (script != nullptr) { - Vector<DocData::ClassDoc> documentations = script->get_documentation(); - for (int j = 0; j < documentations.size(); j++) { - const DocData::ClassDoc &doc = documentations.get(j); - EditorHelp::get_doc_data()->add_doc(doc); - update_doc(doc.name); - } + if (script.is_valid()) { + update_docs_from_script(script); } } @@ -2497,25 +2469,14 @@ void ScriptEditor::save_all_scripts() { continue; } - if (script != nullptr) { - Vector<DocData::ClassDoc> documentations = script->get_documentation(); - for (int j = 0; j < documentations.size(); j++) { - const DocData::ClassDoc &doc = documentations.get(j); - if (EditorHelp::get_doc_data()->has_doc(doc.name)) { - EditorHelp::get_doc_data()->remove_doc(doc.name); - } - } + if (script.is_valid()) { + clear_docs_from_script(script); } EditorNode::get_singleton()->save_resource(edited_res); //external script, save it - if (script != nullptr) { - Vector<DocData::ClassDoc> documentations = script->get_documentation(); - for (int j = 0; j < documentations.size(); j++) { - const DocData::ClassDoc &doc = documentations.get(j); - EditorHelp::get_doc_data()->add_doc(doc); - update_doc(doc.name); - } + if (script.is_valid()) { + update_docs_from_script(script); } } else { // For built-in scripts, save their scenes instead. @@ -2544,7 +2505,7 @@ void ScriptEditor::apply_scripts() const { } } -void ScriptEditor::reload_scripts() { +void ScriptEditor::reload_scripts(bool p_refresh_only) { for (int i = 0; i < tab_container->get_tab_count(); i++) { ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_tab_control(i)); if (!se) { @@ -2557,30 +2518,33 @@ void ScriptEditor::reload_scripts() { continue; //internal script, who cares } - uint64_t last_date = edited_res->get_last_modified_time(); - uint64_t date = FileAccess::get_modified_time(edited_res->get_path()); + if (!p_refresh_only) { + uint64_t last_date = edited_res->get_last_modified_time(); + uint64_t date = FileAccess::get_modified_time(edited_res->get_path()); - if (last_date == date) { - continue; - } + if (last_date == date) { + continue; + } - Ref<Script> script = edited_res; - if (script != nullptr) { - Ref<Script> rel_script = ResourceLoader::load(script->get_path(), script->get_class(), ResourceFormatLoader::CACHE_MODE_IGNORE); - ERR_CONTINUE(!rel_script.is_valid()); - script->set_source_code(rel_script->get_source_code()); - script->set_last_modified_time(rel_script->get_last_modified_time()); - script->reload(true); - } + Ref<Script> script = edited_res; + if (script != nullptr) { + Ref<Script> rel_script = ResourceLoader::load(script->get_path(), script->get_class(), ResourceFormatLoader::CACHE_MODE_IGNORE); + ERR_CONTINUE(!rel_script.is_valid()); + script->set_source_code(rel_script->get_source_code()); + script->set_last_modified_time(rel_script->get_last_modified_time()); + script->reload(true); + } - Ref<TextFile> text_file = edited_res; - if (text_file != nullptr) { - Error err; - Ref<TextFile> rel_text_file = _load_text_file(text_file->get_path(), &err); - ERR_CONTINUE(!rel_text_file.is_valid()); - text_file->set_text(rel_text_file->get_text()); - text_file->set_last_modified_time(rel_text_file->get_last_modified_time()); + Ref<TextFile> text_file = edited_res; + if (text_file != nullptr) { + Error err; + Ref<TextFile> rel_text_file = _load_text_file(text_file->get_path(), &err); + ERR_CONTINUE(!rel_text_file.is_valid()); + text_file->set_text(rel_text_file->get_text()); + text_file->set_last_modified_time(rel_text_file->get_last_modified_time()); + } } + se->reload_text(); } @@ -2812,7 +2776,6 @@ void ScriptEditor::_tree_changed() { waiting_update_names = true; call_deferred(SNAME("_update_script_names")); - call_deferred(SNAME("_update_script_connections")); } void ScriptEditor::_split_dragged(float) { @@ -3059,26 +3022,15 @@ void ScriptEditor::shortcut_input(const Ref<InputEvent> &p_event) { } } -void ScriptEditor::_script_list_gui_input(const Ref<InputEvent> &ev) { - Ref<InputEventMouseButton> mb = ev; - if (mb.is_valid() && mb->is_pressed()) { - switch (mb->get_button_index()) { - case MouseButton::MIDDLE: { - // Right-click selects automatically; middle-click does not. - int idx = script_list->get_item_at_position(mb->get_position(), true); - if (idx >= 0) { - script_list->select(idx); - _script_selected(idx); - _menu_option(FILE_CLOSE); - } - } break; +void ScriptEditor::_script_list_clicked(int p_item, Vector2 p_local_mouse_pos, MouseButton p_mouse_button_index) { + if (p_mouse_button_index == MouseButton::MIDDLE) { + script_list->select(p_item); + _script_selected(p_item); + _menu_option(FILE_CLOSE); + } - case MouseButton::RIGHT: { - _make_script_list_context_menu(); - } break; - default: - break; - } + if (p_mouse_button_index == MouseButton::RIGHT) { + _make_script_list_context_menu(); } } @@ -3346,6 +3298,29 @@ void ScriptEditor::update_doc(const String &p_name) { } } +void ScriptEditor::clear_docs_from_script(const Ref<Script> &p_script) { + ERR_FAIL_COND(p_script.is_null()); + + Vector<DocData::ClassDoc> documentations = p_script->get_documentation(); + for (int j = 0; j < documentations.size(); j++) { + const DocData::ClassDoc &doc = documentations.get(j); + if (EditorHelp::get_doc_data()->has_doc(doc.name)) { + EditorHelp::get_doc_data()->remove_doc(doc.name); + } + } +} + +void ScriptEditor::update_docs_from_script(const Ref<Script> &p_script) { + ERR_FAIL_COND(p_script.is_null()); + + Vector<DocData::ClassDoc> documentations = p_script->get_documentation(); + for (int j = 0; j < documentations.size(); j++) { + const DocData::ClassDoc &doc = documentations.get(j); + EditorHelp::get_doc_data()->add_doc(doc); + update_doc(doc.name); + } +} + void ScriptEditor::_update_selected_editor_menu() { for (int i = 0; i < tab_container->get_tab_count(); i++) { bool current = tab_container->get_current_tab() == i; @@ -3368,10 +3343,12 @@ void ScriptEditor::_update_selected_editor_menu() { script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find_previous", TTR("Find Previous"), KeyModifierMask::SHIFT | Key::F3), HELP_SEARCH_FIND_PREVIOUS); script_search_menu->get_popup()->add_separator(); script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find_in_files", TTR("Find in Files"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::F), SEARCH_IN_FILES); + script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/replace_in_files", TTR("Replace in Files"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::R), REPLACE_IN_FILES); script_search_menu->show(); } else { if (tab_container->get_tab_count() == 0) { script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find_in_files", TTR("Find in Files"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::F), SEARCH_IN_FILES); + script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/replace_in_files", TTR("Replace in Files"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::R), REPLACE_IN_FILES); script_search_menu->show(); } else { script_search_menu->hide(); @@ -3618,7 +3595,6 @@ void ScriptEditor::_bind_methods() { ClassDB::bind_method("_goto_script_line2", &ScriptEditor::_goto_script_line2); ClassDB::bind_method("_copy_script_path", &ScriptEditor::_copy_script_path); - ClassDB::bind_method("_update_script_connections", &ScriptEditor::_update_script_connections); ClassDB::bind_method("_help_class_open", &ScriptEditor::_help_class_open); ClassDB::bind_method("_help_tab_goto", &ScriptEditor::_help_tab_goto); ClassDB::bind_method("_live_auto_reload_running_scripts", &ScriptEditor::_live_auto_reload_running_scripts); @@ -3688,7 +3664,7 @@ ScriptEditor::ScriptEditor() { script_list->set_v_size_flags(SIZE_EXPAND_FILL); script_split->set_split_offset(70 * EDSCALE); _sort_list_on_update = true; - script_list->connect("gui_input", callable_mp(this, &ScriptEditor::_script_list_gui_input), CONNECT_DEFERRED); + script_list->connect("item_clicked", callable_mp(this, &ScriptEditor::_script_list_clicked), CONNECT_DEFERRED); script_list->set_allow_rmb_select(true); script_list->set_drag_forwarding(this); @@ -3701,6 +3677,7 @@ ScriptEditor::ScriptEditor() { overview_vbox->set_v_size_flags(SIZE_EXPAND_FILL); list_split->add_child(overview_vbox); + list_split->set_visible(EditorSettings::get_singleton()->get_project_metadata("scripts_panel", "show_scripts_panel", true)); buttons_hbox = memnew(HBoxContainer); overview_vbox->add_child(buttons_hbox); diff --git a/editor/plugins/script_editor_plugin.h b/editor/plugins/script_editor_plugin.h index a8e6cc6868..aab713c9a3 100644 --- a/editor/plugins/script_editor_plugin.h +++ b/editor/plugins/script_editor_plugin.h @@ -403,7 +403,6 @@ class ScriptEditor : public PanelContainer { void _filter_scripts_text_changed(const String &p_newtext); void _filter_methods_text_changed(const String &p_newtext); void _update_script_names(); - void _update_script_connections(); bool _sort_list_on_update; void _members_overview_selected(int p_idx); @@ -426,7 +425,7 @@ class ScriptEditor : public PanelContainer { virtual void input(const Ref<InputEvent> &p_event) override; virtual void shortcut_input(const Ref<InputEvent> &p_event) override; - void _script_list_gui_input(const Ref<InputEvent> &ev); + void _script_list_clicked(int p_item, Vector2 p_local_mouse_pos, MouseButton p_mouse_button_index); void _make_script_list_context_menu(); void _help_search(String p_text); @@ -477,7 +476,7 @@ public: bool toggle_scripts_panel(); bool is_scripts_panel_toggled(); void apply_scripts() const; - void reload_scripts(); + void reload_scripts(bool p_refresh_only = false); void open_script_create_dialog(const String &p_base_name, const String &p_base_path); void open_text_file_create_dialog(const String &p_base_path, const String &p_base_name = ""); Ref<Resource> open_file(const String &p_file); @@ -509,6 +508,8 @@ public: void goto_help(const String &p_desc) { _help_class_goto(p_desc); } void update_doc(const String &p_name); + void clear_docs_from_script(const Ref<Script> &p_script); + void update_docs_from_script(const Ref<Script> &p_script); bool can_take_away_focus() const; diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp index 42dcfb8b1f..a1d24907e5 100644 --- a/editor/plugins/script_text_editor.cpp +++ b/editor/plugins/script_text_editor.cpp @@ -289,6 +289,7 @@ void ScriptTextEditor::reload_text() { te->tag_saved_version(); code_editor->update_line_and_column(); + _validate_script(); } void ScriptTextEditor::add_callback(const String &p_function, PackedStringArray p_args) { @@ -956,10 +957,7 @@ void ScriptTextEditor::_update_connected_methods() { CodeEdit *text_edit = code_editor->get_text_editor(); text_edit->set_gutter_width(connection_gutter, text_edit->get_line_height()); for (int i = 0; i < text_edit->get_line_count(); i++) { - if (text_edit->get_line_gutter_metadata(i, connection_gutter) == "") { - continue; - } - text_edit->set_line_gutter_metadata(i, connection_gutter, ""); + text_edit->set_line_gutter_metadata(i, connection_gutter, Dictionary()); text_edit->set_line_gutter_icon(i, connection_gutter, nullptr); text_edit->set_line_gutter_clickable(i, connection_gutter, false); } @@ -974,6 +972,7 @@ void ScriptTextEditor::_update_connected_methods() { return; } + // Add connection icons to methods. Vector<Node *> nodes = _find_all_node_for_script(base, base, script); HashSet<StringName> methods_found; for (int i = 0; i < nodes.size(); i++) { @@ -1002,8 +1001,11 @@ void ScriptTextEditor::_update_connected_methods() { for (int j = 0; j < functions.size(); j++) { String name = functions[j].get_slice(":", 0); if (name == method) { + Dictionary line_meta; + line_meta["type"] = "connection"; + line_meta["method"] = method; line = functions[j].get_slice(":", 1).to_int() - 1; - text_edit->set_line_gutter_metadata(line, connection_gutter, method); + text_edit->set_line_gutter_metadata(line, connection_gutter, line_meta); text_edit->set_line_gutter_icon(line, connection_gutter, get_parent_control()->get_theme_icon(SNAME("Slot"), SNAME("EditorIcons"))); text_edit->set_line_gutter_clickable(line, connection_gutter, true); methods_found.insert(method); @@ -1033,6 +1035,66 @@ void ScriptTextEditor::_update_connected_methods() { } } } + + // Add override icons to methods. + methods_found.clear(); + for (int i = 0; i < functions.size(); i++) { + StringName name = StringName(functions[i].get_slice(":", 0)); + if (methods_found.has(name)) { + continue; + } + + String found_base_class; + StringName base_class = script->get_instance_base_type(); + Ref<Script> inherited_script = script->get_base_script(); + while (!inherited_script.is_null()) { + if (inherited_script->has_method(name)) { + found_base_class = "script:" + inherited_script->get_path(); + break; + } + + base_class = inherited_script->get_instance_base_type(); + inherited_script = inherited_script->get_base_script(); + } + + if (found_base_class.is_empty()) { + while (base_class) { + List<MethodInfo> methods; + ClassDB::get_method_list(base_class, &methods, true); + for (int j = 0; j < methods.size(); j++) { + if (methods[j].name == name) { + found_base_class = "builtin:" + base_class; + break; + } + } + + ClassDB::ClassInfo *base_class_ptr = ClassDB::classes.getptr(base_class)->inherits_ptr; + if (base_class_ptr == nullptr) { + break; + } + base_class = base_class_ptr->name; + } + } + + if (!found_base_class.is_empty()) { + int line = functions[i].get_slice(":", 1).to_int() - 1; + + Dictionary line_meta = text_edit->get_line_gutter_metadata(line, connection_gutter); + if (line_meta.is_empty()) { + // Add override icon to gutter. + line_meta["type"] = "inherits"; + line_meta["method"] = name; + line_meta["base_class"] = found_base_class; + text_edit->set_line_gutter_icon(line, connection_gutter, get_parent_control()->get_theme_icon(SNAME("MethodOverride"), SNAME("EditorIcons"))); + text_edit->set_line_gutter_clickable(line, connection_gutter, true); + } else { + // If method is also connected to signal, then merge icons and keep the click behavior of the slot. + text_edit->set_line_gutter_icon(line, connection_gutter, get_parent_control()->get_theme_icon(SNAME("MethodOverrideAndSlot"), SNAME("EditorIcons"))); + } + + methods_found.insert(name); + } + } } void ScriptTextEditor::_update_gutter_indexes() { @@ -1054,18 +1116,40 @@ void ScriptTextEditor::_gutter_clicked(int p_line, int p_gutter) { return; } - String method = code_editor->get_text_editor()->get_line_gutter_metadata(p_line, p_gutter); - if (method.is_empty()) { + Dictionary meta = code_editor->get_text_editor()->get_line_gutter_metadata(p_line, p_gutter); + String type = meta.get("type", ""); + if (type.is_empty()) { return; } - Node *base = get_tree()->get_edited_scene_root(); - if (!base) { + // All types currently need a method name. + String method = meta.get("method", ""); + if (method.is_empty()) { return; } - Vector<Node *> nodes = _find_all_node_for_script(base, base, script); - connection_info_dialog->popup_connections(method, nodes); + if (type == "connection") { + Node *base = get_tree()->get_edited_scene_root(); + if (!base) { + return; + } + + Vector<Node *> nodes = _find_all_node_for_script(base, base, script); + connection_info_dialog->popup_connections(method, nodes); + } else if (type == "inherits") { + String base_class_raw = meta["base_class"]; + PackedStringArray base_class_split = base_class_raw.split(":", true, 1); + + if (base_class_split[0] == "script") { + // Go to function declaration. + Ref<Script> base_script = ResourceLoader::load(base_class_split[1]); + ERR_FAIL_COND(!base_script.is_valid()); + emit_signal(SNAME("go_to_method"), base_script, method); + } else if (base_class_split[0] == "builtin") { + // Open method documentation. + emit_signal(SNAME("go_to_help"), "class_method:" + base_class_split[1] + ":" + method); + } + } } void ScriptTextEditor::_edit_option(int p_op) { @@ -1102,21 +1186,19 @@ void ScriptTextEditor::_edit_option(int p_op) { case EDIT_MOVE_LINE_DOWN: { code_editor->move_lines_down(); } break; - case EDIT_INDENT_LEFT: { + case EDIT_INDENT: { Ref<Script> scr = script; if (scr.is_null()) { return; } - - tx->unindent_lines(); + tx->indent_lines(); } break; - case EDIT_INDENT_RIGHT: { + case EDIT_UNINDENT: { Ref<Script> scr = script; if (scr.is_null()) { return; } - - tx->indent_lines(); + tx->unindent_lines(); } break; case EDIT_DELETE_LINE: { code_editor->delete_lines(); @@ -1487,16 +1569,17 @@ bool ScriptTextEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_ } static Node *_find_script_node(Node *p_edited_scene, Node *p_current_node, const Ref<Script> &script) { - if (p_edited_scene != p_current_node && p_current_node->get_owner() != p_edited_scene) { - return nullptr; - } - - Ref<Script> scr = p_current_node->get_script(); - - if (scr.is_valid() && scr == script) { - return p_current_node; + // Check scripts only for the nodes belonging to the edited scene. + if (p_current_node == p_edited_scene || p_current_node->get_owner() == p_edited_scene) { + Ref<Script> scr = p_current_node->get_script(); + if (scr.is_valid() && scr == script) { + return p_current_node; + } } + // Traverse all children, even the ones not owned by the edited scene as they + // can still have child nodes added within the edited scene and thus owned by + // it (e.g. nodes added to subscene's root or to its editable children). for (int i = 0; i < p_current_node->get_child_count(); i++) { Node *n = _find_script_node(p_edited_scene, p_current_node->get_child(i), script); if (n) { @@ -1558,8 +1641,13 @@ void ScriptTextEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data } if (d.has("type") && String(d["type"]) == "nodes") { - Node *sn = _find_script_node(get_tree()->get_edited_scene_root(), get_tree()->get_edited_scene_root(), script); + Node *scene_root = get_tree()->get_edited_scene_root(); + if (!scene_root) { + EditorNode::get_singleton()->show_warning(TTR("Can't drop nodes without an open scene.")); + return; + } + Node *sn = _find_script_node(scene_root, scene_root, script); if (!sn) { EditorNode::get_singleton()->show_warning(vformat(TTR("Can't drop nodes because script '%s' is not used in this scene."), get_name())); return; @@ -1786,8 +1874,8 @@ void ScriptTextEditor::_make_context_menu(bool p_selection, bool p_color, bool p context_menu->add_shortcut(ED_GET_SHORTCUT("ui_text_select_all"), EDIT_SELECT_ALL); context_menu->add_separator(); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_left"), EDIT_INDENT_LEFT); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_right"), EDIT_INDENT_RIGHT); + context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent"), EDIT_INDENT); + context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/unindent"), EDIT_UNINDENT); context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_comment"), EDIT_TOGGLE_COMMENT); context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_bookmark"), BOOKMARK_TOGGLE); @@ -1884,6 +1972,7 @@ void ScriptTextEditor::_enable_code_editor() { search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/replace"), SEARCH_REPLACE); search_menu->get_popup()->add_separator(); search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_in_files"), SEARCH_IN_FILES); + search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/replace_in_files"), REPLACE_IN_FILES); search_menu->get_popup()->add_separator(); search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/contextual_help"), HELP_CONTEXTUAL); search_menu->get_popup()->connect("id_pressed", callable_mp(this, &ScriptTextEditor::_edit_option)); @@ -1901,8 +1990,8 @@ void ScriptTextEditor::_enable_code_editor() { edit_menu->get_popup()->add_separator(); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/move_up"), EDIT_MOVE_LINE_UP); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/move_down"), EDIT_MOVE_LINE_DOWN); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_left"), EDIT_INDENT_LEFT); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_right"), EDIT_INDENT_RIGHT); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent"), EDIT_INDENT); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/unindent"), EDIT_UNINDENT); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/delete_line"), EDIT_DELETE_LINE); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_comment"), EDIT_TOGGLE_COMMENT); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_fold_line"), EDIT_TOGGLE_FOLD_LINE); @@ -1932,7 +2021,6 @@ void ScriptTextEditor::_enable_code_editor() { _load_theme_settings(); - search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/replace_in_files"), REPLACE_IN_FILES); edit_hb->add_child(goto_menu); goto_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/goto_function"), SEARCH_LOCATE_FUNCTION); goto_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/goto_line"), SEARCH_GOTO_LINE); @@ -2077,8 +2165,8 @@ void ScriptTextEditor::register_editor() { // Leave these at zero, same can be accomplished with tab/shift-tab, including selection. // The next/previous in history shortcut in this case makes a lot more sense. - ED_SHORTCUT("script_text_editor/indent_left", TTR("Indent Left"), Key::NONE); - ED_SHORTCUT("script_text_editor/indent_right", TTR("Indent Right"), Key::NONE); + ED_SHORTCUT("script_text_editor/indent", TTR("Indent"), Key::NONE); + ED_SHORTCUT("script_text_editor/unindent", TTR("Unindent"), KeyModifierMask::SHIFT | Key::TAB); ED_SHORTCUT("script_text_editor/toggle_comment", TTR("Toggle Comment"), KeyModifierMask::CMD_OR_CTRL | Key::K); ED_SHORTCUT("script_text_editor/toggle_fold_line", TTR("Fold/Unfold Line"), KeyModifierMask::ALT | Key::F); ED_SHORTCUT("script_text_editor/fold_all_lines", TTR("Fold All Lines"), Key::NONE); diff --git a/editor/plugins/script_text_editor.h b/editor/plugins/script_text_editor.h index 8d2fb98721..99fafb2192 100644 --- a/editor/plugins/script_text_editor.h +++ b/editor/plugins/script_text_editor.h @@ -117,8 +117,8 @@ class ScriptTextEditor : public ScriptEditorBase { EDIT_TOGGLE_COMMENT, EDIT_MOVE_LINE_UP, EDIT_MOVE_LINE_DOWN, - EDIT_INDENT_RIGHT, - EDIT_INDENT_LEFT, + EDIT_INDENT, + EDIT_UNINDENT, EDIT_DELETE_LINE, EDIT_DUPLICATE_SELECTION, EDIT_PICK_COLOR, diff --git a/editor/plugins/shader_editor_plugin.cpp b/editor/plugins/shader_editor_plugin.cpp index 246bc4b183..456c28d887 100644 --- a/editor/plugins/shader_editor_plugin.cpp +++ b/editor/plugins/shader_editor_plugin.cpp @@ -30,1168 +30,12 @@ #include "shader_editor_plugin.h" -#include "core/io/resource_loader.h" -#include "core/io/resource_saver.h" -#include "core/os/keyboard.h" -#include "core/os/os.h" -#include "core/version_generated.gen.h" #include "editor/editor_node.h" #include "editor/editor_scale.h" -#include "editor/editor_settings.h" #include "editor/filesystem_dock.h" +#include "editor/plugins/text_shader_editor.h" #include "editor/plugins/visual_shader_editor_plugin.h" -#include "editor/project_settings_editor.h" #include "editor/shader_create_dialog.h" -#include "scene/gui/split_container.h" -#include "servers/display_server.h" -#include "servers/rendering/shader_preprocessor.h" -#include "servers/rendering/shader_types.h" - -/*** SHADER SYNTAX HIGHLIGHTER ****/ - -Dictionary GDShaderSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_line) { - Dictionary color_map; - - for (const Point2i ®ion : disabled_branch_regions) { - if (p_line >= region.x && p_line <= region.y) { - Dictionary highlighter_info; - highlighter_info["color"] = disabled_branch_color; - - color_map[0] = highlighter_info; - return color_map; - } - } - - return CodeHighlighter::_get_line_syntax_highlighting_impl(p_line); -} - -void GDShaderSyntaxHighlighter::add_disabled_branch_region(const Point2i &p_region) { - ERR_FAIL_COND(p_region.x < 0); - ERR_FAIL_COND(p_region.y < 0); - - for (int i = 0; i < disabled_branch_regions.size(); i++) { - ERR_FAIL_COND_MSG(disabled_branch_regions[i].x == p_region.x, "Branch region with a start line '" + itos(p_region.x) + "' already exists."); - } - - Point2i disabled_branch_region; - disabled_branch_region.x = p_region.x; - disabled_branch_region.y = p_region.y; - disabled_branch_regions.push_back(disabled_branch_region); - - clear_highlighting_cache(); -} - -void GDShaderSyntaxHighlighter::clear_disabled_branch_regions() { - disabled_branch_regions.clear(); - clear_highlighting_cache(); -} - -void GDShaderSyntaxHighlighter::set_disabled_branch_color(const Color &p_color) { - disabled_branch_color = p_color; - clear_highlighting_cache(); -} - -/*** SHADER SCRIPT EDITOR ****/ - -static bool saved_warnings_enabled = false; -static bool saved_treat_warning_as_errors = false; -static HashMap<ShaderWarning::Code, bool> saved_warnings; -static uint32_t saved_warning_flags = 0U; - -void ShaderTextEditor::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_THEME_CHANGED: { - if (is_visible_in_tree()) { - _load_theme_settings(); - if (warnings.size() > 0 && last_compile_result == OK) { - warnings_panel->clear(); - _update_warning_panel(); - } - } - } break; - } -} - -Ref<Shader> ShaderTextEditor::get_edited_shader() const { - return shader; -} - -Ref<ShaderInclude> ShaderTextEditor::get_edited_shader_include() const { - return shader_inc; -} - -void ShaderTextEditor::set_edited_shader(const Ref<Shader> &p_shader) { - set_edited_shader(p_shader, p_shader->get_code()); -} - -void ShaderTextEditor::set_edited_shader(const Ref<Shader> &p_shader, const String &p_code) { - if (shader == p_shader) { - return; - } - if (shader.is_valid()) { - shader->disconnect(SNAME("changed"), callable_mp(this, &ShaderTextEditor::_shader_changed)); - } - shader = p_shader; - shader_inc = Ref<ShaderInclude>(); - - set_edited_code(p_code); - - if (shader.is_valid()) { - shader->connect(SNAME("changed"), callable_mp(this, &ShaderTextEditor::_shader_changed)); - } -} - -void ShaderTextEditor::set_edited_shader_include(const Ref<ShaderInclude> &p_shader_inc) { - set_edited_shader_include(p_shader_inc, p_shader_inc->get_code()); -} - -void ShaderTextEditor::_shader_changed() { - // This function is used for dependencies (include changing changes main shader and forces it to revalidate) - if (block_shader_changed) { - return; - } - dependencies_version++; - _validate_script(); -} - -void ShaderTextEditor::set_edited_shader_include(const Ref<ShaderInclude> &p_shader_inc, const String &p_code) { - if (shader_inc == p_shader_inc) { - return; - } - if (shader_inc.is_valid()) { - shader_inc->disconnect(SNAME("changed"), callable_mp(this, &ShaderTextEditor::_shader_changed)); - } - shader_inc = p_shader_inc; - shader = Ref<Shader>(); - - set_edited_code(p_code); - - if (shader_inc.is_valid()) { - shader_inc->connect(SNAME("changed"), callable_mp(this, &ShaderTextEditor::_shader_changed)); - } -} - -void ShaderTextEditor::set_edited_code(const String &p_code) { - _load_theme_settings(); - - get_text_editor()->set_text(p_code); - get_text_editor()->clear_undo_history(); - get_text_editor()->call_deferred(SNAME("set_h_scroll"), 0); - get_text_editor()->call_deferred(SNAME("set_v_scroll"), 0); - get_text_editor()->tag_saved_version(); - - _validate_script(); - _line_col_changed(); -} - -void ShaderTextEditor::reload_text() { - ERR_FAIL_COND(shader.is_null()); - - CodeEdit *te = get_text_editor(); - int column = te->get_caret_column(); - int row = te->get_caret_line(); - int h = te->get_h_scroll(); - int v = te->get_v_scroll(); - - te->set_text(shader->get_code()); - te->set_caret_line(row); - te->set_caret_column(column); - te->set_h_scroll(h); - te->set_v_scroll(v); - - te->tag_saved_version(); - - update_line_and_column(); -} - -void ShaderTextEditor::set_warnings_panel(RichTextLabel *p_warnings_panel) { - warnings_panel = p_warnings_panel; -} - -void ShaderTextEditor::_load_theme_settings() { - CodeEdit *text_editor = get_text_editor(); - Color updated_marked_line_color = EDITOR_GET("text_editor/theme/highlighting/mark_color"); - if (updated_marked_line_color != marked_line_color) { - for (int i = 0; i < text_editor->get_line_count(); i++) { - if (text_editor->get_line_background_color(i) == marked_line_color) { - text_editor->set_line_background_color(i, updated_marked_line_color); - } - } - marked_line_color = updated_marked_line_color; - } - - syntax_highlighter->set_number_color(EDITOR_GET("text_editor/theme/highlighting/number_color")); - syntax_highlighter->set_symbol_color(EDITOR_GET("text_editor/theme/highlighting/symbol_color")); - syntax_highlighter->set_function_color(EDITOR_GET("text_editor/theme/highlighting/function_color")); - syntax_highlighter->set_member_variable_color(EDITOR_GET("text_editor/theme/highlighting/member_variable_color")); - - syntax_highlighter->clear_keyword_colors(); - - const Color keyword_color = EDITOR_GET("text_editor/theme/highlighting/keyword_color"); - const Color control_flow_keyword_color = EDITOR_GET("text_editor/theme/highlighting/control_flow_keyword_color"); - - List<String> keywords; - ShaderLanguage::get_keyword_list(&keywords); - - for (const String &E : keywords) { - if (ShaderLanguage::is_control_flow_keyword(E)) { - syntax_highlighter->add_keyword_color(E, control_flow_keyword_color); - } else { - syntax_highlighter->add_keyword_color(E, keyword_color); - } - } - - List<String> pp_keywords; - ShaderPreprocessor::get_keyword_list(&pp_keywords, false); - - for (const String &E : pp_keywords) { - syntax_highlighter->add_keyword_color(E, keyword_color); - } - - // Colorize built-ins like `COLOR` differently to make them easier - // to distinguish from keywords at a quick glance. - - List<String> built_ins; - - if (shader_inc.is_valid()) { - for (int i = 0; i < RenderingServer::SHADER_MAX; i++) { - for (const KeyValue<StringName, ShaderLanguage::FunctionInfo> &E : ShaderTypes::get_singleton()->get_functions(RenderingServer::ShaderMode(i))) { - for (const KeyValue<StringName, ShaderLanguage::BuiltInInfo> &F : E.value.built_ins) { - built_ins.push_back(F.key); - } - } - - const Vector<ShaderLanguage::ModeInfo> &modes = ShaderTypes::get_singleton()->get_modes(RenderingServer::ShaderMode(i)); - - for (int j = 0; j < modes.size(); j++) { - const ShaderLanguage::ModeInfo &info = modes[j]; - - if (!info.options.is_empty()) { - for (int k = 0; k < info.options.size(); k++) { - built_ins.push_back(String(info.name) + "_" + String(info.options[k])); - } - } else { - built_ins.push_back(String(info.name)); - } - } - } - } else if (shader.is_valid()) { - for (const KeyValue<StringName, ShaderLanguage::FunctionInfo> &E : ShaderTypes::get_singleton()->get_functions(RenderingServer::ShaderMode(shader->get_mode()))) { - for (const KeyValue<StringName, ShaderLanguage::BuiltInInfo> &F : E.value.built_ins) { - built_ins.push_back(F.key); - } - } - - const Vector<ShaderLanguage::ModeInfo> &modes = ShaderTypes::get_singleton()->get_modes(RenderingServer::ShaderMode(shader->get_mode())); - - for (int i = 0; i < modes.size(); i++) { - const ShaderLanguage::ModeInfo &info = modes[i]; - - if (!info.options.is_empty()) { - for (int j = 0; j < info.options.size(); j++) { - built_ins.push_back(String(info.name) + "_" + String(info.options[j])); - } - } else { - built_ins.push_back(String(info.name)); - } - } - } - - const Color user_type_color = EDITOR_GET("text_editor/theme/highlighting/user_type_color"); - - for (const String &E : built_ins) { - syntax_highlighter->add_keyword_color(E, user_type_color); - } - - // Colorize comments. - const Color comment_color = EDITOR_GET("text_editor/theme/highlighting/comment_color"); - syntax_highlighter->clear_color_regions(); - syntax_highlighter->add_color_region("/*", "*/", comment_color, false); - syntax_highlighter->add_color_region("//", "", comment_color, true); - syntax_highlighter->set_disabled_branch_color(comment_color); - - text_editor->clear_comment_delimiters(); - text_editor->add_comment_delimiter("/*", "*/", false); - text_editor->add_comment_delimiter("//", "", true); - - if (!text_editor->has_auto_brace_completion_open_key("/*")) { - text_editor->add_auto_brace_completion_pair("/*", "*/"); - } - - // Colorize preprocessor include strings. - const Color string_color = EDITOR_GET("text_editor/theme/highlighting/string_color"); - syntax_highlighter->add_color_region("\"", "\"", string_color, false); - - if (warnings_panel) { - // Warnings panel. - warnings_panel->add_theme_font_override("normal_font", EditorNode::get_singleton()->get_gui_base()->get_theme_font(SNAME("main"), SNAME("EditorFonts"))); - warnings_panel->add_theme_font_size_override("normal_font_size", EditorNode::get_singleton()->get_gui_base()->get_theme_font_size(SNAME("main_size"), SNAME("EditorFonts"))); - } -} - -void ShaderTextEditor::_check_shader_mode() { - String type = ShaderLanguage::get_shader_type(get_text_editor()->get_text()); - - Shader::Mode mode; - - if (type == "canvas_item") { - mode = Shader::MODE_CANVAS_ITEM; - } else if (type == "particles") { - mode = Shader::MODE_PARTICLES; - } else if (type == "sky") { - mode = Shader::MODE_SKY; - } else if (type == "fog") { - mode = Shader::MODE_FOG; - } else { - mode = Shader::MODE_SPATIAL; - } - - if (shader->get_mode() != mode) { - set_block_shader_changed(true); - shader->set_code(get_text_editor()->get_text()); - set_block_shader_changed(false); - _load_theme_settings(); - } -} - -static ShaderLanguage::DataType _get_global_shader_uniform_type(const StringName &p_variable) { - RS::GlobalShaderParameterType gvt = RS::get_singleton()->global_shader_parameter_get_type(p_variable); - return (ShaderLanguage::DataType)RS::global_shader_uniform_type_get_shader_datatype(gvt); -} - -static String complete_from_path; - -static void _complete_include_paths_search(EditorFileSystemDirectory *p_efsd, List<ScriptLanguage::CodeCompletionOption> *r_options) { - if (!p_efsd) { - return; - } - for (int i = 0; i < p_efsd->get_file_count(); i++) { - if (p_efsd->get_file_type(i) == SNAME("ShaderInclude")) { - String path = p_efsd->get_file_path(i); - if (path.begins_with(complete_from_path)) { - path = path.replace_first(complete_from_path, ""); - } - r_options->push_back(ScriptLanguage::CodeCompletionOption(path, ScriptLanguage::CODE_COMPLETION_KIND_FILE_PATH)); - } - } - for (int j = 0; j < p_efsd->get_subdir_count(); j++) { - _complete_include_paths_search(p_efsd->get_subdir(j), r_options); - } -} - -static void _complete_include_paths(List<ScriptLanguage::CodeCompletionOption> *r_options) { - _complete_include_paths_search(EditorFileSystem::get_singleton()->get_filesystem(), r_options); -} - -void ShaderTextEditor::_code_complete_script(const String &p_code, List<ScriptLanguage::CodeCompletionOption> *r_options) { - List<ScriptLanguage::CodeCompletionOption> pp_options; - ShaderPreprocessor preprocessor; - String code; - complete_from_path = (shader.is_valid() ? shader->get_path() : shader_inc->get_path()).get_base_dir(); - if (!complete_from_path.ends_with("/")) { - complete_from_path += "/"; - } - preprocessor.preprocess(p_code, "", code, nullptr, nullptr, nullptr, nullptr, &pp_options, _complete_include_paths); - complete_from_path = String(); - if (pp_options.size()) { - for (const ScriptLanguage::CodeCompletionOption &E : pp_options) { - r_options->push_back(E); - } - return; - } - - ShaderLanguage sl; - String calltip; - ShaderLanguage::ShaderCompileInfo info; - info.global_shader_uniform_type_func = _get_global_shader_uniform_type; - - if (shader.is_null()) { - info.is_include = true; - - sl.complete(code, info, r_options, calltip); - get_text_editor()->set_code_hint(calltip); - return; - } - _check_shader_mode(); - info.functions = ShaderTypes::get_singleton()->get_functions(RenderingServer::ShaderMode(shader->get_mode())); - info.render_modes = ShaderTypes::get_singleton()->get_modes(RenderingServer::ShaderMode(shader->get_mode())); - info.shader_types = ShaderTypes::get_singleton()->get_types(); - - sl.complete(code, info, r_options, calltip); - get_text_editor()->set_code_hint(calltip); -} - -void ShaderTextEditor::_validate_script() { - emit_signal(SNAME("script_changed")); // Ensure to notify that it changed, so it is applied - - String code; - - if (shader.is_valid()) { - _check_shader_mode(); - code = shader->get_code(); - } else { - code = shader_inc->get_code(); - } - - ShaderPreprocessor preprocessor; - String code_pp; - String error_pp; - List<ShaderPreprocessor::FilePosition> err_positions; - List<ShaderPreprocessor::Region> regions; - String filename; - if (shader.is_valid()) { - filename = shader->get_path(); - } else if (shader_inc.is_valid()) { - filename = shader_inc->get_path(); - } - last_compile_result = preprocessor.preprocess(code, filename, code_pp, &error_pp, &err_positions, ®ions); - - for (int i = 0; i < get_text_editor()->get_line_count(); i++) { - get_text_editor()->set_line_background_color(i, Color(0, 0, 0, 0)); - } - - syntax_highlighter->clear_disabled_branch_regions(); - for (const ShaderPreprocessor::Region ®ion : regions) { - if (!region.enabled) { - if (filename != region.file) { - continue; - } - syntax_highlighter->add_disabled_branch_region(Point2i(region.from_line, region.to_line)); - } - } - - set_error(""); - set_error_count(0); - - if (last_compile_result != OK) { - //preprocessor error - ERR_FAIL_COND(err_positions.size() == 0); - - String error_text = error_pp; - int error_line = err_positions.front()->get().line; - if (err_positions.size() == 1) { - // Error in main file - error_text = "error(" + itos(error_line) + "): " + error_text; - } else { - error_text = "error(" + itos(error_line) + ") in include " + err_positions.back()->get().file.get_file() + ":" + itos(err_positions.back()->get().line) + ": " + error_text; - set_error_count(err_positions.size() - 1); - } - - set_error(error_text); - set_error_pos(error_line - 1, 0); - for (int i = 0; i < get_text_editor()->get_line_count(); i++) { - get_text_editor()->set_line_background_color(i, Color(0, 0, 0, 0)); - } - get_text_editor()->set_line_background_color(error_line - 1, marked_line_color); - - set_warning_count(0); - - } else { - ShaderLanguage sl; - - sl.enable_warning_checking(saved_warnings_enabled); - uint32_t flags = saved_warning_flags; - if (shader.is_null()) { - if (flags & ShaderWarning::UNUSED_CONSTANT) { - flags &= ~(ShaderWarning::UNUSED_CONSTANT); - } - if (flags & ShaderWarning::UNUSED_FUNCTION) { - flags &= ~(ShaderWarning::UNUSED_FUNCTION); - } - if (flags & ShaderWarning::UNUSED_STRUCT) { - flags &= ~(ShaderWarning::UNUSED_STRUCT); - } - if (flags & ShaderWarning::UNUSED_UNIFORM) { - flags &= ~(ShaderWarning::UNUSED_UNIFORM); - } - if (flags & ShaderWarning::UNUSED_VARYING) { - flags &= ~(ShaderWarning::UNUSED_VARYING); - } - } - sl.set_warning_flags(flags); - - ShaderLanguage::ShaderCompileInfo info; - info.global_shader_uniform_type_func = _get_global_shader_uniform_type; - - if (shader.is_null()) { - info.is_include = true; - } else { - Shader::Mode mode = shader->get_mode(); - info.functions = ShaderTypes::get_singleton()->get_functions(RenderingServer::ShaderMode(mode)); - info.render_modes = ShaderTypes::get_singleton()->get_modes(RenderingServer::ShaderMode(mode)); - info.shader_types = ShaderTypes::get_singleton()->get_types(); - } - - code = code_pp; - //compiler error - last_compile_result = sl.compile(code, info); - - if (last_compile_result != OK) { - String error_text; - int error_line; - Vector<ShaderLanguage::FilePosition> include_positions = sl.get_include_positions(); - if (include_positions.size() > 1) { - //error is in an include - error_line = include_positions[0].line; - error_text = "error(" + itos(error_line) + ") in include " + include_positions[include_positions.size() - 1].file + ":" + itos(include_positions[include_positions.size() - 1].line) + ": " + sl.get_error_text(); - set_error_count(include_positions.size() - 1); - } else { - error_line = sl.get_error_line(); - error_text = "error(" + itos(error_line) + "): " + sl.get_error_text(); - set_error_count(0); - } - set_error(error_text); - set_error_pos(error_line - 1, 0); - get_text_editor()->set_line_background_color(error_line - 1, marked_line_color); - } else { - set_error(""); - } - - if (warnings.size() > 0 || last_compile_result != OK) { - warnings_panel->clear(); - } - warnings.clear(); - for (List<ShaderWarning>::Element *E = sl.get_warnings_ptr(); E; E = E->next()) { - warnings.push_back(E->get()); - } - if (warnings.size() > 0 && last_compile_result == OK) { - warnings.sort_custom<WarningsComparator>(); - _update_warning_panel(); - } else { - set_warning_count(0); - } - } - - emit_signal(SNAME("script_validated"), last_compile_result == OK); // Notify that validation finished, to update the list of scripts -} - -void ShaderTextEditor::_update_warning_panel() { - int warning_count = 0; - - warnings_panel->push_table(2); - for (int i = 0; i < warnings.size(); i++) { - ShaderWarning &w = warnings[i]; - - if (warning_count == 0) { - if (saved_treat_warning_as_errors) { - String error_text = "error(" + itos(w.get_line()) + "): " + w.get_message() + " " + TTR("Warnings should be fixed to prevent errors."); - set_error_pos(w.get_line() - 1, 0); - set_error(error_text); - get_text_editor()->set_line_background_color(w.get_line() - 1, marked_line_color); - } - } - - warning_count++; - int line = w.get_line(); - - // First cell. - warnings_panel->push_cell(); - warnings_panel->push_color(warnings_panel->get_theme_color(SNAME("warning_color"), SNAME("Editor"))); - if (line != -1) { - warnings_panel->push_meta(line - 1); - warnings_panel->add_text(TTR("Line") + " " + itos(line)); - warnings_panel->add_text(" (" + w.get_name() + "):"); - warnings_panel->pop(); // Meta goto. - } else { - warnings_panel->add_text(w.get_name() + ":"); - } - warnings_panel->pop(); // Color. - warnings_panel->pop(); // Cell. - - // Second cell. - warnings_panel->push_cell(); - warnings_panel->add_text(w.get_message()); - warnings_panel->pop(); // Cell. - } - warnings_panel->pop(); // Table. - - set_warning_count(warning_count); -} - -void ShaderTextEditor::_bind_methods() { - ADD_SIGNAL(MethodInfo("script_validated", PropertyInfo(Variant::BOOL, "valid"))); -} - -ShaderTextEditor::ShaderTextEditor() { - syntax_highlighter.instantiate(); - get_text_editor()->set_syntax_highlighter(syntax_highlighter); -} - -/*** SCRIPT EDITOR ******/ - -void ShaderEditor::_menu_option(int p_option) { - switch (p_option) { - case EDIT_UNDO: { - shader_editor->get_text_editor()->undo(); - } break; - case EDIT_REDO: { - shader_editor->get_text_editor()->redo(); - } break; - case EDIT_CUT: { - shader_editor->get_text_editor()->cut(); - } break; - case EDIT_COPY: { - shader_editor->get_text_editor()->copy(); - } break; - case EDIT_PASTE: { - shader_editor->get_text_editor()->paste(); - } break; - case EDIT_SELECT_ALL: { - shader_editor->get_text_editor()->select_all(); - } break; - case EDIT_MOVE_LINE_UP: { - shader_editor->move_lines_up(); - } break; - case EDIT_MOVE_LINE_DOWN: { - shader_editor->move_lines_down(); - } break; - case EDIT_INDENT_LEFT: { - if (shader.is_null()) { - return; - } - shader_editor->get_text_editor()->unindent_lines(); - } break; - case EDIT_INDENT_RIGHT: { - if (shader.is_null()) { - return; - } - shader_editor->get_text_editor()->indent_lines(); - } break; - case EDIT_DELETE_LINE: { - shader_editor->delete_lines(); - } break; - case EDIT_DUPLICATE_SELECTION: { - shader_editor->duplicate_selection(); - } break; - case EDIT_TOGGLE_COMMENT: { - if (shader.is_null()) { - return; - } - - shader_editor->toggle_inline_comment("//"); - - } break; - case EDIT_COMPLETE: { - shader_editor->get_text_editor()->request_code_completion(); - } break; - case SEARCH_FIND: { - shader_editor->get_find_replace_bar()->popup_search(); - } break; - case SEARCH_FIND_NEXT: { - shader_editor->get_find_replace_bar()->search_next(); - } break; - case SEARCH_FIND_PREV: { - shader_editor->get_find_replace_bar()->search_prev(); - } break; - case SEARCH_REPLACE: { - shader_editor->get_find_replace_bar()->popup_replace(); - } break; - case SEARCH_GOTO_LINE: { - goto_line_dialog->popup_find_line(shader_editor->get_text_editor()); - } break; - case BOOKMARK_TOGGLE: { - shader_editor->toggle_bookmark(); - } break; - case BOOKMARK_GOTO_NEXT: { - shader_editor->goto_next_bookmark(); - } break; - case BOOKMARK_GOTO_PREV: { - shader_editor->goto_prev_bookmark(); - } break; - case BOOKMARK_REMOVE_ALL: { - shader_editor->remove_all_bookmarks(); - } break; - case HELP_DOCS: { - OS::get_singleton()->shell_open(vformat("%s/tutorials/shaders/shader_reference/index.html", VERSION_DOCS_URL)); - } break; - } - if (p_option != SEARCH_FIND && p_option != SEARCH_REPLACE && p_option != SEARCH_GOTO_LINE) { - shader_editor->get_text_editor()->call_deferred(SNAME("grab_focus")); - } -} - -void ShaderEditor::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_ENTER_TREE: - case NOTIFICATION_THEME_CHANGED: { - PopupMenu *popup = help_menu->get_popup(); - popup->set_item_icon(popup->get_item_index(HELP_DOCS), get_theme_icon(SNAME("ExternalLink"), SNAME("EditorIcons"))); - } break; - - case NOTIFICATION_WM_WINDOW_FOCUS_IN: { - _check_for_external_edit(); - } break; - } -} - -void ShaderEditor::_editor_settings_changed() { - shader_editor->update_editor_settings(); - - shader_editor->get_text_editor()->add_theme_constant_override("line_spacing", EditorSettings::get_singleton()->get("text_editor/appearance/whitespace/line_spacing")); - shader_editor->get_text_editor()->set_draw_breakpoints_gutter(false); - shader_editor->get_text_editor()->set_draw_executing_lines_gutter(false); -} - -void ShaderEditor::_show_warnings_panel(bool p_show) { - warnings_panel->set_visible(p_show); -} - -void ShaderEditor::_warning_clicked(Variant p_line) { - if (p_line.get_type() == Variant::INT) { - shader_editor->get_text_editor()->set_caret_line(p_line.operator int64_t()); - } -} - -void ShaderEditor::_bind_methods() { - ClassDB::bind_method("_show_warnings_panel", &ShaderEditor::_show_warnings_panel); - ClassDB::bind_method("_warning_clicked", &ShaderEditor::_warning_clicked); - - ADD_SIGNAL(MethodInfo("validation_changed")); -} - -void ShaderEditor::ensure_select_current() { -} - -void ShaderEditor::goto_line_selection(int p_line, int p_begin, int p_end) { - shader_editor->goto_line_selection(p_line, p_begin, p_end); -} - -void ShaderEditor::_project_settings_changed() { - _update_warnings(true); -} - -void ShaderEditor::_update_warnings(bool p_validate) { - bool changed = false; - - bool warnings_enabled = GLOBAL_GET("debug/shader_language/warnings/enable").booleanize(); - if (warnings_enabled != saved_warnings_enabled) { - saved_warnings_enabled = warnings_enabled; - changed = true; - } - - bool treat_warning_as_errors = GLOBAL_GET("debug/shader_language/warnings/treat_warnings_as_errors").booleanize(); - if (treat_warning_as_errors != saved_treat_warning_as_errors) { - saved_treat_warning_as_errors = treat_warning_as_errors; - changed = true; - } - - bool update_flags = false; - - for (int i = 0; i < ShaderWarning::WARNING_MAX; i++) { - ShaderWarning::Code code = (ShaderWarning::Code)i; - bool value = GLOBAL_GET("debug/shader_language/warnings/" + ShaderWarning::get_name_from_code(code).to_lower()); - - if (saved_warnings[code] != value) { - saved_warnings[code] = value; - update_flags = true; - changed = true; - } - } - - if (update_flags) { - saved_warning_flags = (uint32_t)ShaderWarning::get_flags_from_codemap(saved_warnings); - } - - if (p_validate && changed && shader_editor && shader_editor->get_edited_shader().is_valid()) { - shader_editor->validate_script(); - } -} - -void ShaderEditor::_check_for_external_edit() { - bool use_autoreload = bool(EDITOR_GET("text_editor/behavior/files/auto_reload_scripts_on_external_change")); - - if (shader_inc.is_valid()) { - if (shader_inc->get_last_modified_time() != FileAccess::get_modified_time(shader_inc->get_path())) { - if (use_autoreload) { - _reload_shader_include_from_disk(); - } else { - disk_changed->call_deferred(SNAME("popup_centered")); - } - } - return; - } - - if (shader.is_null() || shader->is_built_in()) { - return; - } - - if (shader->get_last_modified_time() != FileAccess::get_modified_time(shader->get_path())) { - if (use_autoreload) { - _reload_shader_from_disk(); - } else { - disk_changed->call_deferred(SNAME("popup_centered")); - } - } -} - -void ShaderEditor::_reload_shader_from_disk() { - Ref<Shader> rel_shader = ResourceLoader::load(shader->get_path(), shader->get_class(), ResourceFormatLoader::CACHE_MODE_IGNORE); - ERR_FAIL_COND(!rel_shader.is_valid()); - - shader_editor->set_block_shader_changed(true); - shader->set_code(rel_shader->get_code()); - shader_editor->set_block_shader_changed(false); - shader->set_last_modified_time(rel_shader->get_last_modified_time()); - shader_editor->reload_text(); -} - -void ShaderEditor::_reload_shader_include_from_disk() { - Ref<ShaderInclude> rel_shader_include = ResourceLoader::load(shader_inc->get_path(), shader_inc->get_class(), ResourceFormatLoader::CACHE_MODE_IGNORE); - ERR_FAIL_COND(!rel_shader_include.is_valid()); - - shader_editor->set_block_shader_changed(true); - shader_inc->set_code(rel_shader_include->get_code()); - shader_editor->set_block_shader_changed(false); - shader_inc->set_last_modified_time(rel_shader_include->get_last_modified_time()); - shader_editor->reload_text(); -} - -void ShaderEditor::_reload() { - if (shader.is_valid()) { - _reload_shader_from_disk(); - } else if (shader_inc.is_valid()) { - _reload_shader_include_from_disk(); - } -} - -void ShaderEditor::edit(const Ref<Shader> &p_shader) { - if (p_shader.is_null() || !p_shader->is_text_shader()) { - return; - } - - if (shader == p_shader) { - return; - } - - shader = p_shader; - shader_inc = Ref<ShaderInclude>(); - - shader_editor->set_edited_shader(shader); -} - -void ShaderEditor::edit(const Ref<ShaderInclude> &p_shader_inc) { - if (p_shader_inc.is_null()) { - return; - } - - if (shader_inc == p_shader_inc) { - return; - } - - shader_inc = p_shader_inc; - shader = Ref<Shader>(); - - shader_editor->set_edited_shader_include(p_shader_inc); -} - -void ShaderEditor::save_external_data(const String &p_str) { - if (shader.is_null() && shader_inc.is_null()) { - disk_changed->hide(); - return; - } - - apply_shaders(); - - Ref<Shader> edited_shader = shader_editor->get_edited_shader(); - if (edited_shader.is_valid()) { - ResourceSaver::save(edited_shader); - } - if (shader.is_valid() && shader != edited_shader) { - ResourceSaver::save(shader); - } - - Ref<ShaderInclude> edited_shader_inc = shader_editor->get_edited_shader_include(); - if (edited_shader_inc.is_valid()) { - ResourceSaver::save(edited_shader_inc); - } - if (shader_inc.is_valid() && shader_inc != edited_shader_inc) { - ResourceSaver::save(shader_inc); - } - shader_editor->get_text_editor()->tag_saved_version(); - - disk_changed->hide(); -} - -void ShaderEditor::validate_script() { - shader_editor->_validate_script(); -} - -bool ShaderEditor::is_unsaved() const { - return shader_editor->get_text_editor()->get_saved_version() != shader_editor->get_text_editor()->get_version(); -} - -void ShaderEditor::apply_shaders() { - String editor_code = shader_editor->get_text_editor()->get_text(); - if (shader.is_valid()) { - String shader_code = shader->get_code(); - if (shader_code != editor_code || dependencies_version != shader_editor->get_dependencies_version()) { - shader_editor->set_block_shader_changed(true); - shader->set_code(editor_code); - shader_editor->set_block_shader_changed(false); - shader->set_edited(true); - } - } - if (shader_inc.is_valid()) { - String shader_inc_code = shader_inc->get_code(); - if (shader_inc_code != editor_code || dependencies_version != shader_editor->get_dependencies_version()) { - shader_editor->set_block_shader_changed(true); - shader_inc->set_code(editor_code); - shader_editor->set_block_shader_changed(false); - shader_inc->set_edited(true); - } - } - - dependencies_version = shader_editor->get_dependencies_version(); -} - -void ShaderEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) { - Ref<InputEventMouseButton> mb = ev; - - if (mb.is_valid()) { - if (mb->get_button_index() == MouseButton::RIGHT && mb->is_pressed()) { - CodeEdit *tx = shader_editor->get_text_editor(); - - Point2i pos = tx->get_line_column_at_pos(mb->get_global_position() - tx->get_global_position()); - int row = pos.y; - int col = pos.x; - tx->set_move_caret_on_right_click_enabled(EditorSettings::get_singleton()->get("text_editor/behavior/navigation/move_caret_on_right_click")); - - if (tx->is_move_caret_on_right_click_enabled()) { - if (tx->has_selection()) { - int from_line = tx->get_selection_from_line(); - int to_line = tx->get_selection_to_line(); - int from_column = tx->get_selection_from_column(); - int to_column = tx->get_selection_to_column(); - - if (row < from_line || row > to_line || (row == from_line && col < from_column) || (row == to_line && col > to_column)) { - // Right click is outside the selected text - tx->deselect(); - } - } - if (!tx->has_selection()) { - tx->set_caret_line(row, true, false); - tx->set_caret_column(col); - } - } - _make_context_menu(tx->has_selection(), get_local_mouse_position()); - } - } - - Ref<InputEventKey> k = ev; - if (k.is_valid() && k->is_pressed() && k->is_action("ui_menu", true)) { - CodeEdit *tx = shader_editor->get_text_editor(); - tx->adjust_viewport_to_caret(); - _make_context_menu(tx->has_selection(), (get_global_transform().inverse() * tx->get_global_transform()).xform(tx->get_caret_draw_pos())); - context_menu->grab_focus(); - } -} - -void ShaderEditor::_update_bookmark_list() { - bookmarks_menu->clear(); - - bookmarks_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_bookmark"), BOOKMARK_TOGGLE); - bookmarks_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/remove_all_bookmarks"), BOOKMARK_REMOVE_ALL); - bookmarks_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/goto_next_bookmark"), BOOKMARK_GOTO_NEXT); - bookmarks_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/goto_previous_bookmark"), BOOKMARK_GOTO_PREV); - - PackedInt32Array bookmark_list = shader_editor->get_text_editor()->get_bookmarked_lines(); - if (bookmark_list.size() == 0) { - return; - } - - bookmarks_menu->add_separator(); - - for (int i = 0; i < bookmark_list.size(); i++) { - String line = shader_editor->get_text_editor()->get_line(bookmark_list[i]).strip_edges(); - // Limit the size of the line if too big. - if (line.length() > 50) { - line = line.substr(0, 50); - } - - bookmarks_menu->add_item(String::num((int)bookmark_list[i] + 1) + " - \"" + line + "\""); - bookmarks_menu->set_item_metadata(-1, bookmark_list[i]); - } -} - -void ShaderEditor::_bookmark_item_pressed(int p_idx) { - if (p_idx < 4) { // Any item before the separator. - _menu_option(bookmarks_menu->get_item_id(p_idx)); - } else { - shader_editor->goto_line(bookmarks_menu->get_item_metadata(p_idx)); - } -} - -void ShaderEditor::_make_context_menu(bool p_selection, Vector2 p_position) { - context_menu->clear(); - if (p_selection) { - context_menu->add_shortcut(ED_GET_SHORTCUT("ui_cut"), EDIT_CUT); - context_menu->add_shortcut(ED_GET_SHORTCUT("ui_copy"), EDIT_COPY); - } - - context_menu->add_shortcut(ED_GET_SHORTCUT("ui_paste"), EDIT_PASTE); - context_menu->add_separator(); - context_menu->add_shortcut(ED_GET_SHORTCUT("ui_text_select_all"), EDIT_SELECT_ALL); - context_menu->add_shortcut(ED_GET_SHORTCUT("ui_undo"), EDIT_UNDO); - context_menu->add_shortcut(ED_GET_SHORTCUT("ui_redo"), EDIT_REDO); - - context_menu->add_separator(); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_left"), EDIT_INDENT_LEFT); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_right"), EDIT_INDENT_RIGHT); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_comment"), EDIT_TOGGLE_COMMENT); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_bookmark"), BOOKMARK_TOGGLE); - - context_menu->set_position(get_screen_position() + p_position); - context_menu->reset_size(); - context_menu->popup(); -} - -ShaderEditor::ShaderEditor() { - GLOBAL_DEF("debug/shader_language/warnings/enable", true); - GLOBAL_DEF("debug/shader_language/warnings/treat_warnings_as_errors", false); - for (int i = 0; i < (int)ShaderWarning::WARNING_MAX; i++) { - GLOBAL_DEF("debug/shader_language/warnings/" + ShaderWarning::get_name_from_code((ShaderWarning::Code)i).to_lower(), true); - } - _update_warnings(false); - - shader_editor = memnew(ShaderTextEditor); - - shader_editor->connect("script_validated", callable_mp(this, &ShaderEditor::_script_validated)); - - shader_editor->set_v_size_flags(SIZE_EXPAND_FILL); - shader_editor->add_theme_constant_override("separation", 0); - shader_editor->set_anchors_and_offsets_preset(Control::PRESET_FULL_RECT); - - shader_editor->connect("show_warnings_panel", callable_mp(this, &ShaderEditor::_show_warnings_panel)); - shader_editor->connect("script_changed", callable_mp(this, &ShaderEditor::apply_shaders)); - EditorSettings::get_singleton()->connect("settings_changed", callable_mp(this, &ShaderEditor::_editor_settings_changed)); - ProjectSettingsEditor::get_singleton()->connect("confirmed", callable_mp(this, &ShaderEditor::_project_settings_changed)); - - shader_editor->get_text_editor()->set_code_hint_draw_below(EditorSettings::get_singleton()->get("text_editor/completion/put_callhint_tooltip_below_current_line")); - - shader_editor->get_text_editor()->set_symbol_lookup_on_click_enabled(true); - shader_editor->get_text_editor()->set_context_menu_enabled(false); - shader_editor->get_text_editor()->connect("gui_input", callable_mp(this, &ShaderEditor::_text_edit_gui_input)); - - shader_editor->update_editor_settings(); - - context_menu = memnew(PopupMenu); - add_child(context_menu); - context_menu->connect("id_pressed", callable_mp(this, &ShaderEditor::_menu_option)); - - VBoxContainer *main_container = memnew(VBoxContainer); - HBoxContainer *hbc = memnew(HBoxContainer); - - edit_menu = memnew(MenuButton); - edit_menu->set_shortcut_context(this); - edit_menu->set_text(TTR("Edit")); - edit_menu->set_switch_on_hover(true); - - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_undo"), EDIT_UNDO); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_redo"), EDIT_REDO); - edit_menu->get_popup()->add_separator(); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_cut"), EDIT_CUT); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_copy"), EDIT_COPY); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_paste"), EDIT_PASTE); - edit_menu->get_popup()->add_separator(); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_text_select_all"), EDIT_SELECT_ALL); - edit_menu->get_popup()->add_separator(); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/move_up"), EDIT_MOVE_LINE_UP); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/move_down"), EDIT_MOVE_LINE_DOWN); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_left"), EDIT_INDENT_LEFT); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_right"), EDIT_INDENT_RIGHT); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/delete_line"), EDIT_DELETE_LINE); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_comment"), EDIT_TOGGLE_COMMENT); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/duplicate_selection"), EDIT_DUPLICATE_SELECTION); - edit_menu->get_popup()->add_separator(); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_text_completion_query"), EDIT_COMPLETE); - edit_menu->get_popup()->connect("id_pressed", callable_mp(this, &ShaderEditor::_menu_option)); - - search_menu = memnew(MenuButton); - search_menu->set_shortcut_context(this); - search_menu->set_text(TTR("Search")); - search_menu->set_switch_on_hover(true); - - search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find"), SEARCH_FIND); - search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_next"), SEARCH_FIND_NEXT); - search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_previous"), SEARCH_FIND_PREV); - search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/replace"), SEARCH_REPLACE); - search_menu->get_popup()->connect("id_pressed", callable_mp(this, &ShaderEditor::_menu_option)); - - MenuButton *goto_menu = memnew(MenuButton); - goto_menu->set_shortcut_context(this); - goto_menu->set_text(TTR("Go To")); - goto_menu->set_switch_on_hover(true); - goto_menu->get_popup()->connect("id_pressed", callable_mp(this, &ShaderEditor::_menu_option)); - - goto_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/goto_line"), SEARCH_GOTO_LINE); - goto_menu->get_popup()->add_separator(); - - bookmarks_menu = memnew(PopupMenu); - bookmarks_menu->set_name("Bookmarks"); - goto_menu->get_popup()->add_child(bookmarks_menu); - goto_menu->get_popup()->add_submenu_item(TTR("Bookmarks"), "Bookmarks"); - _update_bookmark_list(); - bookmarks_menu->connect("about_to_popup", callable_mp(this, &ShaderEditor::_update_bookmark_list)); - bookmarks_menu->connect("index_pressed", callable_mp(this, &ShaderEditor::_bookmark_item_pressed)); - - help_menu = memnew(MenuButton); - help_menu->set_text(TTR("Help")); - help_menu->set_switch_on_hover(true); - help_menu->get_popup()->add_item(TTR("Online Docs"), HELP_DOCS); - help_menu->get_popup()->connect("id_pressed", callable_mp(this, &ShaderEditor::_menu_option)); - - add_child(main_container); - main_container->add_child(hbc); - hbc->add_child(search_menu); - hbc->add_child(edit_menu); - hbc->add_child(goto_menu); - hbc->add_child(help_menu); - hbc->add_theme_style_override("panel", EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("ScriptEditorPanel"), SNAME("EditorStyles"))); - - VSplitContainer *editor_box = memnew(VSplitContainer); - main_container->add_child(editor_box); - editor_box->set_anchors_and_offsets_preset(Control::PRESET_FULL_RECT); - editor_box->set_v_size_flags(SIZE_EXPAND_FILL); - editor_box->add_child(shader_editor); - - FindReplaceBar *bar = memnew(FindReplaceBar); - main_container->add_child(bar); - bar->hide(); - shader_editor->set_find_replace_bar(bar); - - warnings_panel = memnew(RichTextLabel); - warnings_panel->set_custom_minimum_size(Size2(0, 100 * EDSCALE)); - warnings_panel->set_h_size_flags(SIZE_EXPAND_FILL); - warnings_panel->set_meta_underline(true); - warnings_panel->set_selection_enabled(true); - warnings_panel->set_focus_mode(FOCUS_CLICK); - warnings_panel->hide(); - warnings_panel->connect("meta_clicked", callable_mp(this, &ShaderEditor::_warning_clicked)); - editor_box->add_child(warnings_panel); - shader_editor->set_warnings_panel(warnings_panel); - - goto_line_dialog = memnew(GotoLineDialog); - add_child(goto_line_dialog); - - disk_changed = memnew(ConfirmationDialog); - - VBoxContainer *vbc = memnew(VBoxContainer); - disk_changed->add_child(vbc); - - Label *dl = memnew(Label); - dl->set_text(TTR("This shader has been modified on disk.\nWhat action should be taken?")); - vbc->add_child(dl); - - disk_changed->connect("confirmed", callable_mp(this, &ShaderEditor::_reload)); - disk_changed->set_ok_button_text(TTR("Reload")); - - disk_changed->add_button(TTR("Resave"), !DisplayServer::get_singleton()->get_swap_cancel_ok(), "resave"); - disk_changed->connect("custom_action", callable_mp(this, &ShaderEditor::save_external_data)); - - add_child(disk_changed); - - _editor_settings_changed(); -} void ShaderEditorPlugin::_update_shader_list() { shader_list->clear(); @@ -1237,7 +81,7 @@ void ShaderEditorPlugin::_update_shader_list() { shader_list->select(shader_tabs->get_current_tab()); } - for (int i = 1; i < FILE_MAX; i++) { + for (int i = FILE_SAVE; i < FILE_MAX; i++) { file_menu->get_popup()->set_item_disabled(file_menu->get_popup()->get_item_index(i), edited_shaders.size() == 0); } @@ -1246,7 +90,7 @@ void ShaderEditorPlugin::_update_shader_list() { void ShaderEditorPlugin::_update_shader_list_status() { for (int i = 0; i < shader_list->get_item_count(); i++) { - ShaderEditor *se = Object::cast_to<ShaderEditor>(shader_tabs->get_tab_control(i)); + TextShaderEditor *se = Object::cast_to<TextShaderEditor>(shader_tabs->get_tab_control(i)); if (se) { if (se->was_compilation_successful()) { shader_list->set_item_tag_icon(i, Ref<Texture2D>()); @@ -1281,7 +125,7 @@ void ShaderEditorPlugin::edit(Object *p_object) { } } es.shader_inc = Ref<ShaderInclude>(si); - es.shader_editor = memnew(ShaderEditor); + es.shader_editor = memnew(TextShaderEditor); es.shader_editor->edit(si); shader_tabs->add_child(es.shader_editor); es.shader_editor->connect("validation_changed", callable_mp(this, &ShaderEditorPlugin::_update_shader_list)); @@ -1301,7 +145,7 @@ void ShaderEditorPlugin::edit(Object *p_object) { shader_tabs->add_child(es.visual_shader_editor); es.visual_shader_editor->edit(vs.ptr()); } else { - es.shader_editor = memnew(ShaderEditor); + es.shader_editor = memnew(TextShaderEditor); shader_tabs->add_child(es.shader_editor); es.shader_editor->edit(s); es.shader_editor->connect("validation_changed", callable_mp(this, &ShaderEditorPlugin::_update_shader_list)); @@ -1326,7 +170,7 @@ void ShaderEditorPlugin::make_visible(bool p_visible) { void ShaderEditorPlugin::selected_notify() { } -ShaderEditor *ShaderEditorPlugin::get_shader_editor(const Ref<Shader> &p_for_shader) { +TextShaderEditor *ShaderEditorPlugin::get_shader_editor(const Ref<Shader> &p_for_shader) { for (uint32_t i = 0; i < edited_shaders.size(); i++) { if (edited_shaders[i].shader == p_for_shader) { return edited_shaders[i].shader_editor; @@ -1366,6 +210,7 @@ void ShaderEditorPlugin::_shader_selected(int p_index) { edited_shaders[p_index].shader_editor->validate_script(); } shader_tabs->set_current_tab(p_index); + shader_list->select(p_index); } void ShaderEditorPlugin::_shader_list_clicked(int p_item, Vector2 p_local_mouse_pos, MouseButton p_mouse_button_index) { @@ -1375,11 +220,10 @@ void ShaderEditorPlugin::_shader_list_clicked(int p_item, Vector2 p_local_mouse_ } void ShaderEditorPlugin::_close_shader(int p_index) { - int index = shader_tabs->get_current_tab(); - ERR_FAIL_INDEX(index, shader_tabs->get_tab_count()); - Control *c = shader_tabs->get_tab_control(index); + ERR_FAIL_INDEX(p_index, shader_tabs->get_tab_count()); + Control *c = shader_tabs->get_tab_control(p_index); memdelete(c); - edited_shaders.remove_at(index); + edited_shaders.remove_at(p_index); _update_shader_list(); EditorNode::get_singleton()->get_undo_redo()->clear_history(); // To prevent undo on deleted graphs. } @@ -1420,6 +264,9 @@ void ShaderEditorPlugin::_menu_item_pressed(int p_index) { } else { EditorNode::get_singleton()->save_resource(edited_shaders[index].shader_inc); } + if (edited_shaders[index].shader_editor) { + edited_shaders[index].shader_editor->tag_saved_version(); + } } break; case FILE_SAVE_AS: { int index = shader_tabs->get_current_tab(); @@ -1438,6 +285,9 @@ void ShaderEditorPlugin::_menu_item_pressed(int p_index) { } EditorNode::get_singleton()->save_resource_as(edited_shaders[index].shader_inc, path); } + if (edited_shaders[index].shader_editor) { + edited_shaders[index].shader_editor->tag_saved_version(); + } } break; case FILE_INSPECT: { int index = shader_tabs->get_current_tab(); @@ -1588,7 +438,7 @@ ShaderEditorPlugin::ShaderEditorPlugin() { file_menu->get_popup()->connect("id_pressed", callable_mp(this, &ShaderEditorPlugin::_menu_item_pressed)); file_hb->add_child(file_menu); - for (int i = 2; i < FILE_MAX; i++) { + for (int i = FILE_SAVE; i < FILE_MAX; i++) { file_menu->get_popup()->set_item_disabled(file_menu->get_popup()->get_item_index(i), true); } diff --git a/editor/plugins/shader_editor_plugin.h b/editor/plugins/shader_editor_plugin.h index afd38ef71a..7638778af7 100644 --- a/editor/plugins/shader_editor_plugin.h +++ b/editor/plugins/shader_editor_plugin.h @@ -31,181 +31,14 @@ #ifndef SHADER_EDITOR_PLUGIN_H #define SHADER_EDITOR_PLUGIN_H -#include "editor/code_editor.h" #include "editor/editor_plugin.h" -#include "scene/gui/menu_button.h" -#include "scene/gui/panel_container.h" -#include "scene/gui/rich_text_label.h" -#include "scene/gui/tab_container.h" -#include "scene/gui/text_edit.h" -#include "scene/main/timer.h" -#include "scene/resources/shader.h" -#include "scene/resources/shader_include.h" -#include "servers/rendering/shader_warnings.h" -class ItemList; -class VisualShaderEditor; class HSplitContainer; +class ItemList; class ShaderCreateDialog; - -class GDShaderSyntaxHighlighter : public CodeHighlighter { - GDCLASS(GDShaderSyntaxHighlighter, CodeHighlighter) - -private: - Vector<Point2i> disabled_branch_regions; - Color disabled_branch_color; - -public: - virtual Dictionary _get_line_syntax_highlighting_impl(int p_line) override; - - void add_disabled_branch_region(const Point2i &p_region); - void clear_disabled_branch_regions(); - void set_disabled_branch_color(const Color &p_color); -}; - -class ShaderTextEditor : public CodeTextEditor { - GDCLASS(ShaderTextEditor, CodeTextEditor); - - Color marked_line_color = Color(1, 1, 1); - - struct WarningsComparator { - _ALWAYS_INLINE_ bool operator()(const ShaderWarning &p_a, const ShaderWarning &p_b) const { return (p_a.get_line() < p_b.get_line()); } - }; - - Ref<GDShaderSyntaxHighlighter> syntax_highlighter; - RichTextLabel *warnings_panel = nullptr; - Ref<Shader> shader; - Ref<ShaderInclude> shader_inc; - List<ShaderWarning> warnings; - Error last_compile_result = Error::OK; - - void _check_shader_mode(); - void _update_warning_panel(); - - bool block_shader_changed = false; - void _shader_changed(); - - uint32_t dependencies_version = 0; // Incremented if deps changed - -protected: - void _notification(int p_what); - static void _bind_methods(); - virtual void _load_theme_settings() override; - - virtual void _code_complete_script(const String &p_code, List<ScriptLanguage::CodeCompletionOption> *r_options) override; - -public: - void set_block_shader_changed(bool p_block) { block_shader_changed = p_block; } - uint32_t get_dependencies_version() const { return dependencies_version; } - - virtual void _validate_script() override; - - void reload_text(); - void set_warnings_panel(RichTextLabel *p_warnings_panel); - - Ref<Shader> get_edited_shader() const; - Ref<ShaderInclude> get_edited_shader_include() const; - - void set_edited_shader(const Ref<Shader> &p_shader); - void set_edited_shader(const Ref<Shader> &p_shader, const String &p_code); - void set_edited_shader_include(const Ref<ShaderInclude> &p_include); - void set_edited_shader_include(const Ref<ShaderInclude> &p_include, const String &p_code); - void set_edited_code(const String &p_code); - - ShaderTextEditor(); -}; - -class ShaderEditor : public PanelContainer { - GDCLASS(ShaderEditor, PanelContainer); - - enum { - EDIT_UNDO, - EDIT_REDO, - EDIT_CUT, - EDIT_COPY, - EDIT_PASTE, - EDIT_SELECT_ALL, - EDIT_MOVE_LINE_UP, - EDIT_MOVE_LINE_DOWN, - EDIT_INDENT_LEFT, - EDIT_INDENT_RIGHT, - EDIT_DELETE_LINE, - EDIT_DUPLICATE_SELECTION, - EDIT_TOGGLE_COMMENT, - EDIT_COMPLETE, - SEARCH_FIND, - SEARCH_FIND_NEXT, - SEARCH_FIND_PREV, - SEARCH_REPLACE, - SEARCH_GOTO_LINE, - BOOKMARK_TOGGLE, - BOOKMARK_GOTO_NEXT, - BOOKMARK_GOTO_PREV, - BOOKMARK_REMOVE_ALL, - HELP_DOCS, - }; - - MenuButton *edit_menu = nullptr; - MenuButton *search_menu = nullptr; - PopupMenu *bookmarks_menu = nullptr; - MenuButton *help_menu = nullptr; - PopupMenu *context_menu = nullptr; - RichTextLabel *warnings_panel = nullptr; - uint64_t idle = 0; - - GotoLineDialog *goto_line_dialog = nullptr; - ConfirmationDialog *erase_tab_confirm = nullptr; - ConfirmationDialog *disk_changed = nullptr; - - ShaderTextEditor *shader_editor = nullptr; - bool compilation_success = true; - - void _menu_option(int p_option); - mutable Ref<Shader> shader; - mutable Ref<ShaderInclude> shader_inc; - - void _editor_settings_changed(); - void _project_settings_changed(); - - void _check_for_external_edit(); - void _reload_shader_from_disk(); - void _reload_shader_include_from_disk(); - void _reload(); - void _show_warnings_panel(bool p_show); - void _warning_clicked(Variant p_line); - void _update_warnings(bool p_validate); - - void _script_validated(bool p_valid) { - compilation_success = p_valid; - emit_signal(SNAME("validation_changed")); - } - - uint32_t dependencies_version = 0xFFFFFFFF; - -protected: - void _notification(int p_what); - static void _bind_methods(); - void _make_context_menu(bool p_selection, Vector2 p_position); - void _text_edit_gui_input(const Ref<InputEvent> &p_ev); - - void _update_bookmark_list(); - void _bookmark_item_pressed(int p_idx); - -public: - bool was_compilation_successful() const { return compilation_success; } - void apply_shaders(); - void ensure_select_current(); - void edit(const Ref<Shader> &p_shader); - void edit(const Ref<ShaderInclude> &p_shader_inc); - void goto_line_selection(int p_line, int p_begin, int p_end); - void save_external_data(const String &p_str = ""); - void validate_script(); - bool is_unsaved() const; - - virtual Size2 get_minimum_size() const override { return Size2(0, 200); } - - ShaderEditor(); -}; +class TabContainer; +class TextShaderEditor; +class VisualShaderEditor; class ShaderEditorPlugin : public EditorPlugin { GDCLASS(ShaderEditorPlugin, EditorPlugin); @@ -213,12 +46,14 @@ class ShaderEditorPlugin : public EditorPlugin { struct EditedShader { Ref<Shader> shader; Ref<ShaderInclude> shader_inc; - ShaderEditor *shader_editor = nullptr; + TextShaderEditor *shader_editor = nullptr; VisualShaderEditor *visual_shader_editor = nullptr; }; LocalVector<EditedShader> edited_shaders; + // Always valid operations come first in the enum, file-specific ones + // should go after FILE_SAVE which is used to build the menu accordingly. enum { FILE_NEW, FILE_NEW_INCLUDE, @@ -265,7 +100,7 @@ public: virtual void make_visible(bool p_visible) override; virtual void selected_notify() override; - ShaderEditor *get_shader_editor(const Ref<Shader> &p_for_shader); + TextShaderEditor *get_shader_editor(const Ref<Shader> &p_for_shader); VisualShaderEditor *get_visual_shader_editor(const Ref<Shader> &p_for_shader); virtual void save_external_data() override; diff --git a/editor/plugins/skeleton_3d_editor_plugin.cpp b/editor/plugins/skeleton_3d_editor_plugin.cpp index 3c75ac6ca6..2478ac9514 100644 --- a/editor/plugins/skeleton_3d_editor_plugin.cpp +++ b/editor/plugins/skeleton_3d_editor_plugin.cpp @@ -1143,7 +1143,7 @@ EditorPlugin::AfterGUIInput Skeleton3DEditorPlugin::forward_spatial_gui_input(Ca se->update_bone_original(); } } - return EditorPlugin::AFTER_GUI_INPUT_DESELECT; + return EditorPlugin::AFTER_GUI_INPUT_CUSTOM; } return EditorPlugin::AFTER_GUI_INPUT_PASS; } diff --git a/editor/plugins/sprite_frames_editor_plugin.cpp b/editor/plugins/sprite_frames_editor_plugin.cpp index ae21aad337..d0a1ddafa1 100644 --- a/editor/plugins/sprite_frames_editor_plugin.cpp +++ b/editor/plugins/sprite_frames_editor_plugin.cpp @@ -984,11 +984,17 @@ void SpriteFramesEditor::_update_library(bool p_skip_selector) { } void SpriteFramesEditor::edit(SpriteFrames *p_frames) { - if (frames == p_frames) { + bool new_read_only_state = false; + if (p_frames) { + new_read_only_state = EditorNode::get_singleton()->is_resource_read_only(p_frames); + } + + if (frames == p_frames && new_read_only_state == read_only) { return; } frames = p_frames; + read_only = new_read_only_state; if (p_frames) { if (!p_frames->has_animation(edited_anim)) { @@ -1009,6 +1015,20 @@ void SpriteFramesEditor::edit(SpriteFrames *p_frames) { } else { hide(); } + + new_anim->set_disabled(read_only); + remove_anim->set_disabled(read_only); + anim_speed->set_editable(!read_only); + anim_loop->set_disabled(read_only); + load->set_disabled(read_only); + load_sheet->set_disabled(read_only); + copy->set_disabled(read_only); + paste->set_disabled(read_only); + empty->set_disabled(read_only); + empty2->set_disabled(read_only); + move_up->set_disabled(read_only); + move_down->set_disabled(read_only); + _delete->set_disabled(read_only); } void SpriteFramesEditor::set_undo_redo(Ref<EditorUndoRedoManager> p_undo_redo) { @@ -1016,6 +1036,10 @@ void SpriteFramesEditor::set_undo_redo(Ref<EditorUndoRedoManager> p_undo_redo) { } Variant SpriteFramesEditor::get_drag_data_fw(const Point2 &p_point, Control *p_from) { + if (read_only) { + return false; + } + if (!frames->has_animation(edited_anim)) { return false; } @@ -1038,6 +1062,10 @@ Variant SpriteFramesEditor::get_drag_data_fw(const Point2 &p_point, Control *p_f } bool SpriteFramesEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const { + if (read_only) { + return false; + } + Dictionary d = p_data; if (!d.has("type")) { @@ -1169,6 +1197,7 @@ SpriteFramesEditor::SpriteFramesEditor() { remove_anim->set_flat(true); remove_anim->set_tooltip_text(TTR("Remove Animation")); hbc_animlist->add_child(remove_anim); + remove_anim->set_disabled(true); remove_anim->connect("pressed", callable_mp(this, &SpriteFramesEditor::_animation_remove)); anim_search_box = memnew(LineEdit); diff --git a/editor/plugins/sprite_frames_editor_plugin.h b/editor/plugins/sprite_frames_editor_plugin.h index f2530b732f..092f556c63 100644 --- a/editor/plugins/sprite_frames_editor_plugin.h +++ b/editor/plugins/sprite_frames_editor_plugin.h @@ -57,6 +57,8 @@ class SpriteFramesEditor : public HSplitContainer { }; int dominant_param = PARAM_FRAME_COUNT; + bool read_only = false; + Button *load = nullptr; Button *load_sheet = nullptr; Button *_delete = nullptr; diff --git a/editor/plugins/text_editor.cpp b/editor/plugins/text_editor.cpp index 76332b2d10..9846cd4a84 100644 --- a/editor/plugins/text_editor.cpp +++ b/editor/plugins/text_editor.cpp @@ -150,6 +150,7 @@ void TextEditor::reload_text() { te->tag_saved_version(); code_editor->update_line_and_column(); + _validate_script(); } void TextEditor::_validate_script() { @@ -325,12 +326,12 @@ void TextEditor::_edit_option(int p_op) { case EDIT_MOVE_LINE_DOWN: { code_editor->move_lines_down(); } break; - case EDIT_INDENT_LEFT: { - tx->unindent_lines(); - } break; - case EDIT_INDENT_RIGHT: { + case EDIT_INDENT: { tx->indent_lines(); } break; + case EDIT_UNINDENT: { + tx->unindent_lines(); + } break; case EDIT_DELETE_LINE: { code_editor->delete_lines(); } break; @@ -493,8 +494,8 @@ void TextEditor::_make_context_menu(bool p_selection, bool p_can_fold, bool p_is context_menu->add_shortcut(ED_GET_SHORTCUT("ui_undo"), EDIT_UNDO); context_menu->add_shortcut(ED_GET_SHORTCUT("ui_redo"), EDIT_REDO); context_menu->add_separator(); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_left"), EDIT_INDENT_LEFT); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_right"), EDIT_INDENT_RIGHT); + context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent"), EDIT_INDENT); + context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/unindent"), EDIT_UNINDENT); context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_bookmark"), BOOKMARK_TOGGLE); if (p_selection) { @@ -574,8 +575,8 @@ TextEditor::TextEditor() { edit_menu->get_popup()->add_separator(); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/move_up"), EDIT_MOVE_LINE_UP); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/move_down"), EDIT_MOVE_LINE_DOWN); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_left"), EDIT_INDENT_LEFT); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_right"), EDIT_INDENT_RIGHT); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent"), EDIT_INDENT); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/unindent"), EDIT_UNINDENT); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/delete_line"), EDIT_DELETE_LINE); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_fold_line"), EDIT_TOGGLE_FOLD_LINE); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/fold_all_lines"), EDIT_FOLD_ALL_LINES); diff --git a/editor/plugins/text_editor.h b/editor/plugins/text_editor.h index 15f7c45653..9ee6a39b2e 100644 --- a/editor/plugins/text_editor.h +++ b/editor/plugins/text_editor.h @@ -63,8 +63,8 @@ private: EDIT_CONVERT_INDENT_TO_TABS, EDIT_MOVE_LINE_UP, EDIT_MOVE_LINE_DOWN, - EDIT_INDENT_RIGHT, - EDIT_INDENT_LEFT, + EDIT_INDENT, + EDIT_UNINDENT, EDIT_DELETE_LINE, EDIT_DUPLICATE_SELECTION, EDIT_TO_UPPERCASE, diff --git a/editor/plugins/text_shader_editor.cpp b/editor/plugins/text_shader_editor.cpp new file mode 100644 index 0000000000..5815bab806 --- /dev/null +++ b/editor/plugins/text_shader_editor.cpp @@ -0,0 +1,1195 @@ +/*************************************************************************/ +/* text_shader_editor.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* 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 "text_shader_editor.h" + +#include "core/version_generated.gen.h" +#include "editor/editor_node.h" +#include "editor/editor_scale.h" +#include "editor/editor_settings.h" +#include "editor/filesystem_dock.h" +#include "editor/project_settings_editor.h" +#include "scene/gui/split_container.h" +#include "servers/rendering/shader_preprocessor.h" +#include "servers/rendering/shader_types.h" + +/*** SHADER SYNTAX HIGHLIGHTER ****/ + +Dictionary GDShaderSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_line) { + Dictionary color_map; + + for (const Point2i ®ion : disabled_branch_regions) { + if (p_line >= region.x && p_line <= region.y) { + Dictionary highlighter_info; + highlighter_info["color"] = disabled_branch_color; + + color_map[0] = highlighter_info; + return color_map; + } + } + + return CodeHighlighter::_get_line_syntax_highlighting_impl(p_line); +} + +void GDShaderSyntaxHighlighter::add_disabled_branch_region(const Point2i &p_region) { + ERR_FAIL_COND(p_region.x < 0); + ERR_FAIL_COND(p_region.y < 0); + + for (int i = 0; i < disabled_branch_regions.size(); i++) { + ERR_FAIL_COND_MSG(disabled_branch_regions[i].x == p_region.x, "Branch region with a start line '" + itos(p_region.x) + "' already exists."); + } + + Point2i disabled_branch_region; + disabled_branch_region.x = p_region.x; + disabled_branch_region.y = p_region.y; + disabled_branch_regions.push_back(disabled_branch_region); + + clear_highlighting_cache(); +} + +void GDShaderSyntaxHighlighter::clear_disabled_branch_regions() { + disabled_branch_regions.clear(); + clear_highlighting_cache(); +} + +void GDShaderSyntaxHighlighter::set_disabled_branch_color(const Color &p_color) { + disabled_branch_color = p_color; + clear_highlighting_cache(); +} + +/*** SHADER SCRIPT EDITOR ****/ + +static bool saved_warnings_enabled = false; +static bool saved_treat_warning_as_errors = false; +static HashMap<ShaderWarning::Code, bool> saved_warnings; +static uint32_t saved_warning_flags = 0U; + +void ShaderTextEditor::_notification(int p_what) { + switch (p_what) { + case NOTIFICATION_THEME_CHANGED: { + if (is_visible_in_tree()) { + _load_theme_settings(); + if (warnings.size() > 0 && last_compile_result == OK) { + warnings_panel->clear(); + _update_warning_panel(); + } + } + } break; + } +} + +Ref<Shader> ShaderTextEditor::get_edited_shader() const { + return shader; +} + +Ref<ShaderInclude> ShaderTextEditor::get_edited_shader_include() const { + return shader_inc; +} + +void ShaderTextEditor::set_edited_shader(const Ref<Shader> &p_shader) { + set_edited_shader(p_shader, p_shader->get_code()); +} + +void ShaderTextEditor::set_edited_shader(const Ref<Shader> &p_shader, const String &p_code) { + if (shader == p_shader) { + return; + } + if (shader.is_valid()) { + shader->disconnect(SNAME("changed"), callable_mp(this, &ShaderTextEditor::_shader_changed)); + } + shader = p_shader; + shader_inc = Ref<ShaderInclude>(); + + set_edited_code(p_code); + + if (shader.is_valid()) { + shader->connect(SNAME("changed"), callable_mp(this, &ShaderTextEditor::_shader_changed)); + } +} + +void ShaderTextEditor::set_edited_shader_include(const Ref<ShaderInclude> &p_shader_inc) { + set_edited_shader_include(p_shader_inc, p_shader_inc->get_code()); +} + +void ShaderTextEditor::_shader_changed() { + // This function is used for dependencies (include changing changes main shader and forces it to revalidate) + if (block_shader_changed) { + return; + } + dependencies_version++; + _validate_script(); +} + +void ShaderTextEditor::set_edited_shader_include(const Ref<ShaderInclude> &p_shader_inc, const String &p_code) { + if (shader_inc == p_shader_inc) { + return; + } + if (shader_inc.is_valid()) { + shader_inc->disconnect(SNAME("changed"), callable_mp(this, &ShaderTextEditor::_shader_changed)); + } + shader_inc = p_shader_inc; + shader = Ref<Shader>(); + + set_edited_code(p_code); + + if (shader_inc.is_valid()) { + shader_inc->connect(SNAME("changed"), callable_mp(this, &ShaderTextEditor::_shader_changed)); + } +} + +void ShaderTextEditor::set_edited_code(const String &p_code) { + _load_theme_settings(); + + get_text_editor()->set_text(p_code); + get_text_editor()->clear_undo_history(); + get_text_editor()->call_deferred(SNAME("set_h_scroll"), 0); + get_text_editor()->call_deferred(SNAME("set_v_scroll"), 0); + get_text_editor()->tag_saved_version(); + + _validate_script(); + _line_col_changed(); +} + +void ShaderTextEditor::reload_text() { + ERR_FAIL_COND(shader.is_null()); + + CodeEdit *te = get_text_editor(); + int column = te->get_caret_column(); + int row = te->get_caret_line(); + int h = te->get_h_scroll(); + int v = te->get_v_scroll(); + + te->set_text(shader->get_code()); + te->set_caret_line(row); + te->set_caret_column(column); + te->set_h_scroll(h); + te->set_v_scroll(v); + + te->tag_saved_version(); + + update_line_and_column(); +} + +void ShaderTextEditor::set_warnings_panel(RichTextLabel *p_warnings_panel) { + warnings_panel = p_warnings_panel; +} + +void ShaderTextEditor::_load_theme_settings() { + CodeEdit *text_editor = get_text_editor(); + Color updated_marked_line_color = EDITOR_GET("text_editor/theme/highlighting/mark_color"); + if (updated_marked_line_color != marked_line_color) { + for (int i = 0; i < text_editor->get_line_count(); i++) { + if (text_editor->get_line_background_color(i) == marked_line_color) { + text_editor->set_line_background_color(i, updated_marked_line_color); + } + } + marked_line_color = updated_marked_line_color; + } + + syntax_highlighter->set_number_color(EDITOR_GET("text_editor/theme/highlighting/number_color")); + syntax_highlighter->set_symbol_color(EDITOR_GET("text_editor/theme/highlighting/symbol_color")); + syntax_highlighter->set_function_color(EDITOR_GET("text_editor/theme/highlighting/function_color")); + syntax_highlighter->set_member_variable_color(EDITOR_GET("text_editor/theme/highlighting/member_variable_color")); + + syntax_highlighter->clear_keyword_colors(); + + const Color keyword_color = EDITOR_GET("text_editor/theme/highlighting/keyword_color"); + const Color control_flow_keyword_color = EDITOR_GET("text_editor/theme/highlighting/control_flow_keyword_color"); + + List<String> keywords; + ShaderLanguage::get_keyword_list(&keywords); + + for (const String &E : keywords) { + if (ShaderLanguage::is_control_flow_keyword(E)) { + syntax_highlighter->add_keyword_color(E, control_flow_keyword_color); + } else { + syntax_highlighter->add_keyword_color(E, keyword_color); + } + } + + List<String> pp_keywords; + ShaderPreprocessor::get_keyword_list(&pp_keywords, false); + + for (const String &E : pp_keywords) { + syntax_highlighter->add_keyword_color(E, keyword_color); + } + + // Colorize built-ins like `COLOR` differently to make them easier + // to distinguish from keywords at a quick glance. + + List<String> built_ins; + + if (shader_inc.is_valid()) { + for (int i = 0; i < RenderingServer::SHADER_MAX; i++) { + for (const KeyValue<StringName, ShaderLanguage::FunctionInfo> &E : ShaderTypes::get_singleton()->get_functions(RenderingServer::ShaderMode(i))) { + for (const KeyValue<StringName, ShaderLanguage::BuiltInInfo> &F : E.value.built_ins) { + built_ins.push_back(F.key); + } + } + + const Vector<ShaderLanguage::ModeInfo> &modes = ShaderTypes::get_singleton()->get_modes(RenderingServer::ShaderMode(i)); + + for (int j = 0; j < modes.size(); j++) { + const ShaderLanguage::ModeInfo &info = modes[j]; + + if (!info.options.is_empty()) { + for (int k = 0; k < info.options.size(); k++) { + built_ins.push_back(String(info.name) + "_" + String(info.options[k])); + } + } else { + built_ins.push_back(String(info.name)); + } + } + } + } else if (shader.is_valid()) { + for (const KeyValue<StringName, ShaderLanguage::FunctionInfo> &E : ShaderTypes::get_singleton()->get_functions(RenderingServer::ShaderMode(shader->get_mode()))) { + for (const KeyValue<StringName, ShaderLanguage::BuiltInInfo> &F : E.value.built_ins) { + built_ins.push_back(F.key); + } + } + + const Vector<ShaderLanguage::ModeInfo> &modes = ShaderTypes::get_singleton()->get_modes(RenderingServer::ShaderMode(shader->get_mode())); + + for (int i = 0; i < modes.size(); i++) { + const ShaderLanguage::ModeInfo &info = modes[i]; + + if (!info.options.is_empty()) { + for (int j = 0; j < info.options.size(); j++) { + built_ins.push_back(String(info.name) + "_" + String(info.options[j])); + } + } else { + built_ins.push_back(String(info.name)); + } + } + } + + const Color user_type_color = EDITOR_GET("text_editor/theme/highlighting/user_type_color"); + + for (const String &E : built_ins) { + syntax_highlighter->add_keyword_color(E, user_type_color); + } + + // Colorize comments. + const Color comment_color = EDITOR_GET("text_editor/theme/highlighting/comment_color"); + syntax_highlighter->clear_color_regions(); + syntax_highlighter->add_color_region("/*", "*/", comment_color, false); + syntax_highlighter->add_color_region("//", "", comment_color, true); + syntax_highlighter->set_disabled_branch_color(comment_color); + + text_editor->clear_comment_delimiters(); + text_editor->add_comment_delimiter("/*", "*/", false); + text_editor->add_comment_delimiter("//", "", true); + + if (!text_editor->has_auto_brace_completion_open_key("/*")) { + text_editor->add_auto_brace_completion_pair("/*", "*/"); + } + + // Colorize preprocessor include strings. + const Color string_color = EDITOR_GET("text_editor/theme/highlighting/string_color"); + syntax_highlighter->add_color_region("\"", "\"", string_color, false); + + if (warnings_panel) { + // Warnings panel. + warnings_panel->add_theme_font_override("normal_font", EditorNode::get_singleton()->get_gui_base()->get_theme_font(SNAME("main"), SNAME("EditorFonts"))); + warnings_panel->add_theme_font_size_override("normal_font_size", EditorNode::get_singleton()->get_gui_base()->get_theme_font_size(SNAME("main_size"), SNAME("EditorFonts"))); + } +} + +void ShaderTextEditor::_check_shader_mode() { + String type = ShaderLanguage::get_shader_type(get_text_editor()->get_text()); + + Shader::Mode mode; + + if (type == "canvas_item") { + mode = Shader::MODE_CANVAS_ITEM; + } else if (type == "particles") { + mode = Shader::MODE_PARTICLES; + } else if (type == "sky") { + mode = Shader::MODE_SKY; + } else if (type == "fog") { + mode = Shader::MODE_FOG; + } else { + mode = Shader::MODE_SPATIAL; + } + + if (shader->get_mode() != mode) { + set_block_shader_changed(true); + shader->set_code(get_text_editor()->get_text()); + set_block_shader_changed(false); + _load_theme_settings(); + } +} + +static ShaderLanguage::DataType _get_global_shader_uniform_type(const StringName &p_variable) { + RS::GlobalShaderParameterType gvt = RS::get_singleton()->global_shader_parameter_get_type(p_variable); + return (ShaderLanguage::DataType)RS::global_shader_uniform_type_get_shader_datatype(gvt); +} + +static String complete_from_path; + +static void _complete_include_paths_search(EditorFileSystemDirectory *p_efsd, List<ScriptLanguage::CodeCompletionOption> *r_options) { + if (!p_efsd) { + return; + } + for (int i = 0; i < p_efsd->get_file_count(); i++) { + if (p_efsd->get_file_type(i) == SNAME("ShaderInclude")) { + String path = p_efsd->get_file_path(i); + if (path.begins_with(complete_from_path)) { + path = path.replace_first(complete_from_path, ""); + } + r_options->push_back(ScriptLanguage::CodeCompletionOption(path, ScriptLanguage::CODE_COMPLETION_KIND_FILE_PATH)); + } + } + for (int j = 0; j < p_efsd->get_subdir_count(); j++) { + _complete_include_paths_search(p_efsd->get_subdir(j), r_options); + } +} + +static void _complete_include_paths(List<ScriptLanguage::CodeCompletionOption> *r_options) { + _complete_include_paths_search(EditorFileSystem::get_singleton()->get_filesystem(), r_options); +} + +void ShaderTextEditor::_code_complete_script(const String &p_code, List<ScriptLanguage::CodeCompletionOption> *r_options) { + List<ScriptLanguage::CodeCompletionOption> pp_options; + List<ScriptLanguage::CodeCompletionOption> pp_defines; + ShaderPreprocessor preprocessor; + String code; + complete_from_path = (shader.is_valid() ? shader->get_path() : shader_inc->get_path()).get_base_dir(); + if (!complete_from_path.ends_with("/")) { + complete_from_path += "/"; + } + preprocessor.preprocess(p_code, "", code, nullptr, nullptr, nullptr, nullptr, &pp_options, &pp_defines, _complete_include_paths); + complete_from_path = String(); + if (pp_options.size()) { + for (const ScriptLanguage::CodeCompletionOption &E : pp_options) { + r_options->push_back(E); + } + return; + } + for (const ScriptLanguage::CodeCompletionOption &E : pp_defines) { + r_options->push_back(E); + } + + ShaderLanguage sl; + String calltip; + ShaderLanguage::ShaderCompileInfo info; + info.global_shader_uniform_type_func = _get_global_shader_uniform_type; + + if (shader.is_null()) { + info.is_include = true; + + sl.complete(code, info, r_options, calltip); + get_text_editor()->set_code_hint(calltip); + return; + } + _check_shader_mode(); + info.functions = ShaderTypes::get_singleton()->get_functions(RenderingServer::ShaderMode(shader->get_mode())); + info.render_modes = ShaderTypes::get_singleton()->get_modes(RenderingServer::ShaderMode(shader->get_mode())); + info.shader_types = ShaderTypes::get_singleton()->get_types(); + + sl.complete(code, info, r_options, calltip); + get_text_editor()->set_code_hint(calltip); +} + +void ShaderTextEditor::_validate_script() { + emit_signal(SNAME("script_changed")); // Ensure to notify that it changed, so it is applied + + String code; + + if (shader.is_valid()) { + _check_shader_mode(); + code = shader->get_code(); + } else { + code = shader_inc->get_code(); + } + + ShaderPreprocessor preprocessor; + String code_pp; + String error_pp; + List<ShaderPreprocessor::FilePosition> err_positions; + List<ShaderPreprocessor::Region> regions; + String filename; + if (shader.is_valid()) { + filename = shader->get_path(); + } else if (shader_inc.is_valid()) { + filename = shader_inc->get_path(); + } + last_compile_result = preprocessor.preprocess(code, filename, code_pp, &error_pp, &err_positions, ®ions); + + for (int i = 0; i < get_text_editor()->get_line_count(); i++) { + get_text_editor()->set_line_background_color(i, Color(0, 0, 0, 0)); + } + + syntax_highlighter->clear_disabled_branch_regions(); + for (const ShaderPreprocessor::Region ®ion : regions) { + if (!region.enabled) { + if (filename != region.file) { + continue; + } + syntax_highlighter->add_disabled_branch_region(Point2i(region.from_line, region.to_line)); + } + } + + set_error(""); + set_error_count(0); + + if (last_compile_result != OK) { + //preprocessor error + ERR_FAIL_COND(err_positions.size() == 0); + + String error_text = error_pp; + int error_line = err_positions.front()->get().line; + if (err_positions.size() == 1) { + // Error in main file + error_text = "error(" + itos(error_line) + "): " + error_text; + } else { + error_text = "error(" + itos(error_line) + ") in include " + err_positions.back()->get().file.get_file() + ":" + itos(err_positions.back()->get().line) + ": " + error_text; + set_error_count(err_positions.size() - 1); + } + + set_error(error_text); + set_error_pos(error_line - 1, 0); + for (int i = 0; i < get_text_editor()->get_line_count(); i++) { + get_text_editor()->set_line_background_color(i, Color(0, 0, 0, 0)); + } + get_text_editor()->set_line_background_color(error_line - 1, marked_line_color); + + set_warning_count(0); + + } else { + ShaderLanguage sl; + + sl.enable_warning_checking(saved_warnings_enabled); + uint32_t flags = saved_warning_flags; + if (shader.is_null()) { + if (flags & ShaderWarning::UNUSED_CONSTANT) { + flags &= ~(ShaderWarning::UNUSED_CONSTANT); + } + if (flags & ShaderWarning::UNUSED_FUNCTION) { + flags &= ~(ShaderWarning::UNUSED_FUNCTION); + } + if (flags & ShaderWarning::UNUSED_STRUCT) { + flags &= ~(ShaderWarning::UNUSED_STRUCT); + } + if (flags & ShaderWarning::UNUSED_UNIFORM) { + flags &= ~(ShaderWarning::UNUSED_UNIFORM); + } + if (flags & ShaderWarning::UNUSED_VARYING) { + flags &= ~(ShaderWarning::UNUSED_VARYING); + } + } + sl.set_warning_flags(flags); + + ShaderLanguage::ShaderCompileInfo info; + info.global_shader_uniform_type_func = _get_global_shader_uniform_type; + + if (shader.is_null()) { + info.is_include = true; + } else { + Shader::Mode mode = shader->get_mode(); + info.functions = ShaderTypes::get_singleton()->get_functions(RenderingServer::ShaderMode(mode)); + info.render_modes = ShaderTypes::get_singleton()->get_modes(RenderingServer::ShaderMode(mode)); + info.shader_types = ShaderTypes::get_singleton()->get_types(); + } + + code = code_pp; + //compiler error + last_compile_result = sl.compile(code, info); + + if (last_compile_result != OK) { + String error_text; + int error_line; + Vector<ShaderLanguage::FilePosition> include_positions = sl.get_include_positions(); + if (include_positions.size() > 1) { + //error is in an include + error_line = include_positions[0].line; + error_text = "error(" + itos(error_line) + ") in include " + include_positions[include_positions.size() - 1].file + ":" + itos(include_positions[include_positions.size() - 1].line) + ": " + sl.get_error_text(); + set_error_count(include_positions.size() - 1); + } else { + error_line = sl.get_error_line(); + error_text = "error(" + itos(error_line) + "): " + sl.get_error_text(); + set_error_count(0); + } + set_error(error_text); + set_error_pos(error_line - 1, 0); + get_text_editor()->set_line_background_color(error_line - 1, marked_line_color); + } else { + set_error(""); + } + + if (warnings.size() > 0 || last_compile_result != OK) { + warnings_panel->clear(); + } + warnings.clear(); + for (List<ShaderWarning>::Element *E = sl.get_warnings_ptr(); E; E = E->next()) { + warnings.push_back(E->get()); + } + if (warnings.size() > 0 && last_compile_result == OK) { + warnings.sort_custom<WarningsComparator>(); + _update_warning_panel(); + } else { + set_warning_count(0); + } + } + + emit_signal(SNAME("script_validated"), last_compile_result == OK); // Notify that validation finished, to update the list of scripts +} + +void ShaderTextEditor::_update_warning_panel() { + int warning_count = 0; + + warnings_panel->push_table(2); + for (int i = 0; i < warnings.size(); i++) { + ShaderWarning &w = warnings[i]; + + if (warning_count == 0) { + if (saved_treat_warning_as_errors) { + String error_text = "error(" + itos(w.get_line()) + "): " + w.get_message() + " " + TTR("Warnings should be fixed to prevent errors."); + set_error_pos(w.get_line() - 1, 0); + set_error(error_text); + get_text_editor()->set_line_background_color(w.get_line() - 1, marked_line_color); + } + } + + warning_count++; + int line = w.get_line(); + + // First cell. + warnings_panel->push_cell(); + warnings_panel->push_color(warnings_panel->get_theme_color(SNAME("warning_color"), SNAME("Editor"))); + if (line != -1) { + warnings_panel->push_meta(line - 1); + warnings_panel->add_text(TTR("Line") + " " + itos(line)); + warnings_panel->add_text(" (" + w.get_name() + "):"); + warnings_panel->pop(); // Meta goto. + } else { + warnings_panel->add_text(w.get_name() + ":"); + } + warnings_panel->pop(); // Color. + warnings_panel->pop(); // Cell. + + // Second cell. + warnings_panel->push_cell(); + warnings_panel->add_text(w.get_message()); + warnings_panel->pop(); // Cell. + } + warnings_panel->pop(); // Table. + + set_warning_count(warning_count); +} + +void ShaderTextEditor::_bind_methods() { + ADD_SIGNAL(MethodInfo("script_validated", PropertyInfo(Variant::BOOL, "valid"))); +} + +ShaderTextEditor::ShaderTextEditor() { + syntax_highlighter.instantiate(); + get_text_editor()->set_syntax_highlighter(syntax_highlighter); +} + +/*** SCRIPT EDITOR ******/ + +void TextShaderEditor::_menu_option(int p_option) { + switch (p_option) { + case EDIT_UNDO: { + shader_editor->get_text_editor()->undo(); + } break; + case EDIT_REDO: { + shader_editor->get_text_editor()->redo(); + } break; + case EDIT_CUT: { + shader_editor->get_text_editor()->cut(); + } break; + case EDIT_COPY: { + shader_editor->get_text_editor()->copy(); + } break; + case EDIT_PASTE: { + shader_editor->get_text_editor()->paste(); + } break; + case EDIT_SELECT_ALL: { + shader_editor->get_text_editor()->select_all(); + } break; + case EDIT_MOVE_LINE_UP: { + shader_editor->move_lines_up(); + } break; + case EDIT_MOVE_LINE_DOWN: { + shader_editor->move_lines_down(); + } break; + case EDIT_INDENT: { + if (shader.is_null()) { + return; + } + shader_editor->get_text_editor()->indent_lines(); + } break; + case EDIT_UNINDENT: { + if (shader.is_null()) { + return; + } + shader_editor->get_text_editor()->unindent_lines(); + } break; + case EDIT_DELETE_LINE: { + shader_editor->delete_lines(); + } break; + case EDIT_DUPLICATE_SELECTION: { + shader_editor->duplicate_selection(); + } break; + case EDIT_TOGGLE_COMMENT: { + if (shader.is_null()) { + return; + } + + shader_editor->toggle_inline_comment("//"); + + } break; + case EDIT_COMPLETE: { + shader_editor->get_text_editor()->request_code_completion(); + } break; + case SEARCH_FIND: { + shader_editor->get_find_replace_bar()->popup_search(); + } break; + case SEARCH_FIND_NEXT: { + shader_editor->get_find_replace_bar()->search_next(); + } break; + case SEARCH_FIND_PREV: { + shader_editor->get_find_replace_bar()->search_prev(); + } break; + case SEARCH_REPLACE: { + shader_editor->get_find_replace_bar()->popup_replace(); + } break; + case SEARCH_GOTO_LINE: { + goto_line_dialog->popup_find_line(shader_editor->get_text_editor()); + } break; + case BOOKMARK_TOGGLE: { + shader_editor->toggle_bookmark(); + } break; + case BOOKMARK_GOTO_NEXT: { + shader_editor->goto_next_bookmark(); + } break; + case BOOKMARK_GOTO_PREV: { + shader_editor->goto_prev_bookmark(); + } break; + case BOOKMARK_REMOVE_ALL: { + shader_editor->remove_all_bookmarks(); + } break; + case HELP_DOCS: { + OS::get_singleton()->shell_open(vformat("%s/tutorials/shaders/shader_reference/index.html", VERSION_DOCS_URL)); + } break; + } + if (p_option != SEARCH_FIND && p_option != SEARCH_REPLACE && p_option != SEARCH_GOTO_LINE) { + shader_editor->get_text_editor()->call_deferred(SNAME("grab_focus")); + } +} + +void TextShaderEditor::_notification(int p_what) { + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + PopupMenu *popup = help_menu->get_popup(); + popup->set_item_icon(popup->get_item_index(HELP_DOCS), get_theme_icon(SNAME("ExternalLink"), SNAME("EditorIcons"))); + } break; + + case NOTIFICATION_APPLICATION_FOCUS_IN: { + _check_for_external_edit(); + } break; + } +} + +void TextShaderEditor::_editor_settings_changed() { + shader_editor->update_editor_settings(); + + shader_editor->get_text_editor()->add_theme_constant_override("line_spacing", EditorSettings::get_singleton()->get("text_editor/appearance/whitespace/line_spacing")); + shader_editor->get_text_editor()->set_draw_breakpoints_gutter(false); + shader_editor->get_text_editor()->set_draw_executing_lines_gutter(false); +} + +void TextShaderEditor::_show_warnings_panel(bool p_show) { + warnings_panel->set_visible(p_show); +} + +void TextShaderEditor::_warning_clicked(Variant p_line) { + if (p_line.get_type() == Variant::INT) { + shader_editor->get_text_editor()->set_caret_line(p_line.operator int64_t()); + } +} + +void TextShaderEditor::_bind_methods() { + ClassDB::bind_method("_show_warnings_panel", &TextShaderEditor::_show_warnings_panel); + ClassDB::bind_method("_warning_clicked", &TextShaderEditor::_warning_clicked); + + ADD_SIGNAL(MethodInfo("validation_changed")); +} + +void TextShaderEditor::ensure_select_current() { +} + +void TextShaderEditor::goto_line_selection(int p_line, int p_begin, int p_end) { + shader_editor->goto_line_selection(p_line, p_begin, p_end); +} + +void TextShaderEditor::_project_settings_changed() { + _update_warnings(true); +} + +void TextShaderEditor::_update_warnings(bool p_validate) { + bool changed = false; + + bool warnings_enabled = GLOBAL_GET("debug/shader_language/warnings/enable").booleanize(); + if (warnings_enabled != saved_warnings_enabled) { + saved_warnings_enabled = warnings_enabled; + changed = true; + } + + bool treat_warning_as_errors = GLOBAL_GET("debug/shader_language/warnings/treat_warnings_as_errors").booleanize(); + if (treat_warning_as_errors != saved_treat_warning_as_errors) { + saved_treat_warning_as_errors = treat_warning_as_errors; + changed = true; + } + + bool update_flags = false; + + for (int i = 0; i < ShaderWarning::WARNING_MAX; i++) { + ShaderWarning::Code code = (ShaderWarning::Code)i; + bool value = GLOBAL_GET("debug/shader_language/warnings/" + ShaderWarning::get_name_from_code(code).to_lower()); + + if (saved_warnings[code] != value) { + saved_warnings[code] = value; + update_flags = true; + changed = true; + } + } + + if (update_flags) { + saved_warning_flags = (uint32_t)ShaderWarning::get_flags_from_codemap(saved_warnings); + } + + if (p_validate && changed && shader_editor && shader_editor->get_edited_shader().is_valid()) { + shader_editor->validate_script(); + } +} + +void TextShaderEditor::_check_for_external_edit() { + bool use_autoreload = bool(EDITOR_GET("text_editor/behavior/files/auto_reload_scripts_on_external_change")); + + if (shader_inc.is_valid()) { + if (shader_inc->get_last_modified_time() != FileAccess::get_modified_time(shader_inc->get_path())) { + if (use_autoreload) { + _reload_shader_include_from_disk(); + } else { + disk_changed->call_deferred(SNAME("popup_centered")); + } + } + return; + } + + if (shader.is_null() || shader->is_built_in()) { + return; + } + + if (shader->get_last_modified_time() != FileAccess::get_modified_time(shader->get_path())) { + if (use_autoreload) { + _reload_shader_from_disk(); + } else { + disk_changed->call_deferred(SNAME("popup_centered")); + } + } +} + +void TextShaderEditor::_reload_shader_from_disk() { + Ref<Shader> rel_shader = ResourceLoader::load(shader->get_path(), shader->get_class(), ResourceFormatLoader::CACHE_MODE_IGNORE); + ERR_FAIL_COND(!rel_shader.is_valid()); + + shader_editor->set_block_shader_changed(true); + shader->set_code(rel_shader->get_code()); + shader_editor->set_block_shader_changed(false); + shader->set_last_modified_time(rel_shader->get_last_modified_time()); + shader_editor->reload_text(); +} + +void TextShaderEditor::_reload_shader_include_from_disk() { + Ref<ShaderInclude> rel_shader_include = ResourceLoader::load(shader_inc->get_path(), shader_inc->get_class(), ResourceFormatLoader::CACHE_MODE_IGNORE); + ERR_FAIL_COND(!rel_shader_include.is_valid()); + + shader_editor->set_block_shader_changed(true); + shader_inc->set_code(rel_shader_include->get_code()); + shader_editor->set_block_shader_changed(false); + shader_inc->set_last_modified_time(rel_shader_include->get_last_modified_time()); + shader_editor->reload_text(); +} + +void TextShaderEditor::_reload() { + if (shader.is_valid()) { + _reload_shader_from_disk(); + } else if (shader_inc.is_valid()) { + _reload_shader_include_from_disk(); + } +} + +void TextShaderEditor::edit(const Ref<Shader> &p_shader) { + if (p_shader.is_null() || !p_shader->is_text_shader()) { + return; + } + + if (shader == p_shader) { + return; + } + + shader = p_shader; + shader_inc = Ref<ShaderInclude>(); + + shader_editor->set_edited_shader(shader); +} + +void TextShaderEditor::edit(const Ref<ShaderInclude> &p_shader_inc) { + if (p_shader_inc.is_null()) { + return; + } + + if (shader_inc == p_shader_inc) { + return; + } + + shader_inc = p_shader_inc; + shader = Ref<Shader>(); + + shader_editor->set_edited_shader_include(p_shader_inc); +} + +void TextShaderEditor::save_external_data(const String &p_str) { + if (shader.is_null() && shader_inc.is_null()) { + disk_changed->hide(); + return; + } + + apply_shaders(); + + Ref<Shader> edited_shader = shader_editor->get_edited_shader(); + if (edited_shader.is_valid()) { + ResourceSaver::save(edited_shader); + } + if (shader.is_valid() && shader != edited_shader) { + ResourceSaver::save(shader); + } + + Ref<ShaderInclude> edited_shader_inc = shader_editor->get_edited_shader_include(); + if (edited_shader_inc.is_valid()) { + ResourceSaver::save(edited_shader_inc); + } + if (shader_inc.is_valid() && shader_inc != edited_shader_inc) { + ResourceSaver::save(shader_inc); + } + shader_editor->get_text_editor()->tag_saved_version(); + + disk_changed->hide(); +} + +void TextShaderEditor::validate_script() { + shader_editor->_validate_script(); +} + +bool TextShaderEditor::is_unsaved() const { + return shader_editor->get_text_editor()->get_saved_version() != shader_editor->get_text_editor()->get_version(); +} + +void TextShaderEditor::tag_saved_version() { + shader_editor->get_text_editor()->tag_saved_version(); +} + +void TextShaderEditor::apply_shaders() { + String editor_code = shader_editor->get_text_editor()->get_text(); + if (shader.is_valid()) { + String shader_code = shader->get_code(); + if (shader_code != editor_code || dependencies_version != shader_editor->get_dependencies_version()) { + shader_editor->set_block_shader_changed(true); + shader->set_code(editor_code); + shader_editor->set_block_shader_changed(false); + shader->set_edited(true); + } + } + if (shader_inc.is_valid()) { + String shader_inc_code = shader_inc->get_code(); + if (shader_inc_code != editor_code || dependencies_version != shader_editor->get_dependencies_version()) { + shader_editor->set_block_shader_changed(true); + shader_inc->set_code(editor_code); + shader_editor->set_block_shader_changed(false); + shader_inc->set_edited(true); + } + } + + dependencies_version = shader_editor->get_dependencies_version(); +} + +void TextShaderEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) { + Ref<InputEventMouseButton> mb = ev; + + if (mb.is_valid()) { + if (mb->get_button_index() == MouseButton::RIGHT && mb->is_pressed()) { + CodeEdit *tx = shader_editor->get_text_editor(); + + Point2i pos = tx->get_line_column_at_pos(mb->get_global_position() - tx->get_global_position()); + int row = pos.y; + int col = pos.x; + tx->set_move_caret_on_right_click_enabled(EditorSettings::get_singleton()->get("text_editor/behavior/navigation/move_caret_on_right_click")); + + if (tx->is_move_caret_on_right_click_enabled()) { + if (tx->has_selection()) { + int from_line = tx->get_selection_from_line(); + int to_line = tx->get_selection_to_line(); + int from_column = tx->get_selection_from_column(); + int to_column = tx->get_selection_to_column(); + + if (row < from_line || row > to_line || (row == from_line && col < from_column) || (row == to_line && col > to_column)) { + // Right click is outside the selected text + tx->deselect(); + } + } + if (!tx->has_selection()) { + tx->set_caret_line(row, true, false); + tx->set_caret_column(col); + } + } + _make_context_menu(tx->has_selection(), get_local_mouse_position()); + } + } + + Ref<InputEventKey> k = ev; + if (k.is_valid() && k->is_pressed() && k->is_action("ui_menu", true)) { + CodeEdit *tx = shader_editor->get_text_editor(); + tx->adjust_viewport_to_caret(); + _make_context_menu(tx->has_selection(), (get_global_transform().inverse() * tx->get_global_transform()).xform(tx->get_caret_draw_pos())); + context_menu->grab_focus(); + } +} + +void TextShaderEditor::_update_bookmark_list() { + bookmarks_menu->clear(); + + bookmarks_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_bookmark"), BOOKMARK_TOGGLE); + bookmarks_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/remove_all_bookmarks"), BOOKMARK_REMOVE_ALL); + bookmarks_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/goto_next_bookmark"), BOOKMARK_GOTO_NEXT); + bookmarks_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/goto_previous_bookmark"), BOOKMARK_GOTO_PREV); + + PackedInt32Array bookmark_list = shader_editor->get_text_editor()->get_bookmarked_lines(); + if (bookmark_list.size() == 0) { + return; + } + + bookmarks_menu->add_separator(); + + for (int i = 0; i < bookmark_list.size(); i++) { + String line = shader_editor->get_text_editor()->get_line(bookmark_list[i]).strip_edges(); + // Limit the size of the line if too big. + if (line.length() > 50) { + line = line.substr(0, 50); + } + + bookmarks_menu->add_item(String::num((int)bookmark_list[i] + 1) + " - \"" + line + "\""); + bookmarks_menu->set_item_metadata(-1, bookmark_list[i]); + } +} + +void TextShaderEditor::_bookmark_item_pressed(int p_idx) { + if (p_idx < 4) { // Any item before the separator. + _menu_option(bookmarks_menu->get_item_id(p_idx)); + } else { + shader_editor->goto_line(bookmarks_menu->get_item_metadata(p_idx)); + } +} + +void TextShaderEditor::_make_context_menu(bool p_selection, Vector2 p_position) { + context_menu->clear(); + if (p_selection) { + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_cut"), EDIT_CUT); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_copy"), EDIT_COPY); + } + + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_paste"), EDIT_PASTE); + context_menu->add_separator(); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_text_select_all"), EDIT_SELECT_ALL); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_undo"), EDIT_UNDO); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_redo"), EDIT_REDO); + + context_menu->add_separator(); + context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent"), EDIT_INDENT); + context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/unindent"), EDIT_UNINDENT); + context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_comment"), EDIT_TOGGLE_COMMENT); + context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_bookmark"), BOOKMARK_TOGGLE); + + context_menu->set_position(get_screen_position() + p_position); + context_menu->reset_size(); + context_menu->popup(); +} + +TextShaderEditor::TextShaderEditor() { + GLOBAL_DEF("debug/shader_language/warnings/enable", true); + GLOBAL_DEF("debug/shader_language/warnings/treat_warnings_as_errors", false); + for (int i = 0; i < (int)ShaderWarning::WARNING_MAX; i++) { + GLOBAL_DEF("debug/shader_language/warnings/" + ShaderWarning::get_name_from_code((ShaderWarning::Code)i).to_lower(), true); + } + _update_warnings(false); + + shader_editor = memnew(ShaderTextEditor); + + shader_editor->connect("script_validated", callable_mp(this, &TextShaderEditor::_script_validated)); + + shader_editor->set_v_size_flags(SIZE_EXPAND_FILL); + shader_editor->add_theme_constant_override("separation", 0); + shader_editor->set_anchors_and_offsets_preset(Control::PRESET_FULL_RECT); + + shader_editor->connect("show_warnings_panel", callable_mp(this, &TextShaderEditor::_show_warnings_panel)); + shader_editor->connect("script_changed", callable_mp(this, &TextShaderEditor::apply_shaders)); + EditorSettings::get_singleton()->connect("settings_changed", callable_mp(this, &TextShaderEditor::_editor_settings_changed)); + ProjectSettingsEditor::get_singleton()->connect("confirmed", callable_mp(this, &TextShaderEditor::_project_settings_changed)); + + shader_editor->get_text_editor()->set_code_hint_draw_below(EditorSettings::get_singleton()->get("text_editor/completion/put_callhint_tooltip_below_current_line")); + + shader_editor->get_text_editor()->set_symbol_lookup_on_click_enabled(true); + shader_editor->get_text_editor()->set_context_menu_enabled(false); + shader_editor->get_text_editor()->connect("gui_input", callable_mp(this, &TextShaderEditor::_text_edit_gui_input)); + + shader_editor->update_editor_settings(); + + context_menu = memnew(PopupMenu); + add_child(context_menu); + context_menu->connect("id_pressed", callable_mp(this, &TextShaderEditor::_menu_option)); + + VBoxContainer *main_container = memnew(VBoxContainer); + HBoxContainer *hbc = memnew(HBoxContainer); + + edit_menu = memnew(MenuButton); + edit_menu->set_shortcut_context(this); + edit_menu->set_text(TTR("Edit")); + edit_menu->set_switch_on_hover(true); + + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_undo"), EDIT_UNDO); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_redo"), EDIT_REDO); + edit_menu->get_popup()->add_separator(); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_cut"), EDIT_CUT); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_copy"), EDIT_COPY); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_paste"), EDIT_PASTE); + edit_menu->get_popup()->add_separator(); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_text_select_all"), EDIT_SELECT_ALL); + edit_menu->get_popup()->add_separator(); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/move_up"), EDIT_MOVE_LINE_UP); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/move_down"), EDIT_MOVE_LINE_DOWN); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent"), EDIT_INDENT); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/unindent"), EDIT_UNINDENT); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/delete_line"), EDIT_DELETE_LINE); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_comment"), EDIT_TOGGLE_COMMENT); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/duplicate_selection"), EDIT_DUPLICATE_SELECTION); + edit_menu->get_popup()->add_separator(); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_text_completion_query"), EDIT_COMPLETE); + edit_menu->get_popup()->connect("id_pressed", callable_mp(this, &TextShaderEditor::_menu_option)); + + search_menu = memnew(MenuButton); + search_menu->set_shortcut_context(this); + search_menu->set_text(TTR("Search")); + search_menu->set_switch_on_hover(true); + + search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find"), SEARCH_FIND); + search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_next"), SEARCH_FIND_NEXT); + search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_previous"), SEARCH_FIND_PREV); + search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/replace"), SEARCH_REPLACE); + search_menu->get_popup()->connect("id_pressed", callable_mp(this, &TextShaderEditor::_menu_option)); + + MenuButton *goto_menu = memnew(MenuButton); + goto_menu->set_shortcut_context(this); + goto_menu->set_text(TTR("Go To")); + goto_menu->set_switch_on_hover(true); + goto_menu->get_popup()->connect("id_pressed", callable_mp(this, &TextShaderEditor::_menu_option)); + + goto_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/goto_line"), SEARCH_GOTO_LINE); + goto_menu->get_popup()->add_separator(); + + bookmarks_menu = memnew(PopupMenu); + bookmarks_menu->set_name("Bookmarks"); + goto_menu->get_popup()->add_child(bookmarks_menu); + goto_menu->get_popup()->add_submenu_item(TTR("Bookmarks"), "Bookmarks"); + _update_bookmark_list(); + bookmarks_menu->connect("about_to_popup", callable_mp(this, &TextShaderEditor::_update_bookmark_list)); + bookmarks_menu->connect("index_pressed", callable_mp(this, &TextShaderEditor::_bookmark_item_pressed)); + + help_menu = memnew(MenuButton); + help_menu->set_text(TTR("Help")); + help_menu->set_switch_on_hover(true); + help_menu->get_popup()->add_item(TTR("Online Docs"), HELP_DOCS); + help_menu->get_popup()->connect("id_pressed", callable_mp(this, &TextShaderEditor::_menu_option)); + + add_child(main_container); + main_container->add_child(hbc); + hbc->add_child(search_menu); + hbc->add_child(edit_menu); + hbc->add_child(goto_menu); + hbc->add_child(help_menu); + hbc->add_theme_style_override("panel", EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("ScriptEditorPanel"), SNAME("EditorStyles"))); + + VSplitContainer *editor_box = memnew(VSplitContainer); + main_container->add_child(editor_box); + editor_box->set_anchors_and_offsets_preset(Control::PRESET_FULL_RECT); + editor_box->set_v_size_flags(SIZE_EXPAND_FILL); + editor_box->add_child(shader_editor); + + FindReplaceBar *bar = memnew(FindReplaceBar); + main_container->add_child(bar); + bar->hide(); + shader_editor->set_find_replace_bar(bar); + + warnings_panel = memnew(RichTextLabel); + warnings_panel->set_custom_minimum_size(Size2(0, 100 * EDSCALE)); + warnings_panel->set_h_size_flags(SIZE_EXPAND_FILL); + warnings_panel->set_meta_underline(true); + warnings_panel->set_selection_enabled(true); + warnings_panel->set_focus_mode(FOCUS_CLICK); + warnings_panel->hide(); + warnings_panel->connect("meta_clicked", callable_mp(this, &TextShaderEditor::_warning_clicked)); + editor_box->add_child(warnings_panel); + shader_editor->set_warnings_panel(warnings_panel); + + goto_line_dialog = memnew(GotoLineDialog); + add_child(goto_line_dialog); + + disk_changed = memnew(ConfirmationDialog); + + VBoxContainer *vbc = memnew(VBoxContainer); + disk_changed->add_child(vbc); + + Label *dl = memnew(Label); + dl->set_text(TTR("This shader has been modified on disk.\nWhat action should be taken?")); + vbc->add_child(dl); + + disk_changed->connect("confirmed", callable_mp(this, &TextShaderEditor::_reload)); + disk_changed->set_ok_button_text(TTR("Reload")); + + disk_changed->add_button(TTR("Resave"), !DisplayServer::get_singleton()->get_swap_cancel_ok(), "resave"); + disk_changed->connect("custom_action", callable_mp(this, &TextShaderEditor::save_external_data)); + + add_child(disk_changed); + + _editor_settings_changed(); +} diff --git a/editor/plugins/text_shader_editor.h b/editor/plugins/text_shader_editor.h new file mode 100644 index 0000000000..c2094342ed --- /dev/null +++ b/editor/plugins/text_shader_editor.h @@ -0,0 +1,200 @@ +/*************************************************************************/ +/* text_shader_editor.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* 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 TEXT_SHADER_EDITOR_H +#define TEXT_SHADER_EDITOR_H + +#include "editor/code_editor.h" +#include "scene/gui/menu_button.h" +#include "scene/gui/panel_container.h" +#include "scene/gui/rich_text_label.h" +#include "servers/rendering/shader_warnings.h" + +class GDShaderSyntaxHighlighter : public CodeHighlighter { + GDCLASS(GDShaderSyntaxHighlighter, CodeHighlighter) + +private: + Vector<Point2i> disabled_branch_regions; + Color disabled_branch_color; + +public: + virtual Dictionary _get_line_syntax_highlighting_impl(int p_line) override; + + void add_disabled_branch_region(const Point2i &p_region); + void clear_disabled_branch_regions(); + void set_disabled_branch_color(const Color &p_color); +}; + +class ShaderTextEditor : public CodeTextEditor { + GDCLASS(ShaderTextEditor, CodeTextEditor); + + Color marked_line_color = Color(1, 1, 1); + + struct WarningsComparator { + _ALWAYS_INLINE_ bool operator()(const ShaderWarning &p_a, const ShaderWarning &p_b) const { return (p_a.get_line() < p_b.get_line()); } + }; + + Ref<GDShaderSyntaxHighlighter> syntax_highlighter; + RichTextLabel *warnings_panel = nullptr; + Ref<Shader> shader; + Ref<ShaderInclude> shader_inc; + List<ShaderWarning> warnings; + Error last_compile_result = Error::OK; + + void _check_shader_mode(); + void _update_warning_panel(); + + bool block_shader_changed = false; + void _shader_changed(); + + uint32_t dependencies_version = 0; // Incremented if deps changed + +protected: + void _notification(int p_what); + static void _bind_methods(); + virtual void _load_theme_settings() override; + + virtual void _code_complete_script(const String &p_code, List<ScriptLanguage::CodeCompletionOption> *r_options) override; + +public: + void set_block_shader_changed(bool p_block) { block_shader_changed = p_block; } + uint32_t get_dependencies_version() const { return dependencies_version; } + + virtual void _validate_script() override; + + void reload_text(); + void set_warnings_panel(RichTextLabel *p_warnings_panel); + + Ref<Shader> get_edited_shader() const; + Ref<ShaderInclude> get_edited_shader_include() const; + + void set_edited_shader(const Ref<Shader> &p_shader); + void set_edited_shader(const Ref<Shader> &p_shader, const String &p_code); + void set_edited_shader_include(const Ref<ShaderInclude> &p_include); + void set_edited_shader_include(const Ref<ShaderInclude> &p_include, const String &p_code); + void set_edited_code(const String &p_code); + + ShaderTextEditor(); +}; + +class TextShaderEditor : public MarginContainer { + GDCLASS(TextShaderEditor, MarginContainer); + + enum { + EDIT_UNDO, + EDIT_REDO, + EDIT_CUT, + EDIT_COPY, + EDIT_PASTE, + EDIT_SELECT_ALL, + EDIT_MOVE_LINE_UP, + EDIT_MOVE_LINE_DOWN, + EDIT_INDENT, + EDIT_UNINDENT, + EDIT_DELETE_LINE, + EDIT_DUPLICATE_SELECTION, + EDIT_TOGGLE_COMMENT, + EDIT_COMPLETE, + SEARCH_FIND, + SEARCH_FIND_NEXT, + SEARCH_FIND_PREV, + SEARCH_REPLACE, + SEARCH_GOTO_LINE, + BOOKMARK_TOGGLE, + BOOKMARK_GOTO_NEXT, + BOOKMARK_GOTO_PREV, + BOOKMARK_REMOVE_ALL, + HELP_DOCS, + }; + + MenuButton *edit_menu = nullptr; + MenuButton *search_menu = nullptr; + PopupMenu *bookmarks_menu = nullptr; + MenuButton *help_menu = nullptr; + PopupMenu *context_menu = nullptr; + RichTextLabel *warnings_panel = nullptr; + uint64_t idle = 0; + + GotoLineDialog *goto_line_dialog = nullptr; + ConfirmationDialog *erase_tab_confirm = nullptr; + ConfirmationDialog *disk_changed = nullptr; + + ShaderTextEditor *shader_editor = nullptr; + bool compilation_success = true; + + void _menu_option(int p_option); + mutable Ref<Shader> shader; + mutable Ref<ShaderInclude> shader_inc; + + void _editor_settings_changed(); + void _project_settings_changed(); + + void _check_for_external_edit(); + void _reload_shader_from_disk(); + void _reload_shader_include_from_disk(); + void _reload(); + void _show_warnings_panel(bool p_show); + void _warning_clicked(Variant p_line); + void _update_warnings(bool p_validate); + + void _script_validated(bool p_valid) { + compilation_success = p_valid; + emit_signal(SNAME("validation_changed")); + } + + uint32_t dependencies_version = 0xFFFFFFFF; + +protected: + void _notification(int p_what); + static void _bind_methods(); + void _make_context_menu(bool p_selection, Vector2 p_position); + void _text_edit_gui_input(const Ref<InputEvent> &p_ev); + + void _update_bookmark_list(); + void _bookmark_item_pressed(int p_idx); + +public: + bool was_compilation_successful() const { return compilation_success; } + void apply_shaders(); + void ensure_select_current(); + void edit(const Ref<Shader> &p_shader); + void edit(const Ref<ShaderInclude> &p_shader_inc); + void goto_line_selection(int p_line, int p_begin, int p_end); + void save_external_data(const String &p_str = ""); + void validate_script(); + bool is_unsaved() const; + void tag_saved_version(); + + virtual Size2 get_minimum_size() const override { return Size2(0, 200); } + + TextShaderEditor(); +}; + +#endif // TEXT_SHADER_EDITOR_H diff --git a/editor/plugins/texture_3d_editor_plugin.cpp b/editor/plugins/texture_3d_editor_plugin.cpp index 3ea62184c6..4b2f28658a 100644 --- a/editor/plugins/texture_3d_editor_plugin.cpp +++ b/editor/plugins/texture_3d_editor_plugin.cpp @@ -138,10 +138,6 @@ void Texture3DEditor::edit(Ref<Texture3D> p_texture) { } } -void Texture3DEditor::_bind_methods() { - ClassDB::bind_method(D_METHOD("_layer_changed"), &Texture3DEditor::_layer_changed); -} - Texture3DEditor::Texture3DEditor() { set_texture_repeat(TextureRepeat::TEXTURE_REPEAT_ENABLED); set_custom_minimum_size(Size2(1, 150)); @@ -173,7 +169,7 @@ Texture3DEditor::Texture3DEditor() { info->add_theme_constant_override("shadow_offset_y", 2); setting = false; - layer->connect("value_changed", Callable(this, "_layer_changed")); + layer->connect("value_changed", callable_mp(this, &Texture3DEditor::_layer_changed)); } Texture3DEditor::~Texture3DEditor() { diff --git a/editor/plugins/texture_3d_editor_plugin.h b/editor/plugins/texture_3d_editor_plugin.h index 357bdb0845..7795c83c8a 100644 --- a/editor/plugins/texture_3d_editor_plugin.h +++ b/editor/plugins/texture_3d_editor_plugin.h @@ -66,8 +66,6 @@ class Texture3DEditor : public Control { protected: void _notification(int p_what); - static void _bind_methods(); - public: void edit(Ref<Texture3D> p_texture); Texture3DEditor(); diff --git a/editor/plugins/texture_layered_editor_plugin.cpp b/editor/plugins/texture_layered_editor_plugin.cpp index dd8633360e..b0a174c1bc 100644 --- a/editor/plugins/texture_layered_editor_plugin.cpp +++ b/editor/plugins/texture_layered_editor_plugin.cpp @@ -214,10 +214,6 @@ void TextureLayeredEditor::edit(Ref<TextureLayered> p_texture) { } } -void TextureLayeredEditor::_bind_methods() { - ClassDB::bind_method(D_METHOD("_layer_changed"), &TextureLayeredEditor::_layer_changed); -} - TextureLayeredEditor::TextureLayeredEditor() { set_texture_repeat(TextureRepeat::TEXTURE_REPEAT_ENABLED); set_custom_minimum_size(Size2(1, 150)); @@ -249,7 +245,7 @@ TextureLayeredEditor::TextureLayeredEditor() { info->add_theme_constant_override("shadow_offset_y", 2); setting = false; - layer->connect("value_changed", Callable(this, "_layer_changed")); + layer->connect("value_changed", callable_mp(this, &TextureLayeredEditor::_layer_changed)); } TextureLayeredEditor::~TextureLayeredEditor() { diff --git a/editor/plugins/texture_layered_editor_plugin.h b/editor/plugins/texture_layered_editor_plugin.h index f49aa83eb2..f4dbc104c8 100644 --- a/editor/plugins/texture_layered_editor_plugin.h +++ b/editor/plugins/texture_layered_editor_plugin.h @@ -68,7 +68,6 @@ class TextureLayeredEditor : public Control { protected: void _notification(int p_what); virtual void gui_input(const Ref<InputEvent> &p_event) override; - static void _bind_methods(); public: void edit(Ref<TextureLayered> p_texture); diff --git a/editor/plugins/theme_editor_plugin.cpp b/editor/plugins/theme_editor_plugin.cpp index f6acd8ceda..e2ed8e44c4 100644 --- a/editor/plugins/theme_editor_plugin.cpp +++ b/editor/plugins/theme_editor_plugin.cpp @@ -134,7 +134,7 @@ void ThemeItemImportTree::_update_items_tree() { data_type_node->set_checked(IMPORT_ITEM_DATA, false); data_type_node->set_editable(IMPORT_ITEM_DATA, true); - List<TreeItem *> *item_list; + List<TreeItem *> *item_list = nullptr; switch (dt) { case Theme::DATA_TYPE_COLOR: @@ -398,7 +398,7 @@ void ThemeItemImportTree::_restore_selected_item(TreeItem *p_tree_item) { void ThemeItemImportTree::_update_total_selected(Theme::DataType p_data_type) { ERR_FAIL_INDEX_MSG(p_data_type, Theme::DATA_TYPE_MAX, "Theme item data type is out of bounds."); - Label *total_selected_items_label; + Label *total_selected_items_label = nullptr; switch (p_data_type) { case Theme::DATA_TYPE_COLOR: total_selected_items_label = total_selected_colors_label; @@ -562,7 +562,7 @@ void ThemeItemImportTree::_select_all_data_type_pressed(int p_data_type) { } Theme::DataType data_type = (Theme::DataType)p_data_type; - List<TreeItem *> *item_list; + List<TreeItem *> *item_list = nullptr; switch (data_type) { case Theme::DATA_TYPE_COLOR: @@ -617,7 +617,7 @@ void ThemeItemImportTree::_select_full_data_type_pressed(int p_data_type) { } Theme::DataType data_type = (Theme::DataType)p_data_type; - List<TreeItem *> *item_list; + List<TreeItem *> *item_list = nullptr; switch (data_type) { case Theme::DATA_TYPE_COLOR: @@ -674,7 +674,7 @@ void ThemeItemImportTree::_deselect_all_data_type_pressed(int p_data_type) { } Theme::DataType data_type = (Theme::DataType)p_data_type; - List<TreeItem *> *item_list; + List<TreeItem *> *item_list = nullptr; switch (data_type) { case Theme::DATA_TYPE_COLOR: @@ -982,17 +982,17 @@ ThemeItemImportTree::ThemeItemImportTree() { for (int i = 0; i < Theme::DATA_TYPE_MAX; i++) { Theme::DataType dt = (Theme::DataType)i; - TextureRect *select_items_icon; - Label *select_items_label; - Button *deselect_all_items_button; - Button *select_all_items_button; - Button *select_full_items_button; - Label *total_selected_items_label; + TextureRect *select_items_icon = nullptr; + Label *select_items_label = nullptr; + Button *deselect_all_items_button = nullptr; + Button *select_all_items_button = nullptr; + Button *select_full_items_button = nullptr; + Label *total_selected_items_label = nullptr; - String items_title = ""; - String select_all_items_tooltip = ""; - String select_full_items_tooltip = ""; - String deselect_all_items_tooltip = ""; + String items_title; + String select_all_items_tooltip; + String select_full_items_tooltip; + String deselect_all_items_tooltip; switch (dt) { case Theme::DATA_TYPE_COLOR: @@ -1186,7 +1186,7 @@ ThemeItemImportTree::ThemeItemImportTree() { void ThemeItemEditorDialog::ok_pressed() { if (import_default_theme_items->has_selected_items() || import_editor_theme_items->has_selected_items() || import_other_theme_items->has_selected_items()) { confirm_closing_dialog->set_text(TTR("Import Items tab has some items selected. Selection will be lost upon closing this window.\nClose anyway?")); - confirm_closing_dialog->popup_centered(Size2i(380, 120) * EDSCALE); + confirm_closing_dialog->popup_centered(Size2(380, 120) * EDSCALE); return; } diff --git a/editor/plugins/tiles/atlas_merging_dialog.cpp b/editor/plugins/tiles/atlas_merging_dialog.cpp index de4f3f7989..d7e08db954 100644 --- a/editor/plugins/tiles/atlas_merging_dialog.cpp +++ b/editor/plugins/tiles/atlas_merging_dialog.cpp @@ -269,7 +269,7 @@ AtlasMergingDialog::AtlasMergingDialog() { // Atlas sources item list. atlas_merging_atlases_list = memnew(ItemList); - atlas_merging_atlases_list->set_fixed_icon_size(Size2i(60, 60) * EDSCALE); + atlas_merging_atlases_list->set_fixed_icon_size(Size2(60, 60) * EDSCALE); atlas_merging_atlases_list->set_h_size_flags(Control::SIZE_EXPAND_FILL); atlas_merging_atlases_list->set_v_size_flags(Control::SIZE_EXPAND_FILL); atlas_merging_atlases_list->set_texture_filter(CanvasItem::TEXTURE_FILTER_NEAREST); diff --git a/editor/plugins/tiles/tile_atlas_view.cpp b/editor/plugins/tiles/tile_atlas_view.cpp index d9291503cb..c823487279 100644 --- a/editor/plugins/tiles/tile_atlas_view.cpp +++ b/editor/plugins/tiles/tile_atlas_view.cpp @@ -403,6 +403,9 @@ void TileAtlasView::set_atlas_source(TileSet *p_tile_set, TileSetAtlasSource *p_ // Update everything. _update_zoom_and_panning(); + base_tiles_drawing_root->set_size(_compute_base_tiles_control_size()); + alternative_tiles_drawing_root->set_size(_compute_alternative_tiles_control_size()); + // Update. base_tiles_draw->queue_redraw(); base_tiles_texture_grid->queue_redraw(); @@ -601,7 +604,6 @@ TileAtlasView::TileAtlasView() { base_tiles_drawing_root = memnew(Control); base_tiles_drawing_root->set_mouse_filter(Control::MOUSE_FILTER_IGNORE); - base_tiles_drawing_root->set_anchors_and_offsets_preset(Control::PRESET_FULL_RECT); base_tiles_drawing_root->set_texture_filter(TEXTURE_FILTER_NEAREST); base_tiles_root_control->add_child(base_tiles_drawing_root); @@ -645,7 +647,6 @@ TileAtlasView::TileAtlasView() { alternative_tiles_drawing_root = memnew(Control); alternative_tiles_drawing_root->set_mouse_filter(Control::MOUSE_FILTER_IGNORE); - alternative_tiles_drawing_root->set_anchors_and_offsets_preset(Control::PRESET_FULL_RECT); alternative_tiles_drawing_root->set_texture_filter(TEXTURE_FILTER_NEAREST); alternative_tiles_root_control->add_child(alternative_tiles_drawing_root); diff --git a/editor/plugins/tiles/tile_data_editors.cpp b/editor/plugins/tiles/tile_data_editors.cpp index 4d54001b94..d0f8e1f32d 100644 --- a/editor/plugins/tiles/tile_data_editors.cpp +++ b/editor/plugins/tiles/tile_data_editors.cpp @@ -1977,6 +1977,7 @@ void TileDataTerrainsEditor::forward_painting_atlas_gui_input(TileAtlasView *p_t } } drag_last_pos = mm->get_position(); + accept_event(); } else if (drag_type == DRAG_TYPE_PAINT_TERRAIN_BITS) { int terrain_set = Dictionary(drag_painted_value)["terrain_set"]; int terrain = Dictionary(drag_painted_value)["terrain"]; @@ -2026,14 +2027,15 @@ void TileDataTerrainsEditor::forward_painting_atlas_gui_input(TileAtlasView *p_t } } drag_last_pos = mm->get_position(); + accept_event(); } } Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid()) { - if (mb->get_button_index() == MouseButton::LEFT) { + if (mb->get_button_index() == MouseButton::LEFT || mb->get_button_index() == MouseButton::RIGHT) { if (mb->is_pressed()) { - if (picker_button->is_pressed()) { + if (mb->get_button_index() == MouseButton::LEFT && picker_button->is_pressed()) { Vector2i coords = p_tile_atlas_view->get_atlas_tile_coords_at_pos(mb->get_position()); coords = p_tile_set_atlas_source->get_tile_at_coords(coords); if (coords != TileSetSource::INVALID_ATLAS_COORDS) { @@ -2060,6 +2062,7 @@ void TileDataTerrainsEditor::forward_painting_atlas_gui_input(TileAtlasView *p_t terrain_set_property_editor->update_property(); _update_terrain_selector(); picker_button->set_pressed(false); + accept_event(); } } else { Vector2i coords = p_tile_atlas_view->get_atlas_tile_coords_at_pos(mb->get_position()); @@ -2071,6 +2074,10 @@ void TileDataTerrainsEditor::forward_painting_atlas_gui_input(TileAtlasView *p_t int terrain_set = int(dummy_object->get("terrain_set")); int terrain = int(dummy_object->get("terrain")); if (terrain_set == -1 || !tile_data || tile_data->get_terrain_set() != terrain_set) { + // Paint terrain sets. + if (mb->get_button_index() == MouseButton::RIGHT) { + terrain_set = -1; + } if (mb->is_ctrl_pressed()) { // Paint terrain set with rect. drag_type = DRAG_TYPE_PAINT_TERRAIN_SET_RECT; @@ -2106,9 +2113,14 @@ void TileDataTerrainsEditor::forward_painting_atlas_gui_input(TileAtlasView *p_t } drag_last_pos = mb->get_position(); } + accept_event(); } else if (tile_data->get_terrain_set() == terrain_set) { + // Paint terrain bits. + if (mb->get_button_index() == MouseButton::RIGHT) { + terrain = -1; + } if (mb->is_ctrl_pressed()) { - // Paint terrain set with rect. + // Paint terrain bits with rect. drag_type = DRAG_TYPE_PAINT_TERRAIN_BITS_RECT; drag_modified.clear(); Dictionary painted_dict; @@ -2163,6 +2175,7 @@ void TileDataTerrainsEditor::forward_painting_atlas_gui_input(TileAtlasView *p_t } drag_last_pos = mb->get_position(); } + accept_event(); } } } else { @@ -2190,18 +2203,21 @@ void TileDataTerrainsEditor::forward_painting_atlas_gui_input(TileAtlasView *p_t for (const TileMapCell &E : edited) { Vector2i coords = E.get_atlas_coords(); TileData *tile_data = p_tile_set_atlas_source->get_tile_data(coords, 0); - undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrain_set", coords.x, coords.y, E.alternative_tile), tile_data->get_terrain_set()); undo_redo->add_do_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrain_set", coords.x, coords.y, E.alternative_tile), drag_painted_value); - undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrain", coords.x, coords.y, E.alternative_tile), tile_data->get_terrain()); - for (int i = 0; i < TileSet::CELL_NEIGHBOR_MAX; i++) { - TileSet::CellNeighbor bit = TileSet::CellNeighbor(i); - if (tile_data->is_valid_terrain_peering_bit(bit)) { - undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrains_peering_bit/" + String(TileSet::CELL_NEIGHBOR_ENUM_TO_TEXT[i]), coords.x, coords.y, E.alternative_tile), tile_data->get_terrain_peering_bit(bit)); + undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrain_set", coords.x, coords.y, E.alternative_tile), tile_data->get_terrain_set()); + if (tile_data->get_terrain_set() >= 0) { + undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrain", coords.x, coords.y, E.alternative_tile), tile_data->get_terrain()); + for (int i = 0; i < TileSet::CELL_NEIGHBOR_MAX; i++) { + TileSet::CellNeighbor bit = TileSet::CellNeighbor(i); + if (tile_data->is_valid_terrain_peering_bit(bit)) { + undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrains_peering_bit/" + String(TileSet::CELL_NEIGHBOR_ENUM_TO_TEXT[i]), coords.x, coords.y, E.alternative_tile), tile_data->get_terrain_peering_bit(bit)); + } } } } undo_redo->commit_action(true); drag_type = DRAG_TYPE_NONE; + accept_event(); } else if (drag_type == DRAG_TYPE_PAINT_TERRAIN_SET) { undo_redo->create_action(TTR("Painting Terrain Set")); for (KeyValue<TileMapCell, Variant> &E : drag_modified) { @@ -2209,17 +2225,20 @@ void TileDataTerrainsEditor::forward_painting_atlas_gui_input(TileAtlasView *p_t Vector2i coords = E.key.get_atlas_coords(); undo_redo->add_do_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrain_set", coords.x, coords.y, E.key.alternative_tile), drag_painted_value); undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrain_set", coords.x, coords.y, E.key.alternative_tile), dict["terrain_set"]); - undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrain", coords.x, coords.y, E.key.alternative_tile), dict["terrain"]); - Array array = dict["terrain_peering_bits"]; - for (int i = 0; i < array.size(); i++) { - TileSet::CellNeighbor bit = TileSet::CellNeighbor(i); - if (tile_set->is_valid_terrain_peering_bit(dict["terrain_set"], bit)) { - undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrains_peering_bit/" + String(TileSet::CELL_NEIGHBOR_ENUM_TO_TEXT[i]), coords.x, coords.y, E.key.alternative_tile), array[i]); + if (int(dict["terrain_set"]) >= 0) { + undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrain", coords.x, coords.y, E.key.alternative_tile), dict["terrain"]); + Array array = dict["terrain_peering_bits"]; + for (int i = 0; i < array.size(); i++) { + TileSet::CellNeighbor bit = TileSet::CellNeighbor(i); + if (tile_set->is_valid_terrain_peering_bit(dict["terrain_set"], bit)) { + undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrains_peering_bit/" + String(TileSet::CELL_NEIGHBOR_ENUM_TO_TEXT[i]), coords.x, coords.y, E.key.alternative_tile), array[i]); + } } } } undo_redo->commit_action(false); drag_type = DRAG_TYPE_NONE; + accept_event(); } else if (drag_type == DRAG_TYPE_PAINT_TERRAIN_BITS) { Dictionary painted = Dictionary(drag_painted_value); int terrain_set = int(painted["terrain_set"]); @@ -2243,6 +2262,7 @@ void TileDataTerrainsEditor::forward_painting_atlas_gui_input(TileAtlasView *p_t } undo_redo->commit_action(false); drag_type = DRAG_TYPE_NONE; + accept_event(); } else if (drag_type == DRAG_TYPE_PAINT_TERRAIN_BITS_RECT) { Dictionary painted = Dictionary(drag_painted_value); int terrain_set = int(painted["terrain_set"]); @@ -2312,6 +2332,7 @@ void TileDataTerrainsEditor::forward_painting_atlas_gui_input(TileAtlasView *p_t } undo_redo->commit_action(true); drag_type = DRAG_TYPE_NONE; + accept_event(); } } } @@ -2348,6 +2369,7 @@ void TileDataTerrainsEditor::forward_painting_alternatives_gui_input(TileAtlasVi } drag_last_pos = mm->get_position(); + accept_event(); } else if (drag_type == DRAG_TYPE_PAINT_TERRAIN_BITS) { Dictionary painted = Dictionary(drag_painted_value); int terrain_set = int(painted["terrain_set"]); @@ -2400,14 +2422,15 @@ void TileDataTerrainsEditor::forward_painting_alternatives_gui_input(TileAtlasVi } } drag_last_pos = mm->get_position(); + accept_event(); } } Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid()) { - if (mb->get_button_index() == MouseButton::LEFT) { + if (mb->get_button_index() == MouseButton::LEFT || mb->get_button_index() == MouseButton::RIGHT) { if (mb->is_pressed()) { - if (picker_button->is_pressed()) { + if (mb->get_button_index() == MouseButton::LEFT && picker_button->is_pressed()) { Vector3i tile = p_tile_atlas_view->get_alternative_tile_at_pos(mb->get_position()); Vector2i coords = Vector2i(tile.x, tile.y); int alternative_tile = tile.z; @@ -2437,6 +2460,7 @@ void TileDataTerrainsEditor::forward_painting_alternatives_gui_input(TileAtlasVi terrain_set_property_editor->update_property(); _update_terrain_selector(); picker_button->set_pressed(false); + accept_event(); } } else { int terrain_set = int(dummy_object->get("terrain_set")); @@ -2446,75 +2470,87 @@ void TileDataTerrainsEditor::forward_painting_alternatives_gui_input(TileAtlasVi Vector2i coords = Vector2i(tile.x, tile.y); int alternative_tile = tile.z; - TileData *tile_data = p_tile_set_atlas_source->get_tile_data(coords, alternative_tile); + if (coords != TileSetSource::INVALID_ATLAS_COORDS) { + TileData *tile_data = p_tile_set_atlas_source->get_tile_data(coords, alternative_tile); - if (terrain_set == -1 || !tile_data || tile_data->get_terrain_set() != terrain_set) { - drag_type = DRAG_TYPE_PAINT_TERRAIN_SET; - drag_modified.clear(); - drag_painted_value = int(dummy_object->get("terrain_set")); - if (coords != TileSetSource::INVALID_ATLAS_COORDS) { - TileMapCell cell; - cell.source_id = 0; - cell.set_atlas_coords(coords); - cell.alternative_tile = alternative_tile; - Dictionary dict; - dict["terrain_set"] = tile_data->get_terrain_set(); - Array array; - for (int i = 0; i < TileSet::CELL_NEIGHBOR_MAX; i++) { - TileSet::CellNeighbor bit = TileSet::CellNeighbor(i); - array.push_back(tile_data->is_valid_terrain_peering_bit(bit) ? tile_data->get_terrain_peering_bit(bit) : -1); + if (terrain_set == -1 || !tile_data || tile_data->get_terrain_set() != terrain_set) { + // Paint terrain sets. + if (mb->get_button_index() == MouseButton::RIGHT) { + terrain_set = -1; } - dict["terrain_peering_bits"] = array; - drag_modified[cell] = dict; - tile_data->set_terrain_set(drag_painted_value); - } - drag_last_pos = mb->get_position(); - } else if (tile_data->get_terrain_set() == terrain_set) { - // Paint terrain bits. - drag_type = DRAG_TYPE_PAINT_TERRAIN_BITS; - drag_modified.clear(); - Dictionary painted_dict; - painted_dict["terrain_set"] = terrain_set; - painted_dict["terrain"] = terrain; - drag_painted_value = painted_dict; - - if (coords != TileSetSource::INVALID_ATLAS_COORDS) { - TileMapCell cell; - cell.source_id = 0; - cell.set_atlas_coords(coords); - cell.alternative_tile = alternative_tile; - - // Save the old terrain_set and terrains bits. - Dictionary dict; - dict["terrain_set"] = tile_data->get_terrain_set(); - dict["terrain"] = tile_data->get_terrain(); - Array array; - for (int i = 0; i < TileSet::CELL_NEIGHBOR_MAX; i++) { - TileSet::CellNeighbor bit = TileSet::CellNeighbor(i); - array.push_back(tile_data->is_valid_terrain_peering_bit(bit) ? tile_data->get_terrain_peering_bit(bit) : -1); + drag_type = DRAG_TYPE_PAINT_TERRAIN_SET; + drag_modified.clear(); + drag_painted_value = int(dummy_object->get("terrain_set")); + if (coords != TileSetSource::INVALID_ATLAS_COORDS) { + TileMapCell cell; + cell.source_id = 0; + cell.set_atlas_coords(coords); + cell.alternative_tile = alternative_tile; + Dictionary dict; + dict["terrain_set"] = tile_data->get_terrain_set(); + Array array; + for (int i = 0; i < TileSet::CELL_NEIGHBOR_MAX; i++) { + TileSet::CellNeighbor bit = TileSet::CellNeighbor(i); + array.push_back(tile_data->is_valid_terrain_peering_bit(bit) ? tile_data->get_terrain_peering_bit(bit) : -1); + } + dict["terrain_peering_bits"] = array; + drag_modified[cell] = dict; + tile_data->set_terrain_set(drag_painted_value); } - dict["terrain_peering_bits"] = array; - drag_modified[cell] = dict; + drag_last_pos = mb->get_position(); + accept_event(); + } else if (tile_data->get_terrain_set() == terrain_set) { + // Paint terrain bits. + if (mb->get_button_index() == MouseButton::RIGHT) { + terrain = -1; + } + // Paint terrain bits. + drag_type = DRAG_TYPE_PAINT_TERRAIN_BITS; + drag_modified.clear(); + Dictionary painted_dict; + painted_dict["terrain_set"] = terrain_set; + painted_dict["terrain"] = terrain; + drag_painted_value = painted_dict; - // Set the terrain bit. - Rect2i texture_region = p_tile_atlas_view->get_alternative_tile_rect(coords, alternative_tile); - Vector2i position = texture_region.get_center() + p_tile_set_atlas_source->get_tile_effective_texture_offset(coords, alternative_tile); + if (coords != TileSetSource::INVALID_ATLAS_COORDS) { + TileMapCell cell; + cell.source_id = 0; + cell.set_atlas_coords(coords); + cell.alternative_tile = alternative_tile; - Vector<Vector2> polygon = tile_set->get_terrain_polygon(terrain_set); - if (Geometry2D::is_point_in_polygon(mb->get_position() - position, polygon)) { - tile_data->set_terrain(terrain); - } - for (int i = 0; i < TileSet::CELL_NEIGHBOR_MAX; i++) { - TileSet::CellNeighbor bit = TileSet::CellNeighbor(i); - if (tile_set->is_valid_terrain_peering_bit(terrain_set, bit)) { - polygon = tile_set->get_terrain_peering_bit_polygon(terrain_set, bit); - if (Geometry2D::is_point_in_polygon(mb->get_position() - position, polygon)) { - tile_data->set_terrain_peering_bit(bit, terrain); + // Save the old terrain_set and terrains bits. + Dictionary dict; + dict["terrain_set"] = tile_data->get_terrain_set(); + dict["terrain"] = tile_data->get_terrain(); + Array array; + for (int i = 0; i < TileSet::CELL_NEIGHBOR_MAX; i++) { + TileSet::CellNeighbor bit = TileSet::CellNeighbor(i); + array.push_back(tile_data->is_valid_terrain_peering_bit(bit) ? tile_data->get_terrain_peering_bit(bit) : -1); + } + dict["terrain_peering_bits"] = array; + drag_modified[cell] = dict; + + // Set the terrain bit. + Rect2i texture_region = p_tile_atlas_view->get_alternative_tile_rect(coords, alternative_tile); + Vector2i position = texture_region.get_center() + p_tile_set_atlas_source->get_tile_effective_texture_offset(coords, alternative_tile); + + Vector<Vector2> polygon = tile_set->get_terrain_polygon(terrain_set); + if (Geometry2D::is_point_in_polygon(mb->get_position() - position, polygon)) { + tile_data->set_terrain(terrain); + } + for (int i = 0; i < TileSet::CELL_NEIGHBOR_MAX; i++) { + TileSet::CellNeighbor bit = TileSet::CellNeighbor(i); + if (tile_set->is_valid_terrain_peering_bit(terrain_set, bit)) { + polygon = tile_set->get_terrain_peering_bit_polygon(terrain_set, bit); + if (Geometry2D::is_point_in_polygon(mb->get_position() - position, polygon)) { + tile_data->set_terrain_peering_bit(bit, terrain); + } } } } + drag_last_pos = mb->get_position(); + accept_event(); } - drag_last_pos = mb->get_position(); } } } else { @@ -2523,16 +2559,19 @@ void TileDataTerrainsEditor::forward_painting_alternatives_gui_input(TileAtlasVi for (KeyValue<TileMapCell, Variant> &E : drag_modified) { Dictionary dict = E.value; Vector2i coords = E.key.get_atlas_coords(); - undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrain_set", coords.x, coords.y, E.key.alternative_tile), dict["terrain_set"]); undo_redo->add_do_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrain_set", coords.x, coords.y, E.key.alternative_tile), drag_painted_value); - undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrain", coords.x, coords.y, E.key.alternative_tile), dict["terrain"]); - Array array = dict["terrain_peering_bits"]; - for (int i = 0; i < array.size(); i++) { - undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrains_peering_bit/" + String(TileSet::CELL_NEIGHBOR_ENUM_TO_TEXT[i]), coords.x, coords.y, E.key.alternative_tile), array[i]); + undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrain_set", coords.x, coords.y, E.key.alternative_tile), dict["terrain_set"]); + if (int(dict["terrain_set"]) >= 0) { + undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrain", coords.x, coords.y, E.key.alternative_tile), dict["terrain"]); + Array array = dict["terrain_peering_bits"]; + for (int i = 0; i < array.size(); i++) { + undo_redo->add_undo_property(p_tile_set_atlas_source, vformat("%d:%d/%d/terrains_peering_bit/" + String(TileSet::CELL_NEIGHBOR_ENUM_TO_TEXT[i]), coords.x, coords.y, E.key.alternative_tile), array[i]); + } } } undo_redo->commit_action(false); drag_type = DRAG_TYPE_NONE; + accept_event(); } else if (drag_type == DRAG_TYPE_PAINT_TERRAIN_BITS) { Dictionary painted = Dictionary(drag_painted_value); int terrain_set = int(painted["terrain_set"]); @@ -2556,6 +2595,7 @@ void TileDataTerrainsEditor::forward_painting_alternatives_gui_input(TileAtlasVi } undo_redo->commit_action(false); drag_type = DRAG_TYPE_NONE; + accept_event(); } } } diff --git a/editor/plugins/tiles/tile_map_editor.cpp b/editor/plugins/tiles/tile_map_editor.cpp index 01bef9b52b..acfa8b3d00 100644 --- a/editor/plugins/tiles/tile_map_editor.cpp +++ b/editor/plugins/tiles/tile_map_editor.cpp @@ -1735,7 +1735,6 @@ void TileMapEditorTilesPlugin::_tile_atlas_control_mouse_exited() { hovered_tile.source_id = TileSet::INVALID_SOURCE; hovered_tile.set_atlas_coords(TileSetSource::INVALID_ATLAS_COORDS); hovered_tile.alternative_tile = TileSetSource::INVALID_TILE_ALTERNATIVE; - tile_set_dragging_selection = false; tile_atlas_control->queue_redraw(); } @@ -1894,7 +1893,6 @@ void TileMapEditorTilesPlugin::_tile_alternatives_control_mouse_exited() { hovered_tile.source_id = TileSet::INVALID_SOURCE; hovered_tile.set_atlas_coords(TileSetSource::INVALID_ATLAS_COORDS); hovered_tile.alternative_tile = TileSetSource::INVALID_TILE_ALTERNATIVE; - tile_set_dragging_selection = false; alternative_tiles_control->queue_redraw(); } @@ -2170,7 +2168,7 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() { split_container_left_side->set_h_size_flags(Control::SIZE_EXPAND_FILL); split_container_left_side->set_v_size_flags(Control::SIZE_EXPAND_FILL); split_container_left_side->set_stretch_ratio(0.25); - split_container_left_side->set_custom_minimum_size(Size2i(70, 0) * EDSCALE); + split_container_left_side->set_custom_minimum_size(Size2(70, 0) * EDSCALE); atlas_sources_split_container->add_child(split_container_left_side); HBoxContainer *sources_bottom_actions = memnew(HBoxContainer); @@ -2190,11 +2188,11 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() { sources_bottom_actions->add_child(source_sort_button); sources_list = memnew(ItemList); - sources_list->set_fixed_icon_size(Size2i(60, 60) * EDSCALE); + sources_list->set_fixed_icon_size(Size2(60, 60) * EDSCALE); sources_list->set_h_size_flags(Control::SIZE_EXPAND_FILL); sources_list->set_v_size_flags(Control::SIZE_EXPAND_FILL); sources_list->set_stretch_ratio(0.25); - sources_list->set_custom_minimum_size(Size2i(70, 0) * EDSCALE); + sources_list->set_custom_minimum_size(Size2(70, 0) * EDSCALE); sources_list->set_texture_filter(CanvasItem::TEXTURE_FILTER_NEAREST); sources_list->connect("item_selected", callable_mp(this, &TileMapEditorTilesPlugin::_update_fix_selected_and_hovered).unbind(1)); sources_list->connect("item_selected", callable_mp(this, &TileMapEditorTilesPlugin::_update_source_display).unbind(1)); @@ -2430,20 +2428,16 @@ HashMap<Vector2i, TileMapCell> TileMapEditorTerrainsPlugin::_draw_line(Vector2i return HashMap<Vector2i, TileMapCell>(); } - if (selected_type == SELECTED_TYPE_CONNECT) { - return _draw_terrain_path_or_connect(TileMapEditor::get_line(tile_map, p_start_cell, p_end_cell), selected_terrain_set, selected_terrain, true); - } else if (selected_type == SELECTED_TYPE_PATH) { - return _draw_terrain_path_or_connect(TileMapEditor::get_line(tile_map, p_start_cell, p_end_cell), selected_terrain_set, selected_terrain, false); - } else { // SELECTED_TYPE_PATTERN - TileSet::TerrainsPattern terrains_pattern; - if (p_erase) { - terrains_pattern = TileSet::TerrainsPattern(*tile_set, selected_terrain_set); - } else { - terrains_pattern = selected_terrains_pattern; + if (p_erase) { + return _draw_terrain_pattern(TileMapEditor::get_line(tile_map, p_start_cell, p_end_cell), selected_terrain_set, TileSet::TerrainsPattern(*tile_set, selected_terrain_set)); + } else { + if (selected_type == SELECTED_TYPE_CONNECT) { + return _draw_terrain_path_or_connect(TileMapEditor::get_line(tile_map, p_start_cell, p_end_cell), selected_terrain_set, selected_terrain, true); + } else if (selected_type == SELECTED_TYPE_PATH) { + return _draw_terrain_path_or_connect(TileMapEditor::get_line(tile_map, p_start_cell, p_end_cell), selected_terrain_set, selected_terrain, false); + } else { // SELECTED_TYPE_PATTERN + return _draw_terrain_pattern(TileMapEditor::get_line(tile_map, p_start_cell, p_end_cell), selected_terrain_set, selected_terrains_pattern); } - - Vector<Vector2i> line = TileMapEditor::get_line(tile_map, p_start_cell, p_end_cell); - return _draw_terrain_pattern(line, selected_terrain_set, terrains_pattern); } } @@ -2470,16 +2464,14 @@ HashMap<Vector2i, TileMapCell> TileMapEditorTerrainsPlugin::_draw_rect(Vector2i } } - if (selected_type == SELECTED_TYPE_CONNECT || selected_type == SELECTED_TYPE_PATH) { - return _draw_terrain_path_or_connect(to_draw, selected_terrain_set, selected_terrain, true); - } else { // SELECTED_TYPE_PATTERN - TileSet::TerrainsPattern terrains_pattern; - if (p_erase) { - terrains_pattern = TileSet::TerrainsPattern(*tile_set, selected_terrain_set); - } else { - terrains_pattern = selected_terrains_pattern; + if (p_erase) { + return _draw_terrain_pattern(to_draw, selected_terrain_set, TileSet::TerrainsPattern(*tile_set, selected_terrain_set)); + } else { + if (selected_type == SELECTED_TYPE_CONNECT || selected_type == SELECTED_TYPE_PATH) { + return _draw_terrain_path_or_connect(to_draw, selected_terrain_set, selected_terrain, true); + } else { // SELECTED_TYPE_PATTERN + return _draw_terrain_pattern(to_draw, selected_terrain_set, selected_terrains_pattern); } - return _draw_terrain_pattern(to_draw, selected_terrain_set, terrains_pattern); } } @@ -2611,16 +2603,14 @@ HashMap<Vector2i, TileMapCell> TileMapEditorTerrainsPlugin::_draw_bucket_fill(Ve cells_to_draw_as_vector.append(cell); } - if (selected_type == SELECTED_TYPE_CONNECT || selected_type == SELECTED_TYPE_PATH) { - return _draw_terrain_path_or_connect(cells_to_draw_as_vector, selected_terrain_set, selected_terrain, true); - } else { // SELECTED_TYPE_PATTERN - TileSet::TerrainsPattern terrains_pattern; - if (p_erase) { - terrains_pattern = TileSet::TerrainsPattern(*tile_set, selected_terrain_set); - } else { - terrains_pattern = selected_terrains_pattern; + if (p_erase) { + return _draw_terrain_pattern(cells_to_draw_as_vector, selected_terrain_set, TileSet::TerrainsPattern(*tile_set, selected_terrain_set)); + } else { + if (selected_type == SELECTED_TYPE_CONNECT || selected_type == SELECTED_TYPE_PATH) { + return _draw_terrain_path_or_connect(cells_to_draw_as_vector, selected_terrain_set, selected_terrain, true); + } else { // SELECTED_TYPE_PATTERN + return _draw_terrain_pattern(cells_to_draw_as_vector, selected_terrain_set, selected_terrains_pattern); } - return _draw_terrain_pattern(cells_to_draw_as_vector, selected_terrain_set, terrains_pattern); } } @@ -3323,7 +3313,7 @@ TileMapEditorTerrainsPlugin::TileMapEditorTerrainsPlugin() { terrains_tree = memnew(Tree); terrains_tree->set_h_size_flags(Control::SIZE_EXPAND_FILL); terrains_tree->set_stretch_ratio(0.25); - terrains_tree->set_custom_minimum_size(Size2i(70, 0) * EDSCALE); + terrains_tree->set_custom_minimum_size(Size2(70, 0) * EDSCALE); terrains_tree->set_texture_filter(CanvasItem::TEXTURE_FILTER_NEAREST); terrains_tree->set_hide_root(true); terrains_tree->connect("item_selected", callable_mp(this, &TileMapEditorTerrainsPlugin::_update_tiles_list)); @@ -3677,6 +3667,7 @@ void TileMapEditor::_update_layers_selection() { tile_map_layer = -1; } tile_map->set_selected_layer(toggle_highlight_selected_layer_button->is_pressed() ? tile_map_layer : -1); + tileset_changed_needs_update = false; // Update is not needed here and actually causes problems. layers_selection_button->clear(); if (tile_map->get_layers_count() > 0) { diff --git a/editor/plugins/tiles/tile_set_atlas_source_editor.cpp b/editor/plugins/tiles/tile_set_atlas_source_editor.cpp index 2aea020902..45b2a5eb14 100644 --- a/editor/plugins/tiles/tile_set_atlas_source_editor.cpp +++ b/editor/plugins/tiles/tile_set_atlas_source_editor.cpp @@ -401,7 +401,7 @@ void TileSetAtlasSourceEditor::AtlasTileProxyObject::_get_property_list(List<Pro if (all_alternatve_id_zero) { p_list->push_back(PropertyInfo(Variant::NIL, "Animation", PROPERTY_HINT_NONE, "animation_", PROPERTY_USAGE_GROUP)); p_list->push_back(PropertyInfo(Variant::INT, "animation_columns", PROPERTY_HINT_NONE, "")); - p_list->push_back(PropertyInfo(Variant::VECTOR2I, "animation_separation", PROPERTY_HINT_NONE, "suffix:px")); + p_list->push_back(PropertyInfo(Variant::VECTOR2I, "animation_separation", PROPERTY_HINT_NONE, "")); p_list->push_back(PropertyInfo(Variant::FLOAT, "animation_speed", PROPERTY_HINT_NONE, "")); p_list->push_back(PropertyInfo(Variant::INT, "animation_frames_count", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_ARRAY, "Frames,animation_frame_")); // Not optimal, but returns value for the first tile. This is similar to what MultiNodeEdit does. @@ -2342,7 +2342,7 @@ TileSetAtlasSourceEditor::TileSetAtlasSourceEditor() { // Middle panel. ScrollContainer *middle_panel = memnew(ScrollContainer); middle_panel->set_horizontal_scroll_mode(ScrollContainer::SCROLL_MODE_DISABLED); - middle_panel->set_custom_minimum_size(Size2i(200, 0) * EDSCALE); + middle_panel->set_custom_minimum_size(Size2(200, 0) * EDSCALE); split_container_right_side->add_child(middle_panel); VBoxContainer *middle_vbox_container = memnew(VBoxContainer); diff --git a/editor/plugins/tiles/tile_set_editor.cpp b/editor/plugins/tiles/tile_set_editor.cpp index dca17475e0..7394288fcd 100644 --- a/editor/plugins/tiles/tile_set_editor.cpp +++ b/editor/plugins/tiles/tile_set_editor.cpp @@ -329,6 +329,7 @@ void TileSetEditor::_set_source_sort(int p_sort) { } } _update_sources_list(old_selected); + EditorSettings::get_singleton()->set_project_metadata("editor_metadata", "tile_source_sort", p_sort); } void TileSetEditor::_notification(int p_what) { @@ -648,7 +649,12 @@ void TileSetEditor::edit(Ref<TileSet> p_tile_set) { // Add the listener again. if (tile_set.is_valid()) { tile_set->connect("changed", callable_mp(this, &TileSetEditor::_tile_set_changed)); - _update_sources_list(); + if (first_edit) { + first_edit = false; + _set_source_sort(EditorSettings::get_singleton()->get_project_metadata("editor_metadata", "tile_source_sort", 0)); + } else { + _update_sources_list(); + } _update_patterns_list(); } @@ -690,7 +696,7 @@ TileSetEditor::TileSetEditor() { split_container_left_side->set_h_size_flags(SIZE_EXPAND_FILL); split_container_left_side->set_v_size_flags(SIZE_EXPAND_FILL); split_container_left_side->set_stretch_ratio(0.25); - split_container_left_side->set_custom_minimum_size(Size2i(70, 0) * EDSCALE); + split_container_left_side->set_custom_minimum_size(Size2(70, 0) * EDSCALE); split_container->add_child(split_container_left_side); source_sort_button = memnew(MenuButton); @@ -706,7 +712,7 @@ TileSetEditor::TileSetEditor() { p->set_item_checked(TilesEditorPlugin::SOURCE_SORT_ID, true); sources_list = memnew(ItemList); - sources_list->set_fixed_icon_size(Size2i(60, 60) * EDSCALE); + sources_list->set_fixed_icon_size(Size2(60, 60) * EDSCALE); sources_list->set_h_size_flags(SIZE_EXPAND_FILL); sources_list->set_v_size_flags(SIZE_EXPAND_FILL); sources_list->connect("item_selected", callable_mp(this, &TileSetEditor::_source_selected)); diff --git a/editor/plugins/tiles/tile_set_editor.h b/editor/plugins/tiles/tile_set_editor.h index 3b9b80dac4..290c53b109 100644 --- a/editor/plugins/tiles/tile_set_editor.h +++ b/editor/plugins/tiles/tile_set_editor.h @@ -83,6 +83,8 @@ private: AtlasMergingDialog *atlas_merging_dialog = nullptr; TileProxiesManagerDialog *tile_proxies_manager_dialog = nullptr; + bool first_edit = true; + // Patterns. ItemList *patterns_item_list = nullptr; Label *patterns_help_label = nullptr; diff --git a/editor/plugins/tiles/tile_set_scenes_collection_source_editor.cpp b/editor/plugins/tiles/tile_set_scenes_collection_source_editor.cpp index 9a4b14616f..f7622e68ab 100644 --- a/editor/plugins/tiles/tile_set_scenes_collection_source_editor.cpp +++ b/editor/plugins/tiles/tile_set_scenes_collection_source_editor.cpp @@ -463,7 +463,7 @@ TileSetScenesCollectionSourceEditor::TileSetScenesCollectionSourceEditor() { // Middle panel. ScrollContainer *middle_panel = memnew(ScrollContainer); middle_panel->set_horizontal_scroll_mode(ScrollContainer::SCROLL_MODE_DISABLED); - middle_panel->set_custom_minimum_size(Size2i(200, 0) * EDSCALE); + middle_panel->set_custom_minimum_size(Size2(200, 0) * EDSCALE); split_container_right_side->add_child(middle_panel); VBoxContainer *middle_vbox_container = memnew(VBoxContainer); diff --git a/editor/plugins/version_control_editor_plugin.cpp b/editor/plugins/version_control_editor_plugin.cpp index 761140b2d5..336ce9e4c8 100644 --- a/editor/plugins/version_control_editor_plugin.cpp +++ b/editor/plugins/version_control_editor_plugin.cpp @@ -1124,6 +1124,8 @@ VersionControlEditorPlugin::VersionControlEditorPlugin() { set_up_password->connect(SNAME("text_changed"), callable_mp(this, &VersionControlEditorPlugin::_update_set_up_warning)); set_up_password_input->add_child(set_up_password); + const String home_dir = OS::get_singleton()->has_environment("HOME") ? OS::get_singleton()->get_environment("HOME") : OS::get_singleton()->get_system_dir(OS::SYSTEM_DIR_DOCUMENTS); + HBoxContainer *set_up_ssh_public_key_input = memnew(HBoxContainer); set_up_ssh_public_key_input->set_h_size_flags(Control::SIZE_EXPAND_FILL); set_up_settings_vbc->add_child(set_up_ssh_public_key_input); @@ -1147,10 +1149,7 @@ VersionControlEditorPlugin::VersionControlEditorPlugin() { set_up_ssh_public_key_file_dialog->set_access(FileDialog::ACCESS_FILESYSTEM); set_up_ssh_public_key_file_dialog->set_file_mode(FileDialog::FILE_MODE_OPEN_FILE); set_up_ssh_public_key_file_dialog->set_show_hidden_files(true); - // TODO: Make this start at the user's home folder - Ref<DirAccess> d = DirAccess::open(OS::get_singleton()->get_system_dir(OS::SYSTEM_DIR_DOCUMENTS)); - d->change_dir("../"); - set_up_ssh_public_key_file_dialog->set_current_dir(d->get_current_dir()); + set_up_ssh_public_key_file_dialog->set_current_dir(home_dir); set_up_ssh_public_key_file_dialog->connect(SNAME("file_selected"), callable_mp(this, &VersionControlEditorPlugin::_ssh_public_key_selected)); set_up_ssh_public_key_input_hbc->add_child(set_up_ssh_public_key_file_dialog); @@ -1183,8 +1182,7 @@ VersionControlEditorPlugin::VersionControlEditorPlugin() { set_up_ssh_private_key_file_dialog->set_access(FileDialog::ACCESS_FILESYSTEM); set_up_ssh_private_key_file_dialog->set_file_mode(FileDialog::FILE_MODE_OPEN_FILE); set_up_ssh_private_key_file_dialog->set_show_hidden_files(true); - // TODO: Make this start at the user's home folder - set_up_ssh_private_key_file_dialog->set_current_dir(d->get_current_dir()); + set_up_ssh_private_key_file_dialog->set_current_dir(home_dir); set_up_ssh_private_key_file_dialog->connect("file_selected", callable_mp(this, &VersionControlEditorPlugin::_ssh_private_key_selected)); set_up_ssh_private_key_input_hbc->add_child(set_up_ssh_private_key_file_dialog); diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp index 27c34ab72e..40993ea168 100644 --- a/editor/plugins/visual_shader_editor_plugin.cpp +++ b/editor/plugins/visual_shader_editor_plugin.cpp @@ -1358,7 +1358,7 @@ void VisualShaderEditor::_update_options_menu() { Color unsupported_color = get_theme_color(SNAME("error_color"), SNAME("Editor")); Color supported_color = get_theme_color(SNAME("warning_color"), SNAME("Editor")); - static bool low_driver = ProjectSettings::get_singleton()->get("rendering/driver/driver_name") == "opengl3"; + static bool low_driver = ProjectSettings::get_singleton()->get("rendering/renderer/rendering_method") == "gl_compatibility"; HashMap<String, TreeItem *> folders; @@ -5198,9 +5198,9 @@ VisualShaderEditor::VisualShaderEditor() { add_options.push_back(AddOption("Tangent", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "tangent", "TANGENT"), { "tangent" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); add_options.push_back(AddOption("Vertex", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "vertex", "VERTEX"), { "vertex" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); add_options.push_back(AddOption("View", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "view", "VIEW"), { "view" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("ViewIndex", "Input/Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "view_index", "VIEW_INDEX"), { "view_index" }, VisualShaderNode::PORT_TYPE_SCALAR_INT, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("ViewMonoLeft", "Input/Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "view_mono_left", "VIEW_MONO_LEFT"), { "view_mono_left" }, VisualShaderNode::PORT_TYPE_SCALAR_INT, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("ViewRight", "Input/Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "view_right", "VIEW_RIGHT"), { "view_right" }, VisualShaderNode::PORT_TYPE_SCALAR_INT, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("ViewIndex", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "view_index", "VIEW_INDEX"), { "view_index" }, VisualShaderNode::PORT_TYPE_SCALAR_INT, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("ViewMonoLeft", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "view_mono_left", "VIEW_MONO_LEFT"), { "view_mono_left" }, VisualShaderNode::PORT_TYPE_SCALAR_INT, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("ViewRight", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "view_right", "VIEW_RIGHT"), { "view_right" }, VisualShaderNode::PORT_TYPE_SCALAR_INT, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); add_options.push_back(AddOption("NodePositionWorld", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "node_position_world", "NODE_POSITION_WORLD"), { "node_position_world" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); add_options.push_back(AddOption("CameraPositionWorld", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "camera_position_world", "CAMERA_POSITION_WORLD"), { "camera_position_world" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); add_options.push_back(AddOption("CameraDirectionWorld", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "camera_direction_world", "CAMERA_DIRECTION_WORLD"), { "camera_direction_world" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); @@ -5246,6 +5246,9 @@ VisualShaderEditor::VisualShaderEditor() { add_options.push_back(AddOption("Light", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light", "LIGHT"), { "light" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("LightColor", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_color", "LIGHT_COLOR"), { "light_color" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("LightPosition", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_position", "LIGHT_POSITION"), { "light_position" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("LightDirection", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_direction", "LIGHT_DIRECTION"), { "light_direction" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("LightIsDirectional", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_is_directional", "LIGHT_IS_DIRECTIONAL"), { "light_is_directional" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("LightEnergy", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_energy", "LIGHT_ENERGY"), { "light_energy" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("LightVertex", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "light_vertex", "LIGHT_VERTEX"), { "light_vertex" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("Normal", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "normal", "NORMAL"), { "normal" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("PointCoord", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "point_coord", "POINT_COORD"), { "point_coord" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); @@ -5693,7 +5696,7 @@ VisualShaderEditor::VisualShaderEditor() { graph_plugin->set_editor(this); property_editor_popup = memnew(PopupPanel); - property_editor_popup->set_min_size(Size2i(180, 0) * EDSCALE); + property_editor_popup->set_min_size(Size2(180, 0) * EDSCALE); add_child(property_editor_popup); edited_property_holder.instantiate(); diff --git a/editor/project_converter_3_to_4.cpp b/editor/project_converter_3_to_4.cpp index 39b30b31fb..0c0151d1a5 100644 --- a/editor/project_converter_3_to_4.cpp +++ b/editor/project_converter_3_to_4.cpp @@ -38,6 +38,7 @@ const int ERROR_CODE = 77; #include "modules/regex/regex.h" +#include "core/io/dir_access.h" #include "core/os/time.h" #include "core/templates/hash_map.h" #include "core/templates/list.h" @@ -216,6 +217,7 @@ static const char *gdscript_function_renames[][2] = { { "_get_configuration_warning", "_get_configuration_warnings" }, // Node { "_set_current", "set_current" }, // Camera2D { "_set_editor_description", "set_editor_description" }, // Node + { "_set_playing", "set_playing" }, // AnimatedSprite3D { "_toplevel_raise_self", "_top_level_raise_self" }, // CanvasItem { "_update_wrap_at", "_update_wrap_at_column" }, // TextEdit { "add_animation", "add_animation_library" }, // AnimationPlayer @@ -230,6 +232,7 @@ static const char *gdscript_function_renames[][2] = { { "add_scene_import_plugin", "add_scene_format_importer_plugin" }, //EditorPlugin { "add_stylebox_override", "add_theme_stylebox_override" }, // Control { "add_torque", "apply_torque" }, //RigidBody2D + { "agent_set_neighbor_dist", "agent_set_neighbor_distance" }, // NavigationServer2D, NavigationServer3D { "apply_changes", "_apply_changes" }, // EditorPlugin { "body_add_force", "body_apply_force" }, // PhysicsServer2D { "body_add_torque", "body_apply_torque" }, // PhysicsServer2D @@ -280,7 +283,7 @@ static const char *gdscript_function_renames[][2] = { { "get_applied_torque", "get_constant_torque" }, //RigidBody2D { "get_audio_bus", "get_audio_bus_name" }, // Area3D { "get_bound_child_nodes_to_bone", "get_bone_children" }, // Skeleton3D - { "get_camera", "get_camera_3d" }, // Viewport -> this is also convertable to get_camera_2d, broke GLTFNode + { "get_camera", "get_camera_3d" }, // Viewport -> this is also convertible to get_camera_2d, broke GLTFNode { "get_cancel", "get_cancel_button" }, // ConfirmationDialog { "get_caption", "_get_caption" }, // AnimationNode { "get_cast_to", "get_target_position" }, // RayCast2D, RayCast3D @@ -331,6 +334,7 @@ static const char *gdscript_function_renames[][2] = { { "get_metakey", "is_meta_pressed" }, // InputEventWithModifiers { "get_mid_height", "get_height" }, // CapsuleMesh { "get_motion_remainder", "get_remainder" }, // PhysicsTestMotionResult2D + { "get_neighbor_dist", "get_neighbor_distance" }, // NavigationAgent2D, NavigationAgent3D { "get_network_connected_peers", "get_peers" }, // Multiplayer API { "get_network_master", "get_multiplayer_authority" }, // Node { "get_network_peer", "get_multiplayer_peer" }, // Multiplayer API @@ -418,6 +422,7 @@ static const char *gdscript_function_renames[][2] = { { "is_normalmap", "is_normal_map" }, // NoiseTexture { "is_refusing_new_network_connections", "is_refusing_new_connections" }, // Multiplayer API { "is_region", "is_region_enabled" }, // Sprite2D + { "is_rotating", "is_ignoring_rotation" }, // Camera2D { "is_scancode_unicode", "is_keycode_unicode" }, // OS { "is_selectable_when_hidden", "_is_selectable_when_hidden" }, // EditorNode3DGizmoPlugin { "is_set_as_toplevel", "is_set_as_top_level" }, // CanvasItem @@ -510,6 +515,7 @@ static const char *gdscript_function_renames[][2] = { { "set_max_atlas_size", "set_max_texture_size" }, // LightmapGI { "set_metakey", "set_meta_pressed" }, // InputEventWithModifiers { "set_mid_height", "set_height" }, // CapsuleMesh + { "set_neighbor_dist", "set_neighbor_distance" }, // NavigationAgent2D, NavigationAgent3D { "set_network_master", "set_multiplayer_authority" }, // Node { "set_network_peer", "set_multiplayer_peer" }, // Multiplayer API { "set_oneshot", "set_one_shot" }, // AnimatedTexture @@ -650,6 +656,7 @@ static const char *csharp_function_renames[][2] = { { "_GetConfigurationWarning", "_GetConfigurationWarnings" }, // Node { "_SetCurrent", "SetCurrent" }, // Camera2D { "_SetEditorDescription", "SetEditorDescription" }, // Node + { "_SetPlaying", "SetPlaying" }, // AnimatedSprite3D { "_ToplevelRaiseSelf", "_TopLevelRaiseSelf" }, // CanvasItem { "_UpdateWrapAt", "_UpdateWrapAtColumn" }, // TextEdit { "AddAnimation", "AddAnimationLibrary" }, // AnimationPlayer @@ -664,6 +671,7 @@ static const char *csharp_function_renames[][2] = { { "AddSceneImportPlugin", "AddSceneFormatImporterPlugin" }, //EditorPlugin { "AddStyleboxOverride", "AddThemeStyleboxOverride" }, // Control { "AddTorque", "AddConstantTorque" }, //RigidBody2D + { "AgentSetNeighborDist", "AgentSetNeighborDistance" }, // NavigationServer2D, NavigationServer3D { "BindChildNodeToBone", "SetBoneChildren" }, // Skeleton3D { "BumpmapToNormalmap", "BumpMapToNormalMap" }, // Image { "CanBeHidden", "_CanBeHidden" }, // EditorNode3DGizmoPlugin @@ -708,7 +716,7 @@ static const char *csharp_function_renames[][2] = { { "GetAppliedTorque", "GetConstantTorque" }, //RigidBody2D { "GetAudioBus", "GetAudioBusName" }, // Area3D { "GetBoundChildNodesToBone", "GetBoneChildren" }, // Skeleton3D - { "GetCamera", "GetCamera3d" }, // Viewport -> this is also convertable to getCamera2d, broke GLTFNode + { "GetCamera", "GetCamera3d" }, // Viewport -> this is also convertible to getCamera2d, broke GLTFNode { "GetCancel", "GetCancelButton" }, // ConfirmationDialog { "GetCaption", "_GetCaption" }, // AnimationNode { "GetCastTo", "GetTargetPosition" }, // RayCast2D, RayCast3D @@ -757,6 +765,7 @@ static const char *csharp_function_renames[][2] = { { "GetMetakey", "IsMetaPressed" }, // InputEventWithModifiers { "GetMidHeight", "GetHeight" }, // CapsuleMesh { "GetMotionRemainder", "GetRemainder" }, // PhysicsTestMotionResult2D + { "GetNeighborDist", "GetNeighborDistance" }, // NavigationAgent2D, NavigationAgent3D { "GetNetworkConnectedPeers", "GetPeers" }, // Multiplayer API { "GetNetworkMaster", "GetMultiplayerAuthority" }, // Node { "GetNetworkPeer", "GetMultiplayerPeer" }, // Multiplayer API @@ -840,6 +849,7 @@ static const char *csharp_function_renames[][2] = { { "IsNormalmap", "IsNormalMap" }, // NoiseTexture { "IsRefusingNewNetworkConnections", "IsRefusingNewConnections" }, // Multiplayer API { "IsRegion", "IsRegionEnabled" }, // Sprite2D + { "IsRotating", "IsIgnoringRotation" }, // Camera2D { "IsScancodeUnicode", "IsKeycodeUnicode" }, // OS { "IsSelectableWhenHidden", "_IsSelectableWhenHidden" }, // EditorNode3DGizmoPlugin { "IsSetAsToplevel", "IsSetAsTopLevel" }, // CanvasItem @@ -926,6 +936,7 @@ static const char *csharp_function_renames[][2] = { { "SetMaxAtlasSize", "SetMaxTextureSize" }, // LightmapGI { "SetMetakey", "SetMetaPressed" }, // InputEventWithModifiers { "SetMidHeight", "SetHeight" }, // CapsuleMesh + { "SetNeighborDist", "SetNeighborDistance" }, // NavigationAgent2D, NavigationAgent3D { "SetNetworkMaster", "SetMultiplayerAuthority" }, // Node { "SetNetworkPeer", "SetMultiplayerPeer" }, // Multiplayer API { "SetOneshot", "SetOneShot" }, // AnimatedTexture @@ -1061,6 +1072,7 @@ static const char *gdscript_properties_renames[][2] = { { "focus_neighbour_left", "focus_neighbor_left" }, // Control { "focus_neighbour_right", "focus_neighbor_right" }, // Control { "focus_neighbour_top", "focus_neighbor_top" }, // Control + { "follow_viewport_enable", "follow_viewport_enabled" }, // CanvasItem { "file_icon_modulate", "file_icon_color" }, // Theme { "files_disabled", "file_disabled_color" }, // Theme { "folder_icon_modulate", "folder_icon_color" }, // Theme @@ -1076,6 +1088,7 @@ static const char *gdscript_properties_renames[][2] = { { "margin_right", "offset_right" }, // Control broke NinePatchRect, StyleBox { "margin_top", "offset_top" }, // Control broke NinePatchRect, StyleBox { "mid_height", "height" }, // CapsuleMesh + { "neighbor_dist", "neighbor_distance" }, // NavigationAgent2D, NavigationAgent3D { "offset_h", "drag_horizontal_offset" }, // Camera2D { "offset_v", "drag_vertical_offset" }, // Camera2D { "off", "unchecked" }, // Theme @@ -1164,6 +1177,7 @@ static const char *csharp_properties_renames[][2] = { { "FocusNeighbourLeft", "FocusNeighborLeft" }, // Control { "FocusNeighbourRight", "FocusNeighborRight" }, // Control { "FocusNeighbourTop", "FocusNeighborTop" }, // Control + { "FollowViewportEnable", "FollowViewportEnabled" }, // CanvasItem { "GlobalRateScale", "PlaybackSpeedScale" }, // AudioServer { "GravityDistanceScale", "GravityPointDistanceScale" }, // Area2D { "GravityVec", "GravityDirection" }, // Area2D @@ -1176,6 +1190,7 @@ static const char *csharp_properties_renames[][2] = { { "MarginRight", "OffsetRight" }, // Control broke NinePatchRect, StyleBox { "MarginTop", "OffsetTop" }, // Control broke NinePatchRect, StyleBox { "MidHeight", "Height" }, // CapsuleMesh + { "NeighborDist", "NeighborDistance" }, // NavigationAgent2D, NavigationAgent3D { "OffsetH", "DragHorizontalOffset" }, // Camera2D { "OffsetV", "DragVerticalOffset" }, // Camera2D { "Ofs", "Offset" }, // Theme @@ -1713,6 +1728,7 @@ public: RegEx reg_json_to = RegEx("\\bto_json\\b"); RegEx reg_json_parse = RegEx("([\t ]{0,})([^\n]+)parse_json\\(([^\n]+)"); RegEx reg_json_non_new = RegEx("([\t ]{0,})([^\n]+)JSON\\.parse\\(([^\n]+)"); + RegEx reg_json_print = RegEx("\\bJSON\\b\\.print\\("); RegEx reg_export = RegEx("export\\(([a-zA-Z0-9_]+)\\)[ ]+var[ ]+([a-zA-Z0-9_]+)"); RegEx reg_export_advanced = RegEx("export\\(([^)^\n]+)\\)[ ]+var[ ]+([a-zA-Z0-9_]+)([^\n]+)"); RegEx reg_setget_setget = RegEx("var[ ]+([a-zA-Z0-9_]+)([^\n]+)setget[ \t]+([a-zA-Z0-9_]+)[ \t]*,[ \t]*([a-zA-Z0-9_]+)"); @@ -2229,22 +2245,23 @@ Vector<String> ProjectConverter3To4::check_for_files() { Vector<String> directories_to_check = Vector<String>(); directories_to_check.push_back("res://"); - core_bind::Directory dir = core_bind::Directory(); while (!directories_to_check.is_empty()) { String path = directories_to_check.get(directories_to_check.size() - 1); // Is there any pop_back function? - directories_to_check.resize(directories_to_check.size() - 1); // Remove last element. - if (dir.open(path) == OK) { - dir.set_include_hidden(true); - dir.list_dir_begin(); - String current_dir = dir.get_current_dir(); - String file_name = dir.get_next(); + directories_to_check.resize(directories_to_check.size() - 1); // Remove last element + + Ref<DirAccess> dir = DirAccess::open(path); + if (dir.is_valid()) { + dir->set_include_hidden(true); + dir->list_dir_begin(); + String current_dir = dir->get_current_dir(); + String file_name = dir->_get_next(); while (file_name != "") { if (file_name == ".git" || file_name == ".import" || file_name == ".godot") { - file_name = dir.get_next(); + file_name = dir->_get_next(); continue; } - if (dir.current_is_dir()) { + if (dir->current_is_dir()) { directories_to_check.append(current_dir.path_join(file_name) + "/"); } else { bool proper_extension = false; @@ -2255,7 +2272,7 @@ Vector<String> ProjectConverter3To4::check_for_files() { collected_files.append(current_dir.path_join(file_name)); } } - file_name = dir.get_next(); + file_name = dir->_get_next(); } } else { print_verbose("Failed to open " + path); @@ -2331,12 +2348,13 @@ bool ProjectConverter3To4::test_conversion(RegExContainer ®_container) { valid = valid && test_conversion_with_regex("[Master]", "The master and mastersync rpc behavior is not officially supported anymore. Try using another keyword or making custom logic using Multiplayer.GetRemoteSenderId()\n[RPC]", &ProjectConverter3To4::rename_csharp_attributes, "custom rename csharp", reg_container); valid = valid && test_conversion_with_regex("[MasterSync]", "The master and mastersync rpc behavior is not officially supported anymore. Try using another keyword or making custom logic using Multiplayer.GetRemoteSenderId()\n[RPC(CallLocal = true)]", &ProjectConverter3To4::rename_csharp_attributes, "custom rename csharp", reg_container); - valid = valid && test_conversion_gdscript_builtin("OS.window_fullscreen = Settings.fullscreen", "ProjectSettings.set(\"display/window/size/fullscreen\", Settings.fullscreen)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid && test_conversion_gdscript_builtin("OS.window_fullscreen = Settings.fullscreen", "ProjectSettings.set(\\\"display/window/size/fullscreen\\\", Settings.fullscreen)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, true); + valid = valid && test_conversion_gdscript_builtin("OS.window_fullscreen = Settings.fullscreen", "if Settings.fullscreen:\n\tDisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN)\nelse:\n\tDisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); valid = valid && test_conversion_gdscript_builtin("OS.get_window_safe_area()", "DisplayServer.get_display_safe_area()", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); valid = valid && test_conversion_gdscript_builtin("\tvar aa = roman(r.move_and_slide( a, b, c, d, e, f )) # Roman", "\tr.set_velocity(a)\n\tr.set_up_direction(b)\n\tr.set_floor_stop_on_slope_enabled(c)\n\tr.set_max_slides(d)\n\tr.set_floor_max_angle(e)\n\t# TODOConverter40 infinite_inertia were removed in Godot 4.0 - previous value `f`\n\tr.move_and_slide()\n\tvar aa = roman(r.velocity) # Roman", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("\tmove_and_slide( a, b, c, d, e, f ) # Roman", "\tset_velocity(a)\n\tset_up_direction(b)\n\tset_floor_stop_on_slope_enabled(c)\n\tset_max_slides(d)\n\tset_floor_max_angle(e)\n\t# TODOConverter40 infinite_inertia were removed in Godot 4.0 - previous value `f`\n\tmove_and_slide() # Roman", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); valid = valid && test_conversion_gdscript_builtin("\tvar aa = roman(r.move_and_slide_with_snap( a, g, b, c, d, e, f )) # Roman", "\tr.set_velocity(a)\n\t# TODOConverter40 looks that snap in Godot 4.0 is float, not vector like in Godot 3 - previous value `g`\n\tr.set_up_direction(b)\n\tr.set_floor_stop_on_slope_enabled(c)\n\tr.set_max_slides(d)\n\tr.set_floor_max_angle(e)\n\t# TODOConverter40 infinite_inertia were removed in Godot 4.0 - previous value `f`\n\tr.move_and_slide()\n\tvar aa = roman(r.velocity) # Roman", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("\tmove_and_slide_with_snap( a, g, b, c, d, e, f ) # Roman", "\tset_velocity(a)\n\t# TODOConverter40 looks that snap in Godot 4.0 is float, not vector like in Godot 3 - previous value `g`\n\tset_up_direction(b)\n\tset_floor_stop_on_slope_enabled(c)\n\tset_max_slides(d)\n\tset_floor_max_angle(e)\n\t# TODOConverter40 infinite_inertia were removed in Godot 4.0 - previous value `f`\n\tmove_and_slide() # Roman", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); valid = valid && test_conversion_gdscript_builtin("list_dir_begin( a , b )", "list_dir_begin() # TODOGODOT4 fill missing arguments https://github.com/godotengine/godot/pull/40547", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); valid = valid && test_conversion_gdscript_builtin("list_dir_begin( a )", "list_dir_begin() # TODOGODOT4 fill missing arguments https://github.com/godotengine/godot/pull/40547", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); @@ -3043,7 +3061,7 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai // -- \t.func() -> \tsuper.func() Object if (line.contains("(") && line.contains(".")) { - line = reg_container.reg_super.sub(line, "$1super.$2", true); // TODO, not sure if possible, but for now this broke String text e.g. "Choosen .gitignore" -> "Choosen super.gitignore" + line = reg_container.reg_super.sub(line, "$1super.$2", true); // TODO, not sure if possible, but for now this broke String text e.g. "Chosen .gitignore" -> "Chosen super.gitignore" } // -- JSON.parse(a) -> JSON.new().parse(a) etc. JSON @@ -3059,6 +3077,10 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai if (line.contains("parse_json")) { line = reg_container.reg_json_parse.sub(line, "$1var test_json_conv = JSON.new()\n$1test_json_conv.parse($3\n$1$2test_json_conv.get_data()", true); } + // -- JSON.print( -> JSON.stringify( + if (line.contains("JSON.print(")) { + line = reg_container.reg_json_print.sub(line, "JSON.stringify(", true); + } // -- get_node(@ -> get_node( Node if (line.contains("get_node")) { @@ -3090,13 +3112,9 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai line = reg_container.reg_setget_get.sub(line, "var $1$2:\n\tget:\n\t\treturn $1 # TODOConverter40 Copy here content of $3 \n\tset(mod_value):\n\t\tmod_value # TODOConverter40 Non existent set function", true); } - // OS.window_fullscreen = true -> ProjectSettings.set("display/window/size/fullscreen",true) + // OS.window_fullscreen = a -> if a: DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN) else: DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED) if (line.contains("window_fullscreen")) { - if (builtin) { - line = reg_container.reg_os_fullscreen.sub(line, "ProjectSettings.set(\\\"display/window/size/fullscreen\\\", $1)", true); - } else { - line = reg_container.reg_os_fullscreen.sub(line, "ProjectSettings.set(\"display/window/size/fullscreen\", $1)", true); - } + line = reg_container.reg_os_fullscreen.sub(line, "if $1:\n\tDisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN)\nelse:\n\tDisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED)", true); } // Instantiate @@ -3144,8 +3162,13 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai line_new += starting_space + "# TODOConverter40 infinite_inertia were removed in Godot 4.0 - previous value `" + parts[5] + "`\n"; } - line_new += starting_space + base_obj + "move_and_slide()\n"; - line = line_new + line.substr(0, start) + "velocity" + line.substr(end + start); + line_new += starting_space + base_obj + "move_and_slide()"; + + if (!line.begins_with(starting_space + "move_and_slide")) { + line = line_new + "\n" + line.substr(0, start) + "velocity" + line.substr(end + start); + } else { + line = line_new + line.substr(end + start); + } } } } @@ -3195,8 +3218,13 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai line_new += starting_space + "# TODOConverter40 infinite_inertia were removed in Godot 4.0 - previous value `" + parts[6] + "`\n"; } - line_new += starting_space + base_obj + "move_and_slide()\n"; - line = line_new + line.substr(0, start) + "velocity" + line.substr(end + start); // move_and_slide used to return velocity + line_new += starting_space + base_obj + "move_and_slide()"; + + if (!line.begins_with(starting_space + "move_and_slide_with_snap")) { + line = line_new + "\n" + line.substr(0, start) + "velocity" + line.substr(end + start); + } else { + line = line_new + line.substr(end + start); + } } } } @@ -3490,6 +3518,20 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai } } } + + // set_rotating(true) -> set_ignore_rotation(false) + if (line.contains("set_rotating(")) { + int start = line.find("set_rotating("); + int end = get_end_parenthesis(line.substr(start)) + 1; + if (end > -1) { + Vector<String> parts = parse_arguments(line.substr(start, end)); + if (parts.size() == 1) { + String opposite = parts[0] == "true" ? "false" : "true"; + line = line.substr(0, start) + "set_ignore_rotation(" + opposite + ")"; + } + } + } + // OS.get_window_safe_area() -> DisplayServer.get_display_safe_area() if (line.contains("OS.get_window_safe_area(")) { int start = line.find("OS.get_window_safe_area("); @@ -3537,6 +3579,29 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai } } + // rotating = true -> ignore_rotation = false # reversed "rotating" for Camera2D + if (line.contains("rotating")) { + int start = line.find("rotating"); + bool foundNextEqual = false; + String line_to_check = line.substr(start + String("rotating").length()); + String assigned_value; + for (int current_index = 0; line_to_check.length() > current_index; current_index++) { + char32_t chr = line_to_check.get(current_index); + if (chr == '\t' || chr == ' ') { + continue; + } else if (chr == '=') { + foundNextEqual = true; + assigned_value = line.right(current_index).strip_edges(); + assigned_value = assigned_value == "true" ? "false" : "true"; + } else { + break; + } + } + if (foundNextEqual) { + line = line.substr(0, start) + "ignore_rotation =" + assigned_value + " # reversed \"rotating\" for Camera2D"; + } + } + // OS -> Time functions if (line.contains("OS.get_ticks_msec")) { line = line.replace("OS.get_ticks_msec", "Time.get_ticks_msec"); @@ -3547,6 +3612,9 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai if (line.contains("OS.get_unix_time")) { line = line.replace("OS.get_unix_time", "Time.get_unix_time_from_system"); } + if (line.contains("OS.get_datetime")) { + line = line.replace("OS.get_datetime", "Time.get_datetime_dict_from_system"); + } } void ProjectConverter3To4::process_csharp_line(String &line, const RegExContainer ®_container) { @@ -3950,6 +4018,8 @@ String ProjectConverter3To4::collect_string_from_vector(Vector<String> &vector) #else // No RegEx. +ProjectConverter3To4::ProjectConverter3To4(int _p_maximum_file_size_kb, int _p_maximum_line_length) {} + int ProjectConverter3To4::convert() { ERR_FAIL_V_MSG(ERROR_CODE, "Can't run converter for Godot 3.x projects, because RegEx module is disabled."); } diff --git a/editor/project_converter_3_to_4.h b/editor/project_converter_3_to_4.h index 2cecb9da79..d03e645ac7 100644 --- a/editor/project_converter_3_to_4.h +++ b/editor/project_converter_3_to_4.h @@ -31,7 +31,6 @@ #ifndef PROJECT_CONVERTER_3_TO_4_H #define PROJECT_CONVERTER_3_TO_4_H -#include "core/core_bind.h" #include "core/io/file_access.h" #include "core/object/ref_counted.h" #include "core/string/ustring.h" diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp index 544e8c9323..673da8872d 100644 --- a/editor/project_manager.cpp +++ b/editor/project_manager.cpp @@ -59,6 +59,8 @@ #include "servers/navigation_server_3d.h" #include "servers/physics_server_2d.h" +constexpr int GODOT4_CONFIG_VERSION = 5; + class ProjectDialog : public ConfirmationDialog { GDCLASS(ProjectDialog, ConfirmationDialog); @@ -90,9 +92,9 @@ private: Container *name_container; Container *path_container; Container *install_path_container; - Container *rasterizer_container; + Container *renderer_container; HBoxContainer *default_files_container; - Ref<ButtonGroup> rasterizer_button_group; + Ref<ButtonGroup> renderer_button_group; Label *msg; LineEdit *project_path; LineEdit *project_name; @@ -141,7 +143,7 @@ private: install_status_rect->set_texture(new_icon); } - set_size(Size2i(500, 0) * EDSCALE); + set_size(Size2(500, 0) * EDSCALE); } String _test_path() { @@ -471,16 +473,19 @@ private: } PackedStringArray project_features = ProjectSettings::get_required_features(); ProjectSettings::CustomMap initial_settings; + // Be sure to change this code if/when renderers are changed. - int renderer_type = rasterizer_button_group->get_pressed_button()->get_meta(SNAME("driver_name")); - initial_settings["rendering/vulkan/rendering/back_end"] = renderer_type; - if (renderer_type == 0) { - project_features.push_back("Vulkan Clustered"); - } else if (renderer_type == 1) { - project_features.push_back("Vulkan Mobile"); + String renderer_type = renderer_button_group->get_pressed_button()->get_meta(SNAME("rendering_method")); + initial_settings["rendering/renderer/rendering_method"] = renderer_type; + + if (renderer_type == "forward_plus") { + project_features.push_back("Forward Plus"); + } else if (renderer_type == "mobile") { + project_features.push_back("Mobile"); } else { WARN_PRINT("Unknown renderer type. Please report this as a bug on GitHub."); } + project_features.sort(); initial_settings["application/config/features"] = project_features; initial_settings["application/config/name"] = project_name->get_text().strip_edges(); @@ -682,7 +687,7 @@ public: msg->hide(); install_path_container->hide(); install_status_rect->hide(); - rasterizer_container->hide(); + renderer_container->hide(); default_files_container->hide(); get_ok_button()->set_disabled(false); @@ -733,7 +738,7 @@ public: set_ok_button_text(TTR("Import & Edit")); name_container->hide(); install_path_container->hide(); - rasterizer_container->hide(); + renderer_container->hide(); default_files_container->hide(); project_path->grab_focus(); @@ -742,7 +747,7 @@ public: set_ok_button_text(TTR("Create & Edit")); name_container->show(); install_path_container->hide(); - rasterizer_container->show(); + renderer_container->show(); default_files_container->show(); project_name->call_deferred(SNAME("grab_focus")); project_name->call_deferred(SNAME("select_all")); @@ -753,7 +758,7 @@ public: project_name->set_text(zip_title); name_container->show(); install_path_container->hide(); - rasterizer_container->hide(); + renderer_container->hide(); default_files_container->hide(); project_path->grab_focus(); } @@ -761,7 +766,7 @@ public: _test_path(); } - popup_centered(Size2i(500, 0) * EDSCALE); + popup_centered(Size2(500, 0) * EDSCALE); } ProjectDialog() { @@ -841,23 +846,23 @@ public: msg->set_horizontal_alignment(HORIZONTAL_ALIGNMENT_CENTER); vb->add_child(msg); - // rasterizer selection - rasterizer_container = memnew(VBoxContainer); - vb->add_child(rasterizer_container); + // Renderer selection. + renderer_container = memnew(VBoxContainer); + vb->add_child(renderer_container); l = memnew(Label); l->set_text(TTR("Renderer:")); - rasterizer_container->add_child(l); - Container *rshb = memnew(HBoxContainer); - rasterizer_container->add_child(rshb); - rasterizer_button_group.instantiate(); + renderer_container->add_child(l); + HBoxContainer *rshc = memnew(HBoxContainer); + renderer_container->add_child(rshc); + renderer_button_group.instantiate(); Container *rvb = memnew(VBoxContainer); rvb->set_h_size_flags(Control::SIZE_EXPAND_FILL); - rshb->add_child(rvb); + rshc->add_child(rvb); Button *rs_button = memnew(CheckBox); - rs_button->set_button_group(rasterizer_button_group); - rs_button->set_text(TTR("Vulkan Clustered")); - rs_button->set_meta(SNAME("driver_name"), 0); // Vulkan backend "Forward Clustered" + rs_button->set_button_group(renderer_button_group); + rs_button->set_text(TTR("Forward+")); + rs_button->set_meta(SNAME("rendering_method"), "forward_plus"); rs_button->set_pressed(true); rvb->add_child(rs_button); l = memnew(Label); @@ -869,15 +874,15 @@ public: l->set_modulate(Color(1, 1, 1, 0.7)); rvb->add_child(l); - rshb->add_child(memnew(VSeparator)); + rshc->add_child(memnew(VSeparator)); rvb = memnew(VBoxContainer); rvb->set_h_size_flags(Control::SIZE_EXPAND_FILL); - rshb->add_child(rvb); + rshc->add_child(rvb); rs_button = memnew(CheckBox); - rs_button->set_button_group(rasterizer_button_group); - rs_button->set_text(TTR("Vulkan Mobile")); - rs_button->set_meta(SNAME("driver_name"), 1); // Vulkan backend "Forward Mobile" + rs_button->set_button_group(renderer_button_group); + rs_button->set_text(TTR("Mobile")); + rs_button->set_meta(SNAME("rendering_method"), "mobile"); rvb->add_child(rs_button); l = memnew(Label); l->set_text( @@ -895,7 +900,7 @@ public: l->set_horizontal_alignment(HORIZONTAL_ALIGNMENT_CENTER); l->set_vertical_alignment(VERTICAL_ALIGNMENT_CENTER); l->set_modulate(Color(1, 1, 1, 0.7)); - rasterizer_container->add_child(l); + renderer_container->add_child(l); default_files_container = memnew(HBoxContainer); vb->add_child(default_files_container); @@ -1065,6 +1070,7 @@ public: int refresh_project(const String &dir_path); void add_project(const String &dir_path, bool favorite); void save_config(); + void set_project_version(const String &p_project_path, int version); private: static void _bind_methods(); @@ -1673,6 +1679,15 @@ void ProjectList::save_config() { _config.save(_config_path); } +void ProjectList::set_project_version(const String &p_project_path, int p_version) { + for (ProjectList::Item &E : _projects) { + if (E.path == p_project_path) { + E.version = p_version; + break; + } + } +} + int ProjectList::get_project_count() const { return _projects.size(); } @@ -2152,9 +2167,11 @@ void ProjectManager::_open_selected_projects_ask() { return; } + const Size2i popup_min_width = Size2i(600.0 * EDSCALE, 0); + if (selected_list.size() > 1) { - multi_open_ask->set_text(TTR("Are you sure to open more than one project?")); - multi_open_ask->popup_centered(); + multi_open_ask->set_text(vformat(TTR("You requested to open %d projects in parallel. Do you confirm?\nNote that usual checks for engine version compatibility will be bypassed."), selected_list.size())); + multi_open_ask->popup_centered(popup_min_width); return; } @@ -2163,30 +2180,40 @@ void ProjectManager::_open_selected_projects_ask() { return; } - // Update the project settings or don't open - const String conf = project.path.path_join("project.godot"); + // Update the project settings or don't open. const int config_version = project.version; PackedStringArray unsupported_features = project.unsupported_features; Label *ask_update_label = ask_update_settings->get_label(); ask_update_label->set_horizontal_alignment(HORIZONTAL_ALIGNMENT_LEFT); // Reset in case of previous center align. + full_convert_button->hide(); - // Check if the config_version property was empty or 0 + ask_update_settings->get_ok_button()->set_text("OK"); + + // Check if the config_version property was empty or 0. if (config_version == 0) { - ask_update_settings->set_text(vformat(TTR("The following project settings file does not specify the version of Godot through which it was created.\n\n%s\n\nIf you proceed with opening it, it will be converted to Godot's current configuration file format.\nWarning: You won't be able to open the project with previous versions of the engine anymore."), conf)); - ask_update_settings->popup_centered(); + ask_update_settings->set_text(vformat(TTR("The selected project \"%s\" does not specify its supported Godot version in its configuration file (\"project.godot\").\n\nProject path: %s\n\nIf you proceed with opening it, it will be converted to Godot's current configuration file format.\n\nWarning: You won't be able to open the project with previous versions of the engine anymore."), project.project_name, project.path)); + ask_update_settings->popup_centered(popup_min_width); return; } - // Check if we need to convert project settings from an earlier engine version + // Check if we need to convert project settings from an earlier engine version. if (config_version < ProjectSettings::CONFIG_VERSION) { - ask_update_settings->set_text(vformat(TTR("The following project settings file was generated by an older engine version, and needs to be converted for this version:\n\n%s\n\nDo you want to convert it?\nWarning: You won't be able to open the project with previous versions of the engine anymore."), conf)); - ask_update_settings->popup_centered(); + if (config_version == GODOT4_CONFIG_VERSION - 1 && ProjectSettings::CONFIG_VERSION == GODOT4_CONFIG_VERSION) { // Conversion from Godot 3 to 4. + full_convert_button->show(); + ask_update_settings->set_text(vformat(TTR("The selected project \"%s\" was generated by Godot 3.x, and needs to be converted for Godot 4.x.\n\nProject path: %s\n\nYou have three options:\n- Convert only the configuration file (\"project.godot\"). Use this to open the project without attempting to convert its scenes, resources and scripts.\n- Convert the entire project including its scenes, resources and scripts (recommended if you are upgrading).\n- Do nothing and go back.\n\nWarning: If you select a conversion option, you won't be able to open the project with previous versions of the engine anymore."), project.project_name, project.path)); + ask_update_settings->get_ok_button()->set_text(TTR("Convert project.godot Only")); + } else { + ask_update_settings->set_text(vformat(TTR("The selected project \"%s\" was generated by an older engine version, and needs to be converted for this version.\n\nProject path: %s\n\nDo you want to convert it?\n\nWarning: You won't be able to open the project with previous versions of the engine anymore."), project.project_name, project.path)); + ask_update_settings->get_ok_button()->set_text(TTR("Convert project.godot")); + } + ask_update_settings->popup_centered(popup_min_width); + ask_update_settings->get_cancel_button()->grab_focus(); // To prevent accidents. return; } - // Check if the file was generated by a newer, incompatible engine version + // Check if the file was generated by a newer, incompatible engine version. if (config_version > ProjectSettings::CONFIG_VERSION) { - dialog_error->set_text(vformat(TTR("Can't open project at '%s'.") + "\n" + TTR("The project settings were created by a newer engine version, whose settings are not compatible with this version."), project.path)); - dialog_error->popup_centered(); + dialog_error->set_text(vformat(TTR("Can't open project \"%s\" at the following path:\n\n%s\n\nThe project settings were created by a newer engine version, whose settings are not compatible with this version."), project.project_name, project.path)); + dialog_error->popup_centered(popup_min_width); return; } // Check if the project is using features not supported by this build of Godot. @@ -2215,14 +2242,46 @@ void ProjectManager::_open_selected_projects_ask() { warning_message += TTR("Open anyway? Project will be modified."); ask_update_label->set_horizontal_alignment(HORIZONTAL_ALIGNMENT_CENTER); ask_update_settings->set_text(warning_message); - ask_update_settings->popup_centered(); + ask_update_settings->popup_centered(popup_min_width); return; } - // Open if the project is up-to-date + // Open if the project is up-to-date. _open_selected_projects(); } +void ProjectManager::_full_convert_button_pressed() { + ask_update_settings->hide(); + ask_full_convert_dialog->popup_centered(Size2i(600.0 * EDSCALE, 0)); + ask_full_convert_dialog->get_cancel_button()->grab_focus(); +} + +void ProjectManager::_perform_full_project_conversion() { + Vector<ProjectList::Item> selected_list = _project_list->get_selected_projects(); + if (selected_list.is_empty()) { + return; + } + + const String &path = selected_list[0].path; + + print_line("Converting project: " + path); + + Ref<ConfigFile> cf; + cf.instantiate(); + cf->load(path.path_join("project.godot")); + cf->set_value("", "config_version", GODOT4_CONFIG_VERSION); + cf->save(path.path_join("project.godot")); + _project_list->set_project_version(path, GODOT4_CONFIG_VERSION); + + List<String> args; + args.push_back("--path"); + args.push_back(path); + args.push_back("--convert-3to4"); + + Error err = OS::get_singleton()->create_instance(args); + ERR_FAIL_COND(err); +} + void ProjectManager::_run_project_confirm() { Vector<ProjectList::Item> selected_list = _project_list->get_selected_projects(); @@ -2724,9 +2783,10 @@ ProjectManager::ProjectManager() { settings_hb->add_child(h_spacer); language_btn = memnew(OptionButton); - language_btn->set_flat(true); language_btn->set_icon(get_theme_icon(SNAME("Environment"), SNAME("EditorIcons"))); language_btn->set_focus_mode(Control::FOCUS_NONE); + language_btn->set_fit_to_longest_item(false); + language_btn->set_flat(true); language_btn->connect("item_selected", callable_mp(this, &ProjectManager::_language_selected)); #ifdef ANDROID_ENABLED // The language selection dropdown doesn't work on Android (as the setting isn't saved), see GH-60353. @@ -2823,9 +2883,18 @@ ProjectManager::ProjectManager() { add_child(multi_scan_ask); ask_update_settings = memnew(ConfirmationDialog); + ask_update_settings->set_autowrap(true); ask_update_settings->get_ok_button()->connect("pressed", callable_mp(this, &ProjectManager::_confirm_update_settings)); + full_convert_button = ask_update_settings->add_button("Convert Full Project", !GLOBAL_GET("gui/common/swap_cancel_ok")); + full_convert_button->connect("pressed", callable_mp(this, &ProjectManager::_full_convert_button_pressed)); add_child(ask_update_settings); + ask_full_convert_dialog = memnew(ConfirmationDialog); + ask_full_convert_dialog->set_autowrap(true); + ask_full_convert_dialog->set_text(TTR("This option will perform full project conversion, updating scenes, resources and scripts from Godot 3.x to work in Godot 4.0.\n\nNote that this is a best-effort conversion, i.e. it makes upgrading the project easier, but it will not open out-of-the-box and will still require manual adjustments.\n\nIMPORTANT: Make sure to backup your project before converting, as this operation makes it impossible to open it in older versions of Godot.")); + ask_full_convert_dialog->connect("confirmed", callable_mp(this, &ProjectManager::_perform_full_project_conversion)); + add_child(ask_full_convert_dialog); + npdialog = memnew(ProjectDialog); npdialog->connect("projects_updated", callable_mp(this, &ProjectManager::_on_projects_updated)); npdialog->connect("project_created", callable_mp(this, &ProjectManager::_on_project_created)); diff --git a/editor/project_manager.h b/editor/project_manager.h index 10bf25c048..7c05429dde 100644 --- a/editor/project_manager.h +++ b/editor/project_manager.h @@ -87,6 +87,7 @@ class ProjectManager : public Control { ConfirmationDialog *multi_open_ask = nullptr; ConfirmationDialog *multi_run_ask = nullptr; ConfirmationDialog *multi_scan_ask = nullptr; + ConfirmationDialog *ask_full_convert_dialog = nullptr; ConfirmationDialog *ask_update_settings = nullptr; ConfirmationDialog *open_templates = nullptr; EditorAbout *about = nullptr; @@ -97,6 +98,7 @@ class ProjectManager : public Control { AcceptDialog *dialog_error = nullptr; ProjectDialog *npdialog = nullptr; + Button *full_convert_button = nullptr; OptionButton *language_btn = nullptr; LinkButton *version_btn = nullptr; @@ -106,6 +108,8 @@ class ProjectManager : public Control { void _run_project_confirm(); void _open_selected_projects(); void _open_selected_projects_ask(); + void _full_convert_button_pressed(); + void _perform_full_project_conversion(); void _import_project(); void _new_project(); void _rename_project(); diff --git a/editor/scene_create_dialog.cpp b/editor/scene_create_dialog.cpp index 573e57ca04..4563dbb0f7 100644 --- a/editor/scene_create_dialog.cpp +++ b/editor/scene_create_dialog.cpp @@ -133,7 +133,7 @@ void SceneCreateDialog::update_dialog() { root_name = scene_name.get_file().get_basename(); } - if (!root_name.is_valid_identifier()) { + if (root_name.is_empty() || root_name.validate_node_name().size() != root_name.size()) { update_error(node_error_label, MSG_ERROR, TTR("Invalid root node name.")); is_valid = false; } diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index 488a651c29..d1dc188be9 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -135,6 +135,8 @@ void SceneTreeDock::shortcut_input(const Ref<InputEvent> &p_event) { _tool_selected(TOOL_ERASE, true); } else if (ED_IS_SHORTCUT("scene_tree/copy_node_path", p_event)) { _tool_selected(TOOL_COPY_NODE_PATH); + } else if (ED_IS_SHORTCUT("scene_tree/toggle_unique_name", p_event)) { + _tool_selected(TOOL_TOGGLE_SCENE_UNIQUE_NAME); } else if (ED_IS_SHORTCUT("scene_tree/delete", p_event)) { _tool_selected(TOOL_ERASE); } else { @@ -439,8 +441,8 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { } } - bool collapsed = _is_collapsed_recursive(selected_item); - _set_collapsed_recursive(selected_item, !collapsed); + bool collapsed = selected_item->is_any_collapsed(); + selected_item->set_collapsed_recursive(!collapsed); tree->ensure_cursor_is_visible(); @@ -916,6 +918,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { String existing; if (extensions.size()) { String root_name(tocopy->get_name()); + root_name = EditorNode::adjust_scene_name_casing(root_name); existing = root_name + "." + extensions.front()->get().to_lower(); } new_scene_from_dialog->set_current_path(existing); @@ -1073,6 +1076,14 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { if (first_selected == nullptr) { return; } + if (first_selected->get() == EditorNode::get_singleton()->get_edited_scene()) { + // Exclude Root Node. It should never be unique name in its own scene! + editor_selection->remove_node(first_selected->get()); + first_selected = editor_selection->get_selected_node_list().front(); + if (first_selected == nullptr) { + return; + } + } bool enabling = !first_selected->get()->is_unique_name_in_owner(); List<Node *> full_selection = editor_selection->get_full_selected_node_list(); @@ -1212,17 +1223,6 @@ void SceneTreeDock::add_root_node(Node *p_node) { editor_data->get_undo_redo()->commit_action(); } -void SceneTreeDock::_node_collapsed(Object *p_obj) { - TreeItem *ti = Object::cast_to<TreeItem>(p_obj); - if (!ti) { - return; - } - - if (Input::get_singleton()->is_key_pressed(Key::SHIFT)) { - _set_collapsed_recursive(ti, ti->is_collapsed()); - } -} - void SceneTreeDock::_notification(int p_what) { switch (p_what) { case NOTIFICATION_READY: { @@ -1235,14 +1235,14 @@ void SceneTreeDock::_notification(int p_what) { CanvasItemEditorPlugin *canvas_item_plugin = Object::cast_to<CanvasItemEditorPlugin>(editor_data->get_editor("2D")); if (canvas_item_plugin) { - canvas_item_plugin->get_canvas_item_editor()->connect("item_lock_status_changed", Callable(scene_tree, "_update_tree")); - canvas_item_plugin->get_canvas_item_editor()->connect("item_group_status_changed", Callable(scene_tree, "_update_tree")); + canvas_item_plugin->get_canvas_item_editor()->connect("item_lock_status_changed", callable_mp(scene_tree, &SceneTreeEditor::_update_tree)); + canvas_item_plugin->get_canvas_item_editor()->connect("item_group_status_changed", callable_mp(scene_tree, &SceneTreeEditor::_update_tree)); scene_tree->connect("node_changed", callable_mp((CanvasItem *)canvas_item_plugin->get_canvas_item_editor()->get_viewport_control(), &CanvasItem::queue_redraw)); } Node3DEditorPlugin *spatial_editor_plugin = Object::cast_to<Node3DEditorPlugin>(editor_data->get_editor("3D")); - spatial_editor_plugin->get_spatial_editor()->connect("item_lock_status_changed", Callable(scene_tree, "_update_tree")); - spatial_editor_plugin->get_spatial_editor()->connect("item_group_status_changed", Callable(scene_tree, "_update_tree")); + spatial_editor_plugin->get_spatial_editor()->connect("item_lock_status_changed", callable_mp(scene_tree, &SceneTreeEditor::_update_tree)); + spatial_editor_plugin->get_spatial_editor()->connect("item_group_status_changed", callable_mp(scene_tree, &SceneTreeEditor::_update_tree)); button_add->set_icon(get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); button_instance->set_icon(get_theme_icon(SNAME("Instance"), SNAME("EditorIcons"))); @@ -1934,48 +1934,6 @@ void SceneTreeDock::_do_reparent(Node *p_new_parent, int p_position_in_parent, V editor_data->get_undo_redo()->commit_action(); } -bool SceneTreeDock::_is_collapsed_recursive(TreeItem *p_item) const { - bool is_branch_collapsed = false; - - List<TreeItem *> needs_check; - needs_check.push_back(p_item); - - while (!needs_check.is_empty()) { - TreeItem *item = needs_check.back()->get(); - needs_check.pop_back(); - - TreeItem *child = item->get_first_child(); - is_branch_collapsed = item->is_collapsed() && child; - - if (is_branch_collapsed) { - break; - } - while (child) { - needs_check.push_back(child); - child = child->get_next(); - } - } - return is_branch_collapsed; -} - -void SceneTreeDock::_set_collapsed_recursive(TreeItem *p_item, bool p_collapsed) { - List<TreeItem *> to_collapse; - to_collapse.push_back(p_item); - - while (!to_collapse.is_empty()) { - TreeItem *item = to_collapse.back()->get(); - to_collapse.pop_back(); - - item->set_collapsed(p_collapsed); - - TreeItem *child = item->get_first_child(); - while (child) { - to_collapse.push_back(child); - child = child->get_next(); - } - } -} - void SceneTreeDock::_script_created(Ref<Script> p_script) { List<Node *> selected = editor_selection->get_selected_node_list(); @@ -1987,7 +1945,7 @@ void SceneTreeDock::_script_created(Ref<Script> p_script) { Node *node = selected.front()->get(); Ref<Script> existing = node->get_script(); - editor_data->get_undo_redo()->create_action(TTR("Attach Script")); + editor_data->get_undo_redo()->create_action(TTR("Attach Script"), UndoRedo::MERGE_DISABLE, node); editor_data->get_undo_redo()->add_do_method(InspectorDock::get_singleton(), "store_script_properties", node); editor_data->get_undo_redo()->add_undo_method(InspectorDock::get_singleton(), "store_script_properties", node); editor_data->get_undo_redo()->add_do_method(node, "set_script", p_script); @@ -1998,7 +1956,7 @@ void SceneTreeDock::_script_created(Ref<Script> p_script) { editor_data->get_undo_redo()->add_undo_method(this, "_update_script_button"); editor_data->get_undo_redo()->commit_action(); } else { - editor_data->get_undo_redo()->create_action(TTR("Attach Script")); + editor_data->get_undo_redo()->create_action(TTR("Attach Script"), UndoRedo::MERGE_DISABLE, selected.front()->get()); for (Node *E : selected) { Ref<Script> existing = E->get_script(); editor_data->get_undo_redo()->add_do_method(InspectorDock::get_singleton(), "store_script_properties", E); @@ -2093,9 +2051,9 @@ void SceneTreeDock::_delete_confirm(bool p_cut) { EditorNode::get_singleton()->get_editor_plugins_over()->make_visible(false); if (p_cut) { - editor_data->get_undo_redo()->create_action(TTR("Cut Node(s)")); + editor_data->get_undo_redo()->create_action(TTR("Cut Node(s)"), UndoRedo::MERGE_DISABLE, remove_list.front()->get()); } else { - editor_data->get_undo_redo()->create_action(TTR("Remove Node(s)")); + editor_data->get_undo_redo()->create_action(TTR("Remove Node(s)"), UndoRedo::MERGE_DISABLE, remove_list.front()->get()); } bool entire_scene = false; @@ -2103,6 +2061,7 @@ void SceneTreeDock::_delete_confirm(bool p_cut) { for (const Node *E : remove_list) { if (E == edited_scene) { entire_scene = true; + break; } } @@ -2220,7 +2179,7 @@ void SceneTreeDock::_do_create(Node *p_parent) { Node *child = Object::cast_to<Node>(c); ERR_FAIL_COND(!child); - editor_data->get_undo_redo()->create_action(TTR("Create Node")); + editor_data->get_undo_redo()->create_action_for_history(TTR("Create Node"), editor_data->get_current_edited_scene_history_id()); if (edited_scene) { editor_data->get_undo_redo()->add_do_method(p_parent, "add_child", child, true); @@ -2637,7 +2596,7 @@ void SceneTreeDock::_script_dropped(String p_file, NodePath p_to) { Ref<Script> scr = ResourceLoader::load(p_file); ERR_FAIL_COND(!scr.is_valid()); if (Node *n = get_node(p_to)) { - editor_data->get_undo_redo()->create_action(TTR("Attach Script")); + editor_data->get_undo_redo()->create_action(TTR("Attach Script"), UndoRedo::MERGE_DISABLE, n); editor_data->get_undo_redo()->add_do_method(InspectorDock::get_singleton(), "store_script_properties", n); editor_data->get_undo_redo()->add_undo_method(InspectorDock::get_singleton(), "store_script_properties", n); editor_data->get_undo_redo()->add_do_method(n, "set_script", scr); @@ -2864,10 +2823,13 @@ void SceneTreeDock::_tree_rmb(const Vector2 &p_menu_pos) { } } if (all_owned) { - menu->add_separator(); - menu->add_icon_check_item(get_theme_icon(SNAME("SceneUniqueName"), SNAME("EditorIcons")), TTR("Access as Scene Unique Name"), TOOL_TOGGLE_SCENE_UNIQUE_NAME); - // Checked based on `selection[0]` because `full_selection` has undesired ordering. - menu->set_item_checked(menu->get_item_index(TOOL_TOGGLE_SCENE_UNIQUE_NAME), selection[0]->is_unique_name_in_owner()); + // Group "toggle_unique_name" with "copy_node_path", if it is available. + if (menu->get_item_index(TOOL_COPY_NODE_PATH) == -1) { + menu->add_separator(); + } + Node *node = full_selection[0]; + menu->add_icon_shortcut(get_theme_icon(SNAME("SceneUniqueName"), SNAME("EditorIcons")), ED_GET_SHORTCUT("scene_tree/toggle_unique_name"), TOOL_TOGGLE_SCENE_UNIQUE_NAME); + menu->set_item_text(menu->get_item_index(TOOL_TOGGLE_SCENE_UNIQUE_NAME), node->is_unique_name_in_owner() ? TTR("Revoke Unique Name") : TTR("Access as Unique Name")); } } @@ -3420,6 +3382,7 @@ SceneTreeDock::SceneTreeDock(Node *p_scene_root, EditorSelection *p_editor_selec ED_SHORTCUT("scene_tree/make_root", TTR("Make Scene Root")); ED_SHORTCUT("scene_tree/save_branch_as_scene", TTR("Save Branch as Scene")); ED_SHORTCUT("scene_tree/copy_node_path", TTR("Copy Node Path"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::C); + ED_SHORTCUT("scene_tree/toggle_unique_name", TTR("Toggle Access as Unique Name")); ED_SHORTCUT("scene_tree/delete_no_confirm", TTR("Delete (No Confirm)"), KeyModifierMask::SHIFT | Key::KEY_DELETE); ED_SHORTCUT("scene_tree/delete", TTR("Delete"), Key::KEY_DELETE); @@ -3516,7 +3479,6 @@ SceneTreeDock::SceneTreeDock(Node *p_scene_root, EditorSelection *p_editor_selec scene_tree->connect("nodes_dragged", callable_mp(this, &SceneTreeDock::_nodes_drag_begin)); scene_tree->get_scene_tree()->connect("item_double_clicked", callable_mp(this, &SceneTreeDock::_focus_node)); - scene_tree->get_scene_tree()->connect("item_collapsed", callable_mp(this, &SceneTreeDock::_node_collapsed)); editor_selection->connect("selection_changed", callable_mp(this, &SceneTreeDock::_selection_changed)); diff --git a/editor/scene_tree_dock.h b/editor/scene_tree_dock.h index dc228e1c93..e48b518252 100644 --- a/editor/scene_tree_dock.h +++ b/editor/scene_tree_dock.h @@ -137,7 +137,6 @@ class SceneTreeDock : public VBoxContainer { HBoxContainer *tool_hbc = nullptr; void _tool_selected(int p_tool, bool p_confirm_override = false); void _property_selected(int p_idx); - void _node_collapsed(Object *p_obj); Node *property_drop_node = nullptr; String resource_drop_path; @@ -188,9 +187,6 @@ class SceneTreeDock : public VBoxContainer { void _node_reparent(NodePath p_path, bool p_keep_global_xform); void _do_reparent(Node *p_new_parent, int p_position_in_parent, Vector<Node *> p_nodes, bool p_keep_global_xform); - bool _is_collapsed_recursive(TreeItem *p_item) const; - void _set_collapsed_recursive(TreeItem *p_item, bool p_collapsed); - void _set_owners(Node *p_owner, const Array &p_nodes); enum ReplaceOwnerMode { @@ -228,8 +224,6 @@ class SceneTreeDock : public VBoxContainer { virtual void input(const Ref<InputEvent> &p_event) override; virtual void shortcut_input(const Ref<InputEvent> &p_event) override; - void _import_subscene(); - void _new_scene_from(String p_file); void _set_node_owner_recursive(Node *p_node, Node *p_owner); @@ -292,7 +286,6 @@ public: void _focus_node(); - void import_subscene(); void add_root_node(Node *p_node); void set_edited_scene(Node *p_scene); void instantiate(const String &p_file); diff --git a/editor/scene_tree_editor.cpp b/editor/scene_tree_editor.cpp index 50bb6496e1..689570bcf6 100644 --- a/editor/scene_tree_editor.cpp +++ b/editor/scene_tree_editor.cpp @@ -30,6 +30,7 @@ #include "scene_tree_editor.h" +#include "core/config/project_settings.h" #include "core/object/message_queue.h" #include "core/string/print_string.h" #include "editor/editor_file_system.h" @@ -603,7 +604,7 @@ void SceneTreeEditor::_update_tree(bool p_scroll_to_selected) { updating_tree = false; tree_dirty = false; - if (!filter.is_empty()) { + if (!filter.strip_edges().is_empty()) { _update_filter(nullptr, p_scroll_to_selected); } } @@ -618,18 +619,28 @@ bool SceneTreeEditor::_update_filter(TreeItem *p_parent, bool p_scroll_to_select return false; } - bool keep = false; + bool keep_for_children = false; for (TreeItem *child = p_parent->get_first_child(); child; child = child->get_next()) { - keep = _update_filter(child, p_scroll_to_selected) || keep; + // Always keep if at least one of the children are kept. + keep_for_children = _update_filter(child, p_scroll_to_selected) || keep_for_children; } - if (!keep) { - StringName node_type = get_node(p_parent->get_metadata(0))->get_class(); - bool is_kept_by_type = (filter.begins_with("type:") && filter.trim_prefix("type:").is_subsequence_ofn(node_type)) || (filter.begins_with("t:") && filter.trim_prefix("t:").is_subsequence_ofn(node_type)); - keep = (filter.is_subsequence_ofn(p_parent->get_text(0)) || is_kept_by_type); + // Now find other reasons to keep this Node, too. + PackedStringArray terms = filter.to_lower().split_spaces(); + bool keep = _item_matches_all_terms(p_parent, terms); + + p_parent->set_visible(keep_for_children || keep); + if (keep_for_children) { + if (keep) { + p_parent->clear_custom_color(0); + p_parent->set_selectable(0, true); + } else { + p_parent->set_custom_color(0, get_theme_color(SNAME("disabled_font_color"), SNAME("Editor"))); + p_parent->set_selectable(0, false); + p_parent->deselect(0); + } } - p_parent->set_visible(keep); if (editor_selection) { Node *n = get_node(p_parent->get_metadata(0)); if (keep) { @@ -644,7 +655,68 @@ bool SceneTreeEditor::_update_filter(TreeItem *p_parent, bool p_scroll_to_select } } - return keep; + return keep || keep_for_children; +} + +bool SceneTreeEditor::_item_matches_all_terms(TreeItem *p_item, PackedStringArray p_terms) { + if (p_terms.is_empty()) { + return true; + } + + for (int i = 0; i < p_terms.size(); i++) { + String term = p_terms[i]; + + // Recognise special filter. + if (term.contains(":") && !term.get_slicec(':', 0).is_empty()) { + String parameter = term.get_slicec(':', 0); + String argument = term.get_slicec(':', 1); + + if (parameter == "type" || parameter == "t") { + // Filter by Type. + String node_type = get_node(p_item->get_metadata(0))->get_class().to_lower(); + + if (!node_type.contains(argument)) { + return false; + } + } else if (parameter == "group" || parameter == "g") { + // Filter by Group. + Node *node = get_node(p_item->get_metadata(0)); + + List<Node::GroupInfo> group_info_list; + node->get_groups(&group_info_list); + if (group_info_list.is_empty()) { + return false; + } + // When argument is empty, match all Nodes belonging to any group. + if (!argument.is_empty()) { + bool term_in_groups = false; + for (int j = 0; j < group_info_list.size(); j++) { + // Ignore private groups. + if (String(group_info_list[j].name).begins_with("__")) { + continue; + } + if (String(group_info_list[j].name).to_lower().contains(argument)) { + term_in_groups = true; + break; + } + } + if (!term_in_groups) { + return false; + } + } + } else { + WARN_PRINT(vformat(TTR("Special Node filter \"%s\" is not recognised. Available filters include \"type\" and \"group\"."), parameter)); + continue; + } + } else { + // Default. + if (!p_item->get_text(0).to_lower().contains(term)) { + return false; + } + } + } + + return true; } void SceneTreeEditor::_compute_hash(Node *p_node, uint64_t &hash) { @@ -732,6 +804,10 @@ void SceneTreeEditor::_cell_multi_selected(Object *p_object, int p_cell, bool p_ TreeItem *item = Object::cast_to<TreeItem>(p_object); ERR_FAIL_COND(!item); + if (!item->is_visible()) { + return; + } + NodePath np = item->get_metadata(0); Node *n = get_node(np); @@ -764,7 +840,7 @@ void SceneTreeEditor::_notification(int p_what) { get_tree()->connect("tree_process_mode_changed", callable_mp(this, &SceneTreeEditor::_tree_process_mode_changed)); get_tree()->connect("node_removed", callable_mp(this, &SceneTreeEditor::_node_removed)); get_tree()->connect("node_renamed", callable_mp(this, &SceneTreeEditor::_node_renamed)); - get_tree()->connect("node_configuration_warning_changed", callable_mp(this, &SceneTreeEditor::_warning_changed), CONNECT_DEFERRED); + get_tree()->connect("node_configuration_warning_changed", callable_mp(this, &SceneTreeEditor::_warning_changed)); tree->connect("item_collapsed", callable_mp(this, &SceneTreeEditor::_cell_collapsed)); @@ -871,14 +947,16 @@ void SceneTreeEditor::_renamed() { Node *n = get_node(np); ERR_FAIL_COND(!n); - // Empty node names are not allowed, so resets it to previous text and show warning - if (which->get_text(0).strip_edges().is_empty()) { - which->set_text(0, n->get_name()); - EditorNode::get_singleton()->show_warning(TTR("No name provided.")); - return; + String raw_new_name = which->get_text(0); + if (raw_new_name.strip_edges().is_empty()) { + // If name is empty, fallback to class name. + if (GLOBAL_GET("editor/node_naming/name_casing").operator int() != NAME_CASING_PASCAL_CASE) { + raw_new_name = Node::adjust_name_casing(n->get_class()); + } else { + raw_new_name = n->get_class(); + } } - String raw_new_name = which->get_text(0); String new_name = raw_new_name.validate_node_name(); if (new_name != raw_new_name) { @@ -1261,7 +1339,7 @@ void SceneTreeEditor::set_connecting_signal(bool p_enable) { } void SceneTreeEditor::_bind_methods() { - ClassDB::bind_method(D_METHOD("_update_tree"), &SceneTreeEditor::_update_tree, DEFVAL(false)); // Still used by some connect_compat. + ClassDB::bind_method(D_METHOD("_update_tree"), &SceneTreeEditor::_update_tree, DEFVAL(false)); // Still used by UndoRedo. ClassDB::bind_method("_rename_node", &SceneTreeEditor::_rename_node); ClassDB::bind_method("_test_update_tree", &SceneTreeEditor::_test_update_tree); @@ -1363,6 +1441,9 @@ void SceneTreeDialog::_notification(int p_what) { case NOTIFICATION_VISIBILITY_CHANGED: { if (is_visible()) { tree->update_tree(); + + // Select the search bar by default. + filter->call_deferred(SNAME("grab_focus")); } } break; diff --git a/editor/scene_tree_editor.h b/editor/scene_tree_editor.h index 0c13ad96cd..8fbc3ab6d6 100644 --- a/editor/scene_tree_editor.h +++ b/editor/scene_tree_editor.h @@ -76,8 +76,8 @@ class SceneTreeEditor : public Control { void _add_nodes(Node *p_node, TreeItem *p_parent); void _test_update_tree(); - void _update_tree(bool p_scroll_to_selected = false); bool _update_filter(TreeItem *p_parent = nullptr, bool p_scroll_to_selected = false); + bool _item_matches_all_terms(TreeItem *p_item, PackedStringArray p_terms); void _tree_changed(); void _tree_process_mode_changed(); void _node_removed(Node *p_node); @@ -137,6 +137,9 @@ class SceneTreeEditor : public Control { Vector<StringName> valid_types; public: + // Public for use with callable_mp. + void _update_tree(bool p_scroll_to_selected = false); + void set_filter(const String &p_filter); String get_filter() const; diff --git a/editor/shader_globals_editor.cpp b/editor/shader_globals_editor.cpp index eef0f3eae1..473bbd69d9 100644 --- a/editor/shader_globals_editor.cpp +++ b/editor/shader_globals_editor.cpp @@ -483,7 +483,7 @@ ShaderGlobalsEditor::ShaderGlobalsEditor() { inspector->connect("property_deleted", callable_mp(this, &ShaderGlobalsEditor::_variable_deleted), CONNECT_DEFERRED); interface = memnew(ShaderGlobalsEditorInterface); - interface->connect("var_changed", Callable(this, "_changed")); + interface->connect("var_changed", callable_mp(this, &ShaderGlobalsEditor::_changed)); } ShaderGlobalsEditor::~ShaderGlobalsEditor() { diff --git a/editor/translations/af.po b/editor/translations/af.po index f2e389b6f5..8ada9c3379 100644 --- a/editor/translations/af.po +++ b/editor/translations/af.po @@ -4588,6 +4588,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7430,7 +7431,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15506,18 +15508,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Nodus Naam:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Nodus Naam:" #: editor/scene_tree_dock.cpp @@ -15717,6 +15719,11 @@ msgstr "" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Nodus Naam:" + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr "Koppel tans Sein:" @@ -15781,6 +15788,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17655,6 +17666,21 @@ msgstr "Alle Seleksie" msgid "Auto Update Project" msgstr "Projek Stigters" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Vervang Alles" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Kies 'n Gids" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Kies 'n Gids" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19446,6 +19472,11 @@ msgstr "Anim Dupliseer Sleutels" msgid "Custom BG Color" msgstr "Anim Dupliseer Sleutels" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Anim Verander Transform" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -20282,6 +20313,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "Ongeldige naam." diff --git a/editor/translations/ar.po b/editor/translations/ar.po index cda76c44c8..adaef249f8 100644 --- a/editor/translations/ar.po +++ b/editor/translations/ar.po @@ -67,14 +67,15 @@ # Jhon Smith <jhonsmaith3@gmail.com>, 2022. # Oo mohab oO <mohab9225@gmail.com>, 2022. # عبد الرØÙ…Ù† أبو سعدة ||Abd Alrahman abo saada <abdalrahmanabs2005@gmail.com>, 2022. +# xX-Void-Xx <arandomdude75@gmail.com>, 2022. +# Ø£ØÙ…د النور <ahmed2699@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-23 03:57+0000\n" -"Last-Translator: عبد الرØÙ…Ù† أبو سعدة ||Abd Alrahman abo saada " -"<abdalrahmanabs2005@gmail.com>\n" +"PO-Revision-Date: 2022-09-08 07:39+0000\n" +"Last-Translator: Ø£ØÙ…د النور <ahmed2699@gmail.com>\n" "Language-Team: Arabic <https://hosted.weblate.org/projects/godot-engine/" "godot/ar/>\n" "Language: ar\n" @@ -83,7 +84,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -452,9 +453,8 @@ msgid "Command" msgstr "Ù…ÙØªØ§Ø Command" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" -msgstr "(Ùيزيائي)" +msgstr "Ùيزيائي" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp @@ -508,7 +508,7 @@ msgstr "الضغط" #: core/os/input_event.cpp msgid "Pen Inverted" -msgstr "" +msgstr "Ù‚Ùلب القلم" #: core/os/input_event.cpp msgid "Relative" @@ -1199,7 +1199,7 @@ msgstr "خطوة الدوران:" #: editor/animation_track_editor.cpp editor/script_editor_debugger.cpp #: modules/visual_script/visual_script_nodes.cpp scene/gui/range.cpp msgid "Value" -msgstr "القيمة" +msgstr "قيمة" #: editor/animation_track_editor.cpp #, fuzzy @@ -4575,6 +4575,7 @@ msgstr "أدوات مشروع أو مشهد متنوعة." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "مشروع" @@ -5402,9 +5403,8 @@ msgid "Icon And Font Color" msgstr "لون الأيقونة والخط" #: editor/editor_settings.cpp -#, fuzzy msgid "Base Color" -msgstr "الألوان" +msgstr "اللون الاساسي" #: editor/editor_settings.cpp #, fuzzy @@ -5434,9 +5434,8 @@ msgid "Use Graph Node Headers" msgstr "استخدم رؤوس ÙˆØØ¯Ø§Øª الرسم البياني" #: editor/editor_settings.cpp -#, fuzzy msgid "Additional Spacing" -msgstr "تكرار الرسوم Ø§Ù„Ù…ØªØØ±ÙƒØ©" +msgstr "Ù…Ø³Ø§ØØ© اضاÙية" #: editor/editor_settings.cpp #, fuzzy @@ -5444,9 +5443,8 @@ msgid "Custom Theme" msgstr "مظهر Ø§Ù„Ù…ØØ±Ø±/برنامج-جودوه" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Script Button" -msgstr "زر العجلة يميناً" +msgstr "اضهار زر السكربت" #: editor/editor_settings.cpp #, fuzzy @@ -5464,9 +5462,8 @@ msgid "Default Project Path" msgstr "مسار المشروع:" #: editor/editor_settings.cpp -#, fuzzy msgid "On Save" -msgstr "ØÙظ" +msgstr "عند الØÙظ" #: editor/editor_settings.cpp #, fuzzy @@ -5501,9 +5498,8 @@ msgid "Start Create Dialog Fully Expanded" msgstr "بدء Ù†Ø§ÙØ°Ø© ØÙˆØ§Ø± الإنشاء موسعة بالكامل" #: editor/editor_settings.cpp -#, fuzzy msgid "Always Show Folders" -msgstr "إظهار الشبكة دوماً" +msgstr "إظهار Ø§Ù„Ù…Ù„ÙØ§Øª دوماً" #: editor/editor_settings.cpp #, fuzzy @@ -5567,14 +5563,12 @@ msgid "Convert Indent On Save" msgstr "تØÙˆÙŠÙ„ Ø§Ù„Ù…Ø³Ø§ÙØ© البادئة إلى Ù…Ø³Ø§ÙØ§Øª" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Draw Tabs" -msgstr "استدعاءات الرسم:" +msgstr "رسم ÙØ±Ø§ØºØ§Øª زر التاب" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Draw Spaces" -msgstr "استدعاءات الرسم:" +msgstr "رسم ÙØ±Ø§ØºØ§Øª زر السبايس" #: editor/editor_settings.cpp editor/plugins/spatial_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/tile_map.cpp @@ -5592,9 +5586,8 @@ msgid "V Scroll Speed" msgstr "سرعة التمرير العمودي" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Minimap" -msgstr "إظهار المركز" +msgstr "إظهار الخريطة" #: editor/editor_settings.cpp msgid "Minimap Width" @@ -5618,9 +5611,8 @@ msgid "Appearance" msgstr "المظهر" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Show Line Numbers" -msgstr "رقم الخط:" +msgstr "اضهار رقم الخط" #: editor/editor_settings.cpp #, fuzzy @@ -5661,9 +5653,8 @@ msgid "Line Length Guideline Hard Column" msgstr "عمود غامق لتوجيه طول السطر" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Script List" -msgstr "Ù…ØØ±Ø± النص البرمجي" +msgstr "Ù„Ø§Ø¦ØØ© السكربتات" #: editor/editor_settings.cpp msgid "Show Members Overview" @@ -5725,16 +5716,14 @@ msgid "Caret Blink Speed" msgstr "سرعة وميض علامة Ø§Ù„Ø¥Ù‚ØØ§Ù…" #: editor/editor_settings.cpp -#, fuzzy msgid "Right Click Moves Caret" -msgstr "اضغط بالزر الأيمن Ù„Ø¥Ø¶Ø§ÙØ© نقطة" +msgstr "اضغط بالزر الأيمن Ù„Ø¥Ø¶Ø§ÙØ© علامة Ø§Ù„Ø¥Ù‚ØØ§Ù…" #: editor/editor_settings.cpp modules/gdscript/gdscript.cpp #: modules/gdscript/gdscript_editor.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Completion" -msgstr "نسخ Ø§Ù„Ù…ÙØØ¯Ø¯" +msgstr "تكملة" #: editor/editor_settings.cpp msgid "Idle Parse Delay" @@ -5793,14 +5782,12 @@ msgid "Grid Map" msgstr "خريطة الشبكة" #: editor/editor_settings.cpp modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Pick Distance" -msgstr "اختر Ø§Ù„Ù…Ø³Ø§ÙØ©:" +msgstr "اختر Ø§Ù„Ù…Ø³Ø§ÙØ©" #: editor/editor_settings.cpp editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Preview Size" -msgstr "عرض" +msgstr "ØØ¬Ù… العرض" #: editor/editor_settings.cpp msgid "Primary Grid Color" @@ -7500,7 +7487,8 @@ msgid "8 Bit" msgstr "8 بت" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "Ø§ØØ§Ø¯ÙŠÙ‡" @@ -15550,18 +15538,19 @@ msgstr "" msgid "Make Local" msgstr "اجعله Ù…ØÙ„ياً" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "إسم العقدة:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "لقد تم استخدام هذا الاسم ÙÙŠ ÙˆØ¸ÙŠÙØ© برمجية/ Ù…ÙØªØºÙŠÙ‘ر/ إشارة، من قبل:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "إسم العقدة:" #: editor/scene_tree_dock.cpp @@ -15761,6 +15750,11 @@ msgid "Button Group" msgstr "مجموعة الأزرار" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "إسم العقدة:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(الإتصال من)" @@ -15836,6 +15830,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "اسم عÙقدة غير ØµØ§Ù„ØØŒ إن Ø§Ù„Ø£ØØ±Ù التالية غير Ù…Ø³Ù…ÙˆØØ©:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "إعادة تسمية العÙقدة" @@ -17272,7 +17270,7 @@ msgstr "" #: modules/gltf/gltf_node.cpp scene/3d/spatial.cpp #, fuzzy msgid "Translation" -msgstr "الترجمات" +msgstr "الترجمة" #: modules/gltf/gltf_node.cpp #, fuzzy @@ -17706,6 +17704,21 @@ msgstr "" msgid "Auto Update Project" msgstr "ØªØØ¯ÙŠØ« المشروع تلقائيًا" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "إظهار الكل" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "ØØ¯Ø¯ الوجهة" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "ØØ¯Ø¯ الوجهة" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "نهاية تتبع مكدس الاستثناء الداخلي" @@ -19575,6 +19588,11 @@ msgstr "قص العÙقد" msgid "Custom BG Color" msgstr "قص العÙقد" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "توسيع الكل" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20432,6 +20450,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "اسم Ø§Ù„Ø±ÙØ²Ù…Ø© القصير غير صالØ." diff --git a/editor/translations/az.po b/editor/translations/az.po index af28a85240..d4ffe0665e 100644 --- a/editor/translations/az.po +++ b/editor/translations/az.po @@ -4444,6 +4444,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7176,7 +7177,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -14914,18 +14916,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Animasiya Addımını DÉ™yiÅŸdirin" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Animasiya Addımını DÉ™yiÅŸdirin" #: editor/scene_tree_dock.cpp @@ -15115,6 +15117,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Animasiya Addımını DÉ™yiÅŸdirin" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15178,6 +15185,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -16983,6 +16994,19 @@ msgstr "" msgid "Auto Update Project" msgstr "ÆlaqÉ™ni redaktÉ™ edin:" +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "LayihÉ™ Qurucuları" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18707,6 +18731,11 @@ msgstr "Funksiyalar:" msgid "Custom BG Color" msgstr "Funksiyalar:" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "3D Transformasya izi" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19503,6 +19532,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/bg.po b/editor/translations/bg.po index d2d7a56dc3..a6a8b72ea5 100644 --- a/editor/translations/bg.po +++ b/editor/translations/bg.po @@ -15,13 +15,15 @@ # Ziv D <wizdavid@gmail.com>, 2020. # Violin Iliev <violin.developer@gmail.com>, 2021. # Ivan Gechev <ivan_banov@abv.bg>, 2022. +# BigHomieDripDrop <bartu.bali@gmail.com>, 2022. +# xaio <xaio666@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-04-28 11:11+0000\n" -"Last-Translator: Любомир ВаÑилев <lyubomirv@gmx.com>\n" +"PO-Revision-Date: 2022-09-22 15:26+0000\n" +"Last-Translator: xaio <xaio666@gmail.com>\n" "Language-Team: Bulgarian <https://hosted.weblate.org/projects/godot-engine/" "godot/bg/>\n" "Language: bg\n" @@ -29,67 +31,59 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.12.1-dev\n" +"X-Generator: Weblate 4.14.1\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" -msgstr "" +msgstr "Драйвер за таблет" #: core/bind/core_bind.cpp -#, fuzzy msgid "Clipboard" -msgstr "ОтрÑзване над" +msgstr "Клипборд" #: core/bind/core_bind.cpp -#, fuzzy msgid "Current Screen" -msgstr "Текущо име на Ñцената" +msgstr "Текуща Сцена" #: core/bind/core_bind.cpp msgid "Exit Code" -msgstr "" +msgstr "Изходен Код" #: core/bind/core_bind.cpp -#, fuzzy msgid "V-Sync Enabled" -msgstr "Включване" +msgstr "V-Sync Включено" #: core/bind/core_bind.cpp main/main.cpp msgid "V-Sync Via Compositor" -msgstr "" +msgstr "V-Sync Чрез Композитора" #: core/bind/core_bind.cpp main/main.cpp msgid "Delta Smoothing" -msgstr "" +msgstr "Делта Изглаждане" #: core/bind/core_bind.cpp -#, fuzzy msgid "Low Processor Usage Mode" -msgstr "Режим на премеÑтване" +msgstr "Режим на ÐиÑко Ðатоварване на ПроцеÑора" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode Sleep (µsec)" -msgstr "" +msgstr "ЗаÑпиване в Режим на ÐиÑко Ðатоварване на ПроцеÑора (µsec)" #: core/bind/core_bind.cpp main/main.cpp platform/uwp/os_uwp.cpp -#, fuzzy msgid "Keep Screen On" -msgstr "Дебъгерът да оÑтане отворен" +msgstr "Дръж Екрана Включен" #: core/bind/core_bind.cpp -#, fuzzy msgid "Min Window Size" -msgstr "Размер на контура:" +msgstr "Минимален Размер на Екрана" #: core/bind/core_bind.cpp -#, fuzzy msgid "Max Window Size" -msgstr "Размер на контура:" +msgstr "МакÑимален Размер на Екрана" #: core/bind/core_bind.cpp -#, fuzzy msgid "Screen Orientation" -msgstr "ОтварÑне на документациÑта" +msgstr "ÐžÑ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð½Ð° Екрана" #: core/bind/core_bind.cpp core/project_settings.cpp main/main.cpp #: platform/uwp/os_uwp.cpp @@ -102,7 +96,7 @@ msgstr "Без граници" #: core/bind/core_bind.cpp msgid "Per Pixel Transparency Enabled" -msgstr "" +msgstr "ПопикÑелова ПрозрачноÑÑ‚ Включено" #: core/bind/core_bind.cpp core/project_settings.cpp msgid "Fullscreen" @@ -110,26 +104,24 @@ msgstr "ЦÑл екран" #: core/bind/core_bind.cpp msgid "Maximized" -msgstr "" +msgstr "МакÑимизиран" #: core/bind/core_bind.cpp -#, fuzzy msgid "Minimized" -msgstr "Инициализиране" +msgstr "Минимизиран" #: core/bind/core_bind.cpp core/project_settings.cpp scene/gui/dialogs.cpp #: scene/gui/graph_node.cpp msgid "Resizable" -msgstr "" +msgstr "ПреоразмерÑване е Възможно" #: core/bind/core_bind.cpp core/os/input_event.cpp scene/2d/node_2d.cpp #: scene/2d/physics_body_2d.cpp scene/2d/remote_transform_2d.cpp #: scene/3d/physics_body.cpp scene/3d/remote_transform.cpp #: scene/gui/control.cpp scene/gui/line_edit.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Position" -msgstr "Създаване на функциÑ" +msgstr "ПозициÑ" #: core/bind/core_bind.cpp core/project_settings.cpp editor/editor_settings.cpp #: main/main.cpp modules/gridmap/grid_map.cpp @@ -140,60 +132,52 @@ msgstr "Създаване на функциÑ" #: scene/resources/primitive_meshes.cpp scene/resources/sky.cpp #: scene/resources/style_box.cpp scene/resources/texture.cpp #: scene/resources/visual_shader.cpp servers/visual_server.cpp -#, fuzzy msgid "Size" -msgstr "Размер:" +msgstr "Размер" #: core/bind/core_bind.cpp msgid "Endian Swap" -msgstr "" +msgstr "РазмÑна на Байтова КрайноÑÑ‚" #: core/bind/core_bind.cpp -#, fuzzy msgid "Editor Hint" -msgstr "Тема на редактора" +msgstr "Съвет за Редактора" #: core/bind/core_bind.cpp msgid "Print Error Messages" -msgstr "Принирай ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð·Ð° грешки" +msgstr "Принтирай ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð·Ð° грешки" #: core/bind/core_bind.cpp -#, fuzzy msgid "Iterations Per Second" -msgstr "Режим на интерполациÑ" +msgstr "Итерации в Секунда" #: core/bind/core_bind.cpp -#, fuzzy msgid "Target FPS" -msgstr "Принудително изпращане" +msgstr "Целеви FPS" #: core/bind/core_bind.cpp -#, fuzzy msgid "Time Scale" -msgstr "ТекÑтурна облаÑÑ‚" +msgstr "Времева Скала" #: core/bind/core_bind.cpp main/main.cpp msgid "Physics Jitter Fix" -msgstr "" +msgstr "ÐšÐ¾Ñ€ÐµÐºÑ†Ð¸Ñ Ð½Ð° Физично Трептене" #: core/bind/core_bind.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Error" msgstr "Грешка" #: core/bind/core_bind.cpp -#, fuzzy msgid "Error String" -msgstr "Грешка при запазване" +msgstr "Ðиз на Грешката" #: core/bind/core_bind.cpp -#, fuzzy msgid "Error Line" -msgstr "Грешка при запазване" +msgstr "Ð›Ð¸Ð½Ð¸Ñ Ð½Ð° Грешката" #: core/bind/core_bind.cpp -#, fuzzy msgid "Result" -msgstr "Резултати от търÑенето" +msgstr "Резултат" #: core/command_queue_mt.cpp core/message_queue.cpp main/main.cpp msgid "Memory" @@ -208,16 +192,15 @@ msgstr "Памет" #: modules/webrtc/webrtc_data_channel.h modules/websocket/websocket_macros.h #: servers/visual_server.cpp msgid "Limits" -msgstr "" +msgstr "ОграничениÑ" #: core/command_queue_mt.cpp -#, fuzzy msgid "Command Queue" -msgstr "Command: завъртане" +msgstr "Oпашка от Kоманди" #: core/command_queue_mt.cpp msgid "Multithreading Queue Size (KB)" -msgstr "" +msgstr "Размер на Многонишковата Опашка (KB)" #: core/func_ref.cpp modules/visual_script/visual_script_builtin_funcs.cpp #: modules/visual_script/visual_script_func_nodes.cpp @@ -236,101 +219,92 @@ msgstr "Данни" #: modules/gdscript/language_server/gdscript_language_server.cpp #: modules/webrtc/webrtc_data_channel.h modules/websocket/websocket_macros.h #: scene/gui/file_dialog.cpp -#, fuzzy msgid "Network" -msgstr "Профилиране на мрежата" +msgstr "Мрежа" #: core/io/file_access_network.cpp msgid "Remote FS" -msgstr "Отдалечена ФС" +msgstr "ДиÑтанционна ФС" #: core/io/file_access_network.cpp msgid "Page Size" -msgstr "Размер на Ñтраница" +msgstr "Размер на Страница" #: core/io/file_access_network.cpp msgid "Page Read Ahead" -msgstr "" +msgstr "Кеширане на Страницата" #: core/io/http_client.cpp msgid "Blocking Mode Enabled" -msgstr "" +msgstr "Блокиращ Режим Включен" #: core/io/http_client.cpp -#, fuzzy msgid "Connection" -msgstr "Свързване" +msgstr "Връзка" #: core/io/http_client.cpp msgid "Read Chunk Size" -msgstr "" +msgstr "Размер на Прочетеното Парче" #: core/io/marshalls.cpp -#, fuzzy msgid "Object ID" -msgstr "Изчертани обекти:" +msgstr "Обект ID" #: core/io/multiplayer_api.cpp core/io/packet_peer.cpp -#, fuzzy msgid "Allow Object Decoding" -msgstr "Показване на избледнÑващи кадри" +msgstr "Разреши Декодирането на Обекта" #: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp msgid "Refuse New Network Connections" msgstr "Отказ на нови мрежови връзки" #: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp -#, fuzzy msgid "Network Peer" -msgstr "Профилиране на мрежата" +msgstr "Мрежов ВръÑтник" #: core/io/multiplayer_api.cpp scene/animation/animation_player.cpp -#, fuzzy msgid "Root Node" -msgstr "Име на ÐºÐ¾Ñ€ÐµÐ½Ð½Ð¸Ñ Ð¾Ð±ÐµÐºÑ‚" +msgstr "Коренен Връх" #: core/io/networked_multiplayer_peer.cpp -#, fuzzy msgid "Refuse New Connections" -msgstr "Свързване" +msgstr "Отказ на нови връзки" #: core/io/networked_multiplayer_peer.cpp -#, fuzzy msgid "Transfer Mode" -msgstr "Панорамен режим" +msgstr "Режим на транÑфер" #: core/io/packet_peer.cpp msgid "Encode Buffer Max Size" -msgstr "" +msgstr "МакÑимален размер на буфера за кодиране" #: core/io/packet_peer.cpp msgid "Input Buffer Max Size" -msgstr "" +msgstr "МакÑимален размер на Ð²Ñ…Ð¾Ð´Ð½Ð¸Ñ Ð±ÑƒÑ„ÐµÑ€" #: core/io/packet_peer.cpp msgid "Output Buffer Max Size" -msgstr "" +msgstr "МакÑимален размер на Ð¸Ð·Ñ…Ð¾Ð´Ð½Ð¸Ñ Ð±ÑƒÑ„ÐµÑ€" #: core/io/packet_peer.cpp msgid "Stream Peer" -msgstr "" +msgstr "Поточен връÑтник" #: core/io/stream_peer.cpp msgid "Big Endian" -msgstr "" +msgstr "Биг-Ендиан" #: core/io/stream_peer.cpp msgid "Data Array" -msgstr "" +msgstr "МаÑив от Данни" #: core/io/stream_peer_ssl.cpp msgid "Blocking Handshake" -msgstr "" +msgstr "Блокиращ Handshake" #: core/io/udp_server.cpp -#, fuzzy msgid "Max Pending Connections" -msgstr "Редактиране на Връзката:" +msgstr "МакÑимален брой чакащи връзки" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -350,9 +324,8 @@ msgid "Not enough bytes for decoding bytes, or invalid format." msgstr "ÐедоÑтатъчно байтове за разкодиране или неправилен формат." #: core/math/expression.cpp -#, fuzzy msgid "Invalid input %d (not passed) in expression" -msgstr "Ðеправилен входен параметър %i (не е подаден) в израза" +msgstr "Ðеправилен входен параметър %d (не е подаден) в израза" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" @@ -385,13 +358,12 @@ msgid "Seed" msgstr "" #: core/math/random_number_generator.cpp -#, fuzzy msgid "State" -msgstr "РотациÑ" +msgstr "СъÑтоÑние" #: core/message_queue.cpp msgid "Message Queue" -msgstr "" +msgstr "Опашка на ÑъобщениÑ" #: core/message_queue.cpp msgid "Max Size (KB)" @@ -404,7 +376,7 @@ msgstr "Режим на премеÑтване" #: core/os/input.cpp msgid "Use Accumulated Input" -msgstr "" +msgstr "Ползвай акумулиран вход" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: servers/audio_server.cpp @@ -432,9 +404,8 @@ msgid "Command" msgstr "Command" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" -msgstr "Включване" +msgstr "ФизичеÑки" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp @@ -445,19 +416,20 @@ msgstr "ÐатиÑнат" #: core/os/input_event.cpp #, fuzzy msgid "Scancode" -msgstr "Сканиране" +msgstr "Сканкод" #: core/os/input_event.cpp msgid "Physical Scancode" -msgstr "" +msgstr "ФизичеÑки Ñканкод" #: core/os/input_event.cpp msgid "Unicode" msgstr "Уникод" #: core/os/input_event.cpp +#, fuzzy msgid "Echo" -msgstr "" +msgstr "Echo" #: core/os/input_event.cpp scene/gui/base_button.cpp #, fuzzy @@ -485,7 +457,7 @@ msgstr "Двоен клик" #: core/os/input_event.cpp msgid "Tilt" -msgstr "" +msgstr "Ðаклон" #: core/os/input_event.cpp msgid "Pressure" @@ -493,11 +465,11 @@ msgstr "ÐатиÑк" #: core/os/input_event.cpp msgid "Pen Inverted" -msgstr "" +msgstr "ПиÑалка обърната" #: core/os/input_event.cpp msgid "Relative" -msgstr "" +msgstr "ОтноÑително" #: core/os/input_event.cpp scene/2d/camera_2d.cpp scene/2d/cpu_particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/interpolated_camera.cpp @@ -632,15 +604,15 @@ msgstr "Заключен елемент" #: core/project_settings.cpp msgid "Use Hidden Project Data Directory" -msgstr "" +msgstr "Ползвай Ñкрита дата Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ð° проекта" #: core/project_settings.cpp msgid "Use Custom User Dir" -msgstr "" +msgstr "Ползвай перÑоналната Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ð° потребителÑ" #: core/project_settings.cpp msgid "Custom User Dir Name" -msgstr "" +msgstr "Име на перÑонална потребителÑка категориÑ" #: core/project_settings.cpp main/main.cpp #: platform/javascript/export/export.cpp platform/osx/export/export.cpp @@ -653,7 +625,7 @@ msgstr "Показване на вÑичко" #: modules/opensimplex/noise_texture.cpp scene/2d/line_2d.cpp #: scene/3d/label_3d.cpp scene/gui/text_edit.cpp scene/resources/texture.cpp msgid "Width" -msgstr "" +msgstr "Широчина" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/gltf/gltf_node.cpp modules/opensimplex/noise_texture.cpp @@ -662,20 +634,19 @@ msgstr "" #: scene/resources/font.cpp scene/resources/navigation_mesh.cpp #: scene/resources/primitive_meshes.cpp scene/resources/texture.cpp msgid "Height" -msgstr "" +msgstr "ВиÑочина" #: core/project_settings.cpp msgid "Always On Top" -msgstr "" +msgstr "Винаги отгоре" #: core/project_settings.cpp msgid "Test Width" -msgstr "" +msgstr "ТеÑтова широчина" #: core/project_settings.cpp -#, fuzzy msgid "Test Height" -msgstr "ТеÑтово" +msgstr "ТеÑтова виÑочина" #: core/project_settings.cpp editor/animation_track_editor.cpp #: editor/editor_audio_buses.cpp main/main.cpp servers/audio_server.cpp @@ -684,14 +655,14 @@ msgstr "Ðудио" #: core/project_settings.cpp msgid "Default Bus Layout" -msgstr "" +msgstr "Bus Layout по подразбиране" #: core/project_settings.cpp editor/editor_export.cpp #: editor/editor_file_system.cpp editor/editor_node.cpp #: editor/editor_settings.cpp editor/script_create_dialog.cpp #: scene/2d/camera_2d.cpp scene/3d/light.cpp scene/main/node.cpp msgid "Editor" -msgstr "" +msgstr "Редактор" #: core/project_settings.cpp msgid "Main Run Args" @@ -704,11 +675,11 @@ msgstr "Път на Ñцената:" #: core/project_settings.cpp msgid "Search In File Extensions" -msgstr "" +msgstr "ТърÑи във файловите окончаниÑ" #: core/project_settings.cpp msgid "Script Templates Search Path" -msgstr "" +msgstr "Път за търÑене на Ñкриптови шаблони" #: core/project_settings.cpp #, fuzzy @@ -727,7 +698,7 @@ msgstr "Вход" #: core/project_settings.cpp msgid "UI Accept" -msgstr "" +msgstr "UI Приемам" #: core/project_settings.cpp #, fuzzy @@ -741,38 +712,35 @@ msgstr "Отказ" #: core/project_settings.cpp msgid "UI Focus Next" -msgstr "" +msgstr "UI Ñ„Ð¾ÐºÑƒÑ Ñледващ" #: core/project_settings.cpp msgid "UI Focus Prev" -msgstr "" +msgstr "UI Ñ„Ð¾ÐºÑƒÑ Ð¿Ñ€ÐµÐ´Ð¸ÑˆÐµÐ½" #: core/project_settings.cpp -#, fuzzy msgid "UI Left" -msgstr "Горе влÑво" +msgstr "UI налÑво" #: core/project_settings.cpp -#, fuzzy msgid "UI Right" -msgstr "Горе вдÑÑно" +msgstr "UI надÑÑно" #: core/project_settings.cpp msgid "UI Up" -msgstr "" +msgstr "UI нагоре" #: core/project_settings.cpp -#, fuzzy msgid "UI Down" -msgstr "Ðадолу" +msgstr "UI надолу" #: core/project_settings.cpp msgid "UI Page Up" -msgstr "" +msgstr "UI Ñтраница нагоре" #: core/project_settings.cpp msgid "UI Page Down" -msgstr "" +msgstr "UI Ñтраница надолу" #: core/project_settings.cpp msgid "UI Home" @@ -792,7 +760,7 @@ msgstr "Ðа краÑ" #: servers/physics_2d/space_2d_sw.cpp servers/physics_2d_server.cpp #: servers/physics_server.cpp msgid "Physics" -msgstr "" +msgstr "Физика" #: core/project_settings.cpp editor/editor_settings.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -802,11 +770,11 @@ msgstr "" #: scene/3d/physics_body.cpp scene/resources/world.cpp #: servers/physics/space_sw.cpp servers/physics_server.cpp msgid "3D" -msgstr "" +msgstr "3D" #: core/project_settings.cpp msgid "Smooth Trimesh Collision" -msgstr "" +msgstr "Плавен тримеш ÑблъÑък" #: core/project_settings.cpp drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles2/rasterizer_scene_gles2.cpp @@ -818,7 +786,7 @@ msgstr "" #: scene/main/viewport.cpp servers/visual/visual_server_scene.cpp #: servers/visual_server.cpp msgid "Rendering" -msgstr "" +msgstr "Рендериране" #: core/project_settings.cpp drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_scene_gles3.cpp @@ -828,18 +796,17 @@ msgstr "" #: scene/resources/multimesh.cpp servers/visual/visual_server_scene.cpp #: servers/visual_server.cpp msgid "Quality" -msgstr "" +msgstr "КачеÑтво" #: core/project_settings.cpp scene/gui/file_dialog.cpp #: scene/main/scene_tree.cpp scene/resources/navigation_mesh.cpp #: servers/visual_server.cpp -#, fuzzy msgid "Filters" -msgstr "Филтри:" +msgstr "Филтри" #: core/project_settings.cpp scene/main/viewport.cpp msgid "Sharpen Intensity" -msgstr "" +msgstr "ИнтензивноÑÑ‚ на изоÑтрÑнето" #: core/project_settings.cpp editor/editor_export.cpp editor/editor_node.cpp #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp @@ -855,19 +822,18 @@ msgstr "Дебъгване" #: core/project_settings.cpp main/main.cpp modules/gdscript/gdscript.cpp #: modules/visual_script/visual_script.cpp scene/resources/dynamic_font.cpp -#, fuzzy msgid "Settings" -msgstr "ÐаÑтройки:" +msgstr "ÐаÑтройки" #: core/project_settings.cpp editor/script_editor_debugger.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp msgid "Profiler" -msgstr "" +msgstr "Профайлър" #: core/project_settings.cpp #, fuzzy msgid "Max Functions" -msgstr "Преобразуване във функциÑ" +msgstr "ÐœÐ°ÐºÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸" #: core/project_settings.cpp scene/3d/vehicle_body.cpp msgid "Compression" @@ -875,31 +841,31 @@ msgstr "КомпреÑиране" #: core/project_settings.cpp msgid "Formats" -msgstr "" +msgstr "Формати" #: core/project_settings.cpp msgid "Zstd" -msgstr "" +msgstr "Zstd" #: core/project_settings.cpp msgid "Long Distance Matching" -msgstr "" +msgstr "Съвпадение на дълги разÑтоÑниÑ" #: core/project_settings.cpp msgid "Compression Level" -msgstr "" +msgstr "Ðиво на компреÑиÑ" #: core/project_settings.cpp msgid "Window Log Size" -msgstr "" +msgstr "Размер на лог прозореца" #: core/project_settings.cpp msgid "Zlib" -msgstr "" +msgstr "Zlib" #: core/project_settings.cpp msgid "Gzip" -msgstr "" +msgstr "Gzip" #: core/project_settings.cpp platform/android/export/export.cpp msgid "Android" @@ -914,26 +880,24 @@ msgid "TCP" msgstr "TCP" #: core/register_core_types.cpp -#, fuzzy msgid "Connect Timeout Seconds" -msgstr "Връзки към метода:" +msgstr "Време за Ñвързване Секунди" #: core/register_core_types.cpp msgid "Packet Peer Stream" -msgstr "" +msgstr "Брой пакети на Ñтрийм" #: core/register_core_types.cpp msgid "Max Buffer (Power of 2)" -msgstr "" +msgstr "МакÑимален размер на буфера (Ñтепен от 2)" #: core/register_core_types.cpp editor/editor_settings.cpp main/main.cpp msgid "SSL" -msgstr "" +msgstr "SSL" #: core/register_core_types.cpp main/main.cpp -#, fuzzy msgid "Certificates" -msgstr "ВертекÑи:" +msgstr "Сертификати" #: core/resource.cpp editor/dependency_editor.cpp #: editor/editor_resource_picker.cpp @@ -942,9 +906,8 @@ msgid "Resource" msgstr "РеÑурÑ" #: core/resource.cpp -#, fuzzy msgid "Local To Scene" -msgstr "ЗатварÑне на Ñцената" +msgstr "Локално на Ñцената" #: core/resource.cpp editor/dependency_editor.cpp #: editor/editor_autoload_settings.cpp editor/plugins/path_editor_plugin.cpp @@ -954,22 +917,20 @@ msgid "Path" msgstr "Път" #: core/script_language.cpp -#, fuzzy msgid "Source Code" -msgstr "Източник за полигонна мрежа:" +msgstr "Изходен код" #: core/translation.cpp editor/project_settings_editor.cpp msgid "Locale" -msgstr "" +msgstr "Локал" #: core/translation.cpp -#, fuzzy msgid "Test" -msgstr "ТеÑтово" +msgstr "ТеÑÑ‚" #: core/translation.cpp scene/resources/font.cpp msgid "Fallback" -msgstr "" +msgstr "Резервен вариант" #: core/ustring.cpp scene/resources/segment_shape_2d.cpp msgid "B" @@ -1005,12 +966,12 @@ msgstr "ЕиБ" #: drivers/gles3/rasterizer_scene_gles3.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp modules/gltf/gltf_state.cpp msgid "Buffers" -msgstr "" +msgstr "Буфери" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp msgid "Canvas Polygon Buffer Size (KB)" -msgstr "" +msgstr "Размер на буфера на полигона на канавата (KB)" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp @@ -1027,7 +988,7 @@ msgstr "" #: servers/physics_2d/space_2d_sw.cpp servers/physics_2d_server.cpp #: servers/visual_server.cpp msgid "2D" -msgstr "" +msgstr "2D" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp @@ -1055,28 +1016,27 @@ msgstr "Изпичане на карти на оÑветеноÑÑ‚" #: drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp msgid "Use Bicubic Sampling" -msgstr "" +msgstr "Ползвай Bicubic Ñемплиране" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Renderable Elements" -msgstr "" +msgstr "МакÑ. рендерируеми елементи" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Renderable Lights" -msgstr "" +msgstr "МакÑимум рендерируеми Ñветлини" #: drivers/gles3/rasterizer_scene_gles3.cpp -#, fuzzy msgid "Max Renderable Reflections" -msgstr "Центриране върху избраното" +msgstr "ÐœÐ°ÐºÑ Ñ€ÐµÐ½Ð´ÐµÑ€Ð¸Ñ€ÑƒÐµÐ¼Ð¸ отражениÑ" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Lights Per Object" -msgstr "" +msgstr "МакÑимум Ñветлини на обект" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Subsurface Scattering" -msgstr "" +msgstr "ПодповърхноÑтно разÑейване" #: drivers/gles3/rasterizer_scene_gles3.cpp editor/animation_track_editor.cpp #: editor/import/resource_importer_texture.cpp @@ -1105,7 +1065,7 @@ msgstr "" #: drivers/gles3/rasterizer_scene_gles3.cpp scene/resources/environment.cpp msgid "High Quality" -msgstr "" +msgstr "ВиÑоко качеÑтво" #: drivers/gles3/rasterizer_storage_gles3.cpp msgid "Blend Shape Max Buffer Size (KB)" @@ -1138,7 +1098,7 @@ msgstr "Вмъкване на ключ тук" #: editor/animation_bezier_editor.cpp msgid "Duplicate Selected Key(s)" -msgstr "Копиране на избран(и) ключ(ове)" +msgstr "Дупликат на избран(и) ключ(ове)" #: editor/animation_bezier_editor.cpp msgid "Delete Selected Key(s)" @@ -1192,7 +1152,7 @@ msgstr "ДобавÑне на кадър" #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp #: scene/resources/particles_material.cpp servers/visual_server.cpp msgid "Time" -msgstr "" +msgstr "Време" #: editor/animation_track_editor.cpp editor/import/resource_importer_scene.cpp #: platform/osx/export/export.cpp @@ -1220,29 +1180,31 @@ msgstr "ДобавÑне на входÑщ порт" #: editor/animation_track_editor.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp msgid "Args" -msgstr "" +msgstr "Ðргументи" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/script_editor_debugger.cpp modules/gltf/gltf_accessor.cpp #: modules/gltf/gltf_light.cpp modules/visual_script/visual_script_nodes.cpp #: scene/3d/physics_body.cpp scene/resources/visual_shader_nodes.cpp msgid "Type" -msgstr "" +msgstr "Тип" #: editor/animation_track_editor.cpp +#, fuzzy msgid "In Handle" -msgstr "" +msgstr "In Handle" #: editor/animation_track_editor.cpp +#, fuzzy msgid "Out Handle" -msgstr "" +msgstr "Out Handle" #: editor/animation_track_editor.cpp #: editor/import/resource_importer_texture.cpp #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp msgid "Stream" -msgstr "" +msgstr "Поток" #: editor/animation_track_editor.cpp #, fuzzy @@ -1265,8 +1227,9 @@ msgid "Animation" msgstr "ÐнимациÑ" #: editor/animation_track_editor.cpp +#, fuzzy msgid "Easing" -msgstr "" +msgstr "Easing" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Keyframe Time" @@ -2126,7 +2089,7 @@ msgstr "" #: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp msgid "Signals" -msgstr "" +msgstr "Сигнали" #: editor/connections_dialog.cpp msgid "Filter signals" @@ -3730,7 +3693,7 @@ msgstr "" #: editor/editor_network_profiler.cpp editor/editor_node.cpp #: scene/main/node.cpp scene/resources/default_theme/default_theme.cpp msgid "Node" -msgstr "Обект" +msgstr "Връх" #: editor/editor_network_profiler.cpp msgid "Incoming RPC" @@ -4506,6 +4469,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Проект" @@ -6949,7 +6913,7 @@ msgstr "" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp msgid "sRGB" -msgstr "" +msgstr "sRGB" #: editor/import/resource_importer_layered_texture.cpp #, fuzzy @@ -7336,7 +7300,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -8204,6 +8169,7 @@ msgstr "Режим на възпроизвеждане:" #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp +#, fuzzy msgid "AnimationTree" msgstr "AnimationTree" @@ -15161,18 +15127,19 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Име на обекта:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "Името вече е заето от друга функциÑ/променлива/Ñигнал:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Име на обекта:" #: editor/scene_tree_dock.cpp @@ -15364,6 +15331,11 @@ msgid "Button Group" msgstr "Група бутони" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Име на обекта:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Свързване от)" @@ -15427,6 +15399,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17325,6 +17301,21 @@ msgstr "Запълване на избраното" msgid "Auto Update Project" msgstr "Редактиране на проекта" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Показване на вÑичко" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Изберете папка" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Изберете папка" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Край на Ð²ÑŠÑ‚Ñ€ÐµÑˆÐ½Ð¸Ñ Ñтек на проÑледÑване за изключението" @@ -18742,14 +18733,13 @@ msgid "Code Signing" msgstr "Сигнал" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "'apksigner' could not be found. Please check that the command is available " "in the Android SDK build-tools directory. The resulting %s is unsigned." msgstr "" -"Командата „apksigner“ не може да бъде намерена.\n" -"Проверете дали командата е налична в папката „build-tools“ на Android SDK.\n" -"РезултатниÑÑ‚ файл „%s“ не е подпиÑан." +"Командата „apksigner“ не може да бъде намерена. Проверете дали командата е " +"налична в папката „build-tools“ на Android SDK. РезултатниÑÑ‚ файл „%s“ не е " +"подпиÑан." #: platform/android/export/export_plugin.cpp msgid "Signing debug %s..." @@ -18796,9 +18786,8 @@ msgid "Invalid filename! Android APK requires the *.apk extension." msgstr "Ðеправилно име! Android APK изиÑква разширение *.apk." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Unsupported export format!" -msgstr "Ðеподдържан формат за изнаÑÑне!\n" +msgstr "Ðеподдържан формат за изнаÑÑне!" #: platform/android/export/export_plugin.cpp msgid "" @@ -18821,10 +18810,8 @@ msgstr "" "името на проекта" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files to gradle project." -msgstr "" -"Файловете на проекта не могат да бъдат изнеÑени като проект на gradle.\n" +msgstr "Файловете на проекта не могат да бъдат изнеÑени като проект на gradle." #: platform/android/export/export_plugin.cpp msgid "Could not write expansion package file!" @@ -18835,15 +18822,13 @@ msgid "Building Android Project (gradle)" msgstr "Компилиране на проект за Android (gradle)" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Building of Android project failed, check output for the error. " "Alternatively visit docs.godotengine.org for Android build documentation." msgstr "" "Компилирането на проекта за Android беше неуÑпешно. Вижте изхода за " -"грешката.\n" -"Може Ñъщо да разгледате документациÑта за компилиране за Android на docs." -"godotengine.org." +"грешката. Може Ñъщо да разгледате документациÑта за компилиране за Android " +"на docs.godotengine.org." #: platform/android/export/export_plugin.cpp msgid "Moving output" @@ -18867,22 +18852,18 @@ msgid "Creating APK..." msgstr "Създаване на APK…" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not find template APK to export: \"%s\"." -msgstr "" -"Ðе е намерен шаблонен файл APK за изнаÑÑне:\n" -"%s" +msgstr "Ðе е намерен шаблонен файл APK за изнаÑÑне: %s" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Missing libraries in the export template for the selected architectures: %s. " "Please build a template with all required libraries, or uncheck the missing " "architectures in the export preset." msgstr "" -"Ð’ шаблона за изнаÑÑне липÑват библиотеки за избраните архитектури: %s.\n" -"МолÑ, Ñъздайте шаблон Ñ Ð²Ñички необходими библиотеки или махнете отметките " -"от липÑващите архитектури в конфигурациÑта за изнаÑÑне." +"Ð’ шаблона за изнаÑÑне липÑват библиотеки за избраните архитектури: %s. МолÑ, " +"Ñъздайте шаблон Ñ Ð²Ñички необходими библиотеки или махнете отметките от " +"липÑващите архитектури в конфигурациÑта за изнаÑÑне." #: platform/android/export/export_plugin.cpp msgid "Adding files..." @@ -19126,6 +19107,11 @@ msgstr "ПерÑонализиран обект" msgid "Custom BG Color" msgstr "ПерÑонализиран обект" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Задаване на отÑтъп" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -19730,10 +19716,8 @@ msgid "ZIP Creation" msgstr "Проект" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not open file to read from path \"%s\"." -msgstr "" -"Файловете на проекта не могат да бъдат изнеÑени като проект на gradle.\n" +msgstr "Файловете на проекта не могат да бъдат изнеÑени като проект на gradle." #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" @@ -19974,6 +19958,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Ðеправилно кратко име на пакет." @@ -25734,16 +25724,15 @@ msgstr "Цветове" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Preset BG" -msgstr "КонфигурациÑ…" +msgstr "Предварителна наÑтройка BG" #: scene/resources/default_theme/default_theme.cpp msgid "Overbright Indicator" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Preset FG" -msgstr "КонфигурациÑ…" +msgstr "Предварителна наÑтройка FG" #: scene/resources/default_theme/default_theme.cpp msgid "Preset BG Icon" diff --git a/editor/translations/bn.po b/editor/translations/bn.po index 6f1e8f945d..f32a090f27 100644 --- a/editor/translations/bn.po +++ b/editor/translations/bn.po @@ -4748,6 +4748,7 @@ msgstr "পà§à¦°à¦•লà§à¦ª অথবা দৃশà§à¦¯à§‡-বà§à¦¯à¦¾à¦ªà§€ #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp #, fuzzy msgid "Project" msgstr "নতà§à¦¨ পà§à¦°à¦•লà§à¦ª" @@ -7789,7 +7790,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -16332,18 +16334,19 @@ msgstr "" msgid "Make Local" msgstr "সà§à¦¥à¦¾à¦¨à§€à§Ÿ করà§à¦¨" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "নোডের নাম:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "নামটি ইতিমধà§à¦¯à§‡à¦‡ অপর ফাংশন/চলক(à¦à§‡à¦°à¦¿à¦¯à¦¼à§‡à¦¬à¦²)/সংকেত(সিগনà§à¦¯à¦¾à¦²)-ঠবà§à¦¯à¦¬à¦¹à§ƒà¦¤ হয়েছে:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "নোডের নাম:" #: editor/scene_tree_dock.cpp @@ -16560,6 +16563,11 @@ msgstr "বোতাম à§" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "নোডের নাম:" + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr "সংযোগ..." @@ -16640,6 +16648,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ নোডের নাম, নীমà§à¦¨à§‹à¦•à§à¦¤ অকà§à¦·à¦°à¦¸à¦®à§‚হ গà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ নয়:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "নোড পà§à¦¨à¦ƒà¦¨à¦¾à¦®à¦•রণ করà§à¦¨" @@ -18644,6 +18656,21 @@ msgstr "সব সিলেকà§à¦Ÿ করà§à¦¨" msgid "Auto Update Project" msgstr "নামহীন পà§à¦°à¦•লà§à¦ª" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Normal পà§à¦°à¦¦à¦°à§à¦¶à¦¨" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "à¦à¦•টি সà§à¦¥à¦¾à¦¨ পছনà§à¦¦ করà§à¦¨" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "à¦à¦•টি সà§à¦¥à¦¾à¦¨ পছনà§à¦¦ করà§à¦¨" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -20545,6 +20572,11 @@ msgstr "নোড-সমূহ করà§à¦¤à¦¨/কাট করà§à¦¨" msgid "Custom BG Color" msgstr "নোড-সমূহ করà§à¦¤à¦¨/কাট করà§à¦¨" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "ধারক/বাহক পরà§à¦¯à¦¨à§à¦¤ বিসà§à¦¤à§ƒà¦¤ করà§à¦¨" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -21398,6 +21430,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ কà§à¦²à¦¾à¦¸ নাম" diff --git a/editor/translations/br.po b/editor/translations/br.po index 823490a280..7b92059104 100644 --- a/editor/translations/br.po +++ b/editor/translations/br.po @@ -4371,6 +4371,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7071,7 +7072,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -14762,18 +14764,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Cheñch Pazenn ar Fiñvskeudenn" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Cheñch Pazenn ar Fiñvskeudenn" #: editor/scene_tree_dock.cpp @@ -14963,6 +14965,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Cheñch Pazenn ar Fiñvskeudenn" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15026,6 +15033,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -16816,6 +16827,18 @@ msgstr "" msgid "Auto Update Project" msgstr "" +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "C# Project Directory" +msgstr "" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18520,6 +18543,11 @@ msgstr "Fonksionoù :" msgid "Custom BG Color" msgstr "Fonksionoù :" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Roudenn Treuzfurmadur 3D" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19309,6 +19337,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/ca.po b/editor/translations/ca.po index 04c9b7761c..b08b3be823 100644 --- a/editor/translations/ca.po +++ b/editor/translations/ca.po @@ -4569,6 +4569,7 @@ msgstr "Eines và ries o d'escena." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projecte" @@ -7508,7 +7509,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15819,18 +15821,19 @@ msgstr "" msgid "Make Local" msgstr "Fer Local" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Nom del node:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "Nom usat en un altra funció/variable/senyal:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Nom del node:" #: editor/scene_tree_dock.cpp @@ -16034,6 +16037,11 @@ msgid "Button Group" msgstr "Grup de botons" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Nom del node:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Connectant des de)" @@ -16110,6 +16118,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "El Nom del node no és và lid. No es permeten els carà cters següents:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Reanomena el Node" @@ -18069,6 +18081,21 @@ msgstr "Omplir la Selecció" msgid "Auto Update Project" msgstr "Projecte sense nom" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Mostra-ho tot" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Tria un Directori" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Tria un Directori" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Final de la traça de la pila d'excepció interna" @@ -19976,6 +20003,11 @@ msgstr "Talla els Nodes" msgid "Custom BG Color" msgstr "Talla els Nodes" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Expandir tot" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20832,6 +20864,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "El nom curt del paquet no és và lid." diff --git a/editor/translations/cs.po b/editor/translations/cs.po index 1e92a92ae7..01c28b207e 100644 --- a/editor/translations/cs.po +++ b/editor/translations/cs.po @@ -30,13 +30,15 @@ # Jakub JanÅ¡ta <jansta.ja@gmail.com>, 2021. # Petr Voparil <voparil.petr96@gmail.com>, 2022. # JoeMoos <josephmoose13@gmail.com>, 2022. +# Mirinek <mirek.nozicka77@gmail.com>, 2022. +# LubomÃr Baloun <lubosbaloun@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-04-08 07:29+0000\n" -"Last-Translator: ZbynÄ›k <zbynek.fiala@gmail.com>\n" +"PO-Revision-Date: 2022-09-19 05:22+0000\n" +"Last-Translator: LubomÃr Baloun <lubosbaloun@gmail.com>\n" "Language-Team: Czech <https://hosted.weblate.org/projects/godot-engine/godot/" "cs/>\n" "Language: cs\n" @@ -44,11 +46,11 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.12-dev\n" +"X-Generator: Weblate 4.14.1\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" -msgstr "" +msgstr "OvladaÄ Grafického Tabletu" #: core/bind/core_bind.cpp msgid "Clipboard" @@ -65,11 +67,11 @@ msgstr "Kód pro ukonÄenà (exit code)" #: core/bind/core_bind.cpp #, fuzzy msgid "V-Sync Enabled" -msgstr "Povolit" +msgstr "V-Sync Zapnutý" #: core/bind/core_bind.cpp main/main.cpp msgid "V-Sync Via Compositor" -msgstr "" +msgstr "V-Sync Pomocà Kompozitoru" #: core/bind/core_bind.cpp main/main.cpp msgid "Delta Smoothing" @@ -78,7 +80,7 @@ msgstr "" #: core/bind/core_bind.cpp #, fuzzy msgid "Low Processor Usage Mode" -msgstr "Režim pÅ™esouvánÃ" +msgstr "Režim NÃzkého Využità Procesoru" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode Sleep (µsec)" @@ -90,14 +92,12 @@ msgid "Keep Screen On" msgstr "Nechat ladÃcà program otevÅ™ený" #: core/bind/core_bind.cpp -#, fuzzy msgid "Min Window Size" -msgstr "Velikost obrysu:" +msgstr "Minimálnà Velikost Okna" #: core/bind/core_bind.cpp -#, fuzzy msgid "Max Window Size" -msgstr "Velikost obrysu:" +msgstr "Maximálnà Velikost Okna" #: core/bind/core_bind.cpp #, fuzzy @@ -116,8 +116,9 @@ msgid "Borderless" msgstr "HraniÄnà pixely" #: core/bind/core_bind.cpp +#, fuzzy msgid "Per Pixel Transparency Enabled" -msgstr "" +msgstr "Per Pixel Průhlednost Aktivována" #: core/bind/core_bind.cpp core/project_settings.cpp #, fuzzy @@ -136,7 +137,7 @@ msgstr "Inicializovat" #: core/bind/core_bind.cpp core/project_settings.cpp scene/gui/dialogs.cpp #: scene/gui/graph_node.cpp msgid "Resizable" -msgstr "" +msgstr "PÅ™izpůsobitelná velikost" #: core/bind/core_bind.cpp core/os/input_event.cpp scene/2d/node_2d.cpp #: scene/2d/physics_body_2d.cpp scene/2d/remote_transform_2d.cpp @@ -170,7 +171,7 @@ msgstr "Editor" #: core/bind/core_bind.cpp msgid "Print Error Messages" -msgstr "" +msgstr "Vypsat chybové hlášky" #: core/bind/core_bind.cpp #, fuzzy @@ -183,9 +184,8 @@ msgid "Target FPS" msgstr "CÃl" #: core/bind/core_bind.cpp -#, fuzzy msgid "Time Scale" -msgstr "Uzel TimeScale" +msgstr "ÄŒasová Osa" #: core/bind/core_bind.cpp main/main.cpp #, fuzzy @@ -213,7 +213,7 @@ msgstr "Výsledky hledánÃ" #: core/command_queue_mt.cpp core/message_queue.cpp main/main.cpp msgid "Memory" -msgstr "" +msgstr "Paměť" #: core/command_queue_mt.cpp core/message_queue.cpp #: core/register_core_types.cpp drivers/gles2/rasterizer_canvas_base_gles2.cpp @@ -229,11 +229,11 @@ msgstr "" #: core/command_queue_mt.cpp #, fuzzy msgid "Command Queue" -msgstr "PÅ™Ãkaz: OtoÄit" +msgstr "Fronta PÅ™Ãkazů" #: core/command_queue_mt.cpp msgid "Multithreading Queue Size (KB)" -msgstr "" +msgstr "Velikost vÃcevláknové fronty (KB)" #: core/func_ref.cpp modules/visual_script/visual_script_builtin_funcs.cpp #: modules/visual_script/visual_script_func_nodes.cpp @@ -263,9 +263,8 @@ msgid "Remote FS" msgstr "Vzdálený " #: core/io/file_access_network.cpp -#, fuzzy msgid "Page Size" -msgstr "Strana: " +msgstr "Velikost Stránky" #: core/io/file_access_network.cpp msgid "Page Read Ahead" @@ -292,11 +291,11 @@ msgstr "Kreslené objekty:" #: core/io/multiplayer_api.cpp core/io/packet_peer.cpp #, fuzzy msgid "Allow Object Decoding" -msgstr "Povolit Onion Skinning" +msgstr "Povolit Dekódovánà Objektu" #: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp msgid "Refuse New Network Connections" -msgstr "" +msgstr "OdmÃtnout nová sÃÅ¥ová pÅ™ipojenÃ" #: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp #, fuzzy @@ -309,9 +308,8 @@ msgid "Root Node" msgstr "Název koÅ™enového uzlu" #: core/io/networked_multiplayer_peer.cpp -#, fuzzy msgid "Refuse New Connections" -msgstr "PÅ™ipojit" +msgstr "OdmÃtnout Nová PÅ™ipojenÃ" #: core/io/networked_multiplayer_peer.cpp #, fuzzy @@ -398,8 +396,9 @@ msgstr "PÅ™i volánà '%s':" #: core/math/random_number_generator.cpp #: modules/opensimplex/open_simplex_noise.cpp +#, fuzzy msgid "Seed" -msgstr "" +msgstr "Seed" #: core/math/random_number_generator.cpp #, fuzzy @@ -412,7 +411,7 @@ msgstr "" #: core/message_queue.cpp msgid "Max Size (KB)" -msgstr "" +msgstr "Maximálnà Velikost (KB)" #: core/os/input.cpp #, fuzzy @@ -435,8 +434,9 @@ msgid "Alt" msgstr "vÅ¡ichni" #: core/os/input_event.cpp +#, fuzzy msgid "Shift" -msgstr "" +msgstr "Shift" #: core/os/input_event.cpp #, fuzzy @@ -450,7 +450,7 @@ msgstr "" #: core/os/input_event.cpp #, fuzzy msgid "Command" -msgstr "Komunita" +msgstr "PÅ™Ãkaz" #: core/os/input_event.cpp #, fuzzy @@ -462,7 +462,7 @@ msgstr "Fyzická Klávesa" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Pressed" -msgstr "Profil" +msgstr "Stisknuté" #: core/os/input_event.cpp #, fuzzy @@ -475,8 +475,9 @@ msgid "Physical Scancode" msgstr "Fyzická Klávesa" #: core/os/input_event.cpp +#, fuzzy msgid "Unicode" -msgstr "" +msgstr "Unicode" #: core/os/input_event.cpp msgid "Echo" @@ -488,9 +489,8 @@ msgid "Button Mask" msgstr "TlaÄÃtko" #: core/os/input_event.cpp scene/2d/node_2d.cpp scene/gui/control.cpp -#, fuzzy msgid "Global Position" -msgstr "KonstantnÃ" +msgstr "Globálnà Pozice" #: core/os/input_event.cpp #, fuzzy @@ -503,12 +503,14 @@ msgid "Button Index" msgstr "Index tlaÄÃtka myÅ¡i:" #: core/os/input_event.cpp +#, fuzzy msgid "Doubleclick" -msgstr "" +msgstr "Dvojklik" #: core/os/input_event.cpp +#, fuzzy msgid "Tilt" -msgstr "" +msgstr "Sklon" #: core/os/input_event.cpp #, fuzzy @@ -556,11 +558,12 @@ msgstr "Akce" #: core/os/input_event.cpp scene/resources/environment.cpp #: scene/resources/material.cpp msgid "Strength" -msgstr "" +msgstr "SÃla" #: core/os/input_event.cpp +#, fuzzy msgid "Delta" -msgstr "" +msgstr "Delta" #: core/os/input_event.cpp #, fuzzy @@ -648,12 +651,12 @@ msgstr "Hlavnà scéna" #: core/project_settings.cpp #, fuzzy msgid "Disable stdout" -msgstr "Deaktivovat Autotile" +msgstr "Deaktivovat stdout" #: core/project_settings.cpp #, fuzzy msgid "Disable stderr" -msgstr "Deaktivovaná položka" +msgstr "Deaktivovat stderr" #: core/project_settings.cpp msgid "Use Hidden Project Data Directory" @@ -678,7 +681,7 @@ msgstr "Zobrazit vÅ¡echny" #: modules/opensimplex/noise_texture.cpp scene/2d/line_2d.cpp #: scene/3d/label_3d.cpp scene/gui/text_edit.cpp scene/resources/texture.cpp msgid "Width" -msgstr "" +msgstr "Å ÃÅ™ka" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/gltf/gltf_node.cpp modules/opensimplex/noise_texture.cpp @@ -686,13 +689,13 @@ msgstr "" #: scene/resources/capsule_shape_2d.cpp scene/resources/cylinder_shape.cpp #: scene/resources/font.cpp scene/resources/navigation_mesh.cpp #: scene/resources/primitive_meshes.cpp scene/resources/texture.cpp -#, fuzzy msgid "Height" -msgstr "SvÄ›tlo" +msgstr "Výška" #: core/project_settings.cpp +#, fuzzy msgid "Always On Top" -msgstr "" +msgstr "Vždy na hoÅ™e" #: core/project_settings.cpp #, fuzzy @@ -757,7 +760,7 @@ msgstr "PÅ™idat vstup" #: core/project_settings.cpp msgid "UI Accept" -msgstr "" +msgstr "Potvrdit" #: core/project_settings.cpp #, fuzzy @@ -790,8 +793,9 @@ msgid "UI Right" msgstr "Vpravo nahoÅ™e" #: core/project_settings.cpp +#, fuzzy msgid "UI Up" -msgstr "" +msgstr "NahoÅ™e" #: core/project_settings.cpp #, fuzzy @@ -836,7 +840,7 @@ msgstr "Fyzikálnà snÃmek %" #: scene/3d/physics_body.cpp scene/resources/world.cpp #: servers/physics/space_sw.cpp servers/physics_server.cpp msgid "3D" -msgstr "" +msgstr "3D" #: core/project_settings.cpp #, fuzzy @@ -864,7 +868,7 @@ msgstr "VykreslovaÄ:" #: scene/resources/multimesh.cpp servers/visual/visual_server_scene.cpp #: servers/visual_server.cpp msgid "Quality" -msgstr "" +msgstr "Kvalita" #: core/project_settings.cpp scene/gui/file_dialog.cpp #: scene/main/scene_tree.cpp scene/resources/navigation_mesh.cpp @@ -874,8 +878,9 @@ msgid "Filters" msgstr "Filtry:" #: core/project_settings.cpp scene/main/viewport.cpp +#, fuzzy msgid "Sharpen Intensity" -msgstr "" +msgstr "Intenzita ZaostÅ™enÃ" #: core/project_settings.cpp editor/editor_export.cpp editor/editor_node.cpp #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp @@ -924,8 +929,9 @@ msgid "Long Distance Matching" msgstr "" #: core/project_settings.cpp +#, fuzzy msgid "Compression Level" -msgstr "" +msgstr "Úroveň Komprese" #: core/project_settings.cpp msgid "Window Log Size" @@ -937,19 +943,20 @@ msgstr "" #: core/project_settings.cpp msgid "Gzip" -msgstr "" +msgstr "Gzip" #: core/project_settings.cpp platform/android/export/export.cpp msgid "Android" -msgstr "" +msgstr "Android" #: core/project_settings.cpp msgid "Modules" -msgstr "" +msgstr "Moduly" #: core/register_core_types.cpp +#, fuzzy msgid "TCP" -msgstr "" +msgstr "TCP" #: core/register_core_types.cpp #, fuzzy @@ -966,12 +973,11 @@ msgstr "" #: core/register_core_types.cpp editor/editor_settings.cpp main/main.cpp msgid "SSL" -msgstr "" +msgstr "SSL" #: core/register_core_types.cpp main/main.cpp -#, fuzzy msgid "Certificates" -msgstr "Vrcholy:" +msgstr "Certifikáty" #: core/resource.cpp editor/dependency_editor.cpp #: editor/editor_resource_picker.cpp @@ -1042,8 +1048,9 @@ msgstr "EiB" #: drivers/gles3/rasterizer_canvas_base_gles3.cpp #: drivers/gles3/rasterizer_scene_gles3.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp modules/gltf/gltf_state.cpp +#, fuzzy msgid "Buffers" -msgstr "" +msgstr "Vyrovnávacà PamÄ›ti" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp @@ -1065,7 +1072,7 @@ msgstr "" #: servers/physics_2d/space_2d_sw.cpp servers/physics_2d_server.cpp #: servers/visual_server.cpp msgid "2D" -msgstr "" +msgstr "2D" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp @@ -1144,7 +1151,7 @@ msgstr "" #: drivers/gles3/rasterizer_scene_gles3.cpp scene/resources/environment.cpp msgid "High Quality" -msgstr "" +msgstr "Vysoká Kvalita" #: drivers/gles3/rasterizer_storage_gles3.cpp msgid "Blend Shape Max Buffer Size (KB)" @@ -4645,6 +4652,7 @@ msgstr "Různé nástroje pro projekt nebo scény." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projekt" @@ -7576,7 +7584,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15659,18 +15668,19 @@ msgstr "" msgid "Make Local" msgstr "ZmÄ›nit na lokálnÃ" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Název uzlu:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "Jméno už je použito jinou funkcÃ/promÄ›nnou/signálem:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Název uzlu:" #: editor/scene_tree_dock.cpp @@ -15868,6 +15878,11 @@ msgid "Button Group" msgstr "Skupina tlaÄÃtek" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Název uzlu:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(PÅ™ipojovánà z)" @@ -15943,6 +15958,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "Neplatný název uzlu, následujÃcà znaky nejsou povoleny:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "PÅ™ejmenovat uzel" @@ -17871,6 +17890,21 @@ msgstr "Vyplnit výbÄ›r" msgid "Auto Update Project" msgstr "Nepojmenovaný projekt" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Zobrazit vÅ¡echny" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Vyberte složku" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Vyberte složku" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Konec zásobnÃku trasovánà vnitÅ™nà výjimky" @@ -19742,6 +19776,11 @@ msgstr "Vyjmout uzly" msgid "Custom BG Color" msgstr "Vyjmout uzly" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Rozbalit vÅ¡e" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20596,6 +20635,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Neplatné krátké jméno balÃÄku." @@ -28481,9 +28526,8 @@ msgid "Ninepatch Mode" msgstr "InterpolaÄnà režim" #: servers/visual_server.cpp -#, fuzzy msgid "OpenGL" -msgstr "OtevÅ™Ãt" +msgstr "OpenGL" #: servers/visual_server.cpp msgid "Batching Send Null" diff --git a/editor/translations/da.po b/editor/translations/da.po index 1bb05be6f9..e83ef150e4 100644 --- a/editor/translations/da.po +++ b/editor/translations/da.po @@ -4697,6 +4697,7 @@ msgstr "Diverse projekt eller scene redskaber." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projekt" @@ -7636,7 +7637,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15864,18 +15866,19 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Node Navn:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "Navnet allerede bruges af en anden func/var/signal:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Node Navn:" #: editor/scene_tree_dock.cpp @@ -16083,6 +16086,11 @@ msgstr "Føj til Gruppe" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Node Navn:" + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr "Forbindelses fejl" @@ -16147,6 +16155,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -18072,6 +18084,21 @@ msgstr "All selection" msgid "Auto Update Project" msgstr "Eksporter Projekt" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Vis alle" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Vælg en Mappe" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Vælg en Mappe" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19921,6 +19948,11 @@ msgstr "Indsæt Node" msgid "Custom BG Color" msgstr "Indsæt Node" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Udvid alle" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20770,6 +20802,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "Ugyldigt navn." diff --git a/editor/translations/de.po b/editor/translations/de.po index aa92914ada..7244c02cc1 100644 --- a/editor/translations/de.po +++ b/editor/translations/de.po @@ -83,13 +83,16 @@ # Sajeg <jfx@posteo.de>, 2022. # Tobias Jacobs <tobi@jacobs.rocks>, 2022. # JeremyStarTM <jeremystartm@tuta.io>, 2022. +# Tim <sakul8826@gmail.com>, 2022. +# Anonynonymouse <tom.spaine60388@gmail.com>, 2022. +# Felix Bitsch <felix.a.bitsch@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-31 18:34+0000\n" -"Last-Translator: JeremyStarTM <jeremystartm@tuta.io>\n" +"PO-Revision-Date: 2022-09-11 22:22+0000\n" +"Last-Translator: So Wieso <sowieso@dukun.de>\n" "Language-Team: German <https://hosted.weblate.org/projects/godot-engine/" "godot/de/>\n" "Language: de\n" @@ -97,7 +100,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -478,7 +481,7 @@ msgstr "Gedrückt" #: core/os/input_event.cpp msgid "Scancode" -msgstr "Tastencode" +msgstr "Scancode" #: core/os/input_event.cpp msgid "Physical Scancode" @@ -1633,7 +1636,7 @@ msgstr "Methodenaufrufsspurschlüssel hinzufügen" #: editor/animation_track_editor.cpp msgid "Method not found in object:" -msgstr "Methode im Objekt nicht gefunden:" +msgstr "Methode nicht im Objekt gefunden:" #: editor/animation_track_editor.cpp msgid "Anim Move Keys" @@ -2815,9 +2818,8 @@ msgid "Project export for platform:" msgstr "Projektexport für Plattform:" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with warnings." -msgstr "Fertiggestellt mit Fehlern." +msgstr "Unter Warnungen fertiggestellt." #: editor/editor_export.cpp msgid "Completed successfully." @@ -3501,7 +3503,7 @@ msgstr "Stile" #: editor/editor_help.cpp msgid "Enumerations" -msgstr "Aufzählungstypen" +msgstr "Aufzählungen" #: editor/editor_help.cpp msgid "Property Descriptions" @@ -4564,6 +4566,7 @@ msgstr "Sonstiges Projekt oder szenenübergreifende Werkzeuge." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projekt" @@ -5462,7 +5465,7 @@ msgstr "Vorschaubildgröße" #: editor/editor_settings.cpp msgid "Docks" -msgstr "Leisten" +msgstr "Docks" #: editor/editor_settings.cpp msgid "Scene Tree" @@ -5571,7 +5574,7 @@ msgstr "Auswahl ziehen und fallen lassen" #: editor/editor_settings.cpp msgid "Stay In Script Editor On Node Selected" -msgstr "Im Skript Editor bei ausgewähltem Node bleiben" +msgstr "Im Skript-Editor bei ausgewähltem Node bleiben" #: editor/editor_settings.cpp msgid "Appearance" @@ -7339,7 +7342,8 @@ msgid "8 Bit" msgstr "8-Bit" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "Mono" @@ -15359,18 +15363,19 @@ msgstr "" msgid "Make Local" msgstr "Lokal machen" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" -"Ein anderes Node nutzt schon diesen einzigartigen Namen in dieser Szene." +#: editor/scene_tree_dock.cpp +msgid "Enable Scene Unique Name(s)" +msgstr "Szenen-eindeutige(n) Namen aktivieren" #: editor/scene_tree_dock.cpp -msgid "Enable Scene Unique Name" -msgstr "Szenen-eindeutigen Namen aktivieren" +msgid "Unique names already used by another node in the scene:" +msgstr "" +"Einzigartige Namen, die bereits von anderen Nodes dieser Szene verwendet " +"werden:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Disable Scene Unique Name" -msgstr "Szenen-eindeutigen Namen deaktivieren" +#: editor/scene_tree_dock.cpp +msgid "Disable Scene Unique Name(s)" +msgstr "Szenen-eindeutige(n) Namen deaktivieren" #: editor/scene_tree_dock.cpp msgid "New Scene Root" @@ -15569,6 +15574,10 @@ msgid "Button Group" msgstr "Knopf-Gruppe" #: editor/scene_tree_editor.cpp +msgid "Disable Scene Unique Name" +msgstr "Szenen-eindeutigen Namen deaktivieren" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Verbindung von)" @@ -15648,6 +15657,11 @@ msgstr "" "Ungültiger Name für ein Node, die folgenden Zeichen sind nicht gestattet:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" +"Ein anderes Node nutzt schon diesen einzigartigen Namen in dieser Szene." + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Node umbenennen" @@ -17427,6 +17441,18 @@ msgstr "Solution bauen" msgid "Auto Update Project" msgstr "Projekt automatisch aktualisieren" +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "Assembly-Name" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "Solution-Verzeichnis" + +#: modules/mono/godotsharp_dirs.cpp +msgid "C# Project Directory" +msgstr "C#-Projektverzeichnis" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Ende des inneren Exception-Stack-Traces" @@ -19192,6 +19218,10 @@ msgstr "Eigene Hintergrundfarbe verwenden" msgid "Custom BG Color" msgstr "Eigene Hintergrundfarbe" +#: platform/iphone/export/export.cpp +msgid "Export Icons" +msgstr "Export-Icons" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19653,8 +19683,8 @@ msgid "" "Could not start codesign executable, make sure Xcode command line tools are " "installed." msgstr "" -"Codesign-Anwendung konnte nicht gestartet werden, stelle sicher dass die " -"Xcode-Kommandozeilen-Tools installiert sind." +"Codesign-Anwendung konnte nicht gestartet werden, bitte sicher stellen dass " +"die Xcode-Kommandozeilen-Hilfsprogramme installiert sind." #: platform/osx/export/export.cpp platform/windows/export/export.cpp msgid "No identity found." @@ -20022,6 +20052,15 @@ msgid "Show Name On Square 310 X 310" msgstr "Zeige Name bei Viereck 310 X 310" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" +"Die von Godot genutzte Mono-Version unterstützt die UWP-Plattform nicht. " +"Falls UWP-Unterstützung erforderlich ist, muss Standard-Godot (ohne C#-" +"Unterstützung) verwendet werden." + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Ungültiger Paket-Kurzname." @@ -20146,21 +20185,19 @@ msgid "Could not find wine executable at \"%s\"." msgstr "Anwendung wine konnte nicht gefunden werden in „%s“." #: platform/windows/export/export.cpp -#, fuzzy msgid "" "Could not start rcedit executable. Configure rcedit path in the Editor " "Settings (Export > Windows > Rcedit), or disable \"Application > Modify " "Resources\" in the export preset." msgstr "" "Anwendung rcedit konnte nicht gestartet werden. Bitte rcedit-Pfad in " -"Editoreinstellungen festlegen (Export > Windows > Rcedit)." +"Editoreinstellungen festlegen (Export > Windows > Rcedit) oder die " +"Einstellung „Application > Modify Resources“ in der Exportvorlage " +"deaktivieren." #: platform/windows/export/export.cpp -#, fuzzy msgid "rcedit failed to modify executable: %s." -msgstr "" -"Modifikation der Anwendung durch rcedit fehlgeschlagen:\n" -"%s" +msgstr "Modifikation der Anwendung durch rcedit fehlgeschlagen: %s." #: platform/windows/export/export.cpp msgid "Could not find signtool executable at \"%s\"." @@ -20179,21 +20216,18 @@ msgid "Invalid timestamp server." msgstr "Ungültiger Zeitstempelserver." #: platform/windows/export/export.cpp -#, fuzzy msgid "" "Could not start signtool executable. Configure signtool path in the Editor " "Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " "export preset." msgstr "" "Anwendung signtool konnte nicht gestartet werden. Bitte signtool-Pfad in " -"Editoreinstellungen festlegen (Export > Windows > Signtool)." +"Editoreinstellungen festlegen (Export > Windows > Signtool) oder Einstellung " +"„Codesign“ in Exportvorlage deaktivieren." #: platform/windows/export/export.cpp -#, fuzzy msgid "Signtool failed to sign executable: %s." -msgstr "" -"Signieren der Anwendung durch Signtool ist fehlgeschlagen:\n" -"%s" +msgstr "Signieren der Anwendung durch Signtool ist fehlgeschlagen: %s." #: platform/windows/export/export.cpp msgid "Failed to remove temporary file \"%s\"." diff --git a/editor/translations/editor.pot b/editor/translations/editor.pot index 23c58c5ffb..fb76a2c2c7 100644 --- a/editor/translations/editor.pot +++ b/editor/translations/editor.pot @@ -4315,6 +4315,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -6983,7 +6984,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -14642,16 +14644,16 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." +#: editor/scene_tree_dock.cpp +msgid "Enable Scene Unique Name(s)" msgstr "" #: editor/scene_tree_dock.cpp -msgid "Enable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Disable Scene Unique Name" +#: editor/scene_tree_dock.cpp +msgid "Disable Scene Unique Name(s)" msgstr "" #: editor/scene_tree_dock.cpp @@ -14841,6 +14843,10 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Disable Scene Unique Name" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -14904,6 +14910,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -16677,6 +16687,18 @@ msgstr "" msgid "Auto Update Project" msgstr "" +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "C# Project Directory" +msgstr "" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18358,6 +18380,10 @@ msgstr "" msgid "Custom BG Color" msgstr "" +#: platform/iphone/export/export.cpp +msgid "Export Icons" +msgstr "" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19133,6 +19159,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/el.po b/editor/translations/el.po index 4b71ed8528..3ab08f3dbd 100644 --- a/editor/translations/el.po +++ b/editor/translations/el.po @@ -4612,6 +4612,7 @@ msgstr "Λοιπά ÎÏγα ή εÏγαλεία για όλη τη σκηνή." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "ΈÏγο" @@ -7583,7 +7584,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15791,18 +15793,19 @@ msgstr "" msgid "Make Local" msgstr "Κάνε τοπικό" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Όνομα κόμβου:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "Το όνομα χÏησιμοποιείται ήδη από μία άλλη συνάÏτηση/μεταβλητή/σήμα:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Όνομα κόμβου:" #: editor/scene_tree_dock.cpp @@ -16006,6 +16009,11 @@ msgid "Button Group" msgstr "Ομαδοποίηση Κουμπιών" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Όνομα κόμβου:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Πηγή ΣÏνδεση)" @@ -16081,6 +16089,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "ΆκυÏο όνομα κόμβου, οι ακόλουθοι χαÏακτήÏες δεν επιτÏÎπονται:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Μετονομασία κόμβου" @@ -18019,6 +18031,21 @@ msgstr "ΓÎμισμα Επιλογής" msgid "Auto Update Project" msgstr "Ανώνυμο ÎÏγο" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Εμφάνιση όλων" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "ΕπιλÎξτε Îνα λεξικό" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "ΕπιλÎξτε Îνα λεξικό" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "ΤÎλος ιχνηλάτησης στοίβας εσωτεÏικής εξαίÏεσης" @@ -19913,6 +19940,11 @@ msgstr "Αποκοπή κόμβων" msgid "Custom BG Color" msgstr "Αποκοπή κόμβων" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Ανάπτυξη Όλων" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20769,6 +20801,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "ΆκυÏο σÏντομο όνομα πακÎτου." diff --git a/editor/translations/en_Shaw.po b/editor/translations/en_Shaw.po index 361c10ce1a..63ce9ca3d5 100644 --- a/editor/translations/en_Shaw.po +++ b/editor/translations/en_Shaw.po @@ -4341,6 +4341,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7028,7 +7029,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -14704,18 +14706,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "ð‘—ð‘±ð‘¯ð‘¡ ð‘¨ð‘¯ð‘¦ð‘¥ð‘±ð‘–ð‘©ð‘¯ ð‘¤ð‘§ð‘™ð‘’ð‘”" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "ð‘—ð‘±ð‘¯ð‘¡ ð‘¨ð‘¯ð‘¦ð‘¥ð‘±ð‘–ð‘©ð‘¯ ð‘¤ð‘§ð‘™ð‘’ð‘”" #: editor/scene_tree_dock.cpp @@ -14905,6 +14907,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "ð‘—ð‘±ð‘¯ð‘¡ ð‘¨ð‘¯ð‘¦ð‘¥ð‘±ð‘–ð‘©ð‘¯ ð‘¤ð‘§ð‘™ð‘’ð‘”" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -14968,6 +14975,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -16747,6 +16758,18 @@ msgstr "" msgid "Auto Update Project" msgstr "" +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "C# Project Directory" +msgstr "" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18443,6 +18466,11 @@ msgstr "ð‘“ð‘³ð‘™ð‘’ð‘–ð‘©ð‘¯ð‘Ÿ:" msgid "Custom BG Color" msgstr "ð‘“ð‘³ð‘™ð‘’ð‘–ð‘©ð‘¯ð‘Ÿ:" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "3-ð‘› ð‘‘ð‘®ð‘¨ð‘¯ð‘•ð‘“ð‘¹ð‘¥ ð‘‘ð‘®ð‘¨ð‘’" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19229,6 +19257,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/eo.po b/editor/translations/eo.po index 0139382972..2bcbc62274 100644 --- a/editor/translations/eo.po +++ b/editor/translations/eo.po @@ -19,7 +19,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-06-03 02:51+0000\n" +"PO-Revision-Date: 2022-08-21 06:01+0000\n" "Last-Translator: Kedr <lava20121991@gmail.com>\n" "Language-Team: Esperanto <https://hosted.weblate.org/projects/godot-engine/" "godot/eo/>\n" @@ -27,12 +27,11 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: core/bind/core_bind.cpp main/main.cpp -#, fuzzy msgid "Tablet Driver" -msgstr "Pelilo de tabulo" +msgstr "Pelilo de e-tabulo" #: core/bind/core_bind.cpp msgid "Clipboard" @@ -72,14 +71,12 @@ msgid "Keep Screen On" msgstr "" #: core/bind/core_bind.cpp -#, fuzzy msgid "Min Window Size" -msgstr "Grando de konturo:" +msgstr "Minimuma fenestra grando" #: core/bind/core_bind.cpp -#, fuzzy msgid "Max Window Size" -msgstr "Grando de konturo:" +msgstr "Maksimuma fenestra grando" #: core/bind/core_bind.cpp #, fuzzy @@ -138,9 +135,8 @@ msgstr "Pozicio de doko" #: scene/resources/primitive_meshes.cpp scene/resources/sky.cpp #: scene/resources/style_box.cpp scene/resources/texture.cpp #: scene/resources/visual_shader.cpp servers/visual_server.cpp -#, fuzzy msgid "Size" -msgstr "Grando: " +msgstr "Grando" #: core/bind/core_bind.cpp msgid "Endian Swap" @@ -166,9 +162,8 @@ msgid "Target FPS" msgstr "Celo" #: core/bind/core_bind.cpp -#, fuzzy msgid "Time Scale" -msgstr "Skalo:" +msgstr "Skalo de tempo" #: core/bind/core_bind.cpp main/main.cpp #, fuzzy @@ -180,14 +175,12 @@ msgid "Error" msgstr "" #: core/bind/core_bind.cpp -#, fuzzy msgid "Error String" -msgstr "Eraro dum movado de:" +msgstr "Literĉeno de eraro" #: core/bind/core_bind.cpp -#, fuzzy msgid "Error Line" -msgstr "Eraro dum movado de:" +msgstr "Lineo de eraroj" #: core/bind/core_bind.cpp #, fuzzy @@ -221,9 +214,8 @@ msgstr "" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Function" -msgstr "Funkcioj:" +msgstr "Funkcio" #: core/image.cpp core/packed_data_container.cpp scene/2d/polygon_2d.cpp #: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp @@ -240,14 +232,12 @@ msgid "Network" msgstr "Reta Profililo" #: core/io/file_access_network.cpp -#, fuzzy msgid "Remote FS" -msgstr "Fora " +msgstr "Fora DS" #: core/io/file_access_network.cpp -#, fuzzy msgid "Page Size" -msgstr "PaÄo: " +msgstr "Grando de paÄo" #: core/io/file_access_network.cpp msgid "Page Read Ahead" @@ -285,9 +275,8 @@ msgid "Network Peer" msgstr "Reta Profililo" #: core/io/multiplayer_api.cpp scene/animation/animation_player.cpp -#, fuzzy msgid "Root Node" -msgstr "Krei radikan nodon:" +msgstr "Radika nodo" #: core/io/networked_multiplayer_peer.cpp #, fuzzy @@ -328,9 +317,8 @@ msgid "Blocking Handshake" msgstr "" #: core/io/udp_server.cpp -#, fuzzy msgid "Max Pending Connections" -msgstr "Redakti Konekton:" +msgstr "Maksimuma kvanto de atendeblaj konektoj" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -475,9 +463,8 @@ msgid "Factor" msgstr "" #: core/os/input_event.cpp -#, fuzzy msgid "Button Index" -msgstr "Indekso de musbutono:" +msgstr "Indekso de butono" #: core/os/input_event.cpp msgid "Doubleclick" @@ -505,9 +492,8 @@ msgstr "Kapti relative" #: scene/3d/cpu_particles.cpp scene/3d/interpolated_camera.cpp #: scene/animation/animation_player.cpp scene/resources/environment.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Speed" -msgstr "Skalo:" +msgstr "Rapideco" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: scene/3d/sprite_3d.cpp @@ -520,9 +506,8 @@ msgid "Axis Value" msgstr "(valoro)" #: core/os/input_event.cpp modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Index" -msgstr "Indekso:" +msgstr "Indekso" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: modules/visual_script/visual_script_nodes.cpp @@ -550,9 +535,8 @@ msgid "Message" msgstr "ÅœanÄu" #: core/os/input_event.cpp -#, fuzzy msgid "Pitch" -msgstr "Skalo:" +msgstr "Alteco" #: core/os/input_event.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/physics_body_2d.cpp scene/3d/cpu_particles.cpp @@ -565,9 +549,8 @@ msgid "Instrument" msgstr "" #: core/os/input_event.cpp -#, fuzzy msgid "Controller Number" -msgstr "Lineo-Numeron:" +msgstr "Numero de kontrolilo" #: core/os/input_event.cpp msgid "Controller Value" @@ -586,9 +569,8 @@ msgid "Config" msgstr "Agordi kapton" #: core/project_settings.cpp -#, fuzzy msgid "Project Settings Override" -msgstr "Projektaj agordoj..." +msgstr "Redifino de projekta agordoj" #: core/project_settings.cpp core/resource.cpp #: editor/animation_track_editor.cpp editor/editor_autoload_settings.cpp @@ -683,9 +665,8 @@ msgid "Audio" msgstr "AÅdio" #: core/project_settings.cpp -#, fuzzy msgid "Default Bus Layout" -msgstr "Åœargi la defaÅlta busaranÄo." +msgstr "BusaranÄo je defaÅlto" #: core/project_settings.cpp editor/editor_export.cpp #: editor/editor_file_system.cpp editor/editor_node.cpp @@ -695,14 +676,12 @@ msgid "Editor" msgstr "Redaktilo" #: core/project_settings.cpp -#, fuzzy msgid "Main Run Args" -msgstr "Parametroj de ĉefa sceno:" +msgstr "Bazaj parametroj de lanĉo" #: core/project_settings.cpp -#, fuzzy msgid "Scene Naming" -msgstr "Scena dosierindiko:" +msgstr "Nomado de scenoj" #: core/project_settings.cpp msgid "Search In File Extensions" @@ -733,9 +712,8 @@ msgid "UI Accept" msgstr "" #: core/project_settings.cpp -#, fuzzy msgid "UI Select" -msgstr "Elekti" +msgstr "UI Elekti" #: core/project_settings.cpp #, fuzzy @@ -772,9 +750,8 @@ msgid "UI Down" msgstr "ElÅuta" #: core/project_settings.cpp -#, fuzzy msgid "UI Page Up" -msgstr "PaÄo: " +msgstr "UI paÄon supren" #: core/project_settings.cpp msgid "UI Page Down" @@ -825,9 +802,8 @@ msgstr "Krei fratan triangulo-maÅan kolizifiguron" #: modules/lightmapper_cpu/register_types.cpp scene/main/scene_tree.cpp #: scene/main/viewport.cpp servers/visual/visual_server_scene.cpp #: servers/visual_server.cpp -#, fuzzy msgid "Rendering" -msgstr "Bildigilo:" +msgstr "Bildigo" #: core/project_settings.cpp drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_scene_gles3.cpp @@ -842,9 +818,8 @@ msgstr "" #: core/project_settings.cpp scene/gui/file_dialog.cpp #: scene/main/scene_tree.cpp scene/resources/navigation_mesh.cpp #: servers/visual_server.cpp -#, fuzzy msgid "Filters" -msgstr "Filtriloj:" +msgstr "Filtriloj" #: core/project_settings.cpp scene/main/viewport.cpp msgid "Sharpen Intensity" @@ -925,9 +900,8 @@ msgid "TCP" msgstr "" #: core/register_core_types.cpp -#, fuzzy msgid "Connect Timeout Seconds" -msgstr "Konektoj al metodo:" +msgstr "Atendtempo de konekto en sekundoj" #: core/register_core_types.cpp msgid "Packet Peer Stream" @@ -1099,9 +1073,8 @@ msgstr "" #: scene/animation/animation_blend_tree.cpp scene/gui/control.cpp #: scene/main/canvas_layer.cpp scene/resources/environment.cpp #: scene/resources/material.cpp scene/resources/particles_material.cpp -#, fuzzy msgid "Scale" -msgstr "Skalo:" +msgstr "Skalo" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Follow Surface" @@ -1150,11 +1123,11 @@ msgstr "Enmetu Ålosilon ĉi tien" #: editor/animation_bezier_editor.cpp msgid "Duplicate Selected Key(s)" -msgstr "Duplikati Elektita(j)n Åœlosilo(j)n" +msgstr "Duplikati elektita(j)n Ålosilo(j)n" #: editor/animation_bezier_editor.cpp msgid "Delete Selected Key(s)" -msgstr "Forigi Elektita(j)n Åœlosilo(j)n" +msgstr "Forigi elektita(j)n Ålosilo(j)n" #: editor/animation_bezier_editor.cpp msgid "Add Bezier Point" @@ -1215,9 +1188,8 @@ msgstr "Lokaĵigado" #: editor/animation_track_editor.cpp modules/gltf/gltf_node.cpp #: scene/2d/polygon_2d.cpp scene/2d/remote_transform_2d.cpp #: scene/3d/remote_transform.cpp scene/3d/spatial.cpp scene/gui/control.cpp -#, fuzzy msgid "Rotation" -msgstr "Rotacia paÅo:" +msgstr "Rotacio" #: editor/animation_track_editor.cpp editor/script_editor_debugger.cpp #: modules/visual_script/visual_script_nodes.cpp scene/gui/range.cpp @@ -1259,14 +1231,12 @@ msgid "Stream" msgstr "" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Start Offset" -msgstr "Krada deÅovo:" +msgstr "Komenca deÅovo" #: editor/animation_track_editor.cpp -#, fuzzy msgid "End Offset" -msgstr "Krada deÅovo:" +msgstr "Fina deÅovo" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/import/resource_importer_scene.cpp @@ -1389,14 +1359,12 @@ msgid "Remove this track." msgstr "Forigi ĉi tiun trakon." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Time (s):" -msgstr "Fojo (s): " +msgstr "Tempo (s):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Position:" -msgstr "Pozicio de doko" +msgstr "Pozicio:" #: editor/animation_track_editor.cpp #, fuzzy @@ -1418,9 +1386,8 @@ msgid "Type:" msgstr "" #: editor/animation_track_editor.cpp -#, fuzzy msgid "(Invalid, expected type: %s)" -msgstr "Nevalida kromprogramo." +msgstr "(Nevalida, atendebla tipo: %s)" #: editor/animation_track_editor.cpp #, fuzzy @@ -1442,9 +1409,8 @@ msgid "Stream:" msgstr "" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Start (s):" -msgstr "Komenci" +msgstr "Komenco (s):" #: editor/animation_track_editor.cpp #, fuzzy @@ -1669,9 +1635,8 @@ msgid "Add Method Track Key" msgstr "Aldoni metodan trakan Ålosilon" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Method not found in object:" -msgstr "Metodon ne trovis en objekto: " +msgstr "En objekto ne estas tia metodo:" #: editor/animation_track_editor.cpp msgid "Anim Move Keys" @@ -1746,11 +1711,11 @@ msgstr "Averto: Redaktanti importis animadon" #: editor/animation_track_editor.cpp msgid "Select an AnimationPlayer node to create and edit animations." -msgstr "Elektu AnimationPlayer-a nodo por krei kaj redakti animadojn." +msgstr "Elektu AnimationPlayer-nodon por krei kaj redakti animaciojn." #: editor/animation_track_editor.cpp msgid "Only show tracks from nodes selected in tree." -msgstr "Nur vidigi trakojn el elektitajn nodojn en la arbo." +msgstr "Vidigi trakojn nur el elektitajn nodojn en la arbo." #: editor/animation_track_editor.cpp msgid "Group tracks by node or display them as plain list." @@ -1906,7 +1871,7 @@ msgstr "Kopii" #: editor/animation_track_editor.cpp msgid "Select All/None" -msgstr "Elekti Ĉiuj/Neniuj" +msgstr "Elekti Ĉiujn/Neniujn" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" @@ -2578,7 +2543,7 @@ msgstr "Solo" #: editor/editor_audio_buses.cpp msgid "Mute" -msgstr "Mute" +msgstr "Surdigi" #: editor/editor_audio_buses.cpp msgid "Bypass" @@ -2642,9 +2607,8 @@ msgid "There is no '%s' file." msgstr "Estas neniu dosiero '%s'." #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Layout:" -msgstr "AranÄo" +msgstr "AranÄo:" #: editor/editor_audio_buses.cpp msgid "Invalid file, not an audio bus layout." @@ -2818,7 +2782,7 @@ msgstr "[ne konservis]" #: editor/editor_dir_dialog.cpp msgid "Please select a base directory first." -msgstr "Bonvolu selekti bazan dosierujon unue." +msgstr "Bonvolu elektu bazan dosierujon." #: editor/editor_dir_dialog.cpp msgid "Choose a Directory" @@ -2852,19 +2816,16 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with warnings." -msgstr "Kopii elektaron" +msgstr "Finite kun eraroj." #: editor/editor_export.cpp -#, fuzzy msgid "Completed successfully." -msgstr "Pakaĵo instalis sukcese!" +msgstr "Finite sen eraroj." #: editor/editor_export.cpp -#, fuzzy msgid "Failed." -msgstr "Eraris:" +msgstr "Malsukcesis." #: editor/editor_export.cpp msgid "Storing File:" @@ -2889,14 +2850,12 @@ msgid "Cannot create file \"%s\"." msgstr "Ne povis krei dosierujon." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to export project files." -msgstr "Ne eble komencas subprocezon!" +msgstr "Malsukcesis eksporti dosierojn de projekto." #: editor/editor_export.cpp -#, fuzzy msgid "Can't open file to read from path \"%s\"." -msgstr "Ne malfermeblas dosieron por skribi:" +msgstr "Ne malfermeblas dosieron por legado el vojo \"%s\"." #: editor/editor_export.cpp #, fuzzy @@ -3024,9 +2983,8 @@ msgid "Custom release template not found." msgstr "Propra eldona Åablono ne trovitis." #: editor/editor_export.cpp -#, fuzzy msgid "Prepare Template" -msgstr "Åœablono:" +msgstr "Pretigi Åablonon" #: editor/editor_export.cpp platform/osx/export/export.cpp #, fuzzy @@ -3034,9 +2992,8 @@ msgid "The given export path doesn't exist." msgstr "La provizinta dosierindiko ne ekzistas." #: editor/editor_export.cpp platform/javascript/export/export.cpp -#, fuzzy msgid "Template file not found: \"%s\"." -msgstr "Åœablonan dosieron ne trovis:" +msgstr "Åœablona dosiero ne troviÄas: \"%s\"." #: editor/editor_export.cpp #, fuzzy @@ -3107,8 +3064,7 @@ msgid "" "Allows to work with signals and groups of the node selected in the Scene " "dock." msgstr "" -"Permesas labori la signalojn kaj la grupojn de la nodo elektitas en la Sceno-" -"doko." +"Permesas labori kun signaloj kaj grupoj de la elektita nodo en sceno-panelo." #: editor/editor_feature_profile.cpp msgid "Allows to browse the local file system via a dedicated dock." @@ -3132,7 +3088,7 @@ msgstr "(nenio)" #: editor/editor_feature_profile.cpp msgid "Remove currently selected profile, '%s'? Cannot be undone." -msgstr "Forigi aktuale elektitan profilon '%s'? Ne malfareblas." +msgstr "Forigi kurantan elektitan profilon '%s'? Ne malfareblas." #: editor/editor_feature_profile.cpp msgid "Profile must be a valid filename and must not contain '.'" @@ -3266,7 +3222,7 @@ msgstr "Profilo de funkciaro de Godot" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select Current Folder" -msgstr "Elekti aktualan dosierujon" +msgstr "Elekti kurantan dosierujon" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "File exists, overwrite?" @@ -3334,14 +3290,12 @@ msgid "Save a File" msgstr "Konservi dosieron" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Access" -msgstr "Sukceso!" +msgstr "Atingo" #: editor/editor_file_dialog.cpp editor/editor_settings.cpp -#, fuzzy msgid "Display Mode" -msgstr "ReÄimo de ludado:" +msgstr "ReÄimo de montro" #: editor/editor_file_dialog.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -3359,19 +3313,16 @@ msgid "Mode" msgstr "Panoramada reÄimo" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Current Dir" -msgstr "Aktuala profilo:" +msgstr "Kuranta dosierujo" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Current File" -msgstr "Aktuala profilo:" +msgstr "Kuranta dosiero" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Current Path" -msgstr "Aktuala profilo:" +msgstr "Kuranta vojo" #: editor/editor_file_dialog.cpp editor/editor_settings.cpp #: scene/gui/file_dialog.cpp @@ -4475,9 +4426,8 @@ msgid "Inspector" msgstr "Inspektoro" #: editor/editor_node.cpp -#, fuzzy msgid "Default Property Name Style" -msgstr "Projekta vojo:" +msgstr "DefaÅlta stilo de eca nomo" #: editor/editor_node.cpp msgid "Default Float Step" @@ -4623,6 +4573,7 @@ msgstr "Diversa projekto aÅ tut-scenaj iloj." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projekto" @@ -4889,9 +4840,8 @@ msgid "Play Custom Scene" msgstr "Ludi laÅmendan scenon" #: editor/editor_node.cpp -#, fuzzy msgid "Changing the video driver requires restarting the editor." -msgstr "ÅœanÄanto de la videa pelilo postulas rekomenci la redaktilon." +msgstr "Por ÅanÄo de videopelilo, necesas restarto de redaktilo." #: editor/editor_node.cpp editor/project_settings_editor.cpp #: editor/settings_config_dialog.cpp @@ -4941,7 +4891,7 @@ msgstr "Instali el dosiero" #: editor/editor_node.cpp msgid "Select android sources file" -msgstr "" +msgstr "Elekti Android dosieron de risurcoj" #: editor/editor_node.cpp msgid "" @@ -5021,9 +4971,8 @@ msgid "Select" msgstr "Elekti" #: editor/editor_node.cpp -#, fuzzy msgid "Select Current" -msgstr "Elekti aktualan dosierujon" +msgstr "Elekti kurantan" #: editor/editor_node.cpp msgid "Open 2D Editor" @@ -5091,9 +5040,8 @@ msgstr "Äœisdatigi" #: editor/editor_plugin_settings.cpp platform/android/export/export_plugin.cpp #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #: platform/uwp/export/export.cpp -#, fuzzy msgid "Version" -msgstr "Versio:" +msgstr "Versio" #: editor/editor_plugin_settings.cpp #, fuzzy @@ -5230,14 +5178,12 @@ msgstr "Elektinta nodo ne estas Viewport!" #: editor/editor_properties_array_dict.cpp #: editor/plugins/spatial_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Size:" -msgstr "Grando: " +msgstr "Grando" #: editor/editor_properties_array_dict.cpp -#, fuzzy msgid "Page:" -msgstr "PaÄo: " +msgstr "PaÄo" #: editor/editor_properties_array_dict.cpp #: editor/plugins/theme_editor_plugin.cpp @@ -5324,9 +5270,8 @@ msgid "Extend Script" msgstr "Etendi skripton" #: editor/editor_resource_picker.cpp -#, fuzzy msgid "Script Owner" -msgstr "Nomo de skripto:" +msgstr "Posedanto de scenaro" #: editor/editor_run_native.cpp msgid "" @@ -5502,14 +5447,12 @@ msgid "Directories" msgstr "Direktoj" #: editor/editor_settings.cpp -#, fuzzy msgid "Autoscan Project Path" -msgstr "Projekta vojo:" +msgstr "Vojo de projektaj aÅtoskano" #: editor/editor_settings.cpp -#, fuzzy msgid "Default Project Path" -msgstr "Projekta vojo:" +msgstr "Projekta vojo defaÅlte" #: editor/editor_settings.cpp #, fuzzy @@ -5530,9 +5473,8 @@ msgid "File Dialog" msgstr "" #: editor/editor_settings.cpp -#, fuzzy msgid "Thumbnail Size" -msgstr "Bildeto..." +msgstr "Grando de miniaturoj" #: editor/editor_settings.cpp msgid "Docks" @@ -5666,14 +5608,12 @@ msgid "Appearance" msgstr "" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Show Line Numbers" -msgstr "Lineo-Numeron:" +msgstr "Aperigi numeroj de literĉenoj" #: editor/editor_settings.cpp -#, fuzzy msgid "Line Numbers Zero Padded" -msgstr "Lineo-Numeron:" +msgstr "Numeroj de literĉenoj kun nulaj plenigiloj" #: editor/editor_settings.cpp msgid "Show Bookmark Gutter" @@ -5842,9 +5782,8 @@ msgid "Pick Distance" msgstr "Elektu ĉefan scenon" #: editor/editor_settings.cpp editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Preview Size" -msgstr "AntaÅrigardo:" +msgstr "Grando de antaÅrigardo" #: editor/editor_settings.cpp msgid "Primary Grid Color" @@ -5891,14 +5830,12 @@ msgid "Shape" msgstr "" #: editor/editor_settings.cpp -#, fuzzy msgid "Primary Grid Steps" -msgstr "Krada paÅo:" +msgstr "Bazaj paÅoj de krado" #: editor/editor_settings.cpp -#, fuzzy msgid "Grid Size" -msgstr "Krada paÅo:" +msgstr "Grando de krado" #: editor/editor_settings.cpp msgid "Grid Division Level Max" @@ -6073,9 +6010,8 @@ msgid "Bone Color 2" msgstr "Renomi nodon" #: editor/editor_settings.cpp -#, fuzzy msgid "Bone Selected Color" -msgstr "Agordi elektitan profilon:" +msgstr "Koloro de elektita osto" #: editor/editor_settings.cpp msgid "Bone IK Color" @@ -6086,9 +6022,8 @@ msgid "Bone Outline Color" msgstr "" #: editor/editor_settings.cpp -#, fuzzy msgid "Bone Outline Size" -msgstr "Grando de konturo:" +msgstr "Grando de osta konturo" #: editor/editor_settings.cpp msgid "Viewport Border Color" @@ -6181,9 +6116,8 @@ msgid "Auto Save" msgstr "Ne konservi" #: editor/editor_settings.cpp -#, fuzzy msgid "Save Before Running" -msgstr "Konservu scenon antaÅ ruloto..." +msgstr "Konservi antaÅ lanĉo" #: editor/editor_settings.cpp msgid "Font Size" @@ -6191,9 +6125,8 @@ msgstr "" #: editor/editor_settings.cpp #: modules/gdscript/language_server/gdscript_language_server.cpp -#, fuzzy msgid "Remote Host" -msgstr "Fora " +msgstr "Fora retnodo" #: editor/editor_settings.cpp #: modules/gdscript/language_server/gdscript_language_server.cpp @@ -6226,9 +6159,8 @@ msgstr "Mastrumilo de Projektoj" #. TRANSLATORS: Project Manager here refers to the tool used to create/manage Godot projects. #: editor/editor_settings.cpp -#, fuzzy msgid "Sorting Order" -msgstr "Renomas dosierujon:" +msgstr "Ordo de disspecigo" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Symbol Color" @@ -6260,9 +6192,8 @@ msgid "Comment Color" msgstr "" #: editor/editor_settings.cpp -#, fuzzy msgid "String Color" -msgstr "Memoras dosieron:" +msgstr "Koloro de literĉeno" #: editor/editor_settings.cpp platform/javascript/export/export.cpp #: platform/uwp/export/export.cpp @@ -6298,14 +6229,12 @@ msgid "Text Color" msgstr "Elekti koloron" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Line Number Color" -msgstr "Lineo-Numeron:" +msgstr "Koloro de lineaj numeroj" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Safe Line Number Color" -msgstr "Lineo-Numeron:" +msgstr "Koloro de senriskaj lineaj je numeroj" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Caret Color" @@ -6348,9 +6277,8 @@ msgid "Number Color" msgstr "" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Function Color" -msgstr "Funkcioj:" +msgstr "Koloro de funkcio" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -6408,9 +6336,8 @@ msgid "Hide Slider" msgstr "Videblaj koliziaj formoj" #: editor/editor_sub_scene.cpp -#, fuzzy msgid "Select Node(s) to Import" -msgstr "Selektu nodo(j)n por enporti" +msgstr "Elektu nodo(j)n por importado" #: editor/editor_sub_scene.cpp editor/project_manager.cpp msgid "Browse" @@ -7556,7 +7483,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15556,18 +15484,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Nomo de nodo:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Nomo de nodo:" #: editor/scene_tree_dock.cpp @@ -15765,6 +15693,11 @@ msgid "Button Group" msgstr "Grupo de butono" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Nomo de nodo:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Konektas el)" @@ -15840,6 +15773,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "Malvalida nomo de nodo, la jenaj signoj ne permesas:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Renomi nodon" @@ -17745,6 +17682,21 @@ msgstr "" msgid "Auto Update Project" msgstr "Sennoma projekto" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Vidigi tutan" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Elekti dosierujon" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Elekti dosierujon" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19572,6 +19524,11 @@ msgstr "Eltondi nodo(j)n" msgid "Custom BG Color" msgstr "Eltondi nodo(j)n" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Etendi tuton" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20419,6 +20376,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "Nevalida grupa nomo." diff --git a/editor/translations/es.po b/editor/translations/es.po index 173b195cc4..629b36eea7 100644 --- a/editor/translations/es.po +++ b/editor/translations/es.po @@ -85,12 +85,16 @@ # Angel Andrade <aandradeb99@gmail.com>, 2022. # Juan Felipe Gómez López <juanfgomez0912@gmail.com>, 2022. # Pineappletooth <yochank003@gmail.com>, 2022. +# David A. Rodas S. <woshianima@gmail.com>, 2022. +# Fernando Joaquin Manzano Lopez <ticantin12@gmail.com>, 2022. +# M3CG <cgmario1999@gmail.com>, 2022. +# Chalan <Valentin06ch@outlook.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-08-05 01:04+0000\n" +"PO-Revision-Date: 2022-09-27 21:37+0000\n" "Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/" "godot/es/>\n" @@ -99,7 +103,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -478,7 +482,7 @@ msgstr "FÃsica" #: scene/gui/base_button.cpp scene/gui/texture_button.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Pressed" -msgstr "Preset" +msgstr "Presionado" #: core/os/input_event.cpp msgid "Scancode" @@ -601,11 +605,11 @@ msgstr "Valor del Controlador" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #: platform/windows/export/export.cpp msgid "Application" -msgstr "Aplicação" +msgstr "Aplicación" #: core/project_settings.cpp main/main.cpp msgid "Config" -msgstr "Configuração" +msgstr "Configuración" #: core/project_settings.cpp msgid "Project Settings Override" @@ -652,11 +656,11 @@ msgstr "Desactivar stderr" #: core/project_settings.cpp msgid "Use Hidden Project Data Directory" -msgstr "Utilizar el Directorio de Datos Ocultos del Proyecto" +msgstr "Usar Directorio de Datos Ocultos del Proyecto" #: core/project_settings.cpp msgid "Use Custom User Dir" -msgstr "Utilizar Directorio de Usuario Personalizado" +msgstr "Usar Directorio de Usuario Personalizado" #: core/project_settings.cpp msgid "Custom User Dir Name" @@ -702,7 +706,7 @@ msgstr "Audio" #: core/project_settings.cpp msgid "Default Bus Layout" -msgstr "Layout de Bus por Defecto" +msgstr "Layout de Bus Predeterminado" #: core/project_settings.cpp editor/editor_export.cpp #: editor/editor_file_system.cpp editor/editor_node.cpp @@ -966,7 +970,7 @@ msgstr "Idioma" #: core/translation.cpp msgid "Test" -msgstr "Probar" +msgstr "Test" #: core/translation.cpp scene/resources/font.cpp msgid "Fallback" @@ -1239,11 +1243,11 @@ msgstr "Stream" #: editor/animation_track_editor.cpp msgid "Start Offset" -msgstr "Desplazamiento de Inicio" +msgstr "Offset de Inicio" #: editor/animation_track_editor.cpp msgid "End Offset" -msgstr "Desplazamiento Final" +msgstr "Offset Final" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/import/resource_importer_scene.cpp @@ -1700,12 +1704,12 @@ msgstr "" "Esta animación pertenece a una escena importada, por lo que los cambios en " "las pistas importadas no se guardarán.\n" "\n" -"Para habilitar la capacidad de añadir pistas personalizadas, ve a la " +"Para habilitar la posibilidad de añadir pistas personalizadas, ve a la " "configuración de importación de la escena y establece\n" -"\"Animation > Storage\" a \"Files\", activa \"Animation > Keep Custom " -"Tracks\", y luego reimporta.\n" -"También puedes usar un preset de importación que importa animaciones para " -"separar archivos." +"\"Animación > Almacenamiento\" a \"Archivos\", active \"Animación > Mantener " +"Pistas Personalizadas\", y vuelve a importar.\n" +"Como alternativa, utiliza un preset de importación que importe las " +"animaciones a archivos separados." #: editor/animation_track_editor.cpp msgid "Warning: Editing imported animation" @@ -1791,7 +1795,7 @@ msgstr "Ir al Paso Anterior" #: editor/animation_track_editor.cpp msgid "Apply Reset" -msgstr "Aplicar Restablecer" +msgstr "Aplicar Reset" #: editor/animation_track_editor.cpp msgid "Optimize Animation" @@ -2649,11 +2653,11 @@ msgstr "Guardar este Bus Layout a un archivo." #: editor/editor_audio_buses.cpp editor/import_dock.cpp msgid "Load Default" -msgstr "Cargar Valores por Defecto" +msgstr "Cargar Valores Predeterminados" #: editor/editor_audio_buses.cpp msgid "Load the default Bus Layout." -msgstr "Cargar el Bus Layout predeterminado." +msgstr "Cargue el Layout del Bus predeterminado." #: editor/editor_audio_buses.cpp msgid "Create a new Bus Layout." @@ -2689,7 +2693,7 @@ msgstr "No debe coincidir con una constante global existente." #: editor/editor_autoload_settings.cpp msgid "Keyword cannot be used as an autoload name." -msgstr "La palabra clave no se puede utilizar como nombre de autoload." +msgstr "La palabra clave no se puede usar como nombre de autoload." #: editor/editor_autoload_settings.cpp msgid "Autoload '%s' already exists!" @@ -2817,9 +2821,8 @@ msgid "Project export for platform:" msgstr "Exportar proyecto para la plataforma:" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with warnings." -msgstr "Completado con errores." +msgstr "Completado con advertencias." #: editor/editor_export.cpp msgid "Completed successfully." @@ -3150,7 +3153,7 @@ msgstr "Error al guardar el perfil en la ruta: '%s'." #: editor/editor_feature_profile.cpp msgid "Reset to Default" -msgstr "Restablecer Valores por Defecto" +msgstr "Restablecer Valores Predeterminados" #: editor/editor_feature_profile.cpp msgid "Current Profile:" @@ -3221,7 +3224,7 @@ msgstr "Administrar Perfiles de CaracterÃsticas del Editor" #: editor/editor_feature_profile.cpp msgid "Default Feature Profile" -msgstr "Perfil de CaracterÃsticas por Defecto" +msgstr "Perfil de CaracterÃsticas Predeterminado" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select Current Folder" @@ -3920,9 +3923,9 @@ msgid "" "To restore the Default layout to its base settings, use the Delete Layout " "option and delete the Default layout." msgstr "" -"Layout por defecto del editor sobreescrita.\n" -"Para recuperar el layout por defecto, utiliza la opción Eliminar Layout y " -"borra el Layout por defecto." +"Layout por defecto del editor anulado.\n" +"Para recuperar el layout predeterminado, utiliza la opción Eliminar Layout y " +"borra el layout Predeterminado." #: editor/editor_node.cpp msgid "Layout name not found!" @@ -3930,7 +3933,7 @@ msgstr "¡Nombre de layout no encontrado!" #: editor/editor_node.cpp msgid "Restored the Default layout to its base settings." -msgstr "Se restauró el diseño por defecto a su configuración básica." +msgstr "Se restauró el diseño predeterminado a su configuración básica." #: editor/editor_node.cpp msgid "" @@ -4282,7 +4285,7 @@ msgstr "Eliminar Layout" #: editor/editor_node.cpp editor/import_dock.cpp #: editor/script_create_dialog.cpp msgid "Default" -msgstr "Por defecto" +msgstr "Predeterminado" #: editor/editor_node.cpp editor/editor_resource_picker.cpp #: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp @@ -4415,11 +4418,11 @@ msgstr "Inspector" #: editor/editor_node.cpp msgid "Default Property Name Style" -msgstr "Estilo por Defecto del Nombrado de Propiedades" +msgstr "Estilo del nombre de la Propiedad Predeterminada" #: editor/editor_node.cpp msgid "Default Float Step" -msgstr "Escalonado de Flotantes por Defecto" +msgstr "Escalonado de Flotantes Predeterminado" #: editor/editor_node.cpp scene/gui/tree.cpp msgid "Disable Folding" @@ -4447,7 +4450,7 @@ msgstr "Recursos Para Abrir En Nuevo Inspector" #: editor/editor_node.cpp msgid "Default Color Picker Mode" -msgstr "Modo De Selección De Color Por Defecto" +msgstr "Modo de Selección de Color Predeterminado" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Version Control" @@ -4557,6 +4560,7 @@ msgstr "Herramientas variadas de proyecto o escena." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Proyecto" @@ -4617,8 +4621,8 @@ msgstr "" "Cuando esta opción está activada, al utilizar el despliegue con un clic, el " "ejecutable intentará conectarse a la IP de este equipo para que el proyecto " "en ejecución pueda ser depurado.\n" -"Esta opción está pensada para ser usada en la depuración remota " -"( normalmente con un dispositivo móvil).\n" +"Esta opción está pensada para ser usada en la depuración remota (normalmente " +"con un dispositivo móvil).\n" "No es necesario habilitarla para usar el depurador GDScript localmente." #: editor/editor_node.cpp @@ -5435,7 +5439,7 @@ msgstr "Autoescaneo de la Ruta del Proyecto" #: editor/editor_settings.cpp msgid "Default Project Path" -msgstr "Ruta del Proyecto por Defecto" +msgstr "Ruta del Proyecto Predeterminada" #: editor/editor_settings.cpp msgid "On Save" @@ -5560,7 +5564,7 @@ msgstr "Ancho del Minimapa" #: editor/editor_settings.cpp msgid "Mouse Extra Buttons Navigate History" -msgstr "Botones Extra del Ratón Navegar por el Historial" +msgstr "Botones Extra del Mouse para Navegar por el Historial" #: editor/editor_settings.cpp msgid "Drag And Drop Selection" @@ -5702,7 +5706,7 @@ msgstr "Colocar Tooltip de Llamada Debajo de la LÃnea Actual" #: editor/editor_settings.cpp msgid "Callhint Tooltip Offset" -msgstr "Desplazamiento del Tooltip de Llamada" +msgstr "Offset del Tooltip de Llamada" #: editor/editor_settings.cpp msgid "Complete File Paths" @@ -5714,7 +5718,7 @@ msgstr "Añadir Sugerencias de Tipo" #: editor/editor_settings.cpp msgid "Use Single Quotes" -msgstr "Utilizar Comillas Simples" +msgstr "Usar Comillas Simples" #: editor/editor_settings.cpp msgid "Show Help Index" @@ -5818,19 +5822,19 @@ msgstr "CuadrÃcula Plano YZ" #: editor/editor_settings.cpp msgid "Default FOV" -msgstr "Campo de Visión por Defecto" +msgstr "FOV Predeterminado" #: editor/editor_settings.cpp msgid "Default Z Near" -msgstr "Z Cercana por Defecto" +msgstr "Z Cercano Predeterminado" #: editor/editor_settings.cpp msgid "Default Z Far" -msgstr "Z Lejana por Defecto" +msgstr "Z Lejano Predeterminado" #: editor/editor_settings.cpp msgid "Lightmap Baking Number Of CPU Threads" -msgstr "Número de hilos de la CPU para el Lightmap Baking" +msgstr "Número de Hilos de la CPU para el Lightmap Baking" #: editor/editor_settings.cpp msgid "Navigation Scheme" @@ -6002,7 +6006,7 @@ msgstr "Crear Pistas Bézier Predeterminadas" #: editor/editor_settings.cpp msgid "Default Create Reset Tracks" -msgstr "Crear Pistas de Reinicio por Defecto" +msgstr "Crear Pistas de Reinicio Predeterminado" #: editor/editor_settings.cpp msgid "Onion Layers Past Color" @@ -6118,7 +6122,7 @@ msgstr "Color de los Comentarios" #: editor/editor_settings.cpp msgid "String Color" -msgstr "Color de Cadena" +msgstr "Color del String" #: editor/editor_settings.cpp platform/javascript/export/export.cpp #: platform/uwp/export/export.cpp @@ -6176,7 +6180,7 @@ msgstr "Color de Selección" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Brace Mismatch Color" -msgstr "" +msgstr "Color de Corchetes Incompletos" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Current Line Color" @@ -6184,7 +6188,7 @@ msgstr "Color de LÃnea Actual" #: editor/editor_settings.cpp msgid "Line Length Guideline Color" -msgstr "" +msgstr "Color de GuÃa de la LÃnea de Longitud" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Word Highlighted Color" @@ -6192,11 +6196,11 @@ msgstr "Color de la Palabra Resaltada" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Number Color" -msgstr "Número del Color" +msgstr "Color del Número" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Function Color" -msgstr "Función Color" +msgstr "Color de la Función" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Member Variable Color" @@ -6212,15 +6216,15 @@ msgstr "Color del Marcador" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Breakpoint Color" -msgstr "Puntos de Interrupción" +msgstr "Color de Puntos de Interrupción" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Executing Line Color" -msgstr "Color de la lÃnea de ejecución" +msgstr "Color de la lÃnea en ejecución" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Code Folding Color" -msgstr "" +msgstr "Color del Código Plegado" #: editor/editor_settings.cpp msgid "Search Result Color" @@ -6246,7 +6250,7 @@ msgstr "Ocultar Deslizador" #: editor/editor_sub_scene.cpp msgid "Select Node(s) to Import" -msgstr "Selecciona nodo(s) a importar" +msgstr "Seleccione nodo(s) a importar" #: editor/editor_sub_scene.cpp editor/project_manager.cpp msgid "Browse" @@ -6279,7 +6283,7 @@ msgstr "No hay espejos disponibles." #: editor/export_template_manager.cpp msgid "Retrieving the mirror list..." -msgstr "Recuperar la lista de espejos..." +msgstr "Recuperar el listado de mirrors..." #: editor/export_template_manager.cpp msgid "Starting the download..." @@ -6291,7 +6295,7 @@ msgstr "Error al solicitar la URL:" #: editor/export_template_manager.cpp msgid "Connecting to the mirror..." -msgstr "Conectando con el espejo..." +msgstr "Conectando con el mirror..." #: editor/export_template_manager.cpp msgid "Can't resolve the requested address." @@ -6299,11 +6303,11 @@ msgstr "No se puede resolver la dirección solicitada." #: editor/export_template_manager.cpp msgid "Can't connect to the mirror." -msgstr "No se puede conectar al espejo." +msgstr "No se puede conectar con el mirror." #: editor/export_template_manager.cpp msgid "No response from the mirror." -msgstr "No hay respuesta del espejo." +msgstr "No hay respuesta del mirror." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -6320,7 +6324,7 @@ msgstr "Petición fallida:" #: editor/export_template_manager.cpp msgid "Download complete; extracting templates..." -msgstr "Descarga completa; extracción de plantillas..." +msgstr "Descarga completa; extrayendo plantillas..." #: editor/export_template_manager.cpp msgid "Cannot remove temporary file:" @@ -6336,17 +6340,17 @@ msgstr "" #: editor/export_template_manager.cpp msgid "Error getting the list of mirrors." -msgstr "Error al obtener la lista de espejos." +msgstr "Error al obtener el listado de mirrors." #: editor/export_template_manager.cpp msgid "Error parsing JSON with the list of mirrors. Please report this issue!" msgstr "" -"Error al analizar el JSON con la lista de espejos ¡Por favor, reporta este " +"Error al leer el JSON con la lista de mirrors ¡Por favor, informa de este " "problema!" #: editor/export_template_manager.cpp msgid "Best available mirror" -msgstr "El mejor espejo disponible" +msgstr "Mejor mirror disponible" #: editor/export_template_manager.cpp msgid "" @@ -6540,7 +6544,7 @@ msgstr "" #: editor/fileserver/editor_file_server.cpp msgid "File Server" -msgstr "" +msgstr "Servidor de Archivos" #: editor/fileserver/editor_file_server.cpp #: editor/plugins/version_control_editor_plugin.cpp @@ -6913,11 +6917,11 @@ msgstr "Administrar Grupos" #: editor/import/editor_import_collada.cpp msgid "Collada" -msgstr "" +msgstr "Collada" #: editor/import/editor_import_collada.cpp msgid "Use Ambient" -msgstr "" +msgstr "Usar Ambiente" #: editor/import/resource_importer_bitmask.cpp msgid "Create From" @@ -6926,7 +6930,7 @@ msgstr "Crear Desde" #: editor/import/resource_importer_bitmask.cpp #: servers/audio/effects/audio_effect_compressor.cpp msgid "Threshold" -msgstr "" +msgstr "Umbral" #: editor/import/resource_importer_csv_translation.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -7011,7 +7015,7 @@ msgstr "Escalar Mesh" #: editor/import/resource_importer_obj.cpp msgid "Offset Mesh" -msgstr "Offset de Malla" +msgstr "Offset de Mesh" #: editor/import/resource_importer_obj.cpp #: editor/import/resource_importer_scene.cpp @@ -7089,7 +7093,7 @@ msgstr "Almacenamiento" #: editor/import/resource_importer_scene.cpp msgid "Use Legacy Names" -msgstr "" +msgstr "Usar Nombres Heredados" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp msgid "Materials" @@ -7117,7 +7121,7 @@ msgstr "Tamaño Lightmap Texel" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp msgid "Skins" -msgstr "" +msgstr "Skins" #: editor/import/resource_importer_scene.cpp msgid "Use Named Skins" @@ -7129,7 +7133,7 @@ msgstr "Archivos Externos" #: editor/import/resource_importer_scene.cpp msgid "Store In Subdir" -msgstr "" +msgstr "Guardar en el Subdirectorio" #: editor/import/resource_importer_scene.cpp msgid "Filter Script" @@ -7231,16 +7235,21 @@ msgid "" "%s: Texture detected as used as a normal map in 3D. Enabling red-green " "texture compression to reduce memory usage (blue channel is discarded)." msgstr "" +"%s: Textura detectada siendo usada como mapa de normales en 3D. Activando la " +"compresión de la textura rojo-verde para reducir el uso de memoria (el canal " +"azul se descarta)." #: editor/import/resource_importer_texture.cpp msgid "" "%s: Texture detected as used in 3D. Enabling filter, repeat, mipmap " "generation and VRAM texture compression." msgstr "" +"%s: Textura detectada siendo usada en 3D. Activando el filtro, la " +"repetición, la generación de mipmaps y la compresión de textura VRAM." #: editor/import/resource_importer_texture.cpp msgid "2D, Detect 3D" -msgstr "" +msgstr "2D, Detectar 3D" #: editor/import/resource_importer_texture.cpp msgid "2D Pixel" @@ -7248,7 +7257,7 @@ msgstr "Pixel 2D" #: editor/import/resource_importer_texture.cpp scene/resources/texture.cpp msgid "Lossy Quality" -msgstr "" +msgstr "Con Pérdidas de Calidad" #: editor/import/resource_importer_texture.cpp msgid "HDR Mode" @@ -7256,14 +7265,14 @@ msgstr "Modo HDR" #: editor/import/resource_importer_texture.cpp msgid "BPTC LDR" -msgstr "" +msgstr "BPTC LDR" #: editor/import/resource_importer_texture.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/mesh_instance_2d.cpp scene/2d/multimesh_instance_2d.cpp #: scene/2d/particles_2d.cpp scene/2d/sprite.cpp scene/resources/style_box.cpp msgid "Normal Map" -msgstr "" +msgstr "Mapa de Normales" #: editor/import/resource_importer_texture.cpp msgid "Process" @@ -7271,7 +7280,7 @@ msgstr "Proceso" #: editor/import/resource_importer_texture.cpp msgid "Fix Alpha Border" -msgstr "" +msgstr "Corregir Borde Alfa" #: editor/import/resource_importer_texture.cpp msgid "Premult Alpha" @@ -7279,7 +7288,7 @@ msgstr "Premult Alpha" #: editor/import/resource_importer_texture.cpp msgid "Hdr As Srgb" -msgstr "" +msgstr "Hdr como Srgb" #: editor/import/resource_importer_texture.cpp msgid "Invert Color" @@ -7295,7 +7304,7 @@ msgstr "Tamaño LÃmite" #: editor/import/resource_importer_texture.cpp msgid "Detect 3D" -msgstr "" +msgstr "Detectar 3D" #: editor/import/resource_importer_texture.cpp msgid "SVG" @@ -7306,6 +7315,9 @@ msgid "" "Warning, no suitable PC VRAM compression enabled in Project Settings. This " "texture will not display correctly on PC." msgstr "" +"Advertencia, no se ha activado la compresión VRAM para PC en la " +"configuración del proyecto. Esta textura no se mostrará correctamente en el " +"PC." #: editor/import/resource_importer_texture_atlas.cpp msgid "Atlas File" @@ -7321,7 +7333,7 @@ msgstr "Recortar la Región" #: editor/import/resource_importer_texture_atlas.cpp msgid "Trim Alpha Border From Region" -msgstr "" +msgstr "Recortar Borde Alfa de la Región" #: editor/import/resource_importer_wav.cpp scene/2d/physics_body_2d.cpp msgid "Force" @@ -7329,12 +7341,13 @@ msgstr "Fuerza" #: editor/import/resource_importer_wav.cpp msgid "8 Bit" -msgstr "" +msgstr "8 Bit" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" -msgstr "" +msgstr "Mono" #: editor/import/resource_importer_wav.cpp msgid "Max Rate" @@ -7346,7 +7359,7 @@ msgstr "Tasa Máxima Hz" #: editor/import/resource_importer_wav.cpp msgid "Trim" -msgstr "" +msgstr "Recorte" #: editor/import/resource_importer_wav.cpp msgid "Normalize" @@ -7377,7 +7390,7 @@ msgstr "Importador:" #: editor/import_defaults_editor.cpp msgid "Reset to Defaults" -msgstr "Restablecer Valores por Defecto" +msgstr "Restablecer Valores Predeterminados" #: editor/import_dock.cpp msgid "Keep File (No Import)" @@ -7393,7 +7406,7 @@ msgstr "Establecer como predeterminado para '%s'" #: editor/import_dock.cpp msgid "Clear Default for '%s'" -msgstr "Restablecer Predeterminado para '%s'" +msgstr "Eliminar los Valores Predeterminados para '%s'" #: editor/import_dock.cpp msgid "Reimport" @@ -7461,7 +7474,7 @@ msgstr "Localizado" #: editor/inspector_dock.cpp msgid "Localization not available for current language." -msgstr "" +msgstr "La traducción no está disponible para el idioma actual." #: editor/inspector_dock.cpp msgid "Copy Properties" @@ -8341,7 +8354,7 @@ msgstr "Filtros..." #: editor/plugins/asset_library_editor_plugin.cpp scene/main/http_request.cpp msgid "Use Threads" -msgstr "" +msgstr "Usar Hilos" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Contents:" @@ -8569,7 +8582,7 @@ msgstr "Prueba" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed to get repository configuration." -msgstr "" +msgstr "Fallo en la obtención de la configuración del repositorio." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Assets ZIP File" @@ -8599,8 +8612,8 @@ msgstr "" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Failed creating lightmap images, make sure path is writable." msgstr "" -"Error al crear las imágenes del \"lighmap\", asegúrate de que se puede " -"escribir en la ruta." +"Error al crear las imágenes del lightmap, asegúrate de que se puede escribir " +"en la ruta." #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Failed determining lightmap size. Maximum lightmap size too small?" @@ -8625,7 +8638,7 @@ msgstr "" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Bake Lightmaps" -msgstr "Calcular Lightmaps" +msgstr "Bakear Lightmaps" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "LightMap Bake" @@ -8646,7 +8659,7 @@ msgstr "Configurar Snap" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Grid Offset:" -msgstr "Desplazamiento de CuadrÃcula:" +msgstr "Offset de CuadrÃcula:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Grid Step:" @@ -8702,7 +8715,7 @@ msgstr "Crear GuÃas Horizontales y Verticales" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Set CanvasItem \"%s\" Pivot Offset to (%d, %d)" -msgstr "Ajusta el Offset del pivote del CanvasItem \"%s\" a (%d, %d)" +msgstr "Fija el Offset del pivote del CanvasItem \"%s\" a (%d, %d)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotate %d CanvasItems" @@ -9326,7 +9339,7 @@ msgstr "Error al instanciar escena desde %s" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Change Default Type" -msgstr "Cambiar Tipo por Defecto" +msgstr "Cambiar Tipo Predeterminado" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -9494,7 +9507,7 @@ msgstr "Clic derecho para añadir punto" #: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" -msgstr "Calcular GI Probe" +msgstr "Bakear GI Probe" #: editor/plugins/gradient_editor_plugin.cpp msgid "Gradient Edited" @@ -9502,11 +9515,11 @@ msgstr "Degradado Editado" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp msgid "Swap GradientTexture2D Fill Points" -msgstr "" +msgstr "Intercambiar Puntos de Relleno de GradientTexture2D" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp msgid "Swap Gradient Fill Points" -msgstr "" +msgstr "Intercambiar Puntos de Relleno de Degradado" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp msgid "Toggle Grid Snap" @@ -9529,7 +9542,7 @@ msgstr "Icono" #: editor/plugins/item_list_editor_plugin.cpp msgid "ID" -msgstr "" +msgstr "ID" #: editor/plugins/item_list_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp @@ -10312,11 +10325,11 @@ msgstr "Configurar CuadrÃcula:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid Offset X:" -msgstr "Desplazamiento de CuadrÃcula en X:" +msgstr "Offset de CuadrÃcula en X:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid Offset Y:" -msgstr "Desplazamiento de CuadrÃcula en Y:" +msgstr "Offset de CuadrÃcula en Y:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid Step X:" @@ -10332,7 +10345,7 @@ msgstr "Sincronizar Huesos con el PolÃgono" #: editor/plugins/ray_cast_2d_editor_plugin.cpp msgid "Set cast_to" -msgstr "" +msgstr "Establecer cast_to" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "ERROR: Couldn't load resource!" @@ -10663,11 +10676,11 @@ msgstr "Resultados de la Búsqueda" #: editor/plugins/script_editor_plugin.cpp msgid "Open Dominant Script On Scene Change" -msgstr "" +msgstr "Abrir el Script Principal en el Cambio de Escena" #: editor/plugins/script_editor_plugin.cpp msgid "External" -msgstr "" +msgstr "Externo" #: editor/plugins/script_editor_plugin.cpp msgid "Use External Editor" @@ -10683,11 +10696,11 @@ msgstr "Temperatura del Script Activada" #: editor/plugins/script_editor_plugin.cpp msgid "Highlight Current Script" -msgstr "" +msgstr "Resaltar Script Actual" #: editor/plugins/script_editor_plugin.cpp msgid "Script Temperature History Size" -msgstr "" +msgstr "Tamaño de Historial de Temperatura del Script" #: editor/plugins/script_editor_plugin.cpp msgid "Current Script Background Color" @@ -10707,7 +10720,7 @@ msgstr "Lista de Nombres de Script Como" #: editor/plugins/script_editor_plugin.cpp msgid "Exec Flags" -msgstr "" +msgstr "Indicadores de Ejecución" #: editor/plugins/script_editor_plugin.cpp msgid "Clear Recent Scripts" @@ -11284,7 +11297,7 @@ msgid "" "It cannot be used as a reliable indication of in-game performance." msgstr "" "Nota: El valor FPS que se muestra es la velocidad de fotogramas del editor.\n" -"No se puede utilizar como un indicador fiable del rendimiento en el juego." +"No se puede usar como un indicador fiable del rendimiento en el juego." #: editor/plugins/spatial_editor_plugin.cpp msgid "Convert Rooms" @@ -11403,7 +11416,7 @@ msgstr "Incrementar el Campo de Visión" #: editor/plugins/spatial_editor_plugin.cpp msgid "Reset Field of View to Default" -msgstr "Restablecer el Campo de Visión por Defecto" +msgstr "Restablecer el Campo de Visión Predeterminado" #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Object to Floor" @@ -11524,11 +11537,11 @@ msgstr "Posterior" #: editor/plugins/spatial_editor_plugin.cpp msgid "Manipulator Gizmo Size" -msgstr "" +msgstr "Tamaño del Gizmo Manipulador" #: editor/plugins/spatial_editor_plugin.cpp msgid "Manipulator Gizmo Opacity" -msgstr "" +msgstr "Opacidad del Gizmo Manipulador" #: editor/plugins/spatial_editor_plugin.cpp msgid "Show Viewport Rotation Gizmo" @@ -12220,13 +12233,13 @@ msgstr "Establer tipo de base" #: editor/plugins/theme_editor_plugin.cpp msgid "Show Default" -msgstr "Mostrar Por Defecto" +msgstr "Mostrar por Defecto" #: editor/plugins/theme_editor_plugin.cpp msgid "Show default type items alongside items that have been overridden." msgstr "" -"Mostrar los elementos de tipo por defecto junto a los elementos que han sido " -"anulados." +"Mostrar los elementos de tipo predeterminado junto a los elementos que han " +"sido anulados." #: editor/plugins/theme_editor_plugin.cpp msgid "Override All" @@ -12234,7 +12247,7 @@ msgstr "Anular Todo" #: editor/plugins/theme_editor_plugin.cpp msgid "Override all default type items." -msgstr "Anular todos los elementos de tipo por defecto." +msgstr "Anular todos los elementos de tipo predeterminado." #: editor/plugins/theme_editor_plugin.cpp msgid "Select the variation base type from a list of available types." @@ -12268,7 +12281,7 @@ msgstr "Añadir Vista Previa" #: editor/plugins/theme_editor_plugin.cpp msgid "Default Preview" -msgstr "Vista Previa Por Defecto" +msgstr "Vista Previa Predeterminada" #: editor/plugins/theme_editor_plugin.cpp msgid "Select UI Scene:" @@ -12877,7 +12890,7 @@ msgstr "Opciones de Ajuste" #: scene/main/canvas_layer.cpp scene/resources/material.cpp #: scene/resources/particles_material.cpp scene/resources/style_box.cpp msgid "Offset" -msgstr "Desplazamiento" +msgstr "Offset" #: editor/plugins/tile_set_editor_plugin.cpp editor/rename_dialog.cpp #: scene/gui/range.cpp scene/resources/animation.cpp @@ -12907,7 +12920,7 @@ msgstr "Textura" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Tex Offset" -msgstr "Desplazamiento de Textura" +msgstr "Offset de Textura" #: editor/plugins/tile_set_editor_plugin.cpp modules/csg/csg_shape.cpp #: scene/2d/canvas_item.cpp scene/2d/particles_2d.cpp @@ -12938,15 +12951,15 @@ msgstr "Espaciado de Subtile" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Occluder Offset" -msgstr "Desplazamiento del Oclusor" +msgstr "Offset del Oclusor" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Navigation Offset" -msgstr "Desplazamiento de Navegación" +msgstr "Offset de Navegación" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Shape Offset" -msgstr "Desplazamiento del Shape" +msgstr "Offset del Shape" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Shape Transform" @@ -14066,11 +14079,13 @@ msgstr "Ejecutable" #: editor/project_export.cpp msgid "Export the project for all the presets defined." -msgstr "" +msgstr "Exportar el proyecto para todos los presets definidos." #: editor/project_export.cpp msgid "All presets must have an export path defined for Export All to work." msgstr "" +"Todos los presets deben tener una ruta de exportación definida para que " +"Exportar Todo funcione." #: editor/project_export.cpp msgid "Delete preset '%s'?" @@ -14183,6 +14198,8 @@ msgid "" "Note: Encryption key needs to be stored in the binary,\n" "you need to build the export templates from source." msgstr "" +"Nota: La clave de encriptación debe ser almacenada en el binario,\n" +"es necesario construir las plantillas de exportación desde el código fuente." #: editor/project_export.cpp msgid "More Info..." @@ -14944,7 +14961,7 @@ msgstr "Plugins" #: editor/project_settings_editor.cpp msgid "Import Defaults" -msgstr "Valores de Importación por Defecto" +msgstr "Valores de Importación Predeterminados" #: editor/property_editor.cpp msgid "Preset..." @@ -15323,8 +15340,8 @@ msgid "" "Disabling \"editable_instance\" will cause all properties of the node to be " "reverted to their default." msgstr "" -"Desactivar \"editable_instance\" causara que todas las propiedades del nodo " -"vuelvan a sus valores por defecto." +"Desactivar \"editable_instance\" causará que todas las propiedades del nodo " +"vuelvan a sus valores predeterminados." #: editor/scene_tree_dock.cpp msgid "" @@ -15332,24 +15349,24 @@ msgid "" "cause all properties of the node to be reverted to their default." msgstr "" "Activar \"Cargar Como Placeholder\" desactivará \"Hijos Editables\" y " -"causará que todas las propiedades del nodo se reviertan a sus valores por " -"defecto." +"causará que todas las propiedades del nodo se reviertan a sus valores " +"predeterminados." #: editor/scene_tree_dock.cpp msgid "Make Local" msgstr "Crear Local" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" +#: editor/scene_tree_dock.cpp +msgid "Enable Scene Unique Name(s)" +msgstr "Activar Nombre(s) Único(s) de Escena" #: editor/scene_tree_dock.cpp -msgid "Enable Scene Unique Name" -msgstr "Activar Nombre Único de Escena" +msgid "Unique names already used by another node in the scene:" +msgstr "Nombres únicos ya utilizados por otro nodo en la escena:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Disable Scene Unique Name" -msgstr "Desactivar Nombre Único de Escena" +#: editor/scene_tree_dock.cpp +msgid "Disable Scene Unique Name(s)" +msgstr "Desactivar Nombre(s) Único(s) de Escena" #: editor/scene_tree_dock.cpp msgid "New Scene Root" @@ -15425,7 +15442,7 @@ msgstr "Sub-Recursos" #: editor/scene_tree_dock.cpp msgid "Access as Scene Unique Name" -msgstr "" +msgstr "Acceso como Nombre Único de Escena" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance" @@ -15529,7 +15546,7 @@ msgstr "Mostrar Selección de la RaÃz del Ãrbol de Escenas" #: editor/scene_tree_dock.cpp msgid "Derive Script Globals By Name" -msgstr "" +msgstr "Derivar Script Globales por Nombre" #: editor/scene_tree_dock.cpp msgid "Use Favorites Root Selection" @@ -15548,6 +15565,10 @@ msgid "Button Group" msgstr "Grupo de Botones" #: editor/scene_tree_editor.cpp +msgid "Disable Scene Unique Name" +msgstr "Desactivar Nombre Único de Escena" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Conectando Desde)" @@ -15561,6 +15582,9 @@ msgid "" "with the '%s' prefix in a node path.\n" "Click to disable this." msgstr "" +"Se puede acceder a este nodo desde cualquier parte de la escena anteponiendo " +"el prefijo '%s' en una ruta de nodo.\n" +"Haz clic para desactivar esto." #: editor/scene_tree_editor.cpp msgid "" @@ -15624,6 +15648,10 @@ msgstr "" "El nombre del nodo no es correcto, las siguientes letras no están permitidas:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "Otro nodo ya utiliza este nombre único en la escena." + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Renombrar Nodo" @@ -15853,15 +15881,15 @@ msgstr "Filtrar variables apiladas" #: editor/script_editor_debugger.cpp msgid "Auto Switch To Remote Scene Tree" -msgstr "" +msgstr "Cambio Automático al Ãrbol de Escenas Remoto" #: editor/script_editor_debugger.cpp msgid "Remote Scene Tree Refresh Interval" -msgstr "" +msgstr "Intervalo de Refresco del Ãrbol de Escenas Remoto" #: editor/script_editor_debugger.cpp msgid "Remote Inspect Refresh Interval" -msgstr "" +msgstr "Intervalo de Refresco de la Inspección Remota" #: editor/script_editor_debugger.cpp msgid "Network Profiler" @@ -15959,7 +15987,7 @@ msgstr "Cambiar Radio de Luces" #: editor/spatial_editor_gizmos.cpp msgid "Stream Player 3D" -msgstr "" +msgstr "Stream Player 3D" #: editor/spatial_editor_gizmos.cpp msgid "Change AudioStreamPlayer3D Emission Angle" @@ -15969,7 +15997,7 @@ msgstr "Cambiar Ãngulo de Emisión de AudioStreamPlayer3D" #: platform/osx/export/export.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Camera" -msgstr "" +msgstr "Cámara" #: editor/spatial_editor_gizmos.cpp msgid "Change Camera FOV" @@ -15981,7 +16009,7 @@ msgstr "Cambiar Tamaño de Cámara" #: editor/spatial_editor_gizmos.cpp msgid "Visibility Notifier" -msgstr "" +msgstr "Notificador de Visibilidad" #: editor/spatial_editor_gizmos.cpp msgid "Change Notifier AABB" @@ -16053,19 +16081,19 @@ msgstr "Navegación Sólida Desactivada" #: editor/spatial_editor_gizmos.cpp msgid "Joint Body A" -msgstr "" +msgstr "Unir cuerpo A" #: editor/spatial_editor_gizmos.cpp msgid "Joint Body B" -msgstr "" +msgstr "Unir cuerpo B" #: editor/spatial_editor_gizmos.cpp msgid "Room Edge" -msgstr "" +msgstr "LÃmite del Room" #: editor/spatial_editor_gizmos.cpp msgid "Room Overlap" -msgstr "" +msgstr "Solapamiento del Room" #: editor/spatial_editor_gizmos.cpp msgid "Set Room Point Position" @@ -16077,11 +16105,11 @@ msgstr "Margen del Portal" #: editor/spatial_editor_gizmos.cpp msgid "Portal Edge" -msgstr "" +msgstr "Borde del Portal" #: editor/spatial_editor_gizmos.cpp msgid "Portal Arrow" -msgstr "" +msgstr "Puntero del Portal" #: editor/spatial_editor_gizmos.cpp msgid "Set Portal Point Position" @@ -16089,7 +16117,7 @@ msgstr "Establecer Posición del Portal Point" #: editor/spatial_editor_gizmos.cpp msgid "Portal Front" -msgstr "" +msgstr "Frente del portal" #: editor/spatial_editor_gizmos.cpp msgid "Portal Back" @@ -16130,7 +16158,7 @@ msgstr "Orificio Oclusor" #: main/main.cpp msgid "Godot Physics" -msgstr "" +msgstr "FÃsicas de Godot" #: main/main.cpp servers/physics_2d/physics_2d_server_sw.cpp #: servers/visual/visual_server_scene.cpp @@ -16152,7 +16180,7 @@ msgstr "Servidor Multihilo" #: main/main.cpp msgid "RID Pool Prealloc" -msgstr "" +msgstr "RID Pool Prealloc" #: main/main.cpp msgid "Debugger stdout" @@ -16160,31 +16188,31 @@ msgstr "Depurador stdout" #: main/main.cpp msgid "Max Chars Per Second" -msgstr "" +msgstr "Máx. Caracteres Por Segundo" #: main/main.cpp msgid "Max Messages Per Frame" -msgstr "" +msgstr "Máx. Llamadas Por Fotograma" #: main/main.cpp msgid "Max Errors Per Second" -msgstr "" +msgstr "Máx. Errores Por Segundo" #: main/main.cpp msgid "Max Warnings Per Second" -msgstr "" +msgstr "Máx. Alertas Por Segundo" #: main/main.cpp msgid "Flush stdout On Print" -msgstr "" +msgstr "Vaciar stdout Al Imprimir" #: main/main.cpp servers/visual_server.cpp msgid "Logging" -msgstr "" +msgstr "Registro" #: main/main.cpp msgid "File Logging" -msgstr "" +msgstr "Registro De Archivos" #: main/main.cpp msgid "Enable File Logging" @@ -16196,11 +16224,11 @@ msgstr "Ruta del Registro" #: main/main.cpp msgid "Max Log Files" -msgstr "" +msgstr "Registro Máx. De Archivos" #: main/main.cpp msgid "Driver" -msgstr "" +msgstr "Controlador" #: main/main.cpp msgid "Driver Name" @@ -16208,19 +16236,19 @@ msgstr "Nombre del Controlador" #: main/main.cpp msgid "Fallback To GLES2" -msgstr "" +msgstr "Altenar A GLES2" #: main/main.cpp msgid "Use Nvidia Rect Flicker Workaround" -msgstr "" +msgstr "Usar la solución de Nvidia Rect Flicker" #: main/main.cpp msgid "DPI" -msgstr "" +msgstr "DPI" #: main/main.cpp msgid "Allow hiDPI" -msgstr "" +msgstr "Permitir hiDPI" #: main/main.cpp msgid "V-Sync" @@ -16232,15 +16260,15 @@ msgstr "Usar Sincronización Vertical" #: main/main.cpp msgid "Per Pixel Transparency" -msgstr "" +msgstr "Transparencia Por Pixel" #: main/main.cpp msgid "Allowed" -msgstr "" +msgstr "Permitido" #: main/main.cpp msgid "Intended Usage" -msgstr "" +msgstr "Uso Planteado" #: main/main.cpp msgid "Framebuffer Allocation" @@ -16252,7 +16280,7 @@ msgstr "Ahorro de EnergÃa" #: main/main.cpp msgid "Threads" -msgstr "" +msgstr "Hilos" #: main/main.cpp servers/physics_2d/physics_2d_server_wrap_mt.h msgid "Thread Model" @@ -16260,11 +16288,11 @@ msgstr "Modelo de Hilo" #: main/main.cpp msgid "Thread Safe BVH" -msgstr "" +msgstr "Hilo Seguro BVH" #: main/main.cpp msgid "Handheld" -msgstr "" +msgstr "Manipulador" #: main/main.cpp platform/javascript/export/export.cpp #: platform/uwp/export/export.cpp @@ -16274,7 +16302,7 @@ msgstr "Orientación" #: main/main.cpp scene/gui/scroll_container.cpp scene/gui/text_edit.cpp #: scene/main/scene_tree.cpp scene/register_scene_types.cpp msgid "Common" -msgstr "Común" +msgstr "Más información" #: main/main.cpp msgid "Physics FPS" @@ -16286,25 +16314,25 @@ msgstr "Forzar FPS" #: main/main.cpp msgid "Enable Pause Aware Picking" -msgstr "" +msgstr "Activar Selección en Pausa" #: main/main.cpp scene/gui/item_list.cpp scene/gui/popup_menu.cpp #: scene/gui/scroll_container.cpp scene/gui/text_edit.cpp scene/gui/tree.cpp #: scene/main/viewport.cpp scene/register_scene_types.cpp msgid "GUI" -msgstr "" +msgstr "GUI" #: main/main.cpp msgid "Drop Mouse On GUI Input Disabled" -msgstr "" +msgstr "Colocar el Mouse en la Entrada de la GUI Desactivada" #: main/main.cpp msgid "stdout" -msgstr "" +msgstr "stdout" #: main/main.cpp msgid "Print FPS" -msgstr "" +msgstr "Imprimir FPS" #: main/main.cpp msgid "Verbose stdout" @@ -16324,19 +16352,19 @@ msgstr "Retraso de los Fotogramas Msec" #: main/main.cpp msgid "Low Processor Mode" -msgstr "" +msgstr "Modo Para Procesadores Lentos" #: main/main.cpp msgid "Delta Sync After Draw" -msgstr "" +msgstr "Sincronizar Delta Después Del Evento Draw" #: main/main.cpp msgid "iOS" -msgstr "" +msgstr "iOS" #: main/main.cpp msgid "Hide Home Indicator" -msgstr "" +msgstr "Ocultar Indicador de Inicio" #: main/main.cpp msgid "Input Devices" @@ -16344,15 +16372,15 @@ msgstr "Dispositivos de Entrada" #: main/main.cpp msgid "Pointing" -msgstr "Apuntador" +msgstr "Puntero" #: main/main.cpp msgid "Touch Delay" -msgstr "" +msgstr "Retraso De Toque" #: main/main.cpp servers/visual_server.cpp msgid "GLES3" -msgstr "" +msgstr "GLES3" #: main/main.cpp servers/visual_server.cpp msgid "Shaders" @@ -16370,11 +16398,11 @@ msgstr "Entorno" #: main/main.cpp msgid "Default Clear Color" -msgstr "" +msgstr "Color Claro Predeterminado" #: main/main.cpp msgid "Boot Splash" -msgstr "" +msgstr "Pantalla de Splash" #: main/main.cpp msgid "Show Image" @@ -16382,11 +16410,11 @@ msgstr "Mostrar Imagen" #: main/main.cpp msgid "Image" -msgstr "" +msgstr "imagen" #: main/main.cpp msgid "Fullsize" -msgstr "" +msgstr "Tamaño completo" #: main/main.cpp scene/resources/dynamic_font.cpp msgid "Use Filter" @@ -16402,23 +16430,23 @@ msgstr "Icono Nativo de macOS" #: main/main.cpp msgid "Windows Native Icon" -msgstr "" +msgstr "Icono Nativo Para Windows" #: main/main.cpp msgid "Buffering" -msgstr "" +msgstr "Buffering" #: main/main.cpp msgid "Agile Event Flushing" -msgstr "" +msgstr "Evento Ãgil de Vaciado" #: main/main.cpp msgid "Emulate Touch From Mouse" -msgstr "" +msgstr "Emular Toque Desde El Mouse" #: main/main.cpp msgid "Emulate Mouse From Touch" -msgstr "" +msgstr "Emular Mouse con el Toque" #: main/main.cpp msgid "Mouse Cursor" @@ -16430,11 +16458,11 @@ msgstr "Imagen Personalizada" #: main/main.cpp msgid "Custom Image Hotspot" -msgstr "" +msgstr "Imagen personalizada para el Hotspot" #: main/main.cpp msgid "Tooltip Position Offset" -msgstr "Desplazamiento de Posición del Tooltip" +msgstr "Offset de Posición del Tooltip" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp msgid "Debugger Agent" @@ -16450,11 +16478,11 @@ msgstr "Tiempo de Espera" #: main/main.cpp msgid "Runtime" -msgstr "" +msgstr "Tiempo De Ejecución" #: main/main.cpp msgid "Unhandled Exception Policy" -msgstr "" +msgstr "PolÃtica de Excepciones No Controladas" #: main/main.cpp msgid "Main Loop Type" @@ -16471,11 +16499,11 @@ msgstr "Aspecto" #: main/main.cpp msgid "Shrink" -msgstr "" +msgstr "Reducción" #: main/main.cpp scene/main/scene_tree.cpp msgid "Auto Accept Quit" -msgstr "" +msgstr "Aceptar Cierre Del Programa Automáticamente" #: main/main.cpp scene/main/scene_tree.cpp msgid "Quit On Go Back" @@ -16487,19 +16515,19 @@ msgstr "Ajustar Controles a PÃxeles" #: main/main.cpp msgid "Dynamic Fonts" -msgstr "" +msgstr "Fuentes Dinámicas" #: main/main.cpp msgid "Use Oversampling" -msgstr "" +msgstr "Usar Sobremuestreo" #: modules/bullet/register_types.cpp modules/bullet/space_bullet.cpp msgid "Active Soft World" -msgstr "" +msgstr "Soft World Activo" #: modules/csg/csg_gizmos.cpp msgid "CSG" -msgstr "" +msgstr "CSG" #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" @@ -16523,7 +16551,7 @@ msgstr "Operación" #: modules/csg/csg_shape.cpp msgid "Calculate Tangents" -msgstr "" +msgstr "Calcular Tangentes" #: modules/csg/csg_shape.cpp msgid "Use Collision" @@ -16572,7 +16600,7 @@ msgstr "Lados" #: modules/csg/csg_shape.cpp msgid "Cone" -msgstr "" +msgstr "Cono" #: modules/csg/csg_shape.cpp msgid "Inner Radius" @@ -16584,7 +16612,7 @@ msgstr "Radio Exterior" #: modules/csg/csg_shape.cpp msgid "Ring Sides" -msgstr "" +msgstr "Lados del Anillo" #: modules/csg/csg_shape.cpp scene/2d/collision_polygon_2d.cpp #: scene/2d/light_occluder_2d.cpp scene/2d/polygon_2d.cpp @@ -16594,11 +16622,11 @@ msgstr "PolÃgono" #: modules/csg/csg_shape.cpp msgid "Spin Degrees" -msgstr "" +msgstr "Grados de Giro" #: modules/csg/csg_shape.cpp msgid "Spin Sides" -msgstr "" +msgstr "Lados de Giro" #: modules/csg/csg_shape.cpp msgid "Path Node" @@ -16610,11 +16638,11 @@ msgstr "Tipo de Intervalo de Ruta" #: modules/csg/csg_shape.cpp msgid "Path Interval" -msgstr "" +msgstr "Intervalo de Ruta" #: modules/csg/csg_shape.cpp msgid "Path Simplify Angle" -msgstr "" +msgstr "Simplificar Ãngulo de Ruta" #: modules/csg/csg_shape.cpp msgid "Path Rotation" @@ -16654,15 +16682,15 @@ msgstr "Siempre Ordenado" #: modules/enet/networked_multiplayer_enet.cpp msgid "Server Relay" -msgstr "" +msgstr "Repetidor del Servidor" #: modules/enet/networked_multiplayer_enet.cpp msgid "DTLS Verify" -msgstr "" +msgstr "Verificar DTLS" #: modules/enet/networked_multiplayer_enet.cpp msgid "DTLS Hostname" -msgstr "" +msgstr "Nombre de Host DTLS" #: modules/enet/networked_multiplayer_enet.cpp msgid "Use DTLS" @@ -16670,11 +16698,11 @@ msgstr "Usar DTLS" #: modules/fbx/editor_scene_importer_fbx.cpp msgid "FBX" -msgstr "" +msgstr "FBX" #: modules/fbx/editor_scene_importer_fbx.cpp msgid "Use FBX" -msgstr "" +msgstr "Usar FBX" #: modules/gdnative/gdnative.cpp msgid "Config File" @@ -16774,7 +16802,7 @@ msgstr "GDScript" #: modules/gdscript/editor/gdscript_highlighter.cpp msgid "Function Definition Color" -msgstr "" +msgstr "Función Definición de Color" #: modules/gdscript/editor/gdscript_highlighter.cpp msgid "Node Path Color" @@ -16782,19 +16810,19 @@ msgstr "Color de la Ruta del Nodo" #: modules/gdscript/gdscript.cpp modules/visual_script/visual_script.cpp msgid "Max Call Stack" -msgstr "" +msgstr "Pila de llamadas Máxima" #: modules/gdscript/gdscript.cpp msgid "Treat Warnings As Errors" -msgstr "" +msgstr "Tratar las Advertencias como Errores" #: modules/gdscript/gdscript.cpp msgid "Exclude Addons" -msgstr "" +msgstr "Excluir Addons" #: modules/gdscript/gdscript.cpp msgid "Autocomplete Setters And Getters" -msgstr "" +msgstr "Autocompletar Setters y Getters" #: modules/gdscript/gdscript_functions.cpp msgid "Step argument is zero!" @@ -16846,11 +16874,11 @@ msgstr "Activar Smart Resolve" #: modules/gdscript/language_server/gdscript_language_server.cpp msgid "Show Native Symbols In Editor" -msgstr "" +msgstr "Mostrar SÃmbolos Nativos en el Editor" #: modules/gdscript/language_server/gdscript_language_server.cpp msgid "Use Thread" -msgstr "" +msgstr "Usar Hilo" #: modules/gltf/editor_scene_exporter_gltf_plugin.cpp msgid "Export Mesh GLTF2" @@ -16866,7 +16894,7 @@ msgstr "Vista del Buffer" #: modules/gltf/gltf_accessor.cpp modules/gltf/gltf_buffer_view.cpp msgid "Byte Offset" -msgstr "Desplazamiento de Byte" +msgstr "Offset de Byte" #: modules/gltf/gltf_accessor.cpp msgid "Component Type" @@ -16894,11 +16922,11 @@ msgstr "Recuento Parcial" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Indices Buffer View" -msgstr "" +msgstr "Vista del Buffer de Ãndices Esparcidos" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Indices Byte Offset" -msgstr "" +msgstr "Ãndices Dispersos del Offset de Bytes" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Indices Component Type" @@ -16906,11 +16934,11 @@ msgstr "Ãndices Dispersos de Tipo de Componente" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Values Buffer View" -msgstr "" +msgstr "Vista del Buffer de Valores Esparcidos" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Values Byte Offset" -msgstr "" +msgstr "Valores Dispersos del Offset de Bytes" #: modules/gltf/gltf_buffer_view.cpp msgid "Buffer" @@ -16922,7 +16950,7 @@ msgstr "Longitud de Bytes" #: modules/gltf/gltf_buffer_view.cpp msgid "Byte Stride" -msgstr "" +msgstr "Cadencia de Byte" #: modules/gltf/gltf_buffer_view.cpp msgid "Indices" @@ -16934,7 +16962,7 @@ msgstr "Tamaño de FOV" #: modules/gltf/gltf_camera.cpp msgid "Zfar" -msgstr "" +msgstr "Zfar" #: modules/gltf/gltf_camera.cpp msgid "Znear" @@ -16954,7 +16982,7 @@ msgstr "Color" #: modules/gltf/gltf_light.cpp scene/3d/reflection_probe.cpp #: scene/resources/environment.cpp msgid "Intensity" -msgstr "" +msgstr "Intensidad" #: modules/gltf/gltf_light.cpp scene/2d/light_2d.cpp scene/3d/light.cpp msgid "Range" @@ -16962,11 +16990,11 @@ msgstr "Rango" #: modules/gltf/gltf_light.cpp msgid "Inner Cone Angle" -msgstr "" +msgstr "Ãngulo del Cono Interior" #: modules/gltf/gltf_light.cpp msgid "Outer Cone Angle" -msgstr "" +msgstr "Ãngulo del Cono Exterior" #: modules/gltf/gltf_mesh.cpp msgid "Blend Weights" @@ -16986,7 +17014,7 @@ msgstr "Xform" #: modules/gltf/gltf_node.cpp scene/3d/mesh_instance.cpp msgid "Skin" -msgstr "" +msgstr "Skin" #: modules/gltf/gltf_node.cpp scene/3d/spatial.cpp msgid "Translation" @@ -17002,11 +17030,11 @@ msgstr "Articulaciones" #: modules/gltf/gltf_skeleton.cpp modules/gltf/gltf_skin.cpp msgid "Roots" -msgstr "" +msgstr "RaÃces" #: modules/gltf/gltf_skeleton.cpp modules/gltf/gltf_state.cpp msgid "Unique Names" -msgstr "" +msgstr "Nombres Únicos" #: modules/gltf/gltf_skeleton.cpp msgid "Godot Bone Node" @@ -17022,7 +17050,7 @@ msgstr "Articulaciones Originales" #: modules/gltf/gltf_skin.cpp msgid "Inverse Binds" -msgstr "" +msgstr "Enlaces Inversos" #: modules/gltf/gltf_skin.cpp msgid "Non Joints" @@ -17030,27 +17058,27 @@ msgstr "Sin Articulaciones" #: modules/gltf/gltf_skin.cpp msgid "Joint I To Bone I" -msgstr "" +msgstr "Unir I a Hueso I" #: modules/gltf/gltf_skin.cpp msgid "Joint I To Name" -msgstr "" +msgstr "Unir I a Nombre" #: modules/gltf/gltf_skin.cpp msgid "Godot Skin" -msgstr "" +msgstr "Skin de Godot" #: modules/gltf/gltf_spec_gloss.cpp msgid "Diffuse Img" -msgstr "" +msgstr "Imagen Difusa" #: modules/gltf/gltf_spec_gloss.cpp msgid "Diffuse Factor" -msgstr "" +msgstr "Factor Difuso" #: modules/gltf/gltf_spec_gloss.cpp msgid "Gloss Factor" -msgstr "" +msgstr "Factor de Brillo" #: modules/gltf/gltf_spec_gloss.cpp msgid "Specular Factor" @@ -17058,11 +17086,11 @@ msgstr "Factor Specular" #: modules/gltf/gltf_spec_gloss.cpp msgid "Spec Gloss Img" -msgstr "" +msgstr "Espec. Brillo Img" #: modules/gltf/gltf_state.cpp msgid "Json" -msgstr "" +msgstr "Json" #: modules/gltf/gltf_state.cpp msgid "Major Version" @@ -17078,7 +17106,7 @@ msgstr "Datos GLB" #: modules/gltf/gltf_state.cpp msgid "Use Named Skin Binds" -msgstr "" +msgstr "Usar VÃnculos de Skins con Nombre" #: modules/gltf/gltf_state.cpp msgid "Buffer Views" @@ -17086,7 +17114,7 @@ msgstr "Vistas del Buffer" #: modules/gltf/gltf_state.cpp msgid "Accessors" -msgstr "" +msgstr "Accesos" #: modules/gltf/gltf_state.cpp msgid "Scene Name" @@ -17103,11 +17131,11 @@ msgstr "Texturas" #: modules/gltf/gltf_state.cpp platform/uwp/export/export.cpp msgid "Images" -msgstr "" +msgstr "Imágenes" #: modules/gltf/gltf_state.cpp msgid "Cameras" -msgstr "" +msgstr "Cámaras" #: modules/gltf/gltf_state.cpp servers/visual_server.cpp msgid "Lights" @@ -17131,7 +17159,7 @@ msgstr "Animaciones" #: modules/gltf/gltf_texture.cpp msgid "Src Image" -msgstr "Imagen de Origen" +msgstr "Origen de la Imagen" #: modules/gridmap/grid_map.cpp msgid "Mesh Library" @@ -17147,7 +17175,7 @@ msgstr "Uso en Luz Bakeada" #: modules/gridmap/grid_map.cpp scene/2d/tile_map.cpp msgid "Cell" -msgstr "" +msgstr "Celda" #: modules/gridmap/grid_map.cpp msgid "Octant Size" @@ -17169,7 +17197,7 @@ msgstr "Centro Z" #: scene/2d/tile_map.cpp scene/3d/collision_object.cpp scene/3d/soft_body.cpp #: scene/resources/material.cpp msgid "Mask" -msgstr "" +msgstr "Máscara" #: modules/gridmap/grid_map.cpp scene/2d/tile_map.cpp msgid "Bake Navigation" @@ -17345,34 +17373,34 @@ msgstr "CPU Lightmapper" #: modules/lightmapper_cpu/register_types.cpp msgid "Low Quality Ray Count" -msgstr "" +msgstr "Conteo de Rayos de Baja Calidad" #: modules/lightmapper_cpu/register_types.cpp msgid "Medium Quality Ray Count" -msgstr "" +msgstr "Conteo de Rayos de Calidad Media" #: modules/lightmapper_cpu/register_types.cpp msgid "High Quality Ray Count" -msgstr "" +msgstr "Conteo de Rayos de Calidad Alta" #: modules/lightmapper_cpu/register_types.cpp msgid "Ultra Quality Ray Count" -msgstr "" +msgstr "Conteo de Rayos de Calidad Ultra" #: modules/minimp3/audio_stream_mp3.cpp #: modules/minimp3/resource_importer_mp3.cpp #: modules/stb_vorbis/audio_stream_ogg_vorbis.cpp #: modules/stb_vorbis/resource_importer_ogg_vorbis.cpp msgid "Loop Offset" -msgstr "Desplazamiento de Ciclo" +msgstr "Offset de Bucle" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "Eye Height" -msgstr "" +msgstr "Altura Ocular" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "IOD" -msgstr "" +msgstr "IOD" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "Display Width" @@ -17384,15 +17412,15 @@ msgstr "Pantalla a Lente" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "Oversample" -msgstr "" +msgstr "Sobremuestreo" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "K1" -msgstr "" +msgstr "K1" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "K2" -msgstr "" +msgstr "K2" #: modules/mono/csharp_script.cpp msgid "Class name can't be a reserved keyword" @@ -17406,9 +17434,21 @@ msgstr "Crear Solución" msgid "Auto Update Project" msgstr "Actualización Automática del Proyecto" +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "Nombre del Conjunto" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "Directorio de Soluciones" + +#: modules/mono/godotsharp_dirs.cpp +msgid "C# Project Directory" +msgstr "Directorio de Proyectos C#" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" -msgstr "Fin del reporte de la pila de excepciones" +msgstr "Fin de la pila de excepciones internas" #: modules/navigation/navigation_mesh_editor_plugin.cpp #: scene/3d/navigation_mesh_instance.cpp @@ -17419,7 +17459,7 @@ msgstr "" #: modules/navigation/navigation_mesh_editor_plugin.cpp msgid "Bake NavMesh" -msgstr "Calcular NavMesh" +msgstr "Bakear NavMesh" #: modules/navigation/navigation_mesh_editor_plugin.cpp msgid "Clear the navigation mesh." @@ -17479,7 +17519,7 @@ msgstr "¡Hecho!" #: modules/opensimplex/noise_texture.cpp msgid "Seamless" -msgstr "" +msgstr "Sin costuras" #: modules/opensimplex/noise_texture.cpp msgid "As Normal Map" @@ -17487,23 +17527,23 @@ msgstr "Como Mapa Normal" #: modules/opensimplex/noise_texture.cpp msgid "Bump Strength" -msgstr "" +msgstr "Fuerza de Choque" #: modules/opensimplex/noise_texture.cpp msgid "Noise" -msgstr "" +msgstr "Ruido" #: modules/opensimplex/noise_texture.cpp msgid "Noise Offset" -msgstr "Desplazamiento de Ruido" +msgstr "Offset de Ruido" #: modules/opensimplex/open_simplex_noise.cpp msgid "Octaves" -msgstr "" +msgstr "Octavas" #: modules/opensimplex/open_simplex_noise.cpp msgid "Period" -msgstr "" +msgstr "Periodo" #: modules/opensimplex/open_simplex_noise.cpp msgid "Persistence" @@ -17511,11 +17551,11 @@ msgstr "Persistencia" #: modules/opensimplex/open_simplex_noise.cpp msgid "Lacunarity" -msgstr "" +msgstr "Lacunaridad" #: modules/regex/regex.cpp msgid "Subject" -msgstr "" +msgstr "Asunto" #: modules/regex/regex.cpp msgid "Names" @@ -17527,15 +17567,15 @@ msgstr "Cadenas" #: modules/upnp/upnp.cpp msgid "Discover Multicast If" -msgstr "" +msgstr "Descubrir Multicast si" #: modules/upnp/upnp.cpp msgid "Discover Local Port" -msgstr "" +msgstr "Descubrir Puerto Local" #: modules/upnp/upnp.cpp msgid "Discover IPv6" -msgstr "" +msgstr "Descubrir IPV6" #: modules/upnp/upnp_device.cpp msgid "Description URL" @@ -17547,7 +17587,7 @@ msgstr "Tipo de Servicio" #: modules/upnp/upnp_device.cpp msgid "IGD Control URL" -msgstr "" +msgstr "IGD Control URL" #: modules/upnp/upnp_device.cpp msgid "IGD Service Type" @@ -17555,7 +17595,7 @@ msgstr "Tipo de Servicio IGD" #: modules/upnp/upnp_device.cpp msgid "IGD Our Addr" -msgstr "" +msgstr "Dirección de IGD" #: modules/upnp/upnp_device.cpp msgid "IGD Status" @@ -17566,8 +17606,8 @@ msgid "" "A node yielded without working memory, please read the docs on how to yield " "properly!" msgstr "" -"¡Un nodo ejecutó un yield sin memoria de trabajo. Prueba leyendo la " -"documentación sobre cómo utilizar yield!" +"¡Un nodo realizo un yield sin memoria de trabajo, por favor, lee la " +"documentación sobre cómo usar yield correctamente!" #: modules/visual_script/visual_script.cpp msgid "" @@ -17617,7 +17657,7 @@ msgstr "Cambiar Nombre del Argumento" #: modules/visual_script/visual_script_editor.cpp msgid "Set Variable Default Value" -msgstr "Establecer Valor por Defecto de la Variable" +msgstr "Fijar Valor Predeterminado de la Variable" #: modules/visual_script/visual_script_editor.cpp msgid "Set Variable Type" @@ -18034,7 +18074,7 @@ msgstr "Ruta del Nodo" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Use Default Args" -msgstr "Usar Argumentos por Defecto" +msgstr "Usar Argumentos Predeterminados" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Validate" @@ -18215,7 +18255,7 @@ msgstr "SubCall" #: modules/visual_script/visual_script_nodes.cpp scene/gui/graph_node.cpp msgid "Title" -msgstr "" +msgstr "TÃtulo" #: modules/visual_script/visual_script_nodes.cpp msgid "Construct %s" @@ -18283,7 +18323,7 @@ msgstr "Modo de Escritura" #: modules/webrtc/webrtc_data_channel.h msgid "WebRTC" -msgstr "" +msgstr "WebRTC" #: modules/webrtc/webrtc_data_channel.h msgid "Max Channel In Buffer (KB)" @@ -18291,11 +18331,11 @@ msgstr "Buffer de Canal Máximo (KB)" #: modules/websocket/websocket_client.cpp msgid "Verify SSL" -msgstr "" +msgstr "Verificar SSL" #: modules/websocket/websocket_client.cpp msgid "Trusted SSL Certificate" -msgstr "" +msgstr "Certificado SSL de Confianza" #: modules/websocket/websocket_macros.h msgid "WebSocket Client" @@ -18307,7 +18347,7 @@ msgstr "Buffer de Entrada Máximo (KB)" #: modules/websocket/websocket_macros.h msgid "Max In Packets" -msgstr "" +msgstr "Paquetes Máximos de Entrada" #: modules/websocket/websocket_macros.h msgid "Max Out Buffer (KB)" @@ -18315,7 +18355,7 @@ msgstr "Buffer de Salida Máximo (KB)" #: modules/websocket/websocket_macros.h msgid "Max Out Packets" -msgstr "" +msgstr "Paquetes Máximos de Salida" #: modules/websocket/websocket_macros.h msgid "WebSocket Server" @@ -18323,7 +18363,7 @@ msgstr "Servidor WebSocket" #: modules/websocket/websocket_server.cpp msgid "Bind IP" -msgstr "" +msgstr "Vincular IP" #: modules/websocket/websocket_server.cpp msgid "Private Key" @@ -18331,7 +18371,7 @@ msgstr "Clave Privada" #: modules/websocket/websocket_server.cpp platform/javascript/export/export.cpp msgid "SSL Certificate" -msgstr "" +msgstr "Certificado SSL" #: modules/websocket/websocket_server.cpp msgid "CA Chain" @@ -18355,11 +18395,11 @@ msgstr "CaracterÃsticas Opcionales" #: modules/webxr/webxr_interface.cpp msgid "Requested Reference Space Types" -msgstr "" +msgstr "Tipos de Espacios de Referencia Requeridos" #: modules/webxr/webxr_interface.cpp msgid "Reference Space Type" -msgstr "" +msgstr "Tipo de Espacio de Referencia" #: modules/webxr/webxr_interface.cpp msgid "Visibility State" @@ -18375,7 +18415,7 @@ msgstr "Mapeo Estándar XR" #: platform/android/export/export.cpp msgid "Android SDK Path" -msgstr "" +msgstr "Ruta del SDK de Android" #: platform/android/export/export.cpp msgid "Debug Keystore" @@ -18383,35 +18423,35 @@ msgstr "Debug Keystore" #: platform/android/export/export.cpp msgid "Debug Keystore User" -msgstr "" +msgstr "Usuario Debug Keystore" #: platform/android/export/export.cpp msgid "Debug Keystore Pass" -msgstr "" +msgstr "Contraseña Debug Keystore" #: platform/android/export/export.cpp msgid "Force System User" -msgstr "" +msgstr "Forzar Usuario del Sistema" #: platform/android/export/export.cpp msgid "Shutdown ADB On Exit" -msgstr "" +msgstr "Apagar el ADB al Salir" #: platform/android/export/export_plugin.cpp msgid "Launcher Icons" -msgstr "" +msgstr "Iconos del Launcher" #: platform/android/export/export_plugin.cpp msgid "Main 192 X 192" -msgstr "" +msgstr "Principal 192 X 192" #: platform/android/export/export_plugin.cpp msgid "Adaptive Foreground 432 X 432" -msgstr "" +msgstr "Primer Plano Adaptable 432 X 432" #: platform/android/export/export_plugin.cpp msgid "Adaptive Background 432 X 432" -msgstr "" +msgstr "Fondo Adaptable 432 X 432" #: platform/android/export/export_plugin.cpp msgid "Package name is missing." @@ -18486,7 +18526,7 @@ msgstr "Contraseña de Release" #: platform/android/export/export_plugin.cpp msgid "One Click Deploy" -msgstr "" +msgstr "Despliegue con Un Clic" #: platform/android/export/export_plugin.cpp msgid "Clear Previous Install" @@ -18494,7 +18534,7 @@ msgstr "Limpiar Instalación Previa" #: platform/android/export/export_plugin.cpp msgid "Code" -msgstr "" +msgstr "Código" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp msgid "Package" @@ -18514,7 +18554,7 @@ msgstr "Clasificar Como Juego" #: platform/android/export/export_plugin.cpp msgid "Retain Data On Uninstall" -msgstr "" +msgstr "Conservar Datos al Desinstalar" #: platform/android/export/export_plugin.cpp msgid "Exclude From Recents" @@ -18542,11 +18582,11 @@ msgstr "Seguimiento de Manos" #: platform/android/export/export_plugin.cpp msgid "Hand Tracking Frequency" -msgstr "" +msgstr "Frecuencia de Seguimiento de la Mano" #: platform/android/export/export_plugin.cpp msgid "Passthrough" -msgstr "" +msgstr "Pasar por" #: platform/android/export/export_plugin.cpp msgid "Immersive Mode" @@ -18574,7 +18614,7 @@ msgstr "Backup de Datos del Usuario" #: platform/android/export/export_plugin.cpp msgid "Allow" -msgstr "" +msgstr "Permitir" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp msgid "Command Line" @@ -18590,7 +18630,7 @@ msgstr "Expansión del APK" #: platform/android/export/export_plugin.cpp msgid "Salt" -msgstr "" +msgstr "Sal" #: platform/android/export/export_plugin.cpp msgid "Public Key" @@ -18762,12 +18802,15 @@ msgstr "" #: platform/android/export/export_plugin.cpp msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "" +"\"Min SDK\" deberÃa ser un entero válido, pero obtuvo \"%s\" que es inválido." #: platform/android/export/export_plugin.cpp msgid "" "\"Min SDK\" cannot be lower than %d, which is the version needed by the " "Godot library." msgstr "" +"\"Min SDK\" no puede ser inferior a %d, que es la versión que necesita la " +"librerÃa de Godot." #: platform/android/export/export_plugin.cpp msgid "" @@ -18787,7 +18830,7 @@ msgid "" "\"Target SDK\" %d is higher than the default version %d. This may work, but " "wasn't tested and may be unstable." msgstr "" -"\"SDK de Destino\" %d es superior a la versión por defecto %d. PodrÃa " +"\"SDK de Destino\" %d es superior a la versión predeterminada %d. PodrÃa " "funcionar, pero no se ha probado y puede ser inestable." #: platform/android/export/export_plugin.cpp @@ -18966,67 +19009,67 @@ msgstr "El carácter '% s' no está permitido en el Identificador." #: platform/iphone/export/export.cpp msgid "Landscape Launch Screens" -msgstr "" +msgstr "Pantalla de Inicio Landscape" #: platform/iphone/export/export.cpp msgid "iPhone 2436 X 1125" -msgstr "" +msgstr "iPhone 2436 X 1125" #: platform/iphone/export/export.cpp msgid "iPhone 2208 X 1242" -msgstr "" +msgstr "iPhone 2208 X 1242" #: platform/iphone/export/export.cpp msgid "iPad 1024 X 768" -msgstr "" +msgstr "iPad 1024 X 768" #: platform/iphone/export/export.cpp msgid "iPad 2048 X 1536" -msgstr "" +msgstr "iPad 2048 X 1536" #: platform/iphone/export/export.cpp msgid "Portrait Launch Screens" -msgstr "" +msgstr "Pantalla de Inicio Portrait" #: platform/iphone/export/export.cpp msgid "iPhone 640 X 960" -msgstr "" +msgstr "iPhone 640 X 960" #: platform/iphone/export/export.cpp msgid "iPhone 640 X 1136" -msgstr "" +msgstr "iPhone 640 X 1136" #: platform/iphone/export/export.cpp msgid "iPhone 750 X 1334" -msgstr "" +msgstr "iPhone 750 X 1334" #: platform/iphone/export/export.cpp msgid "iPhone 1125 X 2436" -msgstr "" +msgstr "iPhone 1125 X 2436" #: platform/iphone/export/export.cpp msgid "iPad 768 X 1024" -msgstr "" +msgstr "iPad 768 X 1024" #: platform/iphone/export/export.cpp msgid "iPad 1536 X 2048" -msgstr "" +msgstr "iPad 1536 X 2048" #: platform/iphone/export/export.cpp msgid "iPhone 1242 X 2208" -msgstr "" +msgstr "iPhone 1242 X 2208" #: platform/iphone/export/export.cpp msgid "App Store Team ID" -msgstr "" +msgstr "ID del Equipo de la App Store" #: platform/iphone/export/export.cpp msgid "Provisioning Profile UUID Debug" -msgstr "" +msgstr "Depuración del Perfil de Aprovisionamiento UUID" #: platform/iphone/export/export.cpp msgid "Code Sign Identity Debug" -msgstr "" +msgstr "Depuración de la Identidad del Código" #: platform/iphone/export/export.cpp msgid "Export Method Debug" @@ -19034,11 +19077,11 @@ msgstr "Exportar Método de Depuración" #: platform/iphone/export/export.cpp msgid "Provisioning Profile UUID Release" -msgstr "" +msgstr "Release UUID del Perfil de Aprovisionamiento" #: platform/iphone/export/export.cpp msgid "Code Sign Identity Release" -msgstr "" +msgstr "Release de Código de Identidad" #: platform/iphone/export/export.cpp msgid "Export Method Release" @@ -19046,11 +19089,11 @@ msgstr "Método de Exportación de Release" #: platform/iphone/export/export.cpp msgid "Targeted Device Family" -msgstr "" +msgstr "Familia de Dispositivos de Destino" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp msgid "Info" -msgstr "" +msgstr "Información" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp msgid "Identifier" @@ -19087,11 +19130,11 @@ msgstr "Datos de Usuario" #: platform/iphone/export/export.cpp msgid "Accessible From Files App" -msgstr "" +msgstr "Accesible desde la Aplicación de Archivos" #: platform/iphone/export/export.cpp msgid "Accessible From iTunes Sharing" -msgstr "" +msgstr "Accesible desde iTunes Sharing" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp msgid "Privacy" @@ -19111,43 +19154,43 @@ msgstr "Descripción del Uso de la FotolibrerÃa" #: platform/iphone/export/export.cpp msgid "iPhone 120 X 120" -msgstr "" +msgstr "iPhone 120 X 120" #: platform/iphone/export/export.cpp msgid "iPhone 180 X 180" -msgstr "" +msgstr "iPhone 180 X 180" #: platform/iphone/export/export.cpp msgid "iPad 76 X 76" -msgstr "" +msgstr "iPad 76 X 76" #: platform/iphone/export/export.cpp msgid "iPad 152 X 152" -msgstr "" +msgstr "iPad 152 X 152" #: platform/iphone/export/export.cpp msgid "iPad 167 X 167" -msgstr "" +msgstr "iPad 167 X 167" #: platform/iphone/export/export.cpp msgid "App Store 1024 X 1024" -msgstr "" +msgstr "App Store 1024 X 1024" #: platform/iphone/export/export.cpp msgid "Spotlight 40 X 40" -msgstr "" +msgstr "Spotlight 40 X 40" #: platform/iphone/export/export.cpp msgid "Spotlight 80 X 80" -msgstr "" +msgstr "Spotlight 80 X 80" #: platform/iphone/export/export.cpp msgid "Storyboard" -msgstr "" +msgstr "Storyboard" #: platform/iphone/export/export.cpp msgid "Use Launch Screen Storyboard" -msgstr "" +msgstr "Usar Storyboard en la Pantalla de Inicio" #: platform/iphone/export/export.cpp msgid "Image Scale Mode" @@ -19169,6 +19212,10 @@ msgstr "Usar Color de Fondo Personalizado" msgid "Custom BG Color" msgstr "Color de Fondo Personalizado" +#: platform/iphone/export/export.cpp +msgid "Export Icons" +msgstr "Iconos de Exportación" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19221,7 +19268,7 @@ msgstr "No se pudo leer el archivo: \"%s\"." #: platform/javascript/export/export.cpp msgid "PWA" -msgstr "" +msgstr "PWA" #: platform/javascript/export/export.cpp msgid "Variant" @@ -19237,15 +19284,15 @@ msgstr "Compresión de Texturas en la VRAM" #: platform/javascript/export/export.cpp msgid "For Desktop" -msgstr "" +msgstr "Para Escritorio" #: platform/javascript/export/export.cpp msgid "For Mobile" -msgstr "" +msgstr "Para Móviles" #: platform/javascript/export/export.cpp msgid "HTML" -msgstr "" +msgstr "HTML" #: platform/javascript/export/export.cpp msgid "Export Icon" @@ -19257,15 +19304,15 @@ msgstr "HTML Shell Personalizado" #: platform/javascript/export/export.cpp msgid "Head Include" -msgstr "" +msgstr "Incluyendo Cabecera" #: platform/javascript/export/export.cpp msgid "Canvas Resize Policy" -msgstr "" +msgstr "PolÃtica de Redimensionamiento del Canvas" #: platform/javascript/export/export.cpp msgid "Focus Canvas On Start" -msgstr "" +msgstr "Enfocar Lienzo Al Inicio" #: platform/javascript/export/export.cpp msgid "Experimental Virtual Keyboard" @@ -19273,23 +19320,23 @@ msgstr "Teclado Virtual Experimental" #: platform/javascript/export/export.cpp msgid "Progressive Web App" -msgstr "" +msgstr "App Web Progresiva" #: platform/javascript/export/export.cpp msgid "Offline Page" -msgstr "" +msgstr "Página Offline" #: platform/javascript/export/export.cpp msgid "Icon 144 X 144" -msgstr "" +msgstr "Icono 144 X 144" #: platform/javascript/export/export.cpp msgid "Icon 180 X 180" -msgstr "" +msgstr "Icono 180 X 180" #: platform/javascript/export/export.cpp msgid "Icon 512 X 512" -msgstr "" +msgstr "Icono 512 X 512" #: platform/javascript/export/export.cpp msgid "Could not read HTML shell: \"%s\"." @@ -19305,15 +19352,15 @@ msgstr "Error al iniciar el servidor HTTP: %d." #: platform/javascript/export/export.cpp msgid "Web" -msgstr "" +msgstr "Web" #: platform/javascript/export/export.cpp msgid "HTTP Host" -msgstr "" +msgstr "HTTP Host" #: platform/javascript/export/export.cpp msgid "HTTP Port" -msgstr "" +msgstr "Puerto HTTP" #: platform/javascript/export/export.cpp msgid "Use SSL" @@ -19321,7 +19368,7 @@ msgstr "Usar SSL" #: platform/javascript/export/export.cpp msgid "SSL Key" -msgstr "" +msgstr "Clave SSL" #: platform/osx/export/codesign.cpp msgid "Can't get filesystem access." @@ -19401,7 +19448,7 @@ msgstr "CategorÃa De La Aplicación" #: platform/osx/export/export.cpp msgid "High Res" -msgstr "" +msgstr "Alta Resolución" #: platform/osx/export/export.cpp msgid "Location Usage Description" @@ -19409,7 +19456,7 @@ msgstr "Ubicación de la Descripción de Uso" #: platform/osx/export/export.cpp msgid "Address Book Usage Description" -msgstr "" +msgstr "Descripción de Uso de la Libreta de Direcciones" #: platform/osx/export/export.cpp msgid "Calendar Usage Description" @@ -19429,15 +19476,15 @@ msgstr "Descripción de Uso de la Carpeta de Documentos" #: platform/osx/export/export.cpp msgid "Downloads Folder Usage Description" -msgstr "" +msgstr "Descripción de Uso de la Carpeta de Descargas" #: platform/osx/export/export.cpp msgid "Network Volumes Usage Description" -msgstr "" +msgstr "Descripción de Uso de Volúmenes de Red" #: platform/osx/export/export.cpp msgid "Removable Volumes Usage Description" -msgstr "" +msgstr "Descripción de Uso de Volúmenes ExtraÃbles" #: platform/osx/export/export.cpp platform/windows/export/export.cpp msgid "Codesign" @@ -19470,15 +19517,15 @@ msgstr "Archivo Personalizado" #: platform/osx/export/export.cpp msgid "Allow JIT Code Execution" -msgstr "" +msgstr "Permitir Ejecución de Código JIT" #: platform/osx/export/export.cpp msgid "Allow Unsigned Executable Memory" -msgstr "" +msgstr "Permitir Memoria Ejecutable Desfasada" #: platform/osx/export/export.cpp msgid "Allow Dyld Environment Variables" -msgstr "" +msgstr "Permitir Variables de Entorno Dyld" #: platform/osx/export/export.cpp msgid "Disable Library Validation" @@ -19490,11 +19537,11 @@ msgstr "Entrada de Audio" #: platform/osx/export/export.cpp msgid "Address Book" -msgstr "" +msgstr "Libreta de Direcciones" #: platform/osx/export/export.cpp msgid "Calendars" -msgstr "" +msgstr "Calendarios" #: platform/osx/export/export.cpp msgid "Photos Library" @@ -19510,7 +19557,7 @@ msgstr "Depuración" #: platform/osx/export/export.cpp msgid "App Sandbox" -msgstr "" +msgstr "App Sandbox" #: platform/osx/export/export.cpp msgid "Network Server" @@ -19526,7 +19573,7 @@ msgstr "Dispositivo USB" #: platform/osx/export/export.cpp msgid "Device Bluetooth" -msgstr "" +msgstr "Dispositivo Bluetooth" #: platform/osx/export/export.cpp msgid "Files Downloads" @@ -19554,7 +19601,7 @@ msgstr "Notarización" #: platform/osx/export/export.cpp msgid "Apple ID Name" -msgstr "" +msgstr "Nombre del ID de Apple" #: platform/osx/export/export.cpp msgid "Apple ID Password" @@ -19562,7 +19609,7 @@ msgstr "Contraseña del ID de Apple" #: platform/osx/export/export.cpp msgid "Apple Team ID" -msgstr "" +msgstr "ID del Equipo Apple" #: platform/osx/export/export.cpp msgid "Could not open icon file \"%s\"." @@ -19578,7 +19625,7 @@ msgstr "La notarización ha fallado." #: platform/osx/export/export.cpp msgid "Notarization request UUID: \"%s\"" -msgstr "" +msgstr "Solicitud de notarización UUID: \"%s\"" #: platform/osx/export/export.cpp msgid "" @@ -19617,11 +19664,11 @@ msgstr "" #: platform/osx/export/export.cpp msgid "Built-in CodeSign failed with error \"%s\"." -msgstr "" +msgstr "El CodeSign incorporado falló con el error \"%s\"." #: platform/osx/export/export.cpp msgid "Built-in CodeSign require regex module." -msgstr "" +msgstr "El CodeSign incorporado requiere un módulo regex." #: platform/osx/export/export.cpp msgid "" @@ -19994,6 +20041,14 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" +"La versión Mono de Godot no es compatible con la plataforma UWP. Utiliza la " +"compilación estándar (sin soporte para C#) si deseas enfocarte en UWP." + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Nombre corto del paquete inválido." @@ -20020,43 +20075,41 @@ msgstr "Color de fondo inválido." #: platform/uwp/export/export.cpp msgid "Invalid Store Logo image dimensions (should be 50x50)." msgstr "" -"Las dimensiones de la imagen para el Store Logo son inválidas (deberÃa ser " -"50x50)." +"Las dimensiones del logo de la tienda son inválidas (deberÃa ser 50x50)." #: platform/uwp/export/export.cpp msgid "Invalid square 44x44 logo image dimensions (should be 44x44)." msgstr "" -"Las dimensiones de la imagen para el logo cuadrado de 44x44 son inválidas " -"(deberÃa ser 44x44)." +"Las dimensiones de la imagen del logo cuadrado 44x44 son inválidas (deben " +"ser 44x44)." #: platform/uwp/export/export.cpp msgid "Invalid square 71x71 logo image dimensions (should be 71x71)." msgstr "" -"Las dimensiones de la imagen para el logo cuadrado de 71x71 son inválidas " -"(deberÃa ser 71x71)." +"Las dimensiones de la imagen del logo cuadrado 71x71 son inválidas ( deben " +"ser 71x71)." #: platform/uwp/export/export.cpp msgid "Invalid square 150x150 logo image dimensions (should be 150x150)." msgstr "" -"Las dimensiones de la imagen para el logo cuadrado de 150x150 son inválidas " -"(deberÃa ser 150x150)." +"Las dimensiones de la imagen del logo cuadrado 150x150 son inválidas ( deben " +"ser 150x150)." #: platform/uwp/export/export.cpp msgid "Invalid square 310x310 logo image dimensions (should be 310x310)." msgstr "" -"Las dimensiones de la imagen para el logo cuadrado de 310x310 son inválidas " -"(deberÃa ser 310x310)." +"Las dimensiones de la imagen del logo cuadrado 310x310 son inválidas ( deben " +"ser 310x310)." #: platform/uwp/export/export.cpp msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)." -msgstr "" -"Las dimensiones de la imagen para el logo ancho de 310x150 son inválidas " -"(deberÃa ser 310x150)." +msgstr "Las dimensiones del logo son inválidas (deben ser 310x150)." #: platform/uwp/export/export.cpp msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" -"Las dimensiones de la imagen del splash son inválidas (deberÃa ser 620x300)." +"Las dimensiones de la imagen de la pantalla de splash son inválidas (deben " +"ser 620x300)." #: platform/uwp/export/export.cpp msgid "UWP" @@ -20131,19 +20184,18 @@ msgid "Could not find wine executable at \"%s\"." msgstr "No se pudo encontrar el ejecutable de wine en \"%s\"." #: platform/windows/export/export.cpp -#, fuzzy msgid "" "Could not start rcedit executable. Configure rcedit path in the Editor " "Settings (Export > Windows > Rcedit), or disable \"Application > Modify " "Resources\" in the export preset." msgstr "" -"No se ha podido iniciar el ejecutable rcedit, configura la ruta de rcedit en " -"la configuración del editor (Exportar > Windows > Rcedit)." +"No se ha podido iniciar el ejecutable de rcedit. Configura la ruta de rcedit " +"en la configuración del editor (Exportar > Windows > Rcedit), o desactiva " +"\"Aplicación > Modificar Recursos\" en el preset de exportación." #: platform/windows/export/export.cpp -#, fuzzy msgid "rcedit failed to modify executable: %s." -msgstr "Fallo al abrir el archivo ejecutable \"%s\"." +msgstr "rcedit falló al modificar el ejecutable: %s." #: platform/windows/export/export.cpp msgid "Could not find signtool executable at \"%s\"." @@ -20162,19 +20214,18 @@ msgid "Invalid timestamp server." msgstr "Servidor de marcas de tiempo inválido." #: platform/windows/export/export.cpp -#, fuzzy msgid "" "Could not start signtool executable. Configure signtool path in the Editor " "Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " "export preset." msgstr "" -"No se ha podido iniciar el ejecutable de signtool, configura la ruta de " -"signtool en la configuración del editor (Exportar > Windows > Signtool)." +"No se ha podido iniciar el ejecutable de signtool. Configura la ruta de " +"signtool en la configuración del editor (Exportar > Windows > Signtool), o " +"desactiva \"Codesign\" en el preset de exportación." #: platform/windows/export/export.cpp -#, fuzzy msgid "Signtool failed to sign executable: %s." -msgstr "Fallo al abrir el archivo ejecutable \"%s\"." +msgstr "Signtool no pudo firmar el ejecutable: %s." #: platform/windows/export/export.cpp msgid "Failed to remove temporary file \"%s\"." @@ -20865,12 +20916,12 @@ msgstr "Curva de Velocidad" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Offset Random" -msgstr "Desplazamiento Aleatorio" +msgstr "Offset Aleatorio" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Offset Curve" -msgstr "Curva de Desplazamiento" +msgstr "Curva de Offset" #: scene/2d/joints_2d.cpp msgid "Node A and Node B must be PhysicsBody2Ds" @@ -20921,7 +20972,7 @@ msgstr "" #: scene/2d/joints_2d.cpp msgid "Initial Offset" -msgstr "Desplazamiento Inicial" +msgstr "Offset Inicial" #: scene/2d/joints_2d.cpp scene/3d/vehicle_body.cpp msgid "Rest Length" @@ -21016,7 +21067,7 @@ msgstr "Curva de Ancho" #: scene/2d/line_2d.cpp scene/resources/default_theme/default_theme.cpp msgid "Default Color" -msgstr "Color por Defecto" +msgstr "Color Predeterminado" #: scene/2d/line_2d.cpp scene/resources/texture.cpp msgid "Fill" @@ -21128,7 +21179,7 @@ msgstr "Velocidad Máxima" msgid "" "The NavigationAgent2D can be used only under a Node2D inheriting parent node." msgstr "" -"El NavigationAgent2D sólo puede utilizarse bajo un nodo padre hijo de Node2D." +"El NavigationAgent2D solo puede usarse con un nodo padre del tipo Node2D." #: scene/2d/navigation_obstacle_2d.cpp scene/3d/navigation_obstacle.cpp msgid "Estimate Radius" @@ -21194,7 +21245,7 @@ msgstr "Scroll" #: scene/2d/parallax_background.cpp msgid "Base Offset" -msgstr "Desplazamiento Base" +msgstr "Offset Base" #: scene/2d/parallax_background.cpp msgid "Base Scale" @@ -21291,15 +21342,15 @@ msgstr "" #: scene/2d/path_2d.cpp scene/3d/path.cpp msgid "Unit Offset" -msgstr "Desplazamiento de Unidad" +msgstr "Offset de Unidad" #: scene/2d/path_2d.cpp scene/3d/camera.cpp scene/3d/path.cpp msgid "H Offset" -msgstr "Desplazamiento H" +msgstr "Offset H" #: scene/2d/path_2d.cpp scene/3d/camera.cpp scene/3d/path.cpp msgid "V Offset" -msgstr "Desplazamiento V" +msgstr "Offset V" #: scene/2d/path_2d.cpp scene/3d/path.cpp msgid "Cubic Interp" @@ -21338,7 +21389,7 @@ msgstr "" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: scene/resources/world.cpp scene/resources/world_2d.cpp msgid "Default Gravity" -msgstr "Gravedad por Defecto" +msgstr "Gravedad Predeterminada" #: scene/2d/physics_body_2d.cpp msgid "" @@ -21517,7 +21568,7 @@ msgstr "Ruta Remota" #: scene/2d/remote_transform_2d.cpp scene/3d/remote_transform.cpp msgid "Use Global Coordinates" -msgstr "Utilizar Coordenadas Globales" +msgstr "Usar Coordenadas Globales" #: scene/2d/skeleton_2d.cpp scene/3d/skeleton.cpp msgid "Rest" @@ -21525,7 +21576,7 @@ msgstr "Reposo" #: scene/2d/skeleton_2d.cpp msgid "Default Length" -msgstr "Longitud por Defecto" +msgstr "Longitud Predeterminada" #: scene/2d/skeleton_2d.cpp msgid "This Bone2D chain should end at a Skeleton2D node." @@ -21583,7 +21634,7 @@ msgstr "Transformación Personalizada" #: scene/2d/tile_map.cpp msgid "Half Offset" -msgstr "Medio Desplazamiento" +msgstr "Medio Offset" #: scene/2d/tile_map.cpp msgid "Tile Origin" @@ -21877,7 +21928,7 @@ msgstr "Propagación" #: scene/3d/baked_lightmap.cpp msgid "Image Path" -msgstr "" +msgstr "Ruta de la Imagen" #: scene/3d/baked_lightmap.cpp msgid "Light Data" @@ -22263,7 +22314,7 @@ msgstr "Altura de la Celda" #: scene/3d/navigation_agent.cpp msgid "Agent Height Offset" -msgstr "" +msgstr "Offset de Altura del Agente" #: scene/3d/navigation_agent.cpp msgid "Ignore Y" @@ -22273,7 +22324,7 @@ msgstr "Ignorar Y" msgid "" "The NavigationAgent can be used only under a Spatial inheriting parent node." msgstr "" -"El NavigationAgent solo puede utilizarse en un nodo padre de tipo Spatial." +"El NavigationAgent solo puede usarse con un nodo padre de tipo Spatial." #: scene/3d/navigation_mesh_instance.cpp scene/resources/mesh_library.cpp msgid "NavMesh" @@ -22557,7 +22608,7 @@ msgstr "Punto de Equilibrio Angular" #: scene/3d/physics_body.cpp msgid "Body Offset" -msgstr "Desplazamiento del Cuerpo" +msgstr "Offset del Cuerpo" #: scene/3d/physics_joint.cpp msgid "Node A and Node B must be PhysicsBodies" @@ -22761,7 +22812,7 @@ msgstr "Sala Vinculada" #: scene/3d/portal.cpp msgid "Use Default Margin" -msgstr "Usar Margen por Defecto" +msgstr "Usar Margen Predeterminado" #: scene/3d/proximity_group.cpp msgid "Group Name" @@ -22789,7 +22840,7 @@ msgstr "Modo de Actualización" #: scene/3d/reflection_probe.cpp msgid "Origin Offset" -msgstr "Desplazamiento de Origen" +msgstr "Offset de Origen" #: scene/3d/reflection_probe.cpp msgid "Box Projection" @@ -22842,7 +22893,7 @@ msgstr "" #: scene/3d/room.cpp msgid "Use Default Simplify" -msgstr "" +msgstr "Usar Simplificación Predeterminada" #: scene/3d/room.cpp scene/3d/room_manager.cpp msgid "Room Simplify" @@ -22945,7 +22996,7 @@ msgstr "" #: scene/3d/room_manager.cpp msgid "Default Portal Margin" -msgstr "Margen del Portal por Defecto" +msgstr "Margen del Portal Predeterminado" #: scene/3d/room_manager.cpp msgid "Roaming Expansion Margin" @@ -23351,7 +23402,7 @@ msgstr "Opciones de Reproducción" #: scene/animation/animation_player.cpp msgid "Default Blend Time" -msgstr "Tiempo de Mezcla por Defecto" +msgstr "Tiempo de Mezcla Predeterminado" #: scene/animation/animation_player.cpp msgid "Method Call Mode" @@ -23618,7 +23669,7 @@ msgstr "Tamaño MÃnimo" #: scene/gui/control.cpp msgid "Pivot Offset" -msgstr "Pivote de Desplazamiento" +msgstr "Pivote de Offset" #: scene/gui/control.cpp msgid "Clip Content" @@ -23666,7 +23717,7 @@ msgstr "" #: scene/gui/control.cpp msgid "Default Cursor Shape" -msgstr "Forma del Cursor por Defecto" +msgstr "Forma del Cursor Predeterminado" #: scene/gui/control.cpp msgid "Pass On Modal Close Click" @@ -23718,7 +23769,7 @@ msgstr "Desconexión Correcta" #: scene/gui/graph_edit.cpp msgid "Scroll Offset" -msgstr "Desplazamiento de Scroll" +msgstr "Offset de Scroll" #: scene/gui/graph_edit.cpp msgid "Snap Distance" @@ -24035,7 +24086,6 @@ msgid "Elapsed Time" msgstr "Tiempo Transcurrido" #: scene/gui/rich_text_effect.cpp -#, fuzzy msgid "Env" msgstr "Env" @@ -24107,7 +24157,7 @@ msgstr "Vertical Activada" #: scene/gui/scroll_container.cpp msgid "Default Scroll Deadzone" -msgstr "" +msgstr "Zona Muerta Predeterminada del Scroll" #: scene/gui/slider.cpp msgid "Scrollable" @@ -24131,7 +24181,7 @@ msgstr "Sufijo" #: scene/gui/split_container.cpp msgid "Split Offset" -msgstr "Desplazamiento de División" +msgstr "Offset de División" #: scene/gui/split_container.cpp scene/gui/tree.cpp msgid "Collapsed" @@ -24260,7 +24310,7 @@ msgstr "Progreso" #: scene/gui/texture_progress.cpp msgid "Progress Offset" -msgstr "" +msgstr "Offset de Progreso" #: scene/gui/texture_progress.cpp msgid "Fill Mode" @@ -24284,7 +24334,7 @@ msgstr "Completar Grados" #: scene/gui/texture_progress.cpp scene/resources/primitive_meshes.cpp msgid "Center Offset" -msgstr "Desplazamiento Central" +msgstr "Offset Central" #: scene/gui/texture_progress.cpp msgid "Nine Patch Stretch" @@ -24515,15 +24565,16 @@ msgstr "" #: scene/main/scene_tree.cpp msgid "Default Environment" -msgstr "Entorno por Defecto" +msgstr "Entorno Predeterminado" #: scene/main/scene_tree.cpp msgid "" "Default Environment as specified in Project Settings (Rendering -> " "Environment -> Default Environment) could not be loaded." msgstr "" -"El Entorno por Defecto como se especifica en Configuración del Proyecto " -"(Rendering -> Environment -> Default Environment) no se ha podido cargar." +"No se ha podido cargar el entorno predeterminado especificado en la " +"configuración del proyecto (Renderizado -> Entorno -> Entorno " +"Predeterminado)." #: scene/main/scene_tree.cpp msgid "Enable Object Picking" @@ -24536,11 +24587,11 @@ msgid "" "Consider using a script's process loop instead of relying on a Timer for " "very low wait times." msgstr "" -"Los tiempos de espera del temporizador muy bajos (< 0,05 segundos) pueden " -"comportarse de manera significativamente diferente dependiendo de la " -"velocidad de fotogramas renderizados o de la fÃsica.\n" -"Considera la posibilidad de utilizar un bucle en process dentro del script " -"en lugar de depender de un Timer para tiempos de espera muy bajos." +"Los tiempos de espera del temporizador son muy bajos (< 0.05 segundos) y se " +"puede comportar de manera muy diferente dependiendo de la tasa de fotogramas " +"renderizados o de la fÃsica.\n" +"Considera la posibilidad de utilizar un bucle de procesos en un script en " +"lugar de depender de un Timer para tiempos de espera muy bajos." #: scene/main/timer.cpp msgid "Autostart" @@ -24605,7 +24656,6 @@ msgid "FXAA" msgstr "FXAA" #: scene/main/viewport.cpp -#, fuzzy msgid "Debanding" msgstr "Debanding" @@ -24686,9 +24736,8 @@ msgid "Tooltip Delay (sec)" msgstr "Retraso del Tooltip (sec)" #: scene/register_scene_types.cpp -#, fuzzy msgid "Swap OK Cancel" -msgstr "Intercambio OK Cancelar" +msgstr "Cancelar" #: scene/register_scene_types.cpp msgid "Layer Names" @@ -24832,7 +24881,6 @@ msgid "Check V Adjust" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "On Disabled" msgstr "Desactivado" @@ -24854,11 +24902,11 @@ msgstr "Modulación del Contorno de la Fuente" #: scene/resources/default_theme/default_theme.cpp msgid "Shadow Offset X" -msgstr "Desplazamiento de la Sombra en X" +msgstr "Offset de Sombra en X" #: scene/resources/default_theme/default_theme.cpp msgid "Shadow Offset Y" -msgstr "Desplazamiento de la Sombra en Y" +msgstr "Offset de Sombra en Y" #: scene/resources/default_theme/default_theme.cpp msgid "Shadow As Outline" @@ -24923,43 +24971,36 @@ msgid "Completion Lines" msgstr "Finalización de LÃneas" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Completion Max Width" -msgstr "Completar" +msgstr "Completar Ancho Máximo" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Completion Scroll Width" -msgstr "Importar Seleccionado" +msgstr "Completar Ancho de Scroll" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Scroll Focus" -msgstr "Llenar superficie" +msgstr "Enfoque de Scroll" #: scene/resources/default_theme/default_theme.cpp msgid "Grabber" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Grabber Highlight" -msgstr "Resaltador de Sintaxis" +msgstr "Agarre Resaltado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Grabber Pressed" -msgstr "Preset" +msgstr "Agarre Presionado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Increment" -msgstr "Instrumento" +msgstr "Incremento" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Increment Highlight" -msgstr "Resaltador de Sintaxis" +msgstr "Incremento Resaltado" #: scene/resources/default_theme/default_theme.cpp msgid "Increment Pressed" @@ -24970,9 +25011,8 @@ msgid "Decrement" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Decrement Highlight" -msgstr "Resaltador de Sintaxis" +msgstr "Decremento Resaltado" #: scene/resources/default_theme/default_theme.cpp msgid "Decrement Pressed" @@ -24991,9 +25031,8 @@ msgid "Grabber Area Highlight" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Grabber Disabled" -msgstr "Desactivar Elemento" +msgstr "Agarre Desactivado" #: scene/resources/default_theme/default_theme.cpp msgid "Tick" @@ -25004,74 +25043,60 @@ msgid "Updown" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Scaleborder Size" -msgstr "Tamaño del Borde" +msgstr "Tamaño del Borde de la Escala" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Font" -msgstr "Código Fuente" +msgstr "Fuente del TÃtulo" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Color" -msgstr "Color de Texto" +msgstr "Color del TÃtulo" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Height" -msgstr "Prueba" +msgstr "Altura del TÃtulo" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Close Highlight" -msgstr "Resaltado" +msgstr "Cierre Resaltado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Close H Offset" -msgstr "Desplazamiento de Ruido" +msgstr "Cerrar Offset H" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Close V Offset" -msgstr "Desplazamiento de Ruido" +msgstr "Cerrar Offset V" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Parent Folder" -msgstr "Crear Carpeta" +msgstr "Carpeta Padre" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Toggle Hidden" -msgstr "Act./Desact. Archivos Ocultos" +msgstr "Oculto" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Panel Disabled" -msgstr "Clip Deshabilitado" +msgstr "Panel Desactivado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Labeled Separator Left" -msgstr "Separador con nombre" +msgstr "Separador con Etiqueta a la Izquierda" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Labeled Separator Right" -msgstr "Separador con nombre" +msgstr "Separador con Etiqueta a la Derecha" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Separator" -msgstr "Separador de Color de Fuentes" +msgstr "Separación de Fuente" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Accel" -msgstr "Color Hueso 1" +msgstr "Color de Fuente Accel" #: scene/resources/default_theme/default_theme.cpp msgid "Font Color Separator" @@ -25082,230 +25107,188 @@ msgid "V Separation" msgstr "Separación en V" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Selected Frame" -msgstr "Seleccionar Fotogramas" +msgstr "Cuadro Seleccionado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Default Frame" -msgstr "Z Lejana por Defecto" +msgstr "Cuadro Predeterminado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Default Focus" -msgstr "Por defecto" +msgstr "Enfoque Predeterminado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Comment Focus" -msgstr "Confirmar" +msgstr "Comentario Enfocado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Breakpoint" -msgstr "Puntos de interrupción" +msgstr "Punto de Ruptura" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Resizer" -msgstr "Redimensionable" +msgstr "Reajuste" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Close Color" -msgstr "Colores" +msgstr "Cerrar Color" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Resizer Color" -msgstr "Colores" +msgstr "Cambiar Color" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Offset" -msgstr "Desplazamiento de Byte" +msgstr "Offset del TÃtulo" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Close Offset" -msgstr "Desplazamiento de Ruido" +msgstr "Offset de Cierre" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Port Offset" -msgstr "Pivote de Desplazamiento" +msgstr "Offset del Puerto" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "BG Focus" -msgstr "Foco en Ruta" +msgstr "Enfocar BG" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Selected Focus" -msgstr "Seleccionar" +msgstr "Enfoque Seleccionado" #: scene/resources/default_theme/default_theme.cpp msgid "Cursor Unfocused" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Button Pressed" -msgstr "Preset" +msgstr "Botón Presionado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Button Normal" -msgstr "Botón de Conmutación" +msgstr "Botón del TÃtulo Normal" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Button Pressed" -msgstr "Botón de Conmutación" +msgstr "Botón del TÃtulo Presionado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Button Hover" -msgstr "Botón de Conmutación" +msgstr "Botón de TÃtulo Hover" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Custom Button" -msgstr "CustomNode" +msgstr "Botón Personalizado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Custom Button Pressed" -msgstr "Opciones de Bus" +msgstr "Botón Personalizado Presionado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Custom Button Hover" -msgstr "CustomNode" +msgstr "Botón Personalizado Hover" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Select Arrow" -msgstr "Seleccionar Todo" +msgstr "Seleccionar Flecha" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Arrow Collapsed" -msgstr "Colapsar Todo" +msgstr "Flecha Colapsada" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Button Font" -msgstr "Botón de Conmutación" +msgstr "Fuente del TÃtulo del Botón" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Button Color" -msgstr "Color de Selección" +msgstr "Color del TÃtulo del Botón" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Guide Color" -msgstr "Color de GuÃas" +msgstr "GuÃa de Colores" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Drop Position Color" -msgstr "Posición del Dock" +msgstr "Posición del Gotero de Color" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Relationship Line Color" -msgstr "Opacidad De LÃnea De Relación" +msgstr "Color de la LÃnea de Relación" #: scene/resources/default_theme/default_theme.cpp msgid "Custom Button Font Highlight" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Item Margin" -msgstr "Asignar Margen" +msgstr "Margen del Ãtem" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Button Margin" -msgstr "Máscara de Botones" +msgstr "Margen del Botón" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Draw Relationship Lines" -msgstr "Opacidad De LÃnea De Relación" +msgstr "Dibujar LÃneas de Relación" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Draw Guides" -msgstr "Mostrar GuÃas" +msgstr "GuÃas de Dibujo" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Scroll Border" -msgstr "Desplazarse Verticalmente" +msgstr "Borde del Scroll" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Scroll Speed" -msgstr "Velocidad Desplazamiento V" +msgstr "Velocidad del Scroll" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Icon Margin" -msgstr "Asignar Margen" +msgstr "Margen del Icono" #: scene/resources/default_theme/default_theme.cpp msgid "Line Separation" msgstr "Separación de LÃneas" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Tab FG" -msgstr "Tab 1" +msgstr "Pestaña FG" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Tab BG" -msgstr "Tab 1" +msgstr "Pestaña BG" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Tab Disabled" -msgstr "Desactivar Elemento" +msgstr "Pestaña Desactivada" #: scene/resources/default_theme/default_theme.cpp msgid "Menu" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Menu Highlight" -msgstr "Resaltado" +msgstr "Menú Resaltado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color FG" -msgstr "Color Hueso 1" +msgstr "Color de Fuente FG" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color BG" -msgstr "Color Hueso 1" +msgstr "Color de Fuente BG" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Side Margin" -msgstr "Asignar Margen" +msgstr "Margen Lateral" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Top Margin" -msgstr "Asignar Margen" +msgstr "Margen Superior" #: scene/resources/default_theme/default_theme.cpp msgid "Label V Align FG" @@ -25316,86 +25299,72 @@ msgid "Label V Align BG" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Large" -msgstr "Objetivo" +msgstr "Largo" #: scene/resources/default_theme/default_theme.cpp msgid "Folder" msgstr "Carpeta" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Folder Icon Modulate" -msgstr "Forzar Modulación en Blanco" +msgstr "Modular Icono de Carpeta" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "File Icon Modulate" -msgstr "Modo de Icono" +msgstr "Modular Icono de Archivo" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Files Disabled" -msgstr "Clip Deshabilitado" +msgstr "Archivos Desactivados" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "SV Width" -msgstr "Ancho Izquierda" +msgstr "Ancho SV" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "SV Height" -msgstr "Luz" +msgstr "Alto SV" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "H Width" -msgstr "Ancho Izquierda" +msgstr "Ancho H" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Label Width" -msgstr "Ancho Izquierda" +msgstr "Ancho de Etiqueta" #: scene/resources/default_theme/default_theme.cpp msgid "Screen Picker" msgstr "Selector de Pantalla" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Add Preset" -msgstr "Cargar Ajuste Predeterminado" +msgstr "Añadir Preset" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Color Hue" -msgstr "Textura de Color" +msgstr "Tono de Color" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Color Sample" -msgstr "Colores" +msgstr "Muestra de Color" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Preset BG" -msgstr "Preajuste" +msgstr "Preset BG" #: scene/resources/default_theme/default_theme.cpp msgid "Overbright Indicator" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Preset FG" -msgstr "Preajuste" +msgstr "Preset FG" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Preset BG Icon" -msgstr "Preajuste" +msgstr "Preset Icono BG" #: scene/resources/default_theme/default_theme.cpp msgid "Normal Font" @@ -25414,9 +25383,8 @@ msgid "Bold Italics Font" msgstr "Fuente Negrita y Cursiva" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Mono Font" -msgstr "Fuente Principal" +msgstr "Fuente Mono" #: scene/resources/default_theme/default_theme.cpp msgid "Table H Separation" @@ -25443,9 +25411,8 @@ msgid "Margin Bottom" msgstr "Margen Inferior" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Autohide" -msgstr "Corte Automático" +msgstr "Ocultar Automáticamente" #: scene/resources/default_theme/default_theme.cpp msgid "Minus" @@ -25456,76 +25423,64 @@ msgid "More" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Grid Minor" -msgstr "Color de CuadrÃcula" +msgstr "Grid Menor" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Grid Major" -msgstr "Mapeo de CuadrÃcula" +msgstr "Grid Mayor" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Selection Fill" -msgstr "Sólo selección" +msgstr "Relleno de Selección" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Selection Stroke" -msgstr "Seleccionar Propiedad" +msgstr "Selección de Stroke" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Activity" -msgstr "Acción" +msgstr "Actividad" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Bezier Len Pos" -msgstr "Mover Puntos Bezier" +msgstr "Bezier Len Pos" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Bezier Len Neg" -msgstr "Bezier" +msgstr "Bezier Len Neg" #: scene/resources/default_theme/default_theme.cpp msgid "Port Grab Distance Horizontal" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Port Grab Distance Vertical" -msgstr "WaitInstanceSignal" +msgstr "Distancia Vertical del Puerto de Agarre" #: scene/resources/dynamic_font.cpp msgid "Hinting" msgstr "" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Override Oversampling" -msgstr "Elemento de Anulación" +msgstr "Anular Sobremuestreo" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Font Path" -msgstr "Foco en Ruta" +msgstr "Ruta de la Fuente" #: scene/resources/dynamic_font.cpp msgid "Outline Size" msgstr "Tamaño del Contorno" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Outline Color" -msgstr "Función" +msgstr "Color del Contorno" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Use Mipmaps" -msgstr "Señales" +msgstr "Usar Mipmaps" #: scene/resources/dynamic_font.cpp msgid "Extra Spacing" @@ -25536,9 +25491,8 @@ msgid "Char" msgstr "Char" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Font Data" -msgstr "Con Datos" +msgstr "Datos de la Fuente" #: scene/resources/environment.cpp msgid "Background" @@ -25549,14 +25503,12 @@ msgid "Sky" msgstr "" #: scene/resources/environment.cpp -#, fuzzy msgid "Sky Custom FOV" -msgstr "CustomNode" +msgstr "FOV Personalizado del Cielo" #: scene/resources/environment.cpp -#, fuzzy msgid "Sky Orientation" -msgstr "Documentación en lÃnea" +msgstr "Orientación del Cielo" #: scene/resources/environment.cpp msgid "Sky Rotation" @@ -25575,14 +25527,12 @@ msgid "Camera Feed ID" msgstr "" #: scene/resources/environment.cpp -#, fuzzy msgid "Ambient Light" -msgstr "Indentar a la Derecha" +msgstr "Luz Ambiental" #: scene/resources/environment.cpp -#, fuzzy msgid "Sky Contribution" -msgstr "Condición" +msgstr "Contribución del Cielo" #: scene/resources/environment.cpp msgid "Fog" @@ -25597,64 +25547,52 @@ msgid "Sun Amount" msgstr "Cantidad de Sol" #: scene/resources/environment.cpp -#, fuzzy msgid "Depth Enabled" -msgstr "Profundidad" +msgstr "Profundidad Activada" #: scene/resources/environment.cpp -#, fuzzy msgid "Depth Begin" -msgstr "Profundidad" +msgstr "Inicio de la Profundidad" #: scene/resources/environment.cpp -#, fuzzy msgid "Depth End" -msgstr "Profundidad" +msgstr "Fin de la Profundidad" #: scene/resources/environment.cpp -#, fuzzy msgid "Depth Curve" -msgstr "Partir Curva" +msgstr "Curva de Profundidad" #: scene/resources/environment.cpp -#, fuzzy msgid "Transmit Enabled" -msgstr "Filtrar señales" +msgstr "Transmisión Activada" #: scene/resources/environment.cpp -#, fuzzy msgid "Transmit Curve" -msgstr "Partir Curva" +msgstr "Curva de Transmisión" #: scene/resources/environment.cpp -#, fuzzy msgid "Height Enabled" -msgstr "Filtrar señales" +msgstr "Altura Activada" #: scene/resources/environment.cpp -#, fuzzy msgid "Height Min" -msgstr "Luz" +msgstr "Altura MÃnima" #: scene/resources/environment.cpp -#, fuzzy msgid "Height Max" -msgstr "Luz" +msgstr "Altura Máxima" #: scene/resources/environment.cpp -#, fuzzy msgid "Height Curve" -msgstr "Partir Curva" +msgstr "Curva de Altura" #: scene/resources/environment.cpp -#, fuzzy msgid "Tonemap" -msgstr "Remapeos" +msgstr "Tonemap" #: scene/resources/environment.cpp -#, fuzzy msgid "Exposure" -msgstr "Exportar" +msgstr "Exposición" #: scene/resources/environment.cpp msgid "White" @@ -25673,14 +25611,12 @@ msgid "Max Luma" msgstr "" #: scene/resources/environment.cpp -#, fuzzy msgid "SS Reflections" -msgstr "Escalar Selección" +msgstr "Reflexiones SS" #: scene/resources/environment.cpp -#, fuzzy msgid "Max Steps" -msgstr "Paso" +msgstr "Pasos Máximos" #: scene/resources/environment.cpp msgid "Fade In" @@ -25691,9 +25627,8 @@ msgid "Fade Out" msgstr "Fundido de Salida" #: scene/resources/environment.cpp -#, fuzzy msgid "Depth Tolerance" -msgstr "Profundidad" +msgstr "Tolerancia de Profundidad" #: scene/resources/environment.cpp scene/resources/material.cpp msgid "Roughness" @@ -25712,14 +25647,12 @@ msgid "Intensity 2" msgstr "" #: scene/resources/environment.cpp scene/resources/material.cpp -#, fuzzy msgid "Light Affect" -msgstr "Ancho Derecha" +msgstr "Influencia de la Luz" #: scene/resources/environment.cpp -#, fuzzy msgid "AO Channel Affect" -msgstr "Depuración del Canal UV" +msgstr "Influencia del Canal AO" #: scene/resources/environment.cpp msgid "Blur" @@ -25750,42 +25683,40 @@ msgid "Glow" msgstr "" #: scene/resources/environment.cpp -#, fuzzy msgid "Levels" -msgstr "Desarrolladores" +msgstr "Niveles" #: scene/resources/environment.cpp #: servers/audio/effects/audio_effect_chorus.cpp msgid "1" -msgstr "" +msgstr "1" #: scene/resources/environment.cpp #: servers/audio/effects/audio_effect_chorus.cpp msgid "2" -msgstr "" +msgstr "2" #: scene/resources/environment.cpp #: servers/audio/effects/audio_effect_chorus.cpp -#, fuzzy msgid "3" -msgstr "3D" +msgstr "3" #: scene/resources/environment.cpp #: servers/audio/effects/audio_effect_chorus.cpp msgid "4" -msgstr "" +msgstr "4" #: scene/resources/environment.cpp msgid "5" -msgstr "" +msgstr "5" #: scene/resources/environment.cpp msgid "6" -msgstr "" +msgstr "6" #: scene/resources/environment.cpp msgid "7" -msgstr "" +msgstr "7" #: scene/resources/environment.cpp msgid "Bloom" @@ -25800,9 +25731,8 @@ msgid "HDR Luminance Cap" msgstr "" #: scene/resources/environment.cpp -#, fuzzy msgid "HDR Scale" -msgstr "Escala" +msgstr "Escala HDR" #: scene/resources/environment.cpp msgid "Bicubic Upscale" @@ -25813,9 +25743,8 @@ msgid "Adjustments" msgstr "" #: scene/resources/environment.cpp -#, fuzzy msgid "Brightness" -msgstr "Luz" +msgstr "Luminosidad" #: scene/resources/environment.cpp msgid "Saturation" @@ -25830,60 +25759,52 @@ msgid "Ascent" msgstr "Aumento" #: scene/resources/font.cpp -#, fuzzy msgid "Distance Field" -msgstr "Modo Sin Distracciones" +msgstr "Campo de Distancia" #: scene/resources/gradient.cpp -#, fuzzy msgid "Raw Data" -msgstr "Profundidad" +msgstr "Datos en Crudo" #: scene/resources/gradient.cpp msgid "Offsets" -msgstr "Desplazamientos" +msgstr "Offsets" #: scene/resources/height_map_shape.cpp msgid "Map Width" msgstr "" #: scene/resources/height_map_shape.cpp -#, fuzzy msgid "Map Depth" -msgstr "Profundidad" +msgstr "Mapa de Profundidad" #: scene/resources/height_map_shape.cpp -#, fuzzy msgid "Map Data" -msgstr "Profundidad" +msgstr "Datos del Mapa" #: scene/resources/line_shape_2d.cpp msgid "D" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Next Pass" -msgstr "Siguiente Plano" +msgstr "Siguiente Paso" #: scene/resources/material.cpp msgid "Use Shadow To Opacity" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Unshaded" -msgstr "Mostrar Sin Sombreado" +msgstr "Sin Sombreado" #: scene/resources/material.cpp -#, fuzzy msgid "Vertex Lighting" -msgstr "Iluminación directa" +msgstr "Iluminación de Vértices" #: scene/resources/material.cpp -#, fuzzy msgid "Use Point Size" -msgstr "Vista Frontal" +msgstr "Usar Tamaño del Punto" #: scene/resources/material.cpp msgid "World Triplanar" @@ -25898,23 +25819,20 @@ msgid "Do Not Receive Shadows" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Disable Ambient Light" -msgstr "Indentar a la Derecha" +msgstr "Desactivar Luz Ambiental" #: scene/resources/material.cpp -#, fuzzy msgid "Ensure Correct Normals" -msgstr "Transformar Normales" +msgstr "Asegurar Normales Correctas" #: scene/resources/material.cpp msgid "Albedo Tex MSDF" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Vertex Color" -msgstr "Vértice" +msgstr "Color del Vértice" #: scene/resources/material.cpp msgid "Use As Albedo" @@ -25929,39 +25847,32 @@ msgid "Parameters" msgstr "Parámetros" #: scene/resources/material.cpp -#, fuzzy msgid "Diffuse Mode" -msgstr "Modo desplazamiento lateral" +msgstr "Modo Difuso" #: scene/resources/material.cpp -#, fuzzy msgid "Specular Mode" -msgstr "Modo de Regla" +msgstr "Modo Especular" #: scene/resources/material.cpp -#, fuzzy msgid "Depth Draw Mode" -msgstr "Modo de Interpolación" +msgstr "Modo de Dibujo de Profundidad" #: scene/resources/material.cpp -#, fuzzy msgid "Line Width" -msgstr "Ancho Izquierda" +msgstr "Ancho de LÃnea" #: scene/resources/material.cpp -#, fuzzy msgid "Point Size" -msgstr "Vista Frontal" +msgstr "Tamaño de Punto" #: scene/resources/material.cpp -#, fuzzy msgid "Billboard Mode" -msgstr "Modo de Regla" +msgstr "Modo Billboard" #: scene/resources/material.cpp -#, fuzzy msgid "Billboard Keep Scale" -msgstr "Modo de Regla" +msgstr "Mantener Escala del Billboard" #: scene/resources/material.cpp msgid "Grow" @@ -25976,19 +25887,16 @@ msgid "Use Alpha Scissor" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Particles Anim" -msgstr "PartÃculas" +msgstr "Animación de PartÃculas" #: scene/resources/material.cpp -#, fuzzy msgid "H Frames" -msgstr "Fotograma %" +msgstr "Cuadros H" #: scene/resources/material.cpp -#, fuzzy msgid "V Frames" -msgstr "Fotograma %" +msgstr "Cuadros V" #: scene/resources/material.cpp msgid "Albedo" @@ -25999,14 +25907,12 @@ msgid "Metallic" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Texture Channel" -msgstr "Región de Textura" +msgstr "Canal de Textura" #: scene/resources/material.cpp -#, fuzzy msgid "Emission" -msgstr "Máscara de Emisión" +msgstr "Emisión" #: scene/resources/material.cpp msgid "On UV2" @@ -26021,9 +25927,8 @@ msgid "Rim" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Clearcoat" -msgstr "Limpiar" +msgstr "Transparencia" #: scene/resources/material.cpp msgid "Gloss" @@ -26038,32 +25943,28 @@ msgid "Flowmap" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Ambient Occlusion" -msgstr "Oclusión" +msgstr "Oclusión Ambiental" #: scene/resources/material.cpp msgid "Deep Parallax" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Min Layers" -msgstr "Capa" +msgstr "Capas MÃnimas" #: scene/resources/material.cpp -#, fuzzy msgid "Max Layers" -msgstr "Capa" +msgstr "Capas Máximas" #: scene/resources/material.cpp msgid "Flip Tangent" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Flip Binormal" -msgstr "Voltear Portal" +msgstr "Voltear Binormal" #: scene/resources/material.cpp msgid "Subsurf Scatter" @@ -26082,14 +25983,12 @@ msgid "Detail" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "UV Layer" -msgstr "Capa" +msgstr "Capa UV" #: scene/resources/material.cpp -#, fuzzy msgid "UV1" -msgstr "UV" +msgstr "UV1" #: scene/resources/material.cpp msgid "Triplanar" @@ -26100,42 +25999,36 @@ msgid "Triplanar Sharpness" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "UV2" -msgstr "UV" +msgstr "UV2" #: scene/resources/material.cpp -#, fuzzy msgid "Proximity Fade" -msgstr "Modo de Prioridad" +msgstr "Desvanecimiento de Proximidad" #: scene/resources/material.cpp msgid "Distance Fade" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Async Mode" -msgstr "Modo desplazamiento lateral" +msgstr "Modo AsÃncrono" #: scene/resources/mesh.cpp -#, fuzzy msgid "Lightmap Size Hint" -msgstr "Calcular Lightmaps" +msgstr "Sugerencia de Tamaño del Lightmap" #: scene/resources/mesh.cpp scene/resources/primitive_meshes.cpp msgid "Custom AABB" msgstr "" #: scene/resources/mesh_library.cpp -#, fuzzy msgid "Mesh Transform" -msgstr "Transformar" +msgstr "Transformación de Mesh" #: scene/resources/mesh_library.cpp -#, fuzzy msgid "NavMesh Transform" -msgstr "Reestablecer Transformación" +msgstr "Transformación de NavMesh" #: scene/resources/multimesh.cpp msgid "Color Format" @@ -26150,9 +26043,8 @@ msgid "Custom Data Format" msgstr "" #: scene/resources/multimesh.cpp -#, fuzzy msgid "Instance Count" -msgstr "Instanciar" +msgstr "Conteo de Instancias" #: scene/resources/multimesh.cpp msgid "Visible Instance Count" @@ -26163,9 +26055,8 @@ msgid "Sampling" msgstr "Muestreo" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Partition Type" -msgstr "Establecer tipo de base de variación" +msgstr "Tipo de Partición" #: scene/resources/navigation_mesh.cpp msgid "Parsed Geometry Type" @@ -26176,18 +26067,16 @@ msgid "Source Geometry Mode" msgstr "" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Source Group Name" -msgstr "Fuente" +msgstr "Nombre del Grupo de Origen" #: scene/resources/navigation_mesh.cpp msgid "Cells" msgstr "" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Agents" -msgstr "Segmentos" +msgstr "Agentes" #: scene/resources/navigation_mesh.cpp msgid "Max Climb" @@ -26198,14 +26087,12 @@ msgid "Max Slope" msgstr "" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Regions" -msgstr "Región" +msgstr "Regiones" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Merge Size" -msgstr "Unir desde escena" +msgstr "Tamaño de Unión" #: scene/resources/navigation_mesh.cpp msgid "Edges" @@ -26220,9 +26107,8 @@ msgid "Verts Per Poly" msgstr "" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Details" -msgstr "Mostrar Por Defecto" +msgstr "Detalles" #: scene/resources/navigation_mesh.cpp msgid "Sample Distance" @@ -26245,14 +26131,12 @@ msgid "Walkable Low Height Spans" msgstr "" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Baking AABB" -msgstr "Generando AABB" +msgstr "Bakear AABB" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Baking AABB Offset" -msgstr "Desplazamiento Base" +msgstr "Bakear Offset AABB" #: scene/resources/occluder_shape.cpp msgid "Spheres" @@ -26263,14 +26147,12 @@ msgid "OccluderShapeSphere Set Spheres" msgstr "Establecer Esferas OccluderShapeSphere" #: scene/resources/occluder_shape_polygon.cpp -#, fuzzy msgid "Polygon Points" -msgstr "PolÃgonos" +msgstr "Puntos de PolÃgonos" #: scene/resources/occluder_shape_polygon.cpp -#, fuzzy msgid "Hole Points" -msgstr "Mover Puntos" +msgstr "Puntos de Rotura" #: scene/resources/packed_scene.cpp msgid "Bundled" @@ -26281,9 +26163,8 @@ msgid "Trail" msgstr "" #: scene/resources/particles_material.cpp -#, fuzzy msgid "Divisor" -msgstr "Dividir %s" +msgstr "Divisor" #: scene/resources/particles_material.cpp msgid "Size Modifier" @@ -26306,9 +26187,8 @@ msgid "Color Texture" msgstr "Textura de Color" #: scene/resources/particles_material.cpp -#, fuzzy msgid "Point Count" -msgstr "Añadir Puerto de Entrada" +msgstr "Conteo de Puntos" #: scene/resources/particles_material.cpp msgid "Scale Random" @@ -26367,9 +26247,8 @@ msgid "Is Hemisphere" msgstr "" #: scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Curve Step" -msgstr "Partir Curva" +msgstr "Paso de Curva" #: scene/resources/ray_shape.cpp scene/resources/segment_shape_2d.cpp msgid "Slips On Slope" @@ -26384,19 +26263,16 @@ msgid "Custom Solver Bias" msgstr "" #: scene/resources/skin.cpp -#, fuzzy msgid "Bind Count" -msgstr "Añadir Puerto de Entrada" +msgstr "Conteo de Vinculaciones" #: scene/resources/skin.cpp -#, fuzzy msgid "Bind" msgstr "Vinculación" #: scene/resources/skin.cpp -#, fuzzy msgid "Bone" -msgstr "Huesos" +msgstr "Hueso" #: scene/resources/sky.cpp msgid "Radiance Size" @@ -26407,9 +26283,8 @@ msgid "Panorama" msgstr "" #: scene/resources/sky.cpp -#, fuzzy msgid "Top Color" -msgstr "Siguiente Plano" +msgstr "Color Superior" #: scene/resources/sky.cpp msgid "Horizon Color" @@ -26420,19 +26295,16 @@ msgid "Ground" msgstr "Suelo" #: scene/resources/sky.cpp -#, fuzzy msgid "Bottom Color" -msgstr "Marcadores" +msgstr "Color Inferior" #: scene/resources/sky.cpp -#, fuzzy msgid "Sun" -msgstr "Ejecutar" +msgstr "Sol" #: scene/resources/sky.cpp -#, fuzzy msgid "Latitude" -msgstr "Sustituir" +msgstr "Latitud" #: scene/resources/sky.cpp msgid "Longitude" @@ -26447,23 +26319,20 @@ msgid "Angle Max" msgstr "" #: scene/resources/style_box.cpp -#, fuzzy msgid "Content Margin" -msgstr "Asignar Margen" +msgstr "Margen de Contenido" #: scene/resources/style_box.cpp -#, fuzzy msgid "Expand Margin" -msgstr "Expandir Todo" +msgstr "Expandir Margen" #: scene/resources/style_box.cpp msgid "Skew" msgstr "" #: scene/resources/style_box.cpp -#, fuzzy msgid "Corner Radius" -msgstr "Cambiar Radio Interno de Torus" +msgstr "Radio de Esquina" #: scene/resources/style_box.cpp msgid "Corner Detail" @@ -26482,121 +26351,100 @@ msgid "Grow End" msgstr "" #: scene/resources/texture.cpp -#, fuzzy msgid "Load Path" -msgstr "Cargar Ajuste Predeterminado" +msgstr "Ruta de Carga" #: scene/resources/texture.cpp -#, fuzzy msgid "Base Texture" -msgstr "Eliminar Textura" +msgstr "Textura Base" #: scene/resources/texture.cpp msgid "Image Size" msgstr "Tamaño de la Imagen" #: scene/resources/texture.cpp -#, fuzzy msgid "Side" -msgstr "Mostrar GuÃas" +msgstr "Lado" #: scene/resources/texture.cpp -#, fuzzy msgid "Front" -msgstr "Vista Frontal" +msgstr "Frente" #: scene/resources/texture.cpp -#, fuzzy msgid "Back" -msgstr "Retroceder" +msgstr "Posterior" #: scene/resources/texture.cpp -#, fuzzy msgid "Storage Mode" -msgstr "Modo de Escalado" +msgstr "Modo de Almacenamiento" #: scene/resources/texture.cpp -#, fuzzy msgid "Lossy Storage Quality" -msgstr "Captura" +msgstr "Calidad de Almacenamiento con Pérdidas" #: scene/resources/texture.cpp -#, fuzzy msgid "From" -msgstr "Rellene Desde" +msgstr "Desde" #: scene/resources/texture.cpp -#, fuzzy msgid "To" -msgstr "Superior" +msgstr "A" #: scene/resources/texture.cpp -#, fuzzy msgid "Base" -msgstr "Tipo Base" +msgstr "Base" #: scene/resources/texture.cpp -#, fuzzy msgid "Current Frame" -msgstr "Nombre de la escena actual" +msgstr "Cuadro Actual" #: scene/resources/texture.cpp -#, fuzzy msgid "Pause" -msgstr "Modo desplazamiento lateral" +msgstr "Pausa" #: scene/resources/texture.cpp msgid "Which Feed" msgstr "" #: scene/resources/texture.cpp -#, fuzzy msgid "Camera Is Active" -msgstr "Respetar Mayúsculas/Minúsculas" +msgstr "Cámara Activa" #: scene/resources/theme.cpp -#, fuzzy msgid "Default Font" -msgstr "Por defecto" +msgstr "Fuente Predeterminada" #: scene/resources/visual_shader.cpp msgid "Output Port For Preview" msgstr "" #: scene/resources/visual_shader.cpp -#, fuzzy msgid "Depth Draw" -msgstr "Modo de Interpolación" +msgstr "Dibujo de Profundidad" #: scene/resources/visual_shader.cpp -#, fuzzy msgid "Cull" -msgstr "Modo de Regla" +msgstr "Cull" #: scene/resources/visual_shader.cpp -#, fuzzy msgid "Diffuse" -msgstr "Modo desplazamiento lateral" +msgstr "Difuso" #: scene/resources/visual_shader.cpp -#, fuzzy msgid "Async" -msgstr "Modo desplazamiento lateral" +msgstr "AsÃncrono" #: scene/resources/visual_shader.cpp -#, fuzzy msgid "Modes" -msgstr "Modo" +msgstr "Modos" #: scene/resources/visual_shader.cpp -#, fuzzy msgid "Input Name" -msgstr "Mapa de Entrada" +msgstr "Nombre de Entrada" #: scene/resources/visual_shader.cpp -#, fuzzy msgid "Uniform Name" -msgstr "Establecer Nombre de Uniform" +msgstr "Nombre del Uniform" #: scene/resources/visual_shader_nodes.cpp msgid "" @@ -26615,85 +26463,72 @@ msgid "Invalid source for shader." msgstr "Fuente inválida para el shader." #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Texture Type" -msgstr "Región de Textura" +msgstr "Tipo de Textura" #: scene/resources/visual_shader_nodes.cpp msgid "Cube Map" msgstr "" #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Default Value Enabled" -msgstr "Perfil de CaracterÃsticas de Godot" +msgstr "Valor Predeterminado Activado" #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Default Value" -msgstr "Cambiar Valor de Entrada" +msgstr "Valor Predeterminado" #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Color Default" -msgstr "Cargar Valores por Defecto" +msgstr "Color Predeterminado" #: scene/resources/visual_shader_nodes.cpp msgid "Invalid comparison function for that type." msgstr "Función de comparación inválida para este tipo." #: scene/resources/world.cpp -#, fuzzy msgid "Fallback Environment" -msgstr "Ver Entorno" +msgstr "Entorno de Retorno" #: scene/resources/world.cpp -#, fuzzy msgid "Scenario" -msgstr "Escena" +msgstr "Escenario" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Navigation Map" -msgstr "Navegación" +msgstr "Mapa de Navegación" #: scene/resources/world.cpp scene/resources/world_2d.cpp msgid "Direct Space State" msgstr "" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Default Gravity Vector" -msgstr "Vista Previa Por Defecto" +msgstr "Vector de Gravedad Predeterminado" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Default Linear Damp" -msgstr "Izquierda Lineal" +msgstr "Amortiguación Lineal Predeterminada" #: scene/resources/world.cpp scene/resources/world_2d.cpp msgid "Default Angular Damp" -msgstr "" +msgstr "Amortiguación Angular Predeterminada" #: scene/resources/world.cpp -#, fuzzy msgid "Default Map Up" -msgstr "Escalonado de Flotantes por Defecto" +msgstr "Mapa Superior Predeterminado" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Default Cell Size" -msgstr "Vista Previa Por Defecto" +msgstr "Vista Previa Predeterminada" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Default Cell Height" -msgstr "Prueba" +msgstr "Altura de Celda Predeterminada" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Default Edge Connection Margin" -msgstr "Margen de Conexión de Bordes" +msgstr "Margen de Conexión de Bordes Predeterminado" #: scene/resources/world_2d.cpp msgid "Canvas" @@ -26704,9 +26539,8 @@ msgid "Is Primary" msgstr "" #: servers/arvr/arvr_interface.cpp -#, fuzzy msgid "Is Initialized" -msgstr "Inicializar" +msgstr "Inicializado" #: servers/arvr/arvr_interface.cpp msgid "AR" @@ -26717,14 +26551,12 @@ msgid "Is Anchor Detection Enabled" msgstr "" #: servers/arvr_server.cpp -#, fuzzy msgid "Primary Interface" -msgstr "Interfaz de usuario" +msgstr "Interfaz Principal" #: servers/audio/audio_stream.cpp -#, fuzzy msgid "Audio Stream" -msgstr "Radio Elemento" +msgstr "Audio Stream" #: servers/audio/audio_stream.cpp msgid "Random Pitch" @@ -26766,9 +26598,8 @@ msgid "Rate Hz" msgstr "" #: servers/audio/effects/audio_effect_chorus.cpp -#, fuzzy msgid "Depth (ms)" -msgstr "Profundidad" +msgstr "Profundidad (ms)" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_delay.cpp @@ -26791,9 +26622,8 @@ msgid "Attack (µs)" msgstr "" #: servers/audio/effects/audio_effect_compressor.cpp -#, fuzzy msgid "Release (ms)" -msgstr "Release" +msgstr "Release (ms)" #: servers/audio/effects/audio_effect_compressor.cpp msgid "Mix" @@ -26814,14 +26644,12 @@ msgstr "" #: servers/audio/effects/audio_effect_delay.cpp #: servers/audio/effects/audio_effect_phaser.cpp #: servers/audio/effects/audio_effect_reverb.cpp -#, fuzzy msgid "Feedback" -msgstr "Enviar Feedback de la Documentación" +msgstr "Feedback" #: servers/audio/effects/audio_effect_delay.cpp -#, fuzzy msgid "Low-pass" -msgstr "Omitir" +msgstr "Paso Bajo" #: servers/audio/effects/audio_effect_distortion.cpp msgid "Pre Gain" @@ -26836,14 +26664,12 @@ msgid "Drive" msgstr "" #: servers/audio/effects/audio_effect_distortion.cpp -#, fuzzy msgid "Post Gain" -msgstr "Posterior" +msgstr "Ganancia Puntual" #: servers/audio/effects/audio_effect_filter.cpp -#, fuzzy msgid "Resonance" -msgstr "Recursos" +msgstr "Resonancia" #: servers/audio/effects/audio_effect_limiter.cpp msgid "Ceiling dB" @@ -26891,9 +26717,8 @@ msgid "Room Size" msgstr "" #: servers/audio/effects/audio_effect_reverb.cpp -#, fuzzy msgid "High-pass" -msgstr "Omitir" +msgstr "Paso Alto" #: servers/audio/effects/audio_effect_spectrum_analyzer.cpp msgid "Tap Back Pos" @@ -26912,51 +26737,44 @@ msgid "Surround" msgstr "" #: servers/audio_server.cpp -#, fuzzy msgid "Enable Audio Input" -msgstr "Renombrar Bus de Audio" +msgstr "Activar Entrada de Audio" #: servers/audio_server.cpp -#, fuzzy msgid "Output Latency" -msgstr "Salida" +msgstr "Latencia de Salida" #: servers/audio_server.cpp msgid "Channel Disable Threshold dB" msgstr "" #: servers/audio_server.cpp -#, fuzzy msgid "Channel Disable Time" -msgstr "Cambiar Tiempo de Mezcla" +msgstr "Tiempo de Desconexión del Canal" #: servers/audio_server.cpp msgid "Video Delay Compensation (ms)" msgstr "" #: servers/audio_server.cpp -#, fuzzy msgid "Bus Count" -msgstr "Añadir Puerto de Entrada" +msgstr "Conteo de Buses" #: servers/audio_server.cpp -#, fuzzy msgid "Capture Device" -msgstr "Capturar desde pÃxel" +msgstr "Dispositivo de Captura" #: servers/audio_server.cpp -#, fuzzy msgid "Global Rate Scale" -msgstr "Variable" +msgstr "Escala Global de Porcentajes" #: servers/camera/camera_feed.cpp msgid "Feed" msgstr "" #: servers/camera/camera_feed.cpp -#, fuzzy msgid "Is Active" -msgstr "Perspectiva" +msgstr "Activo" #: servers/physics/space_sw.cpp servers/physics_2d/space_2d_sw.cpp msgid "Sleep Threshold Linear" @@ -26983,28 +26801,24 @@ msgid "Inverse Mass" msgstr "" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Inverse Inertia" -msgstr "Vista Libre Izquierda" +msgstr "Inercia Inversa" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Total Angular Damp" msgstr "" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Total Linear Damp" -msgstr "Lineal" +msgstr "Amortiguación Lineal Total" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Total Gravity" -msgstr "Vista Previa Por Defecto" +msgstr "Gravedad Total" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Linear Velocity" -msgstr "Inicializar" +msgstr "Velocidad Lineal" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Exclude" @@ -27015,9 +26829,8 @@ msgid "Shape RID" msgstr "" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collide With Bodies" -msgstr "Modo de Colisión" +msgstr "Colisión de Cuerpos" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Collide With Areas" @@ -27028,39 +26841,32 @@ msgid "Motion Remainder" msgstr "" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collision Point" -msgstr "Modo de Colisión" +msgstr "Punto de Colisión" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collision Normal" -msgstr "Modo de Colisión" +msgstr "Colisión Normal" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collision Depth" -msgstr "Modo de Colisión" +msgstr "Profundidad de Colisión" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collision Safe Fraction" -msgstr "Modo de Colisión" +msgstr "Fracción Segura de Colisión" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collision Unsafe Fraction" -msgstr "Modo de Colisión" +msgstr "Fracción Insegura de Colisión" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Physics Engine" -msgstr "Fotogramas de FÃsica %" +msgstr "Motor de FÃsica" #: servers/physics_server.cpp -#, fuzzy msgid "Center Of Mass" -msgstr "Centro Izquierda" +msgstr "Centro de la Masa" #: servers/physics_server.cpp msgid "Principal Inertia Axes" @@ -27071,22 +26877,20 @@ msgid "Varying may not be assigned in the '%s' function." msgstr "No se puede asignar la variable en la función '%s'." #: servers/visual/shader_language.cpp -#, fuzzy msgid "" "Varyings which were assigned in 'vertex' function may not be reassigned in " "'fragment' or 'light'." msgstr "" -"Las variaciones asignadas en función 'vértice' no pueden reasignarse en " -"'fragmento' o 'luz'." +"Las variaciones que se asignaron en la función 'vertex'no pueden reasignarse " +"en 'fragment' o 'light'." #: servers/visual/shader_language.cpp -#, fuzzy msgid "" "Varyings which were assigned in 'fragment' function may not be reassigned in " "'vertex' or 'light'." msgstr "" -"Varyings Cuál asignó en 'fragmento' la función no puede ser reasignada en " -"'vértice' o 'ligero'." +"Las variaciones que se asignaron en la función 'fragment' no pueden " +"reasignarse en 'vertex' o 'light'." #: servers/visual/shader_language.cpp msgid "Assignment to function." @@ -27105,48 +26909,40 @@ msgid "Spatial Partitioning" msgstr "Partición de Espacios" #: servers/visual_server.cpp -#, fuzzy msgid "Render Loop Enabled" -msgstr "Filtrar señales" +msgstr "Bucle de Renderización Activado" #: servers/visual_server.cpp -#, fuzzy msgid "VRAM Compression" -msgstr "Expresión" +msgstr "Compresión VRAM" #: servers/visual_server.cpp -#, fuzzy msgid "Import BPTC" -msgstr "Importar" +msgstr "Importar BPTC" #: servers/visual_server.cpp -#, fuzzy msgid "Import S3TC" -msgstr "Importar" +msgstr "Importar S3TC" #: servers/visual_server.cpp -#, fuzzy msgid "Import ETC" -msgstr "Importar" +msgstr "Importar ETC" #: servers/visual_server.cpp -#, fuzzy msgid "Import ETC2" -msgstr "Importar" +msgstr "Importar ETC2" #: servers/visual_server.cpp -#, fuzzy msgid "Import PVRTC" -msgstr "Importar Theme" +msgstr "Importar PVRTC" #: servers/visual_server.cpp msgid "Lossless Compression" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Force PNG" -msgstr "Forzar Push" +msgstr "Forzar PNG" #: servers/visual_server.cpp msgid "WebP Compression Level" @@ -27157,9 +26953,8 @@ msgid "Time Rollover Secs" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Cubemap Size" -msgstr "Cambiar Tamaño de Cámara" +msgstr "Tamaño del Cubemap" #: servers/visual_server.cpp msgid "Quadrant 0 Subdiv" @@ -27178,19 +26973,16 @@ msgid "Quadrant 3 Subdiv" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Shadows" -msgstr "Shader" +msgstr "Sombras" #: servers/visual_server.cpp -#, fuzzy msgid "Filter Mode" -msgstr "Filtrar nodos" +msgstr "Modo de Filtrado" #: servers/visual_server.cpp -#, fuzzy msgid "Texture Array Reflections" -msgstr "Centrar Selección" +msgstr "Reflejos del Array de Texturas" #: servers/visual_server.cpp msgid "High Quality GGX" @@ -27201,9 +26993,8 @@ msgid "Irradiance Max Size" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Shading" -msgstr "Relleno" +msgstr "Sombreado" #: servers/visual_server.cpp msgid "Force Vertex Shading" @@ -27222,9 +27013,8 @@ msgid "Mesh Storage" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Split Stream" -msgstr "Partir Curva" +msgstr "Stream Dividido" #: servers/visual_server.cpp msgid "Use Physical Light Attenuation" @@ -27263,23 +27053,20 @@ msgid "Use Software Skinning" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Ninepatch Mode" -msgstr "Modo de Interpolación" +msgstr "Modo Ninepatch" #: servers/visual_server.cpp -#, fuzzy msgid "OpenGL" -msgstr "Abrir" +msgstr "OpenGL" #: servers/visual_server.cpp msgid "Batching Send Null" -msgstr "" +msgstr "EnvÃo de Lotes Nulo" #: servers/visual_server.cpp -#, fuzzy msgid "Batching Stream" -msgstr "Renombrar por lote" +msgstr "Flujo de Lotes" #: servers/visual_server.cpp msgid "Legacy Orphan Buffers" @@ -27291,16 +27078,15 @@ msgstr "" #: servers/visual_server.cpp msgid "Batching" -msgstr "Puesta en marcha" +msgstr "División en Lotes" #: servers/visual_server.cpp msgid "Use Batching" -msgstr "" +msgstr "Usar División en Lotes" #: servers/visual_server.cpp -#, fuzzy msgid "Use Batching In Editor" -msgstr "Actualización del editor" +msgstr "Usar División en Lotes en el Editor" #: servers/visual_server.cpp msgid "Single Rect Fallback" @@ -27332,12 +27118,11 @@ msgstr "" #: servers/visual_server.cpp msgid "Flash Batching" -msgstr "" +msgstr "Procesamiento Instantáneo de Lotes" #: servers/visual_server.cpp -#, fuzzy msgid "Diagnose Frame" -msgstr "Pegar Fotograma" +msgstr "Diagnosticar Cuadro" #: servers/visual_server.cpp msgid "GLES2" @@ -27352,9 +27137,8 @@ msgid "Disable Half Float" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Enable High Float" -msgstr "Activar Prioridad" +msgstr "Activar Flotante Alto" #: servers/visual_server.cpp msgid "Precision" @@ -27369,9 +27153,8 @@ msgid "UV Contract Amount" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Use Simple PVS" -msgstr "Usar Ajuste de Escalado" +msgstr "Usar PVS Simple" #: servers/visual_server.cpp msgid "PVS Logging" @@ -27382,18 +27165,16 @@ msgid "Use Signals" msgstr "Usar Señales" #: servers/visual_server.cpp -#, fuzzy msgid "Remove Danglers" -msgstr "Eliminar Tile" +msgstr "Eliminar Danglers" #: servers/visual_server.cpp msgid "Flip Imported Portals" msgstr "Voltear Portales Importados" #: servers/visual_server.cpp -#, fuzzy msgid "Occlusion Culling" -msgstr "Ver Eliminación de Oclusión" +msgstr "Occlusion Culling" #: servers/visual_server.cpp msgid "Max Active Spheres" diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po index 10a562d0b8..5babe4ff23 100644 --- a/editor/translations/es_AR.po +++ b/editor/translations/es_AR.po @@ -4584,6 +4584,7 @@ msgstr "Herramientas misceláneas a nivel proyecto o escena." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Proyecto" @@ -7533,7 +7534,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15614,18 +15616,19 @@ msgstr "" msgid "Make Local" msgstr "Crear Local" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Nombre de Nodo:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "El nombre ya está en uso por otra función/variable/señal:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Nombre de Nodo:" #: editor/scene_tree_dock.cpp @@ -15828,6 +15831,11 @@ msgid "Button Group" msgstr "Grupo de Botones" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Nombre de Nodo:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Conectando Desde)" @@ -15904,6 +15912,10 @@ msgstr "" "Nombre de nodo inválido, los siguientes caracteres no están permitidos:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Renombrar Nodo" @@ -17830,6 +17842,21 @@ msgstr "Construir Solución" msgid "Auto Update Project" msgstr "Proyecto Sin Nombre" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Mostrar Todo" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Elegà un Directorio" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Elegà un Directorio" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Fin del stack trace de excepción interna" @@ -19698,6 +19725,11 @@ msgstr "CustomNode" msgid "Custom BG Color" msgstr "CustomNode" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Expandir Todos" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20593,6 +20625,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Nombre corto de paquete inválido." diff --git a/editor/translations/et.po b/editor/translations/et.po index 3976c9f0bd..0a4ab2fe0b 100644 --- a/editor/translations/et.po +++ b/editor/translations/et.po @@ -6,118 +6,111 @@ # Mattias Aabmets <mattias.aabmets@gmail.com>, 2019. # StReef <streef.gtx@gmail.com>, 2020, 2021. # René <renepiik@gmail.com>, 2020. -# Kritzmensch <streef.gtx@gmail.com>, 2021. +# Kritzmensch <streef.gtx@gmail.com>, 2021, 2022. +# dogyx <aaronloit@zohomail.eu>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2021-07-16 05:47+0000\n" -"Last-Translator: Kritzmensch <streef.gtx@gmail.com>\n" +"PO-Revision-Date: 2022-09-16 07:12+0000\n" +"Last-Translator: dogyx <aaronloit@zohomail.eu>\n" "Language-Team: Estonian <https://hosted.weblate.org/projects/godot-engine/" "godot/et/>\n" "Language: et\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.7.2-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" -msgstr "" +msgstr "Graafikatahvli draiver" #: core/bind/core_bind.cpp msgid "Clipboard" -msgstr "" +msgstr "Lõikelaud" #: core/bind/core_bind.cpp -#, fuzzy msgid "Current Screen" -msgstr "Virnakaadrid" +msgstr "Avatud Ekraan" #: core/bind/core_bind.cpp msgid "Exit Code" -msgstr "" +msgstr "Lõpukood" #: core/bind/core_bind.cpp -#, fuzzy msgid "V-Sync Enabled" -msgstr "Luba" +msgstr "V-Sync Sees" #: core/bind/core_bind.cpp main/main.cpp msgid "V-Sync Via Compositor" -msgstr "" +msgstr "V-sync komposiitori kaudu" #: core/bind/core_bind.cpp main/main.cpp msgid "Delta Smoothing" -msgstr "" +msgstr "Delta silumine" #: core/bind/core_bind.cpp -#, fuzzy msgid "Low Processor Usage Mode" -msgstr "Liigutamisrežiim" +msgstr "Protsessori madala võimsuse režiim" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode Sleep (µsec)" -msgstr "" +msgstr "Protsessori madala võimsuse režiimi puhkeaeg (µsek)" #: core/bind/core_bind.cpp main/main.cpp platform/uwp/os_uwp.cpp msgid "Keep Screen On" -msgstr "" +msgstr "Hoia ekraan sees" #: core/bind/core_bind.cpp -#, fuzzy msgid "Min Window Size" -msgstr "Suurus: " +msgstr "Minimaalne akna suurus" #: core/bind/core_bind.cpp -#, fuzzy msgid "Max Window Size" -msgstr "Suurus: " +msgstr "Maksimaalne akna suurus" #: core/bind/core_bind.cpp -#, fuzzy msgid "Screen Orientation" -msgstr "Ava dokumentatsioon" +msgstr "Ekraani orientatsioon" #: core/bind/core_bind.cpp core/project_settings.cpp main/main.cpp #: platform/uwp/os_uwp.cpp -#, fuzzy msgid "Window" -msgstr "Uus aken" +msgstr "Aken" #: core/bind/core_bind.cpp core/project_settings.cpp msgid "Borderless" -msgstr "" +msgstr "Ääriseta" #: core/bind/core_bind.cpp msgid "Per Pixel Transparency Enabled" -msgstr "" +msgstr "Läbipaistvus piksli kohta lubatud" #: core/bind/core_bind.cpp core/project_settings.cpp msgid "Fullscreen" -msgstr "" +msgstr "Täisekraan" #: core/bind/core_bind.cpp msgid "Maximized" -msgstr "" +msgstr "Maksimeeritud" #: core/bind/core_bind.cpp msgid "Minimized" -msgstr "" +msgstr "Minimeeritud" #: core/bind/core_bind.cpp core/project_settings.cpp scene/gui/dialogs.cpp #: scene/gui/graph_node.cpp msgid "Resizable" -msgstr "" +msgstr "Suurust muudetav" #: core/bind/core_bind.cpp core/os/input_event.cpp scene/2d/node_2d.cpp #: scene/2d/physics_body_2d.cpp scene/2d/remote_transform_2d.cpp #: scene/3d/physics_body.cpp scene/3d/remote_transform.cpp #: scene/gui/control.cpp scene/gui/line_edit.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Position" -msgstr "Doki asukoht" +msgstr "Asend" #: core/bind/core_bind.cpp core/project_settings.cpp editor/editor_settings.cpp #: main/main.cpp modules/gridmap/grid_map.cpp @@ -128,63 +121,56 @@ msgstr "Doki asukoht" #: scene/resources/primitive_meshes.cpp scene/resources/sky.cpp #: scene/resources/style_box.cpp scene/resources/texture.cpp #: scene/resources/visual_shader.cpp servers/visual_server.cpp -#, fuzzy msgid "Size" -msgstr "Suurus: " +msgstr "Suurus" #: core/bind/core_bind.cpp msgid "Endian Swap" -msgstr "" +msgstr "Endiani vahetus" #: core/bind/core_bind.cpp -#, fuzzy msgid "Editor Hint" -msgstr "Redaktor" +msgstr "Toimeti vihje" #: core/bind/core_bind.cpp msgid "Print Error Messages" -msgstr "" +msgstr "Trüki veateated" #: core/bind/core_bind.cpp -#, fuzzy msgid "Iterations Per Second" -msgstr "Interpolatsiooni režiim" +msgstr "Iteratsioone sekundis" #: core/bind/core_bind.cpp -#, fuzzy msgid "Target FPS" -msgstr "Ressursi tee" +msgstr "Kaadrisageduse eesmärk" #: core/bind/core_bind.cpp -#, fuzzy msgid "Time Scale" -msgstr "Skaleerimisrežiim" +msgstr "Ajaskaala" #: core/bind/core_bind.cpp main/main.cpp msgid "Physics Jitter Fix" -msgstr "" +msgstr "Füüsika värisemise parandus" #: core/bind/core_bind.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Error" -msgstr "" +msgstr "Viga" #: core/bind/core_bind.cpp -#, fuzzy msgid "Error String" -msgstr "Redaktori sätted" +msgstr "Veasõne" #: core/bind/core_bind.cpp -#, fuzzy msgid "Error Line" -msgstr "Viga:" +msgstr "Vearida" #: core/bind/core_bind.cpp msgid "Result" -msgstr "" +msgstr "Tulemus" #: core/command_queue_mt.cpp core/message_queue.cpp main/main.cpp msgid "Memory" -msgstr "" +msgstr "Mälu" #: core/command_queue_mt.cpp core/message_queue.cpp #: core/register_core_types.cpp drivers/gles2/rasterizer_canvas_base_gles2.cpp @@ -195,128 +181,119 @@ msgstr "" #: modules/webrtc/webrtc_data_channel.h modules/websocket/websocket_macros.h #: servers/visual_server.cpp msgid "Limits" -msgstr "" +msgstr "Limiidid" #: core/command_queue_mt.cpp msgid "Command Queue" -msgstr "" +msgstr "Käskude järjekord" #: core/command_queue_mt.cpp msgid "Multithreading Queue Size (KB)" -msgstr "" +msgstr "Lõimtöötluse järjekorra suurus (KB)" #: core/func_ref.cpp modules/visual_script/visual_script_builtin_funcs.cpp #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Function" -msgstr "Funktsioonid" +msgstr "Funktsioon" #: core/image.cpp core/packed_data_container.cpp scene/2d/polygon_2d.cpp #: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp msgid "Data" -msgstr "" +msgstr "Andmed" #: core/io/file_access_network.cpp core/register_core_types.cpp #: editor/editor_file_dialog.cpp editor/editor_settings.cpp main/main.cpp #: modules/gdscript/language_server/gdscript_language_server.cpp #: modules/webrtc/webrtc_data_channel.h modules/websocket/websocket_macros.h #: scene/gui/file_dialog.cpp -#, fuzzy msgid "Network" -msgstr "Võrgu profileerija" +msgstr "Võrk" #: core/io/file_access_network.cpp -#, fuzzy msgid "Remote FS" -msgstr "Eemalda" +msgstr "Kaugfailisüsteem" #: core/io/file_access_network.cpp msgid "Page Size" -msgstr "" +msgstr "Lehekülje suurus" #: core/io/file_access_network.cpp msgid "Page Read Ahead" -msgstr "" +msgstr "Lehekülje ettelaadimine" #: core/io/http_client.cpp msgid "Blocking Mode Enabled" -msgstr "" +msgstr "Blokeerimisrežiim lubatud" #: core/io/http_client.cpp -#, fuzzy msgid "Connection" -msgstr "Ühenda" +msgstr "Ühendus" #: core/io/http_client.cpp msgid "Read Chunk Size" -msgstr "" +msgstr "Loe tüki suurust" #: core/io/marshalls.cpp -#, fuzzy msgid "Object ID" -msgstr "Objekte kuvatud" +msgstr "Objekti ID" #: core/io/multiplayer_api.cpp core/io/packet_peer.cpp msgid "Allow Object Decoding" -msgstr "" +msgstr "Luba objekti dekodeerimine" #: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp msgid "Refuse New Network Connections" -msgstr "" +msgstr "Keeldu uutest võrguühendustest" #: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp -#, fuzzy msgid "Network Peer" -msgstr "Võrgu profileerija" +msgstr "Võrgukaaslane" #: core/io/multiplayer_api.cpp scene/animation/animation_player.cpp -#, fuzzy msgid "Root Node" -msgstr "Sõlm" +msgstr "Juur Node" #: core/io/networked_multiplayer_peer.cpp -#, fuzzy msgid "Refuse New Connections" -msgstr "Ühenda" +msgstr "Keeldu uutest ühendustest" #: core/io/networked_multiplayer_peer.cpp -#, fuzzy msgid "Transfer Mode" -msgstr "Skaleerimisrežiim" +msgstr "Ülekanderežiim" #: core/io/packet_peer.cpp msgid "Encode Buffer Max Size" -msgstr "" +msgstr "Kodeerimispuhvri maksimaalne suurus" #: core/io/packet_peer.cpp msgid "Input Buffer Max Size" -msgstr "" +msgstr "Sisendpuhvri maksimaalne suurus" #: core/io/packet_peer.cpp msgid "Output Buffer Max Size" -msgstr "" +msgstr "Väljundpuhvri maksimaalne suurus" #: core/io/packet_peer.cpp msgid "Stream Peer" -msgstr "" +msgstr "Voogedastuskaaslane" #: core/io/stream_peer.cpp msgid "Big Endian" -msgstr "" +msgstr "Suur Endian" #: core/io/stream_peer.cpp msgid "Data Array" -msgstr "" +msgstr "Andmemassiiv" #: core/io/stream_peer_ssl.cpp msgid "Blocking Handshake" -msgstr "" +msgstr "Käepigistuse blokeerimine" #: core/io/udp_server.cpp msgid "Max Pending Connections" -msgstr "" +msgstr "Maksimaalne ootel ühenduste arv" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -326,7 +303,7 @@ msgstr "" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." -msgstr "Eeldati sõne pikkusega 1 (trükimärk)." +msgstr "Eeldati sõne pikkusega 1 (tähemärk)." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/mono/glue/gd_glue.cpp @@ -335,7 +312,6 @@ msgid "Not enough bytes for decoding bytes, or invalid format." msgstr "Ebapiisav kogus baite nende dekodeerimiseks või kehtetu formaat." #: core/math/expression.cpp -#, fuzzy msgid "Invalid input %d (not passed) in expression" msgstr "Väljendis on kehtetu sisend %i (mitte edastatud)" @@ -366,209 +342,193 @@ msgstr "'%' kutsudes:" #: core/math/random_number_generator.cpp #: modules/opensimplex/open_simplex_noise.cpp msgid "Seed" -msgstr "" +msgstr "Seeme" #: core/math/random_number_generator.cpp -#, fuzzy msgid "State" msgstr "Olek" #: core/message_queue.cpp msgid "Message Queue" -msgstr "" +msgstr "Sõnumijärjekord" #: core/message_queue.cpp msgid "Max Size (KB)" -msgstr "" +msgstr "Maksimaalne suurus (KB)" #: core/os/input.cpp -#, fuzzy msgid "Mouse Mode" -msgstr "Liigutamisrežiim" +msgstr "Hiire režiim" #: core/os/input.cpp msgid "Use Accumulated Input" -msgstr "" +msgstr "Kasuta akumuleeritud sisendit" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: servers/audio_server.cpp msgid "Device" -msgstr "" +msgstr "Seade" #: core/os/input_event.cpp -#, fuzzy msgid "Alt" -msgstr "Tähelepanu!" +msgstr "Alt" #: core/os/input_event.cpp msgid "Shift" -msgstr "" +msgstr "Shift" #: core/os/input_event.cpp msgid "Control" -msgstr "" +msgstr "Control" #: core/os/input_event.cpp msgid "Meta" -msgstr "" +msgstr "Meta" #: core/os/input_event.cpp -#, fuzzy msgid "Command" -msgstr "Kogukond" +msgstr "Command" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" -msgstr "Luba" +msgstr "Füüsiline" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Pressed" -msgstr "Eelseadistus" +msgstr "Vajutatud" #: core/os/input_event.cpp -#, fuzzy msgid "Scancode" -msgstr "Otsi" +msgstr "Klahvikood" #: core/os/input_event.cpp msgid "Physical Scancode" -msgstr "" +msgstr "Füüsiline klahvikood" #: core/os/input_event.cpp msgid "Unicode" -msgstr "" +msgstr "Unicode" #: core/os/input_event.cpp msgid "Echo" -msgstr "" +msgstr "Kaja" #: core/os/input_event.cpp scene/gui/base_button.cpp msgid "Button Mask" -msgstr "" +msgstr "Nupu mask" #: core/os/input_event.cpp scene/2d/node_2d.cpp scene/gui/control.cpp -#, fuzzy msgid "Global Position" -msgstr "Konstant" +msgstr "Globaalne positsioon" #: core/os/input_event.cpp msgid "Factor" -msgstr "" +msgstr "Faktor" #: core/os/input_event.cpp msgid "Button Index" -msgstr "" +msgstr "Nupu indeks" #: core/os/input_event.cpp msgid "Doubleclick" -msgstr "" +msgstr "Topeltklõps" #: core/os/input_event.cpp msgid "Tilt" -msgstr "" +msgstr "Kallutus" #: core/os/input_event.cpp -#, fuzzy msgid "Pressure" -msgstr "Eelseadistus" +msgstr "Surve" #: core/os/input_event.cpp msgid "Pen Inverted" -msgstr "" +msgstr "Pliiats ümberpööratud" #: core/os/input_event.cpp msgid "Relative" -msgstr "" +msgstr "Suhteline" #: core/os/input_event.cpp scene/2d/camera_2d.cpp scene/2d/cpu_particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/interpolated_camera.cpp #: scene/animation/animation_player.cpp scene/resources/environment.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Speed" -msgstr "Skaleerimisrežiim" +msgstr "Kiirus" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: scene/3d/sprite_3d.cpp msgid "Axis" -msgstr "" +msgstr "Telg" #: core/os/input_event.cpp -#, fuzzy msgid "Axis Value" -msgstr "(väärtus)" +msgstr "Telje väärtus" #: core/os/input_event.cpp modules/visual_script/visual_script_func_nodes.cpp msgid "Index" -msgstr "" +msgstr "Indeks" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: modules/visual_script/visual_script_nodes.cpp #: scene/2d/touch_screen_button.cpp msgid "Action" -msgstr "" +msgstr "Tegevus" #: core/os/input_event.cpp scene/resources/environment.cpp #: scene/resources/material.cpp msgid "Strength" -msgstr "" +msgstr "Tugevus" #: core/os/input_event.cpp msgid "Delta" -msgstr "" +msgstr "Delta" #: core/os/input_event.cpp -#, fuzzy msgid "Channel" -msgstr "Muuda" +msgstr "Kanal" #: core/os/input_event.cpp main/main.cpp -#, fuzzy msgid "Message" -msgstr "Kasutus" +msgstr "Sõnum" #: core/os/input_event.cpp -#, fuzzy msgid "Pitch" -msgstr "Frontaal" +msgstr "Helikõrgus" #: core/os/input_event.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/physics_body_2d.cpp scene/3d/cpu_particles.cpp #: scene/3d/physics_body.cpp scene/resources/particles_material.cpp msgid "Velocity" -msgstr "" +msgstr "Kiirus" #: core/os/input_event.cpp msgid "Instrument" -msgstr "" +msgstr "Instrument" #: core/os/input_event.cpp msgid "Controller Number" -msgstr "" +msgstr "Kontrolleri number" #: core/os/input_event.cpp msgid "Controller Value" -msgstr "" +msgstr "Kontrolleri väärtus" #: core/project_settings.cpp editor/editor_node.cpp main/main.cpp #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Application" -msgstr "Animatsioon" +msgstr "Rakendus" #: core/project_settings.cpp main/main.cpp msgid "Config" -msgstr "" +msgstr "Konfiig" #: core/project_settings.cpp -#, fuzzy msgid "Project Settings Override" -msgstr "Projekti sätted..." +msgstr "Projekti seadete ülekirjutamine" #: core/project_settings.cpp core/resource.cpp #: editor/animation_track_editor.cpp editor/editor_autoload_settings.cpp @@ -599,40 +559,39 @@ msgstr "Käivita" #: core/project_settings.cpp editor/editor_node.cpp #: editor/run_settings_dialog.cpp main/main.cpp msgid "Main Scene" -msgstr "" +msgstr "Peamine stseen" #: core/project_settings.cpp msgid "Disable stdout" -msgstr "" +msgstr "Lülita stdout välja" #: core/project_settings.cpp msgid "Disable stderr" -msgstr "" +msgstr "Lülita stderr välja" #: core/project_settings.cpp msgid "Use Hidden Project Data Directory" -msgstr "" +msgstr "Kasuta varjatud projektiandmete kausta" #: core/project_settings.cpp msgid "Use Custom User Dir" -msgstr "" +msgstr "Kasuta kohandatud kasutaja kausta" #: core/project_settings.cpp msgid "Custom User Dir Name" -msgstr "" +msgstr "Kohandatud kasutaja kausta nimi" #: core/project_settings.cpp main/main.cpp #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #: platform/uwp/os_uwp.cpp -#, fuzzy msgid "Display" -msgstr "Kuva kõik" +msgstr "Ekraan" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/opensimplex/noise_texture.cpp scene/2d/line_2d.cpp #: scene/3d/label_3d.cpp scene/gui/text_edit.cpp scene/resources/texture.cpp msgid "Width" -msgstr "" +msgstr "Laius" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/gltf/gltf_node.cpp modules/opensimplex/noise_texture.cpp @@ -641,20 +600,19 @@ msgstr "" #: scene/resources/font.cpp scene/resources/navigation_mesh.cpp #: scene/resources/primitive_meshes.cpp scene/resources/texture.cpp msgid "Height" -msgstr "" +msgstr "Kõrgus" #: core/project_settings.cpp msgid "Always On Top" -msgstr "" +msgstr "Alati pealmine" #: core/project_settings.cpp msgid "Test Width" -msgstr "" +msgstr "Testimise laius" #: core/project_settings.cpp -#, fuzzy msgid "Test Height" -msgstr "Testimine" +msgstr "Testimise kõrgus" #: core/project_settings.cpp editor/animation_track_editor.cpp #: editor/editor_audio_buses.cpp main/main.cpp servers/audio_server.cpp @@ -662,9 +620,8 @@ msgid "Audio" msgstr "Heli" #: core/project_settings.cpp -#, fuzzy msgid "Default Bus Layout" -msgstr "Lae vaikimise siini paigutus." +msgstr "Siini vaikepaigutus" #: core/project_settings.cpp editor/editor_export.cpp #: editor/editor_file_system.cpp editor/editor_node.cpp @@ -675,90 +632,84 @@ msgstr "Redaktor" #: core/project_settings.cpp msgid "Main Run Args" -msgstr "" +msgstr "Peamised jooksuargumendid" #: core/project_settings.cpp -#, fuzzy msgid "Scene Naming" -msgstr "Stseeni tee:" +msgstr "Stseeni nimetamine" #: core/project_settings.cpp msgid "Search In File Extensions" -msgstr "" +msgstr "Otsi faililaienditest" #: core/project_settings.cpp msgid "Script Templates Search Path" -msgstr "" +msgstr "Skriptimallide otsingutee" #: core/project_settings.cpp msgid "Version Control Autoload On Startup" -msgstr "" +msgstr "Versioonikontrolli automaatne laadimine käivitamisel" #: core/project_settings.cpp msgid "Version Control Plugin Name" -msgstr "" +msgstr "Versioonikontrolli plugina nimi" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp msgid "Input" -msgstr "" +msgstr "Sisend" #: core/project_settings.cpp msgid "UI Accept" -msgstr "" +msgstr "UI Aktsepteeri" #: core/project_settings.cpp -#, fuzzy msgid "UI Select" -msgstr "Vali" +msgstr "UI Vali" #: core/project_settings.cpp -#, fuzzy msgid "UI Cancel" -msgstr "Tühista" +msgstr "UI Tühista" #: core/project_settings.cpp -#, fuzzy msgid "UI Focus Next" -msgstr "Fookuse tee" +msgstr "UI Fokusseeri järgmine" #: core/project_settings.cpp -#, fuzzy msgid "UI Focus Prev" -msgstr "Fookuse tee" +msgstr "UI fokusseeri eelmine" #: core/project_settings.cpp msgid "UI Left" -msgstr "" +msgstr "UI Vasakule" #: core/project_settings.cpp msgid "UI Right" -msgstr "" +msgstr "UI Paremale" #: core/project_settings.cpp msgid "UI Up" -msgstr "" +msgstr "UI Üles" #: core/project_settings.cpp -#, fuzzy msgid "UI Down" -msgstr "Alla" +msgstr "UI Alla" #: core/project_settings.cpp msgid "UI Page Up" -msgstr "" +msgstr "UI Leht üles" #: core/project_settings.cpp msgid "UI Page Down" -msgstr "" +msgstr "UI leht alla" #: core/project_settings.cpp msgid "UI Home" -msgstr "" +msgstr "UI Kodu" #: core/project_settings.cpp msgid "UI End" -msgstr "" +msgstr "UI Lõpp" #: core/project_settings.cpp main/main.cpp modules/bullet/register_types.cpp #: modules/bullet/space_bullet.cpp scene/2d/physics_body_2d.cpp @@ -769,7 +720,7 @@ msgstr "" #: servers/physics_2d/space_2d_sw.cpp servers/physics_2d_server.cpp #: servers/physics_server.cpp msgid "Physics" -msgstr "" +msgstr "Füüsika" #: core/project_settings.cpp editor/editor_settings.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -779,11 +730,11 @@ msgstr "" #: scene/3d/physics_body.cpp scene/resources/world.cpp #: servers/physics/space_sw.cpp servers/physics_server.cpp msgid "3D" -msgstr "" +msgstr "3D" #: core/project_settings.cpp msgid "Smooth Trimesh Collision" -msgstr "" +msgstr "Sujuv Trimeshi kokkupõrge" #: core/project_settings.cpp drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles2/rasterizer_scene_gles2.cpp @@ -795,7 +746,7 @@ msgstr "" #: scene/main/viewport.cpp servers/visual/visual_server_scene.cpp #: servers/visual_server.cpp msgid "Rendering" -msgstr "" +msgstr "Renderdamine" #: core/project_settings.cpp drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_scene_gles3.cpp @@ -805,18 +756,17 @@ msgstr "" #: scene/resources/multimesh.cpp servers/visual/visual_server_scene.cpp #: servers/visual_server.cpp msgid "Quality" -msgstr "" +msgstr "Kvaliteet" #: core/project_settings.cpp scene/gui/file_dialog.cpp #: scene/main/scene_tree.cpp scene/resources/navigation_mesh.cpp #: servers/visual_server.cpp -#, fuzzy msgid "Filters" -msgstr "Filtreeri sõlmed" +msgstr "Filtrid" #: core/project_settings.cpp scene/main/viewport.cpp msgid "Sharpen Intensity" -msgstr "" +msgstr "Teravdamise intensiivsus" #: core/project_settings.cpp editor/editor_export.cpp editor/editor_node.cpp #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp @@ -832,9 +782,8 @@ msgstr "Silumine" #: core/project_settings.cpp main/main.cpp modules/gdscript/gdscript.cpp #: modules/visual_script/visual_script.cpp scene/resources/dynamic_font.cpp -#, fuzzy msgid "Settings" -msgstr "Sätted..." +msgstr "Seaded" #: core/project_settings.cpp editor/script_editor_debugger.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp @@ -842,22 +791,20 @@ msgid "Profiler" msgstr "Profileerija" #: core/project_settings.cpp -#, fuzzy msgid "Max Functions" -msgstr "Loo funktsioon" +msgstr "Funktsioone maksimaalselt" #: core/project_settings.cpp scene/3d/vehicle_body.cpp msgid "Compression" -msgstr "" +msgstr "Kompressioon" #: core/project_settings.cpp -#, fuzzy msgid "Formats" -msgstr "Formaat" +msgstr "Formaadid" #: core/project_settings.cpp msgid "Zstd" -msgstr "" +msgstr "Zstd" #: core/project_settings.cpp msgid "Long Distance Matching" @@ -865,35 +812,36 @@ msgstr "" #: core/project_settings.cpp msgid "Compression Level" -msgstr "" +msgstr "Kompressiooni tase" #: core/project_settings.cpp +#, fuzzy msgid "Window Log Size" -msgstr "" +msgstr "Akna logi suurus" #: core/project_settings.cpp msgid "Zlib" -msgstr "" +msgstr "Zlib" #: core/project_settings.cpp msgid "Gzip" -msgstr "" +msgstr "Gzip" #: core/project_settings.cpp platform/android/export/export.cpp msgid "Android" -msgstr "" +msgstr "Android" #: core/project_settings.cpp msgid "Modules" -msgstr "" +msgstr "Moodulid" #: core/register_core_types.cpp msgid "TCP" -msgstr "" +msgstr "TCP" #: core/register_core_types.cpp msgid "Connect Timeout Seconds" -msgstr "" +msgstr "Ühendamise aegumistähtaeg sekundites" #: core/register_core_types.cpp msgid "Packet Peer Stream" @@ -905,12 +853,11 @@ msgstr "" #: core/register_core_types.cpp editor/editor_settings.cpp main/main.cpp msgid "SSL" -msgstr "" +msgstr "SSL" #: core/register_core_types.cpp main/main.cpp -#, fuzzy msgid "Certificates" -msgstr "Tipud" +msgstr "Sertifikaadid" #: core/resource.cpp editor/dependency_editor.cpp #: editor/editor_resource_picker.cpp @@ -919,9 +866,8 @@ msgid "Resource" msgstr "Ressurss" #: core/resource.cpp -#, fuzzy msgid "Local To Scene" -msgstr "Sule stseen" +msgstr "Kohalik stseenile" #: core/resource.cpp editor/dependency_editor.cpp #: editor/editor_autoload_settings.cpp editor/plugins/path_editor_plugin.cpp @@ -932,20 +878,19 @@ msgstr "Tee" #: core/script_language.cpp msgid "Source Code" -msgstr "" +msgstr "Lähtekood" #: core/translation.cpp editor/project_settings_editor.cpp msgid "Locale" -msgstr "" +msgstr "Lokaal" #: core/translation.cpp -#, fuzzy msgid "Test" -msgstr "Testimine" +msgstr "Test" #: core/translation.cpp scene/resources/font.cpp msgid "Fallback" -msgstr "" +msgstr "Varuvariant" #: core/ustring.cpp scene/resources/segment_shape_2d.cpp msgid "B" @@ -981,17 +926,17 @@ msgstr "EiB" #: drivers/gles3/rasterizer_scene_gles3.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp modules/gltf/gltf_state.cpp msgid "Buffers" -msgstr "" +msgstr "Puhvrid" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp msgid "Canvas Polygon Buffer Size (KB)" -msgstr "" +msgstr "Lõuendipolügooni puhvri suurus (KB)" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp msgid "Canvas Polygon Index Buffer Size (KB)" -msgstr "" +msgstr "Lõuendipolügoonide indekspuhvri suurus (KB)" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp editor/editor_settings.cpp @@ -1003,54 +948,52 @@ msgstr "" #: servers/physics_2d/space_2d_sw.cpp servers/physics_2d_server.cpp #: servers/visual_server.cpp msgid "2D" -msgstr "" +msgstr "2D" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp -#, fuzzy msgid "Snapping" -msgstr "Intervall:" +msgstr "Naksamine" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp -#, fuzzy msgid "Use GPU Pixel Snap" -msgstr "Kasuta ruudustiku naksamist" +msgstr "Kasuta GPU piksli naksamist" #: drivers/gles2/rasterizer_scene_gles2.cpp #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Immediate Buffer Size (KB)" -msgstr "" +msgstr "Kohene puhvri suurus (KB)" #: drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp msgid "Lightmapping" -msgstr "" +msgstr "Valguskaardistamine" #: drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp msgid "Use Bicubic Sampling" -msgstr "" +msgstr "Kasutage bikuubilist proovivõtmist" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Renderable Elements" -msgstr "" +msgstr "Max renderdatavaid elemente" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Renderable Lights" -msgstr "" +msgstr "Max renderdatavaid tulesid" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Renderable Reflections" -msgstr "" +msgstr "Max renderdatavaid peegeldusi" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Lights Per Object" -msgstr "" +msgstr "Max tulesid objekti kohta" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Subsurface Scattering" -msgstr "" +msgstr "Pinnaalune hajumine" #: drivers/gles3/rasterizer_scene_gles3.cpp editor/animation_track_editor.cpp #: editor/import/resource_importer_texture.cpp @@ -1062,29 +1005,28 @@ msgstr "" #: scene/animation/animation_blend_tree.cpp scene/gui/control.cpp #: scene/main/canvas_layer.cpp scene/resources/environment.cpp #: scene/resources/material.cpp scene/resources/particles_material.cpp -#, fuzzy msgid "Scale" -msgstr "Skaleerimisrežiim" +msgstr "Skaala" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Follow Surface" -msgstr "" +msgstr "Jälgi pinda" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Weight Samples" -msgstr "" +msgstr "Kaalu proovid" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Voxel Cone Tracing" -msgstr "" +msgstr "Vokseli koonuse jälgimine" #: drivers/gles3/rasterizer_scene_gles3.cpp scene/resources/environment.cpp msgid "High Quality" -msgstr "" +msgstr "Kõrge kvaliteet" #: drivers/gles3/rasterizer_storage_gles3.cpp msgid "Blend Shape Max Buffer Size (KB)" -msgstr "" +msgstr "Segu kuju max puhvri suurus (KB)" #. TRANSLATORS: Adjective, refers to the mode for Bezier handles (Free, Balanced, Mirror). #: editor/animation_bezier_editor.cpp @@ -1128,12 +1070,14 @@ msgid "Move Bezier Points" msgstr "Liiguta Bezieri punkte" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp +#, fuzzy msgid "Anim Duplicate Keys" -msgstr "" +msgstr "Anim duplikaatvõtmed" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp +#, fuzzy msgid "Anim Delete Keys" -msgstr "" +msgstr "Anim kustuta võtmed" #: editor/animation_track_editor.cpp msgid "Anim Change Keyframe Time" @@ -1158,9 +1102,8 @@ msgstr "" #: editor/animation_track_editor.cpp scene/2d/animated_sprite.cpp #: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Frame" -msgstr "Kaadri %" +msgstr "Kaader" #: editor/animation_track_editor.cpp editor/editor_profiler.cpp #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp @@ -1171,16 +1114,14 @@ msgstr "Aeg" #: editor/animation_track_editor.cpp editor/import/resource_importer_scene.cpp #: platform/osx/export/export.cpp -#, fuzzy msgid "Location" -msgstr "Tõlked" +msgstr "Asukoht" #: editor/animation_track_editor.cpp modules/gltf/gltf_node.cpp #: scene/2d/polygon_2d.cpp scene/2d/remote_transform_2d.cpp #: scene/3d/remote_transform.cpp scene/3d/spatial.cpp scene/gui/control.cpp -#, fuzzy msgid "Rotation" -msgstr "Pööramisrežiim" +msgstr "Pööramine" #: editor/animation_track_editor.cpp editor/script_editor_debugger.cpp #: modules/visual_script/visual_script_nodes.cpp scene/gui/range.cpp @@ -1188,14 +1129,13 @@ msgid "Value" msgstr "Väärtus" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Arg Count" -msgstr "Sisesta võti siia" +msgstr "Arg kogus" #: editor/animation_track_editor.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp msgid "Args" -msgstr "" +msgstr "Argumendid" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/script_editor_debugger.cpp modules/gltf/gltf_accessor.cpp @@ -1206,28 +1146,26 @@ msgstr "Tüüp" #: editor/animation_track_editor.cpp msgid "In Handle" -msgstr "" +msgstr "Käepidemes" #: editor/animation_track_editor.cpp msgid "Out Handle" -msgstr "" +msgstr "Väljas käepide" #: editor/animation_track_editor.cpp #: editor/import/resource_importer_texture.cpp #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp msgid "Stream" -msgstr "" +msgstr "Voog" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Start Offset" -msgstr "Liigutamisrežiim" +msgstr "Algnihe" #: editor/animation_track_editor.cpp -#, fuzzy msgid "End Offset" -msgstr "Kustuta sõlm(ed)" +msgstr "Lõpunihe" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/import/resource_importer_scene.cpp @@ -1241,7 +1179,7 @@ msgstr "Animatsioon" #: editor/animation_track_editor.cpp msgid "Easing" -msgstr "" +msgstr "Lõdvendamine" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Keyframe Time" @@ -1270,7 +1208,7 @@ msgstr "Muuda animatsiooni pikkust" #: editor/animation_track_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation Loop" -msgstr "Muuda animatsiooni silmust" +msgstr "Muuda animatsiooni tsüklit" #: editor/animation_track_editor.cpp msgid "Property Track" @@ -1278,23 +1216,23 @@ msgstr "Atribuudi rada" #: editor/animation_track_editor.cpp msgid "3D Transform Track" -msgstr "3D muundus rada" +msgstr "3D transformatsiooni rada" #: editor/animation_track_editor.cpp msgid "Call Method Track" -msgstr "" +msgstr "Meetodi kutsumise rada" #: editor/animation_track_editor.cpp msgid "Bezier Curve Track" -msgstr "Bezieri kurvi rada" +msgstr "Bezier-kõvera rada" #: editor/animation_track_editor.cpp msgid "Audio Playback Track" -msgstr "Heli taasesituse rada" +msgstr "Helimängimise rada" #: editor/animation_track_editor.cpp msgid "Animation Playback Track" -msgstr "Animatsiooni taasesituse rada" +msgstr "Animatsiooni mängimise rada" #: editor/animation_track_editor.cpp msgid "Animation length (frames)" @@ -1335,40 +1273,38 @@ msgstr "Lülita see rada sisse/välja." #: editor/animation_track_editor.cpp msgid "Update Mode (How this property is set)" -msgstr "Uuendusrežiim (kuidas see omadus on seatud)" +msgstr "Uuendusrežiim (kuidas see atribuut on määratud)" #: editor/animation_track_editor.cpp scene/resources/gradient.cpp msgid "Interpolation Mode" msgstr "Interpolatsiooni režiim" #: editor/animation_track_editor.cpp +#, fuzzy msgid "Loop Wrap Mode (Interpolate end with beginning on loop)" -msgstr "Korduse mähise režiim (nterpoleeri lõpp silmuse alguses)" +msgstr "Korduse mähise režiim (interpoleeri lõpp algusega tsükli kordudes)" #: editor/animation_track_editor.cpp msgid "Remove this track." msgstr "Eemalda see rada." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Time (s):" -msgstr "Aeg (sek): " +msgstr "Aeg (s):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Position:" -msgstr "Doki asukoht" +msgstr "Asukoht:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Rotation:" -msgstr "Pööramisrežiim" +msgstr "Pööramine:" #: editor/animation_track_editor.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp #: editor/plugins/multimesh_editor_plugin.cpp msgid "Scale:" -msgstr "" +msgstr "Skaala:" #: editor/animation_track_editor.cpp #: editor/plugins/resource_preloader_editor_plugin.cpp @@ -1379,13 +1315,12 @@ msgid "Type:" msgstr "Tüüp:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "(Invalid, expected type: %s)" -msgstr "Vigane nimi." +msgstr "(Kehtetu, eeldatav tüüp: %s)" #: editor/animation_track_editor.cpp msgid "Easing:" -msgstr "" +msgstr "Lõdvestumine:" #: editor/animation_track_editor.cpp msgid "In-Handle:" @@ -1401,22 +1336,20 @@ msgid "Stream:" msgstr "Heli kuulaja" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Start (s):" -msgstr "Käivita" +msgstr "Algus (s):" #: editor/animation_track_editor.cpp msgid "End (s):" -msgstr "" +msgstr "Lõpp (s):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation Clip:" -msgstr "Animatsiooni klipid:" +msgstr "Animatsiooni klipp:" #: editor/animation_track_editor.cpp msgid "Toggle Track Enabled" -msgstr "Lülita rada sisse" +msgstr "Lülita raja seesolekut" #: editor/animation_track_editor.cpp msgid "Continuous" @@ -1496,14 +1429,12 @@ msgstr "Eemalda animatsiooni rada" #: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp #: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Editors" -msgstr "Redaktor" +msgstr "Toimetid" #: editor/animation_track_editor.cpp editor/editor_settings.cpp -#, fuzzy msgid "Confirm Insert Track" -msgstr "Sisesta animatsiooni rada ja võti" +msgstr "Kinnitage raja lisamine" #. TRANSLATORS: %s will be replaced by a phrase describing the target of track. #: editor/animation_track_editor.cpp @@ -1512,7 +1443,7 @@ msgstr "Loo uus rada %s-le ja sisesta võti?" #: editor/animation_track_editor.cpp msgid "Create %d NEW tracks and insert keys?" -msgstr "" +msgstr "Kas luua %d UUT rada ja sisestada võtmed?" #: editor/animation_track_editor.cpp editor/create_dialog.cpp #: editor/editor_audio_buses.cpp editor/editor_feature_profile.cpp @@ -1528,6 +1459,7 @@ msgid "Create" msgstr "Loo" #: editor/animation_track_editor.cpp +#, fuzzy msgid "Anim Insert" msgstr "Animatsiooni sisestus" @@ -1698,7 +1630,7 @@ msgstr "Vali AnimationPlayer sõlm, et luua ja redigeerida animatsioone." #: editor/animation_track_editor.cpp msgid "Only show tracks from nodes selected in tree." -msgstr "" +msgstr "Näita ainult radu puus valitud node'idelt." #: editor/animation_track_editor.cpp msgid "Group tracks by node or display them as plain list." @@ -1884,31 +1816,31 @@ msgstr "" #: editor/code_editor.cpp msgid "Go to Line" -msgstr "" +msgstr "Mine reale" #: editor/code_editor.cpp msgid "Line Number:" -msgstr "" +msgstr "Reanumber:" #: editor/code_editor.cpp msgid "%d replaced." -msgstr "" +msgstr "%d asendatud." #: editor/code_editor.cpp editor/editor_help.cpp msgid "%d match." -msgstr "" +msgstr "%d vaste." #: editor/code_editor.cpp editor/editor_help.cpp msgid "%d matches." -msgstr "" +msgstr "%d vastet." #: editor/code_editor.cpp editor/find_in_files.cpp msgid "Match Case" -msgstr "" +msgstr "Sobita suur- ja väiketähed" #: editor/code_editor.cpp editor/find_in_files.cpp msgid "Whole Words" -msgstr "" +msgstr "Terved sõnad" #: editor/code_editor.cpp msgid "Replace" @@ -1916,76 +1848,78 @@ msgstr "Asenda" #: editor/code_editor.cpp msgid "Replace All" -msgstr "" +msgstr "Asenda kõik" #: editor/code_editor.cpp msgid "Selection Only" -msgstr "" +msgstr "Ainult valik" #: editor/code_editor.cpp editor/plugins/script_text_editor.cpp #: editor/plugins/text_editor.cpp msgid "Standard" -msgstr "" +msgstr "Standard" #: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp msgid "Toggle Scripts Panel" -msgstr "" +msgstr "Lülita skriptide paneel sisse/välja" #: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/texture_region_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp msgid "Zoom In" -msgstr "" +msgstr "Suurenda" #: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/texture_region_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp msgid "Zoom Out" -msgstr "" +msgstr "Vähenda" #: editor/code_editor.cpp msgid "Reset Zoom" -msgstr "" +msgstr "Lähtesta suum" #: editor/code_editor.cpp modules/gdscript/gdscript.cpp msgid "Warnings" -msgstr "" +msgstr "Hoiatused" #: editor/code_editor.cpp msgid "Line and column numbers." -msgstr "" +msgstr "Rea- ja veerunumbrid." #: editor/connections_dialog.cpp msgid "Method in target node must be specified." -msgstr "" +msgstr "Tuleb täpsustada siht-node'i meetod." #: editor/connections_dialog.cpp msgid "Method name must be a valid identifier." -msgstr "" +msgstr "Meetodi nimi peab olema kehtiv identifikaator." #: editor/connections_dialog.cpp msgid "" "Target method not found. Specify a valid method or attach a script to the " "target node." msgstr "" +"Sihtmeetodit ei leitud. Määrake kehtiv meetod või lisage siht-node'ile " +"skript." #: editor/connections_dialog.cpp msgid "Connect to Node:" -msgstr "" +msgstr "Ühenda node'iga:" #: editor/connections_dialog.cpp msgid "Connect to Script:" -msgstr "" +msgstr "Ühenda skriptiga:" #: editor/connections_dialog.cpp msgid "From Signal:" -msgstr "" +msgstr "Signaalilt:" #: editor/connections_dialog.cpp msgid "Scene does not contain any script." -msgstr "" +msgstr "Stseen ei sisalda skripti." #: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp #: editor/groups_editor.cpp @@ -2007,15 +1941,15 @@ msgstr "Eemalda" #: editor/connections_dialog.cpp msgid "Add Extra Call Argument:" -msgstr "" +msgstr "Lisa ekstra kutsumisargument:" #: editor/connections_dialog.cpp msgid "Extra Call Arguments:" -msgstr "" +msgstr "Ekstra kutsumisargumendid:" #: editor/connections_dialog.cpp msgid "Receiver Method:" -msgstr "" +msgstr "Vastuvõtjameetod:" #: editor/connections_dialog.cpp scene/3d/room_manager.cpp #: servers/visual_server.cpp @@ -2024,12 +1958,14 @@ msgstr "Täpsem" #: editor/connections_dialog.cpp msgid "Deferred" -msgstr "" +msgstr "Edasi lükatud" #: editor/connections_dialog.cpp msgid "" "Defers the signal, storing it in a queue and only firing it at idle time." msgstr "" +"Lükkab signaali edasi, salvestades selle järjekorda ja väljastab seda ainult " +"tühikäigul." #: editor/connections_dialog.cpp scene/resources/texture.cpp msgid "Oneshot" @@ -2037,11 +1973,11 @@ msgstr "Ainulaadne" #: editor/connections_dialog.cpp msgid "Disconnects the signal after its first emission." -msgstr "" +msgstr "Ühendab signaali lahti pärast selle esimest väljastamist." #: editor/connections_dialog.cpp msgid "Cannot connect signal" -msgstr "" +msgstr "Signaali ei saa ühendada" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/export_template_manager.cpp editor/groups_editor.cpp @@ -2064,19 +2000,19 @@ msgstr "Ühenda" #: editor/connections_dialog.cpp msgid "Signal:" -msgstr "" +msgstr "Signaal:" #: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" -msgstr "" +msgstr "Ühenda '%s' ja '%s'" #: editor/connections_dialog.cpp msgid "Disconnect '%s' from '%s'" -msgstr "" +msgstr "Ühenda '%s' ja '%s' lahti" #: editor/connections_dialog.cpp msgid "Disconnect all from signal: '%s'" -msgstr "" +msgstr "Ühenda kõik lahti signaalist: %s" #: editor/connections_dialog.cpp msgid "Connect..." @@ -2089,45 +2025,45 @@ msgstr "Katkesta ühendus" #: editor/connections_dialog.cpp msgid "Connect a Signal to a Method" -msgstr "" +msgstr "Signaali ühendamine meetodiga" #: editor/connections_dialog.cpp msgid "Edit Connection:" -msgstr "" +msgstr "Muuda ühendust:" #: editor/connections_dialog.cpp msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "" +"Kas olete kindel, et soovite eemaldada kõik ühendused signaalist \"%s\"?" #: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp msgid "Signals" msgstr "Signaalid" #: editor/connections_dialog.cpp -#, fuzzy msgid "Filter signals" -msgstr "Filtreeri sõlmed" +msgstr "Filtreeri signaale" #: editor/connections_dialog.cpp msgid "Are you sure you want to remove all connections from this signal?" msgstr "" +"Kas olete kindel, et soovite sellest signaalist kõik ühendused eemaldada?" #: editor/connections_dialog.cpp msgid "Disconnect All" -msgstr "" +msgstr "Ühenda kõik lahti" #: editor/connections_dialog.cpp msgid "Edit..." msgstr "Muuda..." #: editor/connections_dialog.cpp -#, fuzzy msgid "Go to Method" -msgstr "Mine järmisesse kausta." +msgstr "Mine meetodi juurde" #: editor/create_dialog.cpp msgid "Change %s Type" -msgstr "" +msgstr "Muuda %s tüüpi" #: editor/create_dialog.cpp editor/project_settings_editor.cpp msgid "Change" @@ -2135,15 +2071,15 @@ msgstr "Muuda" #: editor/create_dialog.cpp msgid "Create New %s" -msgstr "" +msgstr "Loo uus %s" #: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "No results for \"%s\"." -msgstr "" +msgstr "Päringule \"%s\" pole tulemusi." #: editor/create_dialog.cpp editor/property_selector.cpp msgid "No description available for %s." -msgstr "" +msgstr "%s jaoks kirjeldus puudub." #: editor/create_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp @@ -2177,23 +2113,27 @@ msgstr "Kirjeldus:" #: editor/dependency_editor.cpp msgid "Search Replacement For:" -msgstr "" +msgstr "Otsi asendust järgnevale:" #: editor/dependency_editor.cpp msgid "Dependencies For:" -msgstr "" +msgstr "Sõltuvused järgneva jaoks:" #: editor/dependency_editor.cpp msgid "" "Scene '%s' is currently being edited.\n" "Changes will only take effect when reloaded." msgstr "" +"Stseeni '%s' redigeeritakse praegu.\n" +"Muudatused jõustuvad ainult uuesti laadimisel." #: editor/dependency_editor.cpp msgid "" "Resource '%s' is in use.\n" "Changes will only take effect when reloaded." msgstr "" +"Ressurss '%s' on kasutusel.\n" +"Muudatused jõustuvad ainult uuesti laadimisel." #: editor/dependency_editor.cpp #: modules/gdnative/gdnative_library_editor_plugin.cpp @@ -2206,15 +2146,15 @@ msgstr "Sõltuvused:" #: editor/dependency_editor.cpp msgid "Fix Broken" -msgstr "" +msgstr "Paranda katkised" #: editor/dependency_editor.cpp msgid "Dependency Editor" -msgstr "" +msgstr "Sõltuvuste toimeti" #: editor/dependency_editor.cpp msgid "Search Replacement Resource:" -msgstr "" +msgstr "Otsi asendusressurssi:" #: editor/dependency_editor.cpp editor/editor_file_dialog.cpp #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -2228,7 +2168,7 @@ msgstr "Ava" #: editor/dependency_editor.cpp msgid "Owners of: %s (Total: %d)" -msgstr "" +msgstr "Omanikud: %s (Kokku: %d)" #: editor/dependency_editor.cpp msgid "" @@ -2236,6 +2176,9 @@ msgid "" "Depending on your filesystem configuration, the files will either be moved " "to the system trash or deleted permanently." msgstr "" +"Kas eemaldada valitud failid projektist? (Ei saa tagasi võtta.)\n" +"Sõltuvalt teie failisüsteemi konfiguratsioonist teisaldatakse failid " +"süsteemi prügikasti või kustutatakse jäädavalt." #: editor/dependency_editor.cpp msgid "" @@ -2245,46 +2188,50 @@ msgid "" "Depending on your filesystem configuration, the files will either be moved " "to the system trash or deleted permanently." msgstr "" +"Eemaldatavaid faile vajavad toimimiseks muud ressursid.\n" +"Eemaldage need ikkagi? (Ei saa tagasi võtta.)\n" +"Sõltuvalt teie failisüsteemi konfiguratsioonist teisaldatakse failid " +"süsteemi prügikasti või kustutatakse jäädavalt." #: editor/dependency_editor.cpp msgid "Cannot remove:" -msgstr "" +msgstr "Ei saa eemaldada:" #: editor/dependency_editor.cpp msgid "Error loading:" -msgstr "" +msgstr "Viga laadimisel:" #: editor/dependency_editor.cpp msgid "Load failed due to missing dependencies:" -msgstr "" +msgstr "Laadimine ebaõnnestus puuduvate sõltuvuste tõttu:" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Open Anyway" -msgstr "" +msgstr "Ava ikkagi" #: editor/dependency_editor.cpp msgid "Which action should be taken?" -msgstr "" +msgstr "Mida tuleks teha?" #: editor/dependency_editor.cpp msgid "Fix Dependencies" -msgstr "" +msgstr "Paranda sõltuvused" #: editor/dependency_editor.cpp msgid "Errors loading!" -msgstr "" +msgstr "Laadimisel ilmnesid vead!" #: editor/dependency_editor.cpp msgid "Permanently delete %d item(s)? (No undo!)" -msgstr "" +msgstr "Kas kustutada jäädavalt %d üksus(t)? (Ei saa tagasi võtta!)" #: editor/dependency_editor.cpp msgid "Show Dependencies" -msgstr "" +msgstr "Näita sõltuvusi" #: editor/dependency_editor.cpp msgid "Orphan Resource Explorer" -msgstr "" +msgstr "Orbressursside haldur" #: editor/dependency_editor.cpp editor/editor_audio_buses.cpp #: editor/editor_file_dialog.cpp editor/editor_node.cpp @@ -2296,19 +2243,19 @@ msgstr "Kustuta" #: editor/dependency_editor.cpp msgid "Owns" -msgstr "" +msgstr "Omab" #: editor/dependency_editor.cpp msgid "Resources Without Explicit Ownership:" -msgstr "" +msgstr "Ressursid ilma selge omandiõiguseta:" #: editor/dictionary_property_edit.cpp msgid "Change Dictionary Key" -msgstr "" +msgstr "Muuda sõnastiku võtit" #: editor/dictionary_property_edit.cpp msgid "Change Dictionary Value" -msgstr "" +msgstr "Muuda sõnastiku väärtust" #: editor/editor_about.cpp msgid "Thanks from the Godot community!" @@ -2332,10 +2279,9 @@ msgstr "Juhtiv arendaja" #. TRANSLATORS: This refers to a job title. #: editor/editor_about.cpp -#, fuzzy msgctxt "Job Title" msgid "Project Manager" -msgstr "projektihaldur" +msgstr "Projekti juht" #: editor/editor_about.cpp msgid "Developers" @@ -2415,35 +2361,35 @@ msgstr "Litsensid" #: editor/editor_asset_installer.cpp msgid "Error opening asset file for \"%s\" (not in ZIP format)." -msgstr "" +msgstr "Viga varade faili \"%s\" avamisel (pole ZIP-formaadis)." #: editor/editor_asset_installer.cpp msgid "%s (already exists)" -msgstr "" +msgstr "%s (juba olemas)" #: editor/editor_asset_installer.cpp msgid "Contents of asset \"%s\" - %d file(s) conflict with your project:" -msgstr "" +msgstr "Vara \"%s\" - %d faili(de) sisu on vastuolus teie projektiga:" #: editor/editor_asset_installer.cpp msgid "Contents of asset \"%s\" - No files conflict with your project:" -msgstr "" +msgstr "Vara \"%s\" sisu - ükski fail ei ole teie projektiga vastuolus:" #: editor/editor_asset_installer.cpp msgid "Uncompressing Assets" -msgstr "" +msgstr "Varade lahtipakkimine" #: editor/editor_asset_installer.cpp msgid "The following files failed extraction from asset \"%s\":" -msgstr "" +msgstr "Järgmised failid ebaõnnestusid varast \"%s\" väljavõtmisel:" #: editor/editor_asset_installer.cpp msgid "(and %s more files)" -msgstr "" +msgstr "(ja veel %s faili)" #: editor/editor_asset_installer.cpp msgid "Asset \"%s\" installed successfully!" -msgstr "" +msgstr "Vara \"%s\" paigaldatud edukalt!" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2455,9 +2401,8 @@ msgid "Install" msgstr "Paigalda" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Asset Installer" -msgstr "Paigalda" +msgstr "Varade paigaldaja" #: editor/editor_audio_buses.cpp msgid "Speakers" @@ -2469,19 +2414,19 @@ msgstr "Lisa efekt" #: editor/editor_audio_buses.cpp msgid "Rename Audio Bus" -msgstr "" +msgstr "Nimeta ümber audiosiin" #: editor/editor_audio_buses.cpp msgid "Change Audio Bus Volume" -msgstr "" +msgstr "Muuda audiosiini helitugevust" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Solo" -msgstr "" +msgstr "Lülita audiosiini soolo sisse/välja" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Mute" -msgstr "" +msgstr "Lülita helisiini vaigistamine sisse/välja" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Bypass Effects" @@ -2505,7 +2450,7 @@ msgstr "" #: editor/editor_audio_buses.cpp msgid "Drag & drop to rearrange." -msgstr "" +msgstr "Ümberkorraldamiseks lohistage." #: editor/editor_audio_buses.cpp msgid "Solo" @@ -2520,9 +2465,8 @@ msgid "Bypass" msgstr "Jäta vahele" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Bus Options" -msgstr "Klassi valikud" +msgstr "Siinivalikud" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp #: editor/project_export.cpp editor/scene_tree_dock.cpp @@ -2535,23 +2479,23 @@ msgstr "Lähtesta valjus" #: editor/editor_audio_buses.cpp msgid "Delete Effect" -msgstr "" +msgstr "Kustuta efekt" #: editor/editor_audio_buses.cpp msgid "Add Audio Bus" -msgstr "" +msgstr "Lisa audiosiin" #: editor/editor_audio_buses.cpp msgid "Master bus can't be deleted!" -msgstr "" +msgstr "Põhisiini ei saa kustutada!" #: editor/editor_audio_buses.cpp msgid "Delete Audio Bus" -msgstr "" +msgstr "Kustuta audiosiin" #: editor/editor_audio_buses.cpp msgid "Duplicate Audio Bus" -msgstr "" +msgstr "Duplikeeri audiosiin" #: editor/editor_audio_buses.cpp msgid "Reset Bus Volume" @@ -2559,15 +2503,15 @@ msgstr "Lähtesta siini valjus" #: editor/editor_audio_buses.cpp msgid "Move Audio Bus" -msgstr "" +msgstr "Liiguta audiosiin" #: editor/editor_audio_buses.cpp msgid "Save Audio Bus Layout As..." -msgstr "" +msgstr "Salvesta audiosiini paigutus kui..." #: editor/editor_audio_buses.cpp msgid "Location for New Layout..." -msgstr "" +msgstr "Uue paigutuse asukoht..." #: editor/editor_audio_buses.cpp msgid "Open Audio Bus Layout" @@ -2578,9 +2522,8 @@ msgid "There is no '%s' file." msgstr "Faili '%s' ei ole eksisteeri." #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Layout:" -msgstr "Paigutus" +msgstr "Paigutus:" #: editor/editor_audio_buses.cpp msgid "Invalid file, not an audio bus layout." @@ -2629,9 +2572,8 @@ msgid "Create a new Bus Layout." msgstr "Loo uus siini paigutus." #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Audio Bus Layout" -msgstr "Ava heliliinide paigutus" +msgstr "Audiosiini paigutus" #: editor/editor_autoload_settings.cpp msgid "Invalid name." @@ -2639,7 +2581,7 @@ msgstr "Vigane nimi." #: editor/editor_autoload_settings.cpp msgid "Cannot begin with a digit." -msgstr "" +msgstr "Ei saa alata numbriga." #: editor/editor_autoload_settings.cpp msgid "Valid characters:" @@ -2651,11 +2593,11 @@ msgstr "Ei tohi kokkupõrkuda mängumootori juba olemasoleva klassi nimega." #: editor/editor_autoload_settings.cpp msgid "Must not collide with an existing built-in type name." -msgstr "" +msgstr "Ei tohi põrkuda olemasoleva sisse-ehitatud tüübinimega." #: editor/editor_autoload_settings.cpp msgid "Must not collide with an existing global constant name." -msgstr "" +msgstr "Ei tohi põrkuda olemasoleva globaalse konstandi nimega." #: editor/editor_autoload_settings.cpp msgid "Keyword cannot be used as an autoload name." @@ -2663,11 +2605,11 @@ msgstr "Võtmesõnu ei saa kasutada automaatsete nimedena." #: editor/editor_autoload_settings.cpp msgid "Autoload '%s' already exists!" -msgstr "" +msgstr "Automaatlaadimine '%s' on juba olemas!" #: editor/editor_autoload_settings.cpp msgid "Rename Autoload" -msgstr "" +msgstr "Nimeta automaatlaadimine ümber" #: editor/editor_autoload_settings.cpp msgid "Toggle AutoLoad Globals" @@ -2675,11 +2617,11 @@ msgstr "" #: editor/editor_autoload_settings.cpp msgid "Move Autoload" -msgstr "" +msgstr "Liiguta automaatlaadimist" #: editor/editor_autoload_settings.cpp msgid "Remove Autoload" -msgstr "" +msgstr "Eemalda automaatlaadimine" #: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp #: modules/gdscript/gdscript.cpp platform/android/export/export_plugin.cpp @@ -2692,31 +2634,30 @@ msgstr "Luba" #: editor/editor_autoload_settings.cpp msgid "Rearrange Autoloads" -msgstr "" +msgstr "Paiguta automaatlaadimised ümber" #: editor/editor_autoload_settings.cpp msgid "Can't add autoload:" -msgstr "" +msgstr "Ei saa lisada automaatlaadimist:" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "%s is an invalid path. File does not exist." -msgstr "Faili ei ole olemas." +msgstr "%s on kehtetu failitee. Faili pole olemas." #: editor/editor_autoload_settings.cpp msgid "%s is an invalid path. Not in resource path (res://)." -msgstr "" +msgstr "%s on kehtetu failitee. Ei ole ressursiteel (res://)." #: editor/editor_autoload_settings.cpp msgid "Add AutoLoad" -msgstr "" +msgstr "Lisa automaatlaadimine" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp #: editor/editor_plugin_settings.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp msgid "Path:" -msgstr "Tee:" +msgstr "Failitee:" #: editor/editor_autoload_settings.cpp msgid "Node Name:" @@ -2724,7 +2665,7 @@ msgstr "Sõlme nimi:" #: editor/editor_autoload_settings.cpp msgid "Global Variable" -msgstr "" +msgstr "Globaalne muutuja" #: editor/editor_data.cpp msgid "Paste Params" @@ -2732,11 +2673,11 @@ msgstr "Kleebi parameetrid" #: editor/editor_data.cpp msgid "Updating Scene" -msgstr "Värskendan stseeni" +msgstr "Stseeni värskendamine" #: editor/editor_data.cpp msgid "Storing local changes..." -msgstr "Salvestan kohalikud muudatused..." +msgstr "Kohalike muudatuste salvestamine..." #: editor/editor_data.cpp msgid "Updating scene..." @@ -2754,11 +2695,11 @@ msgstr "[salvestamata]" #: editor/editor_dir_dialog.cpp msgid "Please select a base directory first." -msgstr "Palun valige kõigepealt baaskataloog." +msgstr "Palun valige kõigepealt baaskaust." #: editor/editor_dir_dialog.cpp msgid "Choose a Directory" -msgstr "Vali kataloog" +msgstr "Valige kaust" #: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp editor/project_manager.cpp @@ -2785,20 +2726,19 @@ msgstr "Vali" #: editor/editor_export.cpp msgid "Project export for platform:" -msgstr "" +msgstr "Projekti eksportimine platvormi jaoks:" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with warnings." -msgstr "Kopeeri sõlme tee" +msgstr "Lõpetas koos hoiatustega." #: editor/editor_export.cpp msgid "Completed successfully." -msgstr "" +msgstr "Lõpetas edukalt." #: editor/editor_export.cpp msgid "Failed." -msgstr "" +msgstr "Ebaõnnestus." #: editor/editor_export.cpp msgid "Storing File:" @@ -2813,29 +2753,24 @@ msgid "Packing" msgstr "Pakin" #: editor/editor_export.cpp -#, fuzzy msgid "Save PCK" -msgstr "Salvesta kui" +msgstr "Salvesta PCK" #: editor/editor_export.cpp -#, fuzzy msgid "Cannot create file \"%s\"." -msgstr "Ei saanud luua kausta." +msgstr "Ei saa luua faili \"%s\"." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to export project files." -msgstr "Ei saanud luua kausta." +msgstr "Projektifailide eksportimine ebaõnnestus." #: editor/editor_export.cpp -#, fuzzy msgid "Can't open file to read from path \"%s\"." -msgstr "Faili ei saa kirjutamiseks avada:" +msgstr "Faili ei saa avada lugemiseks teelt \"%s\"." #: editor/editor_export.cpp -#, fuzzy msgid "Save ZIP" -msgstr "Salvesta kui" +msgstr "Salvesta ZIP" #: editor/editor_export.cpp msgid "" @@ -2865,22 +2800,20 @@ msgstr "" "tagasilangemine lubatudâ€." #: editor/editor_export.cpp -#, fuzzy msgid "" "Target platform requires 'PVRTC' texture compression for GLES2. Enable " "'Import Pvrtc' in Project Settings." msgstr "" -"Sihtplatvorm nõuab GLES2 jaoks 'ETC' tekstuuri tihendamist. Projekti " -"seadetes lubage „Impordi ETCâ€." +"Sihtplatvorm nõuab GLES2 jaoks 'PVRTC' tekstuuri tihendamist. Projekti " +"seadetes lubage „Impordi PVRTCâ€." #: editor/editor_export.cpp -#, fuzzy msgid "" "Target platform requires 'ETC2' or 'PVRTC' texture compression for GLES3. " "Enable 'Import Etc 2' or 'Import Pvrtc' in Project Settings." msgstr "" -"Sihtplatvorm nõuab GLES3 jaoks 'ETC2' tekstuuri tihendamist. Projekti " -"seadetes lubage „Impordi ETC2â€." +"Sihtplatvorm nõuab GLES3 jaoks \"ETC2\" või \"PVRTC\" tekstuuri tihendamist. " +"Lubage projekti seadetes \"Impordi Etc 2\" või \"Impordi Pvrtc\"." #: editor/editor_export.cpp #, fuzzy @@ -2890,103 +2823,100 @@ msgid "" "Enable 'Import Pvrtc' in Project Settings, or disable 'Driver Fallback " "Enabled'." msgstr "" -"Sihtplatvorm nõuab juhi varundamiseks GLES2-ga 'ETC' tekstuuri tihendamist.\n" -"Lülitage projekti sätetes sisse „Impordi ETC†või keelake „Draiveri " -"tagasilangemine lubatudâ€." +"Sihtplatvorm nõuab 'PVRTC' tekstuuride tihendamist, et draiver saaks tagasi " +"pöörduda GLES2-le.\n" +"Lülitage projekti seadetes sisse 'Import Pvrtc' või lülitage välja 'Driver " +"Fallback Enabled'." #: editor/editor_export.cpp platform/android/export/export_plugin.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Custom Template" -msgstr "Redaktor" +msgstr "Kohandatud mall" #: editor/editor_export.cpp editor/project_export.cpp #: platform/android/export/export_plugin.cpp platform/iphone/export/export.cpp #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #: platform/uwp/export/export.cpp msgid "Release" -msgstr "" +msgstr "Avalda" #: editor/editor_export.cpp -#, fuzzy msgid "Binary Format" -msgstr "Formaat" +msgstr "Binaarne formaat" #: editor/editor_export.cpp msgid "64 Bits" -msgstr "" +msgstr "64 bitti" #: editor/editor_export.cpp msgid "Embed PCK" -msgstr "" +msgstr "Manusta PCK" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Texture Format" -msgstr "Pööramisrežiim" +msgstr "Tekstuuriformaat" #: editor/editor_export.cpp msgid "BPTC" -msgstr "" +msgstr "BPTC" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "S3TC" -msgstr "" +msgstr "S3TC" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "ETC" -msgstr "" +msgstr "ETC" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "ETC2" -msgstr "" +msgstr "ETC2" #: editor/editor_export.cpp msgid "No BPTC Fallbacks" -msgstr "" +msgstr "Puuduvad BPTC varuvariandid" #: editor/editor_export.cpp platform/android/export/export_plugin.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp platform/uwp/export/export.cpp msgid "Custom debug template not found." -msgstr "" +msgstr "Kohandatud silumismalli ei leitud." #: editor/editor_export.cpp platform/android/export/export_plugin.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp platform/uwp/export/export.cpp msgid "Custom release template not found." -msgstr "" +msgstr "Kohandatud väljalaskemalli ei leitud." #: editor/editor_export.cpp msgid "Prepare Template" -msgstr "" +msgstr "Malli ettevalmistamine" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "The given export path doesn't exist." -msgstr "" +msgstr "Antud eksporditee ei ole olemas." #: editor/editor_export.cpp platform/javascript/export/export.cpp -#, fuzzy msgid "Template file not found: \"%s\"." -msgstr "Mallifaili ei leitud:" +msgstr "Mallifaili ei leitud: \"%s\"." #: editor/editor_export.cpp msgid "Failed to copy export template." -msgstr "" +msgstr "Eksportmalli kopeerimine ebaõnnestus." #: editor/editor_export.cpp platform/windows/export/export.cpp #: platform/x11/export/export.cpp msgid "PCK Embedding" -msgstr "" +msgstr "PCK manustamine" #: editor/editor_export.cpp msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." -msgstr "" +msgstr "32-bitise ekspordi puhul ei saa manustatud PCK olla suurem kui 4 GiB." #: editor/editor_export.cpp msgid "Convert Text Resources To Binary On Export" -msgstr "" +msgstr "Teisenda tekstiressursid eksportimisel binaarseks" #: editor/editor_feature_profile.cpp msgid "3D Editor" @@ -3007,20 +2937,19 @@ msgstr "Stseenipuu redigeerimine" #: editor/editor_feature_profile.cpp msgid "Node Dock" -msgstr "" +msgstr "Node'i dokk" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "FileSystem Dock" -msgstr "Failikuvaja" +msgstr "Failisüsteemi dokk" #: editor/editor_feature_profile.cpp msgid "Import Dock" -msgstr "" +msgstr "Impordi dokk" #: editor/editor_feature_profile.cpp msgid "Allows to view and edit 3D scenes." -msgstr "" +msgstr "Võimaldab vaadata ja redigeerida 3D stseene." #: editor/editor_feature_profile.cpp msgid "Allows to edit scripts using the integrated script editor." @@ -3439,7 +3368,7 @@ msgstr "Klass:" #: editor/editor_help.cpp editor/scene_tree_editor.cpp #: editor/script_create_dialog.cpp msgid "Inherits:" -msgstr "Pärib:" +msgstr "Pärandub:" #: editor/editor_help.cpp msgid "Inherited by:" @@ -3491,7 +3420,7 @@ msgstr "" #: editor/editor_help.cpp msgid "Enumerations" -msgstr "Loetelu" +msgstr "Loendused" #: editor/editor_help.cpp msgid "Property Descriptions" @@ -3509,7 +3438,7 @@ msgstr "" #: editor/editor_help.cpp msgid "Method Descriptions" -msgstr "Meetodi kirjeldused" +msgstr "Meetodite kirjeldused" #: editor/editor_help.cpp msgid "" @@ -4507,6 +4436,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projekt" @@ -7299,7 +7229,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -10189,7 +10120,7 @@ msgstr "" #: editor/plugins/polygon_2d_editor_plugin.cpp modules/csg/csg_shape.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Snap" -msgstr "" +msgstr "Naksamine" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Enable Snap" @@ -14698,7 +14629,7 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "Input Map" -msgstr "" +msgstr "Sisendikaart" #: editor/project_settings_editor.cpp msgid "Action:" @@ -14718,7 +14649,7 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "Localization" -msgstr "Tõlked" +msgstr "Lokaliseerimine" #: editor/project_settings_editor.cpp msgid "Translations" @@ -15134,18 +15065,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Sõlme nimi:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Sõlme nimi:" #: editor/scene_tree_dock.cpp @@ -15337,6 +15268,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Sõlme nimi:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15400,6 +15336,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -15437,7 +15377,7 @@ msgstr "" #: editor/script_create_dialog.cpp msgid "File does not exist." -msgstr "Faili ei ole olemas." +msgstr "Faili pole olemas." #: editor/script_create_dialog.cpp msgid "Invalid extension." @@ -15481,7 +15421,7 @@ msgstr "" #: editor/script_create_dialog.cpp msgid "Invalid path." -msgstr "Kehtetu tee." +msgstr "Kehtetu failitee." #: editor/script_create_dialog.cpp msgid "Invalid class name." @@ -17256,6 +17196,21 @@ msgstr "Poolresolutioon" msgid "Auto Update Project" msgstr "Projekt" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Kuva kõik" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Vali kataloog" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Vali kataloog" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19042,6 +18997,11 @@ msgstr "Kustuta sõlm(ed)" msgid "Custom BG Color" msgstr "Kustuta sõlm(ed)" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Laienda kõik" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19877,6 +19837,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" @@ -24560,9 +24526,8 @@ msgid "Draw 2D Outlines" msgstr "" #: scene/main/scene_tree.cpp servers/visual_server.cpp -#, fuzzy msgid "Reflections" -msgstr "Kopeeri valik" +msgstr "Peegeldused" #: scene/main/scene_tree.cpp msgid "Atlas Size" diff --git a/editor/translations/eu.po b/editor/translations/eu.po index 3e69f3c4b9..c0f1953269 100644 --- a/editor/translations/eu.po +++ b/editor/translations/eu.po @@ -4426,6 +4426,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Proiektua" @@ -7197,7 +7198,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -14999,18 +15001,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Animazio berriaren izena:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Animazio berriaren izena:" #: editor/scene_tree_dock.cpp @@ -15200,6 +15202,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Animazio berriaren izena:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15263,6 +15270,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17102,6 +17113,21 @@ msgstr "" msgid "Auto Update Project" msgstr "Proiektua" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Erakutsi guztiak" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Ireki direktorioa" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Ireki direktorioa" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18861,6 +18887,11 @@ msgstr "Funtzioak:" msgid "Custom BG Color" msgstr "Funtzioak:" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Esportatu" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -19684,6 +19715,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/extract.py b/editor/translations/extract.py index 07026baee2..cecdb3939d 100755 --- a/editor/translations/extract.py +++ b/editor/translations/extract.py @@ -8,6 +8,7 @@ import re import shutil import subprocess import sys +from typing import Dict, Tuple class Message: @@ -42,7 +43,7 @@ class Message: return "\n".join(lines) -messages_map = {} # (id, context) -> Message. +messages_map: Dict[Tuple[str, str], Message] = {} # (id, context) -> Message. line_nb = False @@ -51,11 +52,11 @@ for arg in sys.argv[1:]: print("Enabling line numbers in the context locations.") line_nb = True else: - os.sys.exit("Non supported argument '" + arg + "'. Aborting.") + sys.exit("Non supported argument '" + arg + "'. Aborting.") if not os.path.exists("editor"): - os.sys.exit("ERROR: This script should be started from the root of the git repo.") + sys.exit("ERROR: This script should be started from the root of the git repo.") matches = [] diff --git a/editor/translations/fa.po b/editor/translations/fa.po index 86b847e530..28371fdd50 100644 --- a/editor/translations/fa.po +++ b/editor/translations/fa.po @@ -26,13 +26,19 @@ # Seyed Fazel Alavi <fazel8195@gmail.com>, 2022. # Giga hertz <gigahertzyt@gmail.com>, 2022. # Aryan Azadeh <aryan@azadeh.email>, 2022. +# Mitsuha Miamizu <mitsuha.miamizu4444@gmail.com>, 2022. +# LordProfo <nimaentity30@gmail.com>, 2022. +# LordProfo (Nima) <nimaentity30@gmail.com>, 2022. +# John Smith <pkafsharix@gmail.com>, 2022. +# Ali Jafari <ali.jafari.sn@gmail.com>, 2022. +# Ali Almasi <A710almasi@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-06-20 06:44+0000\n" -"Last-Translator: Aryan Azadeh <aryan@azadeh.email>\n" +"PO-Revision-Date: 2022-09-19 05:22+0000\n" +"Last-Translator: Ali Jafari <ali.jafari.sn@gmail.com>\n" "Language-Team: Persian <https://hosted.weblate.org/projects/godot-engine/" "godot/fa/>\n" "Language: fa\n" @@ -40,107 +46,97 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.13.1-dev\n" +"X-Generator: Weblate 4.14.1\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" -msgstr "" +msgstr "درایور تبلت" #: core/bind/core_bind.cpp -#, fuzzy msgid "Clipboard" -msgstr "ØØ§Ùظه پنهان خالی است!" +msgstr "کلیپ‌بورد" #: core/bind/core_bind.cpp -#, fuzzy msgid "Current Screen" -msgstr "ØØ±Ú©Øª دادن گره(ها)" +msgstr "ØµÙØÙ‡ کنونی" #: core/bind/core_bind.cpp msgid "Exit Code" -msgstr "" +msgstr "کد خروج" #: core/bind/core_bind.cpp -#, fuzzy msgid "V-Sync Enabled" -msgstr "روشن" +msgstr "V-Sync ÙØ¹Ø§Ù„ شد" #: core/bind/core_bind.cpp main/main.cpp msgid "V-Sync Via Compositor" -msgstr "" +msgstr "V-Sync از طریق کامپوزیتور" #: core/bind/core_bind.cpp main/main.cpp msgid "Delta Smoothing" -msgstr "" +msgstr "هموارسازی دلتا" #: core/bind/core_bind.cpp -#, fuzzy msgid "Low Processor Usage Mode" -msgstr "ØØ§Ù„ت صدور:" +msgstr "ØØ§Ù„ت Ø§Ø³ØªÙØ§Ø¯Ù‡Ù” Ú©Ù… پردازنده" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode Sleep (µsec)" -msgstr "" +msgstr "ØØ§Ù„ت خواب Ø§Ø³ØªÙØ§Ø¯Ù‡ Ú©Ù… پردازنده (µsec)" #: core/bind/core_bind.cpp main/main.cpp platform/uwp/os_uwp.cpp msgid "Keep Screen On" -msgstr "" +msgstr "روشن Ù†Ú¯Ù‡ داشتن ØµÙØÙ‡ نمایش" #: core/bind/core_bind.cpp -#, fuzzy msgid "Min Window Size" -msgstr "باز کردن Ùˆ اجرای یک اسکریپت" +msgstr "ØØ¯Ø§Ù‚Ù„ اندازهٔ پنجره" #: core/bind/core_bind.cpp -#, fuzzy msgid "Max Window Size" -msgstr "باز کردن Ùˆ اجرای یک اسکریپت" +msgstr "ØØ¯Ø§Ú©Ø«Ø± اندازهٔ پنجره" #: core/bind/core_bind.cpp -#, fuzzy msgid "Screen Orientation" -msgstr "شمارش ها" +msgstr "جهت ØµÙØÙ‡ نمایش" #: core/bind/core_bind.cpp core/project_settings.cpp main/main.cpp #: platform/uwp/os_uwp.cpp -#, fuzzy msgid "Window" -msgstr "چارچوب جدید" +msgstr "پنجره" #: core/bind/core_bind.cpp core/project_settings.cpp msgid "Borderless" -msgstr "" +msgstr "بدون ØØ§Ø´ÛŒÙ‡" #: core/bind/core_bind.cpp msgid "Per Pixel Transparency Enabled" -msgstr "" +msgstr "Ø´ÙØ§Ùیت پیکسل به پیکسل ÙØ¹Ø§Ù„ است" #: core/bind/core_bind.cpp core/project_settings.cpp -#, fuzzy msgid "Fullscreen" msgstr "ØØ§Ù„ت تمام ØµÙØÙ‡" #: core/bind/core_bind.cpp msgid "Maximized" -msgstr "" +msgstr "ØØ¯Ø§Ú©Ø«Ø± اندازه" #: core/bind/core_bind.cpp msgid "Minimized" -msgstr "" +msgstr "ØØ¯Ø§Ù‚Ù„ اندازه" #: core/bind/core_bind.cpp core/project_settings.cpp scene/gui/dialogs.cpp #: scene/gui/graph_node.cpp msgid "Resizable" -msgstr "" +msgstr "قابل تغییر اندازه" #: core/bind/core_bind.cpp core/os/input_event.cpp scene/2d/node_2d.cpp #: scene/2d/physics_body_2d.cpp scene/2d/remote_transform_2d.cpp #: scene/3d/physics_body.cpp scene/3d/remote_transform.cpp #: scene/gui/control.cpp scene/gui/line_edit.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Position" -msgstr "برداشتن موج" +msgstr "موقعیت" #: core/bind/core_bind.cpp core/project_settings.cpp editor/editor_settings.cpp #: main/main.cpp modules/gridmap/grid_map.cpp @@ -152,61 +148,55 @@ msgstr "برداشتن موج" #: scene/resources/style_box.cpp scene/resources/texture.cpp #: scene/resources/visual_shader.cpp servers/visual_server.cpp msgid "Size" -msgstr "" +msgstr "اندازه" #: core/bind/core_bind.cpp msgid "Endian Swap" -msgstr "" +msgstr "جا‌به‌جایی اندیان" #: core/bind/core_bind.cpp -#, fuzzy msgid "Editor Hint" -msgstr "ویرایشگر" +msgstr "راهنمای ویرایشگر" #: core/bind/core_bind.cpp msgid "Print Error Messages" -msgstr "" +msgstr "چاپ کردن پیام خطا" #: core/bind/core_bind.cpp -#, fuzzy msgid "Iterations Per Second" -msgstr "ØØ§Ù„ت درون یابی(درون‌یابی روشی است برای ÛŒØ§ÙØªÙ† مقدار تابع درون یک بازه)" +msgstr "تکرار در ثانیه" #: core/bind/core_bind.cpp msgid "Target FPS" -msgstr "" +msgstr "FPS هدÙ" #: core/bind/core_bind.cpp -#, fuzzy msgid "Time Scale" -msgstr "بومی" +msgstr "مقیاس زمانی" #: core/bind/core_bind.cpp main/main.cpp msgid "Physics Jitter Fix" -msgstr "" +msgstr "ØÙ„ لرزش Ùیزیک" #: core/bind/core_bind.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Error" -msgstr "" +msgstr "خطا" #: core/bind/core_bind.cpp -#, fuzzy msgid "Error String" -msgstr "خطا در بارگذاری:" +msgstr "رشته خطا" #: core/bind/core_bind.cpp -#, fuzzy msgid "Error Line" -msgstr "خطا در بارگذاری:" +msgstr "خط خطا" #: core/bind/core_bind.cpp -#, fuzzy msgid "Result" -msgstr "جستجوی راهنما" +msgstr "نتیجه" #: core/command_queue_mt.cpp core/message_queue.cpp main/main.cpp msgid "Memory" -msgstr "" +msgstr "مموری" #: core/command_queue_mt.cpp core/message_queue.cpp #: core/register_core_types.cpp drivers/gles2/rasterizer_canvas_base_gles2.cpp @@ -217,128 +207,120 @@ msgstr "" #: modules/webrtc/webrtc_data_channel.h modules/websocket/websocket_macros.h #: servers/visual_server.cpp msgid "Limits" -msgstr "" +msgstr "Ù…ØØ¯ÙˆØ¯ÛŒØªâ€ŒÙ‡Ø§" #: core/command_queue_mt.cpp msgid "Command Queue" -msgstr "" +msgstr "ØµÙ ÙØ±Ù…ان" #: core/command_queue_mt.cpp msgid "Multithreading Queue Size (KB)" -msgstr "" +msgstr "انداهٔ ص٠چند رشته‌ای (کیلوبایت)" #: core/func_ref.cpp modules/visual_script/visual_script_builtin_funcs.cpp #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Function" -msgstr "توابع" +msgstr "تابع" #: core/image.cpp core/packed_data_container.cpp scene/2d/polygon_2d.cpp #: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp msgid "Data" -msgstr "" +msgstr "داده" #: core/io/file_access_network.cpp core/register_core_types.cpp #: editor/editor_file_dialog.cpp editor/editor_settings.cpp main/main.cpp #: modules/gdscript/language_server/gdscript_language_server.cpp #: modules/webrtc/webrtc_data_channel.h modules/websocket/websocket_macros.h #: scene/gui/file_dialog.cpp -#, fuzzy msgid "Network" -msgstr "صدور پروژه" +msgstr "شبکه" #: core/io/file_access_network.cpp -#, fuzzy msgid "Remote FS" -msgstr "برداشتن" +msgstr "ریموت FS" #: core/io/file_access_network.cpp msgid "Page Size" -msgstr "" +msgstr "اندازهٔ ØµÙØÙ‡" #: core/io/file_access_network.cpp msgid "Page Read Ahead" -msgstr "" +msgstr "ØµÙØÙ‡ پیش‌رو را بخوانید" #: core/io/http_client.cpp msgid "Blocking Mode Enabled" -msgstr "" +msgstr "ØØ§Ù„ت مسدود کردن ÙØ¹Ø§Ù„ شد" #: core/io/http_client.cpp -#, fuzzy msgid "Connection" msgstr "اتصال" #: core/io/http_client.cpp msgid "Read Chunk Size" -msgstr "" +msgstr "اندازه تکه خواندن" #: core/io/marshalls.cpp msgid "Object ID" -msgstr "" +msgstr "شناسهٔ شیء" #: core/io/multiplayer_api.cpp core/io/packet_peer.cpp msgid "Allow Object Decoding" -msgstr "" +msgstr "اجازه رمزگشایی Ø´ÛŒ" #: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp msgid "Refuse New Network Connections" -msgstr "" +msgstr "رد کردن اتصالات شبکه جدید" #: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp -#, fuzzy msgid "Network Peer" -msgstr "صدور پروژه" +msgstr "همتای شبکه" #: core/io/multiplayer_api.cpp scene/animation/animation_player.cpp -#, fuzzy msgid "Root Node" -msgstr "تغییر نام" +msgstr "نود ریشه ای" #: core/io/networked_multiplayer_peer.cpp -#, fuzzy msgid "Refuse New Connections" -msgstr "اتصال" +msgstr "از اتصالات جدید خودداری کنید" #: core/io/networked_multiplayer_peer.cpp -#, fuzzy msgid "Transfer Mode" -msgstr "گره جابجای" +msgstr "ØØ§Ù„ت انتقال" #: core/io/packet_peer.cpp msgid "Encode Buffer Max Size" -msgstr "" +msgstr "رمزگذاری ØØ¯Ø§Ú©Ø«Ø± اندازه Ø¨Ø§ÙØ±" #: core/io/packet_peer.cpp msgid "Input Buffer Max Size" -msgstr "" +msgstr "ورود ØØ¯Ø§Ú©Ø«Ø± اندازه Ø¨Ø§ÙØ±" #: core/io/packet_peer.cpp msgid "Output Buffer Max Size" -msgstr "" +msgstr "ØØ¯ اکثر اندازه خروجی Ø¨Ø§ÙØ±" #: core/io/packet_peer.cpp msgid "Stream Peer" -msgstr "" +msgstr "جریان همتا" #: core/io/stream_peer.cpp msgid "Big Endian" -msgstr "" +msgstr "اندیان بزرگ" #: core/io/stream_peer.cpp msgid "Data Array" -msgstr "" +msgstr "آرایه داده" #: core/io/stream_peer_ssl.cpp +#, fuzzy msgid "Blocking Handshake" -msgstr "" +msgstr "مسدود کردن دست دادن" #: core/io/udp_server.cpp -#, fuzzy msgid "Max Pending Connections" -msgstr "ویرایش اتصال:" +msgstr "ØØ¯Ø§Ú©Ø«Ø± اتصالات معلق" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -347,28 +329,27 @@ msgstr "نوع نامعتبر ورودی برای ()convertØŒ ثوابت *_TYPEâ #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." -msgstr "یک رشته به‌طول 1 ( یک کاراکتر) مورد انتظار است." +msgstr "یک رشته (string) به اندازه 1 (کاراکتر) مورد انتظار است." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/mono/glue/gd_glue.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Not enough bytes for decoding bytes, or invalid format." msgstr "" -"تعداد بایت های مورد نظر برای رمزگشایی بایت ها کاÙÛŒ نیست،‌ Ùˆ یا ÙØ±Ù…ت نامعتبر " +"تعداد بایت‌های مورد نظر برای رمزگشایی بایت‌ها کاÙÛŒ نیست،‌ Ùˆ یا ÙØ±Ù…ت نامعتبر " "است ." #: core/math/expression.cpp -#, fuzzy msgid "Invalid input %d (not passed) in expression" -msgstr "ورودی نامعتبر i% (تایید نشده) در عبارت" +msgstr "ورودی نامعتبر %d (تایید نشده) در عبارت" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" -msgstr "از self نمی‌توان Ø§Ø³ØªÙØ§Ø¯Ù‡ کرد زیرا نمونه ØµÙØ± است (رد نشده است)" +msgstr "از self نمی‌توان Ø§Ø³ØªÙØ§Ø¯Ù‡ کرد زیرا نمونه null است (مقدار Ù†Ú¯Ø±ÙØªÙ‡ است)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." -msgstr "عملگر های نامعتبر به عملگر %s, %s Ùˆ %s." +msgstr "عملوند های نامعتبر به عملگر %s, %s , %s." #: core/math/expression.cpp msgid "Invalid index of type %s for base type %s" @@ -384,34 +365,32 @@ msgstr "آرگومان های نامعتبر برای ساخت '%s'" #: core/math/expression.cpp msgid "On call to '%s':" -msgstr "به هنگام ÙØ±Ø§Ø®ÙˆØ§Ù† تابع'%s':" +msgstr "به هنگام ÙØ±Ø§Ø®ÙˆØ§Ù† تابع '%s':" #: core/math/random_number_generator.cpp #: modules/opensimplex/open_simplex_noise.cpp msgid "Seed" -msgstr "" +msgstr "دانه" #: core/math/random_number_generator.cpp -#, fuzzy msgid "State" -msgstr "وضعیت:" +msgstr "وضعیت" #: core/message_queue.cpp msgid "Message Queue" -msgstr "" +msgstr "ص٠پیام" #: core/message_queue.cpp msgid "Max Size (KB)" -msgstr "" +msgstr "ØØ¯Ø§Ú©Ø«Ø± اندازه (کیلوبایت)" #: core/os/input.cpp -#, fuzzy msgid "Mouse Mode" -msgstr "انتخاب ØØ§Ù„ت" +msgstr "ØØ§Ù„ت ماوس" #: core/os/input.cpp msgid "Use Accumulated Input" -msgstr "" +msgstr "Ø§Ø³ØªÙØ§Ø¯Ù‡ از ورودی انباشته" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: servers/audio_server.cpp @@ -419,105 +398,93 @@ msgid "Device" msgstr "دستگاه" #: core/os/input_event.cpp -#, fuzzy msgid "Alt" -msgstr "همه" +msgstr "آلت" #: core/os/input_event.cpp msgid "Shift" -msgstr "" +msgstr "Ø´ÛŒÙØª" #: core/os/input_event.cpp -#, fuzzy msgid "Control" -msgstr "مهار نسخه" +msgstr "کنترل" #: core/os/input_event.cpp msgid "Meta" -msgstr "" +msgstr "متا" #: core/os/input_event.cpp -#, fuzzy msgid "Command" -msgstr "جامعه" +msgstr "دستور" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" -msgstr "روشن" +msgstr "Ùیزیکی" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Pressed" -msgstr "بازنشانی بزرگنمایی" +msgstr "ÙØ´Ø±Ø¯Ù‡â€ŒØ´Ø¯Ù‡" #: core/os/input_event.cpp -#, fuzzy msgid "Scancode" -msgstr "پویش" +msgstr "اسکن‌کد" #: core/os/input_event.cpp msgid "Physical Scancode" -msgstr "" +msgstr "اسکن‌کد Ùیزیکی" #: core/os/input_event.cpp msgid "Unicode" -msgstr "" +msgstr "یونیکد" #: core/os/input_event.cpp msgid "Echo" -msgstr "" +msgstr "اکو" #: core/os/input_event.cpp scene/gui/base_button.cpp -#, fuzzy msgid "Button Mask" -msgstr "Button" +msgstr "ماسک دکمه" #: core/os/input_event.cpp scene/2d/node_2d.cpp scene/gui/control.cpp -#, fuzzy msgid "Global Position" -msgstr "ثابت" +msgstr "موقعیت عمومی" #: core/os/input_event.cpp msgid "Factor" -msgstr "" +msgstr "عامل" #: core/os/input_event.cpp -#, fuzzy msgid "Button Index" -msgstr "Button" +msgstr "ایندکس دکمه" #: core/os/input_event.cpp msgid "Doubleclick" -msgstr "" +msgstr "دابل‌کلیک" #: core/os/input_event.cpp msgid "Tilt" -msgstr "" +msgstr "شیب" #: core/os/input_event.cpp -#, fuzzy msgid "Pressure" -msgstr "بازنشانی بزرگنمایی" +msgstr "ÙØ´Ø§Ø±" #: core/os/input_event.cpp msgid "Pen Inverted" -msgstr "" +msgstr "قلم معکوس" #: core/os/input_event.cpp -#, fuzzy msgid "Relative" -msgstr "GDNative" +msgstr "نسبت" #: core/os/input_event.cpp scene/2d/camera_2d.cpp scene/2d/cpu_particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/interpolated_camera.cpp #: scene/animation/animation_player.cpp scene/resources/environment.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Speed" -msgstr "بومی" +msgstr "سرعت" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: scene/3d/sprite_3d.cpp @@ -525,80 +492,72 @@ msgid "Axis" msgstr "Ù…ØÙˆØ±" #: core/os/input_event.cpp -#, fuzzy msgid "Axis Value" -msgstr "(مقدار)" +msgstr "مقدار Ù…ØÙˆØ±" #: core/os/input_event.cpp modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Index" -msgstr "اندیس:" +msgstr "ایندکس" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: modules/visual_script/visual_script_nodes.cpp #: scene/2d/touch_screen_button.cpp -#, fuzzy msgid "Action" -msgstr "Ø§ÙØ²ÙˆØ¯Ù† وظیÙÙ‡" +msgstr "عمل" #: core/os/input_event.cpp scene/resources/environment.cpp #: scene/resources/material.cpp msgid "Strength" -msgstr "" +msgstr "قدرت" #: core/os/input_event.cpp msgid "Delta" -msgstr "" +msgstr "دلتا" #: core/os/input_event.cpp -#, fuzzy msgid "Channel" -msgstr "تغییر بده" +msgstr "کانال" #: core/os/input_event.cpp main/main.cpp -#, fuzzy msgid "Message" -msgstr "تغییر بده" +msgstr "پیام" #: core/os/input_event.cpp -#, fuzzy msgid "Pitch" -msgstr "سوییچ" +msgstr "پیچ" #: core/os/input_event.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/physics_body_2d.cpp scene/3d/cpu_particles.cpp #: scene/3d/physics_body.cpp scene/resources/particles_material.cpp msgid "Velocity" -msgstr "" +msgstr "سرعت" #: core/os/input_event.cpp +#, fuzzy msgid "Instrument" -msgstr "" +msgstr "ابزار" #: core/os/input_event.cpp -#, fuzzy msgid "Controller Number" -msgstr "شماره خط:" +msgstr "شماره کنترلر" #: core/os/input_event.cpp msgid "Controller Value" -msgstr "" +msgstr "مقدار کنترلر" #: core/project_settings.cpp editor/editor_node.cpp main/main.cpp #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Application" -msgstr "Ø§ÙØ²ÙˆØ¯Ù† وظیÙÙ‡" +msgstr "اپلیکیشن" #: core/project_settings.cpp main/main.cpp msgid "Config" -msgstr "" +msgstr "پیکربندی" #: core/project_settings.cpp -#, fuzzy msgid "Project Settings Override" -msgstr "تنظیمات طرØâ€¦" +msgstr "لغو تنظیمات پروژه" #: core/project_settings.cpp core/resource.cpp #: editor/animation_track_editor.cpp editor/editor_autoload_settings.cpp @@ -629,42 +588,39 @@ msgstr "اجرا" #: core/project_settings.cpp editor/editor_node.cpp #: editor/run_settings_dialog.cpp main/main.cpp msgid "Main Scene" -msgstr "" +msgstr "صØÙ†Ù‡Ù” اصلی" #: core/project_settings.cpp -#, fuzzy msgid "Disable stdout" -msgstr "ØºÛŒØ±ÙØ¹Ø§Ù„ شده" +msgstr "stdout ØºÛŒØ±ÙØ¹Ø§Ù„ شده" #: core/project_settings.cpp -#, fuzzy msgid "Disable stderr" -msgstr "ØºÛŒØ±ÙØ¹Ø§Ù„ شده" +msgstr "stderr ØºÛŒØ±ÙØ¹Ø§Ù„ شده" #: core/project_settings.cpp msgid "Use Hidden Project Data Directory" -msgstr "" +msgstr "Ø§Ø³ØªÙØ§Ø¯Ù‡ از Ùهرست داده‌های پروژه پنهان" #: core/project_settings.cpp msgid "Use Custom User Dir" -msgstr "" +msgstr "Ø§Ø³ØªÙØ§Ø¯Ù‡ از Custom User Dir" #: core/project_settings.cpp msgid "Custom User Dir Name" -msgstr "" +msgstr "نام دلخواه برای دایرکتوری کاربر" #: core/project_settings.cpp main/main.cpp #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #: platform/uwp/os_uwp.cpp -#, fuzzy msgid "Display" -msgstr "نشان دادن همه" +msgstr "نمایش" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/opensimplex/noise_texture.cpp scene/2d/line_2d.cpp #: scene/3d/label_3d.cpp scene/gui/text_edit.cpp scene/resources/texture.cpp msgid "Width" -msgstr "" +msgstr "عرض" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/gltf/gltf_node.cpp modules/opensimplex/noise_texture.cpp @@ -673,21 +629,19 @@ msgstr "" #: scene/resources/font.cpp scene/resources/navigation_mesh.cpp #: scene/resources/primitive_meshes.cpp scene/resources/texture.cpp msgid "Height" -msgstr "" +msgstr "Ø§Ø±ØªÙØ§Ø¹" #: core/project_settings.cpp msgid "Always On Top" -msgstr "" +msgstr "همیشه در بالا" #: core/project_settings.cpp -#, fuzzy msgid "Test Width" -msgstr "خطی" +msgstr "آزمایش عرض" #: core/project_settings.cpp -#, fuzzy msgid "Test Height" -msgstr "آزمودن" +msgstr "آزمایش Ø§Ø±ØªÙØ§Ø¹" #: core/project_settings.cpp editor/animation_track_editor.cpp #: editor/editor_audio_buses.cpp main/main.cpp servers/audio_server.cpp @@ -695,56 +649,54 @@ msgid "Audio" msgstr "صدا" #: core/project_settings.cpp -#, fuzzy msgid "Default Bus Layout" -msgstr "Ø·Ø±Ø Ù¾ÛŒØ´ ÙØ±Ø¶ اتوبوس را بارگیری کنید." +msgstr "چیدمان اتوبوس Ù¾ÛŒØ´â€ŒÙØ±Ø¶" #: core/project_settings.cpp editor/editor_export.cpp #: editor/editor_file_system.cpp editor/editor_node.cpp #: editor/editor_settings.cpp editor/script_create_dialog.cpp #: scene/2d/camera_2d.cpp scene/3d/light.cpp scene/main/node.cpp msgid "Editor" -msgstr "ÙˆÛŒØ±Ø§ÛŒÙØ´Ú¯ÙŽØ±" +msgstr "ویرایشگر" #: core/project_settings.cpp +#, fuzzy msgid "Main Run Args" -msgstr "" +msgstr "آرگومان های اصلی اجرا" #: core/project_settings.cpp msgid "Scene Naming" -msgstr "" +msgstr "نام‌گذاری صØÙ†Ù‡" #: core/project_settings.cpp msgid "Search In File Extensions" -msgstr "" +msgstr "جستجو در پسوند ÙØ§ÛŒÙ„" #: core/project_settings.cpp msgid "Script Templates Search Path" -msgstr "" +msgstr "مسیر جستجوی الگوهای اسکریپت" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Autoload On Startup" -msgstr "مهار نسخه" +msgstr "بارگذاری خودکار نسخهٔ کنترل در هنگام راه‌اندازی" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Plugin Name" -msgstr "مهار نسخه" +msgstr "نام Ø§ÙØ²ÙˆÙ†Ù‡ کنترل نسخه" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp msgid "Input" -msgstr "" +msgstr "ورودی" #: core/project_settings.cpp msgid "UI Accept" -msgstr "" +msgstr "پذیرش UI" #: core/project_settings.cpp #, fuzzy msgid "UI Select" -msgstr "انتخاب شده را ØØ°Ù Ú©Ù†" +msgstr "انتخاب رابط کاربری" #: core/project_settings.cpp #, fuzzy @@ -752,45 +704,46 @@ msgid "UI Cancel" msgstr "لغو" #: core/project_settings.cpp +#, fuzzy msgid "UI Focus Next" -msgstr "" +msgstr "تمرکز بعدی رابط کاربری" #: core/project_settings.cpp +#, fuzzy msgid "UI Focus Prev" -msgstr "" +msgstr "تمرکز قبلی رابط کاربری" #: core/project_settings.cpp msgid "UI Left" -msgstr "" +msgstr "کلید Ú†Ù¾" #: core/project_settings.cpp msgid "UI Right" -msgstr "" +msgstr "کلید راست" #: core/project_settings.cpp msgid "UI Up" -msgstr "" +msgstr "کلید بالا" #: core/project_settings.cpp -#, fuzzy msgid "UI Down" -msgstr "پایین" +msgstr "UI پایین" #: core/project_settings.cpp msgid "UI Page Up" -msgstr "" +msgstr "کلید Page Up" #: core/project_settings.cpp msgid "UI Page Down" -msgstr "" +msgstr "کلید Page Down" #: core/project_settings.cpp msgid "UI Home" -msgstr "" +msgstr "UI خانه" #: core/project_settings.cpp msgid "UI End" -msgstr "" +msgstr "UI پایان" #: core/project_settings.cpp main/main.cpp modules/bullet/register_types.cpp #: modules/bullet/space_bullet.cpp scene/2d/physics_body_2d.cpp @@ -801,7 +754,7 @@ msgstr "" #: servers/physics_2d/space_2d_sw.cpp servers/physics_2d_server.cpp #: servers/physics_server.cpp msgid "Physics" -msgstr "" +msgstr "Ùیزیک" #: core/project_settings.cpp editor/editor_settings.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -811,11 +764,11 @@ msgstr "" #: scene/3d/physics_body.cpp scene/resources/world.cpp #: servers/physics/space_sw.cpp servers/physics_server.cpp msgid "3D" -msgstr "" +msgstr "سه بعدی" #: core/project_settings.cpp msgid "Smooth Trimesh Collision" -msgstr "" +msgstr "برخورد روان مش مثلثی" #: core/project_settings.cpp drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles2/rasterizer_scene_gles2.cpp @@ -827,7 +780,7 @@ msgstr "" #: scene/main/viewport.cpp servers/visual/visual_server_scene.cpp #: servers/visual_server.cpp msgid "Rendering" -msgstr "" +msgstr "رندر کردن" #: core/project_settings.cpp drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_scene_gles3.cpp @@ -837,18 +790,17 @@ msgstr "" #: scene/resources/multimesh.cpp servers/visual/visual_server_scene.cpp #: servers/visual_server.cpp msgid "Quality" -msgstr "" +msgstr "Ú©ÛŒÙیت" #: core/project_settings.cpp scene/gui/file_dialog.cpp #: scene/main/scene_tree.cpp scene/resources/navigation_mesh.cpp #: servers/visual_server.cpp -#, fuzzy msgid "Filters" -msgstr "صاÙÛŒ:" +msgstr "Ùیلترها" #: core/project_settings.cpp scene/main/viewport.cpp msgid "Sharpen Intensity" -msgstr "" +msgstr "تیز کردن شدت" #: core/project_settings.cpp editor/editor_export.cpp editor/editor_node.cpp #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp @@ -864,69 +816,65 @@ msgstr "اشکال یابی" #: core/project_settings.cpp main/main.cpp modules/gdscript/gdscript.cpp #: modules/visual_script/visual_script.cpp scene/resources/dynamic_font.cpp -#, fuzzy msgid "Settings" -msgstr "ØªØ±Ø¬ÛŒØØ§Øª" +msgstr "تنظیمات" #: core/project_settings.cpp editor/script_editor_debugger.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp msgid "Profiler" -msgstr "" +msgstr "Ù¾Ø±ÙˆÙØ§ÛŒÙ„ر" #: core/project_settings.cpp -#, fuzzy msgid "Max Functions" -msgstr "تغییر نام نقش" +msgstr "تغییر نام توابع" #: core/project_settings.cpp scene/3d/vehicle_body.cpp -#, fuzzy msgid "Compression" -msgstr "انتقال را در انیمیشن تغییر بده" +msgstr "ÙØ´Ø±Ø¯Ù‡â€ŒØ³Ø§Ø²ÛŒ" #: core/project_settings.cpp msgid "Formats" -msgstr "" +msgstr "ÙØ±Ù…ت‌ها" #: core/project_settings.cpp msgid "Zstd" -msgstr "" +msgstr "Zstd" #: core/project_settings.cpp msgid "Long Distance Matching" -msgstr "" +msgstr "تطبیق Ù…Ø³Ø§ÙØª طولانی" #: core/project_settings.cpp msgid "Compression Level" -msgstr "" +msgstr "Ø³Ø·Ø ÙØ´Ø±Ø¯Ù‡â€ŒØ³Ø§Ø²ÛŒ" #: core/project_settings.cpp msgid "Window Log Size" -msgstr "" +msgstr "اندازهٔ پنجرهٔ ‹گزارش" #: core/project_settings.cpp msgid "Zlib" -msgstr "" +msgstr "Zlib" #: core/project_settings.cpp msgid "Gzip" -msgstr "" +msgstr "Gzip" #: core/project_settings.cpp platform/android/export/export.cpp msgid "Android" -msgstr "" +msgstr "اندروید" #: core/project_settings.cpp msgid "Modules" -msgstr "" +msgstr "ماژول‌ها" #: core/register_core_types.cpp msgid "TCP" -msgstr "" +msgstr "TCP" #: core/register_core_types.cpp -#, fuzzy msgid "Connect Timeout Seconds" -msgstr "اتصال به گره:" +msgstr "" #: core/register_core_types.cpp msgid "Packet Peer Stream" @@ -934,16 +882,15 @@ msgstr "" #: core/register_core_types.cpp msgid "Max Buffer (Power of 2)" -msgstr "" +msgstr "ØØ¯Ø§Ú©Ø«Ø± Ø¨Ø§ÙØ± (به توان 2)" #: core/register_core_types.cpp editor/editor_settings.cpp main/main.cpp msgid "SSL" -msgstr "" +msgstr "SSL" #: core/register_core_types.cpp main/main.cpp -#, fuzzy msgid "Certificates" -msgstr "خصوصیات" +msgstr "مدارک" #: core/resource.cpp editor/dependency_editor.cpp #: editor/editor_resource_picker.cpp @@ -964,22 +911,20 @@ msgid "Path" msgstr "آدرس" #: core/script_language.cpp -#, fuzzy msgid "Source Code" -msgstr "منبع" +msgstr "کد منبع" #: core/translation.cpp editor/project_settings_editor.cpp msgid "Locale" msgstr "بومی" #: core/translation.cpp -#, fuzzy msgid "Test" -msgstr "آزمودن" +msgstr "آزمایش" #: core/translation.cpp scene/resources/font.cpp msgid "Fallback" -msgstr "" +msgstr "بازگشت" #: core/ustring.cpp scene/resources/segment_shape_2d.cpp msgid "B" @@ -1015,17 +960,17 @@ msgstr "اگزابایت" #: drivers/gles3/rasterizer_scene_gles3.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp modules/gltf/gltf_state.cpp msgid "Buffers" -msgstr "" +msgstr "Ø¨Ø§ÙØ±Ù‡Ø§" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp msgid "Canvas Polygon Buffer Size (KB)" -msgstr "" +msgstr "اندازه Ø¨Ø§ÙØ± پرده چندضلعی (کیلوبایت)" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp msgid "Canvas Polygon Index Buffer Size (KB)" -msgstr "" +msgstr "اندازه Ø¨Ø§ÙØ± شاخص پرده چندضلعی (کیلوبایت)" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp editor/editor_settings.cpp @@ -1037,54 +982,55 @@ msgstr "" #: servers/physics_2d/space_2d_sw.cpp servers/physics_2d_server.cpp #: servers/visual_server.cpp msgid "2D" -msgstr "" +msgstr "دو بعدی" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp -#, fuzzy msgid "Snapping" -msgstr "Ú†ÙØª:" +msgstr "Ú†ÙØª" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp +#, fuzzy msgid "Use GPU Pixel Snap" -msgstr "" +msgstr "Ø§Ø³ØªÙØ§Ø¯Ù‡ از قالب زنی پیکسل کارت گراÙیک" #: drivers/gles2/rasterizer_scene_gles2.cpp #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Immediate Buffer Size (KB)" -msgstr "" +msgstr "اندازه Ø¨Ø§ÙØ± Ùوری (کیلوبایت)" #: drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp +#, fuzzy msgid "Lightmapping" -msgstr "" +msgstr "نقشه برداری نور" #: drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp msgid "Use Bicubic Sampling" -msgstr "" +msgstr "Ø§Ø³ØªÙØ§Ø¯Ù‡ از نمونه برداری دو مکعبی" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Renderable Elements" -msgstr "" +msgstr "ØØ¯Ø§Ú©Ø«Ø± عناصر قابل اجرا" #: drivers/gles3/rasterizer_scene_gles3.cpp +#, fuzzy msgid "Max Renderable Lights" -msgstr "" +msgstr "ØØ¯Ø§Ú©Ø«Ø± نور های قابل رندر" #: drivers/gles3/rasterizer_scene_gles3.cpp -#, fuzzy msgid "Max Renderable Reflections" -msgstr "انتخاب شده را ØØ°Ù Ú©Ù†" +msgstr "ØØ¯Ø§Ú©Ø«Ø± بازتاب‌های قابل رندر" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Lights Per Object" -msgstr "" +msgstr "ØØ¯Ø§Ú©Ø«Ø± نور ها در هر شیء" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Subsurface Scattering" -msgstr "" +msgstr "پراکندگی زیر سطØÛŒ" #: drivers/gles3/rasterizer_scene_gles3.cpp editor/animation_track_editor.cpp #: editor/import/resource_importer_texture.cpp @@ -1096,29 +1042,29 @@ msgstr "" #: scene/animation/animation_blend_tree.cpp scene/gui/control.cpp #: scene/main/canvas_layer.cpp scene/resources/environment.cpp #: scene/resources/material.cpp scene/resources/particles_material.cpp -#, fuzzy msgid "Scale" -msgstr "بومی" +msgstr "مقیاس" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Follow Surface" -msgstr "" +msgstr "دنبال کردن سطØ" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Weight Samples" -msgstr "" +msgstr "نمونه‌های وزنی" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Voxel Cone Tracing" -msgstr "" +msgstr "ردیابی مخروط واکسلی" #: drivers/gles3/rasterizer_scene_gles3.cpp scene/resources/environment.cpp msgid "High Quality" -msgstr "" +msgstr "Ú©ÛŒÙیت بالا" #: drivers/gles3/rasterizer_storage_gles3.cpp +#, fuzzy msgid "Blend Shape Max Buffer Size (KB)" -msgstr "" +msgstr "ØØ¯Ø§Ú©Ø«Ø± اندازه Ø¨Ø§ÙØ± Ø´Ú©Ù„ ترکیبی (کیلوبایت)" #. TRANSLATORS: Adjective, refers to the mode for Bezier handles (Free, Balanced, Mirror). #: editor/animation_bezier_editor.cpp @@ -1163,11 +1109,11 @@ msgstr "انتقال نقاط Ø¨ÙØ²ÛŒÙر" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Duplicate Keys" -msgstr "تکرار کلید ‌های Ù…ØªØØ±Ú©" +msgstr "تکرار کلیدهای Ù…ØªØØ±Ú©" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Delete Keys" -msgstr "ØØ°Ù کلید های Ù…ØªØØ±Ú©" +msgstr "ØØ°Ù کلیدهای Ù…ØªØØ±Ú©" #: editor/animation_track_editor.cpp msgid "Anim Change Keyframe Time" @@ -1192,67 +1138,62 @@ msgstr "تغییر ÙØ±Ø§Ø®ÙˆØ§Ù† Ù…ØªØØ±Ú©" #: editor/animation_track_editor.cpp scene/2d/animated_sprite.cpp #: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Frame" -msgstr "انتخاب یک گره" +msgstr "ÙØ±ÛŒÙ…" #: editor/animation_track_editor.cpp editor/editor_profiler.cpp #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp #: scene/resources/particles_material.cpp servers/visual_server.cpp -#, fuzzy msgid "Time" -msgstr "زمان:" +msgstr "زمان" #: editor/animation_track_editor.cpp editor/import/resource_importer_scene.cpp #: platform/osx/export/export.cpp -#, fuzzy msgid "Location" -msgstr "بومی‌سازی" +msgstr "مکان" #: editor/animation_track_editor.cpp modules/gltf/gltf_node.cpp #: scene/2d/polygon_2d.cpp scene/2d/remote_transform_2d.cpp #: scene/3d/remote_transform.cpp scene/3d/spatial.cpp scene/gui/control.cpp -#, fuzzy msgid "Rotation" -msgstr "وضعیت:" +msgstr "چرخش" #: editor/animation_track_editor.cpp editor/script_editor_debugger.cpp #: modules/visual_script/visual_script_nodes.cpp scene/gui/range.cpp msgid "Value" -msgstr "" +msgstr "مقدار" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Arg Count" -msgstr "Ø§ÙØ²ÙˆØ¯Ù† عمل ورودی" +msgstr "تعداد Arg" #: editor/animation_track_editor.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp msgid "Args" -msgstr "" +msgstr "آرگومان‌ها" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/script_editor_debugger.cpp modules/gltf/gltf_accessor.cpp #: modules/gltf/gltf_light.cpp modules/visual_script/visual_script_nodes.cpp #: scene/3d/physics_body.cpp scene/resources/visual_shader_nodes.cpp msgid "Type" -msgstr "" +msgstr "تایپ" #: editor/animation_track_editor.cpp msgid "In Handle" -msgstr "" +msgstr "در دسته" #: editor/animation_track_editor.cpp msgid "Out Handle" -msgstr "" +msgstr "دسته بیرون" #: editor/animation_track_editor.cpp #: editor/import/resource_importer_texture.cpp #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp msgid "Stream" -msgstr "" +msgstr "استریم" #: editor/animation_track_editor.cpp #, fuzzy @@ -1262,7 +1203,7 @@ msgstr "انتخاب ØØ§Ù„ت" #: editor/animation_track_editor.cpp #, fuzzy msgid "End Offset" -msgstr "ساختن گره" +msgstr "Ø§Ù†ØØ±Ø§Ù پایانی" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/import/resource_importer_scene.cpp @@ -1275,8 +1216,9 @@ msgid "Animation" msgstr "انیمیشن" #: editor/animation_track_editor.cpp +#, fuzzy msgid "Easing" -msgstr "" +msgstr "آسان کردن" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Keyframe Time" @@ -1313,7 +1255,7 @@ msgstr "ویژگی مسیر" #: editor/animation_track_editor.cpp msgid "3D Transform Track" -msgstr "مسیر دگرشکل 3D" +msgstr "مسیر دگرشکل سه‌بعدی" #: editor/animation_track_editor.cpp msgid "Call Method Track" @@ -1321,7 +1263,7 @@ msgstr "ÙØ±Ø§Ø®ÙˆØ§Ù† تابع مسیر" #: editor/animation_track_editor.cpp msgid "Bezier Curve Track" -msgstr "مسیر منØÙ†ÛŒ Ø¨ÙØ²ÛŒÙر" +msgstr "مسیر منØÙ†ÛŒ Bezier" #: editor/animation_track_editor.cpp msgid "Audio Playback Track" @@ -1329,19 +1271,19 @@ msgstr "مسیر Audio Playback" #: editor/animation_track_editor.cpp msgid "Animation Playback Track" -msgstr "مسیر پخش Animation" +msgstr "مسیر پخش انیمیشن" #: editor/animation_track_editor.cpp msgid "Animation length (frames)" -msgstr "طول انیمیشن ( frames)" +msgstr "طول انیمیشن (ÙØ±ÛŒÙ…)" #: editor/animation_track_editor.cpp msgid "Animation length (seconds)" -msgstr "طول انیمیشن (seconds)" +msgstr "طول انیمیشن (ثانیه)" #: editor/animation_track_editor.cpp msgid "Add Track" -msgstr "ترک را اضاÙÙ‡ Ú©Ù†" +msgstr "Ø§ÙØ²ÙˆØ¯Ù† ترک" #: editor/animation_track_editor.cpp msgid "Animation Looping" @@ -1354,15 +1296,15 @@ msgstr "وظایÙ:" #: editor/animation_track_editor.cpp msgid "Audio Clips:" -msgstr "کلیپ های صوتی:" +msgstr "کلیپ‌های صوتی:" #: editor/animation_track_editor.cpp msgid "Anim Clips:" -msgstr "کلیپ های انیمیشن:" +msgstr "کلیپ‌های انیمیشن:" #: editor/animation_track_editor.cpp msgid "Change Track Path" -msgstr "تغییرمیسر path" +msgstr "تغییرمسیر ترک" #: editor/animation_track_editor.cpp msgid "Toggle this track on/off." @@ -1370,11 +1312,11 @@ msgstr "دÙÚ¯Ø±ØØ§Ù„ت٠روشن/خاموش این قطعه." #: editor/animation_track_editor.cpp msgid "Update Mode (How this property is set)" -msgstr "ØØ§Ù„ت بروزرسانی (Ù†ØÙˆÙ‡ تنظیم این ویژگی)" +msgstr "ØØ§Ù„ت به‌روزرسانی (Ù†ØÙˆÙ‡ تنظیم این ویژگی)" #: editor/animation_track_editor.cpp scene/resources/gradient.cpp msgid "Interpolation Mode" -msgstr "ØØ§Ù„ت درون یابی(درون‌یابی روشی است برای ÛŒØ§ÙØªÙ† مقدار تابع درون یک بازه)" +msgstr "ØØ§Ù„ت درون‌یابی" #: editor/animation_track_editor.cpp msgid "Loop Wrap Mode (Interpolate end with beginning on loop)" @@ -1385,25 +1327,22 @@ msgid "Remove this track." msgstr "این ترک را ØØ°Ù Ú©Ù†." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Time (s):" -msgstr "زمان(s): " +msgstr "زمان:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Position:" -msgstr "برداشتن موج" +msgstr "موقعیت:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Rotation:" -msgstr "وضعیت:" +msgstr "چرخش:" #: editor/animation_track_editor.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp #: editor/plugins/multimesh_editor_plugin.cpp msgid "Scale:" -msgstr "" +msgstr "مقیاس:" #: editor/animation_track_editor.cpp #: editor/plugins/resource_preloader_editor_plugin.cpp @@ -1411,17 +1350,15 @@ msgstr "" #: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Type:" -msgstr "" +msgstr "نوع:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "(Invalid, expected type: %s)" -msgstr "نام دارایی ایندکس نامعتبر." +msgstr "(نامعتبر, نوع مورد انتظار: %s)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Easing:" -msgstr "انتقال" +msgstr "تسهیل:" #: editor/animation_track_editor.cpp msgid "In-Handle:" @@ -1432,23 +1369,20 @@ msgid "Out-Handle:" msgstr "" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Stream:" -msgstr "Ø§ÙØ²ÙˆØ¯Ù† مورد" +msgstr "استریم" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Start (s):" -msgstr "شروع" +msgstr "شروع:" #: editor/animation_track_editor.cpp msgid "End (s):" -msgstr "" +msgstr "پایان(ها):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation Clip:" -msgstr "گره انیمیشن" +msgstr "کلیپ انیمیشن:" #: editor/animation_track_editor.cpp msgid "Toggle Track Enabled" @@ -1507,7 +1441,7 @@ msgstr "اضاÙÙ‡ کردن مقدار(های) ریست" #: editor/animation_track_editor.cpp msgid "Delete Key(s)" -msgstr "ØØ°Ù کلید(key)" +msgstr "ØØ°Ù کلید(ها)" #: editor/animation_track_editor.cpp msgid "Change Animation Update Mode" @@ -1515,11 +1449,11 @@ msgstr "تغییر ØØ§Ù„ت بروزرسانی انیمیشن" #: editor/animation_track_editor.cpp msgid "Change Animation Interpolation Mode" -msgstr "تغییر ØØ§Ù„ت درون یابی(Interpolation ) انیمیشن" +msgstr "تغییر ØØ§Ù„ت درون یابی (Interpolation) انیمیشن" #: editor/animation_track_editor.cpp msgid "Change Animation Loop Mode" -msgstr "تغییر ØØ§Ù„ت تکررار (Loop) انیمیشن" +msgstr "تغییر ØØ§Ù„ت تکرار (Loop) انیمیشن" #: editor/animation_track_editor.cpp msgid "Remove Anim Track" @@ -1532,14 +1466,12 @@ msgstr "ØØ°Ù ترک انیمشین" #: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp #: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Editors" -msgstr "ویرایشگر" +msgstr "ویرایشگرها" #: editor/animation_track_editor.cpp editor/editor_settings.cpp -#, fuzzy msgid "Confirm Insert Track" -msgstr "درج ترک Ùˆ کلید در انیمیشن" +msgstr "درج آهنگ را تأیید کنید" #. TRANSLATORS: %s will be replaced by a phrase describing the target of track. #: editor/animation_track_editor.cpp @@ -1561,7 +1493,7 @@ msgstr "ساختن %d قطعه جدید Ùˆ درج کلیدها؟" #: editor/script_create_dialog.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Create" -msgstr "تولید" +msgstr "ایجاد کردن" #: editor/animation_track_editor.cpp msgid "Anim Insert" @@ -1584,7 +1516,7 @@ msgstr "انیمیشن پلیر نمی تواند خود را انیمیت Ú©Ù†Ø #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp msgid "property '%s'" -msgstr "ویژگی \"Ùª s\"" +msgstr "ویژگی '%s'" #: editor/animation_track_editor.cpp msgid "Anim Create & Insert" @@ -1617,14 +1549,14 @@ msgid "" "-AudioStreamPlayer2D\n" "-AudioStreamPlayer3D" msgstr "" -"آهنگ های صوتی Ùقط Ù…ÛŒ توانند به گره های نوع (nodes) اشاره کنند\n" +"آهنگ‌های صوتی Ùقط می‌توانند به گره‌های نوع (nodes) اشاره کنند:\n" "-AudioStreamPlayer\n" "-AudioStreamPlayer2D\n" "-AudioStreamPlayer3D" #: editor/animation_track_editor.cpp msgid "Animation tracks can only point to AnimationPlayer nodes." -msgstr "آهنگ های انیمیشن Ùقط Ù…ÛŒ توانند به گره های انیمش پلیر اشاره کنند." +msgstr "آهنگ‌های انیمیشن Ùقط می‌توانند به گره‌های انیمیشن پلیر اشاره کنند." #: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" @@ -1632,11 +1564,11 @@ msgstr "بدون ریشه اضاÙÙ‡ کردن مسیر امکان پذیر Ù†ÛŒØ #: editor/animation_track_editor.cpp msgid "Invalid track for Bezier (no suitable sub-properties)" -msgstr "مسیر نامعتبر برای Ø¨ÙØ²ÛŒÙر( زیر-خواص نامناسب)" +msgstr "مسیر نامعتبر برای Bezier ( زیر-خواص نامناسب)" #: editor/animation_track_editor.cpp msgid "Add Bezier Track" -msgstr "Ø§ÙØ²ÙˆØ¯Ù† مسیر Ø¨ÙØ²ÛŒÙر" +msgstr "Ø§ÙØ²ÙˆØ¯Ù† مسیر Bezier" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a key." @@ -1644,7 +1576,7 @@ msgstr "مسیر قطعه نامعتبر، پس نمی‌توان یک کلید #: editor/animation_track_editor.cpp msgid "Track is not of type Spatial, can't insert key" -msgstr "آهنگ از نوع مکانی نیست ØŒ نمی تواند کلید را وارد کند" +msgstr "آهنگ از نوع مکانی نیست، نمی‌تواند کلید را وارد کند" #: editor/animation_track_editor.cpp msgid "Add Transform Track Key" @@ -1652,7 +1584,7 @@ msgstr "Ø§ÙØ²ÙˆØ¯Ù† کلید مسیر دگرشکل" #: editor/animation_track_editor.cpp msgid "Add Track Key" -msgstr "Ø§ÙØ²ÙˆØ¯Ù† کلید مسیر" +msgstr "Ø§ÙØ²ÙˆØ¯Ù† کلید ترک" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a method key." @@ -1663,9 +1595,8 @@ msgid "Add Method Track Key" msgstr "Ø§ÙØ²ÙˆØ¯Ù† تابع کلید میسر" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Method not found in object:" -msgstr "تابع در شئ ÛŒØ§ÙØª نشد: " +msgstr "تابع در آبجکت ÛŒØ§ÙØª نشد:" #: editor/animation_track_editor.cpp msgid "Anim Move Keys" @@ -1677,15 +1608,15 @@ msgstr "کلیدها را در انیمیشن جابجا Ú©Ù†" #: servers/camera/camera_feed.cpp servers/physics_2d_server.cpp #: servers/physics_server.cpp msgid "Transform" -msgstr "" +msgstr "تبدیل" #: editor/animation_track_editor.cpp editor/editor_help.cpp msgid "Methods" -msgstr "روش ها" +msgstr "روش‌ها" #: editor/animation_track_editor.cpp msgid "Bezier" -msgstr "" +msgstr "بزیه" #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -2275,8 +2206,9 @@ msgid "Open" msgstr "باز Ú©Ù†" #: editor/dependency_editor.cpp +#, fuzzy msgid "Owners of: %s (Total: %d)" -msgstr "" +msgstr "ØµØ§ØØ¨Ø§Ù†: %s (Ú©Ù„: %d)" #: editor/dependency_editor.cpp msgid "" @@ -2402,7 +2334,7 @@ msgstr "Ù…Ø¤Ù„ÙØ§Ù†" #: editor/editor_about.cpp msgid "Platinum Sponsors" -msgstr "ØØ§Ù…یان پلاتین" +msgstr "ØØ§Ù…یان Ø³Ø·Ø platinum" #: editor/editor_about.cpp msgid "Gold Sponsors" @@ -2418,7 +2350,7 @@ msgstr "اهداکنندگان Ø¨Ø±Ù†Ø²ÛŒØØ§Ù…یان مالی" #: editor/editor_about.cpp msgid "Mini Sponsors" -msgstr "ØØ§Ù…یان مالی Ú©ÙˆÚ†Ú©" +msgstr "ØØ§Ù…یان Ø³Ø·Ø Mini" #: editor/editor_about.cpp msgid "Gold Donors" @@ -2835,22 +2767,21 @@ msgid "Choose" msgstr "انتخاب کنید" #: editor/editor_export.cpp +#, fuzzy msgid "Project export for platform:" -msgstr "" +msgstr "خروجی پروژه برای سکو:" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with warnings." -msgstr "Ú©Ù¾ÛŒ کردن مسیر node" +msgstr "با هشدار تکمیل شد." #: editor/editor_export.cpp -#, fuzzy msgid "Completed successfully." -msgstr "بسته با موÙقیت نصب شد!" +msgstr "با موÙقیت انجام شد." #: editor/editor_export.cpp msgid "Failed." -msgstr "" +msgstr "ناموÙÙ‚." #: editor/editor_export.cpp msgid "Storing File:" @@ -2865,45 +2796,40 @@ msgid "Packing" msgstr "بسته بندی" #: editor/editor_export.cpp -#, fuzzy msgid "Save PCK" -msgstr "ذخیره در" +msgstr "ذخیره PCk" #: editor/editor_export.cpp -#, fuzzy msgid "Cannot create file \"%s\"." -msgstr "ناتوان در ساختن پوشه." +msgstr "نمیتوان ÙØ§ÛŒÙ„ \"%s\" راساخت." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to export project files." -msgstr "نمی‌تواند یک پوشه ایجاد شود." +msgstr "نمیتوان از ÙØ§ÛŒÙ„های پروژه خروجی Ú¯Ø±ÙØª ." #: editor/editor_export.cpp -#, fuzzy msgid "Can't open file to read from path \"%s\"." -msgstr "ناتوان در گشودن پروژه" +msgstr "نمیتوان ÙØ§ÛŒÙ„ را از مسیر \"%s\" برای خواندن بازکرد." #: editor/editor_export.cpp -#, fuzzy msgid "Save ZIP" -msgstr "ذخیره در" +msgstr "ذخیره ZIP" #: editor/editor_export.cpp msgid "" "Target platform requires 'ETC' texture compression for GLES2. Enable 'Import " "Etc' in Project Settings." msgstr "" -"Ù¾Ù„ØªÙØ±Ù… مورد نظر به ÙØ´Ø±Ø¯Ù‡ سازی تکستچر 'ETC' برای GLES2 نیاز دارد . 'واردکردن " -"ETC' را در تنظیمات پروژه ÙØ¹Ø§Ù„ کنید." +"Ù¾Ù„ØªÙØ±Ù… مورد نظر به ÙØ´Ø±Ø¯Ù‡ سازی تکستچر 'ETC' برای GLES2 نیاز دارد . 'Import " +"Etc' را در تنظیمات پروژه ÙØ¹Ø§Ù„ کنید." #: editor/editor_export.cpp msgid "" "Target platform requires 'ETC2' texture compression for GLES3. Enable " "'Import Etc 2' in Project Settings." msgstr "" -"Ù¾Ù„ØªÙØ±Ù… مورد نظر به ÙØ´Ø±Ø¯Ù‡ سازی تکستچر 'ETC' برای GLES2 نیاز دارد . 'واردکردن " -"ETC' را در تنظیمات پروژه ÙØ¹Ø§Ù„ کنید." +"Ù¾Ù„ØªÙØ±Ù… مورد نظر به ÙØ´Ø±Ø¯Ù‡ سازی تکستچر 'ETC2' برای GLES3 نیاز دارد . 'Import " +"Etc2' را در تنظیمات پروژه ÙØ¹Ø§Ù„ کنید." #: editor/editor_export.cpp msgid "" @@ -2914,8 +2840,8 @@ msgid "" msgstr "" "Ù¾Ù„ØªÙØ±Ù… هد٠به ÙØ´Ø±Ø¯Ù‡â€ŒØ³Ø§Ø²ÛŒ Ø¨Ø§ÙØª 'ETC' برای بازگرداندن درایور به GLES2 نیاز " "دارد.\n" -"'استخراج Etc' را در تنظیمات پروژه ÙØ¹Ø§Ù„ کنید یا \"Driver Fallback Enabled\" " -"را ØºÛŒØ±ÙØ¹Ø§Ù„ کنید." +"'Import Etc' را در تنظیمات پروژه ÙØ¹Ø§Ù„ کنید یا \"Driver Fallback Enabled\" را " +"ØºÛŒØ±ÙØ¹Ø§Ù„ کنید." #: editor/editor_export.cpp msgid "" @@ -2940,33 +2866,35 @@ msgid "" "Enable 'Import Pvrtc' in Project Settings, or disable 'Driver Fallback " "Enabled'." msgstr "" +"پلت ÙØ±Ù… هد٠نیاز به ÙØ´Ø±Ø¯Ù‡ سازی Ø¨Ø§ÙØª 'PVRTC' برای بازگشت درایور به GLES2 " +"دارد.\n" +"\"Import Pvrtc\" را در تنظیمات پروژه ÙØ¹Ø§Ù„ کنید یا \"Driver Fallback " +"Enabled\" را ØºÛŒØ±ÙØ¹Ø§Ù„ کنید." #: editor/editor_export.cpp platform/android/export/export_plugin.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Custom Template" -msgstr "عضوها" +msgstr "قالب شخصی" #: editor/editor_export.cpp editor/project_export.cpp #: platform/android/export/export_plugin.cpp platform/iphone/export/export.cpp #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #: platform/uwp/export/export.cpp msgid "Release" -msgstr "" +msgstr "انتشار" #: editor/editor_export.cpp -#, fuzzy msgid "Binary Format" -msgstr "انتقال را در انیمیشن تغییر بده" +msgstr "باینری ÙØ±Ù…ت" #: editor/editor_export.cpp msgid "64 Bits" -msgstr "" +msgstr "Û¶Û´ بیت" #: editor/editor_export.cpp msgid "Embed PCK" -msgstr "" +msgstr "جاسازی PCK" #: editor/editor_export.cpp platform/osx/export/export.cpp #, fuzzy @@ -2979,15 +2907,15 @@ msgstr "" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "S3TC" -msgstr "" +msgstr "S3TC" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "ETC" -msgstr "" +msgstr "ای‌تی‌سی" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "ETC2" -msgstr "" +msgstr "ای‌تی‌سی‌۲" #: editor/editor_export.cpp msgid "No BPTC Fallbacks" @@ -2997,13 +2925,13 @@ msgstr "" #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp platform/uwp/export/export.cpp msgid "Custom debug template not found." -msgstr "" +msgstr "قالب اشکال زدایی Ø³ÙØ§Ø±Ø´ÛŒ ÛŒØ§ÙØª نشد." #: editor/editor_export.cpp platform/android/export/export_plugin.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp platform/uwp/export/export.cpp msgid "Custom release template not found." -msgstr "" +msgstr "قالب انتشار Ø³ÙØ§Ø±Ø´ÛŒ ÛŒØ§ÙØª نشد." #: editor/editor_export.cpp #, fuzzy @@ -3011,32 +2939,30 @@ msgid "Prepare Template" msgstr "مدیریت صدور قالب ها" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "The given export path doesn't exist." -msgstr "پرونده موجود نیست." +msgstr "مسیر خروجی وجود ندارد." #: editor/editor_export.cpp platform/javascript/export/export.cpp -#, fuzzy msgid "Template file not found: \"%s\"." -msgstr "طول انیمیشن (به ثانیه)." +msgstr "ÙØ§ÛŒÙ„ قالب پیدا نشد: \"%s\"" #: editor/editor_export.cpp -#, fuzzy msgid "Failed to copy export template." -msgstr "نام دارایی ایندکس نامعتبر." +msgstr "خطا در Ú©Ù¾ÛŒ قالب خروجی." #: editor/editor_export.cpp platform/windows/export/export.cpp #: platform/x11/export/export.cpp msgid "PCK Embedding" -msgstr "" +msgstr "تعبیه پی‌سی‌کی" #: editor/editor_export.cpp msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." msgstr "" +"در خروجی های Û³Û² بیتی پی‌سی‌کی تعبیه شده نمی‌تواند از Û´ گیگابایت بزرگ‌تر باشد." #: editor/editor_export.cpp msgid "Convert Text Resources To Binary On Export" -msgstr "" +msgstr "تبدیل منابع متنی به دوتایی هنگام خروجی" #: editor/editor_feature_profile.cpp msgid "3D Editor" @@ -3053,16 +2979,15 @@ msgstr "کتابخانه دارایی" #: editor/editor_feature_profile.cpp msgid "Scene Tree Editing" -msgstr "" +msgstr "ویرایش درخت صØÙ†Ù‡" #: editor/editor_feature_profile.cpp msgid "Node Dock" msgstr "لنگرگاه گره:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "FileSystem Dock" -msgstr "سامانه پرونده" +msgstr "قایل‌سیستم داک" #: editor/editor_feature_profile.cpp msgid "Import Dock" @@ -3070,15 +2995,15 @@ msgstr "وارد کردن لنگرگاه" #: editor/editor_feature_profile.cpp msgid "Allows to view and edit 3D scenes." -msgstr "" +msgstr "اجازه دیدن Ùˆ ویرایش صØÙ†Ù‡ های Û³ بعدی را می‌دهد." #: editor/editor_feature_profile.cpp msgid "Allows to edit scripts using the integrated script editor." -msgstr "" +msgstr "اجازهٔ ویرایش اسکریپت‌ها با Ø§Ø³ØªÙØ§Ø¯Ù‡ از ویرایشگر اسکریپت داخلی را می‌دهد." #: editor/editor_feature_profile.cpp msgid "Provides built-in access to the Asset Library." -msgstr "" +msgstr "دسترسی داخلی به کتابخانهٔ دارایی را ÙØ±Ø§Ù‡Ù… می‌کند." #: editor/editor_feature_profile.cpp msgid "Allows editing the node hierarchy in the Scene dock." @@ -3089,32 +3014,35 @@ msgid "" "Allows to work with signals and groups of the node selected in the Scene " "dock." msgstr "" +"به کار کردن با سیگنال ها Ùˆ گروه ها ÛŒ گره انتخاب شده از داک صØÙ†Ù‡ اجازه میدهد." #: editor/editor_feature_profile.cpp msgid "Allows to browse the local file system via a dedicated dock." -msgstr "" +msgstr "به مرور سیستم ÙØ§ÛŒÙ„ Ù…ØÙ„ÛŒ از طریق یک داک اختصاصی اجازه Ù…ÛŒ دهد." #: editor/editor_feature_profile.cpp msgid "" "Allows to configure import settings for individual assets. Requires the " "FileSystem dock to function." msgstr "" +"به پیکربندی تنظیمات Import برای دارایی های ÙØ±Ø¯ÛŒ اجازه Ù…ÛŒ دهد. برای عملکرد به " +"داک FileSystem نیاز دارد." #: editor/editor_feature_profile.cpp msgid "(current)" -msgstr "" +msgstr "(کنونی)" #: editor/editor_feature_profile.cpp msgid "(none)" -msgstr "" +msgstr "(هیچ)" #: editor/editor_feature_profile.cpp msgid "Remove currently selected profile, '%s'? Cannot be undone." -msgstr "" +msgstr "نمایه انتخابی ÙØ¹Ù„ی، '%s' ØØ°Ù شود؟ قابل واگرد نیست." #: editor/editor_feature_profile.cpp msgid "Profile must be a valid filename and must not contain '.'" -msgstr "" +msgstr "Ù¾Ø±ÙˆÙØ§ÛŒÙ„ باید یک نام ÙØ§ÛŒÙ„ معتبر باشد Ùˆ نباید ØØ§ÙˆÛŒ «.» باشد" #: editor/editor_feature_profile.cpp msgid "Profile with this name already exists." @@ -3122,7 +3050,7 @@ msgstr "نمایه با این نام در ØØ§Ù„ ØØ§Ø¶Ø± وجود دارد." #: editor/editor_feature_profile.cpp msgid "(Editor Disabled, Properties Disabled)" -msgstr "" +msgstr "(ویرایشگر ØºÛŒØ±ÙØ¹Ø§Ù„ است، ویژگی‌ها ØºÛŒØ±ÙØ¹Ø§Ù„ است)" #: editor/editor_feature_profile.cpp msgid "(Properties Disabled)" @@ -3141,52 +3069,48 @@ msgid "Enable Contextual Editor" msgstr "ÙØ¹Ø§Ù„ کردن ویرایشگر متنی" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Class Properties:" -msgstr "صاÙÛŒ کردن گره‌ها" +msgstr "دارایی‌های کلاس:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Main Features:" -msgstr "ویژگی‌ها" +msgstr "ویژگی‌های اصلی:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Nodes and Classes:" -msgstr "کلاس های ÙØ¹Ø§Ù„ شده:" +msgstr "نودها (Nodes) Ùˆ کلاس‌ها:" #: editor/editor_feature_profile.cpp msgid "File '%s' format is invalid, import aborted." -msgstr "" +msgstr "ÙØ±Ù…ت ÙØ§ÛŒÙ„ '%s' نامعتبر است، وارد کردن متوق٠شد." #: editor/editor_feature_profile.cpp msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." msgstr "" +"Ù¾Ø±ÙˆÙØ§ÛŒÙ„ '%s' از قبل وجود دارد. قبل از وارد کردن، ابتدا آن را ØØ°Ù کنید، وارد " +"کردن متوق٠شد." #: editor/editor_feature_profile.cpp msgid "Error saving profile to path: '%s'." msgstr "خطای ذخیره نمایه در مسیر: '%s'." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Reset to Default" -msgstr "بارگیری پیش ÙØ±Ø¶" +msgstr "بازنشانی به Ù¾ÛŒØ´ÙØ±Ø¶" #: editor/editor_feature_profile.cpp msgid "Current Profile:" msgstr "نمایه موجود:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Create Profile" -msgstr "پاک کردن نمایه" +msgstr "ایجاد Ù¾Ø±ÙˆÙØ§ÛŒÙ„" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Remove Profile" -msgstr "ØØ°Ù قالب" +msgstr "ØØ°Ù Ù¾Ø±ÙˆÙØ§ÛŒÙ„" #: editor/editor_feature_profile.cpp msgid "Available Profiles:" @@ -3211,18 +3135,16 @@ msgid "Export" msgstr "خروجی" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Configure Selected Profile:" -msgstr "نمایه موجود:" +msgstr "پیکربندی Ù¾Ø±ÙˆÙØ§ÛŒÙ„ انتخاب شده:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Extra Options:" -msgstr "گزینه‌های کلاس:" +msgstr "گزینه‌های اضاÙÛŒ:" #: editor/editor_feature_profile.cpp msgid "Create or import a profile to edit available classes and properties." -msgstr "" +msgstr "یک Ù¾Ø±ÙˆÙØ§ÛŒÙ„ برای ویرایش کلاس‌ها Ùˆ ویژگی‌های موجود ایجاد یا وارد کنید." #: editor/editor_feature_profile.cpp msgid "New profile name:" @@ -3245,16 +3167,14 @@ msgid "Manage Editor Feature Profiles" msgstr "مدیریت ویژگی نمایه‌های ویرایشگر" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Default Feature Profile" -msgstr "ویژگی نمایه Godot" +msgstr "Ù¾Ø±ÙˆÙØ§ÛŒÙ„ ویژگی Ù¾ÛŒØ´â€ŒÙØ±Ø¶" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select Current Folder" msgstr "برگزیدن پوشه موجود" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "File exists, overwrite?" msgstr "ÙØ§ÛŒÙ„ وجود دارد، آیا بازنویسی شود؟" @@ -3264,7 +3184,7 @@ msgstr "برگزیدن این پوشه" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "Copy Path" -msgstr "" +msgstr "Ú©Ù¾ÛŒ کردن مسیر" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "Open in File Manager" @@ -3281,7 +3201,7 @@ msgstr "ساختن پوشه..." #: editor/editor_file_dialog.cpp editor/find_in_files.cpp msgid "Refresh" -msgstr "" +msgstr "تازه‌سازی" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" @@ -3320,14 +3240,12 @@ msgid "Save a File" msgstr "یک پرونده را ذخیره Ú©Ù†" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Access" -msgstr "موÙقیت!" +msgstr "دسترسی" #: editor/editor_file_dialog.cpp editor/editor_settings.cpp -#, fuzzy msgid "Display Mode" -msgstr "ØØ§Ù„ت صدور:" +msgstr "ØØ§Ù„ت نمایش" #: editor/editor_file_dialog.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -3340,71 +3258,66 @@ msgstr "ØØ§Ù„ت صدور:" #: scene/resources/environment.cpp scene/resources/material.cpp #: scene/resources/visual_shader.cpp #: servers/audio/effects/audio_effect_distortion.cpp -#, fuzzy msgid "Mode" -msgstr "انتخاب ØØ§Ù„ت" +msgstr "ØØ§Ù„ت" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Current Dir" -msgstr "نمایه موجود:" +msgstr "مسیر کنونی" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Current File" -msgstr "نمایه موجود:" +msgstr "ÙØ§ÛŒÙ„ ÙØ¹Ù„ÛŒ" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Current Path" -msgstr "نمایه موجود:" +msgstr "مسیر ÙØ¹Ù„ÛŒ" #: editor/editor_file_dialog.cpp editor/editor_settings.cpp #: scene/gui/file_dialog.cpp -#, fuzzy msgid "Show Hidden Files" -msgstr "نمایش در ÙØ§ÛŒÙ„‌سیستم" +msgstr "نمایش ÙØ§ÛŒÙ„‌های پنهان شده" #: editor/editor_file_dialog.cpp msgid "Disable Overwrite Warning" -msgstr "" +msgstr "ØºÛŒØ±ÙØ¹Ø§Ù„ کردن هشدار بازنویسی" #: editor/editor_file_dialog.cpp msgid "Go Back" -msgstr "" +msgstr "به عقب بازگردید" #: editor/editor_file_dialog.cpp msgid "Go Forward" -msgstr "" +msgstr "جلو بروید" #: editor/editor_file_dialog.cpp msgid "Go Up" -msgstr "" +msgstr "بالا بروید" #: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" -msgstr "" +msgstr "تغییر ÙØ§ÛŒÙ„‌های پنهان" #: editor/editor_file_dialog.cpp msgid "Toggle Favorite" -msgstr "" +msgstr "تغییر موارد دلخواه" #: editor/editor_file_dialog.cpp editor/editor_resource_picker.cpp #: scene/gui/base_button.cpp msgid "Toggle Mode" -msgstr "" +msgstr "تغییر ØØ§Ù„ت" #: editor/editor_file_dialog.cpp msgid "Focus Path" -msgstr "" +msgstr "مسیر تمرکز" #: editor/editor_file_dialog.cpp msgid "Move Favorite Up" -msgstr "" +msgstr "انتقال موارد دلخواه به بالا" #: editor/editor_file_dialog.cpp msgid "Move Favorite Down" -msgstr "" +msgstr "انتقال موارد دلخواه به پایین" #: editor/editor_file_dialog.cpp msgid "Go to previous folder." @@ -3428,15 +3341,15 @@ msgstr "پوشه موجود (غیر)Ù…ØØ¨ÙˆØ¨." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Toggle the visibility of hidden files." -msgstr "" +msgstr "تغییر پدیدار بودن ÙØ§ÛŒÙ„‌های مخÙÛŒ شده." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails." -msgstr "" +msgstr "دیدن موارد به صورت جدولی از پیش‌نمایش‌ها." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "View items as a list." -msgstr "" +msgstr "مشاهده موارد به عنوان Ùهرست‌." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Directories & Files:" @@ -3445,7 +3358,7 @@ msgstr "پوشه‌ها Ùˆ پرونده‌ها:" #: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp #: editor/plugins/style_box_editor_plugin.cpp editor/rename_dialog.cpp msgid "Preview:" -msgstr "" +msgstr "پیش‌نمایش:" #: editor/editor_file_dialog.cpp #: editor/plugins/version_control_editor_plugin.cpp scene/gui/file_dialog.cpp @@ -3454,13 +3367,15 @@ msgstr "پرونده:" #: editor/editor_file_system.cpp msgid "ScanSources" -msgstr "" +msgstr "منابع‌اسکن" #: editor/editor_file_system.cpp msgid "" "There are multiple importers for different types pointing to file %s, import " "aborted" msgstr "" +"چندین واردکننده برای انواع مختل٠وجود دارد Ú©Ù‡ به ÙØ§ÛŒÙ„ %s اشاره می‌کنند، وارد " +"کردن لغو شد" #: editor/editor_file_system.cpp msgid "(Re)Importing Assets" @@ -3468,13 +3383,13 @@ msgstr "(در ØØ§Ù„) وارد کردن دوباره عست ها" #: editor/editor_file_system.cpp msgid "Reimport Missing Imported Files" -msgstr "" +msgstr "وارد کردن دوباره ÙØ§ÛŒÙ„ های وارد شده پیدانشده" #: editor/editor_help.cpp scene/2d/camera_2d.cpp scene/gui/control.cpp #: scene/gui/nine_patch_rect.cpp scene/resources/dynamic_font.cpp #: scene/resources/style_box.cpp scene/resources/texture.cpp msgid "Top" -msgstr "" +msgstr "بالا" #: editor/editor_help.cpp msgid "Class:" @@ -3483,7 +3398,7 @@ msgstr "کلاس:" #: editor/editor_help.cpp editor/scene_tree_editor.cpp #: editor/script_create_dialog.cpp msgid "Inherits:" -msgstr "میراث:" +msgstr "ارث می‌برد از:" #: editor/editor_help.cpp msgid "Inherited by:" @@ -3491,7 +3406,7 @@ msgstr "به ارث رسیده به وسیله:" #: editor/editor_help.cpp msgid "Online Tutorials" -msgstr "" +msgstr "آموزش‌های آنلاین" #: editor/editor_help.cpp msgid "Properties" @@ -3499,7 +3414,7 @@ msgstr "خصوصیات" #: editor/editor_help.cpp msgid "overrides %s:" -msgstr "" +msgstr "%s را لغو Ù…ÛŒ کند:" #: editor/editor_help.cpp msgid "default:" @@ -3513,28 +3428,28 @@ msgstr "خصوصیات زمینه" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/gradient.cpp msgid "Colors" -msgstr "" +msgstr "رنگ‌ها" #: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp msgid "Constants" -msgstr "ثابت ها" +msgstr "ثابت‌ها" #: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp msgid "Fonts" -msgstr "" +msgstr "Ùونت‌ها" #: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp #: platform/iphone/export/export.cpp msgid "Icons" -msgstr "" +msgstr "آیکون‌ها" #: editor/editor_help.cpp msgid "Styles" -msgstr "" +msgstr "استایل‌ها" #: editor/editor_help.cpp msgid "Enumerations" -msgstr "شمارش ها" +msgstr "شمارش‌ها" #: editor/editor_help.cpp msgid "Property Descriptions" @@ -3545,10 +3460,12 @@ msgid "(value)" msgstr "(مقدار)" #: editor/editor_help.cpp +#, fuzzy msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" +"این ویژگی هیچ تعریÙÛŒ ندارد. Ù„Ø·ÙØ§ به ما Ú©Ù…Ú© کنید با [color=$color][url=$url]" #: editor/editor_help.cpp msgid "Method Descriptions" @@ -3559,15 +3476,16 @@ msgid "" "There is currently no description for this method. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" +"در ØØ§Ù„ ØØ§Ø¶Ø± هیچ توضیØÛŒ برای این متد وجود ندارد. Ù„Ø·ÙØ§Ù‹ به ما در [color=$color]" +"[url=$url]مشارکت در یکی[/url][/color] Ú©Ù…Ú© کنید!" #: editor/editor_help.cpp editor/editor_settings.cpp #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: modules/gdscript/editor/gdscript_highlighter.cpp #: modules/gdscript/gdscript_editor.cpp -#, fuzzy msgid "Text Editor" -msgstr "گشودن در ویرایشگر" +msgstr "ویرایشگر متن" #: editor/editor_help.cpp editor/editor_node.cpp editor/editor_settings.cpp #: editor/plugins/shader_editor_plugin.cpp @@ -3576,7 +3494,7 @@ msgstr "راهنما" #: editor/editor_help.cpp msgid "Sort Functions Alphabetically" -msgstr "" +msgstr "مرتب کردن توابع بر اساس ØØ±ÙˆÙ Ø§Ù„ÙØ¨Ø§" #: editor/editor_help_search.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp @@ -3635,7 +3553,7 @@ msgstr "روش" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Signal" -msgstr "سیگنال‌" +msgstr "سیگنال" #: editor/editor_help_search.cpp modules/visual_script/visual_script_nodes.cpp #: scene/resources/visual_shader_nodes.cpp @@ -3657,43 +3575,40 @@ msgstr "ویژگی:" #: editor/editor_inspector.cpp editor/editor_spin_slider.cpp msgid "Label" -msgstr "" +msgstr "برچسب" #: editor/editor_inspector.cpp editor/editor_spin_slider.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Read Only" -msgstr "تنها روش‌ها" +msgstr "Ùقط مطالعه" #: editor/editor_inspector.cpp editor/plugins/item_list_editor_plugin.cpp msgid "Checkable" -msgstr "" +msgstr "قابل بررسی" #: editor/editor_inspector.cpp editor/plugins/item_list_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Checked" -msgstr "همه‌ی انتخاب ها" +msgstr "بررسی شده" #: editor/editor_inspector.cpp -#, fuzzy msgid "Draw Red" -msgstr "ÙØ±Ø§Ø®ÙˆØ§Ù†ÛŒ" +msgstr "رسم قرمز" #: editor/editor_inspector.cpp -#, fuzzy msgid "Keying" -msgstr "پخش" +msgstr "کلیدزدن" #: editor/editor_inspector.cpp -#, fuzzy msgid "Pin value" -msgstr "(مقدار)" +msgstr "مقدار سنجاق" #: editor/editor_inspector.cpp msgid "" "Pinning a value forces it to be saved even if it's equal to the default." msgstr "" +"پین کردن یک مقدار آن را مجبور Ù…ÛŒ کند ØØªÛŒ اگر برابر با مقدار پیش ÙØ±Ø¶ باشد " +"ذخیره شود." #: editor/editor_inspector.cpp msgid "Pin value [Disabled because '%s' is editor-only]" @@ -3714,26 +3629,23 @@ msgstr "تعیین چندگانه:" #: editor/editor_inspector.cpp msgid "Pinned %s" -msgstr "" +msgstr "%s سنجاق شد" #: editor/editor_inspector.cpp msgid "Unpinned %s" -msgstr "" +msgstr "سنجاق %s برداشته شد" #: editor/editor_inspector.cpp -#, fuzzy msgid "Copy Property" -msgstr "خصوصیات" +msgstr "Ú©Ù¾ÛŒ کردن دارایی" #: editor/editor_inspector.cpp -#, fuzzy msgid "Paste Property" -msgstr "خصوصیات" +msgstr "چسباندن دارایی" #: editor/editor_inspector.cpp -#, fuzzy msgid "Copy Property Path" -msgstr "رونوشت مسیر گره" +msgstr "Ú©Ù¾ÛŒ کردن مسیر دارایی" #: editor/editor_log.cpp msgid "Output:" @@ -3741,7 +3653,7 @@ msgstr "خروجی:" #: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp msgid "Copy Selection" -msgstr "Ú©Ù¾ÛŒ برگزیده" +msgstr "Ú©Ù¾ÛŒ انتخاب" #: editor/editor_log.cpp editor/editor_network_profiler.cpp #: editor/editor_profiler.cpp editor/editor_resource_picker.cpp @@ -3786,19 +3698,19 @@ msgstr "گره" #: editor/editor_network_profiler.cpp msgid "Incoming RPC" -msgstr "" +msgstr "ورودی RPC" #: editor/editor_network_profiler.cpp msgid "Incoming RSET" -msgstr "" +msgstr "ورودی RSET" #: editor/editor_network_profiler.cpp msgid "Outgoing RPC" -msgstr "" +msgstr "خروجی RPC" #: editor/editor_network_profiler.cpp msgid "Outgoing RSET" -msgstr "" +msgstr "خروجی RSET" #: editor/editor_node.cpp editor/project_manager.cpp msgid "New Window" @@ -3817,11 +3729,11 @@ msgstr "" #: editor/editor_node.cpp msgid "Spins when the editor window redraws." -msgstr "" +msgstr "هنگامی Ú©Ù‡ پنجره ویرایشگر دوباره ترسیم Ù…ÛŒ شود Ù…ÛŒ چرخد." #: editor/editor_node.cpp msgid "Imported resources can't be saved." -msgstr "" +msgstr "منابع وارد شده را نمی‌توان ذخیره کرد." #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp @@ -3838,6 +3750,8 @@ msgid "" "This resource can't be saved because it does not belong to the edited scene. " "Make it unique first." msgstr "" +"این منبع نمی‌تواند ذخیره شود زیرا به صØÙ†Ù‡Ù” ویرایش شده تعلق ندارد. ابتدا آن را " +"Ù…Ù†ØØµØ± به ÙØ±Ø¯ کنید." #: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Save Resource As..." @@ -3845,19 +3759,19 @@ msgstr "ذخیره منبع از ..." #: editor/editor_node.cpp msgid "Can't open file for writing:" -msgstr "" +msgstr "نمی‌توان ÙØ§ÛŒÙ„ را برای نوشتن باز کرد:" #: editor/editor_node.cpp msgid "Requested file format unknown:" -msgstr "" +msgstr "ÙØ±Ù…ت ÙØ§ÛŒÙ„ درخواست شده ناشناخته است:" #: editor/editor_node.cpp msgid "Error while saving." -msgstr "" +msgstr "خطا در هنگام ذخیره‌سازی." #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Can't open '%s'. The file could have been moved or deleted." -msgstr "" +msgstr "نمی‌توان %s را باز کرد. این ÙØ§ÛŒÙ„ می‌تواند انتقال ÛŒØ§ÙØªÙ‡ یا ØØ°Ù شده باشد." #: editor/editor_node.cpp msgid "Error while parsing '%s'." @@ -3865,11 +3779,11 @@ msgstr "خطا هنگام تجزیه '%s'." #: editor/editor_node.cpp msgid "Unexpected end of file '%s'." -msgstr "" +msgstr "پایان غیر منتظرهٔ ÙØ§ÛŒÙ„ '%s'." #: editor/editor_node.cpp msgid "Missing '%s' or its dependencies." -msgstr "" +msgstr "'%s' ناموجود یا وابستگی‌های مربوط به آن وجود ندارد." #: editor/editor_node.cpp msgid "Error while loading '%s'." @@ -3885,7 +3799,7 @@ msgstr "در ØØ§Ù„ پردازش" #: editor/editor_node.cpp msgid "Creating Thumbnail" -msgstr "" +msgstr "ایجاد بند انگشتی" #: editor/editor_node.cpp msgid "This operation can't be done without a tree root." @@ -3902,10 +3816,11 @@ msgid "" "Couldn't save scene. Likely dependencies (instances or inheritance) couldn't " "be satisfied." msgstr "" +"صØÙ†Ù‡ ذخیره نشد. وابستگی‌های Ø§ØØªÙ…الی (نمونه‌ها یا وراثت) را نمی‌توان راضی کرد." #: editor/editor_node.cpp msgid "Could not save one or more scenes!" -msgstr "" +msgstr "نمی‌توان یک یا چند صØÙ†Ù‡ را ذخیره کرد!" #: editor/editor_node.cpp msgid "Save All Scenes" @@ -3913,29 +3828,31 @@ msgstr "ذخیره صØÙ†Ù‡" #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" -msgstr "" +msgstr "نمی‌توان صØÙ†Ù‡â€ŒØ§ÛŒ Ú©Ù‡ هنوز باز است را بازنویسی کرد!" #: editor/editor_node.cpp msgid "Can't load MeshLibrary for merging!" -msgstr "" +msgstr "نمی‌توان MeshLibrary را برای ادغام بارگیری کرد!" #: editor/editor_node.cpp msgid "Error saving MeshLibrary!" -msgstr "" +msgstr "خطا در ذخیره MeshLibrary!" #: editor/editor_node.cpp msgid "Can't load TileSet for merging!" -msgstr "" +msgstr "نمی‌توان TileSet را برای ادغام بارگیری کرد!" #: editor/editor_node.cpp msgid "Error saving TileSet!" -msgstr "" +msgstr "خطا در ذخیرهٔ TileSet!" #: editor/editor_node.cpp msgid "" "An error occurred while trying to save the editor layout.\n" "Make sure the editor's user data path is writable." msgstr "" +"هنگام تلاش برای ذخیرهٔ چیدمان ویرایشگر خطایی روی داد.\n" +" مطمئن شوید Ú©Ù‡ مسیر داده کاربر در ویرایشگر قابل نوشتن است." #: editor/editor_node.cpp msgid "" @@ -3946,11 +3863,11 @@ msgstr "" #: editor/editor_node.cpp msgid "Layout name not found!" -msgstr "" +msgstr "نام چیدمان پیدا نشد!" #: editor/editor_node.cpp msgid "Restored the Default layout to its base settings." -msgstr "" +msgstr "طرØâ€ŒØ¨Ù†Ø¯ÛŒ Ù¾ÛŒØ´â€ŒÙØ±Ø¶ را به تنظیمات پایه آن بازگرداند." #: editor/editor_node.cpp msgid "" @@ -3970,6 +3887,8 @@ msgid "" "This resource was imported, so it's not editable. Change its settings in the " "import panel and then re-import." msgstr "" +"این منبع وارد شده است، بنابراین قابل ویرایش نیست. تنظیمات آن را در پنل وارد " +"کردن تغییر دهید Ùˆ سپس دوباره وارد کنید." #: editor/editor_node.cpp msgid "" @@ -3978,6 +3897,9 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" +"این صØÙ†Ù‡ وارد شده است، بنابراین تغییرات در آن ØÙظ نخواهد شد. نمونه‌برداری یا " +"به ارث بردن آن اجازه می‌دهد تا تغییراتی در آن ایجاد کنید. Ù„Ø·ÙØ§Ù‹ اسناد مربوط به " +"وارد کردن صØÙ†Ù‡â€ŒÙ‡Ø§ را بخوانید تا این گردش کار را بهتر درک کنید." #: editor/editor_node.cpp msgid "" @@ -4541,6 +4463,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "پروژه" @@ -4904,12 +4827,12 @@ msgstr "استخراج پرونده های زیر از بسته بندی Ø§Ù†Ø¬Ø #: editor/plugins/shader_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Reload" -msgstr "" +msgstr "بارگذاری دوباره" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Resave" -msgstr "" +msgstr "ذخیره مجدد" #: editor/editor_node.cpp msgid "New Inherited" @@ -4922,7 +4845,7 @@ msgstr "خطاهای بارگذاری" #: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp #: modules/visual_script/visual_script_nodes.cpp msgid "Select" -msgstr "" +msgstr "انتخاب" #: editor/editor_node.cpp #, fuzzy @@ -4955,7 +4878,7 @@ msgstr "" #: editor/editor_node.h msgid "Warning!" -msgstr "" +msgstr "هشدار!" #: editor/editor_path.cpp #, fuzzy @@ -5014,7 +4937,7 @@ msgstr "وضعیت:" #: editor/editor_profiler.cpp msgid "Measure:" -msgstr "" +msgstr "اندازه گیری:" #: editor/editor_profiler.cpp #, fuzzy @@ -5023,7 +4946,7 @@ msgstr "زمان(s): " #: editor/editor_profiler.cpp msgid "Average Time (ms)" -msgstr "" +msgstr "زمان متوسط (میلی‌ثانیه)" #: editor/editor_profiler.cpp msgid "Frame %" @@ -5039,7 +4962,7 @@ msgstr "" #: editor/editor_profiler.cpp msgid "Self" -msgstr "" +msgstr "خود" #: editor/editor_profiler.cpp msgid "" @@ -5063,7 +4986,7 @@ msgstr "ÙØ±Ø§Ø®ÙˆØ§Ù†ÛŒ" #: editor/editor_profiler.cpp editor/plugins/script_editor_plugin.cpp #: editor/script_editor_debugger.cpp msgid "Debugger" -msgstr "" +msgstr "Ø¯ÛŒØ¨Ø§Ú¯ÙØ±" #: editor/editor_profiler.cpp msgid "Profiler Frame History Size" @@ -5082,14 +5005,14 @@ msgstr "عضوها" #: editor/editor_properties.cpp editor/script_create_dialog.cpp #: scene/resources/default_theme/default_theme.cpp msgid "On" -msgstr "" +msgstr "روشن" #: editor/editor_properties.cpp modules/gridmap/grid_map.cpp #: scene/2d/collision_object_2d.cpp scene/2d/tile_map.cpp #: scene/3d/collision_object.cpp scene/3d/soft_body.cpp #: scene/main/canvas_layer.cpp msgid "Layer" -msgstr "" +msgstr "لایه" #: editor/editor_properties.cpp msgid "Bit %d, value %d" @@ -5097,11 +5020,11 @@ msgstr "" #: editor/editor_properties.cpp msgid "[Empty]" -msgstr "" +msgstr "[خالی]" #: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp msgid "Assign..." -msgstr "" +msgstr "واگذار کردن..." #: editor/editor_properties.cpp #, fuzzy @@ -5134,7 +5057,7 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Size:" -msgstr "" +msgstr "اندازه:" #: editor/editor_properties_array_dict.cpp msgid "Page:" @@ -5337,8 +5260,9 @@ msgstr "" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp scene/gui/control.cpp #: scene/register_scene_types.cpp +#, fuzzy msgid "Theme" -msgstr "" +msgstr "تم" #: editor/editor_settings.cpp editor/import_dock.cpp #, fuzzy @@ -5359,7 +5283,7 @@ msgstr "" #: editor/editor_settings.cpp scene/resources/environment.cpp msgid "Contrast" -msgstr "" +msgstr "تضاد" #: editor/editor_settings.cpp msgid "Relationship Line Opacity" @@ -5431,7 +5355,7 @@ msgstr "" #: editor/editor_settings.cpp msgid "Docks" -msgstr "" +msgstr "داک‌ها" #: editor/editor_settings.cpp #, fuzzy @@ -5555,7 +5479,7 @@ msgstr "" #: editor/editor_settings.cpp msgid "Appearance" -msgstr "" +msgstr "ظاهر" #: editor/editor_settings.cpp scene/gui/text_edit.cpp #, fuzzy @@ -5643,8 +5567,9 @@ msgid "Sort Members Outline Alphabetically" msgstr "" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +#, fuzzy msgid "Cursor" -msgstr "" +msgstr "اشاره‌گر" #: editor/editor_settings.cpp msgid "Scroll Past End Of File" @@ -5778,7 +5703,7 @@ msgstr "برداشتن نقطه" #: scene/resources/particles_material.cpp servers/physics_2d_server.cpp #: servers/physics_server.cpp msgid "Shape" -msgstr "" +msgstr "Ø´Ú©Ù„" #: editor/editor_settings.cpp msgid "Primary Grid Steps" @@ -6052,8 +5977,9 @@ msgstr "" #: editor/editor_settings.cpp scene/2d/back_buffer_copy.cpp scene/2d/sprite.cpp #: scene/2d/visibility_notifier_2d.cpp scene/3d/sprite_3d.cpp #: scene/gui/control.cpp +#, fuzzy msgid "Rect" -msgstr "" +msgstr "مستطیل" #: editor/editor_settings.cpp #, fuzzy @@ -6062,7 +5988,7 @@ msgstr "برداشتن موج" #: editor/editor_settings.cpp platform/android/export/export_plugin.cpp msgid "Screen" -msgstr "" +msgstr "ØµÙØÙ‡" #: editor/editor_settings.cpp #, fuzzy @@ -6100,13 +6026,14 @@ msgstr "" #: editor/editor_settings.cpp msgid "Host" -msgstr "" +msgstr "میزبان" #: editor/editor_settings.cpp editor/fileserver/editor_file_server.cpp #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp #: scene/resources/default_theme/default_theme.cpp +#, fuzzy msgid "Port" -msgstr "" +msgstr "پورت" #. TRANSLATORS: Project Manager here refers to the tool used to create/manage Godot projects. #: editor/editor_settings.cpp @@ -6296,7 +6223,7 @@ msgstr "انتخاب گره (ها) برای وارد شدن" #: editor/editor_sub_scene.cpp editor/project_manager.cpp msgid "Browse" -msgstr "" +msgstr "مرور کردن" #: editor/editor_sub_scene.cpp msgid "Scene Path:" @@ -6474,7 +6401,7 @@ msgstr "" #: editor/export_template_manager.cpp msgid "Importing:" -msgstr "" +msgstr "وارد کردن:" #: editor/export_template_manager.cpp msgid "Remove templates for the version '%s'?" @@ -6512,7 +6439,7 @@ msgstr "" #: editor/export_template_manager.cpp msgid "Uninstall" -msgstr "" +msgstr "ØØ°Ù نصب" #: editor/export_template_manager.cpp msgid "Uninstall templates for the current version." @@ -6600,7 +6527,7 @@ msgstr "" #: editor/plugins/version_control_editor_plugin.cpp #: platform/uwp/export/export.cpp platform/windows/export/export.cpp msgid "Password" -msgstr "" +msgstr "گذرواژه" #: editor/filesystem_dock.cpp #, fuzzy @@ -6836,7 +6763,7 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Move" -msgstr "" +msgstr "ØØ±Ú©Øª" #: editor/filesystem_dock.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp @@ -6847,7 +6774,7 @@ msgstr "تغییر نام" #: editor/filesystem_dock.cpp msgid "Overwrite" -msgstr "" +msgstr "بازنویسی" #: editor/filesystem_dock.cpp #, fuzzy @@ -6958,7 +6885,7 @@ msgstr "ØØ°Ù گره(ها)" #: editor/groups_editor.cpp editor/node_dock.cpp msgid "Groups" -msgstr "گروه ها" +msgstr "گروه‌ها" #: editor/groups_editor.cpp msgid "Nodes Not in Group" @@ -7002,7 +6929,7 @@ msgstr "ایجاد پوشه" #: editor/import/resource_importer_bitmask.cpp #: servers/audio/effects/audio_effect_compressor.cpp msgid "Threshold" -msgstr "" +msgstr "آستانه" #: editor/import/resource_importer_csv_translation.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -7038,14 +6965,13 @@ msgstr "" #: editor/import/resource_importer_texture.cpp scene/animation/tween.cpp #: scene/resources/texture.cpp msgid "Repeat" -msgstr "" +msgstr "تکرار" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp scene/2d/light_2d.cpp #: scene/gui/control.cpp -#, fuzzy msgid "Filter" -msgstr "صاÙÛŒ:" +msgstr "صاÙÛŒ" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp @@ -7061,7 +6987,7 @@ msgstr "" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp msgid "sRGB" -msgstr "" +msgstr "sRGB" #: editor/import/resource_importer_layered_texture.cpp #, fuzzy @@ -7195,7 +7121,7 @@ msgstr "وارد کردن دوباره" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp msgid "Meshes" -msgstr "" +msgstr "مش‌ها" #: editor/import/resource_importer_scene.cpp #, fuzzy @@ -7212,8 +7138,9 @@ msgid "Lightmap Texel Size" msgstr "" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp +#, fuzzy msgid "Skins" -msgstr "" +msgstr "پوسته‌ها" #: editor/import/resource_importer_scene.cpp #, fuzzy @@ -7294,7 +7221,7 @@ msgstr "" #: editor/import/resource_importer_scene.cpp #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Import Scene" -msgstr "" +msgstr "وارد کردن صØÙ†Ù‡" #: editor/import/resource_importer_scene.cpp msgid "Importing Scene..." @@ -7330,7 +7257,7 @@ msgstr "" #: editor/import/resource_importer_scene.cpp msgid "Saving..." -msgstr "" +msgstr "در ØØ§Ù„ ذخیره..." #: editor/import/resource_importer_texture.cpp msgid "" @@ -7438,14 +7365,15 @@ msgstr "" #: editor/import/resource_importer_wav.cpp scene/2d/physics_body_2d.cpp msgid "Force" -msgstr "" +msgstr "نیرو" #: editor/import/resource_importer_wav.cpp msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -7689,7 +7617,7 @@ msgstr "" #: editor/plugin_config_dialog.cpp msgid "Subfolder:" -msgstr "" +msgstr "زیرپوشه:" #: editor/plugin_config_dialog.cpp #: editor/plugins/version_control_editor_plugin.cpp @@ -7703,7 +7631,7 @@ msgstr "نسخه:" #: editor/plugin_config_dialog.cpp editor/script_create_dialog.cpp msgid "Language:" -msgstr "" +msgstr "زبان:" #: editor/plugin_config_dialog.cpp #, fuzzy @@ -7850,7 +7778,7 @@ msgstr "" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Point" -msgstr "" +msgstr "نقطه" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp @@ -7922,7 +7850,7 @@ msgstr "" #: editor/plugins/animation_blend_space_2d_editor.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Blend:" -msgstr "" +msgstr "درآمیختن:" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #, fuzzy @@ -8150,7 +8078,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/version_control_editor_plugin.cpp msgid "New" -msgstr "" +msgstr "جدید" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Paste As Reference" @@ -8196,14 +8124,14 @@ msgstr "چسباندن" #. TRANSLATORS: Opposite of "Past", refers to a direction in animation onion skinning. #: editor/plugins/animation_player_editor_plugin.cpp msgid "Future" -msgstr "" +msgstr "آینده" #: editor/plugins/animation_player_editor_plugin.cpp modules/csg/csg_shape.cpp #: scene/3d/collision_polygon.cpp scene/main/scene_tree.cpp #: scene/resources/material.cpp scene/resources/primitive_meshes.cpp #: servers/audio/effects/audio_effect_phaser.cpp msgid "Depth" -msgstr "" +msgstr "عمق" #: editor/plugins/animation_player_editor_plugin.cpp msgid "1 step" @@ -8243,7 +8171,7 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp msgid "Error!" -msgstr "" +msgstr "خطا!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Times:" @@ -8279,16 +8207,16 @@ msgstr "Ø§ÙØ²ÙˆØ¯Ù† گره" #: editor/plugins/animation_state_machine_editor.cpp msgid "End" -msgstr "" +msgstr "پایان" #: editor/plugins/animation_state_machine_editor.cpp msgid "Immediate" -msgstr "" +msgstr "Ùوری" #: editor/plugins/animation_state_machine_editor.cpp #: scene/animation/animation_blend_tree.cpp msgid "Sync" -msgstr "" +msgstr "همگام‌سازی" #: editor/plugins/animation_state_machine_editor.cpp msgid "At End" @@ -8298,7 +8226,7 @@ msgstr "" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: scene/3d/vehicle_body.cpp msgid "Travel" -msgstr "" +msgstr "Ø³ÙØ±" #: editor/plugins/animation_state_machine_editor.cpp msgid "Start and end nodes are needed for a sub-transition." @@ -8384,7 +8312,7 @@ msgstr "" #: editor/plugins/animation_tree_player_editor_plugin.cpp #: scene/resources/style_box.cpp scene/resources/visual_shader.cpp msgid "Blend" -msgstr "" +msgstr "درآمیختن" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Auto Restart:" @@ -8400,12 +8328,12 @@ msgstr "" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Start!" -msgstr "" +msgstr "شروع!" #: editor/plugins/animation_tree_player_editor_plugin.cpp #: editor/plugins/multimesh_editor_plugin.cpp msgid "Amount:" -msgstr "" +msgstr "مقدار:" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Blend 0:" @@ -8491,7 +8419,7 @@ msgstr "ویرایش صاÙÛŒ های گره" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Filters..." -msgstr "" +msgstr "Ùیلتر‌ها:" #: editor/plugins/asset_library_editor_plugin.cpp scene/main/http_request.cpp msgid "Use Threads" @@ -8506,8 +8434,9 @@ msgid "View Files" msgstr "نمایش پرونده ها" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy msgid "Download" -msgstr "" +msgstr "دانلود" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Connection error, please try again." @@ -8571,7 +8500,7 @@ msgstr "زمان:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed:" -msgstr "" +msgstr "ناموÙÙ‚:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Bad download hash, assuming file has been tampered with." @@ -8579,11 +8508,11 @@ msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Expected:" -msgstr "" +msgstr "انتظار می‌رود:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Got:" -msgstr "" +msgstr "Ú¯Ø±ÙØªÙ‡ شد:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed SHA-256 hash check" @@ -8613,8 +8542,9 @@ msgid "Error making request" msgstr "خطای بارگذاری قلم." #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy msgid "Idle" -msgstr "" +msgstr "بیکار" #: editor/plugins/asset_library_editor_plugin.cpp #, fuzzy @@ -8623,7 +8553,7 @@ msgstr "نصب کردن" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" -msgstr "" +msgstr "تلاش دوباره" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download Error" @@ -8710,7 +8640,7 @@ msgstr "وارد کردن" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Plugins..." -msgstr "" +msgstr "Ø§ÙØ²ÙˆÙ†Ù‡â€ŒÙ‡Ø§..." #: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp msgid "Sort:" @@ -8796,7 +8726,7 @@ msgstr "انتخاب پرونده قالب" #: editor/plugins/camera_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp scene/resources/mesh_library.cpp msgid "Preview" -msgstr "" +msgstr "پیش نمایش" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Configure Snap" @@ -8816,7 +8746,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "steps" -msgstr "" +msgstr "گام‌ها" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" @@ -8968,7 +8898,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center" -msgstr "" +msgstr "مرکز" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -9313,11 +9243,11 @@ msgstr "پخش Ø³ÙØ§Ø±Ø´ÛŒ صØÙ†Ù‡" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "View" -msgstr "" +msgstr "دیدن" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show" -msgstr "" +msgstr "نشان دادن" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show When Snapping" @@ -9325,7 +9255,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Hide" -msgstr "" +msgstr "مخÙÛŒ کردن" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -9560,7 +9490,7 @@ msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp editor/spatial_editor_gizmos.cpp msgid "Particles" -msgstr "" +msgstr "ذرات" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -9600,7 +9530,7 @@ msgstr "" #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" -msgstr "" +msgstr "ذرات سی‌پی‌یو" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp @@ -9618,7 +9548,7 @@ msgstr "" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat 1" -msgstr "تخت 1" +msgstr "تخت Û±" #: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp msgid "Ease In" @@ -9712,14 +9642,14 @@ msgstr "یک Breakpoint درج Ú©Ù†" #: scene/gui/rich_text_label.cpp scene/gui/text_edit.cpp #: scene/resources/primitive_meshes.cpp msgid "Text" -msgstr "" +msgstr "متن" #: editor/plugins/item_list_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp main/main.cpp #: platform/osx/export/export.cpp platform/windows/export/export.cpp #: scene/gui/button.cpp scene/gui/item_list.cpp msgid "Icon" -msgstr "" +msgstr "آیکون" #: editor/plugins/item_list_editor_plugin.cpp msgid "ID" @@ -9737,7 +9667,7 @@ msgstr "" #: editor/plugins/item_list_editor_plugin.cpp msgid "Items" -msgstr "" +msgstr "موارد" #: editor/plugins/item_list_editor_plugin.cpp msgid "Item List Editor" @@ -9847,7 +9777,7 @@ msgstr "" #: scene/resources/multimesh.cpp scene/resources/primitive_meshes.cpp #: scene/resources/texture.cpp msgid "Mesh" -msgstr "" +msgstr "Ù…ÙØ´" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Trimesh Static Body" @@ -10053,15 +9983,15 @@ msgstr "" #: editor/plugins/multimesh_editor_plugin.cpp msgid "X-Axis" -msgstr "" +msgstr "Ù…ØÙˆØ± X" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Y-Axis" -msgstr "" +msgstr "Ù…ØÙˆØ± Y" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Z-Axis" -msgstr "" +msgstr "Ù…ØÙˆØ± Z" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh Up Axis:" @@ -10154,7 +10084,7 @@ msgstr "" #: editor/plugins/particles_editor_plugin.cpp scene/gui/video_player.cpp msgid "Volume" -msgstr "" +msgstr "ØØ¬Ù…" #: editor/plugins/particles_editor_plugin.cpp #, fuzzy @@ -10256,7 +10186,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp editor/project_export.cpp #: main/main.cpp servers/visual_server.cpp msgid "Options" -msgstr "" +msgstr "گزینه ها" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp @@ -10408,7 +10338,7 @@ msgstr "ویرایش سیگنال" #: editor/plugins/polygon_2d_editor_plugin.cpp scene/3d/skeleton.cpp msgid "Bones" -msgstr "" +msgstr "استخوان‌ها" #: editor/plugins/polygon_2d_editor_plugin.cpp #, fuzzy @@ -10467,7 +10397,7 @@ msgstr "" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Radius:" -msgstr "" +msgstr "شعاع:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Copy Polygon to UV" @@ -10752,7 +10682,7 @@ msgstr "زبانه قبلی" #: editor/plugins/script_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp msgid "File" -msgstr "پَروَندÙÙ‡" +msgstr "ÙØ§ÛŒÙ„" #: editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -10831,7 +10761,7 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp #: editor/script_editor_debugger.cpp msgid "Continue" -msgstr "" +msgstr "ادامه" #: editor/plugins/script_editor_plugin.cpp msgid "Keep Debugger Open" @@ -10886,7 +10816,7 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp msgid "External" -msgstr "" +msgstr "خارجی" #: editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -10954,7 +10884,7 @@ msgstr "منبع" #: editor/plugins/script_text_editor.cpp platform/uwp/export/export.cpp #: scene/3d/interpolated_camera.cpp scene/animation/skeleton_ik.cpp msgid "Target" -msgstr "" +msgstr "هدÙ" #: editor/plugins/script_text_editor.cpp #, fuzzy @@ -11001,15 +10931,15 @@ msgstr "" #: scene/3d/label_3d.cpp scene/gui/label.cpp #: scene/resources/primitive_meshes.cpp msgid "Uppercase" -msgstr "" +msgstr "ØØ±ÙˆÙ بزرگ" #: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp msgid "Lowercase" -msgstr "" +msgstr "ØØ±ÙˆÙ Ú©ÙˆÚ†Ú©" #: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp msgid "Capitalize" -msgstr "" +msgstr "بزرگ کردن ØØ±ÙˆÙ" #: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp msgid "Syntax Highlighter" @@ -11018,7 +10948,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" -msgstr "" +msgstr "نشانک‌ها" #: editor/plugins/script_text_editor.cpp #, fuzzy @@ -11164,7 +11094,7 @@ msgstr "" #: editor/plugins/shader_editor_plugin.cpp scene/resources/material.cpp msgid "Shader" -msgstr "" +msgstr "شیدر" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "This skeleton has no bones, create some children Bone2D nodes." @@ -11180,8 +11110,9 @@ msgid "Create Rest Pose from Bones" msgstr "پخش Ø³ÙØ§Ø±Ø´ÛŒ صØÙ†Ù‡" #: editor/plugins/skeleton_2d_editor_plugin.cpp +#, fuzzy msgid "Skeleton2D" -msgstr "" +msgstr "اسکلت2D" #: editor/plugins/skeleton_2d_editor_plugin.cpp #, fuzzy @@ -11200,7 +11131,7 @@ msgstr "" #: modules/gltf/gltf_node.cpp modules/gltf/gltf_skin.cpp #: scene/2d/polygon_2d.cpp scene/3d/mesh_instance.cpp msgid "Skeleton" -msgstr "" +msgstr "اسکلت" #: editor/plugins/skeleton_editor_plugin.cpp #, fuzzy @@ -11214,7 +11145,7 @@ msgstr "پخش" #: editor/plugins/spatial_editor_plugin.cpp msgid "Orthogonal" -msgstr "" +msgstr "قائم" #: editor/plugins/spatial_editor_plugin.cpp modules/gltf/gltf_camera.cpp msgid "Perspective" @@ -11272,7 +11203,7 @@ msgstr "" #. TRANSLATORS: This will be appended to the view name when Auto Orthogonal is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [auto]" -msgstr "" +msgstr " [خودکار]" #. TRANSLATORS: This will be appended to the view name when Portal Occulusion is enabled. #: editor/plugins/spatial_editor_plugin.cpp @@ -11303,7 +11234,7 @@ msgstr "" #: editor/plugins/texture_region_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp scene/resources/visual_shader.cpp msgid "None" -msgstr "" +msgstr "هیچکدام" #: editor/plugins/spatial_editor_plugin.cpp scene/2d/path_2d.cpp #, fuzzy @@ -11695,8 +11626,9 @@ msgid "4 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Gizmos" -msgstr "" +msgstr "گیزمو‌ها" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" @@ -11775,11 +11707,11 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Pre" -msgstr "" +msgstr "پیش" #: editor/plugins/spatial_editor_plugin.cpp msgid "Post" -msgstr "" +msgstr "پس" #: editor/plugins/spatial_editor_plugin.cpp msgid "Manipulator Gizmo Size" @@ -11884,7 +11816,7 @@ msgstr "" #: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" -msgstr "" +msgstr "اسپرایت" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy @@ -11973,7 +11905,7 @@ msgstr "ØØ§Ù„ت صاÙÛŒ:" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed:" -msgstr "" +msgstr "سرعت:" #: editor/plugins/sprite_frames_editor_plugin.cpp #: modules/gltf/gltf_animation.cpp modules/minimp3/audio_stream_mp3.cpp @@ -11982,7 +11914,7 @@ msgstr "" #: modules/stb_vorbis/resource_importer_ogg_vorbis.cpp scene/2d/path_2d.cpp #: scene/3d/path.cpp scene/resources/animation.cpp scene/resources/material.cpp msgid "Loop" -msgstr "" +msgstr "ØÙ„قه" #: editor/plugins/sprite_frames_editor_plugin.cpp #, fuzzy @@ -12022,11 +11954,11 @@ msgstr "انتخاب یک گره" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Horizontal:" -msgstr "" +msgstr "اÙÙ‚ÛŒ:" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Vertical:" -msgstr "" +msgstr "عمودی:" #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/texture_region_editor_plugin.cpp @@ -12037,7 +11969,7 @@ msgstr "شمارش ها:" #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/texture_region_editor_plugin.cpp msgid "Offset:" -msgstr "" +msgstr "Ø§Ù†ØØ±Ø§Ù:" #: editor/plugins/sprite_frames_editor_plugin.cpp #, fuzzy @@ -12050,7 +11982,7 @@ msgstr "" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "SpriteFrames" -msgstr "" +msgstr "ÙØ±ÛŒÙ… های اسپرایت" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Set Region Rect" @@ -12078,11 +12010,11 @@ msgstr "" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Step:" -msgstr "" +msgstr "گام:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "TextureRegion" -msgstr "" +msgstr "ناØÛŒÙ‡ تکسچر" #: editor/plugins/theme_editor_plugin.cpp msgid "Styleboxes" @@ -12632,7 +12564,7 @@ msgstr "ØºÛŒØ±ÙØ¹Ø§Ù„ شده" #: editor/plugins/theme_editor_preview.cpp scene/resources/mesh_library.cpp msgid "Item" -msgstr "" +msgstr "مورد" #: editor/plugins/theme_editor_preview.cpp #, fuzzy @@ -12663,7 +12595,7 @@ msgstr "" #: editor/plugins/theme_editor_preview.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Submenu" -msgstr "" +msgstr "زیر‌منو" #: editor/plugins/theme_editor_preview.cpp msgid "Subitem 1" @@ -12675,11 +12607,11 @@ msgstr "" #: editor/plugins/theme_editor_preview.cpp msgid "Has" -msgstr "" +msgstr "دارد" #: editor/plugins/theme_editor_preview.cpp msgid "Many" -msgstr "" +msgstr "بسیاری" #: editor/plugins/theme_editor_preview.cpp #, fuzzy @@ -12705,11 +12637,11 @@ msgstr "ÙØ±Ø²Ù†Ø¯ قابل ویرایش" #: editor/plugins/theme_editor_preview.cpp msgid "Subtree" -msgstr "" +msgstr "زیر‌درخت" #: editor/plugins/theme_editor_preview.cpp msgid "Has,Many,Options" -msgstr "" +msgstr "دارد،بسیار،گزینه‌ها" #: editor/plugins/theme_editor_preview.cpp msgid "Invalid path, the PackedScene resource was probably moved or removed." @@ -12771,8 +12703,9 @@ msgid "Find Tile" msgstr "ÛŒØ§ÙØªÙ†" #: editor/plugins/tile_map_editor_plugin.cpp +#, fuzzy msgid "Transpose" -msgstr "" +msgstr "جا‌به‌جا کردن" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" @@ -13302,8 +13235,9 @@ msgstr "تغییر بده" #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/canvas_item.cpp #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/style_box.cpp +#, fuzzy msgid "Modulate" -msgstr "" +msgstr "تعدیل" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -13415,11 +13349,11 @@ msgstr "انجمن" #: editor/plugins/version_control_editor_plugin.cpp msgid "Date:" -msgstr "" +msgstr "تاریخ:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Subtitle:" -msgstr "" +msgstr "زیرنویس:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Do you want to remove the %s branch?" @@ -13458,7 +13392,7 @@ msgstr "" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Passphrase" -msgstr "" +msgstr "عبارت عبور SSH" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -13561,7 +13495,7 @@ msgstr "" #: editor/plugins/version_control_editor_plugin.cpp msgid "Modified" -msgstr "" +msgstr "تغییر کرده" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -13580,7 +13514,7 @@ msgstr "تغییر بده" #: editor/plugins/version_control_editor_plugin.cpp msgid "Unmerged" -msgstr "" +msgstr "ترکیب نشده" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -13594,7 +13528,7 @@ msgstr "ویرایش منØÙ†ÛŒ گره" #: editor/plugins/version_control_editor_plugin.cpp msgid "Unified" -msgstr "" +msgstr "Ù…ØªØØ¯ شده" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" @@ -13606,16 +13540,17 @@ msgid "Add Output" msgstr "خروجی" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "Scalar" -msgstr "" +msgstr "اسکالر" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vector" -msgstr "" +msgstr "بردار" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean" -msgstr "" +msgstr "بولی" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -13715,7 +13650,7 @@ msgstr "تغییر بده" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" -msgstr "" +msgstr "رأس" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -13725,7 +13660,7 @@ msgstr "نشانوندها:" #: editor/plugins/visual_shader_editor_plugin.cpp modules/gltf/gltf_node.cpp #: scene/3d/light.cpp msgid "Light" -msgstr "" +msgstr "نور" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -14431,7 +14366,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "VisualShader" -msgstr "" +msgstr "شیدر دیداری" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -14445,7 +14380,7 @@ msgstr "تغییر بده" #: editor/project_export.cpp msgid "Runnable" -msgstr "" +msgstr "قابل اجرا" #: editor/project_export.cpp msgid "Export the project for all the presets defined." @@ -14466,17 +14401,16 @@ msgid "Exporting All" msgstr "صدور" #: editor/project_export.cpp -#, fuzzy msgid "Export Path" -msgstr "صدور پروژه" +msgstr "مسیر خروجی" #: editor/project_export.cpp msgid "Presets" -msgstr "" +msgstr "پیش ÙØ±Ø¶ ها" #: editor/project_export.cpp editor/project_settings_editor.cpp msgid "Add..." -msgstr "" +msgstr "Ø§ÙØ²ÙˆØ¯Ù†..." #: editor/project_export.cpp msgid "" @@ -14490,15 +14424,15 @@ msgstr "منابع" #: editor/project_export.cpp msgid "Export all resources in the project" -msgstr "" +msgstr "صدور همه منابع در پروژه" #: editor/project_export.cpp msgid "Export selected scenes (and dependencies)" -msgstr "" +msgstr "صدور صØÙ†Ù‡ های انتخاب شده (Ùˆ وابستگی ها)" #: editor/project_export.cpp msgid "Export selected resources (and dependencies)" -msgstr "" +msgstr "صدور منابع انتخاب شده (Ùˆ وابستگی ها)" #: editor/project_export.cpp msgid "Export Mode:" @@ -14748,8 +14682,9 @@ msgid "Project Installation Path:" msgstr "مسیر پروژه:" #: editor/project_manager.cpp +#, fuzzy msgid "Renderer:" -msgstr "" +msgstr "رندرر:" #: editor/project_manager.cpp msgid "OpenGL ES 3.0" @@ -15001,7 +14936,7 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "Key " -msgstr "" +msgstr "کلید " #: editor/project_settings_editor.cpp msgid "Joy Button" @@ -15046,7 +14981,7 @@ msgstr "دستگاه" #: editor/project_settings_editor.cpp msgid " (Physical)" -msgstr "" +msgstr " (Ùیزیکی)" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." @@ -15232,7 +15167,7 @@ msgstr "تنظیمات پروژه (پروژه.گودات)" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "General" -msgstr "Ù‡ÙŽÙ…Ùگان" +msgstr "عمومی" #: editor/project_settings_editor.cpp msgid "Override For..." @@ -15247,8 +15182,9 @@ msgid "Input Map" msgstr "" #: editor/project_settings_editor.cpp +#, fuzzy msgid "Action:" -msgstr "" +msgstr "عمل:" #: editor/project_settings_editor.cpp scene/gui/scroll_container.cpp msgid "Deadzone" @@ -15256,7 +15192,7 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "Device:" -msgstr "" +msgstr "دستگاه:" #: editor/project_settings_editor.cpp msgid "Index:" @@ -15328,7 +15264,7 @@ msgstr "" #: editor/property_editor.cpp msgid "Zero" -msgstr "" +msgstr "ØµÙØ±" #: editor/property_editor.cpp msgid "Easing In-Out" @@ -15340,11 +15276,11 @@ msgstr "" #: editor/property_editor.cpp msgid "File..." -msgstr "" +msgstr "ÙØ§ÛŒÙ„..." #: editor/property_editor.cpp msgid "Dir..." -msgstr "" +msgstr "دایرکتوری..." #: editor/property_editor.cpp msgid "Assign" @@ -15388,11 +15324,11 @@ msgstr "تغییر نام" #: editor/rename_dialog.cpp msgid "Prefix:" -msgstr "" +msgstr "پیشوند:" #: editor/rename_dialog.cpp msgid "Suffix:" -msgstr "" +msgstr "پسوند:" #: editor/rename_dialog.cpp #, fuzzy @@ -15405,7 +15341,7 @@ msgstr "" #: editor/rename_dialog.cpp msgid "Substitute" -msgstr "" +msgstr "جایگزین" #: editor/rename_dialog.cpp #, fuzzy @@ -15453,8 +15389,9 @@ msgid "Amount by which counter is incremented for each node" msgstr "" #: editor/rename_dialog.cpp +#, fuzzy msgid "Padding" -msgstr "" +msgstr "لایه گذاری" #: editor/rename_dialog.cpp msgid "" @@ -15464,15 +15401,16 @@ msgstr "" #: editor/rename_dialog.cpp msgid "Post-Process" -msgstr "" +msgstr "پس-پردازش" #: editor/rename_dialog.cpp msgid "Style" -msgstr "" +msgstr "شیوه" #: editor/rename_dialog.cpp +#, fuzzy msgid "Keep" -msgstr "" +msgstr "Ù†Ú¯Ù‡ داشتن" #: editor/rename_dialog.cpp msgid "PascalCase to snake_case" @@ -15699,19 +15637,18 @@ msgstr "" msgid "Make Local" msgstr "Ù…ØÙ„ÛŒ" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." +#: editor/scene_tree_dock.cpp +msgid "Enable Scene Unique Name(s)" msgstr "" #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" -msgstr "نام گره:" +msgid "Unique names already used by another node in the scene:" +msgstr "نام هم‌اکنون توسط تابع/متغیر/سیگنال Ø§Ø³ØªÙØ§Ø¯Ù‡ شده است:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -#, fuzzy -msgid "Disable Scene Unique Name" -msgstr "نام گره:" +#: editor/scene_tree_dock.cpp +msgid "Disable Scene Unique Name(s)" +msgstr "" #: editor/scene_tree_dock.cpp #, fuzzy @@ -15919,6 +15856,11 @@ msgstr "دکمه" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "نام گره:" + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr "خطای اتصال" @@ -15983,6 +15925,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "تغییر نام گره" @@ -16052,7 +15998,7 @@ msgstr "خطای بارگذاری قلم." #: editor/script_create_dialog.cpp msgid "Overrides" -msgstr "" +msgstr "بازنویسی می‌کند" #: editor/script_create_dialog.cpp msgid "N/A" @@ -16153,11 +16099,11 @@ msgstr "برداشتن" #: editor/script_editor_debugger.cpp msgid "Bytes:" -msgstr "" +msgstr "بایت‌ها:" #: editor/script_editor_debugger.cpp msgid "Warning:" -msgstr "" +msgstr "هشدار:" #: editor/script_editor_debugger.cpp #, fuzzy @@ -16195,7 +16141,7 @@ msgstr "" #: editor/script_editor_debugger.cpp msgid "Errors" -msgstr "" +msgstr "خطا‌ها" #: editor/script_editor_debugger.cpp #, fuzzy @@ -16256,11 +16202,11 @@ msgstr "صدور پروژه" #: editor/script_editor_debugger.cpp msgid "Monitor" -msgstr "" +msgstr "مانیتور" #: editor/script_editor_debugger.cpp msgid "Monitors" -msgstr "" +msgstr "مانیتور‌ها" #: editor/script_editor_debugger.cpp msgid "Pick one or more items from the list to display the graph." @@ -16272,7 +16218,7 @@ msgstr "" #: editor/script_editor_debugger.cpp msgid "Total:" -msgstr "" +msgstr "Ú©Ù„:" #: editor/script_editor_debugger.cpp #, fuzzy @@ -16287,15 +16233,15 @@ msgstr "" #: editor/script_editor_debugger.cpp scene/resources/audio_stream_sample.cpp #: servers/audio/effects/audio_effect_record.cpp msgid "Format" -msgstr "" +msgstr "قالب" #: editor/script_editor_debugger.cpp scene/main/viewport.cpp msgid "Usage" -msgstr "" +msgstr "کاربرد:" #: editor/script_editor_debugger.cpp servers/visual_server.cpp msgid "Misc" -msgstr "" +msgstr "Ù…ØªÙØ±Ù‚Ù‡" #: editor/script_editor_debugger.cpp msgid "Clicked Control:" @@ -16336,7 +16282,7 @@ msgstr "ویرایشگر ØªØ±Ø¬ÛŒØØ§Øª" #: editor/settings_config_dialog.cpp msgid "Shortcuts" -msgstr "" +msgstr "میانبر‌ها" #: editor/settings_config_dialog.cpp msgid "Binding" @@ -16358,7 +16304,7 @@ msgstr "" #: platform/osx/export/export.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Camera" -msgstr "" +msgstr "دوربین" #: editor/spatial_editor_gizmos.cpp msgid "Change Camera FOV" @@ -16366,7 +16312,7 @@ msgstr "" #: editor/spatial_editor_gizmos.cpp msgid "Change Camera Size" -msgstr "" +msgstr "تغییر اندازه دوربین" #: editor/spatial_editor_gizmos.cpp msgid "Visibility Notifier" @@ -16399,7 +16345,7 @@ msgstr "" #: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp msgid "Change Sphere Shape Radius" -msgstr "" +msgstr "تغییر شعاع Ø´Ú©Ù„ کره" #: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp msgid "Change Box Shape Extents" @@ -16407,11 +16353,11 @@ msgstr "" #: editor/spatial_editor_gizmos.cpp msgid "Change Capsule Shape Radius" -msgstr "" +msgstr "تغییر شعاع Ø´Ú©Ù„ کپسول" #: editor/spatial_editor_gizmos.cpp msgid "Change Capsule Shape Height" -msgstr "" +msgstr "تغییر Ø§Ø±ØªÙØ§Ø¹ Ø´Ú©Ù„ کپسول" #: editor/spatial_editor_gizmos.cpp msgid "Change Cylinder Shape Radius" @@ -16605,7 +16551,7 @@ msgstr "" #: main/main.cpp msgid "Driver" -msgstr "" +msgstr "درایور" #: main/main.cpp #, fuzzy @@ -16622,7 +16568,7 @@ msgstr "" #: main/main.cpp msgid "DPI" -msgstr "" +msgstr "دی‌پی‌آی" #: main/main.cpp msgid "Allow hiDPI" @@ -16630,7 +16576,7 @@ msgstr "" #: main/main.cpp msgid "V-Sync" -msgstr "" +msgstr "ÙˆÛŒ-سینک" #: main/main.cpp msgid "Use V-Sync" @@ -16642,7 +16588,7 @@ msgstr "" #: main/main.cpp msgid "Allowed" -msgstr "" +msgstr "مجاز" #: main/main.cpp msgid "Intended Usage" @@ -16701,7 +16647,7 @@ msgstr "" #: scene/gui/scroll_container.cpp scene/gui/text_edit.cpp scene/gui/tree.cpp #: scene/main/viewport.cpp scene/register_scene_types.cpp msgid "GUI" -msgstr "" +msgstr "رابط کاربری گراÙیکی" #: main/main.cpp msgid "Drop Mouse On GUI Input Disabled" @@ -16744,7 +16690,7 @@ msgstr "" #: main/main.cpp msgid "iOS" -msgstr "" +msgstr "آی‌او‌اس" #: main/main.cpp msgid "Hide Home Indicator" @@ -16766,7 +16712,7 @@ msgstr "" #: main/main.cpp servers/visual_server.cpp msgid "GLES3" -msgstr "" +msgstr "جی‌ال‌ای‌اس‌۳" #: main/main.cpp servers/visual_server.cpp #, fuzzy @@ -16781,7 +16727,7 @@ msgstr "" #: scene/3d/world_environment.cpp scene/main/scene_tree.cpp #: scene/resources/world.cpp msgid "Environment" -msgstr "" +msgstr "Ù…ØÛŒØ·" #: main/main.cpp msgid "Default Clear Color" @@ -16797,11 +16743,11 @@ msgstr "" #: main/main.cpp msgid "Image" -msgstr "" +msgstr "عکس" #: main/main.cpp msgid "Fullsize" -msgstr "" +msgstr "اندازه کامل" #: main/main.cpp scene/resources/dynamic_font.cpp #, fuzzy @@ -16882,8 +16828,9 @@ msgstr "پیدا کردن نوع گره" #: main/main.cpp scene/gui/texture_progress.cpp #: scene/gui/viewport_container.cpp +#, fuzzy msgid "Stretch" -msgstr "" +msgstr "کشیدن" #: main/main.cpp msgid "Aspect" @@ -16891,7 +16838,7 @@ msgstr "" #: main/main.cpp msgid "Shrink" -msgstr "" +msgstr "Ú©ÙˆÚ†Ú© کردن" #: main/main.cpp scene/main/scene_tree.cpp msgid "Auto Accept Quit" @@ -16978,7 +16925,7 @@ msgstr "اتصال به گره:" #: scene/resources/navigation_mesh.cpp scene/resources/primitive_meshes.cpp #: scene/resources/sphere_shape.cpp msgid "Radius" -msgstr "" +msgstr "شعاع" #: modules/csg/csg_shape.cpp scene/resources/primitive_meshes.cpp msgid "Radial Segments" @@ -16996,11 +16943,11 @@ msgstr "گام نرم" #: modules/csg/csg_shape.cpp msgid "Sides" -msgstr "" +msgstr "طرÙین" #: modules/csg/csg_shape.cpp msgid "Cone" -msgstr "" +msgstr "مخروط" #: modules/csg/csg_shape.cpp msgid "Inner Radius" @@ -17164,12 +17111,14 @@ msgid "Double click to create a new entry" msgstr "" #: modules/gdnative/gdnative_library_editor_plugin.cpp +#, fuzzy msgid "Platform:" -msgstr "" +msgstr "سکو:" #: modules/gdnative/gdnative_library_editor_plugin.cpp +#, fuzzy msgid "Platform" -msgstr "" +msgstr "سکو" #: modules/gdnative/gdnative_library_editor_plugin.cpp #, fuzzy @@ -17343,7 +17292,7 @@ msgstr "مگابایت" #: modules/gltf/gltf_accessor.cpp scene/resources/visual_shader_nodes.cpp msgid "Max" -msgstr "" +msgstr "ØØ¯Ø§Ú©Ø«Ø±" #: modules/gltf/gltf_accessor.cpp #, fuzzy @@ -17372,7 +17321,7 @@ msgstr "" #: modules/gltf/gltf_buffer_view.cpp msgid "Buffer" -msgstr "" +msgstr "Ø¨Ø§ÙØ±" #: modules/gltf/gltf_buffer_view.cpp #, fuzzy @@ -17470,7 +17419,7 @@ msgstr "برداشتن نقطه" #: modules/gltf/gltf_skeleton.cpp modules/gltf/gltf_skin.cpp msgid "Roots" -msgstr "" +msgstr "ریشه‌ها" #: modules/gltf/gltf_skeleton.cpp modules/gltf/gltf_state.cpp msgid "Unique Names" @@ -17533,7 +17482,7 @@ msgstr "" #: modules/gltf/gltf_state.cpp msgid "Json" -msgstr "" +msgstr "جی‌سان" #: modules/gltf/gltf_state.cpp #, fuzzy @@ -17579,15 +17528,15 @@ msgstr "ویژگی‌ها" #: modules/gltf/gltf_state.cpp platform/uwp/export/export.cpp msgid "Images" -msgstr "" +msgstr "تصاویر" #: modules/gltf/gltf_state.cpp msgid "Cameras" -msgstr "" +msgstr "دوربین‌ها" #: modules/gltf/gltf_state.cpp servers/visual_server.cpp msgid "Lights" -msgstr "" +msgstr "نور‌ها" #: modules/gltf/gltf_state.cpp #, fuzzy @@ -17628,7 +17577,7 @@ msgstr "" #: modules/gridmap/grid_map.cpp scene/2d/tile_map.cpp msgid "Cell" -msgstr "" +msgstr "سلول" #: modules/gridmap/grid_map.cpp #, fuzzy @@ -17654,7 +17603,7 @@ msgstr "ساختن گره" #: scene/2d/tile_map.cpp scene/3d/collision_object.cpp scene/3d/soft_body.cpp #: scene/resources/material.cpp msgid "Mask" -msgstr "" +msgstr "ماسک" #: modules/gridmap/grid_map.cpp scene/2d/tile_map.cpp #, fuzzy @@ -17681,7 +17630,7 @@ msgstr "زبانه قبلی" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Plane:" -msgstr "" +msgstr "سطØ" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Next Floor" @@ -17913,6 +17862,18 @@ msgstr "همه‌ی انتخاب ها" msgid "Auto Update Project" msgstr "پروژه بی نام" +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "C# Project Directory" +msgstr "" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -17955,8 +17916,9 @@ msgid "Eroding walkable area..." msgstr "" #: modules/navigation/navigation_mesh_generator.cpp +#, fuzzy msgid "Partitioning..." -msgstr "" +msgstr "تقسیم بندی..." #: modules/navigation/navigation_mesh_generator.cpp msgid "Creating contours..." @@ -17980,11 +17942,11 @@ msgstr "" #: modules/navigation/navigation_mesh_generator.cpp msgid "Done!" -msgstr "" +msgstr "انجام شد!" #: modules/opensimplex/noise_texture.cpp msgid "Seamless" -msgstr "" +msgstr "یک‌پارچه" #: modules/opensimplex/noise_texture.cpp msgid "As Normal Map" @@ -17995,8 +17957,9 @@ msgid "Bump Strength" msgstr "" #: modules/opensimplex/noise_texture.cpp +#, fuzzy msgid "Noise" -msgstr "" +msgstr "نویز" #: modules/opensimplex/noise_texture.cpp msgid "Noise Offset" @@ -18008,11 +17971,11 @@ msgstr "" #: modules/opensimplex/open_simplex_noise.cpp msgid "Period" -msgstr "" +msgstr "دوره" #: modules/opensimplex/open_simplex_noise.cpp msgid "Persistence" -msgstr "" +msgstr "ماندگاری" #: modules/opensimplex/open_simplex_noise.cpp msgid "Lacunarity" @@ -18020,7 +17983,7 @@ msgstr "" #: modules/regex/regex.cpp msgid "Subject" -msgstr "" +msgstr "موضوع" #: modules/regex/regex.cpp #, fuzzy @@ -18489,8 +18452,9 @@ msgid "if (cond) is:" msgstr "" #: modules/visual_script/visual_script_flow_control.cpp +#, fuzzy msgid "While" -msgstr "" +msgstr "هنگامی Ú©Ù‡" #: modules/visual_script/visual_script_flow_control.cpp msgid "while (cond):" @@ -18521,7 +18485,7 @@ msgstr "تکرارگر نامعتبر شد: " #: modules/visual_script/visual_script_flow_control.cpp msgid "Sequence" -msgstr "" +msgstr "دنباله" #: modules/visual_script/visual_script_flow_control.cpp #, fuzzy @@ -18682,7 +18646,7 @@ msgstr "آرایه را تغییر اندازه بده" #: modules/visual_script/visual_script_nodes.cpp scene/resources/material.cpp #: scene/resources/visual_shader_nodes.cpp msgid "Operator" -msgstr "" +msgstr "عملگر" #: modules/visual_script/visual_script_nodes.cpp #, fuzzy @@ -18791,7 +18755,7 @@ msgstr "ÙØ±Ø§Ø®ÙˆØ§Ù†ÛŒ" #: modules/visual_script/visual_script_nodes.cpp scene/gui/graph_node.cpp msgid "Title" -msgstr "" +msgstr "عنوان" #: modules/visual_script/visual_script_nodes.cpp #, fuzzy @@ -19089,7 +19053,7 @@ msgstr "زبانه قبلی" #: platform/android/export/export_plugin.cpp msgid "Code" -msgstr "" +msgstr "کد" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp #, fuzzy @@ -19764,6 +19728,10 @@ msgstr "ساختن گره" msgid "Custom BG Color" msgstr "ساختن گره" +#: platform/iphone/export/export.cpp +msgid "Export Icons" +msgstr "آیکون‌های خروجی" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -19914,8 +19882,9 @@ msgid "Error starting HTTP server: %d." msgstr "خطا در بارگذاری:" #: platform/javascript/export/export.cpp +#, fuzzy msgid "Web" -msgstr "" +msgstr "وب" #: platform/javascript/export/export.cpp msgid "HTTP Host" @@ -20475,7 +20444,7 @@ msgstr "" #: platform/osx/export/export.cpp msgid "macOS" -msgstr "" +msgstr "مک‌او‌اس" #: platform/osx/export/export.cpp msgid "Force Builtin Codesign" @@ -20610,6 +20579,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "نام نامعتبر." @@ -20903,11 +20878,11 @@ msgstr "" #: scene/2d/area_2d.cpp scene/3d/area.cpp msgid "Monitoring" -msgstr "" +msgstr "نظارت" #: scene/2d/area_2d.cpp scene/3d/area.cpp msgid "Monitorable" -msgstr "" +msgstr "قابل نظارت" #: scene/2d/area_2d.cpp scene/3d/area.cpp msgid "Physics Overrides" @@ -20934,7 +20909,7 @@ msgstr "به‌روزرسانی از صØÙ†Ù‡" #: scene/2d/area_2d.cpp scene/2d/cpu_particles_2d.cpp scene/3d/area.cpp #: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp msgid "Gravity" -msgstr "" +msgstr "جاذبه" #: scene/2d/area_2d.cpp scene/3d/area.cpp #, fuzzy @@ -20952,7 +20927,7 @@ msgstr "Ø§ÙØ²ÙˆØ¯Ù† کانل صوتی" #: scene/2d/area_2d.cpp scene/3d/area.cpp msgid "Override" -msgstr "" +msgstr "بازنویسی" #: scene/2d/audio_stream_player_2d.cpp scene/audio/audio_stream_player.cpp #: scene/gui/video_player.cpp servers/audio/effects/audio_effect_amplify.cpp @@ -21661,9 +21636,8 @@ msgid "Filter Smooth" msgstr "ØØ§Ù„ت صاÙÛŒ:" #: scene/2d/light_occluder_2d.cpp -#, fuzzy msgid "Closed" -msgstr "بستن" +msgstr "بسته" #: scene/2d/light_occluder_2d.cpp scene/resources/material.cpp #, fuzzy @@ -22072,7 +22046,7 @@ msgstr "" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Damp" -msgstr "" +msgstr "مرطوب" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Angular" @@ -22084,7 +22058,7 @@ msgstr "" #: scene/2d/physics_body_2d.cpp msgid "Torque" -msgstr "" +msgstr "گشتاور" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Safe Margin" @@ -22111,7 +22085,7 @@ msgstr "" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Remainder" -msgstr "" +msgstr "باقی مانده" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #, fuzzy @@ -22187,7 +22161,7 @@ msgstr "" #: scene/2d/ray_cast_2d.cpp scene/3d/camera.cpp scene/3d/ray_cast.cpp msgid "Areas" -msgstr "" +msgstr "مناطق" #: scene/2d/ray_cast_2d.cpp scene/3d/camera.cpp scene/3d/ray_cast.cpp msgid "Bodies" @@ -22452,7 +22426,7 @@ msgstr "" #: scene/3d/audio_stream_player_3d.cpp msgid "Degrees" -msgstr "" +msgstr "درجه" #: scene/3d/audio_stream_player_3d.cpp #, fuzzy @@ -22512,7 +22486,7 @@ msgstr "" #: scene/3d/baked_lightmap.cpp msgid "Done" -msgstr "" +msgstr "انجام شد" #: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp #: scene/3d/reflection_probe.cpp scene/resources/box_shape.cpp @@ -22873,7 +22847,7 @@ msgstr "انتخاب ØØ§Ù„ت" #: scene/3d/label_3d.cpp scene/resources/default_theme/default_theme.cpp #: scene/resources/dynamic_font.cpp scene/resources/primitive_meshes.cpp msgid "Font" -msgstr "" +msgstr "Ùونت" #: scene/3d/label_3d.cpp scene/resources/primitive_meshes.cpp #, fuzzy @@ -23570,7 +23544,7 @@ msgstr "اشکال یابی" #: scene/3d/ray_cast.cpp scene/resources/style_box.cpp msgid "Thickness" -msgstr "" +msgstr "ضخامت" #: scene/3d/reflection_probe.cpp scene/main/viewport.cpp #, fuzzy @@ -24272,7 +24246,7 @@ msgstr "" #: scene/animation/skeleton_ik.cpp msgid "Magnet" -msgstr "" +msgstr "آهن‌ربا" #: scene/animation/skeleton_ik.cpp #, fuzzy @@ -24457,7 +24431,7 @@ msgstr "ثابت" #: scene/gui/control.cpp scene/resources/visual_shader_nodes.cpp msgid "Hint" -msgstr "" +msgstr "تذکر" #: scene/gui/control.cpp #, fuzzy @@ -24466,7 +24440,7 @@ msgstr "ابزارها" #: scene/gui/control.cpp scene/resources/default_theme/default_theme.cpp msgid "Focus" -msgstr "" +msgstr "تمرکز" #: scene/gui/control.cpp msgid "Neighbour Left" @@ -24495,7 +24469,7 @@ msgstr "زبانه قبلی" #: scene/gui/control.cpp msgid "Mouse" -msgstr "" +msgstr "موس" #: scene/gui/control.cpp #, fuzzy @@ -24525,8 +24499,9 @@ msgid "Window Title" msgstr "" #: scene/gui/dialogs.cpp +#, fuzzy msgid "Dialog" -msgstr "" +msgstr "دیالوگ" #: scene/gui/dialogs.cpp msgid "Hide On OK" @@ -24612,7 +24587,7 @@ msgstr "" #: scene/gui/grid_container.cpp scene/gui/item_list.cpp scene/gui/tree.cpp msgid "Columns" -msgstr "" +msgstr "ستون‌ها" #: scene/gui/item_list.cpp scene/gui/popup_menu.cpp scene/gui/text_edit.cpp #: scene/gui/tree.cpp scene/main/viewport.cpp @@ -24749,15 +24724,15 @@ msgstr "بارگیری به عنوان جانگهدار" #: scene/gui/line_edit.cpp msgid "Alpha" -msgstr "" +msgstr "Ø¢Ù„ÙØ§" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Caret" -msgstr "" +msgstr "کارت" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Blink" -msgstr "" +msgstr "پلک" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp #, fuzzy @@ -24766,7 +24741,7 @@ msgstr "پخش صØÙ†Ù‡" #: scene/gui/link_button.cpp msgid "Underline" -msgstr "" +msgstr "زیرخط" #: scene/gui/menu_button.cpp #, fuzzy @@ -24799,12 +24774,13 @@ msgid "" msgstr "" #: scene/gui/popup.cpp +#, fuzzy msgid "Popup" -msgstr "" +msgstr "پاپ‌آپ" #: scene/gui/popup.cpp msgid "Exclusive" -msgstr "" +msgstr "Ø§Ù†ØØµØ§Ø±ÛŒ" #: scene/gui/popup.cpp #, fuzzy @@ -24862,7 +24838,7 @@ msgstr "مقدار:" #: scene/gui/range.cpp msgid "Page" -msgstr "" +msgstr "ØµÙØÙ‡" #: scene/gui/range.cpp #, fuzzy @@ -24987,7 +24963,7 @@ msgstr "" #: scene/gui/slider.cpp msgid "Scrollable" -msgstr "" +msgstr "قابل اسکرول" #: scene/gui/slider.cpp msgid "Tick Count" @@ -25000,7 +24976,7 @@ msgstr "ساختن پوشه" #: scene/gui/spin_box.cpp msgid "Prefix" -msgstr "" +msgstr "پیشوند" #: scene/gui/spin_box.cpp msgid "Suffix" @@ -25058,7 +25034,7 @@ msgstr "" #: scene/gui/text_edit.cpp msgid "Readonly" -msgstr "" +msgstr "Ùقط خواندنی" #: scene/gui/text_edit.cpp msgid "Bookmark Gutter" @@ -25142,11 +25118,11 @@ msgstr "" #: scene/gui/texture_progress.cpp msgid "Under" -msgstr "" +msgstr "زیر" #: scene/gui/texture_progress.cpp msgid "Over" -msgstr "" +msgstr "روی" #: scene/gui/texture_progress.cpp #, fuzzy @@ -25163,8 +25139,9 @@ msgid "Fill Mode" msgstr "ØØ§Ù„ت صدور:" #: scene/gui/texture_progress.cpp scene/resources/material.cpp +#, fuzzy msgid "Tint" -msgstr "" +msgstr "رنگ" #: scene/gui/texture_progress.cpp msgid "Radial Fill" @@ -25372,7 +25349,7 @@ msgstr "صØÙ†Ù‡ جدید" #: scene/main/scene_tree.cpp msgid "Root" -msgstr "" +msgstr "ریشه" #: scene/main/scene_tree.cpp #, fuzzy @@ -25382,7 +25359,7 @@ msgstr "تعیین چندگانه:" #: scene/main/scene_tree.cpp scene/resources/mesh_library.cpp #: scene/resources/shape_2d.cpp msgid "Shapes" -msgstr "" +msgstr "شکل‌ها" #: scene/main/scene_tree.cpp msgid "Shape Color" @@ -25504,7 +25481,7 @@ msgstr "" #: scene/main/viewport.cpp scene/resources/world_2d.cpp msgid "World" -msgstr "" +msgstr "جهان" #: scene/main/viewport.cpp msgid "World 2D" @@ -25673,7 +25650,7 @@ msgstr "گره ترکیب" #: scene/resources/audio_stream_sample.cpp msgid "Stereo" -msgstr "" +msgstr "استریو" #: scene/resources/concave_polygon_shape_2d.cpp #, fuzzy @@ -26509,11 +26486,11 @@ msgstr "اتصال گره‌ها" #: scene/resources/environment.cpp msgid "Background" -msgstr "" +msgstr "پس‌زمینه" #: scene/resources/environment.cpp scene/resources/sky.cpp msgid "Sky" -msgstr "" +msgstr "آسمان" #: scene/resources/environment.cpp #, fuzzy @@ -26554,7 +26531,7 @@ msgstr "انیمیشن" #: scene/resources/environment.cpp msgid "Fog" -msgstr "" +msgstr "مه" #: scene/resources/environment.cpp #, fuzzy @@ -26627,7 +26604,7 @@ msgstr "خروجی" #: scene/resources/environment.cpp msgid "White" -msgstr "" +msgstr "سÙید" #: scene/resources/environment.cpp msgid "Auto Exposure" @@ -26665,8 +26642,9 @@ msgid "Depth Tolerance" msgstr "بومی" #: scene/resources/environment.cpp scene/resources/material.cpp +#, fuzzy msgid "Roughness" -msgstr "" +msgstr "زبری" #: scene/resources/environment.cpp msgid "SSAO" @@ -26717,7 +26695,7 @@ msgstr "" #: scene/resources/environment.cpp msgid "Glow" -msgstr "" +msgstr "درخشش" #: scene/resources/environment.cpp #, fuzzy @@ -26778,12 +26756,13 @@ msgid "Bicubic Upscale" msgstr "" #: scene/resources/environment.cpp +#, fuzzy msgid "Adjustments" -msgstr "" +msgstr "تنظیمات" #: scene/resources/environment.cpp msgid "Brightness" -msgstr "" +msgstr "روشنایی" #: scene/resources/environment.cpp #, fuzzy @@ -26811,8 +26790,9 @@ msgid "Raw Data" msgstr "صادکردن ÙØ§ÛŒÙ„ کتابخانه ای" #: scene/resources/gradient.cpp +#, fuzzy msgid "Offsets" -msgstr "" +msgstr "Ø§Ù†ØØ±Ø§Ù‌ها" #: scene/resources/height_map_shape.cpp msgid "Map Width" @@ -26964,7 +26944,7 @@ msgstr "" #: scene/resources/material.cpp msgid "Metallic" -msgstr "" +msgstr "Ùلزی" #: scene/resources/material.cpp #, fuzzy @@ -27048,7 +27028,7 @@ msgstr "شمارش ها:" #: scene/resources/material.cpp msgid "Detail" -msgstr "" +msgstr "جزئیات" #: scene/resources/material.cpp msgid "UV Layer" @@ -27225,7 +27205,7 @@ msgstr "ØØ°Ù قالب" #: scene/resources/occluder_shape.cpp msgid "Spheres" -msgstr "" +msgstr "کره‌ها" #: scene/resources/occluder_shape.cpp msgid "OccluderShapeSphere Set Spheres" @@ -27247,11 +27227,12 @@ msgstr "" #: scene/resources/particles_material.cpp msgid "Trail" -msgstr "" +msgstr "دنباله" #: scene/resources/particles_material.cpp +#, fuzzy msgid "Divisor" -msgstr "" +msgstr "مقسوم علیه" #: scene/resources/particles_material.cpp #, fuzzy @@ -27295,11 +27276,11 @@ msgstr "ویرایش منØÙ†ÛŒ گره" #: scene/resources/physics_material.cpp msgid "Rough" -msgstr "" +msgstr "زبری" #: scene/resources/physics_material.cpp msgid "Absorbent" -msgstr "" +msgstr "جاذب" #: scene/resources/plane_shape.cpp #, fuzzy @@ -27379,7 +27360,7 @@ msgstr "" #: scene/resources/sky.cpp msgid "Panorama" -msgstr "" +msgstr "پانوراما" #: scene/resources/sky.cpp #, fuzzy @@ -27407,8 +27388,9 @@ msgid "Sun" msgstr "اجرا" #: scene/resources/sky.cpp +#, fuzzy msgid "Latitude" -msgstr "" +msgstr "عرض" #: scene/resources/sky.cpp msgid "Longitude" @@ -27711,21 +27693,21 @@ msgstr "" #: servers/audio/effects/audio_effect_delay.cpp #: servers/audio/effects/audio_effect_reverb.cpp msgid "Dry" -msgstr "" +msgstr "خشک" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_reverb.cpp msgid "Wet" -msgstr "" +msgstr "مرطوب" #: servers/audio/effects/audio_effect_chorus.cpp msgid "Voice" -msgstr "" +msgstr "صدا" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_delay.cpp msgid "Delay (ms)" -msgstr "" +msgstr "تأخیر (میلی‌ثانیه)" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_phaser.cpp @@ -27740,7 +27722,7 @@ msgstr "بومی" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_delay.cpp msgid "Level dB" -msgstr "" +msgstr "Ø³Ø·Ø Ø¯Ø³ÛŒâ€ŒØ¨Ù„" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_delay.cpp @@ -27764,7 +27746,7 @@ msgstr "" #: servers/audio/effects/audio_effect_compressor.cpp msgid "Mix" -msgstr "" +msgstr "ترکیب" #: servers/audio/effects/audio_effect_compressor.cpp msgid "Sidechain" @@ -27772,17 +27754,17 @@ msgstr "" #: servers/audio/effects/audio_effect_delay.cpp msgid "Tap 1" -msgstr "" +msgstr "ضربه Û±" #: servers/audio/effects/audio_effect_delay.cpp msgid "Tap 2" -msgstr "" +msgstr "ضربه Û²" #: servers/audio/effects/audio_effect_delay.cpp #: servers/audio/effects/audio_effect_phaser.cpp #: servers/audio/effects/audio_effect_reverb.cpp msgid "Feedback" -msgstr "" +msgstr "بازخورد" #: servers/audio/effects/audio_effect_delay.cpp #, fuzzy @@ -28136,7 +28118,7 @@ msgstr "" #: servers/visual_server.cpp msgid "Shadows" -msgstr "" +msgstr "سایه‌ها" #: servers/visual_server.cpp #, fuzzy @@ -28157,7 +28139,7 @@ msgstr "" #: servers/visual_server.cpp msgid "Shading" -msgstr "" +msgstr "سایه‌زنی" #: servers/visual_server.cpp msgid "Force Vertex Shading" @@ -28301,7 +28283,7 @@ msgstr "" #: servers/visual_server.cpp msgid "Compatibility" -msgstr "" +msgstr "سازگاری" #: servers/visual_server.cpp msgid "Disable Half Float" @@ -28377,4 +28359,4 @@ msgstr "" #: servers/visual_server.cpp msgid "Shader Cache Size (MB)" -msgstr "" +msgstr "اندازه Ú©Ø´ شیدر (مگابایت)" diff --git a/editor/translations/fi.po b/editor/translations/fi.po index db841ef48a..bb73facb22 100644 --- a/editor/translations/fi.po +++ b/editor/translations/fi.po @@ -12,13 +12,14 @@ # Tuomas Lähteenmäki <lahtis@gmail.com>, 2019, 2022. # Matti Niskanen <matti.t.niskanen@gmail.com>, 2020. # Severi Vidnäs <severi.vidnas@gmail.com>, 2021. +# Akseli Pihlajamaa <akselijuhanipihlajamaa@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-03-17 13:58+0000\n" -"Last-Translator: Tuomas Lähteenmäki <lahtis@gmail.com>\n" +"PO-Revision-Date: 2022-09-11 22:22+0000\n" +"Last-Translator: Akseli Pihlajamaa <akselijuhanipihlajamaa@gmail.com>\n" "Language-Team: Finnish <https://hosted.weblate.org/projects/godot-engine/" "godot/fi/>\n" "Language: fi\n" @@ -26,30 +27,27 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.12-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" msgstr "" #: core/bind/core_bind.cpp -#, fuzzy msgid "Clipboard" -msgstr "Leikepöytä on tyhjä!" +msgstr "Leikepöytä" #: core/bind/core_bind.cpp -#, fuzzy msgid "Current Screen" -msgstr "Nykyinen kohtaus" +msgstr "Nykyinen näkymä" #: core/bind/core_bind.cpp msgid "Exit Code" -msgstr "" +msgstr "Poistumiskoodi" #: core/bind/core_bind.cpp -#, fuzzy msgid "V-Sync Enabled" -msgstr "Ota käyttöön" +msgstr "V-Sync käytössä" #: core/bind/core_bind.cpp main/main.cpp msgid "V-Sync Via Compositor" @@ -60,9 +58,8 @@ msgid "Delta Smoothing" msgstr "" #: core/bind/core_bind.cpp -#, fuzzy msgid "Low Processor Usage Mode" -msgstr "Siirtotila" +msgstr "Matala prosessorin käyttötila" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode Sleep (µsec)" @@ -4636,6 +4633,7 @@ msgstr "Sekalaiset projekti- tai kohtaustyökalut." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projekti" @@ -7574,7 +7572,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15634,18 +15633,19 @@ msgstr "" msgid "Make Local" msgstr "Tee paikallinen" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Solmun nimi:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "Nimi on jo toisen funktion/muuttujan/signaalin käytössä:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Solmun nimi:" #: editor/scene_tree_dock.cpp @@ -15848,6 +15848,11 @@ msgid "Button Group" msgstr "Painikeryhmä" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Solmun nimi:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Yhdistetään paikasta)" @@ -15923,6 +15928,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "Virheellinen solmun nimi, seuraavat merkit eivät ole sallittuja:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Nimeä solmu uudelleen" @@ -17850,6 +17859,21 @@ msgstr "Muodosta ratkaisu" msgid "Auto Update Project" msgstr "Nimetön projekti" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Näytä kaikki" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Valitse hakemisto" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Valitse hakemisto" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Sisemmän poikkeuksen kutsupinon loppu" @@ -19718,6 +19742,11 @@ msgstr "Mukautettu solmu" msgid "Custom BG Color" msgstr "Mukautettu solmu" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Laajenna kaikki" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20615,6 +20644,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Paketin lyhyt nimi on virheellinen." diff --git a/editor/translations/fil.po b/editor/translations/fil.po index 0a154fd6ae..e6d675f5ca 100644 --- a/editor/translations/fil.po +++ b/editor/translations/fil.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-05-15 09:38+0000\n" +"PO-Revision-Date: 2022-08-30 03:11+0000\n" "Last-Translator: Marco Santos <enum.scima@gmail.com>\n" "Language-Team: Filipino <https://hosted.weblate.org/projects/godot-engine/" "godot/fil/>\n" @@ -21,7 +21,7 @@ msgstr "" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1 && n != 2 && n != 3 && (n % 10 == 4 " "|| n % 10 == 6 || n % 10 == 9);\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -33,7 +33,7 @@ msgstr "Clipboard" #: core/bind/core_bind.cpp msgid "Current Screen" -msgstr "Kasalukuyang Screen" +msgstr "Screen Ngayon" #: core/bind/core_bind.cpp msgid "Exit Code" @@ -41,15 +41,15 @@ msgstr "Umalis sa Code" #: core/bind/core_bind.cpp msgid "V-Sync Enabled" -msgstr "Binuksan ang V-Sync" +msgstr "Nakabukas na ang V-Sync" #: core/bind/core_bind.cpp main/main.cpp msgid "V-Sync Via Compositor" -msgstr "V-Sync Via Compositor" +msgstr "V-Sync gamit Compositor" #: core/bind/core_bind.cpp main/main.cpp msgid "Delta Smoothing" -msgstr "Delta Smoothing" +msgstr "Pagkinis sa Delta" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode" @@ -57,7 +57,7 @@ msgstr "Mababang Paggamit sa Processor" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode Sleep (µsec)" -msgstr "Mababang Paggamit sa Processor Tulog (µsec)" +msgstr "Pagtulog ng Mababang Paggamit sa Processor (µsec)" #: core/bind/core_bind.cpp main/main.cpp platform/uwp/os_uwp.cpp msgid "Keep Screen On" @@ -65,15 +65,15 @@ msgstr "Panatilihing Nakabukas ang Screen" #: core/bind/core_bind.cpp msgid "Min Window Size" -msgstr "Min na Laki ng Window" +msgstr "Min na Sukat ng Window" #: core/bind/core_bind.cpp msgid "Max Window Size" -msgstr "Max na Laki ng Window" +msgstr "Max na Sukat ng Window" #: core/bind/core_bind.cpp msgid "Screen Orientation" -msgstr "Screen Orientation" +msgstr "Orientation ng Screen" #: core/bind/core_bind.cpp core/project_settings.cpp main/main.cpp #: platform/uwp/os_uwp.cpp @@ -86,7 +86,7 @@ msgstr "Walang border" #: core/bind/core_bind.cpp msgid "Per Pixel Transparency Enabled" -msgstr "Nakabukas ang Kada Pixel na Transparency" +msgstr "Nakabukas na ang Kada Pixel na Transparency" #: core/bind/core_bind.cpp core/project_settings.cpp msgid "Fullscreen" @@ -123,7 +123,7 @@ msgstr "Posisyon" #: scene/resources/style_box.cpp scene/resources/texture.cpp #: scene/resources/visual_shader.cpp servers/visual_server.cpp msgid "Size" -msgstr "Laki" +msgstr "Sukat" #: core/bind/core_bind.cpp msgid "Endian Swap" @@ -131,15 +131,15 @@ msgstr "Endian Swap" #: core/bind/core_bind.cpp msgid "Editor Hint" -msgstr "Editor Hint" +msgstr "Hint sa Editor" #: core/bind/core_bind.cpp msgid "Print Error Messages" -msgstr "I-print mga Mensahe ng Error" +msgstr "I-print ang mga Mensahe ng Error" #: core/bind/core_bind.cpp msgid "Iterations Per Second" -msgstr "Ikot Kada Segundo" +msgstr "Iteration Kada Segundo" #: core/bind/core_bind.cpp msgid "Target FPS" @@ -313,9 +313,8 @@ msgid "Not enough bytes for decoding bytes, or invalid format." msgstr "Kulang sa bytes para i-decode ang bytes, o invalid na format." #: core/math/expression.cpp -#, fuzzy msgid "Invalid input %d (not passed) in expression" -msgstr "Invalid na input %i (di pinasa) sa expression" +msgstr "Invalid na input na %d (di pinasa) sa expression" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" @@ -359,13 +358,12 @@ msgid "Max Size (KB)" msgstr "Max na Laki (KB)" #: core/os/input.cpp -#, fuzzy msgid "Mouse Mode" -msgstr "Kopya" +msgstr "Mouse Mode" #: core/os/input.cpp msgid "Use Accumulated Input" -msgstr "" +msgstr "Gamitin ang Nakolektang Input" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: servers/audio_server.cpp @@ -393,9 +391,8 @@ msgid "Command" msgstr "Command" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" -msgstr "Pisika" +msgstr "Pisikal" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp @@ -425,7 +422,7 @@ msgstr "Mask ng Button" #: core/os/input_event.cpp scene/2d/node_2d.cpp scene/gui/control.cpp msgid "Global Position" -msgstr "Global na Posisyon" +msgstr "Pandaigdigang Posisyon" #: core/os/input_event.cpp msgid "Factor" @@ -441,7 +438,7 @@ msgstr "Dobleng pindot" #: core/os/input_event.cpp msgid "Tilt" -msgstr "Kiling" +msgstr "Tabingi" #: core/os/input_event.cpp msgid "Pressure" @@ -449,7 +446,7 @@ msgstr "Presyur" #: core/os/input_event.cpp msgid "Pen Inverted" -msgstr "" +msgstr "Baligtad na Pen" #: core/os/input_event.cpp msgid "Relative" @@ -479,7 +476,7 @@ msgstr "Index" #: modules/visual_script/visual_script_nodes.cpp #: scene/2d/touch_screen_button.cpp msgid "Action" -msgstr "Gawain" +msgstr "Kilos" #: core/os/input_event.cpp scene/resources/environment.cpp #: scene/resources/material.cpp @@ -532,7 +529,7 @@ msgstr "Config" #: core/project_settings.cpp msgid "Project Settings Override" -msgstr "Override sa Pagsasaayos ng Proyekto" +msgstr "Override sa Pagsasaayos sa Proyekto" #: core/project_settings.cpp core/resource.cpp #: editor/animation_track_editor.cpp editor/editor_autoload_settings.cpp @@ -575,7 +572,7 @@ msgstr "Patayin ang stderr" #: core/project_settings.cpp msgid "Use Hidden Project Data Directory" -msgstr "Gamitin ang Hidden Project Data Directory" +msgstr "Gamitin ang Nakatagong Directory ng Data ng Proyekto" #: core/project_settings.cpp msgid "Use Custom User Dir" @@ -589,13 +586,13 @@ msgstr "Pangalan ng Sariling User Dir" #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #: platform/uwp/os_uwp.cpp msgid "Display" -msgstr "" +msgstr "Pagpapakita" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/opensimplex/noise_texture.cpp scene/2d/line_2d.cpp #: scene/3d/label_3d.cpp scene/gui/text_edit.cpp scene/resources/texture.cpp msgid "Width" -msgstr "" +msgstr "Lapad" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/gltf/gltf_node.cpp modules/opensimplex/noise_texture.cpp @@ -604,19 +601,19 @@ msgstr "" #: scene/resources/font.cpp scene/resources/navigation_mesh.cpp #: scene/resources/primitive_meshes.cpp scene/resources/texture.cpp msgid "Height" -msgstr "" +msgstr "Tangkad" #: core/project_settings.cpp msgid "Always On Top" -msgstr "" +msgstr "Palaging Nasa Taas" #: core/project_settings.cpp msgid "Test Width" -msgstr "" +msgstr "Lapad ng Test" #: core/project_settings.cpp msgid "Test Height" -msgstr "" +msgstr "Tangkad ng Test" #: core/project_settings.cpp editor/animation_track_editor.cpp #: editor/editor_audio_buses.cpp main/main.cpp servers/audio_server.cpp @@ -640,7 +637,7 @@ msgstr "Pangunahing Args sa Pagtakbo" #: core/project_settings.cpp msgid "Scene Naming" -msgstr "" +msgstr "Pagpangalan sa Eksena" #: core/project_settings.cpp msgid "Search In File Extensions" @@ -4358,6 +4355,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7074,7 +7072,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -14797,18 +14796,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Pagbago ng Haba ng Animation" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Pagbago ng Haba ng Animation" #: editor/scene_tree_dock.cpp @@ -14998,6 +14997,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Pagbago ng Haba ng Animation" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15061,6 +15065,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -16867,6 +16875,19 @@ msgstr "" msgid "Auto Update Project" msgstr "Ilipat Ang Mga Bezier Points" +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Gamitin ang Nakatagong Directory ng Data ng Proyekto" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18580,6 +18601,11 @@ msgstr "Mga Functions:" msgid "Custom BG Color" msgstr "Mga Functions:" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "3D Transform Track" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19376,6 +19402,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/fr.po b/editor/translations/fr.po index 88c4966b54..e19c856222 100644 --- a/editor/translations/fr.po +++ b/editor/translations/fr.po @@ -102,13 +102,16 @@ # Jérémie Guegain <mirejai@orange.fr>, 2022. # cwulveryck <cwulveryck@online.fr>, 2022. # Helix Sir <vincentbarkmann@gmail.com>, 2022. +# SCHUTZ Lucas <lucas.schutz0954@gmail.com>, 2022. +# EGuillemot <Elouen.Guillemot@gmail.com>, 2022. +# Entiz <maxime.salido@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-08-05 01:04+0000\n" -"Last-Translator: Helix Sir <vincentbarkmann@gmail.com>\n" +"PO-Revision-Date: 2022-09-27 21:37+0000\n" +"Last-Translator: Entiz <maxime.salido@gmail.com>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/" "godot/fr/>\n" "Language: fr\n" @@ -116,7 +119,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -148,7 +151,7 @@ msgstr "Lissage de Delta" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode" -msgstr "Mode d'utilisation faible du processeur" +msgstr "Mode d'utilisation du processeur bas en ressources" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode Sleep (µsec)" @@ -226,7 +229,7 @@ msgstr "Échange d'Endians" #: core/bind/core_bind.cpp msgid "Editor Hint" -msgstr "Conseil(s) Éditeur" +msgstr "Suggestion d’éditeur" #: core/bind/core_bind.cpp msgid "Print Error Messages" @@ -242,7 +245,7 @@ msgstr "Cible de FPS" #: core/bind/core_bind.cpp msgid "Time Scale" -msgstr "Echelle de temps" +msgstr "Échelle de temps" #: core/bind/core_bind.cpp main/main.cpp msgid "Physics Jitter Fix" @@ -3045,7 +3048,7 @@ msgstr "Bibliothèque d'assets" #: editor/editor_feature_profile.cpp msgid "Scene Tree Editing" -msgstr "Édition de l'arbre de scène" +msgstr "Édition d'arborescence de scène" #: editor/editor_feature_profile.cpp msgid "Node Dock" @@ -3319,7 +3322,7 @@ msgstr "Accès" #: editor/editor_file_dialog.cpp editor/editor_settings.cpp msgid "Display Mode" -msgstr "Mode d'Affichage" +msgstr "Mode d'affichage" #: editor/editor_file_dialog.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -3876,7 +3879,7 @@ msgstr "Analyse" #: editor/editor_node.cpp msgid "Creating Thumbnail" -msgstr "Création de l'aperçu" +msgstr "Création de vignette" #: editor/editor_node.cpp msgid "This operation can't be done without a tree root." @@ -4150,7 +4153,7 @@ msgstr "Lancer une scène rapidement…" #: editor/editor_node.cpp msgid "Quit" -msgstr "Quitter" +msgstr "Fermer" #: editor/editor_node.cpp msgid "Yes" @@ -4171,13 +4174,13 @@ msgstr "" #: editor/editor_node.cpp msgid "Save & Quit" -msgstr "Sauvegarder & quitter" +msgstr "Sauvegarder & fermer" #: editor/editor_node.cpp msgid "Save changes to the following scene(s) before quitting?" msgstr "" "Sauvegarder les modifications sur la (les) scène(s) suivante(s) avant de " -"quitter ?" +"fermer ?" #: editor/editor_node.cpp msgid "Save changes to the following scene(s) before opening Project Manager?" @@ -4405,7 +4408,7 @@ msgstr "Toujours fermer la sortie à l'arrêt" #: editor/editor_node.cpp msgid "Save On Focus Loss" -msgstr "Enregistrer lorsque le focus est perdu" +msgstr "Enregistrer à la perte de focus" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Save Each Scene On Quit" @@ -4413,7 +4416,7 @@ msgstr "Enregistrer toutes les scènes à la fermeture" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Quit Confirmation" -msgstr "Confirmer avant de quitter" +msgstr "Confirmation avant la fermeture" #: editor/editor_node.cpp msgid "Show Update Spinner" @@ -4421,24 +4424,23 @@ msgstr "Afficher l'indicateur d'activité" #: editor/editor_node.cpp msgid "Update Continuously" -msgstr "Mettre à jour en continu" +msgstr "Mise à jour continue" #: editor/editor_node.cpp -#, fuzzy msgid "Update Vital Only" -msgstr "Changements de matériau" +msgstr "Mise à jour uniquement si vital" #: editor/editor_node.cpp msgid "Localize Settings" -msgstr "Traduction des réglages" +msgstr "Traduction des paramètres" #: editor/editor_node.cpp msgid "Restore Scenes On Load" -msgstr "Restaurer les scènes au chargement" +msgstr "Rouvrir les scènes au chargement" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Show Thumbnail On Hover" -msgstr "Afficher l’aperçu au survol" +msgstr "Afficher vignette au survol" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Inspector" @@ -4588,6 +4590,7 @@ msgstr "Outils divers liés au projet ou à la scène." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projet" @@ -5045,7 +5048,7 @@ msgstr "Création des prévisualisations des maillages" #: editor/editor_plugin.cpp msgid "Thumbnail..." -msgstr "Aperçu…" +msgstr "Vignette…" #: editor/editor_plugin_settings.cpp msgid "Main Script:" @@ -5339,15 +5342,15 @@ msgstr "Avez-vous oublié la méthode « _run » ?" #: editor/editor_settings.cpp msgid "Editor Language" -msgstr "Langue de l'Éditeur" +msgstr "Langue de l'éditeur" #: editor/editor_settings.cpp msgid "Display Scale" -msgstr "Échelle de l'affichage" +msgstr "Échelle d'affichage" #: editor/editor_settings.cpp msgid "Custom Display Scale" -msgstr "Échelle personnalisé de l'affichage" +msgstr "Échelle personnalisée d'affichage" #: editor/editor_settings.cpp msgid "Main Font Size" @@ -5363,7 +5366,7 @@ msgstr "Police anticrénelée" #: editor/editor_settings.cpp msgid "Font Hinting" -msgstr "Indication de police" +msgstr "Optimisation de rendu de police" #: editor/editor_settings.cpp msgid "Main Font" @@ -5371,11 +5374,11 @@ msgstr "Police Principale" #: editor/editor_settings.cpp msgid "Main Font Bold" -msgstr "Principale police grasse" +msgstr "Police principale en gras" #: editor/editor_settings.cpp msgid "Code Font" -msgstr "Police du Code" +msgstr "Police du code" #: editor/editor_settings.cpp msgid "Dim Editor On Dialog Popup" @@ -5465,7 +5468,7 @@ msgstr "Scan auto du chemin du projet" #: editor/editor_settings.cpp msgid "Default Project Path" -msgstr "Chemin du Projet par Défaut" +msgstr "Chemin de projet par défaut" #: editor/editor_settings.cpp msgid "On Save" @@ -5485,15 +5488,15 @@ msgstr "Fenêtre de sélection de fichiers" #: editor/editor_settings.cpp msgid "Thumbnail Size" -msgstr "Taille de la vignette" +msgstr "Taille de vignette" #: editor/editor_settings.cpp msgid "Docks" -msgstr "S'attache" +msgstr "Docks" #: editor/editor_settings.cpp msgid "Scene Tree" -msgstr "une arborescence, arbre des scènes" +msgstr "Arborescence de scène" #: editor/editor_settings.cpp msgid "Start Create Dialog Fully Expanded" @@ -5547,7 +5550,7 @@ msgstr "Surligner les lignes à types sûrs" #: editor/editor_settings.cpp msgid "Indent" -msgstr "Indenter" +msgstr "Indentation" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp msgid "Auto Indent" @@ -5574,7 +5577,7 @@ msgstr "Navigation" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Smooth Scrolling" -msgstr "Défilement Doux" +msgstr "Défilement doux" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "V Scroll Speed" @@ -5606,7 +5609,7 @@ msgstr "Apparence" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Show Line Numbers" -msgstr "Afficher les Numéros de Ligne" +msgstr "Afficher les numéros de Ligne" #: editor/editor_settings.cpp msgid "Line Numbers Zero Padded" @@ -5646,7 +5649,7 @@ msgstr "Colonne dure des guides de longueur de ligne" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp msgid "Script List" -msgstr "Liste des Scripts" +msgstr "Liste de scripts" #: editor/editor_settings.cpp msgid "Show Members Overview" @@ -5666,7 +5669,7 @@ msgstr "Intervalle entre les sauvegardes automatiques (en secondes)" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp msgid "Restore Scripts On Load" -msgstr "Restaurer les scripts au chargement" +msgstr "Rouvrir les scripts au chargement" #: editor/editor_settings.cpp msgid "Auto Reload And Parse Scripts On Save" @@ -5717,7 +5720,7 @@ msgstr "Complétion" #: editor/editor_settings.cpp msgid "Idle Parse Delay" -msgstr "" +msgstr "Délai du traitement passif" #: editor/editor_settings.cpp msgid "Auto Brace Complete" @@ -5757,11 +5760,11 @@ msgstr "Taille de la police de l'aide" #: editor/editor_settings.cpp msgid "Help Source Font Size" -msgstr "Taille de la police de l'aide de la source" +msgstr "Taille de police d'origine de l'aide" #: editor/editor_settings.cpp msgid "Help Title Font Size" -msgstr "Taille de la police du titre Aide" +msgstr "Taille de police du titre de l'aide" #: editor/editor_settings.cpp modules/gridmap/grid_map_editor_plugin.cpp msgid "Grid Map" @@ -5773,7 +5776,7 @@ msgstr "Choisissez la distance" #: editor/editor_settings.cpp editor/plugins/tile_map_editor_plugin.cpp msgid "Preview Size" -msgstr "Aperçu de la taille" +msgstr "Taille d'aperçu" #: editor/editor_settings.cpp msgid "Primary Grid Color" @@ -5821,7 +5824,7 @@ msgstr "Pas de la grille principale" #: editor/editor_settings.cpp msgid "Grid Size" -msgstr "Taille de la Grille" +msgstr "Taille de la grille" #: editor/editor_settings.cpp msgid "Grid Division Level Max" @@ -5833,7 +5836,7 @@ msgstr "Niveau minimal de division de la grille" #: editor/editor_settings.cpp msgid "Grid Division Level Bias" -msgstr "Niveau de biais de la division de grille" +msgstr "Niveau de biais de division de la grille" #: editor/editor_settings.cpp msgid "Grid XZ Plane" @@ -5877,11 +5880,11 @@ msgstr "Inverser l'axe X" #: editor/editor_settings.cpp msgid "Zoom Style" -msgstr "Style de Zoom" +msgstr "Style de zoom" #: editor/editor_settings.cpp msgid "Emulate Numpad" -msgstr "Émuler un pavé numérique" +msgstr "Émuler pavé numérique" #: editor/editor_settings.cpp msgid "Emulate 3 Button Mouse" @@ -5889,24 +5892,24 @@ msgstr "Émuler souris à 3 boutons" #: editor/editor_settings.cpp msgid "Orbit Modifier" -msgstr "Modificateur d'orbite" +msgstr "Touche de combinaison : Orbite" #: editor/editor_settings.cpp msgid "Pan Modifier" -msgstr "Modificateur panoramique" +msgstr "Touche de combinaison : Panoramique" #: editor/editor_settings.cpp msgid "Zoom Modifier" -msgstr "Multiplicateur de Zoom" +msgstr "Touche de combinaison : Zoom" #: editor/editor_settings.cpp editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Warped Mouse Panning" -msgstr "" +msgstr "Panoramique déformé de la souris" #: editor/editor_settings.cpp -#, fuzzy msgid "Navigation Feel" -msgstr "Mode Navigation" +msgstr "Préférences de navigation" #: editor/editor_settings.cpp msgid "Orbit Sensitivity" @@ -5914,15 +5917,15 @@ msgstr "Sensibilité de l'orbite" #: editor/editor_settings.cpp msgid "Orbit Inertia" -msgstr "Inertie de l'orbite" +msgstr "Inertie d'orbite" #: editor/editor_settings.cpp msgid "Translation Inertia" -msgstr "Inertie de la Translation" +msgstr "Inertie de la translation" #: editor/editor_settings.cpp msgid "Zoom Inertia" -msgstr "Inertie du Zoom" +msgstr "Inertie du zoom" #: editor/editor_settings.cpp msgid "Freelook" @@ -5946,7 +5949,7 @@ msgstr "Vitesse de base de la vue libre" #: editor/editor_settings.cpp msgid "Freelook Activation Modifier" -msgstr "Modificateur d'activation de la vue libre" +msgstr "Touche de combinaison : Activation vue libre" #: editor/editor_settings.cpp msgid "Freelook Speed Zoom Link" @@ -5954,7 +5957,7 @@ msgstr "Lien de zoom rapide de la vue libre" #: editor/editor_settings.cpp editor/plugins/tile_map_editor_plugin.cpp msgid "Grid Color" -msgstr "Couleur de la Grille" +msgstr "Couleur de la grille" #: editor/editor_settings.cpp msgid "Guides Color" @@ -5978,7 +5981,7 @@ msgstr "Couleur d'os 2" #: editor/editor_settings.cpp msgid "Bone Selected Color" -msgstr "Couleur de l'os sélectionnée" +msgstr "Couleur d'os sélectionné" #: editor/editor_settings.cpp msgid "Bone IK Color" @@ -5990,7 +5993,7 @@ msgstr "Couleur de contour d'os" #: editor/editor_settings.cpp msgid "Bone Outline Size" -msgstr "Taille du contour de l'os" +msgstr "Taille de contour d'os" #: editor/editor_settings.cpp msgid "Viewport Border Color" @@ -5998,7 +6001,7 @@ msgstr "Couleur de bordure de la fenêtre d'affichage" #: editor/editor_settings.cpp msgid "Constrain Editor View" -msgstr "Restreindre la fenêtre d'Éditeur" +msgstr "Restreindre la fenêtre d'éditeur" #: editor/editor_settings.cpp msgid "Simple Panning" @@ -6010,7 +6013,7 @@ msgstr "Panoramique au défilement" #: editor/editor_settings.cpp msgid "Pan Speed" -msgstr "Vitesse Panoramique" +msgstr "Vitesse panoramique" #: editor/editor_settings.cpp editor/plugins/polygon_2d_editor_plugin.cpp msgid "Poly Editor" @@ -6018,7 +6021,7 @@ msgstr "Éditeur de polygones" #: editor/editor_settings.cpp msgid "Point Grab Radius" -msgstr "Rayon de saisie par point" +msgstr "Rayon de saisie de point" #: editor/editor_settings.cpp editor/plugins/polygon_2d_editor_plugin.cpp msgid "Show Previous Outline" @@ -6156,28 +6159,27 @@ msgstr "Couleur des chaînes de caractères" #: platform/uwp/export/export.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Background Color" -msgstr "Couleur d’Arrière-Plan" +msgstr "Couleur d’arrière-plan" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Background Color" msgstr "Couleur d'arrière-plan de complétion" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Completion Selected Color" -msgstr "Importer la sélection" +msgstr "Couleur de la complétion sélectionnée" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Existing Color" -msgstr "" +msgstr "Couleur de la partie existante de la complétion" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Scroll Color" -msgstr "" +msgstr "Couleur de défilement de complétion" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Font Color" -msgstr "" +msgstr "Couleur de police de complétion" #: editor/editor_settings.cpp msgid "Text Color" @@ -6185,7 +6187,7 @@ msgstr "Couleur du Texte" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Line Number Color" -msgstr "Couleur du Numéro de Ligne" +msgstr "Couleur des numéros de lignes" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Safe Line Number Color" @@ -6236,9 +6238,8 @@ msgid "Member Variable Color" msgstr "Couleur des variables de membres" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Mark Color" -msgstr "Prélever une couleur" +msgstr "Couleur de la marque" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Bookmark Color" @@ -6976,9 +6977,8 @@ msgid "Delimiter" msgstr "Délimiteur" #: editor/import/resource_importer_layered_texture.cpp -#, fuzzy msgid "ColorCorrect" -msgstr "Correction de Couleur" +msgstr "ColorCorrect" #: editor/import/resource_importer_layered_texture.cpp msgid "No BPTC If RGB" @@ -7140,9 +7140,8 @@ msgid "Meshes" msgstr "Maillages" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Ensure Tangents" -msgstr "Modifier la tangente de courbes" +msgstr "Vérifier les tangentes" #: editor/import/resource_importer_scene.cpp msgid "Light Baking" @@ -7378,7 +7377,8 @@ msgid "8 Bit" msgstr "8 Bit" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "Mono" @@ -9313,7 +9313,7 @@ msgstr "Diviser le pas de la grille par 2" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Pan View" -msgstr "Vue panoramique" +msgstr "Panoramique de vue" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Zoom to 3.125%" @@ -10351,7 +10351,7 @@ msgstr "Paramètres de la grille" #: editor/plugins/polygon_2d_editor_plugin.cpp modules/csg/csg_shape.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Snap" -msgstr "Aligner" +msgstr "Magnétisme, Aimantation" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Enable Snap" @@ -10746,11 +10746,11 @@ msgstr "Taille de l'historique des températures de script" #: editor/plugins/script_editor_plugin.cpp msgid "Current Script Background Color" -msgstr "Couleur d'Arrière-Plan du Script Actuel" +msgstr "Couleur d'arrière-plan du script actuel" #: editor/plugins/script_editor_plugin.cpp msgid "Group Help Pages" -msgstr "Pages d'aide de groupe" +msgstr "Grouper les pages d'aide" #: editor/plugins/script_editor_plugin.cpp msgid "Sort Scripts By" @@ -11315,11 +11315,11 @@ msgstr "Vue libre bas" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Speed Modifier" -msgstr "Modificateur de vitesse de la vue libre" +msgstr "Touche de combinaison : Vitesse de vue libre" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Slow Modifier" -msgstr "Ralentissement de la vue libre" +msgstr "Touche de combinaison : Ralentissement de vue libre" #: editor/plugins/spatial_editor_plugin.cpp msgid "Toggle Camera Preview" @@ -12564,9 +12564,8 @@ msgid "Palette Min Width" msgstr "Largeur minimale de la palette" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Palette Item H Separation" -msgstr "Séparateur nommé" +msgstr "Séparation horizontale des éléments de palette" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Show Tile Names" @@ -12587,7 +12586,7 @@ msgstr "Aperçu du remplissage" #: editor/plugins/tile_map_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Editor Side" -msgstr "Coté Éditeur" +msgstr "Coté de l'éditeur" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Display Grid" @@ -15423,17 +15422,17 @@ msgstr "" msgid "Make Local" msgstr "Rendre local" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "Un autre NÅ“ud utilise ce nom unique dans la scène." +#: editor/scene_tree_dock.cpp +msgid "Enable Scene Unique Name(s)" +msgstr "Activer le(s) nom(s) unique(s) de scène" #: editor/scene_tree_dock.cpp -msgid "Enable Scene Unique Name" -msgstr "Activer le nom unique de la scène" +msgid "Unique names already used by another node in the scene:" +msgstr "Noms uniques déjà utilisés par un autre nÅ“ud de la scène :" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Disable Scene Unique Name" -msgstr "Désactiver le nom unique de la scène" +#: editor/scene_tree_dock.cpp +msgid "Disable Scene Unique Name(s)" +msgstr "Désactiver le(s) nom(s) unique(s) de la scène" #: editor/scene_tree_dock.cpp msgid "New Scene Root" @@ -15634,6 +15633,10 @@ msgid "Button Group" msgstr "Bouton de groupe" #: editor/scene_tree_editor.cpp +msgid "Disable Scene Unique Name" +msgstr "Désactiver le nom unique de la scène" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Connexion à partir de)" @@ -15712,6 +15715,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "Nom de nÅ“ud invalide, les caractères suivants ne sont pas autorisés :" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "Un autre NÅ“ud utilise ce nom unique dans la scène." + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Renommer le nÅ“ud" @@ -16082,7 +16089,7 @@ msgstr "Changer particules AABB" #: editor/spatial_editor_gizmos.cpp msgid "Reflection Probe" -msgstr "Sonde de Réflexion" +msgstr "Sonde de réflexion" #: editor/spatial_editor_gizmos.cpp msgid "Change Probe Extents" @@ -16090,7 +16097,7 @@ msgstr "Changer les ampleurs de la sonde" #: editor/spatial_editor_gizmos.cpp msgid "GI Probe" -msgstr "Sonde GI" +msgstr "Sonde d'illumination globale" #: editor/spatial_editor_gizmos.cpp msgid "Baked Indirect Light" @@ -16162,11 +16169,11 @@ msgstr "Définir la position du point de la pièce" #: editor/spatial_editor_gizmos.cpp scene/3d/portal.cpp msgid "Portal Margin" -msgstr "Marge du portail" +msgstr "Marge de portail" #: editor/spatial_editor_gizmos.cpp msgid "Portal Edge" -msgstr "Bords du portail" +msgstr "Bord de portail" #: editor/spatial_editor_gizmos.cpp msgid "Portal Arrow" @@ -16241,7 +16248,7 @@ msgstr "Serveur à tâches parallèles" #: main/main.cpp msgid "RID Pool Prealloc" -msgstr "" +msgstr "Pré-allocation des RIDs de pool" #: main/main.cpp msgid "Debugger stdout" @@ -16301,7 +16308,7 @@ msgstr "Se replier sur GLES2" #: main/main.cpp msgid "Use Nvidia Rect Flicker Workaround" -msgstr "" +msgstr "Utiliser la solution alternative Nvidia pour éviter le clignotement" #: main/main.cpp msgid "DPI" @@ -16349,7 +16356,7 @@ msgstr "Modèle de Parallélisme" #: main/main.cpp msgid "Thread Safe BVH" -msgstr "" +msgstr "BVH avec le parallélisme sécurisé" #: main/main.cpp msgid "Handheld" @@ -16375,7 +16382,7 @@ msgstr "Forces les trames par seconde" #: main/main.cpp msgid "Enable Pause Aware Picking" -msgstr "" +msgstr "Activer la sélection prenant en compte la mise en pause" #: main/main.cpp scene/gui/item_list.cpp scene/gui/popup_menu.cpp #: scene/gui/scroll_container.cpp scene/gui/text_edit.cpp scene/gui/tree.cpp @@ -16385,7 +16392,7 @@ msgstr "GUI" #: main/main.cpp msgid "Drop Mouse On GUI Input Disabled" -msgstr "" +msgstr "Lâcher la souris quand le saisie GUI est désactivée" #: main/main.cpp msgid "stdout" @@ -16417,7 +16424,7 @@ msgstr "Mode Processeur Faible" #: main/main.cpp msgid "Delta Sync After Draw" -msgstr "" +msgstr "Synchroniser le Delta Après l'Affichage" #: main/main.cpp msgid "iOS" @@ -16499,7 +16506,7 @@ msgstr "Mise en mémoire tampon" #: main/main.cpp msgid "Agile Event Flushing" -msgstr "" +msgstr "Purge d'événement agile" #: main/main.cpp msgid "Emulate Touch From Mouse" @@ -16519,7 +16526,7 @@ msgstr "Image personnalisée" #: main/main.cpp msgid "Custom Image Hotspot" -msgstr "" +msgstr "Point d'accès d'image personnalisé" #: main/main.cpp msgid "Tooltip Position Offset" @@ -16568,7 +16575,7 @@ msgstr "Accepter automatiquement la fermeture" #: main/main.cpp scene/main/scene_tree.cpp msgid "Quit On Go Back" -msgstr "Quitter au retour" +msgstr "Fermer sur retour" #: main/main.cpp scene/main/viewport.cpp msgid "Snap Controls To Pixels" @@ -16584,11 +16591,11 @@ msgstr "Utiliser le suréchantillonnage" #: modules/bullet/register_types.cpp modules/bullet/space_bullet.cpp msgid "Active Soft World" -msgstr "" +msgstr "Activer le support des SoftBody par le Monde" #: modules/csg/csg_gizmos.cpp msgid "CSG" -msgstr "" +msgstr "GCS" #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" @@ -16694,9 +16701,8 @@ msgid "Path Node" msgstr "Noeud de chemin" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Interval Type" -msgstr "Créer un vertex interne" +msgstr "Type d'intervalle de chemin" #: modules/csg/csg_shape.cpp msgid "Path Interval" @@ -16979,17 +16985,16 @@ msgid "Max" msgstr "Max" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Sparse Count" -msgstr "Instance" +msgstr "Comptage épars" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Indices Buffer View" -msgstr "" +msgstr "Affichage tampon des indices épars" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Indices Byte Offset" -msgstr "" +msgstr "Décalage d'octet des indices épars" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Indices Component Type" @@ -16997,11 +17002,11 @@ msgstr "Type de composant d'indices épars" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Values Buffer View" -msgstr "" +msgstr "Affichage tampon des valeurs éparses" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Values Byte Offset" -msgstr "" +msgstr "Décalage d'octet des valeurs éparses" #: modules/gltf/gltf_buffer_view.cpp msgid "Buffer" @@ -17009,16 +17014,15 @@ msgstr "Tampon" #: modules/gltf/gltf_buffer_view.cpp msgid "Byte Length" -msgstr "Longueur de byte" +msgstr "Longueur d'octet" #: modules/gltf/gltf_buffer_view.cpp msgid "Byte Stride" -msgstr "" +msgstr "Foulée d'octet" #: modules/gltf/gltf_buffer_view.cpp -#, fuzzy msgid "Indices" -msgstr "Tous les périphérique" +msgstr "Indices" #: modules/gltf/gltf_camera.cpp msgid "FOV Size" @@ -17026,12 +17030,11 @@ msgstr "Taille du FOV" #: modules/gltf/gltf_camera.cpp msgid "Zfar" -msgstr "" +msgstr "Zfar" #: modules/gltf/gltf_camera.cpp -#, fuzzy msgid "Znear" -msgstr "Linéaire" +msgstr "Znear" #: modules/gltf/gltf_light.cpp scene/2d/canvas_modulate.cpp #: scene/2d/cpu_particles_2d.cpp scene/2d/light_2d.cpp scene/2d/polygon_2d.cpp @@ -17055,16 +17058,15 @@ msgstr "Plage" #: modules/gltf/gltf_light.cpp msgid "Inner Cone Angle" -msgstr "" +msgstr "Angle intérieur du cône" #: modules/gltf/gltf_light.cpp msgid "Outer Cone Angle" -msgstr "" +msgstr "Angle extérieur du cône" #: modules/gltf/gltf_mesh.cpp -#, fuzzy msgid "Blend Weights" -msgstr "Précalculer les lightmaps" +msgstr "Mélanger les poids" #: modules/gltf/gltf_mesh.cpp msgid "Instance Materials" @@ -17075,9 +17077,8 @@ msgid "Parent" msgstr "Parent" #: modules/gltf/gltf_node.cpp -#, fuzzy msgid "Xform" -msgstr "Plateforme" +msgstr "Xform" #: modules/gltf/gltf_node.cpp scene/3d/mesh_instance.cpp msgid "Skin" @@ -17152,8 +17153,9 @@ msgid "Specular Factor" msgstr "Facteur Spéculaire" #: modules/gltf/gltf_spec_gloss.cpp +#, fuzzy msgid "Spec Gloss Img" -msgstr "" +msgstr "Img Spéculaire Brillante" #: modules/gltf/gltf_state.cpp msgid "Json" @@ -17237,9 +17239,8 @@ msgid "Physics Material" msgstr "Matériau physique" #: modules/gridmap/grid_map.cpp scene/3d/visual_instance.cpp -#, fuzzy msgid "Use In Baked Light" -msgstr "Précalculer les lightmaps" +msgstr "Utiliser des lumières pré-calculées" #: modules/gridmap/grid_map.cpp scene/2d/tile_map.cpp msgid "Cell" @@ -17436,9 +17437,8 @@ msgid "Plotting lightmaps" msgstr "Tracer des lightmaps" #: modules/lightmapper_cpu/register_types.cpp -#, fuzzy msgid "CPU Lightmapper" -msgstr "Précalculer les lightmaps" +msgstr "Mappeur de lumière processeur" #: modules/lightmapper_cpu/register_types.cpp msgid "Low Quality Ray Count" @@ -17469,16 +17469,15 @@ msgstr "Hauteur de l’œil" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "IOD" -msgstr "" +msgstr "Distance interoculaire" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "Display Width" msgstr "Afficher la largeur" #: modules/mobile_vr/mobile_vr_interface.cpp -#, fuzzy msgid "Display To Lens" -msgstr "Afficher sans ombrage" +msgstr "Distance affichage-lentille" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "Oversample" @@ -17504,6 +17503,18 @@ msgstr "Compiler la solution" msgid "Auto Update Project" msgstr "Mettre à jour le projet automatiquement" +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "Nom de l'assembly" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "Choisir un répertoire pour la solution" + +#: modules/mono/godotsharp_dirs.cpp +msgid "C# Project Directory" +msgstr "Choisir un répertoire pour le projet C#" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Fin de la trace d'appel (stack trace) intrinsèque" @@ -17625,7 +17636,7 @@ msgstr "Paramètres" #: modules/upnp/upnp.cpp msgid "Discover Multicast If" -msgstr "" +msgstr "Révéler la multidiffusion si" #: modules/upnp/upnp.cpp msgid "Discover Local Port" @@ -17633,7 +17644,7 @@ msgstr "Révéler le port local" #: modules/upnp/upnp.cpp msgid "Discover IPv6" -msgstr "Découvrir IPv6" +msgstr "Révéler IPv6" #: modules/upnp/upnp_device.cpp msgid "Description URL" @@ -17653,7 +17664,7 @@ msgstr "Type de service IGD" #: modules/upnp/upnp_device.cpp msgid "IGD Our Addr" -msgstr "" +msgstr "Notre adresse PGI" #: modules/upnp/upnp_device.cpp msgid "IGD Status" @@ -18030,9 +18041,8 @@ msgid "Return" msgstr "Retour" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Return Enabled" -msgstr "Exécutable" +msgstr "Retour activé" #: modules/visual_script/visual_script_flow_control.cpp msgid "Return Type" @@ -18455,12 +18465,11 @@ msgstr "Fonctionnalités Optionnelles" #: modules/webxr/webxr_interface.cpp msgid "Requested Reference Space Types" -msgstr "" +msgstr "Types d'espaces référence requis" #: modules/webxr/webxr_interface.cpp -#, fuzzy msgid "Reference Space Type" -msgstr "Type de référentiel spatial" +msgstr "Type d'espace de référence" #: modules/webxr/webxr_interface.cpp msgid "Visibility State" @@ -18471,26 +18480,24 @@ msgid "Bounds Geometry" msgstr "Géométrie des limites" #: modules/webxr/webxr_interface.cpp -#, fuzzy msgid "XR Standard Mapping" -msgstr "Magnétisme intelligent" +msgstr "Mappage Standard XR" #: platform/android/export/export.cpp msgid "Android SDK Path" msgstr "Chemin du SDK Android" #: platform/android/export/export.cpp -#, fuzzy msgid "Debug Keystore" -msgstr "Débogueur" +msgstr "Keystore de débogage" #: platform/android/export/export.cpp msgid "Debug Keystore User" -msgstr "" +msgstr "Utilisateur du Keystore de débogage" #: platform/android/export/export.cpp msgid "Debug Keystore Pass" -msgstr "" +msgstr "Passe du Keystore de débogage" #: platform/android/export/export.cpp msgid "Force System User" @@ -18570,9 +18577,8 @@ msgid "Architectures" msgstr "Architectures" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Keystore" -msgstr "Débogueur" +msgstr "Keystore" #: platform/android/export/export_plugin.cpp msgid "Debug User" @@ -18659,24 +18665,20 @@ msgid "Immersive Mode" msgstr "Mode immersif" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Support Small" -msgstr "Support" +msgstr "Supporte les petits écrans" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Support Normal" -msgstr "Support" +msgstr "Supporte les écrans normaux" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Support Large" -msgstr "Support" +msgstr "Supporte les grands écrans" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Support Xlarge" -msgstr "Support" +msgstr "Supporte les très grands écrans" #: platform/android/export/export_plugin.cpp msgid "User Data Backup" @@ -18695,9 +18697,8 @@ msgid "Extra Args" msgstr "Arguments Supplémentaires" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "APK Expansion" -msgstr "Expression" +msgstr "Expansion APK" #: platform/android/export/export_plugin.cpp msgid "Salt" @@ -19089,7 +19090,7 @@ msgstr "Le caractère « %s » n'est pas autorisé dans l'identifiant." #: platform/iphone/export/export.cpp msgid "Landscape Launch Screens" -msgstr "" +msgstr "Écrans de lancement en mode paysage" #: platform/iphone/export/export.cpp msgid "iPhone 2436 X 1125" @@ -19266,11 +19267,11 @@ msgstr "Projecteur 80 X 80" #: platform/iphone/export/export.cpp msgid "Storyboard" -msgstr "" +msgstr "Storyboard" #: platform/iphone/export/export.cpp msgid "Use Launch Screen Storyboard" -msgstr "" +msgstr "Utiliser le storyboard de l'écran de lancement" #: platform/iphone/export/export.cpp msgid "Image Scale Mode" @@ -19292,6 +19293,10 @@ msgstr "Utiliser la couleur d'arrière-plan personnalisée" msgid "Custom BG Color" msgstr "Couleur d'arrière-plan personnalisée" +#: platform/iphone/export/export.cpp +msgid "Export Icons" +msgstr "Exporter les icônes" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19343,7 +19348,7 @@ msgstr "Impossible de lire le fichier : «%s »." #: platform/javascript/export/export.cpp msgid "PWA" -msgstr "" +msgstr "PWA" #: platform/javascript/export/export.cpp msgid "Variant" @@ -19598,7 +19603,7 @@ msgstr "Autoriser l'exécution du code JIT" #: platform/osx/export/export.cpp msgid "Allow Unsigned Executable Memory" -msgstr "" +msgstr "Autoriser la mémoire exécutable non signée" #: platform/osx/export/export.cpp msgid "Allow Dyld Environment Variables" @@ -19653,7 +19658,6 @@ msgid "Device Bluetooth" msgstr "Périphérique Bluetooth" #: platform/osx/export/export.cpp -#, fuzzy msgid "Files Downloads" msgstr "Téléchargement de fichiers" @@ -20126,6 +20130,14 @@ msgid "Show Name On Square 310 X 310" msgstr "Afficher le nom sur le carré 310 X 310" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" +"La version Mono de Godot ne supporte pas la plateforme UWP. Utilisé la " +"version standard (sans le support C#) si vous souhaitez cibler UWP." + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Nom abrégé du paquet invalide." @@ -20147,7 +20159,7 @@ msgstr "GUID éditeur invalide." #: platform/uwp/export/export.cpp msgid "Invalid background color." -msgstr "Couleur de fond invalide." +msgstr "Couleur d'arrière-plan invalide." #: platform/uwp/export/export.cpp msgid "Invalid Store Logo image dimensions (should be 50x50)." @@ -20219,9 +20231,8 @@ msgid "Timestamp Server URL" msgstr "URL du serveur d'horodatage" #: platform/windows/export/export.cpp -#, fuzzy msgid "Digest Algorithm" -msgstr "Débogueur" +msgstr "Fonction de hachage" #: platform/windows/export/export.cpp msgid "Modify Resources" @@ -20256,14 +20267,12 @@ msgid "Resources Modification" msgstr "Modification de ressources" #: platform/windows/export/export.cpp -#, fuzzy msgid "Could not find rcedit executable at \"%s\"." -msgstr "Impossible de trouver le keystore, impossible d'exporter." +msgstr "Impossible de trouver rcedit à l'emplacement \"%s\"." #: platform/windows/export/export.cpp -#, fuzzy msgid "Could not find wine executable at \"%s\"." -msgstr "Impossible de trouver le keystore, impossible d'exporter." +msgstr "Impossible de trouver wine à l'emplacement \"%s\"." #: platform/windows/export/export.cpp #, fuzzy @@ -20341,9 +20350,8 @@ msgid "Windows executables cannot be >= 4 GiB." msgstr "Les exécutables Windows ne peuvent pas peser >= 4Gio." #: platform/windows/export/export.cpp platform/x11/export/export.cpp -#, fuzzy msgid "Failed to open executable file \"%s\"." -msgstr "Fichier exécutable invalide." +msgstr "Fichier exécutable invalide : \"%s\"." #: platform/windows/export/export.cpp platform/x11/export/export.cpp msgid "Executable file header corrupted." @@ -22224,8 +22232,9 @@ msgid "Include In Bound" msgstr "" #: scene/3d/cull_instance.cpp +#, fuzzy msgid "Allow Merging" -msgstr "" +msgstr "Autoriser la fusion" #: scene/3d/cull_instance.cpp msgid "Autoplace Priority" @@ -22956,7 +22965,7 @@ msgstr "" #: scene/3d/proximity_group.cpp msgid "Grid Radius" -msgstr "Rayon de la Grille" +msgstr "Rayon de la grille" #: scene/3d/ray_cast.cpp msgid "Debug Shape" @@ -22972,7 +22981,7 @@ msgstr "Mode de mise à jour" #: scene/3d/reflection_probe.cpp msgid "Origin Offset" -msgstr "Décalage de la Grille" +msgstr "Décalage de l'origine" #: scene/3d/reflection_probe.cpp msgid "Box Projection" @@ -23131,9 +23140,8 @@ msgid "Overlap Warning Threshold" msgstr "" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Preview Camera" -msgstr "Aperçu" +msgstr "Aperçu de caméra" #: scene/3d/room_manager.cpp msgid "Portal Depth Limit" @@ -23261,8 +23269,9 @@ msgid "Volume Stiffness" msgstr "" #: scene/3d/soft_body.cpp +#, fuzzy msgid "Pressure Coefficient" -msgstr "" +msgstr "Coefficient de pression" #: scene/3d/soft_body.cpp msgid "Damping Coefficient" @@ -23297,12 +23306,11 @@ msgstr "Transformation Globale" #: scene/3d/spatial.cpp msgid "Matrix" -msgstr "" +msgstr "Matrice" #: scene/3d/spatial.cpp -#, fuzzy msgid "Gizmo" -msgstr "Gadgets" +msgstr "Gizmo" #: scene/3d/spatial_velocity_tracker.cpp #, fuzzy @@ -23311,16 +23319,15 @@ msgstr "Image physique %" #: scene/3d/spring_arm.cpp msgid "Spring Length" -msgstr "" +msgstr "Longueur du ressort" #: scene/3d/sprite_3d.cpp scene/gui/graph_edit.cpp msgid "Opacity" -msgstr "" +msgstr "Opacité" #: scene/3d/sprite_3d.cpp scene/resources/material.cpp -#, fuzzy msgid "Transparent" -msgstr "Transposer" +msgstr "Transparent" #: scene/3d/sprite_3d.cpp msgid "" @@ -23339,26 +23346,24 @@ msgstr "" "l'utiliser comme enfant d'un VehicleBody." #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Per-Wheel Motion" -msgstr "Molette vers le bas" +msgstr "Mouvement par roue" #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Engine Force" -msgstr "Documentation en ligne" +msgstr "Force du moteur" #: scene/3d/vehicle_body.cpp msgid "Brake" -msgstr "" +msgstr "Frein" #: scene/3d/vehicle_body.cpp msgid "Steering" -msgstr "" +msgstr "Direction" #: scene/3d/vehicle_body.cpp msgid "VehicleBody Motion" -msgstr "" +msgstr "Mouvement du VehicleBody" #: scene/3d/vehicle_body.cpp msgid "Use As Traction" @@ -23366,7 +23371,7 @@ msgstr "Utiliser comme traction" #: scene/3d/vehicle_body.cpp msgid "Use As Steering" -msgstr "" +msgstr "Utiliser comme direction" #: scene/3d/vehicle_body.cpp msgid "Wheel" @@ -23374,68 +23379,59 @@ msgstr "Molette" #: scene/3d/vehicle_body.cpp msgid "Roll Influence" -msgstr "" +msgstr "Influence de rotation" #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Friction Slip" -msgstr "Fonction" +msgstr "Glissement par friction" #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Suspension" -msgstr "Expression" +msgstr "Suspension" #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Max Force" -msgstr "Erreur" +msgstr "Force max" #: scene/3d/visibility_notifier.cpp msgid "AABB" -msgstr "" +msgstr "AABB" #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Geometry" -msgstr "Réessayer" +msgstr "Géométrie" #: scene/3d/visual_instance.cpp -#, fuzzy msgid "Material Override" -msgstr "Redéfinition" +msgstr "Redéfinition du matériau" #: scene/3d/visual_instance.cpp msgid "Material Overlay" msgstr "Superposition de Matériau" #: scene/3d/visual_instance.cpp -#, fuzzy msgid "Cast Shadow" -msgstr "Créer un nÅ“ud Shader" +msgstr "Projeter des ombres" #: scene/3d/visual_instance.cpp msgid "Extra Cull Margin" msgstr "Marge supplémentaire de détermination des faces cachées" #: scene/3d/visual_instance.cpp -#, fuzzy msgid "Baked Light" -msgstr "Précalculer les lightmaps" +msgstr "Lumières pré-calculées" #: scene/3d/visual_instance.cpp -#, fuzzy msgid "Generate Lightmap" -msgstr "Génération des lightmaps" +msgstr "Générer des lightmaps" #: scene/3d/visual_instance.cpp -#, fuzzy msgid "Lightmap Scale" -msgstr "LightMap Bake" +msgstr "Échelle de Lightmap" #: scene/3d/visual_instance.cpp msgid "LOD" -msgstr "" +msgstr "Niveau de détail (LOD)" #: scene/3d/visual_instance.cpp scene/animation/skeleton_ik.cpp #: scene/resources/material.cpp @@ -23444,11 +23440,11 @@ msgstr "Distance Minimale" #: scene/3d/visual_instance.cpp msgid "Min Hysteresis" -msgstr "" +msgstr "Hystérèse min" #: scene/3d/visual_instance.cpp msgid "Max Hysteresis" -msgstr "" +msgstr "Hystérèse max" #: scene/3d/world_environment.cpp msgid "" @@ -23483,9 +23479,8 @@ msgid "Animation not found: '%s'" msgstr "Animation introuvable : « %s »" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Mix Mode" -msgstr "Mélanger le nÅ“ud" +msgstr "Mode de mélange" #: scene/animation/animation_blend_tree.cpp msgid "Fadein Time" @@ -23505,30 +23500,27 @@ msgstr "Redémarrage Automatique" #: scene/animation/animation_blend_tree.cpp msgid "Delay" -msgstr "" +msgstr "Délai" #: scene/animation/animation_blend_tree.cpp msgid "Random Delay" msgstr "Retard aléatoire" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Add Amount" -msgstr "Quantité" +msgstr "Ajouter une quantité" #: scene/animation/animation_blend_tree.cpp msgid "Blend Amount" msgstr "Quantité de mélange" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Seek Position" -msgstr "Définir position d'entrée de la courbe" +msgstr "Chercher la position" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Input Count" -msgstr "Ajouter un port d'entrée" +msgstr "Nombre d'entrées" #: scene/animation/animation_blend_tree.cpp #: scene/animation/animation_node_state_machine.cpp @@ -23538,58 +23530,51 @@ msgstr "Durée du fondu croisé" #: scene/animation/animation_node_state_machine.cpp #, fuzzy msgid "Switch Mode" -msgstr "Switch" +msgstr "Mode de Switch" #: scene/animation/animation_node_state_machine.cpp -#, fuzzy msgid "Auto Advance" -msgstr "Définir la progression automatique" +msgstr "Progression automatique" #: scene/animation/animation_node_state_machine.cpp -#, fuzzy msgid "Advance Condition" -msgstr "Options avancées" +msgstr "Condition de progression" #: scene/animation/animation_player.cpp msgid "Anim Apply Reset" msgstr "Animer Appliquer Réinitialiser" #: scene/animation/animation_player.cpp -#, fuzzy msgid "Current Animation" -msgstr "Définir l'animation" +msgstr "Animation actuelle" #: scene/animation/animation_player.cpp -#, fuzzy msgid "Assigned Animation" -msgstr "Ajouter une Animation" +msgstr "Animation assignée" #: scene/animation/animation_player.cpp msgid "Reset On Save" -msgstr "" +msgstr "Réinitialiser en sauvegardant" #: scene/animation/animation_player.cpp -#, fuzzy msgid "Current Animation Length" -msgstr "Modifier la durée de l’animation" +msgstr "Durée de l’animation actuelle" #: scene/animation/animation_player.cpp -#, fuzzy msgid "Current Animation Position" -msgstr "Ajouter un point d'animation" +msgstr "Position dans l'animation actuelle" #: scene/animation/animation_player.cpp msgid "Playback Options" msgstr "Options de Lecture" #: scene/animation/animation_player.cpp -#, fuzzy msgid "Default Blend Time" -msgstr "Thème par défaut" +msgstr "Temps de fondu par défaut" #: scene/animation/animation_player.cpp msgid "Method Call Mode" -msgstr "" +msgstr "Mode d'appel de méthode" #: scene/animation/animation_tree.cpp msgid "In node '%s', invalid animation: '%s'." @@ -23627,18 +23612,16 @@ msgid "Tree Root" msgstr "Racine de l’Arbre" #: scene/animation/animation_tree.cpp -#, fuzzy msgid "Anim Player" -msgstr "Épingler AnimationPlayer" +msgstr "Animation Player" #: scene/animation/animation_tree.cpp msgid "Root Motion" -msgstr "" +msgstr "Mouvement de racine" #: scene/animation/animation_tree.cpp -#, fuzzy msgid "Track" -msgstr "Ajouter une piste" +msgstr "Piste" #: scene/animation/animation_tree_player.cpp msgid "This node has been deprecated. Use AnimationTree instead." @@ -23655,66 +23638,56 @@ msgid "Master Player" msgstr "Coller les paramètres" #: scene/animation/animation_tree_player.cpp -#, fuzzy msgid "Base Path" -msgstr "Chemin d'exportation" +msgstr "Chemin de base" #: scene/animation/root_motion_view.cpp -#, fuzzy msgid "Animation Path" -msgstr "Animation" +msgstr "Chemin d'animation" #: scene/animation/root_motion_view.cpp -#, fuzzy msgid "Zero Y" -msgstr "Zéro" +msgstr "Mettre Y à zéro" #: scene/animation/skeleton_ik.cpp -#, fuzzy msgid "Root Bone" -msgstr "Nom de nÅ“ud racine" +msgstr "Os racine" #: scene/animation/skeleton_ik.cpp -#, fuzzy msgid "Tip Bone" -msgstr "Os" +msgstr "Os d'extrémité" #: scene/animation/skeleton_ik.cpp -#, fuzzy msgid "Interpolation" -msgstr "Mode d’interpolation" +msgstr "Interpolation" #: scene/animation/skeleton_ik.cpp -#, fuzzy msgid "Override Tip Basis" -msgstr "Redéfinition" +msgstr "Redéfinir la base d’extrémité" #: scene/animation/skeleton_ik.cpp msgid "Use Magnet" -msgstr "" +msgstr "Utiliser le magnétisme" #: scene/animation/skeleton_ik.cpp msgid "Magnet" -msgstr "" +msgstr "Magnétisme" #: scene/animation/skeleton_ik.cpp -#, fuzzy msgid "Target Node" -msgstr "Re-parenter le nÅ“ud" +msgstr "NÅ“ud cible" #: scene/animation/skeleton_ik.cpp -#, fuzzy msgid "Max Iterations" -msgstr "Faire fonction" +msgstr "Itérations max" #: scene/animation/tween.cpp msgid "Playback Process Mode" -msgstr "" +msgstr "Mode du processus de lecture" #: scene/animation/tween.cpp -#, fuzzy msgid "Playback Speed" -msgstr "Lancer la scène" +msgstr "Vitesse de lecture" #: scene/audio/audio_stream_player.cpp #, fuzzy @@ -23723,29 +23696,25 @@ msgstr "Cible" #: scene/gui/aspect_ratio_container.cpp scene/gui/range.cpp #: servers/audio/effects/audio_effect_compressor.cpp -#, fuzzy msgid "Ratio" -msgstr "Conserver les Proportions" +msgstr "Ratio" #: scene/gui/aspect_ratio_container.cpp scene/gui/texture_button.cpp #: scene/gui/texture_rect.cpp -#, fuzzy msgid "Stretch Mode" -msgstr "Mode sélection" +msgstr "Mode d’étirement" #: scene/gui/aspect_ratio_container.cpp scene/gui/box_container.cpp msgid "Alignment" -msgstr "" +msgstr "Alignement" #: scene/gui/base_button.cpp -#, fuzzy msgid "Shortcut In Tooltip" -msgstr "Afficher l'origine" +msgstr "Raccourci dans l'info-bulle" #: scene/gui/base_button.cpp -#, fuzzy msgid "Action Mode" -msgstr "Mode Icône" +msgstr "Mode d'action" #: scene/gui/base_button.cpp msgid "Enabled Focus Mode" @@ -23756,14 +23725,12 @@ msgid "Keep Pressed Outside" msgstr "" #: scene/gui/base_button.cpp scene/gui/shortcut.cpp -#, fuzzy msgid "Shortcut" -msgstr "Raccourcis" +msgstr "Raccourci" #: scene/gui/base_button.cpp -#, fuzzy msgid "Group" -msgstr "Groupes" +msgstr "Groupe" #: scene/gui/button.cpp scene/gui/label.cpp #, fuzzy @@ -23773,11 +23740,11 @@ msgstr "Copier le texte" #: scene/gui/button.cpp scene/gui/label.cpp scene/gui/line_edit.cpp #: scene/gui/spin_box.cpp msgid "Align" -msgstr "" +msgstr "Aligner" #: scene/gui/button.cpp msgid "Icon Align" -msgstr "" +msgstr "Aligner l'icône" #: scene/gui/button.cpp #, fuzzy @@ -23785,9 +23752,8 @@ msgid "Expand Icon" msgstr "Développer tout" #: scene/gui/center_container.cpp -#, fuzzy msgid "Use Top Left" -msgstr "En haut à gauche" +msgstr "Utiliser haut à gauche" #: scene/gui/color_picker.cpp msgid "" @@ -23800,34 +23766,28 @@ msgstr "" "Clic droit : Supprimer le préréglage" #: scene/gui/color_picker.cpp -#, fuzzy msgid "Edit Alpha" -msgstr "Modifier le polygone" +msgstr "Modifier alpha" #: scene/gui/color_picker.cpp -#, fuzzy msgid "HSV Mode" -msgstr "Mode sélection" +msgstr "Mode HSV" #: scene/gui/color_picker.cpp -#, fuzzy msgid "Raw Mode" -msgstr "Mode navigation" +msgstr "Mode brut" #: scene/gui/color_picker.cpp -#, fuzzy msgid "Deferred Mode" -msgstr "Différé" +msgstr "Mode différé" #: scene/gui/color_picker.cpp -#, fuzzy msgid "Presets Enabled" -msgstr "Préréglages" +msgstr "Préréglages activés" #: scene/gui/color_picker.cpp -#, fuzzy msgid "Presets Visible" -msgstr "Rendre visible" +msgstr "Préréglages visibles" #: scene/gui/color_picker.cpp msgid "Pick a color from the editor window." @@ -23857,9 +23817,8 @@ msgstr "" "Control." #: scene/gui/control.cpp -#, fuzzy msgid "Theme Overrides" -msgstr "Redéfinition" +msgstr "Redéfinitions de thème" #: scene/gui/control.cpp msgid "" @@ -23871,14 +23830,12 @@ msgstr "" "souris sur \"Stop\" ou \"Pass\"." #: scene/gui/control.cpp -#, fuzzy msgid "Anchor" -msgstr "Uniquement les ancres" +msgstr "Ancre" #: scene/gui/control.cpp -#, fuzzy msgid "Grow Direction" -msgstr "Directions" +msgstr "Direction d'expansion" #: scene/gui/control.cpp scene/resources/navigation_mesh.cpp msgid "Min Size" @@ -23895,12 +23852,11 @@ msgstr "Constante de classe" #: scene/gui/control.cpp scene/resources/visual_shader_nodes.cpp msgid "Hint" -msgstr "" +msgstr "Suggestion" #: scene/gui/control.cpp -#, fuzzy msgid "Tooltip" -msgstr "Outils" +msgstr "Info-bulle" #: scene/gui/control.cpp scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -23909,20 +23865,19 @@ msgstr "Focaliser le chemin" #: scene/gui/control.cpp msgid "Neighbour Left" -msgstr "" +msgstr "Voisin gauche" #: scene/gui/control.cpp msgid "Neighbour Top" -msgstr "" +msgstr "Voisin au dessus" #: scene/gui/control.cpp msgid "Neighbour Right" -msgstr "" +msgstr "Voisin à droite" #: scene/gui/control.cpp -#, fuzzy msgid "Neighbour Bottom" -msgstr "Centrée en bas" +msgstr "Voisin en dessous" #: scene/gui/control.cpp msgid "Next" @@ -23934,7 +23889,7 @@ msgstr "Précédent" #: scene/gui/control.cpp msgid "Mouse" -msgstr "" +msgstr "Souris" #: scene/gui/control.cpp msgid "Default Cursor Shape" @@ -23949,9 +23904,8 @@ msgid "Size Flags" msgstr "Drapeaux de Taille" #: scene/gui/control.cpp -#, fuzzy msgid "Stretch Ratio" -msgstr "Mode sélection" +msgstr "Ratio d’étirement" #: scene/gui/control.cpp #, fuzzy @@ -23960,12 +23914,11 @@ msgstr "Propriétés du thème" #: scene/gui/dialogs.cpp msgid "Window Title" -msgstr "" +msgstr "Titre de la fenêtre" #: scene/gui/dialogs.cpp -#, fuzzy msgid "Dialog" -msgstr "Dialogue XForm" +msgstr "Boîte de dialogue" #: scene/gui/dialogs.cpp msgid "Hide On OK" @@ -24247,12 +24200,11 @@ msgstr "" #: scene/gui/popup.cpp #, fuzzy msgid "Popup" -msgstr "Peupler" +msgstr "Fenêtre contextuelle" #: scene/gui/popup.cpp -#, fuzzy msgid "Exclusive" -msgstr "Inclusif" +msgstr "Exclusif" #: scene/gui/popup.cpp msgid "" @@ -24260,34 +24212,31 @@ msgid "" "functions. Making them visible for editing is fine, but they will hide upon " "running." msgstr "" -"Les pop-ups seront cachées par défaut jusqu'à ce que vous appeliez une " -"fonction popup() ou une des fonctions popup*(). Les rendre visibles pour " -"l'édition ne pose pas de problème, mais elles seront cachées lors de " -"l'exécution." +"Les fenêtres contextuelles seront cachées par défaut jusqu'à ce que vous " +"appeliez une fonction popup() ou une des fonctions popup*(). Les rendre " +"visibles pour l'édition ne pose pas de problème, mais elles seront cachées " +"lors de l'exécution." #: scene/gui/popup_menu.cpp -#, fuzzy msgid "Hide On Item Selection" -msgstr "Centrer sur la sélection" +msgstr "Masquer lors de la sélection de l'élément" #: scene/gui/popup_menu.cpp -#, fuzzy msgid "Hide On Checkable Item Selection" -msgstr "Suppression de la sélection de GridMap" +msgstr "Masquer lors de la sélection de l'élément cochable" #: scene/gui/popup_menu.cpp -#, fuzzy msgid "Hide On State Item Selection" -msgstr "Supprimer la sélection" +msgstr "Cacher lors de la sélection de l'élément d'état" #: scene/gui/popup_menu.cpp +#, fuzzy msgid "Submenu Popup Delay" -msgstr "" +msgstr "Délai du pop-up du sous-menu" #: scene/gui/popup_menu.cpp -#, fuzzy msgid "Allow Search" -msgstr "Rechercher" +msgstr "Autoriser la recherche" #: scene/gui/progress_bar.cpp msgid "Percent" @@ -24295,59 +24244,54 @@ msgstr "Pourcentage" #: scene/gui/range.cpp msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." -msgstr "Si « Exp Edit » est vrai, « Min Value » doit être supérieur à 0." +msgstr "" +"Si \"Édition Exponentielle\" est activée, \"Valeur Minimale\" doit être " +"supérieure à 0." #: scene/gui/range.cpp scene/resources/curve.cpp -#, fuzzy msgid "Min Value" -msgstr "Épingler la valeur" +msgstr "Valeur minimale" #: scene/gui/range.cpp scene/resources/curve.cpp -#, fuzzy msgid "Max Value" -msgstr "Valeur" +msgstr "Valeur maximale" #: scene/gui/range.cpp msgid "Page" msgstr "Page" #: scene/gui/range.cpp -#, fuzzy msgid "Exp Edit" -msgstr "Édition" +msgstr "Édition Exponentielle" #: scene/gui/range.cpp #, fuzzy msgid "Rounded" -msgstr "Groupé" +msgstr "Arrondir" #: scene/gui/range.cpp msgid "Allow Greater" -msgstr "" +msgstr "Autoriser supérieur" #: scene/gui/range.cpp msgid "Allow Lesser" -msgstr "" +msgstr "Autoriser inférieur" #: scene/gui/reference_rect.cpp -#, fuzzy msgid "Border Color" -msgstr "Renommer l'item de couleur" +msgstr "Couleur de la bordure" #: scene/gui/reference_rect.cpp scene/resources/style_box.cpp -#, fuzzy msgid "Border Width" -msgstr "Pixels de bordure" +msgstr "Largeur de la bordure" #: scene/gui/rich_text_effect.cpp -#, fuzzy msgid "Relative Index" -msgstr "Récupérer la position" +msgstr "Position relative" #: scene/gui/rich_text_effect.cpp -#, fuzzy msgid "Absolute Index" -msgstr "Indentation automatique" +msgstr "Indice absolu" #: scene/gui/rich_text_effect.cpp msgid "Elapsed Time" @@ -24364,47 +24308,43 @@ msgstr "Caractère" #: scene/gui/rich_text_label.cpp msgid "BBCode" -msgstr "" +msgstr "BBCode" #: scene/gui/rich_text_label.cpp msgid "Meta Underlined" -msgstr "" +msgstr "Méta-données soulignées" #: scene/gui/rich_text_label.cpp msgid "Tab Size" msgstr "Taille de tabulation" #: scene/gui/rich_text_label.cpp -#, fuzzy msgid "Fit Content Height" -msgstr "Peindre les poids de l'os" +msgstr "Ajuster à la hauteur du conteneur" #: scene/gui/rich_text_label.cpp msgid "Scroll Active" -msgstr "" +msgstr "Défilement actif" #: scene/gui/rich_text_label.cpp msgid "Scroll Following" -msgstr "" +msgstr "Suivi du défilement" #: scene/gui/rich_text_label.cpp -#, fuzzy msgid "Selection Enabled" -msgstr "Sélection uniquement" +msgstr "Sélection activée" #: scene/gui/rich_text_label.cpp scene/gui/text_edit.cpp msgid "Override Selected Font Color" -msgstr "Remplacer la couleur de police sélectionnée" +msgstr "Surcharger la couleur de police sélectionnée" #: scene/gui/rich_text_label.cpp -#, fuzzy msgid "Custom Effects" -msgstr "Déplacer effet de transport" +msgstr "Effets personnalisés" #: scene/gui/scroll_bar.cpp -#, fuzzy msgid "Custom Step" -msgstr "NÅ“ud Personnalisé" +msgstr "Pas personnalisé" #: scene/gui/scroll_container.cpp msgid "" @@ -24501,7 +24441,7 @@ msgstr "" #: scene/gui/tabs.cpp msgid "Scrolling Enabled" -msgstr "" +msgstr "Défilement activé" #: scene/gui/text_edit.cpp msgid "Readonly" @@ -24815,44 +24755,40 @@ msgstr "Nouvelle racine de scène" #: scene/main/scene_tree.cpp msgid "Root" -msgstr "" +msgstr "Racine" #: scene/main/scene_tree.cpp -#, fuzzy msgid "Multiplayer Poll" -msgstr "Multiplier %s" +msgstr "Poll d'attente active (polling) multijoueur" #: scene/main/scene_tree.cpp scene/resources/mesh_library.cpp #: scene/resources/shape_2d.cpp msgid "Shapes" -msgstr "" +msgstr "Formes" #: scene/main/scene_tree.cpp msgid "Shape Color" -msgstr "" +msgstr "Couleur de forme" #: scene/main/scene_tree.cpp -#, fuzzy msgid "Contact Color" -msgstr "Prélever une couleur" +msgstr "Couleur de contact" #: scene/main/scene_tree.cpp msgid "Geometry Color" -msgstr "" +msgstr "Couleur de géométrie" #: scene/main/scene_tree.cpp -#, fuzzy msgid "Disabled Geometry Color" -msgstr "Item désactivé" +msgstr "Couleur des géométries désactivées" #: scene/main/scene_tree.cpp msgid "Max Contacts Displayed" -msgstr "" +msgstr "Maximum de contacts affichés" #: scene/main/scene_tree.cpp scene/resources/shape_2d.cpp -#, fuzzy msgid "Draw 2D Outlines" -msgstr "Créer le contour" +msgstr "Dessiner les contours 2D" #: scene/main/scene_tree.cpp servers/visual_server.cpp msgid "Reflections" @@ -24864,15 +24800,15 @@ msgstr "Taille de l'Atlas" #: scene/main/scene_tree.cpp msgid "Atlas Subdiv" -msgstr "" +msgstr "Subdivision d'atlas" #: scene/main/scene_tree.cpp scene/main/viewport.cpp msgid "MSAA" -msgstr "" +msgstr "MSAA" #: scene/main/scene_tree.cpp msgid "Use FXAA" -msgstr "" +msgstr "Utiliser FXAA" #: scene/main/scene_tree.cpp msgid "Use Debanding" @@ -24880,16 +24816,15 @@ msgstr "" #: scene/main/scene_tree.cpp scene/main/viewport.cpp msgid "HDR" -msgstr "" +msgstr "HDR (High Dynamic Range)" #: scene/main/scene_tree.cpp scene/main/viewport.cpp msgid "Use 32 BPC Depth" -msgstr "" +msgstr "Utiliser profondeur de couleur 32 bits" #: scene/main/scene_tree.cpp -#, fuzzy msgid "Default Environment" -msgstr "Voir environnement" +msgstr "Environnement par défaut" #: scene/main/scene_tree.cpp msgid "" @@ -24921,9 +24856,8 @@ msgid "Autostart" msgstr "Démarrage Automatique" #: scene/main/viewport.cpp -#, fuzzy msgid "Viewport Path" -msgstr "Chemin d'exportation" +msgstr "Chemin de la fenêtre d'affichage" #: scene/main/viewport.cpp msgid "" @@ -24941,10 +24875,15 @@ msgid "" "Effects.\n" "HDR will be disabled for this Viewport." msgstr "" +"Cette fenêtre d'affichage utilise le HDR mais son Utilisation est 2D ou 2D " +"No-Sampling.\n" +"Le HDR est supporte uniquement sur les fenêtres d'affichage avec une " +"Utilisation 3D ou 3D No-Effects.\n" +"Le HDR sera désactivé pour cette fenêtre d'affichage." #: scene/main/viewport.cpp msgid "ARVR" -msgstr "" +msgstr "ARVR" #: scene/main/viewport.cpp #, fuzzy @@ -24952,30 +24891,29 @@ msgid "Size Override Stretch" msgstr "Remplacer l'item" #: scene/main/viewport.cpp +#, fuzzy msgid "Own World" -msgstr "" +msgstr "Propre Monde" #: scene/main/viewport.cpp scene/resources/world_2d.cpp msgid "World" -msgstr "" +msgstr "Monde" #: scene/main/viewport.cpp msgid "World 2D" -msgstr "" +msgstr "Monde 2D" #: scene/main/viewport.cpp -#, fuzzy msgid "Transparent BG" -msgstr "Transposer" +msgstr "Arrière-plan transparent" #: scene/main/viewport.cpp -#, fuzzy msgid "Handle Input Locally" -msgstr "Changer nom de l'entrée" +msgstr "Gérer les entrées localement" #: scene/main/viewport.cpp msgid "FXAA" -msgstr "" +msgstr "FXAA" #: scene/main/viewport.cpp #, fuzzy @@ -24983,23 +24921,20 @@ msgid "Debanding" msgstr "Liaison" #: scene/main/viewport.cpp -#, fuzzy msgid "Disable 3D" -msgstr "Item désactivé" +msgstr "Désactiver 3D" #: scene/main/viewport.cpp -#, fuzzy msgid "Keep 3D Linear" -msgstr "Linéaire gauche" +msgstr "Garder 3D linéaire" #: scene/main/viewport.cpp msgid "Render Direct To Screen" -msgstr "" +msgstr "Rendre directement vers l’écran" #: scene/main/viewport.cpp -#, fuzzy msgid "Debug Draw" -msgstr "Débogage" +msgstr "Déboguer appel de dessin" #: scene/main/viewport.cpp msgid "Render Target" @@ -25007,7 +24942,7 @@ msgstr "Rendre la cible" #: scene/main/viewport.cpp msgid "V Flip" -msgstr "" +msgstr "Miroir V" #: scene/main/viewport.cpp #, fuzzy @@ -25015,14 +24950,12 @@ msgid "Clear Mode" msgstr "Mode Règle" #: scene/main/viewport.cpp -#, fuzzy msgid "Enable 2D" -msgstr "Activer" +msgstr "Activer 2D" #: scene/main/viewport.cpp -#, fuzzy msgid "Enable 3D" -msgstr "Activer" +msgstr "Activer 3D" #: scene/main/viewport.cpp #, fuzzy @@ -25030,9 +24963,8 @@ msgid "Object Picking" msgstr "Activer l'effet « pelure d'oignon »" #: scene/main/viewport.cpp -#, fuzzy msgid "Disable Input" -msgstr "Item désactivé" +msgstr "Désactiver entrées" #: scene/main/viewport.cpp servers/visual_server.cpp #, fuzzy @@ -25041,97 +24973,84 @@ msgstr "Nouvel Atlas" #: scene/main/viewport.cpp msgid "Quad 0" -msgstr "" +msgstr "Quad 0" #: scene/main/viewport.cpp msgid "Quad 1" -msgstr "" +msgstr "Quad 1" #: scene/main/viewport.cpp msgid "Quad 2" -msgstr "" +msgstr "Quad 2" #: scene/main/viewport.cpp msgid "Quad 3" -msgstr "" +msgstr "Quad 3" #: scene/main/viewport.cpp -#, fuzzy msgid "Canvas Transform" -msgstr "Supprimer la transformation" +msgstr "Transformation du canevas" #: scene/main/viewport.cpp -#, fuzzy msgid "Global Canvas Transform" -msgstr "Conserver la transformation globale" +msgstr "Transformation du canevas global" #: scene/main/viewport.cpp msgid "Tooltip Delay (sec)" -msgstr "" +msgstr "Délai de l'info-bulle (sec)" #: scene/register_scene_types.cpp -#, fuzzy msgid "Swap OK Cancel" -msgstr "Annuler" +msgstr "Inverser OK et Annuler" #: scene/register_scene_types.cpp -#, fuzzy msgid "Layer Names" -msgstr "Nom" +msgstr "Noms des couches" #: scene/register_scene_types.cpp -#, fuzzy msgid "2D Render" -msgstr "Rendu" +msgstr "Rendu 2D" #: scene/register_scene_types.cpp -#, fuzzy msgid "3D Render" -msgstr "Rendu" +msgstr "Rendu 3D" #: scene/register_scene_types.cpp -#, fuzzy msgid "2D Physics" -msgstr "Physique" +msgstr "Physique 2D" #: scene/register_scene_types.cpp -#, fuzzy msgid "3D Physics" -msgstr "Physique" +msgstr "Physique 3D" #: scene/register_scene_types.cpp -#, fuzzy msgid "2D Navigation" -msgstr "Navigation" +msgstr "Navigation 2D" #: scene/register_scene_types.cpp -#, fuzzy msgid "3D Navigation" -msgstr "Navigation" +msgstr "Navigation 3D" #: scene/register_scene_types.cpp msgid "Use hiDPI" -msgstr "" +msgstr "Utiliser hiDPI" #: scene/register_scene_types.cpp -#, fuzzy msgid "Custom" -msgstr "NÅ“ud Personnalisé" +msgstr "Personnalisé" #: scene/register_scene_types.cpp -#, fuzzy msgid "Custom Font" -msgstr "NÅ“ud Personnalisé" +msgstr "Police personnalisée" #: scene/resources/audio_stream_sample.cpp #: servers/audio/effects/audio_stream_generator.cpp servers/audio_server.cpp -#, fuzzy msgid "Mix Rate" -msgstr "Mélanger le nÅ“ud" +msgstr "Taux de mélange" #: scene/resources/audio_stream_sample.cpp msgid "Stereo" -msgstr "" +msgstr "Stéréo" #: scene/resources/concave_polygon_shape_2d.cpp msgid "Segments" @@ -25148,121 +25067,103 @@ msgstr "" #: scene/resources/default_theme/default_theme.cpp msgid "Panel" -msgstr "" +msgstr "Panneau" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color" -msgstr "Prélever une couleur" +msgstr "Couleur de police" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Pressed" -msgstr "Renommer l'item de couleur" +msgstr "Couleur de police quand pressé" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Hover" -msgstr "Renommer l'item de couleur" +msgstr "Couleur de police au survol" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Focus" -msgstr "Remplir la surface" +msgstr "Couleur de police quand actif" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Disabled" -msgstr "Âgrafe désactivée" +msgstr "Couleur de police quand désactivé" #: scene/resources/default_theme/default_theme.cpp msgid "H Separation" -msgstr "Séparation H" +msgstr "Séparation horizontale" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Underline Spacing" -msgstr "Bouclage de l’animation" +msgstr "Espacement du soulignage" #: scene/resources/default_theme/default_theme.cpp msgid "Arrow" -msgstr "" +msgstr "Flèche" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Arrow Margin" -msgstr "Définir la marge" +msgstr "Marge de flèche" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Hover Pressed" -msgstr "Pressé" +msgstr "Survol pressé" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Checked Disabled" -msgstr "Item à cocher" +msgstr "Coché désactivé" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Unchecked" -msgstr "Item coché" +msgstr "Non coché" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Unchecked Disabled" -msgstr "Item désactivé" +msgstr "Non coché désactivé" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Radio Checked" -msgstr "Item coché" +msgstr "Radio coché" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Radio Checked Disabled" -msgstr "(Éditeur désactivé)" +msgstr "Radio coché désactivé" #: scene/resources/default_theme/default_theme.cpp msgid "Radio Unchecked" -msgstr "" +msgstr "Radio non coché" #: scene/resources/default_theme/default_theme.cpp msgid "Radio Unchecked Disabled" -msgstr "" +msgstr "Radio non coché désactivé" #: scene/resources/default_theme/default_theme.cpp msgid "Font Color Hover Pressed" -msgstr "" +msgstr "Couleur de police au survol pressé" #: scene/resources/default_theme/default_theme.cpp msgid "Check V Adjust" -msgstr "" +msgstr "Ajustement V de la case à cocher" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "On Disabled" -msgstr "Item désactivé" +msgstr "Quand désactivé" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Off" -msgstr "Décalage" +msgstr "Éteint" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Off Disabled" -msgstr "Item désactivé" +msgstr "Éteint désactivé" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Shadow" -msgstr "Renommer l'item de couleur" +msgstr "Couleur de police de l'ombre" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Outline Modulate" -msgstr "Forcer la modulation blanche" +msgstr "Moduler le contour de la police" #: scene/resources/default_theme/default_theme.cpp msgid "Shadow Offset X" @@ -25273,23 +25174,20 @@ msgid "Shadow Offset Y" msgstr "Décalage Y de l'ombre" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Shadow As Outline" -msgstr "Plan précédent" +msgstr "Ombre comme contour" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Selected" -msgstr "Déverrouillage Sélectionné" +msgstr "Couleur de police quand sélectionné" #: scene/resources/default_theme/default_theme.cpp msgid "Font Color Uneditable" -msgstr "" +msgstr "Couleur de police quand non-éditable" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Cursor Color" -msgstr "NÅ“ud Personnalisé" +msgstr "Couleur du curseur" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25307,25 +25205,22 @@ msgid "Minimum Spaces" msgstr "Scène principale" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "BG" -msgstr "o" +msgstr "Arrière-plan" #: scene/resources/default_theme/default_theme.cpp msgid "FG" -msgstr "" +msgstr "Premier plan" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Tab" -msgstr "Onglet 1" +msgstr "Onglet" #: scene/resources/default_theme/default_theme.cpp #: scene/resources/dynamic_font.cpp scene/resources/world.cpp #: scene/resources/world_2d.cpp -#, fuzzy msgid "Space" -msgstr "Scène principale" +msgstr "Espace" #: scene/resources/default_theme/default_theme.cpp msgid "Folded" @@ -25337,86 +25232,75 @@ msgstr "Replier" #: scene/resources/default_theme/default_theme.cpp msgid "Font Color Readonly" -msgstr "" +msgstr "Couleur de police quand en lecture seule" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Completion Lines" -msgstr "Complétion" +msgstr "Lignes de complétion" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Completion Max Width" -msgstr "Complétion" +msgstr "Largeur maximale de complétion" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Completion Scroll Width" -msgstr "Importer la sélection" +msgstr "Largeur de la barre de défilement de complétion" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Scroll Focus" -msgstr "Remplir la surface" +msgstr "Arrière de la barre quand active" #: scene/resources/default_theme/default_theme.cpp msgid "Grabber" -msgstr "" +msgstr "Poignée" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Grabber Highlight" -msgstr "Coloration syntaxique" +msgstr "Poignée au survol" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Grabber Pressed" -msgstr "Pressé" +msgstr "Poignée quand pressée" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Increment" -msgstr "Voir environnement" +msgstr "Incrémenteur" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Increment Highlight" -msgstr "Coloration syntaxique" +msgstr "Incrémenteur au survol" #: scene/resources/default_theme/default_theme.cpp msgid "Increment Pressed" -msgstr "" +msgstr "Incrémenteur quand pressé" #: scene/resources/default_theme/default_theme.cpp msgid "Decrement" -msgstr "" +msgstr "Décrémenteur" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Decrement Highlight" -msgstr "Coloration syntaxique" +msgstr "Décrémenteur au survol" #: scene/resources/default_theme/default_theme.cpp msgid "Decrement Pressed" -msgstr "" +msgstr "Décrémenteur quand pressé" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Slider" -msgstr "Mode collision" +msgstr "Arrière de la barre" #: scene/resources/default_theme/default_theme.cpp msgid "Grabber Area" -msgstr "" +msgstr "Zone de la poignée" #: scene/resources/default_theme/default_theme.cpp msgid "Grabber Area Highlight" -msgstr "" +msgstr "Zone de la poignée au survol" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Grabber Disabled" -msgstr "Item désactivé" +msgstr "Poignée quand désactivée" #: scene/resources/default_theme/default_theme.cpp msgid "Tick" @@ -25432,24 +25316,20 @@ msgid "Scaleborder Size" msgstr "Pixels de bordure" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Font" -msgstr "Police du Code" +msgstr "Police du titre" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Color" -msgstr "Couleur du Texte" +msgstr "Couleur du titre" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Height" -msgstr "En période de test" +msgstr "Hauteur du titre" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Close Highlight" -msgstr "Éclairage direct" +msgstr "\"Fermer\" au survol" #: scene/resources/default_theme/default_theme.cpp msgid "Close H Offset" @@ -25460,29 +25340,24 @@ msgid "Close V Offset" msgstr "Fermer décalage V" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Parent Folder" -msgstr "Créer un dossier" +msgstr "Dossier parent" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Toggle Hidden" -msgstr "Basculer les fichiers cachés" +msgstr "Cacher/Montrer" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Panel Disabled" -msgstr "Âgrafe désactivée" +msgstr "Panneau désactivé" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Labeled Separator Left" -msgstr "Séparateur nommé" +msgstr "Séparateur nommé gauche" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Labeled Separator Right" -msgstr "Séparateur nommé" +msgstr "Séparateur nommé droit" #: scene/resources/default_theme/default_theme.cpp msgid "Font Separator" @@ -25502,14 +25377,12 @@ msgid "V Separation" msgstr "Séparation V" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Selected Frame" -msgstr "Sélectionner des Trames" +msgstr "Trame sélectionnée" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Default Frame" -msgstr "Défaut" +msgstr "Trame par défaut" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25522,38 +25395,32 @@ msgid "Comment Focus" msgstr "Enregistrer" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Breakpoint" -msgstr "Point d'arrêts" +msgstr "Point d'arrêt" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Resizer" -msgstr "Redimensionnable" +msgstr "Redimensionneur" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Close Color" -msgstr "Couleurs" +msgstr "Couleur du bouton Fermer" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Resizer Color" -msgstr "Couleurs" +msgstr "Couleur du redimensionneur" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Offset" -msgstr "Décalage d’Octet" +msgstr "Décalage du titre" #: scene/resources/default_theme/default_theme.cpp msgid "Close Offset" msgstr "Fermer de décalage" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Port Offset" -msgstr "Décalage du Pivot" +msgstr "Décalage du port" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25567,12 +25434,11 @@ msgstr "Sélectionner" #: scene/resources/default_theme/default_theme.cpp msgid "Cursor Unfocused" -msgstr "" +msgstr "Curseur quand inactif" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Button Pressed" -msgstr "Pressé" +msgstr "Bouton quand pressé" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25590,19 +25456,16 @@ msgid "Title Button Hover" msgstr "Bouton à bascule (toggle)" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Custom Button" -msgstr "NÅ“ud Personnalisé" +msgstr "Bouton personnalisé" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Custom Button Pressed" -msgstr "Options de bus" +msgstr "Bouton personnalisé quand pressé" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Custom Button Hover" -msgstr "NÅ“ud Personnalisé" +msgstr "Bouton personnalisé au survol" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25625,9 +25488,8 @@ msgid "Title Button Color" msgstr "Couleur de la Sélection" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Guide Color" -msgstr "Prélever une couleur" +msgstr "Couleur des guides" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25635,75 +25497,64 @@ msgid "Drop Position Color" msgstr "Position du dock" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Relationship Line Color" -msgstr "Couleur de la Ligne Actuelle" +msgstr "Couleur des lignes de relation" #: scene/resources/default_theme/default_theme.cpp msgid "Custom Button Font Highlight" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Item Margin" -msgstr "Définir la marge" +msgstr "Marge d'élément" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Button Margin" -msgstr "Bouton" +msgstr "Marge de bouton" #: scene/resources/default_theme/default_theme.cpp msgid "Draw Relationship Lines" -msgstr "" +msgstr "Afficher les lignes de relation" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Draw Guides" msgstr "Afficher les guides" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Scroll Border" -msgstr "Défilement Vertical" +msgstr "Bordure de la barre de défilement" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Scroll Speed" -msgstr "Décalage du Défilement" +msgstr "Vitesse de défilement" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Icon Margin" -msgstr "Définir la marge" +msgstr "Marge d’icône" #: scene/resources/default_theme/default_theme.cpp msgid "Line Separation" msgstr "Séparation de line" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Tab FG" -msgstr "Onglet 1" +msgstr "Premier plan d'onglet" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Tab BG" -msgstr "Onglet 1" +msgstr "Arrière-plan d'onglet" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Tab Disabled" -msgstr "Item désactivé" +msgstr "Onglet désactivé" #: scene/resources/default_theme/default_theme.cpp msgid "Menu" -msgstr "" +msgstr "Menu" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Menu Highlight" -msgstr "Éclairage direct" +msgstr "Menu au survol" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25716,14 +25567,12 @@ msgid "Font Color BG" msgstr "Renommer l'item de couleur" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Side Margin" -msgstr "Définir la marge" +msgstr "Marge de coté" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Top Margin" -msgstr "Définir la marge" +msgstr "Marge en haut" #: scene/resources/default_theme/default_theme.cpp msgid "Label V Align FG" @@ -25734,28 +25583,24 @@ msgid "Label V Align BG" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Large" -msgstr "Cible" +msgstr "Grand" #: scene/resources/default_theme/default_theme.cpp msgid "Folder" msgstr "Dossier" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Folder Icon Modulate" -msgstr "Forcer la modulation blanche" +msgstr "Moduler l’icône du dossier" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "File Icon Modulate" -msgstr "Mode Icône" +msgstr "Moduler l'icône du fichier" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Files Disabled" -msgstr "Âgrafe désactivée" +msgstr "Fichiers désactivés" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25773,71 +25618,60 @@ msgid "H Width" msgstr "Étendu à Gauche" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Label Width" -msgstr "Étendu à Gauche" +msgstr "Largeur du label" #: scene/resources/default_theme/default_theme.cpp msgid "Screen Picker" msgstr "Sélecteur d'écran" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Add Preset" -msgstr "Charger un préréglage" +msgstr "Ajouter préréglage" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Color Hue" -msgstr "Thème de l'éditeur" +msgstr "Teinte de couleur" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Color Sample" -msgstr "Couleurs" +msgstr "Échantillon de couleur" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Preset BG" -msgstr "Préréglage" +msgstr "Préréglage arrière-plan" #: scene/resources/default_theme/default_theme.cpp msgid "Overbright Indicator" -msgstr "" +msgstr "Indicateur de surluminosité" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Preset FG" -msgstr "Préréglage" +msgstr "Préréglage avant-plan" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Preset BG Icon" -msgstr "Préréglage" +msgstr "Préréglage icône d'arrière-plan" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Normal Font" -msgstr "Format" +msgstr "Police normale" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Bold Font" -msgstr "Police du Code" +msgstr "Police en gras" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Italics Font" -msgstr "Police Principale" +msgstr "Police italique" #: scene/resources/default_theme/default_theme.cpp msgid "Bold Italics Font" -msgstr "" +msgstr "Police italique grasse" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Mono Font" -msgstr "Police Principale" +msgstr "Police monospace" #: scene/resources/default_theme/default_theme.cpp msgid "Table H Separation" @@ -25848,62 +25682,52 @@ msgid "Table V Separation" msgstr "Séparation V de table" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Margin Left" -msgstr "Définir la marge" +msgstr "Marge à gauche" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Margin Top" -msgstr "Définir la marge" +msgstr "Marge en haut" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Margin Right" -msgstr "Indenter vers la droite" +msgstr "Marge à droite" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Margin Bottom" -msgstr "Mode sélection" +msgstr "Marge en bas" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Autohide" -msgstr "Coupe automatique" +msgstr "Cacher automatiquement" #: scene/resources/default_theme/default_theme.cpp msgid "Minus" -msgstr "" +msgstr "Moins" #: scene/resources/default_theme/default_theme.cpp msgid "More" -msgstr "" +msgstr "Plus" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Grid Minor" -msgstr "Couleur de la Grille" +msgstr "Grille secondaire" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Grid Major" -msgstr "Grille" +msgstr "Grille principale" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Selection Fill" -msgstr "Sélection uniquement" +msgstr "Remplissage de la sélection" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Selection Stroke" -msgstr "Sélectionnez une propriété" +msgstr "Trait de la sélection" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Activity" -msgstr "Action" +msgstr "Activité" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25916,40 +25740,35 @@ msgstr "" #: scene/resources/default_theme/default_theme.cpp msgid "Port Grab Distance Horizontal" -msgstr "" +msgstr "Distance horizontale de capture de port" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Port Grab Distance Vertical" -msgstr "WaitInstanceSignal" +msgstr "Distance verticale de capture de port" #: scene/resources/dynamic_font.cpp msgid "Hinting" -msgstr "" +msgstr "Optimisation de rendu (hinting)" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Override Oversampling" -msgstr "Remplacer l'item" +msgstr "Remplacer le suréchantillonnage" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Font Path" -msgstr "Focaliser le chemin" +msgstr "Chemin de la police" #: scene/resources/dynamic_font.cpp msgid "Outline Size" msgstr "Taille de Contour" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Outline Color" -msgstr "Fonction" +msgstr "Couleur de contour" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Use Mipmaps" -msgstr "Signaux" +msgstr "Utiliser les Mipmaps" #: scene/resources/dynamic_font.cpp msgid "Extra Spacing" @@ -25960,27 +25779,24 @@ msgid "Char" msgstr "Char" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Font Data" -msgstr "Avec données" +msgstr "Données de police" #: scene/resources/environment.cpp msgid "Background" -msgstr "" +msgstr "Arrière-plan" #: scene/resources/environment.cpp scene/resources/sky.cpp msgid "Sky" -msgstr "" +msgstr "Ciel" #: scene/resources/environment.cpp -#, fuzzy msgid "Sky Custom FOV" -msgstr "NÅ“ud Personnalisé" +msgstr "Champ de vision personnalisé du ciel" #: scene/resources/environment.cpp -#, fuzzy msgid "Sky Orientation" -msgstr "Documentation en ligne" +msgstr "Orientation du ciel" #: scene/resources/environment.cpp msgid "Sky Rotation" @@ -25996,17 +25812,15 @@ msgstr "" #: scene/resources/environment.cpp scene/resources/texture.cpp msgid "Camera Feed ID" -msgstr "" +msgstr "ID de flux de la caméra" #: scene/resources/environment.cpp -#, fuzzy msgid "Ambient Light" -msgstr "Indenter vers la droite" +msgstr "Lumière ambiante" #: scene/resources/environment.cpp -#, fuzzy msgid "Sky Contribution" -msgstr "Condition" +msgstr "Contribution du ciel" #: scene/resources/environment.cpp msgid "Fog" @@ -26021,79 +25835,68 @@ msgid "Sun Amount" msgstr "Quantité de Soleil" #: scene/resources/environment.cpp -#, fuzzy msgid "Depth Enabled" -msgstr "Profondeur" +msgstr "Profondeur activée" #: scene/resources/environment.cpp -#, fuzzy msgid "Depth Begin" -msgstr "Profondeur" +msgstr "Départ de la profondeur" #: scene/resources/environment.cpp -#, fuzzy msgid "Depth End" -msgstr "Profondeur" +msgstr "Fin de la profondeur" #: scene/resources/environment.cpp -#, fuzzy msgid "Depth Curve" -msgstr "Scinder la courbe" +msgstr "Courbe de profondeur" #: scene/resources/environment.cpp -#, fuzzy msgid "Transmit Enabled" -msgstr "Filtrer les signaux" +msgstr "Transmission activée" #: scene/resources/environment.cpp -#, fuzzy msgid "Transmit Curve" -msgstr "Scinder la courbe" +msgstr "Courbe de transmission" #: scene/resources/environment.cpp -#, fuzzy msgid "Height Enabled" -msgstr "Filtrer les signaux" +msgstr "Hauteur activée" #: scene/resources/environment.cpp -#, fuzzy msgid "Height Min" -msgstr "Lumière" +msgstr "Hauteur minimum" #: scene/resources/environment.cpp -#, fuzzy msgid "Height Max" -msgstr "Lumière" +msgstr "Hauteur maximum" #: scene/resources/environment.cpp -#, fuzzy msgid "Height Curve" -msgstr "Scinder la courbe" +msgstr "Courbe de hauteur" #: scene/resources/environment.cpp msgid "Tonemap" msgstr "Tonemap" #: scene/resources/environment.cpp -#, fuzzy msgid "Exposure" -msgstr "Exporter" +msgstr "Exposition" #: scene/resources/environment.cpp msgid "White" -msgstr "" +msgstr "Blanc" #: scene/resources/environment.cpp msgid "Auto Exposure" -msgstr "" +msgstr "Exposition auto" #: scene/resources/environment.cpp msgid "Min Luma" -msgstr "" +msgstr "Lumen minimum" #: scene/resources/environment.cpp msgid "Max Luma" -msgstr "" +msgstr "Lumen maximum" #: scene/resources/environment.cpp #, fuzzy @@ -26101,9 +25904,8 @@ msgid "SS Reflections" msgstr "Mettre à l'échelle la sélection" #: scene/resources/environment.cpp -#, fuzzy msgid "Max Steps" -msgstr "Pas" +msgstr "Pas maximum" #: scene/resources/environment.cpp msgid "Fade In" @@ -26114,17 +25916,16 @@ msgid "Fade Out" msgstr "Fondu sortant" #: scene/resources/environment.cpp -#, fuzzy msgid "Depth Tolerance" -msgstr "Profondeur" +msgstr "Tolérance de profondeur" #: scene/resources/environment.cpp scene/resources/material.cpp msgid "Roughness" -msgstr "" +msgstr "Dureté" #: scene/resources/environment.cpp msgid "SSAO" -msgstr "" +msgstr "SSAO" #: scene/resources/environment.cpp msgid "Radius 2" @@ -26132,7 +25933,7 @@ msgstr "Rayon 2" #: scene/resources/environment.cpp msgid "Intensity 2" -msgstr "" +msgstr "Intensité 2" #: scene/resources/environment.cpp scene/resources/material.cpp #, fuzzy @@ -26146,15 +25947,15 @@ msgstr "Débogage du canal UV" #: scene/resources/environment.cpp msgid "Blur" -msgstr "" +msgstr "Flou" #: scene/resources/environment.cpp msgid "Edge Sharpness" -msgstr "" +msgstr "Netteté des bords" #: scene/resources/environment.cpp msgid "DOF Far Blur" -msgstr "" +msgstr "Flou d'éloigné de la profondeur de champ" #: scene/resources/environment.cpp scene/resources/material.cpp msgid "Distance" @@ -26166,21 +25967,20 @@ msgstr "Transition" #: scene/resources/environment.cpp msgid "DOF Near Blur" -msgstr "" +msgstr "Flou de rapproché de la profondeur de champ" #: scene/resources/environment.cpp msgid "Glow" -msgstr "" +msgstr "Luisance" #: scene/resources/environment.cpp -#, fuzzy msgid "Levels" -msgstr "Développeurs" +msgstr "Niveaux" #: scene/resources/environment.cpp #: servers/audio/effects/audio_effect_chorus.cpp msgid "1" -msgstr "" +msgstr "1" #: scene/resources/environment.cpp #: servers/audio/effects/audio_effect_chorus.cpp @@ -26378,19 +26178,16 @@ msgid "Use Alpha Scissor" msgstr "Utiliser la découpe alpha" #: scene/resources/material.cpp -#, fuzzy msgid "Particles Anim" -msgstr "Particules" +msgstr "Animation de particules" #: scene/resources/material.cpp -#, fuzzy msgid "H Frames" -msgstr "Image %" +msgstr "Trames H" #: scene/resources/material.cpp -#, fuzzy msgid "V Frames" -msgstr "Image %" +msgstr "Trames V" #: scene/resources/material.cpp msgid "Albedo" @@ -26398,25 +26195,23 @@ msgstr "Albédo" #: scene/resources/material.cpp msgid "Metallic" -msgstr "" +msgstr "Métallique" #: scene/resources/material.cpp -#, fuzzy msgid "Texture Channel" -msgstr "RegionDeTexture" +msgstr "Canal de texture" #: scene/resources/material.cpp -#, fuzzy msgid "Emission" -msgstr "Masque d'émission" +msgstr "Émission" #: scene/resources/material.cpp msgid "On UV2" -msgstr "" +msgstr "Sur UV2" #: scene/resources/material.cpp msgid "NormalMap" -msgstr "" +msgstr "NormalMap" #: scene/resources/material.cpp msgid "Rim" @@ -26429,20 +26224,19 @@ msgstr "Effacer" #: scene/resources/material.cpp msgid "Gloss" -msgstr "" +msgstr "Éclat" #: scene/resources/material.cpp msgid "Anisotropy" -msgstr "" +msgstr "Anisotropie" #: scene/resources/material.cpp msgid "Flowmap" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Ambient Occlusion" -msgstr "Occlusion" +msgstr "Occlusion ambiante" #: scene/resources/material.cpp msgid "Deep Parallax" @@ -26469,7 +26263,7 @@ msgstr "Retourner le Portal" #: scene/resources/material.cpp msgid "Subsurf Scatter" -msgstr "" +msgstr "Transluminescence" #: scene/resources/material.cpp msgid "Transmission" @@ -26481,30 +26275,27 @@ msgstr "Réfraction" #: scene/resources/material.cpp msgid "Detail" -msgstr "" +msgstr "Détail" #: scene/resources/material.cpp -#, fuzzy msgid "UV Layer" -msgstr "Calque" +msgstr "Couche UV" #: scene/resources/material.cpp -#, fuzzy msgid "UV1" -msgstr "UV" +msgstr "UV1" #: scene/resources/material.cpp msgid "Triplanar" -msgstr "" +msgstr "Triplanaire" #: scene/resources/material.cpp msgid "Triplanar Sharpness" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "UV2" -msgstr "UV" +msgstr "UV2" #: scene/resources/material.cpp #, fuzzy @@ -26516,9 +26307,8 @@ msgid "Distance Fade" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Async Mode" -msgstr "Mode navigation" +msgstr "Mode asynchrone" #: scene/resources/mesh.cpp #, fuzzy @@ -26530,14 +26320,12 @@ msgid "Custom AABB" msgstr "" #: scene/resources/mesh_library.cpp -#, fuzzy msgid "Mesh Transform" -msgstr "Transformation" +msgstr "Transformation de Mesh" #: scene/resources/mesh_library.cpp -#, fuzzy msgid "NavMesh Transform" -msgstr "Supprimer la transformation" +msgstr "Transformation de NavMesh" #: scene/resources/multimesh.cpp msgid "Color Format" @@ -26552,22 +26340,20 @@ msgid "Custom Data Format" msgstr "" #: scene/resources/multimesh.cpp -#, fuzzy msgid "Instance Count" -msgstr "Instance" +msgstr "Nombre d'instances" #: scene/resources/multimesh.cpp msgid "Visible Instance Count" -msgstr "" +msgstr "Nombre d'instances visibles" #: scene/resources/navigation_mesh.cpp msgid "Sampling" msgstr "Échantillonnage" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Partition Type" -msgstr "Définir type de variable" +msgstr "Type de partition" #: scene/resources/navigation_mesh.cpp msgid "Parsed Geometry Type" @@ -26584,12 +26370,11 @@ msgstr "Source" #: scene/resources/navigation_mesh.cpp msgid "Cells" -msgstr "" +msgstr "Cellules" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Agents" -msgstr "Segments" +msgstr "Agents" #: scene/resources/navigation_mesh.cpp msgid "Max Climb" @@ -26597,12 +26382,11 @@ msgstr "" #: scene/resources/navigation_mesh.cpp msgid "Max Slope" -msgstr "" +msgstr "Pente maximale" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Regions" -msgstr "Région" +msgstr "Régions" #: scene/resources/navigation_mesh.cpp #, fuzzy @@ -26611,7 +26395,7 @@ msgstr "Fusionner depuis la scène" #: scene/resources/navigation_mesh.cpp msgid "Edges" -msgstr "" +msgstr "Arêtes" #: scene/resources/navigation_mesh.cpp #, fuzzy @@ -26623,9 +26407,8 @@ msgid "Verts Per Poly" msgstr "" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Details" -msgstr "Afficher par défaut" +msgstr "Détails" #: scene/resources/navigation_mesh.cpp msgid "Sample Distance" @@ -26660,34 +26443,31 @@ msgstr "Décalage :" #: scene/resources/occluder_shape.cpp msgid "Spheres" -msgstr "" +msgstr "Sphères" #: scene/resources/occluder_shape.cpp msgid "OccluderShapeSphere Set Spheres" msgstr "Définir les sphères pour OccluderShapeSphere" #: scene/resources/occluder_shape_polygon.cpp -#, fuzzy msgid "Polygon Points" -msgstr "Polygones" +msgstr "Points de polygone" #: scene/resources/occluder_shape_polygon.cpp -#, fuzzy msgid "Hole Points" -msgstr "Déplacer de points" +msgstr "Points de trou" #: scene/resources/packed_scene.cpp msgid "Bundled" -msgstr "" +msgstr "Empaqueté" #: scene/resources/particles_material.cpp msgid "Trail" -msgstr "" +msgstr "Traînée" #: scene/resources/particles_material.cpp -#, fuzzy msgid "Divisor" -msgstr "Diviser %s" +msgstr "Diviseur" #: scene/resources/particles_material.cpp #, fuzzy @@ -26713,9 +26493,8 @@ msgid "Color Texture" msgstr "Thème de l'éditeur" #: scene/resources/particles_material.cpp -#, fuzzy msgid "Point Count" -msgstr "Ajouter un port d'entrée" +msgstr "Nombre de points" #: scene/resources/particles_material.cpp msgid "Scale Random" @@ -26732,16 +26511,15 @@ msgstr "" #: scene/resources/physics_material.cpp msgid "Absorbent" -msgstr "" +msgstr "Absorbant" #: scene/resources/plane_shape.cpp msgid "Plane" msgstr "Plan" #: scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Flip Faces" -msgstr "Retourner les Portals" +msgstr "Retourner les faces" #: scene/resources/primitive_meshes.cpp msgid "Mid Height" @@ -26749,15 +26527,15 @@ msgstr "" #: scene/resources/primitive_meshes.cpp msgid "Subdivide Width" -msgstr "" +msgstr "Largeur de subdivision" #: scene/resources/primitive_meshes.cpp msgid "Subdivide Height" -msgstr "" +msgstr "Hauteur de subdivision" #: scene/resources/primitive_meshes.cpp msgid "Subdivide Depth" -msgstr "" +msgstr "Profondeur de subdivision" #: scene/resources/primitive_meshes.cpp msgid "Top Radius" @@ -26769,43 +26547,38 @@ msgid "Bottom Radius" msgstr "En bas à droite" #: scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Left To Right" -msgstr "En haut à droite" +msgstr "Gauche à droite" #: scene/resources/primitive_meshes.cpp msgid "Is Hemisphere" -msgstr "" +msgstr "Est une hémisphère" #: scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Curve Step" -msgstr "Scinder la courbe" +msgstr "Pas de la courbe" #: scene/resources/ray_shape.cpp scene/resources/segment_shape_2d.cpp msgid "Slips On Slope" -msgstr "" +msgstr "Glisse sur pente" #: scene/resources/segment_shape_2d.cpp msgid "A" -msgstr "" +msgstr "A" #: scene/resources/shape_2d.cpp msgid "Custom Solver Bias" msgstr "" #: scene/resources/skin.cpp -#, fuzzy msgid "Bind Count" -msgstr "Ajouter un port d'entrée" +msgstr "Nombre de liaisons" #: scene/resources/skin.cpp -#, fuzzy msgid "Bind" msgstr "Liaison" #: scene/resources/skin.cpp -#, fuzzy msgid "Bone" msgstr "Os" @@ -26815,53 +26588,47 @@ msgstr "Taille du rayonnement" #: scene/resources/sky.cpp msgid "Panorama" -msgstr "" +msgstr "Panorama" #: scene/resources/sky.cpp -#, fuzzy msgid "Top Color" -msgstr "Étage suivant" +msgstr "Couleur du haut" #: scene/resources/sky.cpp msgid "Horizon Color" msgstr "Couleur de l’Horizon" #: scene/resources/sky.cpp -#, fuzzy msgid "Ground" -msgstr "Groupé" +msgstr "Sol" #: scene/resources/sky.cpp -#, fuzzy msgid "Bottom Color" -msgstr "Signets" +msgstr "Couleur du bas" #: scene/resources/sky.cpp -#, fuzzy msgid "Sun" -msgstr "Lancer" +msgstr "Soleil" #: scene/resources/sky.cpp -#, fuzzy msgid "Latitude" -msgstr "Remplacer" +msgstr "Latitude" #: scene/resources/sky.cpp msgid "Longitude" -msgstr "" +msgstr "Longitude" #: scene/resources/sky.cpp msgid "Angle Min" -msgstr "" +msgstr "Angle min" #: scene/resources/sky.cpp msgid "Angle Max" -msgstr "" +msgstr "Angle max" #: scene/resources/style_box.cpp -#, fuzzy msgid "Content Margin" -msgstr "Définir la marge" +msgstr "Marge de contenu" #: scene/resources/style_box.cpp #, fuzzy @@ -26870,7 +26637,7 @@ msgstr "Développer tout" #: scene/resources/style_box.cpp msgid "Skew" -msgstr "" +msgstr "Biseau" #: scene/resources/style_box.cpp #, fuzzy @@ -26883,7 +26650,7 @@ msgstr "" #: scene/resources/style_box.cpp msgid "Anti Aliasing" -msgstr "" +msgstr "Anticrénelage" #: scene/resources/style_box.cpp msgid "Grow Begin" @@ -26899,81 +26666,68 @@ msgid "Load Path" msgstr "Charger un préréglage" #: scene/resources/texture.cpp -#, fuzzy msgid "Base Texture" -msgstr "Supprimer la texture" +msgstr "Texture de base" #: scene/resources/texture.cpp msgid "Image Size" msgstr "Taille de l'image" #: scene/resources/texture.cpp -#, fuzzy msgid "Side" -msgstr "Afficher les guides" +msgstr "Coté" #: scene/resources/texture.cpp -#, fuzzy msgid "Front" -msgstr "Vue de devant" +msgstr "Avant" #: scene/resources/texture.cpp -#, fuzzy msgid "Back" -msgstr "Retourner" +msgstr "Arrière" #: scene/resources/texture.cpp -#, fuzzy msgid "Storage Mode" -msgstr "Mode mise à l'échelle" +msgstr "Mode de stockage" #: scene/resources/texture.cpp -#, fuzzy msgid "Lossy Storage Quality" -msgstr "Capturer" +msgstr "Qualité de stockage avec pertes" #: scene/resources/texture.cpp -#, fuzzy msgid "From" -msgstr "Remplir à Partir de" +msgstr "De" #: scene/resources/texture.cpp -#, fuzzy msgid "To" -msgstr "Dessus" +msgstr "À" #: scene/resources/texture.cpp -#, fuzzy msgid "Base" -msgstr "Changer le type de base" +msgstr "Base" #: scene/resources/texture.cpp -#, fuzzy msgid "Current Frame" -msgstr "Nom de la scène courante" +msgstr "Trame actuelle" #: scene/resources/texture.cpp -#, fuzzy msgid "Pause" -msgstr "Mode navigation" +msgstr "Pause" #: scene/resources/texture.cpp msgid "Which Feed" msgstr "" #: scene/resources/texture.cpp -#, fuzzy msgid "Camera Is Active" -msgstr "Sensible à la casse" +msgstr "La caméra est active" #: scene/resources/theme.cpp -#, fuzzy msgid "Default Font" -msgstr "Défaut" +msgstr "Police par défaut" #: scene/resources/visual_shader.cpp msgid "Output Port For Preview" -msgstr "" +msgstr "Port de sortie de l'aperçu" #: scene/resources/visual_shader.cpp #, fuzzy @@ -26986,29 +26740,24 @@ msgid "Cull" msgstr "Mode Règle" #: scene/resources/visual_shader.cpp -#, fuzzy msgid "Diffuse" -msgstr "Mode navigation" +msgstr "Diffus" #: scene/resources/visual_shader.cpp -#, fuzzy msgid "Async" -msgstr "Mode navigation" +msgstr "Asynchrone" #: scene/resources/visual_shader.cpp -#, fuzzy msgid "Modes" -msgstr "Mode" +msgstr "Modes" #: scene/resources/visual_shader.cpp -#, fuzzy msgid "Input Name" -msgstr "Contrôles" +msgstr "Nom de l'entrée" #: scene/resources/visual_shader.cpp -#, fuzzy msgid "Uniform Name" -msgstr "Définir le nom de l'uniforme" +msgstr "Nom de l'uniforme" #: scene/resources/visual_shader_nodes.cpp msgid "" @@ -27024,16 +26773,15 @@ msgstr "Source invalide pour la prévisualisation." #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." -msgstr "Source invalide pour la forme." +msgstr "Source invalide pour le shader." #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Texture Type" -msgstr "RegionDeTexture" +msgstr "Type de texture" #: scene/resources/visual_shader_nodes.cpp msgid "Cube Map" -msgstr "" +msgstr "Textures en cube" #: scene/resources/visual_shader_nodes.cpp #, fuzzy @@ -27041,42 +26789,36 @@ msgid "Default Value Enabled" msgstr "Profil des fonctionnalités de Godot" #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Default Value" -msgstr "Changer nom de l'entrée" +msgstr "Valeur par défaut" #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Color Default" -msgstr "Charger défaut" +msgstr "Couleur par défaut" #: scene/resources/visual_shader_nodes.cpp msgid "Invalid comparison function for that type." msgstr "Fonction de comparaison invalide pour ce type." #: scene/resources/world.cpp -#, fuzzy msgid "Fallback Environment" -msgstr "Voir environnement" +msgstr "Environnement de repli" #: scene/resources/world.cpp -#, fuzzy msgid "Scenario" -msgstr "Scène" +msgstr "Scénario" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Navigation Map" -msgstr "Navigation" +msgstr "Carte de navigation" #: scene/resources/world.cpp scene/resources/world_2d.cpp msgid "Direct Space State" msgstr "" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Default Gravity Vector" -msgstr "Aperçu par défaut" +msgstr "Vecteur de gravité par défaut" #: scene/resources/world.cpp scene/resources/world_2d.cpp #, fuzzy @@ -27093,14 +26835,12 @@ msgid "Default Map Up" msgstr "Défaut" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Default Cell Size" -msgstr "Aperçu par défaut" +msgstr "Taille de cellule par défaut" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Default Cell Height" -msgstr "En période de test" +msgstr "Hauteur de cellule par défaut" #: scene/resources/world.cpp scene/resources/world_2d.cpp msgid "Default Edge Connection Margin" @@ -27108,34 +26848,31 @@ msgstr "Marge de connexion des bords par défaut" #: scene/resources/world_2d.cpp msgid "Canvas" -msgstr "" +msgstr "Canevas" #: servers/arvr/arvr_interface.cpp msgid "Is Primary" -msgstr "" +msgstr "Est primaire" #: servers/arvr/arvr_interface.cpp -#, fuzzy msgid "Is Initialized" -msgstr "Initialiser" +msgstr "Est initialisé" #: servers/arvr/arvr_interface.cpp msgid "AR" -msgstr "" +msgstr "AR" #: servers/arvr/arvr_interface.cpp msgid "Is Anchor Detection Enabled" msgstr "" #: servers/arvr_server.cpp -#, fuzzy msgid "Primary Interface" -msgstr "Interface utilisateur" +msgstr "Interface primaire" #: servers/audio/audio_stream.cpp -#, fuzzy msgid "Audio Stream" -msgstr "Item radio" +msgstr "Flux audio" #: servers/audio/audio_stream.cpp msgid "Random Pitch" @@ -27145,46 +26882,45 @@ msgstr "Pitch Aléatoire" #: servers/audio/effects/audio_effect_spectrum_analyzer.cpp #: servers/audio/effects/audio_stream_generator.cpp msgid "Buffer Length" -msgstr "" +msgstr "Taille du tampon" #: servers/audio/effects/audio_effect_chorus.cpp msgid "Voice Count" -msgstr "" +msgstr "Nombre de voix" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_delay.cpp #: servers/audio/effects/audio_effect_reverb.cpp msgid "Dry" -msgstr "" +msgstr "Sec" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_reverb.cpp msgid "Wet" -msgstr "" +msgstr "Humide" #: servers/audio/effects/audio_effect_chorus.cpp msgid "Voice" -msgstr "" +msgstr "Voix" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_delay.cpp msgid "Delay (ms)" -msgstr "" +msgstr "Délai (ms)" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_phaser.cpp msgid "Rate Hz" -msgstr "" +msgstr "Débit (Hz)" #: servers/audio/effects/audio_effect_chorus.cpp -#, fuzzy msgid "Depth (ms)" -msgstr "Profondeur" +msgstr "Profondeur (ms)" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_delay.cpp msgid "Level dB" -msgstr "" +msgstr "Niveau (dB)" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_delay.cpp @@ -27195,16 +26931,15 @@ msgstr "Pan" #: servers/audio/effects/audio_effect_compressor.cpp #: servers/audio/effects/audio_effect_filter.cpp msgid "Gain" -msgstr "" +msgstr "Gain" #: servers/audio/effects/audio_effect_compressor.cpp msgid "Attack (µs)" -msgstr "" +msgstr "Attaque (µs)" #: servers/audio/effects/audio_effect_compressor.cpp -#, fuzzy msgid "Release (ms)" -msgstr "Publication (release)" +msgstr "Relâche (ms)" #: servers/audio/effects/audio_effect_compressor.cpp msgid "Mix" @@ -27225,36 +26960,32 @@ msgstr "" #: servers/audio/effects/audio_effect_delay.cpp #: servers/audio/effects/audio_effect_phaser.cpp #: servers/audio/effects/audio_effect_reverb.cpp -#, fuzzy msgid "Feedback" -msgstr "Envoyez vos retours sur la documentation" +msgstr "Larsen" #: servers/audio/effects/audio_effect_delay.cpp -#, fuzzy msgid "Low-pass" -msgstr "Contourner" +msgstr "Passe-bas" #: servers/audio/effects/audio_effect_distortion.cpp msgid "Pre Gain" -msgstr "" +msgstr "Pré-gain" #: servers/audio/effects/audio_effect_distortion.cpp msgid "Keep Hf Hz" -msgstr "" +msgstr "Garder haute fréquences (Hz)" #: servers/audio/effects/audio_effect_distortion.cpp msgid "Drive" msgstr "" #: servers/audio/effects/audio_effect_distortion.cpp -#, fuzzy msgid "Post Gain" -msgstr "Post" +msgstr "Post-gain" #: servers/audio/effects/audio_effect_filter.cpp -#, fuzzy msgid "Resonance" -msgstr "Ressource" +msgstr "Résonance" #: servers/audio/effects/audio_effect_limiter.cpp msgid "Ceiling dB" @@ -27424,22 +27155,19 @@ msgstr "Collisions avec les zones" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Motion Remainder" -msgstr "" +msgstr "Reste de mouvement" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collision Point" -msgstr "Mode collision" +msgstr "Point de collision" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collision Normal" -msgstr "Mode collision" +msgstr "Normale de collision" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collision Depth" -msgstr "Mode collision" +msgstr "Profondeur de collision" #: servers/physics_2d_server.cpp servers/physics_server.cpp #, fuzzy @@ -27452,18 +27180,16 @@ msgid "Collision Unsafe Fraction" msgstr "Mode collision" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Physics Engine" -msgstr "Image physique %" +msgstr "Moteur physique" #: servers/physics_server.cpp -#, fuzzy msgid "Center Of Mass" -msgstr "Centré à Gauche" +msgstr "Centre de la masse" #: servers/physics_server.cpp msgid "Principal Inertia Axes" -msgstr "" +msgstr "Axes principaux d'inertie" #: servers/visual/shader_language.cpp msgid "Varying may not be assigned in the '%s' function." @@ -27509,47 +27235,40 @@ msgid "Render Loop Enabled" msgstr "Filtrer les signaux" #: servers/visual_server.cpp -#, fuzzy msgid "VRAM Compression" -msgstr "Expression" +msgstr "Compression VRAM" #: servers/visual_server.cpp -#, fuzzy msgid "Import BPTC" -msgstr "Importation" +msgstr "Importer BPTC" #: servers/visual_server.cpp -#, fuzzy msgid "Import S3TC" -msgstr "Importation" +msgstr "Importer S3TC" #: servers/visual_server.cpp -#, fuzzy msgid "Import ETC" -msgstr "Importation" +msgstr "Importer ETC" #: servers/visual_server.cpp -#, fuzzy msgid "Import ETC2" -msgstr "Importation" +msgstr "Importer ETC2" #: servers/visual_server.cpp -#, fuzzy msgid "Import PVRTC" -msgstr "Importer un thème" +msgstr "Importer PVRTC" #: servers/visual_server.cpp msgid "Lossless Compression" -msgstr "" +msgstr "Compression sans perte" #: servers/visual_server.cpp -#, fuzzy msgid "Force PNG" -msgstr "Force-pousser" +msgstr "Forcer PNG" #: servers/visual_server.cpp msgid "WebP Compression Level" -msgstr "" +msgstr "Niveau de compression WebP" #: servers/visual_server.cpp msgid "Time Rollover Secs" @@ -27577,14 +27296,12 @@ msgid "Quadrant 3 Subdiv" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Shadows" -msgstr "Ombrage" +msgstr "Ombres" #: servers/visual_server.cpp -#, fuzzy msgid "Filter Mode" -msgstr "Filtrer les nÅ“uds" +msgstr "Mode de filtrage" #: servers/visual_server.cpp #, fuzzy @@ -27593,16 +27310,15 @@ msgstr "Centrer sur la sélection" #: servers/visual_server.cpp msgid "High Quality GGX" -msgstr "" +msgstr "GGX haute qualité" #: servers/visual_server.cpp msgid "Irradiance Max Size" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Shading" -msgstr "Remplissage(Padding)" +msgstr "Ombrage" #: servers/visual_server.cpp msgid "Force Vertex Shading" @@ -27610,11 +27326,11 @@ msgstr "" #: servers/visual_server.cpp msgid "Force Lambert Over Burley" -msgstr "" +msgstr "Forcer Lambert au lieu de Burley" #: servers/visual_server.cpp msgid "Force Blinn Over GGX" -msgstr "" +msgstr "Forcer Blinn au lieu de GGX" #: servers/visual_server.cpp msgid "Mesh Storage" @@ -27639,15 +27355,15 @@ msgstr "" #: servers/visual_server.cpp msgid "Anisotropic Filter Level" -msgstr "" +msgstr "Niveau de filtrage anisotropique" #: servers/visual_server.cpp msgid "Use Nearest Mipmap Filter" -msgstr "" +msgstr "Utiliser le filtre Mipmap le plus proche" #: servers/visual_server.cpp msgid "Skinning" -msgstr "" +msgstr "Enveloppement" #: servers/visual_server.cpp msgid "Software Skinning Fallback" @@ -27674,9 +27390,8 @@ msgid "Batching Send Null" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Batching Stream" -msgstr "Renommer par lot" +msgstr "Flux de traitement en lot" #: servers/visual_server.cpp msgid "Legacy Orphan Buffers" @@ -27724,7 +27439,7 @@ msgstr "Taille de tampon des lots" #: servers/visual_server.cpp msgid "Item Reordering Lookahead" -msgstr "" +msgstr "Anticipation de réorganisation d’éléments" #: servers/visual_server.cpp msgid "Flash Batching" diff --git a/editor/translations/ga.po b/editor/translations/ga.po index 87e005f5f3..246c04dc63 100644 --- a/editor/translations/ga.po +++ b/editor/translations/ga.po @@ -4360,6 +4360,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7057,7 +7058,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -14756,18 +14758,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Nód Beochana" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Nód Beochana" #: editor/scene_tree_dock.cpp @@ -14957,6 +14959,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Nód Beochana" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15020,6 +15027,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -16823,6 +16834,18 @@ msgstr "" msgid "Auto Update Project" msgstr "" +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "C# Project Directory" +msgstr "" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18530,6 +18553,10 @@ msgstr "Cruthaigh" msgid "Custom BG Color" msgstr "Cruthaigh" +#: platform/iphone/export/export.cpp +msgid "Export Icons" +msgstr "" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19326,6 +19353,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/gl.po b/editor/translations/gl.po index 29db0e8063..2445ec4783 100644 --- a/editor/translations/gl.po +++ b/editor/translations/gl.po @@ -4631,6 +4631,7 @@ msgstr "Ferramentas varias do proxecto ou escena." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Proxecto" @@ -7532,7 +7533,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15575,18 +15577,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Nome do Nodo:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Nome do Nodo:" #: editor/scene_tree_dock.cpp @@ -15779,6 +15781,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Nome do Nodo:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15842,6 +15849,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Renomear Nodo" @@ -17741,6 +17752,21 @@ msgstr "Resolución á Metade" msgid "Auto Update Project" msgstr "Proxecto Sen Nome" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Amosar Todo" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Elixir un Directorio" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Elixir un Directorio" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19565,6 +19591,11 @@ msgstr "Cortar Nodos" msgid "Custom BG Color" msgstr "Cortar Nodos" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Expandir Todo" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20414,6 +20445,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/he.po b/editor/translations/he.po index abaada7880..e0a690c9b4 100644 --- a/editor/translations/he.po +++ b/editor/translations/he.po @@ -22,13 +22,14 @@ # Ram Tourgeman <ramtorgeman@gmail.com>, 2021. # Shailee Eliyahu <dev.sle.il@gmail.com>, 2021. # Mati Borlak <matiborlak@gmail.com>, 2022. +# Tamir Livneh <fkeyzuwu@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-06-08 06:48+0000\n" -"Last-Translator: Mati Borlak <matiborlak@gmail.com>\n" +"PO-Revision-Date: 2022-09-05 11:17+0000\n" +"Last-Translator: Tamir Livneh <fkeyzuwu@gmail.com>\n" "Language-Team: Hebrew <https://hosted.weblate.org/projects/godot-engine/" "godot/he/>\n" "Language: he\n" @@ -37,7 +38,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && " "n % 10 == 0) ? 2 : 3));\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -4545,6 +4546,7 @@ msgstr "×›×œ×™× ×©×•× ×™× ×œ×ž×™×–× ×ו למגוון ×¡×¦× ×•×ª." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "מיז×" @@ -5026,7 +5028,7 @@ msgstr "יוצרי×" #: editor/editor_plugin_settings.cpp #: modules/gdnative/gdnative_library_singleton_editor.cpp msgid "Status" -msgstr "" +msgstr "מצב" #: editor/editor_profiler.cpp msgid "Measure:" @@ -5091,9 +5093,8 @@ msgid "Profiler Frame Max Functions" msgstr "×©×™× ×•×™ ×©× ×¤×•× ×§×¦×™×”" #: editor/editor_properties.cpp -#, fuzzy msgid "Edit Text:" -msgstr "חברי×" +msgstr "ערוך טקסט:" #: editor/editor_properties.cpp editor/script_create_dialog.cpp #: scene/resources/default_theme/default_theme.cpp @@ -5105,7 +5106,7 @@ msgstr "" #: scene/3d/collision_object.cpp scene/3d/soft_body.cpp #: scene/main/canvas_layer.cpp msgid "Layer" -msgstr "" +msgstr "שכבה" #: editor/editor_properties.cpp msgid "Bit %d, value %d" @@ -5160,19 +5161,19 @@ msgstr "" #: editor/editor_properties_array_dict.cpp #: editor/plugins/theme_editor_plugin.cpp msgid "Remove Item" -msgstr "" +msgstr "הסר פריט" #: editor/editor_properties_array_dict.cpp msgid "New Key:" -msgstr "" +msgstr "מפתח חדש:" #: editor/editor_properties_array_dict.cpp msgid "New Value:" -msgstr "" +msgstr "ערך חדש:" #: editor/editor_properties_array_dict.cpp msgid "Add Key/Value Pair" -msgstr "" +msgstr "הוסף זוג מפתח/ערך" #: editor/editor_resource_picker.cpp msgid "" @@ -5186,7 +5187,7 @@ msgstr "" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "Make Unique" -msgstr "" +msgstr "הפוך לייחודי" #: editor/editor_resource_picker.cpp #: editor/plugins/animation_blend_space_1d_editor.cpp @@ -5200,7 +5201,7 @@ msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp #: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" -msgstr "הדבקה" +msgstr "הדבק" #: editor/editor_resource_picker.cpp editor/property_editor.cpp #, fuzzy @@ -5233,7 +5234,7 @@ msgstr "הפעלה" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "New Script" -msgstr "" +msgstr "סקריפט חדש" #: editor/editor_resource_picker.cpp editor/scene_tree_dock.cpp #, fuzzy @@ -7474,7 +7475,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15677,18 +15679,19 @@ msgstr "" msgid "Make Local" msgstr "הפיכה למקומי" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "×©× ×”×ž×¤×¨×§:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "×”×©× ×›×‘×¨ בשימוש של ×¤×•× ×§×¦×™×”/×ž×©×ª× ×”/×ות ×חר:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "×©× ×”×ž×¤×¨×§:" #: editor/scene_tree_dock.cpp @@ -15882,6 +15885,11 @@ msgid "Button Group" msgstr "קבוצת ×œ×—×¦× ×™×" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "×©× ×”×ž×¤×¨×§:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(מתחבר מ)" @@ -15957,6 +15965,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "×©× ×ž×¤×¨×§ ×œ× ×—×•×§×™, ×”×ª×•×•×™× ×”×‘××™× ××™× × ×ž×•×ª×¨×™×:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "×©×™× ×•×™ ×©× ×ž×¤×¨×§" @@ -17864,6 +17876,21 @@ msgstr "מילוי הבחירה" msgid "Auto Update Project" msgstr "×™×™×¦×•× ×ž×™×–×" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "הצג הכל" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "× × ×œ×‘×—×•×¨ תיקייה" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "× × ×œ×‘×—×•×¨ תיקייה" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "סוף ×ž×—×¡× ×™×ª מעקב לחריגה ×¤× ×™×ž×™×ª" @@ -19716,6 +19743,11 @@ msgstr "גזירת מפרקי×" msgid "Custom BG Color" msgstr "גזירת מפרקי×" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "להרחיב הכול" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20567,6 +20599,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "×©× ×§×¦×¨ של חבילה ×œ× ×—×•×§×™." diff --git a/editor/translations/hi.po b/editor/translations/hi.po index e5a41404d0..5e3b28ff79 100644 --- a/editor/translations/hi.po +++ b/editor/translations/hi.po @@ -4549,6 +4549,7 @@ msgstr "विविध परियोजना या दृशà¥à¤¯-वà¥à¤ #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "परियोजना" @@ -7430,7 +7431,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15380,18 +15382,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "नोड का नाम:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "नोड का नाम:" #: editor/scene_tree_dock.cpp @@ -15588,6 +15590,11 @@ msgstr "" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "नोड का नाम:" + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr "कनेकà¥à¤Ÿ करने के लिठसंकेत:" @@ -15652,6 +15659,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17527,6 +17538,21 @@ msgstr "सà¤à¥€ खंड" msgid "Auto Update Project" msgstr "परियोजना" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "सब दिखाइà¤" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "डायरेकà¥à¤Ÿà¤°à¥€ चà¥à¤¨à¥‡à¤‚" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "डायरेकà¥à¤Ÿà¤°à¥€ चà¥à¤¨à¥‡à¤‚" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19330,6 +19356,11 @@ msgstr "पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿" msgid "Custom BG Color" msgstr "पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "सà¤à¥€ बढाय" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20171,6 +20202,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "गलत फॉणà¥à¤Ÿ का आकार |" diff --git a/editor/translations/hr.po b/editor/translations/hr.po index e473c6556c..21a20978a6 100644 --- a/editor/translations/hr.po +++ b/editor/translations/hr.po @@ -5,14 +5,15 @@ # Unlimited Creativity <marinosah1@gmail.com>, 2019. # Patik <patrikfs5@gmail.com>, 2019. # Nikola Bunjevac <nikola.bunjevac@gmail.com>, 2019, 2020. -# LeoClose <leoclose575@gmail.com>, 2020, 2021. +# LeoClose <leoclose575@gmail.com>, 2020, 2021, 2022. # Filip <fhomolka@protonmail.com>, 2022. +# Milo Ivir <mail@milotype.de>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-07-23 03:57+0000\n" -"Last-Translator: Filip <fhomolka@protonmail.com>\n" +"PO-Revision-Date: 2022-09-27 21:37+0000\n" +"Last-Translator: Milo Ivir <mail@milotype.de>\n" "Language-Team: Croatian <https://hosted.weblate.org/projects/godot-engine/" "godot/hr/>\n" "Language: hr\n" @@ -20,7 +21,7 @@ msgstr "" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -28,16 +29,15 @@ msgstr "UpravljaÄki program za Tablet" #: core/bind/core_bind.cpp msgid "Clipboard" -msgstr "" +msgstr "MeÄ‘uspremnik" #: core/bind/core_bind.cpp -#, fuzzy msgid "Current Screen" -msgstr "Premjesti Okvir" +msgstr "Trenutni Ekran" #: core/bind/core_bind.cpp msgid "Exit Code" -msgstr "" +msgstr "Exit Kod" #: core/bind/core_bind.cpp msgid "V-Sync Enabled" @@ -77,38 +77,31 @@ msgstr "Orijentacija zaslona" #: core/bind/core_bind.cpp core/project_settings.cpp main/main.cpp #: platform/uwp/os_uwp.cpp -#, fuzzy msgid "Window" msgstr "Prozor" #: core/bind/core_bind.cpp core/project_settings.cpp -#, fuzzy msgid "Borderless" msgstr "Bez obruba" #: core/bind/core_bind.cpp -#, fuzzy msgid "Per Pixel Transparency Enabled" msgstr "Omogućena prozirnost po pikselu" #: core/bind/core_bind.cpp core/project_settings.cpp -#, fuzzy msgid "Fullscreen" msgstr "Cijeli zaslon" #: core/bind/core_bind.cpp -#, fuzzy msgid "Maximized" msgstr "Maksimiziran" #: core/bind/core_bind.cpp -#, fuzzy msgid "Minimized" msgstr "Minimiziran" #: core/bind/core_bind.cpp core/project_settings.cpp scene/gui/dialogs.cpp #: scene/gui/graph_node.cpp -#, fuzzy msgid "Resizable" msgstr "Mogućnost promjene veliÄine" @@ -117,7 +110,6 @@ msgstr "Mogućnost promjene veliÄine" #: scene/3d/physics_body.cpp scene/3d/remote_transform.cpp #: scene/gui/control.cpp scene/gui/line_edit.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Position" msgstr "Pozicija" @@ -130,38 +122,32 @@ msgstr "Pozicija" #: scene/resources/primitive_meshes.cpp scene/resources/sky.cpp #: scene/resources/style_box.cpp scene/resources/texture.cpp #: scene/resources/visual_shader.cpp servers/visual_server.cpp -#, fuzzy msgid "Size" msgstr "VeliÄina" #: core/bind/core_bind.cpp msgid "Endian Swap" -msgstr "" +msgstr "Promjena Endian-a" #: core/bind/core_bind.cpp -#, fuzzy msgid "Editor Hint" msgstr "Savjet Urednika" #: core/bind/core_bind.cpp -#, fuzzy msgid "Print Error Messages" msgstr "Ispis poruka o pogreÅ¡kama" #: core/bind/core_bind.cpp -#, fuzzy msgid "Iterations Per Second" msgstr "Iteracije u sekundi" #: core/bind/core_bind.cpp -#, fuzzy msgid "Target FPS" msgstr "Ciljani FPS" #: core/bind/core_bind.cpp -#, fuzzy msgid "Time Scale" -msgstr "Vremenska skala" +msgstr "Skala vremena" #: core/bind/core_bind.cpp main/main.cpp msgid "Physics Jitter Fix" @@ -169,7 +155,7 @@ msgstr "" #: core/bind/core_bind.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Error" -msgstr "" +msgstr "GreÅ¡ka" #: core/bind/core_bind.cpp #, fuzzy @@ -342,7 +328,7 @@ msgstr "Neispravan unos %i (nije uspio) u izrazu" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" -msgstr "self se ne može koristiti jer instanca je null (nije prosljeÄ‘ena)" +msgstr "self se ne može koristiti jer je instanca null (nije prosljeÄ‘ena)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." @@ -1414,7 +1400,7 @@ msgstr "OkidaÄ" #: editor/animation_track_editor.cpp scene/3d/baked_lightmap.cpp msgid "Capture" -msgstr "" +msgstr "Snimka" #: editor/animation_track_editor.cpp msgid "Nearest" @@ -4437,6 +4423,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7213,7 +7200,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15012,18 +15000,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Naziv ÄŒvora(node):" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Naziv ÄŒvora(node):" #: editor/scene_tree_dock.cpp @@ -15213,6 +15201,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Naziv ÄŒvora(node):" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15276,6 +15269,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17118,6 +17115,21 @@ msgstr "" msgid "Auto Update Project" msgstr "Uredi vezu:" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "NaÄin reprodukcije:" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Otvori direktorij" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Otvori direktorij" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18871,6 +18883,11 @@ msgstr "Funkcije" msgid "Custom BG Color" msgstr "Funkcije" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Izvoz" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19686,6 +19703,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" @@ -24271,9 +24294,8 @@ msgid "Draw 2D Outlines" msgstr "" #: scene/main/scene_tree.cpp servers/visual_server.cpp -#, fuzzy msgid "Reflections" -msgstr "Direkcije" +msgstr "Reflekcija" #: scene/main/scene_tree.cpp msgid "Atlas Size" diff --git a/editor/translations/hu.po b/editor/translations/hu.po index b35be76368..996249e619 100644 --- a/editor/translations/hu.po +++ b/editor/translations/hu.po @@ -4662,6 +4662,7 @@ msgstr "Egyéb projekt- vagy Scene-szintű eszközök." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projekt" @@ -7570,7 +7571,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15520,18 +15522,19 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Node neve:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "A nevet már használja egy függvény/változó/jelzés:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Node neve:" #: editor/scene_tree_dock.cpp @@ -15723,6 +15726,11 @@ msgid "Button Group" msgstr "Gombcsoport" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Node neve:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Csatlakozás Innen)" @@ -15786,6 +15794,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17698,6 +17710,21 @@ msgstr "Kijelölés kitöltése" msgid "Auto Update Project" msgstr "Névtelen projekt" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Az összes megjelenÃtése" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Válasszon egy Könyvtárat" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Válasszon egy Könyvtárat" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19524,6 +19551,11 @@ msgstr "Node-ok kivágása" msgid "Custom BG Color" msgstr "Node-ok kivágása" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Összes kinyitása" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20374,6 +20406,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Érvénytelen rövid csomagnév." diff --git a/editor/translations/id.po b/editor/translations/id.po index 7d839357cd..ee7e21c0c0 100644 --- a/editor/translations/id.po +++ b/editor/translations/id.po @@ -40,13 +40,14 @@ # Rizky Ramadhan <rizkyterm@gmail.com>, 2022. # Primananda Kurnia <primakurnia71@gmail.com>, 2022. # FellowMustard <rachmawanng33@gmail.com>, 2022. +# Muhammad Zainal Abidin <eviepk12@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-31 18:34+0000\n" -"Last-Translator: ProgrammerIndonesia 44 <elo.jhy@gmail.com>\n" +"PO-Revision-Date: 2022-09-27 21:37+0000\n" +"Last-Translator: Muhammad Zainal Abidin <eviepk12@gmail.com>\n" "Language-Team: Indonesian <https://hosted.weblate.org/projects/godot-engine/" "godot/id/>\n" "Language: id\n" @@ -54,7 +55,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -2800,7 +2801,7 @@ msgstr "Pilih" #: editor/editor_export.cpp msgid "Project export for platform:" -msgstr "" +msgstr "Proyek ekspor untuk platform:" #: editor/editor_export.cpp #, fuzzy @@ -2849,9 +2850,8 @@ msgid "Can't open file to read from path \"%s\"." msgstr "Tidak dapat membuka file untuk menulis:" #: editor/editor_export.cpp -#, fuzzy msgid "Save ZIP" -msgstr "Simpan Sebagai" +msgstr "Simpan ZIP" #: editor/editor_export.cpp msgid "" @@ -2878,7 +2878,7 @@ msgid "" msgstr "" "Platform target membutuhkan kompressi tekstur 'ETC' untuk mengembalikan " "driver ke GLES2. \n" -"Aktifkan 'Impor Lainnya' di Pengaturan Proyek, atau matikan 'Driver Fallback " +"Aktifkan 'Impor Etc' di Pengaturan Proyek, atau matikan 'Driver Fallback " "Enabled'." #: editor/editor_export.cpp @@ -2895,7 +2895,7 @@ msgid "" "Enable 'Import Etc 2' or 'Import Pvrtc' in Project Settings." msgstr "" "Platform target membutuhkan kompresi tekstur 'ETC2' atau 'PVRTC' untuk " -"GLES3. Aktifkan 'Impor Lainnya 2' atau 'Import Pvrtc' di Pengaturan Proyek." +"GLES3. Aktifkan 'Impor Etc 2' atau 'Import Pvrtc' di Pengaturan Proyek." #: editor/editor_export.cpp msgid "" @@ -2930,7 +2930,7 @@ msgstr "Operator warna." #: editor/editor_export.cpp msgid "64 Bits" -msgstr "" +msgstr "64 Bits" #: editor/editor_export.cpp msgid "Embed PCK" @@ -4576,6 +4576,7 @@ msgstr "Perkakas macam-macam proyek atau lingkup skena." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Proyek" @@ -7470,7 +7471,8 @@ msgid "8 Bit" msgstr "8 Bit" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15624,18 +15626,19 @@ msgstr "" msgid "Make Local" msgstr "Jadikan Local" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Nama Unik" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "Nama telah digunakan oleh fungsi/variabel/sinyal yang lain:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Nama Unik" #: editor/scene_tree_dock.cpp @@ -15839,6 +15842,11 @@ msgid "Button Group" msgstr "Tombol Grup" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Nama Unik" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Menghubungkan dari)" @@ -15914,6 +15922,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "Nama node tidak valid, karakter berikut tidak diperbolehkan:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Ubah Nama Node" @@ -17795,6 +17807,21 @@ msgstr "Isi Pilihan" msgid "Auto Update Project" msgstr "Proyek Tanpa Nama" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Nama Tampilan" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Pilih sebuah Direktori" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Pilih sebuah Direktori" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Akhir dari inner exception stack trace" @@ -19648,6 +19675,11 @@ msgstr "Potong Node" msgid "Custom BG Color" msgstr "Potong Node" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Ikon Ekspor" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20510,6 +20542,12 @@ msgid "Show Name On Square 310 X 310" msgstr "Tampilkan Nama Pada Persegi 310 X 310" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Nama pendek paket tidak valid." diff --git a/editor/translations/ig.po b/editor/translations/ig.po new file mode 100644 index 0000000000..8d96de35f3 --- /dev/null +++ b/editor/translations/ig.po @@ -0,0 +1,26106 @@ +# Igbo translation of the Godot Engine editor. +# Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. +# Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). +# This file is distributed under the same license as the Godot source code. +# +# Chenny <optimusdev12@gmail.com>, 2022. +msgid "" +msgstr "" +"Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" +"PO-Revision-Date: 2022-08-07 18:37+0000\n" +"Last-Translator: Chenny <optimusdev12@gmail.com>\n" +"Language-Team: Igbo <https://hosted.weblate.org/projects/godot-engine/godot/" +"ig/>\n" +"Language: ig\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8-bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.14-dev\n" + +#: core/bind/core_bind.cpp main/main.cpp +msgid "Tablet Driver" +msgstr "Onye na-anya mbadamba mbadamba" + +#: core/bind/core_bind.cpp +msgid "Clipboard" +msgstr "Klipbá»á»dụ" + +#: core/bind/core_bind.cpp +msgid "Current Screen" +msgstr "Ihuenyo dị ugbu a" + +#: core/bind/core_bind.cpp +msgid "Exit Code" +msgstr "Koodu á»pụpụ" + +#: core/bind/core_bind.cpp +msgid "V-Sync Enabled" +msgstr "Agbanyere V-mmeká»rịta" + +#: core/bind/core_bind.cpp main/main.cpp +msgid "V-Sync Via Compositor" +msgstr "V-mmeká»rịta Site na ihe mejupụtara" + +#: core/bind/core_bind.cpp main/main.cpp +msgid "Delta Smoothing" +msgstr "Delta na-ehi ụra" + +#: core/bind/core_bind.cpp +msgid "Low Processor Usage Mode" +msgstr "Ụdị ojiji Processor dị ala" + +#: core/bind/core_bind.cpp +msgid "Low Processor Usage Mode Sleep (µsec)" +msgstr "Ụdị ihi ụra dị ala (µ sec)" + +#: core/bind/core_bind.cpp main/main.cpp platform/uwp/os_uwp.cpp +msgid "Keep Screen On" +msgstr "Debe ihuenyo" + +#: core/bind/core_bind.cpp +msgid "Min Window Size" +msgstr "Ogo Obere Obere" + +#: core/bind/core_bind.cpp +msgid "Max Window Size" +msgstr "Oke windo kacha" + +#: core/bind/core_bind.cpp +msgid "Screen Orientation" +msgstr "Usoro ihuenyo" + +#: core/bind/core_bind.cpp core/project_settings.cpp main/main.cpp +#: platform/uwp/os_uwp.cpp +msgid "Window" +msgstr "Ohere" + +#: core/bind/core_bind.cpp core/project_settings.cpp +msgid "Borderless" +msgstr "Enweghị oke" + +#: core/bind/core_bind.cpp +msgid "Per Pixel Transparency Enabled" +msgstr "Agbanyere nghá»ta kwa Pixel" + +#: core/bind/core_bind.cpp core/project_settings.cpp +msgid "Fullscreen" +msgstr "Ihuenyo zuru oke" + +#: core/bind/core_bind.cpp +msgid "Maximized" +msgstr "Oke kachasị" + +#: core/bind/core_bind.cpp +msgid "Minimized" +msgstr "Ebelatala" + +#: core/bind/core_bind.cpp core/project_settings.cpp scene/gui/dialogs.cpp +#: scene/gui/graph_node.cpp +msgid "Resizable" +msgstr "Enwere ike ịgbanwe" + +#: core/bind/core_bind.cpp core/os/input_event.cpp scene/2d/node_2d.cpp +#: scene/2d/physics_body_2d.cpp scene/2d/remote_transform_2d.cpp +#: scene/3d/physics_body.cpp scene/3d/remote_transform.cpp +#: scene/gui/control.cpp scene/gui/line_edit.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Position" +msgstr "Ọná»dụ" + +#: core/bind/core_bind.cpp core/project_settings.cpp editor/editor_settings.cpp +#: main/main.cpp modules/gridmap/grid_map.cpp +#: modules/visual_script/visual_script_nodes.cpp scene/2d/tile_map.cpp +#: scene/3d/camera.cpp scene/3d/light.cpp scene/gui/control.cpp +#: scene/gui/graph_edit.cpp scene/main/viewport.cpp +#: scene/resources/dynamic_font.cpp scene/resources/navigation_mesh.cpp +#: scene/resources/primitive_meshes.cpp scene/resources/sky.cpp +#: scene/resources/style_box.cpp scene/resources/texture.cpp +#: scene/resources/visual_shader.cpp servers/visual_server.cpp +msgid "Size" +msgstr "Nha" + +#: core/bind/core_bind.cpp +msgid "Endian Swap" +msgstr "Endian gbanwere" + +#: core/bind/core_bind.cpp +msgid "Editor Hint" +msgstr "Ntuziaka nchịká»ta akụká»" + +#: core/bind/core_bind.cpp +msgid "Print Error Messages" +msgstr "Bipụta ozi mperi" + +#: core/bind/core_bind.cpp +msgid "Iterations Per Second" +msgstr "Nkwagharị kwa nkeji" + +#: core/bind/core_bind.cpp +msgid "Target FPS" +msgstr "Ebumnuche FPS" + +#: core/bind/core_bind.cpp +msgid "Time Scale" +msgstr "Ogologo oge" + +#: core/bind/core_bind.cpp main/main.cpp +msgid "Physics Jitter Fix" +msgstr "" + +#: core/bind/core_bind.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Error" +msgstr "Njehie" + +#: core/bind/core_bind.cpp +msgid "Error String" +msgstr "Eriri mperi" + +#: core/bind/core_bind.cpp +msgid "Error Line" +msgstr "Ahịrị mperi" + +#: core/bind/core_bind.cpp +msgid "Result" +msgstr "Nsonaazụ" + +#: core/command_queue_mt.cpp core/message_queue.cpp main/main.cpp +msgid "Memory" +msgstr "Ebe nchekwa" + +#: core/command_queue_mt.cpp core/message_queue.cpp +#: core/register_core_types.cpp drivers/gles2/rasterizer_canvas_base_gles2.cpp +#: drivers/gles2/rasterizer_scene_gles2.cpp +#: drivers/gles3/rasterizer_canvas_base_gles3.cpp +#: drivers/gles3/rasterizer_scene_gles3.cpp +#: drivers/gles3/rasterizer_storage_gles3.cpp main/main.cpp +#: modules/webrtc/webrtc_data_channel.h modules/websocket/websocket_macros.h +#: servers/visual_server.cpp +msgid "Limits" +msgstr "Oke" + +#: core/command_queue_mt.cpp +msgid "Command Queue" +msgstr "Queue iwu" + +#: core/command_queue_mt.cpp +msgid "Multithreading Queue Size (KB)" +msgstr "Ogo Queue Multithreading (KB)" + +#: core/func_ref.cpp modules/visual_script/visual_script_builtin_funcs.cpp +#: modules/visual_script/visual_script_func_nodes.cpp +#: modules/visual_script/visual_script_nodes.cpp +#: scene/resources/visual_shader_nodes.cpp +msgid "Function" +msgstr "Ọrụ" + +#: core/image.cpp core/packed_data_container.cpp scene/2d/polygon_2d.cpp +#: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp +msgid "Data" +msgstr "Data" + +#: core/io/file_access_network.cpp core/register_core_types.cpp +#: editor/editor_file_dialog.cpp editor/editor_settings.cpp main/main.cpp +#: modules/gdscript/language_server/gdscript_language_server.cpp +#: modules/webrtc/webrtc_data_channel.h modules/websocket/websocket_macros.h +#: scene/gui/file_dialog.cpp +msgid "Network" +msgstr "Netwá»k" + +#: core/io/file_access_network.cpp +msgid "Remote FS" +msgstr "FS dịpụrụ adịpụ" + +#: core/io/file_access_network.cpp +msgid "Page Size" +msgstr "Nha ibe" + +#: core/io/file_access_network.cpp +msgid "Page Read Ahead" +msgstr "Ibe GụỠn'ihu" + +#: core/io/http_client.cpp +msgid "Blocking Mode Enabled" +msgstr "Agbanyere á»ná»dụ mgbochi" + +#: core/io/http_client.cpp +msgid "Connection" +msgstr "Njiká»" + +#: core/io/http_client.cpp +msgid "Read Chunk Size" +msgstr "GụỠnha nha" + +#: core/io/marshalls.cpp +msgid "Object ID" +msgstr "NJ ihe" + +#: core/io/multiplayer_api.cpp core/io/packet_peer.cpp +msgid "Allow Object Decoding" +msgstr "Kwe ka Nhazi ihe" + +#: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp +msgid "Refuse New Network Connections" +msgstr "Jụ njiká» netwá»kụ á»hụrụ" + +#: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp +msgid "Network Peer" +msgstr "Ndị á»gbá» netwá»k" + +#: core/io/multiplayer_api.cpp scene/animation/animation_player.cpp +msgid "Root Node" +msgstr "Mgbá»rá»gwụ Node" + +#: core/io/networked_multiplayer_peer.cpp +msgid "Refuse New Connections" +msgstr "Jụ njiká» á»hụrụ" + +#: core/io/networked_multiplayer_peer.cpp +msgid "Transfer Mode" +msgstr "Ụdị nnyefe" + +#: core/io/packet_peer.cpp +msgid "Encode Buffer Max Size" +msgstr "Gbanye ihe nchekwa oke nha" + +#: core/io/packet_peer.cpp +msgid "Input Buffer Max Size" +msgstr "Ntinye ihe nchekwa oke oke" + +#: core/io/packet_peer.cpp +msgid "Output Buffer Max Size" +msgstr "" + +#: core/io/packet_peer.cpp +msgid "Stream Peer" +msgstr "" + +#: core/io/stream_peer.cpp +msgid "Big Endian" +msgstr "" + +#: core/io/stream_peer.cpp +msgid "Data Array" +msgstr "" + +#: core/io/stream_peer_ssl.cpp +msgid "Blocking Handshake" +msgstr "" + +#: core/io/udp_server.cpp +msgid "Max Pending Connections" +msgstr "" + +#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp +#: modules/visual_script/visual_script_builtin_funcs.cpp +msgid "Invalid type argument to convert(), use TYPE_* constants." +msgstr "" + +#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp +msgid "Expected a string of length 1 (a character)." +msgstr "" + +#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp +#: modules/mono/glue/gd_glue.cpp +#: modules/visual_script/visual_script_builtin_funcs.cpp +msgid "Not enough bytes for decoding bytes, or invalid format." +msgstr "" + +#: core/math/expression.cpp +msgid "Invalid input %d (not passed) in expression" +msgstr "" + +#: core/math/expression.cpp +msgid "self can't be used because instance is null (not passed)" +msgstr "" + +#: core/math/expression.cpp +msgid "Invalid operands to operator %s, %s and %s." +msgstr "" + +#: core/math/expression.cpp +msgid "Invalid index of type %s for base type %s" +msgstr "" + +#: core/math/expression.cpp +msgid "Invalid named index '%s' for base type %s" +msgstr "" + +#: core/math/expression.cpp +msgid "Invalid arguments to construct '%s'" +msgstr "" + +#: core/math/expression.cpp +msgid "On call to '%s':" +msgstr "" + +#: core/math/random_number_generator.cpp +#: modules/opensimplex/open_simplex_noise.cpp +msgid "Seed" +msgstr "" + +#: core/math/random_number_generator.cpp +msgid "State" +msgstr "" + +#: core/message_queue.cpp +msgid "Message Queue" +msgstr "" + +#: core/message_queue.cpp +msgid "Max Size (KB)" +msgstr "" + +#: core/os/input.cpp +msgid "Mouse Mode" +msgstr "" + +#: core/os/input.cpp +msgid "Use Accumulated Input" +msgstr "" + +#: core/os/input_event.cpp editor/project_settings_editor.cpp +#: servers/audio_server.cpp +msgid "Device" +msgstr "" + +#: core/os/input_event.cpp +msgid "Alt" +msgstr "" + +#: core/os/input_event.cpp +msgid "Shift" +msgstr "" + +#: core/os/input_event.cpp +msgid "Control" +msgstr "" + +#: core/os/input_event.cpp +msgid "Meta" +msgstr "" + +#: core/os/input_event.cpp +msgid "Command" +msgstr "" + +#: core/os/input_event.cpp +msgid "Physical" +msgstr "" + +#: core/os/input_event.cpp scene/2d/touch_screen_button.cpp +#: scene/gui/base_button.cpp scene/gui/texture_button.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Pressed" +msgstr "" + +#: core/os/input_event.cpp +msgid "Scancode" +msgstr "" + +#: core/os/input_event.cpp +msgid "Physical Scancode" +msgstr "" + +#: core/os/input_event.cpp +msgid "Unicode" +msgstr "" + +#: core/os/input_event.cpp +msgid "Echo" +msgstr "" + +#: core/os/input_event.cpp scene/gui/base_button.cpp +msgid "Button Mask" +msgstr "" + +#: core/os/input_event.cpp scene/2d/node_2d.cpp scene/gui/control.cpp +msgid "Global Position" +msgstr "" + +#: core/os/input_event.cpp +msgid "Factor" +msgstr "" + +#: core/os/input_event.cpp +msgid "Button Index" +msgstr "" + +#: core/os/input_event.cpp +msgid "Doubleclick" +msgstr "" + +#: core/os/input_event.cpp +msgid "Tilt" +msgstr "" + +#: core/os/input_event.cpp +msgid "Pressure" +msgstr "" + +#: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp +msgid "Relative" +msgstr "" + +#: core/os/input_event.cpp scene/2d/camera_2d.cpp scene/2d/cpu_particles_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/interpolated_camera.cpp +#: scene/animation/animation_player.cpp scene/resources/environment.cpp +#: scene/resources/particles_material.cpp +msgid "Speed" +msgstr "" + +#: core/os/input_event.cpp editor/project_settings_editor.cpp +#: scene/3d/sprite_3d.cpp +msgid "Axis" +msgstr "" + +#: core/os/input_event.cpp +msgid "Axis Value" +msgstr "" + +#: core/os/input_event.cpp modules/visual_script/visual_script_func_nodes.cpp +msgid "Index" +msgstr "" + +#: core/os/input_event.cpp editor/project_settings_editor.cpp +#: modules/visual_script/visual_script_nodes.cpp +#: scene/2d/touch_screen_button.cpp +msgid "Action" +msgstr "" + +#: core/os/input_event.cpp scene/resources/environment.cpp +#: scene/resources/material.cpp +msgid "Strength" +msgstr "" + +#: core/os/input_event.cpp +msgid "Delta" +msgstr "" + +#: core/os/input_event.cpp +msgid "Channel" +msgstr "" + +#: core/os/input_event.cpp main/main.cpp +msgid "Message" +msgstr "" + +#: core/os/input_event.cpp +msgid "Pitch" +msgstr "" + +#: core/os/input_event.cpp scene/2d/cpu_particles_2d.cpp +#: scene/2d/physics_body_2d.cpp scene/3d/cpu_particles.cpp +#: scene/3d/physics_body.cpp scene/resources/particles_material.cpp +msgid "Velocity" +msgstr "" + +#: core/os/input_event.cpp +msgid "Instrument" +msgstr "" + +#: core/os/input_event.cpp +msgid "Controller Number" +msgstr "" + +#: core/os/input_event.cpp +msgid "Controller Value" +msgstr "" + +#: core/project_settings.cpp editor/editor_node.cpp main/main.cpp +#: platform/iphone/export/export.cpp platform/osx/export/export.cpp +#: platform/windows/export/export.cpp +msgid "Application" +msgstr "" + +#: core/project_settings.cpp main/main.cpp +msgid "Config" +msgstr "" + +#: core/project_settings.cpp +msgid "Project Settings Override" +msgstr "" + +#: core/project_settings.cpp core/resource.cpp +#: editor/animation_track_editor.cpp editor/editor_autoload_settings.cpp +#: editor/editor_help_search.cpp editor/editor_plugin_settings.cpp +#: editor/editor_profiler.cpp editor/plugins/tile_set_editor_plugin.cpp +#: editor/project_manager.cpp editor/settings_config_dialog.cpp +#: modules/gdnative/nativescript/nativescript.cpp +#: platform/android/export/export_plugin.cpp platform/iphone/export/export.cpp +#: platform/osx/export/export.cpp scene/2d/area_2d.cpp scene/3d/area.cpp +#: scene/3d/skeleton.cpp scene/main/node.cpp scene/resources/mesh_library.cpp +#: scene/resources/skin.cpp +msgid "Name" +msgstr "" + +#: core/project_settings.cpp editor/editor_help.cpp +#: modules/visual_script/visual_script_nodes.cpp platform/uwp/export/export.cpp +#: platform/windows/export/export.cpp +msgid "Description" +msgstr "" + +#: core/project_settings.cpp editor/editor_node.cpp editor/editor_settings.cpp +#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp +#: main/main.cpp platform/android/export/export_plugin.cpp +#: platform/javascript/export/export.cpp +msgid "Run" +msgstr "" + +#: core/project_settings.cpp editor/editor_node.cpp +#: editor/run_settings_dialog.cpp main/main.cpp +msgid "Main Scene" +msgstr "" + +#: core/project_settings.cpp +msgid "Disable stdout" +msgstr "" + +#: core/project_settings.cpp +msgid "Disable stderr" +msgstr "" + +#: core/project_settings.cpp +msgid "Use Hidden Project Data Directory" +msgstr "" + +#: core/project_settings.cpp +msgid "Use Custom User Dir" +msgstr "" + +#: core/project_settings.cpp +msgid "Custom User Dir Name" +msgstr "" + +#: core/project_settings.cpp main/main.cpp +#: platform/javascript/export/export.cpp platform/osx/export/export.cpp +#: platform/uwp/os_uwp.cpp +msgid "Display" +msgstr "" + +#: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp +#: modules/opensimplex/noise_texture.cpp scene/2d/line_2d.cpp +#: scene/3d/label_3d.cpp scene/gui/text_edit.cpp scene/resources/texture.cpp +msgid "Width" +msgstr "" + +#: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp +#: modules/gltf/gltf_node.cpp modules/opensimplex/noise_texture.cpp +#: scene/2d/light_2d.cpp scene/resources/capsule_shape.cpp +#: scene/resources/capsule_shape_2d.cpp scene/resources/cylinder_shape.cpp +#: scene/resources/font.cpp scene/resources/navigation_mesh.cpp +#: scene/resources/primitive_meshes.cpp scene/resources/texture.cpp +msgid "Height" +msgstr "" + +#: core/project_settings.cpp +msgid "Always On Top" +msgstr "" + +#: core/project_settings.cpp +msgid "Test Width" +msgstr "" + +#: core/project_settings.cpp +msgid "Test Height" +msgstr "" + +#: core/project_settings.cpp editor/animation_track_editor.cpp +#: editor/editor_audio_buses.cpp main/main.cpp servers/audio_server.cpp +msgid "Audio" +msgstr "" + +#: core/project_settings.cpp +msgid "Default Bus Layout" +msgstr "" + +#: core/project_settings.cpp editor/editor_export.cpp +#: editor/editor_file_system.cpp editor/editor_node.cpp +#: editor/editor_settings.cpp editor/script_create_dialog.cpp +#: scene/2d/camera_2d.cpp scene/3d/light.cpp scene/main/node.cpp +msgid "Editor" +msgstr "" + +#: core/project_settings.cpp +msgid "Main Run Args" +msgstr "" + +#: core/project_settings.cpp +msgid "Scene Naming" +msgstr "" + +#: core/project_settings.cpp +msgid "Search In File Extensions" +msgstr "" + +#: core/project_settings.cpp +msgid "Script Templates Search Path" +msgstr "" + +#: core/project_settings.cpp +msgid "Version Control Autoload On Startup" +msgstr "" + +#: core/project_settings.cpp +msgid "Version Control Plugin Name" +msgstr "" + +#: core/project_settings.cpp scene/2d/collision_object_2d.cpp +#: scene/3d/collision_object.cpp scene/gui/control.cpp +msgid "Input" +msgstr "" + +#: core/project_settings.cpp +msgid "UI Accept" +msgstr "" + +#: core/project_settings.cpp +msgid "UI Select" +msgstr "" + +#: core/project_settings.cpp +msgid "UI Cancel" +msgstr "" + +#: core/project_settings.cpp +msgid "UI Focus Next" +msgstr "" + +#: core/project_settings.cpp +msgid "UI Focus Prev" +msgstr "" + +#: core/project_settings.cpp +msgid "UI Left" +msgstr "" + +#: core/project_settings.cpp +msgid "UI Right" +msgstr "" + +#: core/project_settings.cpp +msgid "UI Up" +msgstr "" + +#: core/project_settings.cpp +msgid "UI Down" +msgstr "" + +#: core/project_settings.cpp +msgid "UI Page Up" +msgstr "" + +#: core/project_settings.cpp +msgid "UI Page Down" +msgstr "" + +#: core/project_settings.cpp +msgid "UI Home" +msgstr "" + +#: core/project_settings.cpp +msgid "UI End" +msgstr "" + +#: core/project_settings.cpp main/main.cpp modules/bullet/register_types.cpp +#: modules/bullet/space_bullet.cpp scene/2d/physics_body_2d.cpp +#: scene/3d/physics_body.cpp scene/main/scene_tree.cpp scene/main/viewport.cpp +#: scene/resources/world.cpp scene/resources/world_2d.cpp +#: servers/physics/space_sw.cpp servers/physics_2d/physics_2d_server_sw.cpp +#: servers/physics_2d/physics_2d_server_wrap_mt.h +#: servers/physics_2d/space_2d_sw.cpp servers/physics_2d_server.cpp +#: servers/physics_server.cpp +msgid "Physics" +msgstr "" + +#: core/project_settings.cpp editor/editor_settings.cpp +#: editor/import/resource_importer_layered_texture.cpp +#: editor/import/resource_importer_texture.cpp +#: editor/plugins/spatial_editor_plugin.cpp main/main.cpp +#: modules/bullet/register_types.cpp modules/bullet/space_bullet.cpp +#: scene/3d/physics_body.cpp scene/resources/world.cpp +#: servers/physics/space_sw.cpp servers/physics_server.cpp +msgid "3D" +msgstr "" + +#: core/project_settings.cpp +msgid "Smooth Trimesh Collision" +msgstr "" + +#: core/project_settings.cpp drivers/gles2/rasterizer_canvas_base_gles2.cpp +#: drivers/gles2/rasterizer_scene_gles2.cpp +#: drivers/gles2/rasterizer_storage_gles2.cpp +#: drivers/gles3/rasterizer_canvas_base_gles3.cpp +#: drivers/gles3/rasterizer_scene_gles3.cpp +#: drivers/gles3/rasterizer_storage_gles3.cpp main/main.cpp +#: modules/lightmapper_cpu/register_types.cpp scene/main/scene_tree.cpp +#: scene/main/viewport.cpp servers/visual/visual_server_scene.cpp +#: servers/visual_server.cpp +msgid "Rendering" +msgstr "" + +#: core/project_settings.cpp drivers/gles2/rasterizer_storage_gles2.cpp +#: drivers/gles3/rasterizer_scene_gles3.cpp +#: drivers/gles3/rasterizer_storage_gles3.cpp main/main.cpp +#: modules/lightmapper_cpu/register_types.cpp scene/3d/baked_lightmap.cpp +#: scene/main/scene_tree.cpp scene/resources/environment.cpp +#: scene/resources/multimesh.cpp servers/visual/visual_server_scene.cpp +#: servers/visual_server.cpp +msgid "Quality" +msgstr "" + +#: core/project_settings.cpp scene/gui/file_dialog.cpp +#: scene/main/scene_tree.cpp scene/resources/navigation_mesh.cpp +#: servers/visual_server.cpp +msgid "Filters" +msgstr "" + +#: core/project_settings.cpp scene/main/viewport.cpp +msgid "Sharpen Intensity" +msgstr "" + +#: core/project_settings.cpp editor/editor_export.cpp editor/editor_node.cpp +#: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp +#: editor/project_export.cpp main/main.cpp modules/gdscript/gdscript.cpp +#: modules/visual_script/visual_script.cpp +#: platform/android/export/export_plugin.cpp platform/iphone/export/export.cpp +#: platform/javascript/export/export.cpp platform/osx/export/export.cpp +#: platform/uwp/export/export.cpp scene/3d/room_manager.cpp +#: scene/main/scene_tree.cpp scene/resources/shape_2d.cpp +#: servers/visual_server.cpp +msgid "Debug" +msgstr "" + +#: core/project_settings.cpp main/main.cpp modules/gdscript/gdscript.cpp +#: modules/visual_script/visual_script.cpp scene/resources/dynamic_font.cpp +msgid "Settings" +msgstr "" + +#: core/project_settings.cpp editor/script_editor_debugger.cpp main/main.cpp +#: modules/mono/mono_gd/gd_mono.cpp +msgid "Profiler" +msgstr "" + +#: core/project_settings.cpp +msgid "Max Functions" +msgstr "" + +#: core/project_settings.cpp scene/3d/vehicle_body.cpp +msgid "Compression" +msgstr "" + +#: core/project_settings.cpp +msgid "Formats" +msgstr "" + +#: core/project_settings.cpp +msgid "Zstd" +msgstr "" + +#: core/project_settings.cpp +msgid "Long Distance Matching" +msgstr "" + +#: core/project_settings.cpp +msgid "Compression Level" +msgstr "" + +#: core/project_settings.cpp +msgid "Window Log Size" +msgstr "" + +#: core/project_settings.cpp +msgid "Zlib" +msgstr "" + +#: core/project_settings.cpp +msgid "Gzip" +msgstr "" + +#: core/project_settings.cpp platform/android/export/export.cpp +msgid "Android" +msgstr "" + +#: core/project_settings.cpp +msgid "Modules" +msgstr "" + +#: core/register_core_types.cpp +msgid "TCP" +msgstr "" + +#: core/register_core_types.cpp +msgid "Connect Timeout Seconds" +msgstr "" + +#: core/register_core_types.cpp +msgid "Packet Peer Stream" +msgstr "" + +#: core/register_core_types.cpp +msgid "Max Buffer (Power of 2)" +msgstr "" + +#: core/register_core_types.cpp editor/editor_settings.cpp main/main.cpp +msgid "SSL" +msgstr "" + +#: core/register_core_types.cpp main/main.cpp +msgid "Certificates" +msgstr "" + +#: core/resource.cpp editor/dependency_editor.cpp +#: editor/editor_resource_picker.cpp +#: modules/visual_script/visual_script_nodes.cpp +msgid "Resource" +msgstr "" + +#: core/resource.cpp +msgid "Local To Scene" +msgstr "" + +#: core/resource.cpp editor/dependency_editor.cpp +#: editor/editor_autoload_settings.cpp editor/plugins/path_editor_plugin.cpp +#: editor/project_manager.cpp editor/project_settings_editor.cpp +#: modules/visual_script/visual_script_nodes.cpp +msgid "Path" +msgstr "" + +#: core/script_language.cpp +msgid "Source Code" +msgstr "" + +#: core/translation.cpp editor/project_settings_editor.cpp +msgid "Locale" +msgstr "" + +#: core/translation.cpp +msgid "Test" +msgstr "" + +#: core/translation.cpp scene/resources/font.cpp +msgid "Fallback" +msgstr "" + +#: core/ustring.cpp scene/resources/segment_shape_2d.cpp +msgid "B" +msgstr "" + +#: core/ustring.cpp +msgid "KiB" +msgstr "" + +#: core/ustring.cpp +msgid "MiB" +msgstr "" + +#: core/ustring.cpp +msgid "GiB" +msgstr "" + +#: core/ustring.cpp +msgid "TiB" +msgstr "" + +#: core/ustring.cpp +msgid "PiB" +msgstr "" + +#: core/ustring.cpp +msgid "EiB" +msgstr "" + +#: drivers/gles2/rasterizer_canvas_base_gles2.cpp +#: drivers/gles2/rasterizer_scene_gles2.cpp +#: drivers/gles3/rasterizer_canvas_base_gles3.cpp +#: drivers/gles3/rasterizer_scene_gles3.cpp +#: drivers/gles3/rasterizer_storage_gles3.cpp modules/gltf/gltf_state.cpp +msgid "Buffers" +msgstr "" + +#: drivers/gles2/rasterizer_canvas_base_gles2.cpp +#: drivers/gles3/rasterizer_canvas_base_gles3.cpp +msgid "Canvas Polygon Buffer Size (KB)" +msgstr "" + +#: drivers/gles2/rasterizer_canvas_base_gles2.cpp +#: drivers/gles3/rasterizer_canvas_base_gles3.cpp +msgid "Canvas Polygon Index Buffer Size (KB)" +msgstr "" + +#: drivers/gles2/rasterizer_canvas_base_gles2.cpp +#: drivers/gles3/rasterizer_canvas_base_gles3.cpp editor/editor_settings.cpp +#: editor/import/resource_importer_layered_texture.cpp +#: editor/import/resource_importer_texture.cpp main/main.cpp +#: scene/2d/physics_body_2d.cpp scene/resources/world_2d.cpp +#: servers/physics_2d/physics_2d_server_sw.cpp +#: servers/physics_2d/physics_2d_server_wrap_mt.h +#: servers/physics_2d/space_2d_sw.cpp servers/physics_2d_server.cpp +#: servers/visual_server.cpp +msgid "2D" +msgstr "" + +#: drivers/gles2/rasterizer_canvas_base_gles2.cpp +#: drivers/gles3/rasterizer_canvas_base_gles3.cpp +msgid "Snapping" +msgstr "" + +#: drivers/gles2/rasterizer_canvas_base_gles2.cpp +#: drivers/gles3/rasterizer_canvas_base_gles3.cpp +msgid "Use GPU Pixel Snap" +msgstr "" + +#: drivers/gles2/rasterizer_scene_gles2.cpp +#: drivers/gles3/rasterizer_scene_gles3.cpp +msgid "Immediate Buffer Size (KB)" +msgstr "" + +#: drivers/gles2/rasterizer_storage_gles2.cpp +#: drivers/gles3/rasterizer_storage_gles3.cpp +msgid "Lightmapping" +msgstr "" + +#: drivers/gles2/rasterizer_storage_gles2.cpp +#: drivers/gles3/rasterizer_storage_gles3.cpp +msgid "Use Bicubic Sampling" +msgstr "" + +#: drivers/gles3/rasterizer_scene_gles3.cpp +msgid "Max Renderable Elements" +msgstr "" + +#: drivers/gles3/rasterizer_scene_gles3.cpp +msgid "Max Renderable Lights" +msgstr "" + +#: drivers/gles3/rasterizer_scene_gles3.cpp +msgid "Max Renderable Reflections" +msgstr "" + +#: drivers/gles3/rasterizer_scene_gles3.cpp +msgid "Max Lights Per Object" +msgstr "" + +#: drivers/gles3/rasterizer_scene_gles3.cpp +msgid "Subsurface Scattering" +msgstr "" + +#: drivers/gles3/rasterizer_scene_gles3.cpp editor/animation_track_editor.cpp +#: editor/import/resource_importer_texture.cpp +#: editor/plugins/spatial_editor_plugin.cpp modules/gltf/gltf_node.cpp +#: modules/gridmap/grid_map.cpp scene/2d/cpu_particles_2d.cpp +#: scene/2d/node_2d.cpp scene/2d/parallax_layer.cpp scene/2d/polygon_2d.cpp +#: scene/2d/remote_transform_2d.cpp scene/3d/cpu_particles.cpp +#: scene/3d/remote_transform.cpp scene/3d/spatial.cpp +#: scene/animation/animation_blend_tree.cpp scene/gui/control.cpp +#: scene/main/canvas_layer.cpp scene/resources/environment.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +msgid "Scale" +msgstr "" + +#: drivers/gles3/rasterizer_scene_gles3.cpp +msgid "Follow Surface" +msgstr "" + +#: drivers/gles3/rasterizer_scene_gles3.cpp +msgid "Weight Samples" +msgstr "" + +#: drivers/gles3/rasterizer_scene_gles3.cpp +msgid "Voxel Cone Tracing" +msgstr "" + +#: drivers/gles3/rasterizer_scene_gles3.cpp scene/resources/environment.cpp +msgid "High Quality" +msgstr "" + +#: drivers/gles3/rasterizer_storage_gles3.cpp +msgid "Blend Shape Max Buffer Size (KB)" +msgstr "" + +#. TRANSLATORS: Adjective, refers to the mode for Bezier handles (Free, Balanced, Mirror). +#: editor/animation_bezier_editor.cpp +msgid "Free" +msgstr "" + +#: editor/animation_bezier_editor.cpp +msgid "Balanced" +msgstr "" + +#: editor/animation_bezier_editor.cpp +msgid "Mirror" +msgstr "" + +#: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp +msgid "Time:" +msgstr "" + +#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp +msgid "Value:" +msgstr "" + +#: editor/animation_bezier_editor.cpp +msgid "Insert Key Here" +msgstr "" + +#: editor/animation_bezier_editor.cpp +msgid "Duplicate Selected Key(s)" +msgstr "" + +#: editor/animation_bezier_editor.cpp +msgid "Delete Selected Key(s)" +msgstr "" + +#: editor/animation_bezier_editor.cpp +msgid "Add Bezier Point" +msgstr "" + +#: editor/animation_bezier_editor.cpp +msgid "Move Bezier Points" +msgstr "" + +#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp +msgid "Anim Duplicate Keys" +msgstr "" + +#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp +msgid "Anim Delete Keys" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Change Keyframe Time" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Change Transition" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Change Transform" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Change Keyframe Value" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Change Call" +msgstr "" + +#: editor/animation_track_editor.cpp scene/2d/animated_sprite.cpp +#: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Frame" +msgstr "" + +#: editor/animation_track_editor.cpp editor/editor_profiler.cpp +#: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/particles.cpp +#: scene/resources/particles_material.cpp servers/visual_server.cpp +msgid "Time" +msgstr "" + +#: editor/animation_track_editor.cpp editor/import/resource_importer_scene.cpp +#: platform/osx/export/export.cpp +msgid "Location" +msgstr "" + +#: editor/animation_track_editor.cpp modules/gltf/gltf_node.cpp +#: scene/2d/polygon_2d.cpp scene/2d/remote_transform_2d.cpp +#: scene/3d/remote_transform.cpp scene/3d/spatial.cpp scene/gui/control.cpp +msgid "Rotation" +msgstr "" + +#: editor/animation_track_editor.cpp editor/script_editor_debugger.cpp +#: modules/visual_script/visual_script_nodes.cpp scene/gui/range.cpp +msgid "Value" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Arg Count" +msgstr "" + +#: editor/animation_track_editor.cpp main/main.cpp +#: modules/mono/mono_gd/gd_mono.cpp +msgid "Args" +msgstr "" + +#: editor/animation_track_editor.cpp editor/editor_settings.cpp +#: editor/script_editor_debugger.cpp modules/gltf/gltf_accessor.cpp +#: modules/gltf/gltf_light.cpp modules/visual_script/visual_script_nodes.cpp +#: scene/3d/physics_body.cpp scene/resources/visual_shader_nodes.cpp +msgid "Type" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "In Handle" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Out Handle" +msgstr "" + +#: editor/animation_track_editor.cpp +#: editor/import/resource_importer_texture.cpp +#: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp +#: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp +msgid "Stream" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Start Offset" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "End Offset" +msgstr "" + +#: editor/animation_track_editor.cpp editor/editor_settings.cpp +#: editor/import/resource_importer_scene.cpp +#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: scene/2d/animated_sprite.cpp scene/2d/cpu_particles_2d.cpp +#: scene/2d/sprite.cpp scene/3d/cpu_particles.cpp scene/3d/sprite_3d.cpp +#: scene/animation/animation_blend_tree.cpp +#: scene/resources/particles_material.cpp +msgid "Animation" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Easing" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Time" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transition" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transform" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Value" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Call" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Change Animation Length" +msgstr "" + +#: editor/animation_track_editor.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Change Animation Loop" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Property Track" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "3D Transform Track" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Call Method Track" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Bezier Curve Track" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Audio Playback Track" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Animation Playback Track" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Animation length (frames)" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Animation length (seconds)" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Add Track" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Animation Looping" +msgstr "" + +#: editor/animation_track_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Functions:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Audio Clips:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Clips:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Change Track Path" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Toggle this track on/off." +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Update Mode (How this property is set)" +msgstr "" + +#: editor/animation_track_editor.cpp scene/resources/gradient.cpp +msgid "Interpolation Mode" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Loop Wrap Mode (Interpolate end with beginning on loop)" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Remove this track." +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Time (s):" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Position:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Rotation:" +msgstr "" + +#: editor/animation_track_editor.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Scale:" +msgstr "" + +#: editor/animation_track_editor.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp +#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Type:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "(Invalid, expected type: %s)" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Easing:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "In-Handle:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Out-Handle:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Stream:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Start (s):" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "End (s):" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Animation Clip:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Toggle Track Enabled" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Continuous" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Discrete" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Trigger" +msgstr "" + +#: editor/animation_track_editor.cpp scene/3d/baked_lightmap.cpp +msgid "Capture" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Nearest" +msgstr "" + +#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp +#: editor/property_editor.cpp scene/2d/physics_body_2d.cpp +#: scene/3d/physics_body.cpp +msgid "Linear" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Cubic" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Clamp Loop Interp" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Wrap Loop Interp" +msgstr "" + +#: editor/animation_track_editor.cpp +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Key" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Duplicate Key(s)" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Add RESET Value(s)" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Delete Key(s)" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Change Animation Update Mode" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Change Animation Interpolation Mode" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Change Animation Loop Mode" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Remove Anim Track" +msgstr "" + +#: editor/animation_track_editor.cpp editor/editor_settings.cpp +#: editor/plugins/path_editor_plugin.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Editors" +msgstr "" + +#: editor/animation_track_editor.cpp editor/editor_settings.cpp +msgid "Confirm Insert Track" +msgstr "" + +#. TRANSLATORS: %s will be replaced by a phrase describing the target of track. +#: editor/animation_track_editor.cpp +msgid "Create NEW track for %s and insert key?" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Create %d NEW tracks and insert keys?" +msgstr "" + +#: editor/animation_track_editor.cpp editor/create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/editor_feature_profile.cpp +#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/mesh_instance_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#: editor/plugins/version_control_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +#: editor/script_create_dialog.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Create" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Insert" +msgstr "" + +#. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. +#: editor/animation_track_editor.cpp +msgid "node '%s'" +msgstr "" + +#. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. +#: editor/animation_track_editor.cpp +msgid "animation" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "AnimationPlayer can't animate itself, only other players." +msgstr "" + +#. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. +#: editor/animation_track_editor.cpp +msgid "property '%s'" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Create & Insert" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Insert Track & Key" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Insert Key" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Change Animation Step" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Rearrange Tracks" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Transform tracks only apply to Spatial-based nodes." +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "" +"Audio tracks can only point to nodes of type:\n" +"-AudioStreamPlayer\n" +"-AudioStreamPlayer2D\n" +"-AudioStreamPlayer3D" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Animation tracks can only point to AnimationPlayer nodes." +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Not possible to add a new track without a root" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Invalid track for Bezier (no suitable sub-properties)" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Add Bezier Track" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Track path is invalid, so can't add a key." +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Track is not of type Spatial, can't insert key" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Add Transform Track Key" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Add Track Key" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Track path is invalid, so can't add a method key." +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Add Method Track Key" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Method not found in object:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Move Keys" +msgstr "" + +#: editor/animation_track_editor.cpp editor/plugins/spatial_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp scene/2d/node_2d.cpp +#: scene/3d/spatial.cpp scene/main/canvas_layer.cpp +#: servers/camera/camera_feed.cpp servers/physics_2d_server.cpp +#: servers/physics_server.cpp +msgid "Transform" +msgstr "" + +#: editor/animation_track_editor.cpp editor/editor_help.cpp +msgid "Methods" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Bezier" +msgstr "" + +#: editor/animation_track_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Paste Tracks" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Scale Keys" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "" +"This option does not work for Bezier editing, as it's only a single track." +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Add RESET Keys" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "" +"This animation belongs to an imported scene, so changes to imported tracks " +"will not be saved.\n" +"\n" +"To enable the ability to add custom tracks, navigate to the scene's import " +"settings and set\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" +"Alternatively, use an import preset that imports animations to separate " +"files." +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Warning: Editing imported animation" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Select an AnimationPlayer node to create and edit animations." +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Only show tracks from nodes selected in tree." +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Group tracks by node or display them as plain list." +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Snap:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Animation step value." +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp editor/import/resource_importer_scene.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp main/main.cpp +#: scene/resources/texture.cpp +msgid "FPS" +msgstr "" + +#: editor/animation_track_editor.cpp editor/editor_plugin_settings.cpp +#: editor/editor_resource_picker.cpp editor/import/resource_importer_wav.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/tile_set_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/property_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Animation properties." +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Copy Tracks" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Scale Selection" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Scale From Cursor" +msgstr "" + +#: editor/animation_track_editor.cpp editor/plugins/script_text_editor.cpp +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Duplicate Selection" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Duplicate Transposed" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Delete Selection" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Go to Next Step" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Go to Previous Step" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Apply Reset" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Optimize Animation" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Clean-Up Animation" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Pick the node that will be animated:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Use Bezier Curves" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Create RESET Track(s)" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim. Optimizer" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Max. Linear Error:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Max. Angular Error:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Max Optimizable Angle:" +msgstr "" + +#: editor/animation_track_editor.cpp scene/3d/room_manager.cpp +#: servers/visual_server.cpp +msgid "Optimize" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Remove invalid keys" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Remove unresolved and empty tracks" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Clean-up all animations" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Clean-Up Animation(s) (NO UNDO!)" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Clean-Up" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Scale Ratio:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Select Tracks to Copy" +msgstr "" + +#: editor/animation_track_editor.cpp editor/editor_log.cpp +#: editor/editor_resource_picker.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Copy" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Select All/None" +msgstr "" + +#: editor/animation_track_editor_plugins.cpp +msgid "Add Audio Track Clip" +msgstr "" + +#: editor/animation_track_editor_plugins.cpp +msgid "Change Audio Track Clip Start Offset" +msgstr "" + +#: editor/animation_track_editor_plugins.cpp +msgid "Change Audio Track Clip End Offset" +msgstr "" + +#: editor/array_property_edit.cpp +msgid "Resize Array" +msgstr "" + +#: editor/array_property_edit.cpp +msgid "Change Array Value Type" +msgstr "" + +#: editor/array_property_edit.cpp +msgid "Change Array Value" +msgstr "" + +#: editor/code_editor.cpp +msgid "Go to Line" +msgstr "" + +#: editor/code_editor.cpp +msgid "Line Number:" +msgstr "" + +#: editor/code_editor.cpp +msgid "%d replaced." +msgstr "" + +#: editor/code_editor.cpp editor/editor_help.cpp +msgid "%d match." +msgstr "" + +#: editor/code_editor.cpp editor/editor_help.cpp +msgid "%d matches." +msgstr "" + +#: editor/code_editor.cpp editor/find_in_files.cpp +msgid "Match Case" +msgstr "" + +#: editor/code_editor.cpp editor/find_in_files.cpp +msgid "Whole Words" +msgstr "" + +#: editor/code_editor.cpp +msgid "Replace" +msgstr "" + +#: editor/code_editor.cpp +msgid "Replace All" +msgstr "" + +#: editor/code_editor.cpp +msgid "Selection Only" +msgstr "" + +#: editor/code_editor.cpp editor/plugins/script_text_editor.cpp +#: editor/plugins/text_editor.cpp +msgid "Standard" +msgstr "" + +#: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp +msgid "Toggle Scripts Panel" +msgstr "" + +#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +#: editor/plugins/texture_region_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp +msgid "Zoom In" +msgstr "" + +#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +#: editor/plugins/texture_region_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp +msgid "Zoom Out" +msgstr "" + +#: editor/code_editor.cpp +msgid "Reset Zoom" +msgstr "" + +#: editor/code_editor.cpp modules/gdscript/gdscript.cpp +msgid "Warnings" +msgstr "" + +#: editor/code_editor.cpp +msgid "Line and column numbers." +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Method in target node must be specified." +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Method name must be a valid identifier." +msgstr "" + +#: editor/connections_dialog.cpp +msgid "" +"Target method not found. Specify a valid method or attach a script to the " +"target node." +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Connect to Node:" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Connect to Script:" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "From Signal:" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Scene does not contain any script." +msgstr "" + +#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp +#: editor/groups_editor.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +#: editor/plugins/item_list_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp +msgid "Add" +msgstr "" + +#: editor/connections_dialog.cpp editor/dependency_editor.cpp +#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/version_control_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp +msgid "Remove" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Add Extra Call Argument:" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Extra Call Arguments:" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Receiver Method:" +msgstr "" + +#: editor/connections_dialog.cpp scene/3d/room_manager.cpp +#: servers/visual_server.cpp +msgid "Advanced" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Deferred" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "" +"Defers the signal, storing it in a queue and only firing it at idle time." +msgstr "" + +#: editor/connections_dialog.cpp scene/resources/texture.cpp +msgid "Oneshot" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Disconnects the signal after its first emission." +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Cannot connect signal" +msgstr "" + +#: editor/connections_dialog.cpp editor/dependency_editor.cpp +#: editor/export_template_manager.cpp editor/groups_editor.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp +#: editor/project_settings_editor.cpp editor/property_editor.cpp +#: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp +#: modules/visual_script/visual_script_editor.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Close" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Connect" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Connect '%s' to '%s'" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Disconnect '%s' from '%s'" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Disconnect all from signal: '%s'" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Connect..." +msgstr "" + +#: editor/connections_dialog.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Disconnect" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Connect a Signal to a Method" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Edit Connection:" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Are you sure you want to remove all connections from the \"%s\" signal?" +msgstr "" + +#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp +msgid "Signals" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Filter signals" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Are you sure you want to remove all connections from this signal?" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Disconnect All" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Edit..." +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Go to Method" +msgstr "" + +#: editor/create_dialog.cpp +msgid "Change %s Type" +msgstr "" + +#: editor/create_dialog.cpp editor/project_settings_editor.cpp +msgid "Change" +msgstr "" + +#: editor/create_dialog.cpp +msgid "Create New %s" +msgstr "" + +#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp +msgid "No results for \"%s\"." +msgstr "" + +#: editor/create_dialog.cpp editor/property_selector.cpp +msgid "No description available for %s." +msgstr "" + +#: editor/create_dialog.cpp editor/editor_file_dialog.cpp +#: editor/filesystem_dock.cpp +msgid "Favorites:" +msgstr "" + +#: editor/create_dialog.cpp editor/editor_file_dialog.cpp +msgid "Recent:" +msgstr "" + +#: editor/create_dialog.cpp editor/editor_quick_open.cpp +#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp +#: editor/rename_dialog.cpp +#: modules/visual_script/visual_script_property_selector.cpp +msgid "Search:" +msgstr "" + +#: editor/create_dialog.cpp editor/editor_quick_open.cpp +#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp +#: modules/visual_script/visual_script_property_selector.cpp +msgid "Matches:" +msgstr "" + +#: editor/create_dialog.cpp editor/editor_feature_profile.cpp +#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/property_selector.cpp +#: modules/visual_script/visual_script_property_selector.cpp +msgid "Description:" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Search Replacement For:" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Dependencies For:" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "" +"Scene '%s' is currently being edited.\n" +"Changes will only take effect when reloaded." +msgstr "" + +#: editor/dependency_editor.cpp +msgid "" +"Resource '%s' is in use.\n" +"Changes will only take effect when reloaded." +msgstr "" + +#: editor/dependency_editor.cpp +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Dependencies" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Dependencies:" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Fix Broken" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Dependency Editor" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Search Replacement Resource:" +msgstr "" + +#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp +#: editor/editor_help_search.cpp editor/editor_node.cpp +#: editor/editor_quick_open.cpp editor/filesystem_dock.cpp +#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp +#: editor/script_create_dialog.cpp +#: modules/visual_script/visual_script_property_selector.cpp +#: scene/gui/file_dialog.cpp +msgid "Open" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Owners of: %s (Total: %d)" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "" +"Remove the selected files from the project? (Cannot be undone.)\n" +"Depending on your filesystem configuration, the files will either be moved " +"to the system trash or deleted permanently." +msgstr "" + +#: editor/dependency_editor.cpp +msgid "" +"The files being removed are required by other resources in order for them to " +"work.\n" +"Remove them anyway? (Cannot be undone.)\n" +"Depending on your filesystem configuration, the files will either be moved " +"to the system trash or deleted permanently." +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Cannot remove:" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Error loading:" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Load failed due to missing dependencies:" +msgstr "" + +#: editor/dependency_editor.cpp editor/editor_node.cpp +msgid "Open Anyway" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Which action should be taken?" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Fix Dependencies" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Errors loading!" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Permanently delete %d item(s)? (No undo!)" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Show Dependencies" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Orphan Resource Explorer" +msgstr "" + +#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp +#: editor/editor_file_dialog.cpp editor/editor_node.cpp +#: editor/filesystem_dock.cpp editor/plugins/item_list_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp +#: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp +msgid "Delete" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Owns" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Resources Without Explicit Ownership:" +msgstr "" + +#: editor/dictionary_property_edit.cpp +msgid "Change Dictionary Key" +msgstr "" + +#: editor/dictionary_property_edit.cpp +msgid "Change Dictionary Value" +msgstr "" + +#: editor/editor_about.cpp +msgid "Thanks from the Godot community!" +msgstr "" + +#: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp +msgid "Click to copy." +msgstr "" + +#: editor/editor_about.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Project Founders" +msgstr "" + +#: editor/editor_about.cpp +msgid "Lead Developer" +msgstr "" + +#. TRANSLATORS: This refers to a job title. +#: editor/editor_about.cpp +msgctxt "Job Title" +msgid "Project Manager" +msgstr "" + +#: editor/editor_about.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_about.cpp +msgid "Authors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Platinum Sponsors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Gold Sponsors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Silver Sponsors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Bronze Sponsors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Mini Sponsors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Gold Donors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Silver Donors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Bronze Donors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Donors" +msgstr "" + +#: editor/editor_about.cpp +msgid "License" +msgstr "" + +#: editor/editor_about.cpp +msgid "Third-party Licenses" +msgstr "" + +#: editor/editor_about.cpp +msgid "" +"Godot Engine relies on a number of third-party free and open source " +"libraries, all compatible with the terms of its MIT license. The following " +"is an exhaustive list of all such third-party components with their " +"respective copyright statements and license terms." +msgstr "" + +#: editor/editor_about.cpp +msgid "All Components" +msgstr "" + +#: editor/editor_about.cpp +msgid "Components" +msgstr "" + +#: editor/editor_about.cpp +msgid "Licenses" +msgstr "" + +#: editor/editor_asset_installer.cpp +msgid "Error opening asset file for \"%s\" (not in ZIP format)." +msgstr "" + +#: editor/editor_asset_installer.cpp +msgid "%s (already exists)" +msgstr "" + +#: editor/editor_asset_installer.cpp +msgid "Contents of asset \"%s\" - %d file(s) conflict with your project:" +msgstr "" + +#: editor/editor_asset_installer.cpp +msgid "Contents of asset \"%s\" - No files conflict with your project:" +msgstr "" + +#: editor/editor_asset_installer.cpp +msgid "Uncompressing Assets" +msgstr "" + +#: editor/editor_asset_installer.cpp +msgid "The following files failed extraction from asset \"%s\":" +msgstr "" + +#: editor/editor_asset_installer.cpp +msgid "(and %s more files)" +msgstr "" + +#: editor/editor_asset_installer.cpp +msgid "Asset \"%s\" installed successfully!" +msgstr "" + +#: editor/editor_asset_installer.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Success!" +msgstr "" + +#: editor/editor_asset_installer.cpp editor/editor_node.cpp +msgid "Install" +msgstr "" + +#: editor/editor_asset_installer.cpp +msgid "Asset Installer" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Speakers" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Add Effect" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Rename Audio Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Change Audio Bus Volume" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Toggle Audio Bus Solo" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Toggle Audio Bus Mute" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Toggle Audio Bus Bypass Effects" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Select Audio Bus Send" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Add Audio Bus Effect" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Move Bus Effect" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Delete Bus Effect" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Drag & drop to rearrange." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Solo" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Mute" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Bypass" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Bus Options" +msgstr "" + +#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp +#: editor/project_export.cpp editor/scene_tree_dock.cpp +msgid "Duplicate" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Reset Volume" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Delete Effect" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Add Audio Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Master bus can't be deleted!" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Delete Audio Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Duplicate Audio Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Reset Bus Volume" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Move Audio Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Save Audio Bus Layout As..." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Location for New Layout..." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Open Audio Bus Layout" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "There is no '%s' file." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Layout:" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Invalid file, not an audio bus layout." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Error saving file: %s" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Add Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Add a new Audio Bus to this layout." +msgstr "" + +#: editor/editor_audio_buses.cpp editor/editor_resource_picker.cpp +#: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp +#: editor/script_create_dialog.cpp +msgid "Load" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Load an existing Bus Layout." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Save As" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Save this Bus Layout to a file." +msgstr "" + +#: editor/editor_audio_buses.cpp editor/import_dock.cpp +msgid "Load Default" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Load the default Bus Layout." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Create a new Bus Layout." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Audio Bus Layout" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Invalid name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Cannot begin with a digit." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Valid characters:" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Must not collide with an existing engine class name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Must not collide with an existing built-in type name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Must not collide with an existing global constant name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Keyword cannot be used as an autoload name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Autoload '%s' already exists!" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Rename Autoload" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Toggle AutoLoad Globals" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Move Autoload" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Remove Autoload" +msgstr "" + +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp +#: modules/gdscript/gdscript.cpp platform/android/export/export_plugin.cpp +#: platform/osx/export/export.cpp platform/windows/export/export.cpp +#: scene/2d/polygon_2d.cpp scene/3d/area.cpp scene/3d/physics_joint.cpp +#: scene/3d/reflection_probe.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp servers/visual_server.cpp +msgid "Enable" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Rearrange Autoloads" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Can't add autoload:" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "%s is an invalid path. File does not exist." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "%s is an invalid path. Not in resource path (res://)." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Add AutoLoad" +msgstr "" + +#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp +#: editor/editor_plugin_settings.cpp +#: editor/plugins/animation_tree_editor_plugin.cpp +#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +msgid "Path:" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Node Name:" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Global Variable" +msgstr "" + +#: editor/editor_data.cpp +msgid "Paste Params" +msgstr "" + +#: editor/editor_data.cpp +msgid "Updating Scene" +msgstr "" + +#: editor/editor_data.cpp +msgid "Storing local changes..." +msgstr "" + +#: editor/editor_data.cpp +msgid "Updating scene..." +msgstr "" + +#: editor/editor_data.cpp editor/editor_resource_picker.cpp +msgid "[empty]" +msgstr "" + +#: editor/editor_data.cpp editor/plugins/script_text_editor.cpp +#: editor/plugins/text_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "[unsaved]" +msgstr "" + +#: editor/editor_dir_dialog.cpp +msgid "Please select a base directory first." +msgstr "" + +#: editor/editor_dir_dialog.cpp +msgid "Choose a Directory" +msgstr "" + +#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp +#: editor/filesystem_dock.cpp editor/project_manager.cpp +#: scene/gui/file_dialog.cpp +msgid "Create Folder" +msgstr "" + +#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp +#: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp +#: editor/script_create_dialog.cpp +#: modules/visual_script/visual_script_editor.cpp scene/gui/file_dialog.cpp +msgid "Name:" +msgstr "" + +#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp +#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp +msgid "Could not create folder." +msgstr "" + +#: editor/editor_dir_dialog.cpp +msgid "Choose" +msgstr "" + +#: editor/editor_export.cpp +msgid "Project export for platform:" +msgstr "" + +#: editor/editor_export.cpp +msgid "Completed with warnings." +msgstr "" + +#: editor/editor_export.cpp +msgid "Completed successfully." +msgstr "" + +#: editor/editor_export.cpp +msgid "Failed." +msgstr "" + +#: editor/editor_export.cpp +msgid "Storing File:" +msgstr "" + +#: editor/editor_export.cpp +msgid "No export template found at the expected path:" +msgstr "" + +#: editor/editor_export.cpp +msgid "Packing" +msgstr "" + +#: editor/editor_export.cpp +msgid "Save PCK" +msgstr "" + +#: editor/editor_export.cpp +msgid "Cannot create file \"%s\"." +msgstr "" + +#: editor/editor_export.cpp +msgid "Failed to export project files." +msgstr "" + +#: editor/editor_export.cpp +msgid "Can't open file to read from path \"%s\"." +msgstr "" + +#: editor/editor_export.cpp +msgid "Save ZIP" +msgstr "" + +#: editor/editor_export.cpp +msgid "" +"Target platform requires 'ETC' texture compression for GLES2. Enable 'Import " +"Etc' in Project Settings." +msgstr "" + +#: editor/editor_export.cpp +msgid "" +"Target platform requires 'ETC2' texture compression for GLES3. Enable " +"'Import Etc 2' in Project Settings." +msgstr "" + +#: editor/editor_export.cpp +msgid "" +"Target platform requires 'ETC' texture compression for the driver fallback " +"to GLES2.\n" +"Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback " +"Enabled'." +msgstr "" + +#: editor/editor_export.cpp +msgid "" +"Target platform requires 'PVRTC' texture compression for GLES2. Enable " +"'Import Pvrtc' in Project Settings." +msgstr "" + +#: editor/editor_export.cpp +msgid "" +"Target platform requires 'ETC2' or 'PVRTC' texture compression for GLES3. " +"Enable 'Import Etc 2' or 'Import Pvrtc' in Project Settings." +msgstr "" + +#: editor/editor_export.cpp +msgid "" +"Target platform requires 'PVRTC' texture compression for the driver fallback " +"to GLES2.\n" +"Enable 'Import Pvrtc' in Project Settings, or disable 'Driver Fallback " +"Enabled'." +msgstr "" + +#: editor/editor_export.cpp platform/android/export/export_plugin.cpp +#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp +#: platform/osx/export/export.cpp platform/uwp/export/export.cpp +msgid "Custom Template" +msgstr "" + +#: editor/editor_export.cpp editor/project_export.cpp +#: platform/android/export/export_plugin.cpp platform/iphone/export/export.cpp +#: platform/javascript/export/export.cpp platform/osx/export/export.cpp +#: platform/uwp/export/export.cpp +msgid "Release" +msgstr "" + +#: editor/editor_export.cpp +msgid "Binary Format" +msgstr "" + +#: editor/editor_export.cpp +msgid "64 Bits" +msgstr "" + +#: editor/editor_export.cpp +msgid "Embed PCK" +msgstr "" + +#: editor/editor_export.cpp platform/osx/export/export.cpp +msgid "Texture Format" +msgstr "" + +#: editor/editor_export.cpp +msgid "BPTC" +msgstr "" + +#: editor/editor_export.cpp platform/osx/export/export.cpp +msgid "S3TC" +msgstr "" + +#: editor/editor_export.cpp platform/osx/export/export.cpp +msgid "ETC" +msgstr "" + +#: editor/editor_export.cpp platform/osx/export/export.cpp +msgid "ETC2" +msgstr "" + +#: editor/editor_export.cpp +msgid "No BPTC Fallbacks" +msgstr "" + +#: editor/editor_export.cpp platform/android/export/export_plugin.cpp +#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp +#: platform/osx/export/export.cpp platform/uwp/export/export.cpp +msgid "Custom debug template not found." +msgstr "" + +#: editor/editor_export.cpp platform/android/export/export_plugin.cpp +#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp +#: platform/osx/export/export.cpp platform/uwp/export/export.cpp +msgid "Custom release template not found." +msgstr "" + +#: editor/editor_export.cpp +msgid "Prepare Template" +msgstr "" + +#: editor/editor_export.cpp platform/osx/export/export.cpp +msgid "The given export path doesn't exist." +msgstr "" + +#: editor/editor_export.cpp platform/javascript/export/export.cpp +msgid "Template file not found: \"%s\"." +msgstr "" + +#: editor/editor_export.cpp +msgid "Failed to copy export template." +msgstr "" + +#: editor/editor_export.cpp platform/windows/export/export.cpp +#: platform/x11/export/export.cpp +msgid "PCK Embedding" +msgstr "" + +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + +#: editor/editor_export.cpp +msgid "Convert Text Resources To Binary On Export" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "3D Editor" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Script Editor" +msgstr "" + +#: editor/editor_feature_profile.cpp +#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp +msgid "Asset Library" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Scene Tree Editing" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Node Dock" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "FileSystem Dock" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Import Dock" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Allows to view and edit 3D scenes." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Allows to edit scripts using the integrated script editor." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Provides built-in access to the Asset Library." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Allows editing the node hierarchy in the Scene dock." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "" +"Allows to work with signals and groups of the node selected in the Scene " +"dock." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Allows to browse the local file system via a dedicated dock." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "" +"Allows to configure import settings for individual assets. Requires the " +"FileSystem dock to function." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "(current)" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "(none)" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Remove currently selected profile, '%s'? Cannot be undone." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Profile must be a valid filename and must not contain '.'" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Profile with this name already exists." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "(Editor Disabled, Properties Disabled)" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "(Properties Disabled)" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "(Editor Disabled)" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Class Options:" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Enable Contextual Editor" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Class Properties:" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Main Features:" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Nodes and Classes:" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "File '%s' format is invalid, import aborted." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "" +"Profile '%s' already exists. Remove it first before importing, import " +"aborted." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Error saving profile to path: '%s'." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Reset to Default" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Current Profile:" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Create Profile" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Remove Profile" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Available Profiles:" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Make Current" +msgstr "" + +#: editor/editor_feature_profile.cpp editor/editor_node.cpp +#: editor/import/resource_importer_scene.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: modules/fbx/editor_scene_importer_fbx.cpp +msgid "Import" +msgstr "" + +#: editor/editor_feature_profile.cpp editor/project_export.cpp +#: platform/android/export/export.cpp platform/android/export/export_plugin.cpp +#: platform/javascript/export/export.cpp platform/osx/export/export.cpp +#: platform/uwp/export/export.cpp platform/windows/export/export.cpp +msgid "Export" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Configure Selected Profile:" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Extra Options:" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Create or import a profile to edit available classes and properties." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "New profile name:" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Godot Feature Profile" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Import Profile(s)" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Export Profile" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Manage Editor Feature Profiles" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Default Feature Profile" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Select Current Folder" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "File exists, overwrite?" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Select This Folder" +msgstr "" + +#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp +msgid "Copy Path" +msgstr "" + +#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp +msgid "Open in File Manager" +msgstr "" + +#: editor/editor_file_dialog.cpp editor/editor_node.cpp +#: editor/filesystem_dock.cpp editor/project_manager.cpp +msgid "Show in File Manager" +msgstr "" + +#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp +msgid "New Folder..." +msgstr "" + +#: editor/editor_file_dialog.cpp editor/find_in_files.cpp +msgid "Refresh" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "All Recognized" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "All Files (*)" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open a File" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open File(s)" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open a Directory" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open a File or Directory" +msgstr "" + +#: editor/editor_file_dialog.cpp editor/editor_node.cpp +#: editor/editor_resource_picker.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp scene/gui/file_dialog.cpp +msgid "Save" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Save a File" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Access" +msgstr "" + +#: editor/editor_file_dialog.cpp editor/editor_settings.cpp +msgid "Display Mode" +msgstr "" + +#: editor/editor_file_dialog.cpp +#: editor/import/resource_importer_layered_texture.cpp +#: editor/import/resource_importer_texture.cpp +#: editor/import/resource_importer_wav.cpp main/main.cpp +#: modules/csg/csg_shape.cpp modules/visual_script/visual_script_nodes.cpp +#: scene/2d/light_2d.cpp scene/2d/physics_body_2d.cpp scene/2d/tile_map.cpp +#: scene/3d/baked_lightmap.cpp scene/3d/light.cpp scene/3d/physics_body.cpp +#: scene/gui/control.cpp scene/gui/file_dialog.cpp +#: scene/resources/environment.cpp scene/resources/material.cpp +#: scene/resources/visual_shader.cpp +#: servers/audio/effects/audio_effect_distortion.cpp +msgid "Mode" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Current Dir" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Current File" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Current Path" +msgstr "" + +#: editor/editor_file_dialog.cpp editor/editor_settings.cpp +#: scene/gui/file_dialog.cpp +msgid "Show Hidden Files" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Disable Overwrite Warning" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Go Back" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Go Forward" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Go Up" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Toggle Hidden Files" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Toggle Favorite" +msgstr "" + +#: editor/editor_file_dialog.cpp editor/editor_resource_picker.cpp +#: scene/gui/base_button.cpp +msgid "Toggle Mode" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Focus Path" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Move Favorite Up" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Move Favorite Down" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Go to previous folder." +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Go to next folder." +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Go to parent folder." +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "(Un)favorite current folder." +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." +msgstr "" + +#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp +msgid "View items as a grid of thumbnails." +msgstr "" + +#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp +msgid "View items as a list." +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Directories & Files:" +msgstr "" + +#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp +#: editor/plugins/style_box_editor_plugin.cpp editor/rename_dialog.cpp +msgid "Preview:" +msgstr "" + +#: editor/editor_file_dialog.cpp +#: editor/plugins/version_control_editor_plugin.cpp scene/gui/file_dialog.cpp +msgid "File:" +msgstr "" + +#: editor/editor_file_system.cpp +msgid "ScanSources" +msgstr "" + +#: editor/editor_file_system.cpp +msgid "" +"There are multiple importers for different types pointing to file %s, import " +"aborted" +msgstr "" + +#: editor/editor_file_system.cpp +msgid "(Re)Importing Assets" +msgstr "" + +#: editor/editor_file_system.cpp +msgid "Reimport Missing Imported Files" +msgstr "" + +#: editor/editor_help.cpp scene/2d/camera_2d.cpp scene/gui/control.cpp +#: scene/gui/nine_patch_rect.cpp scene/resources/dynamic_font.cpp +#: scene/resources/style_box.cpp scene/resources/texture.cpp +msgid "Top" +msgstr "" + +#: editor/editor_help.cpp +msgid "Class:" +msgstr "" + +#: editor/editor_help.cpp editor/scene_tree_editor.cpp +#: editor/script_create_dialog.cpp +msgid "Inherits:" +msgstr "" + +#: editor/editor_help.cpp +msgid "Inherited by:" +msgstr "" + +#: editor/editor_help.cpp +msgid "Online Tutorials" +msgstr "" + +#: editor/editor_help.cpp +msgid "Properties" +msgstr "" + +#: editor/editor_help.cpp +msgid "overrides %s:" +msgstr "" + +#: editor/editor_help.cpp +msgid "default:" +msgstr "" + +#: editor/editor_help.cpp +msgid "Theme Properties" +msgstr "" + +#: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/gradient.cpp +msgid "Colors" +msgstr "" + +#: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Constants" +msgstr "" + +#: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Fonts" +msgstr "" + +#: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp +#: platform/iphone/export/export.cpp +msgid "Icons" +msgstr "" + +#: editor/editor_help.cpp +msgid "Styles" +msgstr "" + +#: editor/editor_help.cpp +msgid "Enumerations" +msgstr "" + +#: editor/editor_help.cpp +msgid "Property Descriptions" +msgstr "" + +#: editor/editor_help.cpp +msgid "(value)" +msgstr "" + +#: editor/editor_help.cpp +msgid "" +"There is currently no description for this property. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" +msgstr "" + +#: editor/editor_help.cpp +msgid "Method Descriptions" +msgstr "" + +#: editor/editor_help.cpp +msgid "" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" +msgstr "" + +#: editor/editor_help.cpp editor/editor_settings.cpp +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: modules/gdscript/editor/gdscript_highlighter.cpp +#: modules/gdscript/gdscript_editor.cpp +msgid "Text Editor" +msgstr "" + +#: editor/editor_help.cpp editor/editor_node.cpp editor/editor_settings.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Help" +msgstr "" + +#: editor/editor_help.cpp +msgid "Sort Functions Alphabetically" +msgstr "" + +#: editor/editor_help_search.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp +msgid "Search Help" +msgstr "" + +#: editor/editor_help_search.cpp +msgid "Case Sensitive" +msgstr "" + +#: editor/editor_help_search.cpp +msgid "Show Hierarchy" +msgstr "" + +#: editor/editor_help_search.cpp +msgid "Display All" +msgstr "" + +#: editor/editor_help_search.cpp +msgid "Classes Only" +msgstr "" + +#: editor/editor_help_search.cpp +msgid "Methods Only" +msgstr "" + +#: editor/editor_help_search.cpp +msgid "Signals Only" +msgstr "" + +#: editor/editor_help_search.cpp +msgid "Constants Only" +msgstr "" + +#: editor/editor_help_search.cpp +msgid "Properties Only" +msgstr "" + +#: editor/editor_help_search.cpp +msgid "Theme Properties Only" +msgstr "" + +#: editor/editor_help_search.cpp +msgid "Member Type" +msgstr "" + +#: editor/editor_help_search.cpp +msgid "Class" +msgstr "" + +#: editor/editor_help_search.cpp +msgid "Method" +msgstr "" + +#: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp +#: modules/visual_script/visual_script_func_nodes.cpp +#: modules/visual_script/visual_script_yield_nodes.cpp +msgid "Signal" +msgstr "" + +#: editor/editor_help_search.cpp modules/visual_script/visual_script_nodes.cpp +#: scene/resources/visual_shader_nodes.cpp +msgid "Constant" +msgstr "" + +#: editor/editor_help_search.cpp +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Property" +msgstr "" + +#: editor/editor_help_search.cpp +msgid "Theme Property" +msgstr "" + +#: editor/editor_inspector.cpp editor/project_settings_editor.cpp +msgid "Property:" +msgstr "" + +#: editor/editor_inspector.cpp editor/editor_spin_slider.cpp +msgid "Label" +msgstr "" + +#: editor/editor_inspector.cpp editor/editor_spin_slider.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Read Only" +msgstr "" + +#: editor/editor_inspector.cpp editor/plugins/item_list_editor_plugin.cpp +msgid "Checkable" +msgstr "" + +#: editor/editor_inspector.cpp editor/plugins/item_list_editor_plugin.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Checked" +msgstr "" + +#: editor/editor_inspector.cpp +msgid "Draw Red" +msgstr "" + +#: editor/editor_inspector.cpp +msgid "Keying" +msgstr "" + +#: editor/editor_inspector.cpp +msgid "Pin value" +msgstr "" + +#: editor/editor_inspector.cpp +msgid "" +"Pinning a value forces it to be saved even if it's equal to the default." +msgstr "" + +#: editor/editor_inspector.cpp +msgid "Pin value [Disabled because '%s' is editor-only]" +msgstr "" + +#: editor/editor_inspector.cpp +#: editor/plugins/gradient_texture_2d_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +#: modules/visual_script/visual_script_func_nodes.cpp +#: modules/visual_script/visual_script_nodes.cpp +#: modules/visual_script/visual_script_property_selector.cpp +msgid "Set %s" +msgstr "" + +#: editor/editor_inspector.cpp +msgid "Set Multiple:" +msgstr "" + +#: editor/editor_inspector.cpp +msgid "Pinned %s" +msgstr "" + +#: editor/editor_inspector.cpp +msgid "Unpinned %s" +msgstr "" + +#: editor/editor_inspector.cpp +msgid "Copy Property" +msgstr "" + +#: editor/editor_inspector.cpp +msgid "Paste Property" +msgstr "" + +#: editor/editor_inspector.cpp +msgid "Copy Property Path" +msgstr "" + +#: editor/editor_log.cpp +msgid "Output:" +msgstr "" + +#: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp +msgid "Copy Selection" +msgstr "" + +#: editor/editor_log.cpp editor/editor_network_profiler.cpp +#: editor/editor_profiler.cpp editor/editor_resource_picker.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +#: editor/property_editor.cpp editor/scene_tree_dock.cpp +#: editor/script_editor_debugger.cpp +#: modules/gdnative/gdnative_library_editor_plugin.cpp scene/gui/line_edit.cpp +#: scene/gui/text_edit.cpp scene/resources/default_theme/default_theme.cpp +msgid "Clear" +msgstr "" + +#: editor/editor_log.cpp +msgid "Clear Output" +msgstr "" + +#: editor/editor_network_profiler.cpp editor/editor_node.cpp +#: editor/editor_profiler.cpp +msgid "Stop" +msgstr "" + +#: editor/editor_network_profiler.cpp editor/editor_profiler.cpp +#: editor/plugins/animation_state_machine_editor.cpp editor/rename_dialog.cpp +msgid "Start" +msgstr "" + +#: editor/editor_network_profiler.cpp +msgid "%s/s" +msgstr "" + +#: editor/editor_network_profiler.cpp +msgid "Down" +msgstr "" + +#: editor/editor_network_profiler.cpp +msgid "Up" +msgstr "" + +#: editor/editor_network_profiler.cpp editor/editor_node.cpp +#: scene/main/node.cpp scene/resources/default_theme/default_theme.cpp +msgid "Node" +msgstr "" + +#: editor/editor_network_profiler.cpp +msgid "Incoming RPC" +msgstr "" + +#: editor/editor_network_profiler.cpp +msgid "Incoming RSET" +msgstr "" + +#: editor/editor_network_profiler.cpp +msgid "Outgoing RPC" +msgstr "" + +#: editor/editor_network_profiler.cpp +msgid "Outgoing RSET" +msgstr "" + +#: editor/editor_node.cpp editor/project_manager.cpp +msgid "New Window" +msgstr "" + +#: editor/editor_node.cpp editor/project_manager.cpp +msgid "Unnamed Project" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Spins when the editor window redraws.\n" +"Update Continuously is enabled, which can increase power usage. Click to " +"disable it." +msgstr "" + +#: editor/editor_node.cpp +msgid "Spins when the editor window redraws." +msgstr "" + +#: editor/editor_node.cpp +msgid "Imported resources can't be saved." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp +#: modules/gltf/editor_scene_exporter_gltf_plugin.cpp scene/gui/dialogs.cpp +msgid "OK" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp +msgid "Error saving resource!" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This resource can't be saved because it does not belong to the edited scene. " +"Make it unique first." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp +msgid "Save Resource As..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't open file for writing:" +msgstr "" + +#: editor/editor_node.cpp +msgid "Requested file format unknown:" +msgstr "" + +#: editor/editor_node.cpp +msgid "Error while saving." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Can't open '%s'. The file could have been moved or deleted." +msgstr "" + +#: editor/editor_node.cpp +msgid "Error while parsing '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Unexpected end of file '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Missing '%s' or its dependencies." +msgstr "" + +#: editor/editor_node.cpp +msgid "Error while loading '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Saving Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Analyzing" +msgstr "" + +#: editor/editor_node.cpp +msgid "Creating Thumbnail" +msgstr "" + +#: editor/editor_node.cpp +msgid "This operation can't be done without a tree root." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This scene can't be saved because there is a cyclic instancing inclusion.\n" +"Please resolve it and then attempt to save again." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't " +"be satisfied." +msgstr "" + +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "" + +#: editor/editor_node.cpp editor/scene_tree_dock.cpp +msgid "Can't overwrite scene that is still open!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't load MeshLibrary for merging!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Error saving MeshLibrary!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't load TileSet for merging!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Error saving TileSet!" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"An error occurred while trying to save the editor layout.\n" +"Make sure the editor's user data path is writable." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Default editor layout overridden.\n" +"To restore the Default layout to its base settings, use the Delete Layout " +"option and delete the Default layout." +msgstr "" + +#: editor/editor_node.cpp +msgid "Layout name not found!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Restored the Default layout to its base settings." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This resource belongs to a scene that was imported, so it's not editable.\n" +"Please read the documentation relevant to importing scenes to better " +"understand this workflow." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This resource belongs to a scene that was instanced or inherited.\n" +"Changes to it won't be kept when saving the current scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This resource was imported, so it's not editable. Change its settings in the " +"import panel and then re-import." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This scene was imported, so changes to it won't be kept.\n" +"Instancing it or inheriting will allow making changes to it.\n" +"Please read the documentation relevant to importing scenes to better " +"understand this workflow." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This is a remote object, so changes to it won't be kept.\n" +"Please read the documentation relevant to debugging to better understand " +"this workflow." +msgstr "" + +#: editor/editor_node.cpp +msgid "There is no defined scene to run." +msgstr "" + +#: editor/editor_node.cpp +msgid "Save scene before running..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Could not start subprocess!" +msgstr "" + +#: editor/editor_node.cpp editor/filesystem_dock.cpp +msgid "Open Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Base Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Quick Open..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Quick Open Scene..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Quick Open Script..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Save & Reload" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save changes to '%s' before reloading?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save & Close" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save changes to '%s' before closing?" +msgstr "" + +#: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"The current scene has no root node, but %d modified external resource(s) " +"were saved anyway." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"A root node is required to save the scene. You can add a root node using the " +"Scene tree dock." +msgstr "" + +#: editor/editor_node.cpp +msgid "Save Scene As..." +msgstr "" + +#: editor/editor_node.cpp modules/gltf/editor_scene_exporter_gltf_plugin.cpp +msgid "This operation can't be done without a scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Export Mesh Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "This operation can't be done without a root node." +msgstr "" + +#: editor/editor_node.cpp +msgid "Export Tile Set" +msgstr "" + +#: editor/editor_node.cpp +msgid "This operation can't be done without a selected node." +msgstr "" + +#: editor/editor_node.cpp +msgid "Current scene not saved. Open anyway?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't undo while mouse buttons are pressed." +msgstr "" + +#: editor/editor_node.cpp +msgid "Nothing to undo." +msgstr "" + +#: editor/editor_node.cpp +msgid "Undo: %s" +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't redo while mouse buttons are pressed." +msgstr "" + +#: editor/editor_node.cpp +msgid "Nothing to redo." +msgstr "" + +#: editor/editor_node.cpp +msgid "Redo: %s" +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't reload a scene that was never saved." +msgstr "" + +#: editor/editor_node.cpp +msgid "Reload Saved Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"The current scene has unsaved changes.\n" +"Reload the saved scene anyway? This action cannot be undone." +msgstr "" + +#: editor/editor_node.cpp +msgid "Quick Run Scene..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Quit" +msgstr "" + +#: editor/editor_node.cpp +msgid "Yes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Exit the editor?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Project Manager?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save changes to the following scene(s) before reloading?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save & Quit" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save changes to the following scene(s) before quitting?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save changes to the following scene(s) before opening Project Manager?" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This option is deprecated. Situations where refresh must be forced are now " +"considered a bug. Please report." +msgstr "" + +#: editor/editor_node.cpp +msgid "Pick a Main Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Close Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Reopen Closed Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to enable addon plugin at: '%s' parsing of config failed." +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to find script field for addon plugin at: '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to load addon script from path: '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Unable to load addon script from path: '%s'. This might be due to a code " +"error in that script.\n" +"Disabling the addon at '%s' to prevent further errors." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Unable to load addon script from path: '%s' Base type is not EditorPlugin." +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to load addon script from path: '%s' Script is not in tool mode." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Scene '%s' was automatically imported, so it can't be modified.\n" +"To make changes to it, a new inherited scene can be created." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Error loading scene, it must be inside the project path. Use 'Import' to " +"open the scene, then save it inside the project path." +msgstr "" + +#: editor/editor_node.cpp +msgid "Scene '%s' has broken dependencies:" +msgstr "" + +#: editor/editor_node.cpp +msgid "Clear Recent Scenes" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"No main scene has ever been defined, select one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Selected scene '%s' does not exist, select a valid one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Selected scene '%s' is not a scene file, select a valid one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" + +#: editor/editor_node.cpp +msgid "Save Layout" +msgstr "" + +#: editor/editor_node.cpp +msgid "Delete Layout" +msgstr "" + +#: editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp +msgid "Default" +msgstr "" + +#: editor/editor_node.cpp editor/editor_resource_picker.cpp +#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp +msgid "Show in FileSystem" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play This Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Close Tab" +msgstr "" + +#: editor/editor_node.cpp +msgid "Undo Close Tab" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Close Other Tabs" +msgstr "" + +#: editor/editor_node.cpp +msgid "Close Tabs to the Right" +msgstr "" + +#: editor/editor_node.cpp +msgid "Close All Tabs" +msgstr "" + +#: editor/editor_node.cpp +msgid "Switch Scene Tab" +msgstr "" + +#: editor/editor_node.cpp +msgid "%d more files or folders" +msgstr "" + +#: editor/editor_node.cpp +msgid "%d more folders" +msgstr "" + +#: editor/editor_node.cpp +msgid "%d more files" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Unable to write to file '%s', file in use, locked or lacking permissions." +msgstr "" + +#: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp +#: servers/arvr/arvr_interface.cpp +msgid "Interface" +msgstr "" + +#: editor/editor_node.cpp editor/editor_settings.cpp +msgid "Scene Tabs" +msgstr "" + +#: editor/editor_node.cpp +msgid "Always Show Close Button" +msgstr "" + +#: editor/editor_node.cpp editor/editor_settings.cpp +msgid "Resize If Many Tabs" +msgstr "" + +#: editor/editor_node.cpp editor/editor_settings.cpp +msgid "Minimum Width" +msgstr "" + +#: editor/editor_node.cpp editor/editor_settings.cpp +msgid "Output" +msgstr "" + +#: editor/editor_node.cpp editor/editor_settings.cpp +msgid "Always Clear Output On Play" +msgstr "" + +#: editor/editor_node.cpp editor/editor_settings.cpp +msgid "Always Open Output On Play" +msgstr "" + +#: editor/editor_node.cpp editor/editor_settings.cpp +msgid "Always Close Output On Stop" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save On Focus Loss" +msgstr "" + +#: editor/editor_node.cpp editor/editor_settings.cpp +msgid "Save Each Scene On Quit" +msgstr "" + +#: editor/editor_node.cpp editor/editor_settings.cpp +msgid "Quit Confirmation" +msgstr "" + +#: editor/editor_node.cpp +msgid "Show Update Spinner" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Continuously" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Vital Only" +msgstr "" + +#: editor/editor_node.cpp +msgid "Localize Settings" +msgstr "" + +#: editor/editor_node.cpp +msgid "Restore Scenes On Load" +msgstr "" + +#: editor/editor_node.cpp editor/editor_settings.cpp +msgid "Show Thumbnail On Hover" +msgstr "" + +#: editor/editor_node.cpp editor/editor_settings.cpp +msgid "Inspector" +msgstr "" + +#: editor/editor_node.cpp +msgid "Default Property Name Style" +msgstr "" + +#: editor/editor_node.cpp +msgid "Default Float Step" +msgstr "" + +#: editor/editor_node.cpp scene/gui/tree.cpp +msgid "Disable Folding" +msgstr "" + +#: editor/editor_node.cpp +msgid "Auto Unfold Foreign Scenes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Horizontal Vector2 Editing" +msgstr "" + +#: editor/editor_node.cpp +msgid "Horizontal Vector Types Editing" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Resources In Current Inspector" +msgstr "" + +#: editor/editor_node.cpp +msgid "Resources To Open In New Inspector" +msgstr "" + +#: editor/editor_node.cpp +msgid "Default Color Picker Mode" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Username" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "SSH Public Key Path" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "SSH Private Key Path" +msgstr "" + +#: editor/editor_node.cpp +msgid "Dock Position" +msgstr "" + +#: editor/editor_node.cpp editor/editor_plugin.cpp +msgid "Distraction Free Mode" +msgstr "" + +#: editor/editor_node.cpp +msgid "Toggle distraction-free mode." +msgstr "" + +#: editor/editor_node.cpp +msgid "Add a new scene." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Go to previously opened scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Copy Text" +msgstr "" + +#: editor/editor_node.cpp +msgid "Next tab" +msgstr "" + +#: editor/editor_node.cpp +msgid "Previous tab" +msgstr "" + +#: editor/editor_node.cpp +msgid "Filter Files..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Operations with scene files." +msgstr "" + +#: editor/editor_node.cpp +msgid "New Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "New Inherited Scene..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Scene..." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Open Recent" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Convert To..." +msgstr "" + +#: editor/editor_node.cpp +msgid "MeshLibrary..." +msgstr "" + +#: editor/editor_node.cpp +msgid "TileSet..." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Undo" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Redo" +msgstr "" + +#: editor/editor_node.cpp +msgid "Miscellaneous project or scene-wide tools." +msgstr "" + +#: editor/editor_node.cpp editor/project_manager.cpp +#: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp +msgid "Project" +msgstr "" + +#: editor/editor_node.cpp +msgid "Project Settings..." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Set Up Version Control" +msgstr "" + +#: editor/editor_node.cpp +msgid "Shut Down Version Control" +msgstr "" + +#: editor/editor_node.cpp +msgid "Export..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Install Android Build Template..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Open User Data Folder" +msgstr "" + +#: editor/editor_node.cpp editor/editor_settings.cpp +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Tools" +msgstr "" + +#: editor/editor_node.cpp +msgid "Orphan Resource Explorer..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Reload Current Project" +msgstr "" + +#: editor/editor_node.cpp +msgid "Quit to Project List" +msgstr "" + +#: editor/editor_node.cpp +msgid "Deploy with Remote Debug" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, using one-click deploy will make the executable " +"attempt to connect to this computer's IP so the running project can be " +"debugged.\n" +"This option is intended to be used for remote debugging (typically with a " +"mobile device).\n" +"You don't need to enable it to use the GDScript debugger locally." +msgstr "" + +#: editor/editor_node.cpp +msgid "Small Deploy with Network Filesystem" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, using one-click deploy for Android will only " +"export an executable without the project data.\n" +"The filesystem will be provided from the project by the editor over the " +"network.\n" +"On Android, deploying will use the USB cable for faster performance. This " +"option speeds up testing for projects with large assets." +msgstr "" + +#: editor/editor_node.cpp +msgid "Visible Collision Shapes" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, collision shapes and raycast nodes (for 2D and " +"3D) will be visible in the running project." +msgstr "" + +#: editor/editor_node.cpp +msgid "Visible Navigation" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, navigation meshes and polygons will be visible " +"in the running project." +msgstr "" + +#: editor/editor_node.cpp +msgid "Force Shader Fallbacks" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, shaders will be used in their fallback form " +"(either visible via an ubershader or hidden) during all the run time.\n" +"This is useful for verifying the look and performance of fallbacks, which " +"are normally displayed briefly.\n" +"Asynchronous shader compilation must be enabled in the project settings for " +"this option to make a difference." +msgstr "" + +#: editor/editor_node.cpp +msgid "Synchronize Scene Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, any changes made to the scene in the editor " +"will be replicated in the running project.\n" +"When used remotely on a device, this is more efficient when the network " +"filesystem option is enabled." +msgstr "" + +#: editor/editor_node.cpp +msgid "Synchronize Script Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, any script that is saved will be reloaded in " +"the running project.\n" +"When used remotely on a device, this is more efficient when the network " +"filesystem option is enabled." +msgstr "" + +#: editor/editor_node.cpp +msgid "Editor Settings..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Editor Layout" +msgstr "" + +#: editor/editor_node.cpp +msgid "Take Screenshot" +msgstr "" + +#: editor/editor_node.cpp +msgid "Screenshots are stored in the Editor Data/Settings Folder." +msgstr "" + +#: editor/editor_node.cpp +msgid "Toggle Fullscreen" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Editor Data/Settings Folder" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Editor Data Folder" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Editor Settings Folder" +msgstr "" + +#: editor/editor_node.cpp +msgid "Manage Editor Features..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Manage Export Templates..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Online Documentation" +msgstr "" + +#: editor/editor_node.cpp +msgid "Questions & Answers" +msgstr "" + +#: editor/editor_node.cpp +msgid "Report a Bug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Suggest a Feature" +msgstr "" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp +msgid "Community" +msgstr "" + +#: editor/editor_node.cpp +msgid "About Godot" +msgstr "" + +#: editor/editor_node.cpp +msgid "Support Godot Development" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the project." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause the scene execution for debugging." +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Changing the video driver requires restarting the editor." +msgstr "" + +#: editor/editor_node.cpp editor/project_settings_editor.cpp +#: editor/settings_config_dialog.cpp +msgid "Save & Restart" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update All Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Vital Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Hide Update Spinner" +msgstr "" + +#: editor/editor_node.cpp editor/editor_settings.cpp +#: editor/fileserver/editor_file_server.cpp +#: modules/fbx/editor_scene_importer_fbx.cpp +msgid "FileSystem" +msgstr "" + +#: editor/editor_node.cpp +msgid "Expand Bottom Panel" +msgstr "" + +#: editor/editor_node.cpp +msgid "Don't Save" +msgstr "" + +#: editor/editor_node.cpp +msgid "Android build template is missing, please install relevant templates." +msgstr "" + +#: editor/editor_node.cpp +msgid "Manage Templates" +msgstr "" + +#: editor/editor_node.cpp +msgid "Install from file" +msgstr "" + +#: editor/editor_node.cpp +msgid "Select android sources file" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This will set up your project for custom Android builds by installing the " +"source template to \"res://android/build\".\n" +"You can then apply modifications and build your own custom APK on export " +"(adding modules, changing the AndroidManifest.xml, etc.).\n" +"Note that in order to make custom builds instead of using pre-built APKs, " +"the \"Use Custom Build\" option should be enabled in the Android export " +"preset." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"The Android build template is already installed in this project and it won't " +"be overwritten.\n" +"Remove the \"res://android/build\" directory manually before attempting this " +"operation again." +msgstr "" + +#: editor/editor_node.cpp +msgid "Import Templates From ZIP File" +msgstr "" + +#: editor/editor_node.cpp +msgid "Template Package" +msgstr "" + +#: editor/editor_node.cpp modules/gltf/editor_scene_exporter_gltf_plugin.cpp +msgid "Export Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "Merge With Existing" +msgstr "" + +#: editor/editor_node.cpp +msgid "Apply MeshInstance Transforms" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open & Run a Script" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp +msgid "New Inherited" +msgstr "" + +#: editor/editor_node.cpp +msgid "Load Errors" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp +#: modules/visual_script/visual_script_nodes.cpp +msgid "Select" +msgstr "" + +#: editor/editor_node.cpp +msgid "Select Current" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open 2D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open 3D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Script Editor" +msgstr "" + +#: editor/editor_node.cpp editor/project_manager.cpp +msgid "Open Asset Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the next Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the previous Editor" +msgstr "" + +#: editor/editor_node.h +msgid "Warning!" +msgstr "" + +#: editor/editor_path.cpp +msgid "No sub-resources found." +msgstr "" + +#: editor/editor_path.cpp +msgid "Open a list of sub-resources." +msgstr "" + +#: editor/editor_plugin.cpp +msgid "Creating Mesh Previews" +msgstr "" + +#: editor/editor_plugin.cpp +msgid "Thumbnail..." +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Main Script:" +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Edit Plugin" +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Installed Plugins:" +msgstr "" + +#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp +#: scene/2d/remote_transform_2d.cpp scene/3d/remote_transform.cpp +msgid "Update" +msgstr "" + +#: editor/editor_plugin_settings.cpp platform/android/export/export_plugin.cpp +#: platform/iphone/export/export.cpp platform/osx/export/export.cpp +#: platform/uwp/export/export.cpp +msgid "Version" +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Author" +msgstr "" + +#: editor/editor_plugin_settings.cpp +#: modules/gdnative/gdnative_library_singleton_editor.cpp +msgid "Status" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Measure:" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Frame Time (ms)" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Average Time (ms)" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Frame %" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Physics Frame %" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Inclusive" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Self" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "" +"Inclusive: Includes time from other functions called by this function.\n" +"Use this to spot bottlenecks.\n" +"\n" +"Self: Only count the time spent in the function itself, not in other " +"functions called by that function.\n" +"Use this to find individual functions to optimize." +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Frame #:" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Calls" +msgstr "" + +#: editor/editor_profiler.cpp editor/plugins/script_editor_plugin.cpp +#: editor/script_editor_debugger.cpp +msgid "Debugger" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Profiler Frame History Size" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Profiler Frame Max Functions" +msgstr "" + +#: editor/editor_properties.cpp +msgid "Edit Text:" +msgstr "" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "On" +msgstr "" + +#: editor/editor_properties.cpp modules/gridmap/grid_map.cpp +#: scene/2d/collision_object_2d.cpp scene/2d/tile_map.cpp +#: scene/3d/collision_object.cpp scene/3d/soft_body.cpp +#: scene/main/canvas_layer.cpp +msgid "Layer" +msgstr "" + +#: editor/editor_properties.cpp +msgid "Bit %d, value %d" +msgstr "" + +#: editor/editor_properties.cpp +msgid "[Empty]" +msgstr "" + +#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp +msgid "Assign..." +msgstr "" + +#: editor/editor_properties.cpp +msgid "Invalid RID" +msgstr "" + +#: editor/editor_properties.cpp +msgid "" +"Can't create a ViewportTexture on resources saved as a file.\n" +"Resource needs to belong to a scene." +msgstr "" + +#: editor/editor_properties.cpp +msgid "" +"Can't create a ViewportTexture on this resource because it's not set as " +"local to scene.\n" +"Please switch on the 'local to scene' property on it (and all resources " +"containing it up to a node)." +msgstr "" + +#: editor/editor_properties.cpp editor/property_editor.cpp +msgid "Pick a Viewport" +msgstr "" + +#: editor/editor_properties.cpp editor/property_editor.cpp +msgid "Selected node is not a Viewport!" +msgstr "" + +#: editor/editor_properties_array_dict.cpp +#: editor/plugins/spatial_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Size:" +msgstr "" + +#: editor/editor_properties_array_dict.cpp +msgid "Page:" +msgstr "" + +#: editor/editor_properties_array_dict.cpp +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove Item" +msgstr "" + +#: editor/editor_properties_array_dict.cpp +msgid "New Key:" +msgstr "" + +#: editor/editor_properties_array_dict.cpp +msgid "New Value:" +msgstr "" + +#: editor/editor_properties_array_dict.cpp +msgid "Add Key/Value Pair" +msgstr "" + +#: editor/editor_resource_picker.cpp +msgid "" +"The selected resource (%s) does not match any type expected for this " +"property (%s)." +msgstr "" + +#: editor/editor_resource_picker.cpp +msgid "Quick Load" +msgstr "" + +#: editor/editor_resource_picker.cpp editor/property_editor.cpp +msgid "Make Unique" +msgstr "" + +#: editor/editor_resource_picker.cpp +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/animation_state_machine_editor.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Paste" +msgstr "" + +#: editor/editor_resource_picker.cpp editor/property_editor.cpp +msgid "Convert to %s" +msgstr "" + +#: editor/editor_resource_picker.cpp editor/property_editor.cpp +msgid "New %s" +msgstr "" + +#: editor/editor_resource_picker.cpp editor/plugins/theme_editor_plugin.cpp +#: modules/visual_script/visual_script_flow_control.cpp +#: modules/visual_script/visual_script_func_nodes.cpp +#: modules/visual_script/visual_script_nodes.cpp +#: modules/visual_script/visual_script_yield_nodes.cpp +msgid "Base Type" +msgstr "" + +#: editor/editor_resource_picker.cpp +msgid "Edited Resource" +msgstr "" + +#: editor/editor_resource_picker.cpp scene/gui/line_edit.cpp +#: scene/gui/slider.cpp scene/gui/spin_box.cpp +msgid "Editable" +msgstr "" + +#: editor/editor_resource_picker.cpp editor/property_editor.cpp +msgid "New Script" +msgstr "" + +#: editor/editor_resource_picker.cpp editor/scene_tree_dock.cpp +msgid "Extend Script" +msgstr "" + +#: editor/editor_resource_picker.cpp +msgid "Script Owner" +msgstr "" + +#: editor/editor_run_native.cpp +msgid "" +"No runnable export preset found for this platform.\n" +"Please add a runnable preset in the Export menu or define an existing preset " +"as runnable." +msgstr "" + +#: editor/editor_run_native.cpp +msgid "Project Run" +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Write your logic in the _run() method." +msgstr "" + +#: editor/editor_run_script.cpp +msgid "There is an edited scene already." +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Couldn't instance script:" +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Did you forget the 'tool' keyword?" +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Couldn't run script:" +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Did you forget the '_run' method?" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Editor Language" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Display Scale" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Custom Display Scale" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Main Font Size" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Code Font Size" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Font Antialiased" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Font Hinting" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Main Font" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Main Font Bold" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Code Font" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Dim Editor On Dialog Popup" +msgstr "" + +#: editor/editor_settings.cpp main/main.cpp +msgid "Low Processor Mode Sleep (µsec)" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Unfocused Low Processor Mode Sleep (µsec)" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Separate Distraction Mode" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Automatically Open Screenshots" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Max Array Dictionary Items Per Page" +msgstr "" + +#: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp scene/gui/control.cpp +#: scene/register_scene_types.cpp +msgid "Theme" +msgstr "" + +#: editor/editor_settings.cpp editor/import_dock.cpp +msgid "Preset" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Icon And Font Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Base Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Accent Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/environment.cpp +msgid "Contrast" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Relationship Line Opacity" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Highlight Tabs" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Border Size" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Use Graph Node Headers" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Additional Spacing" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Custom Theme" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Show Script Button" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Directories" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Autoscan Project Path" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Default Project Path" +msgstr "" + +#: editor/editor_settings.cpp +msgid "On Save" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Compress Binary Resources" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Safe Save On Backup Then Rename" +msgstr "" + +#: editor/editor_settings.cpp +msgid "File Dialog" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Thumbnail Size" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Docks" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Scene Tree" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Start Create Dialog Fully Expanded" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Always Show Folders" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Property Editor" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Auto Refresh Interval" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Subresource Hue Tint" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Color Theme" +msgstr "" + +#: editor/editor_settings.cpp scene/3d/label_3d.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Line Spacing" +msgstr "" + +#: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp +#: modules/gdscript/editor/gdscript_highlighter.cpp +msgid "Highlighting" +msgstr "" + +#: editor/editor_settings.cpp scene/gui/text_edit.cpp +msgid "Syntax Highlighting" +msgstr "" + +#: editor/editor_settings.cpp scene/gui/text_edit.cpp +msgid "Highlight All Occurrences" +msgstr "" + +#: editor/editor_settings.cpp scene/gui/text_edit.cpp +msgid "Highlight Current Line" +msgstr "" + +#: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp +msgid "Highlight Type Safe Lines" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Indent" +msgstr "" + +#: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp +msgid "Auto Indent" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Convert Indent On Save" +msgstr "" + +#: editor/editor_settings.cpp scene/gui/text_edit.cpp +msgid "Draw Tabs" +msgstr "" + +#: editor/editor_settings.cpp scene/gui/text_edit.cpp +msgid "Draw Spaces" +msgstr "" + +#: editor/editor_settings.cpp editor/plugins/spatial_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp scene/2d/tile_map.cpp +#: scene/main/scene_tree.cpp scene/resources/world.cpp +#: scene/resources/world_2d.cpp +msgid "Navigation" +msgstr "" + +#: editor/editor_settings.cpp scene/gui/text_edit.cpp +msgid "Smooth Scrolling" +msgstr "" + +#: editor/editor_settings.cpp scene/gui/text_edit.cpp +msgid "V Scroll Speed" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Show Minimap" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Minimap Width" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Mouse Extra Buttons Navigate History" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Drag And Drop Selection" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Stay In Script Editor On Node Selected" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Appearance" +msgstr "" + +#: editor/editor_settings.cpp scene/gui/text_edit.cpp +msgid "Show Line Numbers" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Line Numbers Zero Padded" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Show Bookmark Gutter" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Show Breakpoint Gutter" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Show Info Gutter" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Code Folding" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Word Wrap" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Show Line Length Guidelines" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Line Length Guideline Soft Column" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Line Length Guideline Hard Column" +msgstr "" + +#: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp +msgid "Script List" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Show Members Overview" +msgstr "" + +#: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp +msgid "Files" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Trim Trailing Whitespace On Save" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Autosave Interval Secs" +msgstr "" + +#: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp +msgid "Restore Scripts On Load" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Auto Reload And Parse Scripts On Save" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Auto Reload Scripts On External Change" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Create Signal Callbacks" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Sort Members Outline Alphabetically" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Cursor" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Scroll Past End Of File" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Block Caret" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Caret Blink" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Caret Blink Speed" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Right Click Moves Caret" +msgstr "" + +#: editor/editor_settings.cpp modules/gdscript/gdscript.cpp +#: modules/gdscript/gdscript_editor.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Completion" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Idle Parse Delay" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Auto Brace Complete" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Code Complete Delay" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Put Callhint Tooltip Below Current Line" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Callhint Tooltip Offset" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Complete File Paths" +msgstr "" + +#: editor/editor_settings.cpp modules/gdscript/gdscript_editor.cpp +msgid "Add Type Hints" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Use Single Quotes" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Show Help Index" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Help Font Size" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Help Source Font Size" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Help Title Font Size" +msgstr "" + +#: editor/editor_settings.cpp modules/gridmap/grid_map_editor_plugin.cpp +msgid "Grid Map" +msgstr "" + +#: editor/editor_settings.cpp modules/gridmap/grid_map_editor_plugin.cpp +msgid "Pick Distance" +msgstr "" + +#: editor/editor_settings.cpp editor/plugins/tile_map_editor_plugin.cpp +msgid "Preview Size" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Primary Grid Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Secondary Grid Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Selection Box Color" +msgstr "" + +#: editor/editor_settings.cpp editor/plugins/path_editor_plugin.cpp +#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp +msgid "3D Gizmos" +msgstr "" + +#: editor/editor_settings.cpp editor/plugins/path_editor_plugin.cpp +#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp +msgid "Gizmo Colors" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Instanced" +msgstr "" + +#: editor/editor_settings.cpp modules/gltf/gltf_node.cpp +#: scene/3d/physics_body.cpp +msgid "Joint" +msgstr "" + +#: editor/editor_settings.cpp scene/2d/collision_shape_2d.cpp +#: scene/2d/cpu_particles_2d.cpp scene/2d/touch_screen_button.cpp +#: scene/3d/collision_shape.cpp scene/3d/cpu_particles.cpp +#: scene/3d/occluder.cpp scene/3d/spring_arm.cpp +#: scene/resources/particles_material.cpp servers/physics_2d_server.cpp +#: servers/physics_server.cpp +msgid "Shape" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Primary Grid Steps" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Grid Size" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Grid Division Level Max" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Grid Division Level Min" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Grid Division Level Bias" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Grid XZ Plane" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Grid XY Plane" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Grid YZ Plane" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Default FOV" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Default Z Near" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Default Z Far" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Lightmap Baking Number Of CPU Threads" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Navigation Scheme" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Invert Y Axis" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Invert X Axis" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Zoom Style" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Emulate Numpad" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Emulate 3 Button Mouse" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Orbit Modifier" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Pan Modifier" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Zoom Modifier" +msgstr "" + +#: editor/editor_settings.cpp editor/plugins/spatial_editor_plugin.cpp +msgid "Warped Mouse Panning" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Navigation Feel" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Orbit Sensitivity" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Orbit Inertia" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Translation Inertia" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Zoom Inertia" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Freelook" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Freelook Navigation Scheme" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Freelook Sensitivity" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Freelook Inertia" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Freelook Base Speed" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Freelook Activation Modifier" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Freelook Speed Zoom Link" +msgstr "" + +#: editor/editor_settings.cpp editor/plugins/tile_map_editor_plugin.cpp +msgid "Grid Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Guides Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Smart Snapping Line Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Bone Width" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Bone Color 1" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Bone Color 2" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Bone Selected Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Bone IK Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Bone Outline Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Bone Outline Size" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Viewport Border Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Constrain Editor View" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Simple Panning" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Scroll To Pan" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Pan Speed" +msgstr "" + +#: editor/editor_settings.cpp editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Poly Editor" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Point Grab Radius" +msgstr "" + +#: editor/editor_settings.cpp editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Show Previous Outline" +msgstr "" + +#: editor/editor_settings.cpp editor/scene_tree_dock.cpp +msgid "Autorename Animation Tracks" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Default Create Bezier Tracks" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Default Create Reset Tracks" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Onion Layers Past Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Onion Layers Future Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Visual Editors" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Minimap Opacity" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Window Placement" +msgstr "" + +#: editor/editor_settings.cpp scene/2d/back_buffer_copy.cpp scene/2d/sprite.cpp +#: scene/2d/visibility_notifier_2d.cpp scene/3d/sprite_3d.cpp +#: scene/gui/control.cpp +msgid "Rect" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Rect Custom Position" +msgstr "" + +#: editor/editor_settings.cpp platform/android/export/export_plugin.cpp +msgid "Screen" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Auto Save" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Save Before Running" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Font Size" +msgstr "" + +#: editor/editor_settings.cpp +#: modules/gdscript/language_server/gdscript_language_server.cpp +msgid "Remote Host" +msgstr "" + +#: editor/editor_settings.cpp +#: modules/gdscript/language_server/gdscript_language_server.cpp +msgid "Remote Port" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Editor SSL Certificates" +msgstr "" + +#: editor/editor_settings.cpp +msgid "HTTP Proxy" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Host" +msgstr "" + +#: editor/editor_settings.cpp editor/fileserver/editor_file_server.cpp +#: main/main.cpp modules/mono/mono_gd/gd_mono.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Port" +msgstr "" + +#. TRANSLATORS: Project Manager here refers to the tool used to create/manage Godot projects. +#: editor/editor_settings.cpp +msgid "Project Manager" +msgstr "" + +#. TRANSLATORS: Project Manager here refers to the tool used to create/manage Godot projects. +#: editor/editor_settings.cpp +msgid "Sorting Order" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Symbol Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Keyword Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Control Flow Keyword Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Base Type Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Engine Type Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "User Type Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Comment Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "String Color" +msgstr "" + +#: editor/editor_settings.cpp platform/javascript/export/export.cpp +#: platform/uwp/export/export.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Background Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Completion Background Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Completion Selected Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Completion Existing Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Completion Scroll Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Completion Font Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Text Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Line Number Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Safe Line Number Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Caret Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Caret Background Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Text Selected Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Selection Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Brace Mismatch Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Current Line Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Line Length Guideline Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Word Highlighted Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Number Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Function Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Member Variable Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Mark Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Bookmark Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Breakpoint Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Executing Line Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Code Folding Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Search Result Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Search Result Border Color" +msgstr "" + +#: editor/editor_spin_slider.cpp +msgid "Hold %s to round to integers. Hold Shift for more precise changes." +msgstr "" + +#: editor/editor_spin_slider.cpp scene/gui/button.cpp +msgid "Flat" +msgstr "" + +#: editor/editor_spin_slider.cpp +msgid "Hide Slider" +msgstr "" + +#: editor/editor_sub_scene.cpp +msgid "Select Node(s) to Import" +msgstr "" + +#: editor/editor_sub_scene.cpp editor/project_manager.cpp +msgid "Browse" +msgstr "" + +#: editor/editor_sub_scene.cpp +msgid "Scene Path:" +msgstr "" + +#: editor/editor_sub_scene.cpp +msgid "Import From Node:" +msgstr "" + +#. TRANSLATORS: %s refers to the name of a version control system (e.g. "Git"). +#: editor/editor_vcs_interface.cpp +msgid "%s Error" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Open the folder containing these templates." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Uninstall these templates." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "There are no mirrors available." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Retrieving the mirror list..." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Starting the download..." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Error requesting URL:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Connecting to the mirror..." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't resolve the requested address." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't connect to the mirror." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "No response from the mirror." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Request failed." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Request ended up in a redirect loop." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Request failed:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Download complete; extracting templates..." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Cannot remove temporary file:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "" +"Templates installation failed.\n" +"The problematic templates archives can be found at '%s'." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Error getting the list of mirrors." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Error parsing JSON with the list of mirrors. Please report this issue!" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Best available mirror" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "" +"No download links found for this version. Direct download is only available " +"for official releases." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Disconnected" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Resolving" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't Resolve" +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Connecting..." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't Connect" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Connected" +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Requesting..." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Downloading" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Connection Error" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "SSL Handshake Error" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't open the export templates file." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Invalid version.txt format inside the export templates file: %s." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "No version.txt found inside the export templates file." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Error creating path for extracting templates:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Extracting Export Templates" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Importing:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Remove templates for the version '%s'?" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Uncompressing Android Build Sources" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Export Template Manager" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Current Version:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Export templates are missing. Download them or install from a file." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Export templates are installed and ready to be used." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Open Folder" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Open the folder containing installed templates for the current version." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Uninstall" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Uninstall templates for the current version." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Download from:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Open in Web Browser" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Copy Mirror URL" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Download and Install" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "" +"Download and install templates for the current version from the best " +"possible mirror." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Official export templates aren't available for development builds." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Install from File" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Install templates from a local file." +msgstr "" + +#: editor/export_template_manager.cpp editor/find_in_files.cpp +#: editor/progress_dialog.cpp scene/gui/dialogs.cpp +msgid "Cancel" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Cancel the download of the templates." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Other Installed Versions:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Uninstall Template" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Select Template File" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Godot Export Templates" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "" +"The templates will continue to download.\n" +"You may experience a short editor freeze when they finish." +msgstr "" + +#: editor/fileserver/editor_file_server.cpp +msgid "File Server" +msgstr "" + +#: editor/fileserver/editor_file_server.cpp +#: editor/plugins/version_control_editor_plugin.cpp +#: platform/uwp/export/export.cpp platform/windows/export/export.cpp +msgid "Password" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Favorites" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Status: Import of file failed. Please fix file and reimport manually." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" +"Importing has been disabled for this file, so it can't be opened for editing." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Cannot move/rename resources root." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Cannot move a folder into itself." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Error moving:" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Error duplicating:" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Unable to update dependencies:" +msgstr "" + +#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp +msgid "No name provided." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Provided name contains invalid characters." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "A file or folder with this name already exists." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Name contains invalid characters." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" +"The following files or folders conflict with items in the target location " +"'%s':\n" +"\n" +"%s\n" +"\n" +"Do you wish to overwrite them?" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Renaming file:" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Renaming folder:" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Duplicating file:" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Duplicating folder:" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "New Inherited Scene" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Open Scenes" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Instance" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Add to Favorites" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Remove from Favorites" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Edit Dependencies..." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "View Owners..." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Move To..." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "New Scene..." +msgstr "" + +#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp +msgid "New Script..." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "New Resource..." +msgstr "" + +#: editor/filesystem_dock.cpp editor/inspector_dock.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +#: editor/script_editor_debugger.cpp +msgid "Expand All" +msgstr "" + +#: editor/filesystem_dock.cpp editor/inspector_dock.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +#: editor/script_editor_debugger.cpp +msgid "Collapse All" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Sort files" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Sort by Name (Ascending)" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Sort by Name (Descending)" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Sort by Type (Ascending)" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Sort by Type (Descending)" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Sort by Last Modified" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Sort by First Modified" +msgstr "" + +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate..." +msgstr "" + +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp +msgid "Rename..." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Focus the search box" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Previous Folder/File" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Next Folder/File" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Re-Scan Filesystem" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Toggle Split Mode" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Search files" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" +"Scanning Files,\n" +"Please Wait..." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Move" +msgstr "" + +#: editor/filesystem_dock.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +#: editor/project_manager.cpp editor/rename_dialog.cpp +#: editor/scene_tree_dock.cpp +msgid "Rename" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Overwrite" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Create Scene" +msgstr "" + +#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp +msgid "Create Script" +msgstr "" + +#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp +msgid "Find in Files" +msgstr "" + +#: editor/find_in_files.cpp +msgid "Find:" +msgstr "" + +#: editor/find_in_files.cpp editor/rename_dialog.cpp +msgid "Replace:" +msgstr "" + +#: editor/find_in_files.cpp +msgid "Folder:" +msgstr "" + +#: editor/find_in_files.cpp +msgid "Filters:" +msgstr "" + +#: editor/find_in_files.cpp +msgid "" +"Include the files with the following extensions. Add or remove them in " +"ProjectSettings." +msgstr "" + +#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +msgid "Find..." +msgstr "" + +#: editor/find_in_files.cpp editor/plugins/script_text_editor.cpp +msgid "Replace..." +msgstr "" + +#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp +msgid "Replace in Files" +msgstr "" + +#: editor/find_in_files.cpp +msgid "Replace All (NO UNDO)" +msgstr "" + +#: editor/find_in_files.cpp +msgid "Searching..." +msgstr "" + +#: editor/find_in_files.cpp +msgid "%d match in %d file." +msgstr "" + +#: editor/find_in_files.cpp +msgid "%d matches in %d file." +msgstr "" + +#: editor/find_in_files.cpp +msgid "%d matches in %d files." +msgstr "" + +#: editor/groups_editor.cpp +msgid "Add to Group" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Remove from Group" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Group name already exists." +msgstr "" + +#: editor/groups_editor.cpp +msgid "Invalid group name." +msgstr "" + +#: editor/groups_editor.cpp +msgid "Rename Group" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Delete Group" +msgstr "" + +#: editor/groups_editor.cpp editor/node_dock.cpp +msgid "Groups" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Nodes Not in Group" +msgstr "" + +#: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp +msgid "Filter nodes" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Nodes in Group" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Empty groups will be automatically removed." +msgstr "" + +#: editor/groups_editor.cpp +msgid "Group Editor" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Manage Groups" +msgstr "" + +#: editor/import/editor_import_collada.cpp +msgid "Collada" +msgstr "" + +#: editor/import/editor_import_collada.cpp +msgid "Use Ambient" +msgstr "" + +#: editor/import/resource_importer_bitmask.cpp +msgid "Create From" +msgstr "" + +#: editor/import/resource_importer_bitmask.cpp +#: servers/audio/effects/audio_effect_compressor.cpp +msgid "Threshold" +msgstr "" + +#: editor/import/resource_importer_csv_translation.cpp +#: editor/import/resource_importer_layered_texture.cpp +#: editor/import/resource_importer_scene.cpp +#: editor/import/resource_importer_texture.cpp +#: editor/import/resource_importer_wav.cpp scene/3d/gi_probe.cpp +msgid "Compress" +msgstr "" + +#: editor/import/resource_importer_csv_translation.cpp +msgid "Delimiter" +msgstr "" + +#: editor/import/resource_importer_layered_texture.cpp +msgid "ColorCorrect" +msgstr "" + +#: editor/import/resource_importer_layered_texture.cpp +msgid "No BPTC If RGB" +msgstr "" + +#: editor/import/resource_importer_layered_texture.cpp +#: editor/import/resource_importer_texture.cpp scene/2d/cpu_particles_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/texture.cpp scene/resources/visual_shader.cpp +msgid "Flags" +msgstr "" + +#: editor/import/resource_importer_layered_texture.cpp +#: editor/import/resource_importer_texture.cpp scene/animation/tween.cpp +#: scene/resources/texture.cpp +msgid "Repeat" +msgstr "" + +#: editor/import/resource_importer_layered_texture.cpp +#: editor/import/resource_importer_texture.cpp scene/2d/light_2d.cpp +#: scene/gui/control.cpp +msgid "Filter" +msgstr "" + +#: editor/import/resource_importer_layered_texture.cpp +#: editor/import/resource_importer_texture.cpp +msgid "Mipmaps" +msgstr "" + +#: editor/import/resource_importer_layered_texture.cpp +#: editor/import/resource_importer_texture.cpp +msgid "Anisotropic" +msgstr "" + +#: editor/import/resource_importer_layered_texture.cpp +#: editor/import/resource_importer_texture.cpp +msgid "sRGB" +msgstr "" + +#: editor/import/resource_importer_layered_texture.cpp +msgid "Slices" +msgstr "" + +#: editor/import/resource_importer_layered_texture.cpp +#: scene/gui/aspect_ratio_container.cpp scene/gui/control.cpp +#: scene/gui/nine_patch_rect.cpp scene/gui/scroll_container.cpp +#: scene/resources/style_box.cpp +msgid "Horizontal" +msgstr "" + +#: editor/import/resource_importer_layered_texture.cpp +#: scene/gui/aspect_ratio_container.cpp scene/gui/control.cpp +#: scene/gui/nine_patch_rect.cpp scene/gui/scroll_container.cpp +#: scene/resources/style_box.cpp +msgid "Vertical" +msgstr "" + +#: editor/import/resource_importer_obj.cpp +msgid "Generate Tangents" +msgstr "" + +#: editor/import/resource_importer_obj.cpp +msgid "Scale Mesh" +msgstr "" + +#: editor/import/resource_importer_obj.cpp +msgid "Offset Mesh" +msgstr "" + +#: editor/import/resource_importer_obj.cpp +#: editor/import/resource_importer_scene.cpp +msgid "Octahedral Compression" +msgstr "" + +#: editor/import/resource_importer_obj.cpp +msgid "Optimize Mesh Flags" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import as Single Scene" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Materials" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects+Materials" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects+Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Materials+Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects+Materials+Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import as Multiple Scenes" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import as Multiple Scenes+Materials" +msgstr "" + +#: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp +#: scene/3d/physics_joint.cpp +msgid "Nodes" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Root Type" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Root Name" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Root Scale" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Custom Script" +msgstr "" + +#: editor/import/resource_importer_scene.cpp scene/resources/texture.cpp +msgid "Storage" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Use Legacy Names" +msgstr "" + +#: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp +msgid "Materials" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Keep On Reimport" +msgstr "" + +#: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp +msgid "Meshes" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Ensure Tangents" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Light Baking" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Lightmap Texel Size" +msgstr "" + +#: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp +msgid "Skins" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Use Named Skins" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "External Files" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Store In Subdir" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Filter Script" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Keep Custom Tracks" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Optimizer" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +#: editor/plugins/item_list_editor_plugin.cpp main/main.cpp +#: modules/mono/mono_gd/gd_mono.cpp platform/javascript/export/export.cpp +#: platform/osx/export/export.cpp scene/2d/camera_2d.cpp scene/2d/light_2d.cpp +#: scene/2d/navigation_polygon.cpp scene/2d/ray_cast_2d.cpp scene/2d/sprite.cpp +#: scene/2d/y_sort.cpp scene/3d/audio_stream_player_3d.cpp +#: scene/3d/baked_lightmap.cpp scene/3d/interpolated_camera.cpp +#: scene/3d/light.cpp scene/3d/navigation_mesh_instance.cpp +#: scene/3d/physics_joint.cpp scene/3d/ray_cast.cpp scene/3d/skeleton.cpp +#: scene/3d/sprite_3d.cpp scene/gui/graph_edit.cpp +#: scene/gui/rich_text_label.cpp scene/resources/curve.cpp +#: scene/resources/environment.cpp scene/resources/material.cpp +msgid "Enabled" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Max Linear Error" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Max Angular Error" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Max Angle" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Remove Unused Tracks" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Clips" +msgstr "" + +#: editor/import/resource_importer_scene.cpp scene/2d/cpu_particles_2d.cpp +#: scene/2d/particles_2d.cpp scene/3d/area.cpp scene/3d/cpu_particles.cpp +#: scene/3d/particles.cpp scene/resources/environment.cpp +msgid "Amount" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Import Scene" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Importing Scene..." +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Generating Lightmaps" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Generating for Mesh:" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Running Custom Script..." +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Couldn't load post-import script:" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Invalid/broken script for post-import (check console):" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Error running post-import script:" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Did you return a Node-derived object in the `post_import()` method?" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Saving..." +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "" +"%s: Texture detected as used as a normal map in 3D. Enabling red-green " +"texture compression to reduce memory usage (blue channel is discarded)." +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "" +"%s: Texture detected as used in 3D. Enabling filter, repeat, mipmap " +"generation and VRAM texture compression." +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "2D, Detect 3D" +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "2D Pixel" +msgstr "" + +#: editor/import/resource_importer_texture.cpp scene/resources/texture.cpp +msgid "Lossy Quality" +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "HDR Mode" +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "BPTC LDR" +msgstr "" + +#: editor/import/resource_importer_texture.cpp +#: editor/plugins/tile_set_editor_plugin.cpp scene/2d/cpu_particles_2d.cpp +#: scene/2d/mesh_instance_2d.cpp scene/2d/multimesh_instance_2d.cpp +#: scene/2d/particles_2d.cpp scene/2d/sprite.cpp scene/resources/style_box.cpp +msgid "Normal Map" +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "Process" +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "Fix Alpha Border" +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "Premult Alpha" +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "Hdr As Srgb" +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "Invert Color" +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "Normal Map Invert Y" +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "Size Limit" +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "Detect 3D" +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "SVG" +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "" +"Warning, no suitable PC VRAM compression enabled in Project Settings. This " +"texture will not display correctly on PC." +msgstr "" + +#: editor/import/resource_importer_texture_atlas.cpp +msgid "Atlas File" +msgstr "" + +#: editor/import/resource_importer_texture_atlas.cpp +msgid "Import Mode" +msgstr "" + +#: editor/import/resource_importer_texture_atlas.cpp +msgid "Crop To Region" +msgstr "" + +#: editor/import/resource_importer_texture_atlas.cpp +msgid "Trim Alpha Border From Region" +msgstr "" + +#: editor/import/resource_importer_wav.cpp scene/2d/physics_body_2d.cpp +msgid "Force" +msgstr "" + +#: editor/import/resource_importer_wav.cpp +msgid "8 Bit" +msgstr "" + +#: editor/import/resource_importer_wav.cpp main/main.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp +msgid "Mono" +msgstr "" + +#: editor/import/resource_importer_wav.cpp +msgid "Max Rate" +msgstr "" + +#: editor/import/resource_importer_wav.cpp +msgid "Max Rate Hz" +msgstr "" + +#: editor/import/resource_importer_wav.cpp +msgid "Trim" +msgstr "" + +#: editor/import/resource_importer_wav.cpp +msgid "Normalize" +msgstr "" + +#: editor/import/resource_importer_wav.cpp +#: scene/resources/audio_stream_sample.cpp +msgid "Loop Mode" +msgstr "" + +#: editor/import/resource_importer_wav.cpp +#: scene/resources/audio_stream_sample.cpp +msgid "Loop Begin" +msgstr "" + +#: editor/import/resource_importer_wav.cpp +#: scene/resources/audio_stream_sample.cpp +msgid "Loop End" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + +#: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp +msgid "%d Files" +msgstr "" + +#: editor/import_dock.cpp +msgid "Set as Default for '%s'" +msgstr "" + +#: editor/import_dock.cpp +msgid "Clear Default for '%s'" +msgstr "" + +#: editor/import_dock.cpp +msgid "Reimport" +msgstr "" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp +msgid "Import As:" +msgstr "" + +#: editor/import_dock.cpp +msgid "Save Scenes, Re-Import, and Restart" +msgstr "" + +#: editor/import_dock.cpp +msgid "Changing the type of an imported file requires editor restart." +msgstr "" + +#: editor/import_dock.cpp +msgid "" +"WARNING: Assets exist that use this resource, they may stop loading properly." +msgstr "" + +#: editor/import_dock.cpp +msgid "" +"Select a resource file in the filesystem or in the inspector to adjust " +"import settings." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Failed to load resource." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Property Name Style" +msgstr "" + +#: editor/inspector_dock.cpp scene/gui/color_picker.cpp +msgid "Raw" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Capitalized" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Localized" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Localization not available for current language." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Copy Properties" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Paste Properties" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Make Sub-Resources Unique" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Create a new resource in memory and edit it." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Load an existing resource from disk and edit it." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Save the currently edited resource." +msgstr "" + +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp +msgid "Save As..." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Extra resource options." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Edit Resource from Clipboard" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Copy Resource" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Make Resource Built-In" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Go to the previous edited object in history." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Go to the next edited object in history." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "History of recently edited objects." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Open documentation for this object." +msgstr "" + +#: editor/inspector_dock.cpp editor/scene_tree_dock.cpp +msgid "Open Documentation" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Filter properties" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Manage object properties." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Changes may be lost!" +msgstr "" + +#: editor/multi_node_edit.cpp +msgid "MultiNode Set" +msgstr "" + +#: editor/node_dock.cpp +msgid "Select a single node to edit its signals and groups." +msgstr "" + +#: editor/plugin_config_dialog.cpp +msgid "Edit a Plugin" +msgstr "" + +#: editor/plugin_config_dialog.cpp +msgid "Create a Plugin" +msgstr "" + +#: editor/plugin_config_dialog.cpp +msgid "Plugin Name:" +msgstr "" + +#: editor/plugin_config_dialog.cpp +msgid "Subfolder:" +msgstr "" + +#: editor/plugin_config_dialog.cpp +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Author:" +msgstr "" + +#: editor/plugin_config_dialog.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Version:" +msgstr "" + +#: editor/plugin_config_dialog.cpp editor/script_create_dialog.cpp +msgid "Language:" +msgstr "" + +#: editor/plugin_config_dialog.cpp +msgid "Script Name:" +msgstr "" + +#: editor/plugin_config_dialog.cpp +msgid "Activate now?" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Create Polygon" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Create points." +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "" +"Edit points.\n" +"LMB: Move Point\n" +"RMB: Erase Point" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/animation_blend_space_1d_editor.cpp +msgid "Erase points." +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Edit Polygon" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Insert Point" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Edit Polygon (Remove Point)" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Remove Polygon And Point" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/animation_state_machine_editor.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Animation" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +#: editor/plugins/animation_state_machine_editor.cpp +#: editor/plugins/canvas_item_editor_plugin.cpp +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Add %s" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Load..." +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Move Node Point" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +msgid "Change BlendSpace1D Limits" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +msgid "Change BlendSpace1D Labels" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +#: editor/plugins/animation_state_machine_editor.cpp +msgid "This type of node can't be used. Only root nodes are allowed." +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Add Node Point" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Add Animation Point" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +msgid "Remove BlendSpace1D Point" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +msgid "Move BlendSpace1D Node Point" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/animation_state_machine_editor.cpp +msgid "" +"AnimationTree is inactive.\n" +"Activate to enable playback, check node warnings if activation fails." +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Set the blending position within the space" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Select and move points, create points with RMB." +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp +msgid "Enable snap and show grid." +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Point" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Open Editor" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Open Animation Node" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Triangle already exists." +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Add Triangle" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Change BlendSpace2D Limits" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Change BlendSpace2D Labels" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Remove BlendSpace2D Point" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Remove BlendSpace2D Triangle" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "BlendSpace2D does not belong to an AnimationTree node." +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "No triangles exist, so no blending can take place." +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Toggle Auto Triangles" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Create triangles by connecting points." +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Erase points and triangles." +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Generate blend triangles automatically (instead of manually)" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Blend:" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Parameter Changed:" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Edit Filters" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Output node can't be added to the blend tree." +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Add Node to BlendTree" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Node Moved" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Unable to connect, port may be in use or connection may be invalid." +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Nodes Connected" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Nodes Disconnected" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Set Animation" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Delete Node" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Toggle Filter On/Off" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Change Filter" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "No animation player set, so unable to retrieve track names." +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Player path set is invalid, so unable to retrieve track names." +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/root_motion_editor_plugin.cpp +msgid "" +"Animation player has no valid root node path, so unable to retrieve track " +"names." +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Audio Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Functions" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Node Renamed" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Add Node..." +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/root_motion_editor_plugin.cpp +msgid "Edit Filtered Tracks:" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Enable Filtering" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Toggle Autoplay" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "New Animation Name:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "New Anim" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Change Animation Name:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Delete Animation?" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Remove Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Invalid animation name!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation name already exists!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Blend Next Changed" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Change Blend Time" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Load Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "No animation resource on clipboard!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Pasted Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Paste Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation backwards from current pos. (A)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation backwards from end. (Shift+A)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Stop animation playback. (S)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation from start. (Shift+D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation from current pos. (D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation position (in seconds)." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Scale animation playback globally for the node." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation Tools" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/version_control_editor_plugin.cpp +msgid "New" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Paste As Reference" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Edit Transitions..." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Open in Inspector" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Display list of animations in player." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Autoplay on Load" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning Options" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Directions" +msgstr "" + +#. TRANSLATORS: Opposite of "Future", refers to a direction in animation onion skinning. +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Past" +msgstr "" + +#. TRANSLATORS: Opposite of "Past", refers to a direction in animation onion skinning. +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Future" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp modules/csg/csg_shape.cpp +#: scene/3d/collision_polygon.cpp scene/main/scene_tree.cpp +#: scene/resources/material.cpp scene/resources/primitive_meshes.cpp +#: servers/audio/effects/audio_effect_phaser.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Pin AnimationPlayer" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation Name:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp +msgid "Error!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Blend Times:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Next (Auto Queue):" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Cross-Animation Blend Times" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Move Node" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Transition exists!" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Add Transition" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Node" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "End" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Immediate" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +#: scene/animation/animation_blend_tree.cpp +msgid "Sync" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "At End" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +#: scene/3d/vehicle_body.cpp +msgid "Travel" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Start and end nodes are needed for a sub-transition." +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "No playback resource set at path: %s." +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Node Removed" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Transition Removed" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Set Start Node (Autoplay)" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "" +"Select and move nodes.\n" +"RMB to add new nodes.\n" +"Shift+LMB to create connections." +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Create new nodes." +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Connect nodes." +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Remove selected node or transition." +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Toggle autoplay this animation on start, restart or seek to zero." +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Set the end animation. This is useful for sub-transitions." +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Transition:" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Play Mode:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "AnimationTree" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "New name:" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Fade In (s):" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Fade Out (s):" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +#: scene/resources/style_box.cpp scene/resources/visual_shader.cpp +msgid "Blend" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Auto Restart:" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Restart (s):" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Random Restart (s):" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Start!" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Amount:" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Blend 0:" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Blend 1:" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "X-Fade Time (s):" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Input" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Clear Auto-Advance" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Set Auto-Advance" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Delete Input" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Animation tree is valid." +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Animation tree is invalid." +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Animation Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "OneShot Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Mix Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Blend2 Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Blend3 Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Blend4 Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "TimeScale Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "TimeSeek Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Transition Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Import Animations..." +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Edit Node Filters" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Filters..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp scene/main/http_request.cpp +msgid "Use Threads" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Contents:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "View Files" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Download" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Connection error, please try again." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't connect." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't connect to host:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "No response from host:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "No response." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't resolve hostname:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't resolve." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Request failed, return code:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Cannot save response to:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Write error." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Request failed, too many redirects" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Redirect loop." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Request failed, timeout" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Timeout." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Failed:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Bad download hash, assuming file has been tampered with." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Expected:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Got:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Failed SHA-256 hash check" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Asset Download Error:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Downloading (%s / %s)..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Downloading..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Resolving..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Error making request" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Idle" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Install..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Retry" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Download Error" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Available URLs" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Download for this asset is already in progress!" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Recently Updated" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Least Recently Updated" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Name (A-Z)" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Name (Z-A)" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "License (A-Z)" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "License (Z-A)" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Loading..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgctxt "Pagination" +msgid "First" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgctxt "Pagination" +msgid "Previous" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgctxt "Pagination" +msgid "Next" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgctxt "Pagination" +msgid "Last" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "All" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Search templates, projects, and demos" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Search assets (excluding templates, projects, and demos)" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Import..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Plugins..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp +msgid "Sort:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Category:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Site:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Support" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Official" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Testing" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Failed to get repository configuration." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Assets ZIP File" +msgstr "" + +#: editor/plugins/audio_stream_editor_plugin.cpp +msgid "Audio Preview Play/Pause" +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "" +"Can't determine a save path for lightmap images.\n" +"Save your scene and try again." +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "" +"No meshes to bake. Make sure they contain an UV2 channel and that the 'Use " +"In Baked Light' and 'Generate Lightmap' flags are on." +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "Failed creating lightmap images, make sure path is writable." +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "Failed determining lightmap size. Maximum lightmap size too small?" +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "" +"Some mesh is invalid. Make sure the UV2 channel values are contained within " +"the [0.0,1.0] square region." +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "" +"Godot editor was built without ray tracing support, lightmaps can't be baked." +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "Bake Lightmaps" +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "LightMap Bake" +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "Select lightmap bake file:" +msgstr "" + +#: editor/plugins/camera_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp scene/resources/mesh_library.cpp +msgid "Preview" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Configure Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Grid Offset:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Grid Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation Offset:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Vertical Guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create Vertical Guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Remove Vertical Guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Horizontal Guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create Horizontal Guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Remove Horizontal Guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create Horizontal and Vertical Guides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Set CanvasItem \"%s\" Pivot Offset to (%d, %d)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotate %d CanvasItems" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotate CanvasItem \"%s\" to %d degrees" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move CanvasItem \"%s\" Anchor" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Node2D \"%s\" to (%s, %s)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Resize Control \"%s\" to (%d, %d)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale %d CanvasItems" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale CanvasItem \"%s\" to (%s, %s)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move %d CanvasItems" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move CanvasItem \"%s\" to (%d, %d)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Locked" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Grouped" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Children of containers have their anchors and margins values overridden by " +"their parent." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Presets for the anchors and margins values of a Control node." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"When active, moving Control nodes changes their anchors instead of their " +"margins." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp scene/resources/style_box.cpp +msgid "Top Left" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp scene/resources/style_box.cpp +msgid "Top Right" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp scene/resources/style_box.cpp +msgid "Bottom Right" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp scene/resources/style_box.cpp +msgid "Bottom Left" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center Left" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center Top" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center Right" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center Bottom" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Left Wide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Top Wide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Right Wide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Bottom Wide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "VCenter Wide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "HCenter Wide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Full Rect" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Keep Ratio" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Anchors only" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change Anchors and Margins" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change Anchors" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Project Camera Override\n" +"Overrides the running project's camera with the editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Project Camera Override\n" +"No project instance running. Run the project from the editor to use this " +"feature." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Lock Selected" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Unlock Selected" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Group Selected" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Ungroup Selected" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Paste Pose" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Guides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create Custom Bone(s) from Node(s)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Bones" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Make IK Chain" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear IK Chain" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Warning: Children of a container get their position and size determined only " +"by their parent." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +#: editor/plugins/texture_region_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp +msgid "Zoom Reset" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp scene/gui/item_list.cpp +#: scene/gui/tree.cpp +msgid "Select Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Drag: Rotate selected node around pivot." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Alt+Drag: Move selected node." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Alt+Drag: Scale selected node." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "V: Set selected node's pivot position." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Alt+RMB: Show list of all nodes at position clicked, including locked." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "RMB: Add node at position clicked." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Move Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Shift: Scale proportionally." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Show a list of all objects at the position clicked\n" +"(same as Alt+RMB in select mode)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Click to change object's rotation pivot." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Pan Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Ruler Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Toggle smart snapping." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Smart Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Toggle grid snapping." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Grid Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snapping Options" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Rotation Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap Relative" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Pixel Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Smart Snapping" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Configure Snap..." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to Parent" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to Node Anchor" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to Node Sides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to Node Center" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to Other Nodes" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to Guides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Lock the selected object in place (can't be moved)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Lock Selected Node(s)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Unlock the selected object (can be moved)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Unlock Selected Node(s)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Makes sure the object's children are not selectable." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Group Selected Node(s)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Restores the object's children's ability to be selected." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Ungroup Selected Node(s)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Skeleton Options" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Bones" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Make Custom Bone(s) from Node(s)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Custom Bones" +msgstr "" + +#. TRANSLATORS: Noun, name of the 2D/3D View menus. +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show When Snapping" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Hide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Toggle Grid" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Helpers" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Rulers" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Guides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Origin" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Viewport" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Group And Lock Icons" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center Selection" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Frame Selection" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Preview Canvas Scale" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Layout" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert keys (based on mask)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated or scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Auto Insert Key" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Animation Key and Pose Options" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Key (Existing Tracks)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Copy Pose" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Pose" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Add Node Here" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Instance Scene Here" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Multiply grid step by 2" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Divide grid step by 2" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Pan View" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom to 3.125%" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom to 6.25%" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom to 12.5%" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom to 25%" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom to 50%" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom to 100%" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom to 200%" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom to 400%" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom to 800%" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom to 1600%" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Adding %s..." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Cannot instantiate multiple nodes without root." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "Create Node" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "Error instancing scene from %s" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change Default Type" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Drag & drop + Shift : Add node as sibling\n" +"Drag & drop + Alt : Change node type" +msgstr "" + +#: editor/plugins/collision_polygon_editor_plugin.cpp +msgid "Create Polygon3D" +msgstr "" + +#: editor/plugins/collision_polygon_editor_plugin.cpp +msgid "Edit Poly" +msgstr "" + +#: editor/plugins/collision_polygon_editor_plugin.cpp +msgid "Edit Poly (Remove Point)" +msgstr "" + +#: editor/plugins/collision_shape_2d_editor_plugin.cpp +msgid "Set Handle" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/cpu_particles_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Restart" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp editor/spatial_editor_gizmos.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Solid Pixels" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Border Pixels" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Directed Border Pixels" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + +#: editor/plugins/cpu_particles_editor_plugin.cpp +msgid "CPUParticles" +msgstr "" + +#: editor/plugins/cpu_particles_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emission Points From Mesh" +msgstr "" + +#: editor/plugins/cpu_particles_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emission Points From Node" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Flat 0" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Flat 1" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp +msgid "Ease In" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp +msgid "Ease Out" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Smoothstep" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Modify Curve Point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Modify Curve Tangent" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load Curve Preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Add Point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Remove Point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Left Linear" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Right Linear" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load Preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Remove Curve Point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Toggle Curve Linear Tangent" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Hold Shift to edit tangents individually" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Right click to add point" +msgstr "" + +#: editor/plugins/gi_probe_editor_plugin.cpp +msgid "Bake GI Probe" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Gradient Edited" +msgstr "" + +#: editor/plugins/gradient_texture_2d_editor_plugin.cpp +msgid "Swap GradientTexture2D Fill Points" +msgstr "" + +#: editor/plugins/gradient_texture_2d_editor_plugin.cpp +msgid "Swap Gradient Fill Points" +msgstr "" + +#: editor/plugins/gradient_texture_2d_editor_plugin.cpp +msgid "Toggle Grid Snap" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp editor/project_export.cpp +#: scene/3d/label_3d.cpp scene/gui/button.cpp scene/gui/dialogs.cpp +#: scene/gui/label.cpp scene/gui/line_edit.cpp scene/gui/link_button.cpp +#: scene/gui/rich_text_label.cpp scene/gui/text_edit.cpp +#: scene/resources/primitive_meshes.cpp +msgid "Text" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp main/main.cpp +#: platform/osx/export/export.cpp platform/windows/export/export.cpp +#: scene/gui/button.cpp scene/gui/item_list.cpp +msgid "Icon" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "ID" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Separator" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Item %d" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Items" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Item List Editor" +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Create Occluder Polygon" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh is empty!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Couldn't create a Trimesh collision shape." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Static Trimesh Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "This doesn't work on scene root!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Static Shape" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Can't create a single convex collision shape for the scene root." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Couldn't create a single convex collision shape." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Simplified Convex Shape" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Single Convex Shape" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Can't create multiple convex collision shapes for the scene root." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Couldn't create any collision shapes." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Multiple Convex Shapes" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Navigation Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Contained Mesh is not of type ArrayMesh." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "UV Unwrap failed, mesh may not be manifold?" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "No mesh to debug." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh has no UV in layer %d." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "MeshInstance lacks a Mesh!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh has not surface to create outlines from!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Could not create outline!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp modules/csg/csg_shape.cpp +#: modules/gltf/gltf_mesh.cpp modules/gltf/gltf_node.cpp +#: scene/2d/mesh_instance_2d.cpp scene/3d/cpu_particles.cpp +#: scene/3d/mesh_instance.cpp scene/resources/mesh_library.cpp +#: scene/resources/multimesh.cpp scene/resources/primitive_meshes.cpp +#: scene/resources/texture.cpp +msgid "Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Static Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "" +"Creates a StaticBody and assigns a polygon-based collision shape to it " +"automatically.\n" +"This is the most accurate (but slowest) option for collision detection." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Collision Sibling" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "" +"Creates a polygon-based collision shape.\n" +"This is the most accurate (but slowest) option for collision detection." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Single Convex Collision Sibling" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "" +"Creates a single convex collision shape.\n" +"This is the fastest (but least accurate) option for collision detection." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Simplified Convex Collision Sibling" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "" +"Creates a simplified convex collision shape.\n" +"This is similar to single collision shape, but can result in a simpler " +"geometry in some cases, at the cost of accuracy." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Multiple Convex Collision Siblings" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "" +"Creates a polygon-based collision shape.\n" +"This is a performance middle-ground between a single convex collision and a " +"polygon-based collision." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline Mesh..." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "" +"Creates a static outline mesh. The outline mesh will have its normals " +"flipped automatically.\n" +"This can be used instead of the SpatialMaterial Grow property when using " +"that property isn't possible." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "View UV1" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "View UV2" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Unwrap UV2 for Lightmap/AO" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Outline Size:" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "UV Channel Debug" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Remove item %d?" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "" +"Update from existing scene?:\n" +"%s" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "MeshLibrary" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Add Item" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Remove Selected Item" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Import from Scene (Ignore Transforms)" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Import from Scene (Apply Transforms)" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Update from Scene" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Apply without Transforms" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Apply with Transforms" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No mesh source specified (and no MultiMesh set in node)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No mesh source specified (and MultiMesh contains no Mesh)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (invalid path)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (not a MeshInstance)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (contains no Mesh resource)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No surface source specified." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (invalid path)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (no geometry)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (no faces)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Select a Source Mesh:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Select a Target Surface:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate Surface" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate MultiMesh" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Target Surface:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Source Mesh:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "X-Axis" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Y-Axis" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Z-Axis" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh Up Axis:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Rotation:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Tilt:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Scale:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate" +msgstr "" + +#: editor/plugins/navigation_polygon_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create Navigation Polygon" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Convert to CPUParticles" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generating Visibility Rect" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generate Visibility Rect" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Convert to CPUParticles2D" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generation Time (sec):" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "The geometry's faces don't contain any area." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "The geometry doesn't contain any faces." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "\"%s\" doesn't inherit from Spatial." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "\"%s\" doesn't contain geometry." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "\"%s\" doesn't contain face geometry." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emitter" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Emission Points:" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Surface Points" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Surface Points+Normal (Directed)" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp scene/gui/video_player.cpp +msgid "Volume" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Emission Source:" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "A processor material of type 'ParticlesMaterial' is required." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generating AABB" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generate Visibility AABB" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Out-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove In-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Add Point to Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Split Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move Point in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move In-Control in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move Out-Control in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Select Points" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Shift+Drag: Select Control Points" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Click: Add Point" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Left Click: Split Segment (in curve)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Right Click: Delete Point" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Select Control Points (Shift+Drag)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Add Point (in empty space)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Delete Point" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Close Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +#: editor/plugins/theme_editor_preview.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_export.cpp +#: main/main.cpp servers/visual_server.cpp +msgid "Options" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Mirror Handle Angles" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Mirror Handle Lengths" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Curve Point #" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve Point Position" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve In Position" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve Out Position" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Split Path" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove Path Point" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove Out-Control Point" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove In-Control Point" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Split Segment (in curve)" +msgstr "" + +#: editor/plugins/physical_bone_plugin.cpp +msgid "Move Joint" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "" +"The skeleton property of the Polygon2D does not point to a Skeleton2D node" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Sync Bones" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "" +"No texture in this polygon.\n" +"Set a texture to be able to edit UV." +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Create UV Map" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "" +"Polygon 2D has internal vertices, so it can no longer be edited in the " +"viewport." +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Create Polygon & UV" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Create Internal Vertex" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Remove Internal Vertex" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Invalid Polygon (need 3 different vertices)" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Add Custom Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Remove Custom Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Transform UV Map" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Transform Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Paint Bone Weights" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Open Polygon 2D UV editor." +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Polygon 2D UV Editor" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp scene/2d/polygon_2d.cpp +msgid "UV" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp scene/2d/cpu_particles_2d.cpp +#: scene/2d/line_2d.cpp scene/3d/cpu_particles.cpp scene/3d/portal.cpp +#: scene/3d/room.cpp scene/resources/convex_polygon_shape.cpp +#: scene/resources/convex_polygon_shape_2d.cpp +msgid "Points" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp scene/2d/polygon_2d.cpp +#: scene/resources/navigation_mesh.cpp +msgid "Polygons" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp scene/3d/skeleton.cpp +msgid "Bones" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Move Points" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Command: Rotate" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Shift: Move All" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Shift+Command: Scale" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Ctrl: Rotate" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Shift+Ctrl: Scale" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Move Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Rotate Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Scale Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Create a custom polygon. Enables custom polygon rendering." +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "" +"Remove a custom polygon. If none remain, custom polygon rendering is " +"disabled." +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Paint weights with specified intensity." +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Unpaint weights with specified intensity." +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Radius:" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Copy Polygon to UV" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Copy UV to Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Clear UV" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Settings" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp modules/csg/csg_shape.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Snap" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Enable Snap" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Show Grid" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Configure Grid:" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Offset X:" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Offset Y:" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Step X:" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Step Y:" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Sync Bones to Polygon" +msgstr "" + +#: editor/plugins/ray_cast_2d_editor_plugin.cpp +msgid "Set cast_to" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "ERROR: Couldn't load resource!" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Add Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Rename Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Delete Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Resource clipboard is empty!" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Paste Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/scene_tree_editor.cpp +msgid "Instance:" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +msgid "Open in Editor" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Load Resource" +msgstr "" + +#: editor/plugins/room_manager_editor_plugin.cpp +msgid "Flip Portals" +msgstr "" + +#: editor/plugins/room_manager_editor_plugin.cpp +msgid "Room Generate Points" +msgstr "" + +#: editor/plugins/room_manager_editor_plugin.cpp +msgid "Generate Points" +msgstr "" + +#: editor/plugins/room_manager_editor_plugin.cpp +msgid "Flip Portal" +msgstr "" + +#: editor/plugins/room_manager_editor_plugin.cpp +msgid "Occluder Set Transform" +msgstr "" + +#: editor/plugins/room_manager_editor_plugin.cpp +msgid "Center Node" +msgstr "" + +#: editor/plugins/root_motion_editor_plugin.cpp +msgid "AnimationTree has no path set to an AnimationPlayer" +msgstr "" + +#: editor/plugins/root_motion_editor_plugin.cpp +msgid "Path to AnimationPlayer is invalid" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Files" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close and save changes?" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error writing TextFile:" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Could not load file at:" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error saving file!" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error while saving theme." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error Saving" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error importing theme." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error Importing" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "New Text File..." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Open File" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save File As..." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Can't obtain the script for running." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Script failed reloading, check console for errors." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Script is not in tool mode, will not be able to run." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "" +"To run this script, it must inherit EditorScript and be set to tool mode." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Import Theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error while saving theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error saving" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save Theme As..." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "%s Class Reference" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +msgid "Find Next" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +msgid "Find Previous" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Filter scripts" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Toggle alphabetical sorting of the method list." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Filter methods" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp scene/2d/y_sort.cpp +msgid "Sort" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Move Up" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Move Down" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Next Script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Previous Script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "File" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Open..." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Reopen Closed Script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save All" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Soft Reload Script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Copy Script Path" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "History Previous" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "History Next" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Import Theme..." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Reload Theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save Theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close All" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close Docs" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Step Into" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Step Over" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Break" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp +#: editor/script_editor_debugger.cpp +msgid "Continue" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Keep Debugger Open" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Debug with External Editor" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Online Docs" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Open Godot online documentation." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Search the reference documentation." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Go to previous edited document." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Go to next edited document." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Discard" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?:" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Search Results" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Open Dominant Script On Scene Change" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "External" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Use External Editor" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Exec Path" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Script Temperature Enabled" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Highlight Current Script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Script Temperature History Size" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Current Script Background Color" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Group Help Pages" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Sort Scripts By" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "List Script Names As" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Exec Flags" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Scripts" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Connections to method:" +msgstr "" + +#: editor/plugins/script_text_editor.cpp editor/script_editor_debugger.cpp +#: scene/resources/visual_shader_nodes.cpp +msgid "Source" +msgstr "" + +#: editor/plugins/script_text_editor.cpp platform/uwp/export/export.cpp +#: scene/3d/interpolated_camera.cpp scene/animation/skeleton_ik.cpp +msgid "Target" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "" +"Missing connected method '%s' for signal '%s' from node '%s' to node '%s'." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "[Ignore]" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Line" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Go to Function" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Only resources from filesystem can be dropped." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Can't drop nodes because script '%s' is not used in this scene." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lookup Symbol" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Pick Color" +msgstr "" + +#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp +msgid "Convert Case" +msgstr "" + +#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp +#: scene/3d/label_3d.cpp scene/gui/label.cpp +#: scene/resources/primitive_meshes.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp +msgid "Syntax Highlighter" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +msgid "Bookmarks" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Breakpoints" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Cut" +msgstr "" + +#: editor/plugins/script_text_editor.cpp editor/plugins/theme_editor_plugin.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Select All" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Delete Line" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Indent Left" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Indent Right" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Toggle Comment" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Fold/Unfold Line" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Fold All Lines" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Unfold All Lines" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Complete Symbol" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Evaluate Selection" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Trim Trailing Whitespace" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert Indent to Spaces" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert Indent to Tabs" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Find in Files..." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Replace in Files..." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Contextual Help" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Toggle Bookmark" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Go to Next Bookmark" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Go to Previous Bookmark" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Remove All Bookmarks" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Go to Function..." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Go to Line..." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Toggle Breakpoint" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Remove All Breakpoints" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Go to Next Breakpoint" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Go to Previous Breakpoint" +msgstr "" + +#: editor/plugins/shader_editor_plugin.cpp +msgid "" +"This shader has been modified on on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/plugins/shader_editor_plugin.cpp scene/resources/material.cpp +msgid "Shader" +msgstr "" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "This skeleton has no bones, create some children Bone2D nodes." +msgstr "" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Set Rest Pose to Bones" +msgstr "" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Create Rest Pose from Bones" +msgstr "" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Skeleton2D" +msgstr "" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Reset to Rest Pose" +msgstr "" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Overwrite Rest Pose" +msgstr "" + +#: editor/plugins/skeleton_editor_plugin.cpp +msgid "Create physical bones" +msgstr "" + +#: editor/plugins/skeleton_editor_plugin.cpp editor/spatial_editor_gizmos.cpp +#: modules/gltf/gltf_node.cpp modules/gltf/gltf_skin.cpp +#: scene/2d/polygon_2d.cpp scene/3d/mesh_instance.cpp +msgid "Skeleton" +msgstr "" + +#: editor/plugins/skeleton_editor_plugin.cpp +msgid "Create physical skeleton" +msgstr "" + +#: editor/plugins/skeleton_ik_editor_plugin.cpp +msgid "Play IK" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orthogonal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp modules/gltf/gltf_camera.cpp +msgid "Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Top Orthogonal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Top Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom Orthogonal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left Orthogonal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Orthogonal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front Orthogonal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear Orthogonal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear Perspective" +msgstr "" + +#. TRANSLATORS: This will be appended to the view name when Auto Orthogonal is enabled. +#: editor/plugins/spatial_editor_plugin.cpp +msgid " [auto]" +msgstr "" + +#. TRANSLATORS: This will be appended to the view name when Portal Occulusion is enabled. +#: editor/plugins/spatial_editor_plugin.cpp +msgid " [portals active]" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Aborted." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "X-Axis Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Y-Axis Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Z-Axis Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Plane Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#: editor/plugins/texture_region_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp scene/resources/visual_shader.cpp +msgid "None" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp scene/2d/path_2d.cpp +msgid "Rotate" +msgstr "" + +#. TRANSLATORS: This refers to the movement that changes the position of an object. +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translate" +msgstr "" + +#. TRANSLATORS: Refers to changing the scale of a node in the 3D editor. +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scaling:" +msgstr "" + +#. TRANSLATORS: Refers to changing the position of a node in the 3D editor. +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translating:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotating %s degrees." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Keying is disabled (no key inserted)." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Animation Key Inserted." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Pitch:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Yaw:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Material Changes:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Shader Changes:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Surface Changes:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Vertices:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "FPS: %d (%s ms)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Top View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "No parent to instance a child at." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "This operation requires a single selected node." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Lock View Rotation" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Normal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Wireframe" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Overdraw" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Unshaded" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Environment" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Gizmos" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Information" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View FPS" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Half Resolution" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp scene/main/viewport.cpp +msgid "Audio Listener" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Enable Doppler" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Cinematic Preview" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "(Not in GLES2)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Debug draw modes are only available when using the GLES3 renderer, not GLES2." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Forward" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Backwards" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Slow Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Toggle Camera Preview" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Rotation Locked" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"To zoom further, change the camera's clipping planes (View -> Settings...)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Convert Rooms" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Click to toggle between visibility states.\n" +"\n" +"Open eye: Gizmo is visible.\n" +"Closed eye: Gizmo is hidden.\n" +"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Snap Nodes to Floor" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Couldn't find a solid floor to snap the selection to." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Use Local Space" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp scene/gui/graph_edit.cpp +msgid "Use Snap" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Converts rooms for portal culling." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Top View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Switch Perspective/Orthogonal View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Insert Animation Key" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Focus Origin" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Focus Selection" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Toggle Freelook" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Decrease Field of View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Increase Field of View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Reset Field of View to Default" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Snap Object to Floor" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Dialog..." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "1 Viewport" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "2 Viewports" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "2 Viewports (Alt)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "3 Viewports" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "3 Viewports (Alt)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "4 Viewports" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Gizmos" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Origin" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Grid" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Portal Culling" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Occlusion Culling" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Settings..." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Snap Settings" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translate Snap:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate Snap (deg.):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale Snap (%):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Viewport Settings" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Perspective FOV (deg.):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Z-Near:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Z-Far:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Change" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translate:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate (deg.):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale (ratio):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Type" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Pre" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Post" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Manipulator Gizmo Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Manipulator Gizmo Opacity" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Show Viewport Rotation Gizmo" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Unnamed Gizmo" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create Mesh2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Mesh2D Preview" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create Polygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Polygon2D Preview" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create CollisionPolygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "CollisionPolygon2D Preview" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "LightOccluder2D Preview" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Sprite is empty!" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Can't convert a sprite using animation frames to mesh." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't replace by mesh." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Convert to MeshInstance2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Convert to Polygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create CollisionPolygon2D Sibling" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D Sibling" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Sprite" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Simplification:" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Shrink (Pixels):" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Grow (Pixels):" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Update Preview" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Settings:" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "No Frames Selected" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add %d Frame(s)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Frame" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Unable to load images" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "ERROR: Couldn't load frame resource!" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Resource clipboard is empty or not a texture!" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Paste Frame" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Empty" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Change Animation FPS" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "(empty)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Move Frame" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Animations:" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "New Animation" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Filter animations" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Speed:" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +#: modules/gltf/gltf_animation.cpp modules/minimp3/audio_stream_mp3.cpp +#: modules/minimp3/resource_importer_mp3.cpp +#: modules/stb_vorbis/audio_stream_ogg_vorbis.cpp +#: modules/stb_vorbis/resource_importer_ogg_vorbis.cpp scene/2d/path_2d.cpp +#: scene/3d/path.cpp scene/resources/animation.cpp scene/resources/material.cpp +msgid "Loop" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Animation Frames:" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add a Texture from File" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Frames from a Sprite Sheet" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Insert Empty (Before)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Insert Empty (After)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Move (Before)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Move (After)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Select Frames" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Horizontal:" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Vertical:" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Separation:" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Offset:" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Select/Clear All Frames" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Create Frames from Sprite Sheet" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "SpriteFrames" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Set Region Rect" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Set Margin" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Snap Mode:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Pixel Snap" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Grid Snap" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Auto Slice" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Step:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "TextureRegion" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Styleboxes" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "{num} color(s)" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "No colors found." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "{num} constant(s)" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "No constants found." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "{num} font(s)" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "No fonts found." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "{num} icon(s)" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "No icons found." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "{num} stylebox(es)" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "No styleboxes found." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "{num} currently selected" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Nothing was selected for the import." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Importing Theme Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Importing items {n}/{n}" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Updating the editor" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Finalizing" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Filter:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "With Data" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select by data type:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all visible color items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all visible color items and their data." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Deselect all visible color items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all visible constant items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all visible constant items and their data." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Deselect all visible constant items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all visible font items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all visible font items and their data." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Deselect all visible font items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all visible icon items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all visible icon items and their data." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Deselect all visible icon items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all visible stylebox items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all visible stylebox items and their data." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Deselect all visible stylebox items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "" +"Caution: Adding icon data may considerably increase the size of your Theme " +"resource." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Collapse types." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Expand types." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all Theme items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select With Data" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all Theme items with item data." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Deselect All" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Deselect all Theme items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Import Selected" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "" +"Import Items tab has some items selected. Selection will be lost upon " +"closing this window.\n" +"Close anyway?" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove Type" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "" +"Select a theme type from the list to edit its items.\n" +"You can add a custom type or import a type with its items from another theme." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove All Color Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Rename Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove All Constant Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove All Font Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove All Icon Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove All StyleBox Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "" +"This theme type is empty.\n" +"Add more items to it manually or by importing from another theme." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Theme Type" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove Theme Type" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Color Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Constant Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Font Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Icon Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Stylebox Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Rename Color Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Rename Constant Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Rename Font Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Rename Icon Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Rename Stylebox Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Invalid file, not a Theme resource." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Invalid file, same as the edited Theme resource." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Manage Theme Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Edit Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Types:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Type:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Item:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add StyleBox Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove Items:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove Class Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove Custom Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove All Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Theme Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Old Name:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Import Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Default Theme" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Editor Theme" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select Another Theme Resource:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Theme Resource" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Another Theme" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Type" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Filter the list of types or create a new custom type:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Available Node-based types:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Type name is empty!" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Are you sure you want to create an empty type?" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Confirm Item Rename" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Cancel Item Rename" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Override Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Unpin this StyleBox as a main style." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "" +"Pin this StyleBox as a main style. Editing its properties will update the " +"same properties in all other StyleBoxes of this type." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Item Type" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Set Variation Base Type" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Set Base Type" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Show Default" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Show default type items alongside items that have been overridden." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Override All" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Override all default type items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select the variation base type from a list of available types." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "" +"A type associated with a built-in class cannot be marked as a variation of " +"another type." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Theme:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Manage Items..." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add, remove, organize and import Theme items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Preview" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Default Preview" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select UI Scene:" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "" +"Toggle the control picker, allowing to visually select control types for " +"edit." +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Toggle Button" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Disabled Button" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp scene/resources/mesh_library.cpp +msgid "Item" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Disabled Item" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Check Item" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Checked Item" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Radio Item" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Checked Radio Item" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Named Separator" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Submenu" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Subitem 1" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Subitem 2" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Has" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Many" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Disabled LineEdit" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Tab 1" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Tab 2" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Tab 3" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Editable Item" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Subtree" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Has,Many,Options" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Invalid path, the PackedScene resource was probably moved or removed." +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Invalid PackedScene resource, must have a Control node at its root." +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Invalid file, not a PackedScene resource." +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Reload the scene to reflect its most actual state." +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Erase Selection" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Fix Invalid Tiles" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cut Selection" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Paint TileMap" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Line Draw" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rectangle Paint" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Bucket Fill" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Erase TileMap" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Find Tile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Transpose" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Disable Autotile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Enable Priority" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Filter tiles" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Give a TileSet resource to this TileMap to use its tiles." +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Paint Tile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "" +"Shift+LMB: Line Draw\n" +"Shift+Command+LMB: Rectangle Paint" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "" +"Shift+LMB: Line Draw\n" +"Shift+Ctrl+LMB: Rectangle Paint" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Pick Tile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate Left" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate Right" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Flip Horizontally" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Flip Vertically" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Clear Transform" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Tile Map" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Palette Min Width" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Palette Item H Separation" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Show Tile Names" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Show Tile Ids" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Sort Tiles By Name" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Bucket Fill Preview" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Editor Side" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Display Grid" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Axis Color" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Add Texture(s) to TileSet." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove selected Texture from TileSet." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create from Scene" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Merge from Scene" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "New Single Tile" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "New Autotile" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "New Atlas" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Next Coordinate" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Select the next shape, subtile, or Tile." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Previous Coordinate" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Select the previous shape, subtile, or Tile." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp scene/2d/sprite.cpp +#: scene/3d/sprite_3d.cpp scene/resources/texture.cpp +msgid "Region" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp modules/csg/csg_shape.cpp +#: modules/gridmap/grid_map.cpp scene/2d/collision_object_2d.cpp +#: scene/2d/physics_body_2d.cpp scene/2d/tile_map.cpp +#: scene/3d/collision_object.cpp scene/3d/physics_body.cpp +#: scene/3d/physics_joint.cpp scene/3d/soft_body.cpp scene/main/scene_tree.cpp +#: scene/resources/shape_2d.cpp +msgid "Collision" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Occlusion" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp scene/2d/touch_screen_button.cpp +msgid "Bitmask" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp scene/2d/area_2d.cpp +#: scene/3d/area.cpp scene/3d/physics_joint.cpp +#: scene/animation/animation_node_state_machine.cpp +msgid "Priority" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp scene/2d/node_2d.cpp +msgid "Z Index" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Region Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Collision Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Occlusion Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Navigation Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Bitmask Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Priority Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/item_list.cpp +msgid "Icon Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Z Index Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Copy bitmask." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Paste bitmask." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Erase bitmask." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create a new rectangle." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "New Rectangle" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create a new polygon." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "New Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Delete Selected Shape" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Keep polygon inside region Rect." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Enable snap and show grid (configurable via the Inspector)." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Display Tile Names (Hold Alt Key)" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "" +"Add or select a texture on the left panel to edit the tiles bound to it." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove selected texture? This will remove all tiles which use it." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "You haven't selected a texture to remove." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create from scene? This will overwrite all current tiles." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Merge from scene?" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove Texture" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "%s file(s) were not added because was already on the list." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "" +"Drag handles to edit Rect.\n" +"Click on another Tile to edit it." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Delete selected Rect." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "" +"Select current edited sub-tile.\n" +"Click on another Tile to edit it." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Delete polygon." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "" +"LMB: Set bit on.\n" +"RMB: Set bit off.\n" +"Shift+LMB: Set wildcard bit.\n" +"Click on another Tile to edit it." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "" +"Select sub-tile to use as icon, this will be also used on invalid autotile " +"bindings.\n" +"Click on another Tile to edit it." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "" +"Select sub-tile to change its priority.\n" +"Click on another Tile to edit it." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "" +"Select sub-tile to change its z index.\n" +"Click on another Tile to edit it." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Set Tile Region" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create Tile" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Set Tile Icon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Edit Tile Bitmask" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Edit Collision Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Edit Occlusion Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Edit Navigation Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Paste Tile Bitmask" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Clear Tile Bitmask" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Make Polygon Concave" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Make Polygon Convex" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove Tile" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove Collision Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove Occlusion Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove Navigation Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Edit Tile Priority" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Edit Tile Z Index" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Make Convex" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Make Concave" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create Collision Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create Occlusion Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "This property can't be changed." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Snap Options" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp scene/2d/animated_sprite.cpp +#: scene/2d/camera_2d.cpp scene/2d/cpu_particles_2d.cpp scene/2d/light_2d.cpp +#: scene/2d/parallax_background.cpp scene/2d/parallax_layer.cpp +#: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp +#: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp +#: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp +#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp +#: scene/main/canvas_layer.cpp scene/resources/material.cpp +#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +msgid "Offset" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp editor/rename_dialog.cpp +#: scene/gui/range.cpp scene/resources/animation.cpp +#: scene/resources/visual_shader_nodes.cpp servers/physics_2d_server.cpp +#: servers/physics_server.cpp +msgid "Step" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Separation" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Selected Tile" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp scene/2d/cpu_particles_2d.cpp +#: scene/2d/light_2d.cpp scene/2d/line_2d.cpp scene/2d/mesh_instance_2d.cpp +#: scene/2d/multimesh_instance_2d.cpp scene/2d/particles_2d.cpp +#: scene/2d/polygon_2d.cpp scene/2d/sprite.cpp scene/3d/sprite_3d.cpp +#: scene/gui/nine_patch_rect.cpp scene/gui/texture_rect.cpp +#: scene/resources/material.cpp scene/resources/sky.cpp +#: scene/resources/style_box.cpp scene/resources/visual_shader_nodes.cpp +msgid "Texture" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Tex Offset" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp modules/csg/csg_shape.cpp +#: scene/2d/canvas_item.cpp scene/2d/particles_2d.cpp +#: scene/3d/mesh_instance.cpp scene/resources/primitive_meshes.cpp +msgid "Material" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp scene/2d/canvas_item.cpp +#: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/style_box.cpp +msgid "Modulate" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Tile Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Autotile Bitmask Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Subtile Size" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Subtile Spacing" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Occluder Offset" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Navigation Offset" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Shape Offset" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Shape Transform" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Selected Collision" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Selected Collision One Way" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Selected Collision One Way Margin" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Selected Navigation" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Selected Occlusion" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Tileset Script" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "TileSet" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "No VCS plugins are available." +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "" +"Remote settings are empty. VCS features that use the network may not work." +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "No commit message was provided." +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Commit" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Staged Changes" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Unstaged Changes" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Commit:" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Date:" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Subtitle:" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Do you want to remove the %s branch?" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Do you want to remove the %s remote?" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Apply" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control System" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Initialize" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Remote Login" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Select SSH public key path" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Select SSH private key path" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "SSH Passphrase" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Detect new changes" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Discard all changes" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Stage all changes" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Unstage all changes" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Commit Message" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Commit Changes" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Commit List" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Commit list size" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Branches" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Create New Branch" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Remove Branch" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Branch Name" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Remotes" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Create New Remote" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Remove Remote" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Remote Name" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Remote URL" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Fetch" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Pull" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Push" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Force Push" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Modified" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Renamed" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Deleted" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Typechange" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Unmerged" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "View:" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Split" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Unified" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Add Output" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Scalar" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Vector" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Boolean" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Sampler" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Add input port" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Add output port" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Change input port type" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Change output port type" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Change input port name" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Change output port name" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Remove input port" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Remove output port" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Set expression" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Resize VisualShader node" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Set Uniform Name" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Set Input Default Port" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Add Node to Visual Shader" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Node(s) Moved" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Duplicate Nodes" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Paste Nodes" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Delete Nodes" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Visual Shader Input Type Changed" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "UniformRef Name Changed" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Vertex" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Fragment" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp modules/gltf/gltf_node.cpp +#: scene/3d/light.cpp +msgid "Light" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Show resulted shader code." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Create Shader Node" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Color function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Color operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Grayscale function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Converts HSV vector to RGB equivalent." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Converts RGB vector to HSV equivalent." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Sepia function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Burn operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Darken operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Difference operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Dodge operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "HardLight operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Lighten operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Overlay operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Screen operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "SoftLight operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Color constant." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Color uniform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns an associated vector if the provided scalars are equal, greater or " +"less." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns an associated vector if the provided boolean value is true or false." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns an associated scalar if the provided boolean value is true or false." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Boolean constant." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Boolean uniform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "'%s' input parameter for all shader modes." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Input parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "'%s' input parameter for vertex and fragment shader modes." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "'%s' input parameter for fragment and light shader modes." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "'%s' input parameter for fragment shader mode." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "'%s' input parameter for light shader mode." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "'%s' input parameter for vertex shader mode." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "'%s' input parameter for vertex and fragment shader mode." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Scalar function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Scalar operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "E constant (2.718282). Represents the base of the natural logarithm." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Epsilon constant (0.00001). Smallest possible scalar number." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Phi constant (1.618034). Golden ratio." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Pi/4 constant (0.785398) or 45 degrees." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Pi/2 constant (1.570796) or 90 degrees." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Pi constant (3.141593) or 180 degrees." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Tau constant (6.283185) or 360 degrees." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Sqrt2 constant (1.414214). Square root of 2." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the absolute value of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the arc-cosine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the inverse hyperbolic cosine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the arc-sine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the inverse hyperbolic sine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the arc-tangent of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the arc-tangent of the parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the inverse hyperbolic tangent of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Finds the nearest integer that is greater than or equal to the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Constrains a value to lie between two further values." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the cosine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the hyperbolic cosine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Converts a quantity in radians to degrees." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Base-e Exponential." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Base-2 Exponential." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Finds the nearest integer less than or equal to the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Computes the fractional part of the argument." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the inverse of the square root of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Natural logarithm." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Base-2 logarithm." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the greater of two values." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the lesser of two values." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Linear interpolation between two scalars." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the opposite value of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "1.0 - scalar" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the value of the first parameter raised to the power of the second." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Converts a quantity in degrees to radians." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "1.0 / scalar" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Finds the nearest integer to the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Finds the nearest even integer to the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Clamps the value between 0.0 and 1.0." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Extracts the sign of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the sine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the hyperbolic sine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the square root of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n" +"\n" +"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than " +"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " +"using Hermite polynomials." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Step function( scalar(edge), scalar(x) ).\n" +"\n" +"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the tangent of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the hyperbolic tangent of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Finds the truncated value of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Adds scalar to scalar." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Divides scalar by scalar." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Multiplies scalar by scalar." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the remainder of the two scalars." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Subtracts scalar from scalar." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Scalar constant." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Scalar uniform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Perform the cubic texture lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Perform the texture lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Cubic texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup with triplanar." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Transform function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Calculate the outer product of a pair of vectors.\n" +"\n" +"OuterProduct treats the first parameter 'c' as a column vector (matrix with " +"one column) and the second parameter 'r' as a row vector (matrix with one " +"row) and does a linear algebraic matrix multiply 'c * r', yielding a matrix " +"whose number of rows is the number of components in 'c' and whose number of " +"columns is the number of components in 'r'." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Composes transform from four vectors." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Decomposes transform to four vectors." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Calculates the determinant of a transform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Calculates the inverse of a transform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Calculates the transpose of a transform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Multiplies transform by transform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Multiplies vector by transform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Transform constant." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Transform uniform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Vector function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Vector operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Composes vector from three scalars." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Decomposes vector to three scalars." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Calculates the cross product of two vectors." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the distance between two points." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Calculates the dot product of two vectors." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the vector that points in the same direction as a reference vector. " +"The function has three vector parameters : N, the vector to orient, I, the " +"incident vector, and Nref, the reference vector. If the dot product of I and " +"Nref is smaller than zero the return value is N. Otherwise -N is returned." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Calculates the length of a vector." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Linear interpolation between two vectors." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Linear interpolation between two vectors using scalar." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Calculates the normalize product of vector." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "1.0 - vector" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "1.0 / vector" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the vector that points in the direction of reflection ( a : incident " +"vector, b : normal vector )." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the vector that points in the direction of refraction." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n" +"\n" +"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than " +"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " +"using Hermite polynomials." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n" +"\n" +"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than " +"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " +"using Hermite polynomials." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Step function( vector(edge), vector(x) ).\n" +"\n" +"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Step function( scalar(edge), vector(x) ).\n" +"\n" +"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Adds vector to vector." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Divides vector by vector." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Multiplies vector by vector." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the remainder of the two vectors." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Subtracts vector from vector." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Vector constant." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Vector uniform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Custom Godot Shader Language expression, with custom amount of input and " +"output ports. This is a direct injection of code into the vertex/fragment/" +"light function, do not use it to write the function declarations inside." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns falloff based on the dot product of surface normal and view " +"direction of camera (pass associated inputs to it)." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "A reference to an existing uniform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(Fragment/Light mode only) Scalar derivative function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(Fragment/Light mode only) Vector derivative function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "VisualShader" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Edit Visual Property:" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Visual Shader Mode Changed" +msgstr "" + +#: editor/project_export.cpp +msgid "Runnable" +msgstr "" + +#: editor/project_export.cpp +msgid "Export the project for all the presets defined." +msgstr "" + +#: editor/project_export.cpp +msgid "All presets must have an export path defined for Export All to work." +msgstr "" + +#: editor/project_export.cpp +msgid "Delete preset '%s'?" +msgstr "" + +#: editor/project_export.cpp +msgid "Exporting All" +msgstr "" + +#: editor/project_export.cpp +msgid "Export Path" +msgstr "" + +#: editor/project_export.cpp +msgid "Presets" +msgstr "" + +#: editor/project_export.cpp editor/project_settings_editor.cpp +msgid "Add..." +msgstr "" + +#: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp +msgid "Resources" +msgstr "" + +#: editor/project_export.cpp +msgid "Export all resources in the project" +msgstr "" + +#: editor/project_export.cpp +msgid "Export selected scenes (and dependencies)" +msgstr "" + +#: editor/project_export.cpp +msgid "Export selected resources (and dependencies)" +msgstr "" + +#: editor/project_export.cpp +msgid "Export Mode:" +msgstr "" + +#: editor/project_export.cpp +msgid "Resources to export:" +msgstr "" + +#: editor/project_export.cpp +msgid "" +"Filters to export non-resource files/folders\n" +"(comma-separated, e.g: *.json, *.txt, docs/*)" +msgstr "" + +#: editor/project_export.cpp +msgid "" +"Filters to exclude files/folders from project\n" +"(comma-separated, e.g: *.json, *.txt, docs/*)" +msgstr "" + +#: editor/project_export.cpp +msgid "Features" +msgstr "" + +#: editor/project_export.cpp +msgid "Custom (comma-separated):" +msgstr "" + +#: editor/project_export.cpp +msgid "Feature List:" +msgstr "" + +#: editor/project_export.cpp +msgid "Script" +msgstr "" + +#: editor/project_export.cpp +msgid "GDScript Export Mode:" +msgstr "" + +#: editor/project_export.cpp +msgid "Compiled Bytecode (Faster Loading)" +msgstr "" + +#: editor/project_export.cpp +msgid "Encrypted (Provide Key Below)" +msgstr "" + +#: editor/project_export.cpp +msgid "Invalid Encryption Key (must be 64 hexadecimal characters long)" +msgstr "" + +#: editor/project_export.cpp +msgid "GDScript Encryption Key (256-bits as hexadecimal):" +msgstr "" + +#: editor/project_export.cpp +msgid "" +"Note: Encryption key needs to be stored in the binary,\n" +"you need to build the export templates from source." +msgstr "" + +#: editor/project_export.cpp +msgid "More Info..." +msgstr "" + +#: editor/project_export.cpp +msgid "Export PCK/Zip..." +msgstr "" + +#: editor/project_export.cpp +msgid "Export Project..." +msgstr "" + +#: editor/project_export.cpp +msgid "Export All" +msgstr "" + +#: editor/project_export.cpp +msgid "Choose an export mode:" +msgstr "" + +#: editor/project_export.cpp +msgid "Export All..." +msgstr "" + +#: editor/project_export.cpp editor/project_manager.cpp +msgid "ZIP File" +msgstr "" + +#: editor/project_export.cpp +msgid "Godot Project Pack" +msgstr "" + +#: editor/project_export.cpp +msgid "Export templates for this platform are missing:" +msgstr "" + +#: editor/project_export.cpp +msgid "Project Export" +msgstr "" + +#: editor/project_export.cpp +msgid "Manage Export Templates" +msgstr "" + +#: editor/project_export.cpp +msgid "Export With Debug" +msgstr "" + +#: editor/project_manager.cpp +msgid "The path specified doesn't exist." +msgstr "" + +#: editor/project_manager.cpp +msgid "Error opening package file (it's not in ZIP format)." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file." +msgstr "" + +#: editor/project_manager.cpp +msgid "Please choose an empty folder." +msgstr "" + +#: editor/project_manager.cpp +msgid "Please choose a \"project.godot\" or \".zip\" file." +msgstr "" + +#: editor/project_manager.cpp +msgid "This directory already contains a Godot project." +msgstr "" + +#: editor/project_manager.cpp +msgid "New Game Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Imported Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Invalid project name." +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't create folder." +msgstr "" + +#: editor/project_manager.cpp +msgid "There is already a folder in this path with the specified name." +msgstr "" + +#: editor/project_manager.cpp +msgid "It would be a good idea to name your project." +msgstr "" + +#: editor/project_manager.cpp +msgid "Invalid project path (changed anything?)." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Couldn't load project.godot in project path (error %d). It may be missing or " +"corrupted." +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't edit project.godot in project path." +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't create project.godot in project path." +msgstr "" + +#: editor/project_manager.cpp +msgid "Error opening package file, not in ZIP format." +msgstr "" + +#: editor/project_manager.cpp +msgid "The following files failed extraction from package:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Package installed successfully!" +msgstr "" + +#: editor/project_manager.cpp +msgid "Rename Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Import Existing Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Import & Edit" +msgstr "" + +#: editor/project_manager.cpp +msgid "Create New Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Create & Edit" +msgstr "" + +#: editor/project_manager.cpp +msgid "Install Project:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Install & Edit" +msgstr "" + +#: editor/project_manager.cpp +msgid "Project Name:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Project Path:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Project Installation Path:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Renderer:" +msgstr "" + +#: editor/project_manager.cpp +msgid "OpenGL ES 3.0" +msgstr "" + +#: editor/project_manager.cpp +msgid "Not supported by your GPU drivers." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Higher visual quality\n" +"All features available\n" +"Incompatible with older hardware\n" +"Not recommended for web games" +msgstr "" + +#: editor/project_manager.cpp +msgid "OpenGL ES 2.0" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Lower visual quality\n" +"Some features not available\n" +"Works on most hardware\n" +"Recommended for web games" +msgstr "" + +#: editor/project_manager.cpp +msgid "Renderer can be changed later, but scenes may need to be adjusted." +msgstr "" + +#: editor/project_manager.cpp +msgid "Missing Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Error: Project is missing on the filesystem." +msgstr "" + +#: editor/project_manager.cpp editor/scene_tree_dock.cpp +msgid "Local" +msgstr "" + +#: editor/project_manager.cpp +msgid "Local Projects" +msgstr "" + +#: editor/project_manager.cpp +msgid "Asset Library Projects" +msgstr "" + +#: editor/project_manager.cpp +msgid "Can't open project at '%s'." +msgstr "" + +#: editor/project_manager.cpp +msgid "Are you sure to open more than one project?" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"The following project settings file does not specify the version of Godot " +"through which it was created.\n" +"\n" +"%s\n" +"\n" +"If you proceed with opening it, it will be converted to Godot's current " +"configuration file format.\n" +"Warning: You won't be able to open the project with previous versions of the " +"engine anymore." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"The following project settings file was generated by an older engine " +"version, and needs to be converted for this version:\n" +"\n" +"%s\n" +"\n" +"Do you want to convert it?\n" +"Warning: You won't be able to open the project with previous versions of the " +"engine anymore." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"The project settings were created by a newer engine version, whose settings " +"are not compatible with this version." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Can't run project: no main scene defined.\n" +"Please edit the project and set the main scene in the Project Settings under " +"the \"Application\" category." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Can't run project: Assets need to be imported.\n" +"Please edit the project to trigger the initial import." +msgstr "" + +#: editor/project_manager.cpp +msgid "Are you sure to run %d projects at once?" +msgstr "" + +#: editor/project_manager.cpp +msgid "Remove %d projects from the list?" +msgstr "" + +#: editor/project_manager.cpp +msgid "Remove this project from the list?" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Remove all missing projects from the list?\n" +"The project folders' contents won't be modified." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Language changed.\n" +"The interface will update after restarting the editor or project manager." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Are you sure to scan %s folders for existing Godot projects?\n" +"This could take a while." +msgstr "" + +#. TRANSLATORS: This refers to the application where users manage their Godot projects. +#: editor/project_manager.cpp +msgctxt "Application" +msgid "Project Manager" +msgstr "" + +#: editor/project_manager.cpp +msgid "Last Modified" +msgstr "" + +#: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "" + +#: editor/project_manager.cpp +msgid "Edit Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Run Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Scan" +msgstr "" + +#: editor/project_manager.cpp +msgid "Scan Projects" +msgstr "" + +#: editor/project_manager.cpp +msgid "Select a Folder to Scan" +msgstr "" + +#: editor/project_manager.cpp +msgid "New Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Import Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Remove Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Remove Missing" +msgstr "" + +#: editor/project_manager.cpp +msgid "About" +msgstr "" + +#: editor/project_manager.cpp +msgid "Restart Now" +msgstr "" + +#: editor/project_manager.cpp +msgid "Remove All" +msgstr "" + +#: editor/project_manager.cpp +msgid "Also delete project contents (no undo!)" +msgstr "" + +#: editor/project_manager.cpp +msgid "Can't run project" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"You currently don't have any projects.\n" +"Would you like to explore official example projects in the Asset Library?" +msgstr "" + +#: editor/project_manager.cpp +msgid "Filter projects" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"This field filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Physical Key" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Key " +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joy Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joy Axis" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Mouse Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "" +"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or " +"'\"'" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "An action with the name '%s' already exists." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Rename Input Action Event" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Change Action deadzone" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Input Action Event" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "All Devices" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid " (Physical)" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Press a Key..." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Mouse Button Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Left Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Right Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Middle Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Up Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Down Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Left Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Right Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "X Button 1" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "X Button 2" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joypad Axis Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joypad Button Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Erase Input Action" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Erase Input Action Event" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Event" +msgstr "" + +#: editor/project_settings_editor.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Left Button." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Right Button." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Middle Button." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Up." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Down." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Global Property" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Select a setting item first!" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "No property '%s' exists." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Setting '%s' is internal, and it can't be deleted." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Delete Item" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "" +"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or " +"'\"'." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Input Action" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Error saving settings." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Settings saved OK." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Moved Input Action Event" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Override for Feature" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add %d Translations" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remove Translation" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Translation Resource Remap: Add %d Path(s)" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Translation Resource Remap: Add %d Remap(s)" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Change Resource Remap Language" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remove Resource Remap" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remove Resource Remap Option" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Changed Locale Filter" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Changed Locale Filter Mode" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Project Settings (project.godot)" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "General" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Override For..." +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "The editor must be restarted for changes to take effect." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Input Map" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Action:" +msgstr "" + +#: editor/project_settings_editor.cpp scene/gui/scroll_container.cpp +msgid "Deadzone" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Device:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Localization" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Translations" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Translations:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remaps" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Resources:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remaps by Locale:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Locales Filter" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Show All Locales" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Show Selected Locales Only" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Filter mode:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Locales:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "AutoLoad" +msgstr "" + +#: editor/project_settings_editor.cpp platform/android/export/export_plugin.cpp +#: platform/iphone/export/export.cpp +msgid "Plugins" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + +#: editor/property_editor.cpp +msgid "Preset..." +msgstr "" + +#: editor/property_editor.cpp +msgid "Zero" +msgstr "" + +#: editor/property_editor.cpp +msgid "Easing In-Out" +msgstr "" + +#: editor/property_editor.cpp +msgid "Easing Out-In" +msgstr "" + +#: editor/property_editor.cpp +msgid "File..." +msgstr "" + +#: editor/property_editor.cpp +msgid "Dir..." +msgstr "" + +#: editor/property_editor.cpp +msgid "Assign" +msgstr "" + +#: editor/property_editor.cpp +msgid "Select Node" +msgstr "" + +#: editor/property_editor.cpp +msgid "Error loading file: Not a resource!" +msgstr "" + +#: editor/property_editor.cpp +msgid "Pick a Node" +msgstr "" + +#: editor/property_editor.cpp +msgid "Bit %d, val %d." +msgstr "" + +#: editor/property_selector.cpp +msgid "Select Property" +msgstr "" + +#: editor/property_selector.cpp +msgid "Select Virtual Method" +msgstr "" + +#: editor/property_selector.cpp +msgid "Select Method" +msgstr "" + +#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp +msgid "Batch Rename" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Prefix:" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Suffix:" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Use Regular Expressions" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Advanced Options" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Substitute" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Node name" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Node's parent name, if available" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Node type" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Current scene name" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Root node name" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "" +"Sequential integer counter.\n" +"Compare counter options." +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Per-level Counter" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "If set, the counter restarts for each group of child nodes." +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Initial value for the counter" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Amount by which counter is incremented for each node" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Padding" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "" +"Minimum number of digits for the counter.\n" +"Missing digits are padded with leading zeros." +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Post-Process" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Style" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Keep" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "PascalCase to snake_case" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "snake_case to PascalCase" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Case" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "To Lowercase" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "To Uppercase" +msgstr "" + +#: editor/rename_dialog.cpp scene/resources/default_theme/default_theme.cpp +msgid "Reset" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Regular Expression Error:" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "At character %s" +msgstr "" + +#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp +msgid "Reparent Node" +msgstr "" + +#: editor/reparent_dialog.cpp +msgid "Reparent Location (Select new Parent):" +msgstr "" + +#: editor/reparent_dialog.cpp +msgid "Keep Global Transform" +msgstr "" + +#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp +msgid "Reparent" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Run Mode:" +msgstr "" + +#: editor/run_settings_dialog.cpp scene/main/scene_tree.cpp +msgid "Current Scene" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Main Scene Arguments:" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Scene Run Settings" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "No parent to instance the scenes at." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Error loading scene from %s" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Cannot instance the scene '%s' because the current scene exists within one " +"of its nodes." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Instance Scene(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Replace with Branch Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Instance Child Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Detach Script" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "This operation can't be done on the tree root." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Move Node In Parent" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Move Nodes In Parent" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Duplicate Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Can't reparent nodes in inherited scenes, order of nodes can't change." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Node must belong to the edited scene to become root." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Instantiated scenes can't become root" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Make node as Root" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete %d nodes and any children?" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete %d nodes?" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete the root node \"%s\"?" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete node \"%s\" and its children?" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete node \"%s\"?" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Saving the branch as a scene requires having a scene open in the editor." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Saving the branch as a scene requires selecting only one node, but you have " +"selected %d nodes." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Can't save the root node branch as an instanced scene.\n" +"To create an editable copy of the current scene, duplicate it using the " +"FileSystem dock context menu\n" +"or create an inherited scene using Scene > New Inherited Scene... instead." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Can't save the branch of an already instanced scene.\n" +"To create a variation of a scene, you can make an inherited scene based on " +"the instanced scene using Scene > New Inherited Scene... instead." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Can't save a branch which is a child of an already instantiated scene.\n" +"To save this branch into its own scene, open the original scene, right click " +"on this branch, and select \"Save Branch as Scene\"." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Can't save a branch which is part of an inherited scene.\n" +"To save this branch into its own scene, open the original scene, right click " +"on this branch, and select \"Save Branch as Scene\"." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Save New Scene As..." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Disabling \"editable_instance\" will cause all properties of the node to be " +"reverted to their default." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Enabling \"Load As Placeholder\" will disable \"Editable Children\" and " +"cause all properties of the node to be reverted to their default." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Make Local" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Enable Scene Unique Name(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Disable Scene Unique Name(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "New Scene Root" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Create Root Node:" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "2D Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "3D Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "User Interface" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Other Node" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Can't operate on nodes from a foreign scene!" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Can't operate on nodes the current scene inherits from!" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "This operation can't be done on instanced scenes." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Attach Script" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Remove Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Change type of node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Couldn't save new scene. Likely dependencies (instances) couldn't be " +"satisfied." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Error saving scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Error duplicating scene to save it." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Sub-Resources" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Access as Scene Unique Name" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear Inheritance" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Editable Children" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Load As Placeholder" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Cannot attach a script: there are no languages registered.\n" +"This is probably because this editor was built with all language modules " +"disabled." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Add Child Node" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Expand/Collapse All" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Change Type" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Reparent to New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Make Scene Root" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Merge From Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp +msgid "Save Branch as Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp +msgid "Copy Node Path" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete (No Confirm)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Add/Create a New Node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Instance a scene file as a Node. Creates an inherited scene if no root node " +"exists." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Attach a new or existing script to the selected node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Detach the script from the selected node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Remote" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"If selected, the Remote scene tree dock will cause the project to stutter " +"every time it updates.\n" +"Switch back to the Local scene tree dock to improve performance." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear Inheritance? (No Undo!)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Show Scene Tree Root Selection" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Derive Script Globals By Name" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Use Favorites Root Selection" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visible" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Unlock Node" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Button Group" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Disable Scene Unique Name" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "(Connecting From)" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"This node can be accessed from within anywhere in the scene by preceding it " +"with the '%s' prefix in a node path.\n" +"Click to disable this." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has %s connection(s) and %s group(s).\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has %s connection(s).\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in %s group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Open Script:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock it." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"AnimationPlayer is pinned.\n" +"Click to unpin." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Invalid node name, the following characters are not allowed:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Rename Node" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Scene Tree (Nodes):" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Node Configuration Warning!" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Select a Node" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Path is empty." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Filename is empty." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Path is not local." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid base path." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "A directory with the same name exists." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "File does not exist." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid extension." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Wrong extension chosen." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Error loading template '%s'" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Error - Could not create script in filesystem." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Error loading script from %s" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Overrides" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "N/A" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Open Script / Choose Location" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Open Script" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "File exists, it will be reused." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid path." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid class name." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid inherited parent name or path." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Script path/name is valid." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Allowed: a-z, A-Z, 0-9, _ and ." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Built-in script (into scene file)." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Will create a new script file." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Will load an existing script file." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Script file already exists." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "" +"Warning: Having the script name be the same as a built-in type is usually " +"not desired." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Class Name:" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Template:" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Built-in Script:" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Attach Node Script" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Remote %s:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Bytes:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Warning:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Error:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "C++ Error" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "C++ Error:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "C++ Source" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Source:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "C++ Source:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Stack Trace" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Errors" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Child process connected." +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Copy Error" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Open C++ Source on GitHub" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Video RAM" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Skip Breakpoints" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Inspect Previous Instance" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Inspect Next Instance" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Stack Frames" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Filter stack variables" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Auto Switch To Remote Scene Tree" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Remote Scene Tree Refresh Interval" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Remote Inspect Refresh Interval" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Network Profiler" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Monitor" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Monitors" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Pick one or more items from the list to display the graph." +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "List of Video Memory Usage by Resource:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Total:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Export list to a CSV file" +msgstr "" + +#: editor/script_editor_debugger.cpp +#: modules/visual_script/visual_script_nodes.cpp +msgid "Resource Path" +msgstr "" + +#: editor/script_editor_debugger.cpp scene/resources/audio_stream_sample.cpp +#: servers/audio/effects/audio_effect_record.cpp +msgid "Format" +msgstr "" + +#: editor/script_editor_debugger.cpp scene/main/viewport.cpp +msgid "Usage" +msgstr "" + +#: editor/script_editor_debugger.cpp servers/visual_server.cpp +msgid "Misc" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Clicked Control:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Clicked Control Type:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Live Edit Root:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Set From Tree" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Export measures as CSV" +msgstr "" + +#: editor/settings_config_dialog.cpp +msgid "Erase Shortcut" +msgstr "" + +#: editor/settings_config_dialog.cpp +msgid "Restore Shortcut" +msgstr "" + +#: editor/settings_config_dialog.cpp +msgid "Change Shortcut" +msgstr "" + +#: editor/settings_config_dialog.cpp +msgid "Editor Settings" +msgstr "" + +#: editor/settings_config_dialog.cpp +msgid "Shortcuts" +msgstr "" + +#: editor/settings_config_dialog.cpp +msgid "Binding" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Light Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Stream Player 3D" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change AudioStreamPlayer3D Emission Angle" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp modules/gltf/gltf_node.cpp +#: platform/osx/export/export.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Camera" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Camera FOV" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Camera Size" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Visibility Notifier" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Notifier AABB" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Particles AABB" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Reflection Probe" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Probe Extents" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "GI Probe" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Baked Indirect Light" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp +msgid "Change Sphere Shape Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp +msgid "Change Box Shape Extents" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Capsule Shape Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Capsule Shape Height" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Cylinder Shape Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Cylinder Shape Height" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Ray Shape Length" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Navigation Edge" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Navigation Edge Disabled" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Navigation Solid" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Navigation Solid Disabled" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Joint Body A" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Joint Body B" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Room Edge" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Room Overlap" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Room Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp scene/3d/portal.cpp +msgid "Portal Margin" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Portal Edge" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Portal Arrow" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Portal Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Portal Front" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Portal Back" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp scene/2d/light_occluder_2d.cpp +#: scene/2d/tile_map.cpp +msgid "Occluder" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Sphere Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Sphere Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Occluder Polygon Front" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Occluder Polygon Back" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Occluder Hole" +msgstr "" + +#: main/main.cpp +msgid "Godot Physics" +msgstr "" + +#: main/main.cpp servers/physics_2d/physics_2d_server_sw.cpp +#: servers/visual/visual_server_scene.cpp +msgid "Use BVH" +msgstr "" + +#: main/main.cpp servers/physics_2d/physics_2d_server_sw.cpp +#: servers/visual/visual_server_scene.cpp +msgid "BVH Collision Margin" +msgstr "" + +#: main/main.cpp +msgid "Crash Handler" +msgstr "" + +#: main/main.cpp +msgid "Multithreaded Server" +msgstr "" + +#: main/main.cpp +msgid "RID Pool Prealloc" +msgstr "" + +#: main/main.cpp +msgid "Debugger stdout" +msgstr "" + +#: main/main.cpp +msgid "Max Chars Per Second" +msgstr "" + +#: main/main.cpp +msgid "Max Messages Per Frame" +msgstr "" + +#: main/main.cpp +msgid "Max Errors Per Second" +msgstr "" + +#: main/main.cpp +msgid "Max Warnings Per Second" +msgstr "" + +#: main/main.cpp +msgid "Flush stdout On Print" +msgstr "" + +#: main/main.cpp servers/visual_server.cpp +msgid "Logging" +msgstr "" + +#: main/main.cpp +msgid "File Logging" +msgstr "" + +#: main/main.cpp +msgid "Enable File Logging" +msgstr "" + +#: main/main.cpp +msgid "Log Path" +msgstr "" + +#: main/main.cpp +msgid "Max Log Files" +msgstr "" + +#: main/main.cpp +msgid "Driver" +msgstr "" + +#: main/main.cpp +msgid "Driver Name" +msgstr "" + +#: main/main.cpp +msgid "Fallback To GLES2" +msgstr "" + +#: main/main.cpp +msgid "Use Nvidia Rect Flicker Workaround" +msgstr "" + +#: main/main.cpp +msgid "DPI" +msgstr "" + +#: main/main.cpp +msgid "Allow hiDPI" +msgstr "" + +#: main/main.cpp +msgid "V-Sync" +msgstr "" + +#: main/main.cpp +msgid "Use V-Sync" +msgstr "" + +#: main/main.cpp +msgid "Per Pixel Transparency" +msgstr "" + +#: main/main.cpp +msgid "Allowed" +msgstr "" + +#: main/main.cpp +msgid "Intended Usage" +msgstr "" + +#: main/main.cpp +msgid "Framebuffer Allocation" +msgstr "" + +#: main/main.cpp platform/uwp/os_uwp.cpp +msgid "Energy Saving" +msgstr "" + +#: main/main.cpp +msgid "Threads" +msgstr "" + +#: main/main.cpp servers/physics_2d/physics_2d_server_wrap_mt.h +msgid "Thread Model" +msgstr "" + +#: main/main.cpp +msgid "Thread Safe BVH" +msgstr "" + +#: main/main.cpp +msgid "Handheld" +msgstr "" + +#: main/main.cpp platform/javascript/export/export.cpp +#: platform/uwp/export/export.cpp +msgid "Orientation" +msgstr "" + +#: main/main.cpp scene/gui/scroll_container.cpp scene/gui/text_edit.cpp +#: scene/main/scene_tree.cpp scene/register_scene_types.cpp +msgid "Common" +msgstr "" + +#: main/main.cpp +msgid "Physics FPS" +msgstr "" + +#: main/main.cpp +msgid "Force FPS" +msgstr "" + +#: main/main.cpp +msgid "Enable Pause Aware Picking" +msgstr "" + +#: main/main.cpp scene/gui/item_list.cpp scene/gui/popup_menu.cpp +#: scene/gui/scroll_container.cpp scene/gui/text_edit.cpp scene/gui/tree.cpp +#: scene/main/viewport.cpp scene/register_scene_types.cpp +msgid "GUI" +msgstr "" + +#: main/main.cpp +msgid "Drop Mouse On GUI Input Disabled" +msgstr "" + +#: main/main.cpp +msgid "stdout" +msgstr "" + +#: main/main.cpp +msgid "Print FPS" +msgstr "" + +#: main/main.cpp +msgid "Verbose stdout" +msgstr "" + +#: main/main.cpp scene/main/scene_tree.cpp scene/resources/multimesh.cpp +msgid "Physics Interpolation" +msgstr "" + +#: main/main.cpp +msgid "Enable Warnings" +msgstr "" + +#: main/main.cpp +msgid "Frame Delay Msec" +msgstr "" + +#: main/main.cpp +msgid "Low Processor Mode" +msgstr "" + +#: main/main.cpp +msgid "Delta Sync After Draw" +msgstr "" + +#: main/main.cpp +msgid "iOS" +msgstr "" + +#: main/main.cpp +msgid "Hide Home Indicator" +msgstr "" + +#: main/main.cpp +msgid "Input Devices" +msgstr "" + +#: main/main.cpp +msgid "Pointing" +msgstr "" + +#: main/main.cpp +msgid "Touch Delay" +msgstr "" + +#: main/main.cpp servers/visual_server.cpp +msgid "GLES3" +msgstr "" + +#: main/main.cpp servers/visual_server.cpp +msgid "Shaders" +msgstr "" + +#: main/main.cpp +msgid "Debug Shader Fallbacks" +msgstr "" + +#: main/main.cpp scene/3d/baked_lightmap.cpp scene/3d/camera.cpp +#: scene/3d/world_environment.cpp scene/main/scene_tree.cpp +#: scene/resources/world.cpp +msgid "Environment" +msgstr "" + +#: main/main.cpp +msgid "Default Clear Color" +msgstr "" + +#: main/main.cpp +msgid "Boot Splash" +msgstr "" + +#: main/main.cpp +msgid "Show Image" +msgstr "" + +#: main/main.cpp +msgid "Image" +msgstr "" + +#: main/main.cpp +msgid "Fullsize" +msgstr "" + +#: main/main.cpp scene/resources/dynamic_font.cpp +msgid "Use Filter" +msgstr "" + +#: main/main.cpp scene/resources/style_box.cpp +msgid "BG Color" +msgstr "" + +#: main/main.cpp +msgid "macOS Native Icon" +msgstr "" + +#: main/main.cpp +msgid "Windows Native Icon" +msgstr "" + +#: main/main.cpp +msgid "Buffering" +msgstr "" + +#: main/main.cpp +msgid "Agile Event Flushing" +msgstr "" + +#: main/main.cpp +msgid "Emulate Touch From Mouse" +msgstr "" + +#: main/main.cpp +msgid "Emulate Mouse From Touch" +msgstr "" + +#: main/main.cpp +msgid "Mouse Cursor" +msgstr "" + +#: main/main.cpp +msgid "Custom Image" +msgstr "" + +#: main/main.cpp +msgid "Custom Image Hotspot" +msgstr "" + +#: main/main.cpp +msgid "Tooltip Position Offset" +msgstr "" + +#: main/main.cpp modules/mono/mono_gd/gd_mono.cpp +msgid "Debugger Agent" +msgstr "" + +#: main/main.cpp modules/mono/mono_gd/gd_mono.cpp +msgid "Wait For Debugger" +msgstr "" + +#: main/main.cpp modules/mono/mono_gd/gd_mono.cpp +msgid "Wait Timeout" +msgstr "" + +#: main/main.cpp +msgid "Runtime" +msgstr "" + +#: main/main.cpp +msgid "Unhandled Exception Policy" +msgstr "" + +#: main/main.cpp +msgid "Main Loop Type" +msgstr "" + +#: main/main.cpp scene/gui/texture_progress.cpp +#: scene/gui/viewport_container.cpp +msgid "Stretch" +msgstr "" + +#: main/main.cpp +msgid "Aspect" +msgstr "" + +#: main/main.cpp +msgid "Shrink" +msgstr "" + +#: main/main.cpp scene/main/scene_tree.cpp +msgid "Auto Accept Quit" +msgstr "" + +#: main/main.cpp scene/main/scene_tree.cpp +msgid "Quit On Go Back" +msgstr "" + +#: main/main.cpp scene/main/viewport.cpp +msgid "Snap Controls To Pixels" +msgstr "" + +#: main/main.cpp +msgid "Dynamic Fonts" +msgstr "" + +#: main/main.cpp +msgid "Use Oversampling" +msgstr "" + +#: modules/bullet/register_types.cpp modules/bullet/space_bullet.cpp +msgid "Active Soft World" +msgstr "" + +#: modules/csg/csg_gizmos.cpp +msgid "CSG" +msgstr "" + +#: modules/csg/csg_gizmos.cpp +msgid "Change Cylinder Radius" +msgstr "" + +#: modules/csg/csg_gizmos.cpp +msgid "Change Cylinder Height" +msgstr "" + +#: modules/csg/csg_gizmos.cpp +msgid "Change Torus Inner Radius" +msgstr "" + +#: modules/csg/csg_gizmos.cpp +msgid "Change Torus Outer Radius" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Operation" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Calculate Tangents" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Use Collision" +msgstr "" + +#: modules/csg/csg_shape.cpp servers/physics_2d_server.cpp +msgid "Collision Layer" +msgstr "" + +#: modules/csg/csg_shape.cpp scene/2d/ray_cast_2d.cpp scene/3d/camera.cpp +#: scene/3d/ray_cast.cpp scene/3d/spring_arm.cpp +#: scene/resources/navigation_mesh.cpp servers/physics_server.cpp +msgid "Collision Mask" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Invert Faces" +msgstr "" + +#: modules/csg/csg_shape.cpp scene/2d/navigation_agent_2d.cpp +#: scene/2d/navigation_obstacle_2d.cpp scene/3d/navigation_agent.cpp +#: scene/3d/navigation_obstacle.cpp scene/3d/vehicle_body.cpp +#: scene/animation/root_motion_view.cpp scene/resources/capsule_shape.cpp +#: scene/resources/capsule_shape_2d.cpp scene/resources/circle_shape_2d.cpp +#: scene/resources/cylinder_shape.cpp scene/resources/environment.cpp +#: scene/resources/navigation_mesh.cpp scene/resources/primitive_meshes.cpp +#: scene/resources/sphere_shape.cpp +msgid "Radius" +msgstr "" + +#: modules/csg/csg_shape.cpp scene/resources/primitive_meshes.cpp +msgid "Radial Segments" +msgstr "" + +#: modules/csg/csg_shape.cpp scene/resources/primitive_meshes.cpp +msgid "Rings" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Smooth Faces" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Sides" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Cone" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Inner Radius" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Outer Radius" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Ring Sides" +msgstr "" + +#: modules/csg/csg_shape.cpp scene/2d/collision_polygon_2d.cpp +#: scene/2d/light_occluder_2d.cpp scene/2d/polygon_2d.cpp +#: scene/3d/collision_polygon.cpp +msgid "Polygon" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Spin Degrees" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Spin Sides" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Path Node" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Path Interval Type" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Path Interval" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Path Simplify Angle" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Path Rotation" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Path Local" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Path Continuous U" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Path U Distance" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Path Joined" +msgstr "" + +#: modules/enet/networked_multiplayer_enet.cpp +msgid "Compression Mode" +msgstr "" + +#: modules/enet/networked_multiplayer_enet.cpp +msgid "Transfer Channel" +msgstr "" + +#: modules/enet/networked_multiplayer_enet.cpp +msgid "Channel Count" +msgstr "" + +#: modules/enet/networked_multiplayer_enet.cpp +msgid "Always Ordered" +msgstr "" + +#: modules/enet/networked_multiplayer_enet.cpp +msgid "Server Relay" +msgstr "" + +#: modules/enet/networked_multiplayer_enet.cpp +msgid "DTLS Verify" +msgstr "" + +#: modules/enet/networked_multiplayer_enet.cpp +msgid "DTLS Hostname" +msgstr "" + +#: modules/enet/networked_multiplayer_enet.cpp +msgid "Use DTLS" +msgstr "" + +#: modules/fbx/editor_scene_importer_fbx.cpp +msgid "FBX" +msgstr "" + +#: modules/fbx/editor_scene_importer_fbx.cpp +msgid "Use FBX" +msgstr "" + +#: modules/gdnative/gdnative.cpp +msgid "Config File" +msgstr "" + +#: modules/gdnative/gdnative.cpp +msgid "Load Once" +msgstr "" + +#: modules/gdnative/gdnative.cpp +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Singleton" +msgstr "" + +#: modules/gdnative/gdnative.cpp +msgid "Symbol Prefix" +msgstr "" + +#: modules/gdnative/gdnative.cpp +msgid "Reloadable" +msgstr "" + +#: modules/gdnative/gdnative.cpp +#: modules/gdnative/gdnative_library_singleton_editor.cpp +#: modules/gdnative/nativescript/nativescript.cpp +msgid "Library" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Select the dynamic library for this entry" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Select dependencies of the library for this entry" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Remove current entry" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Double click to create a new entry" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Platform:" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Platform" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Dynamic Library" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Add an architecture entry" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "GDNativeLibrary" +msgstr "" + +#: modules/gdnative/gdnative_library_singleton_editor.cpp +msgid "Enabled GDNative Singleton" +msgstr "" + +#: modules/gdnative/gdnative_library_singleton_editor.cpp +msgid "Disabled GDNative Singleton" +msgstr "" + +#: modules/gdnative/gdnative_library_singleton_editor.cpp +msgid "Libraries:" +msgstr "" + +#: modules/gdnative/nativescript/nativescript.cpp +msgid "Class Name" +msgstr "" + +#: modules/gdnative/nativescript/nativescript.cpp +msgid "Script Class" +msgstr "" + +#: modules/gdnative/nativescript/nativescript.cpp +msgid "Icon Path" +msgstr "" + +#: modules/gdnative/register_types.cpp +msgid "GDNative" +msgstr "" + +#: modules/gdscript/editor/gdscript_highlighter.cpp +#: modules/gdscript/gdscript.cpp +msgid "GDScript" +msgstr "" + +#: modules/gdscript/editor/gdscript_highlighter.cpp +msgid "Function Definition Color" +msgstr "" + +#: modules/gdscript/editor/gdscript_highlighter.cpp +msgid "Node Path Color" +msgstr "" + +#: modules/gdscript/gdscript.cpp modules/visual_script/visual_script.cpp +msgid "Max Call Stack" +msgstr "" + +#: modules/gdscript/gdscript.cpp +msgid "Treat Warnings As Errors" +msgstr "" + +#: modules/gdscript/gdscript.cpp +msgid "Exclude Addons" +msgstr "" + +#: modules/gdscript/gdscript.cpp +msgid "Autocomplete Setters And Getters" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Step argument is zero!" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Not a script with an instance" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Not based on a script" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Not based on a resource file" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary format (missing @path)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary format (can't load script at @path)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary format (invalid script at @path)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary (invalid subclasses)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Object can't provide a length." +msgstr "" + +#: modules/gdscript/language_server/gdscript_language_server.cpp +msgid "Language Server" +msgstr "" + +#: modules/gdscript/language_server/gdscript_language_server.cpp +msgid "Enable Smart Resolve" +msgstr "" + +#: modules/gdscript/language_server/gdscript_language_server.cpp +msgid "Show Native Symbols In Editor" +msgstr "" + +#: modules/gdscript/language_server/gdscript_language_server.cpp +msgid "Use Thread" +msgstr "" + +#: modules/gltf/editor_scene_exporter_gltf_plugin.cpp +msgid "Export Mesh GLTF2" +msgstr "" + +#: modules/gltf/editor_scene_exporter_gltf_plugin.cpp +msgid "Export GLTF..." +msgstr "" + +#: modules/gltf/gltf_accessor.cpp +msgid "Buffer View" +msgstr "" + +#: modules/gltf/gltf_accessor.cpp modules/gltf/gltf_buffer_view.cpp +msgid "Byte Offset" +msgstr "" + +#: modules/gltf/gltf_accessor.cpp +msgid "Component Type" +msgstr "" + +#: modules/gltf/gltf_accessor.cpp +msgid "Normalized" +msgstr "" + +#: modules/gltf/gltf_accessor.cpp +msgid "Count" +msgstr "" + +#: modules/gltf/gltf_accessor.cpp scene/resources/visual_shader_nodes.cpp +msgid "Min" +msgstr "" + +#: modules/gltf/gltf_accessor.cpp scene/resources/visual_shader_nodes.cpp +msgid "Max" +msgstr "" + +#: modules/gltf/gltf_accessor.cpp +msgid "Sparse Count" +msgstr "" + +#: modules/gltf/gltf_accessor.cpp +msgid "Sparse Indices Buffer View" +msgstr "" + +#: modules/gltf/gltf_accessor.cpp +msgid "Sparse Indices Byte Offset" +msgstr "" + +#: modules/gltf/gltf_accessor.cpp +msgid "Sparse Indices Component Type" +msgstr "" + +#: modules/gltf/gltf_accessor.cpp +msgid "Sparse Values Buffer View" +msgstr "" + +#: modules/gltf/gltf_accessor.cpp +msgid "Sparse Values Byte Offset" +msgstr "" + +#: modules/gltf/gltf_buffer_view.cpp +msgid "Buffer" +msgstr "" + +#: modules/gltf/gltf_buffer_view.cpp +msgid "Byte Length" +msgstr "" + +#: modules/gltf/gltf_buffer_view.cpp +msgid "Byte Stride" +msgstr "" + +#: modules/gltf/gltf_buffer_view.cpp +msgid "Indices" +msgstr "" + +#: modules/gltf/gltf_camera.cpp +msgid "FOV Size" +msgstr "" + +#: modules/gltf/gltf_camera.cpp +msgid "Zfar" +msgstr "" + +#: modules/gltf/gltf_camera.cpp +msgid "Znear" +msgstr "" + +#: modules/gltf/gltf_light.cpp scene/2d/canvas_modulate.cpp +#: scene/2d/cpu_particles_2d.cpp scene/2d/light_2d.cpp scene/2d/polygon_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/light.cpp +#: scene/animation/root_motion_view.cpp scene/gui/color_picker.cpp +#: scene/gui/color_rect.cpp scene/gui/rich_text_effect.cpp +#: scene/resources/environment.cpp scene/resources/material.cpp +#: scene/resources/particles_material.cpp scene/resources/sky.cpp +#: scene/resources/style_box.cpp +msgid "Color" +msgstr "" + +#: modules/gltf/gltf_light.cpp scene/3d/reflection_probe.cpp +#: scene/resources/environment.cpp +msgid "Intensity" +msgstr "" + +#: modules/gltf/gltf_light.cpp scene/2d/light_2d.cpp scene/3d/light.cpp +msgid "Range" +msgstr "" + +#: modules/gltf/gltf_light.cpp +msgid "Inner Cone Angle" +msgstr "" + +#: modules/gltf/gltf_light.cpp +msgid "Outer Cone Angle" +msgstr "" + +#: modules/gltf/gltf_mesh.cpp +msgid "Blend Weights" +msgstr "" + +#: modules/gltf/gltf_mesh.cpp +msgid "Instance Materials" +msgstr "" + +#: modules/gltf/gltf_node.cpp scene/3d/skeleton.cpp +msgid "Parent" +msgstr "" + +#: modules/gltf/gltf_node.cpp +msgid "Xform" +msgstr "" + +#: modules/gltf/gltf_node.cpp scene/3d/mesh_instance.cpp +msgid "Skin" +msgstr "" + +#: modules/gltf/gltf_node.cpp scene/3d/spatial.cpp +msgid "Translation" +msgstr "" + +#: modules/gltf/gltf_node.cpp +msgid "Children" +msgstr "" + +#: modules/gltf/gltf_skeleton.cpp modules/gltf/gltf_skin.cpp +msgid "Joints" +msgstr "" + +#: modules/gltf/gltf_skeleton.cpp modules/gltf/gltf_skin.cpp +msgid "Roots" +msgstr "" + +#: modules/gltf/gltf_skeleton.cpp modules/gltf/gltf_state.cpp +msgid "Unique Names" +msgstr "" + +#: modules/gltf/gltf_skeleton.cpp +msgid "Godot Bone Node" +msgstr "" + +#: modules/gltf/gltf_skin.cpp +msgid "Skin Root" +msgstr "" + +#: modules/gltf/gltf_skin.cpp +msgid "Joints Original" +msgstr "" + +#: modules/gltf/gltf_skin.cpp +msgid "Inverse Binds" +msgstr "" + +#: modules/gltf/gltf_skin.cpp +msgid "Non Joints" +msgstr "" + +#: modules/gltf/gltf_skin.cpp +msgid "Joint I To Bone I" +msgstr "" + +#: modules/gltf/gltf_skin.cpp +msgid "Joint I To Name" +msgstr "" + +#: modules/gltf/gltf_skin.cpp +msgid "Godot Skin" +msgstr "" + +#: modules/gltf/gltf_spec_gloss.cpp +msgid "Diffuse Img" +msgstr "" + +#: modules/gltf/gltf_spec_gloss.cpp +msgid "Diffuse Factor" +msgstr "" + +#: modules/gltf/gltf_spec_gloss.cpp +msgid "Gloss Factor" +msgstr "" + +#: modules/gltf/gltf_spec_gloss.cpp +msgid "Specular Factor" +msgstr "" + +#: modules/gltf/gltf_spec_gloss.cpp +msgid "Spec Gloss Img" +msgstr "" + +#: modules/gltf/gltf_state.cpp +msgid "Json" +msgstr "" + +#: modules/gltf/gltf_state.cpp +msgid "Major Version" +msgstr "" + +#: modules/gltf/gltf_state.cpp +msgid "Minor Version" +msgstr "" + +#: modules/gltf/gltf_state.cpp +msgid "GLB Data" +msgstr "" + +#: modules/gltf/gltf_state.cpp +msgid "Use Named Skin Binds" +msgstr "" + +#: modules/gltf/gltf_state.cpp +msgid "Buffer Views" +msgstr "" + +#: modules/gltf/gltf_state.cpp +msgid "Accessors" +msgstr "" + +#: modules/gltf/gltf_state.cpp +msgid "Scene Name" +msgstr "" + +#: modules/gltf/gltf_state.cpp +msgid "Root Nodes" +msgstr "" + +#: modules/gltf/gltf_state.cpp scene/2d/particles_2d.cpp +#: scene/gui/texture_button.cpp scene/gui/texture_progress.cpp +msgid "Textures" +msgstr "" + +#: modules/gltf/gltf_state.cpp platform/uwp/export/export.cpp +msgid "Images" +msgstr "" + +#: modules/gltf/gltf_state.cpp +msgid "Cameras" +msgstr "" + +#: modules/gltf/gltf_state.cpp servers/visual_server.cpp +msgid "Lights" +msgstr "" + +#: modules/gltf/gltf_state.cpp +msgid "Unique Animation Names" +msgstr "" + +#: modules/gltf/gltf_state.cpp +msgid "Skeletons" +msgstr "" + +#: modules/gltf/gltf_state.cpp +msgid "Skeleton To Node" +msgstr "" + +#: modules/gltf/gltf_state.cpp +msgid "Animations" +msgstr "" + +#: modules/gltf/gltf_texture.cpp +msgid "Src Image" +msgstr "" + +#: modules/gridmap/grid_map.cpp +msgid "Mesh Library" +msgstr "" + +#: modules/gridmap/grid_map.cpp +msgid "Physics Material" +msgstr "" + +#: modules/gridmap/grid_map.cpp scene/3d/visual_instance.cpp +msgid "Use In Baked Light" +msgstr "" + +#: modules/gridmap/grid_map.cpp scene/2d/tile_map.cpp +msgid "Cell" +msgstr "" + +#: modules/gridmap/grid_map.cpp +msgid "Octant Size" +msgstr "" + +#: modules/gridmap/grid_map.cpp +msgid "Center X" +msgstr "" + +#: modules/gridmap/grid_map.cpp +msgid "Center Y" +msgstr "" + +#: modules/gridmap/grid_map.cpp +msgid "Center Z" +msgstr "" + +#: modules/gridmap/grid_map.cpp scene/2d/collision_object_2d.cpp +#: scene/2d/tile_map.cpp scene/3d/collision_object.cpp scene/3d/soft_body.cpp +#: scene/resources/material.cpp +msgid "Mask" +msgstr "" + +#: modules/gridmap/grid_map.cpp scene/2d/tile_map.cpp +msgid "Bake Navigation" +msgstr "" + +#: modules/gridmap/grid_map.cpp scene/2d/navigation_2d.cpp +#: scene/2d/navigation_agent_2d.cpp scene/2d/navigation_polygon.cpp +#: scene/2d/tile_map.cpp scene/3d/navigation.cpp scene/3d/navigation_agent.cpp +#: scene/3d/navigation_mesh_instance.cpp +msgid "Navigation Layers" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Next Plane" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Previous Plane" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Plane:" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Next Floor" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Previous Floor" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Floor:" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Delete Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Fill Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Paste Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Paint" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Snap View" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clip Disabled" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clip Above" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clip Below" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Edit X Axis" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Edit Y Axis" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Edit Z Axis" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Rotate X" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Rotate Y" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Rotate Z" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Back Rotate X" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Back Rotate Y" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Back Rotate Z" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Clear Rotation" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Paste Selects" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clear Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Fill Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Settings" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Pick Distance:" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Filter meshes" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Give a MeshLibrary resource to this GridMap to use its meshes." +msgstr "" + +#: modules/lightmapper_cpu/lightmapper_cpu.cpp +msgid "Begin Bake" +msgstr "" + +#: modules/lightmapper_cpu/lightmapper_cpu.cpp +msgid "Preparing data structures" +msgstr "" + +#: modules/lightmapper_cpu/lightmapper_cpu.cpp +msgid "Generate buffers" +msgstr "" + +#: modules/lightmapper_cpu/lightmapper_cpu.cpp +msgid "Direct lighting" +msgstr "" + +#: modules/lightmapper_cpu/lightmapper_cpu.cpp +msgid "Indirect lighting" +msgstr "" + +#: modules/lightmapper_cpu/lightmapper_cpu.cpp +msgid "Post processing" +msgstr "" + +#: modules/lightmapper_cpu/lightmapper_cpu.cpp +msgid "Plotting lightmaps" +msgstr "" + +#: modules/lightmapper_cpu/register_types.cpp +msgid "CPU Lightmapper" +msgstr "" + +#: modules/lightmapper_cpu/register_types.cpp +msgid "Low Quality Ray Count" +msgstr "" + +#: modules/lightmapper_cpu/register_types.cpp +msgid "Medium Quality Ray Count" +msgstr "" + +#: modules/lightmapper_cpu/register_types.cpp +msgid "High Quality Ray Count" +msgstr "" + +#: modules/lightmapper_cpu/register_types.cpp +msgid "Ultra Quality Ray Count" +msgstr "" + +#: modules/minimp3/audio_stream_mp3.cpp +#: modules/minimp3/resource_importer_mp3.cpp +#: modules/stb_vorbis/audio_stream_ogg_vorbis.cpp +#: modules/stb_vorbis/resource_importer_ogg_vorbis.cpp +msgid "Loop Offset" +msgstr "" + +#: modules/mobile_vr/mobile_vr_interface.cpp +msgid "Eye Height" +msgstr "" + +#: modules/mobile_vr/mobile_vr_interface.cpp +msgid "IOD" +msgstr "" + +#: modules/mobile_vr/mobile_vr_interface.cpp +msgid "Display Width" +msgstr "" + +#: modules/mobile_vr/mobile_vr_interface.cpp +msgid "Display To Lens" +msgstr "" + +#: modules/mobile_vr/mobile_vr_interface.cpp +msgid "Oversample" +msgstr "" + +#: modules/mobile_vr/mobile_vr_interface.cpp +msgid "K1" +msgstr "" + +#: modules/mobile_vr/mobile_vr_interface.cpp +msgid "K2" +msgstr "" + +#: modules/mono/csharp_script.cpp +msgid "Class name can't be a reserved keyword" +msgstr "" + +#: modules/mono/csharp_script.cpp +msgid "Build Solution" +msgstr "" + +#: modules/mono/editor/csharp_project.cpp +msgid "Auto Update Project" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "C# Project Directory" +msgstr "" + +#: modules/mono/mono_gd/gd_mono_utils.cpp +msgid "End of inner exception stack trace" +msgstr "" + +#: modules/navigation/navigation_mesh_editor_plugin.cpp +#: scene/3d/navigation_mesh_instance.cpp +msgid "A NavigationMesh resource must be set or created for this node to work." +msgstr "" + +#: modules/navigation/navigation_mesh_editor_plugin.cpp +msgid "Bake NavMesh" +msgstr "" + +#: modules/navigation/navigation_mesh_editor_plugin.cpp +msgid "Clear the navigation mesh." +msgstr "" + +#: modules/navigation/navigation_mesh_generator.cpp +msgid "Setting up Configuration..." +msgstr "" + +#: modules/navigation/navigation_mesh_generator.cpp +msgid "Calculating grid size..." +msgstr "" + +#: modules/navigation/navigation_mesh_generator.cpp +msgid "Creating heightfield..." +msgstr "" + +#: modules/navigation/navigation_mesh_generator.cpp +msgid "Marking walkable triangles..." +msgstr "" + +#: modules/navigation/navigation_mesh_generator.cpp +msgid "Constructing compact heightfield..." +msgstr "" + +#: modules/navigation/navigation_mesh_generator.cpp +msgid "Eroding walkable area..." +msgstr "" + +#: modules/navigation/navigation_mesh_generator.cpp +msgid "Partitioning..." +msgstr "" + +#: modules/navigation/navigation_mesh_generator.cpp +msgid "Creating contours..." +msgstr "" + +#: modules/navigation/navigation_mesh_generator.cpp +msgid "Creating polymesh..." +msgstr "" + +#: modules/navigation/navigation_mesh_generator.cpp +msgid "Converting to native navigation mesh..." +msgstr "" + +#: modules/navigation/navigation_mesh_generator.cpp +msgid "Navigation Mesh Generator Setup:" +msgstr "" + +#: modules/navigation/navigation_mesh_generator.cpp +msgid "Parsing Geometry..." +msgstr "" + +#: modules/navigation/navigation_mesh_generator.cpp +msgid "Done!" +msgstr "" + +#: modules/opensimplex/noise_texture.cpp +msgid "Seamless" +msgstr "" + +#: modules/opensimplex/noise_texture.cpp +msgid "As Normal Map" +msgstr "" + +#: modules/opensimplex/noise_texture.cpp +msgid "Bump Strength" +msgstr "" + +#: modules/opensimplex/noise_texture.cpp +msgid "Noise" +msgstr "" + +#: modules/opensimplex/noise_texture.cpp +msgid "Noise Offset" +msgstr "" + +#: modules/opensimplex/open_simplex_noise.cpp +msgid "Octaves" +msgstr "" + +#: modules/opensimplex/open_simplex_noise.cpp +msgid "Period" +msgstr "" + +#: modules/opensimplex/open_simplex_noise.cpp +msgid "Persistence" +msgstr "" + +#: modules/opensimplex/open_simplex_noise.cpp +msgid "Lacunarity" +msgstr "" + +#: modules/regex/regex.cpp +msgid "Subject" +msgstr "" + +#: modules/regex/regex.cpp +msgid "Names" +msgstr "" + +#: modules/regex/regex.cpp +msgid "Strings" +msgstr "" + +#: modules/upnp/upnp.cpp +msgid "Discover Multicast If" +msgstr "" + +#: modules/upnp/upnp.cpp +msgid "Discover Local Port" +msgstr "" + +#: modules/upnp/upnp.cpp +msgid "Discover IPv6" +msgstr "" + +#: modules/upnp/upnp_device.cpp +msgid "Description URL" +msgstr "" + +#: modules/upnp/upnp_device.cpp +msgid "Service Type" +msgstr "" + +#: modules/upnp/upnp_device.cpp +msgid "IGD Control URL" +msgstr "" + +#: modules/upnp/upnp_device.cpp +msgid "IGD Service Type" +msgstr "" + +#: modules/upnp/upnp_device.cpp +msgid "IGD Our Addr" +msgstr "" + +#: modules/upnp/upnp_device.cpp +msgid "IGD Status" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"A node yielded without working memory, please read the docs on how to yield " +"properly!" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"Node yielded, but did not return a function state in the first working " +"memory." +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"Return value must be assigned to first element of node working memory! Fix " +"your node please." +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Node returned an invalid sequence output:" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Found sequence bit but not the node in the stack, report bug!" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Stack overflow with stack depth:" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Visual Script" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Signal Arguments" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Argument Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Argument name" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Set Variable Default Value" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Set Variable Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Input Port" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Output Port" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Port Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Port Name" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Override an existing built-in function." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Create a new function." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Variables:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Create a new variable." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Signals:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Create a new signal." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Name is not a valid identifier:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Name already in use by another func/var/signal:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Rename Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Rename Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Rename Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Delete input port" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Input Port" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Output Port" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Expression" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Can't copy the function node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Paste VisualScript Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove VisualScript Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Duplicate VisualScript Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold %s to drop a simple reference to the node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a simple reference to the node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold %s to drop a Variable Setter." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a Variable Setter." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Preload Node" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Node(s)" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Node(s) From Tree" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "" +"Can't drop properties because script '%s' is not used in this scene.\n" +"Drop holding 'Shift' to just copy the signature." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Getter Property" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Setter Property" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Base Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Move Node(s)" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove VisualScript Node" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Connect Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Disconnect Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Connect Node Data" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Connect Node Sequence" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Script already has function '%s'" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Input Value" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Resize Comment" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Can't create function with a function node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Can't create function of nodes from nodes of multiple functions." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Select at least one node with sequence port." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Try to only have one sequence input in selection." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Create Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Editing Variable:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Editing Signal:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Make Tool:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Members:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Base Type:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Nodes..." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Function..." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "function_name" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Select or create a function to edit its graph." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Delete Selected" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Find Node Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Copy Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Cut Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Make Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Refresh Graph" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit Member" +msgstr "" + +#: modules/visual_script/visual_script_expression.cpp +#: scene/resources/visual_shader.cpp +msgid "Expression" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Return" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Return Enabled" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Return Type" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +#: scene/resources/visual_shader_nodes.cpp +msgid "Condition" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "if (cond) is:" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "While" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "while (cond):" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Iterator" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "for (elem) in (input):" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Input type not iterable:" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Iterator became invalid" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Iterator became invalid:" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Sequence" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "in order:" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Steps" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Switch" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "'input' is:" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Type Cast" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Is %s?" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Base Script" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "On %s" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "On Self" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +#: modules/visual_script/visual_script_yield_nodes.cpp +msgid "Call Mode" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +#: modules/visual_script/visual_script_nodes.cpp +msgid "Basic Type" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +#: modules/visual_script/visual_script_nodes.cpp +#: modules/visual_script/visual_script_yield_nodes.cpp +msgid "Node Path" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Use Default Args" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Validate" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "RPC Call Mode" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Subtract %s" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Multiply %s" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Divide %s" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Mod %s" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "ShiftLeft %s" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "ShiftRight %s" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "BitAnd %s" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "BitOr %s" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "BitXor %s" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Set Mode" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Assign Op" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +#: modules/visual_script/visual_script_nodes.cpp +#: modules/visual_script/visual_script_property_selector.cpp +msgid "Get %s" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Invalid index property name." +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Base object is not a Node!" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Path does not lead to Node!" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Invalid index property name '%s' in node %s." +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Emit %s" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Compose Array" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp scene/resources/material.cpp +#: scene/resources/visual_shader_nodes.cpp +msgid "Operator" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Invalid argument of type:" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Invalid arguments:" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "a if cond, else b" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Var Name" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "VariableGet not found in script:" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "VariableSet not found in script:" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Preload" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Get Index" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Set Index" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Global Constant" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Class Constant" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Basic Constant" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Math Constant" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Get Engine Singleton" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Get Scene Node" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Get Scene Tree" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Get Self" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "CustomNode" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Custom node has no _step() method, can't process graph." +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "" +"Invalid return value from _step(), must be integer (seq out), or string " +"(error)." +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "SubCall" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp scene/gui/graph_node.cpp +msgid "Title" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Construct %s" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Get Local Var" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Set Local Var" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Action %s" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Deconstruct %s" +msgstr "" + +#: modules/visual_script/visual_script_property_selector.cpp +msgid "Search VisualScript" +msgstr "" + +#: modules/visual_script/visual_script_yield_nodes.cpp +msgid "Yield" +msgstr "" + +#: modules/visual_script/visual_script_yield_nodes.cpp +msgid "Wait" +msgstr "" + +#: modules/visual_script/visual_script_yield_nodes.cpp +msgid "Next Frame" +msgstr "" + +#: modules/visual_script/visual_script_yield_nodes.cpp +msgid "Next Physics Frame" +msgstr "" + +#: modules/visual_script/visual_script_yield_nodes.cpp +msgid "%s sec(s)" +msgstr "" + +#: modules/visual_script/visual_script_yield_nodes.cpp scene/main/timer.cpp +msgid "Wait Time" +msgstr "" + +#: modules/visual_script/visual_script_yield_nodes.cpp +msgid "WaitSignal" +msgstr "" + +#: modules/visual_script/visual_script_yield_nodes.cpp +msgid "WaitNodeSignal" +msgstr "" + +#: modules/visual_script/visual_script_yield_nodes.cpp +msgid "WaitInstanceSignal" +msgstr "" + +#: modules/webrtc/webrtc_data_channel.cpp +msgid "Write Mode" +msgstr "" + +#: modules/webrtc/webrtc_data_channel.h +msgid "WebRTC" +msgstr "" + +#: modules/webrtc/webrtc_data_channel.h +msgid "Max Channel In Buffer (KB)" +msgstr "" + +#: modules/websocket/websocket_client.cpp +msgid "Verify SSL" +msgstr "" + +#: modules/websocket/websocket_client.cpp +msgid "Trusted SSL Certificate" +msgstr "" + +#: modules/websocket/websocket_macros.h +msgid "WebSocket Client" +msgstr "" + +#: modules/websocket/websocket_macros.h +msgid "Max In Buffer (KB)" +msgstr "" + +#: modules/websocket/websocket_macros.h +msgid "Max In Packets" +msgstr "" + +#: modules/websocket/websocket_macros.h +msgid "Max Out Buffer (KB)" +msgstr "" + +#: modules/websocket/websocket_macros.h +msgid "Max Out Packets" +msgstr "" + +#: modules/websocket/websocket_macros.h +msgid "WebSocket Server" +msgstr "" + +#: modules/websocket/websocket_server.cpp +msgid "Bind IP" +msgstr "" + +#: modules/websocket/websocket_server.cpp +msgid "Private Key" +msgstr "" + +#: modules/websocket/websocket_server.cpp platform/javascript/export/export.cpp +msgid "SSL Certificate" +msgstr "" + +#: modules/websocket/websocket_server.cpp +msgid "CA Chain" +msgstr "" + +#: modules/websocket/websocket_server.cpp +msgid "Handshake Timeout" +msgstr "" + +#: modules/webxr/webxr_interface.cpp +msgid "Session Mode" +msgstr "" + +#: modules/webxr/webxr_interface.cpp +msgid "Required Features" +msgstr "" + +#: modules/webxr/webxr_interface.cpp +msgid "Optional Features" +msgstr "" + +#: modules/webxr/webxr_interface.cpp +msgid "Requested Reference Space Types" +msgstr "" + +#: modules/webxr/webxr_interface.cpp +msgid "Reference Space Type" +msgstr "" + +#: modules/webxr/webxr_interface.cpp +msgid "Visibility State" +msgstr "" + +#: modules/webxr/webxr_interface.cpp +msgid "Bounds Geometry" +msgstr "" + +#: modules/webxr/webxr_interface.cpp +msgid "XR Standard Mapping" +msgstr "" + +#: platform/android/export/export.cpp +msgid "Android SDK Path" +msgstr "" + +#: platform/android/export/export.cpp +msgid "Debug Keystore" +msgstr "" + +#: platform/android/export/export.cpp +msgid "Debug Keystore User" +msgstr "" + +#: platform/android/export/export.cpp +msgid "Debug Keystore Pass" +msgstr "" + +#: platform/android/export/export.cpp +msgid "Force System User" +msgstr "" + +#: platform/android/export/export.cpp +msgid "Shutdown ADB On Exit" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Launcher Icons" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Main 192 X 192" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Adaptive Foreground 432 X 432" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Adaptive Background 432 X 432" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Package name is missing." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Package segments must be of non-zero length." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "The character '%s' is not allowed in Android application package names." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "A digit cannot be the first character in a package segment." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "The character '%s' cannot be the first character in a package segment." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "The package must have at least one '.' separator." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Custom Build" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Use Custom Build" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Export Format" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Min SDK" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Target SDK" +msgstr "" + +#: platform/android/export/export_plugin.cpp platform/iphone/export/export.cpp +msgid "Architectures" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Keystore" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Debug User" +msgstr "" + +#: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp +msgid "Debug Password" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Release User" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Release Password" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "One Click Deploy" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Clear Previous Install" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Code" +msgstr "" + +#: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp +msgid "Package" +msgstr "" + +#: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp +msgid "Unique Name" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Signed" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Classify As Game" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Retain Data On Uninstall" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Exclude From Recents" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Graphics" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "OpenGL Debug" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "XR Features" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "XR Mode" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Hand Tracking" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Hand Tracking Frequency" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Passthrough" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Immersive Mode" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Support Small" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Support Normal" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Support Large" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Support Xlarge" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "User Data Backup" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Allow" +msgstr "" + +#: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp +msgid "Command Line" +msgstr "" + +#: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp +msgid "Extra Args" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "APK Expansion" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Salt" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Public Key" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Permissions" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Custom Permissions" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Select device from the list" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Running on %s" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Exporting APK..." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Uninstalling..." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Installing to device, please wait..." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Could not install to device: %s" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Running on device..." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Could not execute on device." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"Android build template not installed in the project. Install it from the " +"Project menu." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"Either Debug Keystore, Debug User AND Debug Password settings must be " +"configured OR none of them." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Debug keystore not configured in the Editor Settings nor in the preset." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"Either Release Keystore, Release User AND Release Password settings must be " +"configured OR none of them." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Release keystore incorrectly configured in the export preset." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "A valid Android SDK path is required in Editor Settings." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Invalid Android SDK path in Editor Settings." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Missing 'platform-tools' directory!" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Unable to find Android SDK platform-tools' adb command." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Please check in the Android SDK directory specified in Editor Settings." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Missing 'build-tools' directory!" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Unable to find Android SDK build-tools' apksigner command." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Invalid public key for APK expansion." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Invalid package name:" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" " +"project setting (changed in Godot 3.2.2).\n" +"Replace it with the first-party \"GodotGooglePlayBilling\" plugin.\n" +"Note that the singleton was also renamed from \"GodotPayments\" to " +"\"GodotGooglePlayBilling\"." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "\"Use Custom Build\" must be enabled to use the plugins." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"\"Hand Tracking\" is only valid when \"XR Mode\" is \"Oculus Mobile VrApi\" " +"or \"OpenXR\"." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "\"Passthrough\" is only valid when \"XR Mode\" is \"OpenXR\"." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"\"Min SDK\" can only be overridden when \"Use Custom Build\" is enabled." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"\"Min SDK\" cannot be lower than %d, which is the version needed by the " +"Godot library." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"\"Target SDK\" can only be overridden when \"Use Custom Build\" is enabled." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"\"Target SDK\" should be a valid integer, but got \"%s\" which is invalid." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"\"Target SDK\" %d is higher than the default version %d. This may work, but " +"wasn't tested and may be unstable." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "\"Target SDK\" version must be greater or equal to \"Min SDK\" version." +msgstr "" + +#: platform/android/export/export_plugin.cpp platform/osx/export/export.cpp +#: platform/windows/export/export.cpp +msgid "Code Signing" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"'apksigner' could not be found. Please check that the command is available " +"in the Android SDK build-tools directory. The resulting %s is unsigned." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Signing debug %s..." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Signing release %s..." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Could not find keystore, unable to export." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Could not start apksigner executable." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "'apksigner' returned with error #%d" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Verifying %s..." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "'apksigner' verification of %s failed." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Exporting for Android" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Invalid filename! Android App Bundle requires the *.aab extension." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "APK Expansion not compatible with Android App Bundle." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Invalid filename! Android APK requires the *.apk extension." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Unsupported export format!" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"Trying to build from a custom built template, but no version info for it " +"exists. Please reinstall from the 'Project' menu." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"Android build version mismatch: Template installed: %s, Godot version: %s. " +"Please reinstall Android build template from 'Project' menu." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"Unable to overwrite res://android/build/res/*.xml files with project name." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Could not export project files to gradle project." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Could not write expansion package file!" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Building Android Project (gradle)" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"Building of Android project failed, check output for the error. " +"Alternatively visit docs.godotengine.org for Android build documentation." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Moving output" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"Unable to copy and rename export file, check gradle project directory for " +"outputs." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Package not found: \"%s\"." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Creating APK..." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Could not find template APK to export: \"%s\"." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"Missing libraries in the export template for the selected architectures: %s. " +"Please build a template with all required libraries, or uncheck the missing " +"architectures in the export preset." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Adding files..." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Could not export project files." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Aligning APK..." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Could not unzip temporary unaligned APK." +msgstr "" + +#: platform/iphone/export/export.cpp platform/osx/export/export.cpp +msgid "Identifier is missing." +msgstr "" + +#: platform/iphone/export/export.cpp platform/osx/export/export.cpp +msgid "The character '%s' is not allowed in Identifier." +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Landscape Launch Screens" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPhone 2436 X 1125" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPhone 2208 X 1242" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPad 1024 X 768" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPad 2048 X 1536" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Portrait Launch Screens" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPhone 640 X 960" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPhone 640 X 1136" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPhone 750 X 1334" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPhone 1125 X 2436" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPad 768 X 1024" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPad 1536 X 2048" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPhone 1242 X 2208" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "App Store Team ID" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Provisioning Profile UUID Debug" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Code Sign Identity Debug" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Export Method Debug" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Provisioning Profile UUID Release" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Code Sign Identity Release" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Export Method Release" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Targeted Device Family" +msgstr "" + +#: platform/iphone/export/export.cpp platform/osx/export/export.cpp +msgid "Info" +msgstr "" + +#: platform/iphone/export/export.cpp platform/osx/export/export.cpp +msgid "Identifier" +msgstr "" + +#: platform/iphone/export/export.cpp platform/osx/export/export.cpp +msgid "Signature" +msgstr "" + +#: platform/iphone/export/export.cpp platform/osx/export/export.cpp +msgid "Short Version" +msgstr "" + +#: platform/iphone/export/export.cpp platform/osx/export/export.cpp +#: platform/windows/export/export.cpp +msgid "Copyright" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Capabilities" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Access Wi-Fi" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Push Notifications" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "User Data" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Accessible From Files App" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Accessible From iTunes Sharing" +msgstr "" + +#: platform/iphone/export/export.cpp platform/osx/export/export.cpp +msgid "Privacy" +msgstr "" + +#: platform/iphone/export/export.cpp platform/osx/export/export.cpp +msgid "Camera Usage Description" +msgstr "" + +#: platform/iphone/export/export.cpp platform/osx/export/export.cpp +msgid "Microphone Usage Description" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Photolibrary Usage Description" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPhone 120 X 120" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPhone 180 X 180" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPad 76 X 76" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPad 152 X 152" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPad 167 X 167" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "App Store 1024 X 1024" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Spotlight 40 X 40" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Spotlight 80 X 80" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Storyboard" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Use Launch Screen Storyboard" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Image Scale Mode" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Custom Image @2x" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Custom Image @3x" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Use Custom BG Color" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Custom BG Color" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Export Icons" +msgstr "" + +#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp +#: platform/osx/export/export.cpp +msgid "Prepare Templates" +msgstr "" + +#: platform/iphone/export/export.cpp platform/osx/export/export.cpp +msgid "Export template not found." +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "App Store Team ID not specified - cannot configure the project." +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Invalid Identifier:" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Stop HTTP Server" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Run in Browser" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Run exported HTML in the system's default browser." +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not open template for export: \"%s\"." +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Invalid export template: \"%s\"." +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not write file: \"%s\"." +msgstr "" + +#: platform/javascript/export/export.cpp platform/osx/export/export.cpp +msgid "Icon Creation" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not read file: \"%s\"." +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "PWA" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Variant" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Export Type" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "VRAM Texture Compression" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "For Desktop" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "For Mobile" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "HTML" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Export Icon" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Custom HTML Shell" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Head Include" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Canvas Resize Policy" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Focus Canvas On Start" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Experimental Virtual Keyboard" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Progressive Web App" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Offline Page" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Icon 144 X 144" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Icon 180 X 180" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Icon 512 X 512" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not read HTML shell: \"%s\"." +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not create HTTP server directory: %s." +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Error starting HTTP server: %d." +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Web" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "HTTP Host" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "HTTP Port" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Use SSL" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "SSL Key" +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no exe name." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create \"%s\" subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid binary format." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to process nested resources." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +msgid "Invalid entitlements file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid executable file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "App Category" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "High Res" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Location Usage Description" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Address Book Usage Description" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Calendar Usage Description" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Photos Library Usage Description" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Desktop Folder Usage Description" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Documents Folder Usage Description" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Downloads Folder Usage Description" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Network Volumes Usage Description" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Removable Volumes Usage Description" +msgstr "" + +#: platform/osx/export/export.cpp platform/windows/export/export.cpp +msgid "Codesign" +msgstr "" + +#: platform/osx/export/export.cpp platform/uwp/export/export.cpp +#: platform/windows/export/export.cpp +msgid "Identity" +msgstr "" + +#: platform/osx/export/export.cpp platform/windows/export/export.cpp +msgid "Timestamp" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Hardened Runtime" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Replace Existing Signature" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Entitlements" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Custom File" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Allow JIT Code Execution" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Allow Unsigned Executable Memory" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Allow Dyld Environment Variables" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Disable Library Validation" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Audio Input" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Address Book" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Calendars" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Photos Library" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Apple Events" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Debugging" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "App Sandbox" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Network Server" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Network Client" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Device USB" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Device Bluetooth" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Files Downloads" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Files Pictures" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Files Music" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Files Movies" +msgstr "" + +#: platform/osx/export/export.cpp platform/windows/export/export.cpp +msgid "Custom Options" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Apple ID Name" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Apple ID Password" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Apple Team ID" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not open icon file \"%s\"." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not start xcrun executable." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization failed." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization request UUID: \"%s\"" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"The notarization process generally takes less than an hour. When the process " +"is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Timestamping is not compatible with ad-hoc signature, and was disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and was disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Built-in CodeSign failed with error \"%s\"." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Built-in CodeSign require regex module." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Could not start codesign executable, make sure Xcode command line tools are " +"installed." +msgstr "" + +#: platform/osx/export/export.cpp platform/windows/export/export.cpp +msgid "No identity found." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Cannot sign file %s." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Relative symlinks are not supported, exported \"%s\" might be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "DMG Creation" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not start hdiutil executable." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "`hdiutil create` failed - file exists." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "`hdiutil create` failed." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Creating app bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export: \"%s\"." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Invalid export format." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary \"%s\" not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "ZIP Creation" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not open file to read from path \"%s\"." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Invalid bundle identifier:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Apple ID name not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Apple ID password not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "macOS" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Force Builtin Codesign" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Architecture" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Display Name" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Short Name" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Publisher" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Publisher Display Name" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Product GUID" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Publisher GUID" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Signing" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Certificate" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Algorithm" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Major" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Minor" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Build" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Revision" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Landscape" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Portrait" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Landscape Flipped" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Portrait Flipped" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Store Logo" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Square 44 X 44 Logo" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Square 71 X 71 Logo" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Square 150 X 150 Logo" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Square 310 X 310 Logo" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Wide 310 X 150 Logo" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Splash Screen" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Tiles" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Show Name On Square 150 X 150" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Show Name On Wide 310 X 150" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Show Name On Square 310 X 310" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid package short name." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid package unique name." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid product GUID." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid publisher GUID." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid background color." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid Store Logo image dimensions (should be 50x50)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid square 44x44 logo image dimensions (should be 44x44)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid square 71x71 logo image dimensions (should be 71x71)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid square 150x150 logo image dimensions (should be 150x150)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid square 310x310 logo image dimensions (should be 310x310)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid splash screen image dimensions (should be 620x300)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "UWP" +msgstr "" + +#: platform/uwp/export/export.cpp platform/windows/export/export.cpp +msgid "Signtool" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Debug Certificate" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Debug Algorithm" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Failed to rename temporary file \"%s\"." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Identity Type" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Timestamp Server URL" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Digest Algorithm" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Modify Resources" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "File Version" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Product Version" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Company Name" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Product Name" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "File Description" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Trademarks" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Resources Modification" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Could not find rcedit executable at \"%s\"." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Could not find wine executable at \"%s\"." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "" +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "rcedit failed to modify executable: %s." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Could not find signtool executable at \"%s\"." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Could not find osslsigncode executable at \"%s\"." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid identity type." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid timestamp server." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "" +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Signtool failed to sign executable: %s." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Failed to remove temporary file \"%s\"." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid icon path:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid file version:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid product version:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Windows executables cannot be >= 4 GiB." +msgstr "" + +#: platform/windows/export/export.cpp platform/x11/export/export.cpp +msgid "Failed to open executable file \"%s\"." +msgstr "" + +#: platform/windows/export/export.cpp platform/x11/export/export.cpp +msgid "Executable file header corrupted." +msgstr "" + +#: platform/windows/export/export.cpp platform/x11/export/export.cpp +msgid "Executable \"pck\" section not found." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Windows" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Rcedit" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Osslsigncode" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Wine" +msgstr "" + +#: platform/x11/export/export.cpp +msgid "32-bit executables cannot have embedded data >= 4 GiB." +msgstr "" + +#: scene/2d/animated_sprite.cpp scene/3d/sprite_3d.cpp +#: scene/resources/texture.cpp +msgid "Frames" +msgstr "" + +#: scene/2d/animated_sprite.cpp +msgid "" +"A SpriteFrames resource must be created or set in the \"Frames\" property in " +"order for AnimatedSprite to display frames." +msgstr "" + +#: scene/2d/animated_sprite.cpp scene/2d/cpu_particles_2d.cpp +#: scene/2d/particles_2d.cpp scene/3d/cpu_particles.cpp scene/3d/particles.cpp +msgid "Speed Scale" +msgstr "" + +#: scene/2d/animated_sprite.cpp scene/2d/audio_stream_player_2d.cpp +#: scene/3d/audio_stream_player_3d.cpp scene/3d/sprite_3d.cpp +#: scene/audio/audio_stream_player.cpp +msgid "Playing" +msgstr "" + +#: scene/2d/animated_sprite.cpp scene/2d/sprite.cpp scene/3d/sprite_3d.cpp +msgid "Centered" +msgstr "" + +#: scene/2d/animated_sprite.cpp scene/2d/sprite.cpp scene/3d/sprite_3d.cpp +#: scene/gui/texture_button.cpp scene/gui/texture_rect.cpp +msgid "Flip H" +msgstr "" + +#: scene/2d/animated_sprite.cpp scene/2d/sprite.cpp scene/3d/sprite_3d.cpp +#: scene/gui/texture_button.cpp scene/gui/texture_rect.cpp +msgid "Flip V" +msgstr "" + +#: scene/2d/area_2d.cpp scene/3d/area.cpp +msgid "Monitoring" +msgstr "" + +#: scene/2d/area_2d.cpp scene/3d/area.cpp +msgid "Monitorable" +msgstr "" + +#: scene/2d/area_2d.cpp scene/3d/area.cpp +msgid "Physics Overrides" +msgstr "" + +#: scene/2d/area_2d.cpp scene/3d/area.cpp +msgid "Space Override" +msgstr "" + +#: scene/2d/area_2d.cpp scene/3d/area.cpp +msgid "Gravity Point" +msgstr "" + +#: scene/2d/area_2d.cpp scene/3d/area.cpp +msgid "Gravity Distance Scale" +msgstr "" + +#: scene/2d/area_2d.cpp scene/3d/area.cpp +msgid "Gravity Vec" +msgstr "" + +#: scene/2d/area_2d.cpp scene/2d/cpu_particles_2d.cpp scene/3d/area.cpp +#: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp +msgid "Gravity" +msgstr "" + +#: scene/2d/area_2d.cpp scene/3d/area.cpp +msgid "Linear Damp" +msgstr "" + +#: scene/2d/area_2d.cpp scene/3d/area.cpp +msgid "Angular Damp" +msgstr "" + +#: scene/2d/area_2d.cpp scene/3d/area.cpp +msgid "Audio Bus" +msgstr "" + +#: scene/2d/area_2d.cpp scene/3d/area.cpp +msgid "Override" +msgstr "" + +#: scene/2d/audio_stream_player_2d.cpp scene/audio/audio_stream_player.cpp +#: scene/gui/video_player.cpp servers/audio/effects/audio_effect_amplify.cpp +msgid "Volume dB" +msgstr "" + +#: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp +#: scene/audio/audio_stream_player.cpp +#: servers/audio/effects/audio_effect_pitch_shift.cpp +msgid "Pitch Scale" +msgstr "" + +#: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp +#: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp +msgid "Autoplay" +msgstr "" + +#: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp +#: scene/audio/audio_stream_player.cpp +msgid "Stream Paused" +msgstr "" + +#: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp +#: scene/3d/light.cpp scene/3d/reflection_probe.cpp +#: scene/3d/visibility_notifier.cpp scene/3d/visual_instance.cpp +#: scene/resources/material.cpp +msgid "Max Distance" +msgstr "" + +#: scene/2d/audio_stream_player_2d.cpp scene/3d/light.cpp +msgid "Attenuation" +msgstr "" + +#: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp +#: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp +msgid "Bus" +msgstr "" + +#: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp +msgid "Area Mask" +msgstr "" + +#: scene/2d/back_buffer_copy.cpp +msgid "Copy Mode" +msgstr "" + +#: scene/2d/camera_2d.cpp +msgid "Anchor Mode" +msgstr "" + +#: scene/2d/camera_2d.cpp +msgid "Rotating" +msgstr "" + +#: scene/2d/camera_2d.cpp scene/2d/listener_2d.cpp scene/3d/camera.cpp +#: scene/3d/listener.cpp scene/animation/animation_blend_tree.cpp +msgid "Current" +msgstr "" + +#: scene/2d/camera_2d.cpp scene/gui/graph_edit.cpp +msgid "Zoom" +msgstr "" + +#: scene/2d/camera_2d.cpp scene/main/canvas_layer.cpp +msgid "Custom Viewport" +msgstr "" + +#: scene/2d/camera_2d.cpp scene/3d/camera.cpp scene/3d/interpolated_camera.cpp +#: scene/animation/animation_player.cpp scene/animation/animation_tree.cpp +#: scene/animation/animation_tree_player.cpp scene/main/timer.cpp +msgid "Process Mode" +msgstr "" + +#: scene/2d/camera_2d.cpp +msgid "Limit" +msgstr "" + +#: scene/2d/camera_2d.cpp scene/gui/control.cpp scene/gui/nine_patch_rect.cpp +#: scene/resources/style_box.cpp scene/resources/texture.cpp +msgid "Left" +msgstr "" + +#: scene/2d/camera_2d.cpp scene/gui/control.cpp scene/gui/nine_patch_rect.cpp +#: scene/resources/style_box.cpp scene/resources/texture.cpp +msgid "Right" +msgstr "" + +#: scene/2d/camera_2d.cpp scene/gui/control.cpp scene/gui/nine_patch_rect.cpp +#: scene/resources/dynamic_font.cpp scene/resources/style_box.cpp +#: scene/resources/texture.cpp +msgid "Bottom" +msgstr "" + +#: scene/2d/camera_2d.cpp +msgid "Smoothed" +msgstr "" + +#: scene/2d/camera_2d.cpp +msgid "Draw Margin" +msgstr "" + +#: scene/2d/camera_2d.cpp +msgid "Drag Margin H Enabled" +msgstr "" + +#: scene/2d/camera_2d.cpp +msgid "Drag Margin V Enabled" +msgstr "" + +#: scene/2d/camera_2d.cpp +msgid "Smoothing" +msgstr "" + +#: scene/2d/camera_2d.cpp +msgid "H" +msgstr "" + +#: scene/2d/camera_2d.cpp +msgid "V" +msgstr "" + +#: scene/2d/camera_2d.cpp +msgid "Drag Margin" +msgstr "" + +#: scene/2d/camera_2d.cpp +msgid "Draw Screen" +msgstr "" + +#: scene/2d/camera_2d.cpp +msgid "Draw Limits" +msgstr "" + +#: scene/2d/camera_2d.cpp +msgid "Draw Drag Margin" +msgstr "" + +#: scene/2d/canvas_item.cpp scene/resources/environment.cpp +#: scene/resources/material.cpp +msgid "Blend Mode" +msgstr "" + +#: scene/2d/canvas_item.cpp +msgid "Light Mode" +msgstr "" + +#: scene/2d/canvas_item.cpp +msgid "Particles Animation" +msgstr "" + +#: scene/2d/canvas_item.cpp +msgid "Particles Anim H Frames" +msgstr "" + +#: scene/2d/canvas_item.cpp +msgid "Particles Anim V Frames" +msgstr "" + +#: scene/2d/canvas_item.cpp +msgid "Particles Anim Loop" +msgstr "" + +#: scene/2d/canvas_item.cpp scene/3d/spatial.cpp +msgid "Visibility" +msgstr "" + +#: scene/2d/canvas_item.cpp scene/3d/spatial.cpp scene/gui/progress_bar.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +msgid "Visible" +msgstr "" + +#: scene/2d/canvas_item.cpp +msgid "Self Modulate" +msgstr "" + +#: scene/2d/canvas_item.cpp +msgid "Show Behind Parent" +msgstr "" + +#: scene/2d/canvas_item.cpp +msgid "Show On Top" +msgstr "" + +#: scene/2d/canvas_item.cpp scene/2d/light_occluder_2d.cpp +#: scene/2d/tile_map.cpp +msgid "Light Mask" +msgstr "" + +#: scene/2d/canvas_item.cpp +msgid "Use Parent Material" +msgstr "" + +#: scene/2d/canvas_modulate.cpp +msgid "" +"Only one visible CanvasModulate is allowed per scene (or set of instanced " +"scenes). The first created one will work, while the rest will be ignored." +msgstr "" + +#: scene/2d/collision_object_2d.cpp +msgid "" +"This node has no shape, so it can't collide or interact with other objects.\n" +"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to " +"define its shape." +msgstr "" + +#: scene/2d/collision_object_2d.cpp +msgid "Pickable" +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "" +"CollisionPolygon2D only serves to provide a collision shape to a " +"CollisionObject2D derived node. Please only use it as a child of Area2D, " +"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "An empty CollisionPolygon2D has no effect on collision." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp scene/2d/collision_shape_2d.cpp +msgid "" +"The One Way Collision property will be ignored when the parent is an Area2D." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Build Mode" +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp scene/2d/collision_shape_2d.cpp +#: scene/3d/collision_polygon.cpp scene/3d/collision_shape.cpp +#: scene/animation/animation_node_state_machine.cpp scene/gui/base_button.cpp +#: scene/gui/texture_button.cpp scene/resources/default_theme/default_theme.cpp +msgid "Disabled" +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp scene/2d/collision_shape_2d.cpp +msgid "One Way Collision" +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp scene/2d/collision_shape_2d.cpp +msgid "One Way Collision Margin" +msgstr "" + +#: scene/2d/collision_shape_2d.cpp +msgid "" +"CollisionShape2D only serves to provide a collision shape to a " +"CollisionObject2D derived node. Please only use it as a child of Area2D, " +"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." +msgstr "" + +#: scene/2d/collision_shape_2d.cpp +msgid "" +"A shape must be provided for CollisionShape2D to function. Please create a " +"shape resource for it!" +msgstr "" + +#: scene/2d/collision_shape_2d.cpp +msgid "" +"Polygon-based shapes are not meant be used nor edited directly through the " +"CollisionShape2D node. Please use the CollisionPolygon2D node instead." +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp +msgid "" +"CPUParticles2D animation requires the usage of a CanvasItemMaterial with " +"\"Particles Animation\" enabled." +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/particles.cpp +msgid "Emitting" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/particles.cpp +msgid "Lifetime" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/particles.cpp scene/main/timer.cpp +msgid "One Shot" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/particles.cpp +msgid "Preprocess" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/particles.cpp +msgid "Explosiveness" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/particles.cpp +msgid "Randomness" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Lifetime Randomness" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/particles.cpp +msgid "Fixed FPS" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/particles.cpp +msgid "Fract Delta" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/particles.cpp +msgid "Drawing" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/particles.cpp +msgid "Local Coords" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/particles.cpp +msgid "Draw Order" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Emission Shape" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Sphere Radius" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp +msgid "Rect Extents" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +msgid "Normals" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Align Y" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Direction" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +#: servers/audio/effects/audio_effect_reverb.cpp +msgid "Spread" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Initial Velocity" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Velocity Random" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp servers/physics_2d_server.cpp +#: servers/physics_server.cpp +msgid "Angular Velocity" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Velocity Curve" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Orbit Velocity" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Linear Accel" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Accel" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Accel Random" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Accel Curve" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Radial Accel" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Tangential Accel" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/2d/joints_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/physics_body.cpp +#: scene/3d/physics_joint.cpp scene/3d/vehicle_body.cpp +#: scene/resources/particles_material.cpp +#: servers/audio/effects/audio_effect_reverb.cpp +msgid "Damping" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Damping Random" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Damping Curve" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp scene/3d/light.cpp +#: scene/resources/particles_material.cpp +msgid "Angle" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Angle Random" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Angle Curve" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +msgid "Scale Amount" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +msgid "Scale Amount Random" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +msgid "Scale Amount Curve" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Color Ramp" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Color Initial Ramp" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Hue Variation" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Variation" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Variation Random" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Variation Curve" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Speed Random" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Speed Curve" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Offset Random" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Offset Curve" +msgstr "" + +#: scene/2d/joints_2d.cpp +msgid "Node A and Node B must be PhysicsBody2Ds" +msgstr "" + +#: scene/2d/joints_2d.cpp +msgid "Node A must be a PhysicsBody2D" +msgstr "" + +#: scene/2d/joints_2d.cpp +msgid "Node B must be a PhysicsBody2D" +msgstr "" + +#: scene/2d/joints_2d.cpp +msgid "Joint is not connected to two PhysicsBody2Ds" +msgstr "" + +#: scene/2d/joints_2d.cpp +msgid "Node A and Node B must be different PhysicsBody2Ds" +msgstr "" + +#: scene/2d/joints_2d.cpp scene/3d/physics_joint.cpp +msgid "Node A" +msgstr "" + +#: scene/2d/joints_2d.cpp scene/3d/physics_joint.cpp +msgid "Node B" +msgstr "" + +#: scene/2d/joints_2d.cpp scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp +#: scene/3d/light.cpp scene/3d/physics_body.cpp scene/3d/physics_joint.cpp +#: scene/resources/environment.cpp +msgid "Bias" +msgstr "" + +#: scene/2d/joints_2d.cpp +msgid "Disable Collision" +msgstr "" + +#: scene/2d/joints_2d.cpp scene/3d/physics_body.cpp scene/3d/physics_joint.cpp +msgid "Softness" +msgstr "" + +#: scene/2d/joints_2d.cpp scene/resources/animation.cpp +#: scene/resources/ray_shape.cpp scene/resources/segment_shape_2d.cpp +msgid "Length" +msgstr "" + +#: scene/2d/joints_2d.cpp +msgid "Initial Offset" +msgstr "" + +#: scene/2d/joints_2d.cpp scene/3d/vehicle_body.cpp +msgid "Rest Length" +msgstr "" + +#: scene/2d/joints_2d.cpp scene/3d/physics_joint.cpp scene/3d/vehicle_body.cpp +msgid "Stiffness" +msgstr "" + +#: scene/2d/light_2d.cpp +msgid "" +"A texture with the shape of the light must be supplied to the \"Texture\" " +"property." +msgstr "" + +#: scene/2d/light_2d.cpp scene/3d/light.cpp scene/gui/reference_rect.cpp +msgid "Editor Only" +msgstr "" + +#: scene/2d/light_2d.cpp +msgid "Texture Scale" +msgstr "" + +#: scene/2d/light_2d.cpp scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp +#: scene/3d/light.cpp scene/resources/environment.cpp +#: scene/resources/material.cpp scene/resources/sky.cpp +msgid "Energy" +msgstr "" + +#: scene/2d/light_2d.cpp +msgid "Z Min" +msgstr "" + +#: scene/2d/light_2d.cpp +msgid "Z Max" +msgstr "" + +#: scene/2d/light_2d.cpp +msgid "Layer Min" +msgstr "" + +#: scene/2d/light_2d.cpp +msgid "Layer Max" +msgstr "" + +#: scene/2d/light_2d.cpp +msgid "Item Cull Mask" +msgstr "" + +#: scene/2d/light_2d.cpp scene/3d/light.cpp scene/resources/style_box.cpp +msgid "Shadow" +msgstr "" + +#: scene/2d/light_2d.cpp +msgid "Buffer Size" +msgstr "" + +#: scene/2d/light_2d.cpp +msgid "Gradient Length" +msgstr "" + +#: scene/2d/light_2d.cpp +msgid "Filter Smooth" +msgstr "" + +#: scene/2d/light_occluder_2d.cpp +msgid "Closed" +msgstr "" + +#: scene/2d/light_occluder_2d.cpp scene/resources/material.cpp +msgid "Cull Mode" +msgstr "" + +#: scene/2d/light_occluder_2d.cpp +msgid "" +"An occluder polygon must be set (or drawn) for this occluder to take effect." +msgstr "" + +#: scene/2d/light_occluder_2d.cpp +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." +msgstr "" + +#: scene/2d/line_2d.cpp +msgid "Width Curve" +msgstr "" + +#: scene/2d/line_2d.cpp scene/resources/default_theme/default_theme.cpp +msgid "Default Color" +msgstr "" + +#: scene/2d/line_2d.cpp scene/resources/texture.cpp +msgid "Fill" +msgstr "" + +#: scene/2d/line_2d.cpp scene/resources/texture.cpp +msgid "Gradient" +msgstr "" + +#: scene/2d/line_2d.cpp +msgid "Texture Mode" +msgstr "" + +#: scene/2d/line_2d.cpp +msgid "Capping" +msgstr "" + +#: scene/2d/line_2d.cpp +msgid "Joint Mode" +msgstr "" + +#: scene/2d/line_2d.cpp +msgid "Begin Cap Mode" +msgstr "" + +#: scene/2d/line_2d.cpp +msgid "End Cap Mode" +msgstr "" + +#: scene/2d/line_2d.cpp scene/2d/polygon_2d.cpp scene/resources/style_box.cpp +msgid "Border" +msgstr "" + +#: scene/2d/line_2d.cpp +msgid "Sharp Limit" +msgstr "" + +#: scene/2d/line_2d.cpp +msgid "Round Precision" +msgstr "" + +#: scene/2d/line_2d.cpp scene/2d/polygon_2d.cpp +#: scene/resources/dynamic_font.cpp +msgid "Antialiased" +msgstr "" + +#: scene/2d/multimesh_instance_2d.cpp scene/3d/multimesh_instance.cpp +msgid "Multimesh" +msgstr "" + +#: scene/2d/navigation_2d.cpp scene/3d/baked_lightmap.cpp +#: scene/3d/navigation.cpp scene/animation/root_motion_view.cpp +#: scene/resources/world_2d.cpp servers/physics_2d/physics_2d_server_sw.cpp +msgid "Cell Size" +msgstr "" + +#: scene/2d/navigation_2d.cpp scene/3d/navigation.cpp +msgid "Edge Connection Margin" +msgstr "" + +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Pathfinding" +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Path Desired Distance" +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Target Desired Distance" +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Path Max Distance" +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Avoidance" +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Avoidance Enabled" +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Neighbor Dist" +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Max Neighbors" +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Time Horizon" +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Max Speed" +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp +msgid "" +"The NavigationAgent2D can be used only under a Node2D inheriting parent node." +msgstr "" + +#: scene/2d/navigation_obstacle_2d.cpp scene/3d/navigation_obstacle.cpp +msgid "Estimate Radius" +msgstr "" + +#: scene/2d/navigation_obstacle_2d.cpp +msgid "" +"The NavigationObstacle2D only serves to provide collision avoidance to a " +"Node2D object." +msgstr "" + +#: scene/2d/navigation_polygon.cpp +msgid "" +"A NavigationPolygon resource must be set or created for this node to work. " +"Please set a property or draw a polygon." +msgstr "" + +#: scene/2d/navigation_polygon.cpp +msgid "Navpoly" +msgstr "" + +#: scene/2d/navigation_polygon.cpp scene/3d/navigation_mesh_instance.cpp +msgid "Enter Cost" +msgstr "" + +#: scene/2d/navigation_polygon.cpp scene/3d/navigation_mesh_instance.cpp +msgid "Travel Cost" +msgstr "" + +#: scene/2d/node_2d.cpp scene/2d/polygon_2d.cpp scene/3d/spatial.cpp +#: scene/main/canvas_layer.cpp +msgid "Rotation Degrees" +msgstr "" + +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp +msgid "Global Rotation" +msgstr "" + +#: scene/2d/node_2d.cpp +msgid "Global Rotation Degrees" +msgstr "" + +#: scene/2d/node_2d.cpp +msgid "Global Scale" +msgstr "" + +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp +msgid "Global Transform" +msgstr "" + +#: scene/2d/node_2d.cpp +msgid "Z As Relative" +msgstr "" + +#: scene/2d/parallax_background.cpp scene/gui/scroll_container.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Scroll" +msgstr "" + +#: scene/2d/parallax_background.cpp +msgid "Base Offset" +msgstr "" + +#: scene/2d/parallax_background.cpp +msgid "Base Scale" +msgstr "" + +#: scene/2d/parallax_background.cpp +msgid "Limit Begin" +msgstr "" + +#: scene/2d/parallax_background.cpp +msgid "Limit End" +msgstr "" + +#: scene/2d/parallax_background.cpp +msgid "Ignore Camera Zoom" +msgstr "" + +#: scene/2d/parallax_layer.cpp +msgid "" +"ParallaxLayer node only works when set as child of a ParallaxBackground node." +msgstr "" + +#: scene/2d/parallax_layer.cpp scene/2d/physics_body_2d.cpp +#: scene/3d/physics_body.cpp scene/3d/vehicle_body.cpp +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Motion" +msgstr "" + +#: scene/2d/parallax_layer.cpp +msgid "Mirroring" +msgstr "" + +#: scene/2d/particles_2d.cpp +msgid "" +"GPU-based particles are not supported by the GLES2 video driver.\n" +"Use the CPUParticles2D node instead. You can use the \"Convert to " +"CPUParticles2D\" toolbar option for this purpose." +msgstr "" + +#: scene/2d/particles_2d.cpp +msgid "" +"On macOS, Particles2D rendering is much slower than CPUParticles2D due to " +"transform feedback being implemented on the CPU instead of the GPU.\n" +"Consider using CPUParticles2D instead when targeting macOS.\n" +"You can use the \"Convert to CPUParticles2D\" toolbar option for this " +"purpose." +msgstr "" + +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." +msgstr "" + +#: scene/2d/particles_2d.cpp +msgid "" +"Particles2D animation requires the usage of a CanvasItemMaterial with " +"\"Particles Animation\" enabled." +msgstr "" + +#: scene/2d/particles_2d.cpp +msgid "Visibility Rect" +msgstr "" + +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "Process Material" +msgstr "" + +#: scene/2d/path_2d.cpp scene/3d/path.cpp scene/resources/sky.cpp +#: scene/resources/texture.cpp +msgid "Curve" +msgstr "" + +#: scene/2d/path_2d.cpp +msgid "PathFollow2D only works when set as a child of a Path2D node." +msgstr "" + +#: scene/2d/path_2d.cpp scene/3d/path.cpp +msgid "Unit Offset" +msgstr "" + +#: scene/2d/path_2d.cpp scene/3d/camera.cpp scene/3d/path.cpp +msgid "H Offset" +msgstr "" + +#: scene/2d/path_2d.cpp scene/3d/camera.cpp scene/3d/path.cpp +msgid "V Offset" +msgstr "" + +#: scene/2d/path_2d.cpp scene/3d/path.cpp +msgid "Cubic Interp" +msgstr "" + +#: scene/2d/path_2d.cpp +msgid "Lookahead" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/visual_instance.cpp +msgid "Layers" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Constant Linear Velocity" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Constant Angular Velocity" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/2d/tile_map.cpp scene/3d/physics_body.cpp +#: scene/resources/physics_material.cpp +msgid "Friction" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/2d/tile_map.cpp scene/3d/physics_body.cpp +#: scene/resources/physics_material.cpp +msgid "Bounce" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Physics Material Override" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +#: scene/resources/world.cpp scene/resources/world_2d.cpp +msgid "Default Gravity" +msgstr "" + +#: scene/2d/physics_body_2d.cpp +msgid "" +"Size changes to RigidBody2D (in character or rigid modes) will be overridden " +"by the physics engine when running.\n" +"Change the size in children collision shapes instead." +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Mass" +msgstr "" + +#: scene/2d/physics_body_2d.cpp +msgid "Inertia" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Weight" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Gravity Scale" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Custom Integrator" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Continuous CD" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Contacts Reported" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Contact Monitor" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Sleeping" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Can Sleep" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Damp" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Angular" +msgstr "" + +#: scene/2d/physics_body_2d.cpp +msgid "Applied Forces" +msgstr "" + +#: scene/2d/physics_body_2d.cpp +msgid "Torque" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Safe Margin" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Sync To Physics" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Moving Platform" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Apply Velocity On Leave" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/2d/touch_screen_button.cpp +#: scene/3d/physics_body.cpp scene/gui/texture_button.cpp +#: scene/resources/default_theme/default_theme.cpp +#: scene/resources/line_shape_2d.cpp scene/resources/material.cpp +msgid "Normal" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Remainder" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Local Shape" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Collider" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Collider ID" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Collider RID" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Collider Shape" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Collider Shape Index" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Collider Velocity" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Collider Metadata" +msgstr "" + +#: scene/2d/polygon_2d.cpp +msgid "Invert" +msgstr "" + +#: scene/2d/polygon_2d.cpp +msgid "Vertex Colors" +msgstr "" + +#: scene/2d/polygon_2d.cpp +msgid "Internal Vertex Count" +msgstr "" + +#: scene/2d/position_2d.cpp +msgid "Gizmo Extents" +msgstr "" + +#: scene/2d/ray_cast_2d.cpp scene/3d/ray_cast.cpp +msgid "Exclude Parent" +msgstr "" + +#: scene/2d/ray_cast_2d.cpp scene/3d/ray_cast.cpp +msgid "Cast To" +msgstr "" + +#: scene/2d/ray_cast_2d.cpp scene/3d/ray_cast.cpp +msgid "Collide With" +msgstr "" + +#: scene/2d/ray_cast_2d.cpp scene/3d/camera.cpp scene/3d/ray_cast.cpp +msgid "Areas" +msgstr "" + +#: scene/2d/ray_cast_2d.cpp scene/3d/camera.cpp scene/3d/ray_cast.cpp +msgid "Bodies" +msgstr "" + +#: scene/2d/remote_transform_2d.cpp +msgid "Path property must point to a valid Node2D node to work." +msgstr "" + +#: scene/2d/remote_transform_2d.cpp scene/3d/remote_transform.cpp +msgid "Remote Path" +msgstr "" + +#: scene/2d/remote_transform_2d.cpp scene/3d/remote_transform.cpp +msgid "Use Global Coordinates" +msgstr "" + +#: scene/2d/skeleton_2d.cpp scene/3d/skeleton.cpp +msgid "Rest" +msgstr "" + +#: scene/2d/skeleton_2d.cpp +msgid "Default Length" +msgstr "" + +#: scene/2d/skeleton_2d.cpp +msgid "This Bone2D chain should end at a Skeleton2D node." +msgstr "" + +#: scene/2d/skeleton_2d.cpp +msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node." +msgstr "" + +#: scene/2d/skeleton_2d.cpp +msgid "" +"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one." +msgstr "" + +#: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp +msgid "Hframes" +msgstr "" + +#: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp +msgid "Vframes" +msgstr "" + +#: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp +msgid "Frame Coords" +msgstr "" + +#: scene/2d/sprite.cpp scene/resources/texture.cpp +msgid "Filter Clip" +msgstr "" + +#: scene/2d/tile_map.cpp +msgid "" +"TileMap with Use Parent on needs a parent CollisionObject2D to give shapes " +"to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, " +"KinematicBody2D, etc. to give them a shape." +msgstr "" + +#: scene/2d/tile_map.cpp +msgid "Tile Set" +msgstr "" + +#: scene/2d/tile_map.cpp +msgid "Quadrant Size" +msgstr "" + +#: scene/2d/tile_map.cpp +msgid "Custom Transform" +msgstr "" + +#: scene/2d/tile_map.cpp +msgid "Half Offset" +msgstr "" + +#: scene/2d/tile_map.cpp +msgid "Tile Origin" +msgstr "" + +#: scene/2d/tile_map.cpp +msgid "Y Sort" +msgstr "" + +#: scene/2d/tile_map.cpp +msgid "Show Collision" +msgstr "" + +#: scene/2d/tile_map.cpp +msgid "Compatibility Mode" +msgstr "" + +#: scene/2d/tile_map.cpp +msgid "Centered Textures" +msgstr "" + +#: scene/2d/tile_map.cpp +msgid "Cell Clip UV" +msgstr "" + +#: scene/2d/tile_map.cpp +msgid "Use Parent" +msgstr "" + +#: scene/2d/tile_map.cpp +msgid "Use Kinematic" +msgstr "" + +#: scene/2d/touch_screen_button.cpp +msgid "Shape Centered" +msgstr "" + +#: scene/2d/touch_screen_button.cpp +msgid "Shape Visible" +msgstr "" + +#: scene/2d/touch_screen_button.cpp +msgid "Passby Press" +msgstr "" + +#: scene/2d/touch_screen_button.cpp +msgid "Visibility Mode" +msgstr "" + +#: scene/2d/visibility_notifier_2d.cpp +msgid "" +"VisibilityEnabler2D works best when used with the edited scene root directly " +"as parent." +msgstr "" + +#: scene/2d/visibility_notifier_2d.cpp scene/3d/visibility_notifier.cpp +msgid "Pause Animations" +msgstr "" + +#: scene/2d/visibility_notifier_2d.cpp scene/3d/visibility_notifier.cpp +msgid "Freeze Bodies" +msgstr "" + +#: scene/2d/visibility_notifier_2d.cpp +msgid "Pause Particles" +msgstr "" + +#: scene/2d/visibility_notifier_2d.cpp +msgid "Pause Animated Sprites" +msgstr "" + +#: scene/2d/visibility_notifier_2d.cpp +msgid "Process Parent" +msgstr "" + +#: scene/2d/visibility_notifier_2d.cpp +msgid "Physics Process Parent" +msgstr "" + +#: scene/3d/area.cpp +msgid "Reverb Bus" +msgstr "" + +#: scene/3d/area.cpp +msgid "Uniformity" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVRCamera must have an ARVROrigin node as its parent." +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "Controller ID" +msgstr "" + +#: scene/3d/arvr_nodes.cpp servers/arvr/arvr_positional_tracker.cpp +msgid "Rumble" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVRController must have an ARVROrigin node as its parent." +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "" +"The controller ID must not be 0 or this controller won't be bound to an " +"actual controller." +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "Anchor ID" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVRAnchor must have an ARVROrigin node as its parent." +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "" +"The anchor ID must not be 0 or this anchor won't be bound to an actual " +"anchor." +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVROrigin requires an ARVRCamera child node." +msgstr "" + +#: scene/3d/arvr_nodes.cpp servers/arvr_server.cpp +msgid "World Scale" +msgstr "" + +#: scene/3d/audio_stream_player_3d.cpp +msgid "Attenuation Model" +msgstr "" + +#: scene/3d/audio_stream_player_3d.cpp +msgid "Unit dB" +msgstr "" + +#: scene/3d/audio_stream_player_3d.cpp +msgid "Unit Size" +msgstr "" + +#: scene/3d/audio_stream_player_3d.cpp +msgid "Max dB" +msgstr "" + +#: scene/3d/audio_stream_player_3d.cpp +msgid "Out Of Range Mode" +msgstr "" + +#: scene/3d/audio_stream_player_3d.cpp +msgid "Emission Angle" +msgstr "" + +#: scene/3d/audio_stream_player_3d.cpp +msgid "Degrees" +msgstr "" + +#: scene/3d/audio_stream_player_3d.cpp +msgid "Filter Attenuation dB" +msgstr "" + +#: scene/3d/audio_stream_player_3d.cpp +msgid "Attenuation Filter" +msgstr "" + +#: scene/3d/audio_stream_player_3d.cpp +#: servers/audio/effects/audio_effect_chorus.cpp +#: servers/audio/effects/audio_effect_filter.cpp +msgid "Cutoff Hz" +msgstr "" + +#: scene/3d/audio_stream_player_3d.cpp +#: servers/audio/effects/audio_effect_filter.cpp +msgid "dB" +msgstr "" + +#: scene/3d/audio_stream_player_3d.cpp +msgid "Doppler" +msgstr "" + +#: scene/3d/audio_stream_player_3d.cpp +msgid "Tracking" +msgstr "" + +#: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp +#: scene/3d/reflection_probe.cpp +msgid "Interior" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Finding meshes and lights" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Preparing geometry (%d/%d)" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Preparing environment" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Generating capture" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Saving lightmaps" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Done" +msgstr "" + +#: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp +#: scene/3d/reflection_probe.cpp scene/resources/box_shape.cpp +#: scene/resources/rectangle_shape_2d.cpp +msgid "Extents" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Tweaks" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Bounces" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Bounce Indirect Energy" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Use Denoiser" +msgstr "" + +#: scene/3d/baked_lightmap.cpp scene/resources/texture.cpp +msgid "Use HDR" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Use Color" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Default Texels Per Unit" +msgstr "" + +#: scene/3d/baked_lightmap.cpp scene/resources/texture.cpp +msgid "Atlas" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Generate" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Max Size" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Custom Sky" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Custom Sky Rotation Degrees" +msgstr "" + +#: scene/3d/baked_lightmap.cpp scene/3d/ray_cast.cpp +msgid "Custom Color" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Custom Energy" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Min Light" +msgstr "" + +#: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp +msgid "Propagation" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Image Path" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Light Data" +msgstr "" + +#: scene/3d/bone_attachment.cpp scene/3d/physics_body.cpp +msgid "Bone Name" +msgstr "" + +#: scene/3d/camera.cpp +msgid "Keep Aspect" +msgstr "" + +#: scene/3d/camera.cpp scene/3d/light.cpp scene/3d/reflection_probe.cpp +msgid "Cull Mask" +msgstr "" + +#: scene/3d/camera.cpp +msgid "Doppler Tracking" +msgstr "" + +#: scene/3d/camera.cpp +msgid "Projection" +msgstr "" + +#: scene/3d/camera.cpp +msgid "FOV" +msgstr "" + +#: scene/3d/camera.cpp +msgid "Frustum Offset" +msgstr "" + +#: scene/3d/camera.cpp +msgid "Near" +msgstr "" + +#: scene/3d/camera.cpp +msgid "Far" +msgstr "" + +#: scene/3d/camera.cpp scene/3d/collision_polygon.cpp scene/3d/spring_arm.cpp +#: scene/gui/control.cpp scene/resources/default_theme/default_theme.cpp +#: scene/resources/shape.cpp scene/resources/style_box.cpp +#: scene/resources/texture.cpp servers/physics_2d_server.cpp +#: servers/physics_server.cpp +msgid "Margin" +msgstr "" + +#: scene/3d/camera.cpp +msgid "Clip To" +msgstr "" + +#: scene/3d/collision_object.cpp scene/3d/soft_body.cpp +msgid "Ray Pickable" +msgstr "" + +#: scene/3d/collision_object.cpp +msgid "Capture On Drag" +msgstr "" + +#: scene/3d/collision_object.cpp +msgid "" +"This node has no shape, so it can't collide or interact with other objects.\n" +"Consider adding a CollisionShape or CollisionPolygon as a child to define " +"its shape." +msgstr "" + +#: scene/3d/collision_polygon.cpp +msgid "" +"CollisionPolygon only serves to provide a collision shape to a " +"CollisionObject derived node. Please only use it as a child of Area, " +"StaticBody, RigidBody, KinematicBody, etc. to give them a shape." +msgstr "" + +#: scene/3d/collision_polygon.cpp +msgid "An empty CollisionPolygon has no effect on collision." +msgstr "" + +#: scene/3d/collision_shape.cpp +msgid "" +"CollisionShape only serves to provide a collision shape to a CollisionObject " +"derived node. Please only use it as a child of Area, StaticBody, RigidBody, " +"KinematicBody, etc. to give them a shape." +msgstr "" + +#: scene/3d/collision_shape.cpp +msgid "" +"A shape must be provided for CollisionShape to function. Please create a " +"shape resource for it." +msgstr "" + +#: scene/3d/collision_shape.cpp +msgid "" +"Plane shapes don't work well and will be removed in future versions. Please " +"don't use them." +msgstr "" + +#: scene/3d/collision_shape.cpp +msgid "" +"ConcavePolygonShape doesn't support RigidBody in another mode than static." +msgstr "" + +#: scene/3d/cpu_particles.cpp +msgid "Nothing is visible because no mesh has been assigned." +msgstr "" + +#: scene/3d/cpu_particles.cpp +msgid "" +"CPUParticles animation requires the usage of a SpatialMaterial whose " +"Billboard Mode is set to \"Particle Billboard\"." +msgstr "" + +#: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp +msgid "Box Extents" +msgstr "" + +#: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp +msgid "Ring Radius" +msgstr "" + +#: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp +msgid "Ring Inner Radius" +msgstr "" + +#: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp +msgid "Ring Height" +msgstr "" + +#: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp +msgid "Ring Axis" +msgstr "" + +#: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp +msgid "Rotate Y" +msgstr "" + +#: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp +msgid "Disable Z" +msgstr "" + +#: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp +msgid "Flatness" +msgstr "" + +#: scene/3d/cull_instance.cpp servers/visual_server.cpp +msgid "Portals" +msgstr "" + +#: scene/3d/cull_instance.cpp +msgid "Portal Mode" +msgstr "" + +#: scene/3d/cull_instance.cpp +msgid "Include In Bound" +msgstr "" + +#: scene/3d/cull_instance.cpp +msgid "Allow Merging" +msgstr "" + +#: scene/3d/cull_instance.cpp +msgid "Autoplace Priority" +msgstr "" + +#: scene/3d/gi_probe.cpp +msgid "Plotting Meshes" +msgstr "" + +#: scene/3d/gi_probe.cpp +msgid "Finishing Plot" +msgstr "" + +#: scene/3d/gi_probe.cpp +msgid "" +"GIProbes are not supported by the GLES2 video driver.\n" +"Use a BakedLightmap instead." +msgstr "" + +#: scene/3d/gi_probe.cpp +msgid "" +"The GIProbe Compress property has been deprecated due to known bugs and no " +"longer has any effect.\n" +"To remove this warning, disable the GIProbe's Compress property." +msgstr "" + +#: scene/3d/gi_probe.cpp +msgid "Subdiv" +msgstr "" + +#: scene/3d/gi_probe.cpp +msgid "Dynamic Range" +msgstr "" + +#: scene/3d/gi_probe.cpp scene/3d/light.cpp +msgid "Normal Bias" +msgstr "" + +#: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp +#: scene/resources/primitive_meshes.cpp +msgid "Pixel Size" +msgstr "" + +#: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp +msgid "Billboard" +msgstr "" + +#: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp +msgid "Shaded" +msgstr "" + +#: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp +msgid "Double Sided" +msgstr "" + +#: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/material.cpp +msgid "No Depth Test" +msgstr "" + +#: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/material.cpp +msgid "Fixed Size" +msgstr "" + +#: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp +msgid "Alpha Cut" +msgstr "" + +#: scene/3d/label_3d.cpp scene/resources/material.cpp +msgid "Alpha Scissor Threshold" +msgstr "" + +#: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/material.cpp +msgid "Render Priority" +msgstr "" + +#: scene/3d/label_3d.cpp +msgid "Outline Render Priority" +msgstr "" + +#: scene/3d/label_3d.cpp +msgid "Outline Modulate" +msgstr "" + +#: scene/3d/label_3d.cpp scene/resources/default_theme/default_theme.cpp +#: scene/resources/dynamic_font.cpp scene/resources/primitive_meshes.cpp +msgid "Font" +msgstr "" + +#: scene/3d/label_3d.cpp scene/resources/primitive_meshes.cpp +msgid "Horizontal Alignment" +msgstr "" + +#: scene/3d/label_3d.cpp +msgid "Vertical Alignment" +msgstr "" + +#: scene/3d/label_3d.cpp scene/gui/dialogs.cpp scene/gui/label.cpp +msgid "Autowrap" +msgstr "" + +#: scene/3d/light.cpp +msgid "Indirect Energy" +msgstr "" + +#: scene/3d/light.cpp +msgid "Negative" +msgstr "" + +#: scene/3d/light.cpp scene/resources/material.cpp +#: scene/resources/visual_shader.cpp +msgid "Specular" +msgstr "" + +#: scene/3d/light.cpp +msgid "Bake Mode" +msgstr "" + +#: scene/3d/light.cpp +msgid "Contact" +msgstr "" + +#: scene/3d/light.cpp +msgid "Reverse Cull Face" +msgstr "" + +#: scene/3d/light.cpp servers/visual_server.cpp +msgid "Directional Shadow" +msgstr "" + +#: scene/3d/light.cpp +msgid "Split 1" +msgstr "" + +#: scene/3d/light.cpp +msgid "Split 2" +msgstr "" + +#: scene/3d/light.cpp +msgid "Split 3" +msgstr "" + +#: scene/3d/light.cpp +msgid "Blend Splits" +msgstr "" + +#: scene/3d/light.cpp +msgid "Bias Split Scale" +msgstr "" + +#: scene/3d/light.cpp +msgid "Depth Range" +msgstr "" + +#: scene/3d/light.cpp +msgid "Omni" +msgstr "" + +#: scene/3d/light.cpp +msgid "Shadow Mode" +msgstr "" + +#: scene/3d/light.cpp +msgid "Shadow Detail" +msgstr "" + +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + +#: scene/3d/light.cpp +msgid "Spot" +msgstr "" + +#: scene/3d/light.cpp +msgid "Angle Attenuation" +msgstr "" + +#: scene/3d/mesh_instance.cpp +msgid "Software Skinning" +msgstr "" + +#: scene/3d/mesh_instance.cpp +msgid "Transform Normals" +msgstr "" + +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/3d/navigation.cpp scene/resources/curve.cpp +msgid "Up Vector" +msgstr "" + +#: scene/3d/navigation.cpp +msgid "Cell Height" +msgstr "" + +#: scene/3d/navigation_agent.cpp +msgid "Agent Height Offset" +msgstr "" + +#: scene/3d/navigation_agent.cpp +msgid "Ignore Y" +msgstr "" + +#: scene/3d/navigation_agent.cpp +msgid "" +"The NavigationAgent can be used only under a Spatial inheriting parent node." +msgstr "" + +#: scene/3d/navigation_mesh_instance.cpp scene/resources/mesh_library.cpp +msgid "NavMesh" +msgstr "" + +#: scene/3d/navigation_obstacle.cpp +msgid "" +"The NavigationObstacle only serves to provide collision avoidance to a " +"Spatial inheriting parent object." +msgstr "" + +#: scene/3d/occluder.cpp +msgid "No shape is set." +msgstr "" + +#: scene/3d/occluder.cpp +msgid "Only uniform scales are supported." +msgstr "" + +#: scene/3d/particles.cpp +msgid "" +"GPU-based particles are not supported by the GLES2 video driver.\n" +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." +msgstr "" + +#: scene/3d/particles.cpp +msgid "" +"On macOS, Particles rendering is much slower than CPUParticles due to " +"transform feedback being implemented on the CPU instead of the GPU.\n" +"Consider using CPUParticles instead when targeting macOS.\n" +"You can use the \"Convert to CPUParticles\" toolbar option for this purpose." +msgstr "" + +#: scene/3d/particles.cpp +msgid "" +"Nothing is visible because meshes have not been assigned to draw passes." +msgstr "" + +#: scene/3d/particles.cpp +msgid "" +"Particles animation requires the usage of a SpatialMaterial whose Billboard " +"Mode is set to \"Particle Billboard\"." +msgstr "" + +#: scene/3d/particles.cpp +msgid "Visibility AABB" +msgstr "" + +#: scene/3d/particles.cpp +msgid "Draw Passes" +msgstr "" + +#: scene/3d/particles.cpp +msgid "Passes" +msgstr "" + +#: scene/3d/path.cpp +msgid "PathFollow only works when set as a child of a Path node." +msgstr "" + +#: scene/3d/path.cpp +msgid "" +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." +msgstr "" + +#: scene/3d/path.cpp +msgid "Rotation Mode" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "" +"Size changes to RigidBody (in character or rigid modes) will be overridden " +"by the physics engine when running.\n" +"Change the size in children collision shapes instead." +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Axis Lock" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Linear X" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Linear Y" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Linear Z" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular X" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Y" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Z" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Motion X" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Motion Y" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Motion Z" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Joint Constraints" +msgstr "" + +#: scene/3d/physics_body.cpp scene/3d/physics_joint.cpp +msgid "Impulse Clamp" +msgstr "" + +#: scene/3d/physics_body.cpp scene/3d/physics_joint.cpp +msgid "Swing Span" +msgstr "" + +#: scene/3d/physics_body.cpp scene/3d/physics_joint.cpp +msgid "Twist Span" +msgstr "" + +#: scene/3d/physics_body.cpp scene/3d/physics_joint.cpp +#: scene/3d/vehicle_body.cpp +msgid "Relaxation" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Limit Enabled" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Limit Upper" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Limit Lower" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Limit Bias" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Limit Softness" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Limit Relaxation" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Linear Limit Upper" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Linear Limit Lower" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Linear Limit Softness" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Linear Limit Restitution" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Linear Limit Damping" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Limit Restitution" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Limit Damping" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "X" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Y" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Z" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Linear Limit Enabled" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Linear Spring Enabled" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Linear Spring Stiffness" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Linear Spring Damping" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Linear Equilibrium Point" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Linear Restitution" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Linear Damping" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Restitution" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Damping" +msgstr "" + +#: scene/3d/physics_body.cpp scene/3d/physics_joint.cpp +msgid "ERP" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Spring Enabled" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Spring Stiffness" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Spring Damping" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Equilibrium Point" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Body Offset" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Node A and Node B must be PhysicsBodies" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Node A must be a PhysicsBody" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Node B must be a PhysicsBody" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Joint is not connected to any PhysicsBodies" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Node A and Node B must be different PhysicsBodies" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Solver" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Exclude Nodes" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Params" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Angular Limit" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Upper" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Lower" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Motor" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Target Velocity" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Max Impulse" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Linear Limit" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Upper Distance" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Lower Distance" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Restitution" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Linear Motion" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Linear Ortho" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Upper Angle" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Lower Angle" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Angular Motion" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Angular Ortho" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Linear Limit X" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Linear Motor X" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Force Limit" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Linear Spring X" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Equilibrium Point" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Angular Limit X" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Angular Motor X" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Angular Spring X" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Linear Limit Y" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Linear Motor Y" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Linear Spring Y" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Angular Limit Y" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Angular Motor Y" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Angular Spring Y" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Linear Limit Z" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Linear Motor Z" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Linear Spring Z" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Angular Limit Z" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Angular Motor Z" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Angular Spring Z" +msgstr "" + +#: scene/3d/portal.cpp +msgid "The RoomManager should not be a child or grandchild of a Portal." +msgstr "" + +#: scene/3d/portal.cpp +msgid "A Room should not be a child or grandchild of a Portal." +msgstr "" + +#: scene/3d/portal.cpp +msgid "A RoomGroup should not be a child or grandchild of a Portal." +msgstr "" + +#: scene/3d/portal.cpp +msgid "Portal Active" +msgstr "" + +#: scene/3d/portal.cpp scene/resources/occluder_shape_polygon.cpp +msgid "Two Way" +msgstr "" + +#: scene/3d/portal.cpp +msgid "Linked Room" +msgstr "" + +#: scene/3d/portal.cpp +msgid "Use Default Margin" +msgstr "" + +#: scene/3d/proximity_group.cpp +msgid "Group Name" +msgstr "" + +#: scene/3d/proximity_group.cpp +msgid "Dispatch Mode" +msgstr "" + +#: scene/3d/proximity_group.cpp +msgid "Grid Radius" +msgstr "" + +#: scene/3d/ray_cast.cpp +msgid "Debug Shape" +msgstr "" + +#: scene/3d/ray_cast.cpp scene/resources/style_box.cpp +msgid "Thickness" +msgstr "" + +#: scene/3d/reflection_probe.cpp scene/main/viewport.cpp +msgid "Update Mode" +msgstr "" + +#: scene/3d/reflection_probe.cpp +msgid "Origin Offset" +msgstr "" + +#: scene/3d/reflection_probe.cpp +msgid "Box Projection" +msgstr "" + +#: scene/3d/reflection_probe.cpp +msgid "Enable Shadows" +msgstr "" + +#: scene/3d/reflection_probe.cpp +msgid "Ambient Color" +msgstr "" + +#: scene/3d/reflection_probe.cpp +msgid "Ambient Energy" +msgstr "" + +#: scene/3d/reflection_probe.cpp +msgid "Ambient Contrib" +msgstr "" + +#: scene/3d/remote_transform.cpp +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." +msgstr "" + +#: scene/3d/room.cpp +msgid "A Room cannot have another Room as a child or grandchild." +msgstr "" + +#: scene/3d/room.cpp +msgid "The RoomManager should not be placed inside a Room." +msgstr "" + +#: scene/3d/room.cpp +msgid "A RoomGroup should not be placed inside a Room." +msgstr "" + +#: scene/3d/room.cpp +msgid "" +"Room convex hull contains a large number of planes.\n" +"Consider simplifying the room bound in order to increase performance." +msgstr "" + +#: scene/3d/room.cpp +msgid "Use Default Simplify" +msgstr "" + +#: scene/3d/room.cpp scene/3d/room_manager.cpp +msgid "Room Simplify" +msgstr "" + +#: scene/3d/room.cpp +msgid "Bound" +msgstr "" + +#: scene/3d/room_group.cpp +msgid "Roomgroup Priority" +msgstr "" + +#: scene/3d/room_group.cpp +msgid "The RoomManager should not be placed inside a RoomGroup." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "The RoomList has not been assigned." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "The RoomList node should be a Spatial (or derived from Spatial)." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "" +"Portal Depth Limit is set to Zero.\n" +"Only the Room that the Camera is in will render." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "There should only be one RoomManager in the SceneTree." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "Main" +msgstr "" + +#: scene/3d/room_manager.cpp scene/animation/animation_blend_tree.cpp +#: scene/animation/animation_player.cpp scene/animation/animation_tree.cpp +#: scene/animation/animation_tree_player.cpp +#: servers/audio/effects/audio_effect_delay.cpp +msgid "Active" +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "Roomlist" +msgstr "" + +#: scene/3d/room_manager.cpp servers/visual_server.cpp +msgid "PVS" +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "PVS Mode" +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "PVS Filename" +msgstr "" + +#: scene/3d/room_manager.cpp servers/visual_server.cpp +msgid "Gameplay" +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "Gameplay Monitor" +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "Use Secondary PVS" +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "Merge Meshes" +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "Show Margins" +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "Debug Sprawl" +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "Overlap Warning Threshold" +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "Preview Camera" +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "Portal Depth Limit" +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "Default Portal Margin" +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "Roaming Expansion Margin" +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "" +"RoomList path is invalid.\n" +"Please check the RoomList branch has been assigned in the RoomManager." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "RoomList contains no Rooms, aborting." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "Misnamed nodes detected, check output log for details. Aborting." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "Portal link room not found, check output log for details." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "" +"Portal autolink failed, check output log for details.\n" +"Check the portal is facing outwards from the source room." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "" +"Room overlap detected, cameras may work incorrectly in overlapping area.\n" +"Check output log for details." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "" +"Error calculating room bounds.\n" +"Ensure all rooms contain geometry or manual bounds." +msgstr "" + +#: scene/3d/skeleton.cpp scene/resources/skin.cpp +msgid "Pose" +msgstr "" + +#: scene/3d/skeleton.cpp +msgid "Bound Children" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "Pinned Points" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "Attachments" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "Point Index" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "Spatial Attachment Path" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "Physics Enabled" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "Parent Collision Ignore" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "Simulation Precision" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "Total Mass" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "Linear Stiffness" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "Areaangular Stiffness" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "Volume Stiffness" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "Pressure Coefficient" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "Damping Coefficient" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "Drag Coefficient" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "Pose Matching Coefficient" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "This body will be ignored until you set a mesh." +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "" +"Size changes to SoftBody will be overridden by the physics engine when " +"running.\n" +"Change the size in children collision shapes instead." +msgstr "" + +#: scene/3d/spatial.cpp +msgid "Global Translation" +msgstr "" + +#: scene/3d/spatial.cpp +msgid "Matrix" +msgstr "" + +#: scene/3d/spatial.cpp +msgid "Gizmo" +msgstr "" + +#: scene/3d/spatial_velocity_tracker.cpp +msgid "Track Physics Step" +msgstr "" + +#: scene/3d/spring_arm.cpp +msgid "Spring Length" +msgstr "" + +#: scene/3d/sprite_3d.cpp scene/gui/graph_edit.cpp +msgid "Opacity" +msgstr "" + +#: scene/3d/sprite_3d.cpp scene/resources/material.cpp +msgid "Transparent" +msgstr "" + +#: scene/3d/sprite_3d.cpp +msgid "" +"A SpriteFrames resource must be created or set in the \"Frames\" property in " +"order for AnimatedSprite3D to display frames." +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "" +"VehicleWheel serves to provide a wheel system to a VehicleBody. Please use " +"it as a child of a VehicleBody." +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "Per-Wheel Motion" +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "Engine Force" +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "Brake" +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "Steering" +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "VehicleBody Motion" +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "Use As Traction" +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "Use As Steering" +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "Wheel" +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "Roll Influence" +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "Friction Slip" +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "Suspension" +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "Max Force" +msgstr "" + +#: scene/3d/visibility_notifier.cpp +msgid "AABB" +msgstr "" + +#: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp +msgid "Geometry" +msgstr "" + +#: scene/3d/visual_instance.cpp +msgid "Material Override" +msgstr "" + +#: scene/3d/visual_instance.cpp +msgid "Material Overlay" +msgstr "" + +#: scene/3d/visual_instance.cpp +msgid "Cast Shadow" +msgstr "" + +#: scene/3d/visual_instance.cpp +msgid "Extra Cull Margin" +msgstr "" + +#: scene/3d/visual_instance.cpp +msgid "Baked Light" +msgstr "" + +#: scene/3d/visual_instance.cpp +msgid "Generate Lightmap" +msgstr "" + +#: scene/3d/visual_instance.cpp +msgid "Lightmap Scale" +msgstr "" + +#: scene/3d/visual_instance.cpp +msgid "LOD" +msgstr "" + +#: scene/3d/visual_instance.cpp scene/animation/skeleton_ik.cpp +#: scene/resources/material.cpp +msgid "Min Distance" +msgstr "" + +#: scene/3d/visual_instance.cpp +msgid "Min Hysteresis" +msgstr "" + +#: scene/3d/visual_instance.cpp +msgid "Max Hysteresis" +msgstr "" + +#: scene/3d/world_environment.cpp +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." +msgstr "" + +#: scene/3d/world_environment.cpp +msgid "" +"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)." +msgstr "" + +#: scene/3d/world_environment.cpp +msgid "" +"This WorldEnvironment is ignored. Either add a Camera (for 3D scenes) or set " +"this environment's Background Mode to Canvas (for 2D scenes)." +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +msgid "On BlendTree node '%s', animation not found: '%s'" +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +msgid "Animation not found: '%s'" +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +msgid "Mix Mode" +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +msgid "Fadein Time" +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +msgid "Fadeout Time" +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +msgid "Auto Restart" +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +msgid "Autorestart" +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +msgid "Delay" +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +msgid "Random Delay" +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +msgid "Add Amount" +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +msgid "Blend Amount" +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +msgid "Seek Position" +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +msgid "Input Count" +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +#: scene/animation/animation_node_state_machine.cpp +msgid "Xfade Time" +msgstr "" + +#: scene/animation/animation_node_state_machine.cpp +msgid "Switch Mode" +msgstr "" + +#: scene/animation/animation_node_state_machine.cpp +msgid "Auto Advance" +msgstr "" + +#: scene/animation/animation_node_state_machine.cpp +msgid "Advance Condition" +msgstr "" + +#: scene/animation/animation_player.cpp +msgid "Anim Apply Reset" +msgstr "" + +#: scene/animation/animation_player.cpp +msgid "Current Animation" +msgstr "" + +#: scene/animation/animation_player.cpp +msgid "Assigned Animation" +msgstr "" + +#: scene/animation/animation_player.cpp +msgid "Reset On Save" +msgstr "" + +#: scene/animation/animation_player.cpp +msgid "Current Animation Length" +msgstr "" + +#: scene/animation/animation_player.cpp +msgid "Current Animation Position" +msgstr "" + +#: scene/animation/animation_player.cpp +msgid "Playback Options" +msgstr "" + +#: scene/animation/animation_player.cpp +msgid "Default Blend Time" +msgstr "" + +#: scene/animation/animation_player.cpp +msgid "Method Call Mode" +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "In node '%s', invalid animation: '%s'." +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "Invalid animation: '%s'." +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "Nothing connected to input '%s' of node '%s'." +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "No root AnimationNode for the graph is set." +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "Path to an AnimationPlayer node containing animations is not set." +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "The AnimationPlayer root node is not a valid node." +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "Tree Root" +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "Anim Player" +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "Root Motion" +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "Track" +msgstr "" + +#: scene/animation/animation_tree_player.cpp +msgid "This node has been deprecated. Use AnimationTree instead." +msgstr "" + +#: scene/animation/animation_tree_player.cpp +msgid "Playback" +msgstr "" + +#: scene/animation/animation_tree_player.cpp +msgid "Master Player" +msgstr "" + +#: scene/animation/animation_tree_player.cpp +msgid "Base Path" +msgstr "" + +#: scene/animation/root_motion_view.cpp +msgid "Animation Path" +msgstr "" + +#: scene/animation/root_motion_view.cpp +msgid "Zero Y" +msgstr "" + +#: scene/animation/skeleton_ik.cpp +msgid "Root Bone" +msgstr "" + +#: scene/animation/skeleton_ik.cpp +msgid "Tip Bone" +msgstr "" + +#: scene/animation/skeleton_ik.cpp +msgid "Interpolation" +msgstr "" + +#: scene/animation/skeleton_ik.cpp +msgid "Override Tip Basis" +msgstr "" + +#: scene/animation/skeleton_ik.cpp +msgid "Use Magnet" +msgstr "" + +#: scene/animation/skeleton_ik.cpp +msgid "Magnet" +msgstr "" + +#: scene/animation/skeleton_ik.cpp +msgid "Target Node" +msgstr "" + +#: scene/animation/skeleton_ik.cpp +msgid "Max Iterations" +msgstr "" + +#: scene/animation/tween.cpp +msgid "Playback Process Mode" +msgstr "" + +#: scene/animation/tween.cpp +msgid "Playback Speed" +msgstr "" + +#: scene/audio/audio_stream_player.cpp +msgid "Mix Target" +msgstr "" + +#: scene/gui/aspect_ratio_container.cpp scene/gui/range.cpp +#: servers/audio/effects/audio_effect_compressor.cpp +msgid "Ratio" +msgstr "" + +#: scene/gui/aspect_ratio_container.cpp scene/gui/texture_button.cpp +#: scene/gui/texture_rect.cpp +msgid "Stretch Mode" +msgstr "" + +#: scene/gui/aspect_ratio_container.cpp scene/gui/box_container.cpp +msgid "Alignment" +msgstr "" + +#: scene/gui/base_button.cpp +msgid "Shortcut In Tooltip" +msgstr "" + +#: scene/gui/base_button.cpp +msgid "Action Mode" +msgstr "" + +#: scene/gui/base_button.cpp +msgid "Enabled Focus Mode" +msgstr "" + +#: scene/gui/base_button.cpp +msgid "Keep Pressed Outside" +msgstr "" + +#: scene/gui/base_button.cpp scene/gui/shortcut.cpp +msgid "Shortcut" +msgstr "" + +#: scene/gui/base_button.cpp +msgid "Group" +msgstr "" + +#: scene/gui/button.cpp scene/gui/label.cpp +msgid "Clip Text" +msgstr "" + +#: scene/gui/button.cpp scene/gui/label.cpp scene/gui/line_edit.cpp +#: scene/gui/spin_box.cpp +msgid "Align" +msgstr "" + +#: scene/gui/button.cpp +msgid "Icon Align" +msgstr "" + +#: scene/gui/button.cpp +msgid "Expand Icon" +msgstr "" + +#: scene/gui/center_container.cpp +msgid "Use Top Left" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "" +"Color: #%s\n" +"LMB: Apply color\n" +"RMB: Remove preset" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Edit Alpha" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "HSV Mode" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Raw Mode" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Deferred Mode" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Presets Enabled" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Presets Visible" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Pick a color from the editor window." +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "HSV" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Switch between hexadecimal and code values." +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset." +msgstr "" + +#: scene/gui/container.cpp +msgid "" +"Container by itself serves no purpose unless a script configures its " +"children placement behavior.\n" +"If you don't intend to add a script, use a plain Control node instead." +msgstr "" + +#: scene/gui/control.cpp +msgid "Theme Overrides" +msgstr "" + +#: scene/gui/control.cpp +msgid "" +"The Hint Tooltip won't be displayed as the control's Mouse Filter is set to " +"\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"." +msgstr "" + +#: scene/gui/control.cpp +msgid "Anchor" +msgstr "" + +#: scene/gui/control.cpp +msgid "Grow Direction" +msgstr "" + +#: scene/gui/control.cpp scene/resources/navigation_mesh.cpp +msgid "Min Size" +msgstr "" + +#: scene/gui/control.cpp +msgid "Pivot Offset" +msgstr "" + +#: scene/gui/control.cpp +msgid "Clip Content" +msgstr "" + +#: scene/gui/control.cpp scene/resources/visual_shader_nodes.cpp +msgid "Hint" +msgstr "" + +#: scene/gui/control.cpp +msgid "Tooltip" +msgstr "" + +#: scene/gui/control.cpp scene/resources/default_theme/default_theme.cpp +msgid "Focus" +msgstr "" + +#: scene/gui/control.cpp +msgid "Neighbour Left" +msgstr "" + +#: scene/gui/control.cpp +msgid "Neighbour Top" +msgstr "" + +#: scene/gui/control.cpp +msgid "Neighbour Right" +msgstr "" + +#: scene/gui/control.cpp +msgid "Neighbour Bottom" +msgstr "" + +#: scene/gui/control.cpp +msgid "Next" +msgstr "" + +#: scene/gui/control.cpp +msgid "Previous" +msgstr "" + +#: scene/gui/control.cpp +msgid "Mouse" +msgstr "" + +#: scene/gui/control.cpp +msgid "Default Cursor Shape" +msgstr "" + +#: scene/gui/control.cpp +msgid "Pass On Modal Close Click" +msgstr "" + +#: scene/gui/control.cpp +msgid "Size Flags" +msgstr "" + +#: scene/gui/control.cpp +msgid "Stretch Ratio" +msgstr "" + +#: scene/gui/control.cpp +msgid "Theme Type Variation" +msgstr "" + +#: scene/gui/dialogs.cpp +msgid "Window Title" +msgstr "" + +#: scene/gui/dialogs.cpp +msgid "Dialog" +msgstr "" + +#: scene/gui/dialogs.cpp +msgid "Hide On OK" +msgstr "" + +#: scene/gui/dialogs.cpp +msgid "Alert!" +msgstr "" + +#: scene/gui/dialogs.cpp +msgid "Please Confirm..." +msgstr "" + +#: scene/gui/file_dialog.cpp +msgid "Mode Overrides Title" +msgstr "" + +#: scene/gui/file_dialog.cpp +msgid "Must use a valid extension." +msgstr "" + +#: scene/gui/graph_edit.cpp +msgid "Right Disconnects" +msgstr "" + +#: scene/gui/graph_edit.cpp +msgid "Scroll Offset" +msgstr "" + +#: scene/gui/graph_edit.cpp +msgid "Snap Distance" +msgstr "" + +#: scene/gui/graph_edit.cpp +msgid "Zoom Min" +msgstr "" + +#: scene/gui/graph_edit.cpp +msgid "Zoom Max" +msgstr "" + +#: scene/gui/graph_edit.cpp +msgid "Zoom Step" +msgstr "" + +#: scene/gui/graph_edit.cpp +msgid "Show Zoom Label" +msgstr "" + +#: scene/gui/graph_edit.cpp scene/gui/text_edit.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Minimap" +msgstr "" + +#: scene/gui/graph_edit.cpp +msgid "Enable grid minimap." +msgstr "" + +#: scene/gui/graph_node.cpp +msgid "Show Close" +msgstr "" + +#: scene/gui/graph_node.cpp scene/gui/option_button.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Selected" +msgstr "" + +#: scene/gui/graph_node.cpp scene/resources/default_theme/default_theme.cpp +msgid "Comment" +msgstr "" + +#: scene/gui/graph_node.cpp +msgid "Overlay" +msgstr "" + +#: scene/gui/grid_container.cpp scene/gui/item_list.cpp scene/gui/tree.cpp +msgid "Columns" +msgstr "" + +#: scene/gui/item_list.cpp scene/gui/popup_menu.cpp scene/gui/text_edit.cpp +#: scene/gui/tree.cpp scene/main/viewport.cpp +msgid "Timers" +msgstr "" + +#: scene/gui/item_list.cpp scene/gui/popup_menu.cpp scene/gui/tree.cpp +msgid "Incremental Search Max Interval Msec" +msgstr "" + +#: scene/gui/item_list.cpp scene/gui/tree.cpp +msgid "Allow Reselect" +msgstr "" + +#: scene/gui/item_list.cpp scene/gui/tree.cpp +msgid "Allow RMB Select" +msgstr "" + +#: scene/gui/item_list.cpp +msgid "Max Text Lines" +msgstr "" + +#: scene/gui/item_list.cpp +msgid "Auto Height" +msgstr "" + +#: scene/gui/item_list.cpp +msgid "Max Columns" +msgstr "" + +#: scene/gui/item_list.cpp +msgid "Same Column Width" +msgstr "" + +#: scene/gui/item_list.cpp +msgid "Fixed Column Width" +msgstr "" + +#: scene/gui/item_list.cpp +msgid "Icon Scale" +msgstr "" + +#: scene/gui/item_list.cpp +msgid "Fixed Icon Size" +msgstr "" + +#: scene/gui/label.cpp +msgid "V Align" +msgstr "" + +#: scene/gui/label.cpp scene/gui/rich_text_label.cpp +msgid "Visible Characters" +msgstr "" + +#: scene/gui/label.cpp scene/gui/rich_text_label.cpp +msgid "Percent Visible" +msgstr "" + +#: scene/gui/label.cpp +msgid "Lines Skipped" +msgstr "" + +#: scene/gui/label.cpp +msgid "Max Lines Visible" +msgstr "" + +#: scene/gui/line_edit.cpp scene/resources/navigation_mesh.cpp +msgid "Max Length" +msgstr "" + +#: scene/gui/line_edit.cpp +msgid "Secret" +msgstr "" + +#: scene/gui/line_edit.cpp +msgid "Secret Character" +msgstr "" + +#: scene/gui/line_edit.cpp +msgid "Expand To Text Length" +msgstr "" + +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Context Menu Enabled" +msgstr "" + +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Virtual Keyboard Enabled" +msgstr "" + +#: scene/gui/line_edit.cpp +msgid "Clear Button Enabled" +msgstr "" + +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Shortcut Keys Enabled" +msgstr "" + +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Middle Mouse Paste Enabled" +msgstr "" + +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Selecting Enabled" +msgstr "" + +#: scene/gui/line_edit.cpp scene/gui/rich_text_label.cpp +#: scene/gui/text_edit.cpp +msgid "Deselect On Focus Loss Enabled" +msgstr "" + +#: scene/gui/line_edit.cpp +msgid "Right Icon" +msgstr "" + +#: scene/gui/line_edit.cpp +msgid "Placeholder" +msgstr "" + +#: scene/gui/line_edit.cpp +msgid "Alpha" +msgstr "" + +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Caret" +msgstr "" + +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Blink" +msgstr "" + +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Blink Speed" +msgstr "" + +#: scene/gui/link_button.cpp +msgid "Underline" +msgstr "" + +#: scene/gui/menu_button.cpp +msgid "Switch On Hover" +msgstr "" + +#: scene/gui/nine_patch_rect.cpp scene/resources/style_box.cpp +msgid "Draw Center" +msgstr "" + +#: scene/gui/nine_patch_rect.cpp scene/resources/style_box.cpp +msgid "Region Rect" +msgstr "" + +#: scene/gui/nine_patch_rect.cpp +msgid "Patch Margin" +msgstr "" + +#: scene/gui/nine_patch_rect.cpp scene/resources/style_box.cpp +msgid "Axis Stretch" +msgstr "" + +#: scene/gui/nine_patch_rect.cpp +msgid "" +"The Tile and Tile Fit options for Axis Stretch properties are only effective " +"when using the GLES3 rendering backend.\n" +"The GLES2 backend is currently in use, so these modes will act like Stretch " +"instead." +msgstr "" + +#: scene/gui/popup.cpp +msgid "Popup" +msgstr "" + +#: scene/gui/popup.cpp +msgid "Exclusive" +msgstr "" + +#: scene/gui/popup.cpp +msgid "" +"Popups will hide by default unless you call popup() or any of the popup*() " +"functions. Making them visible for editing is fine, but they will hide upon " +"running." +msgstr "" + +#: scene/gui/popup_menu.cpp +msgid "Hide On Item Selection" +msgstr "" + +#: scene/gui/popup_menu.cpp +msgid "Hide On Checkable Item Selection" +msgstr "" + +#: scene/gui/popup_menu.cpp +msgid "Hide On State Item Selection" +msgstr "" + +#: scene/gui/popup_menu.cpp +msgid "Submenu Popup Delay" +msgstr "" + +#: scene/gui/popup_menu.cpp +msgid "Allow Search" +msgstr "" + +#: scene/gui/progress_bar.cpp +msgid "Percent" +msgstr "" + +#: scene/gui/range.cpp +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." +msgstr "" + +#: scene/gui/range.cpp scene/resources/curve.cpp +msgid "Min Value" +msgstr "" + +#: scene/gui/range.cpp scene/resources/curve.cpp +msgid "Max Value" +msgstr "" + +#: scene/gui/range.cpp +msgid "Page" +msgstr "" + +#: scene/gui/range.cpp +msgid "Exp Edit" +msgstr "" + +#: scene/gui/range.cpp +msgid "Rounded" +msgstr "" + +#: scene/gui/range.cpp +msgid "Allow Greater" +msgstr "" + +#: scene/gui/range.cpp +msgid "Allow Lesser" +msgstr "" + +#: scene/gui/reference_rect.cpp +msgid "Border Color" +msgstr "" + +#: scene/gui/reference_rect.cpp scene/resources/style_box.cpp +msgid "Border Width" +msgstr "" + +#: scene/gui/rich_text_effect.cpp +msgid "Relative Index" +msgstr "" + +#: scene/gui/rich_text_effect.cpp +msgid "Absolute Index" +msgstr "" + +#: scene/gui/rich_text_effect.cpp +msgid "Elapsed Time" +msgstr "" + +#: scene/gui/rich_text_effect.cpp +msgid "Env" +msgstr "" + +#: scene/gui/rich_text_effect.cpp +msgid "Character" +msgstr "" + +#: scene/gui/rich_text_label.cpp +msgid "BBCode" +msgstr "" + +#: scene/gui/rich_text_label.cpp +msgid "Meta Underlined" +msgstr "" + +#: scene/gui/rich_text_label.cpp +msgid "Tab Size" +msgstr "" + +#: scene/gui/rich_text_label.cpp +msgid "Fit Content Height" +msgstr "" + +#: scene/gui/rich_text_label.cpp +msgid "Scroll Active" +msgstr "" + +#: scene/gui/rich_text_label.cpp +msgid "Scroll Following" +msgstr "" + +#: scene/gui/rich_text_label.cpp +msgid "Selection Enabled" +msgstr "" + +#: scene/gui/rich_text_label.cpp scene/gui/text_edit.cpp +msgid "Override Selected Font Color" +msgstr "" + +#: scene/gui/rich_text_label.cpp +msgid "Custom Effects" +msgstr "" + +#: scene/gui/scroll_bar.cpp +msgid "Custom Step" +msgstr "" + +#: scene/gui/scroll_container.cpp +msgid "" +"ScrollContainer is intended to work with a single child control.\n" +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " +"minimum size manually." +msgstr "" + +#: scene/gui/scroll_container.cpp +msgid "Follow Focus" +msgstr "" + +#: scene/gui/scroll_container.cpp +msgid "Horizontal Enabled" +msgstr "" + +#: scene/gui/scroll_container.cpp +msgid "Vertical Enabled" +msgstr "" + +#: scene/gui/scroll_container.cpp +msgid "Default Scroll Deadzone" +msgstr "" + +#: scene/gui/slider.cpp +msgid "Scrollable" +msgstr "" + +#: scene/gui/slider.cpp +msgid "Tick Count" +msgstr "" + +#: scene/gui/slider.cpp +msgid "Ticks On Borders" +msgstr "" + +#: scene/gui/spin_box.cpp +msgid "Prefix" +msgstr "" + +#: scene/gui/spin_box.cpp +msgid "Suffix" +msgstr "" + +#: scene/gui/split_container.cpp +msgid "Split Offset" +msgstr "" + +#: scene/gui/split_container.cpp scene/gui/tree.cpp +msgid "Collapsed" +msgstr "" + +#: scene/gui/split_container.cpp +msgid "Dragger Visibility" +msgstr "" + +#: scene/gui/tab_container.cpp scene/gui/tabs.cpp +msgid "Tab Align" +msgstr "" + +#: scene/gui/tab_container.cpp scene/gui/tabs.cpp +msgid "Current Tab" +msgstr "" + +#: scene/gui/tab_container.cpp +msgid "Tabs Visible" +msgstr "" + +#: scene/gui/tab_container.cpp +msgid "All Tabs In Front" +msgstr "" + +#: scene/gui/tab_container.cpp scene/gui/tabs.cpp +msgid "Drag To Rearrange Enabled" +msgstr "" + +#: scene/gui/tab_container.cpp +msgid "Use Hidden Tabs For Min Size" +msgstr "" + +#: scene/gui/tabs.cpp +msgid "Tab Close Display Policy" +msgstr "" + +#: scene/gui/tabs.cpp +msgid "Scrolling Enabled" +msgstr "" + +#: scene/gui/text_edit.cpp +msgid "Readonly" +msgstr "" + +#: scene/gui/text_edit.cpp +msgid "Bookmark Gutter" +msgstr "" + +#: scene/gui/text_edit.cpp +msgid "Breakpoint Gutter" +msgstr "" + +#: scene/gui/text_edit.cpp +msgid "Fold Gutter" +msgstr "" + +#: scene/gui/text_edit.cpp +msgid "Drag And Drop Selection Enabled" +msgstr "" + +#: scene/gui/text_edit.cpp +msgid "Hiding Enabled" +msgstr "" + +#: scene/gui/text_edit.cpp +msgid "Wrap Enabled" +msgstr "" + +#: scene/gui/text_edit.cpp +msgid "Scroll Vertical" +msgstr "" + +#: scene/gui/text_edit.cpp +msgid "Scroll Horizontal" +msgstr "" + +#: scene/gui/text_edit.cpp +msgid "Draw" +msgstr "" + +#: scene/gui/text_edit.cpp +msgid "Block Mode" +msgstr "" + +#: scene/gui/text_edit.cpp +msgid "Moving By Right Click" +msgstr "" + +#: scene/gui/text_edit.cpp +msgid "Text Edit Idle Detect (sec)" +msgstr "" + +#: scene/gui/text_edit.cpp +msgid "Text Edit Undo Stack Max Size" +msgstr "" + +#: scene/gui/texture_button.cpp scene/resources/default_theme/default_theme.cpp +msgid "Hover" +msgstr "" + +#: scene/gui/texture_button.cpp +msgid "Focused" +msgstr "" + +#: scene/gui/texture_button.cpp +msgid "Click Mask" +msgstr "" + +#: scene/gui/texture_button.cpp scene/gui/texture_rect.cpp +#: scene/gui/video_player.cpp +msgid "Expand" +msgstr "" + +#: scene/gui/texture_progress.cpp +msgid "Under" +msgstr "" + +#: scene/gui/texture_progress.cpp +msgid "Over" +msgstr "" + +#: scene/gui/texture_progress.cpp +msgid "Progress" +msgstr "" + +#: scene/gui/texture_progress.cpp +msgid "Progress Offset" +msgstr "" + +#: scene/gui/texture_progress.cpp +msgid "Fill Mode" +msgstr "" + +#: scene/gui/texture_progress.cpp scene/resources/material.cpp +msgid "Tint" +msgstr "" + +#: scene/gui/texture_progress.cpp +msgid "Radial Fill" +msgstr "" + +#: scene/gui/texture_progress.cpp +msgid "Initial Angle" +msgstr "" + +#: scene/gui/texture_progress.cpp +msgid "Fill Degrees" +msgstr "" + +#: scene/gui/texture_progress.cpp scene/resources/primitive_meshes.cpp +msgid "Center Offset" +msgstr "" + +#: scene/gui/texture_progress.cpp +msgid "Nine Patch Stretch" +msgstr "" + +#: scene/gui/texture_progress.cpp +msgid "Stretch Margin Left" +msgstr "" + +#: scene/gui/texture_progress.cpp +msgid "Stretch Margin Top" +msgstr "" + +#: scene/gui/texture_progress.cpp +msgid "Stretch Margin Right" +msgstr "" + +#: scene/gui/texture_progress.cpp +msgid "Stretch Margin Bottom" +msgstr "" + +#: scene/gui/tree.cpp +msgid "Custom Minimum Height" +msgstr "" + +#: scene/gui/tree.cpp +msgid "(Other)" +msgstr "" + +#: scene/gui/tree.cpp +msgid "Column Titles Visible" +msgstr "" + +#: scene/gui/tree.cpp +msgid "Hide Folding" +msgstr "" + +#: scene/gui/tree.cpp +msgid "Hide Root" +msgstr "" + +#: scene/gui/tree.cpp +msgid "Drop Mode Flags" +msgstr "" + +#: scene/gui/video_player.cpp +msgid "Audio Track" +msgstr "" + +#: scene/gui/video_player.cpp scene/main/scene_tree.cpp scene/main/timer.cpp +msgid "Paused" +msgstr "" + +#: scene/gui/video_player.cpp +msgid "Buffering Msec" +msgstr "" + +#: scene/gui/video_player.cpp +msgid "Stream Position" +msgstr "" + +#: scene/gui/viewport_container.cpp +msgid "Stretch Shrink" +msgstr "" + +#: scene/main/canvas_layer.cpp +msgid "Follow Viewport" +msgstr "" + +#: scene/main/http_request.cpp +msgid "Download File" +msgstr "" + +#: scene/main/http_request.cpp +msgid "Download Chunk Size" +msgstr "" + +#: scene/main/http_request.cpp +msgid "Body Size Limit" +msgstr "" + +#: scene/main/http_request.cpp +msgid "Max Redirects" +msgstr "" + +#: scene/main/http_request.cpp +msgid "Timeout" +msgstr "" + +#: scene/main/node.cpp +msgid "" +"Setting node name '%s' to be unique within scene for '%s', but it's already " +"claimed by '%s'. This node is no longer set unique." +msgstr "" + +#: scene/main/node.cpp +msgid "Name Num Separator" +msgstr "" + +#: scene/main/node.cpp +msgid "Name Casing" +msgstr "" + +#: scene/main/node.cpp +msgid "Editor Description" +msgstr "" + +#: scene/main/node.cpp +msgid "Pause Mode" +msgstr "" + +#: scene/main/node.cpp +msgid "Physics Interpolation Mode" +msgstr "" + +#: scene/main/node.cpp +msgid "Display Folded" +msgstr "" + +#: scene/main/node.cpp +msgid "Filename" +msgstr "" + +#: scene/main/node.cpp +msgid "Owner" +msgstr "" + +#: scene/main/node.cpp scene/main/scene_tree.cpp +msgid "Multiplayer" +msgstr "" + +#: scene/main/node.cpp +msgid "Custom Multiplayer" +msgstr "" + +#: scene/main/node.cpp +msgid "Process Priority" +msgstr "" + +#: scene/main/scene_tree.cpp scene/main/timer.cpp +msgid "Time Left" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Debug Collisions Hint" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Debug Navigation Hint" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Use Font Oversampling" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Edited Scene Root" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Root" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Multiplayer Poll" +msgstr "" + +#: scene/main/scene_tree.cpp scene/resources/mesh_library.cpp +#: scene/resources/shape_2d.cpp +msgid "Shapes" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Shape Color" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Contact Color" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Geometry Color" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Disabled Geometry Color" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Max Contacts Displayed" +msgstr "" + +#: scene/main/scene_tree.cpp scene/resources/shape_2d.cpp +msgid "Draw 2D Outlines" +msgstr "" + +#: scene/main/scene_tree.cpp servers/visual_server.cpp +msgid "Reflections" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Atlas Size" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Atlas Subdiv" +msgstr "" + +#: scene/main/scene_tree.cpp scene/main/viewport.cpp +msgid "MSAA" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Use FXAA" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Use Debanding" +msgstr "" + +#: scene/main/scene_tree.cpp scene/main/viewport.cpp +msgid "HDR" +msgstr "" + +#: scene/main/scene_tree.cpp scene/main/viewport.cpp +msgid "Use 32 BPC Depth" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Default Environment" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "" +"Default Environment as specified in Project Settings (Rendering -> " +"Environment -> Default Environment) could not be loaded." +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Enable Object Picking" +msgstr "" + +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + +#: scene/main/timer.cpp +msgid "Autostart" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Viewport Path" +msgstr "" + +#: scene/main/viewport.cpp +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." +msgstr "" + +#: scene/main/viewport.cpp +msgid "" +"This Viewport has HDR enabled, but its Usage is set to 2D or 2D No-" +"Sampling.\n" +"HDR is only supported in Viewports that have their Usage set to 3D or 3D No-" +"Effects.\n" +"HDR will be disabled for this Viewport." +msgstr "" + +#: scene/main/viewport.cpp +msgid "ARVR" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Size Override Stretch" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Own World" +msgstr "" + +#: scene/main/viewport.cpp scene/resources/world_2d.cpp +msgid "World" +msgstr "" + +#: scene/main/viewport.cpp +msgid "World 2D" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Transparent BG" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Handle Input Locally" +msgstr "" + +#: scene/main/viewport.cpp +msgid "FXAA" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Debanding" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Disable 3D" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Keep 3D Linear" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Render Direct To Screen" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Debug Draw" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Render Target" +msgstr "" + +#: scene/main/viewport.cpp +msgid "V Flip" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Clear Mode" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Enable 2D" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Enable 3D" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Object Picking" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Disable Input" +msgstr "" + +#: scene/main/viewport.cpp servers/visual_server.cpp +msgid "Shadow Atlas" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Quad 0" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Quad 1" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Quad 2" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Quad 3" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Canvas Transform" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Global Canvas Transform" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Tooltip Delay (sec)" +msgstr "" + +#: scene/register_scene_types.cpp +msgid "Swap OK Cancel" +msgstr "" + +#: scene/register_scene_types.cpp +msgid "Layer Names" +msgstr "" + +#: scene/register_scene_types.cpp +msgid "2D Render" +msgstr "" + +#: scene/register_scene_types.cpp +msgid "3D Render" +msgstr "" + +#: scene/register_scene_types.cpp +msgid "2D Physics" +msgstr "" + +#: scene/register_scene_types.cpp +msgid "3D Physics" +msgstr "" + +#: scene/register_scene_types.cpp +msgid "2D Navigation" +msgstr "" + +#: scene/register_scene_types.cpp +msgid "3D Navigation" +msgstr "" + +#: scene/register_scene_types.cpp +msgid "Use hiDPI" +msgstr "" + +#: scene/register_scene_types.cpp +msgid "Custom" +msgstr "" + +#: scene/register_scene_types.cpp +msgid "Custom Font" +msgstr "" + +#: scene/resources/audio_stream_sample.cpp +#: servers/audio/effects/audio_stream_generator.cpp servers/audio_server.cpp +msgid "Mix Rate" +msgstr "" + +#: scene/resources/audio_stream_sample.cpp +msgid "Stereo" +msgstr "" + +#: scene/resources/concave_polygon_shape_2d.cpp +msgid "Segments" +msgstr "" + +#: scene/resources/curve.cpp +msgid "Bake Resolution" +msgstr "" + +#: scene/resources/curve.cpp +msgid "Bake Interval" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Panel" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Color" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Color Pressed" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Color Hover" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Color Focus" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Color Disabled" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "H Separation" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Underline Spacing" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Arrow" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Arrow Margin" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Hover Pressed" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Checked Disabled" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Unchecked" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Unchecked Disabled" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Radio Checked" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Radio Checked Disabled" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Radio Unchecked" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Radio Unchecked Disabled" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Color Hover Pressed" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Check V Adjust" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "On Disabled" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Off" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Off Disabled" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Color Shadow" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Outline Modulate" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Shadow Offset X" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Shadow Offset Y" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Shadow As Outline" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Color Selected" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Color Uneditable" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Cursor Color" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Clear Button Color" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Clear Button Color Pressed" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Minimum Spaces" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "BG" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "FG" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Tab" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +#: scene/resources/dynamic_font.cpp scene/resources/world.cpp +#: scene/resources/world_2d.cpp +msgid "Space" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Folded" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Fold" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Color Readonly" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Completion Lines" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Completion Max Width" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Completion Scroll Width" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Scroll Focus" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Grabber" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Grabber Highlight" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Grabber Pressed" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Increment" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Increment Highlight" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Increment Pressed" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Decrement" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Decrement Highlight" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Decrement Pressed" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Slider" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Grabber Area" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Grabber Area Highlight" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Grabber Disabled" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Tick" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Updown" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Scaleborder Size" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Title Font" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Title Color" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Title Height" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Close Highlight" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Close H Offset" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Close V Offset" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Parent Folder" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Toggle Hidden" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Panel Disabled" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Labeled Separator Left" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Labeled Separator Right" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Separator" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Color Accel" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Color Separator" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "V Separation" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Selected Frame" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Default Frame" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Default Focus" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Comment Focus" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Breakpoint" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Resizer" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Close Color" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Resizer Color" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Title Offset" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Close Offset" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Port Offset" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "BG Focus" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Selected Focus" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Cursor Unfocused" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Button Pressed" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Title Button Normal" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Title Button Pressed" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Title Button Hover" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Custom Button" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Custom Button Pressed" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Custom Button Hover" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Select Arrow" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Arrow Collapsed" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Title Button Font" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Title Button Color" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Guide Color" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Drop Position Color" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Relationship Line Color" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Custom Button Font Highlight" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Item Margin" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Button Margin" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Draw Relationship Lines" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Draw Guides" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Scroll Border" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Scroll Speed" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Icon Margin" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Line Separation" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Tab FG" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Tab BG" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Tab Disabled" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Menu" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Menu Highlight" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Color FG" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Color BG" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Side Margin" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Top Margin" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Label V Align FG" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Label V Align BG" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Large" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Folder" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Folder Icon Modulate" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "File Icon Modulate" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Files Disabled" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "SV Width" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "SV Height" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "H Width" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Label Width" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Screen Picker" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Add Preset" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Color Hue" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Color Sample" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Preset BG" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Overbright Indicator" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Preset FG" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Preset BG Icon" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Normal Font" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Bold Font" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Italics Font" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Bold Italics Font" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Mono Font" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Table H Separation" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Table V Separation" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Margin Left" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Margin Top" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Margin Right" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Margin Bottom" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Autohide" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Minus" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "More" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Grid Minor" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Grid Major" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Selection Fill" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Selection Stroke" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Activity" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Bezier Len Pos" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Bezier Len Neg" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Port Grab Distance Horizontal" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Port Grab Distance Vertical" +msgstr "" + +#: scene/resources/dynamic_font.cpp +msgid "Hinting" +msgstr "" + +#: scene/resources/dynamic_font.cpp +msgid "Override Oversampling" +msgstr "" + +#: scene/resources/dynamic_font.cpp +msgid "Font Path" +msgstr "" + +#: scene/resources/dynamic_font.cpp +msgid "Outline Size" +msgstr "" + +#: scene/resources/dynamic_font.cpp +msgid "Outline Color" +msgstr "" + +#: scene/resources/dynamic_font.cpp +msgid "Use Mipmaps" +msgstr "" + +#: scene/resources/dynamic_font.cpp +msgid "Extra Spacing" +msgstr "" + +#: scene/resources/dynamic_font.cpp +msgid "Char" +msgstr "" + +#: scene/resources/dynamic_font.cpp +msgid "Font Data" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Background" +msgstr "" + +#: scene/resources/environment.cpp scene/resources/sky.cpp +msgid "Sky" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Sky Custom FOV" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Sky Orientation" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Sky Rotation" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Sky Rotation Degrees" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Canvas Max Layer" +msgstr "" + +#: scene/resources/environment.cpp scene/resources/texture.cpp +msgid "Camera Feed ID" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Ambient Light" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Sky Contribution" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Fog" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Sun Color" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Sun Amount" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Depth Enabled" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Depth Begin" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Depth End" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Depth Curve" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Transmit Enabled" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Transmit Curve" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Height Enabled" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Height Min" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Height Max" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Height Curve" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Tonemap" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Exposure" +msgstr "" + +#: scene/resources/environment.cpp +msgid "White" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Auto Exposure" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Min Luma" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Max Luma" +msgstr "" + +#: scene/resources/environment.cpp +msgid "SS Reflections" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Max Steps" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Fade In" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Fade Out" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Depth Tolerance" +msgstr "" + +#: scene/resources/environment.cpp scene/resources/material.cpp +msgid "Roughness" +msgstr "" + +#: scene/resources/environment.cpp +msgid "SSAO" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Radius 2" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Intensity 2" +msgstr "" + +#: scene/resources/environment.cpp scene/resources/material.cpp +msgid "Light Affect" +msgstr "" + +#: scene/resources/environment.cpp +msgid "AO Channel Affect" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Blur" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Edge Sharpness" +msgstr "" + +#: scene/resources/environment.cpp +msgid "DOF Far Blur" +msgstr "" + +#: scene/resources/environment.cpp scene/resources/material.cpp +msgid "Distance" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Transition" +msgstr "" + +#: scene/resources/environment.cpp +msgid "DOF Near Blur" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Glow" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Levels" +msgstr "" + +#: scene/resources/environment.cpp +#: servers/audio/effects/audio_effect_chorus.cpp +msgid "1" +msgstr "" + +#: scene/resources/environment.cpp +#: servers/audio/effects/audio_effect_chorus.cpp +msgid "2" +msgstr "" + +#: scene/resources/environment.cpp +#: servers/audio/effects/audio_effect_chorus.cpp +msgid "3" +msgstr "" + +#: scene/resources/environment.cpp +#: servers/audio/effects/audio_effect_chorus.cpp +msgid "4" +msgstr "" + +#: scene/resources/environment.cpp +msgid "5" +msgstr "" + +#: scene/resources/environment.cpp +msgid "6" +msgstr "" + +#: scene/resources/environment.cpp +msgid "7" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Bloom" +msgstr "" + +#: scene/resources/environment.cpp +msgid "HDR Threshold" +msgstr "" + +#: scene/resources/environment.cpp +msgid "HDR Luminance Cap" +msgstr "" + +#: scene/resources/environment.cpp +msgid "HDR Scale" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Bicubic Upscale" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Adjustments" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Brightness" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Saturation" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Color Correction" +msgstr "" + +#: scene/resources/font.cpp +msgid "Ascent" +msgstr "" + +#: scene/resources/font.cpp +msgid "Distance Field" +msgstr "" + +#: scene/resources/gradient.cpp +msgid "Raw Data" +msgstr "" + +#: scene/resources/gradient.cpp +msgid "Offsets" +msgstr "" + +#: scene/resources/height_map_shape.cpp +msgid "Map Width" +msgstr "" + +#: scene/resources/height_map_shape.cpp +msgid "Map Depth" +msgstr "" + +#: scene/resources/height_map_shape.cpp +msgid "Map Data" +msgstr "" + +#: scene/resources/line_shape_2d.cpp +msgid "D" +msgstr "" + +#: scene/resources/material.cpp +msgid "Next Pass" +msgstr "" + +#: scene/resources/material.cpp +msgid "Use Shadow To Opacity" +msgstr "" + +#: scene/resources/material.cpp +msgid "Unshaded" +msgstr "" + +#: scene/resources/material.cpp +msgid "Vertex Lighting" +msgstr "" + +#: scene/resources/material.cpp +msgid "Use Point Size" +msgstr "" + +#: scene/resources/material.cpp +msgid "World Triplanar" +msgstr "" + +#: scene/resources/material.cpp +msgid "Albedo Tex Force sRGB" +msgstr "" + +#: scene/resources/material.cpp +msgid "Do Not Receive Shadows" +msgstr "" + +#: scene/resources/material.cpp +msgid "Disable Ambient Light" +msgstr "" + +#: scene/resources/material.cpp +msgid "Ensure Correct Normals" +msgstr "" + +#: scene/resources/material.cpp +msgid "Albedo Tex MSDF" +msgstr "" + +#: scene/resources/material.cpp +msgid "Vertex Color" +msgstr "" + +#: scene/resources/material.cpp +msgid "Use As Albedo" +msgstr "" + +#: scene/resources/material.cpp +msgid "Is sRGB" +msgstr "" + +#: scene/resources/material.cpp servers/visual_server.cpp +msgid "Parameters" +msgstr "" + +#: scene/resources/material.cpp +msgid "Diffuse Mode" +msgstr "" + +#: scene/resources/material.cpp +msgid "Specular Mode" +msgstr "" + +#: scene/resources/material.cpp +msgid "Depth Draw Mode" +msgstr "" + +#: scene/resources/material.cpp +msgid "Line Width" +msgstr "" + +#: scene/resources/material.cpp +msgid "Point Size" +msgstr "" + +#: scene/resources/material.cpp +msgid "Billboard Mode" +msgstr "" + +#: scene/resources/material.cpp +msgid "Billboard Keep Scale" +msgstr "" + +#: scene/resources/material.cpp +msgid "Grow" +msgstr "" + +#: scene/resources/material.cpp +msgid "Grow Amount" +msgstr "" + +#: scene/resources/material.cpp +msgid "Use Alpha Scissor" +msgstr "" + +#: scene/resources/material.cpp +msgid "Particles Anim" +msgstr "" + +#: scene/resources/material.cpp +msgid "H Frames" +msgstr "" + +#: scene/resources/material.cpp +msgid "V Frames" +msgstr "" + +#: scene/resources/material.cpp +msgid "Albedo" +msgstr "" + +#: scene/resources/material.cpp +msgid "Metallic" +msgstr "" + +#: scene/resources/material.cpp +msgid "Texture Channel" +msgstr "" + +#: scene/resources/material.cpp +msgid "Emission" +msgstr "" + +#: scene/resources/material.cpp +msgid "On UV2" +msgstr "" + +#: scene/resources/material.cpp +msgid "NormalMap" +msgstr "" + +#: scene/resources/material.cpp +msgid "Rim" +msgstr "" + +#: scene/resources/material.cpp +msgid "Clearcoat" +msgstr "" + +#: scene/resources/material.cpp +msgid "Gloss" +msgstr "" + +#: scene/resources/material.cpp +msgid "Anisotropy" +msgstr "" + +#: scene/resources/material.cpp +msgid "Flowmap" +msgstr "" + +#: scene/resources/material.cpp +msgid "Ambient Occlusion" +msgstr "" + +#: scene/resources/material.cpp +msgid "Deep Parallax" +msgstr "" + +#: scene/resources/material.cpp +msgid "Min Layers" +msgstr "" + +#: scene/resources/material.cpp +msgid "Max Layers" +msgstr "" + +#: scene/resources/material.cpp +msgid "Flip Tangent" +msgstr "" + +#: scene/resources/material.cpp +msgid "Flip Binormal" +msgstr "" + +#: scene/resources/material.cpp +msgid "Subsurf Scatter" +msgstr "" + +#: scene/resources/material.cpp +msgid "Transmission" +msgstr "" + +#: scene/resources/material.cpp +msgid "Refraction" +msgstr "" + +#: scene/resources/material.cpp +msgid "Detail" +msgstr "" + +#: scene/resources/material.cpp +msgid "UV Layer" +msgstr "" + +#: scene/resources/material.cpp +msgid "UV1" +msgstr "" + +#: scene/resources/material.cpp +msgid "Triplanar" +msgstr "" + +#: scene/resources/material.cpp +msgid "Triplanar Sharpness" +msgstr "" + +#: scene/resources/material.cpp +msgid "UV2" +msgstr "" + +#: scene/resources/material.cpp +msgid "Proximity Fade" +msgstr "" + +#: scene/resources/material.cpp +msgid "Distance Fade" +msgstr "" + +#: scene/resources/material.cpp +msgid "Async Mode" +msgstr "" + +#: scene/resources/mesh.cpp +msgid "Lightmap Size Hint" +msgstr "" + +#: scene/resources/mesh.cpp scene/resources/primitive_meshes.cpp +msgid "Custom AABB" +msgstr "" + +#: scene/resources/mesh_library.cpp +msgid "Mesh Transform" +msgstr "" + +#: scene/resources/mesh_library.cpp +msgid "NavMesh Transform" +msgstr "" + +#: scene/resources/multimesh.cpp +msgid "Color Format" +msgstr "" + +#: scene/resources/multimesh.cpp +msgid "Transform Format" +msgstr "" + +#: scene/resources/multimesh.cpp +msgid "Custom Data Format" +msgstr "" + +#: scene/resources/multimesh.cpp +msgid "Instance Count" +msgstr "" + +#: scene/resources/multimesh.cpp +msgid "Visible Instance Count" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Sampling" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Partition Type" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Parsed Geometry Type" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Source Geometry Mode" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Source Group Name" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Cells" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Agents" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Max Climb" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Max Slope" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Regions" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Merge Size" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Edges" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Max Error" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Verts Per Poly" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Details" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Sample Distance" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Sample Max Error" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Low Hanging Obstacles" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Ledge Spans" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Walkable Low Height Spans" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB Offset" +msgstr "" + +#: scene/resources/occluder_shape.cpp +msgid "Spheres" +msgstr "" + +#: scene/resources/occluder_shape.cpp +msgid "OccluderShapeSphere Set Spheres" +msgstr "" + +#: scene/resources/occluder_shape_polygon.cpp +msgid "Polygon Points" +msgstr "" + +#: scene/resources/occluder_shape_polygon.cpp +msgid "Hole Points" +msgstr "" + +#: scene/resources/packed_scene.cpp +msgid "Bundled" +msgstr "" + +#: scene/resources/particles_material.cpp +msgid "Trail" +msgstr "" + +#: scene/resources/particles_material.cpp +msgid "Divisor" +msgstr "" + +#: scene/resources/particles_material.cpp +msgid "Size Modifier" +msgstr "" + +#: scene/resources/particles_material.cpp +msgid "Color Modifier" +msgstr "" + +#: scene/resources/particles_material.cpp +msgid "Point Texture" +msgstr "" + +#: scene/resources/particles_material.cpp +msgid "Normal Texture" +msgstr "" + +#: scene/resources/particles_material.cpp +msgid "Color Texture" +msgstr "" + +#: scene/resources/particles_material.cpp +msgid "Point Count" +msgstr "" + +#: scene/resources/particles_material.cpp +msgid "Scale Random" +msgstr "" + +#: scene/resources/particles_material.cpp +msgid "Scale Curve" +msgstr "" + +#: scene/resources/physics_material.cpp +msgid "Rough" +msgstr "" + +#: scene/resources/physics_material.cpp +msgid "Absorbent" +msgstr "" + +#: scene/resources/plane_shape.cpp +msgid "Plane" +msgstr "" + +#: scene/resources/primitive_meshes.cpp +msgid "Flip Faces" +msgstr "" + +#: scene/resources/primitive_meshes.cpp +msgid "Mid Height" +msgstr "" + +#: scene/resources/primitive_meshes.cpp +msgid "Subdivide Width" +msgstr "" + +#: scene/resources/primitive_meshes.cpp +msgid "Subdivide Height" +msgstr "" + +#: scene/resources/primitive_meshes.cpp +msgid "Subdivide Depth" +msgstr "" + +#: scene/resources/primitive_meshes.cpp +msgid "Top Radius" +msgstr "" + +#: scene/resources/primitive_meshes.cpp +msgid "Bottom Radius" +msgstr "" + +#: scene/resources/primitive_meshes.cpp +msgid "Left To Right" +msgstr "" + +#: scene/resources/primitive_meshes.cpp +msgid "Is Hemisphere" +msgstr "" + +#: scene/resources/primitive_meshes.cpp +msgid "Curve Step" +msgstr "" + +#: scene/resources/ray_shape.cpp scene/resources/segment_shape_2d.cpp +msgid "Slips On Slope" +msgstr "" + +#: scene/resources/segment_shape_2d.cpp +msgid "A" +msgstr "" + +#: scene/resources/shape_2d.cpp +msgid "Custom Solver Bias" +msgstr "" + +#: scene/resources/skin.cpp +msgid "Bind Count" +msgstr "" + +#: scene/resources/skin.cpp +msgid "Bind" +msgstr "" + +#: scene/resources/skin.cpp +msgid "Bone" +msgstr "" + +#: scene/resources/sky.cpp +msgid "Radiance Size" +msgstr "" + +#: scene/resources/sky.cpp +msgid "Panorama" +msgstr "" + +#: scene/resources/sky.cpp +msgid "Top Color" +msgstr "" + +#: scene/resources/sky.cpp +msgid "Horizon Color" +msgstr "" + +#: scene/resources/sky.cpp +msgid "Ground" +msgstr "" + +#: scene/resources/sky.cpp +msgid "Bottom Color" +msgstr "" + +#: scene/resources/sky.cpp +msgid "Sun" +msgstr "" + +#: scene/resources/sky.cpp +msgid "Latitude" +msgstr "" + +#: scene/resources/sky.cpp +msgid "Longitude" +msgstr "" + +#: scene/resources/sky.cpp +msgid "Angle Min" +msgstr "" + +#: scene/resources/sky.cpp +msgid "Angle Max" +msgstr "" + +#: scene/resources/style_box.cpp +msgid "Content Margin" +msgstr "" + +#: scene/resources/style_box.cpp +msgid "Expand Margin" +msgstr "" + +#: scene/resources/style_box.cpp +msgid "Skew" +msgstr "" + +#: scene/resources/style_box.cpp +msgid "Corner Radius" +msgstr "" + +#: scene/resources/style_box.cpp +msgid "Corner Detail" +msgstr "" + +#: scene/resources/style_box.cpp +msgid "Anti Aliasing" +msgstr "" + +#: scene/resources/style_box.cpp +msgid "Grow Begin" +msgstr "" + +#: scene/resources/style_box.cpp +msgid "Grow End" +msgstr "" + +#: scene/resources/texture.cpp +msgid "Load Path" +msgstr "" + +#: scene/resources/texture.cpp +msgid "Base Texture" +msgstr "" + +#: scene/resources/texture.cpp +msgid "Image Size" +msgstr "" + +#: scene/resources/texture.cpp +msgid "Side" +msgstr "" + +#: scene/resources/texture.cpp +msgid "Front" +msgstr "" + +#: scene/resources/texture.cpp +msgid "Back" +msgstr "" + +#: scene/resources/texture.cpp +msgid "Storage Mode" +msgstr "" + +#: scene/resources/texture.cpp +msgid "Lossy Storage Quality" +msgstr "" + +#: scene/resources/texture.cpp +msgid "From" +msgstr "" + +#: scene/resources/texture.cpp +msgid "To" +msgstr "" + +#: scene/resources/texture.cpp +msgid "Base" +msgstr "" + +#: scene/resources/texture.cpp +msgid "Current Frame" +msgstr "" + +#: scene/resources/texture.cpp +msgid "Pause" +msgstr "" + +#: scene/resources/texture.cpp +msgid "Which Feed" +msgstr "" + +#: scene/resources/texture.cpp +msgid "Camera Is Active" +msgstr "" + +#: scene/resources/theme.cpp +msgid "Default Font" +msgstr "" + +#: scene/resources/visual_shader.cpp +msgid "Output Port For Preview" +msgstr "" + +#: scene/resources/visual_shader.cpp +msgid "Depth Draw" +msgstr "" + +#: scene/resources/visual_shader.cpp +msgid "Cull" +msgstr "" + +#: scene/resources/visual_shader.cpp +msgid "Diffuse" +msgstr "" + +#: scene/resources/visual_shader.cpp +msgid "Async" +msgstr "" + +#: scene/resources/visual_shader.cpp +msgid "Modes" +msgstr "" + +#: scene/resources/visual_shader.cpp +msgid "Input Name" +msgstr "" + +#: scene/resources/visual_shader.cpp +msgid "Uniform Name" +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp +msgid "" +"The sampler port is connected but not used. Consider changing the source to " +"'SamplerPort'." +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for shader." +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp +msgid "Texture Type" +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp +msgid "Cube Map" +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp +msgid "Default Value Enabled" +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp +msgid "Default Value" +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp +msgid "Color Default" +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid comparison function for that type." +msgstr "" + +#: scene/resources/world.cpp +msgid "Fallback Environment" +msgstr "" + +#: scene/resources/world.cpp +msgid "Scenario" +msgstr "" + +#: scene/resources/world.cpp scene/resources/world_2d.cpp +msgid "Navigation Map" +msgstr "" + +#: scene/resources/world.cpp scene/resources/world_2d.cpp +msgid "Direct Space State" +msgstr "" + +#: scene/resources/world.cpp scene/resources/world_2d.cpp +msgid "Default Gravity Vector" +msgstr "" + +#: scene/resources/world.cpp scene/resources/world_2d.cpp +msgid "Default Linear Damp" +msgstr "" + +#: scene/resources/world.cpp scene/resources/world_2d.cpp +msgid "Default Angular Damp" +msgstr "" + +#: scene/resources/world.cpp +msgid "Default Map Up" +msgstr "" + +#: scene/resources/world.cpp scene/resources/world_2d.cpp +msgid "Default Cell Size" +msgstr "" + +#: scene/resources/world.cpp scene/resources/world_2d.cpp +msgid "Default Cell Height" +msgstr "" + +#: scene/resources/world.cpp scene/resources/world_2d.cpp +msgid "Default Edge Connection Margin" +msgstr "" + +#: scene/resources/world_2d.cpp +msgid "Canvas" +msgstr "" + +#: servers/arvr/arvr_interface.cpp +msgid "Is Primary" +msgstr "" + +#: servers/arvr/arvr_interface.cpp +msgid "Is Initialized" +msgstr "" + +#: servers/arvr/arvr_interface.cpp +msgid "AR" +msgstr "" + +#: servers/arvr/arvr_interface.cpp +msgid "Is Anchor Detection Enabled" +msgstr "" + +#: servers/arvr_server.cpp +msgid "Primary Interface" +msgstr "" + +#: servers/audio/audio_stream.cpp +msgid "Audio Stream" +msgstr "" + +#: servers/audio/audio_stream.cpp +msgid "Random Pitch" +msgstr "" + +#: servers/audio/effects/audio_effect_capture.cpp +#: servers/audio/effects/audio_effect_spectrum_analyzer.cpp +#: servers/audio/effects/audio_stream_generator.cpp +msgid "Buffer Length" +msgstr "" + +#: servers/audio/effects/audio_effect_chorus.cpp +msgid "Voice Count" +msgstr "" + +#: servers/audio/effects/audio_effect_chorus.cpp +#: servers/audio/effects/audio_effect_delay.cpp +#: servers/audio/effects/audio_effect_reverb.cpp +msgid "Dry" +msgstr "" + +#: servers/audio/effects/audio_effect_chorus.cpp +#: servers/audio/effects/audio_effect_reverb.cpp +msgid "Wet" +msgstr "" + +#: servers/audio/effects/audio_effect_chorus.cpp +msgid "Voice" +msgstr "" + +#: servers/audio/effects/audio_effect_chorus.cpp +#: servers/audio/effects/audio_effect_delay.cpp +msgid "Delay (ms)" +msgstr "" + +#: servers/audio/effects/audio_effect_chorus.cpp +#: servers/audio/effects/audio_effect_phaser.cpp +msgid "Rate Hz" +msgstr "" + +#: servers/audio/effects/audio_effect_chorus.cpp +msgid "Depth (ms)" +msgstr "" + +#: servers/audio/effects/audio_effect_chorus.cpp +#: servers/audio/effects/audio_effect_delay.cpp +msgid "Level dB" +msgstr "" + +#: servers/audio/effects/audio_effect_chorus.cpp +#: servers/audio/effects/audio_effect_delay.cpp +#: servers/audio/effects/audio_effect_panner.cpp +msgid "Pan" +msgstr "" + +#: servers/audio/effects/audio_effect_compressor.cpp +#: servers/audio/effects/audio_effect_filter.cpp +msgid "Gain" +msgstr "" + +#: servers/audio/effects/audio_effect_compressor.cpp +msgid "Attack (µs)" +msgstr "" + +#: servers/audio/effects/audio_effect_compressor.cpp +msgid "Release (ms)" +msgstr "" + +#: servers/audio/effects/audio_effect_compressor.cpp +msgid "Mix" +msgstr "" + +#: servers/audio/effects/audio_effect_compressor.cpp +msgid "Sidechain" +msgstr "" + +#: servers/audio/effects/audio_effect_delay.cpp +msgid "Tap 1" +msgstr "" + +#: servers/audio/effects/audio_effect_delay.cpp +msgid "Tap 2" +msgstr "" + +#: servers/audio/effects/audio_effect_delay.cpp +#: servers/audio/effects/audio_effect_phaser.cpp +#: servers/audio/effects/audio_effect_reverb.cpp +msgid "Feedback" +msgstr "" + +#: servers/audio/effects/audio_effect_delay.cpp +msgid "Low-pass" +msgstr "" + +#: servers/audio/effects/audio_effect_distortion.cpp +msgid "Pre Gain" +msgstr "" + +#: servers/audio/effects/audio_effect_distortion.cpp +msgid "Keep Hf Hz" +msgstr "" + +#: servers/audio/effects/audio_effect_distortion.cpp +msgid "Drive" +msgstr "" + +#: servers/audio/effects/audio_effect_distortion.cpp +msgid "Post Gain" +msgstr "" + +#: servers/audio/effects/audio_effect_filter.cpp +msgid "Resonance" +msgstr "" + +#: servers/audio/effects/audio_effect_limiter.cpp +msgid "Ceiling dB" +msgstr "" + +#: servers/audio/effects/audio_effect_limiter.cpp +msgid "Threshold dB" +msgstr "" + +#: servers/audio/effects/audio_effect_limiter.cpp +msgid "Soft Clip dB" +msgstr "" + +#: servers/audio/effects/audio_effect_limiter.cpp +msgid "Soft Clip Ratio" +msgstr "" + +#: servers/audio/effects/audio_effect_phaser.cpp +msgid "Range Min Hz" +msgstr "" + +#: servers/audio/effects/audio_effect_phaser.cpp +msgid "Range Max Hz" +msgstr "" + +#: servers/audio/effects/audio_effect_pitch_shift.cpp +msgid "Oversampling" +msgstr "" + +#: servers/audio/effects/audio_effect_pitch_shift.cpp +#: servers/audio/effects/audio_effect_spectrum_analyzer.cpp +msgid "FFT Size" +msgstr "" + +#: servers/audio/effects/audio_effect_reverb.cpp +msgid "Predelay" +msgstr "" + +#: servers/audio/effects/audio_effect_reverb.cpp +msgid "Msec" +msgstr "" + +#: servers/audio/effects/audio_effect_reverb.cpp +msgid "Room Size" +msgstr "" + +#: servers/audio/effects/audio_effect_reverb.cpp +msgid "High-pass" +msgstr "" + +#: servers/audio/effects/audio_effect_spectrum_analyzer.cpp +msgid "Tap Back Pos" +msgstr "" + +#: servers/audio/effects/audio_effect_stereo_enhance.cpp +msgid "Pan Pullout" +msgstr "" + +#: servers/audio/effects/audio_effect_stereo_enhance.cpp +msgid "Time Pullout (ms)" +msgstr "" + +#: servers/audio/effects/audio_effect_stereo_enhance.cpp +msgid "Surround" +msgstr "" + +#: servers/audio_server.cpp +msgid "Enable Audio Input" +msgstr "" + +#: servers/audio_server.cpp +msgid "Output Latency" +msgstr "" + +#: servers/audio_server.cpp +msgid "Channel Disable Threshold dB" +msgstr "" + +#: servers/audio_server.cpp +msgid "Channel Disable Time" +msgstr "" + +#: servers/audio_server.cpp +msgid "Video Delay Compensation (ms)" +msgstr "" + +#: servers/audio_server.cpp +msgid "Bus Count" +msgstr "" + +#: servers/audio_server.cpp +msgid "Capture Device" +msgstr "" + +#: servers/audio_server.cpp +msgid "Global Rate Scale" +msgstr "" + +#: servers/camera/camera_feed.cpp +msgid "Feed" +msgstr "" + +#: servers/camera/camera_feed.cpp +msgid "Is Active" +msgstr "" + +#: servers/physics/space_sw.cpp servers/physics_2d/space_2d_sw.cpp +msgid "Sleep Threshold Linear" +msgstr "" + +#: servers/physics/space_sw.cpp servers/physics_2d/space_2d_sw.cpp +msgid "Sleep Threshold Angular" +msgstr "" + +#: servers/physics/space_sw.cpp servers/physics_2d/space_2d_sw.cpp +msgid "Time Before Sleep" +msgstr "" + +#: servers/physics_2d/physics_2d_server_sw.cpp +msgid "BP Hash Table Size" +msgstr "" + +#: servers/physics_2d/physics_2d_server_sw.cpp +msgid "Large Object Surface Threshold In Cells" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Inverse Mass" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Inverse Inertia" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Total Angular Damp" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Total Linear Damp" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Total Gravity" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Linear Velocity" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Exclude" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Shape RID" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Collide With Bodies" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Collide With Areas" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Motion Remainder" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Collision Point" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Collision Normal" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Collision Depth" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Collision Safe Fraction" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Collision Unsafe Fraction" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Physics Engine" +msgstr "" + +#: servers/physics_server.cpp +msgid "Center Of Mass" +msgstr "" + +#: servers/physics_server.cpp +msgid "Principal Inertia Axes" +msgstr "" + +#: servers/visual/shader_language.cpp +msgid "Varying may not be assigned in the '%s' function." +msgstr "" + +#: servers/visual/shader_language.cpp +msgid "" +"Varyings which were assigned in 'vertex' function may not be reassigned in " +"'fragment' or 'light'." +msgstr "" + +#: servers/visual/shader_language.cpp +msgid "" +"Varyings which were assigned in 'fragment' function may not be reassigned in " +"'vertex' or 'light'." +msgstr "" + +#: servers/visual/shader_language.cpp +msgid "Assignment to function." +msgstr "" + +#: servers/visual/shader_language.cpp +msgid "Assignment to uniform." +msgstr "" + +#: servers/visual/shader_language.cpp +msgid "Constants cannot be modified." +msgstr "" + +#: servers/visual/visual_server_scene.cpp +msgid "Spatial Partitioning" +msgstr "" + +#: servers/visual_server.cpp +msgid "Render Loop Enabled" +msgstr "" + +#: servers/visual_server.cpp +msgid "VRAM Compression" +msgstr "" + +#: servers/visual_server.cpp +msgid "Import BPTC" +msgstr "" + +#: servers/visual_server.cpp +msgid "Import S3TC" +msgstr "" + +#: servers/visual_server.cpp +msgid "Import ETC" +msgstr "" + +#: servers/visual_server.cpp +msgid "Import ETC2" +msgstr "" + +#: servers/visual_server.cpp +msgid "Import PVRTC" +msgstr "" + +#: servers/visual_server.cpp +msgid "Lossless Compression" +msgstr "" + +#: servers/visual_server.cpp +msgid "Force PNG" +msgstr "" + +#: servers/visual_server.cpp +msgid "WebP Compression Level" +msgstr "" + +#: servers/visual_server.cpp +msgid "Time Rollover Secs" +msgstr "" + +#: servers/visual_server.cpp +msgid "Cubemap Size" +msgstr "" + +#: servers/visual_server.cpp +msgid "Quadrant 0 Subdiv" +msgstr "" + +#: servers/visual_server.cpp +msgid "Quadrant 1 Subdiv" +msgstr "" + +#: servers/visual_server.cpp +msgid "Quadrant 2 Subdiv" +msgstr "" + +#: servers/visual_server.cpp +msgid "Quadrant 3 Subdiv" +msgstr "" + +#: servers/visual_server.cpp +msgid "Shadows" +msgstr "" + +#: servers/visual_server.cpp +msgid "Filter Mode" +msgstr "" + +#: servers/visual_server.cpp +msgid "Texture Array Reflections" +msgstr "" + +#: servers/visual_server.cpp +msgid "High Quality GGX" +msgstr "" + +#: servers/visual_server.cpp +msgid "Irradiance Max Size" +msgstr "" + +#: servers/visual_server.cpp +msgid "Shading" +msgstr "" + +#: servers/visual_server.cpp +msgid "Force Vertex Shading" +msgstr "" + +#: servers/visual_server.cpp +msgid "Force Lambert Over Burley" +msgstr "" + +#: servers/visual_server.cpp +msgid "Force Blinn Over GGX" +msgstr "" + +#: servers/visual_server.cpp +msgid "Mesh Storage" +msgstr "" + +#: servers/visual_server.cpp +msgid "Split Stream" +msgstr "" + +#: servers/visual_server.cpp +msgid "Use Physical Light Attenuation" +msgstr "" + +#: servers/visual_server.cpp +msgid "Depth Prepass" +msgstr "" + +#: servers/visual_server.cpp +msgid "Disable For Vendors" +msgstr "" + +#: servers/visual_server.cpp +msgid "Anisotropic Filter Level" +msgstr "" + +#: servers/visual_server.cpp +msgid "Use Nearest Mipmap Filter" +msgstr "" + +#: servers/visual_server.cpp +msgid "Skinning" +msgstr "" + +#: servers/visual_server.cpp +msgid "Software Skinning Fallback" +msgstr "" + +#: servers/visual_server.cpp +msgid "Force Software Skinning" +msgstr "" + +#: servers/visual_server.cpp +msgid "Use Software Skinning" +msgstr "" + +#: servers/visual_server.cpp +msgid "Ninepatch Mode" +msgstr "" + +#: servers/visual_server.cpp +msgid "OpenGL" +msgstr "" + +#: servers/visual_server.cpp +msgid "Batching Send Null" +msgstr "" + +#: servers/visual_server.cpp +msgid "Batching Stream" +msgstr "" + +#: servers/visual_server.cpp +msgid "Legacy Orphan Buffers" +msgstr "" + +#: servers/visual_server.cpp +msgid "Legacy Stream" +msgstr "" + +#: servers/visual_server.cpp +msgid "Batching" +msgstr "" + +#: servers/visual_server.cpp +msgid "Use Batching" +msgstr "" + +#: servers/visual_server.cpp +msgid "Use Batching In Editor" +msgstr "" + +#: servers/visual_server.cpp +msgid "Single Rect Fallback" +msgstr "" + +#: servers/visual_server.cpp +msgid "Max Join Item Commands" +msgstr "" + +#: servers/visual_server.cpp +msgid "Colored Vertex Format Threshold" +msgstr "" + +#: servers/visual_server.cpp +msgid "Scissor Area Threshold" +msgstr "" + +#: servers/visual_server.cpp +msgid "Max Join Items" +msgstr "" + +#: servers/visual_server.cpp +msgid "Batch Buffer Size" +msgstr "" + +#: servers/visual_server.cpp +msgid "Item Reordering Lookahead" +msgstr "" + +#: servers/visual_server.cpp +msgid "Flash Batching" +msgstr "" + +#: servers/visual_server.cpp +msgid "Diagnose Frame" +msgstr "" + +#: servers/visual_server.cpp +msgid "GLES2" +msgstr "" + +#: servers/visual_server.cpp +msgid "Compatibility" +msgstr "" + +#: servers/visual_server.cpp +msgid "Disable Half Float" +msgstr "" + +#: servers/visual_server.cpp +msgid "Enable High Float" +msgstr "" + +#: servers/visual_server.cpp +msgid "Precision" +msgstr "" + +#: servers/visual_server.cpp +msgid "UV Contract" +msgstr "" + +#: servers/visual_server.cpp +msgid "UV Contract Amount" +msgstr "" + +#: servers/visual_server.cpp +msgid "Use Simple PVS" +msgstr "" + +#: servers/visual_server.cpp +msgid "PVS Logging" +msgstr "" + +#: servers/visual_server.cpp +msgid "Use Signals" +msgstr "" + +#: servers/visual_server.cpp +msgid "Remove Danglers" +msgstr "" + +#: servers/visual_server.cpp +msgid "Flip Imported Portals" +msgstr "" + +#: servers/visual_server.cpp +msgid "Occlusion Culling" +msgstr "" + +#: servers/visual_server.cpp +msgid "Max Active Spheres" +msgstr "" + +#: servers/visual_server.cpp +msgid "Max Active Polygons" +msgstr "" + +#: servers/visual_server.cpp +msgid "Shader Compilation Mode" +msgstr "" + +#: servers/visual_server.cpp +msgid "Max Simultaneous Compiles" +msgstr "" + +#: servers/visual_server.cpp +msgid "Log Active Async Compiles Count" +msgstr "" + +#: servers/visual_server.cpp +msgid "Shader Cache Size (MB)" +msgstr "" diff --git a/editor/translations/is.po b/editor/translations/is.po index 512c660eef..8514155c68 100644 --- a/editor/translations/is.po +++ b/editor/translations/is.po @@ -4425,6 +4425,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7154,7 +7155,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -14981,18 +14983,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Fjarlægja val" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Fjarlægja val" #: editor/scene_tree_dock.cpp @@ -15185,6 +15187,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Fjarlægja val" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15248,6 +15255,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17070,6 +17081,19 @@ msgstr "Allt úrvalið" msgid "Auto Update Project" msgstr "Verkefna Stjóri" +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Verkefna Stjóri" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18799,6 +18823,11 @@ msgstr "TvÃteknir lyklar" msgid "Custom BG Color" msgstr "TvÃteknir lyklar" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Breyta..." + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19597,6 +19626,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/it.po b/editor/translations/it.po index 2c9f7eb6fe..027f4609f8 100644 --- a/editor/translations/it.po +++ b/editor/translations/it.po @@ -71,13 +71,15 @@ # conecat <ilgrandemax190@gmail.com>, 2022. # Gico2006 <gradaellig@protonmail.com>, 2022. # ale piccia <picciatialessio2@gmail.com>, 2022. +# Simone Starace <simone.starace93@gmail.com>, 2022. +# Daniele Giunta <danielegiunta2007@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-31 18:34+0000\n" -"Last-Translator: Mirko <miknsop@gmail.com>\n" +"PO-Revision-Date: 2022-09-27 21:37+0000\n" +"Last-Translator: Daniele Giunta <danielegiunta2007@gmail.com>\n" "Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/" "godot/it/>\n" "Language: it\n" @@ -85,7 +87,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -406,7 +408,7 @@ msgstr "Alla chiamata di '%s':" #: core/math/random_number_generator.cpp #: modules/opensimplex/open_simplex_noise.cpp msgid "Seed" -msgstr "Seed" +msgstr "Seme" #: core/math/random_number_generator.cpp msgid "State" @@ -456,7 +458,7 @@ msgstr "Comando" #: core/os/input_event.cpp #, fuzzy msgid "Physical" -msgstr " (Fisico)" +msgstr "Fisico" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp @@ -466,11 +468,11 @@ msgstr "Premuto" #: core/os/input_event.cpp msgid "Scancode" -msgstr "Scansione Codice" +msgstr "Codice di Scansione" #: core/os/input_event.cpp msgid "Physical Scancode" -msgstr "Scancode Fisico" +msgstr "Codice di Scansione Fisico" #: core/os/input_event.cpp #, fuzzy @@ -511,7 +513,7 @@ msgstr "Pressione" #: core/os/input_event.cpp msgid "Pen Inverted" -msgstr "" +msgstr "Penna Invertita" #: core/os/input_event.cpp msgid "Relative" @@ -901,7 +903,6 @@ msgid "Modules" msgstr "Moduli" #: core/register_core_types.cpp -#, fuzzy msgid "TCP" msgstr "TCP" @@ -1272,7 +1273,7 @@ msgstr "Cambia la durata dell'animazione" #: editor/animation_track_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation Loop" -msgstr "Commuta ciclicità animazione" +msgstr "Cambia ciclo di animazione" #: editor/animation_track_editor.cpp msgid "Property Track" @@ -1352,7 +1353,6 @@ msgid "Remove this track." msgstr "Rimuovi questa traccia." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Time (s):" msgstr "Tempo (s):" @@ -1379,28 +1379,24 @@ msgid "Type:" msgstr "Tipo:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "(Invalid, expected type: %s)" -msgstr "Template di esportazione non valido:" +msgstr "(Non valido, tipo previsto: %s)" #: editor/animation_track_editor.cpp msgid "Easing:" msgstr "Allentamento:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "In-Handle:" -msgstr "Imposta Maniglia" +msgstr "In Gestione:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Out-Handle:" -msgstr "Imposta Maniglia" +msgstr "Fuori Gestione:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Stream:" -msgstr "Stream" +msgstr "Flusso:" #: editor/animation_track_editor.cpp msgid "Start (s):" @@ -1630,7 +1626,6 @@ msgid "Add Method Track Key" msgstr "Aggiungi una chiave a una traccia di chiamate metodi" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Method not found in object:" msgstr "Metodo non trovato nell'oggetto:" @@ -2115,7 +2110,6 @@ msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "Sei sicuro di voler rimuovere tutte le connessioni dal segnale \"%s\"?" #: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp -#, fuzzy msgid "Signals" msgstr "Segnali" @@ -2604,7 +2598,7 @@ msgstr "File \"%s\" assente." #: editor/editor_audio_buses.cpp msgid "Layout:" -msgstr "" +msgstr "Disposizione:" #: editor/editor_audio_buses.cpp msgid "Invalid file, not an audio bus layout." @@ -2813,17 +2807,14 @@ msgid "Project export for platform:" msgstr "Esportazione del progetto per la piattaforma:" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with warnings." -msgstr "Completato con errori." +msgstr "Completato con avvertimenti." #: editor/editor_export.cpp -#, fuzzy msgid "Completed successfully." msgstr "Completato con successo." #: editor/editor_export.cpp -#, fuzzy msgid "Failed." msgstr "Fallito." @@ -2840,7 +2831,6 @@ msgid "Packing" msgstr "Impacchettando" #: editor/editor_export.cpp -#, fuzzy msgid "Save PCK" msgstr "Salva PCK" @@ -2849,16 +2839,14 @@ msgid "Cannot create file \"%s\"." msgstr "impossibile creare il file \"%s\"." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to export project files." -msgstr "Impossibile esportare i file del progetto" +msgstr "Esportazione dei file di progetto fallita." #: editor/editor_export.cpp msgid "Can't open file to read from path \"%s\"." msgstr "impossibile aprire file da leggere dalla path \"%s\"." #: editor/editor_export.cpp -#, fuzzy msgid "Save ZIP" msgstr "Salva ZIP" @@ -2967,7 +2955,7 @@ msgstr "ETC2" #: editor/editor_export.cpp #, fuzzy msgid "No BPTC Fallbacks" -msgstr "Nessun fallback per la BPTC" +msgstr "Nessun fallback per BPTC" #: editor/editor_export.cpp platform/android/export/export_plugin.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp @@ -2984,28 +2972,25 @@ msgstr "Modello di rilascio personalizzato non trovato." #: editor/editor_export.cpp #, fuzzy msgid "Prepare Template" -msgstr "Gestisci i modelli d'esportazione" +msgstr "Prepara Modello" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "The given export path doesn't exist." -msgstr "Il percorso di esportazione specificato non esiste:" +msgstr "Il percorso di esportazione specificato non esiste." #: editor/editor_export.cpp platform/javascript/export/export.cpp -#, fuzzy msgid "Template file not found: \"%s\"." -msgstr "File del modello non trovato:" +msgstr "File modello non trovato: \"%s\"." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to copy export template." -msgstr "Template di esportazione non valido:" +msgstr "Copiatura del modello di esportazione fallita." #: editor/editor_export.cpp platform/windows/export/export.cpp #: platform/x11/export/export.cpp #, fuzzy msgid "PCK Embedding" -msgstr "Padding" +msgstr "PCK Incorporazione" #: editor/editor_export.cpp msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." @@ -4097,7 +4082,7 @@ msgstr "Niente da annullare." #: editor/editor_node.cpp msgid "Undo: %s" -msgstr "Annulla" +msgstr "Annulla: %s" #: editor/editor_node.cpp msgid "Can't redo while mouse buttons are pressed." @@ -4565,6 +4550,7 @@ msgstr "Strumenti di progetto o scena vari." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Progetto" @@ -5186,7 +5172,6 @@ msgid "Size:" msgstr "Dimensione:" #: editor/editor_properties_array_dict.cpp -#, fuzzy msgid "Page:" msgstr "Pagina:" @@ -5286,9 +5271,8 @@ msgstr "" "esistente come eseguibile." #: editor/editor_run_native.cpp -#, fuzzy msgid "Project Run" -msgstr "Progetto" +msgstr "Esegui Progetto" #: editor/editor_run_script.cpp msgid "Write your logic in the _run() method." @@ -5572,11 +5556,12 @@ msgstr "Uso dei tasti aggiuntivi del mouse per navigare la cronologia" #: editor/editor_settings.cpp #, fuzzy msgid "Drag And Drop Selection" -msgstr "Selezione GridMap" +msgstr "Selezione Drag And Drop" #: editor/editor_settings.cpp +#, fuzzy msgid "Stay In Script Editor On Node Selected" -msgstr "" +msgstr "Rimani nell'Editor degli Script quando un Nodo è selezionato" #: editor/editor_settings.cpp msgid "Appearance" @@ -6958,7 +6943,6 @@ msgid "Delimiter" msgstr "Delimitatore" #: editor/import/resource_importer_layered_texture.cpp -#, fuzzy msgid "ColorCorrect" msgstr "Correzione Colore" @@ -6998,7 +6982,6 @@ msgstr "Anisotropico" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "sRGB" msgstr "sRGB" @@ -7217,9 +7200,8 @@ msgid "Generating Lightmaps" msgstr "Generando Lightmap" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Generating for Mesh:" -msgstr "Generazione della Mesh:" +msgstr "Generando per il Mesh:" #: editor/import/resource_importer_scene.cpp msgid "Running Custom Script..." @@ -7251,12 +7233,17 @@ msgid "" "%s: Texture detected as used as a normal map in 3D. Enabling red-green " "texture compression to reduce memory usage (blue channel is discarded)." msgstr "" +"%s: Rilevato uso della texture come mappa Normale in 3D. Sarà abilitata la " +"compressione rosso-verde della texture per ridurre l'uso di memoria (il " +"canale blu è ignorato)." #: editor/import/resource_importer_texture.cpp msgid "" "%s: Texture detected as used in 3D. Enabling filter, repeat, mipmap " "generation and VRAM texture compression." msgstr "" +"%s: Rilevato uso della texture in 3D. Sarà abilitato filtraggio, " +"ripetizione, generazione delle mipmap e compressione della texture in VRAM." #: editor/import/resource_importer_texture.cpp msgid "2D, Detect 3D" @@ -7355,7 +7342,8 @@ msgid "8 Bit" msgstr "8 Bit" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "Mono" @@ -10001,9 +9989,8 @@ msgid "Volume" msgstr "Volume" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Emission Source:" -msgstr "Sorgente Emissione:" +msgstr "Sorgente dell' Emissione:" #: editor/plugins/particles_editor_plugin.cpp msgid "A processor material of type 'ParticlesMaterial' is required." @@ -10421,7 +10408,7 @@ msgstr "Ribalta Portale" #: editor/plugins/room_manager_editor_plugin.cpp #, fuzzy msgid "Occluder Set Transform" -msgstr "Trasformazione dell'Insieme dell'Occlusore" +msgstr "Imposta Trasformazione dell' Occlusore" #: editor/plugins/room_manager_editor_plugin.cpp msgid "Center Node" @@ -10571,7 +10558,6 @@ msgstr "Script precedente" #: editor/plugins/script_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "File" msgstr "File" @@ -11101,13 +11087,11 @@ msgstr "Trasla" #. TRANSLATORS: Refers to changing the scale of a node in the 3D editor. #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Scaling:" -msgstr "Scalatura:" +msgstr "Scala:" #. TRANSLATORS: Refers to changing the position of a node in the 3D editor. #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Translating:" msgstr "Traslazione:" @@ -11364,7 +11348,6 @@ msgid "Use Snap" msgstr "Usa Scatto" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Converts rooms for portal culling." msgstr "Converte stanze per culling del portale." @@ -11445,7 +11428,7 @@ msgstr "Aumenta il Campo Visivo" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Reset Field of View to Default" -msgstr "Ripristina le impostazioni predefinite" +msgstr "Ripristina il Campo Visivo alle impostazioni predefinite" #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Object to Floor" @@ -11629,9 +11612,8 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "Geometria non valida, impossibile sostituirla con una mesh." #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Convert to MeshInstance2D" -msgstr "Converti in Mesh2D" +msgstr "Converti in MeshInstance2D" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't create polygon." @@ -11662,17 +11644,14 @@ msgid "Sprite" msgstr "Sprite" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Simplification:" msgstr "Semplificazione:" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Shrink (Pixels):" msgstr "Rimpicciolisci (Pixels):" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Grow (Pixels):" msgstr "Ingrandisci (Pixels):" @@ -11739,7 +11718,7 @@ msgstr "Nuova Animazione" #: editor/plugins/sprite_frames_editor_plugin.cpp #, fuzzy msgid "Filter animations" -msgstr "Modalità di filtraggio" +msgstr "Modalità di filtraggio animazioni" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed:" @@ -12034,6 +12013,9 @@ msgid "" "closing this window.\n" "Close anyway?" msgstr "" +"La scheda \"Importa Oggetti\" ha alcuni elementi selezionati. Chiudendo " +"questa finestra si perderà la selezione.\n" +"Chiudere lo stesso?" #: editor/plugins/theme_editor_plugin.cpp msgid "Remove Type" @@ -12542,7 +12524,6 @@ msgid "Palette Min Width" msgstr "Larghezza Min Paletta" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Palette Item H Separation" msgstr "Separazione Orizzontale Elementi Paletta" @@ -13006,14 +12987,13 @@ msgid "Selected Collision" msgstr "Collisione Selezionata" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Collision One Way" msgstr "Collisione Selezionata Solo Da Una Parte" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy msgid "Selected Collision One Way Margin" -msgstr "Margine di Collisione BVH" +msgstr "Margine di Collisione Solo Da Una Parte Selezionato" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Selected Navigation" @@ -13051,14 +13031,12 @@ msgid "Commit" msgstr "Commit" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Staged Changes" -msgstr "Cambiamenti in Scena" +msgstr "Cambiamenti Graduali" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstaged Changes" -msgstr "Cambiamenti non in Scena" +msgstr "Cambiamenti non Graduali" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit:" @@ -13211,9 +13189,8 @@ msgid "Typechange" msgstr "Cambio di tipo" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unmerged" -msgstr "Non mescolato" +msgstr "Non combinato" #: editor/plugins/version_control_editor_plugin.cpp msgid "View:" @@ -14124,12 +14101,10 @@ msgid "Runnable" msgstr "Eseguibile" #: editor/project_export.cpp -#, fuzzy msgid "Export the project for all the presets defined." msgstr "Esporta il progetto per tutti i preset definiti." #: editor/project_export.cpp -#, fuzzy msgid "All presets must have an export path defined for Export All to work." msgstr "" "Tutti i preset devono avere un percorso di esportazione definito affinché " @@ -14254,12 +14229,10 @@ msgid "More Info..." msgstr "Maggiori Informazioni..." #: editor/project_export.cpp -#, fuzzy msgid "Export PCK/Zip..." msgstr "Esporta PCK/Zip..." #: editor/project_export.cpp -#, fuzzy msgid "Export Project..." msgstr "Esporta Progetto..." @@ -14268,12 +14241,10 @@ msgid "Export All" msgstr "Esporta Tutto" #: editor/project_export.cpp -#, fuzzy msgid "Choose an export mode:" -msgstr "Si prega di scegliere una cartella vuota:" +msgstr "Scegli una modalità di esportazione:" #: editor/project_export.cpp -#, fuzzy msgid "Export All..." msgstr "Esporta Tutto..." @@ -14282,18 +14253,16 @@ msgid "ZIP File" msgstr "File ZIP" #: editor/project_export.cpp -#, fuzzy msgid "Godot Project Pack" -msgstr "Pacchetto Gioco Godot" +msgstr "Pacchetto Progetto Godot" #: editor/project_export.cpp msgid "Export templates for this platform are missing:" msgstr "Le export templates per questa piattaforma sono mancanti:" #: editor/project_export.cpp -#, fuzzy msgid "Project Export" -msgstr "Fondatori del progetto" +msgstr "Esporta Progetto" #: editor/project_export.cpp msgid "Manage Export Templates" @@ -15174,7 +15143,6 @@ msgid "snake_case to PascalCase" msgstr "snake_case a PascalCase" #: editor/rename_dialog.cpp -#, fuzzy msgid "Case" msgstr "Caso" @@ -15409,16 +15377,19 @@ msgstr "" msgid "Make Local" msgstr "Rendi Locale" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "Un altro nodo sta già usando questo nome unico nella scena." - #: editor/scene_tree_dock.cpp -msgid "Enable Scene Unique Name" +#, fuzzy +msgid "Enable Scene Unique Name(s)" msgstr "Abilita Nome Unico Scena" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Disable Scene Unique Name" +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Unique names already used by another node in the scene:" +msgstr "Nomi unici già usati da un altro nodo nella scena:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Disabilita Nome Unico Scena" #: editor/scene_tree_dock.cpp @@ -15618,6 +15589,10 @@ msgid "Button Group" msgstr "Gruppo Pulsanti" #: editor/scene_tree_editor.cpp +msgid "Disable Scene Unique Name" +msgstr "Disabilita Nome Unico Scena" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Collegamento da)" @@ -15696,6 +15671,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "Nome nodo invalido, i caratteri seguenti non sono consentiti:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "Un altro nodo sta già usando questo nome unico nella scena." + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Rinomina Nodo" @@ -15844,7 +15823,6 @@ msgid "Attach Node Script" msgstr "Allega Script Nodo" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Remote %s:" msgstr "Remoto %s:" @@ -15926,7 +15904,7 @@ msgstr "Filtra variabili su stack" #: editor/script_editor_debugger.cpp msgid "Auto Switch To Remote Scene Tree" -msgstr "" +msgstr "Passa automaticamente all'Albero Scena Remota" #: editor/script_editor_debugger.cpp msgid "Remote Scene Tree Refresh Interval" @@ -15934,7 +15912,7 @@ msgstr "Intervallo di Refresh dello Scene Tree Remoto" #: editor/script_editor_debugger.cpp msgid "Remote Inspect Refresh Interval" -msgstr "" +msgstr "Intervallo Aggiornamento Ispettore Remoto" #: editor/script_editor_debugger.cpp msgid "Network Profiler" @@ -16032,7 +16010,7 @@ msgstr "Cambia Raggio Luce" #: editor/spatial_editor_gizmos.cpp msgid "Stream Player 3D" -msgstr "" +msgstr "Stream Player 3D" #: editor/spatial_editor_gizmos.cpp msgid "Change AudioStreamPlayer3D Emission Angle" @@ -16125,12 +16103,14 @@ msgid "Navigation Solid Disabled" msgstr "Solido di Navigazione Disabilitato" #: editor/spatial_editor_gizmos.cpp +#, fuzzy msgid "Joint Body A" -msgstr "" +msgstr "Articolazione Corpo A" #: editor/spatial_editor_gizmos.cpp +#, fuzzy msgid "Joint Body B" -msgstr "" +msgstr "Articolazione Corpo B" #: editor/spatial_editor_gizmos.cpp msgid "Room Edge" @@ -16161,13 +16141,14 @@ msgid "Set Portal Point Position" msgstr "Imposta Posizione Punto Portale" #: editor/spatial_editor_gizmos.cpp +#, fuzzy msgid "Portal Front" -msgstr "" +msgstr "Davanti del Portale" #: editor/spatial_editor_gizmos.cpp #, fuzzy msgid "Portal Back" -msgstr "Torna indietro" +msgstr "Dietro del Portale" #: editor/spatial_editor_gizmos.cpp scene/2d/light_occluder_2d.cpp #: scene/2d/tile_map.cpp @@ -16226,7 +16207,7 @@ msgstr "Server con Multithread" #: main/main.cpp msgid "RID Pool Prealloc" -msgstr "" +msgstr "Preallocazione pool RID" #: main/main.cpp msgid "Debugger stdout" @@ -16259,7 +16240,7 @@ msgstr "Logging" #: main/main.cpp msgid "File Logging" -msgstr "" +msgstr "Logging su file" #: main/main.cpp msgid "Enable File Logging" @@ -16287,7 +16268,7 @@ msgstr "Ripiega Su GLES2" #: main/main.cpp msgid "Use Nvidia Rect Flicker Workaround" -msgstr "" +msgstr "Usa stratagemma contro il flickering rettangoli su NVIDIA" #: main/main.cpp msgid "DPI" @@ -16315,7 +16296,7 @@ msgstr "Permesso" #: main/main.cpp msgid "Intended Usage" -msgstr "" +msgstr "Uso previsto" #: main/main.cpp msgid "Framebuffer Allocation" @@ -16327,7 +16308,7 @@ msgstr "Risparmio Energia" #: main/main.cpp msgid "Threads" -msgstr "" +msgstr "Threads" #: main/main.cpp servers/physics_2d/physics_2d_server_wrap_mt.h msgid "Thread Model" @@ -16403,7 +16384,7 @@ msgstr "Modalità Basso Utilizzo Processore" #: main/main.cpp msgid "Delta Sync After Draw" -msgstr "" +msgstr "Sincronizzazione delta dopo il disegno" #: main/main.cpp msgid "iOS" @@ -16435,9 +16416,8 @@ msgid "Shaders" msgstr "Shaders" #: main/main.cpp -#, fuzzy msgid "Debug Shader Fallbacks" -msgstr "Forza fallback dello shader" +msgstr "Forza Fallback dello Shader" #: main/main.cpp scene/3d/baked_lightmap.cpp scene/3d/camera.cpp #: scene/3d/world_environment.cpp scene/main/scene_tree.cpp @@ -16448,7 +16428,7 @@ msgstr "Ambiente" #: main/main.cpp #, fuzzy msgid "Default Clear Color" -msgstr "Colore Di Cancellamento Di Default" +msgstr "Colore Di Sfondo Di Default" #: main/main.cpp msgid "Boot Splash" @@ -16484,7 +16464,7 @@ msgstr "Icona Nativa Di Windows" #: main/main.cpp msgid "Buffering" -msgstr "" +msgstr "Buffering" #: main/main.cpp msgid "Agile Event Flushing" @@ -16508,7 +16488,7 @@ msgstr "Immagine Personalizzata" #: main/main.cpp msgid "Custom Image Hotspot" -msgstr "" +msgstr "Punto focale immagine personalizzato" #: main/main.cpp msgid "Tooltip Position Offset" @@ -16532,7 +16512,7 @@ msgstr "Esecuzione" #: main/main.cpp msgid "Unhandled Exception Policy" -msgstr "" +msgstr "Regola per eccezioni non gestite" #: main/main.cpp msgid "Main Loop Type" @@ -17499,6 +17479,21 @@ msgstr "Crea Soluzione" msgid "Auto Update Project" msgstr "Auto-Aggiorna Progetto" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Nome Display" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Scegli una cartella" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Scegli una cartella" + #: modules/mono/mono_gd/gd_mono_utils.cpp #, fuzzy msgid "End of inner exception stack trace" @@ -19331,6 +19326,11 @@ msgstr "Taglia nodi" msgid "Custom BG Color" msgstr "Taglia nodi" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Espandi Tutto" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20186,6 +20186,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Nome breve del pacchetto non valido." @@ -22217,7 +22223,7 @@ msgstr "Gizmos" #: scene/3d/baked_lightmap.cpp msgid "Tweaks" -msgstr "" +msgstr "Ritocchi" #: scene/3d/baked_lightmap.cpp msgid "Bounces" @@ -25200,7 +25206,7 @@ msgstr "Imposta più valori:" #: scene/main/scene_tree.cpp scene/resources/mesh_library.cpp #: scene/resources/shape_2d.cpp msgid "Shapes" -msgstr "" +msgstr "Forme" #: scene/main/scene_tree.cpp msgid "Shape Color" diff --git a/editor/translations/ja.po b/editor/translations/ja.po index 60458e89df..2570cb6288 100644 --- a/editor/translations/ja.po +++ b/editor/translations/ja.po @@ -40,12 +40,15 @@ # jp.owo.Manda <admin@alterbaum.net>, 2022. # KokiOgawa <mupimupicandy@gmail.com>, 2022. # cacapon <takuma.tsubo@amazingengine.co.jp>, 2022. +# fadhliazhari <m.fadhliazhari@gmail.com>, 2022. +# Chia-Hsiang Cheng <cche0109@student.monash.edu>, 2022. +# meko <hirono.yoneyama@outlook.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-06-06 01:50+0000\n" +"PO-Revision-Date: 2022-09-27 21:37+0000\n" "Last-Translator: nitenook <admin@alterbaum.net>\n" "Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/" "godot/ja/>\n" @@ -54,7 +57,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.14.1\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -171,9 +174,8 @@ msgid "Print Error Messages" msgstr "エラーメッセージを表示" #: core/bind/core_bind.cpp -#, fuzzy msgid "Iterations Per Second" -msgstr "補間モード" +msgstr "毎秒å復回数" #: core/bind/core_bind.cpp msgid "Target FPS" @@ -184,23 +186,20 @@ msgid "Time Scale" msgstr "タイムスケール" #: core/bind/core_bind.cpp main/main.cpp -#, fuzzy msgid "Physics Jitter Fix" -msgstr "物ç†ãƒ•レーム%" +msgstr "物ç†ã®ã‚¸ãƒƒã‚¿ãƒ¼ä¿®æ£" #: core/bind/core_bind.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Error" msgstr "エラー" #: core/bind/core_bind.cpp -#, fuzzy msgid "Error String" -msgstr "ä¿å˜ä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ" +msgstr "エラー文å—列" #: core/bind/core_bind.cpp -#, fuzzy msgid "Error Line" -msgstr "ä¿å˜ä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ" +msgstr "エラー行" #: core/bind/core_bind.cpp msgid "Result" @@ -326,9 +325,8 @@ msgid "Data Array" msgstr "データé…列" #: core/io/stream_peer_ssl.cpp -#, fuzzy msgid "Blocking Handshake" -msgstr "ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’阻æ¢ã™ã‚‹ã“ã¨" +msgstr "ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’ブãƒãƒƒã‚ング処ç†ã«ã™ã‚‹" #: core/io/udp_server.cpp msgid "Max Pending Connections" @@ -350,9 +348,8 @@ msgid "Not enough bytes for decoding bytes, or invalid format." msgstr "デコードã™ã‚‹ã«ã¯ãƒã‚¤ãƒˆãŒè¶³ã‚Šãªã„ã‹ã€ã¾ãŸã¯ç„¡åйãªå½¢å¼ã§ã™ã€‚" #: core/math/expression.cpp -#, fuzzy msgid "Invalid input %d (not passed) in expression" -msgstr "å¼ä¸ã®ç„¡åйãªå…¥åŠ› %i (渡ã•れã¦ã„ã¾ã›ã‚“)" +msgstr "å¼ã«ç„¡åŠ¹å…¥åŠ› %d (渡ã•れã¦ã„ã¾ã›ã‚“)" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" @@ -396,14 +393,12 @@ msgid "Max Size (KB)" msgstr "最大サイズ (KB)" #: core/os/input.cpp -#, fuzzy msgid "Mouse Mode" -msgstr "移動モード" +msgstr "マウスモード" #: core/os/input.cpp -#, fuzzy msgid "Use Accumulated Input" -msgstr "入力を削除" +msgstr "è“„ç©ã•れãŸå…¥åŠ›ã‚’ä½¿ç”¨" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: servers/audio_server.cpp @@ -431,16 +426,14 @@ msgid "Command" msgstr "Command" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" -msgstr " (物ç†çš„)" +msgstr "物ç†" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Pressed" -msgstr "プリセット" +msgstr "押下" #: core/os/input_event.cpp msgid "Scancode" @@ -489,7 +482,7 @@ msgstr "圧力" #: core/os/input_event.cpp #, fuzzy msgid "Pen Inverted" -msgstr "å転" +msgstr "ペンå転" #: core/os/input_event.cpp msgid "Relative" @@ -549,9 +542,8 @@ msgid "Velocity" msgstr "ベãƒã‚·ãƒ†ã‚£" #: core/os/input_event.cpp -#, fuzzy msgid "Instrument" -msgstr "インストゥルメント" +msgstr "楽器" #: core/os/input_event.cpp msgid "Controller Number" @@ -623,16 +615,14 @@ msgid "Use Custom User Dir" msgstr "カスタムユーザディレクトリを使用" #: core/project_settings.cpp -#, fuzzy msgid "Custom User Dir Name" -msgstr "カスタムユーザディレクトリå" +msgstr "カスタムユーザフォルダå" #: core/project_settings.cpp main/main.cpp #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #: platform/uwp/os_uwp.cpp -#, fuzzy msgid "Display" -msgstr "ã™ã¹ã¦è¡¨ç¤º" +msgstr "表示" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/opensimplex/noise_texture.cpp scene/2d/line_2d.cpp @@ -656,12 +646,12 @@ msgstr "å¸¸ã«æœ€å‰é¢" #: core/project_settings.cpp #, fuzzy msgid "Test Width" -msgstr "左伸長" +msgstr "幅テスト" #: core/project_settings.cpp #, fuzzy msgid "Test Height" -msgstr "試験的" +msgstr "高ã•テスト" #: core/project_settings.cpp editor/animation_track_editor.cpp #: editor/editor_audio_buses.cpp main/main.cpp servers/audio_server.cpp @@ -680,9 +670,8 @@ msgid "Editor" msgstr "エディター" #: core/project_settings.cpp -#, fuzzy msgid "Main Run Args" -msgstr "メインシーンã®å¼•æ•°:" +msgstr "メイン実行引数" #: core/project_settings.cpp msgid "Scene Naming" @@ -697,14 +686,12 @@ msgid "Script Templates Search Path" msgstr "ã‚¹ã‚¯ãƒªãƒ—ãƒˆãƒ†ãƒ³ãƒ—ãƒ¬ãƒ¼ãƒˆã®æ¤œç´¢ãƒ‘ス" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Autoload On Startup" -msgstr "起動時ã®è‡ªå‹•èªã¿è¾¼ã¿" +msgstr "起動時ã®VCS自動èªã¿è¾¼ã¿" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Plugin Name" -msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«" +msgstr "VCSプラグインå" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -713,66 +700,55 @@ msgstr "入力" #: core/project_settings.cpp msgid "UI Accept" -msgstr "" +msgstr "UI åŒæ„" #: core/project_settings.cpp -#, fuzzy msgid "UI Select" -msgstr "é¸æŠž" +msgstr "UI é¸æŠž" #: core/project_settings.cpp -#, fuzzy msgid "UI Cancel" -msgstr "ã‚ャンセル" +msgstr "UI ã‚ャンセル" #: core/project_settings.cpp -#, fuzzy msgid "UI Focus Next" -msgstr "パスã«ãƒ•ォーカス" +msgstr "UI 次ã¸ãƒ•ォーカス" #: core/project_settings.cpp -#, fuzzy msgid "UI Focus Prev" -msgstr "パスã«ãƒ•ォーカス" +msgstr "UI å‰ã¸ãƒ•ォーカス" #: core/project_settings.cpp -#, fuzzy msgid "UI Left" -msgstr "å·¦" +msgstr "UI å·¦" #: core/project_settings.cpp -#, fuzzy msgid "UI Right" -msgstr "å³" +msgstr "UI å³" #: core/project_settings.cpp -#, fuzzy msgid "UI Up" -msgstr "上" +msgstr "UI 上" #: core/project_settings.cpp -#, fuzzy msgid "UI Down" -msgstr "下" +msgstr "UI 下" #: core/project_settings.cpp -#, fuzzy msgid "UI Page Up" -msgstr "ページアップ" +msgstr "UI ページアップ" #: core/project_settings.cpp -#, fuzzy msgid "UI Page Down" -msgstr "ページダウン" +msgstr "UI ページダウン" #: core/project_settings.cpp msgid "UI Home" -msgstr "ホーム" +msgstr "UI ホーム" #: core/project_settings.cpp -#, fuzzy msgid "UI End" -msgstr "エンド" +msgstr "UI エンド" #: core/project_settings.cpp main/main.cpp modules/bullet/register_types.cpp #: modules/bullet/space_bullet.cpp scene/2d/physics_body_2d.cpp @@ -782,9 +758,8 @@ msgstr "エンド" #: servers/physics_2d/physics_2d_server_wrap_mt.h #: servers/physics_2d/space_2d_sw.cpp servers/physics_2d_server.cpp #: servers/physics_server.cpp -#, fuzzy msgid "Physics" -msgstr "(物ç†çš„)" +msgstr "物ç†" #: core/project_settings.cpp editor/editor_settings.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -797,9 +772,8 @@ msgid "3D" msgstr "3D" #: core/project_settings.cpp -#, fuzzy msgid "Smooth Trimesh Collision" -msgstr "三角形メッシュ コリジョンã®å…„弟を作æˆ" +msgstr "三角形メッシュ コリジョンをスムーズ化" #: core/project_settings.cpp drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles2/rasterizer_scene_gles2.cpp @@ -826,9 +800,8 @@ msgstr "å“質" #: core/project_settings.cpp scene/gui/file_dialog.cpp #: scene/main/scene_tree.cpp scene/resources/navigation_mesh.cpp #: servers/visual_server.cpp -#, fuzzy msgid "Filters" -msgstr "フィルター:" +msgstr "フィルター" #: core/project_settings.cpp scene/main/viewport.cpp msgid "Sharpen Intensity" @@ -857,9 +830,8 @@ msgid "Profiler" msgstr "プãƒãƒ•ァイラー" #: core/project_settings.cpp -#, fuzzy msgid "Max Functions" -msgstr "関数を作æˆ" +msgstr "関数ã®ä¸Šé™" #: core/project_settings.cpp scene/3d/vehicle_body.cpp msgid "Compression" @@ -882,6 +854,7 @@ msgid "Compression Level" msgstr "圧縮レベル" #: core/project_settings.cpp +#, fuzzy msgid "Window Log Size" msgstr "Windowã®ãƒã‚°ã‚µã‚¤ã‚º" @@ -910,8 +883,9 @@ msgid "Connect Timeout Seconds" msgstr "接続タイムアウトã®ç§’æ•°" #: core/register_core_types.cpp +#, fuzzy msgid "Packet Peer Stream" -msgstr "" +msgstr "パケットピアストリーム" #: core/register_core_types.cpp msgid "Max Buffer (Power of 2)" @@ -1078,9 +1052,10 @@ msgstr "スケール" #: drivers/gles3/rasterizer_scene_gles3.cpp #, fuzzy msgid "Follow Surface" -msgstr "サーフェスを投入ã™ã‚‹" +msgstr "サーフェスをフォãƒãƒ¼ã™ã‚‹" #: drivers/gles3/rasterizer_scene_gles3.cpp +#, fuzzy msgid "Weight Samples" msgstr "é‡é‡ã‚µãƒ³ãƒ—ル" @@ -1168,9 +1143,8 @@ msgstr "アニメーション呼ã³å‡ºã—ã®å¤‰æ›´" #: editor/animation_track_editor.cpp scene/2d/animated_sprite.cpp #: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Frame" -msgstr "フレーム%" +msgstr "フレーム" #: editor/animation_track_editor.cpp editor/editor_profiler.cpp #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp @@ -1181,16 +1155,14 @@ msgstr "時間" #: editor/animation_track_editor.cpp editor/import/resource_importer_scene.cpp #: platform/osx/export/export.cpp -#, fuzzy msgid "Location" -msgstr "ãƒãƒ¼ã‚«ãƒ©ã‚¤ã‚º" +msgstr "ä½ç½®" #: editor/animation_track_editor.cpp modules/gltf/gltf_node.cpp #: scene/2d/polygon_2d.cpp scene/2d/remote_transform_2d.cpp #: scene/3d/remote_transform.cpp scene/3d/spatial.cpp scene/gui/control.cpp -#, fuzzy msgid "Rotation" -msgstr "回転ã®ã‚¹ãƒ†ãƒƒãƒ—:" +msgstr "回転" #: editor/animation_track_editor.cpp editor/script_editor_debugger.cpp #: modules/visual_script/visual_script_nodes.cpp scene/gui/range.cpp @@ -1198,9 +1170,8 @@ msgid "Value" msgstr "値" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Arg Count" -msgstr "ç·è¨ˆ:" +msgstr "å¼•æ•°ã®æ•°" #: editor/animation_track_editor.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp @@ -1217,12 +1188,12 @@ msgstr "タイプ(åž‹)" #: editor/animation_track_editor.cpp #, fuzzy msgid "In Handle" -msgstr "ãƒãƒ³ãƒ‰ãƒ«ã‚’è¨å®šã™ã‚‹" +msgstr "インãƒãƒ³ãƒ‰ãƒ«" #: editor/animation_track_editor.cpp #, fuzzy msgid "Out Handle" -msgstr "ãƒãƒ³ãƒ‰ãƒ«ã‚’è¨å®šã™ã‚‹" +msgstr "アウトãƒãƒ³ãƒ‰ãƒ«" #: editor/animation_track_editor.cpp #: editor/import/resource_importer_texture.cpp @@ -1232,14 +1203,12 @@ msgid "Stream" msgstr "ストリーム" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Start Offset" -msgstr "グリッドã®ã‚ªãƒ•セット:" +msgstr "始点オフセット" #: editor/animation_track_editor.cpp -#, fuzzy msgid "End Offset" -msgstr "オフセット:" +msgstr "終点オフセット" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/import/resource_importer_scene.cpp @@ -1252,9 +1221,8 @@ msgid "Animation" msgstr "アニメーション" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Easing" -msgstr "イージング(In-Out)" +msgstr "イージング" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Keyframe Time" @@ -1363,19 +1331,16 @@ msgid "Remove this track." msgstr "ã“ã®ãƒˆãƒ©ãƒƒã‚¯ã‚’除去ã™ã‚‹ã€‚" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Time (s):" -msgstr "時間 (ç§’): " +msgstr "時間 (ç§’):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Position:" -msgstr "ä½ç½®" +msgstr "ä½ç½®:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Rotation:" -msgstr "回転ã®ã‚¹ãƒ†ãƒƒãƒ—:" +msgstr "回転:" #: editor/animation_track_editor.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp @@ -1392,14 +1357,12 @@ msgid "Type:" msgstr "åž‹:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "(Invalid, expected type: %s)" -msgstr "無効ãªã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ テンプレート:" +msgstr "(無効, 予期ã•れãŸã‚¿ã‚¤ãƒ—: %s)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Easing:" -msgstr "イージング(In-Out)" +msgstr "イージング:" #: editor/animation_track_editor.cpp #, fuzzy @@ -1412,24 +1375,20 @@ msgid "Out-Handle:" msgstr "ãƒãƒ³ãƒ‰ãƒ«ã‚’è¨å®šã™ã‚‹" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Stream:" -msgstr "ストリーム" +msgstr "ストリーム:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Start (s):" -msgstr "リスタート:" +msgstr "é–‹å§‹:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "End (s):" -msgstr "フェードイン:" +msgstr "終了:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation Clip:" -msgstr "アニメーション:" +msgstr "アニメーションクリップ:" #: editor/animation_track_editor.cpp msgid "Toggle Track Enabled" @@ -1644,9 +1603,8 @@ msgid "Add Method Track Key" msgstr "メソッドトラックã‚ーã®è¿½åŠ " #: editor/animation_track_editor.cpp -#, fuzzy msgid "Method not found in object:" -msgstr "オブジェクトã«ãƒ¡ã‚½ãƒƒãƒ‰ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: " +msgstr "オブジェクト内ã«ãƒ¡ã‚½ãƒƒãƒ‰ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“:" #: editor/animation_track_editor.cpp msgid "Anim Move Keys" @@ -2258,7 +2216,7 @@ msgstr "é–‹ã" #: editor/dependency_editor.cpp msgid "Owners of: %s (Total: %d)" -msgstr "" +msgstr "%s ã®ã‚ªãƒ¼ãƒŠãƒ¼ (åˆè¨ˆ: %d)" #: editor/dependency_editor.cpp msgid "" @@ -2369,7 +2327,6 @@ msgstr "開発リーダー" #. TRANSLATORS: This refers to a job title. #: editor/editor_about.cpp -#, fuzzy msgctxt "Job Title" msgid "Project Manager" msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼" @@ -2613,9 +2570,8 @@ msgid "There is no '%s' file." msgstr "'%s' ファイルãŒã‚りã¾ã›ã‚“。" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Layout:" -msgstr "レイアウト" +msgstr "レイアウト:" #: editor/editor_audio_buses.cpp msgid "Invalid file, not an audio bus layout." @@ -2693,7 +2649,7 @@ msgstr "æ—¢å˜ã®ã‚°ãƒãƒ¼ãƒãƒ«å®šæ•°åã¨é‡è¤‡ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“。" #: editor/editor_autoload_settings.cpp msgid "Keyword cannot be used as an autoload name." -msgstr "ã‚ーワードã¯è‡ªå‹•ãƒãƒ¼ãƒ‰åã¨ã—ã¦ä½¿ç”¨ã§ãã¾ã›ã‚“。" +msgstr "ã‚ーワードã¯è‡ªå‹•èªã¿è¾¼ã¿ã®åå‰ã¨ã—ã¦ä½¿ç”¨ã§ãã¾ã›ã‚“。" #: editor/editor_autoload_settings.cpp msgid "Autoload '%s' already exists!" @@ -2814,26 +2770,23 @@ msgstr "フォルダーを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚" #: editor/editor_dir_dialog.cpp msgid "Choose" -msgstr "é¸ã¶" +msgstr "é¸æŠž" #: editor/editor_export.cpp msgid "Project export for platform:" -msgstr "" +msgstr "次ã®ãƒ—ラットフォームå‘ã‘ã«ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã‚’エクスãƒãƒ¼ãƒˆ:" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with warnings." -msgstr "ノードã®ãƒ‘スをコピー" +msgstr "完了ã—ã¾ã—ãŸãŒã€è¦å‘ŠãŒã‚りã¾ã™ã€‚" #: editor/editor_export.cpp -#, fuzzy msgid "Completed successfully." -msgstr "パッケージã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã«æˆåŠŸã—ã¾ã—ãŸï¼" +msgstr "æ£å¸¸ã«å®Œäº†ã—ã¾ã—ãŸã€‚" #: editor/editor_export.cpp -#, fuzzy msgid "Failed." -msgstr "失敗:" +msgstr "失敗ã—ã¾ã—ãŸã€‚" #: editor/editor_export.cpp msgid "Storing File:" @@ -2848,29 +2801,24 @@ msgid "Packing" msgstr "パックä¸" #: editor/editor_export.cpp -#, fuzzy msgid "Save PCK" -msgstr "åå‰ã‚’付ã‘ã¦ä¿å˜" +msgstr "PCKã‚’ä¿å˜" #: editor/editor_export.cpp -#, fuzzy msgid "Cannot create file \"%s\"." -msgstr "フォルダーを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚" +msgstr "ファイル \"%s\" を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚" #: editor/editor_export.cpp -#, fuzzy msgid "Failed to export project files." -msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆãƒ•ァイルをエクスãƒãƒ¼ãƒˆã§ãã¾ã›ã‚“ã§ã—ãŸ" +msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆãƒ•ァイルをエクスãƒãƒ¼ãƒˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚" #: editor/editor_export.cpp -#, fuzzy msgid "Can't open file to read from path \"%s\"." -msgstr "書ã込むファイルを開ã‘ã¾ã›ã‚“:" +msgstr "èªã¿è¾¼ã‚€ãƒ•ァイルをパス \"%s\" ã‹ã‚‰é–‹ã‘ã¾ã›ã‚“。" #: editor/editor_export.cpp -#, fuzzy msgid "Save ZIP" -msgstr "åå‰ã‚’付ã‘ã¦ä¿å˜" +msgstr "ZIPã‚’ä¿å˜" #: editor/editor_export.cpp msgid "" @@ -2952,34 +2900,31 @@ msgstr "64ビット" #: editor/editor_export.cpp msgid "Embed PCK" -msgstr "" +msgstr "組ã¿è¾¼ã¿PCK" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Texture Format" -msgstr "テクスãƒãƒ£é ˜åŸŸ" +msgstr "テクスãƒãƒ£å½¢å¼" #: editor/editor_export.cpp msgid "BPTC" -msgstr "" +msgstr "BPTC" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "S3TC" -msgstr "" +msgstr "S3TC" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "ETC" -msgstr "TCP" +msgstr "ETC" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "ETC2" -msgstr "" +msgstr "ETC2" #: editor/editor_export.cpp -#, fuzzy msgid "No BPTC Fallbacks" -msgstr "フォールãƒãƒƒã‚¯" +msgstr "BPTCã«ãƒ•ォールãƒãƒƒã‚¯ã—ãªã„" #: editor/editor_export.cpp platform/android/export/export_plugin.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp @@ -2994,30 +2939,25 @@ msgid "Custom release template not found." msgstr "カスタムリリーステンプレートãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。" #: editor/editor_export.cpp -#, fuzzy msgid "Prepare Template" -msgstr "テンプレートã®ç®¡ç†" +msgstr "ãƒ†ãƒ³ãƒ—ãƒ¬ãƒ¼ãƒˆã®æº–å‚™" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "The given export path doesn't exist." -msgstr "指定ã•れãŸã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆãƒ‘スãŒå˜åœ¨ã—ã¾ã›ã‚“:" +msgstr "指定ã•れãŸã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆãƒ‘スãŒå˜åœ¨ã—ã¾ã›ã‚“。" #: editor/editor_export.cpp platform/javascript/export/export.cpp -#, fuzzy msgid "Template file not found: \"%s\"." -msgstr "テンプレートファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“:" +msgstr "テンプレートファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: \"%s\"。" #: editor/editor_export.cpp -#, fuzzy msgid "Failed to copy export template." -msgstr "無効ãªã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ テンプレート:" +msgstr "エクスãƒãƒ¼ãƒˆãƒ†ãƒ³ãƒ—レートã®ã‚³ãƒ”ーã«å¤±æ•—ã—ã¾ã—ãŸã€‚" #: editor/editor_export.cpp platform/windows/export/export.cpp #: platform/x11/export/export.cpp -#, fuzzy msgid "PCK Embedding" -msgstr "パディング" +msgstr "PCKã®çµ„ã¿è¾¼ã¿" #: editor/editor_export.cpp msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." @@ -3437,6 +3377,7 @@ msgid "ScanSources" msgstr "スã‚ャンソース" #: editor/editor_file_system.cpp +#, fuzzy msgid "" "There are multiple importers for different types pointing to file %s, import " "aborted" @@ -4404,14 +4345,12 @@ msgid "Update Vital Only" msgstr "マテリアルã®å¤‰æ›´:" #: editor/editor_node.cpp -#, fuzzy msgid "Localize Settings" -msgstr "ãƒãƒ¼ã‚«ãƒ©ã‚¤ã‚º" +msgstr "ãƒãƒ¼ã‚«ãƒ©ã‚¤ã‚ºã®è¨å®š" #: editor/editor_node.cpp -#, fuzzy msgid "Restore Scenes On Load" -msgstr "タイムシーク ノード" +msgstr "ãƒãƒ¼ãƒ‰æ™‚ã«ã‚·ãƒ¼ãƒ³ã‚’復元" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Show Thumbnail On Hover" @@ -4422,13 +4361,12 @@ msgid "Inspector" msgstr "インスペクター" #: editor/editor_node.cpp -#, fuzzy msgid "Default Property Name Style" -msgstr "デフォルトã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆãƒ‘ス" +msgstr "デフォルトã®ãƒ—ãƒãƒ‘ティåã®ã‚¹ã‚¿ã‚¤ãƒ«" #: editor/editor_node.cpp msgid "Default Float Step" -msgstr "" +msgstr "デフォルトã®å°æ•°ç‚¹æ•°ã®ã‚¹ãƒ†ãƒƒãƒ—" #: editor/editor_node.cpp scene/gui/tree.cpp msgid "Disable Folding" @@ -4436,24 +4374,25 @@ msgstr "折りãŸãŸã¿ã‚’無効化" #: editor/editor_node.cpp msgid "Auto Unfold Foreign Scenes" -msgstr "" +msgstr "外部シーンã®è‡ªå‹•展開" #: editor/editor_node.cpp +#, fuzzy msgid "Horizontal Vector2 Editing" -msgstr "" +msgstr "水平ベクトル2編集" #: editor/editor_node.cpp +#, fuzzy msgid "Horizontal Vector Types Editing" -msgstr "" +msgstr "水平ベクトルタイプ編集" #: editor/editor_node.cpp msgid "Open Resources In Current Inspector" msgstr "リソースをç¾åœ¨ã®ã‚¤ãƒ³ã‚¹ãƒšã‚¯ã‚¿ãƒ¼ã§é–‹ã" #: editor/editor_node.cpp -#, fuzzy msgid "Resources To Open In New Inspector" -msgstr "インスペクターã§é–‹ã" +msgstr "æ–°è¦ã‚¤ãƒ³ã‚¹ãƒšã‚¯ã‚¿ãƒ¼ã§é–‹ãリソース" #: editor/editor_node.cpp msgid "Default Color Picker Mode" @@ -4567,6 +4506,7 @@ msgstr "ãã®ä»–ã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã¾ãŸã¯ã‚·ãƒ¼ãƒ³å…¨ä½“ã®ãƒ„ール。" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆ" @@ -5113,12 +5053,11 @@ msgstr "デãƒãƒƒã‚¬ãƒ¼" #: editor/editor_profiler.cpp msgid "Profiler Frame History Size" -msgstr "" +msgstr "プãƒãƒ•ァイラーフレームã®å±¥æ´ã‚µã‚¤ã‚º" #: editor/editor_profiler.cpp -#, fuzzy msgid "Profiler Frame Max Functions" -msgstr "関数åを変更" +msgstr "プãƒãƒ•ァイラーフレームã®é–¢æ•°ã®ä¸Šé™" #: editor/editor_properties.cpp msgid "Edit Text:" @@ -5146,7 +5085,7 @@ msgstr "[空]" #: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp msgid "Assign..." -msgstr "割り当ã¦.." +msgstr "割り当ã¦..." #: editor/editor_properties.cpp msgid "Invalid RID" @@ -5187,9 +5126,8 @@ msgid "Size:" msgstr "サイズ:" #: editor/editor_properties_array_dict.cpp -#, fuzzy msgid "Page:" -msgstr "ページ: " +msgstr "ページ:" #: editor/editor_properties_array_dict.cpp #: editor/plugins/theme_editor_plugin.cpp @@ -5256,9 +5194,8 @@ msgid "Base Type" msgstr "基底型を変更" #: editor/editor_resource_picker.cpp -#, fuzzy msgid "Edited Resource" -msgstr "ãƒªã‚½ãƒ¼ã‚¹ã‚’è¿½åŠ " +msgstr "編集ã—ãŸãƒªã‚½ãƒ¼ã‚¹" #: editor/editor_resource_picker.cpp scene/gui/line_edit.cpp #: scene/gui/slider.cpp scene/gui/spin_box.cpp @@ -5288,9 +5225,8 @@ msgstr "" "行å¯èƒ½ã«ã—ã¦ãã ã•ã„。" #: editor/editor_run_native.cpp -#, fuzzy msgid "Project Run" -msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆ" +msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆã®å®Ÿè¡Œ" #: editor/editor_run_script.cpp msgid "Write your logic in the _run() method." @@ -5361,12 +5297,14 @@ msgid "Dim Editor On Dialog Popup" msgstr "ダイアãƒã‚°ã®ãƒãƒƒãƒ—アップ時ã«ã‚¨ãƒ‡ã‚£ã‚¿ãƒ¼ã‚’è–„æš—ãã™ã‚‹" #: editor/editor_settings.cpp main/main.cpp +#, fuzzy msgid "Low Processor Mode Sleep (µsec)" -msgstr "" +msgstr "低プãƒã‚»ãƒƒã‚µ モード スリープ (マイクãƒç§’)" #: editor/editor_settings.cpp +#, fuzzy msgid "Unfocused Low Processor Mode Sleep (µsec)" -msgstr "" +msgstr "フォーカスã•れã¦ã„ãªã„低プãƒã‚»ãƒƒã‚µ モード スリープ (マイクãƒç§’)" #: editor/editor_settings.cpp #, fuzzy @@ -5375,11 +5313,12 @@ msgstr "集ä¸ãƒ¢ãƒ¼ãƒ‰" #: editor/editor_settings.cpp msgid "Automatically Open Screenshots" -msgstr "" +msgstr "自動的ã«ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆã‚’é–‹ã" #: editor/editor_settings.cpp +#, fuzzy msgid "Max Array Dictionary Items Per Page" -msgstr "" +msgstr "ページã‚ãŸã‚Šã®æœ€å¤§é…åˆ—è¾žæ›¸é …ç›®æ•°" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp scene/gui/control.cpp @@ -5408,8 +5347,9 @@ msgid "Contrast" msgstr "コントラスト" #: editor/editor_settings.cpp +#, fuzzy msgid "Relationship Line Opacity" -msgstr "" +msgstr "関係線ã®ä¸é€æ˜Žåº¦" #: editor/editor_settings.cpp msgid "Highlight Tabs" @@ -5420,13 +5360,13 @@ msgid "Border Size" msgstr "ボーダーサイズ" #: editor/editor_settings.cpp +#, fuzzy msgid "Use Graph Node Headers" -msgstr "" +msgstr "グラフ ノード ヘッダーを使用ã™ã‚‹" #: editor/editor_settings.cpp -#, fuzzy msgid "Additional Spacing" -msgstr "アニメーションループ" +msgstr "è¿½åŠ ã®é–“éš”" #: editor/editor_settings.cpp msgid "Custom Theme" @@ -5437,14 +5377,12 @@ msgid "Show Script Button" msgstr "スクリプトボタンを表示" #: editor/editor_settings.cpp -#, fuzzy msgid "Directories" -msgstr "æ–¹å‘" +msgstr "ディレクトリ" #: editor/editor_settings.cpp -#, fuzzy msgid "Autoscan Project Path" -msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆãƒ‘ス:" +msgstr "自動スã‚ャンã™ã‚‹ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆãƒ‘ス" #: editor/editor_settings.cpp msgid "Default Project Path" @@ -5455,13 +5393,13 @@ msgid "On Save" msgstr "ä¿å˜æ™‚" #: editor/editor_settings.cpp -#, fuzzy msgid "Compress Binary Resources" -msgstr "リソースをコピー" +msgstr "ãƒã‚¤ãƒŠãƒªãƒªã‚½ãƒ¼ã‚¹ã®åœ§ç¸®" #: editor/editor_settings.cpp +#, fuzzy msgid "Safe Save On Backup Then Rename" -msgstr "" +msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—時ã«å®‰å…¨ã«ä¿å˜ã—ã¦ã‹ã‚‰åå‰ã‚’変更ã™ã‚‹" #: editor/editor_settings.cpp msgid "File Dialog" @@ -5473,7 +5411,7 @@ msgstr "サムãƒã‚¤ãƒ«ã®ã‚µã‚¤ã‚º" #: editor/editor_settings.cpp msgid "Docks" -msgstr "" +msgstr "ドック" #: editor/editor_settings.cpp msgid "Scene Tree" @@ -5481,7 +5419,7 @@ msgstr "シーンツリー" #: editor/editor_settings.cpp msgid "Start Create Dialog Fully Expanded" -msgstr "" +msgstr "æ–°è¦ä½œæˆãƒ€ã‚¤ã‚¢ãƒã‚°ã®é–‹å§‹æ™‚ã«ã™ã¹ã¦ã‚’展開ã™ã‚‹" #: editor/editor_settings.cpp msgid "Always Show Folders" @@ -5574,17 +5512,17 @@ msgid "Minimap Width" msgstr "ミニマップã®å¹…" #: editor/editor_settings.cpp +#, fuzzy msgid "Mouse Extra Buttons Navigate History" -msgstr "" +msgstr "ãƒžã‚¦ã‚¹è¿½åŠ ãƒœã‚¿ãƒ³ãƒŠãƒ“ã‚²ãƒ¼ãƒˆå±¥æ´" #: editor/editor_settings.cpp -#, fuzzy msgid "Drag And Drop Selection" -msgstr "GridMap ã®é¸æŠž" +msgstr "é¸æŠžç¯„å›²ã®ãƒ‰ãƒ©ãƒƒã‚°ï¼†ãƒ‰ãƒãƒƒãƒ—" #: editor/editor_settings.cpp msgid "Stay In Script Editor On Node Selected" -msgstr "" +msgstr "ãƒŽãƒ¼ãƒ‰é¸æŠžæ™‚ã«ã‚¹ã‚¯ãƒªãƒ—トエディターã«ã¨ã©ã¾ã‚‹" #: editor/editor_settings.cpp msgid "Appearance" @@ -5599,8 +5537,9 @@ msgid "Line Numbers Zero Padded" msgstr "行番å·ã‚’ゼãƒåŸ‹ã‚" #: editor/editor_settings.cpp +#, fuzzy msgid "Show Bookmark Gutter" -msgstr "" +msgstr "ブックマークガターを表示" #: editor/editor_settings.cpp #, fuzzy @@ -5608,8 +5547,9 @@ msgid "Show Breakpoint Gutter" msgstr "ブレークãƒã‚¤ãƒ³ãƒˆã‚’スã‚ップã™ã‚‹" #: editor/editor_settings.cpp +#, fuzzy msgid "Show Info Gutter" -msgstr "" +msgstr "æƒ…å ±ã‚¬ã‚¿ãƒ¼ã‚’è¡¨ç¤º" #: editor/editor_settings.cpp msgid "Code Folding" @@ -5617,30 +5557,32 @@ msgstr "ã‚³ãƒ¼ãƒ‰ã®æŠ˜ã‚ŠãŸãŸã¿" #: editor/editor_settings.cpp msgid "Word Wrap" -msgstr "" +msgstr "ワードラップ" #: editor/editor_settings.cpp msgid "Show Line Length Guidelines" msgstr "行ã®é•·ã•ã®ã‚¬ã‚¤ãƒ‰ç·šã‚’表示" #: editor/editor_settings.cpp +#, fuzzy msgid "Line Length Guideline Soft Column" -msgstr "" +msgstr "行長ガイドラインソフト列" #: editor/editor_settings.cpp +#, fuzzy msgid "Line Length Guideline Hard Column" -msgstr "" +msgstr "行長ガイドライン ãƒãƒ¼ãƒ‰åˆ—" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp msgid "Script List" msgstr "スクリプト一覧" #: editor/editor_settings.cpp +#, fuzzy msgid "Show Members Overview" -msgstr "" +msgstr "メンãƒãƒ¼æ¦‚è¦ã‚’表示" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Files" msgstr "ファイル" @@ -5650,7 +5592,7 @@ msgstr "ä¿å˜æ™‚ã«æœ«å°¾ã®ç©ºç™½ã‚’å–り除ã" #: editor/editor_settings.cpp msgid "Autosave Interval Secs" -msgstr "自動ä¿å˜ã®é–“隔秒数" +msgstr "自動ä¿å˜ã™ã‚‹é–“éš”ã®ç§’æ•°" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp msgid "Restore Scripts On Load" @@ -5669,8 +5611,9 @@ msgid "Create Signal Callbacks" msgstr "シグナルã®ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’作æˆ" #: editor/editor_settings.cpp +#, fuzzy msgid "Sort Members Outline Alphabetically" -msgstr "" +msgstr "メンãƒãƒ¼ã®ã‚¢ã‚¦ãƒˆãƒ©ã‚¤ãƒ³ã‚’ã‚¢ãƒ«ãƒ•ã‚¡ãƒ™ãƒƒãƒˆé †ã«ä¸¦ã¹æ›¿ãˆã‚‹" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Cursor" @@ -5678,7 +5621,7 @@ msgstr "カーソル" #: editor/editor_settings.cpp msgid "Scroll Past End Of File" -msgstr "" +msgstr "ãƒ•ã‚¡ã‚¤ãƒ«ã®æœ«å°¾ã‚’è¶ŠãˆãŸã‚¹ã‚¯ãƒãƒ¼ãƒ«" #: editor/editor_settings.cpp msgid "Block Caret" @@ -5704,28 +5647,27 @@ msgstr "完了" #: editor/editor_settings.cpp msgid "Idle Parse Delay" -msgstr "" +msgstr "アイドル時ã®è§£æžã®é…å»¶" #: editor/editor_settings.cpp msgid "Auto Brace Complete" -msgstr "" +msgstr "波括弧ã®è‡ªå‹•補完" #: editor/editor_settings.cpp msgid "Code Complete Delay" -msgstr "" +msgstr "コード補完ã®é…å»¶" #: editor/editor_settings.cpp msgid "Put Callhint Tooltip Below Current Line" -msgstr "" +msgstr "コード補完ツールãƒãƒƒãƒ—ã‚’ç¾åœ¨ã®è¡Œã®ä¸‹ã«é…ç½®" #: editor/editor_settings.cpp msgid "Callhint Tooltip Offset" -msgstr "" +msgstr "コード補完ツールãƒãƒƒãƒ—ã®ã‚ªãƒ•セット" #: editor/editor_settings.cpp -#, fuzzy msgid "Complete File Paths" -msgstr "ノードã®ãƒ‘スをコピー" +msgstr "ファイルパスã®è£œå®Œ" #: editor/editor_settings.cpp modules/gdscript/gdscript_editor.cpp #, fuzzy @@ -5794,9 +5736,8 @@ msgstr "インスタンス化済" #: editor/editor_settings.cpp modules/gltf/gltf_node.cpp #: scene/3d/physics_body.cpp -#, fuzzy msgid "Joint" -msgstr "点" +msgstr "ジョイント" #: editor/editor_settings.cpp scene/2d/collision_shape_2d.cpp #: scene/2d/cpu_particles_2d.cpp scene/2d/touch_screen_button.cpp @@ -5805,7 +5746,7 @@ msgstr "点" #: scene/resources/particles_material.cpp servers/physics_2d_server.cpp #: servers/physics_server.cpp msgid "Shape" -msgstr "" +msgstr "シェイプ" #: editor/editor_settings.cpp #, fuzzy @@ -5813,36 +5754,32 @@ msgid "Primary Grid Steps" msgstr "グリッドã®ã‚¹ãƒ†ãƒƒãƒ—:" #: editor/editor_settings.cpp -#, fuzzy msgid "Grid Size" -msgstr "グリッドã®ã‚¹ãƒ†ãƒƒãƒ—:" +msgstr "グリッドã®ã‚µã‚¤ã‚º" #: editor/editor_settings.cpp msgid "Grid Division Level Max" -msgstr "" +msgstr "グリッドã®åˆ†å‰²ã®æœ€å¤§ãƒ¬ãƒ™ãƒ«" #: editor/editor_settings.cpp msgid "Grid Division Level Min" -msgstr "" +msgstr "グリッドã®åˆ†å‰²ã®æœ€å°ãƒ¬ãƒ™ãƒ«" #: editor/editor_settings.cpp msgid "Grid Division Level Bias" -msgstr "" +msgstr "グリッドã®åˆ†å‰²ãƒ¬ãƒ™ãƒ«ã®ãƒã‚¤ã‚¢ã‚¹" #: editor/editor_settings.cpp -#, fuzzy msgid "Grid XZ Plane" -msgstr "GridMap ペイント" +msgstr "グリッドã®XZå¹³é¢" #: editor/editor_settings.cpp -#, fuzzy msgid "Grid XY Plane" -msgstr "GridMap ペイント" +msgstr "グリッドã®XYå¹³é¢" #: editor/editor_settings.cpp -#, fuzzy msgid "Grid YZ Plane" -msgstr "GridMap ペイント" +msgstr "グリッドã®YZå¹³é¢" #: editor/editor_settings.cpp msgid "Default FOV" @@ -5861,9 +5798,8 @@ msgid "Lightmap Baking Number Of CPU Threads" msgstr "ライトマップベイクã®CPUスレッド数" #: editor/editor_settings.cpp -#, fuzzy msgid "Navigation Scheme" -msgstr "ナビゲーションモード" +msgstr "ãƒŠãƒ“ã‚²ãƒ¼ã‚·ãƒ§ãƒ³ã®æ–¹å¼" #: editor/editor_settings.cpp msgid "Invert Y Axis" @@ -5901,8 +5837,9 @@ msgid "Zoom Modifier" msgstr "変更済ã¿" #: editor/editor_settings.cpp editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Warped Mouse Panning" -msgstr "" +msgstr "ワープマウスパンニング" #: editor/editor_settings.cpp #, fuzzy @@ -5910,12 +5847,14 @@ msgid "Navigation Feel" msgstr "ナビゲーションモード" #: editor/editor_settings.cpp +#, fuzzy msgid "Orbit Sensitivity" -msgstr "" +msgstr "è»Œé“æ„Ÿåº¦" #: editor/editor_settings.cpp +#, fuzzy msgid "Orbit Inertia" -msgstr "" +msgstr "è»Œé“æ…£æ€§" #: editor/editor_settings.cpp #, fuzzy @@ -6003,16 +5942,19 @@ msgid "Viewport Border Color" msgstr "ビューãƒãƒ¼ãƒˆã®ãƒœãƒ¼ãƒ€ãƒ¼ã®è‰²" #: editor/editor_settings.cpp +#, fuzzy msgid "Constrain Editor View" -msgstr "" +msgstr "エディター ビューを制é™" #: editor/editor_settings.cpp +#, fuzzy msgid "Simple Panning" -msgstr "" +msgstr "簡易パンニング" #: editor/editor_settings.cpp +#, fuzzy msgid "Scroll To Pan" -msgstr "" +msgstr "スクãƒãƒ¼ãƒ«ã—ã¦ãƒ‘ンニング" #: editor/editor_settings.cpp #, fuzzy @@ -6020,13 +5962,13 @@ msgid "Pan Speed" msgstr "速度:" #: editor/editor_settings.cpp editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Poly Editor" -msgstr "Polygon 2D UV エディター" +msgstr "ãƒãƒªã‚´ãƒ³ã‚¨ãƒ‡ã‚£ã‚¿ãƒ¼" #: editor/editor_settings.cpp +#, fuzzy msgid "Point Grab Radius" -msgstr "" +msgstr "ãƒã‚¤ãƒ³ãƒˆã‚°ãƒ©ãƒ–åŠå¾„" #: editor/editor_settings.cpp editor/plugins/polygon_2d_editor_plugin.cpp #, fuzzy @@ -6034,26 +5976,26 @@ msgid "Show Previous Outline" msgstr "å‰ã®å¹³é¢" #: editor/editor_settings.cpp editor/scene_tree_dock.cpp -#, fuzzy msgid "Autorename Animation Tracks" -msgstr "アニメーションã®åå‰ã‚’変更" +msgstr "アニメーションã®ãƒˆãƒ©ãƒƒã‚¯åを自動変更" #: editor/editor_settings.cpp msgid "Default Create Bezier Tracks" -msgstr "" +msgstr "デフォルトã§ãƒ™ã‚¸ã‚§ãƒˆãƒ©ãƒƒã‚¯ã‚’作æˆ" #: editor/editor_settings.cpp -#, fuzzy msgid "Default Create Reset Tracks" -msgstr "RESETトラックを作æˆ" +msgstr "デフォルトã§RESETトラックを作æˆ" #: editor/editor_settings.cpp +#, fuzzy msgid "Onion Layers Past Color" -msgstr "" +msgstr "オニオンレイヤーéŽåŽ»ã®è‰²" #: editor/editor_settings.cpp +#, fuzzy msgid "Onion Layers Future Color" -msgstr "" +msgstr "オニオンレイヤー将æ¥ã®è‰²" #: editor/editor_settings.cpp #, fuzzy @@ -6066,23 +6008,21 @@ msgstr "ミニマップã®ä¸é€æ˜Žåº¦" #: editor/editor_settings.cpp msgid "Window Placement" -msgstr "" +msgstr "ウィンドウã®é…ç½®" #: editor/editor_settings.cpp scene/2d/back_buffer_copy.cpp scene/2d/sprite.cpp #: scene/2d/visibility_notifier_2d.cpp scene/3d/sprite_3d.cpp #: scene/gui/control.cpp -#, fuzzy msgid "Rect" -msgstr "Rectå…¨é¢" +msgstr "矩形" #: editor/editor_settings.cpp -#, fuzzy msgid "Rect Custom Position" -msgstr "曲線ã®Out-Controlã®ä½ç½®ã‚’指定" +msgstr "矩形ã®ã‚«ã‚¹ã‚¿ãƒ ä½ç½®" #: editor/editor_settings.cpp platform/android/export/export_plugin.cpp msgid "Screen" -msgstr "" +msgstr "ç”»é¢" #: editor/editor_settings.cpp msgid "Auto Save" @@ -6183,16 +6123,19 @@ msgid "Completion Selected Color" msgstr "é¸æŠžã•れãŸã‚‚ã®ã‚’インãƒãƒ¼ãƒˆ" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +#, fuzzy msgid "Completion Existing Color" -msgstr "" +msgstr "æ—¢å˜ã®è‰²ã®è£œå®Œ" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +#, fuzzy msgid "Completion Scroll Color" -msgstr "" +msgstr "スクãƒãƒ¼ãƒ«è‰²ã®è£œå®Œ" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +#, fuzzy msgid "Completion Font Color" -msgstr "" +msgstr "フォント色ã®è£œå®Œ" #: editor/editor_settings.cpp msgid "Text Color" @@ -6203,9 +6146,8 @@ msgid "Line Number Color" msgstr "行番å·ã®è‰²" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Safe Line Number Color" -msgstr "行番å·:" +msgstr "安全ãªè¡Œç•ªå·ã®è‰²" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Caret Color" @@ -6289,9 +6231,8 @@ msgid "Flat" msgstr "フラット" #: editor/editor_spin_slider.cpp -#, fuzzy msgid "Hide Slider" -msgstr "コリジョンモード" +msgstr "ã‚¹ãƒ©ã‚¤ãƒ€ãƒ¼ã‚’éš ã™" #: editor/editor_sub_scene.cpp msgid "Select Node(s) to Import" @@ -6958,8 +6899,9 @@ msgid "Collada" msgstr "Collada" #: editor/import/editor_import_collada.cpp +#, fuzzy msgid "Use Ambient" -msgstr "" +msgstr "アンビエントを使用" #: editor/import/resource_importer_bitmask.cpp #, fuzzy @@ -6969,29 +6911,27 @@ msgstr "フォルダーを作æˆ" #: editor/import/resource_importer_bitmask.cpp #: servers/audio/effects/audio_effect_compressor.cpp msgid "Threshold" -msgstr "" +msgstr "ã—ãã„値" #: editor/import/resource_importer_csv_translation.cpp #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_scene.cpp #: editor/import/resource_importer_texture.cpp #: editor/import/resource_importer_wav.cpp scene/3d/gi_probe.cpp -#, fuzzy msgid "Compress" -msgstr "コンãƒãƒ¼ãƒãƒ³ãƒˆ" +msgstr "圧縮" #: editor/import/resource_importer_csv_translation.cpp msgid "Delimiter" -msgstr "" +msgstr "区切り文å—" #: editor/import/resource_importer_layered_texture.cpp -#, fuzzy msgid "ColorCorrect" -msgstr "Color関数。" +msgstr "ColorCorrect" #: editor/import/resource_importer_layered_texture.cpp msgid "No BPTC If RGB" -msgstr "" +msgstr "RGBã®å ´åˆã¯BPTCãªã—ã«ã™ã‚‹" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp scene/2d/cpu_particles_2d.cpp @@ -7005,56 +6945,51 @@ msgstr "フラグ" #: editor/import/resource_importer_texture.cpp scene/animation/tween.cpp #: scene/resources/texture.cpp msgid "Repeat" -msgstr "" +msgstr "繰り返ã—" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp scene/2d/light_2d.cpp #: scene/gui/control.cpp -#, fuzzy msgid "Filter" -msgstr "フィルター:" +msgstr "フィルター" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Mipmaps" -msgstr "シグナル" +msgstr "ミップマップ" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp +#, fuzzy msgid "Anisotropic" -msgstr "" +msgstr "異方性" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp msgid "sRGB" -msgstr "" +msgstr "sRGB" #: editor/import/resource_importer_layered_texture.cpp -#, fuzzy msgid "Slices" -msgstr "自動スライス" +msgstr "スライス" #: editor/import/resource_importer_layered_texture.cpp #: scene/gui/aspect_ratio_container.cpp scene/gui/control.cpp #: scene/gui/nine_patch_rect.cpp scene/gui/scroll_container.cpp #: scene/resources/style_box.cpp -#, fuzzy msgid "Horizontal" -msgstr "æ°´å¹³:" +msgstr "æ°´å¹³" #: editor/import/resource_importer_layered_texture.cpp #: scene/gui/aspect_ratio_container.cpp scene/gui/control.cpp #: scene/gui/nine_patch_rect.cpp scene/gui/scroll_container.cpp #: scene/resources/style_box.cpp -#, fuzzy msgid "Vertical" -msgstr "垂直:" +msgstr "垂直" #: editor/import/resource_importer_obj.cpp -#, fuzzy msgid "Generate Tangents" -msgstr "ãƒã‚¤ãƒ³ãƒˆã‚’生æˆ" +msgstr "接線を生æˆ" #: editor/import/resource_importer_obj.cpp #, fuzzy @@ -7062,9 +6997,8 @@ msgid "Scale Mesh" msgstr "スケールモード" #: editor/import/resource_importer_obj.cpp -#, fuzzy msgid "Offset Mesh" -msgstr "オフセット:" +msgstr "メッシュã®ã‚ªãƒ•セット" #: editor/import/resource_importer_obj.cpp #: editor/import/resource_importer_scene.cpp @@ -7119,24 +7053,20 @@ msgstr "複数ã®ã‚·ãƒ¼ãƒ³ï¼‹ãƒžãƒ†ãƒªã‚¢ãƒ«ã¨ã—ã¦ã‚¤ãƒ³ãƒãƒ¼ãƒˆ" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Nodes" msgstr "ノード" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Root Type" -msgstr "Return(戻り値)" +msgstr "ルートã®åž‹" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Root Name" -msgstr "リモートå" +msgstr "ルートã®åå‰" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Root Scale" -msgstr "スケール" +msgstr "ルートã®ã‚¹ã‚±ãƒ¼ãƒ«" #: editor/import/resource_importer_scene.cpp #, fuzzy @@ -7144,18 +7074,16 @@ msgid "Custom Script" msgstr "ノードを切りå–ã‚‹" #: editor/import/resource_importer_scene.cpp scene/resources/texture.cpp -#, fuzzy msgid "Storage" -msgstr "ファイルã®ä¿å˜:" +msgstr "ストレージ" #: editor/import/resource_importer_scene.cpp msgid "Use Legacy Names" -msgstr "" +msgstr "レガシーãªåå‰ã‚’使用" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp -#, fuzzy msgid "Materials" -msgstr "マテリアルã®å¤‰æ›´:" +msgstr "マテリアル" #: editor/import/resource_importer_scene.cpp #, fuzzy @@ -7163,7 +7091,6 @@ msgid "Keep On Reimport" msgstr "å†ã‚¤ãƒ³ãƒãƒ¼ãƒˆ" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp -#, fuzzy msgid "Meshes" msgstr "メッシュ" @@ -7184,24 +7111,21 @@ msgstr "ライトマップを焼ã込む" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp msgid "Skins" -msgstr "" +msgstr "スã‚ン" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Use Named Skins" -msgstr "スケールスナップを使用" +msgstr "åå‰ä»˜ãスã‚ンã®ä½¿ç”¨" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "External Files" -msgstr "外部" +msgstr "外部ファイル" #: editor/import/resource_importer_scene.cpp msgid "Store In Subdir" -msgstr "" +msgstr "サブディレクトリã«ä¿å˜" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Filter Script" msgstr "スクリプトを絞り込む" @@ -7227,7 +7151,6 @@ msgstr "最é©åŒ–" #: scene/3d/sprite_3d.cpp scene/gui/graph_edit.cpp #: scene/gui/rich_text_label.cpp scene/resources/curve.cpp #: scene/resources/environment.cpp scene/resources/material.cpp -#, fuzzy msgid "Enabled" msgstr "有効" @@ -7247,14 +7170,12 @@ msgid "Max Angle" msgstr "値" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Remove Unused Tracks" -msgstr "アニメーショントラックを除去" +msgstr "未使用ã®ãƒˆãƒ©ãƒƒã‚¯ã‚’除去" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Clips" -msgstr "アニメーションクリップ" +msgstr "クリップ" #: editor/import/resource_importer_scene.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/particles_2d.cpp scene/3d/area.cpp scene/3d/cpu_particles.cpp @@ -7306,45 +7227,53 @@ msgid "Saving..." msgstr "ä¿å˜ä¸..." #: editor/import/resource_importer_texture.cpp +#, fuzzy msgid "" "%s: Texture detected as used as a normal map in 3D. Enabling red-green " "texture compression to reduce memory usage (blue channel is discarded)." msgstr "" +"%s: 3Dã§æ³•線マップã¨ã—ã¦ä½¿ç”¨ã•れã¦ã„るテクスãƒãƒ£ãŒæ¤œå‡ºã•れã¾ã—ãŸã€‚赤緑テクス" +"ãƒãƒ£åœ§ç¸®ã‚’有効ã«ã—ã¦ãƒ¡ãƒ¢ãƒªä½¿ç”¨é‡ã‚’削減ã—ã¾ã™ï¼ˆé’ãƒãƒ£ãƒ³ãƒãƒ«ã¯ã™ã§ã«ç ´æ£„ã•れã¾" +"ã—ãŸï¼‰ã€‚" #: editor/import/resource_importer_texture.cpp +#, fuzzy msgid "" "%s: Texture detected as used in 3D. Enabling filter, repeat, mipmap " "generation and VRAM texture compression." msgstr "" +"%s: 3Dã§ä½¿ç”¨ã•れã¦ã„るテクスãƒãƒ£ãŒæ¤œå‡ºã•れã¾ã—ãŸã€‚フィルターã€ç¹°ã‚Šè¿”ã—ã€ãƒŸãƒƒ" +"プマップ生æˆã€VRAMテクスãƒãƒ£åœ§ç¸®ã‚’有効ã«ã—ã¾ã™ã€‚" #: editor/import/resource_importer_texture.cpp +#, fuzzy msgid "2D, Detect 3D" -msgstr "" +msgstr "2Dã€3D検出" #: editor/import/resource_importer_texture.cpp #, fuzzy msgid "2D Pixel" -msgstr "å‡é›†ãƒ”クセル" +msgstr "2Dピクセル" #: editor/import/resource_importer_texture.cpp scene/resources/texture.cpp +#, fuzzy msgid "Lossy Quality" -msgstr "" +msgstr "æå¤±ã®ã‚ã‚‹å“質" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "HDR Mode" -msgstr "é¸æŠžãƒ¢ãƒ¼ãƒ‰" +msgstr "HDRモード" #: editor/import/resource_importer_texture.cpp msgid "BPTC LDR" -msgstr "" +msgstr "BPTC LDR" #: editor/import/resource_importer_texture.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/mesh_instance_2d.cpp scene/2d/multimesh_instance_2d.cpp #: scene/2d/particles_2d.cpp scene/2d/sprite.cpp scene/resources/style_box.cpp msgid "Normal Map" -msgstr "" +msgstr "法線マップ" #: editor/import/resource_importer_texture.cpp #, fuzzy @@ -7352,8 +7281,9 @@ msgid "Process" msgstr "å‰å‡¦ç†" #: editor/import/resource_importer_texture.cpp +#, fuzzy msgid "Fix Alpha Border" -msgstr "" +msgstr "アルファボーダーを修æ£" #: editor/import/resource_importer_texture.cpp #, fuzzy @@ -7361,8 +7291,9 @@ msgid "Premult Alpha" msgstr "ãƒãƒªã‚´ãƒ³ã‚’編集" #: editor/import/resource_importer_texture.cpp +#, fuzzy msgid "Hdr As Srgb" -msgstr "" +msgstr "Srgbã¨ã—ã¦Hdr" #: editor/import/resource_importer_texture.cpp #, fuzzy @@ -7379,29 +7310,29 @@ msgid "Size Limit" msgstr "サイズ制é™" #: editor/import/resource_importer_texture.cpp +#, fuzzy msgid "Detect 3D" -msgstr "" +msgstr "3Dを検出" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "SVG" -msgstr "CSG" +msgstr "SVG" #: editor/import/resource_importer_texture.cpp msgid "" "Warning, no suitable PC VRAM compression enabled in Project Settings. This " "texture will not display correctly on PC." msgstr "" +"è¦å‘Šã€ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆè¨å®šã§é©åˆ‡ãªPC VRAMåœ§ç¸®ãŒæœ‰åŠ¹åŒ–ã•れã¦ã„ã¾ã›ã‚“。ã“ã®ãƒ†ã‚¯ã‚¹" +"ãƒãƒ£ã¯ PCã§æ£ã—ã表示ã•れã¾ã›ã‚“。" #: editor/import/resource_importer_texture_atlas.cpp -#, fuzzy msgid "Atlas File" -msgstr "アウトラインã®ã‚µã‚¤ã‚º:" +msgstr "アトラスファイル" #: editor/import/resource_importer_texture_atlas.cpp -#, fuzzy msgid "Import Mode" -msgstr "エクスãƒãƒ¼ãƒˆãƒ¢ãƒ¼ãƒ‰:" +msgstr "インãƒãƒ¼ãƒˆãƒ¢ãƒ¼ãƒ‰" #: editor/import/resource_importer_texture_atlas.cpp #, fuzzy @@ -7409,8 +7340,9 @@ msgid "Crop To Region" msgstr "ã‚¿ã‚¤ãƒ«é ˜åŸŸã‚’è¨å®š" #: editor/import/resource_importer_texture_atlas.cpp +#, fuzzy msgid "Trim Alpha Border From Region" -msgstr "" +msgstr "ã‚¢ãƒ«ãƒ•ã‚¡å¢ƒç•Œç·šã‚’é ˜åŸŸã‹ã‚‰ãƒˆãƒªãƒŸãƒ³ã‚°" #: editor/import/resource_importer_wav.cpp scene/2d/physics_body_2d.cpp #, fuzzy @@ -7419,10 +7351,11 @@ msgstr "強制プッシュ" #: editor/import/resource_importer_wav.cpp msgid "8 Bit" -msgstr "" +msgstr "8ビット" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "Mono" @@ -7438,30 +7371,26 @@ msgstr "ミックス ノード" #: editor/import/resource_importer_wav.cpp msgid "Trim" -msgstr "" +msgstr "トリム" #: editor/import/resource_importer_wav.cpp -#, fuzzy msgid "Normalize" -msgstr "フォーマット" +msgstr "ノーマライズ" #: editor/import/resource_importer_wav.cpp #: scene/resources/audio_stream_sample.cpp -#, fuzzy msgid "Loop Mode" -msgstr "移動モード" +msgstr "ループモード" #: editor/import/resource_importer_wav.cpp #: scene/resources/audio_stream_sample.cpp -#, fuzzy msgid "Loop Begin" -msgstr "移動モード" +msgstr "ループã®é–‹å§‹" #: editor/import/resource_importer_wav.cpp #: scene/resources/audio_stream_sample.cpp -#, fuzzy msgid "Loop End" -msgstr "移動モード" +msgstr "ループã®çµ‚了" #: editor/import_defaults_editor.cpp msgid "Select Importer" @@ -7531,17 +7460,16 @@ msgid "" "Select a resource file in the filesystem or in the inspector to adjust " "import settings." msgstr "" -"ファイルシステムや Inspector ã«ã‚ã‚‹ Resource ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠžã—ã¦ã‚¤ãƒ³ãƒãƒ¼ãƒˆè¨å®š" -"を調整ã—ã¦ãã ã•ã„。" +"ファイルシステムやインスペクターã«ã‚ã‚‹ãƒªã‚½ãƒ¼ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠžã—ã¦ã‚¤ãƒ³ãƒãƒ¼ãƒˆè¨" +"定を調整ã—ã¾ã™ã€‚" #: editor/inspector_dock.cpp msgid "Failed to load resource." msgstr "リソースã®èªã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸã€‚" #: editor/inspector_dock.cpp -#, fuzzy msgid "Property Name Style" -msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆå:" +msgstr "プãƒãƒ‘ティåã®ã‚¹ã‚¿ã‚¤ãƒ«" #: editor/inspector_dock.cpp scene/gui/color_picker.cpp msgid "Raw" @@ -7553,13 +7481,12 @@ msgid "Capitalized" msgstr "å˜èªžã®å…ˆé æ–‡å—を大文å—ã«" #: editor/inspector_dock.cpp -#, fuzzy msgid "Localized" -msgstr "ãƒã‚±ãƒ¼ãƒ«" +msgstr "ãƒãƒ¼ã‚«ãƒ©ã‚¤ã‚ºæ¸ˆ" #: editor/inspector_dock.cpp msgid "Localization not available for current language." -msgstr "" +msgstr "ãƒãƒ¼ã‚«ãƒ©ã‚¤ã‚ºåŒ–ã¯ç¾åœ¨ã®è¨€èªžã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。" #: editor/inspector_dock.cpp msgid "Copy Properties" @@ -8292,9 +8219,8 @@ msgid "Set the end animation. This is useful for sub-transitions." msgstr "終了アニメーションをè¨å®šã™ã‚‹ã€‚ã“れã¯ã‚µãƒ–トランジションã«ä¾¿åˆ©ã§ã™ã€‚" #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Transition:" -msgstr "トランジション: " +msgstr "トランジション:" #: editor/plugins/animation_state_machine_editor.cpp msgid "Play Mode:" @@ -8595,25 +8521,21 @@ msgid "Loading..." msgstr "èªã¿è¾¼ã¿ä¸..." #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgctxt "Pagination" msgid "First" msgstr "最åˆ" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgctxt "Pagination" msgid "Previous" msgstr "å‰" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgctxt "Pagination" msgid "Next" msgstr "次" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgctxt "Pagination" msgid "Last" msgstr "最後" @@ -8664,7 +8586,7 @@ msgstr "試験的" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed to get repository configuration." -msgstr "" +msgstr "リãƒã‚¸ãƒˆãƒªæ§‹æˆã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Assets ZIP File" @@ -9591,17 +9513,18 @@ msgid "Gradient Edited" msgstr "グラデーション編集" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp +#, fuzzy msgid "Swap GradientTexture2D Fill Points" -msgstr "" +msgstr "GradientTexture2D 塗りã¤ã¶ã—ãƒã‚¤ãƒ³ãƒˆã‚’入れ替ãˆ" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp +#, fuzzy msgid "Swap Gradient Fill Points" -msgstr "" +msgstr "Gradient ã®å¡—りã¤ã¶ã—ãƒã‚¤ãƒ³ãƒˆã‚’入れ替ãˆ" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp -#, fuzzy msgid "Toggle Grid Snap" -msgstr "グリッドã®åˆ‡ã‚Šæ›¿ãˆ" +msgstr "グリッドスナップã®åˆ‡ã‚Šæ›¿ãˆ" #: editor/plugins/item_list_editor_plugin.cpp editor/project_export.cpp #: scene/3d/label_3d.cpp scene/gui/button.cpp scene/gui/dialogs.cpp @@ -9620,13 +9543,12 @@ msgstr "アイコン" #: editor/plugins/item_list_editor_plugin.cpp msgid "ID" -msgstr "" +msgstr "ID" #: editor/plugins/item_list_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Separator" -msgstr "分離:" +msgstr "セパレーター" #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" @@ -9862,7 +9784,6 @@ msgstr "" "%s" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "MeshLibrary" msgstr "メッシュライブラリ" @@ -10416,8 +10337,9 @@ msgid "Sync Bones to Polygon" msgstr "ボーンをãƒãƒªã‚´ãƒ³ã«åŒæœŸã•ã›ã‚‹" #: editor/plugins/ray_cast_2d_editor_plugin.cpp +#, fuzzy msgid "Set cast_to" -msgstr "" +msgstr "cast_to ã‚’è¨å®š" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "ERROR: Couldn't load resource!" @@ -10748,8 +10670,9 @@ msgid "Search Results" msgstr "æ¤œç´¢çµæžœ" #: editor/plugins/script_editor_plugin.cpp +#, fuzzy msgid "Open Dominant Script On Scene Change" -msgstr "" +msgstr "シーン変更時ã«ãƒ‰ãƒŸãƒŠãƒ³ãƒˆã‚¹ã‚¯ãƒªãƒ—トを開ã" #: editor/plugins/script_editor_plugin.cpp msgid "External" @@ -10773,8 +10696,9 @@ msgid "Highlight Current Script" msgstr "ç¾åœ¨ã®ã‚¹ã‚¯ãƒªãƒ—トをãƒã‚¤ãƒ©ã‚¤ãƒˆã™ã‚‹" #: editor/plugins/script_editor_plugin.cpp +#, fuzzy msgid "Script Temperature History Size" -msgstr "" +msgstr "スクリプト温度履æ´ã‚µã‚¤ã‚º" #: editor/plugins/script_editor_plugin.cpp msgid "Current Script Background Color" @@ -10795,7 +10719,7 @@ msgstr "スクリプトå:" #: editor/plugins/script_editor_plugin.cpp msgid "Exec Flags" -msgstr "" +msgstr "実行フラグ" #: editor/plugins/script_editor_plugin.cpp msgid "Clear Recent Scripts" @@ -11613,12 +11537,14 @@ msgid "Post" msgstr "後" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Manipulator Gizmo Size" -msgstr "" +msgstr "マニピュレータギズモサイズ" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Manipulator Gizmo Opacity" -msgstr "" +msgstr "マニピュレータギズモä¸é€æ˜Žåº¦" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -11674,9 +11600,8 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "ジオメトリãŒç„¡åйã§ã™ã€‚メッシュã«ç½®ãæ›ãˆã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Convert to MeshInstance2D" -msgstr "Mesh2Dã«å¤‰æ›ã™ã‚‹" +msgstr "MeshInstance2Dã«å¤‰æ›ã™ã‚‹" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't create polygon." @@ -11712,14 +11637,12 @@ msgid "Simplification:" msgstr "簡略化: " #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Shrink (Pixels):" -msgstr "ç¸®å° (ピクセル): " +msgstr "ç¸®å° (ピクセル):" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Grow (Pixels):" -msgstr "拡大(ピクセル): " +msgstr "拡大(ピクセル):" #: editor/plugins/sprite_editor_plugin.cpp msgid "Update Preview" @@ -11782,9 +11705,8 @@ msgid "New Animation" msgstr "æ–°è¦ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Filter animations" -msgstr "メソッドを絞り込む" +msgstr "アニメーションを絞り込む" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed:" @@ -12334,14 +12256,18 @@ msgid "Override all default type items." msgstr "ã™ã¹ã¦ã®ãƒ‡ãƒ•ォルトタイプã®ã‚¢ã‚¤ãƒ†ãƒ をオーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã™ã‚‹ã€‚" #: editor/plugins/theme_editor_plugin.cpp +#, fuzzy msgid "Select the variation base type from a list of available types." -msgstr "" +msgstr "使用å¯èƒ½ãªã‚¿ã‚¤ãƒ—ã®ãƒªã‚¹ãƒˆã‹ã‚‰ãƒãƒªã‚¨ãƒ¼ã‚·ãƒ§ãƒ³åŸºåº•åž‹ã‚’é¸æŠžã€‚" #: editor/plugins/theme_editor_plugin.cpp +#, fuzzy msgid "" "A type associated with a built-in class cannot be marked as a variation of " "another type." msgstr "" +"組ã¿è¾¼ã¿ã‚¯ãƒ©ã‚¹ã«é–¢é€£ã™ã‚‹åž‹ã‚’ã€åˆ¥ã®åž‹ã®ãƒãƒªã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã™ã‚‹ã“ã¨ã¯ã§" +"ãã¾ã›ã‚“。" #: editor/plugins/theme_editor_plugin.cpp msgid "Theme:" @@ -12975,9 +12901,8 @@ msgstr "スナッピングオプション" #: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp #: scene/main/canvas_layer.cpp scene/resources/material.cpp #: scene/resources/particles_material.cpp scene/resources/style_box.cpp -#, fuzzy msgid "Offset" -msgstr "オフセット:" +msgstr "オフセット" #: editor/plugins/tile_set_editor_plugin.cpp editor/rename_dialog.cpp #: scene/gui/range.cpp scene/resources/animation.cpp @@ -13004,9 +12929,8 @@ msgstr "é¸æŠž" #: scene/gui/nine_patch_rect.cpp scene/gui/texture_rect.cpp #: scene/resources/material.cpp scene/resources/sky.cpp #: scene/resources/style_box.cpp scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Texture" -msgstr "テã‚スト" +msgstr "テクスãƒãƒ£" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -13026,9 +12950,8 @@ msgid "Modulate" msgstr "ãƒ‡ãƒ¼ã‚¿ã®æŠ•å…¥" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Tile Mode" -msgstr "モード切り替ãˆ" +msgstr "タイルモード" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -13036,24 +12959,20 @@ msgid "Autotile Bitmask Mode" msgstr "ビットマスクモード" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Subtile Size" -msgstr "アウトラインã®ã‚µã‚¤ã‚º:" +msgstr "サブタイルã®ã‚µã‚¤ã‚º" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Subtile Spacing" -msgstr "行間隔" +msgstr "サブタイルã®é–“éš”" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Occluder Offset" -msgstr "オクルーダーãƒãƒªã‚´ãƒ³ã‚’生æˆ" +msgstr "オクルーダーã®ã‚ªãƒ•セット" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Navigation Offset" -msgstr "ナビゲーションモード" +msgstr "ナビゲーションã®ã‚ªãƒ•セット" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -14168,8 +14087,9 @@ msgid "Runnable" msgstr "実行å¯èƒ½" #: editor/project_export.cpp +#, fuzzy msgid "Export the project for all the presets defined." -msgstr "" +msgstr "定義ã•れãŸã™ã¹ã¦ã®ãƒ—リセットã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã‚’エクスãƒãƒ¼ãƒˆã€‚" #: editor/project_export.cpp msgid "All presets must have an export path defined for Export All to work." @@ -14288,51 +14208,44 @@ msgid "" msgstr "" #: editor/project_export.cpp -#, fuzzy msgid "More Info..." -msgstr "移動..." +msgstr "è©³ç´°æƒ…å ±..." #: editor/project_export.cpp -#, fuzzy msgid "Export PCK/Zip..." -msgstr "PCK/Zipã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ" +msgstr "PCK/Zipã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ..." #: editor/project_export.cpp -#, fuzzy msgid "Export Project..." -msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ" +msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ..." #: editor/project_export.cpp msgid "Export All" msgstr "ã™ã¹ã¦ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ" #: editor/project_export.cpp -#, fuzzy msgid "Choose an export mode:" -msgstr "空ã®ãƒ•ã‚©ãƒ«ãƒ€ãƒ¼ã‚’é¸æŠžã—ã¦ãã ã•ã„。" +msgstr "エクスãƒãƒ¼ãƒˆã®ãƒ¢ãƒ¼ãƒ‰ã‚’é¸æŠž:" #: editor/project_export.cpp -#, fuzzy msgid "Export All..." -msgstr "ã™ã¹ã¦ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ" +msgstr "ã™ã¹ã¦ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ..." #: editor/project_export.cpp editor/project_manager.cpp msgid "ZIP File" msgstr "ZIPファイル" #: editor/project_export.cpp -#, fuzzy msgid "Godot Project Pack" -msgstr "Godotゲームパック" +msgstr "Godotプãƒã‚¸ã‚§ã‚¯ãƒˆãƒ‘ック" #: editor/project_export.cpp msgid "Export templates for this platform are missing:" msgstr "ã“ã®ãƒ—ラットフォームã«å¯¾ã™ã‚‹ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ テンプレートãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“:" #: editor/project_export.cpp -#, fuzzy msgid "Project Export" -msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆå‰µå§‹è€…" +msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ" #: editor/project_export.cpp msgid "Manage Export Templates" @@ -14416,7 +14329,7 @@ msgstr "project.godot をプãƒã‚¸ã‚§ã‚¯ãƒˆãƒ‘スã«ç”Ÿæˆã§ãã¾ã›ã‚“ã§ã—ã #: editor/project_manager.cpp msgid "Error opening package file, not in ZIP format." -msgstr "パッケージファイルを開ã‘ã¾ã›ã‚“ã§ã—ãŸã€zip å½¢å¼ã§ã¯ã‚りã¾ã›ã‚“。" +msgstr "パッケージファイルを開ã‘ã¾ã›ã‚“ã§ã—ãŸã€ZIPå½¢å¼ã§ã¯ã‚りã¾ã›ã‚“。" #: editor/project_manager.cpp msgid "The following files failed extraction from package:" @@ -14643,7 +14556,6 @@ msgstr "" #. TRANSLATORS: This refers to the application where users manage their Godot projects. #: editor/project_manager.cpp -#, fuzzy msgctxt "Application" msgid "Project Manager" msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼" @@ -15440,18 +15352,19 @@ msgstr "" msgid "Make Local" msgstr "ãƒãƒ¼ã‚«ãƒ«ã«ã™ã‚‹" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "ノードå:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "ä»–ã®é–¢æ•°/変数/シグナルã«ã‚ˆã‚Šã™ã§ã«ä½¿ã‚れã¦ã„ã‚‹åå‰:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "ノードå:" #: editor/scene_tree_dock.cpp @@ -15654,6 +15567,11 @@ msgid "Button Group" msgstr "ボタングループ" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "ノードå:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(接続元)" @@ -15729,6 +15647,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "無効ãªãƒŽãƒ¼ãƒ‰åã€‚ä»¥ä¸‹ã®æ–‡å—ã¯ä½¿ãˆã¾ã›ã‚“:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "æ—¢ã«ã‚·ãƒ¼ãƒ³ä¸ã®ä»–ã®ãƒŽãƒ¼ãƒ‰ã«ã“ã®å›ºæœ‰åãŒä½¿ã‚れã¦ã„ã¾ã™ã€‚" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "ノードã®åå‰ã‚’変更" @@ -15877,9 +15799,8 @@ msgid "Attach Node Script" msgstr "ノードã«ã‚¹ã‚¯ãƒªãƒ—トをアタッãƒã™ã‚‹" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Remote %s:" -msgstr "リモート " +msgstr "リモート %s:" #: editor/script_editor_debugger.cpp msgid "Bytes:" @@ -15967,7 +15888,7 @@ msgstr "ãƒªãƒ¢ãƒ¼ãƒˆã‚·ãƒ¼ãƒ³ãƒ„ãƒªãƒ¼ã®æ›´æ–°é–“éš”" #: editor/script_editor_debugger.cpp msgid "Remote Inspect Refresh Interval" -msgstr "" +msgstr "リモートインスペクトã®ãƒªãƒ•レッシュ間隔" #: editor/script_editor_debugger.cpp msgid "Network Profiler" @@ -16075,7 +15996,7 @@ msgstr "AudioStreamPlayer3Dã®æ”¾å°„角度を変更ã™ã‚‹" #: platform/osx/export/export.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Camera" -msgstr "" +msgstr "カメラ" #: editor/spatial_editor_gizmos.cpp msgid "Change Camera FOV" @@ -16159,11 +16080,11 @@ msgstr "ナビゲーションソリッド無効化" #: editor/spatial_editor_gizmos.cpp msgid "Joint Body A" -msgstr "" +msgstr "ジョイント ボディA" #: editor/spatial_editor_gizmos.cpp msgid "Joint Body B" -msgstr "" +msgstr "ジョイント ボディB" #: editor/spatial_editor_gizmos.cpp msgid "Room Edge" @@ -16204,9 +16125,8 @@ msgstr "戻る" #: editor/spatial_editor_gizmos.cpp scene/2d/light_occluder_2d.cpp #: scene/2d/tile_map.cpp -#, fuzzy msgid "Occluder" -msgstr "オクルージョンモード" +msgstr "オクルーダー" #: editor/spatial_editor_gizmos.cpp msgid "Set Occluder Sphere Radius" @@ -16290,7 +16210,7 @@ msgstr "1ç§’ã‚ãŸã‚Šã®æœ€å¤§è¦å‘Šæ•°" #: main/main.cpp msgid "Flush stdout On Print" -msgstr "" +msgstr "Print時ã«stdoutをフラッシュ" #: main/main.cpp servers/visual_server.cpp msgid "Logging" @@ -16375,7 +16295,7 @@ msgstr "スレッドモデル" #: main/main.cpp msgid "Thread Safe BVH" -msgstr "" +msgstr "スレッドセーフãªBVH" #: main/main.cpp msgid "Handheld" @@ -16394,9 +16314,8 @@ msgid "Common" msgstr "コミュニティ" #: main/main.cpp -#, fuzzy msgid "Physics FPS" -msgstr "物ç†ãƒ•レーム%" +msgstr "物ç†FPS" #: main/main.cpp #, fuzzy @@ -16419,28 +16338,25 @@ msgstr "" #: main/main.cpp msgid "stdout" -msgstr "" +msgstr "stdout" #: main/main.cpp msgid "Print FPS" -msgstr "" +msgstr "FPSを表示ã™ã‚‹" #: main/main.cpp msgid "Verbose stdout" -msgstr "" +msgstr "冗長ãªstdout" #: main/main.cpp scene/main/scene_tree.cpp scene/resources/multimesh.cpp -#, fuzzy msgid "Physics Interpolation" -msgstr "補間モード" +msgstr "物ç†è£œé–“" #: main/main.cpp -#, fuzzy msgid "Enable Warnings" -msgstr "フィルタリングを有効化" +msgstr "è¦å‘Šã‚’有効化" #: main/main.cpp -#, fuzzy msgid "Frame Delay Msec" msgstr "フレームé…å»¶ (ミリ秒)" @@ -16488,9 +16404,8 @@ msgstr "シェーダーフォールãƒãƒƒã‚¯ã‚’強制" #: main/main.cpp scene/3d/baked_lightmap.cpp scene/3d/camera.cpp #: scene/3d/world_environment.cpp scene/main/scene_tree.cpp #: scene/resources/world.cpp -#, fuzzy msgid "Environment" -msgstr "環境を表示" +msgstr "環境" #: main/main.cpp msgid "Default Clear Color" @@ -16811,22 +16726,19 @@ msgstr "DTLSを使用" #: modules/fbx/editor_scene_importer_fbx.cpp msgid "FBX" -msgstr "" +msgstr "FBX" #: modules/fbx/editor_scene_importer_fbx.cpp -#, fuzzy msgid "Use FBX" -msgstr "BVHを使用" +msgstr "FBXを使用" #: modules/gdnative/gdnative.cpp -#, fuzzy msgid "Config File" -msgstr "ファイルã®ä¿å˜:" +msgstr "æ§‹æˆãƒ•ァイル" #: modules/gdnative/gdnative.cpp -#, fuzzy msgid "Load Once" -msgstr "リソースをèªã¿è¾¼ã‚€" +msgstr "一度ã ã‘èªã¿è¾¼ã‚€" #: modules/gdnative/gdnative.cpp #: modules/visual_script/visual_script_func_nodes.cpp @@ -16834,14 +16746,12 @@ msgid "Singleton" msgstr "シングルトン" #: modules/gdnative/gdnative.cpp -#, fuzzy msgid "Symbol Prefix" -msgstr "接é 辞:" +msgstr "ã‚·ãƒ³ãƒœãƒ«ã®æŽ¥é 辞" #: modules/gdnative/gdnative.cpp -#, fuzzy msgid "Reloadable" -msgstr "å†èªã¿è¾¼ã¿" +msgstr "å†èªã¿è¾¼ã¿å¯èƒ½" #: modules/gdnative/gdnative.cpp #: modules/gdnative/gdnative_library_singleton_editor.cpp @@ -16894,9 +16804,8 @@ msgid "Disabled GDNative Singleton" msgstr "無効ãªGDNativeシングルトン" #: modules/gdnative/gdnative_library_singleton_editor.cpp -#, fuzzy msgid "Libraries:" -msgstr "ライブラリ: " +msgstr "ライブラリ:" #: modules/gdnative/nativescript/nativescript.cpp msgid "Class Name" @@ -16937,11 +16846,11 @@ msgstr "è¦å‘Šã‚’エラーã¨ã—ã¦æ‰±ã†" #: modules/gdscript/gdscript.cpp msgid "Exclude Addons" -msgstr "" +msgstr "アドオンを除外" #: modules/gdscript/gdscript.cpp msgid "Autocomplete Setters And Getters" -msgstr "" +msgstr "セッターã¨ã‚²ãƒƒã‚¿ãƒ¼ã‚’自動補完" #: modules/gdscript/gdscript_functions.cpp msgid "Step argument is zero!" @@ -16984,9 +16893,8 @@ msgid "Language Server" msgstr "言語サーãƒãƒ¼" #: modules/gdscript/language_server/gdscript_language_server.cpp -#, fuzzy msgid "Enable Smart Resolve" -msgstr "解決ã§ãã¾ã›ã‚“" +msgstr "Smart Resolveを有効化" #: modules/gdscript/language_server/gdscript_language_server.cpp msgid "Show Native Symbols In Editor" @@ -17083,18 +16991,16 @@ msgid "Indices" msgstr "ã™ã¹ã¦ã®ãƒ‡ãƒã‚¤ã‚¹" #: modules/gltf/gltf_camera.cpp -#, fuzzy msgid "FOV Size" -msgstr "サイズ:" +msgstr "FOVサイズ" #: modules/gltf/gltf_camera.cpp msgid "Zfar" -msgstr "" +msgstr "Zfar" #: modules/gltf/gltf_camera.cpp -#, fuzzy msgid "Znear" -msgstr "リニア" +msgstr "Znear" #: modules/gltf/gltf_light.cpp scene/2d/canvas_modulate.cpp #: scene/2d/cpu_particles_2d.cpp scene/2d/light_2d.cpp scene/2d/polygon_2d.cpp @@ -17146,7 +17052,7 @@ msgstr "プラットフォーム" #: modules/gltf/gltf_node.cpp scene/3d/mesh_instance.cpp msgid "Skin" -msgstr "" +msgstr "スã‚ン" #: modules/gltf/gltf_node.cpp scene/3d/spatial.cpp #, fuzzy @@ -17159,9 +17065,8 @@ msgid "Children" msgstr "編集å¯èƒ½ãªå" #: modules/gltf/gltf_skeleton.cpp modules/gltf/gltf_skin.cpp -#, fuzzy msgid "Joints" -msgstr "点" +msgstr "ジョイント" #: modules/gltf/gltf_skeleton.cpp modules/gltf/gltf_skin.cpp msgid "Roots" @@ -17177,9 +17082,8 @@ msgid "Godot Bone Node" msgstr "タイムシーク ノード" #: modules/gltf/gltf_skin.cpp -#, fuzzy msgid "Skin Root" -msgstr "æ–°ã—ã„シーンã®ãƒ«ãƒ¼ãƒˆ" +msgstr "スã‚ンã®ãƒ«ãƒ¼ãƒˆ" #: modules/gltf/gltf_skin.cpp #, fuzzy @@ -17263,15 +17167,13 @@ msgid "Scene Name" msgstr "シーンã®ãƒ‘ス:" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Root Nodes" -msgstr "ルートノードå" +msgstr "ルートノード" #: modules/gltf/gltf_state.cpp scene/2d/particles_2d.cpp #: scene/gui/texture_button.cpp scene/gui/texture_progress.cpp -#, fuzzy msgid "Textures" -msgstr "機能" +msgstr "テクスãƒãƒ£" #: modules/gltf/gltf_state.cpp platform/uwp/export/export.cpp msgid "Images" @@ -17279,10 +17181,9 @@ msgstr "" #: modules/gltf/gltf_state.cpp msgid "Cameras" -msgstr "" +msgstr "カメラ" #: modules/gltf/gltf_state.cpp servers/visual_server.cpp -#, fuzzy msgid "Lights" msgstr "ライト" @@ -17292,7 +17193,6 @@ msgid "Unique Animation Names" msgstr "æ–°è¦ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³å:" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Skeletons" msgstr "スケルトン" @@ -17302,9 +17202,8 @@ msgid "Skeleton To Node" msgstr "ãƒŽãƒ¼ãƒ‰ã‚’é¸æŠž" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Animations" -msgstr "アニメーション:" +msgstr "アニメーション" #: modules/gltf/gltf_texture.cpp #, fuzzy @@ -17316,9 +17215,8 @@ msgid "Mesh Library" msgstr "メッシュライブラリ" #: modules/gridmap/grid_map.cpp -#, fuzzy msgid "Physics Material" -msgstr "物ç†ãƒ•レーム%" +msgstr "物ç†ãƒžãƒ†ãƒªã‚¢ãƒ«" #: modules/gridmap/grid_map.cpp scene/3d/visual_instance.cpp #, fuzzy @@ -17353,7 +17251,7 @@ msgstr "ä¸å¤®" #: scene/2d/tile_map.cpp scene/3d/collision_object.cpp scene/3d/soft_body.cpp #: scene/resources/material.cpp msgid "Mask" -msgstr "" +msgstr "マスク" #: modules/gridmap/grid_map.cpp scene/2d/tile_map.cpp #, fuzzy @@ -17550,9 +17448,8 @@ msgstr "" #: modules/minimp3/resource_importer_mp3.cpp #: modules/stb_vorbis/audio_stream_ogg_vorbis.cpp #: modules/stb_vorbis/resource_importer_ogg_vorbis.cpp -#, fuzzy msgid "Loop Offset" -msgstr "オフセット:" +msgstr "ループã®ã‚ªãƒ•セット" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "Eye Height" @@ -17578,11 +17475,11 @@ msgstr "" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "K1" -msgstr "" +msgstr "K1" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "K2" -msgstr "" +msgstr "K2" #: modules/mono/csharp_script.cpp msgid "Class name can't be a reserved keyword" @@ -17597,6 +17494,18 @@ msgstr "ソリューションをビルド" msgid "Auto Update Project" msgstr "åç„¡ã—ã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆ" +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "アセンブリå" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "ソリューションã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª" + +#: modules/mono/godotsharp_dirs.cpp +msgid "C# Project Directory" +msgstr "C#プãƒã‚¸ã‚§ã‚¯ãƒˆã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "内部例外スタックトレースã®çµ‚了" @@ -17691,11 +17600,11 @@ msgstr "ノイズã®ã‚ªãƒ•セット" #: modules/opensimplex/open_simplex_noise.cpp msgid "Octaves" -msgstr "" +msgstr "オクターブ" #: modules/opensimplex/open_simplex_noise.cpp msgid "Period" -msgstr "" +msgstr "周期" #: modules/opensimplex/open_simplex_noise.cpp #, fuzzy @@ -17703,12 +17612,14 @@ msgid "Persistence" msgstr "é€è¦–投影" #: modules/opensimplex/open_simplex_noise.cpp +#, fuzzy msgid "Lacunarity" -msgstr "" +msgstr "空隙性" #: modules/regex/regex.cpp +#, fuzzy msgid "Subject" -msgstr "" +msgstr "対象" #: modules/regex/regex.cpp #, fuzzy @@ -17716,49 +17627,53 @@ msgid "Names" msgstr "åå‰" #: modules/regex/regex.cpp -#, fuzzy msgid "Strings" -msgstr "è¨å®š:" +msgstr "æ–‡å—列" #: modules/upnp/upnp.cpp +#, fuzzy msgid "Discover Multicast If" -msgstr "" +msgstr "マルãƒã‚ãƒ£ã‚¹ãƒˆã®æ¤œå‡º" #: modules/upnp/upnp.cpp +#, fuzzy msgid "Discover Local Port" -msgstr "" +msgstr "ãƒãƒ¼ã‚«ãƒ«ãƒãƒ¼ãƒˆã®æ¤œå‡º" #: modules/upnp/upnp.cpp +#, fuzzy msgid "Discover IPv6" -msgstr "" +msgstr "IPv6 ã®æ¤œå‡º" #: modules/upnp/upnp_device.cpp #, fuzzy msgid "Description URL" -msgstr "説明" +msgstr "説明 URL" #: modules/upnp/upnp_device.cpp #, fuzzy msgid "Service Type" -msgstr "変数ã®åž‹ã‚’è¨å®š" +msgstr "サービス種類" #: modules/upnp/upnp_device.cpp +#, fuzzy msgid "IGD Control URL" -msgstr "" +msgstr "IGD コントãƒãƒ¼ãƒ« URL" #: modules/upnp/upnp_device.cpp #, fuzzy msgid "IGD Service Type" -msgstr "変数ã®åž‹ã‚’è¨å®š" +msgstr "IGD サービス 種類" #: modules/upnp/upnp_device.cpp +#, fuzzy msgid "IGD Our Addr" -msgstr "" +msgstr "IGD 当方アドレス" #: modules/upnp/upnp_device.cpp #, fuzzy msgid "IGD Status" -msgstr "ステータス" +msgstr "IGD 状態" #: modules/visual_script/visual_script.cpp msgid "" @@ -18126,7 +18041,7 @@ msgstr "メンãƒãƒ¼ã‚’編集" #: modules/visual_script/visual_script_expression.cpp #: scene/resources/visual_shader.cpp msgid "Expression" -msgstr "" +msgstr "å¼" #: modules/visual_script/visual_script_flow_control.cpp msgid "Return" @@ -18144,9 +18059,8 @@ msgstr "Return(戻り値)" #: modules/visual_script/visual_script_flow_control.cpp #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Condition" -msgstr "コンディション" +msgstr "æ¡ä»¶" #: modules/visual_script/visual_script_flow_control.cpp msgid "if (cond) is:" @@ -18346,14 +18260,12 @@ msgid "Operator" msgstr "イテレータ" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Invalid argument of type:" -msgstr ":無効ãªå¼•æ•° 引数ã®åž‹: " +msgstr "無効ãªå¼•æ•°ã®åž‹:" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Invalid arguments:" -msgstr ": 無効ãªå¼•æ•°: " +msgstr "無効ãªå¼•æ•°:" #: modules/visual_script/visual_script_nodes.cpp msgid "a if cond, else b" @@ -18516,18 +18428,16 @@ msgid "WaitInstanceSignal" msgstr "インスタンス" #: modules/webrtc/webrtc_data_channel.cpp -#, fuzzy msgid "Write Mode" -msgstr "å„ªå…ˆé †ä½ãƒ¢ãƒ¼ãƒ‰" +msgstr "書ãè¾¼ã¿ãƒ¢ãƒ¼ãƒ‰" #: modules/webrtc/webrtc_data_channel.h msgid "WebRTC" -msgstr "" +msgstr "WebRTC" #: modules/webrtc/webrtc_data_channel.h -#, fuzzy msgid "Max Channel In Buffer (KB)" -msgstr "ã‚ャンãƒã‚¹ã®ãƒãƒªã‚´ãƒ³ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã®ãƒãƒƒãƒ•ァサイズ (KB)" +msgstr "ãƒãƒ£ãƒ³ãƒãƒ«ã®å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ã®ä¸Šé™ (KB)" #: modules/websocket/websocket_client.cpp msgid "Verify SSL" @@ -18538,32 +18448,28 @@ msgid "Trusted SSL Certificate" msgstr "ä¿¡é ¼æ¸ˆã¿SSL証明書" #: modules/websocket/websocket_macros.h -#, fuzzy msgid "WebSocket Client" -msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ ピア" +msgstr "WebSocketクライアント" #: modules/websocket/websocket_macros.h -#, fuzzy msgid "Max In Buffer (KB)" -msgstr "最大サイズ (KB)" +msgstr "入力ãƒãƒƒãƒ•ã‚¡ã®ä¸Šé™ (KB)" #: modules/websocket/websocket_macros.h msgid "Max In Packets" -msgstr "" +msgstr "入力パケットã®ä¸Šé™" #: modules/websocket/websocket_macros.h -#, fuzzy msgid "Max Out Buffer (KB)" -msgstr "最大サイズ (KB)" +msgstr "出力ãƒãƒƒãƒ•ã‚¡ã®ä¸Šé™ (KB)" #: modules/websocket/websocket_macros.h msgid "Max Out Packets" -msgstr "" +msgstr "出力パケットã®ä¸Šé™" #: modules/websocket/websocket_macros.h -#, fuzzy msgid "WebSocket Server" -msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ ピア" +msgstr "WebSocketサーãƒãƒ¼" #: modules/websocket/websocket_server.cpp msgid "Bind IP" @@ -18582,9 +18488,8 @@ msgid "CA Chain" msgstr "CAãƒã‚§ãƒ¼ãƒ³" #: modules/websocket/websocket_server.cpp -#, fuzzy msgid "Handshake Timeout" -msgstr "タイムアウト。" +msgstr "ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã®ã‚¿ã‚¤ãƒ アウト" #: modules/webxr/webxr_interface.cpp msgid "Session Mode" @@ -18695,9 +18600,8 @@ msgid "Use Custom Build" msgstr "" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Export Format" -msgstr "エクスãƒãƒ¼ãƒˆå…ˆã®ãƒ‘ス" +msgstr "エクスãƒãƒ¼ãƒˆå½¢å¼" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18749,22 +18653,19 @@ msgstr "å‰ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’調ã¹ã‚‹" #: platform/android/export/export_plugin.cpp msgid "Code" -msgstr "" +msgstr "コード" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Package" -msgstr "パックä¸" +msgstr "パッケージ" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Unique Name" -msgstr "ノードå:" +msgstr "ユニークå" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Signed" -msgstr "シグナル" +msgstr "ç½²å付ã" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18796,22 +18697,20 @@ msgid "XR Features" msgstr "機能" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "XR Mode" -msgstr "パンモード" +msgstr "XRモード" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Hand Tracking" -msgstr "トラッã‚ング" +msgstr "ãƒãƒ³ãƒ‰ãƒˆãƒ©ãƒƒã‚ング" #: platform/android/export/export_plugin.cpp msgid "Hand Tracking Frequency" -msgstr "" +msgstr "ãƒãƒ³ãƒ‰ãƒˆãƒ©ãƒƒã‚ングã®å‘¨æœŸ" #: platform/android/export/export_plugin.cpp msgid "Passthrough" -msgstr "" +msgstr "パススルー" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18849,37 +18748,32 @@ msgid "Allow" msgstr "hiDPIを許å¯" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Command Line" -msgstr "Command" +msgstr "コマンドライン" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Extra Args" -msgstr "è¿½åŠ ã®å‘¼ã³å‡ºã—引数:" +msgstr "è¿½åŠ ã®å¼•æ•°" #: platform/android/export/export_plugin.cpp msgid "APK Expansion" -msgstr "" +msgstr "APKæ‹¡å¼µ" #: platform/android/export/export_plugin.cpp msgid "Salt" -msgstr "" +msgstr "ソルト" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Public Key" -msgstr "SSH 公開éµãƒ‘ス" +msgstr "公開éµ" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Permissions" -msgstr "放出マスク" +msgstr "権é™" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Custom Permissions" -msgstr "カスタムシーンを実行" +msgstr "ã‚«ã‚¹ã‚¿ãƒ ã®æ¨©é™" #: platform/android/export/export_plugin.cpp msgid "Select device from the list" @@ -19007,9 +18901,8 @@ msgstr "" "\"OpenXR\" ã®å ´åˆã«ã®ã¿æœ‰åйã§ã™ã€‚" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "\"Passthrough\" is only valid when \"XR Mode\" is \"OpenXR\"." -msgstr "\"Passthrough\" 㯠\"Xr Mode\" ㌠\"OpenXR\" ã®å ´åˆã«ã®ã¿æœ‰åйã§ã™ã€‚" +msgstr "\"パススルー\" 㯠\"XR Mode\" ㌠\"OpenXR\" ã®å ´åˆã«ã®ã¿æœ‰åйã§ã™ã€‚" #: platform/android/export/export_plugin.cpp msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." @@ -19059,20 +18952,16 @@ msgstr "" #: platform/android/export/export_plugin.cpp platform/osx/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Code Signing" -msgstr "DMGをコード署åä¸" +msgstr "コード署å" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "'apksigner' could not be found. Please check that the command is available " "in the Android SDK build-tools directory. The resulting %s is unsigned." msgstr "" -"'apksigner' ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚\n" -"ã“ã®ã‚³ãƒžãƒ³ãƒ‰ãŒ Android SDK build-tools ディレクトリã«ã‚ã‚‹ã‹ç¢ºèªã—ã¦ãã ã•" -"ã„。\n" -"%s ã¯ç½²åã•れã¾ã›ã‚“ã§ã—ãŸã€‚" +"'apksigner' ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ã“ã®ã‚³ãƒžãƒ³ãƒ‰ãŒ Android SDK build-tools " +"ディレクトリã«ã‚ã‚‹ã‹ç¢ºèªã—ã¦ãã ã•ã„。%s ã¯ç½²åã•れã¾ã›ã‚“ã§ã—ãŸã€‚" #: platform/android/export/export_plugin.cpp msgid "Signing debug %s..." @@ -19087,9 +18976,8 @@ msgid "Could not find keystore, unable to export." msgstr "ã‚ーストアãŒè¦‹ã¤ã‹ã‚‰ãªã„ãŸã‚ã€ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã§ãã¾ã›ã‚“。" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not start apksigner executable." -msgstr "サブプãƒã‚»ã‚¹ã‚’é–‹å§‹ã§ãã¾ã›ã‚“ã§ã—ãŸï¼" +msgstr "apksigner実行ファイルを開始ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚" #: platform/android/export/export_plugin.cpp msgid "'apksigner' returned with error #%d" @@ -19120,9 +19008,8 @@ msgid "Invalid filename! Android APK requires the *.apk extension." msgstr "無効ãªãƒ•ァイルåã§ã™ï¼ Android APKã«ã¯æ‹¡å¼µå *.apk ãŒå¿…è¦ã§ã™ã€‚" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Unsupported export format!" -msgstr "サãƒãƒ¼ãƒˆã•れã¦ã„ãªã„エクスãƒãƒ¼ãƒˆãƒ•ォーマットã§ã™ï¼\n" +msgstr "サãƒãƒ¼ãƒˆã•れã¦ã„ãªã„エクスãƒãƒ¼ãƒˆå½¢å¼ã§ã™ï¼" #: platform/android/export/export_plugin.cpp msgid "" @@ -19188,9 +19075,8 @@ msgstr "" "gradleã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’確èªã—ã¦ãã ã•ã„。" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Package not found: \"%s\"." -msgstr "見ã¤ã‹ã‚‰ãªã„パッケージ: %s" +msgstr "パッケージãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: \"%s\"。" #: platform/android/export/export_plugin.cpp msgid "Creating APK..." @@ -19220,9 +19106,8 @@ msgid "Adding files..." msgstr "ãƒ•ã‚¡ã‚¤ãƒ«ã‚’è¿½åŠ ä¸..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files." -msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆãƒ•ァイルをエクスãƒãƒ¼ãƒˆã§ãã¾ã›ã‚“ã§ã—ãŸ" +msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆãƒ•ァイルをエクスãƒãƒ¼ãƒˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚" #: platform/android/export/export_plugin.cpp msgid "Aligning APK..." @@ -19246,19 +19131,19 @@ msgstr "" #: platform/iphone/export/export.cpp msgid "iPhone 2436 X 1125" -msgstr "" +msgstr "iPhone 2436 x 1125" #: platform/iphone/export/export.cpp msgid "iPhone 2208 X 1242" -msgstr "" +msgstr "iPhone 2208 x 1242" #: platform/iphone/export/export.cpp msgid "iPad 1024 X 768" -msgstr "" +msgstr "iPad 1024 x 768" #: platform/iphone/export/export.cpp msgid "iPad 2048 X 1536" -msgstr "" +msgstr "iPad 2048 x 1536" #: platform/iphone/export/export.cpp msgid "Portrait Launch Screens" @@ -19266,35 +19151,35 @@ msgstr "" #: platform/iphone/export/export.cpp msgid "iPhone 640 X 960" -msgstr "" +msgstr "iPhone 640 x 960" #: platform/iphone/export/export.cpp msgid "iPhone 640 X 1136" -msgstr "" +msgstr "iPhone 640 x 1136" #: platform/iphone/export/export.cpp msgid "iPhone 750 X 1334" -msgstr "" +msgstr "iPhone 750 x 1334" #: platform/iphone/export/export.cpp msgid "iPhone 1125 X 2436" -msgstr "" +msgstr "iPhone 1125 x 2436" #: platform/iphone/export/export.cpp msgid "iPad 768 X 1024" -msgstr "" +msgstr "iPad 768 x 1024" #: platform/iphone/export/export.cpp msgid "iPad 1536 X 2048" -msgstr "" +msgstr "iPad 1536 x 2048" #: platform/iphone/export/export.cpp msgid "iPhone 1242 X 2208" -msgstr "" +msgstr "iPhone 1242 x 2208" #: platform/iphone/export/export.cpp msgid "App Store Team ID" -msgstr "" +msgstr "App Store Team ID" #: platform/iphone/export/export.cpp msgid "Provisioning Profile UUID Debug" @@ -19328,7 +19213,7 @@ msgstr "" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp msgid "Info" -msgstr "" +msgstr "æƒ…å ±" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #, fuzzy @@ -19400,35 +19285,35 @@ msgstr "プãƒãƒ‘ティã®èª¬æ˜Ž" #: platform/iphone/export/export.cpp msgid "iPhone 120 X 120" -msgstr "" +msgstr "iPhone 120 x 120" #: platform/iphone/export/export.cpp msgid "iPhone 180 X 180" -msgstr "" +msgstr "iPhone 180 x 180" #: platform/iphone/export/export.cpp msgid "iPad 76 X 76" -msgstr "" +msgstr "iPad 76 x 76" #: platform/iphone/export/export.cpp msgid "iPad 152 X 152" -msgstr "" +msgstr "iPad 152 x 152" #: platform/iphone/export/export.cpp msgid "iPad 167 X 167" -msgstr "" +msgstr "iPad 167 x 167" #: platform/iphone/export/export.cpp msgid "App Store 1024 X 1024" -msgstr "" +msgstr "App Store 1024 x 1024" #: platform/iphone/export/export.cpp msgid "Spotlight 40 X 40" -msgstr "" +msgstr "Spotlight 40 x 40" #: platform/iphone/export/export.cpp msgid "Spotlight 80 X 80" -msgstr "" +msgstr "Spotlight 80 x 80" #: platform/iphone/export/export.cpp msgid "Storyboard" @@ -19463,6 +19348,11 @@ msgstr "ノードを切りå–ã‚‹" msgid "Custom BG Color" msgstr "ノードを切りå–ã‚‹" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "ã™ã¹ã¦å±•é–‹" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -19500,14 +19390,12 @@ msgid "Could not open template for export: \"%s\"." msgstr "エクスãƒãƒ¼ãƒˆç”¨ã®ãƒ†ãƒ³ãƒ—レートを開ã‘ã¾ã›ã‚“ã§ã—ãŸ:" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Invalid export template: \"%s\"." -msgstr "無効ãªã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ テンプレート:" +msgstr "無効ãªã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆãƒ†ãƒ³ãƒ—レート: \"%s\"。" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not write file: \"%s\"." -msgstr "ファイルを書ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ:" +msgstr "ファイルを書ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: \"%s\"。" #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #, fuzzy @@ -19515,13 +19403,12 @@ msgid "Icon Creation" msgstr "マージンをè¨å®šã™ã‚‹" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read file: \"%s\"." -msgstr "ファイルをèªã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ:" +msgstr "ファイルをèªã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: \"%s\"。" #: platform/javascript/export/export.cpp msgid "PWA" -msgstr "" +msgstr "PWA" #: platform/javascript/export/export.cpp #, fuzzy @@ -19534,21 +19421,20 @@ msgid "Export Type" msgstr "エクスãƒãƒ¼ãƒˆ" #: platform/javascript/export/export.cpp -#, fuzzy msgid "VRAM Texture Compression" -msgstr "VRAM圧縮" +msgstr "VRAMテクスãƒãƒ£åœ§ç¸®" #: platform/javascript/export/export.cpp msgid "For Desktop" -msgstr "" +msgstr "デスクトップå‘ã‘" #: platform/javascript/export/export.cpp msgid "For Mobile" -msgstr "" +msgstr "モãƒã‚¤ãƒ«å‘ã‘" #: platform/javascript/export/export.cpp msgid "HTML" -msgstr "" +msgstr "HTML" #: platform/javascript/export/export.cpp #, fuzzy @@ -19598,31 +19484,28 @@ msgid "Icon 512 X 512" msgstr "" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read HTML shell: \"%s\"." -msgstr "HTMLシェルをèªã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ:" +msgstr "HTMLシェルをèªã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: \"%s\"。" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not create HTTP server directory: %s." -msgstr "HTTPサーãƒãƒ¼ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ä½œæˆã«å¤±æ•—:" +msgstr "HTTPサーãƒãƒ¼ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸ: %s。" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Error starting HTTP server: %d." -msgstr "HTTPサーãƒãƒ¼ã®é–‹å§‹ã«å¤±æ•—:" +msgstr "HTTPサーãƒãƒ¼ã®é–‹å§‹ã«å¤±æ•—ã—ã¾ã—ãŸ: %d。" #: platform/javascript/export/export.cpp msgid "Web" -msgstr "" +msgstr "Web" #: platform/javascript/export/export.cpp msgid "HTTP Host" -msgstr "" +msgstr "HTTPホスト" #: platform/javascript/export/export.cpp msgid "HTTP Port" -msgstr "" +msgstr "HTTPãƒãƒ¼ãƒˆ" #: platform/javascript/export/export.cpp msgid "Use SSL" @@ -19759,9 +19642,8 @@ msgid "Removable Volumes Usage Description" msgstr "" #: platform/osx/export/export.cpp platform/windows/export/export.cpp -#, fuzzy msgid "Codesign" -msgstr "DMGをコード署åä¸" +msgstr "コード署å" #: platform/osx/export/export.cpp platform/uwp/export/export.cpp #: platform/windows/export/export.cpp @@ -19775,9 +19657,8 @@ msgid "Timestamp" msgstr "時間" #: platform/osx/export/export.cpp -#, fuzzy msgid "Hardened Runtime" -msgstr "ランタイム" +msgstr "Hardened Runtime" #: platform/osx/export/export.cpp #, fuzzy @@ -19888,9 +19769,8 @@ msgid "Custom Options" msgstr "ãƒã‚¹ オプション" #: platform/osx/export/export.cpp -#, fuzzy msgid "Notarization" -msgstr "ãƒãƒ¼ã‚«ãƒ©ã‚¤ã‚º" +msgstr "公証" #: platform/osx/export/export.cpp msgid "Apple ID Name" @@ -19906,29 +19786,28 @@ msgid "Apple Team ID" msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not open icon file \"%s\"." -msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆãƒ•ァイルをエクスãƒãƒ¼ãƒˆã§ãã¾ã›ã‚“ã§ã—ãŸ" +msgstr "アイコンファイルを開ã‘ã¾ã›ã‚“ã§ã—ãŸ: \"%s\"。" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not start xcrun executable." -msgstr "サブプãƒã‚»ã‚¹ã‚’é–‹å§‹ã§ãã¾ã›ã‚“ã§ã—ãŸï¼" +msgstr "xcrun実行ファイルを開始ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚" #: platform/osx/export/export.cpp -#, fuzzy msgid "Notarization failed." -msgstr "ãƒãƒ¼ã‚«ãƒ©ã‚¤ã‚º" +msgstr "公証ã«å¤±æ•—ã—ã¾ã—ãŸã€‚" #: platform/osx/export/export.cpp msgid "Notarization request UUID: \"%s\"" -msgstr "" +msgstr "公証ã®è¦æ±‚UUID: \"%s\"" #: platform/osx/export/export.cpp msgid "" "The notarization process generally takes less than an hour. When the process " "is completed, you'll receive an email." msgstr "" +"å…¬è¨¼ã®æ‰‹ç¶šãã¯é€šå¸¸1時間以内ã«çµ‚了ã—ã¾ã™ã€‚手続ããŒå®Œäº†ã™ã‚‹ã¨EメールãŒå±Šãã¾" +"ã™ã€‚" #: platform/osx/export/export.cpp msgid "" @@ -19941,6 +19820,8 @@ msgid "" "Run the following command to staple the notarization ticket to the exported " "application (optional):" msgstr "" +"次ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã—ã¦ã€å…¬è¨¼ã®ãƒã‚±ãƒƒãƒˆã‚’エクスãƒãƒ¼ãƒˆã—ãŸã‚¢ãƒ—リケーションã«ç´" +"付ã‘ã—ã¾ã™ï¼ˆã‚ªãƒ—ション):" #: platform/osx/export/export.cpp msgid "Timestamping is not compatible with ad-hoc signature, and was disabled!" @@ -20008,9 +19889,8 @@ msgid "Could not find template app to export: \"%s\"." msgstr "エクスãƒãƒ¼ãƒˆã™ã‚‹ãƒ†ãƒ³ãƒ—レートAPKãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ:" #: platform/osx/export/export.cpp -#, fuzzy msgid "Invalid export format." -msgstr "無効ãªã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ テンプレート:" +msgstr "無効ãªã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆå½¢å¼ã§ã™ã€‚" #: platform/osx/export/export.cpp msgid "" @@ -20055,10 +19935,12 @@ msgid "" "Notarization requires the app to be archived first, select the DMG or ZIP " "export format instead." msgstr "" +"公証ã«ã¯ã¾ãšã‚¢ãƒ—リをアーカイブã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚DMGã¾ãŸã¯ZIPã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ" +"å½¢å¼ã®ã‚‚ã®ã‚’é¸æŠžã—ã¦ãã ã•ã„。" #: platform/osx/export/export.cpp msgid "Sending archive for notarization" -msgstr "" +msgstr "公証をã™ã‚‹ãŸã‚ã«ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã‚’é€ä¿¡ä¸" #: platform/osx/export/export.cpp #, fuzzy @@ -20089,36 +19971,35 @@ msgstr "" #: platform/osx/export/export.cpp msgid "Notarization: Notarization with an ad-hoc signature is not supported." -msgstr "" +msgstr "公証: アドホック署åã«ã‚ˆã‚‹å…¬è¨¼ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。" #: platform/osx/export/export.cpp -#, fuzzy msgid "Notarization: Code signing is required for notarization." -msgstr "Notarization: コード署åãŒå¿…è¦ã§ã™ã€‚" +msgstr "公証: 公証ã«ã¯ã‚³ãƒ¼ãƒ‰ç½²åãŒå¿…è¦ã§ã™ã€‚" #: platform/osx/export/export.cpp -#, fuzzy msgid "Notarization: Hardened runtime is required for notarization." -msgstr "Notarization: hardened runtime ãŒå¿…è¦ã§ã™ã€‚" +msgstr "公証: 公証ã«ã¯Hardened runtimeãŒå¿…è¦ã§ã™ã€‚" #: platform/osx/export/export.cpp -#, fuzzy msgid "Notarization: Timestamp runtime is required for notarization." -msgstr "Notarization: hardened runtime ãŒå¿…è¦ã§ã™ã€‚" +msgstr "公証: 公証ã«ã¯Timestamp runtimeãŒå¿…è¦ã§ã™ã€‚" #: platform/osx/export/export.cpp msgid "Notarization: Apple ID name not specified." -msgstr "Notarization: Apple ID åãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“。" +msgstr "公証: Apple IDåãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“。" #: platform/osx/export/export.cpp msgid "Notarization: Apple ID password not specified." -msgstr "Notarization: Apple ID ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“。" +msgstr "公証: Apple ID ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“。" #: platform/osx/export/export.cpp msgid "" "Warning: Notarization is disabled. The exported project will be blocked by " "Gatekeeper if it's downloaded from an unknown source." msgstr "" +"è¦å‘Š: 公証ãŒç„¡åŠ¹åŒ–ã•れã¦ã„ã¾ã™ã€‚エクスãƒãƒ¼ãƒˆã—ãŸãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã¯ã€ä¸æ˜Žãªã‚½ãƒ¼ã‚¹" +"ã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã•れãŸå ´åˆGatekeeperã«ã‚ˆã£ã¦ãƒ–ãƒãƒƒã‚¯ã•れã¾ã™ã€‚" #: platform/osx/export/export.cpp msgid "" @@ -20142,6 +20023,9 @@ msgid "" "Warning: Notarization is not supported from this OS. The exported project " "will be blocked by Gatekeeper if it's downloaded from an unknown source." msgstr "" +"è¦å‘Š: ã“ã®OSã«ã‚ˆã‚‹å…¬è¨¼ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。エクスãƒãƒ¼ãƒˆã—ãŸãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆ" +"ã¯ã€ä¸æ˜Žãªã‚½ãƒ¼ã‚¹ã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã•れãŸå ´åˆGatekeeperã«ã‚ˆã£ã¦ãƒ–ãƒãƒƒã‚¯ã•れã¾" +"ã™ã€‚" #: platform/osx/export/export.cpp msgid "" @@ -20186,9 +20070,8 @@ msgid "Force Builtin Codesign" msgstr "" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Architecture" -msgstr "アーã‚テクãƒãƒ£ã‚¨ãƒ³ãƒˆãƒªã‚’è¿½åŠ ã™ã‚‹" +msgstr "アーã‚テクãƒãƒ£" #: platform/uwp/export/export.cpp #, fuzzy @@ -20220,37 +20103,32 @@ msgid "Publisher GUID" msgstr "ガイドをクリアã™ã‚‹" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Signing" -msgstr "スã‚ニング" +msgstr "ç½²å" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Certificate" msgstr "証明書" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Algorithm" -msgstr "デãƒãƒƒã‚¬ãƒ¼" +msgstr "アルゴリズム" #: platform/uwp/export/export.cpp msgid "Major" -msgstr "" +msgstr "メジャー" #: platform/uwp/export/export.cpp msgid "Minor" -msgstr "" +msgstr "マイナー" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Build" -msgstr "定è¦ãƒ¢ãƒ¼ãƒ‰" +msgstr "ビルド" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Revision" -msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³" +msgstr "リビジョン" #: platform/uwp/export/export.cpp msgid "Landscape" @@ -20317,6 +20195,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "パッケージã®ã‚·ãƒ§ãƒ¼ãƒˆãƒãƒ¼ãƒ ãŒç„¡åйã§ã™ã€‚" @@ -20417,29 +20301,24 @@ msgid "Modify Resources" msgstr "リソースをコピー" #: platform/windows/export/export.cpp -#, fuzzy msgid "File Version" -msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³" +msgstr "ファイルãƒãƒ¼ã‚¸ãƒ§ãƒ³" #: platform/windows/export/export.cpp -#, fuzzy msgid "Product Version" -msgstr "無効ãªè£½å“ãƒãƒ¼ã‚¸ãƒ§ãƒ³:" +msgstr "製å“ãƒãƒ¼ã‚¸ãƒ§ãƒ³" #: platform/windows/export/export.cpp -#, fuzzy msgid "Company Name" -msgstr "ノードå:" +msgstr "会社å" #: platform/windows/export/export.cpp -#, fuzzy msgid "Product Name" -msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆå:" +msgstr "製å“å" #: platform/windows/export/export.cpp -#, fuzzy msgid "File Description" -msgstr "説明" +msgstr "ファイルã®èª¬æ˜Ž" #: platform/windows/export/export.cpp msgid "Trademarks" @@ -20562,13 +20441,12 @@ msgstr "Wine" #: platform/x11/export/export.cpp msgid "32-bit executables cannot have embedded data >= 4 GiB." -msgstr "" +msgstr "32bitã®å®Ÿè¡Œãƒ•ァイルã¯4GiB以上ã®çµ„ã¿è¾¼ã¿ãƒ‡ãƒ¼ã‚¿ã‚’æŒã¤ã“ã¨ãŒã§ãã¾ã›ã‚“。" #: scene/2d/animated_sprite.cpp scene/3d/sprite_3d.cpp #: scene/resources/texture.cpp -#, fuzzy msgid "Frames" -msgstr "フレーム%" +msgstr "フレーム" #: scene/2d/animated_sprite.cpp msgid "" @@ -20599,12 +20477,12 @@ msgstr "ä¸å¤®" #: scene/2d/animated_sprite.cpp scene/2d/sprite.cpp scene/3d/sprite_3d.cpp #: scene/gui/texture_button.cpp scene/gui/texture_rect.cpp msgid "Flip H" -msgstr "" +msgstr "æ°´å¹³å転" #: scene/2d/animated_sprite.cpp scene/2d/sprite.cpp scene/3d/sprite_3d.cpp #: scene/gui/texture_button.cpp scene/gui/texture_rect.cpp msgid "Flip V" -msgstr "" +msgstr "垂直å転" #: scene/2d/area_2d.cpp scene/3d/area.cpp #, fuzzy @@ -20617,9 +20495,8 @@ msgid "Monitorable" msgstr "モニター" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Physics Overrides" -msgstr "上書ã" +msgstr "物ç†ã®ã‚ªãƒ¼ãƒãƒ¼ãƒ©ã‚¤ãƒ‰" #: scene/2d/area_2d.cpp scene/3d/area.cpp #, fuzzy @@ -20699,9 +20576,8 @@ msgstr "アニメーション" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp -#, fuzzy msgid "Bus" -msgstr "ãƒã‚¹ã‚’è¿½åŠ " +msgstr "ãƒã‚¹" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp msgid "Area Mask" @@ -20744,26 +20620,23 @@ msgstr "処ç†ãƒ¢ãƒ¼ãƒ‰" #: scene/2d/camera_2d.cpp msgid "Limit" -msgstr "" +msgstr "制é™" #: scene/2d/camera_2d.cpp scene/gui/control.cpp scene/gui/nine_patch_rect.cpp #: scene/resources/style_box.cpp scene/resources/texture.cpp -#, fuzzy msgid "Left" -msgstr "左上" +msgstr "å·¦" #: scene/2d/camera_2d.cpp scene/gui/control.cpp scene/gui/nine_patch_rect.cpp #: scene/resources/style_box.cpp scene/resources/texture.cpp -#, fuzzy msgid "Right" -msgstr "ライト" +msgstr "å³" #: scene/2d/camera_2d.cpp scene/gui/control.cpp scene/gui/nine_patch_rect.cpp #: scene/resources/dynamic_font.cpp scene/resources/style_box.cpp #: scene/resources/texture.cpp -#, fuzzy msgid "Bottom" -msgstr "左下" +msgstr "下" #: scene/2d/camera_2d.cpp #, fuzzy @@ -20792,12 +20665,11 @@ msgstr "スムーズステップ" #: scene/2d/camera_2d.cpp msgid "H" -msgstr "" +msgstr "æ°´å¹³" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "V" -msgstr "UV" +msgstr "垂直" #: scene/2d/camera_2d.cpp #, fuzzy @@ -20936,9 +20808,8 @@ msgid "" msgstr "" #: scene/2d/collision_polygon_2d.cpp -#, fuzzy msgid "Build Mode" -msgstr "定è¦ãƒ¢ãƒ¼ãƒ‰" +msgstr "ビルドモード" #: scene/2d/collision_polygon_2d.cpp scene/2d/collision_shape_2d.cpp #: scene/3d/collision_polygon.cpp scene/3d/collision_shape.cpp @@ -21312,7 +21183,7 @@ msgstr "" #: scene/2d/joints_2d.cpp scene/resources/animation.cpp #: scene/resources/ray_shape.cpp scene/resources/segment_shape_2d.cpp msgid "Length" -msgstr "" +msgstr "é•·ã•" #: scene/2d/joints_2d.cpp #, fuzzy @@ -21335,9 +21206,8 @@ msgstr "" "å…‰ã®å½¢çŠ¶ã‚’æŒã¤ãƒ†ã‚¯ã‚¹ãƒãƒ£ã¯\"Texture\"プãƒãƒ‘ãƒ†ã‚£ã«æŒ‡å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" #: scene/2d/light_2d.cpp scene/3d/light.cpp scene/gui/reference_rect.cpp -#, fuzzy msgid "Editor Only" -msgstr "エディター" +msgstr "エディターã®ã¿" #: scene/2d/light_2d.cpp #, fuzzy @@ -21373,9 +21243,8 @@ msgid "Item Cull Mask" msgstr "" #: scene/2d/light_2d.cpp scene/3d/light.cpp scene/resources/style_box.cpp -#, fuzzy msgid "Shadow" -msgstr "シェーダー" +msgstr "シャドウ" #: scene/2d/light_2d.cpp #, fuzzy @@ -21639,7 +21508,7 @@ msgstr "終りã«" #: scene/2d/parallax_background.cpp msgid "Ignore Camera Zoom" -msgstr "" +msgstr "カメラã®ã‚ºãƒ¼ãƒ を無視" #: scene/2d/parallax_layer.cpp msgid "" @@ -21728,14 +21597,12 @@ msgid "Unit Offset" msgstr "グリッドã®ã‚ªãƒ•セット:" #: scene/2d/path_2d.cpp scene/3d/camera.cpp scene/3d/path.cpp -#, fuzzy msgid "H Offset" -msgstr "オフセット:" +msgstr "水平オフセット" #: scene/2d/path_2d.cpp scene/3d/camera.cpp scene/3d/path.cpp -#, fuzzy msgid "V Offset" -msgstr "オフセット:" +msgstr "垂直オフセット" #: scene/2d/path_2d.cpp scene/3d/path.cpp msgid "Cubic Interp" @@ -21746,7 +21613,6 @@ msgid "Lookahead" msgstr "" #: scene/2d/physics_body_2d.cpp scene/3d/visual_instance.cpp -#, fuzzy msgid "Layers" msgstr "レイヤー" @@ -21762,9 +21628,8 @@ msgstr "åˆæœŸåŒ–" #: scene/2d/physics_body_2d.cpp scene/2d/tile_map.cpp scene/3d/physics_body.cpp #: scene/resources/physics_material.cpp -#, fuzzy msgid "Friction" -msgstr "関数" +msgstr "摩擦" #: scene/2d/physics_body_2d.cpp scene/2d/tile_map.cpp scene/3d/physics_body.cpp #: scene/resources/physics_material.cpp @@ -21773,7 +21638,7 @@ msgstr "" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Physics Material Override" -msgstr "" +msgstr "物ç†ãƒžãƒ†ãƒªã‚¢ãƒ«ã®ã‚ªãƒ¼ãƒãƒ¼ãƒ©ã‚¤ãƒ‰" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: scene/resources/world.cpp scene/resources/world_2d.cpp @@ -21793,17 +21658,15 @@ msgstr "" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Mass" -msgstr "" +msgstr "質é‡" #: scene/2d/physics_body_2d.cpp -#, fuzzy msgid "Inertia" -msgstr "垂直:" +msgstr "慣性" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Weight" -msgstr "ライト" +msgstr "é‡é‡" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Gravity Scale" @@ -21853,14 +21716,12 @@ msgid "Torque" msgstr "トルク" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Safe Margin" -msgstr "マージンをè¨å®šã™ã‚‹" +msgstr "セーフマージン" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Sync To Physics" -msgstr "(物ç†çš„)åŒæœŸ" +msgstr "物ç†ã¨ã®åŒæœŸ" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #, fuzzy @@ -22038,7 +21899,6 @@ msgstr "" "使用ã—ã¦ãã ã•ã„。" #: scene/2d/tile_map.cpp -#, fuzzy msgid "Tile Set" msgstr "タイルセット" @@ -22058,9 +21918,8 @@ msgid "Half Offset" msgstr "åˆæœŸåŒ–" #: scene/2d/tile_map.cpp -#, fuzzy msgid "Tile Origin" -msgstr "原点を表示" +msgstr "タイルã®åŽŸç‚¹" #: scene/2d/tile_map.cpp #, fuzzy @@ -22147,7 +22006,7 @@ msgstr "å„ªå…ˆé †ä½ã‚’有効化" #: scene/2d/visibility_notifier_2d.cpp msgid "Physics Process Parent" -msgstr "" +msgstr "親ã®ç‰©ç†å‡¦ç†" #: scene/3d/area.cpp msgid "Reverb Bus" @@ -22764,9 +22623,8 @@ msgid "Omni" msgstr "" #: scene/3d/light.cpp -#, fuzzy msgid "Shadow Mode" -msgstr "シェーダー" +msgstr "シャドウモード" #: scene/3d/light.cpp #, fuzzy @@ -23415,9 +23273,8 @@ msgid "Box Projection" msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆ" #: scene/3d/reflection_probe.cpp -#, fuzzy msgid "Enable Shadows" -msgstr "スナップを有効ã«ã™ã‚‹" +msgstr "シャドウを有効化" #: scene/3d/reflection_probe.cpp #, fuzzy @@ -23665,9 +23522,8 @@ msgid "Spatial Attachment Path" msgstr "" #: scene/3d/soft_body.cpp -#, fuzzy msgid "Physics Enabled" -msgstr "物ç†ãƒ•レーム%" +msgstr "物ç†ã‚’有効化" #: scene/3d/soft_body.cpp #, fuzzy @@ -23739,9 +23595,8 @@ msgid "Gizmo" msgstr "ギズモ" #: scene/3d/spatial_velocity_tracker.cpp -#, fuzzy msgid "Track Physics Step" -msgstr "物ç†ãƒ•レーム%" +msgstr "物ç†ã‚¹ãƒ†ãƒƒãƒ—ã®è¿½è·¡" #: scene/3d/spring_arm.cpp msgid "Spring Length" @@ -25228,9 +25083,8 @@ msgid "Pause Mode" msgstr "パンモード" #: scene/main/node.cpp -#, fuzzy msgid "Physics Interpolation Mode" -msgstr "補間モード" +msgstr "物ç†è£œé–“モード" #: scene/main/node.cpp #, fuzzy @@ -25510,9 +25364,8 @@ msgid "Disable Input" msgstr "アイテムを無効ã«ã™ã‚‹" #: scene/main/viewport.cpp servers/visual_server.cpp -#, fuzzy msgid "Shadow Atlas" -msgstr "æ–°ã—ã„アトラス" +msgstr "シャドウアトラス" #: scene/main/viewport.cpp msgid "Quad 0" @@ -25565,14 +25418,12 @@ msgid "3D Render" msgstr "レンダリング" #: scene/register_scene_types.cpp -#, fuzzy msgid "2D Physics" -msgstr " (物ç†çš„)" +msgstr "2D物ç†" #: scene/register_scene_types.cpp -#, fuzzy msgid "3D Physics" -msgstr " (物ç†çš„)" +msgstr "3D物ç†" #: scene/register_scene_types.cpp #, fuzzy @@ -25742,14 +25593,12 @@ msgid "Font Outline Modulate" msgstr "白色調整" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Shadow Offset X" -msgstr "グリッドã®ã‚ªãƒ•セット X:" +msgstr "シャドウã®ã‚ªãƒ•セットX" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Shadow Offset Y" -msgstr "グリッドã®ã‚ªãƒ•セット Y:" +msgstr "シャドウã®ã‚ªãƒ•セットY" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26505,9 +26354,8 @@ msgid "Sky Contribution" msgstr "" #: scene/resources/environment.cpp -#, fuzzy msgid "Fog" -msgstr "Fog(霧)" +msgstr "フォグ" #: scene/resources/environment.cpp #, fuzzy @@ -26760,19 +26608,16 @@ msgid "Ascent" msgstr "最近:" #: scene/resources/font.cpp -#, fuzzy msgid "Distance Field" -msgstr "集ä¸ãƒ¢ãƒ¼ãƒ‰" +msgstr "è·é›¢ãƒ•ィールド" #: scene/resources/gradient.cpp -#, fuzzy msgid "Raw Data" -msgstr "Depth(深度/奥行)" +msgstr "生データ" #: scene/resources/gradient.cpp -#, fuzzy msgid "Offsets" -msgstr "オフセット:" +msgstr "オフセット" #: scene/resources/height_map_shape.cpp msgid "Map Width" @@ -26802,14 +26647,12 @@ msgid "Use Shadow To Opacity" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Unshaded" -msgstr "シェーディングãªã—ã§è¡¨ç¤º" +msgstr "シェーディングãªã—ã§" #: scene/resources/material.cpp -#, fuzzy msgid "Vertex Lighting" -msgstr "直接光" +msgstr "é ‚ç‚¹ãƒ©ã‚¤ãƒ†ã‚£ãƒ³ã‚°" #: scene/resources/material.cpp #, fuzzy @@ -26826,7 +26669,7 @@ msgstr "" #: scene/resources/material.cpp msgid "Do Not Receive Shadows" -msgstr "" +msgstr "シャドウをå—ã‘å–らãªã„" #: scene/resources/material.cpp #, fuzzy @@ -26856,9 +26699,8 @@ msgid "Is sRGB" msgstr "" #: scene/resources/material.cpp servers/visual_server.cpp -#, fuzzy msgid "Parameters" -msgstr "パラメーターãŒå¤‰æ›´ã•れã¾ã—ãŸ:" +msgstr "パラメーター" #: scene/resources/material.cpp #, fuzzy @@ -26971,9 +26813,8 @@ msgid "Flowmap" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Ambient Occlusion" -msgstr "オクルージョン" +msgstr "アンビエントオクルージョン" #: scene/resources/material.cpp msgid "Deep Parallax" @@ -27358,7 +27199,7 @@ msgstr "アウトラインã®ã‚µã‚¤ã‚º:" #: scene/resources/sky.cpp msgid "Panorama" -msgstr "" +msgstr "パノラマ" #: scene/resources/sky.cpp #, fuzzy @@ -27371,9 +27212,8 @@ msgid "Horizon Color" msgstr "ファイルã®ä¿å˜:" #: scene/resources/sky.cpp -#, fuzzy msgid "Ground" -msgstr "グループ化済ã¿" +msgstr "地é¢" #: scene/resources/sky.cpp #, fuzzy @@ -27381,18 +27221,16 @@ msgid "Bottom Color" msgstr "ブックマーク" #: scene/resources/sky.cpp -#, fuzzy msgid "Sun" -msgstr "実行" +msgstr "太陽" #: scene/resources/sky.cpp -#, fuzzy msgid "Latitude" -msgstr "代替" +msgstr "緯度" #: scene/resources/sky.cpp msgid "Longitude" -msgstr "" +msgstr "経度" #: scene/resources/sky.cpp msgid "Angle Min" @@ -27736,9 +27574,8 @@ msgstr "" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_delay.cpp #: servers/audio/effects/audio_effect_panner.cpp -#, fuzzy msgid "Pan" -msgstr "å¹³é¢:" +msgstr "パン" #: servers/audio/effects/audio_effect_compressor.cpp #: servers/audio/effects/audio_effect_filter.cpp @@ -27747,12 +27584,11 @@ msgstr "" #: servers/audio/effects/audio_effect_compressor.cpp msgid "Attack (µs)" -msgstr "" +msgstr "アタック (マイクãƒç§’)" #: servers/audio/effects/audio_effect_compressor.cpp -#, fuzzy msgid "Release (ms)" -msgstr "リリース" +msgstr "リリース (ミリ秒)" #: servers/audio/effects/audio_effect_compressor.cpp msgid "Mix" @@ -27773,14 +27609,12 @@ msgstr "" #: servers/audio/effects/audio_effect_delay.cpp #: servers/audio/effects/audio_effect_phaser.cpp #: servers/audio/effects/audio_effect_reverb.cpp -#, fuzzy msgid "Feedback" -msgstr "ドã‚ュメントã®ãƒ•ィードãƒãƒƒã‚¯ã‚’é€ã‚‹" +msgstr "フィードãƒãƒƒã‚¯" #: servers/audio/effects/audio_effect_delay.cpp -#, fuzzy msgid "Low-pass" -msgstr "ãƒã‚¤ãƒ‘ス" +msgstr "ãƒãƒ¼ãƒ‘ス" #: servers/audio/effects/audio_effect_distortion.cpp msgid "Pre Gain" @@ -27866,7 +27700,7 @@ msgstr "タイムアウト。" #: servers/audio/effects/audio_effect_stereo_enhance.cpp msgid "Surround" -msgstr "" +msgstr "サラウンド" #: servers/audio_server.cpp msgid "Enable Audio Input" @@ -28008,9 +27842,8 @@ msgid "Collision Unsafe Fraction" msgstr "コリジョンモード" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Physics Engine" -msgstr "物ç†ãƒ•レーム%" +msgstr "物ç†ã‚¨ãƒ³ã‚¸ãƒ³" #: servers/physics_server.cpp msgid "Center Of Mass" @@ -28126,9 +27959,8 @@ msgid "Quadrant 3 Subdiv" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Shadows" -msgstr "シェーダー" +msgstr "シャドウ" #: servers/visual_server.cpp msgid "Filter Mode" @@ -28179,7 +28011,7 @@ msgstr "" #: servers/visual_server.cpp msgid "Depth Prepass" -msgstr "" +msgstr "深度プレパス" #: servers/visual_server.cpp msgid "Disable For Vendors" @@ -28210,14 +28042,12 @@ msgid "Use Software Skinning" msgstr "ソフトウェアスã‚ニングを使用" #: servers/visual_server.cpp -#, fuzzy msgid "Ninepatch Mode" -msgstr "補間モード" +msgstr "Ninepatchモード" #: servers/visual_server.cpp -#, fuzzy msgid "OpenGL" -msgstr "é–‹ã" +msgstr "OpenGL" #: servers/visual_server.cpp msgid "Batching Send Null" @@ -28290,7 +28120,7 @@ msgstr "フレームを貼り付ã‘" #: servers/visual_server.cpp msgid "GLES2" -msgstr "" +msgstr "GLES2" #: servers/visual_server.cpp msgid "Compatibility" diff --git a/editor/translations/ka.po b/editor/translations/ka.po index 2e6e0e70e7..f085051bf7 100644 --- a/editor/translations/ka.po +++ b/editor/translations/ka.po @@ -4539,6 +4539,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7343,7 +7344,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15330,18 +15332,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "მáƒáƒ¨áƒáƒ ებáƒ" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "მáƒáƒ¨áƒáƒ ებáƒ" #: editor/scene_tree_dock.cpp @@ -15538,6 +15540,11 @@ msgstr "" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "მáƒáƒ¨áƒáƒ ებáƒ" + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr "დáƒáƒ›áƒáƒ™áƒáƒ•შირებელი სიგნáƒáƒšáƒ˜:" @@ -15602,6 +15609,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17465,6 +17476,20 @@ msgstr "ყველრმáƒáƒœáƒ˜áƒ¨áƒœáƒ•áƒ" msgid "Auto Update Project" msgstr "პრáƒáƒ”ქტის დáƒáƒ›áƒ¤áƒ£áƒ«áƒœáƒ”ბლები" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "ყველáƒáƒ¡ ჩáƒáƒœáƒáƒªáƒ•ლებáƒ" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "პრáƒáƒ”ქტის დáƒáƒ›áƒ¤áƒ£áƒ«áƒœáƒ”ბლები" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19238,6 +19263,11 @@ msgstr "áƒáƒœáƒ˜áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ¦áƒ”ბების áƒáƒ¡áƒšá msgid "Custom BG Color" msgstr "áƒáƒœáƒ˜áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ¦áƒ”ბების áƒáƒ¡áƒšáƒ˜áƒ¡ შექმნáƒ" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "áƒáƒœáƒ˜áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ დáƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ ცვლილებáƒ" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -20056,6 +20086,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ ი ფáƒáƒœáƒ¢áƒ˜áƒ¡ ზáƒáƒ›áƒ." diff --git a/editor/translations/km.po b/editor/translations/km.po index 522cb30363..3d39686d68 100644 --- a/editor/translations/km.po +++ b/editor/translations/km.po @@ -4327,6 +4327,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7005,7 +7006,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -14685,18 +14687,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "បញ្ចូល Key នៅទីនáŸáŸ‡" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "បញ្ចូល Key នៅទីនáŸáŸ‡" #: editor/scene_tree_dock.cpp @@ -14886,6 +14888,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "បញ្ចូល Key នៅទីនáŸáŸ‡" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -14949,6 +14956,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -16729,6 +16740,18 @@ msgstr "" msgid "Auto Update Project" msgstr "" +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "C# Project Directory" +msgstr "" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18415,6 +18438,10 @@ msgstr "" msgid "Custom BG Color" msgstr "" +#: platform/iphone/export/export.cpp +msgid "Export Icons" +msgstr "" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19194,6 +19221,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/ko.po b/editor/translations/ko.po index a91450dd41..e1940d698c 100644 --- a/editor/translations/ko.po +++ b/editor/translations/ko.po @@ -36,13 +36,16 @@ # Seonghyeon Cho <seonghyeoncho96@gmail.com>, 2022. # Haoyu Qiu <timothyqiu32@gmail.com>, 2022. # 김태우 <ogosengi3@gmail.com>, 2022. +# 박민규 <80dots@gmail.com>, 2022. +# ì´ì§€ë¯¼ <jiminaleejung@gmail.com>, 2022. +# nulltable <un5450@naver.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-06-26 16:16+0000\n" -"Last-Translator: 김태우 <ogosengi3@gmail.com>\n" +"PO-Revision-Date: 2022-09-23 04:16+0000\n" +"Last-Translator: nulltable <un5450@naver.com>\n" "Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/" "godot/ko/>\n" "Language: ko\n" @@ -50,7 +53,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.13.1-dev\n" +"X-Generator: Weblate 4.14.1\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -311,7 +314,7 @@ msgstr "스트림 피어" #: core/io/stream_peer.cpp msgid "Big Endian" -msgstr "Big Endian" +msgstr "ë¹… 엔디안" #: core/io/stream_peer.cpp msgid "Data Array" @@ -387,9 +390,8 @@ msgid "Max Size (KB)" msgstr "최대 í¬ê¸°(KB)" #: core/os/input.cpp -#, fuzzy msgid "Mouse Mode" -msgstr "ì´ë™ 모드" +msgstr "마우스 모드" #: core/os/input.cpp #, fuzzy @@ -411,7 +413,7 @@ msgstr "Shift" #: core/os/input_event.cpp msgid "Control" -msgstr "ì¡°ìž‘" +msgstr "Control" #: core/os/input_event.cpp msgid "Meta" @@ -422,9 +424,8 @@ msgid "Command" msgstr "ëª…ë ¹" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" -msgstr " (물리)" +msgstr "물리" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp @@ -680,14 +681,12 @@ msgid "Script Templates Search Path" msgstr "스í¬ë¦½íЏ 템플릿 검색 경로" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Autoload On Startup" -msgstr "스타트업으로 ìžë™ 로드" +msgstr "ì‹œìž‘í• ë•Œ ìžë™ìœ¼ë¡œ Version Control 로드" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Plugin Name" -msgstr "ë²„ì „ 컨트롤" +msgstr "ë²„ì „ 컨트롤 í”ŒëŸ¬ê·¸ì¸ ì´ë¦„" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -871,7 +870,7 @@ msgstr "모듈" #: core/register_core_types.cpp msgid "TCP" -msgstr "TCP (ì „ì†¡ ì œì–´ í”„ë¡œí† ì½œ)" +msgstr "TCP" #: core/register_core_types.cpp msgid "Connect Timeout Seconds" @@ -1015,7 +1014,7 @@ msgstr "최대 ë Œë” ìš”ì†Œ 수" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Renderable Lights" -msgstr "최대 ë Œë” ê´‘ì› ìˆ˜" +msgstr "최대 ë Œë” ì¡°ëª… 수" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Renderable Reflections" @@ -1023,7 +1022,7 @@ msgstr "최대 ë Œë” ë°˜ì‚¬ 수" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Lights Per Object" -msgstr "오브ì 트당 최대 ê´‘ì› ìˆ˜" +msgstr "오브ì 트당 최대 조명 수" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Subsurface Scattering" @@ -2757,12 +2756,11 @@ msgstr "ì„ íƒ" #: editor/editor_export.cpp msgid "Project export for platform:" -msgstr "" +msgstr "플랫í¼ìœ¼ë¡œ 프로ì 트 내보내기:" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with warnings." -msgstr "íŒŒì¼ ê²½ë¡œ 완성" +msgstr "완료하였지만 ê²½ê³ ê°€ 있습니다." #: editor/editor_export.cpp #, fuzzy @@ -2770,9 +2768,8 @@ msgid "Completed successfully." msgstr "패키지를 성공ì 으로 설치했습니다!" #: editor/editor_export.cpp -#, fuzzy msgid "Failed." -msgstr "실패함:" +msgstr "실패함." #: editor/editor_export.cpp msgid "Storing File:" @@ -2787,29 +2784,24 @@ msgid "Packing" msgstr "패킹 중" #: editor/editor_export.cpp -#, fuzzy msgid "Save PCK" -msgstr "다른 ì´ë¦„으로 ì €ìž¥" +msgstr "PCK ì €ìž¥" #: editor/editor_export.cpp -#, fuzzy msgid "Cannot create file \"%s\"." -msgstr "í´ë”를 만들 수 없습니다." +msgstr "\"%s\" 파ì¼ì„ ìƒì„±í• 수 없습니다." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to export project files." -msgstr "프로ì 트 파ì¼ì„ 내보낼 수 없었습니다" +msgstr "프로ì 트 파ì¼ì„ 내보낼 수 없습니다." #: editor/editor_export.cpp -#, fuzzy msgid "Can't open file to read from path \"%s\"." -msgstr "파ì¼ì„ 쓰기 모드로 ì—´ 수 ì—†ìŒ:" +msgstr "\"%s\" ê²½ë¡œì˜ íŒŒì¼ì„ ì½ê¸° 위해 ì—´ì§€ 못했습니다." #: editor/editor_export.cpp -#, fuzzy msgid "Save ZIP" -msgstr "다른 ì´ë¦„으로 ì €ìž¥" +msgstr "ZIP파ì¼ë¡œ ì €ìž¥" #: editor/editor_export.cpp msgid "" @@ -2934,19 +2926,16 @@ msgid "Prepare Template" msgstr "템플릿 관리" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "The given export path doesn't exist." -msgstr "주어진 내보내기 경로가 ì—†ìŒ:" +msgstr "Exportí•˜ë ¤ê³ í–ˆìœ¼ë‚˜ 해당 경로가 존재하지 않습니다." #: editor/editor_export.cpp platform/javascript/export/export.cpp -#, fuzzy msgid "Template file not found: \"%s\"." -msgstr "템플릿 파ì¼ì„ ì°¾ì„ ìˆ˜ 없습니다:" +msgstr "템플릿 파ì¼ì„ ì°¾ì„ ìˆ˜ 없습니다: \"%s\"." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to copy export template." -msgstr "ìž˜ëª»ëœ ë‚´ë³´ë‚´ê¸° 템플릿:" +msgstr "내보내기 í…œí”Œë¦¿ì„ ë³µì‚¬í•˜ì§€ 못했습니다." #: editor/editor_export.cpp platform/windows/export/export.cpp #: platform/x11/export/export.cpp @@ -4486,6 +4475,7 @@ msgstr "프로ì 트 ë˜ëŠ” 씬 ê´€ë ¨ 여러가지 툴." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "프로ì 트" @@ -5194,9 +5184,8 @@ msgstr "" "있ë„ë¡ ì •ì˜í•´ì£¼ì„¸ìš”." #: editor/editor_run_native.cpp -#, fuzzy msgid "Project Run" -msgstr "프로ì 트" +msgstr "프로ì 트 실행" #: editor/editor_run_script.cpp msgid "Write your logic in the _run() method." @@ -5374,7 +5363,7 @@ msgstr "ì¸ë„¤ì¼ í¬ê¸°" #: editor/editor_settings.cpp msgid "Docks" -msgstr "ê²°í•©" +msgstr "ë…" #: editor/editor_settings.cpp msgid "Scene Tree" @@ -5478,9 +5467,8 @@ msgid "Mouse Extra Buttons Navigate History" msgstr "마우스 부가 버튼으로 ížˆìŠ¤í† ë¦¬ 둘러보기" #: editor/editor_settings.cpp -#, fuzzy msgid "Drag And Drop Selection" -msgstr "그리드맵 ì„ íƒ" +msgstr "ì„ íƒëœ í•ëª©ì„ Drag and drop" #: editor/editor_settings.cpp msgid "Stay In Script Editor On Node Selected" @@ -5766,7 +5754,7 @@ msgstr "줌 ë°©ì‹" #: editor/editor_settings.cpp msgid "Emulate Numpad" -msgstr "ìˆ«ìž íŒ¨ë“œ 모방" +msgstr "숫ìžíŒ¨ë“œ 모방" #: editor/editor_settings.cpp msgid "Emulate 3 Button Mouse" @@ -6022,9 +6010,8 @@ msgstr "프로ì 트 ë§¤ë‹ˆì €" #. TRANSLATORS: Project Manager here refers to the tool used to create/manage Godot projects. #: editor/editor_settings.cpp -#, fuzzy msgid "Sorting Order" -msgstr "í´ë” ì´ë¦„ 바꾸기:" +msgstr "ì •ë ¬ 순서" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Symbol Color" @@ -6056,21 +6043,18 @@ msgid "Comment Color" msgstr "" #: editor/editor_settings.cpp -#, fuzzy msgid "String Color" -msgstr "ì €ìž¥í•˜ë ¤ëŠ” 파ì¼:" +msgstr "문ìžì—´ 색" #: editor/editor_settings.cpp platform/javascript/export/export.cpp #: platform/uwp/export/export.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Background Color" -msgstr "ìž˜ëª»ëœ ë°°ê²½ 색ìƒ." +msgstr "ë°°ê²½ 색" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Completion Background Color" -msgstr "ìž˜ëª»ëœ ë°°ê²½ 색ìƒ." +msgstr "완성 ë°°ê²½ 색" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -6095,9 +6079,8 @@ msgid "Text Color" msgstr "ë‹¤ìŒ ì¸µ" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Line Number Color" -msgstr "í–‰ 번호:" +msgstr "í–‰ ë²ˆí˜¸ì˜ ìƒ‰" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -6106,12 +6089,11 @@ msgstr "í–‰ 번호:" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Caret Color" -msgstr "" +msgstr "íƒˆìž ê¸°í˜¸ 색" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Caret Background Color" -msgstr "ìž˜ëª»ëœ ë°°ê²½ 색ìƒ." +msgstr "íƒˆìž ê¸°í˜¸ ë°°ê²½ 색" #: editor/editor_settings.cpp #, fuzzy @@ -6913,9 +6895,8 @@ msgstr "" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp scene/2d/light_2d.cpp #: scene/gui/control.cpp -#, fuzzy msgid "Filter" -msgstr "í•„í„°:" +msgstr "í•„í„°" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp @@ -6942,17 +6923,15 @@ msgstr "ìžë™ ìžë¥´ê¸°" #: scene/gui/aspect_ratio_container.cpp scene/gui/control.cpp #: scene/gui/nine_patch_rect.cpp scene/gui/scroll_container.cpp #: scene/resources/style_box.cpp -#, fuzzy msgid "Horizontal" -msgstr "수í‰:" +msgstr "수í‰" #: editor/import/resource_importer_layered_texture.cpp #: scene/gui/aspect_ratio_container.cpp scene/gui/control.cpp #: scene/gui/nine_patch_rect.cpp scene/gui/scroll_container.cpp #: scene/resources/style_box.cpp -#, fuzzy msgid "Vertical" -msgstr "수ì§:" +msgstr "수ì§" #: editor/import/resource_importer_obj.cpp #, fuzzy @@ -6965,9 +6944,8 @@ msgid "Scale Mesh" msgstr "ìŠ¤ì¼€ì¼ ëª¨ë“œ" #: editor/import/resource_importer_obj.cpp -#, fuzzy msgid "Offset Mesh" -msgstr "오프셋:" +msgstr "오프셋 메시" #: editor/import/resource_importer_obj.cpp #: editor/import/resource_importer_scene.cpp @@ -6976,9 +6954,8 @@ msgid "Octahedral Compression" msgstr "í‘œí˜„ì‹ ì„¤ì •" #: editor/import/resource_importer_obj.cpp -#, fuzzy msgid "Optimize Mesh Flags" -msgstr "í¬ê¸°: " +msgstr "메시 플래그 최ì í™”" #: editor/import/resource_importer_scene.cpp msgid "Import as Single Scene" @@ -7056,9 +7033,8 @@ msgid "Use Legacy Names" msgstr "" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp -#, fuzzy msgid "Materials" -msgstr "머티리얼 바꾸기:" +msgstr "머티리얼" #: editor/import/resource_importer_scene.cpp #, fuzzy @@ -7135,14 +7111,12 @@ msgid "Enabled" msgstr "활성화" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Max Linear Error" -msgstr "최대 ì„ í˜• 오류:" +msgstr "최대 ì„ í˜• 오류" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Max Angular Error" -msgstr "최대 ê°ë„ 오류:" +msgstr "최대 ê°ë„ 오류" #: editor/import/resource_importer_scene.cpp #, fuzzy @@ -7162,9 +7136,8 @@ msgstr "ì• ë‹ˆë©”ì´ì…˜ í´ë¦½" #: editor/import/resource_importer_scene.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/particles_2d.cpp scene/3d/area.cpp scene/3d/cpu_particles.cpp #: scene/3d/particles.cpp scene/resources/environment.cpp -#, fuzzy msgid "Amount" -msgstr "ì–‘:" +msgstr "ì–‘" #: editor/import/resource_importer_scene.cpp #: editor/plugins/mesh_library_editor_plugin.cpp @@ -7180,9 +7153,8 @@ msgid "Generating Lightmaps" msgstr "ë¼ì´íŠ¸ë§µ ìƒì„± 중" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Generating for Mesh:" -msgstr "메시 용으로 ìƒì„± 중: " +msgstr "메시 용으로 ìƒì„± 중:" #: editor/import/resource_importer_scene.cpp msgid "Running Custom Script..." @@ -7273,14 +7245,12 @@ msgid "Invert Color" msgstr "ê¼ì§“ì " #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Normal Map Invert Y" -msgstr "무작위 스케ì¼:" +msgstr "노멀 ë§µ Yì¶• ë°˜ì „" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Size Limit" -msgstr "í¬ê¸°: " +msgstr "í¬ê¸° ì œí•œ" #: editor/import/resource_importer_texture.cpp msgid "Detect 3D" @@ -7298,14 +7268,12 @@ msgid "" msgstr "" #: editor/import/resource_importer_texture_atlas.cpp -#, fuzzy msgid "Atlas File" -msgstr "ìœ¤ê³½ì„ í¬ê¸°:" +msgstr "ì•„í‹€ë¼ìФ 파ì¼" #: editor/import/resource_importer_texture_atlas.cpp -#, fuzzy msgid "Import Mode" -msgstr "내보내기 모드:" +msgstr "ê°€ì ¸ì˜¤ê¸° 모드" #: editor/import/resource_importer_texture_atlas.cpp #, fuzzy @@ -7326,7 +7294,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -8196,9 +8165,8 @@ msgid "Set the end animation. This is useful for sub-transitions." msgstr "ë ì• ë‹ˆë©”ì´ì…˜ì„ ì„¤ì •í•©ë‹ˆë‹¤. ì´ê²ƒì€ 하위 ì „í™˜ì— ìœ ìš©í•©ë‹ˆë‹¤." #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Transition:" -msgstr "ì „í™˜: " +msgstr "ì „í™˜:" #: editor/plugins/animation_state_machine_editor.cpp msgid "Play Mode:" @@ -9962,9 +9930,8 @@ msgid "Volume" msgstr "볼륨" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Emission Source:" -msgstr "ë°©ì¶œ 소스: " +msgstr "ë°©ì¶œ 소스:" #: editor/plugins/particles_editor_plugin.cpp msgid "A processor material of type 'ParticlesMaterial' is required." @@ -10680,9 +10647,8 @@ msgid "Script Temperature History Size" msgstr "" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Current Script Background Color" -msgstr "ìž˜ëª»ëœ ë°°ê²½ 색ìƒ." +msgstr "현재 스í¬ë¦½íЏ ë°°ê²½ 색" #: editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -12594,7 +12560,7 @@ msgstr "ì½œë¦¬ì „" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Occlusion" -msgstr "ì–´í´ë£¨ì „" +msgstr "오í´ë£¨ì „" #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/touch_screen_button.cpp msgid "Bitmask" @@ -12882,9 +12848,8 @@ msgstr "스냅 ì„¤ì •" #: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp #: scene/main/canvas_layer.cpp scene/resources/material.cpp #: scene/resources/particles_material.cpp scene/resources/style_box.cpp -#, fuzzy msgid "Offset" -msgstr "오프셋:" +msgstr "오프셋" #: editor/plugins/tile_set_editor_plugin.cpp editor/rename_dialog.cpp #: scene/gui/range.cpp scene/resources/animation.cpp @@ -12923,9 +12888,8 @@ msgstr "ê²©ìž ì˜¤í”„ì…‹:" #: editor/plugins/tile_set_editor_plugin.cpp modules/csg/csg_shape.cpp #: scene/2d/canvas_item.cpp scene/2d/particles_2d.cpp #: scene/3d/mesh_instance.cpp scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Material" -msgstr "머티리얼 바꾸기:" +msgstr "머티리얼" #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/canvas_item.cpp #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/style_box.cpp @@ -13037,9 +13001,8 @@ msgid "Unstaged Changes" msgstr "ì…°ì´ë” 바꾸기:" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit:" -msgstr "커밋" +msgstr "커밋:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Date:" @@ -13073,92 +13036,80 @@ msgid "Initialize" msgstr "초기화" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Login" -msgstr "ì ì œê±°" +msgstr "ì›ê²© 로그ì¸" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH public key path" -msgstr "" +msgstr "SSH ê³µê°œí‚¤ì˜ ê²½ë¡œë¥¼ ì„ íƒí•˜ì„¸ìš”" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH private key path" -msgstr "" +msgstr "SSH ë¹„ë°€í‚¤ì˜ ê²½ë¡œë¥¼ ì„ íƒí•˜ì„¸ìš”" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Passphrase" -msgstr "SSH Passphrase" +msgstr "SSH 암호" #: editor/plugins/version_control_editor_plugin.cpp msgid "Detect new changes" msgstr "새 ë³€ê²½ì‚¬í• ê°ì§€" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Discard all changes" -msgstr "변경사í•ì„ ì €ìž¥í•˜ê³ ë‹«ì„까요?" +msgstr "ëª¨ë“ ë³€ê²½ì‚¬í• ë²„ë¦¬ê¸°" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Stage all changes" -msgstr "로컬 변경사í•ì„ ì €ìž¥í•˜ëŠ” 중..." +msgstr "ëª¨ë“ ë³€ê²½ì‚¬í• ìŠ¤í…Œì´ì§•" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstage all changes" -msgstr "머티리얼 바꾸기:" +msgstr "ëª¨ë“ ë³€ê²½ì‚¬í• ìŠ¤í…Œì´ì§• 취소" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit Message" -msgstr "커밋 변경사í•" +msgstr "커밋 메세지" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit Changes" msgstr "커밋 변경사í•" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit List" -msgstr "커밋" +msgstr "커밋 목ë¡" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit list size" -msgstr "" +msgstr "커밋 ëª©ë¡ í¬ê¸°" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Branches" -msgstr "ì¼ì¹˜í•¨:" +msgstr "브랜치" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Create New Branch" -msgstr "새 프로ì 트 만들기" +msgstr "새 브랜치 ìƒì„±" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remove Branch" -msgstr "ì• ë‹ˆë©”ì´ì…˜ 트랙 ì œê±°" +msgstr "브랜치 ì‚ì œ" #: editor/plugins/version_control_editor_plugin.cpp msgid "Branch Name" -msgstr "" +msgstr "브랜치 ì´ë¦„" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remotes" msgstr "ì›ê²©" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Create New Remote" -msgstr "새 프로ì 트 만들기" +msgstr "새 ì›ê²© 추가" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remove Remote" -msgstr "í•목 ì œê±°" +msgstr "ì›ê²© ì œê±°" #: editor/plugins/version_control_editor_plugin.cpp msgid "Remote Name" @@ -13170,20 +13121,19 @@ msgstr "ì›ê²© URL" #: editor/plugins/version_control_editor_plugin.cpp msgid "Fetch" -msgstr "" +msgstr "페치" #: editor/plugins/version_control_editor_plugin.cpp msgid "Pull" -msgstr "" +msgstr "í’€" #: editor/plugins/version_control_editor_plugin.cpp msgid "Push" -msgstr "" +msgstr "푸시" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Force Push" -msgstr "ì›ë³¸ 메시:" +msgstr "ê°•ì œ 푸시" #: editor/plugins/version_control_editor_plugin.cpp msgid "Modified" @@ -13203,22 +13153,19 @@ msgstr "타입체ì¸ì§€" #: editor/plugins/version_control_editor_plugin.cpp msgid "Unmerged" -msgstr "" +msgstr "미병합" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "View:" -msgstr "보기" +msgstr "보기:" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Split" -msgstr "경로 가르기" +msgstr "ë¶„í• " #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unified" -msgstr "ìˆ˜ì •ë¨" +msgstr "통합ë¨" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" @@ -14212,28 +14159,24 @@ msgid "More Info..." msgstr "여기로 ì´ë™..." #: editor/project_export.cpp -#, fuzzy msgid "Export PCK/Zip..." -msgstr "PCK/Zip 내보내기" +msgstr "PCK/Zip 내보내기..." #: editor/project_export.cpp -#, fuzzy msgid "Export Project..." -msgstr "프로ì 트 내보내기" +msgstr "프로ì 트 내보내기..." #: editor/project_export.cpp msgid "Export All" msgstr "ëª¨ë‘ ë‚´ë³´ë‚´ê¸°" #: editor/project_export.cpp -#, fuzzy msgid "Choose an export mode:" -msgstr "비어있는 í´ë”를 ì„ íƒí•´ì£¼ì„¸ìš”." +msgstr "내보내기 모드를 ì„ íƒí•˜ì„¸ìš”:" #: editor/project_export.cpp -#, fuzzy msgid "Export All..." -msgstr "ëª¨ë‘ ë‚´ë³´ë‚´ê¸°" +msgstr "ëª¨ë‘ ë‚´ë³´ë‚´ê¸°..." #: editor/project_export.cpp editor/project_manager.cpp msgid "ZIP File" @@ -15343,19 +15286,18 @@ msgstr "" msgid "Make Local" msgstr "로컬로 만들기" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" +#: editor/scene_tree_dock.cpp +msgid "Enable Scene Unique Name(s)" +msgstr "씬 ê³ ìœ ì´ë¦„ 활성화" #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" -msgstr "노드 ì´ë¦„:" +msgid "Unique names already used by another node in the scene:" +msgstr "ì´ë¯¸ 다른 함수/변수/시그ë„로 ì‚¬ìš©ëœ ì´ë¦„:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -#, fuzzy -msgid "Disable Scene Unique Name" -msgstr "노드 ì´ë¦„:" +#: editor/scene_tree_dock.cpp +msgid "Disable Scene Unique Name(s)" +msgstr "씬 ê³ ìœ ì´ë¦„ 비활성화" #: editor/scene_tree_dock.cpp msgid "New Scene Root" @@ -15553,6 +15495,10 @@ msgid "Button Group" msgstr "버튼 그룹" #: editor/scene_tree_editor.cpp +msgid "Disable Scene Unique Name" +msgstr "씬 ê³ ìœ ì´ë¦„ 비활성화" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(ì—°ê²° 시작 ì§€ì )" @@ -15628,6 +15574,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "ìž˜ëª»ëœ ë…¸ë“œ ì´ë¦„입니다. ë‹¤ìŒ ë¬¸ìžëŠ” 허용하지 않습니다:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "노드 ì´ë¦„ 바꾸기" @@ -15776,9 +15726,8 @@ msgid "Attach Node Script" msgstr "노드 스í¬ë¦½íЏ ë¶™ì´ê¸°" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Remote %s:" -msgstr "ì›ê²© " +msgstr "ì›ê²© %s:" #: editor/script_editor_debugger.cpp msgid "Bytes:" @@ -16012,9 +15961,8 @@ msgid "GI Probe" msgstr "GI 프로브 굽기" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Baked Indirect Light" -msgstr "ê°„ì ‘ 조명" +msgstr "구운 ê°„ì ‘ 조명" #: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp msgid "Change Sphere Shape Radius" @@ -16230,9 +16178,8 @@ msgid "Driver" msgstr "" #: main/main.cpp -#, fuzzy msgid "Driver Name" -msgstr "스í¬ë¦½íЏ ì´ë¦„:" +msgstr "드ë¼ì´ë²„ ì´ë¦„" #: main/main.cpp msgid "Fallback To GLES2" @@ -16317,9 +16264,8 @@ msgid "Physics FPS" msgstr "물리 í”„ë ˆìž„ %" #: main/main.cpp -#, fuzzy msgid "Force FPS" -msgstr "ì›ë³¸ 메시:" +msgstr "FPS ê°•ì œ" #: main/main.cpp msgid "Enable Pause Aware Picking" @@ -16434,9 +16380,8 @@ msgid "Fullsize" msgstr "" #: main/main.cpp scene/resources/dynamic_font.cpp -#, fuzzy msgid "Use Filter" -msgstr "í•„í„°:" +msgstr "í•„í„° 사용" #: main/main.cpp scene/resources/style_box.cpp #, fuzzy @@ -16483,9 +16428,8 @@ msgid "Custom Image Hotspot" msgstr "" #: main/main.cpp -#, fuzzy msgid "Tooltip Position Offset" -msgstr "íšŒì „ 오프셋:" +msgstr "íˆ´íŒ ìœ„ì¹˜ 오프셋" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp #, fuzzy @@ -16498,9 +16442,8 @@ msgid "Wait For Debugger" msgstr "디버거" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp -#, fuzzy msgid "Wait Timeout" -msgstr "시간 초과." +msgstr "대기 타임아웃" #: main/main.cpp msgid "Runtime" @@ -16614,9 +16557,8 @@ msgstr "ëŒ€ì†Œë¬¸ìž ë³€í™˜" #: scene/resources/cylinder_shape.cpp scene/resources/environment.cpp #: scene/resources/navigation_mesh.cpp scene/resources/primitive_meshes.cpp #: scene/resources/sphere_shape.cpp -#, fuzzy msgid "Radius" -msgstr "반지름:" +msgstr "반지름" #: modules/csg/csg_shape.cpp scene/resources/primitive_meshes.cpp #, fuzzy @@ -16760,9 +16702,8 @@ msgid "Use FBX" msgstr "" #: modules/gdnative/gdnative.cpp -#, fuzzy msgid "Config File" -msgstr "ì €ìž¥í•˜ë ¤ëŠ” 파ì¼:" +msgstr "ì„¤ì • 파ì¼" #: modules/gdnative/gdnative.cpp #, fuzzy @@ -16836,19 +16777,16 @@ msgid "Disabled GDNative Singleton" msgstr "ë¹„í™œì„±í™”ëœ GDNative 싱글톤" #: modules/gdnative/gdnative_library_singleton_editor.cpp -#, fuzzy msgid "Libraries:" -msgstr "ë¼ì´ë¸ŒëŸ¬ë¦¬: " +msgstr "ë¼ì´ë¸ŒëŸ¬ë¦¬:" #: modules/gdnative/nativescript/nativescript.cpp -#, fuzzy msgid "Class Name" -msgstr "í´ëž˜ìФ ì´ë¦„:" +msgstr "í´ëž˜ìФ ì´ë¦„" #: modules/gdnative/nativescript/nativescript.cpp -#, fuzzy msgid "Script Class" -msgstr "스í¬ë¦½íЏ ì´ë¦„:" +msgstr "스í¬ë¦½íЏ í´ëž˜ìФ" #: modules/gdnative/nativescript/nativescript.cpp #, fuzzy @@ -16927,9 +16865,8 @@ msgid "Object can't provide a length." msgstr "오브ì 트는 길ì´ë¥¼ ì œê³µí• ìˆ˜ 없습니다." #: modules/gdscript/language_server/gdscript_language_server.cpp -#, fuzzy msgid "Language Server" -msgstr "언어:" +msgstr "언어 서버" #: modules/gdscript/language_server/gdscript_language_server.cpp #, fuzzy @@ -16958,9 +16895,8 @@ msgid "Buffer View" msgstr "후면 ë·°" #: modules/gltf/gltf_accessor.cpp modules/gltf/gltf_buffer_view.cpp -#, fuzzy msgid "Byte Offset" -msgstr "ê²©ìž ì˜¤í”„ì…‹:" +msgstr "ë°”ì´íЏ 오프셋" #: modules/gltf/gltf_accessor.cpp #, fuzzy @@ -16973,9 +16909,8 @@ msgid "Normalized" msgstr "형ì‹" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Count" -msgstr "ì–‘:" +msgstr "ì–‘" #: modules/gltf/gltf_accessor.cpp scene/resources/visual_shader_nodes.cpp #, fuzzy @@ -17213,9 +17148,8 @@ msgid "Accessors" msgstr "" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Scene Name" -msgstr "씬 경로:" +msgstr "씬 ì´ë¦„" #: modules/gltf/gltf_state.cpp #, fuzzy @@ -17551,6 +17485,21 @@ msgstr "솔루션 빌드" msgid "Auto Update Project" msgstr "ì´ë¦„ 없는 프로ì 트" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "ëª¨ë‘ í‘œì‹œ" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "ë””ë ‰í† ë¦¬ë¥¼ ì„ íƒí•˜ì„¸ìš”" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "ë””ë ‰í† ë¦¬ë¥¼ ì„ íƒí•˜ì„¸ìš”" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "ë‚´ë¶€ 예외 ìŠ¤íƒ ì¶”ì ì˜ ë" @@ -17639,9 +17588,8 @@ msgid "Noise" msgstr "" #: modules/opensimplex/noise_texture.cpp -#, fuzzy msgid "Noise Offset" -msgstr "ê²©ìž ì˜¤í”„ì…‹:" +msgstr "ë…¸ì´ì¦ˆ 오프셋" #: modules/opensimplex/open_simplex_noise.cpp msgid "Octaves" @@ -17670,9 +17618,8 @@ msgid "Names" msgstr "ì´ë¦„" #: modules/regex/regex.cpp -#, fuzzy msgid "Strings" -msgstr "ì„¤ì •:" +msgstr "문ìžì—´" #: modules/upnp/upnp.cpp msgid "Discover Multicast If" @@ -17738,9 +17685,8 @@ msgstr "" "ì³ì£¼ì„¸ìš”." #: modules/visual_script/visual_script.cpp -#, fuzzy msgid "Node returned an invalid sequence output:" -msgstr "ìž˜ëª»ëœ ì‹œí€€ìŠ¤ ì¶œë ¥ì„ ë°˜í™˜í•œ 노드: " +msgstr "ìž˜ëª»ëœ ì‹œí€€ìŠ¤ ì¶œë ¥ì„ ë°˜í™˜í•œ 노드:" #: modules/visual_script/visual_script.cpp msgid "Found sequence bit but not the node in the stack, report bug!" @@ -18300,9 +18246,8 @@ msgstr "ë°°ì—´ í¬ê¸° 바꾸기" #: modules/visual_script/visual_script_nodes.cpp scene/resources/material.cpp #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Operator" -msgstr "ì˜¤ë²„ë ˆì´ ì—°ì‚°ìž." +msgstr "ì—°ì‚°ìž" #: modules/visual_script/visual_script_nodes.cpp #, fuzzy @@ -18550,9 +18495,8 @@ msgid "CA Chain" msgstr "IK ì²´ì¸ ì§€ìš°ê¸°" #: modules/websocket/websocket_server.cpp -#, fuzzy msgid "Handshake Timeout" -msgstr "시간 초과." +msgstr "핸드ì‰ì´í¬ 타임아웃" #: modules/webxr/webxr_interface.cpp #, fuzzy @@ -18560,14 +18504,12 @@ msgid "Session Mode" msgstr "ì˜ì— 모드" #: modules/webxr/webxr_interface.cpp -#, fuzzy msgid "Required Features" -msgstr "주요 기능:" +msgstr "필수ì 기능" #: modules/webxr/webxr_interface.cpp -#, fuzzy msgid "Optional Features" -msgstr "주요 기능:" +msgstr "ì„ íƒì 기능" #: modules/webxr/webxr_interface.cpp msgid "Requested Reference Space Types" @@ -18729,9 +18671,8 @@ msgid "Package" msgstr "패킹 중" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Unique Name" -msgstr "노드 ì´ë¦„:" +msgstr "ê³ ìœ ì´ë¦„" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18739,9 +18680,8 @@ msgid "Signed" msgstr "시그ë„" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Classify As Game" -msgstr "í´ëž˜ìФ ì´ë¦„:" +msgstr "게임으로 분류" #: platform/android/export/export_plugin.cpp msgid "Retain Data On Uninstall" @@ -18753,9 +18693,8 @@ msgid "Exclude From Recents" msgstr "노드 ì‚ì œ" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Graphics" -msgstr "ê²©ìž ì˜¤í”„ì…‹:" +msgstr "그래픽" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18825,9 +18764,8 @@ msgid "Command Line" msgstr "커뮤니티" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Extra Args" -msgstr "별ë„ì˜ í˜¸ì¶œ ì¸ìˆ˜:" +msgstr "추가ì ì¸ ì¸ìˆ˜" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -19028,14 +18966,12 @@ msgid "Code Signing" msgstr "시그ë„" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "'apksigner' could not be found. Please check that the command is available " "in the Android SDK build-tools directory. The resulting %s is unsigned." msgstr "" -"'apksigner'를 ì°¾ì„ ìˆ˜ 없었습니다.\n" -"ëª…ë ¹ì´ Android SDK build-tools ë””ë ‰í† ë¦¬ì—서 사용 가능한지 확ì¸í•´ì£¼ì„¸ìš”.\n" -"ê²°ê³¼ %s는 서명ë˜ì§€ 않습니다." +"'apksigner'를 ì°¾ì„ ìˆ˜ 없습니다. ëª…ë ¹ì´ Android SDK build-tools ë””ë ‰í† ë¦¬ì—서 " +"사용 가능한지 확ì¸í•´ì£¼ì„¸ìš”. 결과물 %s는 서명ë˜ì§€ 않았습니다." #: platform/android/export/export_plugin.cpp msgid "Signing debug %s..." @@ -19050,9 +18986,8 @@ msgid "Could not find keystore, unable to export." msgstr "keystore를 ì°¾ì„ ìˆ˜ 없어, 내보낼 수 없었습니다." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not start apksigner executable." -msgstr "하위 프로세스를 ì‹œìž‘í• ìˆ˜ 없습니다!" +msgstr "apksigner 실행 파ì¼ì„ ì‹œìž‘í• ìˆ˜ 없습니다." #: platform/android/export/export_plugin.cpp msgid "'apksigner' returned with error #%d" @@ -19083,9 +19018,8 @@ msgid "Invalid filename! Android APK requires the *.apk extension." msgstr "ìž˜ëª»ëœ íŒŒì¼ì´ë¦„입니다! Android APK는 *.apk 확장ìžê°€ 필요합니다." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Unsupported export format!" -msgstr "ì§€ì›ë˜ì§€ 않는 내보내기 형ì‹ìž…니다!\n" +msgstr "ì§€ì›ë˜ì§€ 않는 내보내기 형ì‹ìž…니다!" #: platform/android/export/export_plugin.cpp msgid "" @@ -19096,27 +19030,22 @@ msgstr "" "(Project)' 메뉴ì—서 다시 설치해주세요." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" -"Android 빌드 ë²„ì „ì´ ë§žì§€ 않ìŒ:\n" -" ì„¤ì¹˜ëœ í…œí”Œë¦¿: %s\n" -" Godot ë²„ì „: %s\n" -"'프로ì 트' 메뉴ì—서 Android 빌드 í…œí”Œë¦¿ì„ ë‹¤ì‹œ 설치해주세요." +"Android 빌드 ë²„ì „ì´ ë§žì§€ 않ìŒ: ì„¤ì¹˜ëœ í…œí”Œë¦¿: %s, Godot ë²„ì „: %s. '프로ì 트' " +"메뉴ì—서 Android 빌드 í…œí”Œë¦¿ì„ ë‹¤ì‹œ 설치해주세요." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Unable to overwrite res://android/build/res/*.xml files with project name." msgstr "" -"res://android/build/res/*.xml 파ì¼ì„ 프로ì 트 ì´ë¦„으로 ë®ì–´ì“¸ 수 없습니다" +"res://android/build/res/*.xml 파ì¼ì„ 프로ì 트 ì´ë¦„으로 ë®ì–´ì“¸ 수 없습니다." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files to gradle project." -msgstr "프로ì 트 파ì¼ì„ gradle 프로ì 트로 내보낼 수 없었습니다\n" +msgstr "프로ì 트 파ì¼ì„ gradle 프로ì 트로 내보낼 수 없습니다." #: platform/android/export/export_plugin.cpp msgid "Could not write expansion package file!" @@ -19127,13 +19056,12 @@ msgid "Building Android Project (gradle)" msgstr "Android 프로ì 트 빌드 중 (gradle)" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Building of Android project failed, check output for the error. " "Alternatively visit docs.godotengine.org for Android build documentation." msgstr "" -"Android 프로ì íŠ¸ì˜ ë¹Œë“œì— ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤, ì¶œë ¥ëœ ì˜¤ë¥˜ë¥¼ 확ì¸í•˜ì„¸ìš”.\n" -"ë˜ëŠ” docs.godotengine.orgì—서 Android 빌드 문서를 찾아보세요." +"Android 프로ì íŠ¸ì˜ ë¹Œë“œì— ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤, ì¶œë ¥ëœ ì˜¤ë¥˜ë¥¼ 확ì¸í•˜ì„¸ìš”. ë˜ëŠ” docs." +"godotengine.orgì—서 Android 빌드 문서를 찾아보세요." #: platform/android/export/export_plugin.cpp msgid "Moving output" @@ -19148,20 +19076,16 @@ msgstr "" "트 ë””ë ‰í† ë¦¬ë¥¼ 확ì¸í•˜ì„¸ìš”." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Package not found: \"%s\"." -msgstr "패키지를 ì°¾ì„ ìˆ˜ ì—†ìŒ: %s" +msgstr "패키지를 ì°¾ì„ ìˆ˜ ì—†ìŒ: \"%s\"." #: platform/android/export/export_plugin.cpp msgid "Creating APK..." msgstr "APK를 만드는 중..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not find template APK to export: \"%s\"." -msgstr "" -"내보낼 템플릿 APK를 ì°¾ì„ ìˆ˜ ì—†ìŒ:\n" -"%s" +msgstr "내보낼 템플릿 APK를 ì°¾ì„ ìˆ˜ ì—†ìŒ: \"%s\"." #: platform/android/export/export_plugin.cpp #, fuzzy @@ -19180,9 +19104,8 @@ msgid "Adding files..." msgstr "파ì¼ì„ 추가하는 중..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files." -msgstr "프로ì 트 파ì¼ì„ 내보낼 수 없었습니다" +msgstr "프로ì 트 파ì¼ì„ 내보낼 수 없습니다." #: platform/android/export/export_plugin.cpp msgid "Aligning APK..." @@ -19278,9 +19201,8 @@ msgid "Code Sign Identity Release" msgstr "" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Export Method Release" -msgstr "내보내기 모드:" +msgstr "내보내기 모드 출시" #: platform/iphone/export/export.cpp msgid "Targeted Device Family" @@ -19291,9 +19213,8 @@ msgid "Info" msgstr "" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Identifier" -msgstr "ìž˜ëª»ëœ ì‹ë³„ìž:" +msgstr "ì‹ë³„ìž" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #, fuzzy @@ -19317,14 +19238,12 @@ msgid "Capabilities" msgstr "ì†ì„± 붙여넣기" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Access Wi-Fi" -msgstr "성공!" +msgstr "Wi-Fi ì—°ê²°" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Push Notifications" -msgstr "무작위 íšŒì „:" +msgstr "푸시 알림" #: platform/iphone/export/export.cpp #, fuzzy @@ -19424,6 +19343,11 @@ msgstr "노드 잘ë¼ë‚´ê¸°" msgid "Custom BG Color" msgstr "노드 잘ë¼ë‚´ê¸°" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "ëª¨ë‘ íŽ¼ì¹˜ê¸°" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -19456,19 +19380,16 @@ msgid "Run exported HTML in the system's default browser." msgstr "내보낸 HTMLì„ ì‹œìŠ¤í…œì˜ ê¸°ë³¸ 브ë¼ìš°ì €ë¥¼ 사용하여 실행합니다." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not open template for export: \"%s\"." -msgstr "내보내기 í…œí”Œë¦¿ì„ ì—´ 수 ì—†ìŒ:" +msgstr "내보내기 í…œí”Œë¦¿ì„ ì—´ 수 ì—†ìŒ: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Invalid export template: \"%s\"." -msgstr "ìž˜ëª»ëœ ë‚´ë³´ë‚´ê¸° 템플릿:" +msgstr "ìž˜ëª»ëœ ë‚´ë³´ë‚´ê¸° 템플릿: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not write file: \"%s\"." -msgstr "파ì¼ì— 쓸 수 ì—†ìŒ:" +msgstr "파ì¼ì— 쓸 수 ì—†ìŒ: \"%s\"." #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #, fuzzy @@ -19476,18 +19397,16 @@ msgid "Icon Creation" msgstr "여백 ì„¤ì •" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read file: \"%s\"." -msgstr "파ì¼ì„ ì½ì„ 수 ì—†ìŒ:" +msgstr "파ì¼ì„ ì½ì„ 수 ì—†ìŒ: \"%s\"." #: platform/javascript/export/export.cpp msgid "PWA" msgstr "" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Variant" -msgstr "간격:" +msgstr "변종" #: platform/javascript/export/export.cpp #, fuzzy @@ -19559,19 +19478,16 @@ msgid "Icon 512 X 512" msgstr "" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read HTML shell: \"%s\"." -msgstr "HTML shellì„ ì½ì„ 수 ì—†ìŒ:" +msgstr "HTML shellì„ ì½ì„ 수 ì—†ìŒ: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not create HTTP server directory: %s." -msgstr "HTTP 서버 ë””ë ‰í† ë¦¬ë¥¼ 만들 수 ì—†ìŒ:" +msgstr "HTTP 서버 ë””ë ‰í† ë¦¬ë¥¼ 만들 수 ì—†ìŒ: %s." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Error starting HTTP server: %d." -msgstr "HTTP 서버를 시작하는 중 오류:" +msgstr "HTTP 서버를 시작하는 중 오류: %d." #: platform/javascript/export/export.cpp msgid "Web" @@ -19675,9 +19591,8 @@ msgid "Unknown object type." msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "App Category" -msgstr "ì¹´í…Œê³ ë¦¬:" +msgstr "앱 ì¹´í…Œê³ ë¦¬" #: platform/osx/export/export.cpp msgid "High Res" @@ -19870,14 +19785,12 @@ msgid "Apple Team ID" msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not open icon file \"%s\"." -msgstr "프로ì 트 파ì¼ì„ 내보낼 수 없었습니다" +msgstr "ì•„ì´ì½˜ íŒŒì¼ \"%s\"를 ì—´ 수 없습니다." #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not start xcrun executable." -msgstr "하위 프로세스를 ì‹œìž‘í• ìˆ˜ 없습니다!" +msgstr "xcrun 실행 파ì¼ì„ 시작하지 못했습니다." #: platform/osx/export/export.cpp #, fuzzy @@ -19935,9 +19848,8 @@ msgid "No identity found." msgstr "ì•„ì´ì½˜ì„ ì°¾ì„ ìˆ˜ 없습니다." #: platform/osx/export/export.cpp -#, fuzzy msgid "Cannot sign file %s." -msgstr "íŒŒì¼ ì €ìž¥ 중 오류: %s" +msgstr "íŒŒì¼ %s를 ì„œëª…í• ìˆ˜ 없습니다." #: platform/osx/export/export.cpp msgid "Relative symlinks are not supported, exported \"%s\" might be broken!" @@ -20195,9 +20107,8 @@ msgid "Certificate" msgstr "ì •ì :" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Algorithm" -msgstr "디버거" +msgstr "ì•Œê³ ë¦¬ì¦˜" #: platform/uwp/export/export.cpp msgid "Major" @@ -20213,9 +20124,8 @@ msgid "Build" msgstr "ìž ëª¨ë“œ" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Revision" -msgstr "í‘œí˜„ì‹ ì„¤ì •" +msgstr "ê°œì •" #: platform/uwp/export/export.cpp msgid "Landscape" @@ -20282,6 +20192,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "ìž˜ëª»ëœ íŒ¨í‚¤ì§€ 단축 ì´ë¦„." @@ -20352,9 +20268,8 @@ msgid "Debug Algorithm" msgstr "디버거" #: platform/windows/export/export.cpp -#, fuzzy msgid "Failed to rename temporary file \"%s\"." -msgstr "임시 파ì¼ì„ ì œê±°í• ìˆ˜ ì—†ìŒ:" +msgstr "임시 íŒŒì¼ \"%s\"ì˜ ì´ë¦„ì„ ë°”ê¾¸ì§€ 못했습니다." #: platform/windows/export/export.cpp msgid "Identity Type" @@ -20380,19 +20295,16 @@ msgid "File Version" msgstr "ë²„ì „" #: platform/windows/export/export.cpp -#, fuzzy msgid "Product Version" -msgstr "ìž˜ëª»ëœ ì œí’ˆ GUID." +msgstr "ì œí’ˆ ë²„ì „" #: platform/windows/export/export.cpp -#, fuzzy msgid "Company Name" -msgstr "노드 ì´ë¦„:" +msgstr "회사 ì´ë¦„" #: platform/windows/export/export.cpp -#, fuzzy msgid "Product Name" -msgstr "프로ì 트 ì´ë¦„:" +msgstr "ì œí’ˆ ì´ë¦„" #: platform/windows/export/export.cpp #, fuzzy @@ -20404,9 +20316,8 @@ msgid "Trademarks" msgstr "" #: platform/windows/export/export.cpp -#, fuzzy msgid "Resources Modification" -msgstr "무작위 íšŒì „:" +msgstr "리소스 변경" #: platform/windows/export/export.cpp #, fuzzy @@ -20441,9 +20352,8 @@ msgid "Could not find osslsigncode executable at \"%s\"." msgstr "keystore를 ì°¾ì„ ìˆ˜ 없어, 내보낼 수 없었습니다." #: platform/windows/export/export.cpp -#, fuzzy msgid "Invalid identity type." -msgstr "ìž˜ëª»ëœ ì‹ë³„ìž:" +msgstr "ìž˜ëª»ëœ ì‹ë³„ìž íƒ€ìž…ìž…ë‹ˆë‹¤." #: platform/windows/export/export.cpp #, fuzzy @@ -20463,9 +20373,8 @@ msgid "Signtool failed to sign executable: %s." msgstr "ìž˜ëª»ëœ í™•ìž¥ìž." #: platform/windows/export/export.cpp -#, fuzzy msgid "Failed to remove temporary file \"%s\"." -msgstr "임시 파ì¼ì„ ì œê±°í• ìˆ˜ ì—†ìŒ:" +msgstr "임시 íŒŒì¼ \"%s\"를 ì œê±°í•˜ì§€ 못했습니다." #: platform/windows/export/export.cpp msgid "" @@ -20474,19 +20383,16 @@ msgid "" msgstr "" #: platform/windows/export/export.cpp -#, fuzzy msgid "Invalid icon path:" -msgstr "ìž˜ëª»ëœ ê²½ë¡œ." +msgstr "ìž˜ëª»ëœ ì•„ì´ì½˜ 경로:" #: platform/windows/export/export.cpp -#, fuzzy msgid "Invalid file version:" -msgstr "ìž˜ëª»ëœ í™•ìž¥ìž." +msgstr "ìž˜ëª»ëœ íŒŒì¼ ë²„ì „:" #: platform/windows/export/export.cpp -#, fuzzy msgid "Invalid product version:" -msgstr "ìž˜ëª»ëœ ì œí’ˆ GUID." +msgstr "ìž˜ëª»ëœ ì œí’ˆ ë²„ì „:" #: platform/windows/export/export.cpp msgid "Windows executables cannot be >= 4 GiB." @@ -20652,9 +20558,8 @@ msgstr "" #: scene/3d/light.cpp scene/3d/reflection_probe.cpp #: scene/3d/visibility_notifier.cpp scene/3d/visual_instance.cpp #: scene/resources/material.cpp -#, fuzzy msgid "Max Distance" -msgstr "거리 ì„ íƒ:" +msgstr "최대 거리" #: scene/2d/audio_stream_player_2d.cpp scene/3d/light.cpp #, fuzzy @@ -20688,9 +20593,8 @@ msgstr "íšŒì „ 단계:" #: scene/2d/camera_2d.cpp scene/2d/listener_2d.cpp scene/3d/camera.cpp #: scene/3d/listener.cpp scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Current" -msgstr "현재:" +msgstr "현재" #: scene/2d/camera_2d.cpp scene/gui/graph_edit.cpp #, fuzzy @@ -20987,9 +20891,8 @@ msgstr "" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp -#, fuzzy msgid "Randomness" -msgstr "ìž„ì˜ ìž¬ì‹œìž‘ (ì´ˆ):" +msgstr "무작위성" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21480,9 +21383,8 @@ msgid "Target Desired Distance" msgstr "" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp -#, fuzzy msgid "Path Max Distance" -msgstr "거리 ì„ íƒ:" +msgstr "경로 최대 거리" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp #, fuzzy @@ -21508,9 +21410,8 @@ msgid "Time Horizon" msgstr "수í‰ìœ¼ë¡œ 뒤집기" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp -#, fuzzy msgid "Max Speed" -msgstr "ì†ë„:" +msgstr "최대 ì†ë„" #: scene/2d/navigation_agent_2d.cpp msgid "" @@ -21552,9 +21453,8 @@ msgstr "ì§„í–‰" #: scene/2d/node_2d.cpp scene/2d/polygon_2d.cpp scene/3d/spatial.cpp #: scene/main/canvas_layer.cpp -#, fuzzy msgid "Rotation Degrees" -msgstr "%së„로 íšŒì „." +msgstr "íšŒì „ ê°ë„" #: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy @@ -21562,14 +21462,12 @@ msgid "Global Rotation" msgstr "ìƒìˆ˜" #: scene/2d/node_2d.cpp -#, fuzzy msgid "Global Rotation Degrees" -msgstr "%së„로 íšŒì „." +msgstr "ì „ì— íšŒì „ ê°ë„" #: scene/2d/node_2d.cpp -#, fuzzy msgid "Global Scale" -msgstr "무작위 스케ì¼:" +msgstr "ì „ì— ìŠ¤ì¼€ì¼" #: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy @@ -21587,9 +21485,8 @@ msgid "Scroll" msgstr "" #: scene/2d/parallax_background.cpp -#, fuzzy msgid "Base Offset" -msgstr "오프셋:" +msgstr "기본 오프셋" #: scene/2d/parallax_background.cpp #, fuzzy @@ -21683,19 +21580,16 @@ msgid "PathFollow2D only works when set as a child of a Path2D node." msgstr "PathFollow2D는 Path2D ë…¸ë“œì˜ ìžì‹ 노드로 ìžˆì„ ë•Œë§Œ ìž‘ë™í•©ë‹ˆë‹¤." #: scene/2d/path_2d.cpp scene/3d/path.cpp -#, fuzzy msgid "Unit Offset" -msgstr "ê²©ìž ì˜¤í”„ì…‹:" +msgstr "단위 오프셋" #: scene/2d/path_2d.cpp scene/3d/camera.cpp scene/3d/path.cpp -#, fuzzy msgid "H Offset" -msgstr "오프셋:" +msgstr "가로 오프셋" #: scene/2d/path_2d.cpp scene/3d/camera.cpp scene/3d/path.cpp -#, fuzzy msgid "V Offset" -msgstr "오프셋:" +msgstr "세로 오프셋" #: scene/2d/path_2d.cpp scene/3d/path.cpp msgid "Cubic Interp" @@ -21756,9 +21650,8 @@ msgid "Mass" msgstr "" #: scene/2d/physics_body_2d.cpp -#, fuzzy msgid "Inertia" -msgstr "수ì§:" +msgstr "관성" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #, fuzzy @@ -21795,9 +21688,8 @@ msgid "Sleeping" msgstr "스마트 스냅" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Can Sleep" -msgstr "ì†ë„:" +msgstr "슬립 가능" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Damp" @@ -21821,9 +21713,8 @@ msgid "Safe Margin" msgstr "여백 ì„¤ì •" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Sync To Physics" -msgstr " (물리)" +msgstr "ë¬¼ë¦¬ì— ì—°ë™" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #, fuzzy @@ -21843,9 +21734,8 @@ msgid "Normal" msgstr "형ì‹" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Remainder" -msgstr "ë Œë”러:" +msgstr "나머지" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #, fuzzy @@ -21895,14 +21785,12 @@ msgid "Invert" msgstr "" #: scene/2d/polygon_2d.cpp -#, fuzzy msgid "Vertex Colors" -msgstr "ê¼ì§“ì " +msgstr "ê¼ì§“ì 색" #: scene/2d/polygon_2d.cpp -#, fuzzy msgid "Internal Vertex Count" -msgstr "ë‚´ë¶€ ê¼ì§“ì 만들기" +msgstr "ë‚´ë¶€ ê¼ì§“ì 개수" #: scene/2d/position_2d.cpp #, fuzzy @@ -22162,9 +22050,8 @@ msgid "ARVROrigin requires an ARVRCamera child node." msgstr "ARVROriginì€ ìžì‹ìœ¼ë¡œ ARVRCamera 노드가 필요합니다." #: scene/3d/arvr_nodes.cpp servers/arvr_server.cpp -#, fuzzy msgid "World Scale" -msgstr "무작위 스케ì¼:" +msgstr "세계 í¬ê¸°" #: scene/3d/audio_stream_player_3d.cpp #, fuzzy @@ -22193,9 +22080,8 @@ msgid "Emission Angle" msgstr "ë°©ì¶œ 색ìƒ" #: scene/3d/audio_stream_player_3d.cpp -#, fuzzy msgid "Degrees" -msgstr "%së„로 íšŒì „." +msgstr "ê°ë„" #: scene/3d/audio_stream_player_3d.cpp #, fuzzy @@ -22214,9 +22100,8 @@ msgstr "" #: scene/3d/audio_stream_player_3d.cpp #: servers/audio/effects/audio_effect_filter.cpp -#, fuzzy msgid "dB" -msgstr "B" +msgstr "dB" #: scene/3d/audio_stream_player_3d.cpp #, fuzzy @@ -22277,9 +22162,8 @@ msgid "Bounce Indirect Energy" msgstr "" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Use Denoiser" -msgstr "í•„í„°:" +msgstr "ë…¸ì´ì¦ˆ ê°ì†Œ 사용" #: scene/3d/baked_lightmap.cpp scene/resources/texture.cpp msgid "Use HDR" @@ -22306,9 +22190,8 @@ msgid "Generate" msgstr "ì¼ë°˜" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Max Size" -msgstr "í¬ê¸°:" +msgstr "최대 í¬ê¸°" #: scene/3d/baked_lightmap.cpp #, fuzzy @@ -22620,9 +22503,8 @@ msgid "Alpha Scissor Threshold" msgstr "" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/material.cpp -#, fuzzy msgid "Render Priority" -msgstr "ìš°ì„ ìˆœìœ„ 활성화" +msgstr "ë Œë” ìš°ì„ ìˆœìœ„" #: scene/3d/label_3d.cpp #, fuzzy @@ -24599,7 +24481,7 @@ msgstr "" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Caret" -msgstr "" +msgstr "íƒˆìž ê¸°í˜¸" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Blink" @@ -25880,9 +25762,8 @@ msgid "Title Height" msgstr "테스트" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Close Highlight" -msgstr "ì§ì ‘ 조명" +msgstr "ê°•ì¡° 닫기" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26141,9 +26022,8 @@ msgid "Menu" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Menu Highlight" -msgstr "ì§ì ‘ 조명" +msgstr "메뉴 ê°•ì¡°" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26758,9 +26638,8 @@ msgid "Unshaded" msgstr "ì…°ì´ë” ì—†ìŒ í‘œì‹œ" #: scene/resources/material.cpp -#, fuzzy msgid "Vertex Lighting" -msgstr "ì§ì ‘ 조명" +msgstr "ê¼ì§“ì 조명" #: scene/resources/material.cpp #, fuzzy @@ -26794,9 +26673,8 @@ msgid "Albedo Tex MSDF" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Vertex Color" -msgstr "ê¼ì§“ì " +msgstr "ê¼ì§“ì 색" #: scene/resources/material.cpp msgid "Use As Albedo" diff --git a/editor/translations/lt.po b/editor/translations/lt.po index 66891e3f0e..e89e801a9b 100644 --- a/editor/translations/lt.po +++ b/editor/translations/lt.po @@ -4505,6 +4505,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7325,7 +7326,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15320,18 +15322,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Panaikinti" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Panaikinti" #: editor/scene_tree_dock.cpp @@ -15528,6 +15530,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Panaikinti" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15592,6 +15599,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17461,6 +17472,20 @@ msgstr "Visas Pasirinkimas" msgid "Auto Update Project" msgstr "Redaguoti Filtrus" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Importuoti iÅ¡ Nodo:" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "ApraÅ¡ymas:" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19243,6 +19268,11 @@ msgstr "Transition Nodas" msgid "Custom BG Color" msgstr "Transition Nodas" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Importuoti iÅ¡ Nodo:" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -20077,6 +20107,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "Netinkamas Å¡rifto dydis." diff --git a/editor/translations/lv.po b/editor/translations/lv.po index c00e8d1a44..7234ac270a 100644 --- a/editor/translations/lv.po +++ b/editor/translations/lv.po @@ -4570,6 +4570,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projekts" @@ -7384,7 +7385,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15138,18 +15140,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Mezgla VÄrds:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Mezgla VÄrds:" #: editor/scene_tree_dock.cpp @@ -15339,6 +15341,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Mezgla VÄrds:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Savienojas No)" @@ -15404,6 +15411,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17268,6 +17279,21 @@ msgstr "BÅ«vÄ“t risinÄjumu" msgid "Auto Update Project" msgstr "Nenosaukts Projekts" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "ParÄdÄ«t Visu" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "IzvÄ“lÄ“ties Direktoriju" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "IzvÄ“lÄ“ties Direktoriju" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19049,6 +19075,11 @@ msgstr "Izgriezt mezglu(s)" msgid "Custom BG Color" msgstr "Izgriezt mezglu(s)" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "IzvÄ“rst apakšējo paneli" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -19886,6 +19917,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "NederÄ«gs paketes Ä«sais nosaukums." diff --git a/editor/translations/mk.po b/editor/translations/mk.po index 2d183ec609..d0be6e7036 100644 --- a/editor/translations/mk.po +++ b/editor/translations/mk.po @@ -4340,6 +4340,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7030,7 +7031,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -14718,18 +14720,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "ВнеÑи клуч тука" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "ВнеÑи клуч тука" #: editor/scene_tree_dock.cpp @@ -14919,6 +14921,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "ВнеÑи клуч тука" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -14982,6 +14989,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -16767,6 +16778,18 @@ msgstr "" msgid "Auto Update Project" msgstr "" +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "C# Project Directory" +msgstr "" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18459,6 +18482,10 @@ msgstr "" msgid "Custom BG Color" msgstr "" +#: platform/iphone/export/export.cpp +msgid "Export Icons" +msgstr "" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19238,6 +19265,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/ml.po b/editor/translations/ml.po index 7568bc881e..35845df066 100644 --- a/editor/translations/ml.po +++ b/editor/translations/ml.po @@ -4357,6 +4357,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7047,7 +7048,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -14742,18 +14744,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "ചലനതàµà´¤à´¿àµ»à´±àµ† നേരം മാറàµà´±àµà´•" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "ചലനതàµà´¤à´¿àµ»à´±àµ† നേരം മാറàµà´±àµà´•" #: editor/scene_tree_dock.cpp @@ -14943,6 +14945,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "ചലനതàµà´¤à´¿àµ»à´±àµ† നേരം മാറàµà´±àµà´•" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15006,6 +15013,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -16792,6 +16803,18 @@ msgstr "" msgid "Auto Update Project" msgstr "" +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "C# Project Directory" +msgstr "" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18490,6 +18513,11 @@ msgstr "à´ªàµà´°à´µàµƒà´¤àµà´¤à´¿à´•ൾ:" msgid "Custom BG Color" msgstr "à´ªàµà´°à´µàµƒà´¤àµà´¤à´¿à´•ൾ:" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "à´¤àµà´°à´¿à´®à´¾à´¨ പരിവർതàµà´¤à´¨à´‚ നോകàµà´•àµà´•" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19278,6 +19306,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/mr.po b/editor/translations/mr.po index 4bdf5ba4fb..6baf1dc52e 100644 --- a/editor/translations/mr.po +++ b/editor/translations/mr.po @@ -4351,6 +4351,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7044,7 +7045,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -14736,18 +14738,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "अâ€à¥…निमेशन नाव:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "अâ€à¥…निमेशन नाव:" #: editor/scene_tree_dock.cpp @@ -14937,6 +14939,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "अâ€à¥…निमेशन नाव:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15000,6 +15007,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -16793,6 +16804,19 @@ msgstr "" msgid "Auto Update Project" msgstr "" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "पà¥à¤²à¥‡ मोड:" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "C# Project Directory" +msgstr "" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18491,6 +18515,10 @@ msgstr "" msgid "Custom BG Color" msgstr "" +#: platform/iphone/export/export.cpp +msgid "Export Icons" +msgstr "" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19279,6 +19307,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/ms.po b/editor/translations/ms.po index 61a60ad8fe..adb377d13a 100644 --- a/editor/translations/ms.po +++ b/editor/translations/ms.po @@ -16,7 +16,7 @@ msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-06-12 13:19+0000\n" +"PO-Revision-Date: 2022-09-09 12:36+0000\n" "Last-Translator: Keviindran Ramachandran <keviinx@yahoo.com>\n" "Language-Team: Malay <https://hosted.weblate.org/projects/godot-engine/godot/" "ms/>\n" @@ -25,7 +25,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -361,14 +361,12 @@ msgid "Max Size (KB)" msgstr "Saiz Maksimum (KB)" #: core/os/input.cpp -#, fuzzy msgid "Mouse Mode" -msgstr "Mod Alih" +msgstr "Mod Tetikus" #: core/os/input.cpp -#, fuzzy msgid "Use Accumulated Input" -msgstr "Padam Input" +msgstr "Gunakan Input Terkumpul" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: servers/audio_server.cpp @@ -396,9 +394,8 @@ msgid "Command" msgstr "Perintah" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" -msgstr "Fizik" +msgstr "Fizikal" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp @@ -452,7 +449,7 @@ msgstr "Tekanan" #: core/os/input_event.cpp msgid "Pen Inverted" -msgstr "" +msgstr "Pen Terbalik" #: core/os/input_event.cpp msgid "Relative" @@ -642,9 +639,8 @@ msgid "Main Run Args" msgstr "Jalan Utama Args" #: core/project_settings.cpp -#, fuzzy msgid "Scene Naming" -msgstr "Laluan Adegan:" +msgstr "Penamaan Adegan" #: core/project_settings.cpp msgid "Search In File Extensions" @@ -655,14 +651,12 @@ msgid "Script Templates Search Path" msgstr "Laluan Carian Templat Skrip" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Autoload On Startup" -msgstr "Muatkan Automatik Semasa Permulaan" +msgstr "Automuat Kawalan Versi Semasa Permulaan" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Plugin Name" -msgstr "Kawalan Versi" +msgstr "Nama Plugin Kawalan Versi" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -4516,6 +4510,7 @@ msgstr "Pelbagai projek atau alatan seluruh adegan." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projek" @@ -7405,7 +7400,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15296,18 +15292,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Nama Nod:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Nama Nod:" #: editor/scene_tree_dock.cpp @@ -15501,6 +15497,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Nama Nod:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15564,6 +15565,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17453,6 +17458,21 @@ msgstr "Semua Pilihan" msgid "Auto Update Project" msgstr "Projek" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Paparkan Semua" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Pilih Direktori" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Pilih Direktori" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19254,6 +19274,11 @@ msgstr "Potong Nod" msgid "Custom BG Color" msgstr "Potong Nod" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Kembangkan Semua" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20093,6 +20118,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/nb.po b/editor/translations/nb.po index 542d5987ca..b39bc2a602 100644 --- a/editor/translations/nb.po +++ b/editor/translations/nb.po @@ -4690,6 +4690,7 @@ msgstr "Diverse prosjekt- eller scene-relaterte verktøy" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Prosjekt" @@ -7654,7 +7655,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15944,18 +15946,19 @@ msgstr "" msgid "Make Local" msgstr "Lag Ben" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Nodenavn:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "Navnet er allerede i bruk av annen funk/var/signal:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Nodenavn:" #: editor/scene_tree_dock.cpp @@ -16164,6 +16167,11 @@ msgstr "Legg til i Gruppe" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Nodenavn:" + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr "Tilkoblingsfeil" @@ -16228,6 +16236,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -18184,6 +18196,21 @@ msgstr "Alle valg" msgid "Auto Update Project" msgstr "Eksporter Prosjekt" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Vis alle" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Velg en Mappe" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Velg en Mappe" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -20053,6 +20080,11 @@ msgstr "Klipp ut Noder" msgid "Custom BG Color" msgstr "Klipp ut Noder" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Utvid alle" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20905,6 +20937,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "Ugyldig navn." diff --git a/editor/translations/nl.po b/editor/translations/nl.po index aaa0f38a1d..2b09ed5abc 100644 --- a/editor/translations/nl.po +++ b/editor/translations/nl.po @@ -58,13 +58,15 @@ # Rémi Verschelde <remi@godotengine.org>, 2022. # Wouter <mysticaldev@hotmail.com>, 2022. # voylin <0voylin0@gmail.com>, 2022. +# Gert-dev <qnyasgjhapqyuhoibr@kiabws.com>, 2022. +# Nnn <irri2020@outlook.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-03-17 13:58+0000\n" -"Last-Translator: voylin <0voylin0@gmail.com>\n" +"PO-Revision-Date: 2022-09-23 04:16+0000\n" +"Last-Translator: Nnn <irri2020@outlook.com>\n" "Language-Team: Dutch <https://hosted.weblate.org/projects/godot-engine/godot/" "nl/>\n" "Language: nl\n" @@ -72,110 +74,97 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.12-dev\n" +"X-Generator: Weblate 4.14.1\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" -msgstr "" +msgstr "Tablet-stuurprogramma" #: core/bind/core_bind.cpp -#, fuzzy msgid "Clipboard" -msgstr "Plakbord is leeg!" +msgstr "Klembord" #: core/bind/core_bind.cpp -#, fuzzy msgid "Current Screen" -msgstr "Huidige scène" +msgstr "Huidig scherm" #: core/bind/core_bind.cpp msgid "Exit Code" -msgstr "" +msgstr "Afsluitcode" #: core/bind/core_bind.cpp -#, fuzzy msgid "V-Sync Enabled" -msgstr "Inschakelen" +msgstr "V-Sync ingeschakeld" #: core/bind/core_bind.cpp main/main.cpp msgid "V-Sync Via Compositor" -msgstr "" +msgstr "V-Sync via compositor" #: core/bind/core_bind.cpp main/main.cpp msgid "Delta Smoothing" -msgstr "" +msgstr "Delta-gladmaken" #: core/bind/core_bind.cpp -#, fuzzy msgid "Low Processor Usage Mode" -msgstr "Verplaatsingsmodus" +msgstr "Lage energieverbruiksmodus processor" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode Sleep (µsec)" -msgstr "" +msgstr "Lage energieverbruiksmodus processor slaap (µs)" #: core/bind/core_bind.cpp main/main.cpp platform/uwp/os_uwp.cpp -#, fuzzy msgid "Keep Screen On" -msgstr "Houd Debugger Open" +msgstr "Scherm aanhouden" #: core/bind/core_bind.cpp -#, fuzzy msgid "Min Window Size" -msgstr "Omlijningsgrootte:" +msgstr "Minimale venstergrootte" #: core/bind/core_bind.cpp -#, fuzzy msgid "Max Window Size" -msgstr "Omlijningsgrootte:" +msgstr "Maximale venstergrootte" #: core/bind/core_bind.cpp -#, fuzzy msgid "Screen Orientation" -msgstr "Scherm operator." +msgstr "Schermoriëntering" #: core/bind/core_bind.cpp core/project_settings.cpp main/main.cpp #: platform/uwp/os_uwp.cpp -#, fuzzy msgid "Window" -msgstr "Nieuw Venster" +msgstr "Venster" #: core/bind/core_bind.cpp core/project_settings.cpp -#, fuzzy msgid "Borderless" -msgstr "Randpixels" +msgstr "Naadloos" #: core/bind/core_bind.cpp msgid "Per Pixel Transparency Enabled" -msgstr "" +msgstr "Transparantie per pixel ingeschakeld" #: core/bind/core_bind.cpp core/project_settings.cpp -#, fuzzy msgid "Fullscreen" msgstr "Volledig scherm" #: core/bind/core_bind.cpp msgid "Maximized" -msgstr "" +msgstr "Gemaximaliseerd" #: core/bind/core_bind.cpp -#, fuzzy msgid "Minimized" -msgstr "Initialiseren" +msgstr "Geminimaliseerd" #: core/bind/core_bind.cpp core/project_settings.cpp scene/gui/dialogs.cpp #: scene/gui/graph_node.cpp msgid "Resizable" -msgstr "" +msgstr "Verstelbare grootte" #: core/bind/core_bind.cpp core/os/input_event.cpp scene/2d/node_2d.cpp #: scene/2d/physics_body_2d.cpp scene/2d/remote_transform_2d.cpp #: scene/3d/physics_body.cpp scene/3d/remote_transform.cpp #: scene/gui/control.cpp scene/gui/line_edit.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Position" -msgstr "Tabbladpositie" +msgstr "Positie" #: core/bind/core_bind.cpp core/project_settings.cpp editor/editor_settings.cpp #: main/main.cpp modules/gridmap/grid_map.cpp @@ -186,65 +175,56 @@ msgstr "Tabbladpositie" #: scene/resources/primitive_meshes.cpp scene/resources/sky.cpp #: scene/resources/style_box.cpp scene/resources/texture.cpp #: scene/resources/visual_shader.cpp servers/visual_server.cpp -#, fuzzy msgid "Size" -msgstr "Grootte: " +msgstr "Grootte" #: core/bind/core_bind.cpp msgid "Endian Swap" -msgstr "" +msgstr "Endian omwisselen" #: core/bind/core_bind.cpp -#, fuzzy msgid "Editor Hint" -msgstr "Editor" +msgstr "Editor-hint" #: core/bind/core_bind.cpp msgid "Print Error Messages" -msgstr "" +msgstr "Foutboodschappen tonen" #: core/bind/core_bind.cpp -#, fuzzy msgid "Iterations Per Second" -msgstr "Interpolatiemodus" +msgstr "Iteraties per seconde" #: core/bind/core_bind.cpp -#, fuzzy msgid "Target FPS" -msgstr "Doel" +msgstr "Beoogde FPS" #: core/bind/core_bind.cpp -#, fuzzy msgid "Time Scale" -msgstr "Tijdschaalknoop" +msgstr "Tijdschaal" #: core/bind/core_bind.cpp main/main.cpp -#, fuzzy msgid "Physics Jitter Fix" -msgstr "Physics Frame %" +msgstr "Oplossing Jitter Fysica" #: core/bind/core_bind.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Error" msgstr "Fout" #: core/bind/core_bind.cpp -#, fuzzy msgid "Error String" -msgstr "Fout bij het opslaan" +msgstr "Foutboodschap" #: core/bind/core_bind.cpp -#, fuzzy msgid "Error Line" -msgstr "Fout bij het opslaan" +msgstr "Lijn fout" #: core/bind/core_bind.cpp -#, fuzzy msgid "Result" -msgstr "Zoek Resultaten" +msgstr "Resultaat" #: core/command_queue_mt.cpp core/message_queue.cpp main/main.cpp msgid "Memory" -msgstr "" +msgstr "Geheugen" #: core/command_queue_mt.cpp core/message_queue.cpp #: core/register_core_types.cpp drivers/gles2/rasterizer_canvas_base_gles2.cpp @@ -255,12 +235,11 @@ msgstr "" #: modules/webrtc/webrtc_data_channel.h modules/websocket/websocket_macros.h #: servers/visual_server.cpp msgid "Limits" -msgstr "" +msgstr "Limieten" #: core/command_queue_mt.cpp -#, fuzzy msgid "Command Queue" -msgstr "Ctrl: Roteer" +msgstr "Commandowachtrij" #: core/command_queue_mt.cpp msgid "Multithreading Queue Size (KB)" @@ -270,9 +249,8 @@ msgstr "" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Function" -msgstr "Functies" +msgstr "Functie" #: core/image.cpp core/packed_data_container.cpp scene/2d/polygon_2d.cpp #: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp @@ -284,19 +262,16 @@ msgstr "" #: modules/gdscript/language_server/gdscript_language_server.cpp #: modules/webrtc/webrtc_data_channel.h modules/websocket/websocket_macros.h #: scene/gui/file_dialog.cpp -#, fuzzy msgid "Network" -msgstr "Netwerk Profiler" +msgstr "Netwerk" #: core/io/file_access_network.cpp -#, fuzzy msgid "Remote FS" -msgstr "Remote " +msgstr "Remote" #: core/io/file_access_network.cpp -#, fuzzy msgid "Page Size" -msgstr "Pagina: " +msgstr "Pagina grootte" #: core/io/file_access_network.cpp msgid "Page Read Ahead" @@ -307,23 +282,20 @@ msgid "Blocking Mode Enabled" msgstr "" #: core/io/http_client.cpp -#, fuzzy msgid "Connection" -msgstr "Verbinden" +msgstr "Verbinding" #: core/io/http_client.cpp msgid "Read Chunk Size" msgstr "" #: core/io/marshalls.cpp -#, fuzzy msgid "Object ID" -msgstr "Objecten Getekend" +msgstr "Object ID" #: core/io/multiplayer_api.cpp core/io/packet_peer.cpp -#, fuzzy msgid "Allow Object Decoding" -msgstr "\"Onion Skinning\" Inschakelen" +msgstr "Object Decoding Toestaan" #: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp msgid "Refuse New Network Connections" @@ -340,9 +312,8 @@ msgid "Root Node" msgstr "Wortelknoopnaam" #: core/io/networked_multiplayer_peer.cpp -#, fuzzy msgid "Refuse New Connections" -msgstr "Verbinden" +msgstr "Nieuwe Verbindingen Weigeren" #: core/io/networked_multiplayer_peer.cpp #, fuzzy @@ -434,7 +405,6 @@ msgid "Seed" msgstr "" #: core/math/random_number_generator.cpp -#, fuzzy msgid "State" msgstr "Status" @@ -447,9 +417,8 @@ msgid "Max Size (KB)" msgstr "" #: core/os/input.cpp -#, fuzzy msgid "Mouse Mode" -msgstr "Verplaatsingsmodus" +msgstr "Muismodus" #: core/os/input.cpp #, fuzzy @@ -480,26 +449,22 @@ msgid "Meta" msgstr "" #: core/os/input_event.cpp -#, fuzzy msgid "Command" -msgstr "Gemeenschap" +msgstr "Commando" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" -msgstr "Physics Frame %" +msgstr "Fysiek" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Pressed" -msgstr "Voorinstellingen" +msgstr "Gedrukt" #: core/os/input_event.cpp -#, fuzzy msgid "Scancode" -msgstr "Inlezen" +msgstr "Scancode" #: core/os/input_event.cpp msgid "Physical Scancode" @@ -507,31 +472,27 @@ msgstr "" #: core/os/input_event.cpp msgid "Unicode" -msgstr "" +msgstr "Unicode" #: core/os/input_event.cpp msgid "Echo" msgstr "" #: core/os/input_event.cpp scene/gui/base_button.cpp -#, fuzzy msgid "Button Mask" -msgstr "Button (Knop)" +msgstr "Knop Masker" #: core/os/input_event.cpp scene/2d/node_2d.cpp scene/gui/control.cpp -#, fuzzy msgid "Global Position" -msgstr "Constante" +msgstr "Globale Positie" #: core/os/input_event.cpp -#, fuzzy msgid "Factor" -msgstr "Vector" +msgstr "Factor" #: core/os/input_event.cpp -#, fuzzy msgid "Button Index" -msgstr "Muis Knop Index:" +msgstr "Knop Index" #: core/os/input_event.cpp msgid "Doubleclick" @@ -542,26 +503,23 @@ msgid "Tilt" msgstr "" #: core/os/input_event.cpp -#, fuzzy msgid "Pressure" -msgstr "Voorinstellingen" +msgstr "Druk" #: core/os/input_event.cpp msgid "Pen Inverted" msgstr "" #: core/os/input_event.cpp -#, fuzzy msgid "Relative" -msgstr "Relatief kleven" +msgstr "Relatief" #: core/os/input_event.cpp scene/2d/camera_2d.cpp scene/2d/cpu_particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/interpolated_camera.cpp #: scene/animation/animation_player.cpp scene/resources/environment.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Speed" -msgstr "Snelheid:" +msgstr "Snelheid" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: scene/3d/sprite_3d.cpp @@ -569,14 +527,12 @@ msgid "Axis" msgstr "As" #: core/os/input_event.cpp -#, fuzzy msgid "Axis Value" -msgstr "Waarde vastzetten" +msgstr "As Waarde" #: core/os/input_event.cpp modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Index" -msgstr "Index:" +msgstr "Index" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: modules/visual_script/visual_script_nodes.cpp @@ -594,14 +550,12 @@ msgid "Delta" msgstr "" #: core/os/input_event.cpp -#, fuzzy msgid "Channel" -msgstr "Wijzig" +msgstr "Kanaal" #: core/os/input_event.cpp main/main.cpp -#, fuzzy msgid "Message" -msgstr "Commit veranderingen" +msgstr "Bericht" #: core/os/input_event.cpp #, fuzzy @@ -611,18 +565,16 @@ msgstr "Pitch" #: core/os/input_event.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/physics_body_2d.cpp scene/3d/cpu_particles.cpp #: scene/3d/physics_body.cpp scene/resources/particles_material.cpp -#, fuzzy msgid "Velocity" -msgstr "Initialiseren" +msgstr "Versnelling" #: core/os/input_event.cpp msgid "Instrument" msgstr "" #: core/os/input_event.cpp -#, fuzzy msgid "Controller Number" -msgstr "Regelnummer:" +msgstr "Controller Nummer" #: core/os/input_event.cpp msgid "Controller Value" @@ -631,14 +583,12 @@ msgstr "" #: core/project_settings.cpp editor/editor_node.cpp main/main.cpp #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Application" -msgstr "Actie" +msgstr "Applicatie" #: core/project_settings.cpp main/main.cpp -#, fuzzy msgid "Config" -msgstr "Kleven instellen" +msgstr "Configuratie" #: core/project_settings.cpp #, fuzzy @@ -677,14 +627,12 @@ msgid "Main Scene" msgstr "Startscène" #: core/project_settings.cpp -#, fuzzy msgid "Disable stdout" -msgstr "Autotile uitschakelen" +msgstr "Stdout Uitschakelen" #: core/project_settings.cpp -#, fuzzy msgid "Disable stderr" -msgstr "Item Uitschakelen" +msgstr "Stderr Uitschakelen" #: core/project_settings.cpp msgid "Use Hidden Project Data Directory" @@ -701,9 +649,8 @@ msgstr "" #: core/project_settings.cpp main/main.cpp #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #: platform/uwp/os_uwp.cpp -#, fuzzy msgid "Display" -msgstr "Alles tonen" +msgstr "Tonen" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/opensimplex/noise_texture.cpp scene/2d/line_2d.cpp @@ -717,23 +664,20 @@ msgstr "" #: scene/resources/capsule_shape_2d.cpp scene/resources/cylinder_shape.cpp #: scene/resources/font.cpp scene/resources/navigation_mesh.cpp #: scene/resources/primitive_meshes.cpp scene/resources/texture.cpp -#, fuzzy msgid "Height" -msgstr "Licht" +msgstr "Hoogte" #: core/project_settings.cpp msgid "Always On Top" msgstr "" #: core/project_settings.cpp -#, fuzzy msgid "Test Width" -msgstr "Linkerbreedte" +msgstr "Test Breedte" #: core/project_settings.cpp -#, fuzzy msgid "Test Height" -msgstr "Testen" +msgstr "Test Hoogte" #: core/project_settings.cpp editor/animation_track_editor.cpp #: editor/editor_audio_buses.cpp main/main.cpp servers/audio_server.cpp @@ -776,58 +720,49 @@ msgid "Version Control Autoload On Startup" msgstr "Versiebeheersysteem" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Plugin Name" -msgstr "Versiebeheer" +msgstr "Versiebeheer Controle Plugin Naam" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp -#, fuzzy msgid "Input" -msgstr "Voeg invoer toe" +msgstr "Invoer" #: core/project_settings.cpp msgid "UI Accept" msgstr "" #: core/project_settings.cpp -#, fuzzy msgid "UI Select" -msgstr "Selecteer" +msgstr "UI Selecteer" #: core/project_settings.cpp -#, fuzzy msgid "UI Cancel" -msgstr "Annuleer" +msgstr "UI Annuleer" #: core/project_settings.cpp -#, fuzzy msgid "UI Focus Next" -msgstr "Focus Pad" +msgstr "UI Focus Volgende" #: core/project_settings.cpp -#, fuzzy msgid "UI Focus Prev" -msgstr "Focus Pad" +msgstr "UI Focus Vorige" #: core/project_settings.cpp -#, fuzzy msgid "UI Left" -msgstr "Linksboven" +msgstr "UI Links" #: core/project_settings.cpp -#, fuzzy msgid "UI Right" -msgstr "Rechtsboves" +msgstr "UI Rechts" #: core/project_settings.cpp msgid "UI Up" msgstr "" #: core/project_settings.cpp -#, fuzzy msgid "UI Down" -msgstr "Omlaag" +msgstr "UI Omlaag" #: core/project_settings.cpp #, fuzzy @@ -980,7 +915,7 @@ msgstr "" #: core/register_core_types.cpp msgid "TCP" -msgstr "" +msgstr "TCP" #: core/register_core_types.cpp #, fuzzy @@ -4694,6 +4629,7 @@ msgstr "Overig project of scène-brede hulpmiddelen." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Project" @@ -5608,7 +5544,7 @@ msgstr "Voorbeeld..." #: editor/editor_settings.cpp msgid "Docks" -msgstr "" +msgstr "panelen" #: editor/editor_settings.cpp #, fuzzy @@ -7246,7 +7182,7 @@ msgstr "" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp msgid "sRGB" -msgstr "" +msgstr "sRGB" #: editor/import/resource_importer_layered_texture.cpp #, fuzzy @@ -7642,7 +7578,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -9765,7 +9702,7 @@ msgstr "Plat 0" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat 1" -msgstr "Plat 1" +msgstr "Vlak 1" #: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp msgid "Ease In" @@ -11497,7 +11434,7 @@ msgstr "Hoekpunten" #: editor/plugins/spatial_editor_plugin.cpp msgid "FPS: %d (%s ms)" -msgstr "" +msgstr "FPS: %d (%s ms)" #: editor/plugins/spatial_editor_plugin.cpp msgid "Top View." @@ -15838,18 +15775,19 @@ msgstr "" msgid "Make Local" msgstr "Maak locaal" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Knoopnaam:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "Naam wordt al gebruikt door een andere functie, variabele of signaal:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Knoopnaam:" #: editor/scene_tree_dock.cpp @@ -16047,6 +15985,11 @@ msgid "Button Group" msgstr "Knoppen Groep" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Knoopnaam:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Verbonden vanaf)" @@ -16122,6 +16065,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "Ongeldige knoopnaam, deze karakters zijn niet toegestaan:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Knoop hernoemen" @@ -18052,6 +17999,21 @@ msgstr "Vul selectie" msgid "Auto Update Project" msgstr "Naamloos Project" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Alles tonen" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Kies een map" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Kies een map" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Einde van innerlijke exception stack trace" @@ -18613,7 +18575,7 @@ msgstr "" #: modules/visual_script/visual_script_flow_control.cpp msgid "While" -msgstr "" +msgstr "Terwijl" #: modules/visual_script/visual_script_flow_control.cpp msgid "while (cond):" @@ -18952,7 +18914,7 @@ msgstr "Zoek VisualScript" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Yield" -msgstr "" +msgstr "Opgeven" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Wait" @@ -19934,6 +19896,11 @@ msgstr "Knopen knippen" msgid "Custom BG Color" msgstr "Knopen knippen" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Alles uitklappen" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20791,6 +20758,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Ongeldige pakket korte naam." @@ -25121,7 +25094,7 @@ msgstr "" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Caret" -msgstr "" +msgstr "Invoercursor" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Blink" @@ -28727,7 +28700,7 @@ msgstr "" #: servers/visual_server.cpp #, fuzzy msgid "Use Batching In Editor" -msgstr "Editor afsluiten?" +msgstr "Gebruik Batching In Editor" #: servers/visual_server.cpp msgid "Single Rect Fallback" @@ -28785,9 +28758,8 @@ msgid "Enable High Float" msgstr "Prioriteit Inschakelen" #: servers/visual_server.cpp -#, fuzzy msgid "Precision" -msgstr "Stel expressie in" +msgstr "Precisie" #: servers/visual_server.cpp msgid "UV Contract" diff --git a/editor/translations/pl.po b/editor/translations/pl.po index 3e4664c317..7b7e680cff 100644 --- a/editor/translations/pl.po +++ b/editor/translations/pl.po @@ -63,13 +63,14 @@ # DK0492 <doriankaczmarek28@gmail.com>, 2022. # Dawid Skubij <davidsd@tlen.pl>, 2022. # kingofsponges <q.patex.q@gmail.com>, 2022. +# Patryk Morawski <gormit7@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-08-04 06:38+0000\n" -"Last-Translator: kingofsponges <q.patex.q@gmail.com>\n" +"PO-Revision-Date: 2022-08-17 18:20+0000\n" +"Last-Translator: Patryk Morawski <gormit7@gmail.com>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/" "godot/pl/>\n" "Language: pl\n" @@ -4384,7 +4385,7 @@ msgstr "Zawsze Zamykaj WyjÅ›cie Po Zatrzymaniu" #: editor/editor_node.cpp msgid "Save On Focus Loss" -msgstr "" +msgstr "Zapisz przy utracie skupienia" #: editor/editor_node.cpp editor/editor_settings.cpp #, fuzzy @@ -4436,7 +4437,7 @@ msgstr "Åšcieżka do projektu:" #: editor/editor_node.cpp msgid "Default Float Step" -msgstr "" +msgstr "DomyÅ›lny krok zmiennoprzecinkowy" #: editor/editor_node.cpp scene/gui/tree.cpp #, fuzzy @@ -4445,15 +4446,15 @@ msgstr "Wyłączony przycisk" #: editor/editor_node.cpp msgid "Auto Unfold Foreign Scenes" -msgstr "" +msgstr "Automatyczne rozwijanie zagranicznych scen" #: editor/editor_node.cpp msgid "Horizontal Vector2 Editing" -msgstr "" +msgstr "Edycja pozioma Vector2" #: editor/editor_node.cpp msgid "Horizontal Vector Types Editing" -msgstr "" +msgstr "Edycja poziomych typów wektorów" #: editor/editor_node.cpp #, fuzzy @@ -4578,6 +4579,7 @@ msgstr "Różne narzÄ™dzia dla scen lub projektu." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projekt" @@ -5338,7 +5340,7 @@ msgstr "Pokaż wszystko" #: editor/editor_settings.cpp msgid "Custom Display Scale" -msgstr "" +msgstr "Niestandardowa skala wyÅ›wietlania" #: editor/editor_settings.cpp msgid "Main Font Size" @@ -5346,15 +5348,15 @@ msgstr "Rozmiar głównej czcionki" #: editor/editor_settings.cpp msgid "Code Font Size" -msgstr "" +msgstr "Rozmiar czcionki kodu" #: editor/editor_settings.cpp msgid "Font Antialiased" -msgstr "" +msgstr "WygÅ‚adzana czcionka" #: editor/editor_settings.cpp msgid "Font Hinting" -msgstr "" +msgstr "Czcionka podpowiedzi" #: editor/editor_settings.cpp #, fuzzy @@ -5377,11 +5379,11 @@ msgstr "PrzygaÅ› edytor przy wyskakujÄ…cym oknie" #: editor/editor_settings.cpp main/main.cpp msgid "Low Processor Mode Sleep (µsec)" -msgstr "" +msgstr "Niski tryb uÅ›pienia procesora (µsec)" #: editor/editor_settings.cpp msgid "Unfocused Low Processor Mode Sleep (µsec)" -msgstr "" +msgstr "Nieskoncentrowany tryb uÅ›pienia w trybie niskiego procesora (µsec)" #: editor/editor_settings.cpp #, fuzzy @@ -5394,7 +5396,7 @@ msgstr "Automatycznie otwieraj zrzuty ekranu" #: editor/editor_settings.cpp msgid "Max Array Dictionary Items Per Page" -msgstr "" +msgstr "Maksymalna liczba pozycji sÅ‚ownika tablicy na stronie" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp scene/gui/control.cpp @@ -5408,7 +5410,7 @@ msgstr "Profil" #: editor/editor_settings.cpp msgid "Icon And Font Color" -msgstr "" +msgstr "Kolor ikony i czcionki" #: editor/editor_settings.cpp #, fuzzy @@ -5426,7 +5428,7 @@ msgstr "Kontrast" #: editor/editor_settings.cpp msgid "Relationship Line Opacity" -msgstr "" +msgstr "Przezroczystość linii relacji" #: editor/editor_settings.cpp #, fuzzy @@ -5440,7 +5442,7 @@ msgstr "Brzegowe piksele" #: editor/editor_settings.cpp msgid "Use Graph Node Headers" -msgstr "" +msgstr "Użyj wykresu nagłówków wÄ™złów" #: editor/editor_settings.cpp #, fuzzy @@ -5484,7 +5486,7 @@ msgstr "Kopiuj zasób" #: editor/editor_settings.cpp msgid "Safe Save On Backup Then Rename" -msgstr "" +msgstr "Bezpieczne zapisywanie kopii zapasowej, a nastÄ™pnie zmiana nazwy" #: editor/editor_settings.cpp #, fuzzy @@ -5507,7 +5509,7 @@ msgstr "Pozyskaj drzewo sceny" #: editor/editor_settings.cpp msgid "Start Create Dialog Fully Expanded" -msgstr "" +msgstr "Rozpocznij tworzenie w peÅ‚ni rozwiniÄ™tego okna dialogowego" #: editor/editor_settings.cpp #, fuzzy @@ -5559,7 +5561,7 @@ msgstr "PodÅ›wietl obecnÄ… liniÄ™" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp msgid "Highlight Type Safe Lines" -msgstr "" +msgstr "Wyróżnij typy bezpiecznych linii" #: editor/editor_settings.cpp #, fuzzy @@ -5598,7 +5600,7 @@ msgstr "PÅ‚ynne przewijanie" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "V Scroll Speed" -msgstr "" +msgstr "Pionowa szybkość przewijania" #: editor/editor_settings.cpp #, fuzzy @@ -5611,7 +5613,7 @@ msgstr "Szerokość minimapy" #: editor/editor_settings.cpp msgid "Mouse Extra Buttons Navigate History" -msgstr "" +msgstr "Historia nawigacji dodatkowych przycisków myszy" #: editor/editor_settings.cpp #, fuzzy @@ -5620,7 +5622,7 @@ msgstr "Wybór GridMap" #: editor/editor_settings.cpp msgid "Stay In Script Editor On Node Selected" -msgstr "" +msgstr "PozostaÅ„ w edytorze skryptów na wybranym węźle" #: editor/editor_settings.cpp msgid "Appearance" @@ -5638,7 +5640,7 @@ msgstr "Numer linii:" #: editor/editor_settings.cpp msgid "Show Bookmark Gutter" -msgstr "" +msgstr "Pokaż ciek zakÅ‚adek" #: editor/editor_settings.cpp #, fuzzy @@ -5647,23 +5649,23 @@ msgstr "PomiÅ„ punkty wstrzymania" #: editor/editor_settings.cpp msgid "Show Info Gutter" -msgstr "" +msgstr "Pokaż ciek informacji" #: editor/editor_settings.cpp msgid "Code Folding" -msgstr "" +msgstr "Zawijanie kodu" #: editor/editor_settings.cpp msgid "Word Wrap" -msgstr "" +msgstr "Zawijanie tekstu" #: editor/editor_settings.cpp msgid "Show Line Length Guidelines" -msgstr "" +msgstr "Pokaż wytyczne dotyczÄ…ce dÅ‚ugoÅ›ci linii" #: editor/editor_settings.cpp msgid "Line Length Guideline Soft Column" -msgstr "" +msgstr "Wytyczne dotyczÄ…ce dÅ‚ugoÅ›ci linii miÄ™kkiej kolumny" #: editor/editor_settings.cpp msgid "Line Length Guideline Hard Column" @@ -7517,7 +7519,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15574,18 +15577,19 @@ msgstr "" msgid "Make Local" msgstr "UczyÅ„ lokalnym" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Nazwa wÄ™zÅ‚a:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "Nazwa jest już użyta przez innÄ… funkcjÄ™/zmiennÄ…/sygnaÅ‚:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Nazwa wÄ™zÅ‚a:" #: editor/scene_tree_dock.cpp @@ -15787,6 +15791,11 @@ msgid "Button Group" msgstr "Grupa przycisków" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Nazwa wÄ™zÅ‚a:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(łączony teraz)" @@ -15862,6 +15871,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "NieprawidÅ‚owa nazwa wÄ™zÅ‚a, nastÄ™pujÄ…ce znaki sÄ… niedozwolone:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "ZmieÅ„ nazwÄ™ wÄ™zÅ‚a" @@ -17789,6 +17802,21 @@ msgstr "Zbuduj rozwiÄ…zanie" msgid "Auto Update Project" msgstr "Projekt bez nazwy" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Pokaż wszystko" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Wybierz katalog" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Wybierz katalog" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Koniec Å›ladu stosu wewnÄ™trznego wyjÄ…tku" @@ -19645,6 +19673,11 @@ msgstr "NiestandardowyWÄ™zeÅ‚" msgid "Custom BG Color" msgstr "NiestandardowyWÄ™zeÅ‚" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "RozwiÅ„ wszystko" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20540,6 +20573,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Niepoprawna krótka nazwa paczki." diff --git a/editor/translations/pr.po b/editor/translations/pr.po index 4c073f8542..e8e4e5c79d 100644 --- a/editor/translations/pr.po +++ b/editor/translations/pr.po @@ -4494,6 +4494,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7309,7 +7310,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15326,18 +15328,20 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Discharge ye' Signal" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "" +"Yer name be backstabin'! She be used by another dastardly func/var/signal:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Discharge ye' Signal" #: editor/scene_tree_dock.cpp @@ -15537,6 +15541,11 @@ msgstr "" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Discharge ye' Signal" + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr "Slit th' Node" @@ -15601,6 +15610,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17481,6 +17494,20 @@ msgstr "All yer Booty" msgid "Auto Update Project" msgstr "Rename Function" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Slit th' Node" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Yer functions:" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19295,6 +19322,11 @@ msgstr "Slit th' Node" msgid "Custom BG Color" msgstr "Slit th' Node" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Edit" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20127,6 +20159,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "Yer unique name be evil." diff --git a/editor/translations/pt.po b/editor/translations/pt.po index f284e0ece8..3052fff9bb 100644 --- a/editor/translations/pt.po +++ b/editor/translations/pt.po @@ -26,13 +26,16 @@ # Esdras Caleb Oliveira Silva <acheicaleb@gmail.com>, 2022. # Ednaldo Pereira Confia <filat51823@storypo.com>, 2022. # Zé Beato Página Oficial <zebeato@gmail.com>, 2022. +# Rafael Testa <rafael1testa@gmail.com>, 2022. +# Baiterson <baiter160@gmail.com>, 2022. +# Tuily <brizolla.tuily@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-23 03:57+0000\n" -"Last-Translator: Zé Beato Página Oficial <zebeato@gmail.com>\n" +"PO-Revision-Date: 2022-09-19 05:22+0000\n" +"Last-Translator: Tuily <brizolla.tuily@gmail.com>\n" "Language-Team: Portuguese <https://hosted.weblate.org/projects/godot-engine/" "godot/pt/>\n" "Language: pt\n" @@ -40,7 +43,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -410,9 +413,8 @@ msgid "Command" msgstr "Comando" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" -msgstr " (FÃsico)" +msgstr "FÃsico" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp @@ -466,7 +468,7 @@ msgstr "Pressione" #: core/os/input_event.cpp msgid "Pen Inverted" -msgstr "" +msgstr "Caneta Invertida" #: core/os/input_event.cpp msgid "Relative" @@ -2754,9 +2756,8 @@ msgid "Project export for platform:" msgstr "Exportação do projeto para plataforma:" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with warnings." -msgstr "ConcluÃdo com erros." +msgstr "ConcluÃdo com advertências." #: editor/editor_export.cpp msgid "Completed successfully." @@ -2779,29 +2780,24 @@ msgid "Packing" msgstr "Empacotamento" #: editor/editor_export.cpp -#, fuzzy msgid "Save PCK" -msgstr "Guardar Como" +msgstr "Salvar Como PCK" #: editor/editor_export.cpp -#, fuzzy msgid "Cannot create file \"%s\"." -msgstr "Não consegui criar pasta." +msgstr "Não pôde criar arquivo \"%s\"." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to export project files." -msgstr "Incapaz de exportar ficheiros do projeto" +msgstr "Falha ao exportar arquivos do projeto." #: editor/editor_export.cpp -#, fuzzy msgid "Can't open file to read from path \"%s\"." -msgstr "Incapaz de abrir o ficheiro para escrita:" +msgstr "Incapaz de abrir o arquivo pelo caminho \"%s\"." #: editor/editor_export.cpp -#, fuzzy msgid "Save ZIP" -msgstr "Guardar Como" +msgstr "Salvar como ZIP" #: editor/editor_export.cpp msgid "" @@ -2862,9 +2858,8 @@ msgstr "" #: editor/editor_export.cpp platform/android/export/export_plugin.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Custom Template" -msgstr "Editor de Tema" +msgstr "Modelo customizado" #: editor/editor_export.cpp editor/project_export.cpp #: platform/android/export/export_plugin.cpp platform/iphone/export/export.cpp @@ -2886,9 +2881,8 @@ msgid "Embed PCK" msgstr "Incorporar PCK" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Texture Format" -msgstr "TextureRegion" +msgstr "Formato de Textura" #: editor/editor_export.cpp msgid "BPTC" @@ -2924,12 +2918,10 @@ msgid "Custom release template not found." msgstr "Modelo de lançamento personalizado não encontrado." #: editor/editor_export.cpp -#, fuzzy msgid "Prepare Template" -msgstr "Gerir Modelos" +msgstr "Preparar Modelos" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "The given export path doesn't exist." msgstr "O caminho de exportação não existe:" @@ -2938,15 +2930,13 @@ msgid "Template file not found: \"%s\"." msgstr "Ficheiro Modelo não encontrado" #: editor/editor_export.cpp -#, fuzzy msgid "Failed to copy export template." -msgstr "Modelo de exportação inválido:" +msgstr "Falha ao copiar Modelo de exportação." #: editor/editor_export.cpp platform/windows/export/export.cpp #: platform/x11/export/export.cpp -#, fuzzy msgid "PCK Embedding" -msgstr "Preenchimento" +msgstr "Encorporar PCK" #: editor/editor_export.cpp msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." @@ -3160,9 +3150,8 @@ msgid "Manage Editor Feature Profiles" msgstr "Gerir Editor Perfis de Funcionalidades" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Default Feature Profile" -msgstr "Perfil de Funcionalidades Godot" +msgstr "Perfil de Funcionalidades padrão" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select Current Folder" @@ -3252,9 +3241,8 @@ msgstr "Modo de Visualização" #: scene/resources/environment.cpp scene/resources/material.cpp #: scene/resources/visual_shader.cpp #: servers/audio/effects/audio_effect_distortion.cpp -#, fuzzy msgid "Mode" -msgstr "Modo deslocamento" +msgstr "Modo" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Current Dir" @@ -3270,9 +3258,8 @@ msgstr "Caminho Atual" #: editor/editor_file_dialog.cpp editor/editor_settings.cpp #: scene/gui/file_dialog.cpp -#, fuzzy msgid "Show Hidden Files" -msgstr "Alternar Ficheiros Escondidos" +msgstr "Mostrar arquivos ocultos" #: editor/editor_file_dialog.cpp msgid "Disable Overwrite Warning" @@ -3570,24 +3557,20 @@ msgid "Property:" msgstr "Propriedade:" #: editor/editor_inspector.cpp editor/editor_spin_slider.cpp -#, fuzzy msgid "Label" -msgstr "Valor" +msgstr "Texto" #: editor/editor_inspector.cpp editor/editor_spin_slider.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Read Only" -msgstr "Apenas Métodos" +msgstr "Apenas Leitura" #: editor/editor_inspector.cpp editor/plugins/item_list_editor_plugin.cpp -#, fuzzy msgid "Checkable" msgstr "Marcar item" #: editor/editor_inspector.cpp editor/plugins/item_list_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Checked" msgstr "Item Marcado" @@ -3596,7 +3579,6 @@ msgid "Draw Red" msgstr "Desenhar Vermelho" #: editor/editor_inspector.cpp -#, fuzzy msgid "Keying" msgstr "Executar" @@ -3962,14 +3944,12 @@ msgid "Quick Open Script..." msgstr "Abrir Script de forma rápida..." #: editor/editor_node.cpp -#, fuzzy msgid "Save & Reload" -msgstr "Guardar & Reiniciar" +msgstr "Salvar E Reiniciar" #: editor/editor_node.cpp -#, fuzzy msgid "Save changes to '%s' before reloading?" -msgstr "Guardar alterações a '%s' antes de fechar?" +msgstr "Salvar alterações '%s' antes de reiniciar?" #: editor/editor_node.cpp msgid "Save & Close" @@ -4088,9 +4068,8 @@ msgid "Open Project Manager?" msgstr "Abrir Gestor de Projeto?" #: editor/editor_node.cpp -#, fuzzy msgid "Save changes to the following scene(s) before reloading?" -msgstr "Guardar alterações da(s) seguinte(s) cena(s) antes de sair?" +msgstr "Salvar alterações da(s) seguinte(s) cena(s) antes de reiniciar?" #: editor/editor_node.cpp msgid "Save & Quit" @@ -4283,19 +4262,16 @@ msgstr "" #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp -#, fuzzy msgid "Interface" -msgstr "Interface do Utilizador" +msgstr "Interface" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Scene Tabs" -msgstr "Trocar Aba de Cena" +msgstr "Abas da Cena" #: editor/editor_node.cpp -#, fuzzy msgid "Always Show Close Button" -msgstr "Mostrar Grelha Sempre" +msgstr "Sempre mostrar o Botão de Fechar" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Resize If Many Tabs" @@ -4310,9 +4286,8 @@ msgid "Output" msgstr "SaÃda" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Always Clear Output On Play" -msgstr "Limpar SaÃda" +msgstr "Sempre Apagar Output quando Iniciar" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Always Open Output On Play" @@ -4327,19 +4302,16 @@ msgid "Save On Focus Loss" msgstr "Salvar ao Perder o Foco" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Save Each Scene On Quit" -msgstr "Guardar Ramo como Cena" +msgstr "Salvar Cada Cena ao Sair" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Quit Confirmation" -msgstr "Ver informação" +msgstr "Confirmação de Saida" #: editor/editor_node.cpp -#, fuzzy msgid "Show Update Spinner" -msgstr "Esconder Roleta de Atualização" +msgstr "Mostra Ãcone de Atualização" #: editor/editor_node.cpp msgid "Update Continuously" @@ -4350,14 +4322,12 @@ msgid "Update Vital Only" msgstr "Só Atualizar Vital" #: editor/editor_node.cpp -#, fuzzy msgid "Localize Settings" -msgstr "Localização" +msgstr "Configuração de tradução" #: editor/editor_node.cpp -#, fuzzy msgid "Restore Scenes On Load" -msgstr "Obter Nó da Cena" +msgstr "Restaurar Cenas quando carregar" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Show Thumbnail On Hover" @@ -4376,7 +4346,6 @@ msgid "Default Float Step" msgstr "FloatStep Padrão" #: editor/editor_node.cpp scene/gui/tree.cpp -#, fuzzy msgid "Disable Folding" msgstr "Desativar Botão" @@ -4393,14 +4362,12 @@ msgid "Horizontal Vector Types Editing" msgstr "Edição de Tipo de Vetor Horizontal" #: editor/editor_node.cpp -#, fuzzy msgid "Open Resources In Current Inspector" -msgstr "Abrir no Inspetor" +msgstr "Abrir Recursos no Inspetor atual" #: editor/editor_node.cpp -#, fuzzy msgid "Resources To Open In New Inspector" -msgstr "Abrir no Inspetor" +msgstr "Abrir Recursos em um novo Inspetor" #: editor/editor_node.cpp msgid "Default Color Picker Mode" @@ -4514,6 +4481,7 @@ msgstr "Ferramentas diversas de projeto ou cena." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projeto" @@ -4792,9 +4760,8 @@ msgid "Save & Restart" msgstr "Guardar & Reiniciar" #: editor/editor_node.cpp -#, fuzzy msgid "Update All Changes" -msgstr "Atualizar quando há Alterações" +msgstr "Atualizar todas as Mudanças" #: editor/editor_node.cpp msgid "Update Vital Changes" @@ -5062,9 +5029,8 @@ msgid "Profiler Frame History Size" msgstr "Tamanho do Histórico do Perfilador de Quadro" #: editor/editor_profiler.cpp -#, fuzzy msgid "Profiler Frame Max Functions" -msgstr "Mudar nome da Função" +msgstr "Profiler Frame Max Funções" #: editor/editor_properties.cpp msgid "Edit Text:" @@ -5133,9 +5099,8 @@ msgid "Size:" msgstr "Tamanho:" #: editor/editor_properties_array_dict.cpp -#, fuzzy msgid "Page:" -msgstr "Página: " +msgstr "Página:" #: editor/editor_properties_array_dict.cpp #: editor/plugins/theme_editor_plugin.cpp @@ -5197,18 +5162,15 @@ msgstr "Novo %s" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Base Type" msgstr "Mudar tipo base" #: editor/editor_resource_picker.cpp -#, fuzzy msgid "Edited Resource" -msgstr "Adicionar recurso" +msgstr "Recurso Editado" #: editor/editor_resource_picker.cpp scene/gui/line_edit.cpp #: scene/gui/slider.cpp scene/gui/spin_box.cpp -#, fuzzy msgid "Editable" msgstr "Item Editável" @@ -5236,7 +5198,6 @@ msgstr "" "definido existente como executável." #: editor/editor_run_native.cpp -#, fuzzy msgid "Project Run" msgstr "Projeto" @@ -5265,14 +5226,12 @@ msgid "Did you forget the '_run' method?" msgstr "Esqueceu-se do método '_run'?" #: editor/editor_settings.cpp -#, fuzzy msgid "Editor Language" -msgstr "Apresentação do Editor" +msgstr "Linguagem do Editor" #: editor/editor_settings.cpp -#, fuzzy msgid "Display Scale" -msgstr "Mostrar Tudo" +msgstr "Escala do Editor" #: editor/editor_settings.cpp msgid "Custom Display Scale" @@ -5295,18 +5254,16 @@ msgid "Font Hinting" msgstr "Alinhar Fonte" #: editor/editor_settings.cpp -#, fuzzy msgid "Main Font" -msgstr "Cena Principal" +msgstr "Fonte Principal" #: editor/editor_settings.cpp msgid "Main Font Bold" msgstr "Fonte Principal em Negrito" #: editor/editor_settings.cpp -#, fuzzy msgid "Code Font" -msgstr "Adicionar Ponto Nó" +msgstr "Fonte do Código" #: editor/editor_settings.cpp msgid "Dim Editor On Dialog Popup" @@ -5321,7 +5278,6 @@ msgid "Unfocused Low Processor Mode Sleep (µsec)" msgstr "Duração do Modo de Baixo Consumo do Processador Fora de Foco (µsec)" #: editor/editor_settings.cpp -#, fuzzy msgid "Separate Distraction Mode" msgstr "Modo Livre de Distrações" @@ -5412,9 +5368,8 @@ msgid "Safe Save On Backup Then Rename" msgstr "Salvar com Segurança no Backup e Renomear" #: editor/editor_settings.cpp -#, fuzzy msgid "File Dialog" -msgstr "Diálogo XForm" +msgstr "Arquivo de Diálogo" #: editor/editor_settings.cpp msgid "Thumbnail Size" @@ -5425,37 +5380,32 @@ msgid "Docks" msgstr "Painéis" #: editor/editor_settings.cpp -#, fuzzy msgid "Scene Tree" -msgstr "Obter Ãrvore da Cena" +msgstr "Grupo de Cenas" #: editor/editor_settings.cpp msgid "Start Create Dialog Fully Expanded" msgstr "Iniciar Diálogo de Criação Totalmente Expandido" #: editor/editor_settings.cpp -#, fuzzy msgid "Always Show Folders" -msgstr "Mostrar Grelha Sempre" +msgstr "Sempre mostrar Pastas" #: editor/editor_settings.cpp -#, fuzzy msgid "Property Editor" -msgstr "Editor de Grupo" +msgstr "Editor de propriedades" #: editor/editor_settings.cpp msgid "Auto Refresh Interval" msgstr "Intervalo de Atualização Automática" #: editor/editor_settings.cpp -#, fuzzy msgid "Subresource Hue Tint" -msgstr "Sub-recursos" +msgstr "Sub-recursos Cor Hue" #: editor/editor_settings.cpp -#, fuzzy msgid "Color Theme" -msgstr "Editor de Tema" +msgstr "Cor do Tema" #: editor/editor_settings.cpp scene/3d/label_3d.cpp #: scene/resources/default_theme/default_theme.cpp @@ -5468,9 +5418,8 @@ msgid "Highlighting" msgstr "Destaque" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Syntax Highlighting" -msgstr "Destaque de Sintaxe" +msgstr "Destaque da Sintaxe" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Highlight All Occurrences" @@ -5485,18 +5434,16 @@ msgid "Highlight Type Safe Lines" msgstr "Destacar Linhas com Tipo Seguro" #: editor/editor_settings.cpp -#, fuzzy msgid "Indent" -msgstr "Indentar à esquerda" +msgstr "Indentar" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp msgid "Auto Indent" msgstr "Indentação Automática" #: editor/editor_settings.cpp -#, fuzzy msgid "Convert Indent On Save" -msgstr "Converter Indentação em Espaços" +msgstr "Converter Indentação ao Salvar" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Draw Tabs" @@ -5522,9 +5469,8 @@ msgid "V Scroll Speed" msgstr "Velocidade de Rolagem V" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Minimap" -msgstr "Mostrar Origem" +msgstr "Mostrar Minimapa" #: editor/editor_settings.cpp msgid "Minimap Width" @@ -5535,13 +5481,12 @@ msgid "Mouse Extra Buttons Navigate History" msgstr "Botões extra do Mouse para Navegar no Histórico" #: editor/editor_settings.cpp -#, fuzzy msgid "Drag And Drop Selection" -msgstr "Seleção de GridMap" +msgstr "Arrastar e soltar" #: editor/editor_settings.cpp msgid "Stay In Script Editor On Node Selected" -msgstr "" +msgstr "Manter editor de script no Nodo selecionado" #: editor/editor_settings.cpp msgid "Appearance" @@ -5560,9 +5505,8 @@ msgid "Show Bookmark Gutter" msgstr "Mostrar Barra de Favoritos" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Breakpoint Gutter" -msgstr "Saltar Pontos de Paragem" +msgstr "Mostrar Pontos de Parada" #: editor/editor_settings.cpp msgid "Show Info Gutter" @@ -5589,23 +5533,20 @@ msgid "Line Length Guideline Hard Column" msgstr "Diretriz de Comprimento de Linha de Coluna RÃgida" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Script List" -msgstr "Editor de Script" +msgstr "Lista de Scripts" #: editor/editor_settings.cpp msgid "Show Members Overview" msgstr "Mostrar Visão Geral dos Membros" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Files" -msgstr "Ficheiro" +msgstr "Arquivos" #: editor/editor_settings.cpp -#, fuzzy msgid "Trim Trailing Whitespace On Save" -msgstr "Apagar Espaços nos Limites" +msgstr "Apagar Espaços nos Limites ao Salvar" #: editor/editor_settings.cpp msgid "Autosave Interval Secs" @@ -5624,9 +5565,8 @@ msgid "Auto Reload Scripts On External Change" msgstr "Recarregamento Automático de Scripts em Caso de Mudança Externa" #: editor/editor_settings.cpp -#, fuzzy msgid "Create Signal Callbacks" -msgstr "Forçar Shader de Reserva" +msgstr "Criar Sinais de Chamadas" #: editor/editor_settings.cpp msgid "Sort Members Outline Alphabetically" @@ -5723,9 +5663,8 @@ msgid "Pick Distance" msgstr "Escolher Distância" #: editor/editor_settings.cpp editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Preview Size" -msgstr "Pré-visualização" +msgstr "Tamanho de Pré-visualização" #: editor/editor_settings.cpp msgid "Primary Grid Color" @@ -7369,7 +7308,8 @@ msgid "8 Bit" msgstr "8 Bits" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "Mono" @@ -15402,18 +15342,19 @@ msgstr "" msgid "Make Local" msgstr "Tornar Local" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "Outro nó já usa esse nome exclusivo na cena." - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Nome do Nó:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "Outro nó já usa esse nome exclusivo na cena." + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Nome do Nó:" #: editor/scene_tree_dock.cpp @@ -15615,6 +15556,11 @@ msgid "Button Group" msgstr "Grupo Botão" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Nome do Nó:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(A Ligar de)" @@ -15693,6 +15639,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "Nome de nó inválido, os caracteres seguintes não são permitidos:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "Outro nó já usa esse nome exclusivo na cena." + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Renomear Nó" @@ -17563,6 +17513,21 @@ msgstr "Construir Solução" msgid "Auto Update Project" msgstr "Projeto sem nome" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Mostrar Tudo" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Escolha uma Diretoria" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Escolha uma Diretoria" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Fim do stack trace de exceção interna" @@ -19412,6 +19377,11 @@ msgstr "CustomNode" msgid "Custom BG Color" msgstr "CustomNode" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Expandir Tudo" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20266,6 +20236,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Nome curto de pacote inválido." @@ -28344,7 +28320,7 @@ msgstr "Modo de Interpolação" #: servers/visual_server.cpp msgid "Max Simultaneous Compiles" -msgstr "" +msgstr "Compilação simultânea Maxima" #: servers/visual_server.cpp msgid "Log Active Async Compiles Count" diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po index 84a5ac45c3..30ad718462 100644 --- a/editor/translations/pt_BR.po +++ b/editor/translations/pt_BR.po @@ -144,13 +144,22 @@ # Ednaldo Pereira Confia <filat51823@storypo.com>, 2022. # Mauricio <mauricio.fidalgo1@gmail.com>, 2022. # Felipe Kinoshita <kinofhek@gmail.com>, 2022. +# TLAliceDev <calicedev@protonmail.com>, 2022. +# Mr.Albino <ricmorsoleto@gmail.com>, 2022. +# Jaide Alonso Ambrosio <jaide.sp@gmail.com>, 2022. +# Paulo Sergio Campos de Lima <cloverfieldor@gmail.com>, 2022. +# Avery <jarreed0@gmail.com>, 2022. +# TheJC <the-green-green.0rvdk@simplelogin.fr>, 2022. +# Mauricio Mazur <mauricio.mazur12@gmail.com>, 2022. +# ! Zyll <emanueljunior756@gmail.com>, 2022. +# Kirrby <kirrby.gaming@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: 2016-05-30\n" -"PO-Revision-Date: 2022-08-04 06:38+0000\n" -"Last-Translator: Felipe Kinoshita <kinofhek@gmail.com>\n" +"PO-Revision-Date: 2022-09-27 21:37+0000\n" +"Last-Translator: Kirrby <kirrby.gaming@gmail.com>\n" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/" "godot-engine/godot/pt_BR/>\n" "Language: pt_BR\n" @@ -158,7 +167,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -363,7 +372,7 @@ msgstr "Página lida adiante" #: core/io/http_client.cpp msgid "Blocking Mode Enabled" -msgstr "Modo de Bloqueio Ativado" +msgstr "Modo de bloqueio Ativado" #: core/io/http_client.cpp msgid "Connection" @@ -929,7 +938,7 @@ msgstr "Profilador" #: core/project_settings.cpp msgid "Max Functions" -msgstr "Funções máximas" +msgstr "Máximo de Funções" #: core/project_settings.cpp scene/3d/vehicle_body.cpp msgid "Compression" @@ -1121,7 +1130,7 @@ msgstr "Máximo de luzes renderizáveis" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Renderable Reflections" -msgstr "Máximo de Reflexões Renderizáveis" +msgstr "Max. Reflexões Renderizaveis" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Lights Per Object" @@ -1668,7 +1677,7 @@ msgstr "Adicionar Trilha Bezier" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a key." -msgstr "Caminho da faixa é inválido, então não pode adicionar uma chave." +msgstr "Caminho da trilha é inválido, então não pode adicionar uma chave." #: editor/animation_track_editor.cpp msgid "Track is not of type Spatial, can't insert key" @@ -2868,9 +2877,8 @@ msgid "Project export for platform:" msgstr "Exportação do projeto para plataforma:" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with warnings." -msgstr "ConcluÃdo com erros." +msgstr "ConcluÃdo com avisos." #: editor/editor_export.cpp msgid "Completed successfully." @@ -2992,7 +3000,7 @@ msgstr "64 Bits" #: editor/editor_export.cpp msgid "Embed PCK" -msgstr "PCK Incorporado" +msgstr "Embutir PCK" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "Texture Format" @@ -3377,7 +3385,7 @@ msgstr "Mostrar Arquivos Ocultos" #: editor/editor_file_dialog.cpp msgid "Disable Overwrite Warning" -msgstr "Desativar Aviso de Substituição" +msgstr "Desativar aviso de substituição" #: editor/editor_file_dialog.cpp msgid "Go Back" @@ -3480,7 +3488,7 @@ msgstr "(Re)Importando Assets" #: editor/editor_file_system.cpp msgid "Reimport Missing Imported Files" -msgstr "Reimportar Arquivos Importados Ausentes" +msgstr "Reimportar arquivos importados perdidos" #: editor/editor_help.cpp scene/2d/camera_2d.cpp scene/gui/control.cpp #: scene/gui/nine_patch_rect.cpp scene/resources/dynamic_font.cpp @@ -3591,7 +3599,7 @@ msgstr "Ajuda" #: editor/editor_help.cpp msgid "Sort Functions Alphabetically" -msgstr "Classificar Funções em Ordem Alfabética" +msgstr "Ordenar funções alfabéticamente" #: editor/editor_help_search.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp @@ -4396,7 +4404,7 @@ msgstr "Redimensionar se Houver Muitas Guias" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Minimum Width" -msgstr "Largura MÃnima" +msgstr "Largura mÃnima" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Output" @@ -4404,7 +4412,7 @@ msgstr "SaÃda" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Always Clear Output On Play" -msgstr "Sempre limpar saÃda ao jogar" +msgstr "Sempre Limpar Output no modo Play" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Always Open Output On Play" @@ -4598,6 +4606,7 @@ msgstr "Ferramentas diversas atuantes no projeto ou cena." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projeto" @@ -5605,7 +5614,7 @@ msgstr "Seleção Arrasta e Solta" #: editor/editor_settings.cpp msgid "Stay In Script Editor On Node Selected" -msgstr "" +msgstr "Ficar no Editor de Script ao Selecionar Nó" #: editor/editor_settings.cpp msgid "Appearance" @@ -5819,7 +5828,7 @@ msgstr "Junção" #: scene/resources/particles_material.cpp servers/physics_2d_server.cpp #: servers/physics_server.cpp msgid "Shape" -msgstr "Form" +msgstr "Forma" #: editor/editor_settings.cpp msgid "Primary Grid Steps" @@ -7234,7 +7243,7 @@ msgstr "Importando Cena..." #: editor/import/resource_importer_scene.cpp msgid "Generating Lightmaps" -msgstr "Generando Lightmaps" +msgstr "Gerando Lightmaps" #: editor/import/resource_importer_scene.cpp msgid "Generating for Mesh:" @@ -7299,7 +7308,7 @@ msgstr "Modo HDR" #: editor/import/resource_importer_texture.cpp msgid "BPTC LDR" -msgstr "" +msgstr "BPTC LDR" #: editor/import/resource_importer_texture.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/cpu_particles_2d.cpp @@ -7318,7 +7327,7 @@ msgstr "Corrigir Alpha da Borda" #: editor/import/resource_importer_texture.cpp msgid "Premult Alpha" -msgstr "" +msgstr "Pré-Multiplicar Alpha" #: editor/import/resource_importer_texture.cpp msgid "Hdr As Srgb" @@ -7378,7 +7387,8 @@ msgid "8 Bit" msgstr "8 Bits" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "Mono" @@ -11724,9 +11734,8 @@ msgid "New Animation" msgstr "Nova animação" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Filter animations" -msgstr "Filtrar métodos" +msgstr "Filtrar animações" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed:" @@ -12529,9 +12538,8 @@ msgid "Palette Min Width" msgstr "Largura MÃnima de Paleta" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Palette Item H Separation" -msgstr "Separador Nomeado" +msgstr "Separação Horizontal dos Itens de Paleta" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Show Tile Names" @@ -12560,9 +12568,8 @@ msgid "Display Grid" msgstr "Mostrar Grid" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Axis Color" -msgstr "Escolher Cor" +msgstr "Cor do Eixo" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Add Texture(s) to TileSet." @@ -12606,7 +12613,7 @@ msgstr "Coordenada Anterior" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Select the previous shape, subtile, or Tile." -msgstr "Selecione a forma, subtile ou tile anterior." +msgstr "Selecione a forma anterior, subtile ou Tile." #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/sprite.cpp #: scene/3d/sprite_3d.cpp scene/resources/texture.cpp @@ -12714,7 +12721,7 @@ msgstr "Ative o snap e mostre a grade (configurável através do Inspetor)." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Display Tile Names (Hold Alt Key)" -msgstr "Exibir nomes de mosaico (segure a tecla Alt)" +msgstr "Exibir nomes dos Tiles (segure a tecla Alt)" #: editor/plugins/tile_set_editor_plugin.cpp msgid "" @@ -12725,7 +12732,8 @@ msgstr "" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Remove selected texture? This will remove all tiles which use it." -msgstr "Remover Texture Selecionada e TODAS PEÇAS que a usam." +msgstr "" +"Remover textura selecionada? Todos os tiles que a usam serão removidos." #: editor/plugins/tile_set_editor_plugin.cpp msgid "You haven't selected a texture to remove." @@ -12733,7 +12741,7 @@ msgstr "Você não selecionou uma textura para remover." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create from scene? This will overwrite all current tiles." -msgstr "Criar a partir de cena? Isso substituirá todos os blocos atuais." +msgstr "Criar a partir de cena? Isso substituirá todos os tiles atuais." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Merge from scene?" @@ -12753,7 +12761,7 @@ msgid "" "Click on another Tile to edit it." msgstr "" "Arraste alças para editar o Rect.\n" -"Clique em outro Mosaico para editá-lo." +"Clique em outro Tile para editá-lo." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Delete selected Rect." @@ -12764,8 +12772,8 @@ msgid "" "Select current edited sub-tile.\n" "Click on another Tile to edit it." msgstr "" -"Selecione o sub-bloco editado atual.\n" -"Clique em outro Mosaico para editá-lo." +"Selecione o sub-tile editado atual.\n" +"Clique em outro Tile para editá-lo." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Delete polygon." @@ -12781,7 +12789,7 @@ msgstr "" "LMB: Ligar bit.\n" "RMB: Desligar bit.\n" "Shift+LMB: Escolher bit curinga.\n" -"Clique em outro Mosaico para editá-lo." +"Clique em outro Tile para editá-lo." #: editor/plugins/tile_set_editor_plugin.cpp msgid "" @@ -12789,41 +12797,41 @@ msgid "" "bindings.\n" "Click on another Tile to edit it." msgstr "" -"Selecione o sub-bloco para usar como Ãcone, isso também será usado em " -"ligações inválidas do autotile.\n" -"Clique em outro Mosaico para editá-lo." +"Selecione o sub-tile para usar como Ãcone, ele também será usado em ligações " +"inválidas do autotile.\n" +"Clique em outro Tile para editá-lo." #: editor/plugins/tile_set_editor_plugin.cpp msgid "" "Select sub-tile to change its priority.\n" "Click on another Tile to edit it." msgstr "" -"Selecione o sub-bloco para alterar sua prioridade.\n" -"Clique em outro Mosaico para editá-lo." +"Selecione o sub-tile para alterar sua prioridade.\n" +"Clique em outro Tile para editá-lo." #: editor/plugins/tile_set_editor_plugin.cpp msgid "" "Select sub-tile to change its z index.\n" "Click on another Tile to edit it." msgstr "" -"Selecione o sub-bloco para alterar seu Ãndice z.\n" -"Clique em outro Mosaico para editá-lo." +"Selecione o sub-tile para alterar seu Ãndice z.\n" +"Clique em outro Tile para editá-lo." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Set Tile Region" -msgstr "Definir a região do Mosaico" +msgstr "Definir a região do Tile" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create Tile" -msgstr "Criar Telha" +msgstr "Criar Tile" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Set Tile Icon" -msgstr "Definir Ãcone de telha" +msgstr "Definir Ãcone do Tile" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Edit Tile Bitmask" -msgstr "Editar o Bitmask da telha" +msgstr "Editar o Bitmask do Tile" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Edit Collision Polygon" @@ -12839,11 +12847,11 @@ msgstr "Editar polÃgono de navegação" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Paste Tile Bitmask" -msgstr "Colar Máscara Bitmask" +msgstr "Colar Bitmask de Tile" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Clear Tile Bitmask" -msgstr "Limpar o Bitmask da telha" +msgstr "Limpar Bitmask do Tile" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Make Polygon Concave" @@ -12855,7 +12863,7 @@ msgstr "Tornar o PolÃgono Convexo" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Remove Tile" -msgstr "Remover Telha" +msgstr "Remover Tile" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Remove Collision Polygon" @@ -12871,11 +12879,11 @@ msgstr "Remover PolÃgono de Navegação" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Edit Tile Priority" -msgstr "Editar prioridade da telha" +msgstr "Editar Prioridade do Tile" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Edit Tile Z Index" -msgstr "Editar Ãndice de telha Z" +msgstr "Editar Ãndice Z do Tile" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Make Convex" @@ -12898,9 +12906,8 @@ msgid "This property can't be changed." msgstr "Esta propriedade não pode ser alterada." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Snap Options" -msgstr "Opções de encaixe" +msgstr "Opções de Encaixe" #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/animated_sprite.cpp #: scene/2d/camera_2d.cpp scene/2d/cpu_particles_2d.cpp scene/2d/light_2d.cpp @@ -12941,9 +12948,8 @@ msgid "Texture" msgstr "Textura" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Tex Offset" -msgstr "Deslocamento do Byte" +msgstr "Deslocamento da Textura" #: editor/plugins/tile_set_editor_plugin.cpp modules/csg/csg_shape.cpp #: scene/2d/canvas_item.cpp scene/2d/particles_2d.cpp @@ -12953,31 +12959,28 @@ msgstr "Material" #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/canvas_item.cpp #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/style_box.cpp -#, fuzzy msgid "Modulate" -msgstr "Popular" +msgstr "Modular" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Tile Mode" msgstr "Modo de Tiles" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Autotile Bitmask Mode" -msgstr "Modo Bitmask" +msgstr "Modo Bitmask do Autotile" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Subtile Size" -msgstr "Tamanho do Sub TÃtulo" +msgstr "Tamanho do Subtile" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Subtile Spacing" msgstr "Espaçamento dos Subtiles" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Occluder Offset" -msgstr "Criar PolÃgono de Oclusão" +msgstr "Deslocamento de Oclusor" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Navigation Offset" @@ -12996,9 +12999,8 @@ msgid "Selected Collision" msgstr "Colisão Selecionada" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Collision One Way" -msgstr "Selecionar Apenas" +msgstr "Colisão em sentido único selecionada" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -13019,7 +13021,7 @@ msgstr "Scripts do Tileset" #: editor/plugins/tile_set_editor_plugin.cpp msgid "TileSet" -msgstr "Conjunto de Telha" +msgstr "TileSet" #: editor/plugins/version_control_editor_plugin.cpp msgid "No VCS plugins are available." @@ -13054,7 +13056,7 @@ msgstr "Commit:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Date:" -msgstr "Encontro:" +msgstr "Data:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Subtitle:" @@ -13158,6 +13160,7 @@ msgid "Remove Remote" msgstr "Remover remoto" #: editor/plugins/version_control_editor_plugin.cpp +#, fuzzy msgid "Remote Name" msgstr "Nome Remoto" @@ -15373,19 +15376,17 @@ msgstr "" msgid "Make Local" msgstr "Tornar Local" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "Outro nó já está usando este nome único na cena atual." +#: editor/scene_tree_dock.cpp +msgid "Enable Scene Unique Name(s)" +msgstr "Habilitar Nome(s) Único(s) de Cena" #: editor/scene_tree_dock.cpp -#, fuzzy -msgid "Enable Scene Unique Name" -msgstr "Nome Único" +msgid "Unique names already used by another node in the scene:" +msgstr "Nomes únicos já estão sendo usados por outro nó na cena:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -#, fuzzy -msgid "Disable Scene Unique Name" -msgstr "Nome Único" +#: editor/scene_tree_dock.cpp +msgid "Disable Scene Unique Name(s)" +msgstr "Desabilitar Nome(s) Único(s) de Cena" #: editor/scene_tree_dock.cpp msgid "New Scene Root" @@ -15586,6 +15587,10 @@ msgid "Button Group" msgstr "Grupo de Botões" #: editor/scene_tree_editor.cpp +msgid "Disable Scene Unique Name" +msgstr "Desabilitar Nome Único de Cena" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Conectando de)" @@ -15664,6 +15669,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "Nome de nó inválido, os seguintes caracteres não são permitidos:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "Outro nó já está usando este nome único na cena atual." + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Renomear Nó" @@ -15888,9 +15897,8 @@ msgid "Stack Frames" msgstr "Pilha de Quadros" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Filter stack variables" -msgstr "Filtros do tile" +msgstr "Filtrar variáveis stack" #: editor/script_editor_debugger.cpp msgid "Auto Switch To Remote Scene Tree" @@ -16033,23 +16041,20 @@ msgid "Change Particles AABB" msgstr "Alterar o AABB das PartÃculas" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Reflection Probe" -msgstr "Selecionar Propriedade" +msgstr "Sonda de Reflexão" #: editor/spatial_editor_gizmos.cpp msgid "Change Probe Extents" msgstr "Alterar a Extensão da Sonda" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "GI Probe" -msgstr "Cozinhar Sonda GI" +msgstr "Sonda GI" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Baked Indirect Light" -msgstr "Iluminação indireta" +msgstr "Pré-Processar Iluminação indireta" #: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp msgid "Change Sphere Shape Radius" @@ -16084,9 +16089,8 @@ msgid "Navigation Edge" msgstr "Bordas de Navegação" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Navigation Edge Disabled" -msgstr "Modo Navegação" +msgstr "Bordas de Navegação Desativadas" #: editor/spatial_editor_gizmos.cpp msgid "Navigation Solid" @@ -16117,9 +16121,8 @@ msgid "Set Room Point Position" msgstr "Definir Posição Do Ponto Da Sala" #: editor/spatial_editor_gizmos.cpp scene/3d/portal.cpp -#, fuzzy msgid "Portal Margin" -msgstr "Definir Margem" +msgstr "Margem do Portal" #: editor/spatial_editor_gizmos.cpp msgid "Portal Edge" @@ -16138,15 +16141,13 @@ msgid "Portal Front" msgstr "Frente do Portal" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Portal Back" -msgstr "Voltar" +msgstr "Voltar ao Portal" #: editor/spatial_editor_gizmos.cpp scene/2d/light_occluder_2d.cpp #: scene/2d/tile_map.cpp -#, fuzzy msgid "Occluder" -msgstr "Modo Oclusão" +msgstr "Oclusor" #: editor/spatial_editor_gizmos.cpp msgid "Set Occluder Sphere Radius" @@ -16159,27 +16160,25 @@ msgstr "Definir Posição Da Esfera Do Oclusor" #: editor/spatial_editor_gizmos.cpp #, fuzzy msgid "Set Occluder Polygon Point Position" -msgstr "Definir Posição Do Ponto Do Portal" +msgstr "Definir Posição do Ponto do PolÃgono Oclusor" #: editor/spatial_editor_gizmos.cpp #, fuzzy msgid "Set Occluder Hole Point Position" -msgstr "Definir Posição do Ponto da Curva" +msgstr "Definir Posição do Ponto do Buraco Oclusor" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Occluder Polygon Front" -msgstr "Criar PolÃgono de Oclusão" +msgstr "Frente do PolÃgono Oclusor" #: editor/spatial_editor_gizmos.cpp #, fuzzy msgid "Occluder Polygon Back" -msgstr "Criar PolÃgono de Oclusão" +msgstr "Costas do PolÃgono Oclusor" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Occluder Hole" -msgstr "Criar PolÃgono de Oclusão" +msgstr "Buraco Oclusor" #: main/main.cpp msgid "Godot Physics" @@ -16192,19 +16191,16 @@ msgstr "Usar BVH" #: main/main.cpp servers/physics_2d/physics_2d_server_sw.cpp #: servers/visual/visual_server_scene.cpp -#, fuzzy msgid "BVH Collision Margin" -msgstr "Modo Colisão" +msgstr "Margem de Colisão BVH" #: main/main.cpp -#, fuzzy msgid "Crash Handler" -msgstr "Definir Manipulador" +msgstr "Gerenciador de Falhas" #: main/main.cpp -#, fuzzy msgid "Multithreaded Server" -msgstr "Conjunto de MultiNode" +msgstr "Servidor com Multi-Thread" #: main/main.cpp msgid "RID Pool Prealloc" @@ -16243,14 +16239,12 @@ msgid "File Logging" msgstr "Registrando Log de Arquivos" #: main/main.cpp -#, fuzzy msgid "Enable File Logging" -msgstr "Habilitar Filtragem" +msgstr "Habilitar Log de Arquivos" #: main/main.cpp -#, fuzzy msgid "Log Path" -msgstr "Copiar Caminho" +msgstr "Caminho de Log" #: main/main.cpp msgid "Max Log Files" @@ -16301,9 +16295,8 @@ msgid "Intended Usage" msgstr "Intenção de Uso" #: main/main.cpp -#, fuzzy msgid "Framebuffer Allocation" -msgstr "Seleção de Frame" +msgstr "Alocação de Framebuffer" #: main/main.cpp platform/uwp/os_uwp.cpp msgid "Energy Saving" @@ -16314,9 +16307,8 @@ msgid "Threads" msgstr "Threads" #: main/main.cpp servers/physics_2d/physics_2d_server_wrap_mt.h -#, fuzzy msgid "Thread Model" -msgstr "Alternar Modo" +msgstr "Modelo de Thread" #: main/main.cpp msgid "Thread Safe BVH" @@ -16337,9 +16329,8 @@ msgid "Common" msgstr "Comum" #: main/main.cpp -#, fuzzy msgid "Physics FPS" -msgstr "Frame de FÃsica %" +msgstr "FPS da FisÃca" #: main/main.cpp msgid "Force FPS" @@ -16347,7 +16338,7 @@ msgstr "Forçar FPS" #: main/main.cpp msgid "Enable Pause Aware Picking" -msgstr "Habilitar Escolha que é Ciente à Pausas" +msgstr "Habilitar Seleção Ciente a Pausas" #: main/main.cpp scene/gui/item_list.cpp scene/gui/popup_menu.cpp #: scene/gui/scroll_container.cpp scene/gui/text_edit.cpp scene/gui/tree.cpp @@ -16372,9 +16363,8 @@ msgid "Verbose stdout" msgstr "stdout Verboso" #: main/main.cpp scene/main/scene_tree.cpp scene/resources/multimesh.cpp -#, fuzzy msgid "Physics Interpolation" -msgstr "Modo de Interpolação" +msgstr "Interpolação da FÃsica" #: main/main.cpp msgid "Enable Warnings" @@ -16402,14 +16392,12 @@ msgid "Hide Home Indicator" msgstr "Esconder Indicador de Home" #: main/main.cpp -#, fuzzy msgid "Input Devices" -msgstr "Todos os dispositivos" +msgstr "Dispositivos de Entrada" #: main/main.cpp -#, fuzzy msgid "Pointing" -msgstr "Ponto" +msgstr "Apontando" #: main/main.cpp msgid "Touch Delay" @@ -16424,9 +16412,8 @@ msgid "Shaders" msgstr "Shaders" #: main/main.cpp -#, fuzzy msgid "Debug Shader Fallbacks" -msgstr "Forçar Fallbacks do Shader" +msgstr "Depurar Fallbacks do Shader" #: main/main.cpp scene/3d/baked_lightmap.cpp scene/3d/camera.cpp #: scene/3d/world_environment.cpp scene/main/scene_tree.cpp @@ -16436,7 +16423,7 @@ msgstr "Ambiente" #: main/main.cpp msgid "Default Clear Color" -msgstr "Cor de Limpeza Padrão" +msgstr "Cor Limpa Padrão" #: main/main.cpp msgid "Boot Splash" @@ -16459,9 +16446,8 @@ msgid "Use Filter" msgstr "Usar Filtro" #: main/main.cpp scene/resources/style_box.cpp -#, fuzzy msgid "BG Color" -msgstr "Cores" +msgstr "Cor do Plano de Fundo" #: main/main.cpp msgid "macOS Native Icon" @@ -16473,7 +16459,7 @@ msgstr "Ãcone Windows Nativo" #: main/main.cpp msgid "Buffering" -msgstr "" +msgstr "Buffering" #: main/main.cpp msgid "Agile Event Flushing" @@ -16504,9 +16490,8 @@ msgid "Tooltip Position Offset" msgstr "Deslocamento de Posição da Dica de Ferramenta" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp -#, fuzzy msgid "Debugger Agent" -msgstr "Depurador" +msgstr "Agente Depurador" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp msgid "Wait For Debugger" @@ -16525,9 +16510,8 @@ msgid "Unhandled Exception Policy" msgstr "Politica de Tratamento Exceções" #: main/main.cpp -#, fuzzy msgid "Main Loop Type" -msgstr "Localizar Tipo de Nó" +msgstr "Tipo de Loop Principal" #: main/main.cpp scene/gui/texture_progress.cpp #: scene/gui/viewport_container.cpp @@ -16549,7 +16533,7 @@ msgstr "Aceitar Sair Automaticamente" #: main/main.cpp scene/main/scene_tree.cpp #, fuzzy msgid "Quit On Go Back" -msgstr "Voltar" +msgstr "Sair em Voltar" #: main/main.cpp scene/main/viewport.cpp #, fuzzy @@ -16570,7 +16554,7 @@ msgstr "Ativar Mundo Macio" #: modules/csg/csg_gizmos.cpp msgid "CSG" -msgstr "" +msgstr "CSG" #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" @@ -16638,23 +16622,20 @@ msgid "Smooth Faces" msgstr "Suavizar Faces" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Sides" -msgstr "Mostrar Guias" +msgstr "Lados" #: modules/csg/csg_shape.cpp msgid "Cone" msgstr "Cone" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Inner Radius" -msgstr "Alterar Raio Interno do Toro" +msgstr "Raio Interno" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Outer Radius" -msgstr "Alterar Raio Externo do Toro" +msgstr "Raio Externo" #: modules/csg/csg_shape.cpp msgid "Ring Sides" @@ -16763,9 +16744,8 @@ msgstr "Carregar Apenas uma Vez" #: modules/gdnative/gdnative.cpp #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Singleton" -msgstr "Esqueleto" +msgstr "Singleton" #: modules/gdnative/gdnative.cpp msgid "Symbol Prefix" @@ -16855,9 +16835,8 @@ msgid "Function Definition Color" msgstr "Cor de Definição de Função" #: modules/gdscript/editor/gdscript_highlighter.cpp -#, fuzzy msgid "Node Path Color" -msgstr "Copiar Caminho do Nó" +msgstr "Cor do Caminho do Nó" #: modules/gdscript/gdscript.cpp modules/visual_script/visual_script.cpp msgid "Max Call Stack" @@ -16918,9 +16897,8 @@ msgid "Language Server" msgstr "Servidor de Idioma" #: modules/gdscript/language_server/gdscript_language_server.cpp -#, fuzzy msgid "Enable Smart Resolve" -msgstr "Não foi possÃvel resolver" +msgstr "Habilitar Resolução Inteligente" #: modules/gdscript/language_server/gdscript_language_server.cpp msgid "Show Native Symbols In Editor" @@ -16952,9 +16930,8 @@ msgid "Component Type" msgstr "Tipo do Componente" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Normalized" -msgstr "Formato" +msgstr "Normalizado" #: modules/gltf/gltf_accessor.cpp msgid "Count" @@ -17046,11 +17023,11 @@ msgstr "Intervalo" #: modules/gltf/gltf_light.cpp msgid "Inner Cone Angle" -msgstr "" +msgstr "Ângulo interno do cone" #: modules/gltf/gltf_light.cpp msgid "Outer Cone Angle" -msgstr "" +msgstr "Ângulo externo do cone" #: modules/gltf/gltf_mesh.cpp #, fuzzy @@ -17062,9 +17039,8 @@ msgid "Instance Materials" msgstr "Materiais da Instância" #: modules/gltf/gltf_node.cpp scene/3d/skeleton.cpp -#, fuzzy msgid "Parent" -msgstr "Reparentar" +msgstr "Pai" #: modules/gltf/gltf_node.cpp #, fuzzy @@ -17100,9 +17076,8 @@ msgid "Godot Bone Node" msgstr "Nó de Osso Godot" #: modules/gltf/gltf_skin.cpp -#, fuzzy msgid "Skin Root" -msgstr "Nova Raiz de Cena" +msgstr "Raiz da Skin" #: modules/gltf/gltf_skin.cpp msgid "Joints Original" @@ -17119,11 +17094,11 @@ msgstr "Mover Junta" #: modules/gltf/gltf_skin.cpp msgid "Joint I To Bone I" -msgstr "" +msgstr "Junta I ao Osso I" #: modules/gltf/gltf_skin.cpp msgid "Joint I To Name" -msgstr "" +msgstr "Junta I ao Nome" #: modules/gltf/gltf_skin.cpp msgid "Godot Skin" @@ -17131,15 +17106,15 @@ msgstr "" #: modules/gltf/gltf_spec_gloss.cpp msgid "Diffuse Img" -msgstr "" +msgstr "Difusa Img" #: modules/gltf/gltf_spec_gloss.cpp msgid "Diffuse Factor" -msgstr "" +msgstr "Difusa Fator" #: modules/gltf/gltf_spec_gloss.cpp msgid "Gloss Factor" -msgstr "" +msgstr "Fator de Brilho" #: modules/gltf/gltf_spec_gloss.cpp msgid "Specular Factor" @@ -17178,7 +17153,7 @@ msgstr "Visão Traseira" #: modules/gltf/gltf_state.cpp msgid "Accessors" -msgstr "" +msgstr "Assessores" #: modules/gltf/gltf_state.cpp msgid "Scene Name" @@ -17231,9 +17206,8 @@ msgid "Mesh Library" msgstr "Biblioteca de Malhas" #: modules/gridmap/grid_map.cpp -#, fuzzy msgid "Physics Material" -msgstr "Frame de FÃsica %" +msgstr "Material de FÃsica" #: modules/gridmap/grid_map.cpp scene/3d/visual_instance.cpp #, fuzzy @@ -17268,9 +17242,8 @@ msgid "Mask" msgstr "Máscara" #: modules/gridmap/grid_map.cpp scene/2d/tile_map.cpp -#, fuzzy msgid "Bake Navigation" -msgstr "Navegação" +msgstr "Navegação Pré-Processada" #: modules/gridmap/grid_map.cpp scene/2d/navigation_2d.cpp #: scene/2d/navigation_agent_2d.cpp scene/2d/navigation_polygon.cpp @@ -17436,25 +17409,24 @@ msgid "Plotting lightmaps" msgstr "Traçando mapas de luz" #: modules/lightmapper_cpu/register_types.cpp -#, fuzzy msgid "CPU Lightmapper" -msgstr "Faça mapas de luz" +msgstr "Mapeamento de Luz da CPU" #: modules/lightmapper_cpu/register_types.cpp msgid "Low Quality Ray Count" -msgstr "" +msgstr "Quantidade de Raios de Baixa Qualidade" #: modules/lightmapper_cpu/register_types.cpp msgid "Medium Quality Ray Count" -msgstr "" +msgstr "Quantidade de Raios de Qualidade Média" #: modules/lightmapper_cpu/register_types.cpp msgid "High Quality Ray Count" -msgstr "" +msgstr "Quantidade de Raios de Qualidade Alta" #: modules/lightmapper_cpu/register_types.cpp msgid "Ultra Quality Ray Count" -msgstr "" +msgstr "Quantidade de Raios de Qualidade Ultra" #: modules/minimp3/audio_stream_mp3.cpp #: modules/minimp3/resource_importer_mp3.cpp @@ -17465,16 +17437,15 @@ msgstr "Deslocamento do Loop" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "Eye Height" -msgstr "" +msgstr "Altura do Olho" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "IOD" msgstr "" #: modules/mobile_vr/mobile_vr_interface.cpp -#, fuzzy msgid "Display Width" -msgstr "Exibição Wireframe" +msgstr "Largura de Tela" #: modules/mobile_vr/mobile_vr_interface.cpp #, fuzzy @@ -17502,9 +17473,21 @@ msgid "Build Solution" msgstr "Construir Solução" #: modules/mono/editor/csharp_project.cpp -#, fuzzy msgid "Auto Update Project" -msgstr "Projeto Sem Nome" +msgstr "Atualizar Projeto Automaticamente" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Nome de Exibição" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "Diretório da Solução" + +#: modules/mono/godotsharp_dirs.cpp +msgid "C# Project Directory" +msgstr "Diretório do Projeto C#" #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" @@ -17586,12 +17569,13 @@ msgid "As Normal Map" msgstr "Como Mapa Normal" #: modules/opensimplex/noise_texture.cpp +#, fuzzy msgid "Bump Strength" -msgstr "" +msgstr "Força da colisão" #: modules/opensimplex/noise_texture.cpp msgid "Noise" -msgstr "" +msgstr "RuÃdo" #: modules/opensimplex/noise_texture.cpp msgid "Noise Offset" @@ -17603,25 +17587,23 @@ msgstr "Oitavas" #: modules/opensimplex/open_simplex_noise.cpp msgid "Period" -msgstr "" +msgstr "PerÃodo" #: modules/opensimplex/open_simplex_noise.cpp -#, fuzzy msgid "Persistence" -msgstr "Perspectiva" +msgstr "Persistência" #: modules/opensimplex/open_simplex_noise.cpp msgid "Lacunarity" -msgstr "" +msgstr "Lacunaridade" #: modules/regex/regex.cpp msgid "Subject" msgstr "Sujeito" #: modules/regex/regex.cpp -#, fuzzy msgid "Names" -msgstr "Nome" +msgstr "Nomes" #: modules/regex/regex.cpp msgid "Strings" @@ -17633,11 +17615,11 @@ msgstr "" #: modules/upnp/upnp.cpp msgid "Discover Local Port" -msgstr "" +msgstr "Descobrir Porta Local" #: modules/upnp/upnp.cpp msgid "Discover IPv6" -msgstr "" +msgstr "Descobrir IPv6" #: modules/upnp/upnp_device.cpp #, fuzzy @@ -17645,27 +17627,24 @@ msgid "Description URL" msgstr "Descrição" #: modules/upnp/upnp_device.cpp -#, fuzzy msgid "Service Type" -msgstr "Definir o Tipo da Variável" +msgstr "Tipo de Serviço" #: modules/upnp/upnp_device.cpp msgid "IGD Control URL" -msgstr "" +msgstr "URL de Controle IGD" #: modules/upnp/upnp_device.cpp -#, fuzzy msgid "IGD Service Type" -msgstr "Definir o Tipo da Variável" +msgstr "Tipo de Serviço IGD" #: modules/upnp/upnp_device.cpp msgid "IGD Our Addr" msgstr "" #: modules/upnp/upnp_device.cpp -#, fuzzy msgid "IGD Status" -msgstr "Estado" +msgstr "Estado do IGD" #: modules/visual_script/visual_script.cpp msgid "" @@ -17704,9 +17683,8 @@ msgid "Stack overflow with stack depth:" msgstr "Sobrecarga da pilha com profundidade:" #: modules/visual_script/visual_script.cpp -#, fuzzy msgid "Visual Script" -msgstr "Buscar VisualScript" +msgstr "Script Visual" #: modules/visual_script/visual_script_editor.cpp msgid "Change Signal Arguments" @@ -18041,9 +18019,8 @@ msgid "Return Enabled" msgstr "Executável" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Return Type" -msgstr "Retornar" +msgstr "Tipo de Retorno" #: modules/visual_script/visual_script_flow_control.cpp #: scene/resources/visual_shader_nodes.cpp @@ -18084,17 +18061,15 @@ msgstr "Iterador tornou-se inválido:" #: modules/visual_script/visual_script_flow_control.cpp msgid "Sequence" -msgstr "Seqüência" +msgstr "Sequência" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "in order:" -msgstr "Renomear pasta:" +msgstr "em ordem:" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Steps" -msgstr "Passo" +msgstr "Passos" #: modules/visual_script/visual_script_flow_control.cpp msgid "Switch" @@ -18110,17 +18085,16 @@ msgstr "Tipo de Projeção" #: modules/visual_script/visual_script_flow_control.cpp msgid "Is %s?" -msgstr "" +msgstr "É %s?" #: modules/visual_script/visual_script_flow_control.cpp #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Base Script" -msgstr "Novo Script" +msgstr "Script Base" #: modules/visual_script/visual_script_func_nodes.cpp msgid "On %s" -msgstr "" +msgstr "Em %s" #: modules/visual_script/visual_script_func_nodes.cpp #, fuzzy @@ -18129,59 +18103,53 @@ msgstr "Self" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Call Mode" -msgstr "Modo de Escalonamento" +msgstr "Modo de Chamada" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Basic Type" -msgstr "Mudar Tipo Base" +msgstr "Tipo Base" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Node Path" -msgstr "Copiar Caminho do Nó" +msgstr "Caminho do Nó" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Use Default Args" -msgstr "Redefinir para o padrão" +msgstr "Usar Argumentos Padrão" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Validate" msgstr "Validar" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "RPC Call Mode" -msgstr "Modo de Escalonamento" +msgstr "Modo de Chamada RPC" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Subtract %s" -msgstr "Para caractere %s" +msgstr "Subtrair %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Multiply %s" -msgstr "" +msgstr "Multiplicar %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Divide %s" -msgstr "" +msgstr "Dividir %s" #: modules/visual_script/visual_script_func_nodes.cpp #, fuzzy msgid "Mod %s" -msgstr "Adicionar %s" +msgstr "Mod %s" #: modules/visual_script/visual_script_func_nodes.cpp #, fuzzy msgid "ShiftLeft %s" -msgstr "Conjunto %s" +msgstr "ShiftLeft %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "ShiftRight %s" @@ -18190,7 +18158,7 @@ msgstr "" #: modules/visual_script/visual_script_func_nodes.cpp #, fuzzy msgid "BitAnd %s" -msgstr "Adicionar %s" +msgstr "BitAnd %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "BitOr %s" @@ -18208,7 +18176,7 @@ msgstr "Modo de Seleção" #: modules/visual_script/visual_script_func_nodes.cpp #, fuzzy msgid "Assign Op" -msgstr "Atribuir" +msgstr "Atribuir Op" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp @@ -18225,23 +18193,20 @@ msgid "Base object is not a Node!" msgstr "Objeto base não é um Nó!" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Path does not lead to Node!" -msgstr "Caminho não leva a um Nó!" +msgstr "Caminho não leva ao Nó!" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Invalid index property name '%s' in node %s." msgstr "Nome de propriedade '%s' inválido no nó %s." #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Emit %s" -msgstr "Conjunto %s" +msgstr "Emitir %s" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Compose Array" -msgstr "Redimensionar Vetor" +msgstr "Compôr Vetor" #: modules/visual_script/visual_script_nodes.cpp scene/resources/material.cpp #: scene/resources/visual_shader_nodes.cpp @@ -18261,9 +18226,8 @@ msgid "a if cond, else b" msgstr "" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Var Name" -msgstr "Nome" +msgstr "Nome da Variável" #: modules/visual_script/visual_script_nodes.cpp msgid "VariableGet not found in script:" @@ -18274,64 +18238,53 @@ msgid "VariableSet not found in script:" msgstr "VariableSet não encontrado no script:" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Preload" -msgstr "Recarregar" +msgstr "Pré Carregar" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Index" -msgstr "Ãndice Z" +msgstr "Obter Ãndice" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Set Index" -msgstr "Ãndice Z" +msgstr "Definir Ãndice" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Global Constant" -msgstr "Constante" +msgstr "Constante Global" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Class Constant" -msgstr "Constante" +msgstr "Classe Constante" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Basic Constant" -msgstr "Constante" +msgstr "Constante Básica" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Math Constant" -msgstr "Constante" +msgstr "Constante Matemática" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Engine Singleton" -msgstr "Singleton GDNative ativado" +msgstr "Obter Singleton da Engine" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Scene Node" -msgstr "Nó TimeSeek" +msgstr "Obter Nó da Cena" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Scene Tree" -msgstr "Edição da Ãrvore de Cena" +msgstr "Obter Ãrvore de Cenas" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Self" -msgstr "Self" +msgstr "Obter Sà Mesmo" #: modules/visual_script/visual_script_nodes.cpp #, fuzzy msgid "CustomNode" -msgstr "Recortar Nós" +msgstr "CustomNode" #: modules/visual_script/visual_script_nodes.cpp msgid "Custom node has no _step() method, can't process graph." @@ -18350,35 +18303,31 @@ msgstr "" #: modules/visual_script/visual_script_nodes.cpp #, fuzzy msgid "SubCall" -msgstr "Chamadas" +msgstr "SubCall" #: modules/visual_script/visual_script_nodes.cpp scene/gui/graph_node.cpp msgid "Title" msgstr "TÃtulo" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Construct %s" -msgstr "Constantes" +msgstr "Construir %s" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Local Var" -msgstr "Usar Espaço Local" +msgstr "Obter Variável Local" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Set Local Var" -msgstr "Usar Espaço Local" +msgstr "Definir Variável Local" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Action %s" -msgstr "Ação" +msgstr "Ação %s" #: modules/visual_script/visual_script_nodes.cpp msgid "Deconstruct %s" -msgstr "" +msgstr "Desconstruir %s" #: modules/visual_script/visual_script_property_selector.cpp msgid "Search VisualScript" @@ -18386,45 +18335,42 @@ msgstr "Buscar VisualScript" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Yield" -msgstr "" +msgstr "Yield" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Wait" msgstr "Esperar" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Next Frame" -msgstr "Mover Quadro" +msgstr "Próximo Quadro" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Next Physics Frame" -msgstr "Frame de FÃsica %" +msgstr "Próximo Quadro de FÃsica" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "%s sec(s)" -msgstr "" +msgstr "%s s" #: modules/visual_script/visual_script_yield_nodes.cpp scene/main/timer.cpp -#, fuzzy msgid "Wait Time" -msgstr "Pintar Tile" +msgstr "Tempo de Espera" #: modules/visual_script/visual_script_yield_nodes.cpp #, fuzzy msgid "WaitSignal" -msgstr "Sinal" +msgstr "WaitSignal" #: modules/visual_script/visual_script_yield_nodes.cpp #, fuzzy msgid "WaitNodeSignal" -msgstr "Sinal" +msgstr "WaitNodeSignal" #: modules/visual_script/visual_script_yield_nodes.cpp #, fuzzy msgid "WaitInstanceSignal" -msgstr "Instância" +msgstr "WaitInstanceSignal" #: modules/webrtc/webrtc_data_channel.cpp #, fuzzy @@ -18442,57 +18388,51 @@ msgstr "Tamanho do buffer do Ãndice do polÃgono da tela (KB)" #: modules/websocket/websocket_client.cpp msgid "Verify SSL" -msgstr "" +msgstr "Verificar SSL" #: modules/websocket/websocket_client.cpp msgid "Trusted SSL Certificate" -msgstr "" +msgstr "Certificados SSL Confiáveis" #: modules/websocket/websocket_macros.h -#, fuzzy msgid "WebSocket Client" -msgstr "Perfis de rede" +msgstr "Cliente WebSocket" #: modules/websocket/websocket_macros.h -#, fuzzy msgid "Max In Buffer (KB)" -msgstr "Tamanho Máximo (KB)" +msgstr "Buffer de Entrada Máximo (KB)" #: modules/websocket/websocket_macros.h msgid "Max In Packets" -msgstr "" +msgstr "Máximo de Pacotes de Entrada" #: modules/websocket/websocket_macros.h -#, fuzzy msgid "Max Out Buffer (KB)" -msgstr "Tamanho Máximo (KB)" +msgstr "Buffer de SaÃda Máximo (KB)" #: modules/websocket/websocket_macros.h msgid "Max Out Packets" -msgstr "" +msgstr "Máximo de Pacotes de SaÃda" #: modules/websocket/websocket_macros.h -#, fuzzy msgid "WebSocket Server" -msgstr "Perfis de rede" +msgstr "Servidor WebSocket" #: modules/websocket/websocket_server.cpp msgid "Bind IP" msgstr "" #: modules/websocket/websocket_server.cpp -#, fuzzy msgid "Private Key" -msgstr "Caminho da chave privada SSH" +msgstr "Chave Privada" #: modules/websocket/websocket_server.cpp platform/javascript/export/export.cpp msgid "SSL Certificate" -msgstr "" +msgstr "Certificado SSL" #: modules/websocket/websocket_server.cpp -#, fuzzy msgid "CA Chain" -msgstr "Limpar Cadeia de IK" +msgstr "Cadeia CA" #: modules/websocket/websocket_server.cpp msgid "Handshake Timeout" @@ -18512,17 +18452,18 @@ msgid "Optional Features" msgstr "Funcionalidades Opcionais" #: modules/webxr/webxr_interface.cpp +#, fuzzy msgid "Requested Reference Space Types" -msgstr "" +msgstr "Tipos de Espaço de Referência Solicitados" #: modules/webxr/webxr_interface.cpp +#, fuzzy msgid "Reference Space Type" -msgstr "" +msgstr "Tipo de Espaço de Referência" #: modules/webxr/webxr_interface.cpp -#, fuzzy msgid "Visibility State" -msgstr "Alternar Visibilidade" +msgstr "Estado de Visibilidade" #: modules/webxr/webxr_interface.cpp #, fuzzy @@ -18536,7 +18477,7 @@ msgstr "Encaixe inteligente" #: platform/android/export/export.cpp msgid "Android SDK Path" -msgstr "" +msgstr "Caminho para SDK Android" #: platform/android/export/export.cpp #, fuzzy @@ -18552,28 +18493,29 @@ msgid "Debug Keystore Pass" msgstr "" #: platform/android/export/export.cpp +#, fuzzy msgid "Force System User" -msgstr "" +msgstr "Forçar Usuário do Sistema" #: platform/android/export/export.cpp msgid "Shutdown ADB On Exit" -msgstr "" +msgstr "Desligar ADB Quando Sair" #: platform/android/export/export_plugin.cpp msgid "Launcher Icons" -msgstr "" +msgstr "Ãcones do Iniciador" #: platform/android/export/export_plugin.cpp msgid "Main 192 X 192" -msgstr "" +msgstr "Principal 192 X 192" #: platform/android/export/export_plugin.cpp msgid "Adaptive Foreground 432 X 432" -msgstr "" +msgstr "Primeiro Plano Adaptável 432 X 432" #: platform/android/export/export_plugin.cpp msgid "Adaptive Background 432 X 432" -msgstr "" +msgstr "Fundo Adaptável 432 X 432" #: platform/android/export/export_plugin.cpp msgid "Package name is missing." @@ -18613,23 +18555,20 @@ msgid "Use Custom Build" msgstr "Usar Diretório de Usuário Personalizado" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Export Format" -msgstr "Caminho de Exportação" +msgstr "Exportar Formato" #: platform/android/export/export_plugin.cpp msgid "Min SDK" msgstr "SDK MÃnimo" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Target SDK" -msgstr "FPS alvo" +msgstr "SDK Alvo" #: platform/android/export/export_plugin.cpp platform/iphone/export/export.cpp -#, fuzzy msgid "Architectures" -msgstr "Arquitetura" +msgstr "Arquiteturas" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18658,30 +18597,27 @@ msgstr "Senha" #: platform/android/export/export_plugin.cpp msgid "One Click Deploy" -msgstr "" +msgstr "Um Clique Implantar" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Clear Previous Install" -msgstr "Inspecionar a Instância Anterior" +msgstr "Limpar Instalação Anterior" #: platform/android/export/export_plugin.cpp msgid "Code" msgstr "Código" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Package" -msgstr "Empacotando" +msgstr "Pacote" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp msgid "Unique Name" msgstr "Nome Único" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Signed" -msgstr "Sinal" +msgstr "Assinado" #: platform/android/export/export_plugin.cpp msgid "Classify As Game" @@ -18689,12 +18625,11 @@ msgstr "Classificar como Jogo" #: platform/android/export/export_plugin.cpp msgid "Retain Data On Uninstall" -msgstr "" +msgstr "Manter Dados ao Desinstalar" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Exclude From Recents" -msgstr "Excluir Nós" +msgstr "Excluir de Recentes" #: platform/android/export/export_plugin.cpp msgid "Graphics" @@ -18706,14 +18641,12 @@ msgid "OpenGL Debug" msgstr "Abrir" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "XR Features" -msgstr "Funcionalidades" +msgstr "Funcionalidades XR" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "XR Mode" -msgstr "Modo Panorâmico" +msgstr "Modo XR" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18722,16 +18655,15 @@ msgstr "Empacotando" #: platform/android/export/export_plugin.cpp msgid "Hand Tracking Frequency" -msgstr "" +msgstr "Frequência de Rastreamento de Mão" #: platform/android/export/export_plugin.cpp msgid "Passthrough" -msgstr "" +msgstr "Atravessar" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Immersive Mode" -msgstr "Modo Prioridade" +msgstr "Modo Imersivo" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18754,18 +18686,16 @@ msgid "Support Xlarge" msgstr "Suporte" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "User Data Backup" -msgstr "Interface de Usuário" +msgstr "Backup de Dados do Usuário" #: platform/android/export/export_plugin.cpp msgid "Allow" msgstr "Permitir" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Command Line" -msgstr "Command" +msgstr "Linha de Comando" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp msgid "Extra Args" @@ -18781,19 +18711,16 @@ msgid "Salt" msgstr "Sal" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Public Key" -msgstr "Caminho da chave pública SSH" +msgstr "Chave Pública" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Permissions" -msgstr "Máscara de Emissão" +msgstr "Permissões" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Custom Permissions" -msgstr "Rodar Outra Cena" +msgstr "Permissões Personalizadas" #: platform/android/export/export_plugin.cpp msgid "Select device from the list" @@ -18912,6 +18839,11 @@ msgid "" "Note that the singleton was also renamed from \"GodotPayments\" to " "\"GodotGooglePlayBilling\"." msgstr "" +"Módulo \"GodotPaymentV3\" inválido incluÃdo na configuração do projeto " +"\"android/modules\" (alterado no Godot 3.2.2).\n" +"Substitua-o pelo plug-in \"GodotGooglePlayBilling\" original.\n" +"Observe que o singleton também foi renomeado de \"GodotPayments\" para " +"\"GodotGooglePlayBilling\"." #: platform/android/export/export_plugin.cpp msgid "\"Use Custom Build\" must be enabled to use the plugins." @@ -18950,12 +18882,16 @@ msgstr "" #: platform/android/export/export_plugin.cpp msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "" +"\"Min SDK\" deve ser um número inteiro válido, mas obteve \"%s\" que é " +"inválido." #: platform/android/export/export_plugin.cpp msgid "" "\"Min SDK\" cannot be lower than %d, which is the version needed by the " "Godot library." msgstr "" +"\"Min SDK\" não pode ser inferior a %d, que é a versão necessária para a " +"biblioteca Godot." #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18969,12 +18905,16 @@ msgstr "" msgid "" "\"Target SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "" +"\"Target SDK\" deve ser um número inteiro válido, mas obteve \"%s\", que é " +"inválido." #: platform/android/export/export_plugin.cpp msgid "" "\"Target SDK\" %d is higher than the default version %d. This may work, but " "wasn't tested and may be unstable." msgstr "" +"\"Target SDK\" %d é superior à versão padrão %d. Isso pode funcionar, mas " +"não foi testado e pode ser instável." #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18985,9 +18925,8 @@ msgstr "" #: platform/android/export/export_plugin.cpp platform/osx/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Code Signing" -msgstr "Sinal" +msgstr "Assinatura de Código" #: platform/android/export/export_plugin.cpp msgid "" @@ -19065,12 +19004,11 @@ msgstr "" "'Projeto'." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Unable to overwrite res://android/build/res/*.xml files with project name." msgstr "" "Incapaz de sobrescrever os arquivos res://android/build/res/*.xml com o nome " -"do projeto" +"do projeto." #: platform/android/export/export_plugin.cpp msgid "Could not export project files to gradle project." @@ -19153,8 +19091,9 @@ msgid "The character '%s' is not allowed in Identifier." msgstr "O caractere '%s' não é permitido no identificador." #: platform/iphone/export/export.cpp +#, fuzzy msgid "Landscape Launch Screens" -msgstr "" +msgstr "Telas de Inicialização de Paisagem" #: platform/iphone/export/export.cpp msgid "iPhone 2436 X 1125" @@ -19246,30 +19185,25 @@ msgid "Identifier" msgstr "Identificador" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Signature" -msgstr "Sinal" +msgstr "Assinatura" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Short Version" -msgstr "Versão" +msgstr "Versão Curta" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Copyright" -msgstr "Superior Direita" +msgstr "Direitos Autorais" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Capabilities" -msgstr "Colar Propriedades" +msgstr "Capacidades" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Access Wi-Fi" -msgstr "Acesso" +msgstr "Acessar Wi-Fi" #: platform/iphone/export/export.cpp msgid "Push Notifications" @@ -19288,19 +19222,16 @@ msgid "Accessible From iTunes Sharing" msgstr "" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Privacy" -msgstr "Caminho da chave privada SSH" +msgstr "Privacidade" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Camera Usage Description" -msgstr "Descrição" +msgstr "Descrição do Uso da Câmera" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Microphone Usage Description" -msgstr "Descrições da Propriedade" +msgstr "Descrição do Uso do Microfone" #: platform/iphone/export/export.cpp #, fuzzy @@ -19329,7 +19260,7 @@ msgstr "iPad 167 X 167" #: platform/iphone/export/export.cpp msgid "App Store 1024 X 1024" -msgstr "" +msgstr "Apple Store 1024 X 1024" #: platform/iphone/export/export.cpp msgid "Spotlight 40 X 40" @@ -19348,9 +19279,8 @@ msgid "Use Launch Screen Storyboard" msgstr "" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Image Scale Mode" -msgstr "Modo de Escalonamento" +msgstr "Modo de Escalonamento de Imagem" #: platform/iphone/export/export.cpp #, fuzzy @@ -19363,25 +19293,25 @@ msgid "Custom Image @3x" msgstr "Recortar Nós" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Use Custom BG Color" -msgstr "Recortar Nós" +msgstr "Usar Cor Personalizada de Fundo" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Custom BG Color" -msgstr "Recortar Nós" +msgstr "Cor Personalizada de Fundo" + +#: platform/iphone/export/export.cpp +msgid "Export Icons" +msgstr "Exportar Ãcones" #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp -#, fuzzy msgid "Prepare Templates" -msgstr "Gerenciar Templates" +msgstr "Preparar Templates" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Export template not found." -msgstr "Template customizado de release não encontrado." +msgstr "Template exportado não encontrado." #: platform/iphone/export/export.cpp msgid "App Store Team ID not specified - cannot configure the project." @@ -19417,9 +19347,8 @@ msgid "Could not write file: \"%s\"." msgstr "Não foi possÃvel escrever o arquivo: \"%s\"." #: platform/javascript/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Icon Creation" -msgstr "Definir Margem" +msgstr "Criação de Ãcone" #: platform/javascript/export/export.cpp msgid "Could not read file: \"%s\"." @@ -19434,9 +19363,8 @@ msgid "Variant" msgstr "Variante" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Export Type" -msgstr "Exportação" +msgstr "Tipo de Exportação" #: platform/javascript/export/export.cpp #, fuzzy @@ -19456,9 +19384,8 @@ msgid "HTML" msgstr "HTML" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Export Icon" -msgstr "Expandir Tudo" +msgstr "Exportar Ãcone" #: platform/javascript/export/export.cpp #, fuzzy @@ -19474,14 +19401,12 @@ msgid "Canvas Resize Policy" msgstr "" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Focus Canvas On Start" msgstr "Focar Canvas ao Iniciar" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Experimental Virtual Keyboard" -msgstr "Filtrar sinais" +msgstr "Teclado Virtual Experimental" #: platform/javascript/export/export.cpp msgid "Progressive Web App" @@ -19493,15 +19418,15 @@ msgstr "Página Offline" #: platform/javascript/export/export.cpp msgid "Icon 144 X 144" -msgstr "" +msgstr "Ãcone 144 X 144" #: platform/javascript/export/export.cpp msgid "Icon 180 X 180" -msgstr "" +msgstr "Ãcone 180 X 180" #: platform/javascript/export/export.cpp msgid "Icon 512 X 512" -msgstr "" +msgstr "Ãcone 512 X 512" #: platform/javascript/export/export.cpp msgid "Could not read HTML shell: \"%s\"." @@ -19521,16 +19446,15 @@ msgstr "Web" #: platform/javascript/export/export.cpp msgid "HTTP Host" -msgstr "" +msgstr "Host HTTP" #: platform/javascript/export/export.cpp msgid "HTTP Port" -msgstr "" +msgstr "Porta HTTP" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Use SSL" -msgstr "Use Encaixar" +msgstr "Usar SSL" #: platform/javascript/export/export.cpp msgid "SSL Key" @@ -19538,7 +19462,7 @@ msgstr "Chave SSL" #: platform/osx/export/codesign.cpp msgid "Can't get filesystem access." -msgstr "" +msgstr "Não conseguiu acesso ao sistema de arquivos." #: platform/osx/export/codesign.cpp msgid "Failed to get Info.plist hash." @@ -19559,27 +19483,24 @@ msgid "Invalid Info.plist, can't load." msgstr "Geometria inválida, não é possÃvel criar o polÃgono." #: platform/osx/export/codesign.cpp -#, fuzzy msgid "Failed to create \"%s\" subfolder." -msgstr "Não foi possÃvel criar a pasta." +msgstr "Falha ao criar sub-pasta \"%s\"." #: platform/osx/export/codesign.cpp msgid "Failed to extract thin binary." msgstr "" #: platform/osx/export/codesign.cpp -#, fuzzy msgid "Invalid binary format." -msgstr "Caminho base inválido." +msgstr "Formato de binário inválido." #: platform/osx/export/codesign.cpp msgid "Already signed!" msgstr "Já assinado!" #: platform/osx/export/codesign.cpp -#, fuzzy msgid "Failed to process nested resources." -msgstr "Falha ao carregar recurso." +msgstr "Falha ao processar recursos aninhados." #: platform/osx/export/codesign.cpp msgid "Failed to create _CodeSignature subfolder." @@ -19596,13 +19517,13 @@ msgid "Invalid entitlements file." msgstr "Extensão inválida." #: platform/osx/export/codesign.cpp -#, fuzzy msgid "Invalid executable file." -msgstr "Extensão inválida." +msgstr "Arquivo executável inválido." #: platform/osx/export/codesign.cpp +#, fuzzy msgid "Can't resize signature load command." -msgstr "" +msgstr "Não é possÃvel redimensionar o comando de carregamento da assinatura." #: platform/osx/export/codesign.cpp msgid "Failed to create fat binary." @@ -19625,37 +19546,32 @@ msgid "High Res" msgstr "Alta Resolução" #: platform/osx/export/export.cpp -#, fuzzy msgid "Location Usage Description" -msgstr "Descrição" +msgstr "Descrição do Uso da Localização" #: platform/osx/export/export.cpp msgid "Address Book Usage Description" -msgstr "" +msgstr "Descrição do Uso dos Contatos" #: platform/osx/export/export.cpp -#, fuzzy msgid "Calendar Usage Description" -msgstr "Descrição" +msgstr "Descrição do Uso do Calendário" #: platform/osx/export/export.cpp -#, fuzzy msgid "Photos Library Usage Description" -msgstr "Descrições da Propriedade" +msgstr "Descrição do Uso da Biblioteca de Fotos" #: platform/osx/export/export.cpp -#, fuzzy msgid "Desktop Folder Usage Description" -msgstr "Descrições do Método" +msgstr "Descrição do Uso da Pasta da Ãrea de Trabalho" #: platform/osx/export/export.cpp -#, fuzzy msgid "Documents Folder Usage Description" -msgstr "Descrições do Método" +msgstr "Descrição do Uso da Pasta de Documentos" #: platform/osx/export/export.cpp msgid "Downloads Folder Usage Description" -msgstr "" +msgstr "Descrição do Uso da Pasta de Downloads" #: platform/osx/export/export.cpp msgid "Network Volumes Usage Description" @@ -19672,23 +19588,20 @@ msgstr "Nós" #: platform/osx/export/export.cpp platform/uwp/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Identity" -msgstr "Recuar Esquerda" +msgstr "Identidade" #: platform/osx/export/export.cpp platform/windows/export/export.cpp -#, fuzzy msgid "Timestamp" -msgstr "Tempo" +msgstr "Registro do Tempo" #: platform/osx/export/export.cpp msgid "Hardened Runtime" msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "Replace Existing Signature" -msgstr "Substituir em Arquivos" +msgstr "Substituir Assinatura Existente" #: platform/osx/export/export.cpp #, fuzzy @@ -19696,9 +19609,8 @@ msgid "Entitlements" msgstr "Gizmos" #: platform/osx/export/export.cpp -#, fuzzy msgid "Custom File" -msgstr "Recortar Nós" +msgstr "Arquivo Personalizado" #: platform/osx/export/export.cpp msgid "Allow JIT Code Execution" @@ -19713,14 +19625,12 @@ msgid "Allow Dyld Environment Variables" msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "Disable Library Validation" -msgstr "Botão Desativado" +msgstr "Desativar Validação da Biblioteca" #: platform/osx/export/export.cpp -#, fuzzy msgid "Audio Input" -msgstr "Adicionar Entrada" +msgstr "Entrada de Ãudio" #: platform/osx/export/export.cpp msgid "Address Book" @@ -19731,17 +19641,14 @@ msgid "Calendars" msgstr "Calendários" #: platform/osx/export/export.cpp -#, fuzzy msgid "Photos Library" -msgstr "Exportar Biblioteca" +msgstr "Biblioteca de Fotos" #: platform/osx/export/export.cpp -#, fuzzy msgid "Apple Events" -msgstr "Adicionar VEvento" +msgstr "Eventos Apple" #: platform/osx/export/export.cpp -#, fuzzy msgid "Debugging" msgstr "Depuração" @@ -19750,28 +19657,24 @@ msgid "App Sandbox" msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "Network Server" -msgstr "Perfis de rede" +msgstr "Servidor de Rede" #: platform/osx/export/export.cpp -#, fuzzy msgid "Network Client" -msgstr "Perfis de rede" +msgstr "Cliente de Rede" #: platform/osx/export/export.cpp -#, fuzzy msgid "Device USB" -msgstr "Dispositivo" +msgstr "Dispositivo USB" #: platform/osx/export/export.cpp msgid "Device Bluetooth" msgstr "Bluetooth do Dispositivo" #: platform/osx/export/export.cpp -#, fuzzy msgid "Files Downloads" -msgstr "Baixar" +msgstr "Download de Arquivos" #: platform/osx/export/export.cpp #, fuzzy @@ -19789,9 +19692,8 @@ msgid "Files Movies" msgstr "Filtros do tile" #: platform/osx/export/export.cpp platform/windows/export/export.cpp -#, fuzzy msgid "Custom Options" -msgstr "Opções do canal" +msgstr "Opções Personalizadas" #: platform/osx/export/export.cpp #, fuzzy @@ -19800,7 +19702,7 @@ msgstr "Localização" #: platform/osx/export/export.cpp msgid "Apple ID Name" -msgstr "" +msgstr "Nome Apple ID" #: platform/osx/export/export.cpp #, fuzzy @@ -19809,7 +19711,7 @@ msgstr "Senha" #: platform/osx/export/export.cpp msgid "Apple Team ID" -msgstr "" +msgstr "ID Apple Team" #: platform/osx/export/export.cpp msgid "Could not open icon file \"%s\"." @@ -19873,23 +19775,20 @@ msgstr "" "utilidades de linha de comando do Xcode estão instaladas." #: platform/osx/export/export.cpp platform/windows/export/export.cpp -#, fuzzy msgid "No identity found." -msgstr "Ãcones não encontrados." +msgstr "Nenhuma identidade encontrada." #: platform/osx/export/export.cpp -#, fuzzy msgid "Cannot sign file %s." -msgstr "Erro ao salvar o arquivo: %s" +msgstr "Erro ao assinar arquivo %s." #: platform/osx/export/export.cpp msgid "Relative symlinks are not supported, exported \"%s\" might be broken!" msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "DMG Creation" -msgstr "Direções" +msgstr "Criação de DMG" #: platform/osx/export/export.cpp msgid "Could not start hdiutil executable." @@ -19897,11 +19796,11 @@ msgstr "Não foi possÃvel iniciar o executável hdiutil." #: platform/osx/export/export.cpp msgid "`hdiutil create` failed - file exists." -msgstr "" +msgstr "`hdiutil create` falhou - arquivo existe." #: platform/osx/export/export.cpp msgid "`hdiutil create` failed." -msgstr "" +msgstr "`hdiutil create` falhou." #: platform/osx/export/export.cpp #, fuzzy @@ -19966,9 +19865,8 @@ msgid "Sending archive for notarization" msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "ZIP Creation" -msgstr "Projeção" +msgstr "Criação de ZIP" #: platform/osx/export/export.cpp msgid "Could not open file to read from path \"%s\"." @@ -20023,6 +19921,8 @@ msgid "" "Warning: Notarization is disabled. The exported project will be blocked by " "Gatekeeper if it's downloaded from an unknown source." msgstr "" +"Aviso: Notarização está desativada. O projeto exportado será bloqueado pelo " +"Gatekeeper se for baixado de uma fonte desconhecida." #: platform/osx/export/export.cpp msgid "" @@ -20106,9 +20006,8 @@ msgid "Architecture" msgstr "Arquitetura" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Display Name" -msgstr "Exibir Tudo" +msgstr "Nome de Exibição" #: platform/uwp/export/export.cpp msgid "Short Name" @@ -20137,9 +20036,8 @@ msgid "Signing" msgstr "Sinal" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Certificate" -msgstr "Certificados" +msgstr "Certificado" #: platform/uwp/export/export.cpp msgid "Algorithm" @@ -20167,9 +20065,8 @@ msgid "Landscape" msgstr "Paisagem" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Portrait" -msgstr "Inverter Horizontalmente" +msgstr "Retrato" #: platform/uwp/export/export.cpp msgid "Landscape Flipped" @@ -20186,19 +20083,19 @@ msgstr "Modo de Escalonamento" #: platform/uwp/export/export.cpp msgid "Square 44 X 44 Logo" -msgstr "" +msgstr "Logo Quadrada 44 X 44" #: platform/uwp/export/export.cpp msgid "Square 71 X 71 Logo" -msgstr "" +msgstr "Logo Quadrada 71 X 71" #: platform/uwp/export/export.cpp msgid "Square 150 X 150 Logo" -msgstr "" +msgstr "Logo Quadrada 150 X 150" #: platform/uwp/export/export.cpp msgid "Square 310 X 310 Logo" -msgstr "" +msgstr "Logo Quadrada 310 X 310" #: platform/uwp/export/export.cpp msgid "Wide 310 X 150 Logo" @@ -20209,9 +20106,8 @@ msgid "Splash Screen" msgstr "Tela de Abertura" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Tiles" -msgstr "Arquivo" +msgstr "Tiles" #: platform/uwp/export/export.cpp msgid "Show Name On Square 150 X 150" @@ -20226,6 +20122,14 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" +"A versão Mono do Godot não suporta a plataforma UWP. Use a build padrão (sem " +"suporte a C#) se deseja exportar para UWP." + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Nome de pacote inválido." @@ -20291,9 +20195,8 @@ msgid "Debug Certificate" msgstr "" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Debug Algorithm" -msgstr "Depurador" +msgstr "Algoritmo de Depuração" #: platform/windows/export/export.cpp msgid "Failed to rename temporary file \"%s\"." @@ -20314,14 +20217,12 @@ msgid "Digest Algorithm" msgstr "Depurador" #: platform/windows/export/export.cpp -#, fuzzy msgid "Modify Resources" -msgstr "Copiar Recurso" +msgstr "Modificar Recursos" #: platform/windows/export/export.cpp -#, fuzzy msgid "File Version" -msgstr "Versão" +msgstr "Versão do Arquivo" #: platform/windows/export/export.cpp msgid "Product Version" @@ -20336,18 +20237,16 @@ msgid "Product Name" msgstr "Nome do Produto" #: platform/windows/export/export.cpp -#, fuzzy msgid "File Description" -msgstr "Descrição" +msgstr "Descrição do Arquivo" #: platform/windows/export/export.cpp msgid "Trademarks" msgstr "Marca Registrada (Trademarks)" #: platform/windows/export/export.cpp -#, fuzzy msgid "Resources Modification" -msgstr "Notificações Push" +msgstr "Modificações dos Recursos" #: platform/windows/export/export.cpp #, fuzzy @@ -20426,7 +20325,7 @@ msgstr "Versão de produto inválida:" #: platform/windows/export/export.cpp msgid "Windows executables cannot be >= 4 GiB." -msgstr "" +msgstr "Executáveis Windows não podem ser >= 4GiB." #: platform/windows/export/export.cpp platform/x11/export/export.cpp #, fuzzy @@ -20438,13 +20337,13 @@ msgid "Executable file header corrupted." msgstr "" #: platform/windows/export/export.cpp platform/x11/export/export.cpp +#, fuzzy msgid "Executable \"pck\" section not found." -msgstr "" +msgstr "Executável seção \"pck\" não encontrado." #: platform/windows/export/export.cpp -#, fuzzy msgid "Windows" -msgstr "Nova Janela" +msgstr "Windows" #: platform/windows/export/export.cpp msgid "Rcedit" @@ -20456,7 +20355,7 @@ msgstr "" #: platform/windows/export/export.cpp msgid "Wine" -msgstr "" +msgstr "Wine" #: platform/x11/export/export.cpp msgid "32-bit executables cannot have embedded data >= 4 GiB." @@ -20464,9 +20363,8 @@ msgstr "" #: scene/2d/animated_sprite.cpp scene/3d/sprite_3d.cpp #: scene/resources/texture.cpp -#, fuzzy msgid "Frames" -msgstr "Frame %" +msgstr "Quadros" #: scene/2d/animated_sprite.cpp msgid "" @@ -20478,21 +20376,18 @@ msgstr "" #: scene/2d/animated_sprite.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/particles_2d.cpp scene/3d/cpu_particles.cpp scene/3d/particles.cpp -#, fuzzy msgid "Speed Scale" -msgstr "Escala" +msgstr "Escalonamento da Velocidade" #: scene/2d/animated_sprite.cpp scene/2d/audio_stream_player_2d.cpp #: scene/3d/audio_stream_player_3d.cpp scene/3d/sprite_3d.cpp #: scene/audio/audio_stream_player.cpp -#, fuzzy msgid "Playing" -msgstr "Rodar" +msgstr "Rodando" #: scene/2d/animated_sprite.cpp scene/2d/sprite.cpp scene/3d/sprite_3d.cpp -#, fuzzy msgid "Centered" -msgstr "Centro" +msgstr "Centralizado" #: scene/2d/animated_sprite.cpp scene/2d/sprite.cpp scene/3d/sprite_3d.cpp #: scene/gui/texture_button.cpp scene/gui/texture_rect.cpp @@ -20505,14 +20400,12 @@ msgid "Flip V" msgstr "" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Monitoring" -msgstr "Monitor" +msgstr "Monitorando" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Monitorable" -msgstr "Monitor" +msgstr "Monitorável" #: scene/2d/area_2d.cpp scene/3d/area.cpp #, fuzzy @@ -20525,9 +20418,8 @@ msgid "Space Override" msgstr "Sobrescreve" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Gravity Point" -msgstr "Gerar Pontos" +msgstr "Ponto de Gravidade" #: scene/2d/area_2d.cpp scene/3d/area.cpp #, fuzzy @@ -20554,38 +20446,33 @@ msgid "Angular Damp" msgstr "" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Audio Bus" -msgstr "Adicionar Canal de Ãudio" +msgstr "Canal de Ãudio" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Override" -msgstr "Sobrescreve" +msgstr "Sobrescrever" #: scene/2d/audio_stream_player_2d.cpp scene/audio/audio_stream_player.cpp #: scene/gui/video_player.cpp servers/audio/effects/audio_effect_amplify.cpp -#, fuzzy msgid "Volume dB" -msgstr "Volume" +msgstr "Volume dB (decibéis)" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp #: servers/audio/effects/audio_effect_pitch_shift.cpp -#, fuzzy msgid "Pitch Scale" -msgstr "Escala" +msgstr "Escalonamento de Pitch" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp -#, fuzzy msgid "Autoplay" -msgstr "Alternar InÃcio Automático" +msgstr "Rodar automaticamente" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp msgid "Stream Paused" -msgstr "" +msgstr "Fluxo Pausado" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/3d/light.cpp scene/3d/reflection_probe.cpp @@ -20601,23 +20488,20 @@ msgstr "Animação" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp -#, fuzzy msgid "Bus" -msgstr "Adicionar Canal" +msgstr "Canal" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp msgid "Area Mask" msgstr "" #: scene/2d/back_buffer_copy.cpp -#, fuzzy msgid "Copy Mode" -msgstr "Copiar Nós" +msgstr "Mode de Cópia" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "Anchor Mode" -msgstr "Modo Ãcone" +msgstr "Modo de Âncora" #: scene/2d/camera_2d.cpp msgid "Rotating" @@ -20629,9 +20513,8 @@ msgid "Current" msgstr "Atual" #: scene/2d/camera_2d.cpp scene/gui/graph_edit.cpp -#, fuzzy msgid "Zoom" -msgstr "Ampliar" +msgstr "Zoom" #: scene/2d/camera_2d.cpp scene/main/canvas_layer.cpp #, fuzzy @@ -20651,27 +20534,23 @@ msgstr "Limite" #: scene/2d/camera_2d.cpp scene/gui/control.cpp scene/gui/nine_patch_rect.cpp #: scene/resources/style_box.cpp scene/resources/texture.cpp -#, fuzzy msgid "Left" -msgstr "Esquerda (UI)" +msgstr "Esquerda" #: scene/2d/camera_2d.cpp scene/gui/control.cpp scene/gui/nine_patch_rect.cpp #: scene/resources/style_box.cpp scene/resources/texture.cpp -#, fuzzy msgid "Right" -msgstr "Luz" +msgstr "Direita" #: scene/2d/camera_2d.cpp scene/gui/control.cpp scene/gui/nine_patch_rect.cpp #: scene/resources/dynamic_font.cpp scene/resources/style_box.cpp #: scene/resources/texture.cpp -#, fuzzy msgid "Bottom" -msgstr "Inferior Esquerda" +msgstr "Embaixo" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "Smoothed" -msgstr "Passo suave" +msgstr "Suavizado" #: scene/2d/camera_2d.cpp #, fuzzy @@ -20689,9 +20568,8 @@ msgid "Drag Margin V Enabled" msgstr "Definir Margem" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "Smoothing" -msgstr "Passo suave" +msgstr "Suavizamento" #: scene/2d/camera_2d.cpp msgid "H" @@ -20732,9 +20610,8 @@ msgid "Light Mode" msgstr "Largura Direita" #: scene/2d/canvas_item.cpp -#, fuzzy msgid "Particles Animation" -msgstr "PartÃculas" +msgstr "Animação de PartÃculas" #: scene/2d/canvas_item.cpp msgid "Particles Anim H Frames" @@ -20750,15 +20627,13 @@ msgid "Particles Anim Loop" msgstr "PartÃculas" #: scene/2d/canvas_item.cpp scene/3d/spatial.cpp -#, fuzzy msgid "Visibility" -msgstr "Alternar Visibilidade" +msgstr "Visibilidade" #: scene/2d/canvas_item.cpp scene/3d/spatial.cpp scene/gui/progress_bar.cpp #: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp -#, fuzzy msgid "Visible" -msgstr "Alternar Visibilidade" +msgstr "VisÃvel" #: scene/2d/canvas_item.cpp #, fuzzy @@ -20767,22 +20642,20 @@ msgstr "Popular" #: scene/2d/canvas_item.cpp msgid "Show Behind Parent" -msgstr "" +msgstr "Mostrar Atrás do Pai" #: scene/2d/canvas_item.cpp -#, fuzzy msgid "Show On Top" -msgstr "Mostrar Origem" +msgstr "Mostrar Em Cima" #: scene/2d/canvas_item.cpp scene/2d/light_occluder_2d.cpp #: scene/2d/tile_map.cpp -#, fuzzy msgid "Light Mask" -msgstr "Luz" +msgstr "Máscara de Luz" #: scene/2d/canvas_item.cpp msgid "Use Parent Material" -msgstr "" +msgstr "Usar Material do Pai" #: scene/2d/canvas_modulate.cpp msgid "" @@ -20805,9 +20678,8 @@ msgstr "" "para definir sua forma." #: scene/2d/collision_object_2d.cpp -#, fuzzy msgid "Pickable" -msgstr "Escolher Tile" +msgstr "Pegável" #: scene/2d/collision_polygon_2d.cpp msgid "" @@ -20849,9 +20721,8 @@ msgstr "Modo de Régua" #: scene/3d/collision_polygon.cpp scene/3d/collision_shape.cpp #: scene/animation/animation_node_state_machine.cpp scene/gui/base_button.cpp #: scene/gui/texture_button.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Disabled" -msgstr "Item Desativado" +msgstr "Desativado" #: scene/2d/collision_polygon_2d.cpp scene/2d/collision_shape_2d.cpp #, fuzzy @@ -20935,9 +20806,8 @@ msgstr "" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp -#, fuzzy msgid "Fixed FPS" -msgstr "Ver FPS" +msgstr "FPS Fixado" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp @@ -20951,9 +20821,8 @@ msgstr "Desenhando" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp -#, fuzzy msgid "Local Coords" -msgstr "Projetos Locais" +msgstr "Coordenadas Locais" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp @@ -20962,9 +20831,8 @@ msgstr "Ordem de Desenho" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Emission Shape" -msgstr "Máscara de Emissão" +msgstr "Forma de Emissão" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -20977,9 +20845,8 @@ msgid "Rect Extents" msgstr "Gizmos" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp -#, fuzzy msgid "Normals" -msgstr "Formato" +msgstr "Normais" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -20989,9 +20856,8 @@ msgstr "Atribuir" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Direction" -msgstr "Direções" +msgstr "Direção" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21001,15 +20867,13 @@ msgstr "Espalhar" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Initial Velocity" -msgstr "Inicializar" +msgstr "Velocidade Inicial" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Velocity Random" -msgstr "Velocidade" +msgstr "Velocidade Aleatória" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp servers/physics_2d_server.cpp @@ -21019,48 +20883,43 @@ msgstr "Velocidade Angular" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Velocity Curve" -msgstr "Velocidade" +msgstr "Curva de Velocidade" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Orbit Velocity" -msgstr "Orbitar Visão para a Direita" +msgstr "Velocidade Orbital" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Linear Accel" -msgstr "Linear" +msgstr "Aceleração Linear" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Accel" -msgstr "Acesso" +msgstr "Aceleração" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Accel Random" -msgstr "" +msgstr "Aceleração Aleatória" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Accel Curve" -msgstr "Dvidir Curva" +msgstr "Curva de Aceleração" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Radial Accel" -msgstr "" +msgstr "Aceleração Radial" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Tangential Accel" -msgstr "" +msgstr "Aceleração Tangencial" #: scene/2d/cpu_particles_2d.cpp scene/2d/joints_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/physics_body.cpp @@ -21089,13 +20948,12 @@ msgstr "Ângulo" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Angle Random" -msgstr "" +msgstr "Ângulo Aleatório" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Angle Curve" -msgstr "Fechar Curva" +msgstr "Curva do Ângulo" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp msgid "Scale Amount" @@ -21143,15 +21001,13 @@ msgstr "Curva de Variação" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Speed Random" -msgstr "Escala" +msgstr "Velocidade Aleatória" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Speed Curve" -msgstr "Dvidir Curva" +msgstr "Curva de Velocidade" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21199,9 +21055,8 @@ msgid "Bias" msgstr "" #: scene/2d/joints_2d.cpp -#, fuzzy msgid "Disable Collision" -msgstr "Botão Desativado" +msgstr "Desativar Colisão" #: scene/2d/joints_2d.cpp scene/3d/physics_body.cpp scene/3d/physics_joint.cpp msgid "Softness" @@ -21238,9 +21093,8 @@ msgid "Editor Only" msgstr "Editor" #: scene/2d/light_2d.cpp -#, fuzzy msgid "Texture Scale" -msgstr "Região da Textura" +msgstr "Escalonamento da Textura" #: scene/2d/light_2d.cpp scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp #: scene/3d/light.cpp scene/resources/environment.cpp @@ -21271,9 +21125,8 @@ msgid "Item Cull Mask" msgstr "" #: scene/2d/light_2d.cpp scene/3d/light.cpp scene/resources/style_box.cpp -#, fuzzy msgid "Shadow" -msgstr "Shader" +msgstr "Sombra" #: scene/2d/light_2d.cpp #, fuzzy @@ -21281,9 +21134,8 @@ msgid "Buffer Size" msgstr "Visão Traseira" #: scene/2d/light_2d.cpp -#, fuzzy msgid "Gradient Length" -msgstr "Gradiente Editado" +msgstr "Comprimento do Gradiente" #: scene/2d/light_2d.cpp #, fuzzy @@ -21291,9 +21143,8 @@ msgid "Filter Smooth" msgstr "Filtrar métodos" #: scene/2d/light_occluder_2d.cpp -#, fuzzy msgid "Closed" -msgstr "Fechar" +msgstr "Fechado" #: scene/2d/light_occluder_2d.cpp scene/resources/material.cpp #, fuzzy @@ -21313,28 +21164,24 @@ msgstr "" "O polÃgono para este oclusor está vazio. Por favor desenhe um polÃgono." #: scene/2d/line_2d.cpp -#, fuzzy msgid "Width Curve" -msgstr "Dvidir Curva" +msgstr "Largura da Curva" #: scene/2d/line_2d.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Default Color" -msgstr "Padrão" +msgstr "Cor Padrão" #: scene/2d/line_2d.cpp scene/resources/texture.cpp msgid "Fill" msgstr "Preencher" #: scene/2d/line_2d.cpp scene/resources/texture.cpp -#, fuzzy msgid "Gradient" -msgstr "Gradiente Editado" +msgstr "Gradiente" #: scene/2d/line_2d.cpp -#, fuzzy msgid "Texture Mode" -msgstr "Região da Textura" +msgstr "Modo de Textura" #: scene/2d/line_2d.cpp msgid "Capping" @@ -21364,7 +21211,7 @@ msgstr "" #: scene/2d/line_2d.cpp msgid "Round Precision" -msgstr "" +msgstr "Precisão do Arredondamento" #: scene/2d/line_2d.cpp scene/2d/polygon_2d.cpp #: scene/resources/dynamic_font.cpp @@ -21548,7 +21395,6 @@ msgid "Mirroring" msgstr "Espelhar" #: scene/2d/particles_2d.cpp -#, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" "Use the CPUParticles2D node instead. You can use the \"Convert to " @@ -21594,9 +21440,8 @@ msgstr "" #: scene/2d/path_2d.cpp scene/3d/path.cpp scene/resources/sky.cpp #: scene/resources/texture.cpp -#, fuzzy msgid "Curve" -msgstr "Dvidir Curva" +msgstr "Curva" #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." @@ -21624,9 +21469,8 @@ msgid "Lookahead" msgstr "" #: scene/2d/physics_body_2d.cpp scene/3d/visual_instance.cpp -#, fuzzy msgid "Layers" -msgstr "Camada" +msgstr "Camadas" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Constant Linear Velocity" @@ -21638,9 +21482,8 @@ msgstr "Velocidade Angular Constante" #: scene/2d/physics_body_2d.cpp scene/2d/tile_map.cpp scene/3d/physics_body.cpp #: scene/resources/physics_material.cpp -#, fuzzy msgid "Friction" -msgstr "Funções" +msgstr "Fricção" #: scene/2d/physics_body_2d.cpp scene/2d/tile_map.cpp scene/3d/physics_body.cpp #: scene/resources/physics_material.cpp @@ -21653,9 +21496,8 @@ msgstr "" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Default Gravity" -msgstr "Prévia Padrão" +msgstr "Gravidade Padrão" #: scene/2d/physics_body_2d.cpp msgid "" @@ -21676,13 +21518,12 @@ msgid "Inertia" msgstr "Inércia" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Weight" -msgstr "Luz" +msgstr "Peso" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Gravity Scale" -msgstr "" +msgstr "Escala da Gravidade" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Custom Integrator" @@ -21722,7 +21563,7 @@ msgstr "Angular" #: scene/2d/physics_body_2d.cpp msgid "Applied Forces" -msgstr "" +msgstr "Forças Aplicadas" #: scene/2d/physics_body_2d.cpp msgid "Torque" @@ -21750,56 +21591,49 @@ msgstr "Aplicar Velocidade ao Sair" #: scene/3d/physics_body.cpp scene/gui/texture_button.cpp #: scene/resources/default_theme/default_theme.cpp #: scene/resources/line_shape_2d.cpp scene/resources/material.cpp -#, fuzzy msgid "Normal" -msgstr "Formato" +msgstr "Normal" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Remainder" msgstr "Restante" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Local Shape" -msgstr "Localizar" +msgstr "Forma Local" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collider" -msgstr "Modo Colisão" +msgstr "Colisor" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Collider ID" -msgstr "" +msgstr "ID do Colisor" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collider RID" -msgstr "RID inválido" +msgstr "RID do Colisor" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collider Shape" -msgstr "Modo Colisão" +msgstr "Forma do Colisor" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Collider Shape Index" -msgstr "Modo Colisão" +msgstr "Ãndice da Forma do Colisor" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collider Velocity" -msgstr "Orbitar Visão para a Direita" +msgstr "Velocidade do Colisor" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Collider Metadata" -msgstr "" +msgstr "Metadados do Colisor" #: scene/2d/polygon_2d.cpp msgid "Invert" @@ -21822,7 +21656,7 @@ msgstr "Gizmos" #: scene/2d/ray_cast_2d.cpp scene/3d/ray_cast.cpp msgid "Exclude Parent" -msgstr "" +msgstr "Excluir Pai" #: scene/2d/ray_cast_2d.cpp scene/3d/ray_cast.cpp #, fuzzy @@ -21848,14 +21682,12 @@ msgstr "" "funcionar." #: scene/2d/remote_transform_2d.cpp scene/3d/remote_transform.cpp -#, fuzzy msgid "Remote Path" -msgstr "Remover Ponto" +msgstr "Remover Caminho" #: scene/2d/remote_transform_2d.cpp scene/3d/remote_transform.cpp -#, fuzzy msgid "Use Global Coordinates" -msgstr "Próxima Coordenada" +msgstr "Usar Coordenadas Globais" #: scene/2d/skeleton_2d.cpp scene/3d/skeleton.cpp #, fuzzy @@ -21910,14 +21742,12 @@ msgstr "" "KinematicBody2D, etc. para dar-lhes uma forma." #: scene/2d/tile_map.cpp -#, fuzzy msgid "Tile Set" -msgstr "Conjunto de Telha" +msgstr "Tile Set" #: scene/2d/tile_map.cpp -#, fuzzy msgid "Quadrant Size" -msgstr "Alterar Tamanho da Câmera" +msgstr "Tamanho do Quadrante" #: scene/2d/tile_map.cpp #, fuzzy @@ -21930,9 +21760,8 @@ msgid "Half Offset" msgstr "Inicializar" #: scene/2d/tile_map.cpp -#, fuzzy msgid "Tile Origin" -msgstr "Ver Origem" +msgstr "Origem do Tile" #: scene/2d/tile_map.cpp #, fuzzy @@ -21957,7 +21786,7 @@ msgstr "" #: scene/2d/tile_map.cpp msgid "Use Parent" -msgstr "" +msgstr "Usar Pai" #: scene/2d/tile_map.cpp msgid "Use Kinematic" @@ -21965,20 +21794,19 @@ msgstr "" #: scene/2d/touch_screen_button.cpp msgid "Shape Centered" -msgstr "" +msgstr "Forma Centralizada" #: scene/2d/touch_screen_button.cpp msgid "Shape Visible" -msgstr "" +msgstr "Forma VisÃvel" #: scene/2d/touch_screen_button.cpp msgid "Passby Press" msgstr "" #: scene/2d/touch_screen_button.cpp -#, fuzzy msgid "Visibility Mode" -msgstr "Modo Prioridade" +msgstr "Modo de Visibilidade" #: scene/2d/visibility_notifier_2d.cpp msgid "" @@ -21989,23 +21817,20 @@ msgstr "" "diretamente como pai." #: scene/2d/visibility_notifier_2d.cpp scene/3d/visibility_notifier.cpp -#, fuzzy msgid "Pause Animations" -msgstr "Colar Animação" +msgstr "Pausar Animações" #: scene/2d/visibility_notifier_2d.cpp scene/3d/visibility_notifier.cpp msgid "Freeze Bodies" -msgstr "" +msgstr "Congelar Corpos" #: scene/2d/visibility_notifier_2d.cpp -#, fuzzy msgid "Pause Particles" -msgstr "PartÃculas" +msgstr "Pausar PartÃculas" #: scene/2d/visibility_notifier_2d.cpp -#, fuzzy msgid "Pause Animated Sprites" -msgstr "Colar Animação" +msgstr "Pausar Sprites Animados" #: scene/2d/visibility_notifier_2d.cpp #, fuzzy @@ -22035,7 +21860,7 @@ msgstr "" #: scene/3d/arvr_nodes.cpp servers/arvr/arvr_positional_tracker.cpp msgid "Rumble" -msgstr "" +msgstr "Vibrar" #: scene/3d/arvr_nodes.cpp msgid "ARVRController must have an ARVROrigin node as its parent." @@ -22120,14 +21945,12 @@ msgstr "" #: scene/3d/audio_stream_player_3d.cpp #: servers/audio/effects/audio_effect_filter.cpp -#, fuzzy msgid "dB" -msgstr "B" +msgstr "dB" #: scene/3d/audio_stream_player_3d.cpp -#, fuzzy msgid "Doppler" -msgstr "Ativar Doppler" +msgstr "Doppler" #: scene/3d/audio_stream_player_3d.cpp #, fuzzy @@ -22191,9 +22014,8 @@ msgid "Use HDR" msgstr "Usar HDR" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Use Color" -msgstr "Cores" +msgstr "Usar Cor" #: scene/3d/baked_lightmap.cpp #, fuzzy @@ -22205,32 +22027,28 @@ msgid "Atlas" msgstr "Atlas" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Generate" -msgstr "Geral" +msgstr "Gerar" #: scene/3d/baked_lightmap.cpp msgid "Max Size" msgstr "Tamanho Máximo" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Custom Sky" -msgstr "Recortar Nós" +msgstr "Céu Personalizado" #: scene/3d/baked_lightmap.cpp msgid "Custom Sky Rotation Degrees" msgstr "Graus de Rotação do Céu Personalizados" #: scene/3d/baked_lightmap.cpp scene/3d/ray_cast.cpp -#, fuzzy msgid "Custom Color" -msgstr "Recortar Nós" +msgstr "Cor Personalizada" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Custom Energy" -msgstr "Mover Efeito de Canal" +msgstr "Energia Personalizada" #: scene/3d/baked_lightmap.cpp #, fuzzy @@ -22406,28 +22224,24 @@ msgid "Ring Axis" msgstr "Avisos" #: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp -#, fuzzy msgid "Rotate Y" -msgstr "Rotacionar" +msgstr "Rotacionar em Y" #: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp -#, fuzzy msgid "Disable Z" -msgstr "Item Desativado" +msgstr "Desativar Z" #: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp msgid "Flatness" msgstr "" #: scene/3d/cull_instance.cpp servers/visual_server.cpp -#, fuzzy msgid "Portals" -msgstr "Inverter Horizontalmente" +msgstr "Portais" #: scene/3d/cull_instance.cpp -#, fuzzy msgid "Portal Mode" -msgstr "Modo Prioridade" +msgstr "Modo Portal" #: scene/3d/cull_instance.cpp msgid "Include In Bound" @@ -22482,9 +22296,8 @@ msgstr "" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp #: scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Pixel Size" -msgstr "Snap de Pixel" +msgstr "Tamanho de Pixel" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp msgid "Billboard" @@ -22505,9 +22318,8 @@ msgid "No Depth Test" msgstr "" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/material.cpp -#, fuzzy msgid "Fixed Size" -msgstr "Visão Frontal" +msgstr "Tamanho Fixo" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp msgid "Alpha Cut" @@ -22534,18 +22346,16 @@ msgstr "Forçar Módulo Branco" #: scene/3d/label_3d.cpp scene/resources/default_theme/default_theme.cpp #: scene/resources/dynamic_font.cpp scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Font" -msgstr "Fontes" +msgstr "Fonte" #: scene/3d/label_3d.cpp scene/resources/primitive_meshes.cpp msgid "Horizontal Alignment" msgstr "Alinhamento Horizontal" #: scene/3d/label_3d.cpp -#, fuzzy msgid "Vertical Alignment" -msgstr "Filtrar sinais" +msgstr "Alinhamento Vertical" #: scene/3d/label_3d.cpp scene/gui/dialogs.cpp scene/gui/label.cpp #, fuzzy @@ -22553,9 +22363,8 @@ msgid "Autowrap" msgstr "AutoLoad" #: scene/3d/light.cpp -#, fuzzy msgid "Indirect Energy" -msgstr "Cores de Emissão" +msgstr "Energia Indireta" #: scene/3d/light.cpp msgid "Negative" @@ -22631,7 +22440,7 @@ msgstr "Um SpotLight com um ângulo maior que 90 graus não pode criar sombras." #: scene/3d/light.cpp msgid "Spot" -msgstr "" +msgstr "Ponto" #: scene/3d/light.cpp msgid "Angle Attenuation" @@ -22669,9 +22478,8 @@ msgid "Agent Height Offset" msgstr "" #: scene/3d/navigation_agent.cpp -#, fuzzy msgid "Ignore Y" -msgstr "(Ignore)" +msgstr "Ignorar Y" #: scene/3d/navigation_agent.cpp msgid "" @@ -22679,9 +22487,8 @@ msgid "" msgstr "" #: scene/3d/navigation_mesh_instance.cpp scene/resources/mesh_library.cpp -#, fuzzy msgid "NavMesh" -msgstr "Bake NavMesh" +msgstr "NavMesh" #: scene/3d/navigation_obstacle.cpp msgid "" @@ -22698,7 +22505,6 @@ msgid "Only uniform scales are supported." msgstr "Apenas escalas uniformes são suportadas." #: scene/3d/particles.cpp -#, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" "Use the CPUParticles node instead. You can use the \"Convert to " @@ -22731,9 +22537,8 @@ msgstr "" "Billboard está definido como \"Particle Billboard\"." #: scene/3d/particles.cpp -#, fuzzy msgid "Visibility AABB" -msgstr "Alternar Visibilidade" +msgstr "Visibilidade AABB" #: scene/3d/particles.cpp msgid "Draw Passes" @@ -22756,7 +22561,6 @@ msgstr "" "no recurso de Curva do Caminho do seu pai." #: scene/3d/path.cpp -#, fuzzy msgid "Rotation Mode" msgstr "Modo de Rotação" @@ -22776,31 +22580,28 @@ msgid "Axis Lock" msgstr "Eixo" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear X" -msgstr "Linear" +msgstr "X Linear" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear Y" -msgstr "Linear" +msgstr "Y Linear" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear Z" -msgstr "Linear" +msgstr "Z Linear" #: scene/3d/physics_body.cpp msgid "Angular X" -msgstr "" +msgstr "X Angular" #: scene/3d/physics_body.cpp msgid "Angular Y" -msgstr "" +msgstr "Y Angular" #: scene/3d/physics_body.cpp msgid "Angular Z" -msgstr "" +msgstr "Z Angular" #: scene/3d/physics_body.cpp #, fuzzy @@ -22841,9 +22642,8 @@ msgid "Relaxation" msgstr "Relaxamento" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Angular Limit Enabled" -msgstr "Filtrar sinais" +msgstr "Limite Angular Habilitado" #: scene/3d/physics_body.cpp #, fuzzy @@ -22918,9 +22718,8 @@ msgid "Z" msgstr "Z" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear Limit Enabled" -msgstr "Linear" +msgstr "Limite Linear Habilitado" #: scene/3d/physics_body.cpp #, fuzzy @@ -22938,9 +22737,8 @@ msgid "Linear Spring Damping" msgstr "Linear" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear Equilibrium Point" -msgstr "Linear" +msgstr "Ponto de EquilÃbrio Linear" #: scene/3d/physics_body.cpp #, fuzzy @@ -22964,7 +22762,7 @@ msgstr "Animação" #: scene/3d/physics_body.cpp scene/3d/physics_joint.cpp msgid "ERP" -msgstr "" +msgstr "ERP" #: scene/3d/physics_body.cpp #, fuzzy @@ -22981,7 +22779,7 @@ msgstr "" #: scene/3d/physics_body.cpp msgid "Angular Equilibrium Point" -msgstr "" +msgstr "Ponto de EquilÃbrio Angular" #: scene/3d/physics_body.cpp msgid "Body Offset" @@ -22989,11 +22787,11 @@ msgstr "Deslocamento do Corpo" #: scene/3d/physics_joint.cpp msgid "Node A and Node B must be PhysicsBodies" -msgstr "Nó A e Nó B devem ser PhysicsBodys" +msgstr "Nó A e Nó B devem ser PhysicsBodies" #: scene/3d/physics_joint.cpp msgid "Node A must be a PhysicsBody" -msgstr "Nó A deve ser PhysicsBody" +msgstr "Nó A deve ser um PhysicsBody" #: scene/3d/physics_joint.cpp msgid "Node B must be a PhysicsBody" @@ -23005,14 +22803,13 @@ msgstr "A junta não está conectada a nenhum PhysicsBody" #: scene/3d/physics_joint.cpp msgid "Node A and Node B must be different PhysicsBodies" -msgstr "Nó A e Nó B devem ser diferente PhysicsBodies" +msgstr "Nó A e Nó B devem ser diferentes PhysicsBodies" #: scene/3d/physics_joint.cpp msgid "Solver" msgstr "" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Exclude Nodes" msgstr "Excluir Nós" @@ -23022,7 +22819,7 @@ msgstr "Parâmetros" #: scene/3d/physics_joint.cpp msgid "Angular Limit" -msgstr "" +msgstr "Limite Angular" #: scene/3d/physics_joint.cpp #, fuzzy @@ -23048,9 +22845,8 @@ msgid "Max Impulse" msgstr "Impulso Máximo" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Linear Limit" -msgstr "Linear" +msgstr "Limite Linear" #: scene/3d/physics_joint.cpp msgid "Upper Distance" @@ -23115,7 +22911,7 @@ msgstr "Linear" #: scene/3d/physics_joint.cpp msgid "Equilibrium Point" -msgstr "" +msgstr "Ponto de EquilÃbrio" #: scene/3d/physics_joint.cpp msgid "Angular Limit X" @@ -23213,9 +23009,8 @@ msgid "Use Default Margin" msgstr "Padrão" #: scene/3d/proximity_group.cpp -#, fuzzy msgid "Group Name" -msgstr "Agrupado" +msgstr "Nome do Grupo" #: scene/3d/proximity_group.cpp msgid "Dispatch Mode" @@ -23249,19 +23044,16 @@ msgid "Box Projection" msgstr "Projeto" #: scene/3d/reflection_probe.cpp -#, fuzzy msgid "Enable Shadows" -msgstr "Ativar Snap" +msgstr "Habilitar Sombras" #: scene/3d/reflection_probe.cpp -#, fuzzy msgid "Ambient Color" -msgstr "Escolher Cor" +msgstr "Cor Ambiente" #: scene/3d/reflection_probe.cpp -#, fuzzy msgid "Ambient Energy" -msgstr "Cores de Emissão" +msgstr "Energia Ambiente" #: scene/3d/reflection_probe.cpp #, fuzzy @@ -23335,7 +23127,7 @@ msgstr "" #: scene/3d/room_manager.cpp msgid "There should only be one RoomManager in the SceneTree." -msgstr "Só Deve existir um RoomManager na SceneTree." +msgstr "Só deve existir um RoomManager na SceneTree." #: scene/3d/room_manager.cpp msgid "Main" @@ -23345,32 +23137,28 @@ msgstr "Principal" #: scene/animation/animation_player.cpp scene/animation/animation_tree.cpp #: scene/animation/animation_tree_player.cpp #: servers/audio/effects/audio_effect_delay.cpp -#, fuzzy msgid "Active" -msgstr "Ação" +msgstr "Ativo" #: scene/3d/room_manager.cpp msgid "Roomlist" msgstr "" #: scene/3d/room_manager.cpp servers/visual_server.cpp -#, fuzzy msgid "PVS" -msgstr "FPS" +msgstr "PVS" #: scene/3d/room_manager.cpp -#, fuzzy msgid "PVS Mode" -msgstr "Modo Panorâmico" +msgstr "Modo PVS" #: scene/3d/room_manager.cpp -#, fuzzy msgid "PVS Filename" -msgstr "Arquivo ZIP" +msgstr "Nome do Arquivo PVS" #: scene/3d/room_manager.cpp servers/visual_server.cpp msgid "Gameplay" -msgstr "" +msgstr "Jogabilidade" #: scene/3d/room_manager.cpp #, fuzzy @@ -23378,19 +23166,16 @@ msgid "Gameplay Monitor" msgstr "Monitor" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Use Secondary PVS" -msgstr "Usar Encaixe Escalar" +msgstr "Usar PVS Secundário" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Merge Meshes" -msgstr "Malha" +msgstr "Mesclar Malhas" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Show Margins" -msgstr "Mostrar Origem" +msgstr "Mostrar Margens" #: scene/3d/room_manager.cpp #, fuzzy @@ -23411,9 +23196,8 @@ msgid "Portal Depth Limit" msgstr "" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Default Portal Margin" -msgstr "Definir Margem" +msgstr "Margem Padrão de Portal" #: scene/3d/room_manager.cpp #, fuzzy @@ -23499,9 +23283,8 @@ msgid "Spatial Attachment Path" msgstr "" #: scene/3d/soft_body.cpp -#, fuzzy msgid "Physics Enabled" -msgstr "Frame de FÃsica %" +msgstr "FÃsica Ativada" #: scene/3d/soft_body.cpp #, fuzzy @@ -23530,7 +23313,7 @@ msgstr "" #: scene/3d/soft_body.cpp msgid "Pressure Coefficient" -msgstr "" +msgstr "Coeficiente de Pressão" #: scene/3d/soft_body.cpp msgid "Damping Coefficient" @@ -23559,18 +23342,16 @@ msgstr "" "Altere o tamanho em formas de colisão de crianças." #: scene/3d/spatial.cpp -#, fuzzy msgid "Global Translation" -msgstr "Manter Transformação Global" +msgstr "Transformação Global" #: scene/3d/spatial.cpp msgid "Matrix" msgstr "Matriz" #: scene/3d/spatial.cpp -#, fuzzy msgid "Gizmo" -msgstr "Gizmos" +msgstr "Gizmo" #: scene/3d/spatial_velocity_tracker.cpp #, fuzzy @@ -23611,13 +23392,12 @@ msgid "Per-Wheel Motion" msgstr "Roda para Baixo" #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Engine Force" -msgstr "Documentação Online" +msgstr "Força do Motor" #: scene/3d/vehicle_body.cpp msgid "Brake" -msgstr "" +msgstr "Freio" #: scene/3d/vehicle_body.cpp msgid "Steering" @@ -23649,9 +23429,8 @@ msgid "Friction Slip" msgstr "Funções" #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Suspension" -msgstr "Expressão" +msgstr "Suspensão" #: scene/3d/vehicle_body.cpp #, fuzzy @@ -23660,12 +23439,11 @@ msgstr "Erro" #: scene/3d/visibility_notifier.cpp msgid "AABB" -msgstr "" +msgstr "AABB" #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Geometry" -msgstr "Tentar Novamente" +msgstr "Geometria" #: scene/3d/visual_instance.cpp #, fuzzy @@ -23701,7 +23479,7 @@ msgstr "" #: scene/3d/visual_instance.cpp msgid "LOD" -msgstr "" +msgstr "LOD (NÃvel de Detalhe)" #: scene/3d/visual_instance.cpp scene/animation/skeleton_ik.cpp #: scene/resources/material.cpp @@ -24455,7 +24233,7 @@ msgstr "Carregar como Substituto" #: scene/gui/line_edit.cpp msgid "Alpha" -msgstr "" +msgstr "Alfa" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Caret" @@ -24629,7 +24407,7 @@ msgstr "Caractere" #: scene/gui/rich_text_label.cpp msgid "BBCode" -msgstr "" +msgstr "BBCode" #: scene/gui/rich_text_label.cpp msgid "Meta Underlined" @@ -25008,7 +24786,7 @@ msgstr "Separador Nomeado" #: scene/main/node.cpp msgid "Name Casing" -msgstr "" +msgstr "Capitalização do Nome" #: scene/main/node.cpp #, fuzzy @@ -25021,9 +24799,8 @@ msgid "Pause Mode" msgstr "Modo Panorâmico" #: scene/main/node.cpp -#, fuzzy msgid "Physics Interpolation Mode" -msgstr "Modo de Interpolação" +msgstr "Modo de Interpolação da FÃsica" #: scene/main/node.cpp #, fuzzy @@ -25091,7 +24868,7 @@ msgstr "Formas" #: scene/main/scene_tree.cpp msgid "Shape Color" -msgstr "" +msgstr "Cor da Forma" #: scene/main/scene_tree.cpp #, fuzzy @@ -25100,7 +24877,7 @@ msgstr "Escolher Cor" #: scene/main/scene_tree.cpp msgid "Geometry Color" -msgstr "" +msgstr "Cor da Geometria" #: scene/main/scene_tree.cpp #, fuzzy @@ -25149,9 +24926,8 @@ msgid "Use 32 BPC Depth" msgstr "" #: scene/main/scene_tree.cpp -#, fuzzy msgid "Default Environment" -msgstr "Visualizar Ambiente" +msgstr "Ambiente Padrão" #: scene/main/scene_tree.cpp msgid "" @@ -25227,9 +25003,8 @@ msgid "World 2D" msgstr "Mundo 2D" #: scene/main/viewport.cpp -#, fuzzy msgid "Transparent BG" -msgstr "Transpor" +msgstr "Fundo Transparente" #: scene/main/viewport.cpp #, fuzzy @@ -25256,7 +25031,6 @@ msgid "Keep 3D Linear" msgstr "Linear Esquerda" #: scene/main/viewport.cpp -#, fuzzy msgid "Render Direct To Screen" msgstr "Renderizar Diretamente para a Tela" @@ -25573,7 +25347,7 @@ msgstr "Cena Principal" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "BG" -msgstr "B" +msgstr "Plano de Fundo" #: scene/resources/default_theme/default_theme.cpp msgid "FG" @@ -25834,7 +25608,7 @@ msgstr "Selecionar" #: scene/resources/default_theme/default_theme.cpp msgid "Cursor Unfocused" -msgstr "" +msgstr "Cursor Desfocado" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25954,7 +25728,7 @@ msgstr "Guia 1" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Tab BG" -msgstr "Guia 1" +msgstr "Plano de Fundo da Aba" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26062,9 +25836,8 @@ msgid "Color Sample" msgstr "Cores" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Preset BG" -msgstr "Predefinição" +msgstr "Fundo Predefinido" #: scene/resources/default_theme/default_theme.cpp msgid "Overbright Indicator" @@ -26076,9 +25849,8 @@ msgid "Preset FG" msgstr "Predefinição" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Preset BG Icon" -msgstr "Predefinição" +msgstr "Ãcone de Fundo Predefinido" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26231,7 +26003,7 @@ msgstr "Com Dados" #: scene/resources/environment.cpp msgid "Background" -msgstr "" +msgstr "Plano de Fundo" #: scene/resources/environment.cpp scene/resources/sky.cpp msgid "Sky" @@ -26583,7 +26355,7 @@ msgstr "" #: scene/resources/material.cpp msgid "Do Not Receive Shadows" -msgstr "" +msgstr "Não Receber Sombras" #: scene/resources/material.cpp #, fuzzy @@ -26843,7 +26615,7 @@ msgstr "Instância" #: scene/resources/multimesh.cpp msgid "Visible Instance Count" -msgstr "" +msgstr "Quantidade de Instâncias VisÃveis" #: scene/resources/navigation_mesh.cpp msgid "Sampling" @@ -26903,7 +26675,7 @@ msgstr "Erro" #: scene/resources/navigation_mesh.cpp msgid "Verts Per Poly" -msgstr "" +msgstr "Vértices Por PolÃgono" #: scene/resources/navigation_mesh.cpp #, fuzzy @@ -26943,7 +26715,7 @@ msgstr "Deslocamento Base" #: scene/resources/occluder_shape.cpp msgid "Spheres" -msgstr "" +msgstr "Esferas" #: scene/resources/occluder_shape.cpp msgid "OccluderShapeSphere Set Spheres" @@ -27390,11 +27162,11 @@ msgstr "Margem de Ligação da Borda" #: scene/resources/world_2d.cpp msgid "Canvas" -msgstr "" +msgstr "Canvas" #: servers/arvr/arvr_interface.cpp msgid "Is Primary" -msgstr "" +msgstr "É Principal" #: servers/arvr/arvr_interface.cpp #, fuzzy @@ -27431,7 +27203,7 @@ msgstr "" #: servers/audio/effects/audio_effect_chorus.cpp msgid "Voice Count" -msgstr "" +msgstr "Quantidade de Vozes" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_delay.cpp @@ -27610,9 +27382,8 @@ msgid "Enable Audio Input" msgstr "Renomear Canal de Ãudio" #: servers/audio_server.cpp -#, fuzzy msgid "Output Latency" -msgstr "SaÃda" +msgstr "Latência de SaÃda" #: servers/audio_server.cpp msgid "Channel Disable Threshold dB" @@ -27661,7 +27432,7 @@ msgstr "" #: servers/physics/space_sw.cpp servers/physics_2d/space_2d_sw.cpp msgid "Time Before Sleep" -msgstr "" +msgstr "Tempo Antes de Dormir" #: servers/physics_2d/physics_2d_server_sw.cpp msgid "BP Hash Table Size" @@ -27673,12 +27444,11 @@ msgstr "" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Inverse Mass" -msgstr "" +msgstr "Inverter Massa" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Inverse Inertia" -msgstr "Visão Livre na Esquerda" +msgstr "Inverter Inércia" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Total Angular Damp" @@ -27701,7 +27471,7 @@ msgstr "Inicializar" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Exclude" -msgstr "" +msgstr "Excluir" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Shape RID" @@ -27714,7 +27484,7 @@ msgstr "Modo Colisão" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Collide With Areas" -msgstr "" +msgstr "Colidir com Ãreas" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Motion Remainder" @@ -27834,7 +27604,7 @@ msgstr "Importar Tema" #: servers/visual_server.cpp msgid "Lossless Compression" -msgstr "" +msgstr "Compressão Sem Perda" #: servers/visual_server.cpp #, fuzzy @@ -27843,7 +27613,7 @@ msgstr "Forçar Push" #: servers/visual_server.cpp msgid "WebP Compression Level" -msgstr "" +msgstr "NÃvel de Compressão WebP" #: servers/visual_server.cpp msgid "Time Rollover Secs" @@ -27887,7 +27657,7 @@ msgstr "Seleção Central" #: servers/visual_server.cpp msgid "High Quality GGX" -msgstr "" +msgstr "GGX de Alta Qualidade" #: servers/visual_server.cpp msgid "Irradiance Max Size" @@ -28034,7 +27804,7 @@ msgstr "Colar Frame" #: servers/visual_server.cpp msgid "GLES2" -msgstr "" +msgstr "GLES2" #: servers/visual_server.cpp msgid "Compatibility" @@ -28056,11 +27826,11 @@ msgstr "Expressão" #: servers/visual_server.cpp msgid "UV Contract" -msgstr "" +msgstr "Contrato UV" #: servers/visual_server.cpp msgid "UV Contract Amount" -msgstr "" +msgstr "Valor do Contrato UV" #: servers/visual_server.cpp #, fuzzy @@ -28093,7 +27863,7 @@ msgstr "Ver Ocultação Pela Oclusão" #: servers/visual_server.cpp msgid "Max Active Spheres" -msgstr "" +msgstr "Máximo de Esferas Ativas" #: servers/visual_server.cpp #, fuzzy @@ -28107,13 +27877,12 @@ msgstr "Modo de Interpolação" #: servers/visual_server.cpp msgid "Max Simultaneous Compiles" -msgstr "" +msgstr "Compilações Simultâneas Máximas" #: servers/visual_server.cpp msgid "Log Active Async Compiles Count" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Shader Cache Size (MB)" -msgstr "Alterar Tamanho da Câmera" +msgstr "Tamanho do Cache de Shader (MB)" diff --git a/editor/translations/ro.po b/editor/translations/ro.po index a78712c6ba..e01815b513 100644 --- a/editor/translations/ro.po +++ b/editor/translations/ro.po @@ -18,13 +18,14 @@ # FlooferLand <yunaflarf@gmail.com>, 2021, 2022. # N3mEee <n3mebusiness@gmail.com>, 2021. # Psynt <nichita@cadvegra.com>, 2022. +# Ilie Adrian Avramescu <himark1977@protonmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-05-15 09:38+0000\n" -"Last-Translator: Psynt <nichita@cadvegra.com>\n" +"PO-Revision-Date: 2022-09-27 21:37+0000\n" +"Last-Translator: Ilie Adrian Avramescu <himark1977@protonmail.com>\n" "Language-Team: Romanian <https://hosted.weblate.org/projects/godot-engine/" "godot/ro/>\n" "Language: ro\n" @@ -33,11 +34,11 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.14.1\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" -msgstr "" +msgstr "Driver de tableta" #: core/bind/core_bind.cpp msgid "Clipboard" @@ -61,7 +62,7 @@ msgstr "V-Sync Prin Compozitor" #: core/bind/core_bind.cpp main/main.cpp msgid "Delta Smoothing" -msgstr "" +msgstr "Netezirea Delta" #: core/bind/core_bind.cpp #, fuzzy @@ -70,11 +71,11 @@ msgstr "Mod Mutare" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode Sleep (µsec)" -msgstr "" +msgstr "Timp de utilizare scăzut al procesorului (μsec)" #: core/bind/core_bind.cpp main/main.cpp platform/uwp/os_uwp.cpp msgid "Keep Screen On" -msgstr "" +msgstr "PăstraÈ›i ecranul pornit" #: core/bind/core_bind.cpp msgid "Min Window Size" @@ -116,7 +117,7 @@ msgstr "Minimizat" #: core/bind/core_bind.cpp core/project_settings.cpp scene/gui/dialogs.cpp #: scene/gui/graph_node.cpp msgid "Resizable" -msgstr "" +msgstr "Redimensionabil" #: core/bind/core_bind.cpp core/os/input_event.cpp scene/2d/node_2d.cpp #: scene/2d/physics_body_2d.cpp scene/2d/remote_transform_2d.cpp @@ -148,7 +149,7 @@ msgstr "Indiciu Editor" #: core/bind/core_bind.cpp msgid "Print Error Messages" -msgstr "" +msgstr "Imprimare mesaje de eroare" #: core/bind/core_bind.cpp msgid "Iterations Per Second" @@ -159,9 +160,8 @@ msgid "Target FPS" msgstr "Frecvență Èšintă" #: core/bind/core_bind.cpp -#, fuzzy msgid "Time Scale" -msgstr "Nod DimensiuneTimp" +msgstr "Scară de timp" #: core/bind/core_bind.cpp main/main.cpp #, fuzzy @@ -173,22 +173,20 @@ msgid "Error" msgstr "Eroare" #: core/bind/core_bind.cpp -#, fuzzy msgid "Error String" -msgstr "Eroare La Salvarea" +msgstr "Eroare string" #: core/bind/core_bind.cpp msgid "Error Line" msgstr "Linia Erorii" #: core/bind/core_bind.cpp -#, fuzzy msgid "Result" -msgstr "CăutaÈ›i în Ajutor" +msgstr "Rezultat" #: core/command_queue_mt.cpp core/message_queue.cpp main/main.cpp msgid "Memory" -msgstr "" +msgstr "Memorie" #: core/command_queue_mt.cpp core/message_queue.cpp #: core/register_core_types.cpp drivers/gles2/rasterizer_canvas_base_gles2.cpp @@ -208,7 +206,7 @@ msgstr "Trage: Rotire" #: core/command_queue_mt.cpp msgid "Multithreading Queue Size (KB)" -msgstr "" +msgstr "Mărimea cozii de aÈ™teptare pentru mai multe fire (KB)" #: core/func_ref.cpp modules/visual_script/visual_script_builtin_funcs.cpp #: modules/visual_script/visual_script_func_nodes.cpp @@ -220,7 +218,7 @@ msgstr "FuncÈ›ie" #: core/image.cpp core/packed_data_container.cpp scene/2d/polygon_2d.cpp #: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp msgid "Data" -msgstr "" +msgstr "Date" #: core/io/file_access_network.cpp core/register_core_types.cpp #: editor/editor_file_dialog.cpp editor/editor_settings.cpp main/main.cpp @@ -242,11 +240,11 @@ msgstr "Marime Pagina" #: core/io/file_access_network.cpp msgid "Page Read Ahead" -msgstr "" +msgstr "Pagina CiteÈ™te înainte" #: core/io/http_client.cpp msgid "Blocking Mode Enabled" -msgstr "" +msgstr "Mod de blocare Activat" #: core/io/http_client.cpp msgid "Connection" @@ -300,7 +298,7 @@ msgstr "" #: core/io/packet_peer.cpp msgid "Stream Peer" -msgstr "" +msgstr "Fluxul Peer" #: core/io/stream_peer.cpp msgid "Big Endian" @@ -312,7 +310,7 @@ msgstr "" #: core/io/stream_peer_ssl.cpp msgid "Blocking Handshake" -msgstr "" +msgstr "Blocare Handshake" #: core/io/udp_server.cpp #, fuzzy @@ -367,7 +365,7 @@ msgstr "ÃŽn apelarea lui '%s':" #: core/math/random_number_generator.cpp #: modules/opensimplex/open_simplex_noise.cpp msgid "Seed" -msgstr "" +msgstr "SeminÈ›e" #: core/math/random_number_generator.cpp #, fuzzy @@ -376,7 +374,7 @@ msgstr "Mod RotaÈ›ie" #: core/message_queue.cpp msgid "Message Queue" -msgstr "" +msgstr "Coada de mesaje" #: core/message_queue.cpp msgid "Max Size (KB)" @@ -411,7 +409,7 @@ msgstr "Control" #: core/os/input_event.cpp msgid "Meta" -msgstr "" +msgstr "Meta" #: core/os/input_event.cpp #, fuzzy @@ -444,7 +442,7 @@ msgstr "Unicode" #: core/os/input_event.cpp msgid "Echo" -msgstr "" +msgstr "Ecou" #: core/os/input_event.cpp scene/gui/base_button.cpp #, fuzzy @@ -478,7 +476,7 @@ msgstr "Presiune" #: core/os/input_event.cpp msgid "Pen Inverted" -msgstr "" +msgstr "Stilou inversat" #: core/os/input_event.cpp msgid "Relative" @@ -552,7 +550,7 @@ msgstr "Linia Numărul:" #: core/os/input_event.cpp msgid "Controller Value" -msgstr "" +msgstr "Valoarea controlerului" #: core/project_settings.cpp editor/editor_node.cpp main/main.cpp #: platform/iphone/export/export.cpp platform/osx/export/export.cpp @@ -679,7 +677,7 @@ msgstr "Editor" #: core/project_settings.cpp msgid "Main Run Args" -msgstr "" +msgstr "Argumente principale ale rulării" #: core/project_settings.cpp #, fuzzy @@ -688,7 +686,7 @@ msgstr "Calea Scenei:" #: core/project_settings.cpp msgid "Search In File Extensions" -msgstr "" +msgstr "Căutare în extensii de fiÈ™iere" #: core/project_settings.cpp msgid "Script Templates Search Path" @@ -721,7 +719,7 @@ msgstr "Selectează" #: core/project_settings.cpp msgid "UI Cancel" -msgstr "" +msgstr "Anulare interfață utilizator" #: core/project_settings.cpp #, fuzzy @@ -754,7 +752,7 @@ msgstr "Descarcă" #: core/project_settings.cpp msgid "UI Page Up" -msgstr "" +msgstr "Pagina UI în sus" #: core/project_settings.cpp msgid "UI Page Down" @@ -762,11 +760,11 @@ msgstr "" #: core/project_settings.cpp msgid "UI Home" -msgstr "" +msgstr "UI Acasă" #: core/project_settings.cpp msgid "UI End" -msgstr "" +msgstr "SfârÈ™itul interfeÈ›ei de utilizator" #: core/project_settings.cpp main/main.cpp modules/bullet/register_types.cpp #: modules/bullet/space_bullet.cpp scene/2d/physics_body_2d.cpp @@ -815,7 +813,7 @@ msgstr "" #: scene/resources/multimesh.cpp servers/visual/visual_server_scene.cpp #: servers/visual_server.cpp msgid "Quality" -msgstr "" +msgstr "Calitate" #: core/project_settings.cpp scene/gui/file_dialog.cpp #: scene/main/scene_tree.cpp scene/resources/navigation_mesh.cpp @@ -826,7 +824,7 @@ msgstr "Filtre:" #: core/project_settings.cpp scene/main/viewport.cpp msgid "Sharpen Intensity" -msgstr "" +msgstr "Intensitate Sharpen" #: core/project_settings.cpp editor/editor_export.cpp editor/editor_node.cpp #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp @@ -849,7 +847,7 @@ msgstr "Setări:" #: core/project_settings.cpp editor/script_editor_debugger.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp msgid "Profiler" -msgstr "" +msgstr "Profiler" #: core/project_settings.cpp #, fuzzy @@ -871,35 +869,35 @@ msgstr "" #: core/project_settings.cpp msgid "Long Distance Matching" -msgstr "" +msgstr "Potrivire la distanță" #: core/project_settings.cpp msgid "Compression Level" -msgstr "" +msgstr "Nivelul de compresie" #: core/project_settings.cpp msgid "Window Log Size" -msgstr "" +msgstr "Dimensiunea jurnalului de fereastră" #: core/project_settings.cpp msgid "Zlib" -msgstr "" +msgstr "Zlib" #: core/project_settings.cpp msgid "Gzip" -msgstr "" +msgstr "Gzip" #: core/project_settings.cpp platform/android/export/export.cpp msgid "Android" -msgstr "" +msgstr "Android" #: core/project_settings.cpp msgid "Modules" -msgstr "" +msgstr "Module" #: core/register_core_types.cpp msgid "TCP" -msgstr "" +msgstr "TCP" #: core/register_core_types.cpp #, fuzzy @@ -908,7 +906,7 @@ msgstr "ConectaÈ›i la Nod:" #: core/register_core_types.cpp msgid "Packet Peer Stream" -msgstr "" +msgstr "Pachet Peer Stream" #: core/register_core_types.cpp msgid "Max Buffer (Power of 2)" @@ -957,7 +955,7 @@ msgstr "Se Testează" #: core/translation.cpp scene/resources/font.cpp msgid "Fallback" -msgstr "" +msgstr "Fallback" #: core/ustring.cpp scene/resources/segment_shape_2d.cpp msgid "B" @@ -1015,7 +1013,7 @@ msgstr "" #: servers/physics_2d/space_2d_sw.cpp servers/physics_2d_server.cpp #: servers/visual_server.cpp msgid "2D" -msgstr "" +msgstr "2D" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp @@ -1032,7 +1030,7 @@ msgstr "Utilizează Pixel Snap" #: drivers/gles2/rasterizer_scene_gles2.cpp #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Immediate Buffer Size (KB)" -msgstr "" +msgstr "Dimensiunea imediată a bufferului (KB)" #: drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp @@ -1043,7 +1041,7 @@ msgstr "Procesează Lightmaps" #: drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp msgid "Use Bicubic Sampling" -msgstr "" +msgstr "Utilizarea eÈ™antionării bicubice" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Renderable Elements" @@ -4608,6 +4606,7 @@ msgstr "Proiect Divers sau unelte pentru scenă." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Proiect" @@ -7508,7 +7507,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15712,18 +15712,18 @@ msgstr "" msgid "Make Local" msgstr "Creează Oase" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Nume Nod:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Nume Nod:" #: editor/scene_tree_dock.cpp @@ -15930,6 +15930,11 @@ msgstr "Adaugă în Grup" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Nume Nod:" + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr "Eroare de Conexiune" @@ -15993,6 +15998,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -16747,7 +16756,7 @@ msgstr "" #: main/main.cpp msgid "iOS" -msgstr "" +msgstr "iOS" #: main/main.cpp msgid "Hide Home Indicator" @@ -17921,6 +17930,21 @@ msgstr "Toată selecÈ›ia" msgid "Auto Update Project" msgstr "Exportă Proiectul" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "AfiÈ™ează Tot" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "AlegeÅ£i un Director" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "AlegeÅ£i un Director" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19752,6 +19776,11 @@ msgstr "Creează Nod" msgid "Custom BG Color" msgstr "Creează Nod" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Extinde Toate" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -19903,7 +19932,7 @@ msgstr "Eroare la scrierea TextFile:" #: platform/javascript/export/export.cpp msgid "Web" -msgstr "" +msgstr "Web" #: platform/javascript/export/export.cpp msgid "HTTP Host" @@ -20600,6 +20629,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "Nume nevalid." @@ -20824,9 +20859,8 @@ msgid "Executable \"pck\" section not found." msgstr "" #: platform/windows/export/export.cpp -#, fuzzy msgid "Windows" -msgstr "Fereastră Nouă" +msgstr "Windows" #: platform/windows/export/export.cpp msgid "Rcedit" diff --git a/editor/translations/ru.po b/editor/translations/ru.po index 1df1d87308..0432de4da5 100644 --- a/editor/translations/ru.po +++ b/editor/translations/ru.po @@ -78,7 +78,7 @@ # Alex Tern <ternvein@gmail.com>, 2020. # Varion Drakon Neonovich <variondrakon@gmail.com>, 2020. # d2cyb <dmitrydpb@gmail.com>, 2020. -# ÐлекÑей Смирнов <tir74@mail.ru>, 2020. +# ÐлекÑей Смирнов <tir74@mail.ru>, 2020, 2022. # Calamander <Calamander@yandex.ru>, 2020. # Terminator <fresh-ter@yandex.com>, 2020. # Anatoly Kuznetsov <muffinnorth@yandex.ru>, 2020. @@ -119,13 +119,20 @@ # Vadim Mitroshkin <Vadim7540@yandex.ru>, 2022. # Maksim Marchukov <mar.maksim63@gmail.com>, 2022. # Slava Beloglazov <slavathedeveloper@gmail.com>, 2022. +# Sned Of Bread <d.cto20181389@gmail.com>, 2022. +# Kedr <lava20121991@gmail.com>, 2022. +# Gulpy <yak.aryslan.1999@gmail.com>, 2022. +# Sergey Karmanov <ppoocpel8888@gmail.com>, 2022. +# Дмитрий <Dimega@inbox.ru>, 2022. +# Vladimir Kirillovskiy <vladimir.kirillovskiy@gmail.com>, 2022. +# Evgeniy Khramov <thejenjagamertjg@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-26 01:55+0000\n" -"Last-Translator: NeoLan Qu <it.bulla@mail.ru>\n" +"PO-Revision-Date: 2022-09-27 21:37+0000\n" +"Last-Translator: Evgeniy Khramov <thejenjagamertjg@gmail.com>\n" "Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/" "godot/ru/>\n" "Language: ru\n" @@ -134,7 +141,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -506,9 +513,8 @@ msgid "Command" msgstr "Command" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" -msgstr "(ФизичеÑкаÑ)" +msgstr "ФизичеÑкий" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp @@ -764,14 +770,12 @@ msgid "Script Templates Search Path" msgstr "Путь поиÑка шаблонов Ñкриптов" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Autoload On Startup" -msgstr "Ðвтозагрузка при запуÑке" +msgstr "Ðвтозагрузка ÑиÑтемы ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²ÐµÑ€ÑиÑми при запуÑке" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Plugin Name" -msgstr "Контроль верÑий" +msgstr "Ðазвание плагина ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ Ð²ÐµÑ€Ñий" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -1261,12 +1265,10 @@ msgid "Type" msgstr "Тип" #: editor/animation_track_editor.cpp -#, fuzzy msgid "In Handle" msgstr "Задать обработчик" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Out Handle" msgstr "Задать обработчик" @@ -2852,7 +2854,6 @@ msgid "Project export for platform:" msgstr "ÐкÑпорт проекта Ð´Ð»Ñ Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼Ñ‹:" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with warnings." msgstr "Завершено Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°Ð¼Ð¸." @@ -2861,9 +2862,8 @@ msgid "Completed successfully." msgstr "Завершено без ошибок." #: editor/editor_export.cpp -#, fuzzy msgid "Failed." -msgstr "Ðе удалоÑÑŒ:" +msgstr "Ошибка." #: editor/editor_export.cpp msgid "Storing File:" @@ -2882,24 +2882,20 @@ msgid "Save PCK" msgstr "Сохранить PCK" #: editor/editor_export.cpp -#, fuzzy msgid "Cannot create file \"%s\"." -msgstr "Ðевозможно Ñоздать папку." +msgstr "Ðевозможно Ñоздать файл \"%s\"." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to export project files." -msgstr "Ðе удалоÑÑŒ ÑкÑпортировать файлы проекта" +msgstr "Ðе удалоÑÑŒ ÑкÑпортировать файлы проекта." #: editor/editor_export.cpp -#, fuzzy msgid "Can't open file to read from path \"%s\"." -msgstr "Ðевозможно открыть файл Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи:" +msgstr "Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¸Ð· пути \"%s\"." #: editor/editor_export.cpp -#, fuzzy msgid "Save ZIP" -msgstr "Сохранить как" +msgstr "Сохранить ZIP" #: editor/editor_export.cpp msgid "" @@ -3019,30 +3015,25 @@ msgid "Custom release template not found." msgstr "ПользовательÑкий релизный шаблон не найден." #: editor/editor_export.cpp -#, fuzzy msgid "Prepare Template" -msgstr "Управление шаблонами" +msgstr "Подготовить шаблон" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "The given export path doesn't exist." -msgstr "Данный путь ÑкÑпорта не ÑущеÑтвует:" +msgstr "Указанный путь ÑкÑпорта не ÑущеÑтвует." #: editor/editor_export.cpp platform/javascript/export/export.cpp -#, fuzzy msgid "Template file not found: \"%s\"." -msgstr "Файл шаблона не найден:" +msgstr "Ðе найден файл шаблона: \"%s\"." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to copy export template." -msgstr "Ðеверный шаблон ÑкÑпорта:" +msgstr "Ðе удалоÑÑŒ Ñкопировать шаблон ÑкÑпорта." #: editor/editor_export.cpp platform/windows/export/export.cpp #: platform/x11/export/export.cpp -#, fuzzy msgid "PCK Embedding" -msgstr "ОтÑтуп" +msgstr "Ð’Ñтраивание PCK" #: editor/editor_export.cpp msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." @@ -4594,6 +4585,7 @@ msgstr "Прочие инÑтрументы." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Проект" @@ -5311,9 +5303,8 @@ msgstr "" "ÑущеÑтвующий преÑет как активный." #: editor/editor_run_native.cpp -#, fuzzy msgid "Project Run" -msgstr "Проект" +msgstr "ЗапуÑк проекта" #: editor/editor_run_script.cpp msgid "Write your logic in the _run() method." @@ -5596,13 +5587,12 @@ msgid "Mouse Extra Buttons Navigate History" msgstr "ÐÐ°Ð²Ð¸Ð³Ð°Ñ†Ð¸Ñ Ð¿Ð¾ иÑтории дополнительными кнопками мыши" #: editor/editor_settings.cpp -#, fuzzy msgid "Drag And Drop Selection" -msgstr "Выделение Ñетки" +msgstr "DragAndDrop выделение" #: editor/editor_settings.cpp msgid "Stay In Script Editor On Node Selected" -msgstr "" +msgstr "ОÑтатьÑÑ Ð² Редакторе Скриптов Ðа Выбранном Узле" #: editor/editor_settings.cpp msgid "Appearance" @@ -7366,7 +7356,8 @@ msgid "8 Bit" msgstr "8-бит" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "Моно" @@ -11599,9 +11590,8 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ Ð³ÐµÐ¾Ð¼ÐµÑ‚Ñ€Ð¸Ñ, не может быть заменена полиÑеткой." #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Convert to MeshInstance2D" -msgstr "Преобразовать в Mesh2D" +msgstr "Преобразование в MeshInstance2D" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't create polygon." @@ -11707,7 +11697,7 @@ msgstr "ÐÐ¾Ð²Ð°Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ" #: editor/plugins/sprite_frames_editor_plugin.cpp #, fuzzy msgid "Filter animations" -msgstr "Фильтр методов" +msgstr "Фильтровать анимации" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed:" @@ -14217,28 +14207,24 @@ msgid "More Info..." msgstr "Подробнее..." #: editor/project_export.cpp -#, fuzzy msgid "Export PCK/Zip..." -msgstr "ÐкÑпортировать PCK/Zip" +msgstr "ÐкÑпортировать PCK/Zip..." #: editor/project_export.cpp -#, fuzzy msgid "Export Project..." -msgstr "ÐкÑпортировать проект" +msgstr "ÐкÑпортировать проект..." #: editor/project_export.cpp msgid "Export All" msgstr "ÐкÑпортировать вÑÑ‘" #: editor/project_export.cpp -#, fuzzy msgid "Choose an export mode:" -msgstr "ПожалуйÑта, выберите пуÑтую папку." +msgstr "ПожалуйÑта, выберите режим ÑкÑпорта:" #: editor/project_export.cpp -#, fuzzy msgid "Export All..." -msgstr "ÐкÑпортировать вÑÑ‘" +msgstr "ÐкÑпортировать вÑÑ‘..." #: editor/project_export.cpp editor/project_manager.cpp msgid "ZIP File" @@ -14254,9 +14240,8 @@ msgid "Export templates for this platform are missing:" msgstr "Шаблоны ÑкÑпорта Ð´Ð»Ñ Ñтой платформы отÑутÑтвуют:" #: editor/project_export.cpp -#, fuzzy msgid "Project Export" -msgstr "ОÑнователи проекта" +msgstr "ÐкÑпорт проекта" #: editor/project_export.cpp msgid "Manage Export Templates" @@ -14393,7 +14378,7 @@ msgstr "ОтриÑовщик:" #: editor/project_manager.cpp msgid "OpenGL ES 3.0" -msgstr "ОткрытыйGL ES 3.0" +msgstr "OpenGL ES 3.0" #: editor/project_manager.cpp msgid "Not supported by your GPU drivers." @@ -14413,7 +14398,7 @@ msgstr "" #: editor/project_manager.cpp msgid "OpenGL ES 2.0" -msgstr "ОткрытыйGL ES 2.0" +msgstr "OpenGL ES 2.0" #: editor/project_manager.cpp msgid "" @@ -15370,16 +15355,18 @@ msgstr "" msgid "Make Local" msgstr "Сделать локальным" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "Данное уникальное Ð¸Ð¼Ñ ÑƒÐ¶Ðµ иÑпользовано у другого узла в Ñцене." - #: editor/scene_tree_dock.cpp -msgid "Enable Scene Unique Name" +#, fuzzy +msgid "Enable Scene Unique Name(s)" msgstr "Добавить уникальное Ð¸Ð¼Ñ Ñцене" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Disable Scene Unique Name" +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "Данное уникальное Ð¸Ð¼Ñ ÑƒÐ¶Ðµ иÑпользовано у другого узла в Ñцене:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Убрать уникальное Ð¸Ð¼Ñ Ð² Ñцене" #: editor/scene_tree_dock.cpp @@ -15580,6 +15567,10 @@ msgid "Button Group" msgstr "Группа кнопок" #: editor/scene_tree_editor.cpp +msgid "Disable Scene Unique Name" +msgstr "Убрать уникальное Ð¸Ð¼Ñ Ð² Ñцене" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(ИÑточник)" @@ -15657,6 +15648,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "Ðекорректное Ð¸Ð¼Ñ ÑƒÐ·Ð»Ð°, Ñледующие Ñимволы недопуÑтимы:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "Данное уникальное Ð¸Ð¼Ñ ÑƒÐ¶Ðµ иÑпользовано у другого узла в Ñцене." + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Переименовать узел" @@ -17051,12 +17046,12 @@ msgstr "Узел коÑти Godot" #: modules/gltf/gltf_skin.cpp #, fuzzy msgid "Skin Root" -msgstr "Ðовый корень Ñцены" +msgstr "Корневой Ñкин" #: modules/gltf/gltf_skin.cpp #, fuzzy msgid "Joints Original" -msgstr "СфокуÑироватьÑÑ Ð½Ð° начале координат" +msgstr "СуÑтавы Оригинал" #: modules/gltf/gltf_skin.cpp msgid "Inverse Binds" @@ -17065,7 +17060,7 @@ msgstr "Инвертировать СвÑзи" #: modules/gltf/gltf_skin.cpp #, fuzzy msgid "Non Joints" -msgstr "Передвинуть ÑуÑтав" +msgstr "Ðе СуÑтавы" #: modules/gltf/gltf_skin.cpp msgid "Joint I To Bone I" @@ -17098,7 +17093,7 @@ msgstr "Зеркальный коÑффициент" #: modules/gltf/gltf_spec_gloss.cpp msgid "Spec Gloss Img" -msgstr "" +msgstr "Зеркальное ГлÑнцевое Изображение" #: modules/gltf/gltf_state.cpp msgid "Json" @@ -17115,16 +17110,16 @@ msgstr "ÐœÐ»Ð°Ð´ÑˆÐ°Ñ Ð²ÐµÑ€ÑиÑ" #: modules/gltf/gltf_state.cpp #, fuzzy msgid "GLB Data" -msgstr "С данными" +msgstr "GLB Данные" #: modules/gltf/gltf_state.cpp +#, fuzzy msgid "Use Named Skin Binds" -msgstr "" +msgstr "ИÑпользовать СвÑзи Именованного Скина" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Buffer Views" -msgstr "Вид Ñзади" +msgstr "Буфер видов" #: modules/gltf/gltf_state.cpp msgid "Accessors" @@ -17196,19 +17191,16 @@ msgid "Octant Size" msgstr "Размер октанта" #: modules/gridmap/grid_map.cpp -#, fuzzy msgid "Center X" -msgstr "По центру" +msgstr "По центру X" #: modules/gridmap/grid_map.cpp -#, fuzzy msgid "Center Y" -msgstr "По центру" +msgstr "По центру Y" #: modules/gridmap/grid_map.cpp -#, fuzzy msgid "Center Z" -msgstr "По центру" +msgstr "По центру Z" #: modules/gridmap/grid_map.cpp scene/2d/collision_object_2d.cpp #: scene/2d/tile_map.cpp scene/3d/collision_object.cpp scene/3d/soft_body.cpp @@ -17225,9 +17217,8 @@ msgstr "ÐавигациÑ" #: scene/2d/navigation_agent_2d.cpp scene/2d/navigation_polygon.cpp #: scene/2d/tile_map.cpp scene/3d/navigation.cpp scene/3d/navigation_agent.cpp #: scene/3d/navigation_mesh_instance.cpp -#, fuzzy msgid "Navigation Layers" -msgstr "ЧувÑтвительноÑть навигации" +msgstr "Слои навигации" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Next Plane" @@ -17389,23 +17380,23 @@ msgstr "ПоÑтроение карт оÑвещениÑ" #: modules/lightmapper_cpu/register_types.cpp #, fuzzy msgid "CPU Lightmapper" -msgstr "Запекать карты оÑвещениÑ" +msgstr "CPU Карты оÑвещениÑ" #: modules/lightmapper_cpu/register_types.cpp msgid "Low Quality Ray Count" -msgstr "" +msgstr "КоличеÑтво Лучей Ðизкого КачеÑтва" #: modules/lightmapper_cpu/register_types.cpp msgid "Medium Quality Ray Count" -msgstr "" +msgstr "КоличеÑтво Лучей Среднего КачеÑтва" #: modules/lightmapper_cpu/register_types.cpp msgid "High Quality Ray Count" -msgstr "" +msgstr "КоличеÑтво Лучей Ð’Ñ‹Ñокого КачеÑтва" #: modules/lightmapper_cpu/register_types.cpp msgid "Ultra Quality Ray Count" -msgstr "" +msgstr "КоличеÑтво Лучей Ультра КачеÑтва" #: modules/minimp3/audio_stream_mp3.cpp #: modules/minimp3/resource_importer_mp3.cpp @@ -17420,7 +17411,7 @@ msgstr "Ð’Ñ‹Ñота глаз" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "IOD" -msgstr "" +msgstr "IOD" #: modules/mobile_vr/mobile_vr_interface.cpp #, fuzzy @@ -17434,15 +17425,15 @@ msgstr "Режим без теней" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "Oversample" -msgstr "" +msgstr "ПередиÑкретизациÑ" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "K1" -msgstr "" +msgstr "K1" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "K2" -msgstr "" +msgstr "K2" #: modules/mono/csharp_script.cpp msgid "Class name can't be a reserved keyword" @@ -17456,6 +17447,20 @@ msgstr "Собрать решение" msgid "Auto Update Project" msgstr "Ðвтообновление проекта" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "МаÑштаб отображениÑ" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Выбрать каталог" + +#: modules/mono/godotsharp_dirs.cpp +msgid "C# Project Directory" +msgstr "Каталог C# проекта" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Конец траÑÑировки внутреннего Ñтека иÑключений" @@ -17536,7 +17541,7 @@ msgstr "Как карта нормалей" #: modules/opensimplex/noise_texture.cpp msgid "Bump Strength" -msgstr "" +msgstr "Сила Bump" #: modules/opensimplex/noise_texture.cpp msgid "Noise" @@ -17562,7 +17567,7 @@ msgstr "ПерÑпективный" #: modules/opensimplex/open_simplex_noise.cpp msgid "Lacunarity" -msgstr "" +msgstr "ЛакунарноÑть" #: modules/regex/regex.cpp msgid "Subject" @@ -17578,7 +17583,7 @@ msgstr "Строки" #: modules/upnp/upnp.cpp msgid "Discover Multicast If" -msgstr "" +msgstr "Обнаружить МногоадреÑную РаÑÑылку, ЕÑли" #: modules/upnp/upnp.cpp msgid "Discover Local Port" @@ -17586,7 +17591,7 @@ msgstr "Обнаружить локальный порт" #: modules/upnp/upnp.cpp msgid "Discover IPv6" -msgstr "" +msgstr "Обнаружить IPv6" #: modules/upnp/upnp_device.cpp msgid "Description URL" @@ -17598,7 +17603,7 @@ msgstr "Тип ÑервиÑа" #: modules/upnp/upnp_device.cpp msgid "IGD Control URL" -msgstr "" +msgstr "IDG Контроль URL" #: modules/upnp/upnp_device.cpp #, fuzzy @@ -17607,12 +17612,11 @@ msgstr "УÑтановить тип переменной" #: modules/upnp/upnp_device.cpp msgid "IGD Our Addr" -msgstr "" +msgstr "IGD Ðаш Ðдр" #: modules/upnp/upnp_device.cpp -#, fuzzy msgid "IGD Status" -msgstr "СтатуÑ" +msgstr "IGD СтатуÑ" #: modules/visual_script/visual_script.cpp msgid "" @@ -18413,21 +18417,22 @@ msgid "Optional Features" msgstr "Дополнительные Компоненты" #: modules/webxr/webxr_interface.cpp +#, fuzzy msgid "Requested Reference Space Types" -msgstr "" +msgstr "Запрошенные Типы Опорного ПроÑтранÑтва" #: modules/webxr/webxr_interface.cpp +#, fuzzy msgid "Reference Space Type" -msgstr "" +msgstr "Тип Опорного ПроÑтранÑтва" #: modules/webxr/webxr_interface.cpp msgid "Visibility State" msgstr "ВидимоÑть" #: modules/webxr/webxr_interface.cpp -#, fuzzy msgid "Bounds Geometry" -msgstr "Повторить" +msgstr "Ð“ÐµÐ¾Ð¼ÐµÑ‚Ñ€Ð¸Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†" #: modules/webxr/webxr_interface.cpp msgid "XR Standard Mapping" @@ -18443,12 +18448,14 @@ msgid "Debug Keystore" msgstr "Отладочное хранилище ключей" #: platform/android/export/export.cpp +#, fuzzy msgid "Debug Keystore User" -msgstr "" +msgstr "Отладочное Хранилище ключей ПользователÑ" #: platform/android/export/export.cpp +#, fuzzy msgid "Debug Keystore Pass" -msgstr "" +msgstr "Отладочное Хранилище ключей Паролей" #: platform/android/export/export.cpp msgid "Force System User" @@ -18527,14 +18534,12 @@ msgid "Keystore" msgstr "Хранилище ключей" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Debug User" -msgstr "Отладчик" +msgstr "Пользователь отладчика" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Debug Password" -msgstr "Пароль" +msgstr "Пароль отладчика" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18571,18 +18576,16 @@ msgid "Signed" msgstr "ПодпиÑано" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Classify As Game" -msgstr "Ð˜Ð¼Ñ ÐºÐ»Ð°ÑÑа" +msgstr "КлаÑÑифицировать как игру" #: platform/android/export/export_plugin.cpp msgid "Retain Data On Uninstall" -msgstr "" +msgstr "Сохранить данные при удалении программы" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Exclude From Recents" -msgstr "Удалить узлы" +msgstr "ИÑключить из недавнего" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18590,9 +18593,8 @@ msgid "Graphics" msgstr "Смещение графа" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "OpenGL Debug" -msgstr "Открыть" +msgstr "OpenGL Отладка" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18643,9 +18645,8 @@ msgid "Support Xlarge" msgstr "Поддержка" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "User Data Backup" -msgstr "ПользовательÑкий интерфейÑ" +msgstr "Резервное копирование пользовательÑких данных" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18653,32 +18654,28 @@ msgid "Allow" msgstr "Разрешено" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Command Line" -msgstr "Command" +msgstr "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp msgid "Extra Args" msgstr "Дополнительные аргументы" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "APK Expansion" -msgstr "Выражение" +msgstr "APK раÑширение" #: platform/android/export/export_plugin.cpp msgid "Salt" msgstr "" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Public Key" -msgstr "Путь к открытому ключу SSH" +msgstr "Открытый ключ" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Permissions" -msgstr "МаÑка излучениÑ" +msgstr "РазрешениÑ" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18840,12 +18837,16 @@ msgstr "" #: platform/android/export/export_plugin.cpp msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "" +"\"Min SDK\" должно быть валидным целым чиÑлом, полученное \"%s\" - не " +"валидно." #: platform/android/export/export_plugin.cpp msgid "" "\"Min SDK\" cannot be lower than %d, which is the version needed by the " "Godot library." msgstr "" +"\"Min SDK\" не может быть меньше чем %d - Ñто верÑÐ¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÐ¼Ð°Ñ Godot " +"библиотекой." #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18859,12 +18860,16 @@ msgstr "" msgid "" "\"Target SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "" +"\"Target SDK\" должно быть валидным целым чиÑлом, полученное \"%s\" - не " +"валидно." #: platform/android/export/export_plugin.cpp msgid "" "\"Target SDK\" %d is higher than the default version %d. This may work, but " "wasn't tested and may be unstable." msgstr "" +"\"Target SDK\" %d выше чем верÑÐ¸Ñ Ð¿Ð¾ умолчанию %d. Ðто может Ñработать, но " +"не теÑтировано и может быть не Ñтабильным." #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18873,9 +18878,8 @@ msgstr "ВерÑÐ¸Ñ Â«Target Sdk» должна быть больше или Ñ€ #: platform/android/export/export_plugin.cpp platform/osx/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Code Signing" -msgstr "ПодпиÑÑŒ кода DMG" +msgstr "ПодпиÑÑŒ кода" #: platform/android/export/export_plugin.cpp msgid "" @@ -18950,11 +18954,10 @@ msgstr "" "%s. ПожалуйÑта, переуÑтановите шаблон Ñборки Android из меню «Проект»." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Unable to overwrite res://android/build/res/*.xml files with project name." msgstr "" -"Ðевозможно перезапиÑать файлы res://android/build/res/*.xml Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ проекта" +"Ðевозможно перезапиÑать res://android/build/res/*.xml Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ проекта." #: platform/android/export/export_plugin.cpp msgid "Could not export project files to gradle project." @@ -18990,9 +18993,8 @@ msgstr "" "проекта gradle на наличие выходных данных." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Package not found: \"%s\"." -msgstr "Пакет не найден: %s" +msgstr "Пакет не найден: \"%s\"." #: platform/android/export/export_plugin.cpp msgid "Creating APK..." @@ -19017,9 +19019,8 @@ msgid "Adding files..." msgstr "Добавление файлов..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files." -msgstr "Ðе удалоÑÑŒ ÑкÑпортировать файлы проекта" +msgstr "Ðе удалоÑÑŒ ÑкÑпортировать файлы проекта." #: platform/android/export/export_plugin.cpp msgid "Aligning APK..." @@ -19131,9 +19132,8 @@ msgid "Identifier" msgstr "Индетификатор" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Signature" -msgstr "Сигнал" +msgstr "ПодпиÑÑŒ" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #, fuzzy @@ -19142,14 +19142,12 @@ msgstr "Ð¡Ñ‚Ð°Ñ€ÑˆÐ°Ñ Ð²ÐµÑ€ÑиÑ" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Copyright" -msgstr "Справа вверху" +msgstr "ÐвторÑкие права" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Capabilities" -msgstr "Капитализировать ÑвойÑтва" +msgstr "ВозможноÑти" #: platform/iphone/export/export.cpp msgid "Access Wi-Fi" @@ -19160,37 +19158,32 @@ msgid "Push Notifications" msgstr "Ð’Ñплывающее уведомление" #: platform/iphone/export/export.cpp -#, fuzzy msgid "User Data" -msgstr "ПользовательÑкий интерфейÑ" +msgstr "ПользовательÑкие данные" #: platform/iphone/export/export.cpp msgid "Accessible From Files App" -msgstr "" +msgstr "ДоÑтупно из Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Files" #: platform/iphone/export/export.cpp msgid "Accessible From iTunes Sharing" -msgstr "" +msgstr "ДоÑтупно из iTunes Sharing" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Privacy" -msgstr "Закрытый ключ" +msgstr "КонфиденциальноÑть" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Camera Usage Description" -msgstr "ОпиÑание" +msgstr "ОпиÑание иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ°Ð¼ÐµÑ€Ñ‹" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Microphone Usage Description" -msgstr "ОпиÑÐ°Ð½Ð¸Ñ ÑвойÑтв" +msgstr "ОпиÑание иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð¸ÐºÑ€Ð¾Ñ„Ð¾Ð½Ð°" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Photolibrary Usage Description" -msgstr "ОпиÑÐ°Ð½Ð¸Ñ ÑвойÑтв" +msgstr "ОпиÑание иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ„Ð¾Ñ‚Ð¾-библиотеки" #: platform/iphone/export/export.cpp msgid "iPhone 120 X 120" @@ -19233,35 +19226,33 @@ msgid "Use Launch Screen Storyboard" msgstr "" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Image Scale Mode" -msgstr "Режим маÑштабированиÑ" +msgstr "Режим маÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Custom Image @2x" -msgstr "ПользовательÑкое изображение" +msgstr "ПользовательÑкое изображение @2x" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Custom Image @3x" -msgstr "ПользовательÑкое изображение" +msgstr "ПользовательÑкое изображение @3x" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Use Custom BG Color" -msgstr "ПользовательÑкий цвет" +msgstr "ИÑпользовать пользовательÑкий цвет фона" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Custom BG Color" -msgstr "ПользовательÑкий цвет" +msgstr "ПользовательÑкий цвет фона" + +#: platform/iphone/export/export.cpp +msgid "Export Icons" +msgstr "ÐкÑпортировать иконки" #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp -#, fuzzy msgid "Prepare Templates" -msgstr "Управление шаблонами" +msgstr "Подготовить шаблоны" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #, fuzzy @@ -19289,29 +19280,24 @@ msgid "Run exported HTML in the system's default browser." msgstr "ЗапуÑтить HTML в ÑиÑтемном браузере по умолчанию." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not open template for export: \"%s\"." -msgstr "Ðе удалоÑÑŒ открыть шаблон Ð´Ð»Ñ ÑкÑпорта:" +msgstr "Ðе удалоÑÑŒ открыть шаблон Ð´Ð»Ñ ÑкÑпорта: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Invalid export template: \"%s\"." -msgstr "Ðеверный шаблон ÑкÑпорта:" +msgstr "Ðеверный шаблон ÑкÑпорта: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not write file: \"%s\"." -msgstr "Ðе удалоÑÑŒ запиÑать файл:" +msgstr "Ðе удалоÑÑŒ запиÑать файл: \"%s\"." #: platform/javascript/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Icon Creation" -msgstr "Задать отÑтуп" +msgstr "Создание иконки" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read file: \"%s\"." -msgstr "Ðе удалоÑÑŒ прочитать файл:" +msgstr "Ðе удалоÑÑŒ прочитать файл: \"%s\"." #: platform/javascript/export/export.cpp msgid "PWA" @@ -19323,14 +19309,12 @@ msgid "Variant" msgstr "Ð’Ð°Ñ€Ð¸Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ñ‚ÐµÐ½ÐºÐ°" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Export Type" -msgstr "ÐкÑпорт" +msgstr "Тип ÑкÑпорта" #: platform/javascript/export/export.cpp -#, fuzzy msgid "VRAM Texture Compression" -msgstr "Выражение" +msgstr "VRAM компреÑÑÐ¸Ñ Ñ‚ÐµÐºÑтуры" #: platform/javascript/export/export.cpp msgid "For Desktop" @@ -19345,9 +19329,8 @@ msgid "HTML" msgstr "" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Export Icon" -msgstr "Развернуть вÑе" +msgstr "ÐкÑпортировать иконку" #: platform/javascript/export/export.cpp #, fuzzy @@ -19360,51 +19343,47 @@ msgstr "" #: platform/javascript/export/export.cpp msgid "Canvas Resize Policy" -msgstr "" +msgstr "Политика Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð° холÑта" #: platform/javascript/export/export.cpp msgid "Focus Canvas On Start" msgstr "" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Experimental Virtual Keyboard" -msgstr "Фильтр Ñигналов" +msgstr "ÐкÑÐ¿ÐµÑ€Ð¸Ð¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ð¸Ñ€Ñ‚ÑƒÐ°Ð»ÑŒÐ½Ð°Ñ ÐºÐ»Ð°Ð²Ð¸Ð°Ñ‚ÑƒÑ€Ð°" #: platform/javascript/export/export.cpp msgid "Progressive Web App" -msgstr "" +msgstr "ПрогреÑÑивное веб-приложение" #: platform/javascript/export/export.cpp msgid "Offline Page" -msgstr "" +msgstr "Офлайн-Ñтраница" #: platform/javascript/export/export.cpp msgid "Icon 144 X 144" -msgstr "" +msgstr "Иконка 144 X 144" #: platform/javascript/export/export.cpp msgid "Icon 180 X 180" -msgstr "" +msgstr "Иконка 180 X 180" #: platform/javascript/export/export.cpp msgid "Icon 512 X 512" -msgstr "" +msgstr "Иконка 512 X 512" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read HTML shell: \"%s\"." -msgstr "Ðе удалоÑÑŒ прочитать HTML-оболочку:" +msgstr "Ðе удалоÑÑŒ прочитать HTML-оболочку: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not create HTTP server directory: %s." -msgstr "Ðе удалоÑÑŒ Ñоздать каталог HTTP-Ñервера:" +msgstr "Ðе удалоÑÑŒ Ñоздать каталог HTTP-Ñервера: %s." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Error starting HTTP server: %d." -msgstr "Ошибка запуÑка HTTP-Ñервера:" +msgstr "Ошибка запуÑка HTTP-Ñервера: %d." #: platform/javascript/export/export.cpp msgid "Web" @@ -19513,31 +19492,27 @@ msgstr "ОпиÑание" #: platform/osx/export/export.cpp msgid "Address Book Usage Description" -msgstr "" +msgstr "ОпиÑание иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð°Ð´Ñ€ÐµÑной книги" #: platform/osx/export/export.cpp -#, fuzzy msgid "Calendar Usage Description" -msgstr "ОпиÑание" +msgstr "ОпиÑание иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ°Ð»ÐµÐ½Ð´Ð°Ñ€Ñ" #: platform/osx/export/export.cpp -#, fuzzy msgid "Photos Library Usage Description" -msgstr "ОпиÑÐ°Ð½Ð¸Ñ ÑвойÑтв" +msgstr "ОпиÑание иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¤Ð¾Ñ‚Ð¾ библиотеки" #: platform/osx/export/export.cpp -#, fuzzy msgid "Desktop Folder Usage Description" -msgstr "ОпиÑÐ°Ð½Ð¸Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð¾Ð²" +msgstr "ОпиÑание иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð°Ð¿ÐºÐ¸ рабочего Ñтола" #: platform/osx/export/export.cpp -#, fuzzy msgid "Documents Folder Usage Description" -msgstr "ОпиÑÐ°Ð½Ð¸Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð¾Ð²" +msgstr "ОпиÑание иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð°Ð¿ÐºÐ¸ Документов" #: platform/osx/export/export.cpp msgid "Downloads Folder Usage Description" -msgstr "" +msgstr "ОпиÑание иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð°Ð¿ÐºÐ¸ загрузок" #: platform/osx/export/export.cpp msgid "Network Volumes Usage Description" @@ -19579,49 +19554,44 @@ msgid "Entitlements" msgstr "Гизмо" #: platform/osx/export/export.cpp -#, fuzzy msgid "Custom File" -msgstr "ПользовательÑкий шрифт" +msgstr "ПользовательÑкий файл" #: platform/osx/export/export.cpp msgid "Allow JIT Code Execution" -msgstr "" +msgstr "Разрешить выполнение JIT-кода" #: platform/osx/export/export.cpp msgid "Allow Unsigned Executable Memory" -msgstr "" +msgstr "Разрешить неподпиÑанную иÑполнÑемую памÑть" #: platform/osx/export/export.cpp msgid "Allow Dyld Environment Variables" -msgstr "" +msgstr "Разрешить переменные Ñреды Dyld" #: platform/osx/export/export.cpp -#, fuzzy msgid "Disable Library Validation" -msgstr "Ð—Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ°" +msgstr "Отключить валидацию библиотеки" #: platform/osx/export/export.cpp -#, fuzzy msgid "Audio Input" -msgstr "Добавить вход" +msgstr "Ðудио вход" #: platform/osx/export/export.cpp msgid "Address Book" -msgstr "" +msgstr "ÐдреÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð³Ð°" #: platform/osx/export/export.cpp msgid "Calendars" -msgstr "" +msgstr "Календари" #: platform/osx/export/export.cpp -#, fuzzy msgid "Photos Library" -msgstr "ÐкÑпортировать библиотеку" +msgstr "Библиотека фотографий" #: platform/osx/export/export.cpp -#, fuzzy msgid "Apple Events" -msgstr "Добавить Ñобытие" +msgstr "Apple ÑобытиÑ" #: platform/osx/export/export.cpp #, fuzzy @@ -19630,51 +19600,43 @@ msgstr "Отладка" #: platform/osx/export/export.cpp msgid "App Sandbox" -msgstr "" +msgstr "Приложение \"пеÑочница\"" #: platform/osx/export/export.cpp -#, fuzzy msgid "Network Server" -msgstr "Сетевой узел" +msgstr "Сетевой Ñервер" #: platform/osx/export/export.cpp -#, fuzzy msgid "Network Client" -msgstr "Сетевой узел" +msgstr "Сетевой клиент" #: platform/osx/export/export.cpp -#, fuzzy msgid "Device USB" -msgstr "УÑтройÑтво" +msgstr "УÑтройÑтво USB" #: platform/osx/export/export.cpp msgid "Device Bluetooth" -msgstr "" +msgstr "УÑтройÑтво Bluetooth" #: platform/osx/export/export.cpp -#, fuzzy msgid "Files Downloads" -msgstr "Загрузка" +msgstr "Файлы загрузок" #: platform/osx/export/export.cpp -#, fuzzy msgid "Files Pictures" -msgstr "ВозможноÑти" +msgstr "Файлы картинок" #: platform/osx/export/export.cpp -#, fuzzy msgid "Files Music" -msgstr "Файлы" +msgstr "Файлы музыки" #: platform/osx/export/export.cpp -#, fuzzy msgid "Files Movies" -msgstr "Фильтр тайлов" +msgstr "Файлы фильмов" #: platform/osx/export/export.cpp platform/windows/export/export.cpp -#, fuzzy msgid "Custom Options" -msgstr "Параметры шины" +msgstr "ПользовательÑкие параметры" #: platform/osx/export/export.cpp #, fuzzy @@ -19686,27 +19648,24 @@ msgid "Apple ID Name" msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "Apple ID Password" -msgstr "Пароль" +msgstr "Пароль Apple ID" #: platform/osx/export/export.cpp msgid "Apple Team ID" msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not open icon file \"%s\"." -msgstr "Ðе удалоÑÑŒ ÑкÑпортировать файлы проекта" +msgstr "Ðе получилоÑÑŒ открыть файлы иконок \"%s\"." #: platform/osx/export/export.cpp msgid "Could not start xcrun executable." msgstr "Ðе удаётÑÑ Ð·Ð°Ð¿ÑƒÑтить иÑполнÑемый файл xcrun." #: platform/osx/export/export.cpp -#, fuzzy msgid "Notarization failed." -msgstr "ЛокализациÑ" +msgstr "ÐÐ¾Ñ‚Ð°Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ðµ удалаÑÑŒ." #: platform/osx/export/export.cpp msgid "Notarization request UUID: \"%s\"" @@ -19762,15 +19721,16 @@ msgid "" "Could not start codesign executable, make sure Xcode command line tools are " "installed." msgstr "" +"Ðе удалоÑÑŒ запуÑтить иÑполнÑемый файл codesign, убедитеÑÑŒ, что инÑтрументы " +"командной Ñтроки Xcode уÑтановлены." #: platform/osx/export/export.cpp platform/windows/export/export.cpp msgid "No identity found." msgstr "Identity не найдена." #: platform/osx/export/export.cpp -#, fuzzy msgid "Cannot sign file %s." -msgstr "Ошибка при Ñохранении файла: %s" +msgstr "Ðе удалоÑÑŒ подпиÑать файл %s." #: platform/osx/export/export.cpp #, fuzzy @@ -19790,25 +19750,23 @@ msgstr "Ðе удаётÑÑ Ð·Ð°Ð¿ÑƒÑтить иÑполнÑемый файл h #: platform/osx/export/export.cpp msgid "`hdiutil create` failed - file exists." -msgstr "" +msgstr "Ðе удалоÑÑŒ выполнить `hdiutil create` - файл уже ÑущеÑтвует." #: platform/osx/export/export.cpp msgid "`hdiutil create` failed." -msgstr "" +msgstr "Ðе удалоÑÑŒ выполнить `hdiutil create`." #: platform/osx/export/export.cpp msgid "Creating app bundle" msgstr "Создание пакета приложениÑ" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not find template app to export: \"%s\"." -msgstr "Ðе удалоÑÑŒ найти шаблон Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑкÑпорта:" +msgstr "Ðе удалоÑÑŒ найти шаблон Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑкÑпорта: \"%s\"." #: platform/osx/export/export.cpp -#, fuzzy msgid "Invalid export format." -msgstr "Ðеверный шаблон ÑкÑпорта:" +msgstr "Ðеверный формат ÑкÑпорта." #: platform/osx/export/export.cpp msgid "" @@ -19868,9 +19826,8 @@ msgid "Sending archive for notarization" msgstr "Отправка архива Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ" #: platform/osx/export/export.cpp -#, fuzzy msgid "ZIP Creation" -msgstr "ПроекциÑ" +msgstr "Создание ZIP" #: platform/osx/export/export.cpp msgid "Could not open file to read from path \"%s\"." @@ -20016,9 +19973,8 @@ msgid "Force Builtin Codesign" msgstr "" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Architecture" -msgstr "Добавить поле архитектуры" +msgstr "Ðрхитектура" #: platform/uwp/export/export.cpp #, fuzzy @@ -20031,7 +19987,7 @@ msgstr "Короткое имÑ" #: platform/uwp/export/export.cpp msgid "Publisher" -msgstr "" +msgstr "Издатель" #: platform/uwp/export/export.cpp msgid "Publisher Display Name" @@ -20042,9 +19998,8 @@ msgid "Product GUID" msgstr "GUID Продукта" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Publisher GUID" -msgstr "ОчиÑтить направлÑющие" +msgstr "Издатель GUID" #: platform/uwp/export/export.cpp #, fuzzy @@ -20052,14 +20007,12 @@ msgid "Signing" msgstr "Сигнал" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Certificate" -msgstr "Сертификаты" +msgstr "Сертификат" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Algorithm" -msgstr "Отладчик" +msgstr "Ðлгоритм" #: platform/uwp/export/export.cpp msgid "Major" @@ -20070,9 +20023,8 @@ msgid "Minor" msgstr "" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Build" -msgstr "Режим измерениÑ" +msgstr "Сборка" #: platform/uwp/export/export.cpp #, fuzzy @@ -20084,9 +20036,8 @@ msgid "Landscape" msgstr "" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Portrait" -msgstr "Порт" +msgstr "Портрет" #: platform/uwp/export/export.cpp msgid "Landscape Flipped" @@ -20103,23 +20054,23 @@ msgstr "Режим маÑштабированиÑ" #: platform/uwp/export/export.cpp msgid "Square 44 X 44 Logo" -msgstr "" +msgstr "Квадратный логотип 44 X 44" #: platform/uwp/export/export.cpp msgid "Square 71 X 71 Logo" -msgstr "" +msgstr "Квадратный логотип 71 X 71" #: platform/uwp/export/export.cpp msgid "Square 150 X 150 Logo" -msgstr "" +msgstr "Квадратный логотип 150 X 150" #: platform/uwp/export/export.cpp msgid "Square 310 X 310 Logo" -msgstr "" +msgstr "Квадратный логотип 310 X 310" #: platform/uwp/export/export.cpp msgid "Wide 310 X 150 Logo" -msgstr "" +msgstr "Широкий логотип 310 X 150" #: platform/uwp/export/export.cpp #, fuzzy @@ -20127,13 +20078,12 @@ msgid "Splash Screen" msgstr "РиÑовать Ñкран" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Tiles" -msgstr "Файлы" +msgstr "Тайлы" #: platform/uwp/export/export.cpp msgid "Show Name On Square 150 X 150" -msgstr "" +msgstr "Показать Ð¸Ð¼Ñ Ð½Ð° квадрате 150 X 150" #: platform/uwp/export/export.cpp msgid "Show Name On Wide 310 X 150" @@ -20144,6 +20094,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "ÐедопуÑтимое короткое Ð¸Ð¼Ñ Ð¿Ð°ÐºÐµÑ‚Ð°." @@ -20200,23 +20156,20 @@ msgid "UWP" msgstr "UWP" #: platform/uwp/export/export.cpp platform/windows/export/export.cpp -#, fuzzy msgid "Signtool" -msgstr "Сигнал" +msgstr "ИнÑтрумент подпиÑи" #: platform/uwp/export/export.cpp msgid "Debug Certificate" msgstr "Сертификат отладки" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Debug Algorithm" -msgstr "Отладчик" +msgstr "Ðлгоритм отладчика" #: platform/windows/export/export.cpp -#, fuzzy msgid "Failed to rename temporary file \"%s\"." -msgstr "Ðевозможно удалить временный файл:" +msgstr "Ðевозможно удалить временный файл \"%s\"." #: platform/windows/export/export.cpp msgid "Identity Type" @@ -20232,41 +20185,36 @@ msgid "Digest Algorithm" msgstr "Отладчик" #: platform/windows/export/export.cpp -#, fuzzy msgid "Modify Resources" -msgstr "Копировать параметры" +msgstr "Изменить реÑурÑÑ‹" #: platform/windows/export/export.cpp -#, fuzzy msgid "File Version" -msgstr "ВерÑиÑ" +msgstr "ВерÑÐ¸Ñ Ñ„Ð°Ð¹Ð»Ð°" #: platform/windows/export/export.cpp msgid "Product Version" msgstr "ВерÑÐ¸Ñ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ð°" #: platform/windows/export/export.cpp -#, fuzzy msgid "Company Name" -msgstr "Ð˜Ð¼Ñ ÐºÐ¾Ñти" +msgstr "Ð˜Ð¼Ñ ÐºÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ð¸" #: platform/windows/export/export.cpp msgid "Product Name" msgstr "Ðазвание продукта" #: platform/windows/export/export.cpp -#, fuzzy msgid "File Description" -msgstr "ОпиÑание" +msgstr "ОпиÑание файла" #: platform/windows/export/export.cpp msgid "Trademarks" -msgstr "" +msgstr "Торговые марки" #: platform/windows/export/export.cpp -#, fuzzy msgid "Resources Modification" -msgstr "Ð’Ñплывающее уведомление" +msgstr "Изменение реÑурÑов" #: platform/windows/export/export.cpp #, fuzzy @@ -20289,9 +20237,8 @@ msgstr "" "Windows > Rcedit) Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñ‡ÐºÐ° или информационных данных приложениÑ." #: platform/windows/export/export.cpp -#, fuzzy msgid "rcedit failed to modify executable: %s." -msgstr "ÐедопуÑтимый иÑполнÑемый файл." +msgstr "rcedit не Ñмог изменить иÑполнÑемый файл: %s." #: platform/windows/export/export.cpp #, fuzzy @@ -20304,14 +20251,12 @@ msgid "Could not find osslsigncode executable at \"%s\"." msgstr "Ðе удалоÑÑŒ найти хранилище ключей, невозможно ÑкÑпортировать." #: platform/windows/export/export.cpp -#, fuzzy msgid "Invalid identity type." -msgstr "Ðеверный идентификатор:" +msgstr "Ðеверный идентификатор." #: platform/windows/export/export.cpp -#, fuzzy msgid "Invalid timestamp server." -msgstr "ÐедопуÑтимое имÑ." +msgstr "Ðеверный Ñервер метки времени." #: platform/windows/export/export.cpp #, fuzzy @@ -20324,14 +20269,12 @@ msgstr "" "Windows > Rcedit) Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñ‡ÐºÐ° или информационных данных приложениÑ." #: platform/windows/export/export.cpp -#, fuzzy msgid "Signtool failed to sign executable: %s." -msgstr "ÐедопуÑтимый иÑполнÑемый файл." +msgstr "Signtool не Ñмог подпиÑать иÑполнÑемый файл: %s." #: platform/windows/export/export.cpp -#, fuzzy msgid "Failed to remove temporary file \"%s\"." -msgstr "Ðевозможно удалить временный файл:" +msgstr "Ðевозможно удалить временный файл \"%s\"." #: platform/windows/export/export.cpp msgid "" @@ -20358,9 +20301,8 @@ msgid "Windows executables cannot be >= 4 GiB." msgstr "" #: platform/windows/export/export.cpp platform/x11/export/export.cpp -#, fuzzy msgid "Failed to open executable file \"%s\"." -msgstr "ÐедопуÑтимый иÑполнÑемый файл." +msgstr "Ðе удалоÑÑŒ открыть иÑполнÑемый файл \"%s\"." #: platform/windows/export/export.cpp platform/x11/export/export.cpp msgid "Executable file header corrupted." @@ -20429,39 +20371,32 @@ msgid "Flip V" msgstr "" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Monitoring" -msgstr "Параметр" +msgstr "Ðаблюдение" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Monitorable" -msgstr "Параметр" +msgstr "Ðаблюдаемый" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Physics Overrides" -msgstr "Переопределить" +msgstr "Переопределение физики" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Space Override" -msgstr "Переопределить" +msgstr "Переопределение проÑтранÑтва" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Gravity Point" -msgstr "Генерировать точки" +msgstr "Точка гравитации" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Gravity Distance Scale" -msgstr "Ждать Ñигнал объекта" +msgstr "МаÑштаб гравитационной диÑтанции" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Gravity Vec" -msgstr "Превью по умолчанию" +msgstr "Вектор Гравитации" #: scene/2d/area_2d.cpp scene/2d/cpu_particles_2d.cpp scene/3d/area.cpp #: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp @@ -20478,9 +20413,8 @@ msgid "Angular Damp" msgstr "" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Audio Bus" -msgstr "Добавить аудио шину" +msgstr "Ðудио шина" #: scene/2d/area_2d.cpp scene/3d/area.cpp #, fuzzy @@ -20489,9 +20423,8 @@ msgstr "Переопределить" #: scene/2d/audio_stream_player_2d.cpp scene/audio/audio_stream_player.cpp #: scene/gui/video_player.cpp servers/audio/effects/audio_effect_amplify.cpp -#, fuzzy msgid "Volume dB" -msgstr "Объём" +msgstr "ГромкоÑть dB" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp @@ -20502,9 +20435,8 @@ msgstr "МаÑштабировать" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp -#, fuzzy msgid "Autoplay" -msgstr "Переключить автовоÑпроизведение" +msgstr "ÐвтовоÑпроизведение" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp @@ -20519,9 +20451,8 @@ msgid "Max Distance" msgstr "МакÑимальное раÑÑтоÑние" #: scene/2d/audio_stream_player_2d.cpp scene/3d/light.cpp -#, fuzzy msgid "Attenuation" -msgstr "ÐнимациÑ" +msgstr "Затухание" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp @@ -20541,9 +20472,8 @@ msgid "Anchor Mode" msgstr "Режим Ñкорей" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "Rotating" -msgstr "ВращающийÑÑ" +msgstr "Вращение" #: scene/2d/camera_2d.cpp scene/2d/listener_2d.cpp scene/3d/camera.cpp #: scene/3d/listener.cpp scene/animation/animation_blend_tree.cpp @@ -20556,9 +20486,8 @@ msgid "Zoom" msgstr "Приблизить" #: scene/2d/camera_2d.cpp scene/main/canvas_layer.cpp -#, fuzzy msgid "Custom Viewport" -msgstr "1 Окно" +msgstr "ПользовательÑкое окно проÑмотра" #: scene/2d/camera_2d.cpp scene/3d/camera.cpp scene/3d/interpolated_camera.cpp #: scene/animation/animation_player.cpp scene/animation/animation_tree.cpp @@ -20573,22 +20502,19 @@ msgstr "Лимит" #: scene/2d/camera_2d.cpp scene/gui/control.cpp scene/gui/nine_patch_rect.cpp #: scene/resources/style_box.cpp scene/resources/texture.cpp -#, fuzzy msgid "Left" -msgstr "UI Влево" +msgstr "Лево" #: scene/2d/camera_2d.cpp scene/gui/control.cpp scene/gui/nine_patch_rect.cpp #: scene/resources/style_box.cpp scene/resources/texture.cpp -#, fuzzy msgid "Right" -msgstr "Свет" +msgstr "Право" #: scene/2d/camera_2d.cpp scene/gui/control.cpp scene/gui/nine_patch_rect.cpp #: scene/resources/dynamic_font.cpp scene/resources/style_box.cpp #: scene/resources/texture.cpp -#, fuzzy msgid "Bottom" -msgstr "Слева внизу" +msgstr "Внизу" #: scene/2d/camera_2d.cpp #, fuzzy @@ -20645,9 +20571,8 @@ msgstr "Задать отÑтуп" #: scene/2d/canvas_item.cpp scene/resources/environment.cpp #: scene/resources/material.cpp -#, fuzzy msgid "Blend Mode" -msgstr "Blend2 узел" +msgstr "Режим ÑмешиваниÑ" #: scene/2d/canvas_item.cpp #, fuzzy @@ -20655,9 +20580,8 @@ msgid "Light Mode" msgstr "Справа по вÑей выÑоте" #: scene/2d/canvas_item.cpp -#, fuzzy msgid "Particles Animation" -msgstr "ЧаÑтицы" +msgstr "ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ñ‡Ð°Ñтиц" #: scene/2d/canvas_item.cpp msgid "Particles Anim H Frames" @@ -20668,9 +20592,8 @@ msgid "Particles Anim V Frames" msgstr "" #: scene/2d/canvas_item.cpp -#, fuzzy msgid "Particles Anim Loop" -msgstr "ЧаÑтицы" +msgstr "Цикл анимации чаÑтиц" #: scene/2d/canvas_item.cpp scene/3d/spatial.cpp msgid "Visibility" @@ -20691,9 +20614,8 @@ msgid "Show Behind Parent" msgstr "" #: scene/2d/canvas_item.cpp -#, fuzzy msgid "Show On Top" -msgstr "Отображать центр" +msgstr "Отображать поверх" #: scene/2d/canvas_item.cpp scene/2d/light_occluder_2d.cpp #: scene/2d/tile_map.cpp @@ -20758,9 +20680,8 @@ msgid "" msgstr "" #: scene/2d/collision_polygon_2d.cpp -#, fuzzy msgid "Build Mode" -msgstr "Режим измерениÑ" +msgstr "Режим Ñборки" #: scene/2d/collision_polygon_2d.cpp scene/2d/collision_shape_2d.cpp #: scene/3d/collision_polygon.cpp scene/3d/collision_shape.cpp @@ -20774,9 +20695,8 @@ msgid "One Way Collision" msgstr "ОдноÑтороннее Ñтолкновение" #: scene/2d/collision_polygon_2d.cpp scene/2d/collision_shape_2d.cpp -#, fuzzy msgid "One Way Collision Margin" -msgstr "Создать полигон Ñтолкновений" +msgstr "ОтÑтуп одноÑтороннего полигона Ñтолкновений" #: scene/2d/collision_shape_2d.cpp msgid "" @@ -20851,9 +20771,8 @@ msgstr "" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp -#, fuzzy msgid "Fixed FPS" -msgstr "Показывать FPS" +msgstr "ФикÑированный FPS" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp @@ -20867,9 +20786,8 @@ msgstr "" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp -#, fuzzy msgid "Local Coords" -msgstr "Локальные проекты" +msgstr "Локальные координаты" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp @@ -20892,15 +20810,13 @@ msgid "Rect Extents" msgstr "Гизмо" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp -#, fuzzy msgid "Normals" -msgstr "Формат" +msgstr "Ðормали" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Align Y" -msgstr "Оператор приÑваиваниÑ" +msgstr "Выравнивать по Y" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -20920,9 +20836,8 @@ msgstr "ÐÐ°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑть" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Velocity Random" -msgstr "СкороÑть" +msgstr "Ð¡Ð»ÑƒÑ‡Ð°Ð¹Ð½Ð°Ñ ÑкороÑть" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp servers/physics_2d_server.cpp @@ -20932,9 +20847,8 @@ msgstr "Ð£Ð³Ð»Ð¾Ð²Ð°Ñ ÑкороÑть" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Velocity Curve" -msgstr "СкороÑть" +msgstr "ÐšÑ€Ð¸Ð²Ð°Ñ ÑкороÑти" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -20948,20 +20862,18 @@ msgstr "Линейное уÑкорение" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Accel" -msgstr "ДоÑтуп" +msgstr "УÑкорение" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Accel Random" -msgstr "" +msgstr "Случайное уÑкорение" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Accel Curve" -msgstr "Разделить кривую" +msgstr "ÐšÑ€Ð¸Ð²Ð°Ñ ÑƒÑкорениÑ" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -20988,9 +20900,8 @@ msgstr "" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Damping Curve" -msgstr "Разделить кривую" +msgstr "ÐšÑ€Ð¸Ð²Ð°Ñ Ð·Ð°Ñ‚ÑƒÑ…Ð°Ð½Ð¸Ñ" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp scene/3d/light.cpp #: scene/resources/particles_material.cpp @@ -21004,23 +20915,20 @@ msgstr "" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Angle Curve" -msgstr "Сомкнуть кривую" +msgstr "ÐšÑ€Ð¸Ð²Ð°Ñ ÑƒÐ³Ð»Ð°" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp -#, fuzzy msgid "Scale Amount" -msgstr "КоличеÑтво Ñолнц" +msgstr "МаÑштаб" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp msgid "Scale Amount Random" msgstr "" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp -#, fuzzy msgid "Scale Amount Curve" -msgstr "МаÑштабировать от курÑора" +msgstr "ÐšÑ€Ð¸Ð²Ð°Ñ Ð¼Ð°Ñштаба" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21040,45 +20948,38 @@ msgstr "Ð’Ð°Ñ€Ð¸Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ñ‚ÐµÐ½ÐºÐ°" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Variation" -msgstr "Ð’Ð°Ñ€Ð¸Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ñ‚ÐµÐ½ÐºÐ°" +msgstr "ВариациÑ" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Variation Random" -msgstr "Ð’Ð°Ñ€Ð¸Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ñ‚ÐµÐ½ÐºÐ°" +msgstr "Ð¡Ð»ÑƒÑ‡Ð°Ð¹Ð½Ð°Ñ Ð²Ð°Ñ€Ð¸Ð°Ñ†Ð¸Ñ" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Variation Curve" -msgstr "Ð’Ð°Ñ€Ð¸Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ñ‚ÐµÐ½ÐºÐ°" +msgstr "ÐšÑ€Ð¸Ð²Ð°Ñ Ð²Ð°Ñ€Ð¸Ð°Ñ†Ð¸Ð¸" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Speed Random" -msgstr "МаÑштаб ÑкороÑти" +msgstr "Ð¡Ð»ÑƒÑ‡Ð°Ð¹Ð½Ð°Ñ ÑкороÑть" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Speed Curve" -msgstr "Разделить кривую" +msgstr "ÐšÑ€Ð¸Ð²Ð°Ñ ÑкороÑти" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Offset Random" -msgstr "Смещение" +msgstr "Случайное Ñмещение" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Offset Curve" -msgstr "Сомкнуть кривую" +msgstr "ÐšÑ€Ð¸Ð²Ð°Ñ ÑмещениÑ" #: scene/2d/joints_2d.cpp msgid "Node A and Node B must be PhysicsBody2Ds" @@ -21104,14 +21005,12 @@ msgstr "" "Узел Ри Узел B должны быть различными ÑкземплÑрами клаÑÑа PhysicsBody2D" #: scene/2d/joints_2d.cpp scene/3d/physics_joint.cpp -#, fuzzy msgid "Node A" -msgstr "Узел" +msgstr "Узел Ð" #: scene/2d/joints_2d.cpp scene/3d/physics_joint.cpp -#, fuzzy msgid "Node B" -msgstr "Узел" +msgstr "Узел B" #: scene/2d/joints_2d.cpp scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp #: scene/3d/light.cpp scene/3d/physics_body.cpp scene/3d/physics_joint.cpp @@ -21120,9 +21019,8 @@ msgid "Bias" msgstr "" #: scene/2d/joints_2d.cpp -#, fuzzy msgid "Disable Collision" -msgstr "Ð—Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ°" +msgstr "Отключить ÑтолкновениÑ" #: scene/2d/joints_2d.cpp scene/3d/physics_body.cpp scene/3d/physics_joint.cpp msgid "Softness" @@ -21134,9 +21032,8 @@ msgid "Length" msgstr "Длина" #: scene/2d/joints_2d.cpp -#, fuzzy msgid "Initial Offset" -msgstr "Инициализировать" +msgstr "Ðачальное Ñмещение" #: scene/2d/joints_2d.cpp scene/3d/vehicle_body.cpp msgid "Rest Length" @@ -21158,9 +21055,8 @@ msgid "Editor Only" msgstr "Редактор" #: scene/2d/light_2d.cpp -#, fuzzy msgid "Texture Scale" -msgstr "ОблаÑть текÑтуры" +msgstr "МаÑштаб текÑтуры" #: scene/2d/light_2d.cpp scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp #: scene/3d/light.cpp scene/resources/environment.cpp @@ -21177,14 +21073,12 @@ msgid "Z Max" msgstr "" #: scene/2d/light_2d.cpp -#, fuzzy msgid "Layer Min" -msgstr "Изменить размер камеры" +msgstr "Слой Min" #: scene/2d/light_2d.cpp -#, fuzzy msgid "Layer Max" -msgstr "Слой" +msgstr "Слой Max" #: scene/2d/light_2d.cpp msgid "Item Cull Mask" @@ -21199,14 +21093,12 @@ msgid "Buffer Size" msgstr "Размер буфера" #: scene/2d/light_2d.cpp -#, fuzzy msgid "Gradient Length" -msgstr "Градиент отредактирован" +msgstr "Длина градиента" #: scene/2d/light_2d.cpp -#, fuzzy msgid "Filter Smooth" -msgstr "Фильтр методов" +msgstr "Фильтровать Ñглаживание" #: scene/2d/light_occluder_2d.cpp msgid "Closed" @@ -21328,14 +21220,12 @@ msgid "Path Max Distance" msgstr "МакÑимальное раÑÑтоÑние пути" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp -#, fuzzy msgid "Avoidance" -msgstr "Дополнительно" +msgstr "Уклонение" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp -#, fuzzy msgid "Avoidance Enabled" -msgstr "Включить" +msgstr "Включить уклонение" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Neighbor Dist" @@ -21550,14 +21440,12 @@ msgid "Layers" msgstr "Слои" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Constant Linear Velocity" -msgstr "Инициализировать" +msgstr "ПоÑтоÑÐ½Ð½Ð°Ñ Ð»Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ ÑкороÑть" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Constant Angular Velocity" -msgstr "Инициализировать" +msgstr "ПоÑтоÑÐ½Ð½Ð°Ñ ÑƒÐ³Ð»Ð¾Ð²Ð°Ñ ÑкороÑть" #: scene/2d/physics_body_2d.cpp scene/2d/tile_map.cpp scene/3d/physics_body.cpp #: scene/resources/physics_material.cpp @@ -21694,26 +21582,22 @@ msgstr "ID коллайдера" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collider RID" -msgstr "Ðеверный RID" +msgstr "Коллайдер RID" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collider Shape" -msgstr "Режим ÑтолкновениÑ" +msgstr "Форма коллайдера" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Collider Shape Index" -msgstr "Режим ÑтолкновениÑ" +msgstr "Ð˜Ð½Ð´ÐµÐºÑ Ñ„Ð¾Ñ€Ð¼Ñ‹ коллайдера" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collider Velocity" -msgstr "Вид Ñ Ð¾Ñ€Ð±Ð¸Ñ‚Ñ‹ вправо" +msgstr "СкороÑть коллайдера" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Collider Metadata" @@ -21724,14 +21608,12 @@ msgid "Invert" msgstr "" #: scene/2d/polygon_2d.cpp -#, fuzzy msgid "Vertex Colors" -msgstr "Вершины" +msgstr "Цвета вершин" #: scene/2d/polygon_2d.cpp -#, fuzzy msgid "Internal Vertex Count" -msgstr "Создать внутреннюю вершину" +msgstr "Внутренний Ñчет вершин" #: scene/2d/position_2d.cpp #, fuzzy @@ -21743,9 +21625,8 @@ msgid "Exclude Parent" msgstr "" #: scene/2d/ray_cast_2d.cpp scene/3d/ray_cast.cpp -#, fuzzy msgid "Cast To" -msgstr "Создать Шейдерный узел" +msgstr "ОтбраÑывать на" #: scene/2d/ray_cast_2d.cpp scene/3d/ray_cast.cpp msgid "Collide With" @@ -21766,14 +21647,12 @@ msgstr "" "Node2D." #: scene/2d/remote_transform_2d.cpp scene/3d/remote_transform.cpp -#, fuzzy msgid "Remote Path" -msgstr "Удалить точку" +msgstr "Удаленный путь" #: scene/2d/remote_transform_2d.cpp scene/3d/remote_transform.cpp -#, fuzzy msgid "Use Global Coordinates" -msgstr "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ ÐºÐ¾Ð¾Ñ€Ð´Ð¸Ð½Ð°Ñ‚Ð°" +msgstr "ИÑпользовать глобальные координаты" #: scene/2d/skeleton_2d.cpp scene/3d/skeleton.cpp #, fuzzy @@ -21781,9 +21660,8 @@ msgid "Rest" msgstr "ПерезапуÑтить" #: scene/2d/skeleton_2d.cpp -#, fuzzy msgid "Default Length" -msgstr "Тема по умолчанию" +msgstr "Длина по умолчанию" #: scene/2d/skeleton_2d.cpp msgid "This Bone2D chain should end at a Skeleton2D node." @@ -21834,9 +21712,8 @@ msgid "Tile Set" msgstr "Ðабор тайлов" #: scene/2d/tile_map.cpp -#, fuzzy msgid "Quadrant Size" -msgstr "Изменить размер камеры" +msgstr "Размер квадранта" #: scene/2d/tile_map.cpp #, fuzzy @@ -21859,14 +21736,12 @@ msgid "Y Sort" msgstr "Сортировать" #: scene/2d/tile_map.cpp -#, fuzzy msgid "Show Collision" -msgstr "Столкновение" +msgstr "Показывать Ñтолкновение" #: scene/2d/tile_map.cpp -#, fuzzy msgid "Compatibility Mode" -msgstr "Режим приоритета" +msgstr "Режим ÑовмеÑтимоÑти" #: scene/2d/tile_map.cpp msgid "Centered Textures" @@ -21877,9 +21752,8 @@ msgid "Cell Clip UV" msgstr "" #: scene/2d/tile_map.cpp -#, fuzzy msgid "Use Parent" -msgstr "Режим ÑтолкновениÑ" +msgstr "ИÑпользовать родитель" #: scene/2d/tile_map.cpp msgid "Use Kinematic" @@ -21891,9 +21765,8 @@ msgid "Shape Centered" msgstr "ПривÑзка к центру узла" #: scene/2d/touch_screen_button.cpp -#, fuzzy msgid "Shape Visible" -msgstr "Переключить видимоÑть" +msgstr "ВидимоÑть формы" #: scene/2d/touch_screen_button.cpp msgid "Passby Press" @@ -21912,29 +21785,24 @@ msgstr "" "ÑвлÑетÑÑ ÐµÐ³Ð¾ прÑмым родителем." #: scene/2d/visibility_notifier_2d.cpp scene/3d/visibility_notifier.cpp -#, fuzzy msgid "Pause Animations" -msgstr "Ð’Ñтавить анимацию" +msgstr "ПриоÑтановить анимации" #: scene/2d/visibility_notifier_2d.cpp scene/3d/visibility_notifier.cpp -#, fuzzy msgid "Freeze Bodies" -msgstr "Тела" +msgstr "Заморозить тела" #: scene/2d/visibility_notifier_2d.cpp -#, fuzzy msgid "Pause Particles" -msgstr "ЧаÑтицы" +msgstr "ПриоÑтановить чаÑтицы" #: scene/2d/visibility_notifier_2d.cpp -#, fuzzy msgid "Pause Animated Sprites" -msgstr "Ð’Ñтавить анимацию" +msgstr "ПриоÑтановить анимационные Ñпрайты" #: scene/2d/visibility_notifier_2d.cpp -#, fuzzy msgid "Process Parent" -msgstr "Включить приоритет" +msgstr "Родитель процеÑÑа" #: scene/2d/visibility_notifier_2d.cpp msgid "Physics Process Parent" @@ -21974,9 +21842,8 @@ msgstr "" "будет привÑзан к фактичеÑкому контроллеру." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "Anchor ID" -msgstr "Только ÑкорÑ" +msgstr "ID ÑкорÑ" #: scene/3d/arvr_nodes.cpp msgid "ARVRAnchor must have an ARVROrigin node as its parent." @@ -22000,9 +21867,8 @@ msgid "World Scale" msgstr "Мировой маÑштаб" #: scene/3d/audio_stream_player_3d.cpp -#, fuzzy msgid "Attenuation Model" -msgstr "Animation узел" +msgstr "Модель затуханиÑ" #: scene/3d/audio_stream_player_3d.cpp msgid "Unit dB" @@ -22021,9 +21887,8 @@ msgid "Out Of Range Mode" msgstr "Режим Вне Зоны ДейÑтвиÑ" #: scene/3d/audio_stream_player_3d.cpp -#, fuzzy msgid "Emission Angle" -msgstr "Цвета излучениÑ" +msgstr "Угол излучениÑ" #: scene/3d/audio_stream_player_3d.cpp msgid "Degrees" @@ -22158,18 +22023,16 @@ msgid "Min Light" msgstr "Минимальный Свет" #: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp -#, fuzzy msgid "Propagation" -msgstr "ÐавигациÑ" +msgstr "РаÑпроÑтранение" #: scene/3d/baked_lightmap.cpp msgid "Image Path" msgstr "Путь к изображению" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Light Data" -msgstr "С данными" +msgstr "Данные Ñвета" #: scene/3d/bone_attachment.cpp scene/3d/physics_body.cpp msgid "Bone Name" @@ -22319,28 +22182,24 @@ msgid "Ring Axis" msgstr "ОÑÑŒ Кольца" #: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp -#, fuzzy msgid "Rotate Y" -msgstr "Повернуть" +msgstr "Повернуть по Y" #: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp -#, fuzzy msgid "Disable Z" -msgstr "Отключить 3D" +msgstr "Отключить Z" #: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp msgid "Flatness" msgstr "ПлоÑкоÑтноÑть" #: scene/3d/cull_instance.cpp servers/visual_server.cpp -#, fuzzy msgid "Portals" -msgstr "Перевернуть порталы" +msgstr "Порталы" #: scene/3d/cull_instance.cpp -#, fuzzy msgid "Portal Mode" -msgstr "Режим приоритета" +msgstr "Режим портала" #: scene/3d/cull_instance.cpp msgid "Include In Bound" @@ -22386,9 +22245,8 @@ msgid "Subdiv" msgstr "" #: scene/3d/gi_probe.cpp -#, fuzzy msgid "Dynamic Range" -msgstr "ДинамичеÑÐºÐ°Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ°" +msgstr "ДинамичеÑкий диапазон" #: scene/3d/gi_probe.cpp scene/3d/light.cpp msgid "Normal Bias" @@ -22396,23 +22254,20 @@ msgstr "" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp #: scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Pixel Size" -msgstr "ПопикÑÐµÐ»ÑŒÐ½Ð°Ñ Ð¿Ñ€Ð¸Ð²Ñзка" +msgstr "Размер пикÑелÑ" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp msgid "Billboard" msgstr "" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp -#, fuzzy msgid "Shaded" -msgstr "Шейдер" +msgstr "Затененный" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp -#, fuzzy msgid "Double Sided" -msgstr "Двойной щелчок" +msgstr "ДвухÑторонний" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/material.cpp msgid "No Depth Test" @@ -22436,9 +22291,8 @@ msgid "Render Priority" msgstr "Приоритет рендеринга" #: scene/3d/label_3d.cpp -#, fuzzy msgid "Outline Render Priority" -msgstr "Приоритет рендеринга" +msgstr "Выделить приоритет рендеринга" #: scene/3d/label_3d.cpp #, fuzzy @@ -22451,14 +22305,12 @@ msgid "Font" msgstr "Шрифт" #: scene/3d/label_3d.cpp scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Horizontal Alignment" -msgstr "Ð“Ð¾Ñ€Ð¸Ð·Ð¾Ð½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð°" +msgstr "Горизонтальное выравнивание" #: scene/3d/label_3d.cpp -#, fuzzy msgid "Vertical Alignment" -msgstr "Выравнивание" +msgstr "Вертикальное выравнивание" #: scene/3d/label_3d.cpp scene/gui/dialogs.cpp scene/gui/label.cpp msgid "Autowrap" @@ -22470,25 +22322,21 @@ msgid "Indirect Energy" msgstr "Цвета излучениÑ" #: scene/3d/light.cpp -#, fuzzy msgid "Negative" -msgstr "GDNative" +msgstr "Ðегатив" #: scene/3d/light.cpp scene/resources/material.cpp #: scene/resources/visual_shader.cpp -#, fuzzy msgid "Specular" -msgstr "Режим измерениÑ" +msgstr "" #: scene/3d/light.cpp -#, fuzzy msgid "Bake Mode" -msgstr "Режим битовой маÑки" +msgstr "Режим запеканиÑ" #: scene/3d/light.cpp -#, fuzzy msgid "Contact" -msgstr "КонтраÑÑ‚" +msgstr "Контакт" #: scene/3d/light.cpp #, fuzzy @@ -22496,24 +22344,20 @@ msgid "Reverse Cull Face" msgstr "СброÑить громкоÑть шины" #: scene/3d/light.cpp servers/visual_server.cpp -#, fuzzy msgid "Directional Shadow" -msgstr "ÐаправлениÑ" +msgstr "Ðаправленные тени" #: scene/3d/light.cpp -#, fuzzy msgid "Split 1" -msgstr "Раздельный" +msgstr "Раздельный 1" #: scene/3d/light.cpp -#, fuzzy msgid "Split 2" -msgstr "Раздельный" +msgstr "Раздельный 2" #: scene/3d/light.cpp -#, fuzzy msgid "Split 3" -msgstr "Раздельный" +msgstr "Раздельный 3" #: scene/3d/light.cpp #, fuzzy @@ -22526,23 +22370,20 @@ msgid "Bias Split Scale" msgstr "Базовый маÑштаб" #: scene/3d/light.cpp -#, fuzzy msgid "Depth Range" -msgstr "Глубина" +msgstr "Диапазон глубины" #: scene/3d/light.cpp msgid "Omni" msgstr "" #: scene/3d/light.cpp -#, fuzzy msgid "Shadow Mode" -msgstr "Шейдер" +msgstr "Режим тени" #: scene/3d/light.cpp -#, fuzzy msgid "Shadow Detail" -msgstr "Показать по умолчанию" +msgstr "Детали тени" #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." @@ -22553,9 +22394,8 @@ msgid "Spot" msgstr "" #: scene/3d/light.cpp -#, fuzzy msgid "Angle Attenuation" -msgstr "ÐнимациÑ" +msgstr "Угол угаÑаниÑ" #: scene/3d/mesh_instance.cpp msgid "Software Skinning" @@ -22574,23 +22414,20 @@ msgid "" msgstr "" #: scene/3d/navigation.cpp scene/resources/curve.cpp -#, fuzzy msgid "Up Vector" -msgstr "Вектор" +msgstr "Вектор вверх" #: scene/3d/navigation.cpp -#, fuzzy msgid "Cell Height" -msgstr "ТеÑтируемые" +msgstr "Ð’Ñ‹Ñота клетки" #: scene/3d/navigation_agent.cpp msgid "Agent Height Offset" msgstr "" #: scene/3d/navigation_agent.cpp -#, fuzzy msgid "Ignore Y" -msgstr "[Игнорировать]" +msgstr "Игнорировать Y" #: scene/3d/navigation_agent.cpp #, fuzzy @@ -22659,9 +22496,8 @@ msgstr "" "Mode уÑтановлено в «Particle Billboard»." #: scene/3d/particles.cpp -#, fuzzy msgid "Visibility AABB" -msgstr "Переключить видимоÑть" +msgstr "ВидимоÑть AABB" #: scene/3d/particles.cpp #, fuzzy @@ -22701,59 +22537,48 @@ msgstr "" "Измените размер дочерней формы коллизии." #: scene/3d/physics_body.cpp -#, fuzzy msgid "Axis Lock" -msgstr "ОÑÑŒ" +msgstr "Заблокировать оÑÑŒ" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear X" -msgstr "Линейный" +msgstr "Линейный X" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear Y" -msgstr "Линейный" +msgstr "Линейный Y" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear Z" -msgstr "Линейный" +msgstr "Линейный Z" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Angular X" -msgstr "Ð£Ð³Ð»Ð¾Ð²Ð°Ñ ÑкороÑть" +msgstr "Ð£Ð³Ð»Ð¾Ð²Ð°Ñ ÑкороÑть X" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Angular Y" -msgstr "Ð£Ð³Ð»Ð¾Ð²Ð°Ñ ÑкороÑть" +msgstr "Ð£Ð³Ð»Ð¾Ð²Ð°Ñ ÑкороÑть Y" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Angular Z" -msgstr "Ð£Ð³Ð»Ð¾Ð²Ð°Ñ ÑкороÑть" +msgstr "Ð£Ð³Ð»Ð¾Ð²Ð°Ñ ÑкороÑть Z" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Motion X" -msgstr "Движение" +msgstr "Движение X" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Motion Y" -msgstr "Движение" +msgstr "Движение Y" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Motion Z" -msgstr "Движение" +msgstr "Движение Z" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Joint Constraints" -msgstr "КонÑтанты" +msgstr "ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ñоединений" #: scene/3d/physics_body.cpp scene/3d/physics_joint.cpp msgid "Impulse Clamp" @@ -22780,24 +22605,20 @@ msgid "Angular Limit Enabled" msgstr "Фильтр Ñигналов" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Angular Limit Upper" -msgstr "Линейный" +msgstr "Верхний лимит угловой ÑкороÑти" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Angular Limit Lower" -msgstr "Ð£Ð³Ð»Ð¾Ð²Ð°Ñ ÑкороÑть" +msgstr "Ðижний лимит угловой ÑкороÑти" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Angular Limit Bias" -msgstr "Линейный" +msgstr "Смещение лимита угловой ÑкороÑти" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Angular Limit Softness" -msgstr "Ð£Ð³Ð»Ð¾Ð²Ð°Ñ ÑкороÑть" +msgstr "МÑгкоÑть лимита угловой ÑкороÑти" #: scene/3d/physics_body.cpp #, fuzzy @@ -22805,14 +22626,12 @@ msgid "Angular Limit Relaxation" msgstr "Ð£Ð³Ð»Ð¾Ð²Ð°Ñ ÑкороÑть" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear Limit Upper" -msgstr "Линейный" +msgstr "Линейный лимит верхний" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear Limit Lower" -msgstr "Линейный" +msgstr "Линейный лимит нижний" #: scene/3d/physics_body.cpp #, fuzzy @@ -22961,14 +22780,12 @@ msgid "Angular Limit" msgstr "Угловой Предел" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Upper" -msgstr "ВЕРХÐИЙ РЕГИСТР" +msgstr "Верхний" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Lower" -msgstr "нижний региÑтр" +msgstr "Ðижний" #: scene/3d/physics_joint.cpp msgid "Motor" @@ -22985,14 +22802,12 @@ msgid "Max Impulse" msgstr "ÐœÐ°ÐºÑ ÑкороÑть" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Linear Limit" -msgstr "Линейный" +msgstr "Линейный лимит" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Upper Distance" -msgstr "РаÑÑтоÑние образца" +msgstr "ВерхнÑÑ Ð´Ð¸ÑтанциÑ" #: scene/3d/physics_joint.cpp #, fuzzy @@ -23005,29 +22820,24 @@ msgid "Restitution" msgstr "ОпиÑание" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Linear Motion" -msgstr "Инициализировать" +msgstr "Линейное движение" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Linear Ortho" -msgstr "Задний ортогональный" +msgstr "Линейный ортогональный" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Upper Angle" -msgstr "ВЕРХÐИЙ РЕГИСТР" +msgstr "Верхний Угол" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Lower Angle" -msgstr "нижний региÑтр" +msgstr "Ðижний угол" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Angular Motion" -msgstr "Ð£Ð³Ð»Ð¾Ð²Ð°Ñ ÑкороÑть" +msgstr "Угловое движение" #: scene/3d/physics_joint.cpp #, fuzzy @@ -23035,19 +22845,16 @@ msgid "Angular Ortho" msgstr "Ð£Ð³Ð»Ð¾Ð²Ð°Ñ Ð¿Ñ€ÑмоÑть" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Linear Limit X" -msgstr "Линейный" +msgstr "Линейный лимит X" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Linear Motor X" -msgstr "Инициализировать" +msgstr "Линейный мотор X" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Force Limit" -msgstr "РиÑовать лимиты" +msgstr "ФорÑировать лимиты" #: scene/3d/physics_joint.cpp #, fuzzy @@ -23072,14 +22879,12 @@ msgid "Angular Spring X" msgstr "X Угловой Пружины" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Linear Limit Y" -msgstr "Линейный" +msgstr "Линейный лимит Y" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Linear Motor Y" -msgstr "Инициализировать" +msgstr "Линейный мотор Y" #: scene/3d/physics_joint.cpp #, fuzzy @@ -23100,14 +22905,12 @@ msgid "Angular Spring Y" msgstr "Y Угловой Пружины" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Linear Limit Z" -msgstr "Линейный" +msgstr "Линейный лимит Z" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Linear Motor Z" -msgstr "Инициализировать" +msgstr "Линейный мотор Z" #: scene/3d/physics_joint.cpp #, fuzzy @@ -23152,14 +22955,12 @@ msgid "Linked Room" msgstr "СвÑÐ·Ð°Ð½Ð½Ð°Ñ ÐºÐ¾Ð¼Ð½Ð°Ñ‚Ð°" #: scene/3d/portal.cpp -#, fuzzy msgid "Use Default Margin" -msgstr "По умолчанию" +msgstr "ИÑпользовать отÑтупы по умолчанию" #: scene/3d/proximity_group.cpp -#, fuzzy msgid "Group Name" -msgstr "Сгруппирован" +msgstr "Ð˜Ð¼Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹" #: scene/3d/proximity_group.cpp msgid "Dispatch Mode" @@ -23170,18 +22971,16 @@ msgid "Grid Radius" msgstr "Ð Ð°Ð´Ð¸ÑƒÑ Ñетки" #: scene/3d/ray_cast.cpp -#, fuzzy msgid "Debug Shape" -msgstr "Отладчик" +msgstr "Форма отладчика" #: scene/3d/ray_cast.cpp scene/resources/style_box.cpp msgid "Thickness" msgstr "" #: scene/3d/reflection_probe.cpp scene/main/viewport.cpp -#, fuzzy msgid "Update Mode" -msgstr "Режим вращениÑ" +msgstr "Режим обновлениÑ" #: scene/3d/reflection_probe.cpp #, fuzzy @@ -23194,14 +22993,12 @@ msgid "Box Projection" msgstr "Проект" #: scene/3d/reflection_probe.cpp -#, fuzzy msgid "Enable Shadows" -msgstr "Включить привÑзку" +msgstr "Включить тени" #: scene/3d/reflection_probe.cpp -#, fuzzy msgid "Ambient Color" -msgstr "Выбрать цвет" +msgstr "Ambient цвет" #: scene/3d/reflection_probe.cpp #, fuzzy @@ -23209,9 +23006,8 @@ msgid "Ambient Energy" msgstr "Цвета излучениÑ" #: scene/3d/reflection_probe.cpp -#, fuzzy msgid "Ambient Contrib" -msgstr "ОтÑтуп вправо" +msgstr "Ambient влиÑние" #: scene/3d/remote_transform.cpp msgid "" @@ -23255,9 +23051,8 @@ msgid "Bound" msgstr "Граница" #: scene/3d/room_group.cpp -#, fuzzy msgid "Roomgroup Priority" -msgstr "Приоритет" +msgstr "Roomgroup приоритет" #: scene/3d/room_group.cpp msgid "The RoomManager should not be placed inside a RoomGroup." @@ -23291,28 +23086,24 @@ msgstr "ГлавнаÑ" #: scene/animation/animation_player.cpp scene/animation/animation_tree.cpp #: scene/animation/animation_tree_player.cpp #: servers/audio/effects/audio_effect_delay.cpp -#, fuzzy msgid "Active" -msgstr "ДейÑтвие" +msgstr "Ðктивный" #: scene/3d/room_manager.cpp msgid "Roomlist" msgstr "СпиÑок комнат" #: scene/3d/room_manager.cpp servers/visual_server.cpp -#, fuzzy msgid "PVS" -msgstr "FPS" +msgstr "" #: scene/3d/room_manager.cpp -#, fuzzy msgid "PVS Mode" -msgstr "Режим оÑмотра" +msgstr "PVS режим" #: scene/3d/room_manager.cpp -#, fuzzy msgid "PVS Filename" -msgstr "ZIP-файл" +msgstr "PVS Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°" #: scene/3d/room_manager.cpp servers/visual_server.cpp msgid "Gameplay" @@ -23324,42 +23115,36 @@ msgid "Gameplay Monitor" msgstr "Геймплей" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Use Secondary PVS" -msgstr "ИÑпользовать привÑзку маÑштабированиÑ" +msgstr "ИÑпользовать вторичный PVS" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Merge Meshes" -msgstr "Меши" +msgstr "Соединить меши" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Show Margins" -msgstr "Отображать центр" +msgstr "Показать отÑтупы" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Debug Sprawl" -msgstr "Отладка" +msgstr "Отладка Sprawl" #: scene/3d/room_manager.cpp msgid "Overlap Warning Threshold" msgstr "" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Preview Camera" -msgstr "Размер превью" +msgstr "Камера предпроÑмотра" #: scene/3d/room_manager.cpp msgid "Portal Depth Limit" msgstr "" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Default Portal Margin" -msgstr "ОтÑтуп портала" +msgstr "ОтÑтуп портала по умолчанию" #: scene/3d/room_manager.cpp #, fuzzy @@ -23417,43 +23202,36 @@ msgstr "" "УбедитеÑÑŒ, что вÑе комнаты Ñодержат геометрию или границы заданы вручную." #: scene/3d/skeleton.cpp scene/resources/skin.cpp -#, fuzzy msgid "Pose" -msgstr "Копировать позу" +msgstr "Поза" #: scene/3d/skeleton.cpp -#, fuzzy msgid "Bound Children" -msgstr "Дети" +msgstr "СвÑзать детей" #: scene/3d/soft_body.cpp -#, fuzzy msgid "Pinned Points" -msgstr "Закреплено %s" +msgstr "Закрепленные точки" #: scene/3d/soft_body.cpp -#, fuzzy msgid "Attachments" -msgstr "Гизмо" +msgstr "ПриложениÑ" #: scene/3d/soft_body.cpp -#, fuzzy msgid "Point Index" -msgstr "Получить индекÑ" +msgstr "Ð˜Ð½Ð´ÐµÐºÑ Ñ‚Ð¾Ñ‡ÐºÐ¸" #: scene/3d/soft_body.cpp msgid "Spatial Attachment Path" msgstr "" #: scene/3d/soft_body.cpp -#, fuzzy msgid "Physics Enabled" -msgstr "Кадр физики %" +msgstr "Физика включена" #: scene/3d/soft_body.cpp -#, fuzzy msgid "Parent Collision Ignore" -msgstr "Создать полигон Ñтолкновений" +msgstr "Игнорировать родительÑкие ÑтолкновениÑ" #: scene/3d/soft_body.cpp msgid "Simulation Precision" @@ -23534,9 +23312,8 @@ msgid "Opacity" msgstr "" #: scene/3d/sprite_3d.cpp scene/resources/material.cpp -#, fuzzy msgid "Transparent" -msgstr "ТранÑпонировать" +msgstr "Прозрачный" #: scene/3d/sprite_3d.cpp msgid "" @@ -23560,9 +23337,8 @@ msgid "Per-Wheel Motion" msgstr "КолёÑико вниз" #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Engine Force" -msgstr "Онлайн документациÑ" +msgstr "Сила движка" #: scene/3d/vehicle_body.cpp msgid "Brake" @@ -23599,28 +23375,24 @@ msgid "Friction Slip" msgstr "ФункциÑ" #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Suspension" -msgstr "Выражение" +msgstr "ПодвеÑка" #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Max Force" -msgstr "Ошибка" +msgstr "ÐœÐ°ÐºÑ Ð¡Ð¸Ð»Ð°" #: scene/3d/visibility_notifier.cpp msgid "AABB" msgstr "" #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Geometry" -msgstr "Повторить" +msgstr "ГеометриÑ" #: scene/3d/visual_instance.cpp -#, fuzzy msgid "Material Override" -msgstr "Переопределить" +msgstr "Переопределить материалы" #: scene/3d/visual_instance.cpp #, fuzzy @@ -23628,9 +23400,8 @@ msgid "Material Overlay" msgstr "Ðаложение материала" #: scene/3d/visual_instance.cpp -#, fuzzy msgid "Cast Shadow" -msgstr "Создать Шейдерный узел" +msgstr "ОтбраÑывать тень" #: scene/3d/visual_instance.cpp #, fuzzy @@ -23648,9 +23419,8 @@ msgid "Generate Lightmap" msgstr "Создание карт оÑвещениÑ" #: scene/3d/visual_instance.cpp -#, fuzzy msgid "Lightmap Scale" -msgstr "Запекание LightMap" +msgstr "МаÑштаб карты оÑвещениÑ" #: scene/3d/visual_instance.cpp msgid "LOD" @@ -23701,9 +23471,8 @@ msgid "Animation not found: '%s'" msgstr "ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð½Ðµ найдена: %s" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Mix Mode" -msgstr "Mix узел" +msgstr "Mix режим" #: scene/animation/animation_blend_tree.cpp msgid "Fadein Time" @@ -23724,24 +23493,20 @@ msgid "Autorestart" msgstr "ÐвтоперезапуÑк" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Delay" -msgstr "Задержка (мÑ)" +msgstr "Задержка" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Random Delay" -msgstr "Ð¡Ð»ÑƒÑ‡Ð°Ð¹Ð½Ð°Ñ Ð·Ð°Ð´ÐµÑ€Ð¶ÐºÐ° автоперезапуÑка" +msgstr "Ð¡Ð»ÑƒÑ‡Ð°Ð¹Ð½Ð°Ñ Ð·Ð°Ð´ÐµÑ€Ð¶ÐºÐ°" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Add Amount" -msgstr "КоличеÑтво" +msgstr "Добавить количеÑтво" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Blend Amount" -msgstr "КоличеÑтво Ñолнц" +msgstr "КоличеÑтво ÑмешиваниÑ" #: scene/animation/animation_blend_tree.cpp #, fuzzy @@ -23755,19 +23520,16 @@ msgstr "Добавить входной порт" #: scene/animation/animation_blend_tree.cpp #: scene/animation/animation_node_state_machine.cpp -#, fuzzy msgid "Xfade Time" -msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð·Ð°Ñ‚ÑƒÑ…Ð°Ð½Ð¸Ñ" +msgstr "Ð’Ñ€ÐµÐ¼Ñ Xfade" #: scene/animation/animation_node_state_machine.cpp -#, fuzzy msgid "Switch Mode" -msgstr "МножеÑтвенный выбор" +msgstr "Режим переключениÑ" #: scene/animation/animation_node_state_machine.cpp -#, fuzzy msgid "Auto Advance" -msgstr "ÐвтоматичеÑÐºÐ°Ñ ÑƒÑтановка" +msgstr "ÐвтоматичеÑкое продвижение" #: scene/animation/animation_node_state_machine.cpp #, fuzzy @@ -23779,28 +23541,24 @@ msgid "Anim Apply Reset" msgstr "ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ - Применить ÑброÑ" #: scene/animation/animation_player.cpp -#, fuzzy msgid "Current Animation" -msgstr "Задать анимацию" +msgstr "Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ" #: scene/animation/animation_player.cpp -#, fuzzy msgid "Assigned Animation" -msgstr "Добавить анимацию" +msgstr "ПривÑÐ·Ð°Ð½Ð½Ð°Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ" #: scene/animation/animation_player.cpp msgid "Reset On Save" msgstr "" #: scene/animation/animation_player.cpp -#, fuzzy msgid "Current Animation Length" -msgstr "Изменить длину анимации" +msgstr "Длина текущей анимации" #: scene/animation/animation_player.cpp -#, fuzzy msgid "Current Animation Position" -msgstr "Добавить точку анимации" +msgstr "ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ анимации" #: scene/animation/animation_player.cpp #, fuzzy @@ -23808,9 +23566,8 @@ msgid "Playback Options" msgstr "Параметры воÑпроизведениÑ" #: scene/animation/animation_player.cpp -#, fuzzy msgid "Default Blend Time" -msgstr "Тема по умолчанию" +msgstr "Ð’Ñ€ÐµÐ¼Ñ ÑÐ¼ÐµÑˆÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию" #: scene/animation/animation_player.cpp msgid "Method Call Mode" @@ -23849,32 +23606,28 @@ msgid "Tree Root" msgstr "Корень дерева" #: scene/animation/animation_tree.cpp -#, fuzzy msgid "Anim Player" -msgstr "Закрепить анимацию игрока" +msgstr "ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð¸Ð³Ñ€Ð¾ÐºÐ°" #: scene/animation/animation_tree.cpp msgid "Root Motion" msgstr "" #: scene/animation/animation_tree.cpp -#, fuzzy msgid "Track" -msgstr "Добавить трек" +msgstr "Дорожка" #: scene/animation/animation_tree_player.cpp msgid "This node has been deprecated. Use AnimationTree instead." msgstr "Ðтот узел был удален. ВмеÑто Ñтого иÑпользуйте AnimationTree." #: scene/animation/animation_tree_player.cpp -#, fuzzy msgid "Playback" -msgstr "ЗапуÑтить" +msgstr "ВоÑпроизведение" #: scene/animation/animation_tree_player.cpp -#, fuzzy msgid "Master Player" -msgstr "Ð’Ñтавить параметры" +msgstr "Главный Игрок" #: scene/animation/animation_tree_player.cpp #, fuzzy @@ -23882,29 +23635,24 @@ msgid "Base Path" msgstr "Путь ÑкÑпорта" #: scene/animation/root_motion_view.cpp -#, fuzzy msgid "Animation Path" -msgstr "ÐнимациÑ" +msgstr "Путь анимации" #: scene/animation/root_motion_view.cpp -#, fuzzy msgid "Zero Y" -msgstr "Ðоль" +msgstr "Ðоль Y" #: scene/animation/skeleton_ik.cpp -#, fuzzy msgid "Root Bone" -msgstr "Ð˜Ð¼Ñ ÐºÐ¾Ñ€Ð½ÐµÐ²Ð¾Ð³Ð¾ узла" +msgstr "ÐšÐ¾Ñ€Ð½ÐµÐ²Ð°Ñ ÐºÐ¾Ñть" #: scene/animation/skeleton_ik.cpp -#, fuzzy msgid "Tip Bone" -msgstr "КоÑти" +msgstr "ÐšÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ ÐºÐ¾Ñть" #: scene/animation/skeleton_ik.cpp -#, fuzzy msgid "Interpolation" -msgstr "Режим интерполÑции" +msgstr "ИнтерполÑциÑ" #: scene/animation/skeleton_ik.cpp #, fuzzy @@ -23920,40 +23668,34 @@ msgid "Magnet" msgstr "Магнит" #: scene/animation/skeleton_ik.cpp -#, fuzzy msgid "Target Node" -msgstr "Переподчинить узел" +msgstr "Целевой узел" #: scene/animation/skeleton_ik.cpp -#, fuzzy msgid "Max Iterations" -msgstr "Сделать функцию" +msgstr "ÐœÐ°ÐºÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€ÐµÐ½Ð¸Ð¹" #: scene/animation/tween.cpp msgid "Playback Process Mode" msgstr "" #: scene/animation/tween.cpp -#, fuzzy msgid "Playback Speed" -msgstr "ЗапуÑтить Ñцену" +msgstr "СкороÑть воÑпроизведениÑ" #: scene/audio/audio_stream_player.cpp -#, fuzzy msgid "Mix Target" -msgstr "Цель" +msgstr "Ð¡Ð¼ÐµÑˆÐ°Ð½Ð½Ð°Ñ Ñ†ÐµÐ»ÑŒ" #: scene/gui/aspect_ratio_container.cpp scene/gui/range.cpp #: servers/audio/effects/audio_effect_compressor.cpp -#, fuzzy msgid "Ratio" -msgstr "СохранÑть пропорции" +msgstr "Пропорции" #: scene/gui/aspect_ratio_container.cpp scene/gui/texture_button.cpp #: scene/gui/texture_rect.cpp -#, fuzzy msgid "Stretch Mode" -msgstr "Режим выделениÑ" +msgstr "Режим раÑÑ‚ÑжениÑ" #: scene/gui/aspect_ratio_container.cpp scene/gui/box_container.cpp msgid "Alignment" @@ -23965,9 +23707,8 @@ msgid "Shortcut In Tooltip" msgstr "Отображать центр" #: scene/gui/base_button.cpp -#, fuzzy msgid "Action Mode" -msgstr "Режим иконки" +msgstr "Режим дейÑтвиÑ" #: scene/gui/base_button.cpp msgid "Enabled Focus Mode" @@ -24000,9 +23741,8 @@ msgid "Icon Align" msgstr "" #: scene/gui/button.cpp -#, fuzzy msgid "Expand Icon" -msgstr "Развернуть вÑе" +msgstr "РаÑширить иконку" #: scene/gui/center_container.cpp #, fuzzy @@ -24025,24 +23765,20 @@ msgid "Edit Alpha" msgstr "Редактировать полигон" #: scene/gui/color_picker.cpp -#, fuzzy msgid "HSV Mode" -msgstr "Режим выделениÑ" +msgstr "HSV режим" #: scene/gui/color_picker.cpp -#, fuzzy msgid "Raw Mode" -msgstr "Режим оÑмотра" +msgstr "Режим Raw" #: scene/gui/color_picker.cpp -#, fuzzy msgid "Deferred Mode" -msgstr "Отложенное" +msgstr "Отложенный режим" #: scene/gui/color_picker.cpp -#, fuzzy msgid "Presets Enabled" -msgstr "ПредуÑтановки" +msgstr "ПреÑеты включены" #: scene/gui/color_picker.cpp msgid "Presets Visible" @@ -24090,14 +23826,12 @@ msgstr "" "положение «Stop» или «Pass»." #: scene/gui/control.cpp -#, fuzzy msgid "Anchor" -msgstr "Только ÑкорÑ" +msgstr "Якорь" #: scene/gui/control.cpp -#, fuzzy msgid "Grow Direction" -msgstr "ÐаправлениÑ" +msgstr "Ðаправление роÑта" #: scene/gui/control.cpp scene/resources/navigation_mesh.cpp msgid "Min Size" @@ -24118,14 +23852,12 @@ msgid "Hint" msgstr "" #: scene/gui/control.cpp -#, fuzzy msgid "Tooltip" -msgstr "ИнÑтрументы" +msgstr "ПодÑказка" #: scene/gui/control.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Focus" -msgstr "ПеремеÑтить Ñ„Ð¾ÐºÑƒÑ Ð½Ð° Ñтроку пути" +msgstr "ФокуÑ" #: scene/gui/control.cpp msgid "Neighbour Left" @@ -24140,9 +23872,8 @@ msgid "Neighbour Right" msgstr "" #: scene/gui/control.cpp -#, fuzzy msgid "Neighbour Bottom" -msgstr "Внизу поÑередине" +msgstr "СоÑед Ñнизу" #: scene/gui/control.cpp msgid "Next" @@ -24169,9 +23900,8 @@ msgid "Size Flags" msgstr "Флаги размера" #: scene/gui/control.cpp -#, fuzzy msgid "Stretch Ratio" -msgstr "Режим выделениÑ" +msgstr "КоÑффициент раÑÑ‚ÑжениÑ" #: scene/gui/control.cpp #, fuzzy @@ -24221,19 +23951,16 @@ msgid "Snap Distance" msgstr "РаÑÑтоÑние привÑзки" #: scene/gui/graph_edit.cpp -#, fuzzy msgid "Zoom Min" -msgstr "Приблизить" +msgstr "Приблизить Min" #: scene/gui/graph_edit.cpp -#, fuzzy msgid "Zoom Max" -msgstr "Приблизить" +msgstr "Приблизить Max" #: scene/gui/graph_edit.cpp -#, fuzzy msgid "Zoom Step" -msgstr "Отдалить" +msgstr "Приблизить шаг" #: scene/gui/graph_edit.cpp #, fuzzy @@ -24256,9 +23983,8 @@ msgstr "Показать коÑти" #: scene/gui/graph_node.cpp scene/gui/option_button.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Selected" -msgstr "Выделение" +msgstr "Выделено" #: scene/gui/graph_node.cpp scene/resources/default_theme/default_theme.cpp msgid "Comment" @@ -24282,23 +24008,20 @@ msgid "Incremental Search Max Interval Msec" msgstr "" #: scene/gui/item_list.cpp scene/gui/tree.cpp -#, fuzzy msgid "Allow Reselect" -msgstr "Применить ÑброÑ" +msgstr "Разрешить перевыбор" #: scene/gui/item_list.cpp scene/gui/tree.cpp -#, fuzzy msgid "Allow RMB Select" -msgstr "Заполнить выбранное" +msgstr "Разрешить выбор ПКМ" #: scene/gui/item_list.cpp msgid "Max Text Lines" msgstr "" #: scene/gui/item_list.cpp -#, fuzzy msgid "Auto Height" -msgstr "ТеÑтируемые" +msgstr "Ðвто выÑота" #: scene/gui/item_list.cpp msgid "Max Columns" @@ -24321,18 +24044,16 @@ msgid "Fixed Icon Size" msgstr "ФикÑированный размер иконки" #: scene/gui/label.cpp -#, fuzzy msgid "V Align" -msgstr "Оператор приÑваиваниÑ" +msgstr "Вертикальное выравнивание" #: scene/gui/label.cpp scene/gui/rich_text_label.cpp msgid "Visible Characters" msgstr "Видимые Ñимволы" #: scene/gui/label.cpp scene/gui/rich_text_label.cpp -#, fuzzy msgid "Percent Visible" -msgstr "Переключить видимоÑть" +msgstr "Процент видимоÑти" #: scene/gui/label.cpp msgid "Lines Skipped" @@ -24360,34 +24081,28 @@ msgid "Expand To Text Length" msgstr "" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Context Menu Enabled" -msgstr "КонтекÑÑ‚Ð½Ð°Ñ Ñправка" +msgstr "Включить контекÑтное меню" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Virtual Keyboard Enabled" -msgstr "Фильтр Ñигналов" +msgstr "Включить виртуальную клавиатуру" #: scene/gui/line_edit.cpp -#, fuzzy msgid "Clear Button Enabled" -msgstr "Фильтр Ñигналов" +msgstr "Включить кнопку очиÑтки" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Shortcut Keys Enabled" -msgstr "ГорÑчие клавиши" +msgstr "Включить горÑчие клавиши" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Middle Mouse Paste Enabled" -msgstr "Фильтр Ñигналов" +msgstr "Включить вÑтавку Ñредней кнопкой мыши" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Selecting Enabled" -msgstr "Только выделенное" +msgstr "Включить выделение" #: scene/gui/line_edit.cpp scene/gui/rich_text_label.cpp #: scene/gui/text_edit.cpp @@ -24395,14 +24110,12 @@ msgid "Deselect On Focus Loss Enabled" msgstr "" #: scene/gui/line_edit.cpp -#, fuzzy msgid "Right Icon" -msgstr "ÐŸÑ€Ð°Ð²Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° мыши" +msgstr "ÐŸÑ€Ð°Ð²Ð°Ñ Ð¸ÐºÐ¾Ð½ÐºÐ°" #: scene/gui/line_edit.cpp -#, fuzzy msgid "Placeholder" -msgstr "Загрузить как заполнитель" +msgstr "Заполнитель" #: scene/gui/line_edit.cpp msgid "Alpha" @@ -24425,9 +24138,8 @@ msgid "Underline" msgstr "" #: scene/gui/menu_button.cpp -#, fuzzy msgid "Switch On Hover" -msgstr "МножеÑтвенный выбор" +msgstr "Переключить при наведении" #: scene/gui/nine_patch_rect.cpp scene/resources/style_box.cpp #, fuzzy @@ -24435,9 +24147,8 @@ msgid "Draw Center" msgstr "По центру" #: scene/gui/nine_patch_rect.cpp scene/resources/style_box.cpp -#, fuzzy msgid "Region Rect" -msgstr "Задать регион" +msgstr "ПрÑмоугольный регион" #: scene/gui/nine_patch_rect.cpp #, fuzzy @@ -24461,9 +24172,8 @@ msgstr "" "работать как Stretch." #: scene/gui/popup.cpp -#, fuzzy msgid "Popup" -msgstr "Заполнить" +msgstr "Ð’Ñплывающее окно" #: scene/gui/popup.cpp #, fuzzy @@ -24481,9 +24191,8 @@ msgstr "" "но они будут Ñкрыты при запуÑке." #: scene/gui/popup_menu.cpp -#, fuzzy msgid "Hide On Item Selection" -msgstr "Центрировать выбранное" +msgstr "СпрÑтать при выделении предмета" #: scene/gui/popup_menu.cpp #, fuzzy @@ -24500,9 +24209,8 @@ msgid "Submenu Popup Delay" msgstr "" #: scene/gui/popup_menu.cpp -#, fuzzy msgid "Allow Search" -msgstr "ПоиÑк" +msgstr "Разрешить поиÑк" #: scene/gui/progress_bar.cpp msgid "Percent" @@ -24530,9 +24238,8 @@ msgid "Exp Edit" msgstr "Редактировать" #: scene/gui/range.cpp -#, fuzzy msgid "Rounded" -msgstr "Сгруппирован" +msgstr "Округлённый" #: scene/gui/range.cpp msgid "Allow Greater" @@ -24551,14 +24258,12 @@ msgid "Border Width" msgstr "Ширина границы" #: scene/gui/rich_text_effect.cpp -#, fuzzy msgid "Relative Index" -msgstr "Получить индекÑ" +msgstr "ОтноÑительный индекÑ" #: scene/gui/rich_text_effect.cpp -#, fuzzy msgid "Absolute Index" -msgstr "ÐвтоотÑтуп" +msgstr "ÐбÑолютный индекÑ" #: scene/gui/rich_text_effect.cpp #, fuzzy @@ -24566,9 +24271,8 @@ msgid "Elapsed Time" msgstr "Прошедшее времÑ" #: scene/gui/rich_text_effect.cpp -#, fuzzy msgid "Env" -msgstr "Конец" +msgstr "Среда" #: scene/gui/rich_text_effect.cpp msgid "Character" @@ -24587,9 +24291,8 @@ msgid "Tab Size" msgstr "Размер табов" #: scene/gui/rich_text_label.cpp -#, fuzzy msgid "Fit Content Height" -msgstr "Изменить Ð²ÐµÑ ÐºÐ¾Ñтей" +msgstr "ВмеÑтить по выÑоте контента" #: scene/gui/rich_text_label.cpp msgid "Scroll Active" @@ -24600,9 +24303,8 @@ msgid "Scroll Following" msgstr "" #: scene/gui/rich_text_label.cpp -#, fuzzy msgid "Selection Enabled" -msgstr "Только выделенное" +msgstr "Включить выделение" #: scene/gui/rich_text_label.cpp scene/gui/text_edit.cpp #, fuzzy @@ -24610,14 +24312,12 @@ msgid "Override Selected Font Color" msgstr "Переопределить выбранный цвет шрифта" #: scene/gui/rich_text_label.cpp -#, fuzzy msgid "Custom Effects" -msgstr "Передвинуть Ñффект шины" +msgstr "ПользовательÑкие Ñффекты" #: scene/gui/scroll_bar.cpp -#, fuzzy msgid "Custom Step" -msgstr "ПользовательÑкий узел" +msgstr "ПользовательÑкий шаг" #: scene/gui/scroll_container.cpp msgid "" @@ -24653,9 +24353,8 @@ msgid "Scrollable" msgstr "" #: scene/gui/slider.cpp -#, fuzzy msgid "Tick Count" -msgstr "Выбрать цвет" +msgstr "Счетчик галочек" #: scene/gui/slider.cpp #, fuzzy @@ -24676,9 +24375,8 @@ msgid "Split Offset" msgstr "Смещение разделениÑ" #: scene/gui/split_container.cpp scene/gui/tree.cpp -#, fuzzy msgid "Collapsed" -msgstr "Свернуть вÑе" +msgstr "Свернуто" #: scene/gui/split_container.cpp #, fuzzy @@ -24764,9 +24462,8 @@ msgid "Draw" msgstr "РиÑовать" #: scene/gui/text_edit.cpp -#, fuzzy msgid "Block Mode" -msgstr "Разблокировать узел" +msgstr "Режим блокировки" #: scene/gui/text_edit.cpp msgid "Moving By Right Click" @@ -24785,9 +24482,8 @@ msgid "Hover" msgstr "" #: scene/gui/texture_button.cpp -#, fuzzy msgid "Focused" -msgstr "ПеремеÑтить Ñ„Ð¾ÐºÑƒÑ Ð½Ð° Ñтроку пути" +msgstr "СфокуÑировано" #: scene/gui/texture_button.cpp #, fuzzy @@ -24796,9 +24492,8 @@ msgstr "Режим ÑтолкновениÑ" #: scene/gui/texture_button.cpp scene/gui/texture_rect.cpp #: scene/gui/video_player.cpp -#, fuzzy msgid "Expand" -msgstr "Развернуть вÑе" +msgstr "Развернуть" #: scene/gui/texture_progress.cpp msgid "Under" @@ -24810,9 +24505,8 @@ msgid "Over" msgstr "ПерезапиÑать" #: scene/gui/texture_progress.cpp -#, fuzzy msgid "Progress" -msgstr "СвойÑтва темы" +msgstr "ПрогреÑÑ" #: scene/gui/texture_progress.cpp msgid "Progress Offset" @@ -24831,9 +24525,8 @@ msgid "Radial Fill" msgstr "" #: scene/gui/texture_progress.cpp -#, fuzzy msgid "Initial Angle" -msgstr "Инициализировать" +msgstr "Ðачальный угол" #: scene/gui/texture_progress.cpp #, fuzzy @@ -24850,24 +24543,20 @@ msgid "Nine Patch Stretch" msgstr "Режим интерполÑции" #: scene/gui/texture_progress.cpp -#, fuzzy msgid "Stretch Margin Left" -msgstr "Задать отÑтуп" +msgstr "РаÑÑ‚Ñнуть отÑтуп лево" #: scene/gui/texture_progress.cpp -#, fuzzy msgid "Stretch Margin Top" -msgstr "Задать отÑтуп" +msgstr "РаÑÑ‚Ñнуть отÑтуп вверх" #: scene/gui/texture_progress.cpp -#, fuzzy msgid "Stretch Margin Right" -msgstr "Задать отÑтуп" +msgstr "РаÑÑ‚Ñнуть отÑтуп право" #: scene/gui/texture_progress.cpp -#, fuzzy msgid "Stretch Margin Bottom" -msgstr "Режим выделениÑ" +msgstr "РаÑÑ‚Ñнуть отÑтуп низ" #: scene/gui/tree.cpp msgid "Custom Minimum Height" @@ -24878,9 +24567,8 @@ msgid "(Other)" msgstr "(Другие)" #: scene/gui/tree.cpp -#, fuzzy msgid "Column Titles Visible" -msgstr "Переключить видимоÑть" +msgstr "ВидимоÑть заголовков Ñтолбцов" #: scene/gui/tree.cpp #, fuzzy @@ -24904,9 +24592,8 @@ msgid "Paused" msgstr "ОÑтановлен" #: scene/gui/video_player.cpp -#, fuzzy msgid "Buffering Msec" -msgstr "БуферизациÑ" +msgstr "Ð‘ÑƒÑ„ÐµÑ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Msec" #: scene/gui/video_player.cpp #, fuzzy @@ -24914,9 +24601,8 @@ msgid "Stream Position" msgstr "УÑтановить позицию входа кривой" #: scene/gui/viewport_container.cpp -#, fuzzy msgid "Stretch Shrink" -msgstr "Извлечь" +msgstr "РаÑÑ‚Ñнуть Ñжать" #: scene/main/canvas_layer.cpp #, fuzzy @@ -24928,9 +24614,8 @@ msgid "Download File" msgstr "Загрузить файл" #: scene/main/http_request.cpp -#, fuzzy msgid "Download Chunk Size" -msgstr "Загрузка" +msgstr "Размер куÑка ÑкачиваниÑ" #: scene/main/http_request.cpp msgid "Body Size Limit" @@ -24960,38 +24645,32 @@ msgid "Name Casing" msgstr "" #: scene/main/node.cpp -#, fuzzy msgid "Editor Description" -msgstr "ОпиÑание" +msgstr "Редактировать опиÑание" #: scene/main/node.cpp -#, fuzzy msgid "Pause Mode" -msgstr "Режим оÑмотра" +msgstr "Режим паузы" #: scene/main/node.cpp -#, fuzzy msgid "Physics Interpolation Mode" -msgstr "физичеÑÐºÐ°Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð¿Ð¾Ð»Ñции" +msgstr "Режим физичеÑкой интерполÑции" #: scene/main/node.cpp -#, fuzzy msgid "Display Folded" -msgstr "Режим без теней" +msgstr "Показать Ñложённым" #: scene/main/node.cpp -#, fuzzy msgid "Filename" -msgstr "Переименовать" +msgstr "Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°" #: scene/main/node.cpp msgid "Owner" msgstr "Владелец" #: scene/main/node.cpp scene/main/scene_tree.cpp -#, fuzzy msgid "Multiplayer" -msgstr "Умножить %s" +msgstr "Мультиплеер" #: scene/main/node.cpp #, fuzzy @@ -25004,9 +24683,8 @@ msgid "Process Priority" msgstr "Включить приоритет" #: scene/main/scene_tree.cpp scene/main/timer.cpp -#, fuzzy msgid "Time Left" -msgstr "Слева вверху" +msgstr "ОÑталоÑÑŒ времени" #: scene/main/scene_tree.cpp #, fuzzy @@ -25014,18 +24692,16 @@ msgid "Debug Collisions Hint" msgstr "Режим ÑтолкновениÑ" #: scene/main/scene_tree.cpp -#, fuzzy msgid "Debug Navigation Hint" -msgstr "Режим навигации" +msgstr "ПодÑказка режима навигации" #: scene/main/scene_tree.cpp msgid "Use Font Oversampling" msgstr "" #: scene/main/scene_tree.cpp -#, fuzzy msgid "Edited Scene Root" -msgstr "Ðовый корень Ñцены" +msgstr "Редактировать корень Ñцены" #: scene/main/scene_tree.cpp msgid "Root" @@ -25046,9 +24722,8 @@ msgid "Shape Color" msgstr "" #: scene/main/scene_tree.cpp -#, fuzzy msgid "Contact Color" -msgstr "Выбрать цвет" +msgstr "Цвет контакта" #: scene/main/scene_tree.cpp msgid "Geometry Color" @@ -25064,9 +24739,8 @@ msgid "Max Contacts Displayed" msgstr "" #: scene/main/scene_tree.cpp scene/resources/shape_2d.cpp -#, fuzzy msgid "Draw 2D Outlines" -msgstr "Создать контур" +msgstr "Создать 2D контур" #: scene/main/scene_tree.cpp servers/visual_server.cpp msgid "Reflections" @@ -25101,9 +24775,8 @@ msgid "Use 32 BPC Depth" msgstr "" #: scene/main/scene_tree.cpp -#, fuzzy msgid "Default Environment" -msgstr "Окружение" +msgstr "Окружение по умолчанию" #: scene/main/scene_tree.cpp msgid "" @@ -25136,9 +24809,8 @@ msgid "Autostart" msgstr "ÐвтозапуÑк" #: scene/main/viewport.cpp -#, fuzzy msgid "Viewport Path" -msgstr "Путь ÑкÑпорта" +msgstr "Путь окна предпроÑмотра" #: scene/main/viewport.cpp msgid "" @@ -25179,14 +24851,12 @@ msgid "World 2D" msgstr "Мир 2D" #: scene/main/viewport.cpp -#, fuzzy msgid "Transparent BG" -msgstr "ТранÑпонировать" +msgstr "Прозрачный фон" #: scene/main/viewport.cpp -#, fuzzy msgid "Handle Input Locally" -msgstr "Изменить входное значение" +msgstr "Обрабатывать ввод локально" #: scene/main/viewport.cpp msgid "FXAA" @@ -25211,9 +24881,8 @@ msgid "Render Direct To Screen" msgstr "" #: scene/main/viewport.cpp -#, fuzzy msgid "Debug Draw" -msgstr "Отладка" +msgstr "Отладка риÑовки" #: scene/main/viewport.cpp #, fuzzy @@ -25225,9 +24894,8 @@ msgid "V Flip" msgstr "" #: scene/main/viewport.cpp -#, fuzzy msgid "Clear Mode" -msgstr "Режим измерениÑ" +msgstr "Режим очиÑтки" #: scene/main/viewport.cpp msgid "Enable 2D" @@ -25266,58 +24934,48 @@ msgid "Quad 3" msgstr "" #: scene/main/viewport.cpp -#, fuzzy msgid "Canvas Transform" -msgstr "ОчиÑтить преобразование" +msgstr "Преобразование полотна" #: scene/main/viewport.cpp -#, fuzzy msgid "Global Canvas Transform" -msgstr "Сохранить глобальные преобразованиÑ" +msgstr "Глобальное преобразование полотна" #: scene/main/viewport.cpp msgid "Tooltip Delay (sec)" msgstr "" #: scene/register_scene_types.cpp -#, fuzzy msgid "Swap OK Cancel" -msgstr "UI Отменить" +msgstr "ПоменÑть меÑтами OK Cancel" #: scene/register_scene_types.cpp -#, fuzzy msgid "Layer Names" -msgstr "Ð˜Ð¼Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð¾Ð¹" +msgstr "Имена ÑлоÑ" #: scene/register_scene_types.cpp -#, fuzzy msgid "2D Render" -msgstr "Рендеринг" +msgstr "2D Рендеринг" #: scene/register_scene_types.cpp -#, fuzzy msgid "3D Render" -msgstr "Рендеринг" +msgstr "3D Рендеринг" #: scene/register_scene_types.cpp -#, fuzzy msgid "2D Physics" -msgstr "Физика" +msgstr "2D Физика" #: scene/register_scene_types.cpp -#, fuzzy msgid "3D Physics" -msgstr "Физика" +msgstr "3D Физика" #: scene/register_scene_types.cpp -#, fuzzy msgid "2D Navigation" -msgstr "ÐавигациÑ" +msgstr "2D ÐавигациÑ" #: scene/register_scene_types.cpp -#, fuzzy msgid "3D Navigation" -msgstr "ÐавигациÑ" +msgstr "3D ÐавигациÑ" #: scene/register_scene_types.cpp msgid "Use hiDPI" @@ -25346,9 +25004,8 @@ msgid "Segments" msgstr "Сегменты" #: scene/resources/curve.cpp -#, fuzzy msgid "Bake Resolution" -msgstr "Половинное разрешение" +msgstr "Запечь разрешение" #: scene/resources/curve.cpp msgid "Bake Interval" @@ -25359,34 +25016,28 @@ msgid "Panel" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color" -msgstr "Цвет комментариÑ" +msgstr "Цвет шрифта" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Pressed" -msgstr "Цвет коÑти 1" +msgstr "Цвет нажатого шрифта" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Hover" -msgstr "Цвет коÑти 1" +msgstr "Цвет наведенного шрифта" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Focus" -msgstr "Следовать за фокуÑом" +msgstr "Цвет шрифта в фокуÑе" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Disabled" -msgstr "Отключить обрезку" +msgstr "Цвет отключенного шрифта" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "H Separation" -msgstr "H Разделение" +msgstr "Горизонтальное разделение" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25464,9 +25115,8 @@ msgid "Off Disabled" msgstr "Отключённый" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Shadow" -msgstr "Цвет коÑти 1" +msgstr "Цвет тени шрифта" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25484,43 +25134,36 @@ msgid "Shadow Offset Y" msgstr "ОтÑтуп тени по Y" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Shadow As Outline" -msgstr "Показывать предыдущий контур" +msgstr "Тень как контур" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Selected" -msgstr "Разблокировать выделенное" +msgstr "Цвет шрифта выделенного" #: scene/resources/default_theme/default_theme.cpp msgid "Font Color Uneditable" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Cursor Color" -msgstr "ПользовательÑкий цвет" +msgstr "Цвет курÑора" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Clear Button Color" -msgstr "Фильтр Ñигналов" +msgstr "Цвет кнопки ОчиÑтить" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Clear Button Color Pressed" -msgstr "Фильтр Ñигналов" +msgstr "Цвет нажатой кнопки ОчиÑтить" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Minimum Spaces" -msgstr "Ð“Ð»Ð°Ð²Ð½Ð°Ñ Ñцена" +msgstr "Минимальные раÑÑтоÑниÑ" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "BG" -msgstr "Б" +msgstr "Задний фон" #: scene/resources/default_theme/default_theme.cpp msgid "FG" @@ -25534,9 +25177,8 @@ msgstr "Вкладка 1" #: scene/resources/default_theme/default_theme.cpp #: scene/resources/dynamic_font.cpp scene/resources/world.cpp #: scene/resources/world_2d.cpp -#, fuzzy msgid "Space" -msgstr "Ð“Ð»Ð°Ð²Ð½Ð°Ñ Ñцена" +msgstr "ПроÑтранÑтво" #: scene/resources/default_theme/default_theme.cpp msgid "Folded" @@ -25612,9 +25254,8 @@ msgid "Decrement Pressed" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Slider" -msgstr "Коллайдер" +msgstr "Слайдер" #: scene/resources/default_theme/default_theme.cpp msgid "Grabber Area" @@ -25643,19 +25284,16 @@ msgid "Scaleborder Size" msgstr "Размер границы" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Font" -msgstr "Размер шрифта заголовков Ñправки" +msgstr "Шрифт заголовка" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Color" -msgstr "Цвет текÑта" +msgstr "Цвет заголовка" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Height" -msgstr "ТеÑÑ‚Ð¾Ð²Ð°Ñ Ð²Ñ‹Ñота" +msgstr "Ð’Ñ‹Ñота заголовка" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25673,9 +25311,8 @@ msgid "Close V Offset" msgstr "Смещение шума" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Parent Folder" -msgstr "Создать папку" +msgstr "РодительÑÐºÐ°Ñ Ð¿Ð°Ð¿ÐºÐ°" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25698,9 +25335,8 @@ msgid "Labeled Separator Right" msgstr "Именованный разделитель" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Separator" -msgstr "Разделитель цветов шрифта" +msgstr "Разделитель шрифта" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25722,14 +25358,12 @@ msgid "Selected Frame" msgstr "Выбрать кадры" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Default Frame" -msgstr "Z Far по умолчанию" +msgstr "Кадр по умолчанию" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Default Focus" -msgstr "Шрифт по умолчанию" +msgstr "Ð¤Ð¾ÐºÑƒÑ Ð¿Ð¾ умолчанию" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25737,9 +25371,8 @@ msgid "Comment Focus" msgstr "Комментарий" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Breakpoint" -msgstr "Точки оÑтанова" +msgstr "Точка оÑтановки" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25757,9 +25390,8 @@ msgid "Resizer Color" msgstr "ИÑпользовать цвет" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Offset" -msgstr "Смещение байтов" +msgstr "Смещение заголовка" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25786,9 +25418,8 @@ msgid "Cursor Unfocused" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Button Pressed" -msgstr "Ðажато" +msgstr "ÐÐ°Ð¶Ð°Ñ‚Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ°" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25806,19 +25437,16 @@ msgid "Title Button Hover" msgstr "Кнопка-переключатель" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Custom Button" -msgstr "ПользовательÑкий шрифт" +msgstr "ПользовательÑÐºÐ°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ°" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Custom Button Pressed" -msgstr "Параметры шины" +msgstr "ПользовательÑÐºÐ°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° нажата" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Custom Button Hover" -msgstr "ПользовательÑкий цвет" +msgstr "ПользовательÑÐºÐ°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° наведена" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25860,14 +25488,12 @@ msgid "Custom Button Font Highlight" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Item Margin" -msgstr "Задать отÑтуп" +msgstr "ОтÑтуп предмета" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Button Margin" -msgstr "МаÑка кнопок" +msgstr "ОтÑтуп кнопки" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25880,19 +25506,16 @@ msgid "Draw Guides" msgstr "Отображение направлÑющих" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Scroll Border" -msgstr "Ð’ÐµÑ€Ñ‚Ð¸ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð¿Ñ€Ð¾ÐºÑ€ÑƒÑ‚ÐºÐ°" +msgstr "Граница прокрутки" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Scroll Speed" -msgstr "СкороÑть вертикальной прокрутки" +msgstr "СкороÑть прокрутки" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Icon Margin" -msgstr "Задать отÑтуп" +msgstr "ОтÑтуп иконки" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25952,9 +25575,8 @@ msgid "Label V Align BG" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Large" -msgstr "Цель" +msgstr "Крупный" #: scene/resources/default_theme/default_theme.cpp msgid "Folder" @@ -26006,9 +25628,8 @@ msgid "Add Preset" msgstr "Загрузить преÑет" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Color Hue" -msgstr "Тема редактора" +msgstr "Оттенок цвета" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26036,28 +25657,24 @@ msgid "Preset BG Icon" msgstr "ПреÑет" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Normal Font" -msgstr "ПереднÑÑ Ñ‡Ð°Ñть портала" +msgstr "Обычный шрифт" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Bold Font" -msgstr "Шрифт кода" +msgstr "Жирный шрифт" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Italics Font" -msgstr "ОÑновной шрифт" +msgstr "КурÑивный шрифт" #: scene/resources/default_theme/default_theme.cpp msgid "Bold Italics Font" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Mono Font" -msgstr "ОÑновной шрифт" +msgstr "Моноширинный шрифт" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26070,29 +25687,24 @@ msgid "Table V Separation" msgstr "Разделение таблицы V" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Margin Left" -msgstr "Задать отÑтуп" +msgstr "ОтÑтуп Ñлева" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Margin Top" -msgstr "ОтÑтуп" +msgstr "ОтÑтуп Ñверху" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Margin Right" -msgstr "ОтÑтуп вправо" +msgstr "ОтÑтуп Ñправа" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Margin Bottom" -msgstr "Режим выделениÑ" +msgstr "ОтÑтуп Ñнизу" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Autohide" -msgstr "ÐвтоматичеÑки" +msgstr "Скрывать автоматичеÑки" #: scene/resources/default_theme/default_theme.cpp msgid "Minus" @@ -26113,9 +25725,8 @@ msgid "Grid Major" msgstr "Ð¡ÐµÑ‚Ð¾Ñ‡Ð½Ð°Ñ ÐºÐ°Ñ€Ñ‚Ð°" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Selection Fill" -msgstr "Только выделенное" +msgstr "Заполнение выделенного" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26165,9 +25776,8 @@ msgid "Outline Size" msgstr "Размер контура" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Outline Color" -msgstr "ФункциÑ" +msgstr "Цвет контура" #: scene/resources/dynamic_font.cpp #, fuzzy @@ -26197,9 +25807,8 @@ msgid "Sky" msgstr "Ðебо" #: scene/resources/environment.cpp -#, fuzzy msgid "Sky Custom FOV" -msgstr "ПользовательÑкий узел" +msgstr "ПользовательÑкий угол обзора неба" #: scene/resources/environment.cpp msgid "Sky Orientation" @@ -26223,9 +25832,8 @@ msgid "Camera Feed ID" msgstr "" #: scene/resources/environment.cpp -#, fuzzy msgid "Ambient Light" -msgstr "ОтÑтуп вправо" +msgstr "РаÑÑеÑнный Ñвет" #: scene/resources/environment.cpp #, fuzzy @@ -26245,24 +25853,20 @@ msgid "Sun Amount" msgstr "КоличеÑтво Ñолнц" #: scene/resources/environment.cpp -#, fuzzy msgid "Depth Enabled" -msgstr "Глубина" +msgstr "Глубина включена" #: scene/resources/environment.cpp -#, fuzzy msgid "Depth Begin" -msgstr "Глубина" +msgstr "Глубина начало" #: scene/resources/environment.cpp -#, fuzzy msgid "Depth End" -msgstr "Глубина" +msgstr "Глубина конец" #: scene/resources/environment.cpp -#, fuzzy msgid "Depth Curve" -msgstr "Разделить кривую" +msgstr "ÐšÑ€Ð¸Ð²Ð°Ñ Ð³Ð»ÑƒÐ±Ð¸Ð½Ñ‹" #: scene/resources/environment.cpp #, fuzzy @@ -26275,9 +25879,8 @@ msgid "Transmit Curve" msgstr "Разделить кривую" #: scene/resources/environment.cpp -#, fuzzy msgid "Height Enabled" -msgstr "Фильтр Ñигналов" +msgstr "Ð’Ñ‹Ñота включена" #: scene/resources/environment.cpp msgid "Height Min" @@ -26288,9 +25891,8 @@ msgid "Height Max" msgstr "ÐœÐ°ÐºÑ Ð²Ñ‹Ñота" #: scene/resources/environment.cpp -#, fuzzy msgid "Height Curve" -msgstr "Разделить кривую" +msgstr "ÐšÑ€Ð¸Ð²Ð°Ñ Ð²Ñ‹Ñоты" #: scene/resources/environment.cpp #, fuzzy @@ -26324,9 +25926,8 @@ msgid "SS Reflections" msgstr "МаÑштабировать выбранное" #: scene/resources/environment.cpp -#, fuzzy msgid "Max Steps" -msgstr "Шаг" +msgstr "ÐœÐ°ÐºÑ ÑˆÐ°Ð³Ð¾Ð²" #: scene/resources/environment.cpp #, fuzzy @@ -26414,9 +26015,8 @@ msgstr "" #: scene/resources/environment.cpp #: servers/audio/effects/audio_effect_chorus.cpp -#, fuzzy msgid "3" -msgstr "3D" +msgstr "3" #: scene/resources/environment.cpp #: servers/audio/effects/audio_effect_chorus.cpp @@ -26448,9 +26048,8 @@ msgid "HDR Luminance Cap" msgstr "" #: scene/resources/environment.cpp -#, fuzzy msgid "HDR Scale" -msgstr "МаÑштабировать" +msgstr "HDR маcштаб" #: scene/resources/environment.cpp msgid "Bicubic Upscale" @@ -26458,12 +26057,11 @@ msgstr "" #: scene/resources/environment.cpp msgid "Adjustments" -msgstr "" +msgstr "Adjustments (наÑтройки)" #: scene/resources/environment.cpp -#, fuzzy msgid "Brightness" -msgstr "Свет" +msgstr "ЯркоÑть" #: scene/resources/environment.cpp #, fuzzy @@ -26485,9 +26083,8 @@ msgid "Distance Field" msgstr "Режим без отвлечениÑ" #: scene/resources/gradient.cpp -#, fuzzy msgid "Raw Data" -msgstr "Данные карты" +msgstr "Ðеобработанные данные" #: scene/resources/gradient.cpp #, fuzzy @@ -26545,9 +26142,8 @@ msgid "Do Not Receive Shadows" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Disable Ambient Light" -msgstr "ОтÑтуп вправо" +msgstr "Отключить окружающие оÑвещение" #: scene/resources/material.cpp #, fuzzy @@ -26559,9 +26155,8 @@ msgid "Albedo Tex MSDF" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Vertex Color" -msgstr "Вершины" +msgstr "Цвет вершин" #: scene/resources/material.cpp msgid "Use As Albedo" @@ -26576,9 +26171,8 @@ msgid "Parameters" msgstr "Параметры" #: scene/resources/material.cpp -#, fuzzy msgid "Diffuse Mode" -msgstr "Режим оÑмотра" +msgstr "Режим ÑмешениÑ" #: scene/resources/material.cpp #, fuzzy @@ -26622,9 +26216,8 @@ msgid "Use Alpha Scissor" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Particles Anim" -msgstr "ЧаÑтицы" +msgstr "ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ñ‡Ð°Ñтиц" #: scene/resources/material.cpp #, fuzzy @@ -26650,9 +26243,8 @@ msgid "Texture Channel" msgstr "ОблаÑть текÑтуры" #: scene/resources/material.cpp -#, fuzzy msgid "Emission" -msgstr "МаÑка излучениÑ" +msgstr "Излучение" #: scene/resources/material.cpp msgid "On UV2" @@ -26727,14 +26319,12 @@ msgid "Detail" msgstr "Деталь" #: scene/resources/material.cpp -#, fuzzy msgid "UV Layer" -msgstr "Слой" +msgstr "UV Слой" #: scene/resources/material.cpp -#, fuzzy msgid "UV1" -msgstr "UV" +msgstr "UV1" #: scene/resources/material.cpp msgid "Triplanar" @@ -26745,9 +26335,8 @@ msgid "Triplanar Sharpness" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "UV2" -msgstr "UV" +msgstr "UV2" #: scene/resources/material.cpp #, fuzzy @@ -26759,9 +26348,8 @@ msgid "Distance Fade" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Async Mode" -msgstr "Режим оÑмотра" +msgstr "ÐÑинхронный режим" #: scene/resources/mesh.cpp #, fuzzy @@ -26773,14 +26361,12 @@ msgid "Custom AABB" msgstr "" #: scene/resources/mesh_library.cpp -#, fuzzy msgid "Mesh Transform" -msgstr "Преобразование" +msgstr "Преобразование меша" #: scene/resources/mesh_library.cpp -#, fuzzy msgid "NavMesh Transform" -msgstr "ОчиÑтить преобразование" +msgstr "NavMesh преобразование" #: scene/resources/multimesh.cpp #, fuzzy @@ -26806,9 +26392,8 @@ msgid "Visible Instance Count" msgstr "" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Sampling" -msgstr "МаÑштаб:" +msgstr "Семплирование" #: scene/resources/navigation_mesh.cpp #, fuzzy @@ -26829,9 +26414,8 @@ msgid "Source Group Name" msgstr "Ðазвание группы-иÑточника" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Cells" -msgstr "Ячейка" +msgstr "Ячейки" #: scene/resources/navigation_mesh.cpp #, fuzzy @@ -26847,33 +26431,28 @@ msgid "Max Slope" msgstr "" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Regions" -msgstr "Регион" +msgstr "Регионы" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Merge Size" -msgstr "СлиÑние из Сцены" +msgstr "Размер ÑлиÑниÑ" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Edges" -msgstr "Край" +msgstr "КраÑ" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Max Error" -msgstr "Ошибка" +msgstr "Max Ошибка" #: scene/resources/navigation_mesh.cpp msgid "Verts Per Poly" msgstr "" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Details" -msgstr "Деталь" +msgstr "Детали" #: scene/resources/navigation_mesh.cpp #, fuzzy @@ -26898,14 +26477,12 @@ msgid "Walkable Low Height Spans" msgstr "" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Baking AABB" -msgstr "Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ AABB" +msgstr "Запекание AABB" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Baking AABB Offset" -msgstr "Базовое Ñмещение" +msgstr "Смещение Ð·Ð°Ð¿ÐµÐºÐ°Ð½Ð¸Ñ AABB" #: scene/resources/occluder_shape.cpp msgid "Spheres" @@ -26916,9 +26493,8 @@ msgid "OccluderShapeSphere Set Spheres" msgstr "OccluderShapeSphere Задать Ñферы" #: scene/resources/occluder_shape_polygon.cpp -#, fuzzy msgid "Polygon Points" -msgstr "Полигоны" +msgstr "Точки полигонов" #: scene/resources/occluder_shape_polygon.cpp #, fuzzy @@ -26934,19 +26510,16 @@ msgid "Trail" msgstr "След" #: scene/resources/particles_material.cpp -#, fuzzy msgid "Divisor" -msgstr "Разделить %s" +msgstr "Разделитель" #: scene/resources/particles_material.cpp -#, fuzzy msgid "Size Modifier" -msgstr "Модификатор ÑкороÑти Ñвободного вида" +msgstr "Модификатор ÑкороÑти" #: scene/resources/particles_material.cpp -#, fuzzy msgid "Color Modifier" -msgstr "Модификатор Ð·Ð°Ð¼ÐµÐ´Ð»ÐµÐ½Ð¸Ñ Ñвободного вида" +msgstr "Модификатор цвета" #: scene/resources/particles_material.cpp #, fuzzy @@ -26970,9 +26543,8 @@ msgid "Scale Random" msgstr "Случайный МаÑштаб" #: scene/resources/particles_material.cpp -#, fuzzy msgid "Scale Curve" -msgstr "Сомкнуть кривую" +msgstr "ÐšÑ€Ð¸Ð²Ð°Ñ Ð¼Ð°Ñштаба" #: scene/resources/physics_material.cpp msgid "Rough" @@ -27013,23 +26585,20 @@ msgid "Top Radius" msgstr "Верхний радиуÑ" #: scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Bottom Radius" -msgstr "Справа внизу" +msgstr "Ðижний радиуÑ" #: scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Left To Right" -msgstr "Справа вверху" +msgstr "Слева на право" #: scene/resources/primitive_meshes.cpp msgid "Is Hemisphere" msgstr "" #: scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Curve Step" -msgstr "КриваÑ" +msgstr "Шаг кривой" #: scene/resources/ray_shape.cpp scene/resources/segment_shape_2d.cpp msgid "Slips On Slope" @@ -27054,9 +26623,8 @@ msgid "Bind" msgstr "ПривÑзка" #: scene/resources/skin.cpp -#, fuzzy msgid "Bone" -msgstr "КоÑти" +msgstr "КоÑть" #: scene/resources/sky.cpp #, fuzzy @@ -27118,9 +26686,8 @@ msgid "Skew" msgstr "" #: scene/resources/style_box.cpp -#, fuzzy msgid "Corner Radius" -msgstr "Изменение внутреннего радиуÑа полукруга" +msgstr "Ð Ð°Ð´Ð¸ÑƒÑ ÑƒÐ³Ð»Ð°" #: scene/resources/style_box.cpp msgid "Corner Detail" @@ -27139,9 +26706,8 @@ msgid "Grow End" msgstr "" #: scene/resources/texture.cpp -#, fuzzy msgid "Load Path" -msgstr "Загрузить преÑет" +msgstr "Загрузить путь" #: scene/resources/texture.cpp msgid "Base Texture" @@ -27152,9 +26718,8 @@ msgid "Image Size" msgstr "Размер изображениÑ" #: scene/resources/texture.cpp -#, fuzzy msgid "Side" -msgstr "Стороны" +msgstr "Сторона" #: scene/resources/texture.cpp #, fuzzy @@ -27167,24 +26732,20 @@ msgid "Back" msgstr "Ðазад" #: scene/resources/texture.cpp -#, fuzzy msgid "Storage Mode" -msgstr "Режим маÑштабированиÑ" +msgstr "Режим хранениÑ" #: scene/resources/texture.cpp -#, fuzzy msgid "Lossy Storage Quality" -msgstr "Захват" +msgstr "КачеÑтво Ñжатого хранилища" #: scene/resources/texture.cpp -#, fuzzy msgid "From" -msgstr "Заполнить от" +msgstr "От" #: scene/resources/texture.cpp -#, fuzzy msgid "To" -msgstr "Верх" +msgstr "До" #: scene/resources/texture.cpp #, fuzzy @@ -27231,14 +26792,12 @@ msgid "Diffuse" msgstr "Режим оÑмотра" #: scene/resources/visual_shader.cpp -#, fuzzy msgid "Async" -msgstr "Режим оÑмотра" +msgstr "ÐÑинхронный" #: scene/resources/visual_shader.cpp -#, fuzzy msgid "Modes" -msgstr "Режим" +msgstr "Режимы" #: scene/resources/visual_shader.cpp msgid "Input Name" @@ -27300,9 +26859,8 @@ msgid "Scenario" msgstr "Сцена" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Navigation Map" -msgstr "ÐавигациÑ" +msgstr "Карта навигации" #: scene/resources/world.cpp scene/resources/world_2d.cpp msgid "Direct Space State" @@ -27327,14 +26885,12 @@ msgid "Default Map Up" msgstr "Шаг по умолчанию плавающих чиÑел" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Default Cell Size" -msgstr "Размер Ñчейки" +msgstr "Размер Ñчейки по умолчанию" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Default Cell Height" -msgstr "ТеÑтируемые" +msgstr "Ð’Ñ‹Ñота клетки по умолчанию" #: scene/resources/world.cpp scene/resources/world_2d.cpp #, fuzzy @@ -27410,9 +26966,8 @@ msgid "Rate Hz" msgstr "" #: servers/audio/effects/audio_effect_chorus.cpp -#, fuzzy msgid "Depth (ms)" -msgstr "Глубина" +msgstr "Глубина (мÑ)" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_delay.cpp @@ -27436,9 +26991,8 @@ msgid "Attack (µs)" msgstr "" #: servers/audio/effects/audio_effect_compressor.cpp -#, fuzzy msgid "Release (ms)" -msgstr "Релиз" +msgstr "Релиз (мÑ)" #: servers/audio/effects/audio_effect_compressor.cpp msgid "Mix" @@ -27459,9 +27013,8 @@ msgstr "" #: servers/audio/effects/audio_effect_delay.cpp #: servers/audio/effects/audio_effect_phaser.cpp #: servers/audio/effects/audio_effect_reverb.cpp -#, fuzzy msgid "Feedback" -msgstr "Отправить отзыв о документации" +msgstr "Отзыв" #: servers/audio/effects/audio_effect_delay.cpp #, fuzzy @@ -27689,9 +27242,8 @@ msgid "Collision Unsafe Fraction" msgstr "Режим ÑтолкновениÑ" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Physics Engine" -msgstr "Кадр физики %" +msgstr "ФизичеÑкий движек" #: servers/physics_server.cpp msgid "Center Of Mass" @@ -27741,23 +27293,20 @@ msgid "Spatial Partitioning" msgstr "ПроÑтранÑтвенное разбиение" #: servers/visual_server.cpp -#, fuzzy msgid "Render Loop Enabled" -msgstr "Фильтр Ñигналов" +msgstr "Включить цикл рендера" #: servers/visual_server.cpp msgid "VRAM Compression" msgstr "Сжатие VRAM" #: servers/visual_server.cpp -#, fuzzy msgid "Import BPTC" -msgstr "Импорт" +msgstr "Импорт BPTC" #: servers/visual_server.cpp -#, fuzzy msgid "Import S3TC" -msgstr "Импорт" +msgstr "Импорт S3TC" #: servers/visual_server.cpp msgid "Import ETC" @@ -27768,9 +27317,8 @@ msgid "Import ETC2" msgstr "Импортировать ETC2" #: servers/visual_server.cpp -#, fuzzy msgid "Import PVRTC" -msgstr "Импортировать тему" +msgstr "Импорт PVRTC" #: servers/visual_server.cpp msgid "Lossless Compression" @@ -27900,7 +27448,7 @@ msgstr "Режим интерполÑции" #: servers/visual_server.cpp msgid "OpenGL" -msgstr "ОткрытыйGL" +msgstr "OpenGL" #: servers/visual_server.cpp msgid "Batching Send Null" @@ -27990,8 +27538,9 @@ msgid "Precision" msgstr "ТочноÑть" #: servers/visual_server.cpp +#, fuzzy msgid "UV Contract" -msgstr "" +msgstr "UV Контракт" #: servers/visual_server.cpp msgid "UV Contract Amount" @@ -28017,7 +27566,7 @@ msgstr "Удалить тайл" #: servers/visual_server.cpp #, fuzzy msgid "Flip Imported Portals" -msgstr "Перевернуть порталы" +msgstr "Перевернуть Импортированные Порталы" #: servers/visual_server.cpp #, fuzzy diff --git a/editor/translations/si.po b/editor/translations/si.po index 8ce2d1d628..5e99894cf1 100644 --- a/editor/translations/si.po +++ b/editor/translations/si.po @@ -4394,6 +4394,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7117,7 +7118,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -14891,18 +14893,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "සජීවීකරණ පුනරà·à·€à¶»à·Šà¶®à¶±à¶º" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "සජීවීකරණ පුනරà·à·€à¶»à·Šà¶®à¶±à¶º" #: editor/scene_tree_dock.cpp @@ -15094,6 +15096,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "සජීවීකරණ පුනරà·à·€à¶»à·Šà¶®à¶±à¶º" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15157,6 +15164,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -16975,6 +16986,19 @@ msgstr "" msgid "Auto Update Project" msgstr "මෙම ලුහුබදින්න෠ඉවà¶à·Š කරන්න." +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "නිවේà·à¶± මà·à¶¯à·’ලිය" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "C# Project Directory" +msgstr "" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18700,6 +18724,11 @@ msgstr "යà¶à·”රු à¶´à·’à¶§à¶´à¶à·Š කරන්න" msgid "Custom BG Color" msgstr "යà¶à·”රු à¶´à·’à¶§à¶´à¶à·Š කරන්න" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Anim පරිවර්à¶à¶±à¶º වෙනස් කරන්න" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19496,6 +19525,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/sk.po b/editor/translations/sk.po index 7cba3886ba..ebd2256728 100644 --- a/editor/translations/sk.po +++ b/editor/translations/sk.po @@ -4623,6 +4623,7 @@ msgstr "ZmieÅ¡anosti projektových alebo scénových wide tool-ov." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projekt" @@ -7541,7 +7542,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15643,18 +15645,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Meno Node-u:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Meno Node-u:" #: editor/scene_tree_dock.cpp @@ -15855,6 +15857,11 @@ msgid "Button Group" msgstr "TlaÄidlo" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Meno Node-u:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Pripájanie z)" @@ -15919,6 +15926,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17845,6 +17856,21 @@ msgstr "VÅ¡etky vybrané" msgid "Auto Update Project" msgstr "Projekt" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "ZobraziÅ¥ VÅ¡etko" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Vyberte adresár" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Vyberte adresár" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19676,6 +19702,11 @@ msgstr "VložiÅ¥" msgid "Custom BG Color" msgstr "VložiÅ¥" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "ExpandovaÅ¥ VÅ¡etky" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20524,6 +20555,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "Nesprávna veľkosÅ¥ pÃsma." diff --git a/editor/translations/sl.po b/editor/translations/sl.po index ceb21aa750..f0e227266d 100644 --- a/editor/translations/sl.po +++ b/editor/translations/sl.po @@ -12,15 +12,15 @@ # Arnold Marko <arnold.marko@gmail.com>, 2019. # Alex <alexrixhardson@gmail.com>, 2019. # Andrew Poženel <andrej.pozenel@outlook.com>, 2020, 2022. -# Jakob Tadej VrtaÄnik <minecraftalka2@gmail.com>, 2021. +# Jakob Tadej VrtaÄnik <minecraftalka2@gmail.com>, 2021, 2022. # Andrew Poženel <andrew.pozenel@protonmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-06-23 16:41+0000\n" -"Last-Translator: Andrew Poženel <andrew.pozenel@protonmail.com>\n" +"PO-Revision-Date: 2022-08-12 17:08+0000\n" +"Last-Translator: Jakob Tadej VrtaÄnik <minecraftalka2@gmail.com>\n" "Language-Team: Slovenian <https://hosted.weblate.org/projects/godot-engine/" "godot/sl/>\n" "Language: sl\n" @@ -29,7 +29,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " "n%100==4 ? 2 : 3;\n" -"X-Generator: Weblate 4.13.1-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -320,9 +320,8 @@ msgid "Not enough bytes for decoding bytes, or invalid format." msgstr "Ni dovolj bajtov za dekodiranje, ali pa je neveljaven format." #: core/math/expression.cpp -#, fuzzy msgid "Invalid input %d (not passed) in expression" -msgstr "NapaÄen vnos %i(ni podan) v izrazu" +msgstr "NapaÄen vnos %d (ni podan) v izrazu" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" @@ -351,70 +350,63 @@ msgstr "Na klic '%s':" #: core/math/random_number_generator.cpp #: modules/opensimplex/open_simplex_noise.cpp msgid "Seed" -msgstr "" +msgstr "Seme" #: core/math/random_number_generator.cpp -#, fuzzy msgid "State" -msgstr "NaÄin Vrtenja" +msgstr "Stanje" #: core/message_queue.cpp msgid "Message Queue" -msgstr "" +msgstr "Vrsta sporoÄil" #: core/message_queue.cpp msgid "Max Size (KB)" -msgstr "" +msgstr "NajveÄja velikost (KB)" #: core/os/input.cpp -#, fuzzy msgid "Mouse Mode" -msgstr "NaÄin Premika" +msgstr "NaÄin kazalca" #: core/os/input.cpp -#, fuzzy msgid "Use Accumulated Input" -msgstr "IzbriÅ¡i Vnos" +msgstr "Uporabi zbran vnos" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: servers/audio_server.cpp msgid "Device" -msgstr "" +msgstr "Naprava" #: core/os/input_event.cpp -#, fuzzy msgid "Alt" -msgstr "Vse" +msgstr "Alt" #: core/os/input_event.cpp msgid "Shift" -msgstr "" +msgstr "Shift" #: core/os/input_event.cpp -#, fuzzy msgid "Control" -msgstr "RazliÄica:" +msgstr "Control" #: core/os/input_event.cpp msgid "Meta" msgstr "" #: core/os/input_event.cpp -#, fuzzy msgid "Command" -msgstr "Skupnost" +msgstr "Ukaz" #: core/os/input_event.cpp #, fuzzy msgid "Physical" -msgstr "Fizikalni Okvir %" +msgstr "Fizikalno" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Pressed" -msgstr "Prednastavitev..." +msgstr "Pritisnjeno" #: core/os/input_event.cpp msgid "Scancode" @@ -430,98 +422,87 @@ msgstr "Unicode" #: core/os/input_event.cpp msgid "Echo" -msgstr "" +msgstr "Odmev" #: core/os/input_event.cpp scene/gui/base_button.cpp #, fuzzy msgid "Button Mask" -msgstr "Dodaj v Skupino" +msgstr "Maska gumba" #: core/os/input_event.cpp scene/2d/node_2d.cpp scene/gui/control.cpp -#, fuzzy msgid "Global Position" -msgstr "Konstanta" +msgstr "Globalna pozicija" #: core/os/input_event.cpp -#, fuzzy msgid "Factor" -msgstr "Nadzornik" +msgstr "Faktor" #: core/os/input_event.cpp -#, fuzzy msgid "Button Index" -msgstr "NaÄin PloÅ¡Äe" +msgstr "Kazalo gumba" #: core/os/input_event.cpp msgid "Doubleclick" -msgstr "" +msgstr "Dvojni klik" #: core/os/input_event.cpp msgid "Tilt" -msgstr "" +msgstr "Nagib" #: core/os/input_event.cpp -#, fuzzy msgid "Pressure" -msgstr "Prednastavitev..." +msgstr "Pritisk" #: core/os/input_event.cpp msgid "Pen Inverted" -msgstr "" +msgstr "Obrnjeno pero" #: core/os/input_event.cpp -#, fuzzy msgid "Relative" -msgstr "Pripni Relativno" +msgstr "Relativno" #: core/os/input_event.cpp scene/2d/camera_2d.cpp scene/2d/cpu_particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/interpolated_camera.cpp #: scene/animation/animation_player.cpp scene/resources/environment.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Speed" -msgstr "Prilagodi Velikost:" +msgstr "Hitrost" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: scene/3d/sprite_3d.cpp msgid "Axis" -msgstr "" +msgstr "Os" #: core/os/input_event.cpp -#, fuzzy msgid "Axis Value" -msgstr "Novo ime:" +msgstr "Vrednost osi" #: core/os/input_event.cpp modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Index" -msgstr "NaÄin PloÅ¡Äe" +msgstr "Kazalo" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: modules/visual_script/visual_script_nodes.cpp #: scene/2d/touch_screen_button.cpp -#, fuzzy msgid "Action" -msgstr "Premakni Dejanje" +msgstr "Akcija" #: core/os/input_event.cpp scene/resources/environment.cpp #: scene/resources/material.cpp msgid "Strength" -msgstr "" +msgstr "MoÄ" #: core/os/input_event.cpp msgid "Delta" msgstr "" #: core/os/input_event.cpp -#, fuzzy msgid "Channel" -msgstr "Spremeni" +msgstr "Kanal" #: core/os/input_event.cpp main/main.cpp -#, fuzzy msgid "Message" -msgstr "Usklajuj Spremembe Skript" +msgstr "SporoÄilo" #: core/os/input_event.cpp #, fuzzy @@ -532,11 +513,11 @@ msgstr "Prilagodi Velikost:" #: scene/2d/physics_body_2d.cpp scene/3d/cpu_particles.cpp #: scene/3d/physics_body.cpp scene/resources/particles_material.cpp msgid "Velocity" -msgstr "" +msgstr "Hitrost" #: core/os/input_event.cpp msgid "Instrument" -msgstr "" +msgstr "InÅ¡trument" #: core/os/input_event.cpp #, fuzzy @@ -550,19 +531,16 @@ msgstr "" #: core/project_settings.cpp editor/editor_node.cpp main/main.cpp #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Application" -msgstr "Premakni Dejanje" +msgstr "Aplikacija" #: core/project_settings.cpp main/main.cpp -#, fuzzy msgid "Config" -msgstr "Nastavi Zaskok" +msgstr "Konfiguracija" #: core/project_settings.cpp -#, fuzzy msgid "Project Settings Override" -msgstr "Nastavitve Projekta" +msgstr "Preglasi nastavitve projekta" #: core/project_settings.cpp core/resource.cpp #: editor/animation_track_editor.cpp editor/editor_autoload_settings.cpp @@ -580,9 +558,8 @@ msgstr "Ime" #: core/project_settings.cpp editor/editor_help.cpp #: modules/visual_script/visual_script_nodes.cpp platform/uwp/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Description" -msgstr "Opis:" +msgstr "Opis" #: core/project_settings.cpp editor/editor_node.cpp editor/editor_settings.cpp #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp @@ -594,42 +571,42 @@ msgstr "Zaženi" #: core/project_settings.cpp editor/editor_node.cpp #: editor/run_settings_dialog.cpp main/main.cpp msgid "Main Scene" -msgstr "" +msgstr "Glavna scena" #: core/project_settings.cpp -#, fuzzy msgid "Disable stdout" -msgstr "OnemogoÄen" +msgstr "OnemogoÄi stdout" #: core/project_settings.cpp -#, fuzzy msgid "Disable stderr" -msgstr "OnemogoÄen" +msgstr "OnemogoÄi stderr" #: core/project_settings.cpp msgid "Use Hidden Project Data Directory" -msgstr "" +msgstr "Uporabi imenik skritih podatkov projekta" #: core/project_settings.cpp +#, fuzzy msgid "Use Custom User Dir" -msgstr "" +msgstr "Uporabi posebno uporabniÅ¡ko (režijo?)" #: core/project_settings.cpp +#, fuzzy msgid "Custom User Dir Name" -msgstr "" +msgstr "Posebno uporabniÅ¡ko ime (režije?)" #: core/project_settings.cpp main/main.cpp #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #: platform/uwp/os_uwp.cpp #, fuzzy msgid "Display" -msgstr "Zamenjaj Vse" +msgstr "Zaslon(glagol ali samostalnik?)" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/opensimplex/noise_texture.cpp scene/2d/line_2d.cpp #: scene/3d/label_3d.cpp scene/gui/text_edit.cpp scene/resources/texture.cpp msgid "Width" -msgstr "" +msgstr "Å irina" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/gltf/gltf_node.cpp modules/opensimplex/noise_texture.cpp @@ -638,21 +615,19 @@ msgstr "" #: scene/resources/font.cpp scene/resources/navigation_mesh.cpp #: scene/resources/primitive_meshes.cpp scene/resources/texture.cpp msgid "Height" -msgstr "" +msgstr "ViÅ¡ina" #: core/project_settings.cpp msgid "Always On Top" -msgstr "" +msgstr "Vedno na vrhu" #: core/project_settings.cpp -#, fuzzy msgid "Test Width" -msgstr "Linearno" +msgstr "Testiraj Å¡irino" #: core/project_settings.cpp -#, fuzzy msgid "Test Height" -msgstr "PreskuÅ¡anje" +msgstr "Testiraj viÅ¡ino" #: core/project_settings.cpp editor/animation_track_editor.cpp #: editor/editor_audio_buses.cpp main/main.cpp servers/audio_server.cpp @@ -662,7 +637,7 @@ msgstr "Zvok" #: core/project_settings.cpp #, fuzzy msgid "Default Bus Layout" -msgstr "Naloži prevezeto Postavitev Vodila." +msgstr "Privzeta postavitev (?)" #: core/project_settings.cpp editor/editor_export.cpp #: editor/editor_file_system.cpp editor/editor_node.cpp @@ -673,95 +648,84 @@ msgstr "Urejevalnik" #: core/project_settings.cpp msgid "Main Run Args" -msgstr "" +msgstr "Glavni zagonski argumenti" #: core/project_settings.cpp -#, fuzzy msgid "Scene Naming" -msgstr "Pot Prizora:" +msgstr "Imenovanje scene" #: core/project_settings.cpp msgid "Search In File Extensions" -msgstr "" +msgstr "IÅ¡Äi v razÅ¡iritvah datotek" #: core/project_settings.cpp msgid "Script Templates Search Path" -msgstr "" +msgstr "Pot iskanja predlogov skript" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Autoload On Startup" -msgstr "RazliÄica:" +msgstr "Samodejno nalaganje nadzora razliÄic ob zagonu" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Plugin Name" -msgstr "RazliÄica:" +msgstr "Ime vtiÄnika za nadzor razliÄic" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp -#, fuzzy msgid "Input" -msgstr "Dodaj Vnos" +msgstr "Vnos" #: core/project_settings.cpp msgid "UI Accept" -msgstr "" +msgstr "UI Sprejmi" #: core/project_settings.cpp -#, fuzzy msgid "UI Select" -msgstr "Izberi" +msgstr "UI Izberi" #: core/project_settings.cpp -#, fuzzy msgid "UI Cancel" -msgstr "PrekliÄi" +msgstr "UI Prekini" #: core/project_settings.cpp -#, fuzzy msgid "UI Focus Next" -msgstr "Poudari Pot" +msgstr "UI OsredotoÄi naslednje" #: core/project_settings.cpp -#, fuzzy msgid "UI Focus Prev" -msgstr "Poudari Pot" +msgstr "UI OsredotoÄi prejÅ¡nje" #: core/project_settings.cpp -#, fuzzy msgid "UI Left" -msgstr "NaÄin Vrtenja" +msgstr "UI Levo" #: core/project_settings.cpp -#, fuzzy msgid "UI Right" -msgstr "NaÄin Vrtenja" +msgstr "UI Desno" #: core/project_settings.cpp msgid "UI Up" -msgstr "" +msgstr "UI Gor" #: core/project_settings.cpp -#, fuzzy msgid "UI Down" -msgstr "Prenesi" +msgstr "UI Dol" #: core/project_settings.cpp msgid "UI Page Up" -msgstr "" +msgstr "UI Page Up" #: core/project_settings.cpp msgid "UI Page Down" -msgstr "" +msgstr "UI Page Down" #: core/project_settings.cpp msgid "UI Home" -msgstr "" +msgstr "UI Home" #: core/project_settings.cpp msgid "UI End" -msgstr "" +msgstr "UI End" #: core/project_settings.cpp main/main.cpp modules/bullet/register_types.cpp #: modules/bullet/space_bullet.cpp scene/2d/physics_body_2d.cpp @@ -773,7 +737,7 @@ msgstr "" #: servers/physics_server.cpp #, fuzzy msgid "Physics" -msgstr "Fizikalni Okvir %" +msgstr "Fizika" #: core/project_settings.cpp editor/editor_settings.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -783,11 +747,11 @@ msgstr "Fizikalni Okvir %" #: scene/3d/physics_body.cpp scene/resources/world.cpp #: servers/physics/space_sw.cpp servers/physics_server.cpp msgid "3D" -msgstr "" +msgstr "3D" #: core/project_settings.cpp msgid "Smooth Trimesh Collision" -msgstr "" +msgstr "Gladko trimeÅ¡ko trÄenje" #: core/project_settings.cpp drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles2/rasterizer_scene_gles2.cpp @@ -799,7 +763,7 @@ msgstr "" #: scene/main/viewport.cpp servers/visual/visual_server_scene.cpp #: servers/visual_server.cpp msgid "Rendering" -msgstr "" +msgstr "Upodabljanje" #: core/project_settings.cpp drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_scene_gles3.cpp @@ -809,18 +773,17 @@ msgstr "" #: scene/resources/multimesh.cpp servers/visual/visual_server_scene.cpp #: servers/visual_server.cpp msgid "Quality" -msgstr "" +msgstr "Kakovost" #: core/project_settings.cpp scene/gui/file_dialog.cpp #: scene/main/scene_tree.cpp scene/resources/navigation_mesh.cpp #: servers/visual_server.cpp -#, fuzzy msgid "Filters" -msgstr "Filtri..." +msgstr "Filtri" #: core/project_settings.cpp scene/main/viewport.cpp msgid "Sharpen Intensity" -msgstr "" +msgstr "Izostri intenzivnost" #: core/project_settings.cpp editor/editor_export.cpp editor/editor_node.cpp #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp @@ -836,28 +799,27 @@ msgstr "RazhroÅ¡Äevalnik" #: core/project_settings.cpp main/main.cpp modules/gdscript/gdscript.cpp #: modules/visual_script/visual_script.cpp scene/resources/dynamic_font.cpp -#, fuzzy msgid "Settings" -msgstr "Nastavitve ZaskoÄenja" +msgstr "Nastavitve" #: core/project_settings.cpp editor/script_editor_debugger.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp +#, fuzzy msgid "Profiler" -msgstr "" +msgstr "Zabeležnik(?)" #: core/project_settings.cpp #, fuzzy msgid "Max Functions" -msgstr "Preimenuj Funkcijo" +msgstr "NajveÄja koliÄina funkcij" #: core/project_settings.cpp scene/3d/vehicle_body.cpp -#, fuzzy msgid "Compression" -msgstr "Trenutna RazliÄica:" +msgstr "Kompresija" #: core/project_settings.cpp msgid "Formats" -msgstr "" +msgstr "Formati" #: core/project_settings.cpp msgid "Zstd" @@ -869,11 +831,12 @@ msgstr "" #: core/project_settings.cpp msgid "Compression Level" -msgstr "" +msgstr "Nivo kompresije" #: core/project_settings.cpp +#, fuzzy msgid "Window Log Size" -msgstr "" +msgstr "Velikost beležnega okna" #: core/project_settings.cpp msgid "Zlib" @@ -885,20 +848,19 @@ msgstr "" #: core/project_settings.cpp platform/android/export/export.cpp msgid "Android" -msgstr "" +msgstr "Android" #: core/project_settings.cpp msgid "Modules" -msgstr "" +msgstr "Moduli" #: core/register_core_types.cpp msgid "TCP" msgstr "TCP" #: core/register_core_types.cpp -#, fuzzy msgid "Connect Timeout Seconds" -msgstr "Poveži se z Gradnikom:" +msgstr "ÄŒasovna omejitev povezave v sekundah" #: core/register_core_types.cpp msgid "Packet Peer Stream" @@ -906,16 +868,15 @@ msgstr "" #: core/register_core_types.cpp msgid "Max Buffer (Power of 2)" -msgstr "" +msgstr "NajveÄja koliÄina medpomnilnikov (VeÄkratnik 2)" #: core/register_core_types.cpp editor/editor_settings.cpp main/main.cpp msgid "SSL" msgstr "" #: core/register_core_types.cpp main/main.cpp -#, fuzzy msgid "Certificates" -msgstr "Lastnosti" +msgstr "Certifikati" #: core/resource.cpp editor/dependency_editor.cpp #: editor/editor_resource_picker.cpp @@ -924,9 +885,8 @@ msgid "Resource" msgstr "Viri" #: core/resource.cpp -#, fuzzy msgid "Local To Scene" -msgstr "Zapri Prizor" +msgstr "Lokalno tej sceni" #: core/resource.cpp editor/dependency_editor.cpp #: editor/editor_autoload_settings.cpp editor/plugins/path_editor_plugin.cpp @@ -936,18 +896,16 @@ msgid "Path" msgstr "Pot" #: core/script_language.cpp -#, fuzzy msgid "Source Code" -msgstr "Viri" +msgstr "Izvirna koda" #: core/translation.cpp editor/project_settings_editor.cpp msgid "Locale" msgstr "" #: core/translation.cpp -#, fuzzy msgid "Test" -msgstr "PreskuÅ¡anje" +msgstr "Test" #: core/translation.cpp scene/resources/font.cpp msgid "Fallback" @@ -987,17 +945,17 @@ msgstr "EiB" #: drivers/gles3/rasterizer_scene_gles3.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp modules/gltf/gltf_state.cpp msgid "Buffers" -msgstr "" +msgstr "Predpomnilnik" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp msgid "Canvas Polygon Buffer Size (KB)" -msgstr "" +msgstr "Platno mnogotnik predpomnilnik velikost (KB)" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp msgid "Canvas Polygon Index Buffer Size (KB)" -msgstr "" +msgstr "Platno mnogokotnik kazalo predpomnilnik velikost (KB)" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp editor/editor_settings.cpp @@ -1009,13 +967,12 @@ msgstr "" #: servers/physics_2d/space_2d_sw.cpp servers/physics_2d_server.cpp #: servers/visual_server.cpp msgid "2D" -msgstr "" +msgstr "2D" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp -#, fuzzy msgid "Snapping" -msgstr "Pametno pripenjanje" +msgstr "Pripenjanje" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp @@ -1026,7 +983,7 @@ msgstr "Uporabi Pripenjanje Pikslov" #: drivers/gles2/rasterizer_scene_gles2.cpp #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Immediate Buffer Size (KB)" -msgstr "" +msgstr "TakojÅ¡nja velikost predpomnilnika (KB)" #: drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp @@ -1036,29 +993,30 @@ msgstr "ZapeÄi Svetlobne karte" #: drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp +#, fuzzy msgid "Use Bicubic Sampling" -msgstr "" +msgstr "Uporabite bikubiÄno vzorÄenje" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Renderable Elements" -msgstr "" +msgstr "NajveÄ upodobljivih elementov" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Renderable Lights" -msgstr "" +msgstr "NajveÄ upodobljivih luÄi" #: drivers/gles3/rasterizer_scene_gles3.cpp -#, fuzzy msgid "Max Renderable Reflections" -msgstr "GridMap IzbriÅ¡i Izbor" +msgstr "NajveÄ upodobljivih refleksij" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Lights Per Object" -msgstr "" +msgstr "NajveÄ luÄi na objekt" #: drivers/gles3/rasterizer_scene_gles3.cpp +#, fuzzy msgid "Subsurface Scattering" -msgstr "" +msgstr "PodpovrÅ¡insko razprÅ¡evanje" #: drivers/gles3/rasterizer_scene_gles3.cpp editor/animation_track_editor.cpp #: editor/import/resource_importer_texture.cpp @@ -1070,29 +1028,30 @@ msgstr "" #: scene/animation/animation_blend_tree.cpp scene/gui/control.cpp #: scene/main/canvas_layer.cpp scene/resources/environment.cpp #: scene/resources/material.cpp scene/resources/particles_material.cpp -#, fuzzy msgid "Scale" -msgstr "Prilagodi Velikost:" +msgstr "Velikost" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Follow Surface" -msgstr "" +msgstr "Sledi povrÅ¡ini" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Weight Samples" -msgstr "" +msgstr "Vzorci teže" #: drivers/gles3/rasterizer_scene_gles3.cpp +#, fuzzy msgid "Voxel Cone Tracing" -msgstr "" +msgstr "Sledenje (voxel?) stožca" #: drivers/gles3/rasterizer_scene_gles3.cpp scene/resources/environment.cpp msgid "High Quality" -msgstr "" +msgstr "Visoka kakovost" #: drivers/gles3/rasterizer_storage_gles3.cpp +#, fuzzy msgid "Blend Shape Max Buffer Size (KB)" -msgstr "" +msgstr "MeÅ¡anica oblike najveÄja velikost predpomnilnika (KB)" #. TRANSLATORS: Adjective, refers to the mode for Bezier handles (Free, Balanced, Mirror). #: editor/animation_bezier_editor.cpp @@ -1166,9 +1125,8 @@ msgstr "Animacija Spremeni klic" #: editor/animation_track_editor.cpp scene/2d/animated_sprite.cpp #: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Frame" -msgstr "Okvir %" +msgstr "Okvir" #: editor/animation_track_editor.cpp editor/editor_profiler.cpp #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp @@ -1179,38 +1137,35 @@ msgstr "ÄŒas" #: editor/animation_track_editor.cpp editor/import/resource_importer_scene.cpp #: platform/osx/export/export.cpp -#, fuzzy msgid "Location" -msgstr "Rotacijski Korak:" +msgstr "Lokacija" #: editor/animation_track_editor.cpp modules/gltf/gltf_node.cpp #: scene/2d/polygon_2d.cpp scene/2d/remote_transform_2d.cpp #: scene/3d/remote_transform.cpp scene/3d/spatial.cpp scene/gui/control.cpp -#, fuzzy msgid "Rotation" -msgstr "Rotacijski Korak:" +msgstr "Rotacija" #: editor/animation_track_editor.cpp editor/script_editor_debugger.cpp #: modules/visual_script/visual_script_nodes.cpp scene/gui/range.cpp msgid "Value" -msgstr "" +msgstr "Vrednost" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Arg Count" -msgstr "KoliÄina:" +msgstr "KoliÄina argumentov" #: editor/animation_track_editor.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp msgid "Args" -msgstr "" +msgstr "Argumenti" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/script_editor_debugger.cpp modules/gltf/gltf_accessor.cpp #: modules/gltf/gltf_light.cpp modules/visual_script/visual_script_nodes.cpp #: scene/3d/physics_body.cpp scene/resources/visual_shader_nodes.cpp msgid "Type" -msgstr "" +msgstr "NaÄin" #: editor/animation_track_editor.cpp msgid "In Handle" @@ -1225,17 +1180,15 @@ msgstr "" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp msgid "Stream" -msgstr "" +msgstr "Tok" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Start Offset" -msgstr "Mrežni Zamik:" +msgstr "ZaÄetni odmik" #: editor/animation_track_editor.cpp -#, fuzzy msgid "End Offset" -msgstr "Mrežni Zamik:" +msgstr "KonÄni odmik" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/import/resource_importer_scene.cpp @@ -1249,7 +1202,7 @@ msgstr "Animacija" #: editor/animation_track_editor.cpp msgid "Easing" -msgstr "" +msgstr "PopuÅ¡Äanje" #: editor/animation_track_editor.cpp #, fuzzy @@ -1313,7 +1266,7 @@ msgstr "Ustavi predvajanje animacije. (S)" #: editor/animation_track_editor.cpp #, fuzzy msgid "Animation length (frames)" -msgstr "Dolžina animacije (v sekundah)." +msgstr "Dolžina animacije (v slikah?)." #: editor/animation_track_editor.cpp #, fuzzy @@ -1326,9 +1279,8 @@ msgid "Add Track" msgstr "Animacija Dodaj sled" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation Looping" -msgstr "Približaj animacijo." +msgstr "Animacija v zanki" #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -1337,7 +1289,7 @@ msgstr "Funkcije:" #: editor/animation_track_editor.cpp msgid "Audio Clips:" -msgstr "" +msgstr "ZvoÄni posnetki:" #: editor/animation_track_editor.cpp msgid "Anim Clips:" @@ -4694,6 +4646,7 @@ msgstr "RazliÄna projektna ali prizorska orodja." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projekt" @@ -7627,7 +7580,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15903,18 +15857,19 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Ime Gradnika:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "Ime že uporablja druga funkcija/sprem/signal:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Ime Gradnika:" #: editor/scene_tree_dock.cpp @@ -16121,6 +16076,11 @@ msgstr "Dodaj v Skupino" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Ime Gradnika:" + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr "Napaka Pri Povezavi" @@ -16185,6 +16145,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -18118,6 +18082,21 @@ msgstr "Celotna izbira" msgid "Auto Update Project" msgstr "Izvozi Projekt" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Zamenjaj Vse" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Izberi Mapo" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Izberi Mapo" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19970,6 +19949,11 @@ msgstr "Gradnik Prehod" msgid "Custom BG Color" msgstr "Gradnik Prehod" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "RazÅ¡iri vse" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20820,6 +20804,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "Neveljavno ime." diff --git a/editor/translations/sq.po b/editor/translations/sq.po index af72b686b9..f8ffd0e88d 100644 --- a/editor/translations/sq.po +++ b/editor/translations/sq.po @@ -4632,6 +4632,7 @@ msgstr "Vegla të ndryshme për projektin ose skenën." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projekti" @@ -7527,7 +7528,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15491,18 +15493,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Emri i Nyjes:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Emri i Nyjes:" #: editor/scene_tree_dock.cpp @@ -15699,6 +15701,11 @@ msgstr "Shto te Grupi" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Emri i Nyjes:" + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr "Gabim në Lidhje" @@ -15763,6 +15770,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17644,6 +17655,21 @@ msgstr "" msgid "Auto Update Project" msgstr "Eksporto Projektin" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Shfaqi të Gjitha" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Zgjidh një Direktori" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Zgjidh një Direktori" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19455,6 +19481,11 @@ msgstr "Dyfisho Nyjet" msgid "Custom BG Color" msgstr "Dyfisho Nyjet" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Zgjero të Gjitha" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20297,6 +20328,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "Emër i palejuar." diff --git a/editor/translations/sr_Cyrl.po b/editor/translations/sr_Cyrl.po index 4231d62c6b..f2f6a5bf09 100644 --- a/editor/translations/sr_Cyrl.po +++ b/editor/translations/sr_Cyrl.po @@ -4878,6 +4878,7 @@ msgstr "Разни алати за пројекат или Ñцену." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Пројекат" @@ -7944,7 +7945,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -17014,18 +17016,19 @@ msgstr "" msgid "Make Local" msgstr "Ðаправи коÑти" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Име чвора:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "Име је већ у употреби у функ/пром/Ñигналу:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Име чвора:" #: editor/scene_tree_dock.cpp @@ -17258,6 +17261,11 @@ msgstr "Група Дугмића" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Име чвора:" + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr "(Повезивање од)" @@ -17343,6 +17351,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "Ðеважеће име чвора, Ñледећи карактери ниÑу дозвољени:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp #, fuzzy msgid "Rename Node" msgstr "Преименуј Чвор" @@ -19420,6 +19432,21 @@ msgstr "ИÑпуни одабрано" msgid "Auto Update Project" msgstr "Ðеименован Пројекат" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Прикажи нормалу" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Одабери директоријум" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Одабери директоријум" + #: modules/mono/mono_gd/gd_mono_utils.cpp #, fuzzy msgid "End of inner exception stack trace" @@ -21351,6 +21378,11 @@ msgstr "Ðаправи чвор" msgid "Custom BG Color" msgstr "Ðаправи чвор" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Прошири Ñве" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -22211,6 +22243,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "Ðеважеће кратко име паковања." diff --git a/editor/translations/sr_Latn.po b/editor/translations/sr_Latn.po index b898108402..8af5b1daaf 100644 --- a/editor/translations/sr_Latn.po +++ b/editor/translations/sr_Latn.po @@ -4411,6 +4411,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7151,7 +7152,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -14924,18 +14926,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "ObriÅ¡i Selekciju" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "ObriÅ¡i Selekciju" #: editor/scene_tree_dock.cpp @@ -15128,6 +15130,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "ObriÅ¡i Selekciju" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15191,6 +15198,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17031,6 +17042,19 @@ msgstr "Sve sekcije" msgid "Auto Update Project" msgstr "Izmjeni Selekciju Krivulje" +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Izmjeni Selekciju Krivulje" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18778,6 +18802,11 @@ msgstr "Animacija Uduplaj KljuÄeve" msgid "Custom BG Color" msgstr "Animacija Uduplaj KljuÄeve" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Homogenost Boje." + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19579,6 +19608,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/sv.po b/editor/translations/sv.po index 9fd6b9bf67..44b6fcf8b6 100644 --- a/editor/translations/sv.po +++ b/editor/translations/sv.po @@ -32,8 +32,8 @@ msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-23 03:57+0000\n" -"Last-Translator: Kenny Andersson <kenny@ordinary.se>\n" +"PO-Revision-Date: 2022-08-30 03:11+0000\n" +"Last-Translator: Björn Ã…kesson <bjorn.akesson@gmail.com>\n" "Language-Team: Swedish <https://hosted.weblate.org/projects/godot-engine/" "godot/sv/>\n" "Language: sv\n" @@ -41,7 +41,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp #, fuzzy @@ -49,9 +49,8 @@ msgid "Tablet Driver" msgstr "Drivrutin för surfplatta" #: core/bind/core_bind.cpp -#, fuzzy msgid "Clipboard" -msgstr "Klippbordet är tomt!" +msgstr "Urklipp" #: core/bind/core_bind.cpp msgid "Current Screen" @@ -4662,6 +4661,7 @@ msgstr "Diverse projekt eller scenövergripande-verktyg." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projekt" @@ -7565,7 +7565,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15718,18 +15719,18 @@ msgstr "" msgid "Make Local" msgstr "Gör Patch" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Node Namn:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Node Namn:" #: editor/scene_tree_dock.cpp @@ -15934,6 +15935,11 @@ msgstr "Lägg till i Grupp" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Node Namn:" + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr "Anslutningsfel" @@ -15999,6 +16005,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Byt namn pÃ¥ Node" @@ -17909,6 +17919,21 @@ msgstr "Alla urval" msgid "Auto Update Project" msgstr "Namnlöst Projekt" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Ersätt Alla" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Välj en Katalog" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Välj en Katalog" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19734,6 +19759,11 @@ msgstr "Klipp ut Noder" msgid "Custom BG Color" msgstr "Klipp ut Noder" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Expandera alla" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20583,6 +20613,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "Ogiltigt namn." diff --git a/editor/translations/te.po b/editor/translations/te.po index af4c65f062..fe9f95b213 100644 --- a/editor/translations/te.po +++ b/editor/translations/te.po @@ -4330,6 +4330,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7008,7 +7009,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -14677,16 +14679,16 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." +#: editor/scene_tree_dock.cpp +msgid "Enable Scene Unique Name(s)" msgstr "" #: editor/scene_tree_dock.cpp -msgid "Enable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Disable Scene Unique Name" +#: editor/scene_tree_dock.cpp +msgid "Disable Scene Unique Name(s)" msgstr "" #: editor/scene_tree_dock.cpp @@ -14876,6 +14878,10 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Disable Scene Unique Name" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -14939,6 +14945,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -16723,6 +16733,18 @@ msgstr "" msgid "Auto Update Project" msgstr "" +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "C# Project Directory" +msgstr "" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18417,6 +18439,10 @@ msgstr "" msgid "Custom BG Color" msgstr "" +#: platform/iphone/export/export.cpp +msgid "Export Icons" +msgstr "" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19198,6 +19224,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/th.po b/editor/translations/th.po index f1eb8b716f..6e4b0e578f 100644 --- a/editor/translations/th.po +++ b/editor/translations/th.po @@ -4623,6 +4623,7 @@ msgstr "โปรเจà¸à¸•์à¹à¸¥à¸°à¹€à¸„รื่à¸à¸‡à¸¡à¸·à¸à¸à¸·à¹ˆ #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "โปรเจà¸à¸•์" @@ -7560,7 +7561,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15655,18 +15657,19 @@ msgstr "" msgid "Make Local" msgstr "ทำให้เป็นภายใน" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "ชื่à¸à¹‚นด:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "มีฟังà¸à¹Œà¸Šà¸±à¸™/ตัวà¹à¸›à¸£/สัà¸à¸à¸²à¸“à¸à¸·à¹ˆà¸™à¹ƒà¸Šà¹‰à¸Šà¸·à¹ˆà¸à¸™à¸µà¹‰à¹à¸¥à¹‰à¸§:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "ชื่à¸à¹‚นด:" #: editor/scene_tree_dock.cpp @@ -15862,6 +15865,11 @@ msgid "Button Group" msgstr "ชุดขà¸à¸‡à¸›à¸¸à¹ˆà¸¡" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "ชื่à¸à¹‚นด:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(เชื่à¸à¸¡à¸•่à¸à¸ˆà¸²à¸)" @@ -15937,6 +15945,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "ชื่à¸à¹‚หนดไม่ถูà¸à¸•้à¸à¸‡ ใช้ตัวà¸à¸±à¸à¸©à¸£à¸•่à¸à¹„ปนี้ไม่ได้:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "เปลี่ยนชื่à¸à¹‚หนด" @@ -17864,6 +17876,21 @@ msgstr "เติมส่วนที่เลืà¸à¸" msgid "Auto Update Project" msgstr "โปรเจà¸à¸•์ไม่มีชื่à¸" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "à¹à¸ªà¸”งทั้งหมด" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "เลืà¸à¸à¹‚ฟลเดà¸à¸£à¹Œ" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "เลืà¸à¸à¹‚ฟลเดà¸à¸£à¹Œ" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "สิ้นสุดสà¹à¸•คข้à¸à¸œà¸´à¸”พลาดภายใน" @@ -19716,6 +19743,11 @@ msgstr "ตัดโหนด" msgid "Custom BG Color" msgstr "ตัดโหนด" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "ขยายà¸à¸à¸" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20572,6 +20604,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "ชื่à¸à¹à¸žà¹‡à¸„เà¸à¸ˆà¹à¸šà¸šà¸ªà¸±à¹‰à¸™à¸œà¸´à¸”พลาด" diff --git a/editor/translations/tl.po b/editor/translations/tl.po index fec7766383..bf39f11166 100644 --- a/editor/translations/tl.po +++ b/editor/translations/tl.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-04-08 07:29+0000\n" +"PO-Revision-Date: 2022-08-12 17:08+0000\n" "Last-Translator: Napstaguy04 <brokenscreen3@gmail.com>\n" "Language-Team: Tagalog <https://hosted.weblate.org/projects/godot-engine/" "godot/tl/>\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1 && n != 2 && n != 3 && (n % 10 == 4 " "|| n % 10 == 6 || n % 10 == 9);\n" -"X-Generator: Weblate 4.12-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -523,30 +523,26 @@ msgid "Delta" msgstr "" #: core/os/input_event.cpp -#, fuzzy msgid "Channel" -msgstr "Baguhin" +msgstr "" #: core/os/input_event.cpp main/main.cpp -#, fuzzy msgid "Message" -msgstr "I-commit Lahat ng Pagbabago" +msgstr "Mensahe" #: core/os/input_event.cpp -#, fuzzy msgid "Pitch" -msgstr "Switch" +msgstr "Taas ng Tunog" #: core/os/input_event.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/physics_body_2d.cpp scene/3d/cpu_particles.cpp #: scene/3d/physics_body.cpp scene/resources/particles_material.cpp -#, fuzzy msgid "Velocity" -msgstr "Simulan" +msgstr "Bilis" #: core/os/input_event.cpp msgid "Instrument" -msgstr "" +msgstr "Instrumento" #: core/os/input_event.cpp #, fuzzy @@ -627,15 +623,14 @@ msgstr "" #: core/project_settings.cpp main/main.cpp #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #: platform/uwp/os_uwp.cpp -#, fuzzy msgid "Display" -msgstr "Ipakita Lahat" +msgstr "" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/opensimplex/noise_texture.cpp scene/2d/line_2d.cpp #: scene/3d/label_3d.cpp scene/gui/text_edit.cpp scene/resources/texture.cpp msgid "Width" -msgstr "" +msgstr "Lapad" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/gltf/gltf_node.cpp modules/opensimplex/noise_texture.cpp @@ -644,11 +639,11 @@ msgstr "" #: scene/resources/font.cpp scene/resources/navigation_mesh.cpp #: scene/resources/primitive_meshes.cpp scene/resources/texture.cpp msgid "Height" -msgstr "" +msgstr "Taas" #: core/project_settings.cpp msgid "Always On Top" -msgstr "" +msgstr "Parating Nasa Taas" #: core/project_settings.cpp msgid "Test Width" @@ -742,30 +737,27 @@ msgstr "I-urong Pakanan" #: core/project_settings.cpp msgid "UI Up" -msgstr "" +msgstr "UI Taas" #: core/project_settings.cpp -#, fuzzy msgid "UI Down" -msgstr "Baba" +msgstr "UI Baba" #: core/project_settings.cpp -#, fuzzy msgid "UI Page Up" -msgstr "Pahina: " +msgstr "UI Pahinang Taas" #: core/project_settings.cpp msgid "UI Page Down" -msgstr "" +msgstr "UI Pahinang Baba" #: core/project_settings.cpp msgid "UI Home" -msgstr "" +msgstr "UI Panimula" #: core/project_settings.cpp -#, fuzzy msgid "UI End" -msgstr "Sa Huli" +msgstr "UI Wakas" #: core/project_settings.cpp main/main.cpp modules/bullet/register_types.cpp #: modules/bullet/space_bullet.cpp scene/2d/physics_body_2d.cpp @@ -776,7 +768,7 @@ msgstr "Sa Huli" #: servers/physics_2d/space_2d_sw.cpp servers/physics_2d_server.cpp #: servers/physics_server.cpp msgid "Physics" -msgstr "" +msgstr "Pisika" #: core/project_settings.cpp editor/editor_settings.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -786,7 +778,7 @@ msgstr "" #: scene/3d/physics_body.cpp scene/resources/world.cpp #: servers/physics/space_sw.cpp servers/physics_server.cpp msgid "3D" -msgstr "" +msgstr "3D" #: core/project_settings.cpp msgid "Smooth Trimesh Collision" @@ -802,7 +794,7 @@ msgstr "" #: scene/main/viewport.cpp servers/visual/visual_server_scene.cpp #: servers/visual_server.cpp msgid "Rendering" -msgstr "" +msgstr "Pagre-render" #: core/project_settings.cpp drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_scene_gles3.cpp @@ -812,18 +804,17 @@ msgstr "" #: scene/resources/multimesh.cpp servers/visual/visual_server_scene.cpp #: servers/visual_server.cpp msgid "Quality" -msgstr "" +msgstr "Kalidad" #: core/project_settings.cpp scene/gui/file_dialog.cpp #: scene/main/scene_tree.cpp scene/resources/navigation_mesh.cpp #: servers/visual_server.cpp -#, fuzzy msgid "Filters" -msgstr "Salain ang mga node" +msgstr "Mga Pansala" #: core/project_settings.cpp scene/main/viewport.cpp msgid "Sharpen Intensity" -msgstr "" +msgstr "Tindi ng Pagkatulis" #: core/project_settings.cpp editor/editor_export.cpp editor/editor_node.cpp #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp @@ -839,9 +830,8 @@ msgstr "Debug" #: core/project_settings.cpp main/main.cpp modules/gdscript/gdscript.cpp #: modules/visual_script/visual_script.cpp scene/resources/dynamic_font.cpp -#, fuzzy msgid "Settings" -msgstr "Kaayusan:" +msgstr "Pagsasaayos:" #: core/project_settings.cpp editor/script_editor_debugger.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp @@ -849,18 +839,16 @@ msgid "Profiler" msgstr "" #: core/project_settings.cpp -#, fuzzy msgid "Max Functions" -msgstr "Gumawa ng Punsyon" +msgstr "Max na Punksyon" #: core/project_settings.cpp scene/3d/vehicle_body.cpp -#, fuzzy msgid "Compression" -msgstr "Ekspresyon" +msgstr "Kompresyon" #: core/project_settings.cpp msgid "Formats" -msgstr "" +msgstr "Mga Format" #: core/project_settings.cpp msgid "Zstd" @@ -868,15 +856,15 @@ msgstr "" #: core/project_settings.cpp msgid "Long Distance Matching" -msgstr "" +msgstr "Pagtugma sa Mahabang Layo" #: core/project_settings.cpp msgid "Compression Level" -msgstr "" +msgstr "Tindi ng Kompresyon" #: core/project_settings.cpp msgid "Window Log Size" -msgstr "" +msgstr "Laki ng Log ng Window" #: core/project_settings.cpp msgid "Zlib" @@ -892,16 +880,15 @@ msgstr "" #: core/project_settings.cpp msgid "Modules" -msgstr "" +msgstr "Mga Modyul" #: core/register_core_types.cpp msgid "TCP" msgstr "" #: core/register_core_types.cpp -#, fuzzy msgid "Connect Timeout Seconds" -msgstr "Ikabit sa Node:" +msgstr "" #: core/register_core_types.cpp msgid "Packet Peer Stream" @@ -917,7 +904,7 @@ msgstr "" #: core/register_core_types.cpp main/main.cpp msgid "Certificates" -msgstr "" +msgstr "Mga Katibayan" #: core/resource.cpp editor/dependency_editor.cpp #: editor/editor_resource_picker.cpp @@ -926,9 +913,8 @@ msgid "Resource" msgstr "" #: core/resource.cpp -#, fuzzy msgid "Local To Scene" -msgstr "Isara ang Eksena" +msgstr "Lokal sa Eksena" #: core/resource.cpp editor/dependency_editor.cpp #: editor/editor_autoload_settings.cpp editor/plugins/path_editor_plugin.cpp @@ -943,7 +929,7 @@ msgstr "" #: core/translation.cpp editor/project_settings_editor.cpp msgid "Locale" -msgstr "" +msgstr "Wika" #: core/translation.cpp #, fuzzy @@ -1019,9 +1005,8 @@ msgstr "" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp -#, fuzzy msgid "Use GPU Pixel Snap" -msgstr "Paguurong na Pa-pixel" +msgstr "Gamiting ang GPU Paguurong na Pa-pixel" #: drivers/gles2/rasterizer_scene_gles2.cpp #: drivers/gles3/rasterizer_scene_gles3.cpp @@ -1070,11 +1055,11 @@ msgstr "" #: scene/main/canvas_layer.cpp scene/resources/environment.cpp #: scene/resources/material.cpp scene/resources/particles_material.cpp msgid "Scale" -msgstr "" +msgstr "Iskala" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Follow Surface" -msgstr "" +msgstr "Sundan ang Ibabaw" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Weight Samples" @@ -1086,7 +1071,7 @@ msgstr "" #: drivers/gles3/rasterizer_scene_gles3.cpp scene/resources/environment.cpp msgid "High Quality" -msgstr "" +msgstr "Mataas na Kalidad" #: drivers/gles3/rasterizer_storage_gles3.cpp msgid "Blend Shape Max Buffer Size (KB)" @@ -1095,7 +1080,7 @@ msgstr "" #. TRANSLATORS: Adjective, refers to the mode for Bezier handles (Free, Balanced, Mirror). #: editor/animation_bezier_editor.cpp msgid "Free" -msgstr "Walang Bayad" +msgstr "Malaya" #: editor/animation_bezier_editor.cpp msgid "Balanced" @@ -4497,6 +4482,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Proyekto" @@ -7300,7 +7286,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -11524,27 +11511,27 @@ msgstr "Sariwain ang Preview" #: editor/plugins/sprite_editor_plugin.cpp msgid "Settings:" -msgstr "Kaayusan:" +msgstr "Pagsasaayos:" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "No Frames Selected" -msgstr "" +msgstr "Walang Pinipiling Frames" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add %d Frame(s)" -msgstr "" +msgstr "Magdagdag ng %d Frame(s)" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Frame" -msgstr "" +msgstr "Magdagdag ng Frame" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Unable to load images" -msgstr "" +msgstr "Hindi mai-karga ang mga larawan" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "ERROR: Couldn't load frame resource!" -msgstr "" +msgstr "ERROR: Hindi mai-karga ang frame resource!" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Resource clipboard is empty or not a texture!" @@ -11560,7 +11547,7 @@ msgstr "Magdagdag ng Puwang" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation FPS" -msgstr "" +msgstr "Palitan ang FPS ng Animation" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "(empty)" @@ -11579,9 +11566,8 @@ msgid "New Animation" msgstr "" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Filter animations" -msgstr "Salain ang mga method" +msgstr "Salain ang mga animation" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed:" @@ -11630,16 +11616,16 @@ msgstr "" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Horizontal:" -msgstr "" +msgstr "Pahalang:" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Vertical:" -msgstr "" +msgstr "Patayo:" #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/texture_region_editor_plugin.cpp msgid "Separation:" -msgstr "" +msgstr "Pagkakahiwalay:" #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/texture_region_editor_plugin.cpp @@ -11668,7 +11654,7 @@ msgstr "" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Snap Mode:" -msgstr "Paraan ng Paguurong:" +msgstr "Paraan ng Pag-uurong:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Pixel Snap" @@ -11716,15 +11702,15 @@ msgstr "" #: editor/plugins/theme_editor_plugin.cpp msgid "No fonts found." -msgstr "" +msgstr "Walang font na mahanap." #: editor/plugins/theme_editor_plugin.cpp msgid "{num} icon(s)" -msgstr "" +msgstr "(mga) {num} icon" #: editor/plugins/theme_editor_plugin.cpp msgid "No icons found." -msgstr "" +msgstr "Walang icon na mahanap." #: editor/plugins/theme_editor_plugin.cpp msgid "{num} stylebox(es)" @@ -11732,15 +11718,15 @@ msgstr "" #: editor/plugins/theme_editor_plugin.cpp msgid "No styleboxes found." -msgstr "" +msgstr "Walang stylebox ang nahanap." #: editor/plugins/theme_editor_plugin.cpp msgid "{num} currently selected" -msgstr "" +msgstr "{num} ang kasalukuyang pinipili" #: editor/plugins/theme_editor_plugin.cpp msgid "Nothing was selected for the import." -msgstr "" +msgstr "Walang pinili upang i-import." #: editor/plugins/theme_editor_plugin.cpp msgid "Importing Theme Items" @@ -11764,7 +11750,7 @@ msgstr "" #: editor/plugins/theme_editor_plugin.cpp msgid "With Data" -msgstr "" +msgstr "May Data" #: editor/plugins/theme_editor_plugin.cpp msgid "Select by data type:" @@ -11878,9 +11864,8 @@ msgid "" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove Type" -msgstr "Alisin ang Tile" +msgstr "Alisin ang Type" #: editor/plugins/theme_editor_plugin.cpp msgid "" @@ -15086,18 +15071,19 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Pangalan ng Node:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "Ginagamit na ang pangalan ng ibang punsyon/var/hudyat:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Pangalan ng Node:" #: editor/scene_tree_dock.cpp @@ -15288,6 +15274,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Pangalan ng Node:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15353,6 +15344,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17219,6 +17214,21 @@ msgstr "" msgid "Auto Update Project" msgstr "Bumalik sa Talaproyektuhan" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Ipakita Lahat" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Pumili ng Lalagyanan" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Pumili ng Lalagyanan" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19007,6 +19017,11 @@ msgstr "Kopyahin ang mga Node" msgid "Custom BG Color" msgstr "Kopyahin ang mga Node" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Palakihin lahat" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -19847,6 +19862,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/tr.po b/editor/translations/tr.po index ab58a87c36..8cbf35a18b 100644 --- a/editor/translations/tr.po +++ b/editor/translations/tr.po @@ -78,13 +78,20 @@ # Emre <mr.inkaya@gmail.com>, 2022. # Deleted User <noreply+46858@weblate.org>, 2022. # Ümid Quliyev <lucifer25x@protonmail.com>, 2022. +# Mustafa Said AÄŸca <m.said.agca@gmail.com>, 2022. +# YaÅŸar Anıl Sansak <anilsansak@gmail.com>, 2022. +# Hasan Hüseyin Cihangir <hashusfb@gmail.com>, 2022. +# Volkan Gezer <volkangezer@gmail.com>, 2022. +# bsr <bsndrn16@gmail.com>, 2022. +# Ramazan SANCAR <ramazansancar4545@gmail.com>, 2022. +# Burak Orcun OZKABLAN <borcunozkablan@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-08-05 01:04+0000\n" -"Last-Translator: Ümid Quliyev <lucifer25x@protonmail.com>\n" +"PO-Revision-Date: 2022-09-11 22:22+0000\n" +"Last-Translator: Burak Orcun OZKABLAN <borcunozkablan@gmail.com>\n" "Language-Team: Turkish <https://hosted.weblate.org/projects/godot-engine/" "godot/tr/>\n" "Language: tr\n" @@ -92,7 +99,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -107,6 +114,7 @@ msgid "Current Screen" msgstr "Åžu anki Ekran" #: core/bind/core_bind.cpp +#, fuzzy msgid "Exit Code" msgstr "Çıkış Kodu" @@ -136,11 +144,11 @@ msgstr "Ekranı Açık Tut" #: core/bind/core_bind.cpp msgid "Min Window Size" -msgstr "Minimum Pencere Boyutu" +msgstr "Minimum Ekran Boyutu" #: core/bind/core_bind.cpp msgid "Max Window Size" -msgstr "Maksimum Pencere Boyutu" +msgstr "Maksimum Ekran Boyutu" #: core/bind/core_bind.cpp msgid "Screen Orientation" @@ -202,7 +210,7 @@ msgstr "Endian DeÄŸiÅŸimi" #: core/bind/core_bind.cpp msgid "Editor Hint" -msgstr "Düzenleyici İpucusu" +msgstr "Editör İpucu" #: core/bind/core_bind.cpp msgid "Print Error Messages" @@ -214,7 +222,7 @@ msgstr "Saniye Başına Yineleme" #: core/bind/core_bind.cpp msgid "Target FPS" -msgstr "Hedef FPS" +msgstr "Hedeflenen FPS" #: core/bind/core_bind.cpp msgid "Time Scale" @@ -257,7 +265,7 @@ msgstr "Limitler" #: core/command_queue_mt.cpp msgid "Command Queue" -msgstr "Komut Sırası" +msgstr "Komut KuyruÄŸu" #: core/command_queue_mt.cpp msgid "Multithreading Queue Size (KB)" @@ -349,7 +357,7 @@ msgstr "Çıkış ArabelleÄŸi Maksimum Boyutu" #: core/io/packet_peer.cpp msgid "Stream Peer" -msgstr "" +msgstr "Akış EÅŸi" #: core/io/stream_peer.cpp msgid "Big Endian" @@ -425,7 +433,7 @@ msgstr "Mesaj Sırası" #: core/message_queue.cpp msgid "Max Size (KB)" -msgstr "En Büyük Boyut (KB)" +msgstr "Maksimum Boyut (KB)" #: core/os/input.cpp msgid "Mouse Mode" @@ -515,7 +523,6 @@ msgid "Pressure" msgstr "Baskı" #: core/os/input_event.cpp -#, fuzzy msgid "Pen Inverted" msgstr "Ters Kalem" @@ -567,9 +574,8 @@ msgid "Message" msgstr "Mesaj" #: core/os/input_event.cpp -#, fuzzy msgid "Pitch" -msgstr "Perde" +msgstr "EÄŸim" #: core/os/input_event.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/physics_body_2d.cpp scene/3d/cpu_particles.cpp @@ -644,7 +650,7 @@ msgstr "Stderr'i devre dışı bırak" #: core/project_settings.cpp msgid "Use Hidden Project Data Directory" -msgstr "GizlenmiÅŸ Proje Verileri Dizinini Kullan" +msgstr "Gizli Proje Veri Dizinini Kullan" #: core/project_settings.cpp msgid "Use Custom User Dir" @@ -704,12 +710,10 @@ msgid "Editor" msgstr "Düzenleyici" #: core/project_settings.cpp -#, fuzzy msgid "Main Run Args" -msgstr "Ana Sahne DeÄŸiÅŸtirgenleri:" +msgstr "Oynatma Argümanları" #: core/project_settings.cpp -#, fuzzy msgid "Scene Naming" msgstr "Sahne Adlandırma" @@ -722,14 +726,12 @@ msgid "Script Templates Search Path" msgstr "Script Dosyalarını Aramak İçin Dosya Yolu" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Autoload On Startup" msgstr "BaÅŸlangıçta Otomatik Sürüm Kontrolü" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Plugin Name" -msgstr "Sürüm Denetimi Eklenti Adı" +msgstr "Sürüm Denetim Eklentisi Adı" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -864,9 +866,8 @@ msgstr "Ayarlar" #: core/project_settings.cpp editor/script_editor_debugger.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp -#, fuzzy msgid "Profiler" -msgstr "Kesitçi" +msgstr "Profil OluÅŸturucu" #: core/project_settings.cpp msgid "Max Functions" @@ -921,7 +922,6 @@ msgid "Connect Timeout Seconds" msgstr "BaÄŸlanma Zaman Aşımı Süresi(Saniye)" #: core/register_core_types.cpp -#, fuzzy msgid "Packet Peer Stream" msgstr "Paket EÅŸ Akışı" @@ -963,7 +963,6 @@ msgid "Locale" msgstr "Yerel" #: core/translation.cpp -#, fuzzy msgid "Test" msgstr "Deneme" @@ -1051,9 +1050,8 @@ msgstr "Işık Haritalama" #: drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp -#, fuzzy msgid "Use Bicubic Sampling" -msgstr "Bicubic Örneklemeyi Kullanın" +msgstr "Çift Kübik Örneklemeyi Kullan" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Renderable Elements" @@ -1073,7 +1071,7 @@ msgstr "Maks. Objeye düşen Işık Sayısı" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Subsurface Scattering" -msgstr "" +msgstr "Yüzeyaltı Saçılması" #: drivers/gles3/rasterizer_scene_gles3.cpp editor/animation_track_editor.cpp #: editor/import/resource_importer_texture.cpp @@ -1097,9 +1095,8 @@ msgid "Weight Samples" msgstr "Ağırlık Örnekleri" #: drivers/gles3/rasterizer_scene_gles3.cpp -#, fuzzy msgid "Voxel Cone Tracing" -msgstr "Işın İzleme" +msgstr "Voksel Koni İzleme" #: drivers/gles3/rasterizer_scene_gles3.cpp scene/resources/environment.cpp msgid "High Quality" @@ -1112,7 +1109,7 @@ msgstr "Karışım Åžekli Maksimum Arabellek Boyutu (KB)" #. TRANSLATORS: Adjective, refers to the mode for Bezier handles (Free, Balanced, Mirror). #: editor/animation_bezier_editor.cpp msgid "Free" -msgstr "Özgür" +msgstr "Serbest" #: editor/animation_bezier_editor.cpp msgid "Balanced" @@ -1151,16 +1148,18 @@ msgid "Move Bezier Points" msgstr "Bezier Noktalarını Taşı" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp +#, fuzzy msgid "Anim Duplicate Keys" -msgstr "Animasyon Anahtarlarını ÇoÄŸalt" +msgstr "Animasyon Anahtarları ÇoÄŸalt" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Delete Keys" -msgstr "Animasyon Anahtarları Sil" +msgstr "Animasyon Silme TuÅŸları" #: editor/animation_track_editor.cpp +#, fuzzy msgid "Anim Change Keyframe Time" -msgstr "Anim Anahtar-kare Zamanını DeÄŸiÅŸtir" +msgstr "Animasyon Bağımsız Kare Zamanını DeÄŸiÅŸtir" #: editor/animation_track_editor.cpp msgid "Anim Change Transition" @@ -1171,8 +1170,9 @@ msgid "Anim Change Transform" msgstr "Animasyon DeÄŸiÅŸikliÄŸi Dönüşümü" #: editor/animation_track_editor.cpp +#, fuzzy msgid "Anim Change Keyframe Value" -msgstr "Anim Anahtar-kare DeÄŸerini DeÄŸiÅŸtir" +msgstr "Animasyon Bağımsız Kare DeÄŸerini DeÄŸiÅŸtir" #: editor/animation_track_editor.cpp msgid "Anim Change Call" @@ -1224,32 +1224,27 @@ msgid "Type" msgstr "Tür" #: editor/animation_track_editor.cpp -#, fuzzy msgid "In Handle" -msgstr "Tutamacı Ayarla" +msgstr "İç Kulp" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Out Handle" -msgstr "Tutamacı Ayarla" +msgstr "Dış Kulp" #: editor/animation_track_editor.cpp #: editor/import/resource_importer_texture.cpp #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp -#, fuzzy msgid "Stream" -msgstr "Aktarım" +msgstr "Akış" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Start Offset" -msgstr "Izgarayı Kaydır:" +msgstr "BaÅŸlangıç Dengeleme" #: editor/animation_track_editor.cpp -#, fuzzy msgid "End Offset" -msgstr "Kaydırma:" +msgstr "BitiÅŸ Dengeleme" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/import/resource_importer_scene.cpp @@ -1266,8 +1261,9 @@ msgid "Easing" msgstr "YumuÅŸatma" #: editor/animation_track_editor.cpp +#, fuzzy msgid "Anim Multi Change Keyframe Time" -msgstr "Animasyon Anahtar-Çerçeve Zamanını DeÄŸiÅŸtir" +msgstr "Animasyon Çoklu Bağımsız Kare Zamanı DeÄŸiÅŸtir" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Transition" @@ -1300,7 +1296,7 @@ msgstr "Özellik Parçası" #: editor/animation_track_editor.cpp msgid "3D Transform Track" -msgstr "3D Dönüştürücü İzi" +msgstr "3B Dönüştürücü İzi" #: editor/animation_track_editor.cpp msgid "Call Method Track" @@ -1398,41 +1394,34 @@ msgid "Type:" msgstr "Tür:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "(Invalid, expected type: %s)" -msgstr "(Geçersiz Dışa Aktarım Åžablonu: %s)" +msgstr "(Geçersiz, beklenen tür: %s)" #: editor/animation_track_editor.cpp msgid "Easing:" msgstr "YumuÅŸatma:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "In-Handle:" -msgstr "Tutamacı Ayarla" +msgstr "İç-Kulp:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Out-Handle:" -msgstr "Tutamacı Ayarla" +msgstr "Dış-Kulp:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Stream:" -msgstr "Aktarım:" +msgstr "Akış:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Start (s):" -msgstr "BaÅŸlangıç (lar):" +msgstr "BaÅŸlangıç (saniye):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "End (s):" -msgstr "BitiÅŸ (ler):" +msgstr "BitiÅŸ (saniye):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation Clip:" msgstr "Animasyon Klibi:" @@ -1518,12 +1507,10 @@ msgstr "Animasyon İzini Kaldır" #: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp #: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Editors" -msgstr "Düzenleyici" +msgstr "Editörler" #: editor/animation_track_editor.cpp editor/editor_settings.cpp -#, fuzzy msgid "Confirm Insert Track" msgstr "Parça Eklemeyi Onayla" @@ -1650,7 +1637,6 @@ msgid "Add Method Track Key" msgstr "Yöntem İz Anahtarı Ekle" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Method not found in object:" msgstr "Metot, nesne içinde bulunamadı:" @@ -1672,7 +1658,7 @@ msgstr "Metodlar" #: editor/animation_track_editor.cpp msgid "Bezier" -msgstr "" +msgstr "Bezier EÄŸrisi" #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -1845,7 +1831,7 @@ msgstr "Maks. EniyileÅŸtirilebilir Açı:" #: editor/animation_track_editor.cpp scene/3d/room_manager.cpp #: servers/visual_server.cpp msgid "Optimize" -msgstr "İyileÅŸtir" +msgstr "En İyileÅŸtir" #: editor/animation_track_editor.cpp msgid "Remove invalid keys" @@ -2262,7 +2248,6 @@ msgid "Open" msgstr "Aç" #: editor/dependency_editor.cpp -#, fuzzy msgid "Owners of: %s (Total: %d)" msgstr "Sahipleri: %s (Toplam: %d)" @@ -2376,7 +2361,6 @@ msgstr "BaÅŸ GeliÅŸtirici" #. TRANSLATORS: This refers to a job title. #: editor/editor_about.cpp -#, fuzzy msgctxt "Job Title" msgid "Project Manager" msgstr "Proje Yöneticisi" @@ -2621,9 +2605,8 @@ msgid "There is no '%s' file." msgstr "'%s' dosyası bulunamadı." #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Layout:" -msgstr "YerleÅŸim Düzeni:" +msgstr "Düzen:" #: editor/editor_audio_buses.cpp msgid "Invalid file, not an audio bus layout." @@ -2672,7 +2655,6 @@ msgid "Create a new Bus Layout." msgstr "Yeni bir Bus YerleÅŸim Düzeni oluÅŸtur." #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Audio Bus Layout" msgstr "Ses Veri Yolu Düzeni" @@ -2682,7 +2664,7 @@ msgstr "Geçersiz ad." #: editor/editor_autoload_settings.cpp msgid "Cannot begin with a digit." -msgstr "Basamak ile baÅŸlayamaz." +msgstr "Rakamla baÅŸlanamaz." #: editor/editor_autoload_settings.cpp msgid "Valid characters:" @@ -2826,22 +2808,18 @@ msgid "Choose" msgstr "Seç" #: editor/editor_export.cpp -#, fuzzy msgid "Project export for platform:" msgstr "Platform için proje dışa aktarımı:" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with warnings." -msgstr "Hatalarla tamamlandı." +msgstr "Uyarılar ile tamamlandı." #: editor/editor_export.cpp -#, fuzzy msgid "Completed successfully." msgstr "BaÅŸarıyla tamamlandı." #: editor/editor_export.cpp -#, fuzzy msgid "Failed." msgstr "BaÅŸarısız." @@ -2855,32 +2833,27 @@ msgstr "Beklenen adreste dışa aktarım ÅŸablonu bulunamadı:" #: editor/editor_export.cpp msgid "Packing" -msgstr "Çıkınla" +msgstr "Paketle" #: editor/editor_export.cpp -#, fuzzy msgid "Save PCK" -msgstr "PCK'yi kaydet" +msgstr "PCK Dosyasına Kaydet" #: editor/editor_export.cpp -#, fuzzy msgid "Cannot create file \"%s\"." msgstr "\"%s\" dosyası oluÅŸturulamıyor." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to export project files." msgstr "Proje dosyaları dışa aktarılamadı." #: editor/editor_export.cpp -#, fuzzy msgid "Can't open file to read from path \"%s\"." msgstr "\"%s\" yolundan okunacak dosya açılamıyor." #: editor/editor_export.cpp -#, fuzzy msgid "Save ZIP" -msgstr "ZIP dosyasını kaydet" +msgstr "ZIP Dosyasına Kaydet" #: editor/editor_export.cpp msgid "" @@ -2941,7 +2914,6 @@ msgstr "" #: editor/editor_export.cpp platform/android/export/export_plugin.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Custom Template" msgstr "Özel Åžablon" @@ -2953,49 +2925,40 @@ msgid "Release" msgstr "Yayınlamak" #: editor/editor_export.cpp -#, fuzzy msgid "Binary Format" -msgstr "Çift Biçim" +msgstr "Binary Biçimi" #: editor/editor_export.cpp -#, fuzzy msgid "64 Bits" msgstr "64 Bit" #: editor/editor_export.cpp -#, fuzzy msgid "Embed PCK" -msgstr "PCK'yı yerleÅŸtirin" +msgstr "PCK'yi YerleÅŸtir" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Texture Format" msgstr "Doku Biçimi" #: editor/editor_export.cpp -#, fuzzy msgid "BPTC" msgstr "BPTC" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "S3TC" msgstr "S3TC" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "ETC" msgstr "ETC" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "ETC2" msgstr "ETC2" #: editor/editor_export.cpp -#, fuzzy msgid "No BPTC Fallbacks" -msgstr "Shader Yedeklerini Zorla" +msgstr "BPTC Gerilemesi Yok" #: editor/editor_export.cpp platform/android/export/export_plugin.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp @@ -3010,39 +2973,33 @@ msgid "Custom release template not found." msgstr "Özel yayınlama ÅŸablonu bulunamadı." #: editor/editor_export.cpp -#, fuzzy msgid "Prepare Template" msgstr "Åžablon Hazırla" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "The given export path doesn't exist." -msgstr "Belirtilen Dışa aktarım yolu mevcut deÄŸil:" +msgstr "Belirtilen dışa aktarım yolu mevcut deÄŸil." #: editor/editor_export.cpp platform/javascript/export/export.cpp -#, fuzzy msgid "Template file not found: \"%s\"." msgstr "Åžablon dosyası bulunamadı: \"%s\"." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to copy export template." -msgstr "Dışa aktarma ÅŸablonu kopyalanamadı." +msgstr "Dışa aktarım ÅŸablonu kopyalanamadı." #: editor/editor_export.cpp platform/windows/export/export.cpp #: platform/x11/export/export.cpp -#, fuzzy msgid "PCK Embedding" -msgstr "Dolgulama" +msgstr "PCK Gömme" #: editor/editor_export.cpp msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." msgstr "32-bit dışa aktarımlarda gömülü PCK 4GiB'tan büyük olamaz." #: editor/editor_export.cpp -#, fuzzy msgid "Convert Text Resources To Binary On Export" -msgstr "Dışa Aktarmada Metin Kaynaklarını İkili Dosyaya Dönüştür" +msgstr "Dışa Aktarım Sırasında Metin Kaynaklarını Binary Formata Dönüştür" #: editor/editor_feature_profile.cpp msgid "3D Editor" @@ -3063,19 +3020,19 @@ msgstr "Sahne AÄŸacı Düzenleme" #: editor/editor_feature_profile.cpp msgid "Node Dock" -msgstr "Dock Nod" +msgstr "Node Rıhtımı" #: editor/editor_feature_profile.cpp msgid "FileSystem Dock" -msgstr "Dosya Sistemi" +msgstr "Dosya Sistemi Rıhtımı" #: editor/editor_feature_profile.cpp msgid "Import Dock" -msgstr "Dock İçe Aktar" +msgstr "Rıhtım İçe Aktar" #: editor/editor_feature_profile.cpp msgid "Allows to view and edit 3D scenes." -msgstr "3D sahneleri görüntülemeye ve düzenlemeye izin verir." +msgstr "Üç boyutlu sahneleri görüntülemeye ve düzenlemeye izin verir." #: editor/editor_feature_profile.cpp msgid "Allows to edit scripts using the integrated script editor." @@ -3113,7 +3070,7 @@ msgstr "" #: editor/editor_feature_profile.cpp msgid "(current)" -msgstr "(Åžu anki)" +msgstr "(mevcut)" #: editor/editor_feature_profile.cpp msgid "(none)" @@ -3251,7 +3208,6 @@ msgid "Manage Editor Feature Profiles" msgstr "Dışa Aktarım Åžablonlarını Yönet" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Default Feature Profile" msgstr "Varsayılan Özellik Profili" @@ -3325,14 +3281,12 @@ msgid "Save a File" msgstr "Bir Dosya Kaydet" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Access" msgstr "EriÅŸim" #: editor/editor_file_dialog.cpp editor/editor_settings.cpp -#, fuzzy msgid "Display Mode" -msgstr "Ekran Modu" +msgstr "Görüntüleme Modu" #: editor/editor_file_dialog.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -3345,33 +3299,27 @@ msgstr "Ekran Modu" #: scene/resources/environment.cpp scene/resources/material.cpp #: scene/resources/visual_shader.cpp #: servers/audio/effects/audio_effect_distortion.cpp -#, fuzzy msgid "Mode" msgstr "Mod" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Current Dir" msgstr "Geçerli Dizin" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Current File" msgstr "Geçerli Dosya" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Current Path" msgstr "Geçerli Yol" #: editor/editor_file_dialog.cpp editor/editor_settings.cpp #: scene/gui/file_dialog.cpp -#, fuzzy msgid "Show Hidden Files" msgstr "Gizli Dosyaları Göster" #: editor/editor_file_dialog.cpp -#, fuzzy msgid "Disable Overwrite Warning" msgstr "Üzerine Yazma Uyarısını Devre Dışı Bırak" @@ -3475,9 +3423,8 @@ msgid "(Re)Importing Assets" msgstr "Varlıklar Yeniden-İçe Aktarılıyor" #: editor/editor_file_system.cpp -#, fuzzy msgid "Reimport Missing Imported Files" -msgstr "İçe Aktarılan Eksik Dosyaları Yeniden İçe Aktar" +msgstr "Eksik Dosyaları Yeniden İçe Aktar" #: editor/editor_help.cpp scene/2d/camera_2d.cpp scene/gui/control.cpp #: scene/gui/nine_patch_rect.cpp scene/resources/dynamic_font.cpp @@ -3507,7 +3454,6 @@ msgid "Properties" msgstr "Özellikler" #: editor/editor_help.cpp -#, fuzzy msgid "overrides %s:" msgstr "%s'yi geçersiz kılar:" @@ -3579,9 +3525,8 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: modules/gdscript/editor/gdscript_highlighter.cpp #: modules/gdscript/gdscript_editor.cpp -#, fuzzy msgid "Text Editor" -msgstr "Metin Düzenleyici" +msgstr "Metin Editörü" #: editor/editor_help.cpp editor/editor_node.cpp editor/editor_settings.cpp #: editor/plugins/shader_editor_plugin.cpp @@ -3589,7 +3534,6 @@ msgid "Help" msgstr "Yardım" #: editor/editor_help.cpp -#, fuzzy msgid "Sort Functions Alphabetically" msgstr "Fonksiyonları Alfabetik Olarak Sırala" @@ -3671,40 +3615,34 @@ msgid "Property:" msgstr "Özellik:" #: editor/editor_inspector.cpp editor/editor_spin_slider.cpp -#, fuzzy msgid "Label" msgstr "Etiket" #: editor/editor_inspector.cpp editor/editor_spin_slider.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Read Only" -msgstr "Sadece Okunur" +msgstr "Salt Okunur" #: editor/editor_inspector.cpp editor/plugins/item_list_editor_plugin.cpp -#, fuzzy msgid "Checkable" -msgstr "Kontrol edilebilir" +msgstr "Denetlenebilir" #: editor/editor_inspector.cpp editor/plugins/item_list_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Checked" -msgstr "Kontrol edildi" +msgstr "Denetlendi" #: editor/editor_inspector.cpp -#, fuzzy msgid "Draw Red" msgstr "Kırmızı Çiz" #: editor/editor_inspector.cpp -#, fuzzy msgid "Keying" msgstr "Anahtarlama" #: editor/editor_inspector.cpp msgid "Pin value" -msgstr "İğneleme deÄŸeri" +msgstr "Sabitleme deÄŸeri" #: editor/editor_inspector.cpp msgid "" @@ -3715,7 +3653,7 @@ msgstr "" #: editor/editor_inspector.cpp msgid "Pin value [Disabled because '%s' is editor-only]" msgstr "" -"DeÄŸer sabitle [Devre dışı bırakıldı çünkü '%s' sadece editör için aktiftir]" +"Sabitleme deÄŸeri [Devre dışı bırakıldı çünkü '%s' sadece editör içindir]" #: editor/editor_inspector.cpp #: editor/plugins/gradient_texture_2d_editor_plugin.cpp @@ -3732,11 +3670,11 @@ msgstr "Çoklu Ayarla:" #: editor/editor_inspector.cpp msgid "Pinned %s" -msgstr "% SabitlenmiÅŸler" +msgstr "%s sabitlendi" #: editor/editor_inspector.cpp msgid "Unpinned %s" -msgstr "%SabitlenmemiÅŸler" +msgstr "%s serbest bırakıldı" #: editor/editor_inspector.cpp msgid "Copy Property" @@ -4063,14 +4001,12 @@ msgid "Quick Open Script..." msgstr "BetiÄŸi Hızlı Aç..." #: editor/editor_node.cpp -#, fuzzy msgid "Save & Reload" msgstr "Kaydet ve Yeniden Yükle" #: editor/editor_node.cpp -#, fuzzy msgid "Save changes to '%s' before reloading?" -msgstr "Çıkmadan önce deÄŸiÅŸiklikler '%s' ‘ye kaydedilsin mi?" +msgstr "Yeniden yüklemeden önce deÄŸiÅŸiklikler '%s' dosyasına kaydedilsin mi?" #: editor/editor_node.cpp msgid "Save & Close" @@ -4189,9 +4125,9 @@ msgid "Open Project Manager?" msgstr "Proje Yöneticisi Açılsın Mı?" #: editor/editor_node.cpp -#, fuzzy msgid "Save changes to the following scene(s) before reloading?" -msgstr "Çıkmadan önce deÄŸiÅŸiklikler sahne(ler)e kaydedilsin mi?" +msgstr "" +"Yeniden yüklemeden önce ÅŸu sahne(ler)deki deÄŸiÅŸiklikler kaydedilsin mi?" #: editor/editor_node.cpp msgid "Save & Quit" @@ -4375,7 +4311,6 @@ msgid "%d more files" msgstr "%d daha fazla dosyalar" #: editor/editor_node.cpp -#, fuzzy msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" @@ -4419,70 +4354,60 @@ msgid "Always Close Output On Stop" msgstr "DurdurulduÄŸunda Çıktıyı Daima Kapat" #: editor/editor_node.cpp -#, fuzzy msgid "Save On Focus Loss" -msgstr "Odak Kaybından Tasarruf Edin" +msgstr "Odak Kaybında Kaydet" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Save Each Scene On Quit" -msgstr "Dalı Sahne olarak Kaydet" +msgstr "Çıkışta Her Sahneyi Kaydet" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Quit Confirmation" -msgstr "Bilgi Göster" +msgstr "Çıkış Onayı" #: editor/editor_node.cpp -#, fuzzy msgid "Show Update Spinner" -msgstr "Güncelleme Topacını Gizle" +msgstr "Güncelleme İkonunu Göster" #: editor/editor_node.cpp msgid "Update Continuously" msgstr "Sürekli Güncelle" #: editor/editor_node.cpp -#, fuzzy msgid "Update Vital Only" -msgstr "Materyal DeÄŸiÅŸiklikleri:" +msgstr "Sadece Önemli Güncellemeler" #: editor/editor_node.cpp -#, fuzzy msgid "Localize Settings" -msgstr "YerelleÅŸtirme" +msgstr "YerelleÅŸtirme Ayarları" #: editor/editor_node.cpp -#, fuzzy msgid "Restore Scenes On Load" -msgstr "Sahne Düğümünü Al" +msgstr "Açılışta Sahneleri Geri Yükle" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Show Thumbnail On Hover" -msgstr "Fareyle üzerine gelindiÄŸinde  küçük resmi göster" +msgstr "Üzerine GelindiÄŸinde Küçük Resim Göster" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Inspector" -msgstr "Denetçi" +msgstr "Denetleyici" #: editor/editor_node.cpp -#, fuzzy msgid "Default Property Name Style" -msgstr "Proje Yolu:" +msgstr "Varsayılan Özellik İsim Biçimi" #: editor/editor_node.cpp msgid "Default Float Step" -msgstr "" +msgstr "Varsayılan Ondalık Adımı" #: editor/editor_node.cpp scene/gui/tree.cpp -#, fuzzy msgid "Disable Folding" -msgstr "Pasif Düğme" +msgstr "Katlamayı Devre Dışı Bırak" #: editor/editor_node.cpp msgid "Auto Unfold Foreign Scenes" -msgstr "" +msgstr "Harici Sahneleri Otomatik Olarak Yay" #: editor/editor_node.cpp msgid "Horizontal Vector2 Editing" @@ -4493,19 +4418,16 @@ msgid "Horizontal Vector Types Editing" msgstr "Yatay Vector tipleri düzenleme" #: editor/editor_node.cpp -#, fuzzy msgid "Open Resources In Current Inspector" -msgstr "Gözetmen Bölümünde Aç" +msgstr "Kaynakları Mevcut Denetleyicide Aç" #: editor/editor_node.cpp -#, fuzzy msgid "Resources To Open In New Inspector" -msgstr "Gözetmen Bölümünde Aç" +msgstr "Yeni Denetleyicide Açılacak Kaynaklar" #: editor/editor_node.cpp -#, fuzzy msgid "Default Color Picker Mode" -msgstr "Varsayılan renk seçme modu" +msgstr "Varsayılan Renk Seçme Modu" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Version Control" @@ -4615,6 +4537,7 @@ msgstr "ÇeÅŸitli proje ya da sahne-çapında araçlar." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Proje" @@ -4896,14 +4819,12 @@ msgid "Save & Restart" msgstr "Kaydet ve BaÅŸtan BaÅŸlat" #: editor/editor_node.cpp -#, fuzzy msgid "Update All Changes" -msgstr "DeÄŸiÅŸiklik OlduÄŸunda Güncelle" +msgstr "Tüm DeÄŸiÅŸiklikleri Güncelle" #: editor/editor_node.cpp -#, fuzzy msgid "Update Vital Changes" -msgstr "Materyal DeÄŸiÅŸiklikleri:" +msgstr "Önemli DeÄŸiÅŸiklikleri Güncelle" #: editor/editor_node.cpp msgid "Hide Update Spinner" @@ -5164,12 +5085,11 @@ msgstr "Hata Ayıklayıcı" #: editor/editor_profiler.cpp msgid "Profiler Frame History Size" -msgstr "" +msgstr "Profil OluÅŸturucu Çerçeve GeçmiÅŸi Boyutu" #: editor/editor_profiler.cpp -#, fuzzy msgid "Profiler Frame Max Functions" -msgstr "İşlevi Yeniden Adlandır" +msgstr "Profil OluÅŸturucu Çerçeve Maksimum Fonksiyon Sayısı" #: editor/editor_properties.cpp msgid "Edit Text:" @@ -5302,20 +5222,17 @@ msgstr "Yeni %s" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Base Type" -msgstr "Temel Tipi DeÄŸiÅŸtir" +msgstr "Temel Tür" #: editor/editor_resource_picker.cpp -#, fuzzy msgid "Edited Resource" -msgstr "Kaynak Ekle" +msgstr "DeÄŸiÅŸtirilmiÅŸ Kaynak" #: editor/editor_resource_picker.cpp scene/gui/line_edit.cpp #: scene/gui/slider.cpp scene/gui/spin_box.cpp -#, fuzzy msgid "Editable" -msgstr "Düzenlenebilir Öge" +msgstr "Düzenlenebilir" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "New Script" @@ -5326,9 +5243,8 @@ msgid "Extend Script" msgstr "Betik Aç" #: editor/editor_resource_picker.cpp -#, fuzzy msgid "Script Owner" -msgstr "Betik Adı:" +msgstr "Senaryo Sahibi" #: editor/editor_run_native.cpp msgid "" @@ -5341,9 +5257,8 @@ msgstr "" "bir ön ayarı çalıştırılabilir olarak tanımlayın." #: editor/editor_run_native.cpp -#, fuzzy msgid "Project Run" -msgstr "Proje" +msgstr "Proje KoÅŸusu" #: editor/editor_run_script.cpp msgid "Write your logic in the _run() method." @@ -5370,14 +5285,12 @@ msgid "Did you forget the '_run' method?" msgstr "'_run()' metodunu unuttunuz mu?" #: editor/editor_settings.cpp -#, fuzzy msgid "Editor Language" -msgstr "Düzenleyici YerleÅŸim Düzeni" +msgstr "Editör Dili" #: editor/editor_settings.cpp -#, fuzzy msgid "Display Scale" -msgstr "Hepsini Görüntüle" +msgstr "ÖlçeÄŸi Görüntüle" #: editor/editor_settings.cpp msgid "Custom Display Scale" @@ -5397,48 +5310,43 @@ msgstr "Kenarı yumuÅŸatılmış font" #: editor/editor_settings.cpp msgid "Font Hinting" -msgstr "" +msgstr "Yazıtipi İpucusu" #: editor/editor_settings.cpp -#, fuzzy msgid "Main Font" -msgstr "Ana Sahne" +msgstr "Ana Yazı Tipi" #: editor/editor_settings.cpp msgid "Main Font Bold" msgstr "Ana font kalınlığı" #: editor/editor_settings.cpp -#, fuzzy msgid "Code Font" -msgstr "Düğüm Noktası Ekle" +msgstr "Kod Yazı Tipi" #: editor/editor_settings.cpp -#, fuzzy msgid "Dim Editor On Dialog Popup" -msgstr "İletiÅŸim penceresinde Dim Editörü" +msgstr "Popup Diyalog Çıktığında Editörü Karart" #: editor/editor_settings.cpp main/main.cpp msgid "Low Processor Mode Sleep (µsec)" -msgstr "" +msgstr "Düşük İşlemci Modu Uykusu (mikrosaniye)" #: editor/editor_settings.cpp msgid "Unfocused Low Processor Mode Sleep (µsec)" -msgstr "" +msgstr "Odaklanılmamış Düşük İşlemci Modu Uykusu (mikrosaniye)" #: editor/editor_settings.cpp -#, fuzzy msgid "Separate Distraction Mode" -msgstr "Dikkat Dağıtmayan Kip" +msgstr "Ayrık Dikkat Modu" #: editor/editor_settings.cpp msgid "Automatically Open Screenshots" msgstr "Otomatik olarak ekran görüntülerini aç" #: editor/editor_settings.cpp -#, fuzzy msgid "Max Array Dictionary Items Per Page" -msgstr "Her sayfada maks dizi sözlüğü öğesi" +msgstr "Sayfa Başına Maksimum Dizi Sözlüğü Öğesi" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp scene/gui/control.cpp @@ -5455,14 +5363,12 @@ msgid "Icon And Font Color" msgstr "Simge ve Font rengi" #: editor/editor_settings.cpp -#, fuzzy msgid "Base Color" -msgstr "Renkler" +msgstr "Temel Renk" #: editor/editor_settings.cpp -#, fuzzy msgid "Accent Color" -msgstr "Renk Seç" +msgstr "Vurgu Rengi" #: editor/editor_settings.cpp scene/resources/environment.cpp msgid "Contrast" @@ -5470,113 +5376,96 @@ msgstr "Kontrast" #: editor/editor_settings.cpp msgid "Relationship Line Opacity" -msgstr "" +msgstr "İliÅŸki Hattı Opaklığı" #: editor/editor_settings.cpp -#, fuzzy msgid "Highlight Tabs" -msgstr "Işık-haritaları kaydediliyor" +msgstr "Tab Karakterlerini Vurgula" #: editor/editor_settings.cpp -#, fuzzy msgid "Border Size" -msgstr "Kenar Pikselleri" +msgstr "Kenarlık Boyutu" #: editor/editor_settings.cpp msgid "Use Graph Node Headers" -msgstr "" +msgstr "Grafik Node Üstbilgilerini Kullan" #: editor/editor_settings.cpp -#, fuzzy msgid "Additional Spacing" -msgstr "Animasyon Döngüsü" +msgstr "Ek BoÅŸluk" #: editor/editor_settings.cpp -#, fuzzy msgid "Custom Theme" -msgstr "Editör Teması" +msgstr "Özel Tema" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Script Button" -msgstr "Tekerlek SaÄŸ Düğme" +msgstr "Senaryo Düğmesini Göster" #: editor/editor_settings.cpp -#, fuzzy msgid "Directories" -msgstr "Yönler" +msgstr "Klasörler" #: editor/editor_settings.cpp -#, fuzzy msgid "Autoscan Project Path" -msgstr "Proje Yolu:" +msgstr "Proje Yolunu Otomatik Tara" #: editor/editor_settings.cpp -#, fuzzy msgid "Default Project Path" -msgstr "Proje Yolu:" +msgstr "Varsayılan Proje Yolu" #: editor/editor_settings.cpp -#, fuzzy msgid "On Save" -msgstr "Kaydet" +msgstr "Kayıtta" #: editor/editor_settings.cpp -#, fuzzy msgid "Compress Binary Resources" -msgstr "Kaynağı Tıpkıla" +msgstr "Binary Kaynakları Sıkıştır" #: editor/editor_settings.cpp +#, fuzzy msgid "Safe Save On Backup Then Rename" -msgstr "" +msgstr "İsimlendirdikten Sonra YedeÄŸe Güvenli Kaydet" #: editor/editor_settings.cpp -#, fuzzy msgid "File Dialog" -msgstr "XForm İletiÅŸim Kutusu" +msgstr "Dosya DiyaloÄŸu" #: editor/editor_settings.cpp -#, fuzzy msgid "Thumbnail Size" -msgstr "Küçük Resim..." +msgstr "Küçük Resim Boyutu" #: editor/editor_settings.cpp msgid "Docks" -msgstr "Eklentiler" +msgstr "Rıhtımlar" #: editor/editor_settings.cpp -#, fuzzy msgid "Scene Tree" -msgstr "Sahne AÄŸacını Al" +msgstr "Sahne AÄŸacı" #: editor/editor_settings.cpp msgid "Start Create Dialog Fully Expanded" -msgstr "" +msgstr "OluÅŸtur DiyaloÄŸunu Tam Boy BaÅŸlat" #: editor/editor_settings.cpp -#, fuzzy msgid "Always Show Folders" -msgstr "Daima Izgarayı Göster" +msgstr "Klasörleri Daima Göster" #: editor/editor_settings.cpp -#, fuzzy msgid "Property Editor" -msgstr "Grup Düzenleyici" +msgstr "Özellik Editörü" #: editor/editor_settings.cpp -#, fuzzy msgid "Auto Refresh Interval" -msgstr "Otomatik yenileme intervalı" +msgstr "Otomatik Yenileme Aralığı" #: editor/editor_settings.cpp -#, fuzzy msgid "Subresource Hue Tint" -msgstr "Alt Kaynaklar" +msgstr "Alt Kaynak Renk Tonu" #: editor/editor_settings.cpp -#, fuzzy msgid "Color Theme" -msgstr "Editör Teması" +msgstr "Renk Teması" #: editor/editor_settings.cpp scene/3d/label_3d.cpp #: scene/resources/default_theme/default_theme.cpp @@ -5585,50 +5474,44 @@ msgstr "Satır aralığı" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp #: modules/gdscript/editor/gdscript_highlighter.cpp -#, fuzzy msgid "Highlighting" -msgstr "DoÄŸrudan aydınlatma" +msgstr "Vurgulama" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Syntax Highlighting" -msgstr "Yazım Vurgulama" +msgstr "Sözdizim Vurgulama" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Highlight All Occurrences" -msgstr "" +msgstr "Tüm Olayları Vurgula" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Highlight Current Line" -msgstr "Geçerli satırı vurgula" +msgstr "Mevcut Satırı Vurgula" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp msgid "Highlight Type Safe Lines" -msgstr "" +msgstr "Tip GüvenliÄŸine Tabi Satırları Vurgula" #: editor/editor_settings.cpp -#, fuzzy msgid "Indent" -msgstr "Sola Girintile" +msgstr "Girintile" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp msgid "Auto Indent" msgstr "Kendinden Girintili" #: editor/editor_settings.cpp -#, fuzzy msgid "Convert Indent On Save" -msgstr "Girintiyi BoÅŸluklara Dönüştür" +msgstr "Kayıt Sırasında Girintileri Dönüştür" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Draw Tabs" -msgstr "Çizim ÇaÄŸrıları:" +msgstr "Tab Karakterlerini Çiz" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Draw Spaces" -msgstr "Çizim ÇaÄŸrıları:" +msgstr "BoÅŸluk Karakterlerini Çiz" #: editor/editor_settings.cpp editor/plugins/spatial_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/tile_map.cpp @@ -5646,9 +5529,8 @@ msgid "V Scroll Speed" msgstr "V kaydırma hızı" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Minimap" -msgstr "BaÅŸlatımı Göster" +msgstr "Mini Haritayı Göster" #: editor/editor_settings.cpp msgid "Minimap Width" @@ -5656,113 +5538,102 @@ msgstr "Küçük Harita GeniÅŸliÄŸi" #: editor/editor_settings.cpp msgid "Mouse Extra Buttons Navigate History" -msgstr "" +msgstr "Ek Fare Butonları GeçmiÅŸte Gezinmek İçin Kullanılsın" #: editor/editor_settings.cpp -#, fuzzy msgid "Drag And Drop Selection" -msgstr "GridMap Seçimi" +msgstr "Sürükle ve Bırak Seçimi" #: editor/editor_settings.cpp -#, fuzzy msgid "Stay In Script Editor On Node Selected" -msgstr "SeçilmiÅŸ Düğümde Script Editöründe Kal" +msgstr "Node Seçiminde Senaryo Editöründe Kal" #: editor/editor_settings.cpp msgid "Appearance" msgstr "Dış görünüş" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Show Line Numbers" -msgstr "Satır Numarası:" +msgstr "Satır Numaralarını Göster" #: editor/editor_settings.cpp -#, fuzzy msgid "Line Numbers Zero Padded" -msgstr "Satır Numarası:" +msgstr "Satır Numaralarının Başına Sıfır Ekle" #: editor/editor_settings.cpp msgid "Show Bookmark Gutter" -msgstr "" +msgstr "Yer İmi BoÅŸluÄŸunu Göster" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Breakpoint Gutter" -msgstr "İşaret Noktalarını Atla" +msgstr "Breakpoint BoÅŸluÄŸunu Göster" #: editor/editor_settings.cpp msgid "Show Info Gutter" -msgstr "" +msgstr "Bilgi BoÅŸluÄŸunu Göster" #: editor/editor_settings.cpp -#, fuzzy msgid "Code Folding" -msgstr "Kod katlama" +msgstr "Kod Katlama" #: editor/editor_settings.cpp -#, fuzzy msgid "Word Wrap" -msgstr "Kelime Paketle" +msgstr "Sözcük Kaydırma" #: editor/editor_settings.cpp msgid "Show Line Length Guidelines" -msgstr "" +msgstr "Satır UzunluÄŸu Yönergelerini Göster" #: editor/editor_settings.cpp msgid "Line Length Guideline Soft Column" -msgstr "" +msgstr "Satır UzunluÄŸu Yönergesi YumuÅŸak Sütun" #: editor/editor_settings.cpp msgid "Line Length Guideline Hard Column" -msgstr "" +msgstr "Satır UzunluÄŸu Yönergesi Sert Sütun" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Script List" -msgstr "Kod Düzenleyici" +msgstr "Senaryo Listesi" #: editor/editor_settings.cpp msgid "Show Members Overview" msgstr "Üyelerin Genel Bakışını Göster" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Files" -msgstr "Dosya" +msgstr "Dosyalar" #: editor/editor_settings.cpp -#, fuzzy msgid "Trim Trailing Whitespace On Save" -msgstr "İzleyenin BoÅŸluklarını Kırp" +msgstr "Kaydederken Satır Sonundaki BoÅŸlukları Sil" #: editor/editor_settings.cpp msgid "Autosave Interval Secs" -msgstr "" +msgstr "Otomatik Kayıt Aralığı Saniye" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Restore Scripts On Load" -msgstr "Script'leri Yüklemede Eski Haline Getir" +msgstr "Yükleme Sırasında Komut Dizilerini Eski Hallerine Getir" #: editor/editor_settings.cpp -#, fuzzy msgid "Auto Reload And Parse Scripts On Save" -msgstr "Kaydederken Script'leri Otomatik Tekrar yükle ve Ayrıştır" +msgstr "" +"Kayıt Sırasında Komut Dizilerini Otomatik Olarak Tekrar Yükle ve Çözümle" #: editor/editor_settings.cpp -#, fuzzy msgid "Auto Reload Scripts On External Change" -msgstr "Dış DeÄŸiÅŸiklikte Otomatik Olarak Script'i Geri Yükle" +msgstr "" +"Dışarıdan Bir DeÄŸiÅŸiklik Yapıldığında Komut Dizilerini Otomatik Olarak " +"Yeniden Yükle" #: editor/editor_settings.cpp -#, fuzzy msgid "Create Signal Callbacks" -msgstr "Shader Yedeklerini Zorla" +msgstr "Sinyal Geri Çağırması OluÅŸtur" #: editor/editor_settings.cpp msgid "Sort Members Outline Alphabetically" -msgstr "" +msgstr "Fonksiyonları Alfabetik Sırala" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Cursor" @@ -5774,35 +5645,33 @@ msgstr "Dosyanın Sonunu Kaydır" #: editor/editor_settings.cpp msgid "Block Caret" -msgstr "" +msgstr "Blok İmleç" #: editor/editor_settings.cpp msgid "Caret Blink" -msgstr "" +msgstr "Karet Yansön" #: editor/editor_settings.cpp msgid "Caret Blink Speed" -msgstr "" +msgstr "Karet Yansön Hızı" #: editor/editor_settings.cpp -#, fuzzy msgid "Right Click Moves Caret" -msgstr "Nokta eklemek için saÄŸ tıkla" +msgstr "SaÄŸ Tık Kareti Hareket Ettirsin" #: editor/editor_settings.cpp modules/gdscript/gdscript.cpp #: modules/gdscript/gdscript_editor.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Completion" -msgstr "Seçimi Kopyala" +msgstr "Tamamlanma" #: editor/editor_settings.cpp msgid "Idle Parse Delay" -msgstr "" +msgstr "BoÅŸta Çözümleme Gecikmesi" #: editor/editor_settings.cpp msgid "Auto Brace Complete" -msgstr "" +msgstr "Süslü Ayraçları Otomatik EÅŸle" #: editor/editor_settings.cpp msgid "Code Complete Delay" @@ -5810,84 +5679,73 @@ msgstr "Kod Tamamlama Gecikme Süresi" #: editor/editor_settings.cpp msgid "Put Callhint Tooltip Below Current Line" -msgstr "" +msgstr "Çağırma Araç İpucunu Mavcut Satırın Altında Tut" #: editor/editor_settings.cpp msgid "Callhint Tooltip Offset" -msgstr "" +msgstr "Çağırma Araç İpucu Göreli Konumu" #: editor/editor_settings.cpp -#, fuzzy msgid "Complete File Paths" -msgstr "Düğüm Yolunu Kopyala" +msgstr "Dosya Yollarını Tamamla" #: editor/editor_settings.cpp modules/gdscript/gdscript_editor.cpp -#, fuzzy msgid "Add Type Hints" -msgstr "Tür Ekle" +msgstr "Tür İpuçlarını Ekle" #: editor/editor_settings.cpp -#, fuzzy msgid "Use Single Quotes" -msgstr "Yeni Döşeme Parçacığı" +msgstr "Tek Tırnak İşareti Kullan" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Help Index" -msgstr "Yardımcıları Göster" +msgstr "Yardım İndeksini Göster" #: editor/editor_settings.cpp msgid "Help Font Size" -msgstr "" +msgstr "Yardım Yazı Tipi Boyutu" #: editor/editor_settings.cpp msgid "Help Source Font Size" -msgstr "" +msgstr "Yardım Kaynak Yazı Tipi Boyutu" #: editor/editor_settings.cpp msgid "Help Title Font Size" -msgstr "" +msgstr "Yardım BaÅŸlık Yazı Tipi Boyutu" #: editor/editor_settings.cpp modules/gridmap/grid_map_editor_plugin.cpp msgid "Grid Map" msgstr "Izgara Haritası" #: editor/editor_settings.cpp modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Pick Distance" -msgstr "Uzaklık Seç:" +msgstr "Mesafe Seç" #: editor/editor_settings.cpp editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Preview Size" -msgstr "Önizleme" +msgstr "Önizleme Boyutu" #: editor/editor_settings.cpp -#, fuzzy msgid "Primary Grid Color" msgstr "Birincil Izgara Rengi" #: editor/editor_settings.cpp -#, fuzzy msgid "Secondary Grid Color" msgstr "İkincil Izgara Rengi" #: editor/editor_settings.cpp -#, fuzzy msgid "Selection Box Color" -msgstr "Yalnızca Seçim" +msgstr "Seçim Kutusu Rengi" #: editor/editor_settings.cpp editor/plugins/path_editor_plugin.cpp #: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp -#, fuzzy msgid "3D Gizmos" -msgstr "Gizmolar" +msgstr "Üç Boyutlu Gizmolar" #: editor/editor_settings.cpp editor/plugins/path_editor_plugin.cpp #: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp -#, fuzzy msgid "Gizmo Colors" -msgstr "Emisyon Renkleri" +msgstr "Gizmo Renkleri" #: editor/editor_settings.cpp #, fuzzy @@ -5896,9 +5754,8 @@ msgstr "Örnek" #: editor/editor_settings.cpp modules/gltf/gltf_node.cpp #: scene/3d/physics_body.cpp -#, fuzzy msgid "Joint" -msgstr "Nokta" +msgstr "Eklem" #: editor/editor_settings.cpp scene/2d/collision_shape_2d.cpp #: scene/2d/cpu_particles_2d.cpp scene/2d/touch_screen_button.cpp @@ -5910,112 +5767,96 @@ msgid "Shape" msgstr "Åžekil" #: editor/editor_settings.cpp -#, fuzzy msgid "Primary Grid Steps" -msgstr "Izgara Adımı:" +msgstr "Birincil Izgara Adımları" #: editor/editor_settings.cpp -#, fuzzy msgid "Grid Size" -msgstr "Izgara Adımı:" +msgstr "Izgara Boyutu" #: editor/editor_settings.cpp msgid "Grid Division Level Max" -msgstr "" +msgstr "Maksimum Izgara Bölme Seviyesi" #: editor/editor_settings.cpp msgid "Grid Division Level Min" -msgstr "" +msgstr "Minimum Izgara Bölme Seviyesi" #: editor/editor_settings.cpp msgid "Grid Division Level Bias" -msgstr "" +msgstr "Izgara Bölme Seviyesi Sapması" #: editor/editor_settings.cpp -#, fuzzy msgid "Grid XZ Plane" -msgstr "IzgaraHaritası Boyama" +msgstr "Izgara XZ Düzlemi" #: editor/editor_settings.cpp -#, fuzzy msgid "Grid XY Plane" -msgstr "IzgaraHaritası Boyama" +msgstr "Izgara XY Düzlemi" #: editor/editor_settings.cpp -#, fuzzy msgid "Grid YZ Plane" -msgstr "IzgaraHaritası Boyama" +msgstr "Izgara YZ Düzlemi" #: editor/editor_settings.cpp -#, fuzzy msgid "Default FOV" -msgstr "Varsayılan" +msgstr "Varsayılan Görüş Alanı" #: editor/editor_settings.cpp -#, fuzzy msgid "Default Z Near" -msgstr "Varsayılan tema" +msgstr "Varsayılan Z Yakın" #: editor/editor_settings.cpp -#, fuzzy msgid "Default Z Far" -msgstr "Varsayılan" +msgstr "Varsayılan Z Uzak" #: editor/editor_settings.cpp msgid "Lightmap Baking Number Of CPU Threads" -msgstr "" +msgstr "Işık Haritası PiÅŸirme İş Parçacığı Sayısı" #: editor/editor_settings.cpp -#, fuzzy msgid "Navigation Scheme" -msgstr "Gezinim Kipi" +msgstr "Navigasyon Düzeni" #: editor/editor_settings.cpp -#, fuzzy msgid "Invert Y Axis" -msgstr "Y Eksenini Düzenle" +msgstr "Y Eksenini Çevir" #: editor/editor_settings.cpp -#, fuzzy msgid "Invert X Axis" -msgstr "X Eksenini Düzenle" +msgstr "X Eksenini Çevir" #: editor/editor_settings.cpp -#, fuzzy msgid "Zoom Style" -msgstr "UzaklaÅŸtır" +msgstr "Zoom Biçimi" #: editor/editor_settings.cpp msgid "Emulate Numpad" -msgstr "" +msgstr "Sayı TuÅŸlarını Emüle Et" #: editor/editor_settings.cpp msgid "Emulate 3 Button Mouse" -msgstr "" +msgstr "3 Butonlu Fareyi Emüle Et" #: editor/editor_settings.cpp -#, fuzzy msgid "Orbit Modifier" -msgstr "İlk DeÄŸiÅŸiklik Tarihi'ne göre sırala" +msgstr "Yörünge DeÄŸiÅŸtirici" #: editor/editor_settings.cpp -#, fuzzy msgid "Pan Modifier" -msgstr "Kaydırma Biçimi" +msgstr "Kaydırma DeÄŸiÅŸtirici" #: editor/editor_settings.cpp -#, fuzzy msgid "Zoom Modifier" -msgstr "DeÄŸiÅŸti" +msgstr "Zoom DeÄŸiÅŸtirici" #: editor/editor_settings.cpp editor/plugins/spatial_editor_plugin.cpp msgid "Warped Mouse Panning" -msgstr "" +msgstr "Çarpık Fare Kaydırması" #: editor/editor_settings.cpp -#, fuzzy msgid "Navigation Feel" -msgstr "Gezinim Kipi" +msgstr "Navigasyon Hissi" #: editor/editor_settings.cpp msgid "Orbit Sensitivity" @@ -6023,47 +5864,39 @@ msgstr "Yörünge Hassasiyeti" #: editor/editor_settings.cpp msgid "Orbit Inertia" -msgstr "" +msgstr "Yörünge Ataleti" #: editor/editor_settings.cpp -#, fuzzy msgid "Translation Inertia" -msgstr "Çeviriler" +msgstr "Öteleme Ataleti" #: editor/editor_settings.cpp -#, fuzzy msgid "Zoom Inertia" -msgstr "YaklaÅŸtır" +msgstr "Zoom Ataleti" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook" -msgstr "Yukarı Serbest Bakış" +msgstr "Serbest Bakış" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Navigation Scheme" -msgstr "Yönlendirici Örüntüsü OluÅŸtur" +msgstr "Serbest Bakış Navigasyon Düzeni" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Sensitivity" -msgstr "Sola Serbest Bakış" +msgstr "Serbest Bakış Hassasiyeti" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Inertia" -msgstr "Sola Serbest Bakış" +msgstr "Serbest Bakış Ataleti" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Base Speed" -msgstr "Serbest Bakış Hız DeÄŸiÅŸtirici" +msgstr "Serbest Bakış Baz Hızı" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Activation Modifier" -msgstr "Serbest Bakış Hız DeÄŸiÅŸtirici" +msgstr "Serbest Bakış Aktivasyon DeÄŸiÅŸtirici" #: editor/editor_settings.cpp #, fuzzy @@ -6071,72 +5904,64 @@ msgid "Freelook Speed Zoom Link" msgstr "Serbest Bakış Hız DeÄŸiÅŸtirici" #: editor/editor_settings.cpp editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Grid Color" -msgstr "Renk Seç" +msgstr "Izgara Rengi" #: editor/editor_settings.cpp -#, fuzzy msgid "Guides Color" -msgstr "Renk Seç" +msgstr "Kılavuz Çizgi Rengi" #: editor/editor_settings.cpp -#, fuzzy msgid "Smart Snapping Line Color" -msgstr "Akıllı Hizalama" +msgstr "Akıllı Yapışma Satır Rengi" #: editor/editor_settings.cpp msgid "Bone Width" -msgstr "" +msgstr "Kemik GeniÅŸliÄŸi" #: editor/editor_settings.cpp -#, fuzzy msgid "Bone Color 1" -msgstr "Renk Öğesini Yeniden Adlandır" +msgstr "Kemik Rengi 1" #: editor/editor_settings.cpp -#, fuzzy msgid "Bone Color 2" -msgstr "Renk Öğesini Yeniden Adlandır" +msgstr "Kemik Rengi 2" #: editor/editor_settings.cpp -#, fuzzy msgid "Bone Selected Color" -msgstr "Seçilen Profili Yapılandır:" +msgstr "SeçilmiÅŸ Kemik Rengi" #: editor/editor_settings.cpp msgid "Bone IK Color" -msgstr "" +msgstr "Kemik TK Rengi" #: editor/editor_settings.cpp msgid "Bone Outline Color" -msgstr "" +msgstr "Kemik Kontur Rengi" #: editor/editor_settings.cpp -#, fuzzy msgid "Bone Outline Size" -msgstr "Kontur Boyutu:" +msgstr "Kemik Kontur Boyutu" #: editor/editor_settings.cpp msgid "Viewport Border Color" -msgstr "" +msgstr "Çerçeve Sınır Rengi" #: editor/editor_settings.cpp msgid "Constrain Editor View" -msgstr "" +msgstr "Düzenleyici Görünümünü Kısıtla" #: editor/editor_settings.cpp msgid "Simple Panning" -msgstr "" +msgstr "Basit Kaydırma" #: editor/editor_settings.cpp msgid "Scroll To Pan" -msgstr "" +msgstr "Kaydırmak İçin Tut" #: editor/editor_settings.cpp -#, fuzzy msgid "Pan Speed" -msgstr "Hız:" +msgstr "Pan Yapma Hızı" #: editor/editor_settings.cpp editor/plugins/polygon_2d_editor_plugin.cpp #, fuzzy @@ -6145,109 +5970,103 @@ msgstr "Çokgen 2B UV Düzenleyicisi" #: editor/editor_settings.cpp msgid "Point Grab Radius" -msgstr "" +msgstr "Nokta Yakalama Yarıçapı" #: editor/editor_settings.cpp editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Show Previous Outline" -msgstr "Önceki sekme" +msgstr "Önceki Konturu Göster" #: editor/editor_settings.cpp editor/scene_tree_dock.cpp #, fuzzy msgid "Autorename Animation Tracks" -msgstr "Animasyonu Yeniden Adlandır" +msgstr "Animasyon İzlerini Otomatik Yeniden Adlandır" #: editor/editor_settings.cpp +#, fuzzy msgid "Default Create Bezier Tracks" -msgstr "" +msgstr "Varsayılan Bezier İz OluÅŸtur" #: editor/editor_settings.cpp #, fuzzy msgid "Default Create Reset Tracks" -msgstr "RESET İz(ler)i oluÅŸturun" +msgstr "Varsayılan İzleri Sıfırla ve OluÅŸtur" #: editor/editor_settings.cpp +#, fuzzy msgid "Onion Layers Past Color" -msgstr "" +msgstr "Eski SoÄŸan Katman Rengi" #: editor/editor_settings.cpp +#, fuzzy msgid "Onion Layers Future Color" -msgstr "" +msgstr "Yeni SoÄŸan Katmanı Rengi" #: editor/editor_settings.cpp #, fuzzy msgid "Visual Editors" -msgstr "Grup Düzenleyici" +msgstr "Görsel Editörler" #: editor/editor_settings.cpp msgid "Minimap Opacity" -msgstr "" +msgstr "Mini Harita Åžeffaflığı" #: editor/editor_settings.cpp msgid "Window Placement" -msgstr "" +msgstr "Pencere YerleÅŸimi" #: editor/editor_settings.cpp scene/2d/back_buffer_copy.cpp scene/2d/sprite.cpp #: scene/2d/visibility_notifier_2d.cpp scene/3d/sprite_3d.cpp #: scene/gui/control.cpp -#, fuzzy msgid "Rect" -msgstr "Tam Kare" +msgstr "Dikdörtgen" #: editor/editor_settings.cpp -#, fuzzy msgid "Rect Custom Position" -msgstr "EÄŸri Çıkış Konumunu Ayarla" +msgstr "Dikdörtgen Özel Konumu" #: editor/editor_settings.cpp platform/android/export/export_plugin.cpp msgid "Screen" -msgstr "" +msgstr "Ekran" #: editor/editor_settings.cpp -#, fuzzy msgid "Auto Save" -msgstr "Otomatik Dilimle" +msgstr "Otomatik Kaydet" #: editor/editor_settings.cpp -#, fuzzy msgid "Save Before Running" -msgstr "Çalıştırmadan önce sahneyi kaydedin..." +msgstr "Çalıştırmadan Önce Kaydet" #: editor/editor_settings.cpp -#, fuzzy msgid "Font Size" -msgstr "Önden Görünüm" +msgstr "Yazı Tipi Boyutu" #: editor/editor_settings.cpp #: modules/gdscript/language_server/gdscript_language_server.cpp -#, fuzzy msgid "Remote Host" msgstr "Uzak Ana Bilgisayar" #: editor/editor_settings.cpp #: modules/gdscript/language_server/gdscript_language_server.cpp -#, fuzzy msgid "Remote Port" -msgstr "Noktayı kaldır" +msgstr "Uzak Port" #: editor/editor_settings.cpp -#, fuzzy msgid "Editor SSL Certificates" -msgstr "Düzenleyici Ayarları" +msgstr "Düzenleyicinin SSL Sertifikası" #: editor/editor_settings.cpp msgid "HTTP Proxy" -msgstr "" +msgstr "HTTP Proxy" #: editor/editor_settings.cpp msgid "Host" -msgstr "" +msgstr "Ana Bilgisayar" #: editor/editor_settings.cpp editor/fileserver/editor_file_server.cpp #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Port" -msgstr "" +msgstr "Port" #. TRANSLATORS: Project Manager here refers to the tool used to create/manage Godot projects. #: editor/editor_settings.cpp @@ -6256,171 +6075,150 @@ msgstr "Proje Yöneticisi" #. TRANSLATORS: Project Manager here refers to the tool used to create/manage Godot projects. #: editor/editor_settings.cpp -#, fuzzy msgid "Sorting Order" -msgstr "Klasör yeniden adlandırma:" +msgstr "Sıralama Yöntemi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Symbol Color" -msgstr "" +msgstr "Simge Rengi" #: editor/editor_settings.cpp msgid "Keyword Color" -msgstr "" +msgstr "Anahtar Sözcük Rengi" #: editor/editor_settings.cpp msgid "Control Flow Keyword Color" -msgstr "" +msgstr "Akış Kontrolü Anahtar Sözcüğü Rengi" #: editor/editor_settings.cpp -#, fuzzy msgid "Base Type Color" -msgstr "Temel Tipi DeÄŸiÅŸtir" +msgstr "Temel Tür Rengi" #: editor/editor_settings.cpp msgid "Engine Type Color" -msgstr "" +msgstr "Motor Tür Rengi" #: editor/editor_settings.cpp msgid "User Type Color" -msgstr "" +msgstr "Üye Tür Rengi" #: editor/editor_settings.cpp msgid "Comment Color" -msgstr "" +msgstr "Yorum Rengi" #: editor/editor_settings.cpp -#, fuzzy msgid "String Color" -msgstr "Dosya Depolama:" +msgstr "String Rengi" #: editor/editor_settings.cpp platform/javascript/export/export.cpp #: platform/uwp/export/export.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Background Color" -msgstr "Geçersiz arkaplan rengi." +msgstr "Arkaplan Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Completion Background Color" -msgstr "Geçersiz arkaplan rengi." +msgstr "Tamamlanma Arkaplan Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Completion Selected Color" -msgstr "Seçileni İçe Aktar" +msgstr "Tamamlayıcı Seçim Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Existing Color" -msgstr "" +msgstr "Tamamlayıcı Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Scroll Color" -msgstr "" +msgstr "Tamamlayıcı Kaydırma ÇubuÄŸu Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Font Color" -msgstr "" +msgstr "Tamamlayıcı Yazı Tipi Rengi" #: editor/editor_settings.cpp -#, fuzzy msgid "Text Color" -msgstr "Sonraki Zemin" +msgstr "Metin Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Line Number Color" -msgstr "Satır Numarası:" +msgstr "Satır Numarası Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Safe Line Number Color" -msgstr "Satır Numarası:" +msgstr "Güvenli Satır Numarası Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Caret Color" -msgstr "" +msgstr "İmleç Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Caret Background Color" -msgstr "Geçersiz arkaplan rengi." +msgstr "Karet Arkaplan Rengi" #: editor/editor_settings.cpp -#, fuzzy msgid "Text Selected Color" -msgstr "Seçilenleri Sil" +msgstr "Seçili Metin Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Selection Color" -msgstr "Yalnızca Seçim" +msgstr "Seçim Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Brace Mismatch Color" -msgstr "" +msgstr "Ayraç Uyumsuz Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Current Line Color" -msgstr "Åžu anki Sahne" +msgstr "Geçerli Satır Rengi" #: editor/editor_settings.cpp msgid "Line Length Guideline Color" -msgstr "" +msgstr "Satır UzunluÄŸu Sınır Çizgisi Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Word Highlighted Color" -msgstr "Yazım Vurgulama" +msgstr "Vurgulu Kelime Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Number Color" -msgstr "" +msgstr "Sayı Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Function Color" -msgstr "Fonksiyon" +msgstr "Fonksiyon Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Member Variable Color" -msgstr "DeÄŸiÅŸkeni Yeniden Adlandır" +msgstr "Üye DeÄŸiÅŸken Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Mark Color" -msgstr "Renk Seç" +msgstr "İşaret Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Bookmark Color" -msgstr "Yer imleri" +msgstr "Yer İmi Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Breakpoint Color" -msgstr "Hata ayıklama noktaları" +msgstr "Kesme Noktası Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Executing Line Color" -msgstr "" +msgstr "Yürütülen Satır Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Code Folding Color" -msgstr "" +msgstr "Kod Katlama Rengi" #: editor/editor_settings.cpp -#, fuzzy msgid "Search Result Color" -msgstr "Arama Sonuçları" +msgstr "Arama Sonuç Rengi" #: editor/editor_settings.cpp -#, fuzzy msgid "Search Result Border Color" -msgstr "Arama Sonuçları" +msgstr "Arama Sonuç Sınır Rengi" #: editor/editor_spin_slider.cpp msgid "Hold %s to round to integers. Hold Shift for more precise changes." @@ -6429,14 +6227,12 @@ msgstr "" "Shift tuÅŸuna basılı tutun." #: editor/editor_spin_slider.cpp scene/gui/button.cpp -#, fuzzy msgid "Flat" -msgstr "Sade 0" +msgstr "Düz" #: editor/editor_spin_slider.cpp -#, fuzzy msgid "Hide Slider" -msgstr "Temas Kipi" +msgstr "Kaydırıcıyı Gizle" #: editor/editor_sub_scene.cpp msgid "Select Node(s) to Import" @@ -6729,7 +6525,7 @@ msgstr "" #: editor/fileserver/editor_file_server.cpp msgid "File Server" -msgstr "" +msgstr "Dosya Sunucusu" #: editor/fileserver/editor_file_server.cpp #: editor/plugins/version_control_editor_plugin.cpp @@ -6797,6 +6593,11 @@ msgid "" "After renaming to an unknown extension, the file won't be shown in the " "editor anymore." msgstr "" +"Bu dosya uzantısı editör tarafından tanınmadı.\n" +"Yine de isimlendirmek istiyorsanız, iÅŸletim sisteminizin dosya yöneticisini " +"kullanın.\n" +"Bilinmeyen bir uzantı isimlendirildikten sonra dosya artık editörde " +"görüntülenmeyecek." #: editor/filesystem_dock.cpp msgid "" @@ -7097,43 +6898,41 @@ msgstr "Grupları Düzenle" #: editor/import/editor_import_collada.cpp msgid "Collada" -msgstr "" +msgstr "Collada" #: editor/import/editor_import_collada.cpp msgid "Use Ambient" -msgstr "" +msgstr "Çevreyi Kullan" #: editor/import/resource_importer_bitmask.cpp -#, fuzzy msgid "Create From" -msgstr "Klasör OluÅŸtur" +msgstr "Åžuradan OluÅŸtur" #: editor/import/resource_importer_bitmask.cpp #: servers/audio/effects/audio_effect_compressor.cpp msgid "Threshold" -msgstr "" +msgstr "EÅŸik" #: editor/import/resource_importer_csv_translation.cpp #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_scene.cpp #: editor/import/resource_importer_texture.cpp #: editor/import/resource_importer_wav.cpp scene/3d/gi_probe.cpp -#, fuzzy msgid "Compress" -msgstr "BileÅŸenler" +msgstr "Sıkıştırma" #: editor/import/resource_importer_csv_translation.cpp msgid "Delimiter" -msgstr "" +msgstr "Sınırlayıcı" #: editor/import/resource_importer_layered_texture.cpp -#, fuzzy msgid "ColorCorrect" -msgstr "Renk iÅŸlevi." +msgstr "ColorCorrect" #: editor/import/resource_importer_layered_texture.cpp +#, fuzzy msgid "No BPTC If RGB" -msgstr "" +msgstr "RGB ise BPTC Yok" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp scene/2d/cpu_particles_2d.cpp @@ -7141,31 +6940,29 @@ msgstr "" #: scene/resources/material.cpp scene/resources/particles_material.cpp #: scene/resources/texture.cpp scene/resources/visual_shader.cpp msgid "Flags" -msgstr "" +msgstr "Bayraklar" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp scene/animation/tween.cpp #: scene/resources/texture.cpp msgid "Repeat" -msgstr "" +msgstr "Tekrar Et" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp scene/2d/light_2d.cpp #: scene/gui/control.cpp -#, fuzzy msgid "Filter" -msgstr "Süzgeçler:" +msgstr "Filtre" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Mipmaps" -msgstr "sinyaller" +msgstr "Mipmap'ler" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp msgid "Anisotropic" -msgstr "" +msgstr "EÅŸyönsüz" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp @@ -7173,51 +6970,43 @@ msgid "sRGB" msgstr "sRGB" #: editor/import/resource_importer_layered_texture.cpp -#, fuzzy msgid "Slices" -msgstr "Otomatik Dilimle" +msgstr "Dilimler" #: editor/import/resource_importer_layered_texture.cpp #: scene/gui/aspect_ratio_container.cpp scene/gui/control.cpp #: scene/gui/nine_patch_rect.cpp scene/gui/scroll_container.cpp #: scene/resources/style_box.cpp -#, fuzzy msgid "Horizontal" -msgstr "Yatay:" +msgstr "Yatay" #: editor/import/resource_importer_layered_texture.cpp #: scene/gui/aspect_ratio_container.cpp scene/gui/control.cpp #: scene/gui/nine_patch_rect.cpp scene/gui/scroll_container.cpp #: scene/resources/style_box.cpp -#, fuzzy msgid "Vertical" -msgstr "Dikey:" +msgstr "Dikey" #: editor/import/resource_importer_obj.cpp -#, fuzzy msgid "Generate Tangents" -msgstr "Noktalar OluÅŸtur" +msgstr "TeÄŸetler OluÅŸtur" #: editor/import/resource_importer_obj.cpp -#, fuzzy msgid "Scale Mesh" -msgstr "Esnetme Åžekli" +msgstr "Mesh ÖlçeÄŸi" #: editor/import/resource_importer_obj.cpp -#, fuzzy msgid "Offset Mesh" -msgstr "Kaydırma:" +msgstr "Mesh Kaydırma" #: editor/import/resource_importer_obj.cpp #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Octahedral Compression" -msgstr "İfade" +msgstr "Octahedral Sıkıştırma" #: editor/import/resource_importer_obj.cpp -#, fuzzy msgid "Optimize Mesh Flags" -msgstr "Boyut:" +msgstr "Örüntü Bayraklarını En İyileÅŸtir" #: editor/import/resource_importer_scene.cpp msgid "Import as Single Scene" @@ -7261,53 +7050,44 @@ msgstr "Çoklu Sahneler+Materyaller olarak İçe Aktar" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Nodes" -msgstr "Düğüm" +msgstr "Düğümler" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Root Type" -msgstr "Dön" +msgstr "Kök Türü" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Root Name" -msgstr "Uzak Depo Adı" +msgstr "Kök İsmi" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Root Scale" -msgstr "Ölçekle" +msgstr "Kök ÖlçeÄŸi" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Custom Script" -msgstr "ÖzelSınıf" +msgstr "Özel Betik" #: editor/import/resource_importer_scene.cpp scene/resources/texture.cpp -#, fuzzy msgid "Storage" -msgstr "Dosya Depolama:" +msgstr "Depolama" #: editor/import/resource_importer_scene.cpp msgid "Use Legacy Names" -msgstr "" +msgstr "Eski İsimleri Kullan" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp -#, fuzzy msgid "Materials" -msgstr "Materyal DeÄŸiÅŸiklikleri:" +msgstr "Materyaller" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Keep On Reimport" -msgstr "Yeniden İçe Aktar" +msgstr "Yeniden İçe Aktarmaya Devam Et" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp -#, fuzzy msgid "Meshes" -msgstr "Örgü" +msgstr "Örgüler" #: editor/import/resource_importer_scene.cpp #, fuzzy @@ -7320,42 +7100,36 @@ msgid "Light Baking" msgstr "Işık-Haritalarını PiÅŸir" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Lightmap Texel Size" -msgstr "Işık-Haritalarını PiÅŸir" +msgstr "Işık Haritası Texel Boyutu" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp msgid "Skins" -msgstr "" +msgstr "Kaplamalar" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Use Named Skins" -msgstr "Esnetme Hizalaması Kullan" +msgstr "İsimlendirilmiÅŸ Kaplamaları Kullan" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "External Files" -msgstr "Bir Dosya Aç" +msgstr "Harici Dosyalar" #: editor/import/resource_importer_scene.cpp msgid "Store In Subdir" -msgstr "" +msgstr "Alt Dizine Depola" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Filter Script" -msgstr "Betikleri Süz" +msgstr "Betik Süz" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Keep Custom Tracks" -msgstr "Dönüşüm" +msgstr "Özel İzleri Tut" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Optimizer" -msgstr "İyileÅŸtir" +msgstr "En İyileÅŸtirici" #: editor/import/resource_importer_scene.cpp #: editor/plugins/item_list_editor_plugin.cpp main/main.cpp @@ -7374,36 +7148,30 @@ msgid "Enabled" msgstr "Etkin" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Max Linear Error" -msgstr "Maks. DoÄŸrusal Hata:" +msgstr "Maksimum DoÄŸrusal Hata" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Max Angular Error" -msgstr "Maks. Açısal Hata:" +msgstr "Maksimum Açısal Hata" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Max Angle" -msgstr "DeÄŸer" +msgstr "Maksimum Açı" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Remove Unused Tracks" -msgstr "Animasyon İzini Kaldır" +msgstr "Kullanılmayan İzleri Kaldır" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Clips" -msgstr "Animasyon Klipleri" +msgstr "Klipler" #: editor/import/resource_importer_scene.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/particles_2d.cpp scene/3d/area.cpp scene/3d/cpu_particles.cpp #: scene/3d/particles.cpp scene/resources/environment.cpp -#, fuzzy msgid "Amount" -msgstr "DeÄŸer:" +msgstr "Miktar" #: editor/import/resource_importer_scene.cpp #: editor/plugins/mesh_library_editor_plugin.cpp @@ -7456,28 +7224,30 @@ msgid "" msgstr "" #: editor/import/resource_importer_texture.cpp +#, fuzzy msgid "" "%s: Texture detected as used in 3D. Enabling filter, repeat, mipmap " "generation and VRAM texture compression." msgstr "" +"%s: Dokunun 3B olarak kullanıldığı tespit edildi. Filtreleme, tekrarlama, " +"mipmap oluÅŸturma ve VRAM doku sıkıştırma etkileÅŸtiriliyor." #: editor/import/resource_importer_texture.cpp msgid "2D, Detect 3D" -msgstr "" +msgstr "2D, 3D Algıla" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "2D Pixel" -msgstr "Åžekil Pikselleri" +msgstr "2D Pixel" #: editor/import/resource_importer_texture.cpp scene/resources/texture.cpp +#, fuzzy msgid "Lossy Quality" -msgstr "" +msgstr "Kayıplı Kalite" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "HDR Mode" -msgstr "Kip Seç" +msgstr "HDR Modu" #: editor/import/resource_importer_texture.cpp msgid "BPTC LDR" @@ -7487,8 +7257,9 @@ msgstr "" #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/mesh_instance_2d.cpp scene/2d/multimesh_instance_2d.cpp #: scene/2d/particles_2d.cpp scene/2d/sprite.cpp scene/resources/style_box.cpp +#, fuzzy msgid "Normal Map" -msgstr "" +msgstr "Normal Haritası" #: editor/import/resource_importer_texture.cpp #, fuzzy @@ -7496,27 +7267,28 @@ msgid "Process" msgstr "RötuÅŸ" #: editor/import/resource_importer_texture.cpp +#, fuzzy msgid "Fix Alpha Border" -msgstr "" +msgstr "Alfa Sınırını Düzelt" #: editor/import/resource_importer_texture.cpp #, fuzzy msgid "Premult Alpha" -msgstr "Çokluyu Düzenleyin" +msgstr "İlk Alfa" #: editor/import/resource_importer_texture.cpp +#, fuzzy msgid "Hdr As Srgb" -msgstr "" +msgstr "SRGB Olarak HDR" #: editor/import/resource_importer_texture.cpp #, fuzzy msgid "Invert Color" -msgstr "Köşe" +msgstr "Rengi Ters Çevir" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Normal Map Invert Y" -msgstr "Rastgele Ölçek:" +msgstr "Normal Haritası Y Eksenini Ters Çevir" #: editor/import/resource_importer_texture.cpp #, fuzzy @@ -7524,89 +7296,89 @@ msgid "Size Limit" msgstr "Boyut Limiti" #: editor/import/resource_importer_texture.cpp +#, fuzzy msgid "Detect 3D" -msgstr "" +msgstr "3D Algıla" #: editor/import/resource_importer_texture.cpp #, fuzzy msgid "SVG" -msgstr "HSV" +msgstr "SVG" #: editor/import/resource_importer_texture.cpp +#, fuzzy msgid "" "Warning, no suitable PC VRAM compression enabled in Project Settings. This " "texture will not display correctly on PC." msgstr "" +"Uyarı, proje ayarlarında uygun PC VRAM sıkıştırması etkin deÄŸil. Bu doku " +"PC'de düzgün görüntülenmez." #: editor/import/resource_importer_texture_atlas.cpp -#, fuzzy msgid "Atlas File" -msgstr "Kontur Boyutu:" +msgstr "Atlas Dosyası" #: editor/import/resource_importer_texture_atlas.cpp -#, fuzzy msgid "Import Mode" -msgstr "Dışa Aktarma Biçimi:" +msgstr "İçe Aktarım Modu" #: editor/import/resource_importer_texture_atlas.cpp #, fuzzy msgid "Crop To Region" -msgstr "Döşeme Bölgesi Ata" +msgstr "Bölgeye Kırp" #: editor/import/resource_importer_texture_atlas.cpp msgid "Trim Alpha Border From Region" -msgstr "" +msgstr "Alfa Sınırını Bölgeden Kırp" #: editor/import/resource_importer_wav.cpp scene/2d/physics_body_2d.cpp #, fuzzy msgid "Force" -msgstr "Zorla Gönder" +msgstr "Zorla" #: editor/import/resource_importer_wav.cpp msgid "8 Bit" -msgstr "" +msgstr "8 Bit" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp +#, fuzzy msgid "Mono" -msgstr "" +msgstr "Tek" #: editor/import/resource_importer_wav.cpp #, fuzzy msgid "Max Rate" -msgstr "Düğümü Çırp" +msgstr "Maximum Oran" #: editor/import/resource_importer_wav.cpp #, fuzzy msgid "Max Rate Hz" -msgstr "Düğümü Çırp" +msgstr "Maximum Hz Oranı" #: editor/import/resource_importer_wav.cpp msgid "Trim" msgstr "" #: editor/import/resource_importer_wav.cpp -#, fuzzy msgid "Normalize" -msgstr "Biçem" +msgstr "NormalleÅŸtir" #: editor/import/resource_importer_wav.cpp #: scene/resources/audio_stream_sample.cpp -#, fuzzy msgid "Loop Mode" -msgstr "Biçimi Taşı" +msgstr "Döngü Modu" #: editor/import/resource_importer_wav.cpp #: scene/resources/audio_stream_sample.cpp -#, fuzzy msgid "Loop Begin" -msgstr "Biçimi Taşı" +msgstr "Döngü BaÅŸlangıcı" #: editor/import/resource_importer_wav.cpp #: scene/resources/audio_stream_sample.cpp -#, fuzzy msgid "Loop End" -msgstr "Biçimi Taşı" +msgstr "Döngü Sonu" #: editor/import_defaults_editor.cpp msgid "Select Importer" @@ -7686,27 +7458,24 @@ msgid "Failed to load resource." msgstr "Kaynak yükleme baÅŸarısız oldu." #: editor/inspector_dock.cpp -#, fuzzy msgid "Property Name Style" -msgstr "Proje Adı:" +msgstr "Özellik İsim Biçimi" #: editor/inspector_dock.cpp scene/gui/color_picker.cpp msgid "Raw" msgstr "Ham" #: editor/inspector_dock.cpp -#, fuzzy msgid "Capitalized" -msgstr "Büyük harfe çevirme" +msgstr "Büyük Harfe ÇevrilmiÅŸ" #: editor/inspector_dock.cpp -#, fuzzy msgid "Localized" -msgstr "Yerel" +msgstr "YerelleÅŸtirilmiÅŸ" #: editor/inspector_dock.cpp msgid "Localization not available for current language." -msgstr "" +msgstr "Geçerli dil için yerelleÅŸtirme mevcut deÄŸil." #: editor/inspector_dock.cpp msgid "Copy Properties" @@ -8247,9 +8016,8 @@ msgid "New" msgstr "Yeni" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Paste As Reference" -msgstr "%s Class referansı" +msgstr "Referans. Olarak Yapıştır" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Edit Transitions..." @@ -8581,7 +8349,7 @@ msgstr "Süzgeçler..." #: editor/plugins/asset_library_editor_plugin.cpp scene/main/http_request.cpp msgid "Use Threads" -msgstr "" +msgstr "Thread'leri Kullan" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Contents:" @@ -8708,9 +8476,8 @@ msgid "Download Error" msgstr "İndirme Hatası" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Available URLs" -msgstr "Kullanılabilir Profiller:" +msgstr "Uygun URL'ler" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" @@ -8745,25 +8512,21 @@ msgid "Loading..." msgstr "Yükle..." #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgctxt "Pagination" msgid "First" msgstr "İlk" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgctxt "Pagination" msgid "Previous" msgstr "Önceki" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgctxt "Pagination" msgid "Next" msgstr "Sonraki" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgctxt "Pagination" msgid "Last" msgstr "Son" @@ -8813,8 +8576,9 @@ msgid "Testing" msgstr "Deneme" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy msgid "Failed to get repository configuration." -msgstr "" +msgstr "Depo yapılandırması alınamadı." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Assets ZIP File" @@ -8871,8 +8635,9 @@ msgid "Bake Lightmaps" msgstr "Işık-Haritalarını PiÅŸir" #: editor/plugins/baked_lightmap_editor_plugin.cpp +#, fuzzy msgid "LightMap Bake" -msgstr "" +msgstr "Işık Haritasını PiÅŸir" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Select lightmap bake file:" @@ -9378,23 +9143,21 @@ msgid "View" msgstr "Görüş" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show" -msgstr "Izgarayı Göster" +msgstr "Göster" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show When Snapping" -msgstr "Akıllı Hizalama" +msgstr "Yapışırken Göster" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Hide" -msgstr "" +msgstr "Gizle" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy msgid "Toggle Grid" -msgstr "Aç / Kapat Biçimi" +msgstr "Izgarayı Aç/Kapat" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp @@ -9745,16 +9508,15 @@ msgstr "Renk GeçiÅŸi Düzenlendi" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp msgid "Swap GradientTexture2D Fill Points" -msgstr "" +msgstr "GradientTexture2D Dolgu Noktalarını DeÄŸiÅŸtir" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp msgid "Swap Gradient Fill Points" -msgstr "" +msgstr "Gradient Doldurma Noktalarını DeÄŸiÅŸtir" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp -#, fuzzy msgid "Toggle Grid Snap" -msgstr "Aç / Kapat Biçimi" +msgstr "Snap Aç/Kapat" #: editor/plugins/item_list_editor_plugin.cpp editor/project_export.cpp #: scene/3d/label_3d.cpp scene/gui/button.cpp scene/gui/dialogs.cpp @@ -9777,9 +9539,8 @@ msgstr "" #: editor/plugins/item_list_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Separator" -msgstr "Ayrım:" +msgstr "Ayraç" #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" @@ -10013,9 +9774,8 @@ msgstr "" "%s" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "MeshLibrary" -msgstr "Model Kütüphanesi" +msgstr "" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Add Item" @@ -10038,14 +9798,12 @@ msgid "Update from Scene" msgstr "Sahneden Güncelle" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Apply without Transforms" -msgstr "MeshInstance dönüşümlerini uygula" +msgstr "Dönüşümler olmadan uygula" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Apply with Transforms" -msgstr "MeshInstance dönüşümlerini uygula" +msgstr "Dönüşümlerle uygula" #: editor/plugins/multimesh_editor_plugin.cpp msgid "No mesh source specified (and no MultiMesh set in node)." @@ -10211,9 +9969,8 @@ msgid "Volume" msgstr "Oylum" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Emission Source:" -msgstr "Emisyon Kaynağı:" +msgstr "Emission Kaynağı:" #: editor/plugins/particles_editor_plugin.cpp msgid "A processor material of type 'ParticlesMaterial' is required." @@ -10569,7 +10326,7 @@ msgstr "Kemikleri Çokgene EÅŸleÅŸtir" #: editor/plugins/ray_cast_2d_editor_plugin.cpp msgid "Set cast_to" -msgstr "" +msgstr "cast_to ayarla" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "ERROR: Couldn't load resource!" @@ -10899,12 +10656,13 @@ msgid "Search Results" msgstr "Arama Sonuçları" #: editor/plugins/script_editor_plugin.cpp +#, fuzzy msgid "Open Dominant Script On Scene Change" -msgstr "" +msgstr "Sahne DeÄŸiÅŸiminde Baskın BetiÄŸi Aç" #: editor/plugins/script_editor_plugin.cpp msgid "External" -msgstr "" +msgstr "Harici" #: editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -10922,17 +10680,17 @@ msgid "Script Temperature Enabled" msgstr "Åžablon Dosyası Seç" #: editor/plugins/script_editor_plugin.cpp +#, fuzzy msgid "Highlight Current Script" -msgstr "" +msgstr "Geçerli BetiÄŸi Vurgula" #: editor/plugins/script_editor_plugin.cpp msgid "Script Temperature History Size" msgstr "" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Current Script Background Color" -msgstr "Geçersiz arkaplan rengi." +msgstr "Mevcut Komut Dizisi Arkaplan Rengi" #: editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -10945,9 +10703,8 @@ msgid "Sort Scripts By" msgstr "Betik OluÅŸtur" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "List Script Names As" -msgstr "Betik Adı:" +msgstr "Script İsimlerini Listele" #: editor/plugins/script_editor_plugin.cpp msgid "Exec Flags" @@ -11210,7 +10967,7 @@ msgstr "Oynat IK" #: editor/plugins/spatial_editor_plugin.cpp msgid "Orthogonal" -msgstr "Dikey" +msgstr "Dik Açılı" #: editor/plugins/spatial_editor_plugin.cpp modules/gltf/gltf_camera.cpp msgid "Perspective" @@ -11764,12 +11521,14 @@ msgid "Post" msgstr "Sonrası" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Manipulator Gizmo Size" -msgstr "" +msgstr "Gizmo Boyutu Ayarlayıcı" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Manipulator Gizmo Opacity" -msgstr "" +msgstr "Gizmo Åžeffaflığı Ayarlayıcı" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -11932,9 +11691,8 @@ msgid "New Animation" msgstr "Yeni Animasyon" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Filter animations" -msgstr "Metotları filtrele" +msgstr "Animasyonları filtrele" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed:" @@ -12416,7 +12174,7 @@ msgstr "Tür Ekle" #: editor/plugins/theme_editor_plugin.cpp msgid "Filter the list of types or create a new custom type:" -msgstr "Tip listesini süz veya yeni bir özel tip oluÅŸtur." +msgstr "Tip listesini filtrele veya yeni bir özel tip oluÅŸtur:" #: editor/plugins/theme_editor_plugin.cpp msgid "Available Node-based types:" @@ -12485,14 +12243,18 @@ msgid "Override all default type items." msgstr "Tüm varsayılan tür öğelerini geçersiz kıl." #: editor/plugins/theme_editor_plugin.cpp +#, fuzzy msgid "Select the variation base type from a list of available types." -msgstr "" +msgstr "Kullanılabilir tipler listesinden temel varyasyon tipini seçin." #: editor/plugins/theme_editor_plugin.cpp +#, fuzzy msgid "" "A type associated with a built-in class cannot be marked as a variation of " "another type." msgstr "" +"YerleÅŸik sınıfla iliÅŸkili bir tür baÅŸka bir türün varyasyonu olarak " +"belirlenemez." #: editor/plugins/theme_editor_plugin.cpp msgid "Theme:" @@ -12738,7 +12500,7 @@ msgstr "TileMap'i Boya" #: editor/plugins/tile_map_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Palette Min Width" -msgstr "" +msgstr "Palet Minimum GeniÅŸliÄŸi" #: editor/plugins/tile_map_editor_plugin.cpp #, fuzzy @@ -13132,9 +12894,8 @@ msgstr "Hizalama Ayarları" #: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp #: scene/main/canvas_layer.cpp scene/resources/material.cpp #: scene/resources/particles_material.cpp scene/resources/style_box.cpp -#, fuzzy msgid "Offset" -msgstr "Kaydırma:" +msgstr "Kaydırma" #: editor/plugins/tile_set_editor_plugin.cpp editor/rename_dialog.cpp #: scene/gui/range.cpp scene/resources/animation.cpp @@ -13145,9 +12906,8 @@ msgstr "Adım" #: editor/plugins/tile_set_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Separation" -msgstr "Ayrım:" +msgstr "Ayrım" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -13168,14 +12928,13 @@ msgstr "Yazı" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy msgid "Tex Offset" -msgstr "Izgarayı Kaydır:" +msgstr "Izgarayı Kaydır" #: editor/plugins/tile_set_editor_plugin.cpp modules/csg/csg_shape.cpp #: scene/2d/canvas_item.cpp scene/2d/particles_2d.cpp #: scene/3d/mesh_instance.cpp scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Material" -msgstr "Materyal DeÄŸiÅŸiklikleri:" +msgstr "Materyal" #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/canvas_item.cpp #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/style_box.cpp @@ -13194,9 +12953,8 @@ msgid "Autotile Bitmask Mode" msgstr "Bitmask Kipi" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Subtile Size" -msgstr "Kontur Boyutu:" +msgstr "Alt Döşeme Boyutu" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -13214,9 +12972,8 @@ msgid "Navigation Offset" msgstr "Gezinim Kipi" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Shape Offset" -msgstr "Kaydırma:" +msgstr "Åžekil Kaydırması" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -14332,11 +14089,14 @@ msgstr "KoÅŸturulabilir" #: editor/project_export.cpp msgid "Export the project for all the presets defined." -msgstr "" +msgstr "Tanımlanan tüm ön ayarlar için projeyi dışa aktarın." #: editor/project_export.cpp +#, fuzzy msgid "All presets must have an export path defined for Export All to work." msgstr "" +"Bütün ön ayarlar Hepsini Dışa Aktar iÅŸlemi için bir dışa aktarım dizinine " +"sahip olmalıdır." #: editor/project_export.cpp msgid "Delete preset '%s'?" @@ -14446,10 +14206,13 @@ msgid "GDScript Encryption Key (256-bits as hexadecimal):" msgstr "GDScript Åžifreleme Anahtarı (On altılı sayı sisteminde 256-bit):" #: editor/project_export.cpp +#, fuzzy msgid "" "Note: Encryption key needs to be stored in the binary,\n" "you need to build the export templates from source." msgstr "" +"Not: Åžifreleme anahtarının iki sayı sistemi olarak saklanması gerekir,\n" +"kaynaktan dışa aktarım ÅŸablonlarınızı derlemelisiniz." #: editor/project_export.cpp #, fuzzy @@ -14457,28 +14220,24 @@ msgid "More Info..." msgstr "Åžuraya Taşı..." #: editor/project_export.cpp -#, fuzzy msgid "Export PCK/Zip..." -msgstr "PCK/Zip Dışa Aktar" +msgstr "PCK/Zip Dışa Aktar..." #: editor/project_export.cpp -#, fuzzy msgid "Export Project..." -msgstr "Projeyi Dışa Aktar" +msgstr "Projeyi Dışa Aktar..." #: editor/project_export.cpp msgid "Export All" msgstr "Tümünü Dışa Aktar" #: editor/project_export.cpp -#, fuzzy msgid "Choose an export mode:" -msgstr "Lütfen boÅŸ bir klasör seçin." +msgstr "Bir dışa aktarım modu seç:" #: editor/project_export.cpp -#, fuzzy msgid "Export All..." -msgstr "Tümünü Dışa Aktar" +msgstr "Tümünü Dışa Aktar..." #: editor/project_export.cpp editor/project_manager.cpp msgid "ZIP File" @@ -15600,19 +15359,20 @@ msgstr "" msgid "Make Local" msgstr "YerelleÅŸtir" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Enable Scene Unique Name(s)" +msgstr "Sahne Benzersiz İsmini Etkin Kıl" #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" -msgstr "Düğüm adı:" +msgid "Unique names already used by another node in the scene:" +msgstr "BaÅŸka bir düğüm sahnede bu benzersiz adı zaten kullanıyor." -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" -msgstr "Düğüm adı:" +msgid "Disable Scene Unique Name(s)" +msgstr "Sahne Benzersiz İsmini Etkisiz Kıl" #: editor/scene_tree_dock.cpp msgid "New Scene Root" @@ -15790,8 +15550,9 @@ msgid "Show Scene Tree Root Selection" msgstr "Merkez Seçimi" #: editor/scene_tree_dock.cpp +#, fuzzy msgid "Derive Script Globals By Name" -msgstr "" +msgstr "Ada Göre Betik Globallerini Türet" #: editor/scene_tree_dock.cpp #, fuzzy @@ -15811,6 +15572,10 @@ msgid "Button Group" msgstr "Düğme Grubu" #: editor/scene_tree_editor.cpp +msgid "Disable Scene Unique Name" +msgstr "Sahne Benzersiz İsmini Etkisiz Kıl" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Gelen BaÄŸlantı)" @@ -15819,11 +15584,15 @@ msgid "Node configuration warning:" msgstr "Düğüm yapılandırma uyarısı:" #: editor/scene_tree_editor.cpp +#, fuzzy msgid "" "This node can be accessed from within anywhere in the scene by preceding it " "with the '%s' prefix in a node path.\n" "Click to disable this." msgstr "" +"Bu düğüme, bir düğüm adresinde önüne '%s' ön eki koyarak sahnenin herhangi " +"bir yerinden eriÅŸilebilir.\n" +"Bunu devre dışı bırakmak için tıklayın." #: editor/scene_tree_editor.cpp msgid "" @@ -15886,6 +15655,11 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "Geçersiz düğüm adı, aÅŸağıdaki karakterlere izin verilmiyor:" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Another node already uses this unique name in the scene." +msgstr "BaÅŸka bir düğüm sahnede bu benzersiz adı zaten kullanıyor." + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Düğümü Yeniden Adlandır" @@ -16115,16 +15889,19 @@ msgid "Filter stack variables" msgstr "Döşemelerde Bul" #: editor/script_editor_debugger.cpp +#, fuzzy msgid "Auto Switch To Remote Scene Tree" -msgstr "" +msgstr "Uzak Sahne AÄŸacına Otomatik GeçiÅŸ" #: editor/script_editor_debugger.cpp +#, fuzzy msgid "Remote Scene Tree Refresh Interval" -msgstr "" +msgstr "Uzak Sahne AÄŸacı Yenileme Sıklığı" #: editor/script_editor_debugger.cpp +#, fuzzy msgid "Remote Inspect Refresh Interval" -msgstr "" +msgstr "Uzaktan İnceleme Yenileme Aralığı" #: editor/script_editor_debugger.cpp msgid "Network Profiler" @@ -16232,7 +16009,7 @@ msgstr "AudioStreamPlayer3D Emisyon Açısı DeÄŸiÅŸimi" #: platform/osx/export/export.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Camera" -msgstr "" +msgstr "Kamera" #: editor/spatial_editor_gizmos.cpp msgid "Change Camera FOV" @@ -16243,8 +16020,9 @@ msgid "Change Camera Size" msgstr "Kamera Boyutunu DeÄŸiÅŸtir" #: editor/spatial_editor_gizmos.cpp +#, fuzzy msgid "Visibility Notifier" -msgstr "" +msgstr "Görünürlük Bildiricisi" #: editor/spatial_editor_gizmos.cpp msgid "Change Notifier AABB" @@ -16374,8 +16152,9 @@ msgid "Occluder" msgstr "Örtü Kipi" #: editor/spatial_editor_gizmos.cpp +#, fuzzy msgid "Set Occluder Sphere Radius" -msgstr "Engelleyici Silindir Yarıçapını Ayarla" +msgstr "Engelleyici Küre Yarıçapını Ayarla" #: editor/spatial_editor_gizmos.cpp msgid "Set Occluder Sphere Position" @@ -16407,8 +16186,9 @@ msgid "Occluder Hole" msgstr "Engelleyici Çokgeni OluÅŸtur" #: main/main.cpp +#, fuzzy msgid "Godot Physics" -msgstr "" +msgstr "Godot FiziÄŸi" #: main/main.cpp servers/physics_2d/physics_2d_server_sw.cpp #: servers/visual/visual_server_scene.cpp @@ -16441,32 +16221,35 @@ msgid "Debugger stdout" msgstr "Hata Ayıklayıcı" #: main/main.cpp +#, fuzzy msgid "Max Chars Per Second" -msgstr "" +msgstr "Saniye başı maksimum karakter sayısı" #: main/main.cpp msgid "Max Messages Per Frame" -msgstr "" +msgstr "Kare Başına Maksimum Mesaj" #: main/main.cpp msgid "Max Errors Per Second" -msgstr "" +msgstr "Saniye Başına Maksimum Hata" #: main/main.cpp msgid "Max Warnings Per Second" -msgstr "" +msgstr "Saniye Başına Maksimum Uyarı" #: main/main.cpp msgid "Flush stdout On Print" msgstr "" #: main/main.cpp servers/visual_server.cpp +#, fuzzy msgid "Logging" -msgstr "" +msgstr "Kayıt tutma" #: main/main.cpp +#, fuzzy msgid "File Logging" -msgstr "" +msgstr "Dosya Kaaydı Tutma" #: main/main.cpp #, fuzzy @@ -16480,16 +16263,15 @@ msgstr "Dosya Yolunu Kopyala" #: main/main.cpp msgid "Max Log Files" -msgstr "" +msgstr "Maksimum Kayıt Dosyası" #: main/main.cpp msgid "Driver" -msgstr "" +msgstr "Sürücü" #: main/main.cpp -#, fuzzy msgid "Driver Name" -msgstr "Betik Adı:" +msgstr "Sürücü Adı" #: main/main.cpp msgid "Fallback To GLES2" @@ -16500,8 +16282,9 @@ msgid "Use Nvidia Rect Flicker Workaround" msgstr "" #: main/main.cpp +#, fuzzy msgid "DPI" -msgstr "" +msgstr "DPI" #: main/main.cpp msgid "Allow hiDPI" @@ -16518,16 +16301,18 @@ msgid "Use V-Sync" msgstr "Yapışma Kullan" #: main/main.cpp +#, fuzzy msgid "Per Pixel Transparency" -msgstr "" +msgstr "Piksel Başına Åžeffaflık" #: main/main.cpp +#, fuzzy msgid "Allowed" -msgstr "" +msgstr "İzin Verildi" #: main/main.cpp msgid "Intended Usage" -msgstr "" +msgstr "Kullanım Amacı" #: main/main.cpp #, fuzzy @@ -16541,7 +16326,7 @@ msgstr "Kaydedilirken hata" #: main/main.cpp msgid "Threads" -msgstr "" +msgstr "İş parçacıkları" #: main/main.cpp servers/physics_2d/physics_2d_server_wrap_mt.h #, fuzzy @@ -16585,8 +16370,9 @@ msgstr "" #: main/main.cpp scene/gui/item_list.cpp scene/gui/popup_menu.cpp #: scene/gui/scroll_container.cpp scene/gui/text_edit.cpp scene/gui/tree.cpp #: scene/main/viewport.cpp scene/register_scene_types.cpp +#, fuzzy msgid "GUI" -msgstr "" +msgstr "Grafiksel Kullanıcı Arayüzü" #: main/main.cpp msgid "Drop Mouse On GUI Input Disabled" @@ -16597,8 +16383,9 @@ msgid "stdout" msgstr "" #: main/main.cpp +#, fuzzy msgid "Print FPS" -msgstr "" +msgstr "Saniyedeki kare sayısını(FPS) yazdır" #: main/main.cpp msgid "Verbose stdout" @@ -16620,8 +16407,9 @@ msgid "Frame Delay Msec" msgstr "Çerçeve Seçimi" #: main/main.cpp +#, fuzzy msgid "Low Processor Mode" -msgstr "" +msgstr "Düşük İşlemci Modu" #: main/main.cpp msgid "Delta Sync After Draw" @@ -16646,8 +16434,9 @@ msgid "Pointing" msgstr "Nokta" #: main/main.cpp +#, fuzzy msgid "Touch Delay" -msgstr "" +msgstr "Dokunma Gecikmesi" #: main/main.cpp servers/visual_server.cpp msgid "GLES3" @@ -16671,8 +16460,9 @@ msgid "Environment" msgstr "Ortamı Göster" #: main/main.cpp +#, fuzzy msgid "Default Clear Color" -msgstr "" +msgstr "Varsayılan Temizleme Rengi" #: main/main.cpp msgid "Boot Splash" @@ -16685,16 +16475,15 @@ msgstr "Kemikleri Göster" #: main/main.cpp msgid "Image" -msgstr "" +msgstr "Görüntü" #: main/main.cpp msgid "Fullsize" -msgstr "" +msgstr "Tam boyut" #: main/main.cpp scene/resources/dynamic_font.cpp -#, fuzzy msgid "Use Filter" -msgstr "Süzgeç:" +msgstr "Filtre Kullan" #: main/main.cpp scene/resources/style_box.cpp #, fuzzy @@ -16741,9 +16530,8 @@ msgid "Custom Image Hotspot" msgstr "" #: main/main.cpp -#, fuzzy msgid "Tooltip Position Offset" -msgstr "Dönme Kayması:" +msgstr "Araç İpucu Pozisyon Kaydırması" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp #, fuzzy @@ -16756,9 +16544,8 @@ msgid "Wait For Debugger" msgstr "Hata Ayıklayıcı" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp -#, fuzzy msgid "Wait Timeout" -msgstr "Zaman aşımı." +msgstr "Bekleme Zaman Aşımı" #: main/main.cpp msgid "Runtime" @@ -16873,14 +16660,12 @@ msgstr "Büyük/Küçük Harf Dönüştür" #: scene/resources/cylinder_shape.cpp scene/resources/environment.cpp #: scene/resources/navigation_mesh.cpp scene/resources/primitive_meshes.cpp #: scene/resources/sphere_shape.cpp -#, fuzzy msgid "Radius" -msgstr "Yarıçap:" +msgstr "Yarıçap" #: modules/csg/csg_shape.cpp scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Radial Segments" -msgstr "Ana Sahne DeÄŸiÅŸtirgenleri:" +msgstr "Radyal Dilimler" #: modules/csg/csg_shape.cpp scene/resources/primitive_meshes.cpp #, fuzzy @@ -16949,9 +16734,8 @@ msgid "Path Simplify Angle" msgstr "" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Rotation" -msgstr "Rastgele Döndürme:" +msgstr "Yol Rotasyonu" #: modules/csg/csg_shape.cpp #, fuzzy @@ -16964,9 +16748,8 @@ msgid "Path Continuous U" msgstr "Sürekli" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path U Distance" -msgstr "Uzaklık Seç:" +msgstr "Yol U Mesafesi" #: modules/csg/csg_shape.cpp #, fuzzy @@ -17019,9 +16802,8 @@ msgid "Use FBX" msgstr "" #: modules/gdnative/gdnative.cpp -#, fuzzy msgid "Config File" -msgstr "Dosya Depolama:" +msgstr "Konfigürasyon Dosyası" #: modules/gdnative/gdnative.cpp #, fuzzy @@ -17037,7 +16819,7 @@ msgstr "İskelet" #: modules/gdnative/gdnative.cpp #, fuzzy msgid "Symbol Prefix" -msgstr "Ön Ek:" +msgstr "Sembol Ön Eki" #: modules/gdnative/gdnative.cpp #, fuzzy @@ -17099,14 +16881,12 @@ msgid "Libraries:" msgstr "Kütüphaneler:" #: modules/gdnative/nativescript/nativescript.cpp -#, fuzzy msgid "Class Name" -msgstr "Sınıf İsmi:" +msgstr "Sınıf İsmi" #: modules/gdnative/nativescript/nativescript.cpp -#, fuzzy msgid "Script Class" -msgstr "Betik Adı:" +msgstr "Betik Sınıfı" #: modules/gdnative/nativescript/nativescript.cpp #, fuzzy @@ -17185,9 +16965,8 @@ msgid "Object can't provide a length." msgstr "Nesne bir uzunluk saÄŸlayamaz." #: modules/gdscript/language_server/gdscript_language_server.cpp -#, fuzzy msgid "Language Server" -msgstr "Dil:" +msgstr "Dil Sunucusu" #: modules/gdscript/language_server/gdscript_language_server.cpp #, fuzzy @@ -17216,9 +16995,8 @@ msgid "Buffer View" msgstr "Arkadan Görünüm" #: modules/gltf/gltf_accessor.cpp modules/gltf/gltf_buffer_view.cpp -#, fuzzy msgid "Byte Offset" -msgstr "Izgarayı Kaydır:" +msgstr "" #: modules/gltf/gltf_accessor.cpp #, fuzzy @@ -17259,9 +17037,8 @@ msgid "Sparse Indices Byte Offset" msgstr "" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Sparse Indices Component Type" -msgstr "Geometri Ayrıştırılıyor..." +msgstr "Seyrek Dizinler BileÅŸen Tipi" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Values Buffer View" @@ -17291,9 +17068,8 @@ msgid "Indices" msgstr "Tüm Aygıtlar" #: modules/gltf/gltf_camera.cpp -#, fuzzy msgid "FOV Size" -msgstr "Boyut:" +msgstr "Görüş Alanı Boyutu" #: modules/gltf/gltf_camera.cpp msgid "Zfar" @@ -17342,7 +17118,7 @@ msgstr "Işık-Haritalarını PiÅŸir" #: modules/gltf/gltf_mesh.cpp #, fuzzy msgid "Instance Materials" -msgstr "Materyal DeÄŸiÅŸiklikleri:" +msgstr "Örnek Malzemeler" #: modules/gltf/gltf_node.cpp scene/3d/skeleton.cpp #, fuzzy @@ -17430,9 +17206,8 @@ msgid "Gloss Factor" msgstr "" #: modules/gltf/gltf_spec_gloss.cpp -#, fuzzy msgid "Specular Factor" -msgstr "Katsayı operatörü." +msgstr "Yansıtıcı Etkeni" #: modules/gltf/gltf_spec_gloss.cpp msgid "Spec Gloss Img" @@ -17471,9 +17246,8 @@ msgid "Accessors" msgstr "" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Scene Name" -msgstr "Sahne Yolu:" +msgstr "Sahne Adı" #: modules/gltf/gltf_state.cpp #, fuzzy @@ -17502,7 +17276,7 @@ msgstr "Işık" #: modules/gltf/gltf_state.cpp #, fuzzy msgid "Unique Animation Names" -msgstr "Yeni Animasyon İsmi:" +msgstr "Benzersiz Animasyon Adları" #: modules/gltf/gltf_state.cpp #, fuzzy @@ -17515,9 +17289,8 @@ msgid "Skeleton To Node" msgstr "Bir Düğüm Seç" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Animations" -msgstr "Animasyonlar:" +msgstr "Animasyonlar" #: modules/gltf/gltf_texture.cpp #, fuzzy @@ -17764,7 +17537,7 @@ msgstr "" #: modules/stb_vorbis/resource_importer_ogg_vorbis.cpp #, fuzzy msgid "Loop Offset" -msgstr "Kaydırma:" +msgstr "Döngü Kaydırma" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "Eye Height" @@ -17809,6 +17582,21 @@ msgstr "Solüsyonu İnÅŸa Et" msgid "Auto Update Project" msgstr "Adsız Proje" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Hepsini Görüntüle" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Bir Dizin Seç" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Bir Dizin Seç" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "İç özel durum yığını izlemesinin sonu" @@ -17887,7 +17675,7 @@ msgstr "" #: modules/opensimplex/noise_texture.cpp #, fuzzy msgid "As Normal Map" -msgstr "Rastgele Ölçek:" +msgstr "Normal Haritalama Olarak" #: modules/opensimplex/noise_texture.cpp msgid "Bump Strength" @@ -17900,7 +17688,7 @@ msgstr "" #: modules/opensimplex/noise_texture.cpp #, fuzzy msgid "Noise Offset" -msgstr "Izgarayı Kaydır:" +msgstr "Gürültü Kaydırma" #: modules/opensimplex/open_simplex_noise.cpp msgid "Octaves" @@ -17929,9 +17717,8 @@ msgid "Names" msgstr "İsim" #: modules/regex/regex.cpp -#, fuzzy msgid "Strings" -msgstr "Ayarlar:" +msgstr "Dizgiler" #: modules/upnp/upnp.cpp msgid "Discover Multicast If" @@ -18009,7 +17796,7 @@ msgstr "Bit dizisi bulundu fakat yığındaki düğüm deÄŸil, kusuru bildir!" #: modules/visual_script/visual_script.cpp #, fuzzy msgid "Stack overflow with stack depth:" -msgstr "Åžu derinlikte yığın taÅŸması: " +msgstr "Åžu derinlikte yığın taÅŸması:" #: modules/visual_script/visual_script.cpp #, fuzzy @@ -18381,7 +18168,7 @@ msgstr "" #: modules/visual_script/visual_script_flow_control.cpp #, fuzzy msgid "Input type not iterable:" -msgstr "Girdi türü yinelenebilir deÄŸil: " +msgstr "Girdi türü yinelenebilir deÄŸil:" #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator became invalid" @@ -18390,7 +18177,7 @@ msgstr "Yineleyici geçersiz durumda" #: modules/visual_script/visual_script_flow_control.cpp #, fuzzy msgid "Iterator became invalid:" -msgstr "Yineleyici geçersiz durumda: " +msgstr "Yineleyici geçersiz durumda:" #: modules/visual_script/visual_script_flow_control.cpp msgid "Sequence" @@ -18462,9 +18249,8 @@ msgid "Use Default Args" msgstr "Varsayılanlara dön" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Validate" -msgstr "Geçerli karakterler:" +msgstr "DoÄŸrula" #: modules/visual_script/visual_script_func_nodes.cpp #, fuzzy @@ -18553,19 +18339,18 @@ msgstr "Diziyi Yeniden Boyutlandır" #: modules/visual_script/visual_script_nodes.cpp scene/resources/material.cpp #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Operator" -msgstr "Kaplama opeartörü." +msgstr "Operatör" #: modules/visual_script/visual_script_nodes.cpp #, fuzzy msgid "Invalid argument of type:" -msgstr ": Åžu tür için geçersiz deÄŸiÅŸtirgen: " +msgstr ": Åžu tür için geçersiz deÄŸiÅŸtirgen:" #: modules/visual_script/visual_script_nodes.cpp #, fuzzy msgid "Invalid arguments:" -msgstr ": Geçersiz deÄŸiÅŸtirgenler: " +msgstr ": Geçersiz deÄŸiÅŸtirgenler:" #: modules/visual_script/visual_script_nodes.cpp msgid "a if cond, else b" @@ -18579,12 +18364,12 @@ msgstr "İsim" #: modules/visual_script/visual_script_nodes.cpp #, fuzzy msgid "VariableGet not found in script:" -msgstr "VariableGet betikte bulunamadı: " +msgstr "VariableGet betikte bulunamadı:" #: modules/visual_script/visual_script_nodes.cpp #, fuzzy msgid "VariableSet not found in script:" -msgstr "VariableSet betikte bulunamadı: " +msgstr "VariableSet betikte bulunamadı:" #: modules/visual_script/visual_script_nodes.cpp msgid "Preload" @@ -18683,7 +18468,7 @@ msgstr "Görsel Betikte Ara" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Yield" -msgstr "Yield" +msgstr "Verim" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Wait" @@ -18785,9 +18570,8 @@ msgid "CA Chain" msgstr "IK Zincirini Temizle" #: modules/websocket/websocket_server.cpp -#, fuzzy msgid "Handshake Timeout" -msgstr "Zaman aşımı." +msgstr "TokalaÅŸma Zaman Aşımı" #: modules/webxr/webxr_interface.cpp #, fuzzy @@ -18795,14 +18579,12 @@ msgid "Session Mode" msgstr "Bölge Kipi" #: modules/webxr/webxr_interface.cpp -#, fuzzy msgid "Required Features" -msgstr "Ana Özellikler:" +msgstr "Gerekli Özellikler" #: modules/webxr/webxr_interface.cpp -#, fuzzy msgid "Optional Features" -msgstr "Ana Özellikler:" +msgstr "İsteÄŸe BaÄŸlı Özellikler" #: modules/webxr/webxr_interface.cpp msgid "Requested Reference Space Types" @@ -18907,9 +18689,8 @@ msgid "Export Format" msgstr "Dışa aktarım Yolu" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Min SDK" -msgstr "Kontur Boyutu:" +msgstr "Minimum SDK" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18960,14 +18741,12 @@ msgid "Code" msgstr "" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Package" -msgstr "Çıkınla" +msgstr "Paket" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Unique Name" -msgstr "Düğüm adı:" +msgstr "Benzersiz Ad" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18975,9 +18754,8 @@ msgid "Signed" msgstr "Sinyal" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Classify As Game" -msgstr "Sınıf İsmi:" +msgstr "Oyun Olarak Sınıflandır" #: platform/android/export/export_plugin.cpp msgid "Retain Data On Uninstall" @@ -18989,9 +18767,8 @@ msgid "Exclude From Recents" msgstr "Düğümleri Sil" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Graphics" -msgstr "Izgarayı Kaydır:" +msgstr "Grafikler" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -19063,7 +18840,7 @@ msgstr "Topluluk" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp #, fuzzy msgid "Extra Args" -msgstr "Ekstra ÇaÄŸrı Argümanları:" +msgstr "Ek ÇaÄŸrı Argümanları" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -19282,10 +19059,8 @@ msgid "" "'apksigner' could not be found. Please check that the command is available " "in the Android SDK build-tools directory. The resulting %s is unsigned." msgstr "" -"'apksigner' bulunamadı.\n" -"Lütfen komutun Android SDK build-tools dizininde bulunup bulunmadığını " -"kontrol edin.\n" -"Elde edilen %s imzasız." +"'apksigner' bulunamadı. Lütfen komutun Android SDK build-tools dizininde " +"bulunup bulunmadığını kontrol edin. Elde edilen %s imzasız." #: platform/android/export/export_plugin.cpp msgid "Signing debug %s..." @@ -19300,9 +19075,8 @@ msgid "Could not find keystore, unable to export." msgstr "Anahtar deposu bulunamadı, dışa aktarılamadı." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not start apksigner executable." -msgstr "Alt iÅŸlem baÅŸlatılamadı!" +msgstr "apksigner uygulaması baÅŸlatılamadı." #: platform/android/export/export_plugin.cpp msgid "'apksigner' returned with error #%d" @@ -19333,9 +19107,8 @@ msgid "Invalid filename! Android APK requires the *.apk extension." msgstr "Geçersiz dosya adı! Android APK, * .apk uzantısını gerektirir." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Unsupported export format!" -msgstr "Desteklenmeyen dışa aktarma biçimi!\n" +msgstr "Desteklenmeyen dışa aktarım biçimi!" #: platform/android/export/export_plugin.cpp msgid "" @@ -19346,27 +19119,22 @@ msgstr "" "için sürüm bilgisi yok. Lütfen 'Proje' menüsünden yeniden yükleyin." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" -"Android derlemesi sürüm uyumsuzluÄŸu:\n" -" Yüklü Åžablon: %s\n" -" Godot Versiyonu: %s\n" +"Android derlemesi sürüm uyumsuzluÄŸu: Yüklü Åžablon: %s, Godot versiyonu: %s. " "Lütfen 'Proje' menüsünden Android derleme ÅŸablonunu yeniden yükleyin." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Unable to overwrite res://android/build/res/*.xml files with project name." msgstr "" -"Proje adıyla res://android/build/res/*.xml dosyalarının üzerine yazılamıyor" +"Proje adıyla res://android/build/res/*.xml dosyalarının üzerine yazılamıyor." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files to gradle project." -msgstr "Proje dosyaları gradle projesine aktarılamadı\n" +msgstr "Proje dosyaları gradle projesine aktarılamadı." #: platform/android/export/export_plugin.cpp msgid "Could not write expansion package file!" @@ -19382,10 +19150,9 @@ msgid "" "Building of Android project failed, check output for the error. " "Alternatively visit docs.godotengine.org for Android build documentation." msgstr "" -"Android projesinin oluÅŸturulması baÅŸarısız oldu, hatayı çıktı için kontrol " -"edin.\n" -"Alternatif olarak, Android derleme dokümantasyonu için docs.godotengine.org " -"adresini ziyaret edin.." +"Android projesinin oluÅŸturulması baÅŸarısız oldu, hata. için çıktıyı kontrol " +"edin. Alternatif olarak, Android derleme dokümantasyonu için docs." +"godotengine.org adresini ziyaret edin." #: platform/android/export/export_plugin.cpp msgid "Moving output" @@ -19400,40 +19167,34 @@ msgstr "" "için gradle proje dizinini kontrol edin." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Package not found: \"%s\"." -msgstr "Paket bulunamadı: %s" +msgstr "Paket bulunamadı: \"%s\"." #: platform/android/export/export_plugin.cpp msgid "Creating APK..." msgstr "APK oluÅŸturuluyor..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not find template APK to export: \"%s\"." -msgstr "" -"Dışa aktarılacak ÅŸablon APK bulunamadı:\n" -"%s" +msgstr "Dışa aktarılacak ÅŸablon APK bulunamadı: \"%s\"." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Missing libraries in the export template for the selected architectures: %s. " "Please build a template with all required libraries, or uncheck the missing " "architectures in the export preset." msgstr "" -"Seçili mimariler için dışa aktarma ÅŸablonunda eksik kitaplıklar: %s.\n" -"Lütfen tüm gerekli kitaplıkları içeren bir ÅŸablon oluÅŸturun veya dışa " -"aktarma ön ayarındaki eksik mimarilerin iÅŸaretini kaldırın." +"Seçili mimariler için dışa aktarma ÅŸablonunda eksik kitaplıklar: %s. Lütfen " +"tüm gerekli kitaplıkları içeren bir ÅŸablon oluÅŸturun veya dışa aktarma ön " +"ayarındaki eksik mimarilerin iÅŸaretini kaldırın." #: platform/android/export/export_plugin.cpp msgid "Adding files..." msgstr "Dosyalar ekleniyor..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files." -msgstr "Proje dosyaları dışa aktarılamadı" +msgstr "Proje dosyaları dışa aktarılamadı." #: platform/android/export/export_plugin.cpp msgid "Aligning APK..." @@ -19529,9 +19290,8 @@ msgid "Code Sign Identity Release" msgstr "" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Export Method Release" -msgstr "Dışa Aktarma Biçimi:" +msgstr "Dışa Aktarma Yöntemi Sürümü" #: platform/iphone/export/export.cpp msgid "Targeted Device Family" @@ -19542,9 +19302,8 @@ msgid "Info" msgstr "" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Identifier" -msgstr "Geçersiz Tanımlayıcı:" +msgstr "Tanımlayıcı" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #, fuzzy @@ -19570,12 +19329,12 @@ msgstr "Özellikleri Yapıştır" #: platform/iphone/export/export.cpp #, fuzzy msgid "Access Wi-Fi" -msgstr "BaÅŸarılı!" +msgstr "Wi-Fi'ye EriÅŸ" #: platform/iphone/export/export.cpp #, fuzzy msgid "Push Notifications" -msgstr "Rastgele Döndürme:" +msgstr "Rastgele Döndürme" #: platform/iphone/export/export.cpp #, fuzzy @@ -19675,6 +19434,11 @@ msgstr "ÖzelSınıf" msgid "Custom BG Color" msgstr "ÖzelSınıf" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Hepsini GeniÅŸlet" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -19707,19 +19471,16 @@ msgid "Run exported HTML in the system's default browser." msgstr "Dışa aktarılmış HTML'yi sistemin varsayılan tarayıcısında çalıştır." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not open template for export: \"%s\"." -msgstr "Dışa aktarma için ÅŸablon açılamadı:" +msgstr "Dışa aktarım için ÅŸablon açılamadı: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Invalid export template: \"%s\"." -msgstr "Geçersiz Dışa Aktarım Åžablonu:" +msgstr "Geçersiz dışa aktarım ÅŸablonu: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not write file: \"%s\"." -msgstr "Dosya yazılamadı:" +msgstr "Dosya yazılamadı: \"%s\"." #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #, fuzzy @@ -19727,18 +19488,16 @@ msgid "Icon Creation" msgstr "Kenar BoÅŸluk Belirle" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read file: \"%s\"." -msgstr "Dosya okunamadı:" +msgstr "Dosya okunamadı: \"%s\"." #: platform/javascript/export/export.cpp msgid "PWA" msgstr "" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Variant" -msgstr "Ayrım:" +msgstr "Varyant" #: platform/javascript/export/export.cpp #, fuzzy @@ -19810,19 +19569,16 @@ msgid "Icon 512 X 512" msgstr "" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read HTML shell: \"%s\"." -msgstr "HTML kabuÄŸu okunamadı:" +msgstr "HTML kabuÄŸu okunamadı: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not create HTTP server directory: %s." -msgstr "HTTP sunucu klasörü oluÅŸturulamadı:" +msgstr "HTTP sunucu klasörü oluÅŸturulamadı: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Error starting HTTP server: %d." -msgstr "HTTP sunucusu baÅŸlatılırken hata:" +msgstr "HTTP sunucusu baÅŸlatılırken hata: %d." #: platform/javascript/export/export.cpp msgid "Web" @@ -19926,9 +19682,8 @@ msgid "Unknown object type." msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "App Category" -msgstr "Kategori:" +msgstr "Uygulama Kategorisi" #: platform/osx/export/export.cpp msgid "High Res" @@ -20122,19 +19877,16 @@ msgid "Apple Team ID" msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not open icon file \"%s\"." -msgstr "Proje dosyaları dışa aktarılamadı" +msgstr "İkon dosyası \"%s\" açılamadı." #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not start xcrun executable." -msgstr "Alt iÅŸlem baÅŸlatılamadı!" +msgstr "xcrun uygulaması baÅŸlatılamadı." #: platform/osx/export/export.cpp -#, fuzzy msgid "Notarization failed." -msgstr "YerelleÅŸtirme" +msgstr "Noter tasdiki baÅŸarısız oldu." #: platform/osx/export/export.cpp msgid "Notarization request UUID: \"%s\"" @@ -20187,9 +19939,8 @@ msgid "No identity found." msgstr "Simge bulunamadı." #: platform/osx/export/export.cpp -#, fuzzy msgid "Cannot sign file %s." -msgstr "%s dosyası kaydedilirken hata" +msgstr "%s dosyası imzalanamadı." #: platform/osx/export/export.cpp msgid "Relative symlinks are not supported, exported \"%s\" might be broken!" @@ -20201,9 +19952,8 @@ msgid "DMG Creation" msgstr "Yönler" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not start hdiutil executable." -msgstr "Alt iÅŸlem baÅŸlatılamadı!" +msgstr "hdiutil uygulaması baÅŸlatılamadı." #: platform/osx/export/export.cpp msgid "`hdiutil create` failed - file exists." @@ -20219,16 +19969,12 @@ msgid "Creating app bundle" msgstr "Küçük Bediz OluÅŸturuluyor" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not find template app to export: \"%s\"." -msgstr "" -"Dışa aktarılacak ÅŸablon APK bulunamadı:\n" -"%s" +msgstr "Dışa aktarım için ÅŸablon uygulaması bulunamadı: \"%s\"." #: platform/osx/export/export.cpp -#, fuzzy msgid "Invalid export format." -msgstr "Geçersiz Dışa Aktarım Åžablonu:" +msgstr "Geçersiz dışa aktarım biçimi." #: platform/osx/export/export.cpp msgid "" @@ -20284,9 +20030,8 @@ msgid "ZIP Creation" msgstr "Proje" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not open file to read from path \"%s\"." -msgstr "Proje dosyaları gradle projesine aktarılamadı\n" +msgstr "\"%s\" yolundan okunacak dosya açılamadı." #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" @@ -20413,23 +20158,20 @@ msgid "Display Name" msgstr "Hepsini Görüntüle" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Short Name" -msgstr "Betik Adı:" +msgstr "Kısa Ad" #: platform/uwp/export/export.cpp msgid "Publisher" msgstr "" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Publisher Display Name" -msgstr "Geçersiz paket yayıncı görünen adı." +msgstr "Görünen Yayıncı Adı" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Product GUID" -msgstr "Geçersiz ürün GUID'i." +msgstr "Ürün GUID" #: platform/uwp/export/export.cpp #, fuzzy @@ -20444,7 +20186,7 @@ msgstr "Sinyal" #: platform/uwp/export/export.cpp #, fuzzy msgid "Certificate" -msgstr "Köşenoktalar:" +msgstr "Sertifika" #: platform/uwp/export/export.cpp #, fuzzy @@ -20512,9 +20254,8 @@ msgid "Wide 310 X 150 Logo" msgstr "" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Splash Screen" -msgstr "Çizim ÇaÄŸrıları:" +msgstr "BaÅŸlangıç Ekranı" #: platform/uwp/export/export.cpp #, fuzzy @@ -20534,6 +20275,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Geçersiz paket kısa ismi." @@ -20604,9 +20351,8 @@ msgid "Debug Algorithm" msgstr "Hata Ayıklayıcı" #: platform/windows/export/export.cpp -#, fuzzy msgid "Failed to rename temporary file \"%s\"." -msgstr "Geçici dosya kaldırılamıyor:" +msgstr "\"%s\" geçici dosyasının yeniden adlandırılması baÅŸarısız oldu." #: platform/windows/export/export.cpp msgid "Identity Type" @@ -20632,19 +20378,16 @@ msgid "File Version" msgstr "Sürüm" #: platform/windows/export/export.cpp -#, fuzzy msgid "Product Version" -msgstr "Geçersiz ürün GUID'i." +msgstr "Ürün Sürümü" #: platform/windows/export/export.cpp -#, fuzzy msgid "Company Name" -msgstr "Düğüm adı:" +msgstr "Åžirket Adı" #: platform/windows/export/export.cpp -#, fuzzy msgid "Product Name" -msgstr "Proje Adı:" +msgstr "Ürün Adı" #: platform/windows/export/export.cpp #, fuzzy @@ -20693,9 +20436,8 @@ msgid "Could not find osslsigncode executable at \"%s\"." msgstr "Anahtar deposu bulunamadı, dışa aktarılamadı." #: platform/windows/export/export.cpp -#, fuzzy msgid "Invalid identity type." -msgstr "Geçersiz Tanımlayıcı:" +msgstr "Geçersiz kimlik türü." #: platform/windows/export/export.cpp #, fuzzy @@ -20715,9 +20457,8 @@ msgid "Signtool failed to sign executable: %s." msgstr "Geçersiz uzantı." #: platform/windows/export/export.cpp -#, fuzzy msgid "Failed to remove temporary file \"%s\"." -msgstr "Geçici dosya kaldırılamıyor:" +msgstr "\"%s\" geçici dosyasının silinme iÅŸlemi baÅŸarısız oldu." #: platform/windows/export/export.cpp msgid "" @@ -20726,19 +20467,16 @@ msgid "" msgstr "" #: platform/windows/export/export.cpp -#, fuzzy msgid "Invalid icon path:" -msgstr "Geçersiz yol." +msgstr "Geçersiz ikon yolu:" #: platform/windows/export/export.cpp -#, fuzzy msgid "Invalid file version:" -msgstr "Geçersiz uzantı." +msgstr "Geçersiz dosya sürümü:" #: platform/windows/export/export.cpp -#, fuzzy msgid "Invalid product version:" -msgstr "Geçersiz ürün GUID'i." +msgstr "Geçersiz ürün sürümü:" #: platform/windows/export/export.cpp msgid "Windows executables cannot be >= 4 GiB." @@ -20875,7 +20613,6 @@ msgid "Audio Bus" msgstr "Audio Bus Ekle" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Override" msgstr "Üzerine Yaz" @@ -20907,9 +20644,8 @@ msgstr "" #: scene/3d/light.cpp scene/3d/reflection_probe.cpp #: scene/3d/visibility_notifier.cpp scene/3d/visual_instance.cpp #: scene/resources/material.cpp -#, fuzzy msgid "Max Distance" -msgstr "Uzaklık Seç:" +msgstr "Maksimum Uzaklık" #: scene/2d/audio_stream_player_2d.cpp scene/3d/light.cpp #, fuzzy @@ -20937,15 +20673,14 @@ msgid "Anchor Mode" msgstr "Simge Kipi" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "Rotating" -msgstr "Dönme Adımı:" +msgstr "Döndürme" #: scene/2d/camera_2d.cpp scene/2d/listener_2d.cpp scene/3d/camera.cpp #: scene/3d/listener.cpp scene/animation/animation_blend_tree.cpp #, fuzzy msgid "Current" -msgstr "Geçerli:" +msgstr "Geçerli" #: scene/2d/camera_2d.cpp scene/gui/graph_edit.cpp #, fuzzy @@ -21027,14 +20762,12 @@ msgid "Drag Margin" msgstr "Kenar BoÅŸluk Belirle" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "Draw Screen" -msgstr "Çizim ÇaÄŸrıları:" +msgstr "Çizim Ekranı" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "Draw Limits" -msgstr "Çizim ÇaÄŸrıları:" +msgstr "Çizim Sınırları" #: scene/2d/camera_2d.cpp #, fuzzy @@ -21248,9 +20981,8 @@ msgstr "" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp -#, fuzzy msgid "Randomness" -msgstr "Rastgele Yeniden BaÅŸlama (sn):" +msgstr "Rastgelelik" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21292,9 +21024,8 @@ msgstr "Emisyon Maskesi" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Sphere Radius" -msgstr "Emisyon Kaynağı: " +msgstr "Küre Yarıçapı" #: scene/2d/cpu_particles_2d.cpp #, fuzzy @@ -21364,7 +21095,7 @@ msgstr "DoÄŸrusal" #: scene/resources/particles_material.cpp #, fuzzy msgid "Accel" -msgstr "BaÅŸarılı!" +msgstr "Hızlanma" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21423,9 +21154,8 @@ msgid "Angle Curve" msgstr "EÄŸriyi Kapat" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp -#, fuzzy msgid "Scale Amount" -msgstr "DeÄŸer:" +msgstr "Ölçek Miktarı" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp msgid "Scale Amount Random" @@ -21451,13 +21181,12 @@ msgstr "" #: scene/resources/particles_material.cpp #, fuzzy msgid "Hue Variation" -msgstr "Ayrım:" +msgstr "Renk Tonu Varyasyonu" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Variation" -msgstr "Ayrım:" +msgstr "Varyasyon" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21687,9 +21416,8 @@ msgid "End Cap Mode" msgstr "Yapışma Kipi:" #: scene/2d/line_2d.cpp scene/2d/polygon_2d.cpp scene/resources/style_box.cpp -#, fuzzy msgid "Border" -msgstr "Klasör yeniden adlandırma:" +msgstr "Kenar" #: scene/2d/line_2d.cpp msgid "Sharp Limit" @@ -21743,9 +21471,8 @@ msgid "Target Desired Distance" msgstr "" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp -#, fuzzy msgid "Path Max Distance" -msgstr "Uzaklık Seç:" +msgstr "Yol Maksimum Mesafesi" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp #, fuzzy @@ -21771,9 +21498,8 @@ msgid "Time Horizon" msgstr "Yatay Yansıt" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp -#, fuzzy msgid "Max Speed" -msgstr "Hız:" +msgstr "Maksimum Hız" #: scene/2d/navigation_agent_2d.cpp #, fuzzy @@ -21817,9 +21543,8 @@ msgstr "Seyahat" #: scene/2d/node_2d.cpp scene/2d/polygon_2d.cpp scene/3d/spatial.cpp #: scene/main/canvas_layer.cpp -#, fuzzy msgid "Rotation Degrees" -msgstr "%s Düzey Dönüyor." +msgstr "Dönüş Açıları" #: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy @@ -21827,14 +21552,12 @@ msgid "Global Rotation" msgstr "Genel Sabit" #: scene/2d/node_2d.cpp -#, fuzzy msgid "Global Rotation Degrees" -msgstr "%s Düzey Dönüyor." +msgstr "Genel Dönüş Açıları" #: scene/2d/node_2d.cpp -#, fuzzy msgid "Global Scale" -msgstr "Rastgele Ölçek:" +msgstr "Küresel Ölçek" #: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy @@ -22022,9 +21745,8 @@ msgid "Mass" msgstr "" #: scene/2d/physics_body_2d.cpp -#, fuzzy msgid "Inertia" -msgstr "Dikey:" +msgstr "Eylemsizlik" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #, fuzzy @@ -22308,9 +22030,8 @@ msgid "Compatibility Mode" msgstr "Öncelik Kipi" #: scene/2d/tile_map.cpp -#, fuzzy msgid "Centered Textures" -msgstr "Ana Özellikler:" +msgstr "MerkezlenmiÅŸ Dokular" #: scene/2d/tile_map.cpp msgid "Cell Clip UV" @@ -22434,9 +22155,8 @@ msgid "ARVROrigin requires an ARVRCamera child node." msgstr "ARVROrigin bir ARVRCamera alt düğümü gerektirir." #: scene/3d/arvr_nodes.cpp servers/arvr_server.cpp -#, fuzzy msgid "World Scale" -msgstr "Rastgele Ölçek:" +msgstr "Dünya ÖlçeÄŸi" #: scene/3d/audio_stream_player_3d.cpp #, fuzzy @@ -22465,9 +22185,8 @@ msgid "Emission Angle" msgstr "Emisyon Renkleri" #: scene/3d/audio_stream_player_3d.cpp -#, fuzzy msgid "Degrees" -msgstr "%s Düzey Dönüyor." +msgstr "Açılar" #: scene/3d/audio_stream_player_3d.cpp #, fuzzy @@ -22578,9 +22297,8 @@ msgid "Generate" msgstr "Genel" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Max Size" -msgstr "Boyut:" +msgstr "Maksimum Boyut" #: scene/3d/baked_lightmap.cpp #, fuzzy @@ -22588,9 +22306,8 @@ msgid "Custom Sky" msgstr "ÖzelSınıf" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Custom Sky Rotation Degrees" -msgstr "%s Düzey Dönüyor." +msgstr "Özel Gökyüzü Dönüş Açıları" #: scene/3d/baked_lightmap.cpp scene/3d/ray_cast.cpp #, fuzzy @@ -22909,14 +22626,12 @@ msgstr "Beyaz Modüle Etme Kuvveti" #: scene/3d/label_3d.cpp scene/resources/default_theme/default_theme.cpp #: scene/resources/dynamic_font.cpp scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Font" -msgstr "Yazı Tipleri" +msgstr "Yazı Tipi" #: scene/3d/label_3d.cpp scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Horizontal Alignment" -msgstr "Yatay:" +msgstr "Yatay Hizalama" #: scene/3d/label_3d.cpp #, fuzzy @@ -23026,9 +22741,8 @@ msgid "Software Skinning" msgstr "" #: scene/3d/mesh_instance.cpp -#, fuzzy msgid "Transform Normals" -msgstr "Dönüşüm Durduruldu." +msgstr "Dönüşüm Normalleri" #: scene/3d/navigation.cpp msgid "" @@ -23239,9 +22953,8 @@ msgid "Angular Limit Upper" msgstr "DoÄŸrusal" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Angular Limit Lower" -msgstr "Maks. Açısal Hata:" +msgstr "Açısal Limit Alt" #: scene/3d/physics_body.cpp #, fuzzy @@ -23406,9 +23119,8 @@ msgid "Exclude Nodes" msgstr "Düğümleri Sil" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Params" -msgstr "Parametre DeÄŸiÅŸtirildi:" +msgstr "Parametreler" #: scene/3d/physics_joint.cpp msgid "Angular Limit" @@ -23436,7 +23148,7 @@ msgstr "Yörünge Görünümü SaÄŸ" #: scene/3d/physics_joint.cpp #, fuzzy msgid "Max Impulse" -msgstr "Hız:" +msgstr "Maksimum İtme" #: scene/3d/physics_joint.cpp #, fuzzy @@ -23444,14 +23156,12 @@ msgid "Linear Limit" msgstr "DoÄŸrusal" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Upper Distance" -msgstr "Uzaklık Seç:" +msgstr "Üst Mesafe" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Lower Distance" -msgstr "Uzaklık Seç:" +msgstr "Alt Mesafe" #: scene/3d/physics_joint.cpp #, fuzzy @@ -23499,9 +23209,8 @@ msgid "Linear Motor X" msgstr "EtkinleÅŸtir" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Force Limit" -msgstr "Çizim ÇaÄŸrıları:" +msgstr "Kuvvet Sınırı" #: scene/3d/physics_joint.cpp #, fuzzy @@ -23619,9 +23328,8 @@ msgid "Dispatch Mode" msgstr "" #: scene/3d/proximity_group.cpp -#, fuzzy msgid "Grid Radius" -msgstr "Yarıçap:" +msgstr "Izgara Yarıçapı" #: scene/3d/ray_cast.cpp #, fuzzy @@ -23908,14 +23616,12 @@ msgid "Parent Collision Ignore" msgstr "Temas Çokgeni OluÅŸtur" #: scene/3d/soft_body.cpp -#, fuzzy msgid "Simulation Precision" -msgstr "Animasyon aÄŸacı geçersizdir." +msgstr "Simülasyon Hassasiyeti" #: scene/3d/soft_body.cpp -#, fuzzy msgid "Total Mass" -msgstr "Toplam:" +msgstr "Toplam Kütle" #: scene/3d/soft_body.cpp msgid "Linear Stiffness" @@ -23984,7 +23690,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp scene/gui/graph_edit.cpp msgid "Opacity" -msgstr "" +msgstr "Åžeffaflık" #: scene/3d/sprite_3d.cpp scene/resources/material.cpp #, fuzzy @@ -24039,9 +23745,8 @@ msgid "Use As Steering" msgstr "" #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Wheel" -msgstr "Tekerlek Yukarı." +msgstr "Tekerlek" #: scene/3d/vehicle_body.cpp msgid "Roll Influence" @@ -24111,9 +23816,8 @@ msgstr "" #: scene/3d/visual_instance.cpp scene/animation/skeleton_ik.cpp #: scene/resources/material.cpp -#, fuzzy msgid "Min Distance" -msgstr "Uzaklık Seç:" +msgstr "Minimum Mesafe" #: scene/3d/visual_instance.cpp msgid "Min Hysteresis" @@ -24162,31 +23866,30 @@ msgstr "Düğümü Çırp" #: scene/animation/animation_blend_tree.cpp #, fuzzy msgid "Fadein Time" -msgstr "X-Sönülme Süresi (sn):" +msgstr "Solma Süresi" #: scene/animation/animation_blend_tree.cpp #, fuzzy msgid "Fadeout Time" -msgstr "X-Sönülme Süresi (sn):" +msgstr "Kararma Süresi" #: scene/animation/animation_blend_tree.cpp #, fuzzy msgid "Auto Restart" -msgstr "KendiliÄŸinden Yeniden BaÅŸlat:" +msgstr "Otomatik Yeniden BaÅŸlat" #: scene/animation/animation_blend_tree.cpp #, fuzzy msgid "Autorestart" -msgstr "KendiliÄŸinden Yeniden BaÅŸlat:" +msgstr "Otomatik Yeniden BaÅŸlatma" #: scene/animation/animation_blend_tree.cpp msgid "Delay" msgstr "" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Random Delay" -msgstr "Rastgele EÄŸilme:" +msgstr "Rastgele Gecikme" #: scene/animation/animation_blend_tree.cpp #, fuzzy @@ -24196,7 +23899,7 @@ msgstr "DeÄŸer:" #: scene/animation/animation_blend_tree.cpp #, fuzzy msgid "Blend Amount" -msgstr "DeÄŸer:" +msgstr "Karıştırma Miktarı" #: scene/animation/animation_blend_tree.cpp #, fuzzy @@ -24212,7 +23915,7 @@ msgstr "GiriÅŸ Portu Ekle" #: scene/animation/animation_node_state_machine.cpp #, fuzzy msgid "Xfade Time" -msgstr "X-Sönülme Süresi (sn):" +msgstr "X-Sönülme Süresi" #: scene/animation/animation_node_state_machine.cpp #, fuzzy @@ -24258,9 +23961,8 @@ msgid "Current Animation Position" msgstr "Animasyon Noktası Ekle" #: scene/animation/animation_player.cpp -#, fuzzy msgid "Playback Options" -msgstr "Sınıf Seçenekleri:" +msgstr "Oynatma Seçenekleri" #: scene/animation/animation_player.cpp #, fuzzy @@ -24304,7 +24006,7 @@ msgstr "AnimationOynatıcı kök düğümü geçerli bir düğüm deÄŸil." #: scene/animation/animation_tree.cpp #, fuzzy msgid "Tree Root" -msgstr "Kök Düğüm OluÅŸtur:" +msgstr "AÄŸaç Kökü" #: scene/animation/animation_tree.cpp #, fuzzy @@ -24562,9 +24264,8 @@ msgid "Grow Direction" msgstr "Yönler" #: scene/gui/control.cpp scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Min Size" -msgstr "Kontur Boyutu:" +msgstr "Minimum Boyut" #: scene/gui/control.cpp #, fuzzy @@ -24620,18 +24321,16 @@ msgid "Mouse" msgstr "" #: scene/gui/control.cpp -#, fuzzy msgid "Default Cursor Shape" -msgstr "Varsayılan Bus YerleÅŸim Düzenini Yükle." +msgstr "Varsayılan İmleç Åžekli" #: scene/gui/control.cpp msgid "Pass On Modal Close Click" msgstr "" #: scene/gui/control.cpp -#, fuzzy msgid "Size Flags" -msgstr "Boyut: " +msgstr "Boyut Etiketleri" #: scene/gui/control.cpp #, fuzzy @@ -24784,9 +24483,8 @@ msgid "Fixed Column Width" msgstr "" #: scene/gui/item_list.cpp -#, fuzzy msgid "Icon Scale" -msgstr "Rastgele Ölçek:" +msgstr "Simge ÖlçeÄŸi" #: scene/gui/item_list.cpp #, fuzzy @@ -24799,9 +24497,8 @@ msgid "V Align" msgstr "Ata" #: scene/gui/label.cpp scene/gui/rich_text_label.cpp -#, fuzzy msgid "Visible Characters" -msgstr "Geçerli karakterler:" +msgstr "Görünür Karakterler" #: scene/gui/label.cpp scene/gui/rich_text_label.cpp #, fuzzy @@ -24825,9 +24522,8 @@ msgid "Secret" msgstr "" #: scene/gui/line_edit.cpp -#, fuzzy msgid "Secret Character" -msgstr "Geçerli karakterler:" +msgstr "Gizli Karakter" #: scene/gui/line_edit.cpp msgid "Expand To Text Length" @@ -24884,16 +24580,15 @@ msgstr "" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Caret" -msgstr "Karet" +msgstr "İmleç" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Blink" msgstr "" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Blink Speed" -msgstr "Hız:" +msgstr "Yanıp Sönme Hızı" #: scene/gui/link_button.cpp msgid "Underline" @@ -24980,9 +24675,8 @@ msgid "Allow Search" msgstr "Ara" #: scene/gui/progress_bar.cpp -#, fuzzy msgid "Percent" -msgstr "Yakın zamanda:" +msgstr "Yüzde" #: scene/gui/range.cpp msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." @@ -24999,9 +24693,8 @@ msgid "Max Value" msgstr "DeÄŸer" #: scene/gui/range.cpp -#, fuzzy msgid "Page" -msgstr "Sayfa: " +msgstr "Sayfa" #: scene/gui/range.cpp #, fuzzy @@ -25042,9 +24735,8 @@ msgid "Absolute Index" msgstr "Kendinden Girintili" #: scene/gui/rich_text_effect.cpp -#, fuzzy msgid "Elapsed Time" -msgstr "Süreleri Karıştır:" +msgstr "Geçen Süre" #: scene/gui/rich_text_effect.cpp #, fuzzy @@ -25052,9 +24744,8 @@ msgid "Env" msgstr "BitiÅŸ" #: scene/gui/rich_text_effect.cpp -#, fuzzy msgid "Character" -msgstr "Geçerli karakterler:" +msgstr "Karakter" #: scene/gui/rich_text_label.cpp msgid "BBCode" @@ -25065,9 +24756,8 @@ msgid "Meta Underlined" msgstr "" #: scene/gui/rich_text_label.cpp -#, fuzzy msgid "Tab Size" -msgstr "Boyut:" +msgstr "Sekme Boyutu" #: scene/gui/rich_text_label.cpp #, fuzzy @@ -25143,17 +24833,15 @@ msgstr "Renk Seç" #: scene/gui/slider.cpp #, fuzzy msgid "Ticks On Borders" -msgstr "Klasör yeniden adlandırma:" +msgstr "Kenarlar Üzerindeki İşaretler" #: scene/gui/spin_box.cpp -#, fuzzy msgid "Prefix" -msgstr "Ön Ek:" +msgstr "Ön Ek" #: scene/gui/spin_box.cpp -#, fuzzy msgid "Suffix" -msgstr "Son Ek (Suffix) :" +msgstr "Son Ek" #: scene/gui/split_container.cpp #, fuzzy @@ -25175,9 +24863,8 @@ msgid "Tab Align" msgstr "" #: scene/gui/tab_container.cpp scene/gui/tabs.cpp -#, fuzzy msgid "Current Tab" -msgstr "Geçerli:" +msgstr "Geçerli Sekme" #: scene/gui/tab_container.cpp #, fuzzy @@ -25189,9 +24876,8 @@ msgid "All Tabs In Front" msgstr "" #: scene/gui/tab_container.cpp scene/gui/tabs.cpp -#, fuzzy msgid "Drag To Rearrange Enabled" -msgstr "Düzenlemek için Sürükle-Bırak." +msgstr "Sürükleyerek Yeniden Düzenleme AktifleÅŸtirildi" #: scene/gui/tab_container.cpp msgid "Use Hidden Tabs For Min Size" @@ -25240,19 +24926,17 @@ msgid "Wrap Enabled" msgstr "Etkin" #: scene/gui/text_edit.cpp -#, fuzzy msgid "Scroll Vertical" -msgstr "Dikey:" +msgstr "Dikey Kaydırma" #: scene/gui/text_edit.cpp -#, fuzzy msgid "Scroll Horizontal" -msgstr "Yatay:" +msgstr "Yatay Kaydırma" #: scene/gui/text_edit.cpp #, fuzzy msgid "Draw" -msgstr "Çizim ÇaÄŸrıları:" +msgstr "Çiz" #: scene/gui/text_edit.cpp #, fuzzy @@ -25312,7 +24996,7 @@ msgstr "" #: scene/gui/texture_progress.cpp #, fuzzy msgid "Fill Mode" -msgstr "Oynatma Modu:" +msgstr "Doldurma Modu" #: scene/gui/texture_progress.cpp scene/resources/material.cpp msgid "Tint" @@ -25328,9 +25012,8 @@ msgid "Initial Angle" msgstr "EtkinleÅŸtir" #: scene/gui/texture_progress.cpp -#, fuzzy msgid "Fill Degrees" -msgstr "%s Düzey Dönüyor." +msgstr "Dolgu AÅŸamaları" #: scene/gui/texture_progress.cpp scene/resources/primitive_meshes.cpp #, fuzzy @@ -25381,9 +25064,8 @@ msgid "Hide Folding" msgstr "Pasif Düğme" #: scene/gui/tree.cpp -#, fuzzy msgid "Hide Root" -msgstr "Kök Düğüm OluÅŸtur:" +msgstr "Kökü Gizle" #: scene/gui/tree.cpp msgid "Drop Mode Flags" @@ -25437,9 +25119,8 @@ msgid "Max Redirects" msgstr "" #: scene/main/http_request.cpp -#, fuzzy msgid "Timeout" -msgstr "Zaman aşımı." +msgstr "Zaman Aşımı" #: scene/main/node.cpp msgid "" @@ -25567,9 +25248,8 @@ msgid "Draw 2D Outlines" msgstr "Anahat OluÅŸtur" #: scene/main/scene_tree.cpp servers/visual_server.cpp -#, fuzzy msgid "Reflections" -msgstr "Yönler" +msgstr "Yansımalar" #: scene/main/scene_tree.cpp #, fuzzy @@ -25631,9 +25311,8 @@ msgstr "" "döngüsünü kullanmayı tercih edin." #: scene/main/timer.cpp -#, fuzzy msgid "Autostart" -msgstr "KendiliÄŸinden Yeniden BaÅŸlat:" +msgstr "Otomatik baÅŸlatma" #: scene/main/viewport.cpp #, fuzzy @@ -25961,9 +25640,8 @@ msgid "On Disabled" msgstr "Pasif Öge" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Off" -msgstr "Kaydırma:" +msgstr "Kapat" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26046,9 +25724,8 @@ msgid "Space" msgstr "Ana Sahne" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Folded" -msgstr "Dosya:" +msgstr "Katlanmış" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26207,9 +25884,8 @@ msgid "Labeled Separator Right" msgstr "İsimli Ayraç" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Separator" -msgstr "Renk operatörü." +msgstr "Yazı Tipi Ayracı" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26217,9 +25893,8 @@ msgid "Font Color Accel" msgstr "Renk Öğesini Yeniden Adlandır" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Separator" -msgstr "Renk operatörü." +msgstr "Yazı Tipi Rengi Ayracı" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26389,14 +26064,12 @@ msgid "Draw Guides" msgstr "Kılavuz çizgilerini göster" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Scroll Border" -msgstr "Dikey:" +msgstr "Kaydırma Kenarlığı" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Scroll Speed" -msgstr "Izgarayı Kaydır:" +msgstr "Kaydırma Hızı" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26466,9 +26139,8 @@ msgid "Large" msgstr "Hedef" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Folder" -msgstr "Dosya:" +msgstr "Klasör" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26506,9 +26178,8 @@ msgid "Label Width" msgstr "Soldan Görünüm" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Screen Picker" -msgstr "Screen Etkisi operatörü." +msgstr "Ekran Seçici" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26671,7 +26342,7 @@ msgstr "Yola Odaklan" #: scene/resources/dynamic_font.cpp #, fuzzy msgid "Outline Size" -msgstr "Kontur Boyutu:" +msgstr "Kontur Boyutu" #: scene/resources/dynamic_font.cpp #, fuzzy @@ -26684,14 +26355,12 @@ msgid "Use Mipmaps" msgstr "sinyaller" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Extra Spacing" -msgstr "İlave Seçenekler:" +msgstr "Ekstra BoÅŸluk" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Char" -msgstr "Geçerli karakterler:" +msgstr "karakter" #: scene/resources/dynamic_font.cpp #, fuzzy @@ -26722,9 +26391,8 @@ msgid "Sky Rotation" msgstr "Dönme Adımı:" #: scene/resources/environment.cpp -#, fuzzy msgid "Sky Rotation Degrees" -msgstr "%s Düzey Dönüyor." +msgstr "Gökyüzü Dönüş Açıları" #: scene/resources/environment.cpp msgid "Canvas Max Layer" @@ -26749,14 +26417,13 @@ msgid "Fog" msgstr "" #: scene/resources/environment.cpp -#, fuzzy msgid "Sun Color" -msgstr "Dosya Depolama:" +msgstr "GüneÅŸ Rengi" #: scene/resources/environment.cpp #, fuzzy msgid "Sun Amount" -msgstr "DeÄŸer:" +msgstr "GüneÅŸ Miktarı" #: scene/resources/environment.cpp #, fuzzy @@ -26845,14 +26512,13 @@ msgid "Max Steps" msgstr "Adım" #: scene/resources/environment.cpp -#, fuzzy msgid "Fade In" -msgstr "Açılma (sn):" +msgstr "Solma" #: scene/resources/environment.cpp #, fuzzy msgid "Fade Out" -msgstr "Karartma (sn):" +msgstr "Kararma" #: scene/resources/environment.cpp #, fuzzy @@ -26870,7 +26536,7 @@ msgstr "" #: scene/resources/environment.cpp #, fuzzy msgid "Radius 2" -msgstr "Yarıçap:" +msgstr "Yarıçap 2" #: scene/resources/environment.cpp msgid "Intensity 2" @@ -26899,14 +26565,12 @@ msgid "DOF Far Blur" msgstr "" #: scene/resources/environment.cpp scene/resources/material.cpp -#, fuzzy msgid "Distance" -msgstr "Uzaklık Seç:" +msgstr "Mesafe" #: scene/resources/environment.cpp -#, fuzzy msgid "Transition" -msgstr "GeçiÅŸ: " +msgstr "GeçiÅŸ" #: scene/resources/environment.cpp msgid "DOF Near Blur" @@ -26984,14 +26648,12 @@ msgid "Brightness" msgstr "Işık" #: scene/resources/environment.cpp -#, fuzzy msgid "Saturation" -msgstr "Ayrım:" +msgstr "Doygunluk" #: scene/resources/environment.cpp -#, fuzzy msgid "Color Correction" -msgstr "Renk iÅŸlevi." +msgstr "Renk Düzeltme" #: scene/resources/font.cpp #, fuzzy @@ -27073,9 +26735,8 @@ msgid "Disable Ambient Light" msgstr "SaÄŸa Girintile" #: scene/resources/material.cpp -#, fuzzy msgid "Ensure Correct Normals" -msgstr "Dönüşüm Durduruldu." +msgstr "DoÄŸru Normalleri SaÄŸla" #: scene/resources/material.cpp msgid "Albedo Tex MSDF" @@ -27095,9 +26756,8 @@ msgid "Is sRGB" msgstr "" #: scene/resources/material.cpp servers/visual_server.cpp -#, fuzzy msgid "Parameters" -msgstr "Parametre DeÄŸiÅŸtirildi:" +msgstr "Parametreler" #: scene/resources/material.cpp #, fuzzy @@ -27139,9 +26799,8 @@ msgid "Grow" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Grow Amount" -msgstr "DeÄŸer:" +msgstr "Büyüme Miktarı" #: scene/resources/material.cpp msgid "Use Alpha Scissor" @@ -27244,7 +26903,7 @@ msgstr "" #: scene/resources/material.cpp #, fuzzy msgid "Transmission" -msgstr "GeçiÅŸ: " +msgstr "Aktarma" #: scene/resources/material.cpp #, fuzzy @@ -27312,14 +26971,12 @@ msgid "NavMesh Transform" msgstr "Dönüşümü Temizle" #: scene/resources/multimesh.cpp -#, fuzzy msgid "Color Format" -msgstr "Renk operatörü." +msgstr "Renk Biçimi" #: scene/resources/multimesh.cpp -#, fuzzy msgid "Transform Format" -msgstr "Dönüşüm Durduruldu." +msgstr "Dönüşüm Biçimi" #: scene/resources/multimesh.cpp msgid "Custom Data Format" @@ -27335,9 +26992,8 @@ msgid "Visible Instance Count" msgstr "" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Sampling" -msgstr "Ölçekleniyor: " +msgstr "Örnekleme" #: scene/resources/navigation_mesh.cpp #, fuzzy @@ -27345,9 +27001,8 @@ msgid "Partition Type" msgstr "DeÄŸiÅŸken Tipini Ayarla" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Parsed Geometry Type" -msgstr "Geometri Ayrıştırılıyor..." +msgstr "ÇözümlenmiÅŸ Geometri Tipi" #: scene/resources/navigation_mesh.cpp msgid "Source Geometry Mode" @@ -27363,9 +27018,8 @@ msgid "Cells" msgstr "" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Agents" -msgstr "Ana Sahne DeÄŸiÅŸtirgenleri:" +msgstr "Ajanlar" #: scene/resources/navigation_mesh.cpp msgid "Max Climb" @@ -27404,9 +27058,8 @@ msgid "Details" msgstr "Varsayılanı Göster" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Sample Distance" -msgstr "Uzaklık Seç:" +msgstr "Örnek Mesafe" #: scene/resources/navigation_mesh.cpp #, fuzzy @@ -27437,7 +27090,7 @@ msgstr "Kaydırma:" #: scene/resources/occluder_shape.cpp msgid "Spheres" -msgstr "" +msgstr "Küreler" #: scene/resources/occluder_shape.cpp msgid "OccluderShapeSphere Set Spheres" @@ -27477,14 +27130,12 @@ msgid "Color Modifier" msgstr "Serbest Bakış Hız DeÄŸiÅŸtirici" #: scene/resources/particles_material.cpp -#, fuzzy msgid "Point Texture" -msgstr "Emisyon Noktaları:" +msgstr "Nokta Dokusu" #: scene/resources/particles_material.cpp -#, fuzzy msgid "Normal Texture" -msgstr "Emisyon Kaynağı: " +msgstr "Normal Doku" #: scene/resources/particles_material.cpp #, fuzzy @@ -27497,9 +27148,8 @@ msgid "Point Count" msgstr "GiriÅŸ Portu Ekle" #: scene/resources/particles_material.cpp -#, fuzzy msgid "Scale Random" -msgstr "Ölçek Oranı:" +msgstr "Rastgele Ölçeklendir" #: scene/resources/particles_material.cpp #, fuzzy @@ -27515,9 +27165,8 @@ msgid "Absorbent" msgstr "" #: scene/resources/plane_shape.cpp -#, fuzzy msgid "Plane" -msgstr "Sekme:" +msgstr "Uçak" #: scene/resources/primitive_meshes.cpp #, fuzzy @@ -27541,9 +27190,8 @@ msgid "Subdivide Depth" msgstr "" #: scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Top Radius" -msgstr "Yarıçap:" +msgstr "Üst Yarıçap" #: scene/resources/primitive_meshes.cpp #, fuzzy @@ -27556,8 +27204,9 @@ msgid "Left To Right" msgstr "SaÄŸ Üst" #: scene/resources/primitive_meshes.cpp +#, fuzzy msgid "Is Hemisphere" -msgstr "" +msgstr "Yarım Küre Mi" #: scene/resources/primitive_meshes.cpp #, fuzzy @@ -27606,9 +27255,8 @@ msgid "Top Color" msgstr "Sonraki Zemin" #: scene/resources/sky.cpp -#, fuzzy msgid "Horizon Color" -msgstr "Dosya Depolama:" +msgstr "Horizon Renk" #: scene/resources/sky.cpp #, fuzzy @@ -27688,9 +27336,8 @@ msgid "Base Texture" msgstr "Dokuyu Kaldır" #: scene/resources/texture.cpp -#, fuzzy msgid "Image Size" -msgstr "Sayfa: " +msgstr "Görüntü Boyutu" #: scene/resources/texture.cpp #, fuzzy @@ -27718,9 +27365,8 @@ msgid "Lossy Storage Quality" msgstr "Yakala" #: scene/resources/texture.cpp -#, fuzzy msgid "From" -msgstr "Oynatma Modu:" +msgstr "Kimden" #: scene/resources/texture.cpp #, fuzzy @@ -27890,7 +27536,7 @@ msgstr "Deneme" #: scene/resources/world.cpp scene/resources/world_2d.cpp #, fuzzy msgid "Default Edge Connection Margin" -msgstr "BaÄŸlantıyı Düzenle:" +msgstr "Varsayılan Kenar BaÄŸlantı Marjı" #: scene/resources/world_2d.cpp msgid "Canvas" @@ -28076,7 +27722,7 @@ msgstr "" #: servers/audio/effects/audio_effect_spectrum_analyzer.cpp #, fuzzy msgid "FFT Size" -msgstr "Boyut:" +msgstr "FFT Boyutu" #: servers/audio/effects/audio_effect_reverb.cpp msgid "Predelay" @@ -28104,9 +27750,8 @@ msgid "Pan Pullout" msgstr "" #: servers/audio/effects/audio_effect_stereo_enhance.cpp -#, fuzzy msgid "Time Pullout (ms)" -msgstr "Zaman aşımı." +msgstr "Zaman Çıkışı (ms)" #: servers/audio/effects/audio_effect_stereo_enhance.cpp msgid "Surround" @@ -28292,9 +27937,8 @@ msgid "Constants cannot be modified." msgstr "Sabit deÄŸerler deÄŸiÅŸtirilemez." #: servers/visual/visual_server_scene.cpp -#, fuzzy msgid "Spatial Partitioning" -msgstr "Bölümleniyor..." +msgstr "Uzaysal Ayırma" #: servers/visual_server.cpp #, fuzzy @@ -28458,7 +28102,7 @@ msgstr "Ara DeÄŸerleme Kipi" #: servers/visual_server.cpp #, fuzzy msgid "OpenGL" -msgstr "Aç" +msgstr "OpenGL" #: servers/visual_server.cpp msgid "Batching Send Null" @@ -28467,7 +28111,7 @@ msgstr "" #: servers/visual_server.cpp #, fuzzy msgid "Batching Stream" -msgstr "Tümden Yeniden Adlandır" +msgstr "Yığınlama Akışı" #: servers/visual_server.cpp msgid "Legacy Orphan Buffers" @@ -28482,13 +28126,14 @@ msgid "Batching" msgstr "Yığınlama" #: servers/visual_server.cpp +#, fuzzy msgid "Use Batching" -msgstr "" +msgstr "Yığınlama Kullan" #: servers/visual_server.cpp #, fuzzy msgid "Use Batching In Editor" -msgstr "Editörün güncellenmesi" +msgstr "Editörde Yığınlama Kullan" #: servers/visual_server.cpp msgid "Single Rect Fallback" @@ -28507,13 +28152,13 @@ msgid "Scissor Area Threshold" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Max Join Items" -msgstr "Öğeleri Yönet..." +msgstr "Maksimum BirleÅŸen Maddeler" #: servers/visual_server.cpp +#, fuzzy msgid "Batch Buffer Size" -msgstr "" +msgstr "Yığınlama Arabellek Boyutu" #: servers/visual_server.cpp msgid "Item Reordering Lookahead" @@ -28526,7 +28171,7 @@ msgstr "" #: servers/visual_server.cpp #, fuzzy msgid "Diagnose Frame" -msgstr "Çerçeveyi Yapıştır" +msgstr "Kareyi Tespit Et" #: servers/visual_server.cpp msgid "GLES2" @@ -28586,7 +28231,7 @@ msgstr "Emilme Ayırmayı Görüntüle" #: servers/visual_server.cpp msgid "Max Active Spheres" -msgstr "Maks. Aktif Küre Sayısı" +msgstr "Maksimum Aktif Küre Sayısı" #: servers/visual_server.cpp msgid "Max Active Polygons" @@ -28598,8 +28243,9 @@ msgid "Shader Compilation Mode" msgstr "Ara DeÄŸerleme Kipi" #: servers/visual_server.cpp +#, fuzzy msgid "Max Simultaneous Compiles" -msgstr "" +msgstr "Maksimum EÅŸzamanlı Derleme" #: servers/visual_server.cpp msgid "Log Active Async Compiles Count" diff --git a/editor/translations/uk.po b/editor/translations/uk.po index d87aa168d7..07cfe5b6b1 100644 --- a/editor/translations/uk.po +++ b/editor/translations/uk.po @@ -11,7 +11,7 @@ # ОлекÑандр Пилипчук <pilipchukap@rambler.ru>, 2018. # Kirill Omelchenko <kirill.omelchenko@gmail.com>, 2018. # ÐлекÑандр <ol-vin@mail.ru>, 2018. -# Богдан Матвіїв <bomtvv@gmail.com>, 2019. +# Богдан Матвіїв <bomtvv@gmail.com>, 2019, 2022. # Tymofij Lytvynenko <till.svit@gmail.com>, 2020, 2021. # Vladislav Glinsky <cl0ne@mithril.org.ua>, 2020. # Микола Тимошенко <9081@ukr.net>, 2020. @@ -24,13 +24,14 @@ # Гліб Соколов <ramithes@i.ua>, 2022. # Max Donchenko <maxx.donchenko@gmail.com>, 2022. # Artem <artem@molotov.work>, 2022. +# Teashrock <kajitsu22@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Ukrainian (Godot Engine)\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-26 01:55+0000\n" -"Last-Translator: Artem <artem@molotov.work>\n" +"PO-Revision-Date: 2022-09-27 21:37+0000\n" +"Last-Translator: Teashrock <kajitsu22@gmail.com>\n" "Language-Team: Ukrainian <https://hosted.weblate.org/projects/godot-engine/" "godot/uk/>\n" "Language: uk\n" @@ -39,7 +40,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -412,9 +413,8 @@ msgid "Command" msgstr "Команда" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" -msgstr " (фізичний)" +msgstr "Фізичний" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp @@ -467,9 +467,8 @@ msgid "Pressure" msgstr "ТиÑк" #: core/os/input_event.cpp -#, fuzzy msgid "Pen Inverted" -msgstr "Інвертувати" +msgstr "Перо перевернуте" #: core/os/input_event.cpp msgid "Relative" @@ -2757,9 +2756,8 @@ msgid "Project export for platform:" msgstr "ЕкÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ Ð´Ð»Ñ Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼Ð¸:" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with warnings." -msgstr "Завершено з помилками." +msgstr "Завершено з попередженнÑми." #: editor/editor_export.cpp msgid "Completed successfully." @@ -4492,6 +4490,7 @@ msgstr "Різні проєктні або Ñценографічні інÑтр #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Проєкт" @@ -4635,7 +4634,7 @@ msgid "" msgstr "" "Якщо цей параметр увімкнено, будь-Ñкі зміни, внеÑені у Ñцену в редакторі, " "будуть відтворені у запущеному проєкті.\n" -"При віддаленому викориÑтанні на приÑтрої, це більш ефективно з мережевою " +"При віддаленому викориÑтанні на приÑтрої, це ефективніше з мережевою " "файловою ÑиÑтемою." #: editor/editor_node.cpp @@ -4651,7 +4650,7 @@ msgid "" msgstr "" "Якщо цей параметр увімкнено, будь-Ñкий Ñкрипт, Ñкий буде збережено, буде " "перезавантажено у запущеному проєкті.\n" -"При віддаленому викориÑтанні на приÑтрої, це більш ефективно з мережевою " +"При віддаленому викориÑтанні на приÑтрої, це ефективніше з мережевою " "файловою ÑиÑтемою." #: editor/editor_node.cpp @@ -5499,11 +5498,11 @@ msgstr "Додаткові кнопки миші Ð´Ð»Ñ Ð½Ð°Ð²Ñ–Ð³Ð°Ñ†Ñ–Ñ— Ð¶ÑƒÑ #: editor/editor_settings.cpp #, fuzzy msgid "Drag And Drop Selection" -msgstr "Вибір GridMap" +msgstr "ПеретÑгніть виділене" #: editor/editor_settings.cpp msgid "Stay In Script Editor On Node Selected" -msgstr "" +msgstr "ЗалишитиÑÑ Ð² редакторі Ñкриптів на вибраному вузлі" #: editor/editor_settings.cpp msgid "Appearance" @@ -6377,7 +6376,7 @@ msgstr "Поточна верÑÑ–Ñ:" #: editor/export_template_manager.cpp msgid "Export templates are missing. Download them or install from a file." msgstr "" -"Ðе виÑтачає шаблонів екÑпортуваннÑ. Отримайте Ñ—Ñ… або вÑтановіть з файла." +"Ðе виÑтачає шаблонів екÑпортуваннÑ. Отримайте Ñ—Ñ… або вÑтановіть із файлу." #: editor/export_template_manager.cpp msgid "Export templates are installed and ready to be used." @@ -7269,7 +7268,8 @@ msgid "8 Bit" msgstr "8-бітова" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "Моно" @@ -9366,7 +9366,7 @@ msgstr "ПлаÑкий 0" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat 1" -msgstr "Площина 1" +msgstr "ПлоÑкий 1" #: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp msgid "Ease In" @@ -11618,9 +11618,8 @@ msgid "New Animation" msgstr "Ðова анімаціÑ" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Filter animations" -msgstr "Фільтрувати методи" +msgstr "Фільтрувати анімації" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed:" @@ -14159,7 +14158,7 @@ msgstr "ЕкÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ" #: editor/project_export.cpp msgid "Manage Export Templates" -msgstr "Ð£Ð¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð°Ð¼Ð¸ екÑпорту" +msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð°Ð¼Ð¸ екÑпорту" #: editor/project_export.cpp msgid "Export With Debug" @@ -15189,7 +15188,7 @@ msgstr "Вилучити вузол «%s»?" msgid "" "Saving the branch as a scene requires having a scene open in the editor." msgstr "" -"Щоб можна було зберегти гілку Ñк Ñцену, Ñцену має бути відкрито у редакторі." +"Щоб можна було зберегти гілку Ñк Ñцену, Ñцена має бути відкрита у редакторі." #: editor/scene_tree_dock.cpp msgid "" @@ -15270,16 +15269,18 @@ msgstr "" msgid "Make Local" msgstr "Зробити локальним" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "Цю унікальну назву у Ñцені вже викориÑтано іншим вузлом." - #: editor/scene_tree_dock.cpp -msgid "Enable Scene Unique Name" +#, fuzzy +msgid "Enable Scene Unique Name(s)" msgstr "Увімкнути унікальну назву Ñцени" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Disable Scene Unique Name" +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "Цю унікальну назву у Ñцені вже викориÑтано іншим вузлом:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Вимкнути унікальна назва Ñцени" #: editor/scene_tree_dock.cpp @@ -15480,6 +15481,10 @@ msgid "Button Group" msgstr "Група кнопок" #: editor/scene_tree_editor.cpp +msgid "Disable Scene Unique Name" +msgstr "Вимкнути унікальна назва Ñцени" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Джерело з'єднаннÑ)" @@ -15558,6 +15563,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "Ðекоректна назва вузла. Ðе можна викориÑтовувати такі Ñимволи:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "Цю унікальну назву у Ñцені вже викориÑтано іншим вузлом." + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Перейменувати вузол" @@ -16837,12 +16846,14 @@ msgid "Sparse Indices Component Type" msgstr "Тип компонентів індекÑів розÑіюваннÑ" #: modules/gltf/gltf_accessor.cpp +#, fuzzy msgid "Sparse Values Buffer View" -msgstr "" +msgstr "Буферне Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ñ€Ð¾Ð·Ñ€Ñ–Ð´Ð¶ÐµÐ½Ð¸Ñ… значень" #: modules/gltf/gltf_accessor.cpp +#, fuzzy msgid "Sparse Values Byte Offset" -msgstr "" +msgstr "Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð±Ð°Ð¹Ñ‚Ñ–Ð² розріджених значень" #: modules/gltf/gltf_buffer_view.cpp msgid "Buffer" @@ -16854,7 +16865,7 @@ msgstr "Байтова довжина" #: modules/gltf/gltf_buffer_view.cpp msgid "Byte Stride" -msgstr "" +msgstr "Байтовий крок" #: modules/gltf/gltf_buffer_view.cpp msgid "Indices" @@ -16954,7 +16965,7 @@ msgstr "Початок з'єднаннÑ" #: modules/gltf/gltf_skin.cpp msgid "Inverse Binds" -msgstr "" +msgstr "Зворотні зв'Ñзки" #: modules/gltf/gltf_skin.cpp msgid "Non Joints" @@ -17340,6 +17351,21 @@ msgstr "Зібрати рішеннÑ" msgid "Auto Update Project" msgstr "Проєкт без назви" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Показана назва" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Виберіть каталог" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Виберіть каталог" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Кінець траÑÑƒÐ²Ð°Ð½Ð½Ñ Ñтека Ð´Ð»Ñ Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ виключеннÑ" @@ -18742,10 +18768,8 @@ msgid "" "'apksigner' could not be found. Please check that the command is available " "in the Android SDK build-tools directory. The resulting %s is unsigned." msgstr "" -"Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ «apksigner».\n" -"Будь лаÑка, перевірте, чи Ñ” програма доÑтупною у каталозі build-tools набору " -"заÑобів Ð´Ð»Ñ Ñ€Ð¾Ð·Ñ€Ð¾Ð±ÐºÐ¸ Android.\n" -"Отриманий у результаті %s не підпиÑано." +"Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ «apksigner». Будь лаÑка, перевірте, чи Ñ” команда доÑтупною " +"у каталозі build-tools Android SDK. Отриманий результат %s не підпиÑано." #: platform/android/export/export_plugin.cpp msgid "Signing debug %s..." @@ -18762,7 +18786,7 @@ msgstr "Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ Ñховище ключів. Ðемож #: platform/android/export/export_plugin.cpp #, fuzzy msgid "Could not start apksigner executable." -msgstr "Ðе вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити підпроцеÑ!" +msgstr "Ðе вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити виконуваний файл apksigner." #: platform/android/export/export_plugin.cpp msgid "'apksigner' returned with error #%d" @@ -18796,9 +18820,8 @@ msgstr "" "Ðекоректна назва файла! Пакунок Android APK повинен мати ÑÑƒÑ„Ñ–ÐºÑ Ð½Ð°Ð·Ð²Ð¸ *.apk." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Unsupported export format!" -msgstr "Ðепідтримуваний формат екÑпортуваннÑ!\n" +msgstr "Ðепідтримуваний формат екÑпортуваннÑ!" #: platform/android/export/export_plugin.cpp msgid "" @@ -18810,28 +18833,24 @@ msgstr "" "допомогою меню «Проєкт»." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" -"ÐевідповідніÑть верÑÑ–Ñ Ð´Ð»Ñ Ð·Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð´Ð»Ñ Android:\n" -" Ð’Ñтановлений шаблон: %s\n" -" ВерÑÑ–Ñ Godot: %s\n" -"Будь лаÑка, повторно вÑтановіть шаблон Ð´Ð»Ñ Ð·Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð´Ð»Ñ Android за допомогою " -"меню «Проєкт»." +"ÐевідповідніÑть верÑÑ–Ñ Ð´Ð»Ñ Ð·Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´ Android: Ð’Ñтановлений шаблон: %s, " +"ВерÑÑ–Ñ Godot: %s. Будь лаÑка, повторно вÑтановіть шаблон Ð´Ð»Ñ Ð·Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´ " +"Android за допомогою меню «Проєкт»." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Unable to overwrite res://android/build/res/*.xml files with project name." msgstr "" -"Ðе вдалоÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñати файли res://android/build/res/*.xml із назвою проєкту" +"Ðе вдалоÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñати файли res://android/build/res/*.xml із назвою " +"проєкту." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files to gradle project." -msgstr "Ðе вдалоÑÑ ÐµÐºÑпортувати файли проєкту до проєкту gradle\n" +msgstr "Ðе вдалоÑÑ ÐµÐºÑпортувати файли проєкту до проєкту gradle." #: platform/android/export/export_plugin.cpp msgid "Could not write expansion package file!" @@ -18842,15 +18861,13 @@ msgid "Building Android Project (gradle)" msgstr "Ð—Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ Android (gradle)" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Building of Android project failed, check output for the error. " "Alternatively visit docs.godotengine.org for Android build documentation." msgstr "" -"Ðе вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ Ð·Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ Android. ОзнайомтеÑÑ Ñ–Ð· виведеними " -"даними, щоб визначити причину помилки.\n" -"Крім того, можете відвідати docs.godotengine.org Ñ– ознайомитиÑÑ Ñ–Ð· " -"документацією щодо Ð·Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð´Ð»Ñ Android." +"Ðе вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ Ð·Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ Ð´Ð»Ñ Android. ОзнайомтеÑÑ Ñ–Ð· виведеними " +"даними, щоб визначити причину помилки. Крім того, можете відвідати docs." +"godotengine.org Ñ– ознайомитиÑÑ Ñ–Ð· документацією щодо Ð·Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð´Ð»Ñ Android." #: platform/android/export/export_plugin.cpp msgid "Moving output" @@ -18865,29 +18882,24 @@ msgstr "" "дані можна знайти у каталозі проєкту gradle." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Package not found: \"%s\"." -msgstr "Пакунок не знайдено: %s" +msgstr "Пакунок не знайдено: \"%s\"." #: platform/android/export/export_plugin.cpp msgid "Creating APK..." msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ APK…" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not find template APK to export: \"%s\"." -msgstr "" -"Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ шаблон APK Ð´Ð»Ñ ÐµÐºÑпортуваннÑ:\n" -"%s" +msgstr "Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ шаблон APK Ð´Ð»Ñ ÐµÐºÑпортуваннÑ: %s." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Missing libraries in the export template for the selected architectures: %s. " "Please build a template with all required libraries, or uncheck the missing " "architectures in the export preset." msgstr "" -"Ðе виÑтачає бібліотек у шаблоні екÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð²Ð¸Ð±Ñ€Ð°Ð½Ð¸Ñ… архітектур: %s.\n" +"Ðе виÑтачає бібліотек у шаблоні екÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð²Ð¸Ð±Ñ€Ð°Ð½Ð¸Ñ… архітектур: %s. " "Будь лаÑка, Ñтворіть шаблон з уÑіма необхідними бібліотеками або зніміть " "позначку з архітектур із пропущеними бібліотеками у Ñтилі екÑпортуваннÑ." @@ -18896,9 +18908,8 @@ msgid "Adding files..." msgstr "Ð”Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð²â€¦" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files." -msgstr "Ðе вдалоÑÑ ÐµÐºÑпортувати файли проєкту" +msgstr "Ðе вдалоÑÑ ÐµÐºÑпортувати файли проєкту." #: platform/android/export/export_plugin.cpp msgid "Aligning APK..." @@ -19132,6 +19143,11 @@ msgstr "Ðетиповий колір тла" msgid "Custom BG Color" msgstr "Ðетиповий колір тла" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "ЕкÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ–ÐºÑ‚Ð¾Ð³Ñ€Ð°Ð¼Ð¸" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -19165,19 +19181,16 @@ msgid "Run exported HTML in the system's default browser." msgstr "Виконати екÑпортований HTML у браузері за умовчаннÑм ÑиÑтеми." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not open template for export: \"%s\"." -msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ шаблон Ð´Ð»Ñ ÐµÐºÑпорту:" +msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ шаблон Ð´Ð»Ñ ÐµÐºÑпорту: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Invalid export template: \"%s\"." -msgstr "Ðеправильний шаблон екÑпорту:" +msgstr "Ðеправильний шаблон екÑпорту: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not write file: \"%s\"." -msgstr "Ðе вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати файл:" +msgstr "Ðе вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати файл: \"%s\"." #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #, fuzzy @@ -19185,9 +19198,8 @@ msgid "Icon Creation" msgstr "Поле піктограми" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read file: \"%s\"." -msgstr "Ðе вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл:" +msgstr "Ðе вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл: \"%s\"." #: platform/javascript/export/export.cpp msgid "PWA" @@ -19262,19 +19274,17 @@ msgid "Icon 512 X 512" msgstr "Піктограма 512⨯12" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read HTML shell: \"%s\"." -msgstr "Ðе вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ оболонку HTML:" +msgstr "Ðе вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ оболонку HTML: \"%s\"." #: platform/javascript/export/export.cpp #, fuzzy msgid "Could not create HTTP server directory: %s." -msgstr "Ðе вдалоÑÑ Ñтворити каталог на Ñервері HTTP:" +msgstr "Ðе вдалоÑÑ Ñтворити каталог Ð´Ð»Ñ Ñервера HTTP: %s." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Error starting HTTP server: %d." -msgstr "Помилка під Ñ‡Ð°Ñ Ñпроби запуÑку Ñервера HTTP:" +msgstr "Помилка під Ñ‡Ð°Ñ Ñпроби запуÑку Ñервера HTTP: %d." #: platform/javascript/export/export.cpp msgid "Web" @@ -19540,17 +19550,17 @@ msgstr "" #: platform/osx/export/export.cpp #, fuzzy msgid "Could not open icon file \"%s\"." -msgstr "Ðе вдалоÑÑ ÐµÐºÑпортувати файли проєкту" +msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл іконки \"%s\"." #: platform/osx/export/export.cpp #, fuzzy msgid "Could not start xcrun executable." -msgstr "Ðе вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити підпроцеÑ!" +msgstr "Ðе вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити виконуваний файл xcrun." #: platform/osx/export/export.cpp #, fuzzy msgid "Notarization failed." -msgstr "ЗаÑвідченнÑ" +msgstr "Ðотаріальне заÑÐ²Ñ–Ð´Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ відбулоÑÑ." #: platform/osx/export/export.cpp msgid "Notarization request UUID: \"%s\"" @@ -19615,9 +19625,8 @@ msgid "No identity found." msgstr "Ðе знайдено профілю." #: platform/osx/export/export.cpp -#, fuzzy msgid "Cannot sign file %s." -msgstr "Помилка під Ñ‡Ð°Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð°: %s" +msgstr "Ðе вдаєтьÑÑ Ð¿Ñ–Ð´Ð¿Ð¸Ñати файл %s." #: platform/osx/export/export.cpp #, fuzzy @@ -19634,7 +19643,7 @@ msgstr "ÐапрÑмок" #: platform/osx/export/export.cpp #, fuzzy msgid "Could not start hdiutil executable." -msgstr "Ðе вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити підпроцеÑ!" +msgstr "Ðе вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити виконуваний файл hdiutil." #: platform/osx/export/export.cpp msgid "`hdiutil create` failed - file exists." @@ -19649,14 +19658,12 @@ msgid "Creating app bundle" msgstr "Створюємо комплект програми" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not find template app to export: \"%s\"." -msgstr "Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ програму-шаблон Ð´Ð»Ñ ÐµÐºÑпортуваннÑ:" +msgstr "Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ шаблон програми Ð´Ð»Ñ ÐµÐºÑпортуваннÑ: \"%s\"." #: platform/osx/export/export.cpp -#, fuzzy msgid "Invalid export format." -msgstr "Ðеправильний шаблон екÑпорту:" +msgstr "Ðеправильний формат екÑпорту." #: platform/osx/export/export.cpp msgid "" @@ -19723,7 +19730,7 @@ msgstr "ПроєкціÑ" #: platform/osx/export/export.cpp #, fuzzy msgid "Could not open file to read from path \"%s\"." -msgstr "Ðе вдалоÑÑ ÐµÐºÑпортувати файли проєкту до проєкту gradle\n" +msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð· шлÑху \"%s\"." #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" @@ -19984,6 +19991,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Ðекоректна Ñкорочена назва пакунка." @@ -20062,9 +20075,8 @@ msgid "Debug Algorithm" msgstr "Ðлгоритм діагноÑтики" #: platform/windows/export/export.cpp -#, fuzzy msgid "Failed to rename temporary file \"%s\"." -msgstr "Ðе вдалоÑÑ Ð²Ð¸Ð»ÑƒÑ‡Ð¸Ñ‚Ð¸ тимчаÑовий файл:" +msgstr "Ðе вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ñ‚Ð¸ тимчаÑовий файл \"%s\"." #: platform/windows/export/export.cpp msgid "Identity Type" @@ -20150,7 +20162,7 @@ msgstr "Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ Ñховище ключів. Ðемож #: platform/windows/export/export.cpp #, fuzzy msgid "Invalid identity type." -msgstr "Тип профілю" +msgstr "Ðевірний тип профілю." #: platform/windows/export/export.cpp #, fuzzy @@ -20174,9 +20186,8 @@ msgid "Signtool failed to sign executable: %s." msgstr "Ðекоректний виконуваний файл." #: platform/windows/export/export.cpp -#, fuzzy msgid "Failed to remove temporary file \"%s\"." -msgstr "Ðе вдалоÑÑ Ð²Ð¸Ð»ÑƒÑ‡Ð¸Ñ‚Ð¸ тимчаÑовий файл:" +msgstr "Ðе вдалоÑÑ Ð²Ð¸Ð»ÑƒÑ‡Ð¸Ñ‚Ð¸ тимчаÑовий файл \"%s\"." #: platform/windows/export/export.cpp msgid "" @@ -20218,7 +20229,7 @@ msgstr "" #: platform/windows/export/export.cpp msgid "Windows" -msgstr "Вікна" +msgstr "Windows" #: platform/windows/export/export.cpp msgid "Rcedit" @@ -25748,7 +25759,7 @@ msgstr "7" #: scene/resources/environment.cpp msgid "Bloom" -msgstr "ЦвітіннÑ" +msgstr "СвітіннÑ" #: scene/resources/environment.cpp msgid "HDR Threshold" @@ -26086,7 +26097,7 @@ msgstr "" #: scene/resources/navigation_mesh.cpp #, fuzzy msgid "Sampling" -msgstr "МаÑштаб:" +msgstr "МаÑштаб" #: scene/resources/navigation_mesh.cpp #, fuzzy diff --git a/editor/translations/ur_PK.po b/editor/translations/ur_PK.po index a428250cc7..d09218a600 100644 --- a/editor/translations/ur_PK.po +++ b/editor/translations/ur_PK.po @@ -4449,6 +4449,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7232,7 +7233,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15193,18 +15195,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "ریموٹ " -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "ریموٹ " #: editor/scene_tree_dock.cpp @@ -15404,6 +15406,11 @@ msgstr "" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "ریموٹ " + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr ".تمام کا انتخاب" @@ -15468,6 +15475,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17334,6 +17345,20 @@ msgstr ".تمام کا انتخاب" msgid "Auto Update Project" msgstr ".تمام کا انتخاب" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "ایکشن منتقل کریں" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "سب سکریپشن بنائیں" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19109,6 +19134,11 @@ msgstr "ایکشن منتقل کریں" msgid "Custom BG Color" msgstr "ایکشن منتقل کریں" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr ".سپورٹ" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -19931,6 +19961,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/vi.po b/editor/translations/vi.po index 0a6885872f..2a0fadcf9f 100644 --- a/editor/translations/vi.po +++ b/editor/translations/vi.po @@ -21,13 +21,14 @@ # IoeCmcomc <hopdaigia2004@gmail.com>, 2021, 2022. # Hung <hungthitkhia@gmail.com>, 2021. # PaweÅ‚ Fertyk <pfertyk@pfertyk.me>, 2022. +# MInhTriet <luckyblockblack@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-05-10 13:14+0000\n" -"Last-Translator: PaweÅ‚ Fertyk <pfertyk@pfertyk.me>\n" +"PO-Revision-Date: 2022-08-17 18:20+0000\n" +"Last-Translator: MInhTriet <luckyblockblack@gmail.com>\n" "Language-Team: Vietnamese <https://hosted.weblate.org/projects/godot-engine/" "godot/vi/>\n" "Language: vi\n" @@ -35,44 +36,44 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.12.1\n" +"X-Generator: Weblate 4.14-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" -msgstr "" +msgstr "Trình Ä‘iá»u khiển mà n hình" #: core/bind/core_bind.cpp msgid "Clipboard" -msgstr "Bảng tạm" +msgstr "Bá»™ nhá»› tạm" #: core/bind/core_bind.cpp msgid "Current Screen" -msgstr "Mà n hình hiện tại" +msgstr "Mà n hình hiện có" #: core/bind/core_bind.cpp msgid "Exit Code" -msgstr "Mã thoát" +msgstr "Mã lá»—i" #: core/bind/core_bind.cpp msgid "V-Sync Enabled" -msgstr "Sá» dụng V-Sync" +msgstr "V-sync Enabled" #: core/bind/core_bind.cpp main/main.cpp msgid "V-Sync Via Compositor" -msgstr "" +msgstr "V-Sync thông qua Compositor" #: core/bind/core_bind.cpp main/main.cpp +#, fuzzy msgid "Delta Smoothing" -msgstr "Là m mượt delta" +msgstr "Delta smoothing" #: core/bind/core_bind.cpp -#, fuzzy msgid "Low Processor Usage Mode" -msgstr "Chế độ Di chuyển" +msgstr "Chế độ tiết kiệm cá»§a bá»™ vi xá» lý" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode Sleep (µsec)" -msgstr "" +msgstr "Chế độ tiết kiệm năng lượng bá»™ vi xá» lý (tÃnh bằng µsec)" #: core/bind/core_bind.cpp main/main.cpp platform/uwp/os_uwp.cpp msgid "Keep Screen On" @@ -80,11 +81,11 @@ msgstr "Giữ mà n hình mở" #: core/bind/core_bind.cpp msgid "Min Window Size" -msgstr "Cỡ cá»a sổ tối thiểu" +msgstr "KÃnh cỡ nhá» nhất cá»§a mà n hình" #: core/bind/core_bind.cpp msgid "Max Window Size" -msgstr "Cỡ cá»a sổ tối Ä‘a" +msgstr "KÃch cỡ tối Ä‘a cá»§a mà n hình" #: core/bind/core_bind.cpp msgid "Screen Orientation" @@ -97,11 +98,11 @@ msgstr "Cá»a sổ" #: core/bind/core_bind.cpp core/project_settings.cpp msgid "Borderless" -msgstr "Trà n viá»n" +msgstr "Không có viá»n cá»a sổ" #: core/bind/core_bind.cpp msgid "Per Pixel Transparency Enabled" -msgstr "Báºt độ trong suốt má»—i Ä‘iểm ảnh" +msgstr "Chế độ trong suốt từng pixel đã được báºt" #: core/bind/core_bind.cpp core/project_settings.cpp msgid "Fullscreen" @@ -109,11 +110,11 @@ msgstr "Toà n mà n hình" #: core/bind/core_bind.cpp msgid "Maximized" -msgstr "Äã cá»±c đại hoá" +msgstr "Äã phóng to" #: core/bind/core_bind.cpp msgid "Minimized" -msgstr "Äã cá»±c tiểu hoá" +msgstr "Äã thu nhá»" #: core/bind/core_bind.cpp core/project_settings.cpp scene/gui/dialogs.cpp #: scene/gui/graph_node.cpp @@ -142,7 +143,7 @@ msgstr "KÃch thước" #: core/bind/core_bind.cpp msgid "Endian Swap" -msgstr "" +msgstr "Hoán đổi endian" #: core/bind/core_bind.cpp msgid "Editor Hint" @@ -158,7 +159,7 @@ msgstr "Số lần lặp má»—i giây" #: core/bind/core_bind.cpp msgid "Target FPS" -msgstr "FPS mục tiêu:" +msgstr "FPS cần đạt tá»›i" #: core/bind/core_bind.cpp #, fuzzy @@ -4516,6 +4517,7 @@ msgstr "Dá»± án ngoà i lá» hoặc các công cụ toà n phân cảnh." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Dá»± Ãn" @@ -7393,7 +7395,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15491,18 +15494,19 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Tên Node:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "Tên đã được sá» dụng bởi func/var/signal khác:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Tên Node:" #: editor/scene_tree_dock.cpp @@ -15705,6 +15709,11 @@ msgstr "Thêm và o Nhóm" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Tên Node:" + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr "Kết nối bị lá»—i" @@ -15780,6 +15789,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "Tên nút không hợp lệ, các ký tá»± sau bị cấm:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Äổi tên nút" @@ -17713,6 +17726,21 @@ msgstr "Chá»n tất cả" msgid "Auto Update Project" msgstr "Dá»± án không tên" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Hiển thị tất cả" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Chá»n má»™t Thư mục" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Chá»n má»™t Thư mục" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19579,6 +19607,11 @@ msgstr "Cắt các nút" msgid "Custom BG Color" msgstr "Cắt các nút" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Mở rá»™ng Tất cả" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20436,6 +20469,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Gói có tên ngắn không hợp lệ." diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po index f25a372128..1aeaea7087 100644 --- a/editor/translations/zh_CN.po +++ b/editor/translations/zh_CN.po @@ -89,7 +89,7 @@ msgstr "" "Project-Id-Version: Chinese (Simplified) (Godot Engine)\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: 2018-01-20 12:15+0200\n" -"PO-Revision-Date: 2022-07-29 01:36+0000\n" +"PO-Revision-Date: 2022-09-22 15:26+0000\n" "Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hans/>\n" @@ -98,7 +98,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -2791,9 +2791,8 @@ msgid "Project export for platform:" msgstr "针对平å°å¯¼å‡ºé¡¹ç›®ï¼š" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with warnings." -msgstr "已完æˆï¼Œå˜åœ¨é”™è¯¯ã€‚" +msgstr "已完æˆï¼Œå˜åœ¨è¦å‘Šã€‚" #: editor/editor_export.cpp msgid "Completed successfully." @@ -4466,6 +4465,7 @@ msgstr "其他项目或全场景工具。" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "项目" @@ -7189,7 +7189,8 @@ msgid "8 Bit" msgstr "8 ä½" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "Mono" @@ -15020,16 +15021,16 @@ msgstr "" msgid "Make Local" msgstr "转为本地" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "该场景ä¸å·²æœ‰ä½¿ç”¨è¯¥å”¯ä¸€å称的节点。" - #: editor/scene_tree_dock.cpp -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "å¯ç”¨åœºæ™¯å”¯ä¸€åç§°" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Disable Scene Unique Name" +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "唯一å称已被该场景ä¸çš„其他节点使用:" + +#: editor/scene_tree_dock.cpp +msgid "Disable Scene Unique Name(s)" msgstr "ç¦ç”¨åœºæ™¯å”¯ä¸€åç§°" #: editor/scene_tree_dock.cpp @@ -15223,6 +15224,10 @@ msgid "Button Group" msgstr "按钮组" #: editor/scene_tree_editor.cpp +msgid "Disable Scene Unique Name" +msgstr "ç¦ç”¨åœºæ™¯å”¯ä¸€åç§°" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "ï¼ˆè¿žæŽ¥æ¥æºï¼‰" @@ -15300,6 +15305,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "节点åç§°æ— æ•ˆï¼Œä¸å…许包å«ä»¥ä¸‹å—符:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "该场景ä¸å·²æœ‰ä½¿ç”¨è¯¥å”¯ä¸€å称的节点。" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "é‡å‘½å节点" @@ -17073,6 +17082,18 @@ msgstr "构建解决方案" msgid "Auto Update Project" msgstr "自动更新项目" +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "程åºé›†åç§°" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "解决方案目录" + +#: modules/mono/godotsharp_dirs.cpp +msgid "C# Project Directory" +msgstr "C# 项目目录" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "å†…éƒ¨å¼‚å¸¸å †æ ˆè¿½æœ”ç»“æŸ" @@ -18773,6 +18794,10 @@ msgstr "使用自定义背景色" msgid "Custom BG Color" msgstr "自定义背景色" +#: platform/iphone/export/export.cpp +msgid "Export Icons" +msgstr "å¯¼å‡ºå›¾æ ‡" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19557,6 +19582,14 @@ msgid "Show Name On Square 310 X 310" msgstr "åœ¨æ£æ–¹å½¢ 310×310 上显示åç§°" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" +"Godot çš„ Mono ç‰ˆæœ¬ä¸æ”¯æŒ UWP å¹³å°ã€‚如果想è¦ä»¥ UWP ä¸ºç›®æ ‡ï¼Œè¯·ä½¿ç”¨æ ‡å‡†æž„å»ºï¼ˆä¸" +"æ”¯æŒ C#)。" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "æ— æ•ˆçš„åŒ…çŸå称。" @@ -19681,21 +19714,17 @@ msgid "Could not find wine executable at \"%s\"." msgstr "æ— æ³•åœ¨â€œ%sâ€æ‰¾åˆ° wine 坿‰§è¡Œæ–‡ä»¶ã€‚" #: platform/windows/export/export.cpp -#, fuzzy msgid "" "Could not start rcedit executable. Configure rcedit path in the Editor " "Settings (Export > Windows > Rcedit), or disable \"Application > Modify " "Resources\" in the export preset." msgstr "" -"æ— æ³•å¯åЍ rcedit 坿‰§è¡Œæ–‡ä»¶ï¼Œè¯·åœ¨ç¼–辑器设置ä¸é…ç½® rcedit 路径(导出 > Windows " -"> Rcedit)。" +"æ— æ³•å¯åЍ rcedit 坿‰§è¡Œæ–‡ä»¶ã€‚请在编辑器设置ä¸é…ç½® rcedit 路径(导出 > Windows " +"> Rcedit),或在导出预设ä¸ç¦ç”¨â€œåº”用 > 修改资æºâ€ã€‚" #: platform/windows/export/export.cpp -#, fuzzy msgid "rcedit failed to modify executable: %s." -msgstr "" -"rcedit ä¿®æ”¹å¯æ‰§è¡Œæ–‡ä»¶å¤±è´¥ï¼š\n" -"%s" +msgstr "rcedit ä¿®æ”¹å¯æ‰§è¡Œæ–‡ä»¶å¤±è´¥ï¼š%s。" #: platform/windows/export/export.cpp msgid "Could not find signtool executable at \"%s\"." @@ -19714,21 +19743,17 @@ msgid "Invalid timestamp server." msgstr "时间戳æœåŠ¡å™¨æ— æ•ˆã€‚" #: platform/windows/export/export.cpp -#, fuzzy msgid "" "Could not start signtool executable. Configure signtool path in the Editor " "Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " "export preset." msgstr "" -"æ— æ³•å¯åЍ signtool 坿‰§è¡Œæ–‡ä»¶ï¼Œè¯·åœ¨ç¼–辑器设置ä¸é…ç½® signtool 路径(导出 > " -"Windows > Signtool)。" +"æ— æ³•å¯åЍ signtool 坿‰§è¡Œæ–‡ä»¶ã€‚请在编辑器设置ä¸é…ç½® signtool 路径(导出 > " +"Windows > Signtool),或在导出预设ä¸ç¦ç”¨â€œä»£ç ç¾åâ€ã€‚" #: platform/windows/export/export.cpp -#, fuzzy msgid "Signtool failed to sign executable: %s." -msgstr "" -"Signtool ç¾å坿‰§è¡Œæ–‡ä»¶å¤±è´¥ï¼š\n" -"%s" +msgstr "Signtool ç¾å坿‰§è¡Œæ–‡ä»¶å¤±è´¥ï¼š%s。" #: platform/windows/export/export.cpp msgid "Failed to remove temporary file \"%s\"." @@ -20617,7 +20642,7 @@ msgid "" "instead." msgstr "" "“Navigation2Dâ€èŠ‚ç‚¹å’Œâ€œNavigation2D.get_simple_path()â€å·²åºŸå¼ƒï¼Œä¼šåœ¨å°†æ¥çš„版本ä¸" -"移除。请用“Navigation2DServer.map_get_path()â€æ›¿ä»£ã€‚" +"移除。 请用“Navigation2DServer.map_get_path()â€æ›¿ä»£ã€‚" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Pathfinding" @@ -21505,7 +21530,7 @@ msgstr "ConcavePolygonShape åªæ”¯æŒé™æ€æ¨¡å¼ä¸‹çš„ RigidBody。" #: scene/3d/cpu_particles.cpp msgid "Nothing is visible because no mesh has been assigned." -msgstr "æ— ç‰©å¯è§ï¼Œå› ä¸ºæ²¡æœ‰æŒ‡å®šç½‘æ ¼ã€‚" +msgstr "æœªæŒ‡å®šç½‘æ ¼ï¼Œæ— å¯è§å†…容。" #: scene/3d/cpu_particles.cpp msgid "" @@ -21758,7 +21783,7 @@ msgid "" "instead." msgstr "" "“Navigationâ€èŠ‚ç‚¹å’Œâ€œNavigation.get_simple_path()â€å·²åºŸå¼ƒï¼Œä¼šåœ¨å°†æ¥çš„版本ä¸ç§»" -"除。请用“NavigationServer.map_get_path()â€æ›¿ä»£ã€‚" +"除。 请用“NavigationServer.map_get_path()â€æ›¿ä»£ã€‚" #: scene/3d/navigation.cpp scene/resources/curve.cpp msgid "Up Vector" @@ -23470,7 +23495,7 @@ msgstr "最å°å€¼" #: scene/gui/range.cpp scene/resources/curve.cpp msgid "Max Value" -msgstr "最大之" +msgstr "最大值" #: scene/gui/range.cpp msgid "Page" @@ -23486,11 +23511,11 @@ msgstr "èˆå…¥" #: scene/gui/range.cpp msgid "Allow Greater" -msgstr "å…许更多" +msgstr "å…许更大" #: scene/gui/range.cpp msgid "Allow Lesser" -msgstr "å…许更少" +msgstr "å…许更å°" #: scene/gui/reference_rect.cpp msgid "Border Color" @@ -24197,7 +24222,7 @@ msgstr "自定义" #: scene/register_scene_types.cpp msgid "Custom Font" -msgstr "自定å—体" +msgstr "自定义å—体" #: scene/resources/audio_stream_sample.cpp #: servers/audio/effects/audio_stream_generator.cpp servers/audio_server.cpp @@ -25296,11 +25321,11 @@ msgstr "公告æ¿ä¿æŒç¼©æ”¾" #: scene/resources/material.cpp msgid "Grow" -msgstr "å‘å…‰" +msgstr "生长" #: scene/resources/material.cpp msgid "Grow Amount" -msgstr "å‘å…‰é‡" +msgstr "生长é‡" #: scene/resources/material.cpp msgid "Use Alpha Scissor" diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po index 79760d0de7..f8529ea3ca 100644 --- a/editor/translations/zh_HK.po +++ b/editor/translations/zh_HK.po @@ -4,13 +4,14 @@ # This file is distributed under the same license as the Godot source code. # Wesley (zx-wt) <ZX_WT@ymail.com>, 2016-2017, 2020. # cnieFIT <dtotncq@gmail.com>, 2019. +# Peppa Pig <hansongming88@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-05-01 11:43+0000\n" -"Last-Translator: zx-wt <ZX_WT@ymail.com>\n" +"PO-Revision-Date: 2022-08-23 03:39+0000\n" +"Last-Translator: Peppa Pig <hansongming88@gmail.com>\n" "Language-Team: Chinese (Traditional, Hong Kong) <https://hosted.weblate.org/" "projects/godot-engine/godot/zh_Hant_HK/>\n" "Language: zh_HK\n" @@ -18,7 +19,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.0.2\n" +"X-Generator: Weblate 4.14-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -36,7 +37,7 @@ msgstr "未儲å˜ç•¶å‰å ´æ™¯ã€‚ä»è¦é–‹å•Ÿï¼Ÿ" #: core/bind/core_bind.cpp msgid "Exit Code" -msgstr "" +msgstr "退出ç " #: core/bind/core_bind.cpp #, fuzzy @@ -4660,6 +4661,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "專案" @@ -7583,7 +7585,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15840,18 +15843,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Nodeå稱" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Nodeå稱" #: editor/scene_tree_dock.cpp @@ -16061,6 +16064,11 @@ msgstr "按éµ" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Nodeå稱" + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr "連到..." @@ -16125,6 +16133,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -18052,6 +18064,21 @@ msgstr "所有é¸é …" msgid "Auto Update Project" msgstr "專案" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "全部å–代" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "鏿“‡è³‡æ–™å¤¾" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "鏿“‡è³‡æ–™å¤¾" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19877,6 +19904,11 @@ msgstr "貼上" msgid "Custom BG Color" msgstr "貼上" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "全部展開" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20725,6 +20757,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "無效å稱" diff --git a/editor/translations/zh_TW.po b/editor/translations/zh_TW.po index 8ad86d4b2a..4cd08539e4 100644 --- a/editor/translations/zh_TW.po +++ b/editor/translations/zh_TW.po @@ -36,13 +36,15 @@ # è˜è˜ <rrt467778@gmail.com>, 2022. # marktwtn <marktwtn@gmail.com>, 2022. # Shi-Xun Hong <jimmy3421@gmail.com>, 2022. +# Hugel <qihu@nfschina.com>, 2022. +# nitenook <admin@alterbaum.net>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-31 18:34+0000\n" -"Last-Translator: BinotaLIU <me@binota.org>\n" +"PO-Revision-Date: 2022-09-27 21:37+0000\n" +"Last-Translator: nitenook <admin@alterbaum.net>\n" "Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hant/>\n" "Language: zh_TW\n" @@ -50,7 +52,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -2743,9 +2745,8 @@ msgid "Project export for platform:" msgstr "專案匯出平å°ï¼š" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with warnings." -msgstr "已完æˆï¼Œå˜åœ¨éŒ¯èª¤ã€‚" +msgstr "完æˆä¸¦å¸¶æœ‰è¦å‘Šã€‚" #: editor/editor_export.cpp msgid "Completed successfully." @@ -4147,7 +4148,7 @@ msgstr "刪除é…ç½®" #: editor/editor_node.cpp editor/import_dock.cpp #: editor/script_create_dialog.cpp msgid "Default" -msgstr "é è¨" +msgstr "默èª" #: editor/editor_node.cpp editor/editor_resource_picker.cpp #: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp @@ -4420,6 +4421,7 @@ msgstr "å…¶ä»–å°ˆæ¡ˆæˆ–å…¨å ´æ™¯å…±é€šå·¥å…·ã€‚" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "專案" @@ -7142,7 +7144,8 @@ msgid "8 Bit" msgstr "8ä½å…ƒçµ„" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "Mono" @@ -10677,6 +10680,7 @@ msgid "Create Rest Pose from Bones" msgstr "è‡ªéª¨éª¼å»ºç«‹éœæ¢å§¿å‹¢" #: editor/plugins/skeleton_2d_editor_plugin.cpp +#, fuzzy msgid "Skeleton2D" msgstr "Sekeleton2D" @@ -14973,16 +14977,19 @@ msgstr "" msgid "Make Local" msgstr "轉為本地" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "å¦ä¸€å€‹ç¯€é»žå·²åœ¨è©²å ´æ™¯ä¸ä½¿ç”¨äº†é€™å€‹ä¸å¯é‡è¤‡çš„å稱。" - #: editor/scene_tree_dock.cpp -msgid "Enable Scene Unique Name" +#, fuzzy +msgid "Enable Scene Unique Name(s)" msgstr "å•Ÿç”¨å ´æ™¯ç¨ç«‹å稱" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Disable Scene Unique Name" +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Unique names already used by another node in the scene:" +msgstr "å¦ä¸€å€‹ç¯€é»žå·²åœ¨è©²å ´æ™¯ä¸ä½¿ç”¨äº†é€™å€‹ä¸å¯é‡è¤‡çš„å稱。" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "åœç”¨å ´æ™¯ç¨ç«‹å稱" #: editor/scene_tree_dock.cpp @@ -15176,6 +15183,10 @@ msgid "Button Group" msgstr "按éµåˆ†çµ„" #: editor/scene_tree_editor.cpp +msgid "Disable Scene Unique Name" +msgstr "åœç”¨å ´æ™¯ç¨ç«‹å稱" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(連接自)" @@ -15253,6 +15264,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "無效的節點å稱,å稱ä¸å¯åŒ…å«ä¸‹åˆ—å—元:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "å¦ä¸€å€‹ç¯€é»žå·²åœ¨è©²å ´æ™¯ä¸ä½¿ç”¨äº†é€™å€‹ä¸å¯é‡è¤‡çš„å稱。" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "釿–°å‘½å節點" @@ -15669,47 +15684,44 @@ msgid "Navigation Edge Disabled" msgstr "å·²ç¦ç”¨å°Žèˆªé‚Šç•Œ" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Navigation Solid" -msgstr "導航模å¼" +msgstr "導航實體" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Navigation Solid Disabled" -msgstr "導航模å¼" +msgstr "åœç”¨å°Žèˆªå¯¦é«”" #: editor/spatial_editor_gizmos.cpp msgid "Joint Body A" -msgstr "" +msgstr "關節形體A" #: editor/spatial_editor_gizmos.cpp msgid "Joint Body B" -msgstr "" +msgstr "關節形體B" #: editor/spatial_editor_gizmos.cpp msgid "Room Edge" -msgstr "" +msgstr "空間邊緣" #: editor/spatial_editor_gizmos.cpp msgid "Room Overlap" -msgstr "" +msgstr "空間é‡ç–Š" #: editor/spatial_editor_gizmos.cpp msgid "Set Room Point Position" msgstr "è¨å®šç©ºé–“控制點ä½ç½®" #: editor/spatial_editor_gizmos.cpp scene/3d/portal.cpp -#, fuzzy msgid "Portal Margin" -msgstr "è¨å®šå¤–邊è·" +msgstr "å…¥å£é‚Šè·" #: editor/spatial_editor_gizmos.cpp msgid "Portal Edge" -msgstr "" +msgstr "å…¥å£é‚Šç·£" #: editor/spatial_editor_gizmos.cpp msgid "Portal Arrow" -msgstr "" +msgstr "å…¥å£ç®é " #: editor/spatial_editor_gizmos.cpp msgid "Set Portal Point Position" @@ -15717,18 +15729,16 @@ msgstr "è¨å®šå…¥å£æŽ§åˆ¶é»žä½ç½®" #: editor/spatial_editor_gizmos.cpp msgid "Portal Front" -msgstr "" +msgstr "入壿£é¢" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Portal Back" -msgstr "上一é " +msgstr "å…¥å£èƒŒé¢" #: editor/spatial_editor_gizmos.cpp scene/2d/light_occluder_2d.cpp #: scene/2d/tile_map.cpp -#, fuzzy msgid "Occluder" -msgstr "鮿“‹æ¨¡å¼" +msgstr "鮿“‹å™¨" #: editor/spatial_editor_gizmos.cpp msgid "Set Occluder Sphere Radius" @@ -15739,109 +15749,98 @@ msgid "Set Occluder Sphere Position" msgstr "è¨å®šé®æ“‹çƒé«”ä½ç½®" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Polygon Point Position" -msgstr "è¨å®šå…¥å£æŽ§åˆ¶é»žä½ç½®" +msgstr "è¨å®šé®æ“‹å™¨å¤šé‚Šå½¢é ‚點ä½ç½®" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Hole Point Position" -msgstr "è¨å®šæ›²ç·šæŽ§åˆ¶é»žä½ç½®" +msgstr "è¨å®šé®æ“‹å™¨ç©ºæ´žé ‚點ä½ç½®" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Occluder Polygon Front" -msgstr "建立é®å…‰å¤šé‚Šå½¢" +msgstr "鮿“‹å™¨å¤šé‚Šå½¢æ£é¢" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Occluder Polygon Back" -msgstr "建立é®å…‰å¤šé‚Šå½¢" +msgstr "鮿“‹å™¨å¤šé‚Šå½¢èƒŒé¢" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Occluder Hole" -msgstr "建立é®å…‰å¤šé‚Šå½¢" +msgstr "鮿“‹å™¨ç©ºæ´ž" #: main/main.cpp msgid "Godot Physics" -msgstr "" +msgstr "Godot 物ç†" #: main/main.cpp servers/physics_2d/physics_2d_server_sw.cpp #: servers/visual/visual_server_scene.cpp msgid "Use BVH" -msgstr "" +msgstr "使用 BVH" #: main/main.cpp servers/physics_2d/physics_2d_server_sw.cpp #: servers/visual/visual_server_scene.cpp -#, fuzzy msgid "BVH Collision Margin" -msgstr "碰撞模å¼" +msgstr "BVH 碰撞邊è·" #: main/main.cpp -#, fuzzy msgid "Crash Handler" -msgstr "è¨å®šè™•ç†ç¨‹å¼" +msgstr "當機處ç†å¸¸å¼" #: main/main.cpp -#, fuzzy msgid "Multithreaded Server" -msgstr "多節點組" +msgstr "多執行緒伺æœå™¨" #: main/main.cpp msgid "RID Pool Prealloc" -msgstr "" +msgstr "RID集å€é é…ç½®" #: main/main.cpp -#, fuzzy msgid "Debugger stdout" -msgstr "除錯工具" +msgstr "除錯工具標準輸出" #: main/main.cpp msgid "Max Chars Per Second" -msgstr "" +msgstr "æ¯ç§’最大å—元數" #: main/main.cpp msgid "Max Messages Per Frame" -msgstr "" +msgstr "æ¯å½±æ ¼æœ€å¤§è¨Šæ¯æ•¸" #: main/main.cpp msgid "Max Errors Per Second" -msgstr "" +msgstr "æ¯ç§’最大錯誤數" #: main/main.cpp msgid "Max Warnings Per Second" -msgstr "" +msgstr "æ¯ç§’最大è¦å‘Šæ•¸" #: main/main.cpp msgid "Flush stdout On Print" -msgstr "" +msgstr "åˆ—å°æ™‚刷新標準輸出" #: main/main.cpp servers/visual_server.cpp msgid "Logging" -msgstr "" +msgstr "記錄" #: main/main.cpp msgid "File Logging" -msgstr "" +msgstr "檔案記錄" #: main/main.cpp -#, fuzzy msgid "Enable File Logging" -msgstr "啟用æ¢ä»¶ç¯©é¸" +msgstr "啟用檔案紀錄" #: main/main.cpp -#, fuzzy msgid "Log Path" -msgstr "複製路徑" +msgstr "紀錄路徑" #: main/main.cpp msgid "Max Log Files" -msgstr "" +msgstr "最大紀錄檔案數" #: main/main.cpp msgid "Driver" -msgstr "" +msgstr "驅動程å¼" #: main/main.cpp msgid "Driver Name" @@ -15849,85 +15848,77 @@ msgstr "é©…å‹•å稱" #: main/main.cpp msgid "Fallback To GLES2" -msgstr "" +msgstr "回é™è‡³ GLES2" #: main/main.cpp msgid "Use Nvidia Rect Flicker Workaround" -msgstr "" +msgstr "使用Nvidia Recté–ƒçˆè§£æ±ºæ–¹æ³•" #: main/main.cpp msgid "DPI" -msgstr "" +msgstr "DPI" #: main/main.cpp msgid "Allow hiDPI" -msgstr "" +msgstr "å…許 hiDPI" #: main/main.cpp -#, fuzzy msgid "V-Sync" -msgstr "åŒæ¥" +msgstr "åž‚ç›´åŒæ¥" #: main/main.cpp -#, fuzzy msgid "Use V-Sync" -msgstr "使用å¸é™„" +msgstr "ä½¿ç”¨åž‚ç›´åŒæ¥" #: main/main.cpp msgid "Per Pixel Transparency" -msgstr "" +msgstr "æ¯åƒç´ 逿˜Žåº¦" #: main/main.cpp msgid "Allowed" -msgstr "" +msgstr "å…許" #: main/main.cpp msgid "Intended Usage" -msgstr "" +msgstr "é æœŸç”¨é€”" #: main/main.cpp -#, fuzzy msgid "Framebuffer Allocation" -msgstr "完整顯示所é¸" +msgstr "å½±æ ¼ç·©è¡å€åˆ†é…" #: main/main.cpp platform/uwp/os_uwp.cpp -#, fuzzy msgid "Energy Saving" -msgstr "ä¿å˜æ™‚發生錯誤" +msgstr "節能" #: main/main.cpp msgid "Threads" -msgstr "" +msgstr "執行緒" #: main/main.cpp servers/physics_2d/physics_2d_server_wrap_mt.h -#, fuzzy msgid "Thread Model" -msgstr "åˆ‡æ›æ¨¡å¼" +msgstr "執行緒模型" #: main/main.cpp msgid "Thread Safe BVH" -msgstr "" +msgstr "執行緒安全 BVH" #: main/main.cpp msgid "Handheld" -msgstr "" +msgstr "攜帶型" #: main/main.cpp platform/javascript/export/export.cpp #: platform/uwp/export/export.cpp -#, fuzzy msgid "Orientation" -msgstr "線上說明文件" +msgstr "æ–¹å‘" #: main/main.cpp scene/gui/scroll_container.cpp scene/gui/text_edit.cpp #: scene/main/scene_tree.cpp scene/register_scene_types.cpp -#, fuzzy msgid "Common" -msgstr "社群" +msgstr "常見" #: main/main.cpp -#, fuzzy msgid "Physics FPS" -msgstr "物ç†å½±æ ¼ %" +msgstr "ç‰©ç† FPS" #: main/main.cpp msgid "Force FPS" @@ -15935,87 +15926,81 @@ msgstr "強制 FPS" #: main/main.cpp msgid "Enable Pause Aware Picking" -msgstr "" +msgstr "å•Ÿç”¨æš«åœæ„ŸçŸ¥æ‹¾å–" #: main/main.cpp scene/gui/item_list.cpp scene/gui/popup_menu.cpp #: scene/gui/scroll_container.cpp scene/gui/text_edit.cpp scene/gui/tree.cpp #: scene/main/viewport.cpp scene/register_scene_types.cpp msgid "GUI" -msgstr "" +msgstr "圖形使用者介é¢" #: main/main.cpp msgid "Drop Mouse On GUI Input Disabled" -msgstr "" +msgstr "åœç”¨ GUI è¼¸å…¥æ™‚é‡‹æ”¾æ»‘é¼ éµ" #: main/main.cpp msgid "stdout" -msgstr "" +msgstr "標準輸出" #: main/main.cpp msgid "Print FPS" -msgstr "" +msgstr "åˆ—å° FPS" #: main/main.cpp msgid "Verbose stdout" -msgstr "" +msgstr "詳細標準輸出" #: main/main.cpp scene/main/scene_tree.cpp scene/resources/multimesh.cpp -#, fuzzy msgid "Physics Interpolation" -msgstr "æ’值模å¼" +msgstr "ç‰©ç†æ’值" #: main/main.cpp -#, fuzzy msgid "Enable Warnings" -msgstr "啟用æ¢ä»¶ç¯©é¸" +msgstr "啟用è¦å‘Š" #: main/main.cpp -#, fuzzy msgid "Frame Delay Msec" -msgstr "完整顯示所é¸" +msgstr "å½±æ ¼å»¶é²æ¯«ç§’" #: main/main.cpp msgid "Low Processor Mode" -msgstr "" +msgstr "低處ç†å™¨æ¨¡å¼" #: main/main.cpp msgid "Delta Sync After Draw" -msgstr "" +msgstr "繪製後的差é‡åŒæ¥" #: main/main.cpp msgid "iOS" -msgstr "" +msgstr "iOS" #: main/main.cpp msgid "Hide Home Indicator" -msgstr "" +msgstr "éš±è— Home æ©«æ¢" #: main/main.cpp -#, fuzzy msgid "Input Devices" -msgstr "所有è£ç½®" +msgstr "輸入è£ç½®" #: main/main.cpp -#, fuzzy msgid "Pointing" -msgstr "點" +msgstr "指點" #: main/main.cpp msgid "Touch Delay" -msgstr "" +msgstr "觸控延é²" #: main/main.cpp servers/visual_server.cpp msgid "GLES3" -msgstr "" +msgstr "GLES3" #: main/main.cpp servers/visual_server.cpp -#, fuzzy msgid "Shaders" msgstr "著色器" #: main/main.cpp msgid "Debug Shader Fallbacks" -msgstr "" +msgstr "åµéŒ¯è‘—色器後備" #: main/main.cpp scene/3d/baked_lightmap.cpp scene/3d/camera.cpp #: scene/3d/world_environment.cpp scene/main/scene_tree.cpp @@ -16025,86 +16010,79 @@ msgstr "環境" #: main/main.cpp msgid "Default Clear Color" -msgstr "" +msgstr "é è¨æ¸…除é¡è‰²" #: main/main.cpp msgid "Boot Splash" -msgstr "" +msgstr "啟動畫é¢" #: main/main.cpp -#, fuzzy msgid "Show Image" -msgstr "顯示骨骼" +msgstr "顯示圖åƒ" #: main/main.cpp msgid "Image" -msgstr "" +msgstr "圖åƒ" #: main/main.cpp msgid "Fullsize" -msgstr "" +msgstr "全尺寸" #: main/main.cpp scene/resources/dynamic_font.cpp msgid "Use Filter" msgstr "使用篩é¸å™¨" #: main/main.cpp scene/resources/style_box.cpp -#, fuzzy msgid "BG Color" -msgstr "é¡è‰²" +msgstr "背景é¡è‰²" #: main/main.cpp -#, fuzzy msgid "macOS Native Icon" -msgstr "è¨å®šåœ–塊圖示" +msgstr "macOS 原生圖標" #: main/main.cpp msgid "Windows Native Icon" -msgstr "" +msgstr "Windows 原生圖標" #: main/main.cpp msgid "Buffering" -msgstr "" +msgstr "ç·©è¡" #: main/main.cpp msgid "Agile Event Flushing" -msgstr "" +msgstr "æ•æ·äº‹ä»¶åˆ·æ–°" #: main/main.cpp msgid "Emulate Touch From Mouse" -msgstr "" +msgstr "ä»¥æ»‘é¼ æ¨¡æ“¬è§¸æŽ§" #: main/main.cpp msgid "Emulate Mouse From Touch" -msgstr "" +msgstr "ä»¥è§¸æŽ§æ¨¡æ“¬æ»‘é¼ " #: main/main.cpp -#, fuzzy msgid "Mouse Cursor" -msgstr "æ»‘é¼ æŒ‰éˆ•" +msgstr "æ»‘é¼ æ¸¸æ¨™" #: main/main.cpp -#, fuzzy msgid "Custom Image" -msgstr "剪下節點" +msgstr "自定義圖åƒ" #: main/main.cpp msgid "Custom Image Hotspot" -msgstr "" +msgstr "自定義圖åƒç†±é»ž" #: main/main.cpp msgid "Tooltip Position Offset" msgstr "工具æç¤ºä½ç½®åç§»" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp -#, fuzzy msgid "Debugger Agent" -msgstr "除錯工具" +msgstr "除錯工具代ç†" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp -#, fuzzy msgid "Wait For Debugger" -msgstr "除錯工具" +msgstr "ç‰å¾…除錯工具" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp msgid "Wait Timeout" @@ -16112,60 +16090,58 @@ msgstr "ç‰å¾…逾時" #: main/main.cpp msgid "Runtime" -msgstr "" +msgstr "執行階段" #: main/main.cpp msgid "Unhandled Exception Policy" -msgstr "" +msgstr "未處ç†çš„例外方é‡" #: main/main.cpp -#, fuzzy msgid "Main Loop Type" -msgstr "尋找節點型別" +msgstr "主迴圈類型" #: main/main.cpp scene/gui/texture_progress.cpp #: scene/gui/viewport_container.cpp msgid "Stretch" -msgstr "" +msgstr "伸縮" #: main/main.cpp -#, fuzzy msgid "Aspect" -msgstr "å±¬æ€§é¢æ¿" +msgstr "æ–¹ä½" #: main/main.cpp msgid "Shrink" -msgstr "" +msgstr "收縮" #: main/main.cpp scene/main/scene_tree.cpp msgid "Auto Accept Quit" -msgstr "" +msgstr "自動接å—退出" #: main/main.cpp scene/main/scene_tree.cpp -#, fuzzy msgid "Quit On Go Back" -msgstr "上一é " +msgstr "返回時退出" #: main/main.cpp scene/main/viewport.cpp #, fuzzy msgid "Snap Controls To Pixels" -msgstr "å¸é™„至節點å´é‚Š" +msgstr "å¸é™„控制至åƒç´ " #: main/main.cpp msgid "Dynamic Fonts" -msgstr "" +msgstr "å‹•æ…‹å—é«”" #: main/main.cpp msgid "Use Oversampling" -msgstr "" +msgstr "使用éŽå–樣" #: modules/bullet/register_types.cpp modules/bullet/space_bullet.cpp +#, fuzzy msgid "Active Soft World" -msgstr "" +msgstr "ç•¶å‰è»Ÿä¸–界" #: modules/csg/csg_gizmos.cpp msgid "CSG" -msgstr "" +msgstr "CSG" #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" @@ -16184,35 +16160,30 @@ msgid "Change Torus Outer Radius" msgstr "更改環é¢å¤–åŠå¾‘" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Operation" -msgstr "é¸é …" +msgstr "æ“作" #: modules/csg/csg_shape.cpp msgid "Calculate Tangents" -msgstr "" +msgstr "計算切線" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Use Collision" -msgstr "碰撞" +msgstr "使用碰撞" #: modules/csg/csg_shape.cpp servers/physics_2d_server.cpp -#, fuzzy msgid "Collision Layer" -msgstr "碰撞模å¼" +msgstr "碰撞層" #: modules/csg/csg_shape.cpp scene/2d/ray_cast_2d.cpp scene/3d/camera.cpp #: scene/3d/ray_cast.cpp scene/3d/spring_arm.cpp #: scene/resources/navigation_mesh.cpp servers/physics_server.cpp -#, fuzzy msgid "Collision Mask" -msgstr "碰撞模å¼" +msgstr "碰撞é®ç½©" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Invert Faces" -msgstr "轉æ›å¤§å°å¯«" +msgstr "å轉表é¢" #: modules/csg/csg_shape.cpp scene/2d/navigation_agent_2d.cpp #: scene/2d/navigation_obstacle_2d.cpp scene/3d/navigation_agent.cpp @@ -16230,84 +16201,74 @@ msgid "Radial Segments" msgstr "徑呿®µæ•¸" #: modules/csg/csg_shape.cpp scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Rings" -msgstr "è¦å‘Š" +msgstr "環數" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Smooth Faces" -msgstr "平滑æ’值" +msgstr "光滑表é¢" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Sides" -msgstr "顯示åƒè€ƒç·š" +msgstr "邊數" #: modules/csg/csg_shape.cpp msgid "Cone" -msgstr "" +msgstr "éŒé«”" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Inner Radius" -msgstr "更改環é¢å…§åŠå¾‘" +msgstr "å…§åŠå¾‘" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Outer Radius" -msgstr "更改環é¢å¤–åŠå¾‘" +msgstr "外åŠå¾‘" #: modules/csg/csg_shape.cpp msgid "Ring Sides" -msgstr "" +msgstr "環邊數" #: modules/csg/csg_shape.cpp scene/2d/collision_polygon_2d.cpp #: scene/2d/light_occluder_2d.cpp scene/2d/polygon_2d.cpp #: scene/3d/collision_polygon.cpp -#, fuzzy msgid "Polygon" msgstr "多邊形" #: modules/csg/csg_shape.cpp msgid "Spin Degrees" -msgstr "" +msgstr "旋轉度數" #: modules/csg/csg_shape.cpp msgid "Spin Sides" -msgstr "" +msgstr "旋轉邊數" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Node" -msgstr "貼上節點" +msgstr "路徑節點" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Interval Type" -msgstr "å»ºç«‹å…§éƒ¨é ‚é»ž" +msgstr "路徑間隔類型" #: modules/csg/csg_shape.cpp msgid "Path Interval" -msgstr "" +msgstr "路徑間隔" #: modules/csg/csg_shape.cpp msgid "Path Simplify Angle" -msgstr "" +msgstr "路徑簡化角度" #: modules/csg/csg_shape.cpp msgid "Path Rotation" msgstr "路徑旋轉" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Local" -msgstr "轉為本地" +msgstr "路徑本地" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Continuous U" -msgstr "連續" +msgstr "路徑連續 U" #: modules/csg/csg_shape.cpp msgid "Path U Distance" @@ -16318,73 +16279,65 @@ msgid "Path Joined" msgstr "路徑接åˆ" #: modules/enet/networked_multiplayer_enet.cpp -#, fuzzy msgid "Compression Mode" -msgstr "碰撞模å¼" +msgstr "壓縮模å¼" #: modules/enet/networked_multiplayer_enet.cpp -#, fuzzy msgid "Transfer Channel" -msgstr "修改變æ›" +msgstr "傳輸通é“" #: modules/enet/networked_multiplayer_enet.cpp -#, fuzzy msgid "Channel Count" -msgstr "實體" +msgstr "é€šé“æ•¸" #: modules/enet/networked_multiplayer_enet.cpp -#, fuzzy msgid "Always Ordered" -msgstr "æ°¸é é¡¯ç¤ºç¶²æ ¼" +msgstr "æ°¸é æŽ’åº" #: modules/enet/networked_multiplayer_enet.cpp msgid "Server Relay" -msgstr "" +msgstr "伺æœå™¨ä¸ç¹¼" #: modules/enet/networked_multiplayer_enet.cpp msgid "DTLS Verify" -msgstr "" +msgstr "DTLS é©—è‰" #: modules/enet/networked_multiplayer_enet.cpp msgid "DTLS Hostname" -msgstr "" +msgstr "DTLS 主機å" #: modules/enet/networked_multiplayer_enet.cpp -#, fuzzy msgid "Use DTLS" -msgstr "使用å¸é™„" +msgstr "使用 DTLS" #: modules/fbx/editor_scene_importer_fbx.cpp msgid "FBX" -msgstr "" +msgstr "FBX" #: modules/fbx/editor_scene_importer_fbx.cpp msgid "Use FBX" -msgstr "" +msgstr "使用 FBX" #: modules/gdnative/gdnative.cpp msgid "Config File" msgstr "組態檔案" #: modules/gdnative/gdnative.cpp -#, fuzzy msgid "Load Once" -msgstr "載入資æº" +msgstr "載入一次" #: modules/gdnative/gdnative.cpp #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Singleton" -msgstr "骨架" +msgstr "單例" #: modules/gdnative/gdnative.cpp msgid "Symbol Prefix" msgstr "符號å‰ç¶´" #: modules/gdnative/gdnative.cpp -#, fuzzy msgid "Reloadable" -msgstr "釿–°è¼‰å…¥" +msgstr "å¯é‡æ–°è¼‰å…¥" #: modules/gdnative/gdnative.cpp #: modules/gdnative/gdnative_library_singleton_editor.cpp @@ -16449,9 +16402,8 @@ msgid "Script Class" msgstr "腳本類別" #: modules/gdnative/nativescript/nativescript.cpp -#, fuzzy msgid "Icon Path" -msgstr "èšç„¦è·¯å¾‘" +msgstr "圖示路徑" #: modules/gdnative/register_types.cpp msgid "GDNative" @@ -16459,34 +16411,33 @@ msgstr "GDNative" #: modules/gdscript/editor/gdscript_highlighter.cpp #: modules/gdscript/gdscript.cpp -#, fuzzy msgid "GDScript" -msgstr "腳本" +msgstr "GDScript" #: modules/gdscript/editor/gdscript_highlighter.cpp +#, fuzzy msgid "Function Definition Color" -msgstr "" +msgstr "函數定義é¡è‰²" #: modules/gdscript/editor/gdscript_highlighter.cpp -#, fuzzy msgid "Node Path Color" -msgstr "複製節點路徑" +msgstr "節點路徑é¡è‰²" #: modules/gdscript/gdscript.cpp modules/visual_script/visual_script.cpp msgid "Max Call Stack" -msgstr "" +msgstr "最大呼å«å †ç–Š" #: modules/gdscript/gdscript.cpp msgid "Treat Warnings As Errors" -msgstr "" +msgstr "å°‡è¦å‘Šè¦–為錯誤" #: modules/gdscript/gdscript.cpp msgid "Exclude Addons" -msgstr "" +msgstr "排除外掛程å¼" #: modules/gdscript/gdscript.cpp msgid "Autocomplete Setters And Getters" -msgstr "" +msgstr "è‡ªå‹•å®Œæˆ Setters å’Œ Getters" #: modules/gdscript/gdscript_functions.cpp msgid "Step argument is zero!" @@ -16529,17 +16480,16 @@ msgid "Language Server" msgstr "語言伺æœå™¨" #: modules/gdscript/language_server/gdscript_language_server.cpp -#, fuzzy msgid "Enable Smart Resolve" -msgstr "無法解æž" +msgstr "啟用智慧解æž" #: modules/gdscript/language_server/gdscript_language_server.cpp msgid "Show Native Symbols In Editor" -msgstr "" +msgstr "在編輯器ä¸é¡¯ç¤ºåŽŸç”Ÿç¬¦è™Ÿ" #: modules/gdscript/language_server/gdscript_language_server.cpp msgid "Use Thread" -msgstr "" +msgstr "使用執行緒" #: modules/gltf/editor_scene_exporter_gltf_plugin.cpp msgid "Export Mesh GLTF2" @@ -16550,50 +16500,44 @@ msgid "Export GLTF..." msgstr "匯出GLTF..." #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Buffer View" -msgstr "後視圖" +msgstr "ç·©è¡å€è¦–圖" #: modules/gltf/gltf_accessor.cpp modules/gltf/gltf_buffer_view.cpp msgid "Byte Offset" msgstr "å—節åç§»" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Component Type" -msgstr "元件" +msgstr "元件類型" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Normalized" -msgstr "æ ¼å¼" +msgstr "標準化" #: modules/gltf/gltf_accessor.cpp msgid "Count" msgstr "數é‡" #: modules/gltf/gltf_accessor.cpp scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Min" -msgstr "MiB" +msgstr "最å°å€¼" #: modules/gltf/gltf_accessor.cpp scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Max" -msgstr "æ··åˆ (Mix)" +msgstr "最大值" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Sparse Count" -msgstr "實體" +msgstr "ç¨€ç–æ•¸é‡" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Indices Buffer View" -msgstr "" +msgstr "稀ç–索引緩è¡å€è¦–圖" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Indices Byte Offset" -msgstr "" +msgstr "稀ç–索引ä½å…ƒçµ„åç§»" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Indices Component Type" @@ -16601,30 +16545,27 @@ msgstr "稀ç–é ‚é»žå…ƒä»¶åž‹åˆ¥" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Values Buffer View" -msgstr "" +msgstr "稀ç–值緩è¡å€è¦–圖" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Values Byte Offset" -msgstr "" +msgstr "稀ç–值ä½å…ƒçµ„åç§»" #: modules/gltf/gltf_buffer_view.cpp -#, fuzzy msgid "Buffer" -msgstr "後視圖" +msgstr "ç·©è¡å€" #: modules/gltf/gltf_buffer_view.cpp -#, fuzzy msgid "Byte Length" -msgstr "é è¨ä¸»é¡Œ" +msgstr "ä½å…ƒçµ„長度" #: modules/gltf/gltf_buffer_view.cpp msgid "Byte Stride" -msgstr "" +msgstr "ä½å…ƒçµ„è·¨è·" #: modules/gltf/gltf_buffer_view.cpp -#, fuzzy msgid "Indices" -msgstr "所有è£ç½®" +msgstr "索引" #: modules/gltf/gltf_camera.cpp msgid "FOV Size" @@ -16632,12 +16573,11 @@ msgstr "FOV 大å°" #: modules/gltf/gltf_camera.cpp msgid "Zfar" -msgstr "" +msgstr "Zfar" #: modules/gltf/gltf_camera.cpp -#, fuzzy msgid "Znear" -msgstr "線性" +msgstr "Znear" #: modules/gltf/gltf_light.cpp scene/2d/canvas_modulate.cpp #: scene/2d/cpu_particles_2d.cpp scene/2d/light_2d.cpp scene/2d/polygon_2d.cpp @@ -16647,14 +16587,13 @@ msgstr "線性" #: scene/resources/environment.cpp scene/resources/material.cpp #: scene/resources/particles_material.cpp scene/resources/sky.cpp #: scene/resources/style_box.cpp -#, fuzzy msgid "Color" msgstr "é¡è‰²" #: modules/gltf/gltf_light.cpp scene/3d/reflection_probe.cpp #: scene/resources/environment.cpp msgid "Intensity" -msgstr "" +msgstr "強度" #: modules/gltf/gltf_light.cpp scene/2d/light_2d.cpp scene/3d/light.cpp #, fuzzy @@ -16663,11 +16602,11 @@ msgstr "更改" #: modules/gltf/gltf_light.cpp msgid "Inner Cone Angle" -msgstr "" +msgstr "內圓éŒè§’" #: modules/gltf/gltf_light.cpp msgid "Outer Cone Angle" -msgstr "" +msgstr "外圓éŒè§’" #: modules/gltf/gltf_mesh.cpp #, fuzzy @@ -16689,8 +16628,9 @@ msgid "Xform" msgstr "å¹³å°" #: modules/gltf/gltf_node.cpp scene/3d/mesh_instance.cpp +#, fuzzy msgid "Skin" -msgstr "" +msgstr "皮膚" #: modules/gltf/gltf_node.cpp scene/3d/spatial.cpp #, fuzzy @@ -16708,12 +16648,14 @@ msgid "Joints" msgstr "點" #: modules/gltf/gltf_skeleton.cpp modules/gltf/gltf_skin.cpp +#, fuzzy msgid "Roots" -msgstr "" +msgstr "æ ¹" #: modules/gltf/gltf_skeleton.cpp modules/gltf/gltf_state.cpp +#, fuzzy msgid "Unique Names" -msgstr "" +msgstr "ç¨ç«‹å稱" #: modules/gltf/gltf_skeleton.cpp #, fuzzy @@ -16731,8 +16673,9 @@ msgid "Joints Original" msgstr "èšç„¦åŽŸé»ž" #: modules/gltf/gltf_skin.cpp +#, fuzzy msgid "Inverse Binds" -msgstr "" +msgstr "å轉ç¶å®š" #: modules/gltf/gltf_skin.cpp #, fuzzy @@ -16740,40 +16683,47 @@ msgid "Non Joints" msgstr "移動關節" #: modules/gltf/gltf_skin.cpp +#, fuzzy msgid "Joint I To Bone I" -msgstr "" +msgstr "關節 I 至骨骼 I" #: modules/gltf/gltf_skin.cpp +#, fuzzy msgid "Joint I To Name" -msgstr "" +msgstr "關節 I 至å稱" #: modules/gltf/gltf_skin.cpp +#, fuzzy msgid "Godot Skin" -msgstr "" +msgstr "Godot 外觀" #: modules/gltf/gltf_spec_gloss.cpp +#, fuzzy msgid "Diffuse Img" -msgstr "" +msgstr "漫射圖åƒ" #: modules/gltf/gltf_spec_gloss.cpp +#, fuzzy msgid "Diffuse Factor" -msgstr "" +msgstr "漫射係數" #: modules/gltf/gltf_spec_gloss.cpp +#, fuzzy msgid "Gloss Factor" -msgstr "" +msgstr "光澤係數" #: modules/gltf/gltf_spec_gloss.cpp msgid "Specular Factor" msgstr "é¡é¢å射係數" #: modules/gltf/gltf_spec_gloss.cpp +#, fuzzy msgid "Spec Gloss Img" -msgstr "" +msgstr "è¦æ ¼å…‰æ¾¤åœ–åƒ" #: modules/gltf/gltf_state.cpp msgid "Json" -msgstr "" +msgstr "Json" #: modules/gltf/gltf_state.cpp #, fuzzy @@ -16791,8 +16741,9 @@ msgid "GLB Data" msgstr "åŒ…å«æ•¸æ“š" #: modules/gltf/gltf_state.cpp +#, fuzzy msgid "Use Named Skin Binds" -msgstr "" +msgstr "使用已命å的外觀ç¶å®š" #: modules/gltf/gltf_state.cpp #, fuzzy @@ -16801,7 +16752,7 @@ msgstr "後視圖" #: modules/gltf/gltf_state.cpp msgid "Accessors" -msgstr "" +msgstr "å˜å–器" #: modules/gltf/gltf_state.cpp msgid "Scene Name" @@ -16820,11 +16771,11 @@ msgstr "功能" #: modules/gltf/gltf_state.cpp platform/uwp/export/export.cpp msgid "Images" -msgstr "" +msgstr "圖åƒ" #: modules/gltf/gltf_state.cpp msgid "Cameras" -msgstr "" +msgstr "æ”影機" #: modules/gltf/gltf_state.cpp servers/visual_server.cpp #, fuzzy @@ -16869,8 +16820,9 @@ msgid "Use In Baked Light" msgstr "烘焙光照圖" #: modules/gridmap/grid_map.cpp scene/2d/tile_map.cpp +#, fuzzy msgid "Cell" -msgstr "" +msgstr "單使 ¼" #: modules/gridmap/grid_map.cpp #, fuzzy @@ -16896,7 +16848,7 @@ msgstr "ä¸å¤®" #: scene/2d/tile_map.cpp scene/3d/collision_object.cpp scene/3d/soft_body.cpp #: scene/resources/material.cpp msgid "Mask" -msgstr "" +msgstr "é®ç½©" #: modules/gridmap/grid_map.cpp scene/2d/tile_map.cpp #, fuzzy @@ -17074,19 +17026,19 @@ msgstr "烘焙光照圖" #: modules/lightmapper_cpu/register_types.cpp msgid "Low Quality Ray Count" -msgstr "" +msgstr "低å“質射線數" #: modules/lightmapper_cpu/register_types.cpp msgid "Medium Quality Ray Count" -msgstr "" +msgstr "ä¸ç‰å“質射線數" #: modules/lightmapper_cpu/register_types.cpp msgid "High Quality Ray Count" -msgstr "" +msgstr "高å“質射線數" #: modules/lightmapper_cpu/register_types.cpp msgid "Ultra Quality Ray Count" -msgstr "" +msgstr "超高å“é‡å°„線數" #: modules/minimp3/audio_stream_mp3.cpp #: modules/minimp3/resource_importer_mp3.cpp @@ -17096,12 +17048,13 @@ msgid "Loop Offset" msgstr "循環åç§»" #: modules/mobile_vr/mobile_vr_interface.cpp +#, fuzzy msgid "Eye Height" -msgstr "" +msgstr "眼ç›é«˜åº¦" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "IOD" -msgstr "" +msgstr "IOD" #: modules/mobile_vr/mobile_vr_interface.cpp #, fuzzy @@ -17115,15 +17068,15 @@ msgstr "顯示無陰影" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "Oversample" -msgstr "" +msgstr "éŽå–樣" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "K1" -msgstr "" +msgstr "K1" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "K2" -msgstr "" +msgstr "K2" #: modules/mono/csharp_script.cpp msgid "Class name can't be a reserved keyword" @@ -17138,6 +17091,21 @@ msgstr "建構解決方案" msgid "Auto Update Project" msgstr "未命å專案" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "全部顯示" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "鏿“‡è³‡æ–™å¤¾" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "鏿“‡è³‡æ–™å¤¾" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "å…§éƒ¨ç•°å¸¸å †ç–Šå›žæº¯çµæŸ" @@ -17209,19 +17177,21 @@ msgstr "完æˆï¼" #: modules/opensimplex/noise_texture.cpp msgid "Seamless" -msgstr "" +msgstr "無縫" #: modules/opensimplex/noise_texture.cpp msgid "As Normal Map" msgstr "作為法線貼圖" #: modules/opensimplex/noise_texture.cpp +#, fuzzy msgid "Bump Strength" -msgstr "" +msgstr "凹凸強度" #: modules/opensimplex/noise_texture.cpp +#, fuzzy msgid "Noise" -msgstr "" +msgstr "噪音" #: modules/opensimplex/noise_texture.cpp msgid "Noise Offset" @@ -17229,11 +17199,11 @@ msgstr "噪è²åç§»" #: modules/opensimplex/open_simplex_noise.cpp msgid "Octaves" -msgstr "" +msgstr "八度" #: modules/opensimplex/open_simplex_noise.cpp msgid "Period" -msgstr "" +msgstr "週期" #: modules/opensimplex/open_simplex_noise.cpp #, fuzzy @@ -17241,12 +17211,13 @@ msgid "Persistence" msgstr "é€è¦–" #: modules/opensimplex/open_simplex_noise.cpp +#, fuzzy msgid "Lacunarity" -msgstr "" +msgstr "空隙性" #: modules/regex/regex.cpp msgid "Subject" -msgstr "" +msgstr "å°è±¡" #: modules/regex/regex.cpp #, fuzzy @@ -17258,16 +17229,18 @@ msgid "Strings" msgstr "å—串" #: modules/upnp/upnp.cpp +#, fuzzy msgid "Discover Multicast If" -msgstr "" +msgstr "發ç¾å¤šæ’介é¢" #: modules/upnp/upnp.cpp +#, fuzzy msgid "Discover Local Port" -msgstr "" +msgstr "ç™¼ç¾æœ¬åœ°é€šè¨ŠåŸ " #: modules/upnp/upnp.cpp msgid "Discover IPv6" -msgstr "" +msgstr "DiscoverIPv6" #: modules/upnp/upnp_device.cpp #, fuzzy @@ -17281,7 +17254,7 @@ msgstr "è¨å®šè®Šæ•¸åž‹åˆ¥" #: modules/upnp/upnp_device.cpp msgid "IGD Control URL" -msgstr "" +msgstr "IGD 控制 URL" #: modules/upnp/upnp_device.cpp #, fuzzy @@ -17290,7 +17263,7 @@ msgstr "è¨å®šè®Šæ•¸åž‹åˆ¥" #: modules/upnp/upnp_device.cpp msgid "IGD Our Addr" -msgstr "" +msgstr "IGD 我方ä½å€" #: modules/upnp/upnp_device.cpp #, fuzzy @@ -17653,7 +17626,7 @@ msgstr "è¨å®šè¡¨ç¤ºå¼" #: modules/visual_script/visual_script_flow_control.cpp msgid "Return" -msgstr "" +msgstr "返回" #: modules/visual_script/visual_script_flow_control.cpp #, fuzzy @@ -17672,24 +17645,27 @@ msgid "Condition" msgstr "å‹•ç•«" #: modules/visual_script/visual_script_flow_control.cpp +#, fuzzy msgid "if (cond) is:" -msgstr "" +msgstr "如果(cond)是:" #: modules/visual_script/visual_script_flow_control.cpp +#, fuzzy msgid "While" -msgstr "" +msgstr "ç•¶" #: modules/visual_script/visual_script_flow_control.cpp +#, fuzzy msgid "while (cond):" -msgstr "" +msgstr "當(cond):" #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator" -msgstr "" +msgstr "è¿ä»£å™¨" #: modules/visual_script/visual_script_flow_control.cpp msgid "for (elem) in (input):" -msgstr "" +msgstr "å°æ¯å€‹ (elem) 在 (input) 之ä¸:" #: modules/visual_script/visual_script_flow_control.cpp msgid "Input type not iterable:" @@ -17705,7 +17681,7 @@ msgstr "è¿ä»£å™¨ç„¡æ•ˆï¼š" #: modules/visual_script/visual_script_flow_control.cpp msgid "Sequence" -msgstr "" +msgstr "åºåˆ—" #: modules/visual_script/visual_script_flow_control.cpp #, fuzzy @@ -17723,7 +17699,7 @@ msgstr "切æ›" #: modules/visual_script/visual_script_flow_control.cpp msgid "'input' is:" -msgstr "" +msgstr "'input' 是:" #: modules/visual_script/visual_script_flow_control.cpp msgid "Type Cast" @@ -17731,7 +17707,7 @@ msgstr "型別轉æ›" #: modules/visual_script/visual_script_flow_control.cpp msgid "Is %s?" -msgstr "" +msgstr "是 %s?" #: modules/visual_script/visual_script_flow_control.cpp #: modules/visual_script/visual_script_func_nodes.cpp @@ -17741,7 +17717,7 @@ msgstr "新增腳本" #: modules/visual_script/visual_script_func_nodes.cpp msgid "On %s" -msgstr "" +msgstr "在 %s" #: modules/visual_script/visual_script_func_nodes.cpp #, fuzzy @@ -17788,11 +17764,11 @@ msgstr "使–¼å—å…ƒ %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Multiply %s" -msgstr "" +msgstr "%s 乘以" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Divide %s" -msgstr "" +msgstr "%s 除以" #: modules/visual_script/visual_script_func_nodes.cpp #, fuzzy @@ -17806,7 +17782,7 @@ msgstr "è¨å®š %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "ShiftRight %s" -msgstr "" +msgstr "å°‡ %s å‘å³ç§»å‹•" #: modules/visual_script/visual_script_func_nodes.cpp #, fuzzy @@ -17814,12 +17790,14 @@ msgid "BitAnd %s" msgstr "新增 %" #: modules/visual_script/visual_script_func_nodes.cpp +#, fuzzy msgid "BitOr %s" -msgstr "" +msgstr "ä½å…ƒé‹ç®— OR %s" #: modules/visual_script/visual_script_func_nodes.cpp +#, fuzzy msgid "BitXor %s" -msgstr "" +msgstr "ä½å…ƒé ç®— XOR %s" #: modules/visual_script/visual_script_func_nodes.cpp #, fuzzy @@ -17879,7 +17857,7 @@ msgstr "無效的引數:" #: modules/visual_script/visual_script_nodes.cpp msgid "a if cond, else b" -msgstr "" +msgstr "如果 cond 則 a ,å¦å‰‡ b" #: modules/visual_script/visual_script_nodes.cpp #, fuzzy @@ -17971,7 +17949,7 @@ msgstr "呼å«" #: modules/visual_script/visual_script_nodes.cpp scene/gui/graph_node.cpp msgid "Title" -msgstr "" +msgstr "標題" #: modules/visual_script/visual_script_nodes.cpp #, fuzzy @@ -17995,7 +17973,7 @@ msgstr "æ“作" #: modules/visual_script/visual_script_nodes.cpp msgid "Deconstruct %s" -msgstr "" +msgstr "解構 %s" #: modules/visual_script/visual_script_property_selector.cpp msgid "Search VisualScript" @@ -18021,7 +17999,7 @@ msgstr "物ç†å½±æ ¼ %" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "%s sec(s)" -msgstr "" +msgstr "%s ç§’" #: modules/visual_script/visual_script_yield_nodes.cpp scene/main/timer.cpp #, fuzzy @@ -18050,7 +18028,7 @@ msgstr "優先模å¼" #: modules/webrtc/webrtc_data_channel.h msgid "WebRTC" -msgstr "" +msgstr "WebRTC" #: modules/webrtc/webrtc_data_channel.h #, fuzzy @@ -18059,11 +18037,11 @@ msgstr "畫布多邊形索引緩è¡å€å¤§å°ï¼ˆKB)" #: modules/websocket/websocket_client.cpp msgid "Verify SSL" -msgstr "" +msgstr "é©—è‰ SSL" #: modules/websocket/websocket_client.cpp msgid "Trusted SSL Certificate" -msgstr "" +msgstr "å—信任的 SSL 憑è‰" #: modules/websocket/websocket_macros.h #, fuzzy @@ -18077,7 +18055,7 @@ msgstr "最大大å°ï¼ˆKB)" #: modules/websocket/websocket_macros.h msgid "Max In Packets" -msgstr "" +msgstr "å°åŒ…上é™" #: modules/websocket/websocket_macros.h #, fuzzy @@ -18086,7 +18064,7 @@ msgstr "最大大å°ï¼ˆKB)" #: modules/websocket/websocket_macros.h msgid "Max Out Packets" -msgstr "" +msgstr "輸出å°åŒ…上é™" #: modules/websocket/websocket_macros.h #, fuzzy @@ -18095,7 +18073,7 @@ msgstr "網路分æžå·¥å…·" #: modules/websocket/websocket_server.cpp msgid "Bind IP" -msgstr "" +msgstr "ç¶å®š IP" #: modules/websocket/websocket_server.cpp #, fuzzy @@ -18104,7 +18082,7 @@ msgstr "實體按éµ" #: modules/websocket/websocket_server.cpp platform/javascript/export/export.cpp msgid "SSL Certificate" -msgstr "" +msgstr "SSL 憑è‰" #: modules/websocket/websocket_server.cpp #, fuzzy @@ -18130,11 +18108,11 @@ msgstr "å¯é¸ç‰¹æ€§" #: modules/webxr/webxr_interface.cpp msgid "Requested Reference Space Types" -msgstr "" +msgstr "被請求的åƒç…§ç©ºé–“類型" #: modules/webxr/webxr_interface.cpp msgid "Reference Space Type" -msgstr "" +msgstr "åƒç…§ç©ºé–“類型" #: modules/webxr/webxr_interface.cpp #, fuzzy @@ -18153,7 +18131,7 @@ msgstr "智慧型å¸é™„" #: platform/android/export/export.cpp msgid "Android SDK Path" -msgstr "" +msgstr "Android SDK 路徑" #: platform/android/export/export.cpp #, fuzzy @@ -18162,31 +18140,31 @@ msgstr "除錯工具" #: platform/android/export/export.cpp msgid "Debug Keystore User" -msgstr "" +msgstr "åµéŒ¯é‡‘鑰儲å˜å€ä½¿ç”¨è€…" #: platform/android/export/export.cpp msgid "Debug Keystore Pass" -msgstr "" +msgstr "金鑰儲å˜å€åµéŒ¯å¯†ç¢¼" #: platform/android/export/export.cpp msgid "Force System User" -msgstr "" +msgstr "強制系統使用者" #: platform/android/export/export.cpp msgid "Shutdown ADB On Exit" -msgstr "" +msgstr "退出時關閉 ADB" #: platform/android/export/export_plugin.cpp msgid "Launcher Icons" -msgstr "" +msgstr "啟動器圖示" #: platform/android/export/export_plugin.cpp msgid "Main 192 X 192" -msgstr "" +msgstr "主圖示 192 X 192" #: platform/android/export/export_plugin.cpp msgid "Adaptive Foreground 432 X 432" -msgstr "" +msgstr "è‡ªé©æ‡‰å‰æ™¯ 432 X 432" #: platform/android/export/export_plugin.cpp msgid "Adaptive Background 432 X 432" @@ -18948,6 +18926,11 @@ msgstr "剪下節點" msgid "Custom BG Color" msgstr "剪下節點" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "展開全部" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -19781,6 +19764,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "無效的套件段å稱。" @@ -23275,43 +23264,36 @@ msgid "Mix Mode" msgstr "Mix 節點" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Fadein Time" -msgstr "淡入與淡出時間(秒):" +msgstr "淡入時間" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Fadeout Time" -msgstr "淡入與淡出時間(秒):" +msgstr "淡出時間" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Auto Restart" -msgstr "è‡ªå‹•é‡æ–°é–‹å§‹ï¼š" +msgstr "è‡ªå‹•é‡æ–°é–‹å§‹" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Autorestart" -msgstr "è‡ªå‹•é‡æ–°é–‹å§‹ï¼š" +msgstr "è‡ªå‹•é‡æ–°é–‹å§‹" #: scene/animation/animation_blend_tree.cpp msgid "Delay" msgstr "" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Random Delay" -msgstr "隨機傾斜:" +msgstr "隨機延é²" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Add Amount" -msgstr "數é‡ï¼š" +msgstr "å¢žåŠ æ•¸é‡" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Blend Amount" -msgstr "數é‡ï¼š" +msgstr "æ··åˆé‡" #: scene/animation/animation_blend_tree.cpp #, fuzzy @@ -23325,14 +23307,12 @@ msgstr "æ–°å¢žè¼¸å…¥åŸ å£" #: scene/animation/animation_blend_tree.cpp #: scene/animation/animation_node_state_machine.cpp -#, fuzzy msgid "Xfade Time" -msgstr "淡入與淡出時間(秒):" +msgstr "Xfade 時間" #: scene/animation/animation_node_state_machine.cpp -#, fuzzy msgid "Switch Mode" -msgstr "仰角:" +msgstr "åˆ‡æ›æ¨¡å¼" #: scene/animation/animation_node_state_machine.cpp #, fuzzy @@ -23373,9 +23353,8 @@ msgid "Current Animation Position" msgstr "æ–°å¢žå‹•ç•«é ‚é»ž" #: scene/animation/animation_player.cpp -#, fuzzy msgid "Playback Options" -msgstr "類別é¸é …:" +msgstr "æ’æ”¾é¸é …" #: scene/animation/animation_player.cpp #, fuzzy @@ -23415,9 +23394,8 @@ msgid "The AnimationPlayer root node is not a valid node." msgstr "AnimationPlayer çš„æ ¹ç¯€é»žä¸¦éžæœ‰æ•ˆç¯€é»žã€‚" #: scene/animation/animation_tree.cpp -#, fuzzy msgid "Tree Root" -msgstr "å»ºç«‹æ ¹ç¯€é»žï¼š" +msgstr "æ¨¹æ ¹ç¯€é»ž" #: scene/animation/animation_tree.cpp #, fuzzy @@ -23673,14 +23651,12 @@ msgid "Grow Direction" msgstr "æ–¹å‘" #: scene/gui/control.cpp scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Min Size" -msgstr "輪廓尺寸:" +msgstr "最å°å°ºå¯¸" #: scene/gui/control.cpp -#, fuzzy msgid "Pivot Offset" -msgstr "ç¶²æ ¼åç§»é‡ï¼š" +msgstr "樞ç´åç§»é‡" #: scene/gui/control.cpp #, fuzzy @@ -23740,7 +23716,7 @@ msgstr "" #: scene/gui/control.cpp msgid "Size Flags" -msgstr "å¤§å° Flag:" +msgstr "å¤§å° Flag" #: scene/gui/control.cpp #, fuzzy @@ -23788,14 +23764,12 @@ msgid "Right Disconnects" msgstr "斷開訊號連接" #: scene/gui/graph_edit.cpp -#, fuzzy msgid "Scroll Offset" -msgstr "ç¶²æ ¼åç§»é‡ï¼š" +msgstr "æ²è»¸åç§»é‡" #: scene/gui/graph_edit.cpp -#, fuzzy msgid "Snap Distance" -msgstr "鏿“‡è·é›¢ï¼š" +msgstr "å¸é™„è·é›¢" #: scene/gui/graph_edit.cpp #, fuzzy @@ -23895,7 +23869,7 @@ msgstr "" #: scene/gui/item_list.cpp #, fuzzy msgid "Icon Scale" -msgstr "隨機縮放:" +msgstr "圖示比例" #: scene/gui/item_list.cpp #, fuzzy @@ -23908,9 +23882,8 @@ msgid "V Align" msgstr "指派" #: scene/gui/label.cpp scene/gui/rich_text_label.cpp -#, fuzzy msgid "Visible Characters" -msgstr "å¯ä½¿ç”¨çš„å—元:" +msgstr "å¯è¦‹å—符" #: scene/gui/label.cpp scene/gui/rich_text_label.cpp #, fuzzy @@ -23934,9 +23907,8 @@ msgid "Secret" msgstr "" #: scene/gui/line_edit.cpp -#, fuzzy msgid "Secret Character" -msgstr "å¯ä½¿ç”¨çš„å—元:" +msgstr "秘密å—å…ƒ" #: scene/gui/line_edit.cpp msgid "Expand To Text Length" @@ -24000,18 +23972,16 @@ msgid "Blink" msgstr "" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Blink Speed" -msgstr "速度:" +msgstr "é–ƒçˆé€Ÿåº¦" #: scene/gui/link_button.cpp msgid "Underline" msgstr "" #: scene/gui/menu_button.cpp -#, fuzzy msgid "Switch On Hover" -msgstr "仰角:" +msgstr "æ‡¸åœæ™‚切æ›" #: scene/gui/nine_patch_rect.cpp scene/resources/style_box.cpp #, fuzzy @@ -24087,9 +24057,8 @@ msgid "Allow Search" msgstr "æœå°‹" #: scene/gui/progress_bar.cpp -#, fuzzy msgid "Percent" -msgstr "最近å˜å–:" +msgstr "百分比" #: scene/gui/range.cpp msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." @@ -24148,9 +24117,8 @@ msgid "Absolute Index" msgstr "自動縮排" #: scene/gui/rich_text_effect.cpp -#, fuzzy msgid "Elapsed Time" -msgstr "æ··åˆæ™‚間:" +msgstr "ç¶“éŽæ™‚é–“" #: scene/gui/rich_text_effect.cpp #, fuzzy @@ -24158,9 +24126,8 @@ msgid "Env" msgstr "çµæŸ" #: scene/gui/rich_text_effect.cpp -#, fuzzy msgid "Character" -msgstr "å¯ä½¿ç”¨çš„å—元:" +msgstr "å—å…ƒ" #: scene/gui/rich_text_label.cpp msgid "BBCode" @@ -24171,9 +24138,8 @@ msgid "Meta Underlined" msgstr "" #: scene/gui/rich_text_label.cpp -#, fuzzy msgid "Tab Size" -msgstr "大å°ï¼š" +msgstr "分é 大å°" #: scene/gui/rich_text_label.cpp #, fuzzy @@ -24194,9 +24160,8 @@ msgid "Selection Enabled" msgstr "僅æœå°‹æ‰€é¸å€åŸŸ" #: scene/gui/rich_text_label.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Override Selected Font Color" -msgstr "è¨å®šæ‰€é¸ä¹‹è¨å®šæª”:" +msgstr "覆蓋所é¸å—åž‹é¡è‰²" #: scene/gui/rich_text_label.cpp #, fuzzy @@ -24224,9 +24189,8 @@ msgid "Follow Focus" msgstr "填充表é¢" #: scene/gui/scroll_container.cpp -#, fuzzy msgid "Horizontal Enabled" -msgstr "水平:" +msgstr "已啟用水平" #: scene/gui/scroll_container.cpp #, fuzzy @@ -24247,24 +24211,20 @@ msgid "Tick Count" msgstr "鏿“‡é¡è‰²" #: scene/gui/slider.cpp -#, fuzzy msgid "Ticks On Borders" -msgstr "釿–°å‘½å資料夾:" +msgstr "邊框刻度" #: scene/gui/spin_box.cpp -#, fuzzy msgid "Prefix" -msgstr "å‰ç½®ï¼š" +msgstr "å‰ç¶´" #: scene/gui/spin_box.cpp -#, fuzzy msgid "Suffix" -msgstr "後置:" +msgstr "後綴" #: scene/gui/split_container.cpp -#, fuzzy msgid "Split Offset" -msgstr "ç¶²æ ¼åç§»é‡ï¼š" +msgstr "拆分åç§»" #: scene/gui/split_container.cpp scene/gui/tree.cpp #, fuzzy @@ -24281,9 +24241,8 @@ msgid "Tab Align" msgstr "" #: scene/gui/tab_container.cpp scene/gui/tabs.cpp -#, fuzzy msgid "Current Tab" -msgstr "ç›®å‰ï¼š" +msgstr "ç•¶å‰åˆ†é " #: scene/gui/tab_container.cpp #, fuzzy @@ -24327,7 +24286,7 @@ msgstr "è·³éŽä¸æ–·é»ž" #: scene/gui/text_edit.cpp #, fuzzy msgid "Fold Gutter" -msgstr "資料夾:" +msgstr "æ‘ºç–Šæ ¼ç·š" #: scene/gui/text_edit.cpp #, fuzzy @@ -24345,19 +24304,16 @@ msgid "Wrap Enabled" msgstr "啟用" #: scene/gui/text_edit.cpp -#, fuzzy msgid "Scroll Vertical" -msgstr "垂直:" +msgstr "垂直滾動" #: scene/gui/text_edit.cpp -#, fuzzy msgid "Scroll Horizontal" -msgstr "水平:" +msgstr "水平滾動" #: scene/gui/text_edit.cpp -#, fuzzy msgid "Draw" -msgstr "繪製呼å«ï¼š" +msgstr "繪製" #: scene/gui/text_edit.cpp #, fuzzy @@ -24415,9 +24371,8 @@ msgid "Progress Offset" msgstr "" #: scene/gui/texture_progress.cpp -#, fuzzy msgid "Fill Mode" -msgstr "æ’æ”¾æ¨¡å¼ï¼š" +msgstr "填充模å¼" #: scene/gui/texture_progress.cpp scene/resources/material.cpp msgid "Tint" @@ -24485,9 +24440,8 @@ msgid "Hide Folding" msgstr "å·²åœç”¨çš„æŒ‰éˆ•" #: scene/gui/tree.cpp -#, fuzzy msgid "Hide Root" -msgstr "å»ºç«‹æ ¹ç¯€é»žï¼š" +msgstr "éš±è—æ ¹ç¯€é»ž" #: scene/gui/tree.cpp msgid "Drop Mode Flags" @@ -24585,19 +24539,16 @@ msgid "Filename" msgstr "釿–°å‘½å" #: scene/main/node.cpp -#, fuzzy msgid "Owner" -msgstr "ç‚ºä¸‹åˆ—ä¹‹æ“æœ‰è€…:" +msgstr "æ“æœ‰è€…" #: scene/main/node.cpp scene/main/scene_tree.cpp -#, fuzzy msgid "Multiplayer" -msgstr "è¨å®šå¤šå€‹ï¼š" +msgstr "多人" #: scene/main/node.cpp -#, fuzzy msgid "Custom Multiplayer" -msgstr "è¨å®šå¤šå€‹ï¼š" +msgstr "自定義多人" #: scene/main/node.cpp #, fuzzy @@ -24635,7 +24586,7 @@ msgstr "" #: scene/main/scene_tree.cpp #, fuzzy msgid "Multiplayer Poll" -msgstr "è¨å®šå¤šå€‹ï¼š" +msgstr "多人投票調查" #: scene/main/scene_tree.cpp scene/resources/mesh_library.cpp #: scene/resources/shape_2d.cpp @@ -24676,7 +24627,7 @@ msgstr "åå°„" #: scene/main/scene_tree.cpp #, fuzzy msgid "Atlas Size" -msgstr "輪廓尺寸:" +msgstr "地圖集大å°" #: scene/main/scene_tree.cpp msgid "Atlas Subdiv" @@ -24732,9 +24683,8 @@ msgstr "" "建è°ä½¿ç”¨è…³æœ¬çš„處ç†è¿´åœˆï¼ˆProcess Loop)而éžé€™é¡žè¨ˆæ™‚器。" #: scene/main/timer.cpp -#, fuzzy msgid "Autostart" -msgstr "è‡ªå‹•é‡æ–°é–‹å§‹ï¼š" +msgstr "自動開始" #: scene/main/viewport.cpp #, fuzzy @@ -24816,9 +24766,8 @@ msgid "Debug Draw" msgstr "åµéŒ¯" #: scene/main/viewport.cpp -#, fuzzy msgid "Render Target" -msgstr "算繪引擎:" +msgstr "算繪目標" #: scene/main/viewport.cpp msgid "V Flip" @@ -24951,7 +24900,7 @@ msgstr "" #: scene/resources/concave_polygon_shape_2d.cpp #, fuzzy msgid "Segments" -msgstr "ä¸»å ´æ™¯å¼•æ•¸ï¼š" +msgstr "分段" #: scene/resources/curve.cpp #, fuzzy @@ -24992,9 +24941,8 @@ msgid "Font Color Disabled" msgstr "剪è£å·²ç¦ç”¨" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "H Separation" -msgstr "分隔:" +msgstr "水平分離" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25062,9 +25010,8 @@ msgid "On Disabled" msgstr "å·²åœç”¨çš„é …ç›®" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Off" -msgstr "å移:" +msgstr "關閉" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25082,14 +25029,12 @@ msgid "Font Outline Modulate" msgstr "強制使用白色調變" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Shadow Offset X" -msgstr "ç¶²æ ¼ X å移:" +msgstr "é™°å½± X åç§»" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Shadow Offset Y" -msgstr "ç¶²æ ¼ Y å移:" +msgstr "é™°å½± Y åç§»" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25147,14 +25092,12 @@ msgid "Space" msgstr "ä¸»å ´æ™¯" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Folded" -msgstr "資料夾:" +msgstr "已折å " #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Fold" -msgstr "資料夾:" +msgstr "折疊" #: scene/resources/default_theme/default_theme.cpp msgid "Font Color Readonly" @@ -25273,14 +25216,12 @@ msgid "Close Highlight" msgstr "呿€§å…‰ç…§" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Close H Offset" -msgstr "ç¶²æ ¼åç§»é‡ï¼š" +msgstr "關閉水平åç§»" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Close V Offset" -msgstr "ç¶²æ ¼åç§»é‡ï¼š" +msgstr "關閉垂直åç§»" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25321,9 +25262,8 @@ msgid "Font Color Separator" msgstr "分隔線å—é«”é¡è‰²" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "V Separation" -msgstr "分隔:" +msgstr "垂直分隔" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25366,19 +25306,16 @@ msgid "Resizer Color" msgstr "é¡è‰²" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Offset" -msgstr "ç¶²æ ¼åç§»é‡ï¼š" +msgstr "標題åç§»é‡" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Close Offset" -msgstr "ç¶²æ ¼åç§»é‡ï¼š" +msgstr "關閉åç§»" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Port Offset" -msgstr "ç¶²æ ¼åç§»é‡ï¼š" +msgstr "é€£æŽ¥åŸ åç§»é‡" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25489,9 +25426,8 @@ msgid "Draw Guides" msgstr "顯示åƒè€ƒç·š" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Scroll Border" -msgstr "垂直:" +msgstr "æ²è»¸é‚Šæ¡†" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25504,9 +25440,8 @@ msgid "Icon Margin" msgstr "è¨å®šå¤–邊è·" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Line Separation" -msgstr "分隔:" +msgstr "行分隔" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25566,9 +25501,8 @@ msgid "Large" msgstr "目標" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Folder" -msgstr "資料夾:" +msgstr "資料夾" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25668,14 +25602,12 @@ msgid "Mono Font" msgstr "ä¸»å ´æ™¯" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Table H Separation" -msgstr "分隔:" +msgstr "è¡¨æ ¼æ°´å¹³åˆ†éš”" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Table V Separation" -msgstr "分隔:" +msgstr "è¡¨æ ¼åž‚ç›´åˆ†éš”" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25769,9 +25701,8 @@ msgid "Font Path" msgstr "èšç„¦è·¯å¾‘" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Outline Size" -msgstr "輪廓尺寸:" +msgstr "輪廓尺寸" #: scene/resources/dynamic_font.cpp #, fuzzy @@ -25784,14 +25715,12 @@ msgid "Use Mipmaps" msgstr "訊號" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Extra Spacing" -msgstr "更多é¸é …:" +msgstr "é¡å¤–é–“è·" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Char" -msgstr "å¯ä½¿ç”¨çš„å—元:" +msgstr "å—å…ƒ" #: scene/resources/dynamic_font.cpp #, fuzzy @@ -25817,9 +25746,8 @@ msgid "Sky Orientation" msgstr "線上說明文件" #: scene/resources/environment.cpp -#, fuzzy msgid "Sky Rotation" -msgstr "旋轉æ¥é•·ï¼š" +msgstr "天空旋轉" #: scene/resources/environment.cpp msgid "Sky Rotation Degrees" @@ -25848,14 +25776,12 @@ msgid "Fog" msgstr "" #: scene/resources/environment.cpp -#, fuzzy msgid "Sun Color" -msgstr "å„²å˜æª”案:" +msgstr "太陽é¡è‰²" #: scene/resources/environment.cpp -#, fuzzy msgid "Sun Amount" -msgstr "數é‡ï¼š" +msgstr "太陽亮度" #: scene/resources/environment.cpp #, fuzzy @@ -25944,14 +25870,12 @@ msgid "Max Steps" msgstr "æ¥é•·" #: scene/resources/environment.cpp -#, fuzzy msgid "Fade In" -msgstr "淡入(秒):" +msgstr "æ·¡å…¥" #: scene/resources/environment.cpp -#, fuzzy msgid "Fade Out" -msgstr "淡出(秒):" +msgstr "淡出" #: scene/resources/environment.cpp #, fuzzy @@ -25967,9 +25891,8 @@ msgid "SSAO" msgstr "" #: scene/resources/environment.cpp -#, fuzzy msgid "Radius 2" -msgstr "åŠå¾‘:" +msgstr "åŠå¾‘2" #: scene/resources/environment.cpp msgid "Intensity 2" @@ -25998,9 +25921,8 @@ msgid "DOF Far Blur" msgstr "" #: scene/resources/environment.cpp scene/resources/material.cpp -#, fuzzy msgid "Distance" -msgstr "鏿“‡è·é›¢ï¼š" +msgstr "è·é›¢" #: scene/resources/environment.cpp msgid "Transition" @@ -26082,9 +26004,8 @@ msgid "Brightness" msgstr "燈光" #: scene/resources/environment.cpp -#, fuzzy msgid "Saturation" -msgstr "分隔:" +msgstr "飽和度" #: scene/resources/environment.cpp msgid "Color Correction" @@ -26093,7 +26014,7 @@ msgstr "é¡è‰²æ ¡æ£" #: scene/resources/font.cpp #, fuzzy msgid "Ascent" -msgstr "最近å˜å–:" +msgstr "上å‡" #: scene/resources/font.cpp #, fuzzy @@ -26106,9 +26027,8 @@ msgid "Raw Data" msgstr "深度" #: scene/resources/gradient.cpp -#, fuzzy msgid "Offsets" -msgstr "å移:" +msgstr "åç§»" #: scene/resources/height_map_shape.cpp msgid "Map Width" @@ -26191,9 +26111,8 @@ msgid "Is sRGB" msgstr "" #: scene/resources/material.cpp servers/visual_server.cpp -#, fuzzy msgid "Parameters" -msgstr "å·²æ›´æ”¹åƒæ•¸ï¼š" +msgstr "åƒæ•¸" #: scene/resources/material.cpp #, fuzzy @@ -26235,9 +26154,8 @@ msgid "Grow" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Grow Amount" -msgstr "數é‡ï¼š" +msgstr "生æˆé‡" #: scene/resources/material.cpp msgid "Use Alpha Scissor" @@ -26342,9 +26260,8 @@ msgid "Transmission" msgstr "è½‰å ´" #: scene/resources/material.cpp -#, fuzzy msgid "Refraction" -msgstr "分隔:" +msgstr "折射" #: scene/resources/material.cpp msgid "Detail" @@ -26429,7 +26346,7 @@ msgstr "" #: scene/resources/navigation_mesh.cpp msgid "Sampling" -msgstr "縮放:" +msgstr "å–æ¨£" #: scene/resources/navigation_mesh.cpp #, fuzzy @@ -26456,7 +26373,7 @@ msgstr "" #: scene/resources/navigation_mesh.cpp #, fuzzy msgid "Agents" -msgstr "ä¸»å ´æ™¯å¼•æ•¸ï¼š" +msgstr "代ç†" #: scene/resources/navigation_mesh.cpp msgid "Max Climb" @@ -26495,9 +26412,8 @@ msgid "Details" msgstr "顯示é è¨" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Sample Distance" -msgstr "鏿“‡è·é›¢ï¼š" +msgstr "採樣è·é›¢" #: scene/resources/navigation_mesh.cpp #, fuzzy @@ -26522,9 +26438,8 @@ msgid "Baking AABB" msgstr "æ£åœ¨ç”¢ç”Ÿ AABB" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Baking AABB Offset" -msgstr "å移:" +msgstr "烘焙 AABB åç§»" #: scene/resources/occluder_shape.cpp msgid "Spheres" @@ -26567,9 +26482,8 @@ msgid "Color Modifier" msgstr "放慢自由視圖速度" #: scene/resources/particles_material.cpp -#, fuzzy msgid "Point Texture" -msgstr "發射點:" +msgstr "點紋ç†è²¼åœ–" #: scene/resources/particles_material.cpp msgid "Normal Texture" @@ -26585,9 +26499,8 @@ msgid "Point Count" msgstr "æ–°å¢žè¼¸å…¥åŸ å£" #: scene/resources/particles_material.cpp -#, fuzzy msgid "Scale Random" -msgstr "縮放比例:" +msgstr "縮放隨機" #: scene/resources/particles_material.cpp #, fuzzy @@ -26603,9 +26516,8 @@ msgid "Absorbent" msgstr "" #: scene/resources/plane_shape.cpp -#, fuzzy msgid "Plane" -msgstr "å¹³é¢ï¼š" +msgstr "å¹³é¢" #: scene/resources/primitive_meshes.cpp #, fuzzy @@ -26629,9 +26541,8 @@ msgid "Subdivide Depth" msgstr "" #: scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Top Radius" -msgstr "åŠå¾‘:" +msgstr "é ‚éƒ¨åŠå¾‘" #: scene/resources/primitive_meshes.cpp #, fuzzy @@ -26680,9 +26591,8 @@ msgid "Bone" msgstr "骨骼" #: scene/resources/sky.cpp -#, fuzzy msgid "Radiance Size" -msgstr "輪廓尺寸:" +msgstr "光澤大å°" #: scene/resources/sky.cpp msgid "Panorama" @@ -26694,9 +26604,8 @@ msgid "Top Color" msgstr "下一個地æ¿" #: scene/resources/sky.cpp -#, fuzzy msgid "Horizon Color" -msgstr "å„²å˜æª”案:" +msgstr "地平線é¡è‰²" #: scene/resources/sky.cpp #, fuzzy @@ -26805,9 +26714,8 @@ msgid "Lossy Storage Quality" msgstr "截å–" #: scene/resources/texture.cpp -#, fuzzy msgid "From" -msgstr "æ’æ”¾æ¨¡å¼ï¼š" +msgstr "來自" #: scene/resources/texture.cpp #, fuzzy @@ -26973,9 +26881,8 @@ msgid "Default Cell Height" msgstr "測試" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Default Edge Connection Margin" -msgstr "編輯連接內容:" +msgstr "é è¨é‚Šç·£é€£æŽ¥é‚Šè·" #: scene/resources/world_2d.cpp msgid "Canvas" @@ -27009,9 +26916,8 @@ msgid "Audio Stream" msgstr "å–®é¸é …" #: servers/audio/audio_stream.cpp -#, fuzzy msgid "Random Pitch" -msgstr "隨機傾斜:" +msgstr "隨機音高" #: servers/audio/effects/audio_effect_capture.cpp #: servers/audio/effects/audio_effect_spectrum_analyzer.cpp @@ -27061,9 +26967,8 @@ msgstr "" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_delay.cpp #: servers/audio/effects/audio_effect_panner.cpp -#, fuzzy msgid "Pan" -msgstr "å¹³é¢ï¼š" +msgstr "平移" #: servers/audio/effects/audio_effect_compressor.cpp #: servers/audio/effects/audio_effect_filter.cpp @@ -27159,9 +27064,8 @@ msgstr "" #: servers/audio/effects/audio_effect_pitch_shift.cpp #: servers/audio/effects/audio_effect_spectrum_analyzer.cpp -#, fuzzy msgid "FFT Size" -msgstr "大å°ï¼š" +msgstr "FFT 大å°" #: servers/audio/effects/audio_effect_reverb.cpp msgid "Predelay" @@ -27452,7 +27356,6 @@ msgid "Filter Mode" msgstr "篩é¸ç¯€é»ž" #: servers/visual_server.cpp -#, fuzzy msgid "Texture Array Reflections" msgstr "ç´‹ç†è²¼åœ–陣列åå°„" @@ -27511,22 +27414,18 @@ msgid "Use Nearest Mipmap Filter" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Skinning" msgstr "外觀變更" #: servers/visual_server.cpp -#, fuzzy msgid "Software Skinning Fallback" msgstr "軟體外觀變更後備" #: servers/visual_server.cpp -#, fuzzy msgid "Force Software Skinning" msgstr "強制軟體外觀變更" #: servers/visual_server.cpp -#, fuzzy msgid "Use Software Skinning" msgstr "使用軟體外觀變更" @@ -27587,7 +27486,6 @@ msgid "Scissor Area Threshold" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Max Join Items" msgstr "æœ€å¤§åŠ å…¥é …ç›®æ•¸" diff --git a/gles3_builders.py b/gles3_builders.py index eafe503dd5..84f11532e0 100644 --- a/gles3_builders.py +++ b/gles3_builders.py @@ -3,6 +3,10 @@ All such functions are invoked in a subprocess on Windows to prevent build flakiness. """ +import os.path + +from typing import Optional + from platform_methods import subprocess_main @@ -30,7 +34,7 @@ class GLES3HeaderStruct: self.specialization_values = [] -def include_file_in_gles3_header(filename, header_data, depth): +def include_file_in_gles3_header(filename: str, header_data: GLES3HeaderStruct, depth: int): fs = open(filename, "r") line = fs.readline() @@ -91,8 +95,6 @@ def include_file_in_gles3_header(filename, header_data, depth): while line.find("#include ") != -1: includeline = line.replace("#include ", "").strip()[1:-1] - import os.path - included_file = os.path.relpath(os.path.dirname(filename) + "/" + includeline) if not included_file in header_data.vertex_included_files and header_data.reading == "vertex": header_data.vertex_included_files += [included_file] @@ -182,7 +184,7 @@ def include_file_in_gles3_header(filename, header_data, depth): return header_data -def build_gles3_header(filename, include, class_suffix, header_data=None): +def build_gles3_header(filename: str, include: str, class_suffix: str, header_data: Optional[GLES3HeaderStruct] = None): header_data = header_data or GLES3HeaderStruct() include_file_in_gles3_header(filename, header_data, 0) diff --git a/glsl_builders.py b/glsl_builders.py index 8cb5807f21..888f541cf4 100644 --- a/glsl_builders.py +++ b/glsl_builders.py @@ -4,13 +4,15 @@ All such functions are invoked in a subprocess on Windows to prevent build flaki """ import os.path +from typing import Optional, Iterable + from platform_methods import subprocess_main -def generate_inline_code(input_lines, insert_newline=True): +def generate_inline_code(input_lines: Iterable[str], insert_newline: bool = True): """Take header data and generate inline code - :param: list input_lines: values for shared inline code + :param: input_lines: values for shared inline code :return: str - generated inline value """ output = [] @@ -40,7 +42,7 @@ class RDHeaderStruct: self.compute_offset = 0 -def include_file_in_rd_header(filename, header_data, depth): +def include_file_in_rd_header(filename: str, header_data: RDHeaderStruct, depth: int) -> RDHeaderStruct: fs = open(filename, "r") line = fs.readline() @@ -112,7 +114,7 @@ def include_file_in_rd_header(filename, header_data, depth): return header_data -def build_rd_header(filename, header_data=None): +def build_rd_header(filename: str, header_data: Optional[RDHeaderStruct] = None) -> None: header_data = header_data or RDHeaderStruct() include_file_in_rd_header(filename, header_data, 0) @@ -171,7 +173,7 @@ class RAWHeaderStruct: self.code = "" -def include_file_in_raw_header(filename, header_data, depth): +def include_file_in_raw_header(filename: str, header_data: RAWHeaderStruct, depth: int) -> None: fs = open(filename, "r") line = fs.readline() @@ -191,7 +193,7 @@ def include_file_in_raw_header(filename, header_data, depth): fs.close() -def build_raw_header(filename, header_data=None): +def build_raw_header(filename: str, header_data: Optional[RAWHeaderStruct] = None): header_data = header_data or RAWHeaderStruct() include_file_in_raw_header(filename, header_data, 0) diff --git a/main/main.cpp b/main/main.cpp index a338b71154..08a9b4c310 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -141,6 +141,7 @@ static bool _start_success = false; String tablet_driver = ""; String text_driver = ""; String rendering_driver = ""; +String rendering_method = ""; static int text_driver_idx = -1; static int display_driver_idx = -1; static int audio_driver_idx = -1; @@ -156,6 +157,7 @@ static bool show_help = false; static bool auto_quit = false; static OS::ProcessID editor_pid = 0; #ifdef TOOLS_ENABLED +static bool found_project = false; static bool auto_build_solutions = false; static String debug_server_uri; static int converter_max_kb_file = 4 * 1024; // 4MB @@ -353,6 +355,7 @@ void Main::print_help(const char *p_binary) { } OS::get_singleton()->print("].\n"); + OS::get_singleton()->print(" --rendering-method <renderer> Renderer name. Requires driver support.\n"); OS::get_singleton()->print(" --rendering-driver <driver> Rendering driver (depends on display driver).\n"); OS::get_singleton()->print(" --gpu-index <device_index> Use a specific GPU (run with --verbose to get available device list).\n"); OS::get_singleton()->print(" --text-driver <driver> Text driver (Fonts, BiDi, shaping)\n"); @@ -705,11 +708,9 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph Vector<String> breakpoints; bool use_custom_res = true; bool force_res = false; -#ifdef TOOLS_ENABLED - bool found_project = false; -#endif String default_renderer = ""; + String default_renderer_mobile = ""; String renderer_hints = ""; packed_data = PackedData::get_singleton(); @@ -757,6 +758,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph } if (I->get() == "--audio-driver" || I->get() == "--display-driver" || + I->get() == "--rendering-method" || I->get() == "--rendering-driver") { if (I->next()) { forwardable_cli_arguments[CLI_SCOPE_TOOL].push_back(I->get()); @@ -866,43 +868,17 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph OS::get_singleton()->print("Missing display driver argument, aborting.\n"); goto error; } + } else if (I->get() == "--rendering-method") { + if (I->next()) { + rendering_method = I->next()->get(); + N = I->next()->next(); + } else { + OS::get_singleton()->print("Missing renderer name argument, aborting.\n"); + goto error; + } } else if (I->get() == "--rendering-driver") { if (I->next()) { rendering_driver = I->next()->get(); - - // as the rendering drivers available may depend on the display driver selected, - // we can't do an exhaustive check here, but we can look through all the options in - // all the display drivers for a match - - bool found = false; - for (int i = 0; i < DisplayServer::get_create_function_count(); i++) { - Vector<String> r_drivers = DisplayServer::get_create_function_rendering_drivers(i); - - for (int d = 0; d < r_drivers.size(); d++) { - if (rendering_driver == r_drivers[d]) { - found = true; - break; - } - } - } - - if (!found) { - OS::get_singleton()->print("Unknown rendering driver '%s', aborting.\nValid options are ", - rendering_driver.utf8().get_data()); - - for (int i = 0; i < DisplayServer::get_create_function_count(); i++) { - Vector<String> r_drivers = DisplayServer::get_create_function_rendering_drivers(i); - - for (int d = 0; d < r_drivers.size(); d++) { - OS::get_singleton()->print("'%s', ", r_drivers[d].utf8().get_data()); - } - } - - OS::get_singleton()->print(".\n"); - - goto error; - } - N = I->next()->next(); } else { OS::get_singleton()->print("Missing rendering driver argument, aborting.\n"); @@ -1485,45 +1461,192 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph OS::get_singleton()->set_cmdline(execpath, main_args, user_args); - // possibly be worth changing the default from vulkan to something lower spec, - // for the project manager, depending on how smooth the fallback is. + { + String driver_hints = ""; +#ifdef VULKAN_ENABLED + driver_hints = "vulkan"; +#endif - // this list is hard coded, which makes it more difficult to add new backends. - // can potentially be changed to more of a plugin system at a later date. + String default_driver = driver_hints.get_slice(",", 0); + + // For now everything defaults to vulkan when available. This can change in future updates. + GLOBAL_DEF("rendering/rendering_device/driver", default_driver); + GLOBAL_DEF("rendering/rendering_device/driver.windows", default_driver); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/rendering_device/driver.windows", + PropertyInfo(Variant::STRING, "rendering/rendering_device/driver.windows", PROPERTY_HINT_ENUM, driver_hints)); + GLOBAL_DEF("rendering/rendering_device/driver.linuxbsd", default_driver); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/rendering_device/driver.linuxbsd", + PropertyInfo(Variant::STRING, "rendering/rendering_device/driver.linuxbsd", PROPERTY_HINT_ENUM, driver_hints)); + GLOBAL_DEF("rendering/rendering_device/driver.android", default_driver); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/rendering_device/driver.android", + PropertyInfo(Variant::STRING, "rendering/rendering_device/driver.android", PROPERTY_HINT_ENUM, driver_hints)); + GLOBAL_DEF("rendering/rendering_device/driver.ios", default_driver); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/rendering_device/driver.ios", + PropertyInfo(Variant::STRING, "rendering/rendering_device/driver.ios", PROPERTY_HINT_ENUM, driver_hints)); + GLOBAL_DEF("rendering/rendering_device/driver.macos", default_driver); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/rendering_device/driver.macos", + PropertyInfo(Variant::STRING, "rendering/rendering_device/driver.macos", PROPERTY_HINT_ENUM, driver_hints)); + + driver_hints = ""; +#ifdef GLES3_ENABLED + driver_hints += "opengl3"; +#endif - // Start with Vulkan, which will be the default if enabled. + default_driver = driver_hints.get_slice(",", 0); + + GLOBAL_DEF("rendering/gl_compatibility/driver", default_driver); + GLOBAL_DEF("rendering/gl_compatibility/driver.windows", default_driver); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/gl_compatibility/driver.windows", + PropertyInfo(Variant::STRING, "rendering/gl_compatibility/driver.windows", PROPERTY_HINT_ENUM, driver_hints)); + GLOBAL_DEF("rendering/gl_compatibility/driver.linuxbsd", default_driver); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/gl_compatibility/driver.linuxbsd", + PropertyInfo(Variant::STRING, "rendering/gl_compatibility/driver.linuxbsd", PROPERTY_HINT_ENUM, driver_hints)); + GLOBAL_DEF("rendering/gl_compatibility/driver.web", default_driver); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/gl_compatibility/driver.web", + PropertyInfo(Variant::STRING, "rendering/gl_compatibility/driver.web", PROPERTY_HINT_ENUM, driver_hints)); + GLOBAL_DEF("rendering/gl_compatibility/driver.android", default_driver); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/gl_compatibility/driver.android", + PropertyInfo(Variant::STRING, "rendering/gl_compatibility/driver.android", PROPERTY_HINT_ENUM, driver_hints)); + GLOBAL_DEF("rendering/gl_compatibility/driver.ios", default_driver); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/gl_compatibility/driver.ios", + PropertyInfo(Variant::STRING, "rendering/gl_compatibility/driver.ios", PROPERTY_HINT_ENUM, driver_hints)); + GLOBAL_DEF("rendering/gl_compatibility/driver.macos", default_driver); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/gl_compatibility/driver.macos", + PropertyInfo(Variant::STRING, "rendering/gl_compatibility/driver.macos", PROPERTY_HINT_ENUM, driver_hints)); + } + + // Start with RenderingDevice-based backends. Should be included if any RD driver present. #ifdef VULKAN_ENABLED - renderer_hints = "vulkan"; + renderer_hints = "forward_plus,mobile"; + default_renderer_mobile = "mobile"; #endif - // And OpenGL3 next, or first if Vulkan is disabled. + // And Compatibility next, or first if Vulkan is disabled. #ifdef GLES3_ENABLED if (!renderer_hints.is_empty()) { renderer_hints += ","; } - renderer_hints += "opengl3"; + renderer_hints += "gl_compatibility"; + if (default_renderer_mobile.is_empty()) { + default_renderer_mobile = "gl_compatibility"; + } #endif if (renderer_hints.is_empty()) { - ERR_PRINT("No rendering driver available."); + ERR_PRINT("No renderers available."); + } + + if (!rendering_method.is_empty()) { + if (rendering_method != "forward_plus" && + rendering_method != "mobile" && + rendering_method != "gl_compatibility") { + OS::get_singleton()->print("Unknown renderer name '%s', aborting. Valid options are: %s\n", rendering_method.utf8().get_data(), renderer_hints.utf8().get_data()); + goto error; + } + } + + if (!rendering_driver.is_empty()) { + // As the rendering drivers available may depend on the display driver and renderer + // selected, we can't do an exhaustive check here, but we can look through all + // the options in all the display drivers for a match. + + bool found = false; + for (int i = 0; i < DisplayServer::get_create_function_count(); i++) { + Vector<String> r_drivers = DisplayServer::get_create_function_rendering_drivers(i); + + for (int d = 0; d < r_drivers.size(); d++) { + if (rendering_driver == r_drivers[d]) { + found = true; + break; + } + } + } + + if (!found) { + OS::get_singleton()->print("Unknown rendering driver '%s', aborting.\nValid options are ", + rendering_driver.utf8().get_data()); + + for (int i = 0; i < DisplayServer::get_create_function_count(); i++) { + Vector<String> r_drivers = DisplayServer::get_create_function_rendering_drivers(i); + + for (int d = 0; d < r_drivers.size(); d++) { + OS::get_singleton()->print("'%s', ", r_drivers[d].utf8().get_data()); + } + } + + OS::get_singleton()->print(".\n"); + + goto error; + } + + // Set a default renderer if none selected. Try to choose one that matches the driver. + if (rendering_method.is_empty()) { + if (rendering_driver == "opengl3") { + rendering_method = "gl_compatibility"; + } else { + rendering_method = "forward_plus"; + } + } + + // Now validate whether the selected driver matches with the renderer. + bool valid_combination = false; + Vector<String> available_drivers; + if (rendering_method == "forward_plus" || rendering_method == "mobile") { + available_drivers.push_back("vulkan"); + } else if (rendering_method == "gl_compatibility") { + available_drivers.push_back("opengl3"); + } else { + OS::get_singleton()->print("Unknown renderer name '%s', aborting.\n", rendering_method.utf8().get_data()); + goto error; + } + + for (int i = 0; i < available_drivers.size(); i++) { + if (rendering_driver == available_drivers[i]) { + valid_combination = true; + break; + } + } + + if (!valid_combination) { + OS::get_singleton()->print("Invalid renderer/driver combination '%s' and '%s', aborting. %s only supports the following drivers ", rendering_method.utf8().get_data(), rendering_driver.utf8().get_data(), rendering_method.utf8().get_data()); + + for (int d = 0; d < available_drivers.size(); d++) { + OS::get_singleton()->print("'%s', ", available_drivers[d].utf8().get_data()); + } + + OS::get_singleton()->print(".\n"); + + goto error; + } } default_renderer = renderer_hints.get_slice(",", 0); - GLOBAL_DEF_RST("rendering/driver/driver_name", default_renderer); + GLOBAL_DEF_RST_BASIC("rendering/renderer/rendering_method", default_renderer); + GLOBAL_DEF_RST_BASIC("rendering/renderer/rendering_method.mobile", default_renderer_mobile); + GLOBAL_DEF_RST_BASIC("rendering/renderer/rendering_method.web", "gl_compatibility"); // This is a bit of a hack until we have WebGPU support. - ProjectSettings::get_singleton()->set_custom_property_info("rendering/driver/driver_name", + ProjectSettings::get_singleton()->set_custom_property_info("rendering/renderer/rendering_method", PropertyInfo(Variant::STRING, - "rendering/driver/driver_name", + "rendering/renderer/rendering_method", PROPERTY_HINT_ENUM, renderer_hints)); - // if not set on the command line + // Default to ProjectSettings default if nothing set on the command line. + if (rendering_method.is_empty()) { + rendering_method = GLOBAL_GET("rendering/renderer/rendering_method"); + } + if (rendering_driver.is_empty()) { - rendering_driver = GLOBAL_GET("rendering/driver/driver_name"); + if (rendering_method == "gl_compatibility") { + rendering_driver = GLOBAL_GET("rendering/gl_compatibility/driver"); + } else { + rendering_driver = GLOBAL_GET("rendering/rendering_device/driver"); + } } // note this is the desired rendering driver, it doesn't mean we will get it. // TODO - make sure this is updated in the case of fallbacks, so that the user interface // shows the correct driver string. OS::get_singleton()->set_current_rendering_driver_name(rendering_driver); + OS::get_singleton()->set_current_rendering_method(rendering_method); // always convert to lower case for consistency in the code rendering_driver = rendering_driver.to_lower(); @@ -1552,13 +1675,19 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph if (bool(GLOBAL_GET("display/window/size/borderless"))) { window_flags |= DisplayServer::WINDOW_FLAG_BORDERLESS_BIT; } - if (bool(GLOBAL_GET("display/window/size/fullscreen"))) { - window_mode = DisplayServer::WINDOW_MODE_FULLSCREEN; - } - if (bool(GLOBAL_GET("display/window/size/always_on_top"))) { window_flags |= DisplayServer::WINDOW_FLAG_ALWAYS_ON_TOP_BIT; } + if (bool(GLOBAL_GET("display/window/size/transparent"))) { + window_flags |= DisplayServer::WINDOW_FLAG_TRANSPARENT_BIT; + } + if (bool(GLOBAL_GET("display/window/size/extend_to_title"))) { + window_flags |= DisplayServer::WINDOW_FLAG_EXTEND_TO_TITLE_BIT; + } + if (bool(GLOBAL_GET("display/window/size/no_focus"))) { + window_flags |= DisplayServer::WINDOW_FLAG_NO_FOCUS_BIT; + } + window_mode = (DisplayServer::WindowMode)(GLOBAL_GET("display/window/size/mode").operator int()); } GLOBAL_DEF_RST("internationalization/rendering/force_right_to_left_layout_direction", false); @@ -1577,13 +1706,9 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph } if (rtm >= 0 && rtm < 3) { -#ifdef NO_THREADS - rtm = OS::RENDER_THREAD_UNSAFE; // No threads available on this platform. -#else if (editor) { rtm = OS::RENDER_THREAD_SAFE; } -#endif OS::get_singleton()->_render_thread_mode = OS::RenderThreadMode(rtm); } @@ -1650,10 +1775,10 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph PropertyInfo(Variant::INT, "physics/common/physics_ticks_per_second", PROPERTY_HINT_RANGE, "1,1000,1")); Engine::get_singleton()->set_physics_jitter_fix(GLOBAL_DEF("physics/common/physics_jitter_fix", 0.5)); - Engine::get_singleton()->set_target_fps(GLOBAL_DEF("debug/settings/fps/force_fps", 0)); - ProjectSettings::get_singleton()->set_custom_property_info("debug/settings/fps/force_fps", + Engine::get_singleton()->set_max_fps(GLOBAL_DEF("application/run/max_fps", 0)); + ProjectSettings::get_singleton()->set_custom_property_info("application/run/max_fps", PropertyInfo(Variant::INT, - "debug/settings/fps/force_fps", + "application/run/max_fps", PROPERTY_HINT_RANGE, "0,1000,1")); GLOBAL_DEF("debug/settings/stdout/print_fps", false); @@ -1803,15 +1928,20 @@ Error Main::setup2(Thread::ID p_main_tid_override) { // Print engine name and version print_line(String(VERSION_NAME) + " v" + get_full_version_string() + " - " + String(VERSION_WEBSITE)); -#if !defined(NO_THREADS) if (p_main_tid_override) { Thread::main_thread_id = p_main_tid_override; } -#endif #ifdef TOOLS_ENABLED if (editor || project_manager || cmdline_tool) { EditorPaths::create(); + if (found_project && EditorPaths::get_singleton()->is_self_contained()) { + if (ProjectSettings::get_singleton()->get_resource_path() == OS::get_singleton()->get_executable_path().get_base_dir()) { + ERR_PRINT("You are trying to run a self-contained editor at the same location as a project. This is not allowed, since editor files will mix with project files."); + OS::get_singleton()->set_exit_code(EXIT_FAILURE); + return FAILED; + } + } } #endif diff --git a/methods.py b/methods.py index 1f49da7ace..bec1b803e9 100644 --- a/methods.py +++ b/methods.py @@ -1,6 +1,6 @@ import os -import re import sys +import re import glob import subprocess from collections import OrderedDict @@ -49,72 +49,65 @@ def disable_warnings(self): if self.msvc: # We have to remove existing warning level defines before appending /w, # otherwise we get: "warning D9025 : overriding '/W3' with '/w'" - warn_flags = ["/Wall", "/W4", "/W3", "/W2", "/W1", "/WX"] - self.Append(CCFLAGS=["/w"]) - self.Append(CFLAGS=["/w"]) - self.Append(CXXFLAGS=["/w"]) - self["CCFLAGS"] = [x for x in self["CCFLAGS"] if not x in warn_flags] - self["CFLAGS"] = [x for x in self["CFLAGS"] if not x in warn_flags] - self["CXXFLAGS"] = [x for x in self["CXXFLAGS"] if not x in warn_flags] + self["CCFLAGS"] = [x for x in self["CCFLAGS"] if not (x.startswith("/W") or x.startswith("/w"))] + self["CFLAGS"] = [x for x in self["CFLAGS"] if not (x.startswith("/W") or x.startswith("/w"))] + self["CXXFLAGS"] = [x for x in self["CXXFLAGS"] if not (x.startswith("/W") or x.startswith("/w"))] + self.AppendUnique(CCFLAGS=["/w"]) else: - self.Append(CCFLAGS=["-w"]) - self.Append(CFLAGS=["-w"]) - self.Append(CXXFLAGS=["-w"]) + self.AppendUnique(CCFLAGS=["-w"]) def force_optimization_on_debug(self): # 'self' is the environment - if self["target"] != "debug": + if self["target"] != "template-release": return if self.msvc: - self.Append(CCFLAGS=["/O2"]) + # We have to remove existing optimization level defines before appending /O2, + # otherwise we get: "warning D9025 : overriding '/0d' with '/02'" + self["CCFLAGS"] = [x for x in self["CCFLAGS"] if not x.startswith("/O")] + self["CFLAGS"] = [x for x in self["CFLAGS"] if not x.startswith("/O")] + self["CXXFLAGS"] = [x for x in self["CXXFLAGS"] if not x.startswith("/O")] + self.AppendUnique(CCFLAGS=["/O2"]) else: - self.Append(CCFLAGS=["-O3"]) + self.AppendUnique(CCFLAGS=["-O3"]) def add_module_version_string(self, s): self.module_version_string += "." + s -def update_version(module_version_string=""): +def get_version_info(module_version_string="", silent=False): build_name = "custom_build" if os.getenv("BUILD_NAME") != None: build_name = str(os.getenv("BUILD_NAME")) - print("Using custom build name: " + build_name) + if not silent: + print(f"Using custom build name: '{build_name}'.") import version - # NOTE: It is safe to generate this file here, since this is still executed serially - f = open("core/version_generated.gen.h", "w") - f.write("/* THIS FILE IS GENERATED DO NOT EDIT */\n") - f.write("#ifndef VERSION_GENERATED_GEN_H\n") - f.write("#define VERSION_GENERATED_GEN_H\n") - f.write('#define VERSION_SHORT_NAME "' + str(version.short_name) + '"\n') - f.write('#define VERSION_NAME "' + str(version.name) + '"\n') - f.write("#define VERSION_MAJOR " + str(version.major) + "\n") - f.write("#define VERSION_MINOR " + str(version.minor) + "\n") - f.write("#define VERSION_PATCH " + str(version.patch) + "\n") + version_info = { + "short_name": str(version.short_name), + "name": str(version.name), + "major": int(version.major), + "minor": int(version.minor), + "patch": int(version.patch), + "status": str(version.status), + "build": str(build_name), + "module_config": str(version.module_config) + module_version_string, + "year": int(version.year), + "website": str(version.website), + "docs_branch": str(version.docs), + } + # For dev snapshots (alpha, beta, RC, etc.) we do not commit status change to Git, # so this define provides a way to override it without having to modify the source. - godot_status = str(version.status) if os.getenv("GODOT_VERSION_STATUS") != None: - godot_status = str(os.getenv("GODOT_VERSION_STATUS")) - print("Using version status '{}', overriding the original '{}'.".format(godot_status, str(version.status))) - f.write('#define VERSION_STATUS "' + godot_status + '"\n') - f.write('#define VERSION_BUILD "' + str(build_name) + '"\n') - f.write('#define VERSION_MODULE_CONFIG "' + str(version.module_config) + module_version_string + '"\n') - f.write("#define VERSION_YEAR " + str(version.year) + "\n") - f.write('#define VERSION_WEBSITE "' + str(version.website) + '"\n') - f.write('#define VERSION_DOCS_BRANCH "' + str(version.docs) + '"\n') - f.write('#define VERSION_DOCS_URL "https://docs.godotengine.org/en/" VERSION_DOCS_BRANCH\n') - f.write("#endif // VERSION_GENERATED_GEN_H\n") - f.close() + version_info["status"] = str(os.getenv("GODOT_VERSION_STATUS")) + if not silent: + print(f"Using version status '{version_info['status']}', overriding the original '{version.status}'.") - # NOTE: It is safe to generate this file here, since this is still executed serially - fhash = open("core/version_hash.gen.cpp", "w") - fhash.write("/* THIS FILE IS GENERATED DO NOT EDIT */\n") - fhash.write('#include "core/version.h"\n') + # Parse Git hash if we're in a Git repo. githash = "" gitfolder = ".git" @@ -144,7 +137,49 @@ def update_version(module_version_string=""): else: githash = head - fhash.write('const char *const VERSION_HASH = "' + githash + '";\n') + version_info["git_hash"] = githash + + return version_info + + +def generate_version_header(module_version_string=""): + version_info = get_version_info(module_version_string) + + # NOTE: It is safe to generate these files here, since this is still executed serially. + + f = open("core/version_generated.gen.h", "w") + f.write( + """/* THIS FILE IS GENERATED DO NOT EDIT */ +#ifndef VERSION_GENERATED_GEN_H +#define VERSION_GENERATED_GEN_H +#define VERSION_SHORT_NAME "{short_name}" +#define VERSION_NAME "{name}" +#define VERSION_MAJOR {major} +#define VERSION_MINOR {minor} +#define VERSION_PATCH {patch} +#define VERSION_STATUS "{status}" +#define VERSION_BUILD "{build}" +#define VERSION_MODULE_CONFIG "{module_config}" +#define VERSION_YEAR {year} +#define VERSION_WEBSITE "{website}" +#define VERSION_DOCS_BRANCH "{docs_branch}" +#define VERSION_DOCS_URL "https://docs.godotengine.org/en/" VERSION_DOCS_BRANCH +#endif // VERSION_GENERATED_GEN_H +""".format( + **version_info + ) + ) + f.close() + + fhash = open("core/version_hash.gen.cpp", "w") + fhash.write( + """/* THIS FILE IS GENERATED DO NOT EDIT */ +#include "core/version.h" +const char *const VERSION_HASH = "{git_hash}"; +""".format( + **version_info + ) + ) fhash.close() @@ -628,7 +663,6 @@ def detect_visual_c_compiler_version(tools_env): if vc_x86_amd64_compiler_detection_index > -1 and ( vc_chosen_compiler_index == -1 or vc_chosen_compiler_index > vc_x86_amd64_compiler_detection_index ): - vc_chosen_compiler_index = vc_x86_amd64_compiler_detection_index vc_chosen_compiler_str = "x86_amd64" return vc_chosen_compiler_str @@ -702,20 +736,19 @@ def generate_vs_project(env, num_jobs): if batch_file: class ModuleConfigs(Mapping): - # This version information (Win32, x64, Debug, Release, Release_Debug seems to be + # This version information (Win32, x64, Debug, Release) seems to be # required for Visual Studio to understand that it needs to generate an NMAKE # project. Do not modify without knowing what you are doing. PLATFORMS = ["Win32", "x64"] PLATFORM_IDS = ["x86_32", "x86_64"] - CONFIGURATIONS = ["debug", "release", "release_debug"] - CONFIGURATION_IDS = ["tools", "opt", "opt.tools"] + CONFIGURATIONS = ["editor", "template_release", "template_debug"] + DEV_SUFFIX = ".dev" if env["dev_build"] else "" @staticmethod def for_every_variant(value): return [value for _ in range(len(ModuleConfigs.CONFIGURATIONS) * len(ModuleConfigs.PLATFORMS))] def __init__(self): - shared_targets_array = [] self.names = [] self.arg_dict = { @@ -744,8 +777,8 @@ def generate_vs_project(env, num_jobs): for platform in ModuleConfigs.PLATFORMS ] self.arg_dict["runfile"] += [ - f'bin\\godot.windows.{config_id}.{plat_id}{f".{name}" if name else ""}.exe' - for config_id in ModuleConfigs.CONFIGURATION_IDS + f'bin\\godot.windows.{config}{ModuleConfigs.DEV_SUFFIX}.{plat_id}{f".{name}" if name else ""}.exe' + for config in ModuleConfigs.CONFIGURATIONS for plat_id in ModuleConfigs.PLATFORM_IDS ] self.arg_dict["cpppaths"] += ModuleConfigs.for_every_variant(env["CPPPATH"] + [includes]) @@ -753,7 +786,6 @@ def generate_vs_project(env, num_jobs): self.arg_dict["cmdargs"] += ModuleConfigs.for_every_variant(cli_args) def build_commandline(self, commands): - configuration_getter = ( "$(Configuration" + "".join([f'.Replace("{name}", "")' for name in self.names[1:]]) @@ -764,8 +796,6 @@ def generate_vs_project(env, num_jobs): common_build_prefix = [ 'cmd /V /C set "plat=$(PlatformTarget)"', '(if "$(PlatformTarget)"=="x64" (set "plat=x86_amd64"))', - 'set "tools=%s"' % env["tools"], - f'(if "{configuration_getter}"=="release" (set "tools=no"))', 'call "' + batch_file + '" !plat!', ] @@ -778,10 +808,12 @@ def generate_vs_project(env, num_jobs): "platform=windows", f"target={configuration_getter}", "progress=no", - "tools=!tools!", "-j%s" % num_jobs, ] + if env["dev_build"]: + common_build_postfix.append("dev_build=yes") + if env["tests"]: common_build_postfix.append("tests=yes") @@ -811,7 +843,8 @@ def generate_vs_project(env, num_jobs): add_to_vs_project(env, env.servers_sources) if env["tests"]: add_to_vs_project(env, env.tests_sources) - add_to_vs_project(env, env.editor_sources) + if env.editor_build: + add_to_vs_project(env, env.editor_sources) for header in glob_recursive("**/*.h"): env.vs_incs.append(str(header)) @@ -819,7 +852,7 @@ def generate_vs_project(env, num_jobs): module_configs = ModuleConfigs() if env.get("module_mono_enabled"): - mono_defines = [("GD_MONO_HOT_RELOAD",)] if env["tools"] else [] + mono_defines = [("GD_MONO_HOT_RELOAD",)] if env.editor_build else [] module_configs.add_mode( "mono", cli_args="module_mono_enabled=yes", diff --git a/misc/dist/html/editor.html b/misc/dist/html/editor.html index 7c44dd45a1..c9f3c2cc0d 100644 --- a/misc/dist/html/editor.html +++ b/misc/dist/html/editor.html @@ -259,31 +259,20 @@ >Web editor documentation</a> for usage instructions and limitations. </p> </div> - <div id="welcome-modal-description-no-cross-origin-isolation" style="display: none"> + <div id="welcome-modal-missing-description" style="display: none"> <p> - The web server does not support cross-origin isolation, - which is required for the Godot Web Editor to function. - </p> - <p> - <strong>Reasons for cross-origin isolation being disabled:</strong> - <ul> - <li id="welcome-modal-reason-not-secure"> - This page is not served from a secure context (HTTPS <i>or</i> localhost). - </li> - <li> - This page may not be served with cross-origin isolation headers - (check with the developer tools' Network tab). - </li> + <strong>The following features required by the Godot Web Editor are missing:</strong> + <ul id="welcome-modal-missing-list"> </ul> </p> <p> If you are self-hosting the web editor, refer to <a - href="https://docs.godotengine.org/en/latest/tutorials/export/exporting_for_web.html#threads" + href="https://docs.godotengine.org/en/latest/tutorials/export/exporting_for_web.html" target="_blank" rel="noopener" - >Exporting for the Web - Threads</a> for more information. + >Exporting for the Web</a> for more information. </p> </div> <div style="text-align: center"> @@ -394,16 +383,22 @@ }); } - if (!crossOriginIsolated) { + const missing = Engine.getMissingFeatures(); + if (missing.length) { // Display error dialog as threading support is required for the editor. setButtonEnabled('startButton', false); document.getElementById("welcome-modal-description").style.display = "none"; - document.getElementById("welcome-modal-description-no-cross-origin-isolation").style.display = "block"; + document.getElementById("welcome-modal-missing-description").style.display = "block"; document.getElementById("welcome-modal-dismiss").style.display = "none"; - document.getElementById("welcome-modal-reason-not-secure").style.display = window.isSecureContext ? "none" : "list-item"; + const list = document.getElementById("welcome-modal-missing-list"); + for (let i = 0; i < missing.length; i++) { + const node = document.createElement("li"); + node.innerText = missing[i]; + list.appendChild(node); + } } - if (!crossOriginIsolated || localStorage.getItem("welcomeModalDismissed") !== 'true') { + if (missing.length || localStorage.getItem("welcomeModalDismissed") !== 'true') { document.getElementById("welcome-modal").style.display = "block"; document.getElementById("welcome-modal-dismiss").focus(); } @@ -416,7 +411,7 @@ } } //]]></script> - <script src="godot.tools.js"></script> + <script src="godot.editor.js"></script> <script>//<![CDATA[ var editor = null; @@ -711,7 +706,7 @@ displayFailureNotice('WebGL not available'); } else { setStatusMode('indeterminate'); - editor.init('godot.tools').then(function() { + editor.init('godot.editor').then(function() { if (zip) { editor.copyToFS("/tmp/preload.zip", zip); } diff --git a/misc/dist/html/full-size.html b/misc/dist/html/full-size.html index f385b82f1d..d5b0050cfd 100644 --- a/misc/dist/html/full-size.html +++ b/misc/dist/html/full-size.html @@ -215,8 +215,10 @@ $GODOT_HEAD_INCLUDE initializing = false; }; - if (!Engine.isWebGLAvailable()) { - displayFailureNotice('WebGL not available'); + const missing = Engine.getMissingFeatures(); + if (missing.length !== 0) { + const missingMsg = 'Warning!\nThe following features required to run Godot projects on the Web are missing:\n'; + displayFailureNotice(missingMsg + missing.join("\n")); } else { setStatusMode('indeterminate'); engine.startGame({ diff --git a/misc/dist/html/manifest.json b/misc/dist/html/manifest.json index ccfb793b20..75af81cda1 100644 --- a/misc/dist/html/manifest.json +++ b/misc/dist/html/manifest.json @@ -3,7 +3,7 @@ "short_name": "Godot", "description": "Multi-platform 2D and 3D game engine with a feature-rich editor (Web edition)", "lang": "en", - "start_url": "./godot.tools.html", + "start_url": "./godot.editor.html", "display": "standalone", "theme_color": "#202531", "icons": [ diff --git a/misc/dist/ios_xcode/godot_ios.xcodeproj/project.pbxproj b/misc/dist/ios_xcode/godot_ios.xcodeproj/project.pbxproj index 467aa3ce83..b58f002f3c 100644 --- a/misc/dist/ios_xcode/godot_ios.xcodeproj/project.pbxproj +++ b/misc/dist/ios_xcode/godot_ios.xcodeproj/project.pbxproj @@ -249,7 +249,6 @@ GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; diff --git a/misc/dist/shell/_godot.zsh-completion b/misc/dist/shell/_godot.zsh-completion index b17bb6e66b..2bc6fe9317 100644 --- a/misc/dist/shell/_godot.zsh-completion +++ b/misc/dist/shell/_godot.zsh-completion @@ -44,6 +44,7 @@ _arguments \ '--remote-fs-password[password for remote filesystem]:remote filesystem password' \ '--audio-driver[set the audio driver]:audio driver name' \ '--display-driver[set the display driver]:display driver name' \ + "--rendering-method[set the renderer]:renderer name:((forward_plus\:'Desktop renderer' mobile\:'Desktop and mobile renderer' gl_compatibility\:'Desktop, mobile and web renderer'))" \ "--rendering-driver[set the rendering driver]:rendering driver name:((vulkan\:'Vulkan renderer' opengl3\:'OpenGL ES 3.0 renderer' dummy\:'Dummy renderer'))" \ "--gpu-index[use a specific GPU (run with --verbose to get available device list)]:device index" \ '--text-driver[set the text driver]:text driver name' \ diff --git a/misc/dist/shell/godot.bash-completion b/misc/dist/shell/godot.bash-completion index 1ab687e1fc..bc5fa600f5 100644 --- a/misc/dist/shell/godot.bash-completion +++ b/misc/dist/shell/godot.bash-completion @@ -47,6 +47,7 @@ _complete_godot_options() { --remote-fs-password --audio-driver --display-driver +--rendering-method --rendering-driver --gpu-index --text-driver @@ -58,7 +59,6 @@ _complete_godot_options() { --always-on-top --resolution --position ---headless --single-window --debug --breakpoints @@ -112,6 +112,10 @@ _complete_godot_bash() { local IFS=$' \n\t' # shellcheck disable=SC2207 COMPREPLY=($(compgen -W "unsafe safe separate" -- "$cur")) + elif [[ $prev == "--rendering-method" ]]; then + local IFS=$' \n\t' + # shellcheck disable=SC2207 + COMPREPLY=($(compgen -W "forward_plus mobile gl_compatibility" -- "$cur")) elif [[ $prev == "--rendering-driver" ]]; then local IFS=$' \n\t' # shellcheck disable=SC2207 diff --git a/misc/dist/shell/godot.fish b/misc/dist/shell/godot.fish index d58066c135..9ac692eace 100644 --- a/misc/dist/shell/godot.fish +++ b/misc/dist/shell/godot.fish @@ -23,6 +23,13 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +function godot_rendering_method_args + # Use a function instead of a fixed string to customize the argument descriptions. + echo -e "forward_plus\tHigh-end desktop renderer" + echo -e "mobile\tHigh-end mobile/desktop renderer" + echo -e "gl_compatibility\tLow-end desktop, mobile and web renderer" +end + function godot_rendering_driver_args # Use a function instead of a fixed string to customize the argument descriptions. echo -e "vulkan\tVulkan renderer" @@ -53,6 +60,7 @@ complete -c godot -l remote-fs -d "Use a remote filesystem (<host/IP>[:<port>] a complete -c godot -l remote-fs-password -d "Password for remote filesystem" -x complete -c godot -l audio-driver -d "Set the audio driver" -x complete -c godot -l display-driver -d "Set the display driver" -x +complete -c godot -l rendering-method -d "Set the renderer" -x -a "(godot_rendering_method_args)" complete -c godot -l rendering-driver -d "Set the rendering driver" -x -a "(godot_rendering_driver_args)" complete -c godot -l gpu-index -d "Use a specific GPU (run with --verbose to get available device list)" -x complete -c godot -l text-driver -d "Set the text driver" -x diff --git a/misc/hooks/pre-commit-clang-format b/misc/hooks/pre-commit-clang-format index 44b6f59132..9570d5120b 100755 --- a/misc/hooks/pre-commit-clang-format +++ b/misc/hooks/pre-commit-clang-format @@ -76,8 +76,8 @@ fi # To get consistent formatting, we recommend contributors to use the same # clang-format version as CI. -RECOMMENDED_CLANG_FORMAT_MAJOR_MIN="12" -RECOMMENDED_CLANG_FORMAT_MAJOR_MAX="14" +RECOMMENDED_CLANG_FORMAT_MAJOR_MIN="13" +RECOMMENDED_CLANG_FORMAT_MAJOR_MAX="15" if [ ! -x "$CLANG_FORMAT" ] ; then message="Error: clang-format executable not found. Please install clang-format $RECOMMENDED_CLANG_FORMAT_MAJOR_MAX." diff --git a/misc/scripts/codespell.sh b/misc/scripts/codespell.sh index f99c5d22b2..4cc01ec637 100755 --- a/misc/scripts/codespell.sh +++ b/misc/scripts/codespell.sh @@ -1,5 +1,5 @@ #!/bin/sh SKIP_LIST="./thirdparty,*.gen.*,*.po,*.pot,package-lock.json,./core/string/locales.h,./DONORS.md,./misc/dist/linux/org.godotengine.Godot.desktop,./misc/scripts/codespell.sh" -IGNORE_LIST="ba,childs,complies,curvelinear,expct,fave,findn,gird,inout,lod,nd,numer,ois,ro,statics,te,varius,varn" +IGNORE_LIST="alo,ba,childs,complies,curvelinear,doubleclick,expct,fave,findn,gird,gud,inout,lod,nd,numer,ois,readded,ro,sav,statics,te,varius,varn,wan" codespell -w -q 3 -S "${SKIP_LIST}" -L "${IGNORE_LIST}" diff --git a/misc/scripts/header_guards.sh b/misc/scripts/header_guards.sh index 9a830f3ad2..9fdc864f8c 100755 --- a/misc/scripts/header_guards.sh +++ b/misc/scripts/header_guards.sh @@ -5,11 +5,15 @@ if [ ! -f "version.py" ]; then echo "Some of the paths checks may not work as intended from a different folder." fi +files_invalid_guard="" + for file in $(find -name "thirdparty" -prune -o -name "*.h" -print); do # Skip *.gen.h and *-so_wrap.h, they're generated. if [[ "$file" == *".gen.h" || "$file" == *"-so_wrap.h" ]]; then continue; fi # Has important define before normal header guards. if [[ "$file" == *"thread.h" || "$file" == *"platform_config.h" ]]; then continue; fi + # Obj-C files don't use header guards. + if grep -q "#import " "$file"; then continue; fi bname=$(basename $file .h) @@ -43,8 +47,21 @@ for file in $(find -name "thirdparty" -prune -o -name "*.h" -print); do sed -i $file -e "$ s/#endif.*/\n#endif \/\/ $guard/" # Removes redundant \n added before, if they weren't needed. sed -i $file -e "/^$/N;/^\n$/D" + + # Check that first ifndef (should be header guard) is at the expected position. + # If not it can mean we have some code before the guard that should be after. + # "31" is the expected line with the copyright header. + first_ifndef=$(grep -n -m 1 "ifndef" $file | sed 's/\([0-9]*\).*/\1/') + if [[ "$first_ifndef" != "31" ]]; then + files_invalid_guard+="$file\n" + fi done +if [[ ! -z "$files_invalid_guard" ]]; then + echo -e "The following files were found to have potentially invalid header guard:\n" + echo -e "$files_invalid_guard" +fi + diff=$(git diff --color) # If no diff has been generated all is OK, clean up, and exit. diff --git a/misc/scripts/mypy.ini b/misc/scripts/mypy.ini new file mode 100644 index 0000000000..c1ea695ca5 --- /dev/null +++ b/misc/scripts/mypy.ini @@ -0,0 +1,11 @@ +[mypy] +ignore_missing_imports = true +disallow_any_generics = True +pretty = True +show_column_numbers = True +warn_redundant_casts = True +warn_return_any = True +warn_unreachable = True + +namespace_packages = True +explicit_package_bases = True diff --git a/misc/scripts/mypy_check.sh b/misc/scripts/mypy_check.sh new file mode 100755 index 0000000000..2a06486d67 --- /dev/null +++ b/misc/scripts/mypy_check.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +set -uo pipefail + +echo -e "Python: mypy static analysis..." +mypy --config-file=./misc/scripts/mypy.ini . diff --git a/modules/basis_universal/SCsub b/modules/basis_universal/SCsub index a44a7f0db3..161b0f3814 100644 --- a/modules/basis_universal/SCsub +++ b/modules/basis_universal/SCsub @@ -40,12 +40,12 @@ if not env.msvc: else: env_basisu.Prepend(CPPPATH=[thirdparty_dir]) -if env["target"] == "debug": +if env.dev_build: env_basisu.Append(CPPDEFINES=[("BASISU_DEVEL_MESSAGES", 1), ("BASISD_ENABLE_DEBUG_FLAGS", 1)]) env_thirdparty = env_basisu.Clone() env_thirdparty.disable_warnings() -if env["tools"]: +if env.editor_build: env_thirdparty.Append(CPPDEFINES=["BASISU_NO_IMG_LOADERS"]) env_thirdparty.add_source_files(thirdparty_obj, encoder_sources) env_thirdparty.add_source_files(thirdparty_obj, transcoder_sources) diff --git a/modules/bmp/image_loader_bmp.cpp b/modules/bmp/image_loader_bmp.cpp index ae03abca50..cc21ed28e8 100644 --- a/modules/bmp/image_loader_bmp.cpp +++ b/modules/bmp/image_loader_bmp.cpp @@ -200,7 +200,7 @@ Error ImageLoaderBMP::convert_to_image(Ref<Image> p_image, return err; } -Error ImageLoaderBMP::load_image(Ref<Image> p_image, Ref<FileAccess> f, uint32_t p_flags, float p_scale) { +Error ImageLoaderBMP::load_image(Ref<Image> p_image, Ref<FileAccess> f, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale) { bmp_header_s bmp_header; Error err = ERR_INVALID_DATA; diff --git a/modules/bmp/image_loader_bmp.h b/modules/bmp/image_loader_bmp.h index cf8346ecad..0ca54de1dc 100644 --- a/modules/bmp/image_loader_bmp.h +++ b/modules/bmp/image_loader_bmp.h @@ -83,7 +83,7 @@ protected: const bmp_header_s &p_header); public: - virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> f, uint32_t p_flags, float p_scale); + virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> f, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale); virtual void get_recognized_extensions(List<String> *p_extensions) const; ImageLoaderBMP(); }; diff --git a/modules/bmp/register_types.cpp b/modules/bmp/register_types.cpp index 7c4a2085b2..67858e9d46 100644 --- a/modules/bmp/register_types.cpp +++ b/modules/bmp/register_types.cpp @@ -32,14 +32,14 @@ #include "image_loader_bmp.h" -static ImageLoaderBMP *image_loader_bmp = nullptr; +static Ref<ImageLoaderBMP> image_loader_bmp; void initialize_bmp_module(ModuleInitializationLevel p_level) { if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) { return; } - image_loader_bmp = memnew(ImageLoaderBMP); + image_loader_bmp.instantiate(); ImageLoader::add_image_format_loader(image_loader_bmp); } @@ -48,5 +48,6 @@ void uninitialize_bmp_module(ModuleInitializationLevel p_level) { return; } - memdelete(image_loader_bmp); + ImageLoader::remove_image_format_loader(image_loader_bmp); + image_loader_bmp.unref(); } diff --git a/modules/csg/SCsub b/modules/csg/SCsub index 55f859db11..1cf9974fc1 100644 --- a/modules/csg/SCsub +++ b/modules/csg/SCsub @@ -7,5 +7,5 @@ env_csg = env_modules.Clone() # Godot source files env_csg.add_source_files(env.modules_sources, "*.cpp") -if env["tools"]: +if env.editor_build: env_csg.add_source_files(env.modules_sources, "editor/*.cpp") diff --git a/modules/csg/csg.h b/modules/csg/csg.h index 738e3d68ea..aae99c52a3 100644 --- a/modules/csg/csg.h +++ b/modules/csg/csg.h @@ -39,7 +39,6 @@ #include "core/object/ref_counted.h" #include "core/templates/list.h" #include "core/templates/oa_hash_map.h" -#include "core/templates/rb_map.h" #include "core/templates/vector.h" #include "scene/resources/material.h" diff --git a/modules/cvtt/config.py b/modules/cvtt/config.py index 53b8f2f2e3..eb565b85b9 100644 --- a/modules/cvtt/config.py +++ b/modules/cvtt/config.py @@ -1,5 +1,5 @@ def can_build(env, platform): - return env["tools"] + return env.editor_build def configure(env): diff --git a/modules/denoise/SCsub b/modules/denoise/SCsub index 97feea2b44..779ce165d2 100644 --- a/modules/denoise/SCsub +++ b/modules/denoise/SCsub @@ -103,9 +103,9 @@ env_oidn.Append( "__STDC_LIMIT_MACROS", "DISABLE_VERBOSE", "MKLDNN_ENABLE_CONCURRENT_EXEC", - "NDEBUG", ] ) +env_oidn.AppendUnique(CPPDEFINES=["NDEBUG"]) # No assert() even in debug builds. env_thirdparty = env_oidn.Clone() env_thirdparty.disable_warnings() diff --git a/modules/denoise/config.py b/modules/denoise/config.py index 20a5e1da2f..27d2ffbf86 100644 --- a/modules/denoise/config.py +++ b/modules/denoise/config.py @@ -5,7 +5,7 @@ def can_build(env, platform): # as doing lightmap generation and denoising on Android or Web # would be a bit far-fetched. desktop_platforms = ["linuxbsd", "macos", "windows"] - return env["tools"] and platform in desktop_platforms and env["arch"] == "x86_64" + return env.editor_build and platform in desktop_platforms and env["arch"] == "x86_64" def configure(env): diff --git a/modules/etcpak/config.py b/modules/etcpak/config.py index 53b8f2f2e3..eb565b85b9 100644 --- a/modules/etcpak/config.py +++ b/modules/etcpak/config.py @@ -1,5 +1,5 @@ def can_build(env, platform): - return env["tools"] + return env.editor_build def configure(env): diff --git a/modules/freetype/SCsub b/modules/freetype/SCsub index 2680479acc..0b86bc569f 100644 --- a/modules/freetype/SCsub +++ b/modules/freetype/SCsub @@ -90,7 +90,7 @@ if env["builtin_freetype"]: env.Prepend(CPPPATH=[thirdparty_dir + "/include"]) env_freetype.Append(CPPDEFINES=["FT2_BUILD_LIBRARY", "FT_CONFIG_OPTION_USE_PNG", "FT_CONFIG_OPTION_SYSTEM_ZLIB"]) - if env["target"] == "debug": + if env.dev_build: env_freetype.Append(CPPDEFINES=["ZLIB_DEBUG"]) # Also requires libpng headers diff --git a/modules/gdscript/SCsub b/modules/gdscript/SCsub index 2f507db548..1dc4768186 100644 --- a/modules/gdscript/SCsub +++ b/modules/gdscript/SCsub @@ -7,7 +7,7 @@ env_gdscript = env_modules.Clone() env_gdscript.add_source_files(env.modules_sources, "*.cpp") -if env["tools"]: +if env.editor_build: env_gdscript.add_source_files(env.modules_sources, "./editor/*.cpp") SConscript("editor/script_templates/SCsub") diff --git a/modules/gdscript/doc_classes/@GDScript.xml b/modules/gdscript/doc_classes/@GDScript.xml index 4a38caea52..d0b4632ebe 100644 --- a/modules/gdscript/doc_classes/@GDScript.xml +++ b/modules/gdscript/doc_classes/@GDScript.xml @@ -35,14 +35,14 @@ <description> Asserts that the [code]condition[/code] is [code]true[/code]. If the [code]condition[/code] is [code]false[/code], an error is generated. When running from the editor, the running project will also be paused until you resume it. This can be used as a stronger form of [method @GlobalScope.push_error] for reporting errors to project developers or add-on users. [b]Note:[/b] For performance reasons, the code inside [method assert] is only executed in debug builds or when running the project from the editor. Don't include code that has side effects in an [method assert] call. Otherwise, the project will behave differently when exported in release mode. - The optional [code]message[/code] argument, if given, is shown in addition to the generic "Assertion failed" message. You can use this to provide additional details about why the assertion failed. + The optional [code]message[/code] argument, if given, is shown in addition to the generic "Assertion failed" message. It must be a static string, so format strings can't be used. You can use this to provide additional details about why the assertion failed. [codeblock] # Imagine we always want speed to be between 0 and 20. var speed = -10 assert(speed < 20) # True, the program will continue assert(speed >= 0) # False, the program will stop assert(speed >= 0 and speed < 20) # You can also combine the two conditional statements in one check - assert(speed < 20, "speed = %f, but the speed limit is 20" % speed) # Show a message with clarifying details + assert(speed < 20, "the speed limit is 20") # Show a message [/codeblock] </description> </method> @@ -84,7 +84,7 @@ <method name="get_stack"> <return type="Array" /> <description> - Returns an array of dictionaries representing the current call stack. + Returns an array of dictionaries representing the current call stack. See also [method print_stack]. [codeblock] func _ready(): foo() @@ -99,6 +99,7 @@ [codeblock] [{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}] [/codeblock] + [b]Note:[/b] [method get_stack] only works if the running instance is connected to a debugging server (i.e. an editor instance). [method get_stack] will not work in projects exported in release mode, or in projects exported in debug mode if not connected to a debugging server. [b]Note:[/b] Not supported for calling from threads. Instead, this will return an empty array. </description> </method> @@ -175,11 +176,12 @@ <method name="print_stack"> <return type="void" /> <description> - Prints a stack trace at the current code location. Only works when running with debugger turned on. + Prints a stack trace at the current code location. See also [method get_stack]. Output in the console would look something like this: [codeblock] Frame 0 - res://test.gd:16 in function '_process' [/codeblock] + [b]Note:[/b] [method print_stack] only works if the running instance is connected to a debugging server (i.e. an editor instance). [method print_stack] will not work in projects exported in release mode, or in projects exported in debug mode if not connected to a debugging server. [b]Note:[/b] Not supported for calling from threads. Instead of the stack trace, this will print the thread ID. </description> </method> @@ -448,7 +450,7 @@ <param index="1" name="prefix" type="String" default="""" /> <description> Define a new group for the following exported properties. This helps to organize properties in the Inspector dock. Groups can be added with an optional [param prefix], which would make group to only consider properties that have this prefix. The grouping will break on the first property that doesn't have a prefix. The prefix is also removed from the property's name in the Inspector dock. - If no [param prefix] is provided, the every following property is added to the group. The group ends when then next group or category is defined. You can also force end a group by using this annotation with empty strings for paramters, [code]@export_group("", "")[/code]. + If no [param prefix] is provided, the every following property is added to the group. The group ends when then next group or category is defined. You can also force end a group by using this annotation with empty strings for parameters, [code]@export_group("", "")[/code]. Groups cannot be nested, use [annotation @export_subgroup] to add subgroups to your groups. See also [constant PROPERTY_USAGE_GROUP]. [codeblock] @@ -555,7 +557,7 @@ <annotation name="@onready"> <return type="void" /> <description> - Mark the following property as assigned on [Node]'s ready state change. Values for these properties are no assigned immediately upon the node's creation, and instead are computed and stored right before [method Node._ready]. + Mark the following property as assigned on [Node]'s ready state change. Values for these properties are not assigned immediately upon the node's creation, and instead are computed and stored right before [method Node._ready]. [codeblock] @onready var character_name: Label = $Label [/codeblock] diff --git a/modules/gdscript/editor/gdscript_highlighter.cpp b/modules/gdscript/editor/gdscript_highlighter.cpp index afb59b486c..8b27307d0c 100644 --- a/modules/gdscript/editor/gdscript_highlighter.cpp +++ b/modules/gdscript/editor/gdscript_highlighter.cpp @@ -39,30 +39,32 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l Type next_type = NONE; Type current_type = NONE; - Type previous_type = NONE; - - String previous_text = ""; - int previous_column = 0; + Type prev_type = NONE; + String prev_text = ""; + int prev_column = 0; bool prev_is_char = false; bool prev_is_digit = false; bool prev_is_binary_op = false; + bool in_keyword = false; bool in_word = false; bool in_number = false; - bool in_function_name = false; - bool in_lambda = false; - bool in_variable_declaration = false; - bool in_signal_declaration = false; - bool in_function_args = false; - bool in_member_variable = false; bool in_node_path = false; bool in_node_ref = false; bool in_annotation = false; bool in_string_name = false; bool is_hex_notation = false; bool is_bin_notation = false; + bool in_member_variable = false; + bool in_lambda = false; + + bool in_function_name = false; + bool in_function_args = false; + bool in_variable_declaration = false; + bool in_signal_declaration = false; bool expect_type = false; + Color keyword_color; Color color; @@ -224,9 +226,9 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l } } - previous_type = REGION; - previous_text = ""; - previous_column = j; + prev_type = REGION; + prev_text = ""; + prev_column = j; j = from + (end_key_length - 1); if (region_end_index == -1) { color_region_cache[p_line] = in_region; @@ -241,19 +243,22 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l } } - // A bit of a hack, but couldn't come up with anything better. + // VERY hacky... but couldn't come up with anything better. if (j > 0 && (str[j] == '&' || str[j] == '^' || str[j] == '%' || str[j] == '+' || str[j] == '-' || str[j] == '~' || str[j] == '.')) { - if (!keywords.has(previous_text)) { - if (previous_text == "PI" || previous_text == "TAU" || previous_text == "INF" || previous_text == "NAN") { + int to = j - 1; + // Find what the last text was (prev_text won't work if there's no whitespace, so we need to do it manually). + while (to > 0 && is_whitespace(str[to])) { + to--; + } + int from = to; + while (from > 0 && !is_symbol(str[from])) { + from--; + } + String word = str.substr(from + 1, to - from); + // Keywords need to be exceptions, except for keywords that represent a value. + if (word == "true" || word == "false" || word == "null" || word == "PI" || word == "TAU" || word == "INF" || word == "NAN" || word == "self" || word == "super" || !keywords.has(word)) { + if (!is_symbol(str[to]) || str[to] == '"' || str[to] == '\'' || str[to] == ')' || str[to] == ']' || str[to] == '}') { is_binary_op = true; - } else { - int k = j - 1; - while (k > 0 && is_whitespace(str[k])) { - k--; - } - if (!is_symbol(str[k]) || str[k] == '"' || str[k] == '\'' || str[k] == ')' || str[k] == ']' || str[k] == '}') { - is_binary_op = true; - } } } } @@ -287,16 +292,18 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l is_hex_notation = true; } else if (!((str[j] == '-' || str[j] == '+') && str[j - 1] == 'e' && !prev_is_digit) && !(str[j] == '_' && (prev_is_digit || str[j - 1] == 'b' || str[j - 1] == 'x' || str[j - 1] == '.')) && - !((str[j] == 'e' || str[j] == '.') && (prev_is_digit || str[j - 1] == '_')) && + !(str[j] == 'e' && (prev_is_digit || str[j - 1] == '_')) && + !(str[j] == '.' && (prev_is_digit || (!prev_is_binary_op && (j > 0 && (str[j - 1] == '-' || str[j - 1] == '+' || str[j - 1] == '~'))))) && !((str[j] == '-' || str[j] == '+' || str[j] == '~') && !prev_is_binary_op && str[j - 1] != 'e')) { - /* 1st row of condition: '+' or '-' after scientific notation; - 2nd row of condition: '_' as a numeric separator; - 3rd row of condition: Scientific notation 'e' and floating points; - 4th row of condition: Multiple unary operators. */ + /* This condition continues Number highlighting in special cases. + 1st row: '+' or '-' after scientific notation; + 2nd row: '_' as a numeric separator; + 3rd row: Scientific notation 'e' and floating points; + 4th row: Floating points inside the number, or leading if after a unary mathematical operator; + 5th row: Multiple unary mathematical operators */ in_number = false; } - } else if ((str[j] == '-' || str[j] == '+' || str[j] == '~' || (str[j] == '.' && str[j + 1] != '.' && (j == 0 || (j > 0 && str[j - 1] != '.')))) && !is_binary_op) { - // Start a number from unary mathematical operators and floating points, except for '..' + } else if (!is_binary_op && (str[j] == '-' || str[j] == '+' || str[j] == '~' || (str[j] == '.' && str[j + 1] != '.' && (j == 0 || (j > 0 && str[j - 1] != '.'))))) { in_number = true; } @@ -318,7 +325,7 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l Color col = Color(); if (global_functions.has(word)) { // "assert" and "preload" are reserved, so highlight even if not followed by a bracket. - if (word == "assert" || word == "preload") { + if (word == GDScriptTokenizer::get_token_name(GDScriptTokenizer::Token::ASSERT) || word == GDScriptTokenizer::get_token_name(GDScriptTokenizer::Token::PRELOAD)) { col = global_function_color; } else { // For other global functions, check if followed by bracket. @@ -355,7 +362,7 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l } if (!in_function_name && in_word && !in_keyword) { - if (previous_text == GDScriptTokenizer::get_token_name(GDScriptTokenizer::Token::SIGNAL)) { + if (prev_text == GDScriptTokenizer::get_token_name(GDScriptTokenizer::Token::SIGNAL)) { in_signal_declaration = true; } else { int k = j; @@ -370,12 +377,12 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l if (str[k] == '(') { in_function_name = true; - } else if (previous_text == GDScriptTokenizer::get_token_name(GDScriptTokenizer::Token::VAR)) { + } else if (prev_text == GDScriptTokenizer::get_token_name(GDScriptTokenizer::Token::VAR)) { in_variable_declaration = true; } // Check for lambda. - if (in_function_name && previous_text == GDScriptTokenizer::get_token_name(GDScriptTokenizer::Token::FUNC)) { + if (in_function_name && prev_text == GDScriptTokenizer::get_token_name(GDScriptTokenizer::Token::FUNC)) { k = j - 1; while (k > 0 && is_whitespace(str[k])) { k--; @@ -408,11 +415,11 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l in_function_args = false; } - if (expect_type && (prev_is_char || str[j] == '=')) { + if (expect_type && (prev_is_char || str[j] == '=') && str[j] != '[') { expect_type = false; } - if (j > 0 && str[j] == '>' && str[j - 1] == '-') { + if (j > 0 && str[j - 1] == '-' && str[j] == '>') { expect_type = true; } @@ -491,7 +498,7 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l } else if (in_function_name) { next_type = FUNCTION; - if (!in_lambda && previous_text == GDScriptTokenizer::get_token_name(GDScriptTokenizer::Token::FUNC)) { + if (!in_lambda && prev_text == GDScriptTokenizer::get_token_name(GDScriptTokenizer::Token::FUNC)) { color = function_definition_color; } else { color = function_color; @@ -513,20 +520,20 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l if (current_type == NONE) { current_type = next_type; } else { - previous_type = current_type; + prev_type = current_type; current_type = next_type; // no need to store regions... - if (previous_type == REGION) { - previous_text = ""; - previous_column = j; + if (prev_type == REGION) { + prev_text = ""; + prev_column = j; } else { - String text = str.substr(previous_column, j - previous_column).strip_edges(); - previous_column = j; + String text = str.substr(prev_column, j - prev_column).strip_edges(); + prev_column = j; // ignore if just whitespace if (!text.is_empty()) { - previous_text = text; + prev_text = text; } } } diff --git a/modules/gdscript/gdscript.cpp b/modules/gdscript/gdscript.cpp index 10babad378..54cadf7df3 100644 --- a/modules/gdscript/gdscript.cpp +++ b/modules/gdscript/gdscript.cpp @@ -1077,10 +1077,12 @@ Error GDScript::load_source_code(const String &p_path) { } source = s; + path = p_path; #ifdef TOOLS_ENABLED source_changed_cache = true; -#endif - path = p_path; + set_edited(false); + set_last_modified_time(FileAccess::get_modified_time(path)); +#endif // TOOLS_ENABLED return OK; } @@ -2388,7 +2390,7 @@ Ref<Resource> ResourceFormatLoaderGDScript::load(const String &p_path, const Str } Error err; - Ref<GDScript> script = GDScriptCache::get_full_script(p_path, err); + Ref<GDScript> script = GDScriptCache::get_full_script(p_path, err, "", p_cache_mode == CACHE_MODE_IGNORE); // TODO: Reintroduce binary and encrypted scripts. diff --git a/modules/gdscript/gdscript_analyzer.cpp b/modules/gdscript/gdscript_analyzer.cpp index e37ac1dc3b..32d9aec84f 100644 --- a/modules/gdscript/gdscript_analyzer.cpp +++ b/modules/gdscript/gdscript_analyzer.cpp @@ -484,12 +484,23 @@ GDScriptParser::DataType GDScriptAnalyzer::resolve_datatype(GDScriptParser::Type if (parser->script_path == ScriptServer::get_global_class_path(first)) { result = parser->head->get_datatype(); } else { - Ref<GDScriptParserRef> ref = get_parser_for(ScriptServer::get_global_class_path(first)); - if (!ref.is_valid() || ref->raise_status(GDScriptParserRef::INTERFACE_SOLVED) != OK) { - push_error(vformat(R"(Could not parse global class "%s" from "%s".)", first, ScriptServer::get_global_class_path(first)), p_type); - return GDScriptParser::DataType(); + String path = ScriptServer::get_global_class_path(first); + String ext = path.get_extension(); + if (ext == GDScriptLanguage::get_singleton()->get_extension()) { + Ref<GDScriptParserRef> ref = get_parser_for(path); + if (!ref.is_valid() || ref->raise_status(GDScriptParserRef::INTERFACE_SOLVED) != OK) { + push_error(vformat(R"(Could not parse global class "%s" from "%s".)", first, ScriptServer::get_global_class_path(first)), p_type); + return GDScriptParser::DataType(); + } + result = ref->get_parser()->head->get_datatype(); + } else { + result.kind = GDScriptParser::DataType::SCRIPT; + result.native_type = ScriptServer::get_global_class_native_base(first); + result.script_type = ResourceLoader::load(path, "Script"); + result.script_path = path; + result.is_constant = true; + result.is_meta_type = false; } - result = ref->get_parser()->head->get_datatype(); } } else if (ProjectSettings::get_singleton()->has_autoload(first) && ProjectSettings::get_singleton()->get_autoload(first).is_singleton) { const ProjectSettings::AutoloadInfo &autoload = ProjectSettings::get_singleton()->get_autoload(first); @@ -540,12 +551,13 @@ GDScriptParser::DataType GDScriptAnalyzer::resolve_datatype(GDScriptParser::Type result = ref->get_parser()->head->get_datatype(); result.is_meta_type = false; } else { - Ref<GDScript> script = member.constant->initializer->reduced_value; + Ref<Script> script = member.constant->initializer->reduced_value; result.kind = GDScriptParser::DataType::SCRIPT; result.builtin_type = Variant::OBJECT; result.script_type = script; result.script_path = script->get_path(); result.native_type = script->get_instance_base_type(); + result.is_meta_type = false; } break; } @@ -2676,31 +2688,45 @@ void GDScriptAnalyzer::reduce_get_node(GDScriptParser::GetNodeNode *p_get_node) GDScriptParser::DataType GDScriptAnalyzer::make_global_class_meta_type(const StringName &p_class_name, const GDScriptParser::Node *p_source) { GDScriptParser::DataType type; - Ref<GDScriptParserRef> ref = get_parser_for(ScriptServer::get_global_class_path(p_class_name)); - if (ref.is_null()) { - push_error(vformat(R"(Could not find script for class "%s".)", p_class_name), p_source); - type.type_source = GDScriptParser::DataType::UNDETECTED; - type.kind = GDScriptParser::DataType::VARIANT; + String path = ScriptServer::get_global_class_path(p_class_name); + String ext = path.get_extension(); + if (ext == GDScriptLanguage::get_singleton()->get_extension()) { + Ref<GDScriptParserRef> ref = get_parser_for(path); + if (ref.is_null()) { + push_error(vformat(R"(Could not find script for class "%s".)", p_class_name), p_source); + type.type_source = GDScriptParser::DataType::UNDETECTED; + type.kind = GDScriptParser::DataType::VARIANT; + return type; + } + + Error err = ref->raise_status(GDScriptParserRef::INTERFACE_SOLVED); + if (err) { + push_error(vformat(R"(Could not resolve class "%s", because of a parser error.)", p_class_name), p_source); + type.type_source = GDScriptParser::DataType::UNDETECTED; + type.kind = GDScriptParser::DataType::VARIANT; + return type; + } + + type.type_source = GDScriptParser::DataType::ANNOTATED_EXPLICIT; + type.kind = GDScriptParser::DataType::CLASS; + type.builtin_type = Variant::OBJECT; + type.native_type = ScriptServer::get_global_class_native_base(p_class_name); + type.class_type = ref->get_parser()->head; + type.script_path = ref->get_parser()->script_path; + type.is_constant = true; + type.is_meta_type = true; return type; - } - - Error err = ref->raise_status(GDScriptParserRef::INTERFACE_SOLVED); - if (err) { - push_error(vformat(R"(Could not resolve class "%s", because of a parser error.)", p_class_name), p_source); - type.type_source = GDScriptParser::DataType::UNDETECTED; - type.kind = GDScriptParser::DataType::VARIANT; + } else { + type.type_source = GDScriptParser::DataType::ANNOTATED_EXPLICIT; + type.kind = GDScriptParser::DataType::SCRIPT; + type.builtin_type = Variant::OBJECT; + type.native_type = ScriptServer::get_global_class_native_base(p_class_name); + type.script_type = ResourceLoader::load(path, "Script"); + type.script_path = path; + type.is_constant = true; + type.is_meta_type = true; return type; } - - type.type_source = GDScriptParser::DataType::ANNOTATED_EXPLICIT; - type.kind = GDScriptParser::DataType::CLASS; - type.builtin_type = Variant::OBJECT; - type.native_type = ScriptServer::get_global_class_native_base(p_class_name); - type.class_type = ref->get_parser()->head; - type.script_path = ref->get_parser()->script_path; - type.is_constant = true; - type.is_meta_type = true; - return type; } void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNode *p_identifier, GDScriptParser::DataType *p_base) { @@ -3189,7 +3215,7 @@ void GDScriptAnalyzer::reduce_preload(GDScriptParser::PreloadNode *p_preload) { p_preload->resolved_path = parser->script_path.get_base_dir().path_join(p_preload->resolved_path); } p_preload->resolved_path = p_preload->resolved_path.simplify_path(); - if (!FileAccess::exists(p_preload->resolved_path)) { + if (!ResourceLoader::exists(p_preload->resolved_path)) { push_error(vformat(R"(Preload file "%s" does not exist.)", p_preload->resolved_path), p_preload->path); } else { // TODO: Don't load if validating: use completion cache. @@ -3808,7 +3834,7 @@ bool GDScriptAnalyzer::get_function_signature(GDScriptParser::Node *p_source, bo Ref<Script> base_script = p_base_type.script_type; - while (base_script.is_valid() && base_script->is_valid()) { + while (base_script.is_valid() && base_script->has_method(function_name)) { MethodInfo info = base_script->get_method_info(function_name); if (!(info == MethodInfo())) { diff --git a/modules/gdscript/gdscript_cache.cpp b/modules/gdscript/gdscript_cache.cpp index 48d5fbc569..271296c2f9 100644 --- a/modules/gdscript/gdscript_cache.cpp +++ b/modules/gdscript/gdscript_cache.cpp @@ -146,9 +146,7 @@ String GDScriptCache::get_source_code(const String &p_path) { Vector<uint8_t> source_file; Error err; Ref<FileAccess> f = FileAccess::open(p_path, FileAccess::READ, &err); - if (err) { - ERR_FAIL_COND_V(err, ""); - } + ERR_FAIL_COND_V(err, ""); uint64_t len = f->get_length(); source_file.resize(len + 1); @@ -185,20 +183,26 @@ Ref<GDScript> GDScriptCache::get_shallow_script(const String &p_path, const Stri return script; } -Ref<GDScript> GDScriptCache::get_full_script(const String &p_path, Error &r_error, const String &p_owner) { +Ref<GDScript> GDScriptCache::get_full_script(const String &p_path, Error &r_error, const String &p_owner, bool p_update_from_disk) { MutexLock lock(singleton->lock); if (!p_owner.is_empty()) { singleton->dependencies[p_owner].insert(p_path); } + Ref<GDScript> script; r_error = OK; if (singleton->full_gdscript_cache.has(p_path)) { - return singleton->full_gdscript_cache[p_path]; + script = Ref<GDScript>(singleton->full_gdscript_cache[p_path]); + if (!p_update_from_disk) { + return script; + } } - Ref<GDScript> script = get_shallow_script(p_path); - ERR_FAIL_COND_V(script.is_null(), Ref<GDScript>()); + if (script.is_null()) { + script = get_shallow_script(p_path); + ERR_FAIL_COND_V(script.is_null(), Ref<GDScript>()); + } r_error = script->load_source_code(p_path); diff --git a/modules/gdscript/gdscript_cache.h b/modules/gdscript/gdscript_cache.h index b971bdd984..3d111ea229 100644 --- a/modules/gdscript/gdscript_cache.h +++ b/modules/gdscript/gdscript_cache.h @@ -88,7 +88,7 @@ public: static Ref<GDScriptParserRef> get_parser(const String &p_path, GDScriptParserRef::Status status, Error &r_error, const String &p_owner = String()); static String get_source_code(const String &p_path); static Ref<GDScript> get_shallow_script(const String &p_path, const String &p_owner = String()); - static Ref<GDScript> get_full_script(const String &p_path, Error &r_error, const String &p_owner = String()); + static Ref<GDScript> get_full_script(const String &p_path, Error &r_error, const String &p_owner = String(), bool p_update_from_disk = false); static Error finish_compiling(const String &p_owner); GDScriptCache(); diff --git a/modules/gdscript/gdscript_compiler.cpp b/modules/gdscript/gdscript_compiler.cpp index 00e8223b9a..fd418ced47 100644 --- a/modules/gdscript/gdscript_compiler.cpp +++ b/modules/gdscript/gdscript_compiler.cpp @@ -2041,7 +2041,7 @@ GDScriptFunction *GDScriptCompiler::_parse_function(Error &r_error, GDScript *p_ codegen.generator->write_newline(field->initializer->start_line); // For typed arrays we need to make sure this is already initialized correctly so typed assignment work. - if (field_type.is_hard_type() && field_type.builtin_type == Variant::ARRAY && field_type.has_container_element_type()) { + if (field_type.is_hard_type() && field_type.builtin_type == Variant::ARRAY) { if (field_type.has_container_element_type()) { codegen.generator->write_construct_typed_array(dst_address, _gdtype_from_datatype(field_type.get_container_element_type(), codegen.script), Vector<GDScriptCodeGenerator::Address>()); } else { diff --git a/modules/gdscript/gdscript_parser.cpp b/modules/gdscript/gdscript_parser.cpp index 888cd782fb..980a946e23 100644 --- a/modules/gdscript/gdscript_parser.cpp +++ b/modules/gdscript/gdscript_parser.cpp @@ -2932,11 +2932,16 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_call(ExpressionNode *p_pre // Allow for trailing comma. break; } + bool use_identifier_completion = current.cursor_place == GDScriptTokenizer::CURSOR_END || current.cursor_place == GDScriptTokenizer::CURSOR_MIDDLE; ExpressionNode *argument = parse_expression(false); if (argument == nullptr) { push_error(R"(Expected expression as the function argument.)"); } else { call->arguments.push_back(argument); + + if (argument->type == Node::IDENTIFIER && use_identifier_completion) { + completion_context.type = COMPLETION_IDENTIFIER; + } } ct = COMPLETION_CALL_ARGUMENTS; } while (match(GDScriptTokenizer::Token::COMMA)); @@ -3758,6 +3763,33 @@ bool GDScriptParser::export_annotations(const AnnotationNode *p_annotation, Node return false; } break; + case GDScriptParser::DataType::CLASS: + // Can assume type is a global GDScript class. + if (!ClassDB::is_parent_class(export_type.native_type, SNAME("Resource"))) { + push_error(R"(Exported script type must extend Resource.)"); + return false; + } + variable->export_info.type = Variant::OBJECT; + variable->export_info.hint = PROPERTY_HINT_RESOURCE_TYPE; + variable->export_info.hint_string = export_type.class_type->identifier->name; + break; + case GDScriptParser::DataType::SCRIPT: { + StringName class_name; + if (export_type.script_type != nullptr && export_type.script_type.is_valid()) { + class_name = export_type.script_type->get_language()->get_global_class_name(export_type.script_type->get_path()); + } + if (class_name == StringName()) { + Ref<Script> script = ResourceLoader::load(export_type.script_path, SNAME("Script")); + if (script.is_valid()) { + class_name = script->get_language()->get_global_class_name(export_type.script_path); + } + } + if (class_name != StringName() && ClassDB::is_parent_class(ScriptServer::get_global_class_native_base(class_name), SNAME("Resource"))) { + variable->export_info.type = Variant::OBJECT; + variable->export_info.hint = PROPERTY_HINT_RESOURCE_TYPE; + variable->export_info.hint_string = class_name; + } + } break; case GDScriptParser::DataType::ENUM: { variable->export_info.type = Variant::INT; variable->export_info.hint = PROPERTY_HINT_ENUM; @@ -3974,7 +4006,7 @@ String GDScriptParser::DataType::to_string() const { if (is_meta_type) { return script_type->get_class_name().operator String(); } - String name = script_type->get_name(); + String name = script_type != nullptr ? script_type->get_name() : ""; if (!name.is_empty()) { return name; } diff --git a/modules/gdscript/language_server/gdscript_text_document.cpp b/modules/gdscript/language_server/gdscript_text_document.cpp index 5ad9680ea0..189e7fcc71 100644 --- a/modules/gdscript/language_server/gdscript_text_document.cpp +++ b/modules/gdscript/language_server/gdscript_text_document.cpp @@ -42,6 +42,7 @@ void GDScriptTextDocument::_bind_methods() { ClassDB::bind_method(D_METHOD("didOpen"), &GDScriptTextDocument::didOpen); ClassDB::bind_method(D_METHOD("didClose"), &GDScriptTextDocument::didClose); ClassDB::bind_method(D_METHOD("didChange"), &GDScriptTextDocument::didChange); + ClassDB::bind_method(D_METHOD("willSaveWaitUntil"), &GDScriptTextDocument::willSaveWaitUntil); ClassDB::bind_method(D_METHOD("didSave"), &GDScriptTextDocument::didSave); ClassDB::bind_method(D_METHOD("nativeSymbol"), &GDScriptTextDocument::nativeSymbol); ClassDB::bind_method(D_METHOD("documentSymbol"), &GDScriptTextDocument::documentSymbol); @@ -81,6 +82,16 @@ void GDScriptTextDocument::didChange(const Variant &p_param) { sync_script_content(doc.uri, doc.text); } +void GDScriptTextDocument::willSaveWaitUntil(const Variant &p_param) { + lsp::TextDocumentItem doc = load_document_item(p_param); + + String path = GDScriptLanguageProtocol::get_singleton()->get_workspace()->get_file_path(doc.uri); + Ref<Script> script = ResourceLoader::load(path); + if (script.is_valid()) { + ScriptEditor::get_singleton()->clear_docs_from_script(script); + } +} + void GDScriptTextDocument::didSave(const Variant &p_param) { lsp::TextDocumentItem doc = load_document_item(p_param); Dictionary dict = p_param; @@ -88,11 +99,16 @@ void GDScriptTextDocument::didSave(const Variant &p_param) { sync_script_content(doc.uri, text); - /*String path = GDScriptLanguageProtocol::get_singleton()->get_workspace()->get_file_path(doc.uri); - + String path = GDScriptLanguageProtocol::get_singleton()->get_workspace()->get_file_path(doc.uri); Ref<GDScript> script = ResourceLoader::load(path); - script->load_source_code(path); - script->reload(true);*/ + if (script.is_valid() && (script->load_source_code(path) == OK)) { + if (script->is_tool()) { + script->get_language()->reload_tool_script(script, true); + } else { + script->reload(true); + } + ScriptEditor::get_singleton()->update_docs_from_script(script); + } } lsp::TextDocumentItem GDScriptTextDocument::load_document_item(const Variant &p_param) { @@ -417,13 +433,6 @@ void GDScriptTextDocument::sync_script_content(const String &p_path, const Strin GDScriptLanguageProtocol::get_singleton()->get_workspace()->parse_script(path, p_content); EditorFileSystem::get_singleton()->update_file(path); - Error error; - Ref<GDScript> script = ResourceLoader::load(path, "", ResourceFormatLoader::CACHE_MODE_REUSE, &error); - if (error == OK) { - if (script->load_source_code(path) == OK) { - script->reload(true); - } - } } void GDScriptTextDocument::show_native_symbol_in_editor(const String &p_symbol_id) { diff --git a/modules/gdscript/language_server/gdscript_text_document.h b/modules/gdscript/language_server/gdscript_text_document.h index 87bc08a34e..456c7d71fe 100644 --- a/modules/gdscript/language_server/gdscript_text_document.h +++ b/modules/gdscript/language_server/gdscript_text_document.h @@ -45,6 +45,7 @@ protected: void didOpen(const Variant &p_param); void didClose(const Variant &p_param); void didChange(const Variant &p_param); + void willSaveWaitUntil(const Variant &p_param); void didSave(const Variant &p_param); void sync_script_content(const String &p_path, const String &p_content); diff --git a/modules/gdscript/language_server/godot_lsp.h b/modules/gdscript/language_server/godot_lsp.h index fbd40796c4..024da1cab7 100644 --- a/modules/gdscript/language_server/godot_lsp.h +++ b/modules/gdscript/language_server/godot_lsp.h @@ -546,7 +546,7 @@ struct TextDocumentSyncOptions { * If present will save wait until requests are sent to the server. If omitted the request should not be * sent. */ - bool willSaveWaitUntil = false; + bool willSaveWaitUntil = true; /** * If present save notifications are sent to the server. If omitted the notification should not be diff --git a/modules/gltf/SCsub b/modules/gltf/SCsub index 71f3ba58d9..d1f337715f 100644 --- a/modules/gltf/SCsub +++ b/modules/gltf/SCsub @@ -7,7 +7,7 @@ env_gltf = env_modules.Clone() # Godot source files env_gltf.add_source_files(env.modules_sources, "*.cpp") -env_gltf.add_source_files(env.modules_sources, "extensions/*.cpp") env_gltf.add_source_files(env.modules_sources, "structures/*.cpp") -if env["tools"]: +SConscript("extensions/SCsub") +if env.editor_build: env_gltf.add_source_files(env.modules_sources, "editor/*.cpp") diff --git a/modules/gltf/config.py b/modules/gltf/config.py index 189b5a831a..130c06d264 100644 --- a/modules/gltf/config.py +++ b/modules/gltf/config.py @@ -26,6 +26,7 @@ def get_doc_classes(): "GLTFSpecGloss", "GLTFState", "GLTFTexture", + "GLTFTextureSampler", ] diff --git a/modules/gltf/doc_classes/GLTFDocumentExtension.xml b/modules/gltf/doc_classes/GLTFDocumentExtension.xml index d2a9022445..936794976d 100644 --- a/modules/gltf/doc_classes/GLTFDocumentExtension.xml +++ b/modules/gltf/doc_classes/GLTFDocumentExtension.xml @@ -1,8 +1,10 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="GLTFDocumentExtension" inherits="Resource" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../doc/class.xsd"> <brief_description> + [GLTFDocument] extension class. </brief_description> <description> + Extends the functionality of the [GLTFDocument] class by allowing you to run arbitrary code at various stages of GLTF import or export. </description> <tutorials> </tutorials> @@ -28,6 +30,12 @@ <description> </description> </method> + <method name="_get_supported_extensions" qualifiers="virtual"> + <return type="PackedStringArray" /> + <description> + Returns an array of the GLTF extensions supported by this GLTFDocumentExtension class. This is used to validate if a GLTF file with required extensions can be loaded. + </description> + </method> <method name="_import_node" qualifiers="virtual"> <return type="int" /> <param index="0" name="state" type="GLTFState" /> diff --git a/modules/gltf/doc_classes/GLTFNode.xml b/modules/gltf/doc_classes/GLTFNode.xml index e933e6046a..4d1aa89ac9 100644 --- a/modules/gltf/doc_classes/GLTFNode.xml +++ b/modules/gltf/doc_classes/GLTFNode.xml @@ -1,10 +1,13 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="GLTFNode" inherits="Resource" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../doc/class.xsd"> <brief_description> + GLTF node class. </brief_description> <description> + Represents a GLTF node. GLTF nodes may have names, transforms, children (other GLTF nodes), and more specialized properties (represented by their own classes). </description> <tutorials> + <link title="GLTF scene and node spec">https://github.com/KhronosGroup/glTF-Tutorials/blob/master/gltfTutorial/gltfTutorial_004_ScenesNodes.md"</link> </tutorials> <members> <member name="camera" type="int" setter="set_camera" getter="get_camera" default="-1"> diff --git a/modules/gltf/doc_classes/GLTFState.xml b/modules/gltf/doc_classes/GLTFState.xml index 1dbd89aed8..56f3a70631 100644 --- a/modules/gltf/doc_classes/GLTFState.xml +++ b/modules/gltf/doc_classes/GLTFState.xml @@ -7,6 +7,14 @@ <tutorials> </tutorials> <methods> + <method name="add_used_extension"> + <return type="void" /> + <param index="0" name="extension_name" type="String" /> + <param index="1" name="required" type="bool" /> + <description> + Appends an extension to the list of extensions used by this GLTF file during serialization. If [param required] is true, the extension will also be added to the list of required extensions. Do not run this in [method GLTFDocumentExtension._export_post], as that stage is too late to add extensions. The final list is sorted alphabetically. + </description> + </method> <method name="get_accessors"> <return type="GLTFAccessor[]" /> <description> @@ -85,6 +93,12 @@ <description> </description> </method> + <method name="get_texture_samplers"> + <return type="GLTFTextureSampler[]" /> + <description> + Retrieves the array of texture samplers that are used by the textures contained in the GLTF. + </description> + </method> <method name="get_textures"> <return type="GLTFTexture[]" /> <description> @@ -172,6 +186,13 @@ <description> </description> </method> + <method name="set_texture_samplers"> + <return type="void" /> + <param index="0" name="texture_samplers" type="GLTFTextureSampler[]" /> + <description> + Sets the array of texture samplers that are used by the textures contained in the GLTF. + </description> + </method> <method name="set_textures"> <return type="void" /> <param index="0" name="textures" type="GLTFTexture[]" /> diff --git a/modules/gltf/doc_classes/GLTFTexture.xml b/modules/gltf/doc_classes/GLTFTexture.xml index c0bc424168..f4486fd504 100644 --- a/modules/gltf/doc_classes/GLTFTexture.xml +++ b/modules/gltf/doc_classes/GLTFTexture.xml @@ -7,6 +7,9 @@ <tutorials> </tutorials> <members> + <member name="sampler" type="int" setter="set_sampler" getter="get_sampler" default="-1"> + ID of the texture sampler to use when sampling the image. If -1, then the default texture sampler is used (linear filtering, and repeat wrapping in both axes). + </member> <member name="src_image" type="int" setter="set_src_image" getter="get_src_image" default="0"> </member> </members> diff --git a/modules/gltf/doc_classes/GLTFTextureSampler.xml b/modules/gltf/doc_classes/GLTFTextureSampler.xml new file mode 100644 index 0000000000..1cc69bfe73 --- /dev/null +++ b/modules/gltf/doc_classes/GLTFTextureSampler.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="GLTFTextureSampler" inherits="Resource" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../doc/class.xsd"> + <brief_description> + Represents a GLTF texture sampler + </brief_description> + <description> + Represents a texture sampler as defined by the base GLTF spec. Texture samplers in GLTF specify how to sample data from the texture's base image, when rendering the texture on an object. + </description> + <tutorials> + </tutorials> + <members> + <member name="mag_filter" type="int" setter="set_mag_filter" getter="get_mag_filter" default="9729"> + Texture's magnification filter, used when texture appears larger on screen than the source image. + </member> + <member name="min_filter" type="int" setter="set_min_filter" getter="get_min_filter" default="9987"> + Texture's minification filter, used when the texture appears smaller on screen than the source image. + </member> + <member name="wrap_s" type="int" setter="set_wrap_s" getter="get_wrap_s" default="10497"> + Wrapping mode to use for S-axis (horizontal) texture coordinates. + </member> + <member name="wrap_t" type="int" setter="set_wrap_t" getter="get_wrap_t" default="10497"> + Wrapping mode to use for T-axis (vertical) texture coordinates. + </member> + </members> +</class> diff --git a/modules/gltf/editor/editor_scene_importer_blend.cpp b/modules/gltf/editor/editor_scene_importer_blend.cpp index ab52761e17..f79731dd22 100644 --- a/modules/gltf/editor/editor_scene_importer_blend.cpp +++ b/modules/gltf/editor/editor_scene_importer_blend.cpp @@ -261,7 +261,7 @@ void EditorSceneFormatImporterBlend::get_import_options(const String &p_path, Li #define ADD_OPTION_ENUM(PATH, ENUM_HINT, VALUE) \ r_options->push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::INT, SNAME(PATH), PROPERTY_HINT_ENUM, ENUM_HINT), VALUE)); - ADD_OPTION_ENUM("blender/nodes/visible", "Visible Only,Renderable,All", BLEND_VISIBLE_ALL); + ADD_OPTION_ENUM("blender/nodes/visible", "All,Visible Only,Renderable", BLEND_VISIBLE_ALL); ADD_OPTION_BOOL("blender/nodes/punctual_lights", true); ADD_OPTION_BOOL("blender/nodes/cameras", true); ADD_OPTION_BOOL("blender/nodes/custom_properties", true); diff --git a/modules/gltf/editor/editor_scene_importer_blend.h b/modules/gltf/editor/editor_scene_importer_blend.h index dd1c1b9889..a1485ff82e 100644 --- a/modules/gltf/editor/editor_scene_importer_blend.h +++ b/modules/gltf/editor/editor_scene_importer_blend.h @@ -45,9 +45,9 @@ class EditorSceneFormatImporterBlend : public EditorSceneFormatImporter { public: enum { + BLEND_VISIBLE_ALL, BLEND_VISIBLE_VISIBLE_ONLY, - BLEND_VISIBLE_RENDERABLE, - BLEND_VISIBLE_ALL + BLEND_VISIBLE_RENDERABLE }; enum { BLEND_BONE_INFLUENCES_NONE, diff --git a/modules/gltf/extensions/SCsub b/modules/gltf/extensions/SCsub new file mode 100644 index 0000000000..ad214bb79c --- /dev/null +++ b/modules/gltf/extensions/SCsub @@ -0,0 +1,9 @@ +#!/usr/bin/env python + +Import("env") +Import("env_modules") + +env_gltf = env_modules.Clone() + +# Godot source files +env_gltf.add_source_files(env.modules_sources, "*.cpp") diff --git a/modules/gltf/gltf_defines.h b/modules/gltf/gltf_defines.h index c20c87f798..23bf33869e 100644 --- a/modules/gltf/gltf_defines.h +++ b/modules/gltf/gltf_defines.h @@ -58,6 +58,7 @@ class GLTFSkin; class GLTFSpecGloss; class GLTFState; class GLTFTexture; +class GLTFTextureSampler; // GLTF index aliases. using GLTFAccessorIndex = int; @@ -66,13 +67,14 @@ using GLTFBufferIndex = int; using GLTFBufferViewIndex = int; using GLTFCameraIndex = int; using GLTFImageIndex = int; +using GLTFLightIndex = int; using GLTFMaterialIndex = int; using GLTFMeshIndex = int; -using GLTFLightIndex = int; using GLTFNodeIndex = int; using GLTFSkeletonIndex = int; using GLTFSkinIndex = int; using GLTFTextureIndex = int; +using GLTFTextureSamplerIndex = int; enum GLTFType { TYPE_SCALAR, diff --git a/modules/gltf/gltf_document.cpp b/modules/gltf/gltf_document.cpp index 6cb398b5f8..35358734d6 100644 --- a/modules/gltf/gltf_document.cpp +++ b/modules/gltf/gltf_document.cpp @@ -145,6 +145,12 @@ Error GLTFDocument::_serialize(Ref<GLTFState> state, const String &p_path) { return Error::FAILED; } + /* STEP SERIALIZE TEXTURE SAMPLERS */ + err = _serialize_texture_samplers(state); + if (err != OK) { + return Error::FAILED; + } + /* STEP SERIALIZE ANIMATIONS */ err = _serialize_animations(state); if (err != OK) { @@ -191,14 +197,14 @@ Error GLTFDocument::_serialize(Ref<GLTFState> state, const String &p_path) { return Error::FAILED; } - /* STEP SERIALIZE SCENE */ + /* STEP SERIALIZE LIGHTS */ err = _serialize_lights(state); if (err != OK) { return Error::FAILED; } /* STEP SERIALIZE EXTENSIONS */ - err = _serialize_extensions(state); + err = _serialize_gltf_extensions(state); if (err != OK) { return Error::FAILED; } @@ -219,9 +225,9 @@ Error GLTFDocument::_serialize(Ref<GLTFState> state, const String &p_path) { return OK; } -Error GLTFDocument::_serialize_extensions(Ref<GLTFState> state) const { - Array extensions_used; - Array extensions_required; +Error GLTFDocument::_serialize_gltf_extensions(Ref<GLTFState> state) const { + Vector<String> extensions_used = state->extensions_used; + Vector<String> extensions_required = state->extensions_required; if (!state->lights.is_empty()) { extensions_used.push_back("KHR_lights_punctual"); } @@ -230,9 +236,11 @@ Error GLTFDocument::_serialize_extensions(Ref<GLTFState> state) const { extensions_required.push_back("KHR_texture_transform"); } if (!extensions_used.is_empty()) { + extensions_used.sort(); state->json["extensionsUsed"] = extensions_used; } if (!extensions_required.is_empty()) { + extensions_required.sort(); state->json["extensionsRequired"] = extensions_required; } return OK; @@ -401,47 +409,47 @@ Error GLTFDocument::_serialize_nodes(Ref<GLTFState> state) { Array nodes; for (int i = 0; i < state->nodes.size(); i++) { Dictionary node; - Ref<GLTFNode> n = state->nodes[i]; + Ref<GLTFNode> gltf_node = state->nodes[i]; Dictionary extensions; node["extensions"] = extensions; - if (!n->get_name().is_empty()) { - node["name"] = n->get_name(); + if (!gltf_node->get_name().is_empty()) { + node["name"] = gltf_node->get_name(); } - if (n->camera != -1) { - node["camera"] = n->camera; + if (gltf_node->camera != -1) { + node["camera"] = gltf_node->camera; } - if (n->light != -1) { + if (gltf_node->light != -1) { Dictionary lights_punctual; extensions["KHR_lights_punctual"] = lights_punctual; - lights_punctual["light"] = n->light; + lights_punctual["light"] = gltf_node->light; } - if (n->mesh != -1) { - node["mesh"] = n->mesh; + if (gltf_node->mesh != -1) { + node["mesh"] = gltf_node->mesh; } - if (n->skin != -1) { - node["skin"] = n->skin; + if (gltf_node->skin != -1) { + node["skin"] = gltf_node->skin; } - if (n->skeleton != -1 && n->skin < 0) { + if (gltf_node->skeleton != -1 && gltf_node->skin < 0) { } - if (n->xform != Transform3D()) { - node["matrix"] = _xform_to_array(n->xform); + if (gltf_node->xform != Transform3D()) { + node["matrix"] = _xform_to_array(gltf_node->xform); } - if (!n->rotation.is_equal_approx(Quaternion())) { - node["rotation"] = _quaternion_to_array(n->rotation); + if (!gltf_node->rotation.is_equal_approx(Quaternion())) { + node["rotation"] = _quaternion_to_array(gltf_node->rotation); } - if (!n->scale.is_equal_approx(Vector3(1.0f, 1.0f, 1.0f))) { - node["scale"] = _vec3_to_arr(n->scale); + if (!gltf_node->scale.is_equal_approx(Vector3(1.0f, 1.0f, 1.0f))) { + node["scale"] = _vec3_to_arr(gltf_node->scale); } - if (!n->position.is_zero_approx()) { - node["translation"] = _vec3_to_arr(n->position); + if (!gltf_node->position.is_zero_approx()) { + node["translation"] = _vec3_to_arr(gltf_node->position); } - if (n->children.size()) { + if (gltf_node->children.size()) { Array children; - for (int j = 0; j < n->children.size(); j++) { - children.push_back(n->children[j]); + for (int j = 0; j < gltf_node->children.size(); j++) { + children.push_back(gltf_node->children[j]); } node["children"] = children; } @@ -450,7 +458,7 @@ Error GLTFDocument::_serialize_nodes(Ref<GLTFState> state) { Ref<GLTFDocumentExtension> ext = document_extensions[ext_i]; ERR_CONTINUE(ext.is_null()); ERR_CONTINUE(!state->scene_nodes.find(i)); - Error err = ext->export_node(state, n, state->json, state->scene_nodes[i]); + Error err = ext->export_node(state, gltf_node, node, state->scene_nodes[i]); ERR_CONTINUE(err != OK); } @@ -2673,7 +2681,7 @@ Error GLTFDocument::_parse_meshes(Ref<GLTFState> state) { } else if (a.has("JOINTS_0") && a.has("JOINTS_1")) { PackedInt32Array joints_0 = _decode_accessor_as_ints(state, a["JOINTS_0"], true); PackedInt32Array joints_1 = _decode_accessor_as_ints(state, a["JOINTS_1"], true); - ERR_FAIL_COND_V(joints_0.size() != joints_0.size(), ERR_INVALID_DATA); + ERR_FAIL_COND_V(joints_0.size() != joints_1.size(), ERR_INVALID_DATA); int32_t weight_8_count = JOINT_GROUP_SIZE * 2; Vector<int> joints; joints.resize(vertex_num * weight_8_count); @@ -3217,6 +3225,11 @@ Error GLTFDocument::_serialize_textures(Ref<GLTFState> state) { Ref<GLTFTexture> t = state->textures[i]; ERR_CONTINUE(t->get_src_image() == -1); d["source"] = t->get_src_image(); + + GLTFTextureSamplerIndex sampler_index = t->get_sampler(); + if (sampler_index != -1) { + d["sampler"] = sampler_index; + } textures.push_back(d); } state->json["textures"] = textures; @@ -3238,13 +3251,18 @@ Error GLTFDocument::_parse_textures(Ref<GLTFState> state) { Ref<GLTFTexture> t; t.instantiate(); t->set_src_image(d["source"]); + if (d.has("sampler")) { + t->set_sampler(d["sampler"]); + } else { + t->set_sampler(-1); + } state->textures.push_back(t); } return OK; } -GLTFTextureIndex GLTFDocument::_set_texture(Ref<GLTFState> state, Ref<Texture2D> p_texture) { +GLTFTextureIndex GLTFDocument::_set_texture(Ref<GLTFState> state, Ref<Texture2D> p_texture, StandardMaterial3D::TextureFilter p_filter_mode, bool p_repeats) { ERR_FAIL_COND_V(p_texture.is_null(), -1); Ref<GLTFTexture> gltf_texture; gltf_texture.instantiate(); @@ -3252,6 +3270,7 @@ GLTFTextureIndex GLTFDocument::_set_texture(Ref<GLTFState> state, Ref<Texture2D> GLTFImageIndex gltf_src_image_i = state->images.size(); state->images.push_back(p_texture); gltf_texture->set_src_image(gltf_src_image_i); + gltf_texture->set_sampler(_set_sampler_for_mode(state, p_filter_mode, p_repeats)); GLTFTextureIndex gltf_texture_i = state->textures.size(); state->textures.push_back(gltf_texture); return gltf_texture_i; @@ -3266,6 +3285,102 @@ Ref<Texture2D> GLTFDocument::_get_texture(Ref<GLTFState> state, const GLTFTextur return state->images[image]; } +GLTFTextureSamplerIndex GLTFDocument::_set_sampler_for_mode(Ref<GLTFState> state, StandardMaterial3D::TextureFilter p_filter_mode, bool p_repeats) { + for (int i = 0; i < state->texture_samplers.size(); ++i) { + if (state->texture_samplers[i]->get_filter_mode() == p_filter_mode) { + return i; + } + } + + GLTFTextureSamplerIndex gltf_sampler_i = state->texture_samplers.size(); + Ref<GLTFTextureSampler> gltf_sampler; + gltf_sampler.instantiate(); + gltf_sampler->set_filter_mode(p_filter_mode); + gltf_sampler->set_wrap_mode(p_repeats); + state->texture_samplers.push_back(gltf_sampler); + return gltf_sampler_i; +} + +Ref<GLTFTextureSampler> GLTFDocument::_get_sampler_for_texture(Ref<GLTFState> state, const GLTFTextureIndex p_texture) { + ERR_FAIL_INDEX_V(p_texture, state->textures.size(), Ref<Texture2D>()); + const GLTFTextureSamplerIndex sampler = state->textures[p_texture]->get_sampler(); + + if (sampler == -1) { + return state->default_texture_sampler; + } else { + ERR_FAIL_INDEX_V(sampler, state->texture_samplers.size(), Ref<GLTFTextureSampler>()); + + return state->texture_samplers[sampler]; + } +} + +Error GLTFDocument::_serialize_texture_samplers(Ref<GLTFState> state) { + if (!state->texture_samplers.size()) { + return OK; + } + + Array samplers; + for (int32_t i = 0; i < state->texture_samplers.size(); ++i) { + Dictionary d; + Ref<GLTFTextureSampler> s = state->texture_samplers[i]; + d["magFilter"] = s->get_mag_filter(); + d["minFilter"] = s->get_min_filter(); + d["wrapS"] = s->get_wrap_s(); + d["wrapT"] = s->get_wrap_t(); + samplers.push_back(d); + } + state->json["samplers"] = samplers; + + return OK; +} + +Error GLTFDocument::_parse_texture_samplers(Ref<GLTFState> state) { + state->default_texture_sampler.instantiate(); + state->default_texture_sampler->set_min_filter(GLTFTextureSampler::FilterMode::LINEAR_MIPMAP_LINEAR); + state->default_texture_sampler->set_mag_filter(GLTFTextureSampler::FilterMode::LINEAR); + state->default_texture_sampler->set_wrap_s(GLTFTextureSampler::WrapMode::REPEAT); + state->default_texture_sampler->set_wrap_t(GLTFTextureSampler::WrapMode::REPEAT); + + if (!state->json.has("samplers")) { + return OK; + } + + const Array &samplers = state->json["samplers"]; + for (int i = 0; i < samplers.size(); ++i) { + const Dictionary &d = samplers[i]; + + Ref<GLTFTextureSampler> sampler; + sampler.instantiate(); + + if (d.has("minFilter")) { + sampler->set_min_filter(d["minFilter"]); + } else { + sampler->set_min_filter(GLTFTextureSampler::FilterMode::LINEAR_MIPMAP_LINEAR); + } + if (d.has("magFilter")) { + sampler->set_mag_filter(d["magFilter"]); + } else { + sampler->set_mag_filter(GLTFTextureSampler::FilterMode::LINEAR); + } + + if (d.has("wrapS")) { + sampler->set_wrap_s(d["wrapS"]); + } else { + sampler->set_wrap_s(GLTFTextureSampler::WrapMode::DEFAULT); + } + + if (d.has("wrapT")) { + sampler->set_wrap_t(d["wrapT"]); + } else { + sampler->set_wrap_t(GLTFTextureSampler::WrapMode::DEFAULT); + } + + state->texture_samplers.push_back(sampler); + } + + return OK; +} + Error GLTFDocument::_serialize_materials(Ref<GLTFState> state) { Array materials; for (int32_t i = 0; i < state->materials.size(); i++) { @@ -3297,7 +3412,7 @@ Error GLTFDocument::_serialize_materials(Ref<GLTFState> state) { if (albedo_texture.is_valid() && albedo_texture->get_image().is_valid()) { albedo_texture->set_name(material->get_name() + "_albedo"); - gltf_texture_index = _set_texture(state, albedo_texture); + gltf_texture_index = _set_texture(state, albedo_texture, material->get_texture_filter(), material->get_flag(BaseMaterial3D::FLAG_USE_TEXTURE_REPEAT)); } if (gltf_texture_index != -1) { bct["index"] = gltf_texture_index; @@ -3427,7 +3542,7 @@ Error GLTFDocument::_serialize_materials(Ref<GLTFState> state) { GLTFTextureIndex orm_texture_index = -1; if (has_ao || has_roughness || has_metalness) { orm_texture->set_name(material->get_name() + "_orm"); - orm_texture_index = _set_texture(state, orm_texture); + orm_texture_index = _set_texture(state, orm_texture, material->get_texture_filter(), material->get_flag(BaseMaterial3D::FLAG_USE_TEXTURE_REPEAT)); } if (has_ao) { Dictionary occt; @@ -3482,7 +3597,7 @@ Error GLTFDocument::_serialize_materials(Ref<GLTFState> state) { GLTFTextureIndex gltf_texture_index = -1; if (tex.is_valid() && tex->get_image().is_valid()) { tex->set_name(material->get_name() + "_normal"); - gltf_texture_index = _set_texture(state, tex); + gltf_texture_index = _set_texture(state, tex, material->get_texture_filter(), material->get_flag(BaseMaterial3D::FLAG_USE_TEXTURE_REPEAT)); } nt["scale"] = material->get_normal_scale(); if (gltf_texture_index != -1) { @@ -3505,7 +3620,7 @@ Error GLTFDocument::_serialize_materials(Ref<GLTFState> state) { GLTFTextureIndex gltf_texture_index = -1; if (emission_texture.is_valid() && emission_texture->get_image().is_valid()) { emission_texture->set_name(material->get_name() + "_emission"); - gltf_texture_index = _set_texture(state, emission_texture); + gltf_texture_index = _set_texture(state, emission_texture, material->get_texture_filter(), material->get_flag(BaseMaterial3D::FLAG_USE_TEXTURE_REPEAT)); } if (gltf_texture_index != -1) { @@ -3564,6 +3679,11 @@ Error GLTFDocument::_parse_materials(Ref<GLTFState> state) { if (sgm.has("diffuseTexture")) { const Dictionary &diffuse_texture_dict = sgm["diffuseTexture"]; if (diffuse_texture_dict.has("index")) { + Ref<GLTFTextureSampler> diffuse_sampler = _get_sampler_for_texture(state, diffuse_texture_dict["index"]); + if (diffuse_sampler.is_valid()) { + material->set_texture_filter(diffuse_sampler->get_filter_mode()); + material->set_flag(BaseMaterial3D::FLAG_USE_TEXTURE_REPEAT, diffuse_sampler->get_wrap_mode()); + } Ref<Texture2D> diffuse_texture = _get_texture(state, diffuse_texture_dict["index"]); if (diffuse_texture.is_valid()) { spec_gloss->diffuse_img = diffuse_texture->get_image(); @@ -3612,6 +3732,9 @@ Error GLTFDocument::_parse_materials(Ref<GLTFState> state) { if (mr.has("baseColorTexture")) { const Dictionary &bct = mr["baseColorTexture"]; if (bct.has("index")) { + Ref<GLTFTextureSampler> bct_sampler = _get_sampler_for_texture(state, bct["index"]); + material->set_texture_filter(bct_sampler->get_filter_mode()); + material->set_flag(BaseMaterial3D::FLAG_USE_TEXTURE_REPEAT, bct_sampler->get_wrap_mode()); material->set_texture(BaseMaterial3D::TEXTURE_ALBEDO, _get_texture(state, bct["index"])); } if (!mr.has("baseColorFactor")) { @@ -5046,7 +5169,7 @@ ImporterMeshInstance3D *GLTFDocument::_generate_mesh_instance(Ref<GLTFState> sta return mi; } -Node3D *GLTFDocument::_generate_light(Ref<GLTFState> state, const GLTFNodeIndex node_index) { +Light3D *GLTFDocument::_generate_light(Ref<GLTFState> state, const GLTFNodeIndex node_index) { Ref<GLTFNode> gltf_node = state->nodes[node_index]; ERR_FAIL_INDEX_V(gltf_node->light, state->lights.size(), nullptr); @@ -5102,6 +5225,7 @@ Node3D *GLTFDocument::_generate_spatial(Ref<GLTFState> state, const GLTFNodeInde return spatial; } + void GLTFDocument::_convert_scene_node(Ref<GLTFState> state, Node *p_current, const GLTFNodeIndex p_gltf_parent, const GLTFNodeIndex p_gltf_root) { bool retflag = true; _check_visibility(p_current, retflag); @@ -6474,8 +6598,10 @@ Error GLTFDocument::_parse(Ref<GLTFState> state, String p_path, Ref<FileAccess> err = ext->import_preflight(state); ERR_FAIL_COND_V(err != OK, err); } + err = _parse_gltf_state(state, p_path, p_bake_fps); ERR_FAIL_COND_V(err != OK, err); + return OK; } @@ -6831,6 +6957,11 @@ Error GLTFDocument::_parse_gltf_state(Ref<GLTFState> state, const String &p_sear ERR_FAIL_COND_V(err != OK, ERR_PARSE_ERROR); + /* PARSE TEXTURE SAMPLERS */ + err = _parse_texture_samplers(state); + + ERR_FAIL_COND_V(err != OK, ERR_PARSE_ERROR); + /* PARSE TEXTURES */ err = _parse_textures(state); @@ -6916,12 +7047,32 @@ Error GLTFDocument::append_from_file(String p_path, Ref<GLTFState> r_state, uint Error GLTFDocument::_parse_gltf_extensions(Ref<GLTFState> state) { ERR_FAIL_NULL_V(state, ERR_PARSE_ERROR); - if (state->json.has("extensionsRequired") && state->json["extensionsRequired"].get_type() == Variant::ARRAY) { - Array extensions_required = state->json["extensionsRequired"]; - if (extensions_required.find("KHR_draco_mesh_compression") != -1) { - ERR_PRINT("glTF2 extension KHR_draco_mesh_compression is not supported."); - return ERR_UNAVAILABLE; + if (state->json.has("extensionsUsed")) { + Vector<String> ext_array = state->json["extensionsUsed"]; + state->extensions_used = ext_array; + } + if (state->json.has("extensionsRequired")) { + Vector<String> ext_array = state->json["extensionsRequired"]; + state->extensions_required = ext_array; + } + HashSet<String> supported_extensions; + supported_extensions.insert("KHR_lights_punctual"); + supported_extensions.insert("KHR_materials_pbrSpecularGlossiness"); + supported_extensions.insert("KHR_texture_transform"); + for (int ext_i = 0; ext_i < document_extensions.size(); ext_i++) { + Ref<GLTFDocumentExtension> ext = document_extensions[ext_i]; + ERR_CONTINUE(ext.is_null()); + Vector<String> ext_supported_extensions = ext->get_supported_extensions(); + for (int i = 0; i < ext_supported_extensions.size(); ++i) { + supported_extensions.insert(ext_supported_extensions[i]); } } - return OK; + Error ret = Error::OK; + for (int i = 0; i < state->extensions_required.size(); i++) { + if (!supported_extensions.has(state->extensions_required[i])) { + ERR_PRINT("GLTF: Can't import file '" + state->filename + "', required extension '" + String(state->extensions_required[i]) + "' is not supported. Are you missing a GLTFDocumentExtension plugin?"); + ret = ERR_UNAVAILABLE; + } + } + return ret; } diff --git a/modules/gltf/gltf_document.h b/modules/gltf/gltf_document.h index 36a2f94a4e..62b6e29fe0 100644 --- a/modules/gltf/gltf_document.h +++ b/modules/gltf/gltf_document.h @@ -95,9 +95,14 @@ private: String _gen_unique_bone_name(Ref<GLTFState> state, const GLTFSkeletonIndex skel_i, const String &p_name); - GLTFTextureIndex _set_texture(Ref<GLTFState> state, Ref<Texture2D> p_texture); + GLTFTextureIndex _set_texture(Ref<GLTFState> state, Ref<Texture2D> p_texture, + StandardMaterial3D::TextureFilter p_filter_mode, bool p_repeats); Ref<Texture2D> _get_texture(Ref<GLTFState> state, const GLTFTextureIndex p_texture); + GLTFTextureSamplerIndex _set_sampler_for_mode(Ref<GLTFState> state, + StandardMaterial3D::TextureFilter p_filter_mode, bool p_repeats); + Ref<GLTFTextureSampler> _get_sampler_for_texture(Ref<GLTFState> state, + const GLTFTextureIndex p_texture); Error _parse_json(const String &p_path, Ref<GLTFState> state); Error _parse_glb(Ref<FileAccess> f, Ref<GLTFState> state); void _compute_node_heights(Ref<GLTFState> state); @@ -145,10 +150,12 @@ private: const bool p_for_vertex); Error _parse_meshes(Ref<GLTFState> state); Error _serialize_textures(Ref<GLTFState> state); + Error _serialize_texture_samplers(Ref<GLTFState> state); Error _serialize_images(Ref<GLTFState> state, const String &p_path); Error _serialize_lights(Ref<GLTFState> state); Error _parse_images(Ref<GLTFState> state, const String &p_base_path); Error _parse_textures(Ref<GLTFState> state); + Error _parse_texture_samplers(Ref<GLTFState> state); Error _parse_materials(Ref<GLTFState> state); void _set_texture_transform_uv1(const Dictionary &d, Ref<BaseMaterial3D> material); void spec_gloss_to_rough_metal(Ref<GLTFSpecGloss> r_spec_gloss, @@ -188,7 +195,7 @@ private: const GLTFNodeIndex bone_index); ImporterMeshInstance3D *_generate_mesh_instance(Ref<GLTFState> state, const GLTFNodeIndex node_index); Camera3D *_generate_camera(Ref<GLTFState> state, const GLTFNodeIndex node_index); - Node3D *_generate_light(Ref<GLTFState> state, const GLTFNodeIndex node_index); + Light3D *_generate_light(Ref<GLTFState> state, const GLTFNodeIndex node_index); Node3D *_generate_spatial(Ref<GLTFState> state, const GLTFNodeIndex node_index); void _assign_scene_names(Ref<GLTFState> state); template <class T> @@ -265,7 +272,7 @@ private: Dictionary _serialize_texture_transform_uv2(Ref<BaseMaterial3D> p_material); Error _serialize_version(Ref<GLTFState> state); Error _serialize_file(Ref<GLTFState> state, const String p_path); - Error _serialize_extensions(Ref<GLTFState> state) const; + Error _serialize_gltf_extensions(Ref<GLTFState> state) const; public: // https://www.itu.int/rec/R-REC-BT.601 diff --git a/modules/gltf/gltf_document_extension.cpp b/modules/gltf/gltf_document_extension.cpp index d0bd7651e0..3b952f8246 100644 --- a/modules/gltf/gltf_document_extension.cpp +++ b/modules/gltf/gltf_document_extension.cpp @@ -31,6 +31,7 @@ #include "gltf_document_extension.h" void GLTFDocumentExtension::_bind_methods() { + GDVIRTUAL_BIND(_get_supported_extensions); GDVIRTUAL_BIND(_import_preflight, "state"); GDVIRTUAL_BIND(_import_post_parse, "state"); GDVIRTUAL_BIND(_import_node, "state", "gltf_node", "json", "node"); @@ -40,6 +41,12 @@ void GLTFDocumentExtension::_bind_methods() { GDVIRTUAL_BIND(_export_post, "state"); } +Vector<String> GLTFDocumentExtension::get_supported_extensions() { + Vector<String> ret; + GDVIRTUAL_CALL(_get_supported_extensions, ret); + return ret; +} + Error GLTFDocumentExtension::import_post(Ref<GLTFState> p_state, Node *p_root) { ERR_FAIL_NULL_V(p_root, ERR_INVALID_PARAMETER); ERR_FAIL_NULL_V(p_state, ERR_INVALID_PARAMETER); diff --git a/modules/gltf/gltf_document_extension.h b/modules/gltf/gltf_document_extension.h index 0ef9109584..d4bb3993dc 100644 --- a/modules/gltf/gltf_document_extension.h +++ b/modules/gltf/gltf_document_extension.h @@ -41,6 +41,7 @@ protected: static void _bind_methods(); public: + virtual Vector<String> get_supported_extensions(); virtual Error import_preflight(Ref<GLTFState> p_state); virtual Error import_post_parse(Ref<GLTFState> p_state); virtual Error export_post(Ref<GLTFState> p_state); @@ -48,6 +49,7 @@ public: virtual Error export_preflight(Node *p_state); virtual Error import_node(Ref<GLTFState> p_state, Ref<GLTFNode> p_gltf_node, Dictionary &r_json, Node *p_node); virtual Error export_node(Ref<GLTFState> p_state, Ref<GLTFNode> p_gltf_node, Dictionary &r_json, Node *p_node); + GDVIRTUAL0R(Vector<String>, _get_supported_extensions); GDVIRTUAL1R(int, _import_preflight, Ref<GLTFState>); GDVIRTUAL1R(int, _import_post_parse, Ref<GLTFState>); GDVIRTUAL4R(int, _import_node, Ref<GLTFState>, Ref<GLTFNode>, Dictionary, Node *); diff --git a/modules/gltf/gltf_state.cpp b/modules/gltf/gltf_state.cpp index 85bac446cc..60192c67e6 100644 --- a/modules/gltf/gltf_state.cpp +++ b/modules/gltf/gltf_state.cpp @@ -31,6 +31,7 @@ #include "gltf_state.h" void GLTFState::_bind_methods() { + ClassDB::bind_method(D_METHOD("add_used_extension", "extension_name", "required"), &GLTFState::add_used_extension); ClassDB::bind_method(D_METHOD("get_json"), &GLTFState::get_json); ClassDB::bind_method(D_METHOD("set_json", "json"), &GLTFState::set_json); ClassDB::bind_method(D_METHOD("get_major_version"), &GLTFState::get_major_version); @@ -63,6 +64,8 @@ void GLTFState::_bind_methods() { ClassDB::bind_method(D_METHOD("set_root_nodes", "root_nodes"), &GLTFState::set_root_nodes); ClassDB::bind_method(D_METHOD("get_textures"), &GLTFState::get_textures); ClassDB::bind_method(D_METHOD("set_textures", "textures"), &GLTFState::set_textures); + ClassDB::bind_method(D_METHOD("get_texture_samplers"), &GLTFState::get_texture_samplers); + ClassDB::bind_method(D_METHOD("set_texture_samplers", "texture_samplers"), &GLTFState::set_texture_samplers); ClassDB::bind_method(D_METHOD("get_images"), &GLTFState::get_images); ClassDB::bind_method(D_METHOD("set_images", "images"), &GLTFState::set_images); ClassDB::bind_method(D_METHOD("get_skins"), &GLTFState::get_skins); @@ -100,6 +103,7 @@ void GLTFState::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::STRING, "base_path"), "set_base_path", "get_base_path"); // String ADD_PROPERTY(PropertyInfo(Variant::PACKED_INT32_ARRAY, "root_nodes"), "set_root_nodes", "get_root_nodes"); // Vector<int> ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "textures", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_INTERNAL | PROPERTY_USAGE_EDITOR), "set_textures", "get_textures"); // Vector<Ref<GLTFTexture>> + ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "texture_samplers", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_INTERNAL | PROPERTY_USAGE_EDITOR), "set_texture_samplers", "get_texture_samplers"); //Vector<Ref<GLTFTextureSampler>> ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "images", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_INTERNAL | PROPERTY_USAGE_EDITOR), "set_images", "get_images"); // Vector<Ref<Texture> ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "skins", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_INTERNAL | PROPERTY_USAGE_EDITOR), "set_skins", "get_skins"); // Vector<Ref<GLTFSkin>> ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "cameras", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_INTERNAL | PROPERTY_USAGE_EDITOR), "set_cameras", "get_cameras"); // Vector<Ref<GLTFCamera>> @@ -112,6 +116,17 @@ void GLTFState::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "animations", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_INTERNAL | PROPERTY_USAGE_EDITOR), "set_animations", "get_animations"); // Vector<Ref<GLTFAnimation>> } +void GLTFState::add_used_extension(const String &p_extension_name, bool p_required) { + if (!extensions_used.has(p_extension_name)) { + extensions_used.push_back(p_extension_name); + } + if (p_required) { + if (!extensions_required.has(p_extension_name)) { + extensions_required.push_back(p_extension_name); + } + } +} + Dictionary GLTFState::get_json() { return json; } @@ -224,6 +239,14 @@ void GLTFState::set_textures(TypedArray<GLTFTexture> p_textures) { GLTFTemplateConvert::set_from_array(textures, p_textures); } +TypedArray<GLTFTextureSampler> GLTFState::get_texture_samplers() { + return GLTFTemplateConvert::to_array(texture_samplers); +} + +void GLTFState::set_texture_samplers(TypedArray<GLTFTextureSampler> p_texture_samplers) { + GLTFTemplateConvert::set_from_array(texture_samplers, p_texture_samplers); +} + TypedArray<Texture2D> GLTFState::get_images() { return GLTFTemplateConvert::to_array(images); } diff --git a/modules/gltf/gltf_state.h b/modules/gltf/gltf_state.h index 6b2d1ca228..afe7e82010 100644 --- a/modules/gltf/gltf_state.h +++ b/modules/gltf/gltf_state.h @@ -42,6 +42,7 @@ #include "structures/gltf_skeleton.h" #include "structures/gltf_skin.h" #include "structures/gltf_texture.h" +#include "structures/gltf_texture_sampler.h" #include "core/templates/rb_map.h" #include "scene/animation/animation_player.h" @@ -77,7 +78,11 @@ class GLTFState : public Resource { String scene_name; Vector<int> root_nodes; Vector<Ref<GLTFTexture>> textures; + Vector<Ref<GLTFTextureSampler>> texture_samplers; + Ref<GLTFTextureSampler> default_texture_sampler; Vector<Ref<Texture2D>> images; + Vector<String> extensions_used; + Vector<String> extensions_required; Vector<Ref<GLTFSkin>> skins; Vector<Ref<GLTFCamera>> cameras; @@ -97,6 +102,8 @@ protected: static void _bind_methods(); public: + void add_used_extension(const String &p_extension, bool p_required = false); + Dictionary get_json(); void set_json(Dictionary p_json); @@ -145,6 +152,9 @@ public: TypedArray<GLTFTexture> get_textures(); void set_textures(TypedArray<GLTFTexture> p_textures); + TypedArray<GLTFTextureSampler> get_texture_samplers(); + void set_texture_samplers(TypedArray<GLTFTextureSampler> p_texture_samplers); + TypedArray<Texture2D> get_images(); void set_images(TypedArray<Texture2D> p_images); diff --git a/modules/gltf/register_types.cpp b/modules/gltf/register_types.cpp index dbbccc9bcc..b9027f6e3d 100644 --- a/modules/gltf/register_types.cpp +++ b/modules/gltf/register_types.cpp @@ -47,6 +47,7 @@ #include "structures/gltf_skeleton.h" #include "structures/gltf_skin.h" #include "structures/gltf_texture.h" +#include "structures/gltf_texture_sampler.h" #ifdef TOOLS_ENABLED #include "core/config/project_settings.h" @@ -126,6 +127,7 @@ void initialize_gltf_module(ModuleInitializationLevel p_level) { GDREGISTER_CLASS(GLTFSpecGloss); GDREGISTER_CLASS(GLTFState); GDREGISTER_CLASS(GLTFTexture); + GDREGISTER_CLASS(GLTFTextureSampler); } #ifdef TOOLS_ENABLED @@ -142,6 +144,11 @@ void initialize_gltf_module(ModuleInitializationLevel p_level) { GLOBAL_DEF_RST("filesystem/import/fbx/enabled", true); GDREGISTER_CLASS(EditorSceneFormatImporterBlend); GDREGISTER_CLASS(EditorSceneFormatImporterFBX); + // Can't (a priori) run external app on these platforms. + GLOBAL_DEF_RST("filesystem/import/blender/enabled.android", false); + GLOBAL_DEF_RST("filesystem/import/blender/enabled.web", false); + GLOBAL_DEF_RST("filesystem/import/fbx/enabled.android", false); + GLOBAL_DEF_RST("filesystem/import/fbx/enabled.web", false); ClassDB::set_current_api(prev_api); EditorNode::add_init_callback(_editor_init); diff --git a/modules/gltf/register_types.h b/modules/gltf/register_types.h index 90b9a83c88..bf2730d2ef 100644 --- a/modules/gltf/register_types.h +++ b/modules/gltf/register_types.h @@ -28,7 +28,12 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ +#ifndef GLTF_REGISTER_TYPES_H +#define GLTF_REGISTER_TYPES_H + #include "modules/register_module_types.h" void initialize_gltf_module(ModuleInitializationLevel p_level); void uninitialize_gltf_module(ModuleInitializationLevel p_level); + +#endif // GLTF_REGISTER_TYPES_H diff --git a/modules/gltf/structures/gltf_texture.cpp b/modules/gltf/structures/gltf_texture.cpp index 2a21cb3df8..5cc96e3221 100644 --- a/modules/gltf/structures/gltf_texture.cpp +++ b/modules/gltf/structures/gltf_texture.cpp @@ -33,8 +33,11 @@ void GLTFTexture::_bind_methods() { ClassDB::bind_method(D_METHOD("get_src_image"), &GLTFTexture::get_src_image); ClassDB::bind_method(D_METHOD("set_src_image", "src_image"), &GLTFTexture::set_src_image); + ClassDB::bind_method(D_METHOD("get_sampler"), &GLTFTexture::get_sampler); + ClassDB::bind_method(D_METHOD("set_sampler", "sampler"), &GLTFTexture::set_sampler); ADD_PROPERTY(PropertyInfo(Variant::INT, "src_image"), "set_src_image", "get_src_image"); // int + ADD_PROPERTY(PropertyInfo(Variant::INT, "sampler"), "set_sampler", "get_sampler"); // int } GLTFImageIndex GLTFTexture::get_src_image() const { @@ -44,3 +47,11 @@ GLTFImageIndex GLTFTexture::get_src_image() const { void GLTFTexture::set_src_image(GLTFImageIndex val) { src_image = val; } + +GLTFTextureSamplerIndex GLTFTexture::get_sampler() const { + return sampler; +} + +void GLTFTexture::set_sampler(GLTFTextureSamplerIndex val) { + sampler = val; +} diff --git a/modules/gltf/structures/gltf_texture.h b/modules/gltf/structures/gltf_texture.h index b1d12dddfa..b26c8a7b07 100644 --- a/modules/gltf/structures/gltf_texture.h +++ b/modules/gltf/structures/gltf_texture.h @@ -39,6 +39,7 @@ class GLTFTexture : public Resource { private: GLTFImageIndex src_image = 0; + GLTFTextureSamplerIndex sampler = -1; protected: static void _bind_methods(); @@ -46,6 +47,8 @@ protected: public: GLTFImageIndex get_src_image() const; void set_src_image(GLTFImageIndex val); + GLTFTextureSamplerIndex get_sampler() const; + void set_sampler(GLTFTextureSamplerIndex val); }; #endif // GLTF_TEXTURE_H diff --git a/modules/gltf/structures/gltf_texture_sampler.cpp b/modules/gltf/structures/gltf_texture_sampler.cpp new file mode 100644 index 0000000000..6cf615b6cc --- /dev/null +++ b/modules/gltf/structures/gltf_texture_sampler.cpp @@ -0,0 +1,47 @@ +/*************************************************************************/ +/* gltf_texture_sampler.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* 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 "gltf_texture_sampler.h" + +void GLTFTextureSampler::_bind_methods() { + ClassDB::bind_method(D_METHOD("get_mag_filter"), &GLTFTextureSampler::get_mag_filter); + ClassDB::bind_method(D_METHOD("set_mag_filter", "filter_mode"), &GLTFTextureSampler::set_mag_filter); + ClassDB::bind_method(D_METHOD("get_min_filter"), &GLTFTextureSampler::get_min_filter); + ClassDB::bind_method(D_METHOD("set_min_filter", "filter_mode"), &GLTFTextureSampler::set_min_filter); + ClassDB::bind_method(D_METHOD("get_wrap_s"), &GLTFTextureSampler::get_wrap_s); + ClassDB::bind_method(D_METHOD("set_wrap_s", "wrap_mode"), &GLTFTextureSampler::set_wrap_s); + ClassDB::bind_method(D_METHOD("get_wrap_t"), &GLTFTextureSampler::get_wrap_t); + ClassDB::bind_method(D_METHOD("set_wrap_t", "wrap_mode"), &GLTFTextureSampler::set_wrap_t); + + ADD_PROPERTY(PropertyInfo(Variant::INT, "mag_filter"), "set_mag_filter", "get_mag_filter"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "min_filter"), "set_min_filter", "get_min_filter"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "wrap_s"), "set_wrap_s", "get_wrap_s"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "wrap_t"), "set_wrap_t", "get_wrap_t"); +} diff --git a/modules/gltf/structures/gltf_texture_sampler.h b/modules/gltf/structures/gltf_texture_sampler.h new file mode 100644 index 0000000000..3fad31bbee --- /dev/null +++ b/modules/gltf/structures/gltf_texture_sampler.h @@ -0,0 +1,163 @@ +/*************************************************************************/ +/* gltf_texture_sampler.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* 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 GLTF_TEXTURE_SAMPLER_H +#define GLTF_TEXTURE_SAMPLER_H + +#include "core/io/resource.h" +#include "scene/resources/material.h" + +class GLTFTextureSampler : public Resource { + GDCLASS(GLTFTextureSampler, Resource); + +public: + enum FilterMode { + NEAREST = 9728, + LINEAR = 9729, + NEAREST_MIPMAP_NEAREST = 9984, + LINEAR_MIPMAP_NEAREST = 9985, + NEAREST_MIPMAP_LINEAR = 9986, + LINEAR_MIPMAP_LINEAR = 9987 + }; + + enum WrapMode { + CLAMP_TO_EDGE = 33071, + MIRRORED_REPEAT = 33648, + REPEAT = 10497, + DEFAULT = REPEAT + }; + + int get_mag_filter() const { + return mag_filter; + } + + void set_mag_filter(const int filter_mode) { + mag_filter = (FilterMode)filter_mode; + } + + int get_min_filter() const { + return min_filter; + } + + void set_min_filter(const int filter_mode) { + min_filter = (FilterMode)filter_mode; + } + + int get_wrap_s() const { + return wrap_s; + } + + void set_wrap_s(const int wrap_mode) { + wrap_s = (WrapMode)wrap_mode; + } + + int get_wrap_t() const { + return wrap_t; + } + + void set_wrap_t(const int wrap_mode) { + wrap_s = (WrapMode)wrap_mode; + } + + StandardMaterial3D::TextureFilter get_filter_mode() const { + using TextureFilter = StandardMaterial3D::TextureFilter; + + switch (min_filter) { + case NEAREST: + return TextureFilter::TEXTURE_FILTER_NEAREST; + case LINEAR: + return TextureFilter::TEXTURE_FILTER_LINEAR; + case NEAREST_MIPMAP_NEAREST: + case NEAREST_MIPMAP_LINEAR: + return TextureFilter::TEXTURE_FILTER_NEAREST_WITH_MIPMAPS; + case LINEAR_MIPMAP_NEAREST: + case LINEAR_MIPMAP_LINEAR: + default: + return TextureFilter::TEXTURE_FILTER_LINEAR_WITH_MIPMAPS; + } + } + + void set_filter_mode(StandardMaterial3D::TextureFilter mode) { + using TextureFilter = StandardMaterial3D::TextureFilter; + + switch (mode) { + case TextureFilter::TEXTURE_FILTER_NEAREST: + min_filter = FilterMode::NEAREST; + mag_filter = FilterMode::NEAREST; + break; + case TextureFilter::TEXTURE_FILTER_LINEAR: + min_filter = FilterMode::LINEAR; + mag_filter = FilterMode::LINEAR; + break; + case TextureFilter::TEXTURE_FILTER_NEAREST_WITH_MIPMAPS: + case TextureFilter::TEXTURE_FILTER_NEAREST_WITH_MIPMAPS_ANISOTROPIC: + min_filter = FilterMode::NEAREST_MIPMAP_LINEAR; + mag_filter = FilterMode::NEAREST; + break; + case TextureFilter::TEXTURE_FILTER_LINEAR_WITH_MIPMAPS: + case TextureFilter::TEXTURE_FILTER_LINEAR_WITH_MIPMAPS_ANISOTROPIC: + default: + min_filter = FilterMode::LINEAR_MIPMAP_LINEAR; + mag_filter = FilterMode::LINEAR; + break; + } + } + + bool get_wrap_mode() const { + // BaseMaterial3D presents wrapping as a boolean property. Either the texture is repeated + // in both dimensions, non-mirrored, or it isn't repeated at all. This will cause oddities + // when people import models having other wrapping mode combinations. + return (wrap_s == WrapMode::REPEAT) && (wrap_t == WrapMode::REPEAT); + } + + void set_wrap_mode(bool mat_repeats) { + if (mat_repeats) { + wrap_s = WrapMode::REPEAT; + wrap_t = WrapMode::REPEAT; + } else { + wrap_s = WrapMode::CLAMP_TO_EDGE; + wrap_t = WrapMode::CLAMP_TO_EDGE; + } + } + +protected: + static void _bind_methods(); + +private: + FilterMode mag_filter = FilterMode::LINEAR; + FilterMode min_filter = FilterMode::LINEAR_MIPMAP_LINEAR; + WrapMode wrap_s = WrapMode::REPEAT; + WrapMode wrap_t = WrapMode::REPEAT; +}; + +VARIANT_ENUM_CAST(GLTFTextureSampler::FilterMode); +VARIANT_ENUM_CAST(GLTFTextureSampler::WrapMode); + +#endif // GLTF_TEXTURE_SAMPLER_H diff --git a/modules/gridmap/SCsub b/modules/gridmap/SCsub index da3f7d4dd9..282d772592 100644 --- a/modules/gridmap/SCsub +++ b/modules/gridmap/SCsub @@ -7,5 +7,5 @@ env_gridmap = env_modules.Clone() # Godot source files env_gridmap.add_source_files(env.modules_sources, "*.cpp") -if env["tools"]: +if env.editor_build: env_gridmap.add_source_files(env.modules_sources, "editor/*.cpp") diff --git a/modules/gridmap/doc_classes/GridMap.xml b/modules/gridmap/doc_classes/GridMap.xml index ed6cb8656a..0f3662c3cf 100644 --- a/modules/gridmap/doc_classes/GridMap.xml +++ b/modules/gridmap/doc_classes/GridMap.xml @@ -57,7 +57,7 @@ <return type="Basis" /> <param index="0" name="position" type="Vector3i" /> <description> - Returns the basis that gives the specificed cell its orientation. + Returns the basis that gives the specified cell its orientation. </description> </method> <method name="get_cell_item_orientation" qualifiers="const"> diff --git a/modules/gridmap/grid_map.cpp b/modules/gridmap/grid_map.cpp index 466a2efd21..05ce2b6147 100644 --- a/modules/gridmap/grid_map.cpp +++ b/modules/gridmap/grid_map.cpp @@ -1149,7 +1149,7 @@ TypedArray<Vector3i> GridMap::get_used_cells() const { TypedArray<Vector3i> GridMap::get_used_cells_by_item(int p_item) const { TypedArray<Vector3i> a; for (const KeyValue<IndexKey, Cell> &E : cell_map) { - if (E.value.item == p_item) { + if ((int)E.value.item == p_item) { Vector3i p(E.key.x, E.key.y, E.key.z); a.push_back(p); } diff --git a/modules/hdr/image_loader_hdr.cpp b/modules/hdr/image_loader_hdr.cpp index e7c6fe592d..6f0bc16a26 100644 --- a/modules/hdr/image_loader_hdr.cpp +++ b/modules/hdr/image_loader_hdr.cpp @@ -33,7 +33,7 @@ #include "core/os/os.h" #include "core/string/print_string.h" -Error ImageLoaderHDR::load_image(Ref<Image> p_image, Ref<FileAccess> f, uint32_t p_flags, float p_scale) { +Error ImageLoaderHDR::load_image(Ref<Image> p_image, Ref<FileAccess> f, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale) { String header = f->get_token(); ERR_FAIL_COND_V_MSG(header != "#?RADIANCE" && header != "#?RGBE", ERR_FILE_UNRECOGNIZED, "Unsupported header information in HDR: " + header + "."); diff --git a/modules/hdr/image_loader_hdr.h b/modules/hdr/image_loader_hdr.h index 1bff05129b..5f817f0ba8 100644 --- a/modules/hdr/image_loader_hdr.h +++ b/modules/hdr/image_loader_hdr.h @@ -35,7 +35,7 @@ class ImageLoaderHDR : public ImageFormatLoader { public: - virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> f, uint32_t p_flags, float p_scale); + virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> f, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale); virtual void get_recognized_extensions(List<String> *p_extensions) const; ImageLoaderHDR(); }; diff --git a/modules/hdr/register_types.cpp b/modules/hdr/register_types.cpp index b988bf4587..18b1a73f1c 100644 --- a/modules/hdr/register_types.cpp +++ b/modules/hdr/register_types.cpp @@ -32,14 +32,14 @@ #include "image_loader_hdr.h" -static ImageLoaderHDR *image_loader_hdr = nullptr; +static Ref<ImageLoaderHDR> image_loader_hdr; void initialize_hdr_module(ModuleInitializationLevel p_level) { if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) { return; } - image_loader_hdr = memnew(ImageLoaderHDR); + image_loader_hdr.instantiate(); ImageLoader::add_image_format_loader(image_loader_hdr); } @@ -48,5 +48,6 @@ void uninitialize_hdr_module(ModuleInitializationLevel p_level) { return; } - memdelete(image_loader_hdr); + ImageLoader::remove_image_format_loader(image_loader_hdr); + image_loader_hdr.unref(); } diff --git a/modules/jpg/image_loader_jpegd.cpp b/modules/jpg/image_loader_jpegd.cpp index 3e138bf633..ce20ac9060 100644 --- a/modules/jpg/image_loader_jpegd.cpp +++ b/modules/jpg/image_loader_jpegd.cpp @@ -104,7 +104,7 @@ Error jpeg_load_image_from_buffer(Image *p_image, const uint8_t *p_buffer, int p return OK; } -Error ImageLoaderJPG::load_image(Ref<Image> p_image, Ref<FileAccess> f, uint32_t p_flags, float p_scale) { +Error ImageLoaderJPG::load_image(Ref<Image> p_image, Ref<FileAccess> f, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale) { Vector<uint8_t> src_image; uint64_t src_image_len = f->get_length(); ERR_FAIL_COND_V(src_image_len == 0, ERR_FILE_CORRUPT); diff --git a/modules/jpg/image_loader_jpegd.h b/modules/jpg/image_loader_jpegd.h index caa0461d05..f63db51521 100644 --- a/modules/jpg/image_loader_jpegd.h +++ b/modules/jpg/image_loader_jpegd.h @@ -35,7 +35,7 @@ class ImageLoaderJPG : public ImageFormatLoader { public: - virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> f, uint32_t p_flags, float p_scale); + virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> f, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale); virtual void get_recognized_extensions(List<String> *p_extensions) const; ImageLoaderJPG(); }; diff --git a/modules/jpg/register_types.cpp b/modules/jpg/register_types.cpp index b8b48a550f..7da216bbe2 100644 --- a/modules/jpg/register_types.cpp +++ b/modules/jpg/register_types.cpp @@ -32,14 +32,14 @@ #include "image_loader_jpegd.h" -static ImageLoaderJPG *image_loader_jpg = nullptr; +static Ref<ImageLoaderJPG> image_loader_jpg; void initialize_jpg_module(ModuleInitializationLevel p_level) { if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) { return; } - image_loader_jpg = memnew(ImageLoaderJPG); + image_loader_jpg.instantiate(); ImageLoader::add_image_format_loader(image_loader_jpg); } @@ -48,5 +48,6 @@ void uninitialize_jpg_module(ModuleInitializationLevel p_level) { return; } - memdelete(image_loader_jpg); + ImageLoader::remove_image_format_loader(image_loader_jpg); + image_loader_jpg.unref(); } diff --git a/modules/minimp3/audio_stream_mp3.cpp b/modules/minimp3/audio_stream_mp3.cpp index 98bcdea8f4..acb92b25e1 100644 --- a/modules/minimp3/audio_stream_mp3.cpp +++ b/modules/minimp3/audio_stream_mp3.cpp @@ -104,7 +104,7 @@ float AudioStreamPlaybackMP3::get_stream_sampling_rate() { return mp3_stream->sample_rate; } -void AudioStreamPlaybackMP3::start(float p_from_pos) { +void AudioStreamPlaybackMP3::start(double p_from_pos) { active = true; seek(p_from_pos); loops = 0; @@ -123,11 +123,11 @@ int AudioStreamPlaybackMP3::get_loop_count() const { return loops; } -float AudioStreamPlaybackMP3::get_playback_position() const { - return float(frames_mixed) / mp3_stream->sample_rate; +double AudioStreamPlaybackMP3::get_playback_position() const { + return double(frames_mixed) / mp3_stream->sample_rate; } -void AudioStreamPlaybackMP3::seek(float p_time) { +void AudioStreamPlaybackMP3::seek(double p_time) { if (!active) { return; } @@ -217,15 +217,15 @@ bool AudioStreamMP3::has_loop() const { return loop; } -void AudioStreamMP3::set_loop_offset(float p_seconds) { +void AudioStreamMP3::set_loop_offset(double p_seconds) { loop_offset = p_seconds; } -float AudioStreamMP3::get_loop_offset() const { +double AudioStreamMP3::get_loop_offset() const { return loop_offset; } -float AudioStreamMP3::get_length() const { +double AudioStreamMP3::get_length() const { return length; } diff --git a/modules/minimp3/audio_stream_mp3.h b/modules/minimp3/audio_stream_mp3.h index 428ac1240e..c34c1dc5fa 100644 --- a/modules/minimp3/audio_stream_mp3.h +++ b/modules/minimp3/audio_stream_mp3.h @@ -61,14 +61,14 @@ protected: virtual float get_stream_sampling_rate() override; public: - virtual void start(float p_from_pos = 0.0) override; + virtual void start(double p_from_pos = 0.0) override; virtual void stop() override; virtual bool is_playing() const override; virtual int get_loop_count() const override; //times it looped - virtual float get_playback_position() const override; - virtual void seek(float p_time) override; + virtual double get_playback_position() const override; + virtual void seek(double p_time) override; virtual void tag_used_streams() override; @@ -104,8 +104,8 @@ public: void set_loop(bool p_enable); virtual bool has_loop() const override; - void set_loop_offset(float p_seconds); - float get_loop_offset() const; + void set_loop_offset(double p_seconds); + double get_loop_offset() const; void set_bpm(double p_bpm); virtual double get_bpm() const override; @@ -122,7 +122,7 @@ public: void set_data(const Vector<uint8_t> &p_data); Vector<uint8_t> get_data() const; - virtual float get_length() const override; + virtual double get_length() const override; virtual bool is_monophonic() const override; diff --git a/modules/mono/SCsub b/modules/mono/SCsub index 7764ba0b45..a4667f784d 100644 --- a/modules/mono/SCsub +++ b/modules/mono/SCsub @@ -26,6 +26,6 @@ if env["platform"] in ["macos", "ios"]: elif env["platform"] == "android": env_mono.add_source_files(env.modules_sources, "mono_gd/android_mono_config.gen.cpp") -if env["tools"]: +if env.editor_build: env_mono.add_source_files(env.modules_sources, "editor/*.cpp") SConscript("editor/script_templates/SCsub") diff --git a/modules/mono/build_scripts/build_assemblies.py b/modules/mono/build_scripts/build_assemblies.py index 6f66ce9efa..d28c3a0c3a 100755 --- a/modules/mono/build_scripts/build_assemblies.py +++ b/modules/mono/build_scripts/build_assemblies.py @@ -5,6 +5,7 @@ import os.path import shlex import subprocess from dataclasses import dataclass +from typing import Optional, List def find_dotnet_cli(): @@ -150,10 +151,7 @@ def find_any_msbuild_tool(mono_prefix): return None -def run_msbuild(tools: ToolsLocation, sln: str, msbuild_args: [str] = None): - if msbuild_args is None: - msbuild_args = [] - +def run_msbuild(tools: ToolsLocation, sln: str, msbuild_args: Optional[List[str]] = None): using_msbuild_mono = False # Preference order: dotnet CLI > Standalone MSBuild > Mono's MSBuild @@ -169,7 +167,7 @@ def run_msbuild(tools: ToolsLocation, sln: str, msbuild_args: [str] = None): args += [sln] - if len(msbuild_args) > 0: + if msbuild_args: args += msbuild_args print("Running MSBuild: ", " ".join(shlex.quote(arg) for arg in args), flush=True) @@ -315,6 +313,8 @@ def main(): output_dir = os.path.abspath(args.godot_output_dir) + push_nupkgs_local = os.path.abspath(args.push_nupkgs_local) if args.push_nupkgs_local else None + msbuild_tool = find_any_msbuild_tool(args.mono_prefix) if msbuild_tool is None: @@ -327,7 +327,7 @@ def main(): output_dir, args.godot_platform, args.dev_debug, - args.push_nupkgs_local, + push_nupkgs_local, args.float, ) sys.exit(exit_code) diff --git a/modules/mono/build_scripts/mono_configure.py b/modules/mono/build_scripts/mono_configure.py index 5d63773096..5cec8f41f5 100644 --- a/modules/mono/build_scripts/mono_configure.py +++ b/modules/mono/build_scripts/mono_configure.py @@ -20,10 +20,7 @@ def configure(env, env_mono): # is_ios = env["platform"] == "ios" # is_ios_sim = is_ios and env["arch"] in ["x86_32", "x86_64"] - tools_enabled = env["tools"] - - if tools_enabled and not module_supports_tools_on(env["platform"]): - raise RuntimeError("This module does not currently support building for this platform with tools enabled") - - if env["tools"]: + if env.editor_build: + if not module_supports_tools_on(env["platform"]): + raise RuntimeError("This module does not currently support building for this platform for editor builds.") env_mono.Append(CPPDEFINES=["GD_MONO_HOT_RELOAD"]) diff --git a/modules/mono/config.py b/modules/mono/config.py index 15fe79ef8c..a36083b64b 100644 --- a/modules/mono/config.py +++ b/modules/mono/config.py @@ -7,7 +7,7 @@ def can_build(env, platform): if env["arch"].startswith("rv"): return False - if env["tools"]: + if env.editor_build: env.module_add_dependencies("mono", ["regex"]) return True diff --git a/modules/mono/csharp_script.cpp b/modules/mono/csharp_script.cpp index 990a95821e..97a1d5c8d8 100644 --- a/modules/mono/csharp_script.cpp +++ b/modules/mono/csharp_script.cpp @@ -1299,7 +1299,7 @@ GDNativeBool CSharpLanguage::_instance_binding_reference_callback(void *p_token, MonoGCHandleData &gchandle = script_binding.gchandle; - int refcount = rc_owner->reference_get_count(); + int refcount = rc_owner->get_reference_count(); if (!script_binding.inited) { return refcount == 0; @@ -1818,7 +1818,7 @@ void CSharpInstance::refcount_incremented() { RefCounted *rc_owner = Object::cast_to<RefCounted>(owner); - if (rc_owner->reference_get_count() > 1 && gchandle.is_weak()) { // The managed side also holds a reference, hence 1 instead of 0 + if (rc_owner->get_reference_count() > 1 && gchandle.is_weak()) { // The managed side also holds a reference, hence 1 instead of 0 // The reference count was increased after the managed side was the only one referencing our owner. // This means the owner is being referenced again by the unmanaged side, // so the owner must hold the managed side alive again to avoid it from being GCed. @@ -1849,7 +1849,7 @@ bool CSharpInstance::refcount_decremented() { RefCounted *rc_owner = Object::cast_to<RefCounted>(owner); - int refcount = rc_owner->reference_get_count(); + int refcount = rc_owner->get_reference_count(); if (refcount == 1 && !gchandle.is_weak()) { // The managed side also holds a reference, hence 1 instead of 0 // If owner owner is no longer referenced by the unmanaged side, @@ -1995,7 +1995,7 @@ CSharpInstance::~CSharpInstance() { #ifdef DEBUG_ENABLED // The "instance binding" holds a reference so the refcount should be at least 2 before `scope_keep_owner_alive` goes out of scope - CRASH_COND(rc_owner->reference_get_count() <= 1); + CRASH_COND(rc_owner->get_reference_count() <= 1); #endif } @@ -2035,6 +2035,52 @@ void CSharpScript::_update_exports_values(HashMap<StringName, Variant> &values, } #endif +void GD_CLR_STDCALL CSharpScript::_add_property_info_list_callback(CSharpScript *p_script, const String *p_current_class_name, void *p_props, int32_t p_count) { + GDMonoCache::godotsharp_property_info *props = (GDMonoCache::godotsharp_property_info *)p_props; + +#ifdef TOOLS_ENABLED + p_script->exported_members_cache.push_back(PropertyInfo( + Variant::NIL, *p_current_class_name, PROPERTY_HINT_NONE, + p_script->get_path(), PROPERTY_USAGE_CATEGORY)); +#endif + + for (int i = 0; i < p_count; i++) { + const GDMonoCache::godotsharp_property_info &prop = props[i]; + + StringName name = *reinterpret_cast<const StringName *>(&prop.name); + String hint_string = *reinterpret_cast<const String *>(&prop.hint_string); + + PropertyInfo pinfo(prop.type, name, prop.hint, hint_string, prop.usage); + + p_script->member_info[name] = pinfo; + + if (prop.exported) { +#ifdef TOOLS_ENABLED + p_script->exported_members_cache.push_back(pinfo); +#endif + +#if defined(TOOLS_ENABLED) || defined(DEBUG_ENABLED) + p_script->exported_members_names.insert(name); +#endif + } + } +} + +#ifdef TOOLS_ENABLED +void GD_CLR_STDCALL CSharpScript::_add_property_default_values_callback(CSharpScript *p_script, void *p_def_vals, int32_t p_count) { + GDMonoCache::godotsharp_property_def_val_pair *def_vals = (GDMonoCache::godotsharp_property_def_val_pair *)p_def_vals; + + for (int i = 0; i < p_count; i++) { + const GDMonoCache::godotsharp_property_def_val_pair &def_val_pair = def_vals[i]; + + StringName name = *reinterpret_cast<const StringName *>(&def_val_pair.name); + Variant value = *reinterpret_cast<const Variant *>(&def_val_pair.value); + + p_script->exported_members_defval_cache[name] = value; + } +} +#endif + bool CSharpScript::_update_exports(PlaceHolderScriptInstance *p_instance_to_update) { #ifdef TOOLS_ENABLED bool is_editor = Engine::get_singleton()->is_editor_hint(); @@ -2066,49 +2112,10 @@ bool CSharpScript::_update_exports(PlaceHolderScriptInstance *p_instance_to_upda #endif if (GDMonoCache::godot_api_cache_updated) { - GDMonoCache::managed_callbacks.ScriptManagerBridge_GetPropertyInfoList(this, - [](CSharpScript *p_script, const String *p_current_class_name, GDMonoCache::godotsharp_property_info *p_props, int32_t p_count) { -#ifdef TOOLS_ENABLED - p_script->exported_members_cache.push_back(PropertyInfo( - Variant::NIL, *p_current_class_name, PROPERTY_HINT_NONE, - p_script->get_path(), PROPERTY_USAGE_CATEGORY)); -#endif - - for (int i = 0; i < p_count; i++) { - const GDMonoCache::godotsharp_property_info &prop = p_props[i]; - - StringName name = *reinterpret_cast<const StringName *>(&prop.name); - String hint_string = *reinterpret_cast<const String *>(&prop.hint_string); - - PropertyInfo pinfo(prop.type, name, prop.hint, hint_string, prop.usage); - - p_script->member_info[name] = pinfo; - - if (prop.exported) { + GDMonoCache::managed_callbacks.ScriptManagerBridge_GetPropertyInfoList(this, &_add_property_info_list_callback); #ifdef TOOLS_ENABLED - p_script->exported_members_cache.push_back(pinfo); -#endif - -#if defined(TOOLS_ENABLED) || defined(DEBUG_ENABLED) - p_script->exported_members_names.insert(name); -#endif - } - } - }); - -#ifdef TOOLS_ENABLED - GDMonoCache::managed_callbacks.ScriptManagerBridge_GetPropertyDefaultValues(this, - [](CSharpScript *p_script, GDMonoCache::godotsharp_property_def_val_pair *p_def_vals, int32_t p_count) { - for (int i = 0; i < p_count; i++) { - const GDMonoCache::godotsharp_property_def_val_pair &def_val_pair = p_def_vals[i]; - - StringName name = *reinterpret_cast<const StringName *>(&def_val_pair.name); - Variant value = *reinterpret_cast<const Variant *>(&def_val_pair.value); - - p_script->exported_members_defval_cache[name] = value; - } - }); + GDMonoCache::managed_callbacks.ScriptManagerBridge_GetPropertyDefaultValues(this, &_add_property_default_values_callback); #endif } } diff --git a/modules/mono/csharp_script.h b/modules/mono/csharp_script.h index f2844a051d..e5e53acb07 100644 --- a/modules/mono/csharp_script.h +++ b/modules/mono/csharp_script.h @@ -48,20 +48,10 @@ class CSharpScript; class CSharpInstance; class CSharpLanguage; -#ifdef NO_SAFE_CAST -template <typename TScriptInstance, typename TScriptLanguage> -TScriptInstance *cast_script_instance(ScriptInstance *p_inst) { - if (!p_inst) { - return nullptr; - } - return p_inst->get_language() == TScriptLanguage::get_singleton() ? static_cast<TScriptInstance *>(p_inst) : nullptr; -} -#else template <typename TScriptInstance, typename TScriptLanguage> TScriptInstance *cast_script_instance(ScriptInstance *p_inst) { return dynamic_cast<TScriptInstance *>(p_inst); } -#endif #define CAST_CSHARP_INSTANCE(m_inst) (cast_script_instance<CSharpInstance, CSharpLanguage>(m_inst)) @@ -133,6 +123,10 @@ class CSharpScript : public Script { void _clear(); + static void GD_CLR_STDCALL _add_property_info_list_callback(CSharpScript *p_script, const String *p_current_class_name, void *p_props, int32_t p_count); +#ifdef TOOLS_ENABLED + static void GD_CLR_STDCALL _add_property_default_values_callback(CSharpScript *p_script, void *p_def_vals, int32_t p_count); +#endif bool _update_exports(PlaceHolderScriptInstance *p_instance_to_update = nullptr); CSharpInstance *_create_instance(const Variant **p_args, int p_argcount, Object *p_owner, bool p_is_ref_counted, Callable::CallError &r_error); diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Sdk/Sdk.targets b/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Sdk/Sdk.targets index bff9760b32..859ea52c93 100644 --- a/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Sdk/Sdk.targets +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Sdk/Sdk.targets @@ -17,7 +17,7 @@ <!-- C# source generators --> <ItemGroup Condition=" '$(DisableImplicitGodotGeneratorReferences)' != 'true' "> - <PackageReference Include="Godot.SourceGenerators" Version="$(PackageFloatingVersion_Godot)" /> + <PackageReference Include="Godot.SourceGenerators" Version="$(PackageVersion_Godot_SourceGenerators)" /> </ItemGroup> <!-- Godot API references --> diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/EventHandlerSuffixSuppressor.cs b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/EventHandlerSuffixSuppressor.cs new file mode 100644 index 0000000000..ddde730fa2 --- /dev/null +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/EventHandlerSuffixSuppressor.cs @@ -0,0 +1,53 @@ +using System.Collections.Immutable; +using System.Linq; +using System.Threading; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Diagnostics; + +namespace Godot.SourceGenerators +{ + [DiagnosticAnalyzer(LanguageNames.CSharp)] + public class EventHandlerSuffixSuppressor : DiagnosticSuppressor + { + private static readonly SuppressionDescriptor _descriptor = new( + id: "GDSP0001", + suppressedDiagnosticId: "CA1711", + justification: "Signal delegates are used in events so the naming follows the guidelines."); + + public override ImmutableArray<SuppressionDescriptor> SupportedSuppressions => + ImmutableArray.Create(_descriptor); + + public override void ReportSuppressions(SuppressionAnalysisContext context) + { + foreach (var diagnostic in context.ReportedDiagnostics) + { + AnalyzeDiagnostic(context, diagnostic, context.CancellationToken); + } + } + + private static void AnalyzeDiagnostic(SuppressionAnalysisContext context, Diagnostic diagnostic, CancellationToken cancellationToken = default) + { + var location = diagnostic.Location; + var root = location.SourceTree?.GetRoot(cancellationToken); + var dds = root? + .FindNode(location.SourceSpan) + .DescendantNodesAndSelf() + .OfType<DelegateDeclarationSyntax>() + .FirstOrDefault(); + + if (dds == null) + return; + + var semanticModel = context.GetSemanticModel(dds.SyntaxTree); + var delegateSymbol = semanticModel.GetDeclaredSymbol(dds, cancellationToken); + if (delegateSymbol == null) + return; + + if (delegateSymbol.GetAttributes().Any(a => a.AttributeClass?.IsGodotSignalAttribute() ?? false)) + { + context.ReportSuppression(Suppression.Create(_descriptor, diagnostic)); + } + } + } +} diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ExtensionMethods.cs b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ExtensionMethods.cs index de3b6c862a..8de12de23b 100644 --- a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ExtensionMethods.cs +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ExtensionMethods.cs @@ -29,7 +29,7 @@ namespace Godot.SourceGenerators { while (symbol != null) { - if (symbol.ContainingAssembly.Name == assemblyName && + if (symbol.ContainingAssembly?.Name == assemblyName && symbol.ToString() == typeFullName) { return true; @@ -47,7 +47,7 @@ namespace Godot.SourceGenerators while (symbol != null) { - if (symbol.ContainingAssembly.Name == "GodotSharp") + if (symbol.ContainingAssembly?.Name == "GodotSharp") return symbol; symbol = symbol.BaseType; diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/MarshalUtils.cs b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/MarshalUtils.cs index efdd50098e..bd40675fd3 100644 --- a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/MarshalUtils.cs +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/MarshalUtils.cs @@ -124,8 +124,8 @@ namespace Godot.SourceGenerators if (typeKind == TypeKind.Struct) { - if (type.ContainingAssembly.Name == "GodotSharp" && - type.ContainingNamespace.Name == "Godot") + if (type.ContainingAssembly?.Name == "GodotSharp" && + type.ContainingNamespace?.Name == "Godot") { return type switch { @@ -156,6 +156,10 @@ namespace Godot.SourceGenerators else if (typeKind == TypeKind.Array) { var arrayType = (IArrayTypeSymbol)type; + + if (arrayType.Rank != 1) + return null; + var elementType = arrayType.ElementType; switch (elementType.SpecialType) @@ -177,8 +181,8 @@ namespace Godot.SourceGenerators if (elementType.SimpleDerivesFrom(typeCache.GodotObjectType)) return MarshalType.GodotObjectOrDerivedArray; - if (elementType.ContainingAssembly.Name == "GodotSharp" && - elementType.ContainingNamespace.Name == "Godot") + if (elementType.ContainingAssembly?.Name == "GodotSharp" && + elementType.ContainingNamespace?.Name == "Godot") { switch (elementType) { @@ -204,9 +208,9 @@ namespace Godot.SourceGenerators if (type.SimpleDerivesFrom(typeCache.GodotObjectType)) return MarshalType.GodotObjectOrDerived; - if (type.ContainingAssembly.Name == "GodotSharp") + if (type.ContainingAssembly?.Name == "GodotSharp") { - switch (type.ContainingNamespace.Name) + switch (type.ContainingNamespace?.Name) { case "Godot": return type switch @@ -216,7 +220,7 @@ namespace Godot.SourceGenerators _ => null }; case "Collections" - when type.ContainingNamespace.FullQualifiedName() == "Godot.Collections": + when type.ContainingNamespace?.FullQualifiedName() == "Godot.Collections": return type switch { { Name: "Dictionary" } => diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ScriptSignalsGenerator.cs b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ScriptSignalsGenerator.cs index 1df41a905b..ea7cc3fe38 100644 --- a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ScriptSignalsGenerator.cs +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ScriptSignalsGenerator.cs @@ -7,7 +7,7 @@ using Microsoft.CodeAnalysis.Text; // TODO: // Determine a proper way to emit the signal. -// 'Emit(nameof(TheEvent))' creates a StringName everytime and has the overhead of string marshaling. +// 'Emit(nameof(TheEvent))' creates a StringName every time and has the overhead of string marshaling. // I haven't decided on the best option yet. Some possibilities: // - Expose the generated StringName fields to the user, for use with 'Emit(...)'. // - Generate a 'EmitSignalName' method for each event signal. @@ -235,6 +235,8 @@ namespace Godot.SourceGenerators .Append(signalName) .Append(";\n"); + source.Append($" /// <inheritdoc cref=\"{signalDelegate.DelegateSymbol.FullQualifiedName()}\"/>\n"); + source.Append(" public event ") .Append(signalDelegate.DelegateSymbol.FullQualifiedName()) .Append(" ") diff --git a/modules/mono/editor/GodotTools/GodotTools.Shared/GenerateGodotNupkgsVersions.targets b/modules/mono/editor/GodotTools/GodotTools.Shared/GenerateGodotNupkgsVersions.targets index 4baae77b34..37bd4a0be0 100644 --- a/modules/mono/editor/GodotTools/GodotTools.Shared/GenerateGodotNupkgsVersions.targets +++ b/modules/mono/editor/GodotTools/GodotTools.Shared/GenerateGodotNupkgsVersions.targets @@ -21,10 +21,13 @@ Outputs="$(GeneratedGodotNupkgsVersionsFile)"> <PropertyGroup> <GenerateGodotNupkgsVersionsCode><![CDATA[ -namespace $(RootNamespace) { - public class GeneratedGodotNupkgsVersions { +namespace $(RootNamespace) +{ + public class GeneratedGodotNupkgsVersions + { public const string GodotNETSdk = "$(PackageVersion_Godot_NET_Sdk)"%3b public const string GodotSourceGenerators = "$(PackageVersion_Godot_SourceGenerators)"%3b + public const string GodotSharp = "$(PackageVersion_GodotSharp)"%3b } } ]]></GenerateGodotNupkgsVersionsCode> diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/BuildOutputView.cs b/modules/mono/editor/GodotTools/GodotTools/Build/BuildOutputView.cs index ad4fce8daa..4d40724a83 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Build/BuildOutputView.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Build/BuildOutputView.cs @@ -69,51 +69,41 @@ namespace GodotTools.Build private void LoadIssuesFromFile(string csvFile) { - using (var file = new Godot.File()) + using var file = FileAccess.Open(csvFile, FileAccess.ModeFlags.Read); + + if (file == null) + return; + + while (!file.EofReached()) { - try - { - Error openError = file.Open(csvFile, Godot.File.ModeFlags.Read); + string[] csvColumns = file.GetCsvLine(); - if (openError != Error.Ok) - return; + if (csvColumns.Length == 1 && string.IsNullOrEmpty(csvColumns[0])) + return; - while (!file.EofReached()) - { - string[] csvColumns = file.GetCsvLine(); - - if (csvColumns.Length == 1 && string.IsNullOrEmpty(csvColumns[0])) - return; - - if (csvColumns.Length != 7) - { - GD.PushError($"Expected 7 columns, got {csvColumns.Length}"); - continue; - } - - var issue = new BuildIssue - { - Warning = csvColumns[0] == "warning", - File = csvColumns[1], - Line = int.Parse(csvColumns[2]), - Column = int.Parse(csvColumns[3]), - Code = csvColumns[4], - Message = csvColumns[5], - ProjectFile = csvColumns[6] - }; - - if (issue.Warning) - WarningCount += 1; - else - ErrorCount += 1; - - _issues.Add(issue); - } - } - finally + if (csvColumns.Length != 7) { - file.Close(); // Disposing it is not enough. We need to call Close() + GD.PushError($"Expected 7 columns, got {csvColumns.Length}"); + continue; } + + var issue = new BuildIssue + { + Warning = csvColumns[0] == "warning", + File = csvColumns[1], + Line = int.Parse(csvColumns[2]), + Column = int.Parse(csvColumns[3]), + Code = csvColumns[4], + Message = csvColumns[5], + ProjectFile = csvColumns[6] + }; + + if (issue.Warning) + WarningCount += 1; + else + ErrorCount += 1; + + _issues.Add(issue); } } diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/DotNetFinder.cs b/modules/mono/editor/GodotTools/GodotTools/Build/DotNetFinder.cs index 7bce53308c..b437c7e742 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Build/DotNetFinder.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Build/DotNetFinder.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.IO; +using System.Runtime.InteropServices; using JetBrains.Annotations; using OS = GodotTools.Utils.OS; @@ -16,6 +17,23 @@ namespace GodotTools.Build // In the future, this method may do more than just search in PATH. We could look in // known locations or use Godot's linked nethost to search from the hostfxr location. + if (OS.IsMacOS) + { + if (RuntimeInformation.OSArchitecture == Architecture.X64) + { + string dotnet_x64 = "/usr/local/share/dotnet/x64/dotnet"; // Look for x64 version, when running under Rosetta 2. + if (File.Exists(dotnet_x64)) + { + return dotnet_x64; + } + } + string dotnet = "/usr/local/share/dotnet/dotnet"; // Look for native version. + if (File.Exists(dotnet)) + { + return dotnet; + } + } + return OS.PathWhich("dotnet"); } diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/MSBuildPanel.cs b/modules/mono/editor/GodotTools/GodotTools/Build/MSBuildPanel.cs index 4041026426..237ac85267 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Build/MSBuildPanel.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Build/MSBuildPanel.cs @@ -122,7 +122,7 @@ namespace GodotTools.Build { base._Ready(); - CustomMinimumSize = new Vector2(0, 228) * EditorScale; + CustomMinimumSize = new Vector2i(0, (int)(228 * EditorScale)); SizeFlagsVertical = (int)SizeFlags.ExpandFill; var toolBarHBox = new HBoxContainer { SizeFlagsHorizontal = (int)SizeFlags.ExpandFill }; diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/NuGetUtils.cs b/modules/mono/editor/GodotTools/GodotTools/Build/NuGetUtils.cs index d2e0e128b5..fe309b8102 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Build/NuGetUtils.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Build/NuGetUtils.cs @@ -22,71 +22,13 @@ namespace GodotTools.Build public static string GodotFallbackFolderPath => Path.Combine(GodotSharpDirs.MonoUserDir, "GodotNuGetFallbackFolder"); - private static void AddFallbackFolderToNuGetConfig(string nuGetConfigPath, string name, string path) - { - var xmlDoc = new XmlDocument(); - xmlDoc.Load(nuGetConfigPath); - - const string nuGetConfigRootName = "configuration"; - - var rootNode = xmlDoc.DocumentElement; - - if (rootNode == null) - { - // No root node, create it - rootNode = xmlDoc.CreateElement(nuGetConfigRootName); - xmlDoc.AppendChild(rootNode); - - // Since this can be considered pretty much a new NuGet.Config, add the default nuget.org source as well - XmlElement nugetOrgSourceEntry = xmlDoc.CreateElement("add"); - nugetOrgSourceEntry.Attributes.Append(xmlDoc.CreateAttribute("key")).Value = "nuget.org"; - nugetOrgSourceEntry.Attributes.Append(xmlDoc.CreateAttribute("value")).Value = - "https://api.nuget.org/v3/index.json"; - nugetOrgSourceEntry.Attributes.Append(xmlDoc.CreateAttribute("protocolVersion")).Value = "3"; - rootNode.AppendChild(xmlDoc.CreateElement("packageSources")).AppendChild(nugetOrgSourceEntry); - } - else - { - // Check that the root node is the expected one - if (rootNode.Name != nuGetConfigRootName) - throw new FormatException("Invalid root Xml node for NuGet.Config. " + - $"Expected '{nuGetConfigRootName}' got '{rootNode.Name}'."); - } - - var fallbackFoldersNode = rootNode["fallbackPackageFolders"] ?? - rootNode.AppendChild(xmlDoc.CreateElement("fallbackPackageFolders")); - - // Check if it already has our fallback package folder - for (var xmlNode = fallbackFoldersNode.FirstChild; xmlNode != null; xmlNode = xmlNode.NextSibling) - { - if (xmlNode.NodeType != XmlNodeType.Element) - continue; - - var xmlElement = (XmlElement)xmlNode; - if (xmlElement.Name == "add" && - xmlElement.Attributes["key"]?.Value == name && - xmlElement.Attributes["value"]?.Value == path) - { - return; - } - } - - XmlElement newEntry = xmlDoc.CreateElement("add"); - newEntry.Attributes.Append(xmlDoc.CreateAttribute("key")).Value = name; - newEntry.Attributes.Append(xmlDoc.CreateAttribute("value")).Value = path; - - fallbackFoldersNode.AppendChild(newEntry); - - xmlDoc.Save(nuGetConfigPath); - } - /// <summary> - /// Returns all the paths where the user NuGet.Config files can be found. + /// Returns all the paths where the Godot.Offline.Config files can be found. /// Does not determine whether the returned files exist or not. /// </summary> - private static string[] GetAllUserNuGetConfigFilePaths() + private static string[] GetAllGodotNuGetConfigFilePaths() { - // Where to find 'NuGet/NuGet.Config': + // Where to find 'NuGet/config/Godot.Offline.Config': // // - Mono/.NETFramework (standalone NuGet): // Uses Environment.SpecialFolder.ApplicationData @@ -98,10 +40,12 @@ namespace GodotTools.Build string applicationData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); + const string configFileName = "Godot.Offline.Config"; + if (Utils.OS.IsWindows) { // %APPDATA% for both - return new[] { Path.Combine(applicationData, "NuGet", "NuGet.Config") }; + return new[] { Path.Combine(applicationData, "NuGet", "config", configFileName) }; } var paths = new string[2]; @@ -111,20 +55,20 @@ namespace GodotTools.Build string dotnetCliHome = Environment.GetEnvironmentVariable("DOTNET_CLI_HOME"); if (!string.IsNullOrEmpty(dotnetCliHome)) { - paths[0] = Path.Combine(dotnetCliHome, ".nuget", "NuGet", "NuGet.Config"); + paths[0] = Path.Combine(dotnetCliHome, ".nuget", "NuGet", "config", configFileName); } else { string home = Environment.GetEnvironmentVariable("HOME"); if (string.IsNullOrEmpty(home)) throw new InvalidOperationException("Required environment variable 'HOME' is not set."); - paths[0] = Path.Combine(home, ".nuget", "NuGet", "NuGet.Config"); + paths[0] = Path.Combine(home, ".nuget", "NuGet", "config", configFileName); } // Mono/.NETFramework (standalone NuGet) // ApplicationData is $HOME/.config on Linux/macOS - paths[1] = Path.Combine(applicationData, "NuGet", "NuGet.Config"); + paths[1] = Path.Combine(applicationData, "NuGet", "config", configFileName); return paths; } @@ -141,28 +85,26 @@ namespace GodotTools.Build // The nuspec is not lower case inside the nupkg but must be made lower case when extracted. /// <summary> - /// Adds the specified fallback folder to the user NuGet.Config files, + /// Adds the specified fallback folder to the Godot.Offline.Config files, /// for both standalone NuGet (Mono/.NETFramework) and dotnet CLI NuGet. /// </summary> - public static void AddFallbackFolderToUserNuGetConfigs(string name, string path) + public static void AddFallbackFolderToGodotNuGetConfigs(string name, string path) { - foreach (string nuGetConfigPath in GetAllUserNuGetConfigFilePaths()) + // Make sure the fallback folder exists to avoid error: + // MSB4018: The "ResolvePackageAssets" task failed unexpectedly. + System.IO.Directory.CreateDirectory(path); + + foreach (string nuGetConfigPath in GetAllGodotNuGetConfigFilePaths()) { - if (!System.IO.File.Exists(nuGetConfigPath)) - { - // It doesn't exist, so we create a default one - const string defaultConfig = @"<?xml version=""1.0"" encoding=""utf-8""?> + string defaultConfig = @$"<?xml version=""1.0"" encoding=""utf-8""?> <configuration> - <packageSources> - <add key=""nuget.org"" value=""https://api.nuget.org/v3/index.json"" protocolVersion=""3"" /> - </packageSources> + <fallbackPackageFolders> + <add key=""{name}"" value=""{path}"" /> + </fallbackPackageFolders> </configuration> "; - System.IO.Directory.CreateDirectory(Path.GetDirectoryName(nuGetConfigPath)); - System.IO.File.WriteAllText(nuGetConfigPath, defaultConfig, Encoding.UTF8); // UTF-8 with BOM - } - - AddFallbackFolderToNuGetConfig(nuGetConfigPath, name, path); + System.IO.Directory.CreateDirectory(Path.GetDirectoryName(nuGetConfigPath)); + System.IO.File.WriteAllText(nuGetConfigPath, defaultConfig, Encoding.UTF8); // UTF-8 with BOM } } @@ -189,6 +131,7 @@ namespace GodotTools.Build string destDir = Path.Combine(fallbackFolder, packageIdLower, packageVersionLower); string nupkgDestPath = Path.Combine(destDir, $"{packageIdLower}.{packageVersionLower}.nupkg"); string nupkgSha512DestPath = Path.Combine(destDir, $"{packageIdLower}.{packageVersionLower}.nupkg.sha512"); + string nupkgMetadataDestPath = Path.Combine(destDir, ".nupkg.metadata"); if (File.Exists(nupkgDestPath) && File.Exists(nupkgSha512DestPath)) return; // Already added (for speed we don't check if every file is properly extracted) @@ -197,12 +140,18 @@ namespace GodotTools.Build // Generate .nupkg.sha512 file - using (var alg = SHA512.Create()) - { - alg.ComputeHash(File.ReadAllBytes(nupkgPath)); - string base64Hash = Convert.ToBase64String(alg.Hash); - File.WriteAllText(nupkgSha512DestPath, base64Hash); - } + byte[] hash = SHA512.HashData(File.ReadAllBytes(nupkgPath)); + string base64Hash = Convert.ToBase64String(hash); + File.WriteAllText(nupkgSha512DestPath, base64Hash); + + // Generate .nupkg.metadata file + // Spec: https://github.com/NuGet/Home/wiki/Nupkg-Metadata-File + + File.WriteAllText(nupkgMetadataDestPath, @$"{{ + ""version"": 2, + ""contentHash"": ""{base64Hash}"", + ""source"": null +}}"); // Extract nupkg ExtractNupkg(destDir, nupkgPath, packageId, packageVersion); @@ -251,7 +200,7 @@ namespace GodotTools.Build entryFullName.EndsWith(".nupkg.sha512", StringComparison.OrdinalIgnoreCase) || entryFullName.EndsWith(".nupkg.metadata", StringComparison.OrdinalIgnoreCase) || // Nuspec at root level. We already extracted it previously but in lower case. - entryFullName.IndexOf('/') == -1 && entryFullName.EndsWith(".nuspec")) + !entryFullName.Contains('/') && entryFullName.EndsWith(".nuspec")) { continue; } @@ -297,6 +246,8 @@ namespace GodotTools.Build { ("Godot.NET.Sdk", GeneratedGodotNupkgsVersions.GodotNETSdk), ("Godot.SourceGenerators", GeneratedGodotNupkgsVersions.GodotSourceGenerators), + ("GodotSharp", GeneratedGodotNupkgsVersions.GodotSharp), + ("GodotSharpEditor", GeneratedGodotNupkgsVersions.GodotSharp), }; } } diff --git a/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs b/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs index 1cfaea3ec9..89364d1c02 100644 --- a/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs +++ b/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs @@ -123,7 +123,7 @@ namespace GodotTools try { string fallbackFolder = NuGetUtils.GodotFallbackFolderPath; - NuGetUtils.AddFallbackFolderToUserNuGetConfigs(NuGetUtils.GodotFallbackFolderName, + NuGetUtils.AddFallbackFolderToGodotNuGetConfigs(NuGetUtils.GodotFallbackFolderName, fallbackFolder); NuGetUtils.AddBundledPackagesToFallbackFolder(fallbackFolder); } @@ -497,7 +497,7 @@ namespace GodotTools try { // At startup we make sure NuGet.Config files have our Godot NuGet fallback folder included - NuGetUtils.AddFallbackFolderToUserNuGetConfigs(NuGetUtils.GodotFallbackFolderName, + NuGetUtils.AddFallbackFolderToGodotNuGetConfigs(NuGetUtils.GodotFallbackFolderName, NuGetUtils.GodotFallbackFolderPath); } catch (Exception e) diff --git a/modules/mono/editor/bindings_generator.cpp b/modules/mono/editor/bindings_generator.cpp index c27bb959fe..95a44d3b7e 100644 --- a/modules/mono/editor/bindings_generator.cpp +++ b/modules/mono/editor/bindings_generator.cpp @@ -2229,6 +2229,35 @@ Error BindingsGenerator::_generate_cs_signal(const BindingsGenerator::TypeInterf // Generate signal { + p_output.append(MEMBER_BEGIN "/// <summary>\n"); + p_output.append(INDENT1 "/// "); + p_output.append("Represents the method that handles the "); + p_output.append("<see cref=\"" BINDINGS_NAMESPACE "." + p_itype.proxy_name + "." + p_isignal.proxy_name + "\"/>"); + p_output.append(" event of a "); + p_output.append("<see cref=\"" BINDINGS_NAMESPACE "." + p_itype.proxy_name + "\"/>"); + p_output.append(" class.\n"); + p_output.append(INDENT1 "/// </summary>"); + + if (p_isignal.is_deprecated) { + if (p_isignal.deprecation_message.is_empty()) { + WARN_PRINT("An empty deprecation message is discouraged. Signal: '" + p_isignal.proxy_name + "'."); + } + + p_output.append(MEMBER_BEGIN "[Obsolete(\""); + p_output.append(p_isignal.deprecation_message); + p_output.append("\")]"); + } + + String delegate_name = p_isignal.proxy_name; + delegate_name += "EventHandler"; // Delegate name is [SignalName]EventHandler + + // Generate delegate + p_output.append(MEMBER_BEGIN "public delegate void "); + p_output.append(delegate_name); + p_output.append("("); + p_output.append(arguments_sig); + p_output.append(");\n"); + if (p_isignal.method_doc && p_isignal.method_doc->description.size()) { String xml_summary = bbcode_to_xml(fix_doc_description(p_isignal.method_doc->description), &p_itype); Vector<String> summary_lines = xml_summary.length() ? xml_summary.split("\n") : Vector<String>(); @@ -2247,25 +2276,11 @@ Error BindingsGenerator::_generate_cs_signal(const BindingsGenerator::TypeInterf } if (p_isignal.is_deprecated) { - if (p_isignal.deprecation_message.is_empty()) { - WARN_PRINT("An empty deprecation message is discouraged. Signal: '" + p_isignal.proxy_name + "'."); - } - p_output.append(MEMBER_BEGIN "[Obsolete(\""); p_output.append(p_isignal.deprecation_message); p_output.append("\")]"); } - String delegate_name = p_isignal.proxy_name; - delegate_name += "EventHandler"; // Delegate name is [SignalName]EventHandler - - // Generate delegate - p_output.append(MEMBER_BEGIN "public delegate void "); - p_output.append(delegate_name); - p_output.append("("); - p_output.append(arguments_sig); - p_output.append(");\n"); - // TODO: // Could we assume the StringName instance of signal name will never be freed (it's stored in ClassDB) before the managed world is unloaded? // If so, we could store the pointer we get from `data_unique_pointer()` instead of allocating StringName here. diff --git a/modules/mono/editor/editor_internal_calls.cpp b/modules/mono/editor/editor_internal_calls.cpp index 6f42ad6916..91392c8f79 100644 --- a/modules/mono/editor/editor_internal_calls.cpp +++ b/modules/mono/editor/editor_internal_calls.cpp @@ -152,7 +152,7 @@ bool godot_icall_Internal_ScriptEditorEdit(Resource *p_resource, int32_t p_line, } void godot_icall_Internal_EditorNodeShowScriptScreen() { - EditorNode::get_singleton()->call("_editor_select", EditorNode::EDITOR_SCRIPT); + EditorNode::get_singleton()->editor_select(EditorNode::EDITOR_SCRIPT); } void godot_icall_Internal_EditorRunPlay() { diff --git a/modules/mono/editor/hostfxr_resolver.cpp b/modules/mono/editor/hostfxr_resolver.cpp index bdc8fac8b5..ea5978b2cd 100644 --- a/modules/mono/editor/hostfxr_resolver.cpp +++ b/modules/mono/editor/hostfxr_resolver.cpp @@ -82,7 +82,7 @@ namespace { String get_hostfxr_file_name() { #if defined(WINDOWS_ENABLED) || defined(UWP_ENABLED) return "hostfxr.dll"; -#elif defined(OSX_ENABLED) || defined(IOS_ENABLED) +#elif defined(MACOS_ENABLED) || defined(IOS_ENABLED) return "libhostfxr.dylib"; #else return "libhostfxr.so"; @@ -197,7 +197,7 @@ bool get_default_installation_dir(String &r_dotnet_root) { r_dotnet_root = path::join(program_files_dir, "dotnet"); return true; -#elif defined(TARGET_OSX) +#elif defined(MACOS_ENABLED) r_dotnet_root = "/usr/local/share/dotnet"; #if defined(__x86_64) || defined(__x86_64__) || defined(__amd64__) || defined(_M_X64) diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Basis.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Basis.cs index fbd59d649f..9c3bc51c44 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Basis.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Basis.cs @@ -4,6 +4,21 @@ using System.Runtime.InteropServices; namespace Godot { /// <summary> + /// Specifies which order Euler angle rotations should be in. + /// When composing, the order is the same as the letters. When decomposing, + /// the order is reversed (ex: YXZ decomposes Z first, then X, and Y last). + /// </summary> + public enum EulerOrder + { + XYZ, + XZY, + YXZ, + YZX, + ZXY, + ZYX + }; + + /// <summary> /// 3×3 matrix used for 3D rotation and scale. /// Almost always used as an orthogonal basis for a Transform. /// @@ -244,50 +259,258 @@ namespace Godot } /// <summary> - /// Returns the basis's rotation in the form of Euler angles - /// (in the YXZ convention: when *decomposing*, first Z, then X, and Y last). - /// The returned vector contains the rotation angles in - /// the format (X angle, Y angle, Z angle). + /// Returns the basis's rotation in the form of Euler angles. + /// The Euler order depends on the [param order] parameter, + /// by default it uses the YXZ convention: when decomposing, + /// first Z, then X, and Y last. The returned vector contains + /// the rotation angles in the format (X angle, Y angle, Z angle). /// /// Consider using the <see cref="GetRotationQuaternion"/> method instead, which /// returns a <see cref="Quaternion"/> quaternion instead of Euler angles. /// </summary> + /// <param name="order">The Euler order to use. By default, use YXZ order (most common).</param> /// <returns>A <see cref="Vector3"/> representing the basis rotation in Euler angles.</returns> - public Vector3 GetEuler() + public Vector3 GetEuler(EulerOrder order = EulerOrder.YXZ) { - Basis m = Orthonormalized(); - - Vector3 euler; - euler.z = 0.0f; - - real_t mzy = m.Row1[2]; - - if (mzy < 1.0f) + switch (order) { - if (mzy > -1.0f) + case EulerOrder.XYZ: { - euler.x = Mathf.Asin(-mzy); - euler.y = Mathf.Atan2(m.Row0[2], m.Row2[2]); - euler.z = Mathf.Atan2(m.Row1[0], m.Row1[1]); + // Euler angles in XYZ convention. + // See https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix + // + // rot = cy*cz -cy*sz sy + // cz*sx*sy+cx*sz cx*cz-sx*sy*sz -cy*sx + // -cx*cz*sy+sx*sz cz*sx+cx*sy*sz cx*cy + Vector3 euler; + real_t sy = Row0[2]; + if (sy < (1.0f - Mathf.Epsilon)) + { + if (sy > -(1.0f - Mathf.Epsilon)) + { + // is this a pure Y rotation? + if (Row1[0] == 0 && Row0[1] == 0 && Row1[2] == 0 && Row2[1] == 0 && Row1[1] == 1) + { + // return the simplest form (human friendlier in editor and scripts) + euler.x = 0; + euler.y = Mathf.Atan2(Row0[2], Row0[0]); + euler.z = 0; + } + else + { + euler.x = Mathf.Atan2(-Row1[2], Row2[2]); + euler.y = Mathf.Asin(sy); + euler.z = Mathf.Atan2(-Row0[1], Row0[0]); + } + } + else + { + euler.x = Mathf.Atan2(Row2[1], Row1[1]); + euler.y = -Mathf.Tau / 4.0f; + euler.z = 0.0f; + } + } + else + { + euler.x = Mathf.Atan2(Row2[1], Row1[1]); + euler.y = Mathf.Tau / 4.0f; + euler.z = 0.0f; + } + return euler; } - else + case EulerOrder.XZY: { - euler.x = Mathf.Pi * 0.5f; - euler.y = -Mathf.Atan2(-m.Row0[1], m.Row0[0]); + // Euler angles in XZY convention. + // See https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix + // + // rot = cz*cy -sz cz*sy + // sx*sy+cx*cy*sz cx*cz cx*sz*sy-cy*sx + // cy*sx*sz cz*sx cx*cy+sx*sz*sy + Vector3 euler; + real_t sz = Row0[1]; + if (sz < (1.0f - Mathf.Epsilon)) + { + if (sz > -(1.0f - Mathf.Epsilon)) + { + euler.x = Mathf.Atan2(Row2[1], Row1[1]); + euler.y = Mathf.Atan2(Row0[2], Row0[0]); + euler.z = Mathf.Asin(-sz); + } + else + { + // It's -1 + euler.x = -Mathf.Atan2(Row1[2], Row2[2]); + euler.y = 0.0f; + euler.z = Mathf.Tau / 4.0f; + } + } + else + { + // It's 1 + euler.x = -Mathf.Atan2(Row1[2], Row2[2]); + euler.y = 0.0f; + euler.z = -Mathf.Tau / 4.0f; + } + return euler; } - } - else - { - euler.x = -Mathf.Pi * 0.5f; - euler.y = -Mathf.Atan2(-m.Row0[1], m.Row0[0]); - } + case EulerOrder.YXZ: + { + // Euler angles in YXZ convention. + // See https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix + // + // rot = cy*cz+sy*sx*sz cz*sy*sx-cy*sz cx*sy + // cx*sz cx*cz -sx + // cy*sx*sz-cz*sy cy*cz*sx+sy*sz cy*cx + Vector3 euler; + real_t m12 = Row1[2]; + if (m12 < (1 - Mathf.Epsilon)) + { + if (m12 > -(1 - Mathf.Epsilon)) + { + // is this a pure X rotation? + if (Row1[0] == 0 && Row0[1] == 0 && Row0[2] == 0 && Row2[0] == 0 && Row0[0] == 1) + { + // return the simplest form (human friendlier in editor and scripts) + euler.x = Mathf.Atan2(-m12, Row1[1]); + euler.y = 0; + euler.z = 0; + } + else + { + euler.x = Mathf.Asin(-m12); + euler.y = Mathf.Atan2(Row0[2], Row2[2]); + euler.z = Mathf.Atan2(Row1[0], Row1[1]); + } + } + else + { // m12 == -1 + euler.x = Mathf.Tau / 4.0f; + euler.y = Mathf.Atan2(Row0[1], Row0[0]); + euler.z = 0; + } + } + else + { // m12 == 1 + euler.x = -Mathf.Tau / 4.0f; + euler.y = -Mathf.Atan2(Row0[1], Row0[0]); + euler.z = 0; + } - return euler; + return euler; + } + case EulerOrder.YZX: + { + // Euler angles in YZX convention. + // See https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix + // + // rot = cy*cz sy*sx-cy*cx*sz cx*sy+cy*sz*sx + // sz cz*cx -cz*sx + // -cz*sy cy*sx+cx*sy*sz cy*cx-sy*sz*sx + Vector3 euler; + real_t sz = Row1[0]; + if (sz < (1.0f - Mathf.Epsilon)) + { + if (sz > -(1.0f - Mathf.Epsilon)) + { + euler.x = Mathf.Atan2(-Row1[2], Row1[1]); + euler.y = Mathf.Atan2(-Row2[0], Row0[0]); + euler.z = Mathf.Asin(sz); + } + else + { + // It's -1 + euler.x = Mathf.Atan2(Row2[1], Row2[2]); + euler.y = 0.0f; + euler.z = -Mathf.Tau / 4.0f; + } + } + else + { + // It's 1 + euler.x = Mathf.Atan2(Row2[1], Row2[2]); + euler.y = 0.0f; + euler.z = Mathf.Tau / 4.0f; + } + return euler; + } + case EulerOrder.ZXY: + { + // Euler angles in ZXY convention. + // See https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix + // + // rot = cz*cy-sz*sx*sy -cx*sz cz*sy+cy*sz*sx + // cy*sz+cz*sx*sy cz*cx sz*sy-cz*cy*sx + // -cx*sy sx cx*cy + Vector3 euler; + real_t sx = Row2[1]; + if (sx < (1.0f - Mathf.Epsilon)) + { + if (sx > -(1.0f - Mathf.Epsilon)) + { + euler.x = Mathf.Asin(sx); + euler.y = Mathf.Atan2(-Row2[0], Row2[2]); + euler.z = Mathf.Atan2(-Row0[1], Row1[1]); + } + else + { + // It's -1 + euler.x = -Mathf.Tau / 4.0f; + euler.y = Mathf.Atan2(Row0[2], Row0[0]); + euler.z = 0; + } + } + else + { + // It's 1 + euler.x = Mathf.Tau / 4.0f; + euler.y = Mathf.Atan2(Row0[2], Row0[0]); + euler.z = 0; + } + return euler; + } + case EulerOrder.ZYX: + { + // Euler angles in ZYX convention. + // See https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix + // + // rot = cz*cy cz*sy*sx-cx*sz sz*sx+cz*cx*cy + // cy*sz cz*cx+sz*sy*sx cx*sz*sy-cz*sx + // -sy cy*sx cy*cx + Vector3 euler; + real_t sy = Row2[0]; + if (sy < (1.0f - Mathf.Epsilon)) + { + if (sy > -(1.0f - Mathf.Epsilon)) + { + euler.x = Mathf.Atan2(Row2[1], Row2[2]); + euler.y = Mathf.Asin(-sy); + euler.z = Mathf.Atan2(Row1[0], Row0[0]); + } + else + { + // It's -1 + euler.x = 0; + euler.y = Mathf.Tau / 4.0f; + euler.z = -Mathf.Atan2(Row0[1], Row1[1]); + } + } + else + { + // It's 1 + euler.x = 0; + euler.y = -Mathf.Tau / 4.0f; + euler.z = -Mathf.Atan2(Row0[1], Row1[1]); + } + return euler; + } + default: + throw new ArgumentOutOfRangeException(nameof(order)); + } } /// <summary> /// Returns the basis's rotation in the form of a quaternion. - /// See <see cref="GetEuler()"/> if you need Euler angles, but keep in + /// See <see cref="GetEuler"/> if you need Euler angles, but keep in /// mind that quaternions should generally be preferred to Euler angles. /// </summary> /// <returns>A <see cref="Quaternion"/> representing the basis's rotation.</returns> @@ -712,35 +935,6 @@ namespace Godot } /// <summary> - /// Constructs a pure rotation basis matrix from the given Euler angles - /// (in the YXZ convention: when *composing*, first Y, then X, and Z last), - /// given in the vector format as (X angle, Y angle, Z angle). - /// - /// Consider using the <see cref="Basis(Quaternion)"/> constructor instead, which - /// uses a <see cref="Quaternion"/> quaternion instead of Euler angles. - /// </summary> - /// <param name="eulerYXZ">The Euler angles to create the basis from.</param> - public Basis(Vector3 eulerYXZ) - { - real_t c; - real_t s; - - c = Mathf.Cos(eulerYXZ.x); - s = Mathf.Sin(eulerYXZ.x); - var xmat = new Basis(1, 0, 0, 0, c, -s, 0, s, c); - - c = Mathf.Cos(eulerYXZ.y); - s = Mathf.Sin(eulerYXZ.y); - var ymat = new Basis(c, 0, s, 0, 1, 0, -s, 0, c); - - c = Mathf.Cos(eulerYXZ.z); - s = Mathf.Sin(eulerYXZ.z); - var zmat = new Basis(c, -s, 0, s, c, 0, 0, 0, 1); - - this = ymat * xmat * zmat; - } - - /// <summary> /// Constructs a pure rotation basis matrix, rotated around the given <paramref name="axis"/> /// by <paramref name="angle"/> (in radians). The axis must be a normalized vector. /// </summary> @@ -800,6 +994,46 @@ namespace Godot } /// <summary> + /// Constructs a Basis matrix from Euler angles in the specified rotation order. By default, use YXZ order (most common). + /// </summary> + /// <param name="euler">The Euler angles to use.</param> + /// <param name="order">The order to compose the Euler angles.</param> + public static Basis FromEuler(Vector3 euler, EulerOrder order = EulerOrder.YXZ) + { + real_t c, s; + + c = Mathf.Cos(euler.x); + s = Mathf.Sin(euler.x); + Basis xmat = new Basis(new Vector3(1, 0, 0), new Vector3(0, c, s), new Vector3(0, -s, c)); + + c = Mathf.Cos(euler.y); + s = Mathf.Sin(euler.y); + Basis ymat = new Basis(new Vector3(c, 0, -s), new Vector3(0, 1, 0), new Vector3(s, 0, c)); + + c = Mathf.Cos(euler.z); + s = Mathf.Sin(euler.z); + Basis zmat = new Basis(new Vector3(c, s, 0), new Vector3(-s, c, 0), new Vector3(0, 0, 1)); + + switch (order) + { + case EulerOrder.XYZ: + return xmat * ymat * zmat; + case EulerOrder.XZY: + return xmat * zmat * ymat; + case EulerOrder.YXZ: + return ymat * xmat * zmat; + case EulerOrder.YZX: + return ymat * zmat * xmat; + case EulerOrder.ZXY: + return zmat * xmat * ymat; + case EulerOrder.ZYX: + return zmat * ymat * xmat; + default: + throw new ArgumentOutOfRangeException(nameof(order)); + } + } + + /// <summary> /// Constructs a pure scale basis matrix with no rotation or shearing. /// The scale values are set as the main diagonal of the matrix, /// and all of the other parts of the matrix are zero. diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Callable.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Callable.cs index 1b7f5158fd..bdedd2e87a 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Callable.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Callable.cs @@ -72,7 +72,7 @@ namespace Godot /// <param name="delegate">Delegate method that will be called.</param> public Callable(Delegate @delegate) { - _target = null; + _target = @delegate?.Target as Object; _method = null; _delegate = @delegate; } diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Color.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Color.cs index 3483a04c83..ee9e59f9fa 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Color.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Color.cs @@ -597,7 +597,7 @@ namespace Godot /// <exception name="ArgumentOutOfRangeException"> /// <paramref name="rgba"/> color code is invalid. /// </exception> - private static Color FromHTML(string rgba) + private static Color FromHTML(ReadOnlySpan<char> rgba) { Color c; if (rgba.Length == 0) @@ -611,7 +611,7 @@ namespace Godot if (rgba[0] == '#') { - rgba = rgba.Substring(1); + rgba = rgba.Slice(1); } // If enabled, use 1 hex digit per channel instead of 2. @@ -665,22 +665,22 @@ namespace Godot if (c.r < 0) { - throw new ArgumentOutOfRangeException("Invalid color code. Red part is not valid hexadecimal: " + rgba); + throw new ArgumentOutOfRangeException($"Invalid color code. Red part is not valid hexadecimal: {rgba}"); } if (c.g < 0) { - throw new ArgumentOutOfRangeException("Invalid color code. Green part is not valid hexadecimal: " + rgba); + throw new ArgumentOutOfRangeException($"Invalid color code. Green part is not valid hexadecimal: {rgba}"); } if (c.b < 0) { - throw new ArgumentOutOfRangeException("Invalid color code. Blue part is not valid hexadecimal: " + rgba); + throw new ArgumentOutOfRangeException($"Invalid color code. Blue part is not valid hexadecimal: {rgba}"); } if (c.a < 0) { - throw new ArgumentOutOfRangeException("Invalid color code. Alpha part is not valid hexadecimal: " + rgba); + throw new ArgumentOutOfRangeException($"Invalid color code. Alpha part is not valid hexadecimal: {rgba}"); } return c; } @@ -817,9 +817,9 @@ namespace Godot value = max; } - private static int ParseCol4(string str, int ofs) + private static int ParseCol4(ReadOnlySpan<char> str, int index) { - char character = str[ofs]; + char character = str[index]; if (character >= '0' && character <= '9') { @@ -836,9 +836,9 @@ namespace Godot return -1; } - private static int ParseCol8(string str, int ofs) + private static int ParseCol8(ReadOnlySpan<char> str, int index) { - return ParseCol4(str, ofs) * 16 + ParseCol4(str, ofs + 1); + return ParseCol4(str, index) * 16 + ParseCol4(str, index + 1); } private static string ToHex32(float val) @@ -847,16 +847,16 @@ namespace Godot return b.HexEncode(); } - internal static bool HtmlIsValid(string color) + internal static bool HtmlIsValid(ReadOnlySpan<char> color) { - if (string.IsNullOrEmpty(color)) + if (color.IsEmpty) { return false; } if (color[0] == '#') { - color = color.Substring(1); + color = color.Slice(1); } // Check if the amount of hex digits is valid. diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/NativeInterop/Marshaling.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/NativeInterop/Marshaling.cs index 140fc167ba..76b186cd15 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/NativeInterop/Marshaling.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/NativeInterop/Marshaling.cs @@ -721,8 +721,9 @@ namespace Godot.NativeInterop if (p_managed_callable.Delegate != null) { var gcHandle = CustomGCHandle.AllocStrong(p_managed_callable.Delegate); + IntPtr objectPtr = p_managed_callable.Target != null ? Object.GetPtr(p_managed_callable.Target) : IntPtr.Zero; NativeFuncs.godotsharp_callable_new_with_delegate( - GCHandle.ToIntPtr(gcHandle), out godot_callable callable); + GCHandle.ToIntPtr(gcHandle), objectPtr, out godot_callable callable); return callable; } else diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/NativeInterop/NativeFuncs.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/NativeInterop/NativeFuncs.cs index bd00611383..20ede9f0dd 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/NativeInterop/NativeFuncs.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/NativeInterop/NativeFuncs.cs @@ -141,7 +141,7 @@ namespace Godot.NativeInterop public static partial void godotsharp_packed_string_array_add(ref godot_packed_string_array r_dest, in godot_string p_element); - public static partial void godotsharp_callable_new_with_delegate(IntPtr p_delegate_handle, + public static partial void godotsharp_callable_new_with_delegate(IntPtr p_delegate_handle, IntPtr p_object, out godot_callable r_callable); internal static partial godot_bool godotsharp_callable_get_data_for_marshalling(in godot_callable p_callable, diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/StringExtensions.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/StringExtensions.cs index 44f951e314..d77baab24b 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/StringExtensions.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/StringExtensions.cs @@ -1245,12 +1245,12 @@ namespace Godot /// <summary> /// If the string is a path, this concatenates <paramref name="file"/> /// at the end of the string as a subpath. - /// E.g. <c>"this/is".PlusFile("path") == "this/is/path"</c>. + /// E.g. <c>"this/is".PathJoin("path") == "this/is/path"</c>. /// </summary> /// <param name="instance">The path that will be concatenated.</param> /// <param name="file">File name to concatenate with the path.</param> /// <returns>The concatenated path with the given file name.</returns> - public static string PlusFile(this string instance, string file) + public static string PathJoin(this string instance, string file) { if (instance.Length > 0 && instance[instance.Length - 1] == '/') return instance + file; diff --git a/modules/mono/glue/runtime_interop.cpp b/modules/mono/glue/runtime_interop.cpp index 276701cdaa..2717b945f6 100644 --- a/modules/mono/glue/runtime_interop.cpp +++ b/modules/mono/glue/runtime_interop.cpp @@ -447,9 +447,10 @@ void godotsharp_packed_string_array_add(PackedStringArray *r_dest, const String r_dest->append(*p_element); } -void godotsharp_callable_new_with_delegate(GCHandleIntPtr p_delegate_handle, Callable *r_callable) { +void godotsharp_callable_new_with_delegate(GCHandleIntPtr p_delegate_handle, const Object *p_object, Callable *r_callable) { // TODO: Use pooling for ManagedCallable instances. - CallableCustom *managed_callable = memnew(ManagedCallable(p_delegate_handle)); + ObjectID objid = p_object ? p_object->get_instance_id() : ObjectID(); + CallableCustom *managed_callable = memnew(ManagedCallable(p_delegate_handle, objid)); memnew_placement(r_callable, Callable(managed_callable)); } diff --git a/modules/mono/managed_callable.cpp b/modules/mono/managed_callable.cpp index 9305dc645a..0c2c533090 100644 --- a/modules/mono/managed_callable.cpp +++ b/modules/mono/managed_callable.cpp @@ -79,7 +79,9 @@ CallableCustom::CompareLessFunc ManagedCallable::get_compare_less_func() const { } ObjectID ManagedCallable::get_object() const { - // TODO: If the delegate target extends Godot.Object, use that instead! + if (object_id != ObjectID()) { + return object_id; + } return CSharpLanguage::get_singleton()->get_managed_callable_middleman()->get_instance_id(); } @@ -104,7 +106,7 @@ void ManagedCallable::release_delegate_handle() { // Why you do this clang-format... /* clang-format off */ -ManagedCallable::ManagedCallable(GCHandleIntPtr p_delegate_handle) : delegate_handle(p_delegate_handle) { +ManagedCallable::ManagedCallable(GCHandleIntPtr p_delegate_handle, ObjectID p_object_id) : delegate_handle(p_delegate_handle), object_id(p_object_id) { #ifdef GD_MONO_HOT_RELOAD { MutexLock lock(instances_mutex); diff --git a/modules/mono/managed_callable.h b/modules/mono/managed_callable.h index aa3344f4d5..26cd164fb6 100644 --- a/modules/mono/managed_callable.h +++ b/modules/mono/managed_callable.h @@ -40,6 +40,7 @@ class ManagedCallable : public CallableCustom { friend class CSharpLanguage; GCHandleIntPtr delegate_handle; + ObjectID object_id; #ifdef GD_MONO_HOT_RELOAD SelfList<ManagedCallable> self_instance = this; @@ -66,7 +67,7 @@ public: void release_delegate_handle(); - ManagedCallable(GCHandleIntPtr p_delegate_handle); + ManagedCallable(GCHandleIntPtr p_delegate_handle, ObjectID p_object_id); ~ManagedCallable(); }; diff --git a/modules/mono/mono_gd/gd_mono.h b/modules/mono/mono_gd/gd_mono.h index 43811a4325..21252a5dca 100644 --- a/modules/mono/mono_gd/gd_mono.h +++ b/modules/mono/mono_gd/gd_mono.h @@ -35,11 +35,13 @@ #include "../godotsharp_defs.h" +#ifndef GD_CLR_STDCALL #ifdef WIN32 #define GD_CLR_STDCALL __stdcall #else #define GD_CLR_STDCALL #endif +#endif namespace gdmono { @@ -56,8 +58,6 @@ struct PluginCallbacks { } // namespace gdmono -#undef GD_CLR_STDCALL - class GDMono { bool runtime_initialized; bool finalizing_scripts_domain; diff --git a/modules/mono/mono_gd/gd_mono_cache.h b/modules/mono/mono_gd/gd_mono_cache.h index ca3a6c95a7..13b599fe55 100644 --- a/modules/mono/mono_gd/gd_mono_cache.h +++ b/modules/mono/mono_gd/gd_mono_cache.h @@ -47,11 +47,13 @@ class CSharpScript; namespace GDMonoCache { +#ifndef GD_CLR_STDCALL #ifdef WIN32 #define GD_CLR_STDCALL __stdcall #else #define GD_CLR_STDCALL #endif +#endif struct godotsharp_property_info { godot_string_name name; // Not owned @@ -68,8 +70,8 @@ struct godotsharp_property_def_val_pair { }; struct ManagedCallbacks { - using Callback_ScriptManagerBridge_GetPropertyInfoList_Add = void(GD_CLR_STDCALL *)(CSharpScript *p_script, const String *, godotsharp_property_info *p_props, int32_t p_count); - using Callback_ScriptManagerBridge_GetPropertyDefaultValues_Add = void(GD_CLR_STDCALL *)(CSharpScript *p_script, godotsharp_property_def_val_pair *p_def_vals, int32_t p_count); + using Callback_ScriptManagerBridge_GetPropertyInfoList_Add = void(GD_CLR_STDCALL *)(CSharpScript *p_script, const String *, void *p_props, int32_t p_count); + using Callback_ScriptManagerBridge_GetPropertyDefaultValues_Add = void(GD_CLR_STDCALL *)(CSharpScript *p_script, void *p_def_vals, int32_t p_count); using FuncSignalAwaiter_SignalCallback = void(GD_CLR_STDCALL *)(GCHandleIntPtr, const Variant **, int32_t, bool *); using FuncDelegateUtils_InvokeWithVariantArgs = void(GD_CLR_STDCALL *)(GCHandleIntPtr, const Variant **, uint32_t, const Variant *); @@ -145,6 +147,4 @@ void update_godot_api_cache(const ManagedCallbacks &p_managed_callbacks); } // namespace GDMonoCache -#undef GD_CLR_STDCALL - #endif // GD_MONO_CACHE_H diff --git a/modules/mono/utils/macos_utils.h b/modules/mono/utils/macos_utils.h index ca4957f5a7..0b74114685 100644 --- a/modules/mono/utils/macos_utils.h +++ b/modules/mono/utils/macos_utils.h @@ -28,13 +28,13 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "core/string/ustring.h" - #ifndef MONO_MACOS_UTILS_H #define MONO_MACOS_UTILS_H #ifdef MACOS_ENABLED +#include "core/string/ustring.h" + bool macos_is_app_bundle_installed(const String &p_bundle_id); #endif diff --git a/modules/multiplayer/SCsub b/modules/multiplayer/SCsub index ff33655537..e89038c3e0 100644 --- a/modules/multiplayer/SCsub +++ b/modules/multiplayer/SCsub @@ -8,7 +8,7 @@ env_mp = env_modules.Clone() module_obj = [] env_mp.add_source_files(module_obj, "*.cpp") -if env["tools"]: +if env.editor_build: env_mp.add_source_files(module_obj, "editor/*.cpp") env.modules_sources += module_obj diff --git a/modules/multiplayer/doc_classes/MultiplayerSynchronizer.xml b/modules/multiplayer/doc_classes/MultiplayerSynchronizer.xml index 9a4d755d64..42c190f504 100644 --- a/modules/multiplayer/doc_classes/MultiplayerSynchronizer.xml +++ b/modules/multiplayer/doc_classes/MultiplayerSynchronizer.xml @@ -5,7 +5,7 @@ </brief_description> <description> By default, [MultiplayerSynchronizer] synchronizes configured properties to all peers. - Visiblity can be handled directly with [method set_visibility_for] or as-needed with [method add_visibility_filter] and [method update_visibility]. + Visibility can be handled directly with [method set_visibility_for] or as-needed with [method add_visibility_filter] and [method update_visibility]. [MultiplayerSpawner]s will handle nodes according to visibility of synchronizers as long as the node at [member root_path] was spawned by one. @@ -34,7 +34,7 @@ <return type="void" /> <param index="0" name="filter" type="Callable" /> <description> - Removes a peer visiblity filter from this synchronizer. + Removes a peer visibility filter from this synchronizer. </description> </method> <method name="set_visibility_for"> diff --git a/modules/multiplayer/multiplayer_spawner.cpp b/modules/multiplayer/multiplayer_spawner.cpp index 6f60318b3b..620e4f2f6c 100644 --- a/modules/multiplayer/multiplayer_spawner.cpp +++ b/modules/multiplayer/multiplayer_spawner.cpp @@ -86,23 +86,41 @@ void MultiplayerSpawner::_get_property_list(List<PropertyInfo> *p_list) const { } } #endif + +PackedStringArray MultiplayerSpawner::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); + + if (spawn_path.is_empty() || !has_node(spawn_path)) { + warnings.push_back(RTR("A valid NodePath must be set in the \"Spawn Path\" property in order for MultiplayerSpawner to be able to spawn Nodes.")); + } + bool has_scenes = get_spawnable_scene_count() > 0; + // Can't check if method is overridden in placeholder scripts. + bool has_placeholder_script = get_script_instance() && get_script_instance()->is_placeholder(); + if (!has_scenes && !GDVIRTUAL_IS_OVERRIDDEN(_spawn_custom) && !has_placeholder_script) { + warnings.push_back(RTR("A list of PackedScenes must be set in the \"Auto Spawn List\" property in order for MultiplayerSpawner to automatically spawn them remotely when added as child of \"spawn_path\".")); + warnings.push_back(RTR("Alternatively, a Script implementing the function \"_spawn_custom\" must be set for this MultiplayerSpawner, and \"spawn\" must be called explicitly in code.")); + } + return warnings; +} + void MultiplayerSpawner::add_spawnable_scene(const String &p_path) { SpawnableScene sc; sc.path = p_path; if (Engine::get_singleton()->is_editor_hint()) { ERR_FAIL_COND(!FileAccess::exists(p_path)); - } else { - sc.cache = ResourceLoader::load(p_path); - ERR_FAIL_COND_MSG(sc.cache.is_null(), "Invalid spawnable scene: " + p_path); } spawnable_scenes.push_back(sc); } + int MultiplayerSpawner::get_spawnable_scene_count() const { return spawnable_scenes.size(); } + String MultiplayerSpawner::get_spawnable_scene(int p_idx) const { + ERR_FAIL_INDEX_V(p_idx, (int)spawnable_scenes.size(), ""); return spawnable_scenes[p_idx].path; } + void MultiplayerSpawner::clear_spawnable_scenes() { spawnable_scenes.clear(); } @@ -270,9 +288,12 @@ const Variant MultiplayerSpawner::get_spawn_argument(const ObjectID &p_id) const Node *MultiplayerSpawner::instantiate_scene(int p_id) { ERR_FAIL_COND_V_MSG(spawn_limit && spawn_limit <= tracked_nodes.size(), nullptr, "Spawn limit reached!"); ERR_FAIL_UNSIGNED_INDEX_V((uint32_t)p_id, spawnable_scenes.size(), nullptr); - Ref<PackedScene> scene = spawnable_scenes[p_id].cache; - ERR_FAIL_COND_V(scene.is_null(), nullptr); - return scene->instantiate(); + SpawnableScene &sc = spawnable_scenes[p_id]; + if (sc.cache.is_null()) { + sc.cache = ResourceLoader::load(sc.path); + } + ERR_FAIL_COND_V_MSG(sc.cache.is_null(), nullptr, "Invalid spawnable scene: " + sc.path); + return sc.cache->instantiate(); } Node *MultiplayerSpawner::instantiate_custom(const Variant &p_data) { diff --git a/modules/multiplayer/multiplayer_spawner.h b/modules/multiplayer/multiplayer_spawner.h index fc3befc2d4..587c99efd1 100644 --- a/modules/multiplayer/multiplayer_spawner.h +++ b/modules/multiplayer/multiplayer_spawner.h @@ -91,6 +91,8 @@ protected: void _get_property_list(List<PropertyInfo> *p_list) const; #endif public: + PackedStringArray get_configuration_warnings() const override; + Node *get_spawn_node() const { return spawn_node.is_valid() ? Object::cast_to<Node>(ObjectDB::get_instance(spawn_node)) : nullptr; } diff --git a/modules/multiplayer/multiplayer_synchronizer.cpp b/modules/multiplayer/multiplayer_synchronizer.cpp index eee1495c14..9755f426d5 100644 --- a/modules/multiplayer/multiplayer_synchronizer.cpp +++ b/modules/multiplayer/multiplayer_synchronizer.cpp @@ -48,6 +48,8 @@ void MultiplayerSynchronizer::_stop() { return; } #endif + root_node_cache = ObjectID(); + reset(); Node *node = is_inside_tree() ? get_node_or_null(root_path) : nullptr; if (node) { get_multiplayer()->object_configuration_remove(node, this); @@ -60,8 +62,11 @@ void MultiplayerSynchronizer::_start() { return; } #endif + root_node_cache = ObjectID(); + reset(); Node *node = is_inside_tree() ? get_node_or_null(root_path) : nullptr; if (node) { + root_node_cache = node->get_instance_id(); get_multiplayer()->object_configuration_add(node, this); _update_process(); } @@ -94,6 +99,50 @@ void MultiplayerSynchronizer::_update_process() { } } +Node *MultiplayerSynchronizer::get_root_node() { + return root_node_cache.is_valid() ? Object::cast_to<Node>(ObjectDB::get_instance(root_node_cache)) : nullptr; +} + +void MultiplayerSynchronizer::reset() { + net_id = 0; + last_sync_msec = 0; + last_inbound_sync = 0; +} + +uint32_t MultiplayerSynchronizer::get_net_id() const { + return net_id; +} + +void MultiplayerSynchronizer::set_net_id(uint32_t p_net_id) { + net_id = p_net_id; +} + +bool MultiplayerSynchronizer::update_outbound_sync_time(uint64_t p_msec) { + if (p_msec >= last_sync_msec + interval_msec) { + last_sync_msec = p_msec; + return true; + } + return false; +} + +bool MultiplayerSynchronizer::update_inbound_sync_time(uint16_t p_network_time) { + if (p_network_time <= last_inbound_sync && last_inbound_sync - p_network_time < 32767) { + return false; + } + last_inbound_sync = p_network_time; + return true; +} + +PackedStringArray MultiplayerSynchronizer::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); + + if (root_path.is_empty() || !has_node(root_path)) { + warnings.push_back(RTR("A valid NodePath must be set in the \"Root Path\" property in order for MultiplayerSynchronizer to be able to synchronize properties.")); + } + + return warnings; +} + Error MultiplayerSynchronizer::get_state(const List<NodePath> &p_properties, Object *p_obj, Vector<Variant> &r_variant, Vector<const Variant *> &r_variant_ptrs) { ERR_FAIL_COND_V(!p_obj, ERR_INVALID_PARAMETER); r_variant.resize(p_properties.size()); @@ -253,10 +302,6 @@ double MultiplayerSynchronizer::get_replication_interval() const { return double(interval_msec) / 1000.0; } -uint64_t MultiplayerSynchronizer::get_replication_interval_msec() const { - return interval_msec; -} - void MultiplayerSynchronizer::set_replication_config(Ref<SceneReplicationConfig> p_config) { replication_config = p_config; } @@ -289,10 +334,11 @@ NodePath MultiplayerSynchronizer::get_root_path() const { void MultiplayerSynchronizer::set_multiplayer_authority(int p_peer_id, bool p_recursive) { Node *node = is_inside_tree() ? get_node_or_null(root_path) : nullptr; - if (!node) { + if (!node || get_multiplayer_authority() == p_peer_id) { Node::set_multiplayer_authority(p_peer_id, p_recursive); return; } + get_multiplayer()->object_configuration_remove(node, this); Node::set_multiplayer_authority(p_peer_id, p_recursive); get_multiplayer()->object_configuration_add(node, this); diff --git a/modules/multiplayer/multiplayer_synchronizer.h b/modules/multiplayer/multiplayer_synchronizer.h index e84d41db86..9a7ce717cd 100644 --- a/modules/multiplayer/multiplayer_synchronizer.h +++ b/modules/multiplayer/multiplayer_synchronizer.h @@ -53,6 +53,11 @@ private: HashSet<Callable> visibility_filters; HashSet<int> peer_visibility; + ObjectID root_node_cache; + uint64_t last_sync_msec = 0; + uint16_t last_inbound_sync = 0; + uint32_t net_id = 0; + static Object *_get_prop_target(Object *p_obj, const NodePath &p_prop); void _start(); void _stop(); @@ -66,9 +71,19 @@ public: static Error get_state(const List<NodePath> &p_properties, Object *p_obj, Vector<Variant> &r_variant, Vector<const Variant *> &r_variant_ptrs); static Error set_state(const List<NodePath> &p_properties, Object *p_obj, const Vector<Variant> &p_state); + void reset(); + Node *get_root_node(); + + uint32_t get_net_id() const; + void set_net_id(uint32_t p_net_id); + + bool update_outbound_sync_time(uint64_t p_msec); + bool update_inbound_sync_time(uint16_t p_network_time); + + PackedStringArray get_configuration_warnings() const override; + void set_replication_interval(double p_interval); double get_replication_interval() const; - uint64_t get_replication_interval_msec() const; void set_replication_config(Ref<SceneReplicationConfig> p_config); Ref<SceneReplicationConfig> get_replication_config(); diff --git a/modules/multiplayer/scene_replication_interface.cpp b/modules/multiplayer/scene_replication_interface.cpp index 6e3dbfab47..df9985916b 100644 --- a/modules/multiplayer/scene_replication_interface.cpp +++ b/modules/multiplayer/scene_replication_interface.cpp @@ -30,21 +30,47 @@ #include "scene_replication_interface.h" +#include "scene_multiplayer.h" + #include "core/io/marshalls.h" #include "scene/main/node.h" - -#include "multiplayer_spawner.h" -#include "multiplayer_synchronizer.h" -#include "scene_multiplayer.h" +#include "scene/scene_string_names.h" #define MAKE_ROOM(m_amount) \ if (packet_cache.size() < m_amount) \ packet_cache.resize(m_amount); -void SceneReplicationInterface::_free_remotes(int p_id) { - const HashMap<uint32_t, ObjectID> remotes = rep_state->peer_get_remotes(p_id); - for (const KeyValue<uint32_t, ObjectID> &E : remotes) { - Node *node = rep_state->get_node(E.value); +SceneReplicationInterface::TrackedNode &SceneReplicationInterface::_track(const ObjectID &p_id) { + if (!tracked_nodes.has(p_id)) { + tracked_nodes[p_id] = TrackedNode(p_id); + Node *node = get_id_as<Node>(p_id); + node->connect(SceneStringNames::get_singleton()->tree_exited, callable_mp(this, &SceneReplicationInterface::_untrack).bind(p_id), Node::CONNECT_ONE_SHOT); + } + return tracked_nodes[p_id]; +} + +void SceneReplicationInterface::_untrack(const ObjectID &p_id) { + if (!tracked_nodes.has(p_id)) { + return; + } + uint32_t net_id = tracked_nodes[p_id].net_id; + uint32_t peer = tracked_nodes[p_id].remote_peer; + tracked_nodes.erase(p_id); + // If it was spawned by a remote, remove it from the received nodes. + if (peer && peers_info.has(peer)) { + peers_info[peer].recv_nodes.erase(net_id); + } + // If we spawned or synced it, we need to remove it from any peer it was sent to. + if (net_id || peer == 0) { + for (KeyValue<int, PeerInfo> &E : peers_info) { + E.value.spawn_nodes.erase(p_id); + } + } +} + +void SceneReplicationInterface::_free_remotes(const PeerInfo &p_info) { + for (const KeyValue<uint32_t, ObjectID> &E : p_info.recv_nodes) { + Node *node = tracked_nodes.has(E.value) ? get_id_as<Node>(E.value) : nullptr; ERR_CONTINUE(!node); node->queue_delete(); } @@ -52,34 +78,48 @@ void SceneReplicationInterface::_free_remotes(int p_id) { void SceneReplicationInterface::on_peer_change(int p_id, bool p_connected) { if (p_connected) { - rep_state->on_peer_change(p_id, p_connected); - for (const ObjectID &oid : rep_state->get_spawned_nodes()) { + peers_info[p_id] = PeerInfo(); + for (const ObjectID &oid : spawned_nodes) { _update_spawn_visibility(p_id, oid); } - for (const ObjectID &oid : rep_state->get_synced_nodes()) { - MultiplayerSynchronizer *sync = rep_state->get_synchronizer(oid); - ERR_CONTINUE(!sync); // ERR_BUG - if (sync->is_multiplayer_authority()) { - _update_sync_visibility(p_id, oid); - } + for (const ObjectID &oid : sync_nodes) { + _update_sync_visibility(p_id, get_id_as<MultiplayerSynchronizer>(oid)); } } else { - _free_remotes(p_id); - rep_state->on_peer_change(p_id, p_connected); + ERR_FAIL_COND(!peers_info.has(p_id)); + _free_remotes(peers_info[p_id]); + peers_info.erase(p_id); } } void SceneReplicationInterface::on_reset() { - for (int pid : rep_state->get_peers()) { - _free_remotes(pid); + for (const KeyValue<int, PeerInfo> &E : peers_info) { + _free_remotes(E.value); + } + peers_info.clear(); + // Tracked nodes are cleared on deletion, here we only reset the ids so they can be later re-assigned. + for (KeyValue<ObjectID, TrackedNode> &E : tracked_nodes) { + TrackedNode &tobj = E.value; + tobj.net_id = 0; + tobj.remote_peer = 0; } - rep_state->reset(); + for (const ObjectID &oid : sync_nodes) { + MultiplayerSynchronizer *sync = get_id_as<MultiplayerSynchronizer>(oid); + ERR_CONTINUE(!sync); + sync->reset(); + } + last_net_id = 0; } void SceneReplicationInterface::on_network_process() { uint64_t msec = OS::get_singleton()->get_ticks_msec(); - for (int peer : rep_state->get_peers()) { - _send_sync(peer, msec); + for (KeyValue<int, PeerInfo> &E : peers_info) { + const HashSet<ObjectID> to_sync = E.value.sync_nodes; + if (to_sync.is_empty()) { + continue; // Nothing to sync + } + uint16_t sync_net_time = ++E.value.last_sent_sync; + _send_sync(E.key, to_sync, sync_net_time, msec); } } @@ -88,14 +128,19 @@ Error SceneReplicationInterface::on_spawn(Object *p_obj, Variant p_config) { ERR_FAIL_COND_V(!node || p_config.get_type() != Variant::OBJECT, ERR_INVALID_PARAMETER); MultiplayerSpawner *spawner = Object::cast_to<MultiplayerSpawner>(p_config.get_validated_object()); ERR_FAIL_COND_V(!spawner, ERR_INVALID_PARAMETER); - Error err = rep_state->config_add_spawn(node, spawner); - ERR_FAIL_COND_V(err != OK, err); + // Track node. const ObjectID oid = node->get_instance_id(); + TrackedNode &tobj = _track(oid); + ERR_FAIL_COND_V(tobj.spawner != ObjectID(), ERR_ALREADY_IN_USE); + tobj.spawner = spawner->get_instance_id(); + spawned_nodes.insert(oid); + if (multiplayer->has_multiplayer_peer() && spawner->is_multiplayer_authority()) { - rep_state->ensure_net_id(oid); + if (tobj.net_id == 0) { + tobj.net_id = ++last_net_id; + } _update_spawn_visibility(0, oid); } - ERR_FAIL_COND_V(err != OK, err); return OK; } @@ -109,14 +154,22 @@ Error SceneReplicationInterface::on_despawn(Object *p_obj, Variant p_config) { Error err = _make_despawn_packet(node, len); ERR_FAIL_COND_V(err != OK, ERR_BUG); const ObjectID oid = p_obj->get_instance_id(); - for (int pid : rep_state->get_peers()) { - if (!rep_state->is_peer_spawn(pid, oid)) { + for (const KeyValue<int, PeerInfo> &E : peers_info) { + if (!E.value.spawn_nodes.has(oid)) { continue; } - _send_raw(packet_cache.ptr(), len, pid, true); + _send_raw(packet_cache.ptr(), len, E.key, true); } // Also remove spawner tracking from the replication state. - return rep_state->config_del_spawn(node, spawner); + ERR_FAIL_COND_V(!tracked_nodes.has(oid), ERR_INVALID_PARAMETER); + TrackedNode &tobj = _track(oid); + ERR_FAIL_COND_V(tobj.spawner != spawner->get_instance_id(), ERR_INVALID_PARAMETER); + tobj.spawner = ObjectID(); + spawned_nodes.erase(oid); + for (KeyValue<int, PeerInfo> &E : peers_info) { + E.value.spawn_nodes.erase(oid); + } + return OK; } Error SceneReplicationInterface::on_replication_start(Object *p_obj, Variant p_config) { @@ -125,25 +178,40 @@ Error SceneReplicationInterface::on_replication_start(Object *p_obj, Variant p_c MultiplayerSynchronizer *sync = Object::cast_to<MultiplayerSynchronizer>(p_config.get_validated_object()); ERR_FAIL_COND_V(!sync, ERR_INVALID_PARAMETER); - // Add to synchronizer list and setup visibility. - rep_state->config_add_sync(node, sync); - const ObjectID oid = node->get_instance_id(); - sync->connect("visibility_changed", callable_mp(this, &SceneReplicationInterface::_visibility_changed).bind(oid)); - if (multiplayer->has_multiplayer_peer() && sync->is_multiplayer_authority()) { - _update_sync_visibility(0, oid); - } - - // Try to apply initial state if spawning (hack to apply if before ready). - if (pending_spawn == p_obj->get_instance_id()) { - pending_spawn = ObjectID(); // Make sure this only happens once. - const List<NodePath> props = sync->get_replication_config()->get_spawn_properties(); - Vector<Variant> vars; - vars.resize(props.size()); - int consumed; - Error err = MultiplayerAPI::decode_and_decompress_variants(vars, pending_buffer, pending_buffer_size, consumed); - ERR_FAIL_COND_V(err, err); - err = MultiplayerSynchronizer::set_state(props, node, vars); - ERR_FAIL_COND_V(err, err); + // Add to synchronizer list. + TrackedNode &tobj = _track(p_obj->get_instance_id()); + const ObjectID sid = sync->get_instance_id(); + tobj.synchronizers.insert(sid); + sync_nodes.insert(sid); + + // Update visibility. + sync->connect("visibility_changed", callable_mp(this, &SceneReplicationInterface::_visibility_changed).bind(sync->get_instance_id())); + _update_sync_visibility(0, sync); + + if (pending_spawn == p_obj->get_instance_id() && sync->get_multiplayer_authority() == pending_spawn_remote) { + // Try to apply synchronizer Net ID + ERR_FAIL_COND_V_MSG(pending_sync_net_ids.is_empty(), ERR_INVALID_DATA, vformat("The MultiplayerSynchronizer at path \"%s\" is unable to process the pending spawn since it has no network ID. This might happen when changing the multiplayer authority during the \"_ready\" callback. Make sure to only change the authority of multiplayer synchronizers during \"_enter_tree\" or the \"_spawn_custom\" callback of their multiplayer spawner.", sync->get_path())); + ERR_FAIL_COND_V(!peers_info.has(pending_spawn_remote), ERR_INVALID_DATA); + uint32_t net_id = pending_sync_net_ids[0]; + pending_sync_net_ids.pop_front(); + peers_info[pending_spawn_remote].recv_sync_ids[net_id] = sync->get_instance_id(); + + // Try to apply spawn state (before ready). + if (pending_buffer_size > 0) { + ERR_FAIL_COND_V(!node || sync->get_replication_config().is_null(), ERR_UNCONFIGURED); + int consumed = 0; + const List<NodePath> props = sync->get_replication_config()->get_spawn_properties(); + Vector<Variant> vars; + vars.resize(props.size()); + Error err = MultiplayerAPI::decode_and_decompress_variants(vars, pending_buffer, pending_buffer_size, consumed); + ERR_FAIL_COND_V(err, err); + if (consumed > 0) { + pending_buffer += consumed; + pending_buffer_size -= consumed; + err = MultiplayerSynchronizer::set_state(props, node, vars); + ERR_FAIL_COND_V(err, err); + } + } } return OK; } @@ -154,59 +222,98 @@ Error SceneReplicationInterface::on_replication_stop(Object *p_obj, Variant p_co MultiplayerSynchronizer *sync = Object::cast_to<MultiplayerSynchronizer>(p_config.get_validated_object()); ERR_FAIL_COND_V(!sync, ERR_INVALID_PARAMETER); sync->disconnect("visibility_changed", callable_mp(this, &SceneReplicationInterface::_visibility_changed)); - return rep_state->config_del_sync(node, sync); + // Untrack synchronizer. + const ObjectID oid = node->get_instance_id(); + const ObjectID sid = sync->get_instance_id(); + ERR_FAIL_COND_V(!tracked_nodes.has(oid), ERR_INVALID_PARAMETER); + TrackedNode &tobj = _track(oid); + tobj.synchronizers.erase(sid); + sync_nodes.erase(sid); + for (KeyValue<int, PeerInfo> &E : peers_info) { + E.value.sync_nodes.erase(sid); + if (sync->get_net_id()) { + E.value.recv_sync_ids.erase(sync->get_net_id()); + } + } + return OK; } -void SceneReplicationInterface::_visibility_changed(int p_peer, ObjectID p_oid) { - if (rep_state->is_spawned_node(p_oid)) { - _update_spawn_visibility(p_peer, p_oid); - } - if (rep_state->is_synced_node(p_oid)) { - _update_sync_visibility(p_peer, p_oid); +void SceneReplicationInterface::_visibility_changed(int p_peer, ObjectID p_sid) { + MultiplayerSynchronizer *sync = get_id_as<MultiplayerSynchronizer>(p_sid); + ERR_FAIL_COND(!sync); // Bug. + Node *node = sync->get_root_node(); + ERR_FAIL_COND(!node); // Bug. + const ObjectID oid = node->get_instance_id(); + if (spawned_nodes.has(oid)) { + _update_spawn_visibility(p_peer, oid); } + _update_sync_visibility(p_peer, sync); } -Error SceneReplicationInterface::_update_sync_visibility(int p_peer, const ObjectID &p_oid) { - MultiplayerSynchronizer *sync = rep_state->get_synchronizer(p_oid); - ERR_FAIL_COND_V(!sync || !sync->is_multiplayer_authority(), ERR_BUG); - bool is_visible = sync->is_visible_to(p_peer); +Error SceneReplicationInterface::_update_sync_visibility(int p_peer, MultiplayerSynchronizer *p_sync) { + ERR_FAIL_COND_V(!p_sync, ERR_BUG); + if (!multiplayer->has_multiplayer_peer() || !p_sync->is_multiplayer_authority()) { + return OK; + } + + const ObjectID &sid = p_sync->get_instance_id(); + bool is_visible = p_sync->is_visible_to(p_peer); if (p_peer == 0) { - for (int pid : rep_state->get_peers()) { + for (KeyValue<int, PeerInfo> &E : peers_info) { // Might be visible to this specific peer. - is_visible = is_visible || sync->is_visible_to(pid); - if (rep_state->is_peer_sync(pid, p_oid) == is_visible) { + is_visible = is_visible || p_sync->is_visible_to(E.key); + if (is_visible == E.value.sync_nodes.has(sid)) { continue; } if (is_visible) { - rep_state->peer_add_sync(pid, p_oid); + E.value.sync_nodes.insert(sid); } else { - rep_state->peer_del_sync(pid, p_oid); + E.value.sync_nodes.erase(sid); } } return OK; } else { - if (is_visible == rep_state->is_peer_sync(p_peer, p_oid)) { + ERR_FAIL_COND_V(!peers_info.has(p_peer), ERR_INVALID_PARAMETER); + if (is_visible == peers_info[p_peer].sync_nodes.has(sid)) { return OK; } if (is_visible) { - return rep_state->peer_add_sync(p_peer, p_oid); + peers_info[p_peer].sync_nodes.insert(sid); } else { - return rep_state->peer_del_sync(p_peer, p_oid); + peers_info[p_peer].sync_nodes.erase(sid); } + return OK; } } Error SceneReplicationInterface::_update_spawn_visibility(int p_peer, const ObjectID &p_oid) { - MultiplayerSpawner *spawner = rep_state->get_spawner(p_oid); - MultiplayerSynchronizer *sync = rep_state->get_synchronizer(p_oid); - Node *node = Object::cast_to<Node>(ObjectDB::get_instance(p_oid)); + const TrackedNode *tnode = tracked_nodes.getptr(p_oid); + ERR_FAIL_COND_V(!tnode, ERR_BUG); + MultiplayerSpawner *spawner = get_id_as<MultiplayerSpawner>(tnode->spawner); + Node *node = get_id_as<Node>(p_oid); ERR_FAIL_COND_V(!node || !spawner || !spawner->is_multiplayer_authority(), ERR_BUG); - bool is_visible = !sync || sync->is_visible_to(p_peer); + ERR_FAIL_COND_V(!tracked_nodes.has(p_oid), ERR_BUG); + const HashSet<ObjectID> synchronizers = tracked_nodes[p_oid].synchronizers; + bool is_visible = true; + for (const ObjectID &sid : synchronizers) { + MultiplayerSynchronizer *sync = get_id_as<MultiplayerSynchronizer>(sid); + ERR_CONTINUE(!sync); + if (!sync->is_multiplayer_authority()) { + continue; + } + // Spawn visibility is composed using OR when multiple synchronizers are present. + if (sync->is_visible_to(p_peer)) { + is_visible = true; + break; + } + is_visible = false; + } // Spawn (and despawn) when needed. HashSet<int> to_spawn; HashSet<int> to_despawn; if (p_peer) { - if (is_visible == rep_state->is_peer_spawn(p_peer, p_oid)) { + ERR_FAIL_COND_V(!peers_info.has(p_peer), ERR_INVALID_PARAMETER); + if (is_visible == peers_info[p_peer].spawn_nodes.has(p_oid)) { return OK; } if (is_visible) { @@ -216,33 +323,37 @@ Error SceneReplicationInterface::_update_spawn_visibility(int p_peer, const Obje } } else { // Check visibility for each peers. - for (int pid : rep_state->get_peers()) { - bool peer_visible = is_visible || sync->is_visible_to(pid); - if (peer_visible == rep_state->is_peer_spawn(pid, p_oid)) { - continue; - } - if (peer_visible) { - to_spawn.insert(pid); + for (const KeyValue<int, PeerInfo> &E : peers_info) { + if (is_visible) { + // This is fast, since the the object is visibile to everyone, we don't need to check each peer. + if (E.value.spawn_nodes.has(p_oid)) { + // Already spawned. + continue; + } + to_spawn.insert(E.key); } else { - to_despawn.insert(pid); + // Need to check visibility for each peer. + _update_spawn_visibility(E.key, p_oid); } } } if (to_spawn.size()) { int len = 0; - _make_spawn_packet(node, len); + _make_spawn_packet(node, spawner, len); for (int pid : to_spawn) { + ERR_CONTINUE(!peers_info.has(pid)); int path_id; multiplayer->get_path_cache()->send_object_cache(spawner, pid, path_id); _send_raw(packet_cache.ptr(), len, pid, true); - rep_state->peer_add_spawn(pid, p_oid); + peers_info[pid].spawn_nodes.insert(p_oid); } } if (to_despawn.size()) { int len = 0; _make_despawn_packet(node, len); for (int pid : to_despawn) { - rep_state->peer_del_spawn(pid, p_oid); + ERR_CONTINUE(!peers_info.has(pid)); + peers_info[pid].spawn_nodes.erase(p_oid); _send_raw(packet_cache.ptr(), len, pid, true); } } @@ -265,20 +376,20 @@ Error SceneReplicationInterface::_send_raw(const uint8_t *p_buffer, int p_size, return peer->put_packet(p_buffer, p_size); } -Error SceneReplicationInterface::_make_spawn_packet(Node *p_node, int &r_len) { - ERR_FAIL_COND_V(!multiplayer, ERR_BUG); +Error SceneReplicationInterface::_make_spawn_packet(Node *p_node, MultiplayerSpawner *p_spawner, int &r_len) { + ERR_FAIL_COND_V(!multiplayer || !p_node || !p_spawner, ERR_BUG); const ObjectID oid = p_node->get_instance_id(); - MultiplayerSpawner *spawner = rep_state->get_spawner(oid); - ERR_FAIL_COND_V(!spawner || !p_node, ERR_BUG); + const TrackedNode *tnode = tracked_nodes.getptr(oid); + ERR_FAIL_COND_V(!tnode, ERR_INVALID_PARAMETER); - uint32_t nid = rep_state->get_net_id(oid); + uint32_t nid = tnode->net_id; ERR_FAIL_COND_V(!nid, ERR_UNCONFIGURED); // Prepare custom arg and scene_id - uint8_t scene_id = spawner->find_spawnable_scene_index_from_object(oid); + uint8_t scene_id = p_spawner->find_spawnable_scene_index_from_object(oid); bool is_custom = scene_id == MultiplayerSpawner::INVALID_ID; - Variant spawn_arg = spawner->get_spawn_argument(oid); + Variant spawn_arg = p_spawner->get_spawn_argument(oid); int spawn_arg_size = 0; if (is_custom) { Error err = MultiplayerAPI::encode_and_compress_variant(spawn_arg, nullptr, spawn_arg_size, false); @@ -286,31 +397,51 @@ Error SceneReplicationInterface::_make_spawn_packet(Node *p_node, int &r_len) { } // Prepare spawn state. + List<NodePath> state_props; + List<uint32_t> sync_ids; + const HashSet<ObjectID> synchronizers = tnode->synchronizers; + for (const ObjectID &sid : synchronizers) { + MultiplayerSynchronizer *sync = get_id_as<MultiplayerSynchronizer>(sid); + if (!sync->is_multiplayer_authority()) { + continue; + } + ERR_CONTINUE(!sync); + ERR_FAIL_COND_V(sync->get_replication_config().is_null(), ERR_BUG); + for (const NodePath &prop : sync->get_replication_config()->get_spawn_properties()) { + state_props.push_back(prop); + } + // Ensure the synchronizer has an ID. + if (sync->get_net_id() == 0) { + sync->set_net_id(++last_net_id); + } + sync_ids.push_back(sync->get_net_id()); + } int state_size = 0; Vector<Variant> state_vars; Vector<const Variant *> state_varp; - MultiplayerSynchronizer *synchronizer = rep_state->get_synchronizer(oid); - if (synchronizer) { - ERR_FAIL_COND_V(synchronizer->get_replication_config().is_null(), ERR_BUG); - const List<NodePath> props = synchronizer->get_replication_config()->get_spawn_properties(); - Error err = MultiplayerSynchronizer::get_state(props, p_node, state_vars, state_varp); + if (state_props.size()) { + Error err = MultiplayerSynchronizer::get_state(state_props, p_node, state_vars, state_varp); ERR_FAIL_COND_V_MSG(err != OK, err, "Unable to retrieve spawn state."); err = MultiplayerAPI::encode_and_compress_variants(state_varp.ptrw(), state_varp.size(), nullptr, state_size); ERR_FAIL_COND_V_MSG(err != OK, err, "Unable to encode spawn state."); } // Encode scene ID, path ID, net ID, node name. - int path_id = multiplayer->get_path_cache()->make_object_cache(spawner); + int path_id = multiplayer->get_path_cache()->make_object_cache(p_spawner); CharString cname = p_node->get_name().operator String().utf8(); int nlen = encode_cstring(cname.get_data(), nullptr); - MAKE_ROOM(1 + 1 + 4 + 4 + 4 + nlen + (is_custom ? 4 + spawn_arg_size : 0) + state_size); + MAKE_ROOM(1 + 1 + 4 + 4 + 4 + 4 * sync_ids.size() + 4 + nlen + (is_custom ? 4 + spawn_arg_size : 0) + state_size); uint8_t *ptr = packet_cache.ptrw(); ptr[0] = (uint8_t)SceneMultiplayer::NETWORK_COMMAND_SPAWN; ptr[1] = scene_id; int ofs = 2; ofs += encode_uint32(path_id, &ptr[ofs]); ofs += encode_uint32(nid, &ptr[ofs]); + ofs += encode_uint32(sync_ids.size(), &ptr[ofs]); ofs += encode_uint32(nlen, &ptr[ofs]); + for (uint32_t snid : sync_ids) { + ofs += encode_uint32(snid, &ptr[ofs]); + } ofs += encode_cstring(cname.get_data(), &ptr[ofs]); // Write args if (is_custom) { @@ -331,18 +462,20 @@ Error SceneReplicationInterface::_make_spawn_packet(Node *p_node, int &r_len) { Error SceneReplicationInterface::_make_despawn_packet(Node *p_node, int &r_len) { const ObjectID oid = p_node->get_instance_id(); + const TrackedNode *tnode = tracked_nodes.getptr(oid); + ERR_FAIL_COND_V(!tnode, ERR_INVALID_PARAMETER); MAKE_ROOM(5); uint8_t *ptr = packet_cache.ptrw(); ptr[0] = (uint8_t)SceneMultiplayer::NETWORK_COMMAND_DESPAWN; int ofs = 1; - uint32_t nid = rep_state->get_net_id(oid); + uint32_t nid = tnode->net_id; ofs += encode_uint32(nid, &ptr[ofs]); r_len = ofs; return OK; } Error SceneReplicationInterface::on_spawn_receive(int p_from, const uint8_t *p_buffer, int p_buffer_len) { - ERR_FAIL_COND_V_MSG(p_buffer_len < 14, ERR_INVALID_DATA, "Invalid spawn packet received"); + ERR_FAIL_COND_V_MSG(p_buffer_len < 18, ERR_INVALID_DATA, "Invalid spawn packet received"); int ofs = 1; // The spawn/despawn command. uint8_t scene_id = p_buffer[ofs]; ofs += 1; @@ -354,9 +487,16 @@ Error SceneReplicationInterface::on_spawn_receive(int p_from, const uint8_t *p_b uint32_t net_id = decode_uint32(&p_buffer[ofs]); ofs += 4; + uint32_t sync_len = decode_uint32(&p_buffer[ofs]); + ofs += 4; uint32_t name_len = decode_uint32(&p_buffer[ofs]); ofs += 4; - ERR_FAIL_COND_V_MSG(name_len > uint32_t(p_buffer_len - ofs), ERR_INVALID_DATA, vformat("Invalid spawn packet size: %d, wants: %d", p_buffer_len, ofs + name_len)); + ERR_FAIL_COND_V_MSG(name_len + (sync_len * 4) > uint32_t(p_buffer_len - ofs), ERR_INVALID_DATA, vformat("Invalid spawn packet size: %d, wants: %d", p_buffer_len, ofs + name_len + (sync_len * 4))); + List<uint32_t> sync_ids; + for (uint32_t i = 0; i < sync_len; i++) { + sync_ids.push_back(decode_uint32(&p_buffer[ofs])); + ofs += 4; + } ERR_FAIL_COND_V_MSG(name_len < 1, ERR_INVALID_DATA, "Zero spawn name size."); // We need to make sure no trickery happens here, but we want to allow autogenerated ("@") node names. @@ -387,20 +527,35 @@ Error SceneReplicationInterface::on_spawn_receive(int p_from, const uint8_t *p_b } ERR_FAIL_COND_V(!node, ERR_UNAUTHORIZED); node->set_name(name); - rep_state->peer_add_remote(p_from, net_id, node, spawner); + + // Add and track remote + ERR_FAIL_COND_V(!peers_info.has(p_from), ERR_UNAVAILABLE); + ERR_FAIL_COND_V(peers_info[p_from].recv_nodes.has(net_id), ERR_ALREADY_IN_USE); + ObjectID oid = node->get_instance_id(); + TrackedNode &tobj = _track(oid); + tobj.spawner = spawner->get_instance_id(); + tobj.net_id = net_id; + tobj.remote_peer = p_from; + peers_info[p_from].recv_nodes[net_id] = oid; + // The initial state will be applied during the sync config (i.e. before _ready). - int state_len = p_buffer_len - ofs; - if (state_len) { - pending_spawn = node->get_instance_id(); - pending_buffer = &p_buffer[ofs]; - pending_buffer_size = state_len; - } + pending_spawn = node->get_instance_id(); + pending_spawn_remote = p_from; + pending_buffer_size = p_buffer_len - ofs; + pending_buffer = pending_buffer_size > 0 ? &p_buffer[ofs] : nullptr; + pending_sync_net_ids = sync_ids; + parent->add_child(node); spawner->emit_signal(SNAME("spawned"), node); pending_spawn = ObjectID(); + pending_spawn_remote = 0; pending_buffer = nullptr; pending_buffer_size = 0; + if (pending_sync_net_ids.size()) { + pending_sync_net_ids.clear(); + ERR_FAIL_V(ERR_INVALID_DATA); // Should have been consumed. + } return OK; } @@ -409,12 +564,18 @@ Error SceneReplicationInterface::on_despawn_receive(int p_from, const uint8_t *p int ofs = 1; // The spawn/despawn command. uint32_t net_id = decode_uint32(&p_buffer[ofs]); ofs += 4; - Node *node = nullptr; - Error err = rep_state->peer_del_remote(p_from, net_id, &node); - ERR_FAIL_COND_V(err != OK, err); + + // Untrack remote + ERR_FAIL_COND_V(!peers_info.has(p_from), ERR_UNAUTHORIZED); + PeerInfo &pinfo = peers_info[p_from]; + ERR_FAIL_COND_V(!pinfo.recv_nodes.has(net_id), ERR_UNAUTHORIZED); + Node *node = get_id_as<Node>(pinfo.recv_nodes[net_id]); ERR_FAIL_COND_V(!node, ERR_BUG); + pinfo.recv_nodes.erase(net_id); - MultiplayerSpawner *spawner = rep_state->get_spawner(node->get_instance_id()); + const ObjectID oid = node->get_instance_id(); + ERR_FAIL_COND_V(!tracked_nodes.has(oid), ERR_BUG); + MultiplayerSpawner *spawner = get_id_as<MultiplayerSpawner>(tracked_nodes[oid].spawner); ERR_FAIL_COND_V(!spawner, ERR_DOES_NOT_EXIST); ERR_FAIL_COND_V(p_from != spawner->get_multiplayer_authority(), ERR_UNAUTHORIZED); @@ -427,27 +588,24 @@ Error SceneReplicationInterface::on_despawn_receive(int p_from, const uint8_t *p return OK; } -void SceneReplicationInterface::_send_sync(int p_peer, uint64_t p_msec) { - const HashSet<ObjectID> &to_sync = rep_state->get_peer_sync_nodes(p_peer); - if (to_sync.is_empty()) { - return; - } +void SceneReplicationInterface::_send_sync(int p_peer, const HashSet<ObjectID> p_synchronizers, uint16_t p_sync_net_time, uint64_t p_msec) { MAKE_ROOM(sync_mtu); uint8_t *ptr = packet_cache.ptrw(); ptr[0] = SceneMultiplayer::NETWORK_COMMAND_SYNC; int ofs = 1; - ofs += encode_uint16(rep_state->peer_sync_next(p_peer), &ptr[1]); + ofs += encode_uint16(p_sync_net_time, &ptr[1]); // Can only send updates for already notified nodes. // This is a lazy implementation, we could optimize much more here with by grouping by replication config. - for (const ObjectID &oid : to_sync) { - if (!rep_state->update_sync_time(oid, p_msec)) { + for (const ObjectID &oid : p_synchronizers) { + MultiplayerSynchronizer *sync = get_id_as<MultiplayerSynchronizer>(oid); + ERR_CONTINUE(!sync || !sync->get_replication_config().is_valid() || !sync->is_multiplayer_authority()); + if (!sync->update_outbound_sync_time(p_msec)) { continue; // nothing to sync. } - MultiplayerSynchronizer *sync = rep_state->get_synchronizer(oid); - ERR_CONTINUE(!sync || !sync->get_replication_config().is_valid()); - Node *node = rep_state->get_node(oid); + + Node *node = sync->get_root_node(); ERR_CONTINUE(!node); - uint32_t net_id = rep_state->get_net_id(oid); + uint32_t net_id = sync->get_net_id(); if (net_id == 0 || (net_id & 0x80000000)) { int path_id = 0; bool verified = multiplayer->get_path_cache()->send_object_cache(sync, p_peer, path_id); @@ -455,7 +613,7 @@ void SceneReplicationInterface::_send_sync(int p_peer, uint64_t p_msec) { if (net_id == 0) { // First time path based ID. net_id = path_id | 0x80000000; - rep_state->set_net_id(oid, net_id | 0x80000000); + sync->set_net_id(net_id | 0x80000000); } if (!verified) { // The path based sync is not yet confirmed, skipping. @@ -478,7 +636,7 @@ void SceneReplicationInterface::_send_sync(int p_peer, uint64_t p_msec) { ofs = 3; } if (size) { - ofs += encode_uint32(rep_state->get_net_id(oid), &ptr[ofs]); + ofs += encode_uint32(sync->get_net_id(), &ptr[ofs]); ofs += encode_uint32(size, &ptr[ofs]); MultiplayerAPI::encode_and_compress_variants(varp.ptrw(), varp.size(), &ptr[ofs], size); ofs += size; @@ -494,33 +652,32 @@ Error SceneReplicationInterface::on_sync_receive(int p_from, const uint8_t *p_bu ERR_FAIL_COND_V_MSG(p_buffer_len < 11, ERR_INVALID_DATA, "Invalid sync packet received"); uint16_t time = decode_uint16(&p_buffer[1]); int ofs = 3; - rep_state->peer_sync_recv(p_from, time); while (ofs + 8 < p_buffer_len) { uint32_t net_id = decode_uint32(&p_buffer[ofs]); ofs += 4; uint32_t size = decode_uint32(&p_buffer[ofs]); ofs += 4; - Node *node = nullptr; + MultiplayerSynchronizer *sync = nullptr; if (net_id & 0x80000000) { - MultiplayerSynchronizer *sync = Object::cast_to<MultiplayerSynchronizer>(multiplayer->get_path_cache()->get_cached_object(p_from, net_id & 0x7FFFFFFF)); - ERR_FAIL_COND_V(!sync || sync->get_multiplayer_authority() != p_from, ERR_UNAUTHORIZED); - node = sync->get_node(sync->get_root_path()); - } else { - node = rep_state->peer_get_remote(p_from, net_id); + sync = Object::cast_to<MultiplayerSynchronizer>(multiplayer->get_path_cache()->get_cached_object(p_from, net_id & 0x7FFFFFFF)); + } else if (peers_info[p_from].recv_sync_ids.has(net_id)) { + const ObjectID &sid = peers_info[p_from].recv_sync_ids[net_id]; + sync = get_id_as<MultiplayerSynchronizer>(sid); } - if (!node) { + if (!sync) { // Not received yet. ofs += size; continue; } - const ObjectID oid = node->get_instance_id(); - if (!rep_state->update_last_node_sync(oid, time)) { + Node *node = sync->get_root_node(); + if (sync->get_multiplayer_authority() != p_from || !node) { + ERR_CONTINUE(true); + } + if (!sync->update_inbound_sync_time(time)) { // State is too old. ofs += size; continue; } - MultiplayerSynchronizer *sync = rep_state->get_synchronizer(oid); - ERR_FAIL_COND_V(!sync, ERR_BUG); ERR_FAIL_COND_V(size > uint32_t(p_buffer_len - ofs), ERR_BUG); const List<NodePath> props = sync->get_replication_config()->get_sync_properties(); Vector<Variant> vars; diff --git a/modules/multiplayer/scene_replication_interface.h b/modules/multiplayer/scene_replication_interface.h index 8981647429..ee454f604e 100644 --- a/modules/multiplayer/scene_replication_interface.h +++ b/modules/multiplayer/scene_replication_interface.h @@ -31,9 +31,10 @@ #ifndef SCENE_REPLICATION_INTERFACE_H #define SCENE_REPLICATION_INTERFACE_H -#include "scene/main/multiplayer_api.h" +#include "core/object/ref_counted.h" -#include "scene_replication_state.h" +#include "multiplayer_spawner.h" +#include "multiplayer_synchronizer.h" class SceneMultiplayer; @@ -41,25 +42,68 @@ class SceneReplicationInterface : public RefCounted { GDCLASS(SceneReplicationInterface, RefCounted); private: - void _send_sync(int p_peer, uint64_t p_msec); - Error _make_spawn_packet(Node *p_node, int &r_len); - Error _make_despawn_packet(Node *p_node, int &r_len); - Error _send_raw(const uint8_t *p_buffer, int p_size, int p_peer, bool p_reliable); + struct TrackedNode { + ObjectID id; + uint32_t net_id = 0; + uint32_t remote_peer = 0; + ObjectID spawner; + HashSet<ObjectID> synchronizers; - void _visibility_changed(int p_peer, ObjectID p_oid); - Error _update_sync_visibility(int p_peer, const ObjectID &p_oid); - Error _update_spawn_visibility(int p_peer, const ObjectID &p_oid); - void _free_remotes(int p_peer); + bool operator==(const ObjectID &p_other) { return id == p_other; } - Ref<SceneReplicationState> rep_state; - SceneMultiplayer *multiplayer = nullptr; - PackedByteArray packet_cache; - int sync_mtu = 1350; // Highly dependent on underlying protocol. + _FORCE_INLINE_ MultiplayerSpawner *get_spawner() const { return spawner.is_valid() ? Object::cast_to<MultiplayerSpawner>(ObjectDB::get_instance(spawner)) : nullptr; } + TrackedNode() {} + TrackedNode(const ObjectID &p_id) { id = p_id; } + TrackedNode(const ObjectID &p_id, uint32_t p_net_id) { + id = p_id; + net_id = p_net_id; + } + }; + + struct PeerInfo { + HashSet<ObjectID> sync_nodes; + HashSet<ObjectID> spawn_nodes; + HashMap<uint32_t, ObjectID> recv_sync_ids; + HashMap<uint32_t, ObjectID> recv_nodes; + uint16_t last_sent_sync = 0; + }; + + // Replication state. + HashMap<int, PeerInfo> peers_info; + uint32_t last_net_id = 0; + HashMap<ObjectID, TrackedNode> tracked_nodes; + HashSet<ObjectID> spawned_nodes; + HashSet<ObjectID> sync_nodes; - // An hack to apply the initial state before ready. + // Pending spawn informations. ObjectID pending_spawn; + int pending_spawn_remote = 0; const uint8_t *pending_buffer = nullptr; int pending_buffer_size = 0; + List<uint32_t> pending_sync_net_ids; + + // Replicator config. + SceneMultiplayer *multiplayer = nullptr; + PackedByteArray packet_cache; + int sync_mtu = 1350; // Highly dependent on underlying protocol. + + TrackedNode &_track(const ObjectID &p_id); + void _untrack(const ObjectID &p_id); + + void _send_sync(int p_peer, const HashSet<ObjectID> p_synchronizers, uint16_t p_sync_net_time, uint64_t p_msec); + Error _make_spawn_packet(Node *p_node, MultiplayerSpawner *p_spawner, int &r_len); + Error _make_despawn_packet(Node *p_node, int &r_len); + Error _send_raw(const uint8_t *p_buffer, int p_size, int p_peer, bool p_reliable); + + void _visibility_changed(int p_peer, ObjectID p_oid); + Error _update_sync_visibility(int p_peer, MultiplayerSynchronizer *p_sync); + Error _update_spawn_visibility(int p_peer, const ObjectID &p_oid); + void _free_remotes(const PeerInfo &p_info); + + template <class T> + static T *get_id_as(const ObjectID &p_id) { + return p_id.is_valid() ? Object::cast_to<T>(ObjectDB::get_instance(p_id)) : nullptr; + } public: static void make_default(); @@ -78,7 +122,6 @@ public: Error on_sync_receive(int p_from, const uint8_t *p_buffer, int p_buffer_len); SceneReplicationInterface(SceneMultiplayer *p_multiplayer) { - rep_state.instantiate(); multiplayer = p_multiplayer; } }; diff --git a/modules/multiplayer/scene_replication_state.cpp b/modules/multiplayer/scene_replication_state.cpp deleted file mode 100644 index fbcf0acadb..0000000000 --- a/modules/multiplayer/scene_replication_state.cpp +++ /dev/null @@ -1,267 +0,0 @@ -/*************************************************************************/ -/* scene_replication_state.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ -/* */ -/* 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 "scene_replication_state.h" - -#include "scene/scene_string_names.h" - -#include "multiplayer_spawner.h" -#include "multiplayer_synchronizer.h" - -SceneReplicationState::TrackedNode &SceneReplicationState::_track(const ObjectID &p_id) { - if (!tracked_nodes.has(p_id)) { - tracked_nodes[p_id] = TrackedNode(p_id); - Node *node = Object::cast_to<Node>(ObjectDB::get_instance(p_id)); - node->connect(SceneStringNames::get_singleton()->tree_exited, callable_mp(this, &SceneReplicationState::_untrack).bind(p_id), Node::CONNECT_ONE_SHOT); - } - return tracked_nodes[p_id]; -} - -void SceneReplicationState::_untrack(const ObjectID &p_id) { - if (tracked_nodes.has(p_id)) { - uint32_t net_id = tracked_nodes[p_id].net_id; - uint32_t peer = tracked_nodes[p_id].remote_peer; - tracked_nodes.erase(p_id); - // If it was spawned by a remote, remove it from the received nodes. - if (peer && peers_info.has(peer)) { - peers_info[peer].recv_nodes.erase(net_id); - } - // If we spawned or synced it, we need to remove it from any peer it was sent to. - if (net_id || peer == 0) { - for (KeyValue<int, PeerInfo> &E : peers_info) { - E.value.sync_nodes.erase(p_id); - E.value.spawn_nodes.erase(p_id); - } - } - } -} - -const HashMap<uint32_t, ObjectID> SceneReplicationState::peer_get_remotes(int p_peer) const { - return peers_info.has(p_peer) ? peers_info[p_peer].recv_nodes : HashMap<uint32_t, ObjectID>(); -} - -bool SceneReplicationState::update_last_node_sync(const ObjectID &p_id, uint16_t p_time) { - TrackedNode *tnode = tracked_nodes.getptr(p_id); - ERR_FAIL_COND_V(!tnode, false); - if (p_time <= tnode->last_sync && tnode->last_sync - p_time < 32767) { - return false; - } - tnode->last_sync = p_time; - return true; -} - -bool SceneReplicationState::update_sync_time(const ObjectID &p_id, uint64_t p_msec) { - TrackedNode *tnode = tracked_nodes.getptr(p_id); - ERR_FAIL_COND_V(!tnode, false); - MultiplayerSynchronizer *sync = get_synchronizer(p_id); - if (!sync) { - return false; - } - if (tnode->last_sync_msec == p_msec) { - return true; - } - if (p_msec >= tnode->last_sync_msec + sync->get_replication_interval_msec()) { - tnode->last_sync_msec = p_msec; - return true; - } - return false; -} - -uint32_t SceneReplicationState::get_net_id(const ObjectID &p_id) const { - const TrackedNode *tnode = tracked_nodes.getptr(p_id); - ERR_FAIL_COND_V(!tnode, 0); - return tnode->net_id; -} - -void SceneReplicationState::set_net_id(const ObjectID &p_id, uint32_t p_net_id) { - TrackedNode *tnode = tracked_nodes.getptr(p_id); - ERR_FAIL_COND(!tnode); - tnode->net_id = p_net_id; -} - -uint32_t SceneReplicationState::ensure_net_id(const ObjectID &p_id) { - TrackedNode *tnode = tracked_nodes.getptr(p_id); - ERR_FAIL_COND_V(!tnode, 0); - if (tnode->net_id == 0) { - tnode->net_id = ++last_net_id; - } - return tnode->net_id; -} - -void SceneReplicationState::on_peer_change(int p_peer, bool p_connected) { - if (p_connected) { - peers_info[p_peer] = PeerInfo(); - known_peers.insert(p_peer); - } else { - peers_info.erase(p_peer); - known_peers.erase(p_peer); - } -} - -void SceneReplicationState::reset() { - peers_info.clear(); - known_peers.clear(); - // Tracked nodes are cleared on deletion, here we only reset the ids so they can be later re-assigned. - for (KeyValue<ObjectID, TrackedNode> &E : tracked_nodes) { - TrackedNode &tobj = E.value; - tobj.net_id = 0; - tobj.remote_peer = 0; - tobj.last_sync = 0; - } -} - -Error SceneReplicationState::config_add_spawn(Node *p_node, MultiplayerSpawner *p_spawner) { - const ObjectID oid = p_node->get_instance_id(); - TrackedNode &tobj = _track(oid); - ERR_FAIL_COND_V(tobj.spawner != ObjectID(), ERR_ALREADY_IN_USE); - tobj.spawner = p_spawner->get_instance_id(); - spawned_nodes.insert(oid); - return OK; -} - -Error SceneReplicationState::config_del_spawn(Node *p_node, MultiplayerSpawner *p_spawner) { - const ObjectID oid = p_node->get_instance_id(); - ERR_FAIL_COND_V(!is_tracked(oid), ERR_INVALID_PARAMETER); - TrackedNode &tobj = _track(oid); - ERR_FAIL_COND_V(tobj.spawner != p_spawner->get_instance_id(), ERR_INVALID_PARAMETER); - tobj.spawner = ObjectID(); - spawned_nodes.erase(oid); - for (KeyValue<int, PeerInfo> &E : peers_info) { - E.value.spawn_nodes.erase(oid); - } - return OK; -} - -Error SceneReplicationState::config_add_sync(Node *p_node, MultiplayerSynchronizer *p_sync) { - const ObjectID oid = p_node->get_instance_id(); - TrackedNode &tobj = _track(oid); - ERR_FAIL_COND_V(tobj.synchronizer != ObjectID(), ERR_ALREADY_IN_USE); - tobj.synchronizer = p_sync->get_instance_id(); - synced_nodes.insert(oid); - return OK; -} - -Error SceneReplicationState::config_del_sync(Node *p_node, MultiplayerSynchronizer *p_sync) { - const ObjectID oid = p_node->get_instance_id(); - ERR_FAIL_COND_V(!is_tracked(oid), ERR_INVALID_PARAMETER); - TrackedNode &tobj = _track(oid); - ERR_FAIL_COND_V(tobj.synchronizer != p_sync->get_instance_id(), ERR_INVALID_PARAMETER); - tobj.synchronizer = ObjectID(); - synced_nodes.erase(oid); - for (KeyValue<int, PeerInfo> &E : peers_info) { - E.value.sync_nodes.erase(oid); - } - return OK; -} - -Error SceneReplicationState::peer_add_sync(int p_peer, const ObjectID &p_id) { - ERR_FAIL_COND_V(!peers_info.has(p_peer), ERR_INVALID_PARAMETER); - peers_info[p_peer].sync_nodes.insert(p_id); - return OK; -} - -Error SceneReplicationState::peer_del_sync(int p_peer, const ObjectID &p_id) { - ERR_FAIL_COND_V(!peers_info.has(p_peer), ERR_INVALID_PARAMETER); - peers_info[p_peer].sync_nodes.erase(p_id); - return OK; -} - -const HashSet<ObjectID> SceneReplicationState::get_peer_sync_nodes(int p_peer) { - ERR_FAIL_COND_V(!peers_info.has(p_peer), HashSet<ObjectID>()); - return peers_info[p_peer].sync_nodes; -} - -bool SceneReplicationState::is_peer_sync(int p_peer, const ObjectID &p_id) const { - ERR_FAIL_COND_V(!peers_info.has(p_peer), false); - return peers_info[p_peer].sync_nodes.has(p_id); -} - -Error SceneReplicationState::peer_add_spawn(int p_peer, const ObjectID &p_id) { - ERR_FAIL_COND_V(!peers_info.has(p_peer), ERR_INVALID_PARAMETER); - peers_info[p_peer].spawn_nodes.insert(p_id); - return OK; -} - -Error SceneReplicationState::peer_del_spawn(int p_peer, const ObjectID &p_id) { - ERR_FAIL_COND_V(!peers_info.has(p_peer), ERR_INVALID_PARAMETER); - peers_info[p_peer].spawn_nodes.erase(p_id); - return OK; -} - -const HashSet<ObjectID> SceneReplicationState::get_peer_spawn_nodes(int p_peer) { - ERR_FAIL_COND_V(!peers_info.has(p_peer), HashSet<ObjectID>()); - return peers_info[p_peer].spawn_nodes; -} - -bool SceneReplicationState::is_peer_spawn(int p_peer, const ObjectID &p_id) const { - ERR_FAIL_COND_V(!peers_info.has(p_peer), false); - return peers_info[p_peer].spawn_nodes.has(p_id); -} - -Node *SceneReplicationState::peer_get_remote(int p_peer, uint32_t p_net_id) { - PeerInfo *info = peers_info.getptr(p_peer); - return info && info->recv_nodes.has(p_net_id) ? Object::cast_to<Node>(ObjectDB::get_instance(info->recv_nodes[p_net_id])) : nullptr; -} - -Error SceneReplicationState::peer_add_remote(int p_peer, uint32_t p_net_id, Node *p_node, MultiplayerSpawner *p_spawner) { - ERR_FAIL_COND_V(!p_node || !p_spawner, ERR_INVALID_PARAMETER); - ERR_FAIL_COND_V(!peers_info.has(p_peer), ERR_UNAVAILABLE); - PeerInfo &pinfo = peers_info[p_peer]; - ObjectID oid = p_node->get_instance_id(); - TrackedNode &tobj = _track(oid); - tobj.spawner = p_spawner->get_instance_id(); - tobj.net_id = p_net_id; - tobj.remote_peer = p_peer; - tobj.last_sync = pinfo.last_recv_sync; - // Also track as a remote. - ERR_FAIL_COND_V(pinfo.recv_nodes.has(p_net_id), ERR_ALREADY_IN_USE); - pinfo.recv_nodes[p_net_id] = oid; - return OK; -} - -Error SceneReplicationState::peer_del_remote(int p_peer, uint32_t p_net_id, Node **r_node) { - ERR_FAIL_COND_V(!peers_info.has(p_peer), ERR_UNAUTHORIZED); - PeerInfo &info = peers_info[p_peer]; - ERR_FAIL_COND_V(!info.recv_nodes.has(p_net_id), ERR_UNAUTHORIZED); - *r_node = Object::cast_to<Node>(ObjectDB::get_instance(info.recv_nodes[p_net_id])); - info.recv_nodes.erase(p_net_id); - return OK; -} - -uint16_t SceneReplicationState::peer_sync_next(int p_peer) { - ERR_FAIL_COND_V(!peers_info.has(p_peer), 0); - PeerInfo &info = peers_info[p_peer]; - return ++info.last_sent_sync; -} - -void SceneReplicationState::peer_sync_recv(int p_peer, uint16_t p_time) { - ERR_FAIL_COND(!peers_info.has(p_peer)); - peers_info[p_peer].last_recv_sync = p_time; -} diff --git a/modules/multiplayer/scene_replication_state.h b/modules/multiplayer/scene_replication_state.h deleted file mode 100644 index bdff6ae3b7..0000000000 --- a/modules/multiplayer/scene_replication_state.h +++ /dev/null @@ -1,135 +0,0 @@ -/*************************************************************************/ -/* scene_replication_state.h */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ -/* */ -/* 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 SCENE_REPLICATION_STATE_H -#define SCENE_REPLICATION_STATE_H - -#include "core/object/ref_counted.h" - -#include "multiplayer_spawner.h" -#include "multiplayer_synchronizer.h" - -class MultiplayerSpawner; -class MultiplayerSynchronizer; -class Node; - -class SceneReplicationState : public RefCounted { -private: - struct TrackedNode { - ObjectID id; - uint32_t net_id = 0; - uint32_t remote_peer = 0; - ObjectID spawner; - ObjectID synchronizer; - uint16_t last_sync = 0; - uint64_t last_sync_msec = 0; - - bool operator==(const ObjectID &p_other) { return id == p_other; } - - Node *get_node() const { return id.is_valid() ? Object::cast_to<Node>(ObjectDB::get_instance(id)) : nullptr; } - MultiplayerSpawner *get_spawner() const { return spawner.is_valid() ? Object::cast_to<MultiplayerSpawner>(ObjectDB::get_instance(spawner)) : nullptr; } - MultiplayerSynchronizer *get_synchronizer() const { return synchronizer.is_valid() ? Object::cast_to<MultiplayerSynchronizer>(ObjectDB::get_instance(synchronizer)) : nullptr; } - TrackedNode() {} - TrackedNode(const ObjectID &p_id) { id = p_id; } - TrackedNode(const ObjectID &p_id, uint32_t p_net_id) { - id = p_id; - net_id = p_net_id; - } - }; - - struct PeerInfo { - HashSet<ObjectID> sync_nodes; - HashSet<ObjectID> spawn_nodes; - HashMap<uint32_t, ObjectID> recv_nodes; - uint16_t last_sent_sync = 0; - uint16_t last_recv_sync = 0; - }; - - HashSet<int> known_peers; - uint32_t last_net_id = 0; - HashMap<ObjectID, TrackedNode> tracked_nodes; - HashMap<int, PeerInfo> peers_info; - HashSet<ObjectID> spawned_nodes; - HashSet<ObjectID> synced_nodes; - - TrackedNode &_track(const ObjectID &p_id); - void _untrack(const ObjectID &p_id); - bool is_tracked(const ObjectID &p_id) const { return tracked_nodes.has(p_id); } - -public: - const HashSet<int> get_peers() const { return known_peers; } - const HashSet<ObjectID> &get_spawned_nodes() const { return spawned_nodes; } - bool is_spawned_node(const ObjectID &p_id) const { return spawned_nodes.has(p_id); } - const HashSet<ObjectID> &get_synced_nodes() const { return synced_nodes; } - bool is_synced_node(const ObjectID &p_id) const { return synced_nodes.has(p_id); } - - MultiplayerSynchronizer *get_synchronizer(const ObjectID &p_id) { return tracked_nodes.has(p_id) ? tracked_nodes[p_id].get_synchronizer() : nullptr; } - MultiplayerSpawner *get_spawner(const ObjectID &p_id) { return tracked_nodes.has(p_id) ? tracked_nodes[p_id].get_spawner() : nullptr; } - Node *get_node(const ObjectID &p_id) { return tracked_nodes.has(p_id) ? tracked_nodes[p_id].get_node() : nullptr; } - bool update_last_node_sync(const ObjectID &p_id, uint16_t p_time); - bool update_sync_time(const ObjectID &p_id, uint64_t p_msec); - - uint32_t get_net_id(const ObjectID &p_id) const; - void set_net_id(const ObjectID &p_id, uint32_t p_net_id); - uint32_t ensure_net_id(const ObjectID &p_id); - - void reset(); - void on_peer_change(int p_peer, bool p_connected); - - Error config_add_spawn(Node *p_node, MultiplayerSpawner *p_spawner); - Error config_del_spawn(Node *p_node, MultiplayerSpawner *p_spawner); - - Error config_add_sync(Node *p_node, MultiplayerSynchronizer *p_sync); - Error config_del_sync(Node *p_node, MultiplayerSynchronizer *p_sync); - - Error peer_add_sync(int p_peer, const ObjectID &p_id); - Error peer_del_sync(int p_peer, const ObjectID &p_id); - - const HashSet<ObjectID> get_peer_sync_nodes(int p_peer); - bool is_peer_sync(int p_peer, const ObjectID &p_id) const; - - Error peer_add_spawn(int p_peer, const ObjectID &p_id); - Error peer_del_spawn(int p_peer, const ObjectID &p_id); - - const HashSet<ObjectID> get_peer_spawn_nodes(int p_peer); - bool is_peer_spawn(int p_peer, const ObjectID &p_id) const; - - const HashMap<uint32_t, ObjectID> peer_get_remotes(int p_peer) const; - Node *peer_get_remote(int p_peer, uint32_t p_net_id); - Error peer_add_remote(int p_peer, uint32_t p_net_id, Node *p_node, MultiplayerSpawner *p_spawner); - Error peer_del_remote(int p_peer, uint32_t p_net_id, Node **r_node); - - uint16_t peer_sync_next(int p_peer); - void peer_sync_recv(int p_peer, uint16_t p_time); - - SceneReplicationState() {} -}; - -#endif // SCENE_REPLICATION_STATE_H diff --git a/modules/navigation/SCsub b/modules/navigation/SCsub index 24a6b12639..0b0822db2d 100644 --- a/modules/navigation/SCsub +++ b/modules/navigation/SCsub @@ -57,7 +57,7 @@ env.modules_sources += thirdparty_obj module_obj = [] env_navigation.add_source_files(module_obj, "*.cpp") -if env["tools"]: +if env.editor_build: env_navigation.add_source_files(module_obj, "editor/*.cpp") env.modules_sources += module_obj diff --git a/modules/navigation/godot_navigation_server.cpp b/modules/navigation/godot_navigation_server.cpp index 9e5d666a51..8ca73a3adb 100644 --- a/modules/navigation/godot_navigation_server.cpp +++ b/modules/navigation/godot_navigation_server.cpp @@ -810,6 +810,32 @@ void GodotNavigationServer::process(real_t p_delta_time) { } } +NavigationUtilities::PathQueryResult GodotNavigationServer::_query_path(const NavigationUtilities::PathQueryParameters &p_parameters) const { + NavigationUtilities::PathQueryResult r_query_result; + + const NavMap *map = map_owner.get_or_null(p_parameters.map); + ERR_FAIL_COND_V(map == nullptr, r_query_result); + + // run the pathfinding + + if (p_parameters.pathfinding_algorithm == NavigationUtilities::PathfindingAlgorithm::PATHFINDING_ALGORITHM_ASTAR) { + // while postprocessing is still part of map.get_path() need to check and route it here for the correct "optimize" post-processing + if (p_parameters.path_postprocessing == NavigationUtilities::PathPostProcessing::PATH_POSTPROCESSING_CORRIDORFUNNEL) { + r_query_result.path = map->get_path(p_parameters.start_position, p_parameters.target_position, true, p_parameters.navigation_layers); + } else if (p_parameters.path_postprocessing == NavigationUtilities::PathPostProcessing::PATH_POSTPROCESSING_EDGECENTERED) { + r_query_result.path = map->get_path(p_parameters.start_position, p_parameters.target_position, false, p_parameters.navigation_layers); + } + } else { + return r_query_result; + } + + // add path postprocessing + + // add path stats + + return r_query_result; +} + #undef COMMAND_1 #undef COMMAND_2 #undef COMMAND_4 diff --git a/modules/navigation/godot_navigation_server.h b/modules/navigation/godot_navigation_server.h index e6ef7e3bb1..ab5e722d35 100644 --- a/modules/navigation/godot_navigation_server.h +++ b/modules/navigation/godot_navigation_server.h @@ -175,6 +175,8 @@ public: void flush_queries(); virtual void process(real_t p_delta_time) override; + + virtual NavigationUtilities::PathQueryResult _query_path(const NavigationUtilities::PathQueryParameters &p_parameters) const override; }; #undef COMMAND_1 diff --git a/modules/navigation/nav_map.cpp b/modules/navigation/nav_map.cpp index 100db9bc82..83862e1e34 100644 --- a/modules/navigation/nav_map.cpp +++ b/modules/navigation/nav_map.cpp @@ -140,20 +140,17 @@ Vector<Vector3> NavMap::get_path(Vector3 p_origin, Vector3 p_destination, bool p // This is an implementation of the A* algorithm. int least_cost_id = 0; + int prev_least_cost_id = -1; bool found_route = false; const gd::Polygon *reachable_end = nullptr; float reachable_d = 1e30; bool is_reachable = true; - gd::NavigationPoly *prev_least_cost_poly = nullptr; - while (true) { // Takes the current least_cost_poly neighbors (iterating over its edges) and compute the traveled_distance. for (size_t i = 0; i < navigation_polys[least_cost_id].poly->edges.size(); i++) { - gd::NavigationPoly *least_cost_poly = &navigation_polys[least_cost_id]; - - const gd::Edge &edge = least_cost_poly->poly->edges[i]; + const gd::Edge &edge = navigation_polys[least_cost_id].poly->edges[i]; // Iterate over connections in this edge, then compute the new optimized travel distance assigned to this polygon. for (int connection_index = 0; connection_index < edge.connections.size(); connection_index++) { @@ -164,17 +161,18 @@ Vector<Vector3> NavMap::get_path(Vector3 p_origin, Vector3 p_destination, bool p continue; } + const gd::NavigationPoly &least_cost_poly = navigation_polys[least_cost_id]; float poly_enter_cost = 0.0; - float poly_travel_cost = least_cost_poly->poly->owner->get_travel_cost(); + float poly_travel_cost = least_cost_poly.poly->owner->get_travel_cost(); - if (prev_least_cost_poly != nullptr && (prev_least_cost_poly->poly->owner->get_self() != least_cost_poly->poly->owner->get_self())) { - poly_enter_cost = least_cost_poly->poly->owner->get_enter_cost(); + if (prev_least_cost_id != -1 && (navigation_polys[prev_least_cost_id].poly->owner->get_self() != least_cost_poly.poly->owner->get_self())) { + poly_enter_cost = least_cost_poly.poly->owner->get_enter_cost(); } - prev_least_cost_poly = least_cost_poly; + prev_least_cost_id = least_cost_id; Vector3 pathway[2] = { connection.pathway_start, connection.pathway_end }; - const Vector3 new_entry = Geometry3D::get_closest_point_to_segment(least_cost_poly->entry, pathway); - const float new_distance = (least_cost_poly->entry.distance_to(new_entry) * poly_travel_cost) + poly_enter_cost + least_cost_poly->traveled_distance; + const Vector3 new_entry = Geometry3D::get_closest_point_to_segment(least_cost_poly.entry, pathway); + const float new_distance = (least_cost_poly.entry.distance_to(new_entry) * poly_travel_cost) + poly_enter_cost + least_cost_poly.traveled_distance; int64_t already_visited_polygon_index = navigation_polys.find(gd::NavigationPoly(connection.polygon)); @@ -240,6 +238,7 @@ Vector<Vector3> NavMap::get_path(Vector3 p_origin, Vector3 p_destination, bool p to_visit.clear(); to_visit.push_back(0); least_cost_id = 0; + prev_least_cost_id = -1; reachable_end = nullptr; diff --git a/modules/navigation/navigation_mesh_generator.cpp b/modules/navigation/navigation_mesh_generator.cpp index cfb8e0cd42..f989fc45a5 100644 --- a/modules/navigation/navigation_mesh_generator.cpp +++ b/modules/navigation/navigation_mesh_generator.cpp @@ -209,6 +209,9 @@ void NavigationMeshGenerator::_parse_geometry(const Transform3D &p_navmesh_trans for (uint32_t shape_owner : shape_owners) { const int shape_count = static_body->shape_owner_get_shape_count(shape_owner); for (int i = 0; i < shape_count; i++) { + if (static_body->is_shape_owner_disabled(i)) { + continue; + } Ref<Shape3D> s = static_body->shape_owner_get_shape(shape_owner, i); if (s.is_null()) { continue; diff --git a/modules/noise/noise_texture_2d.cpp b/modules/noise/noise_texture_2d.cpp index 8d279f9dd3..101a66371b 100644 --- a/modules/noise/noise_texture_2d.cpp +++ b/modules/noise/noise_texture_2d.cpp @@ -197,9 +197,6 @@ void NoiseTexture2D::_update_texture() { use_thread = false; first_time = false; } -#ifdef NO_THREADS - use_thread = false; -#endif if (use_thread) { if (!noise_thread.is_started()) { noise_thread.start(_thread_function, this); diff --git a/modules/openxr/SCsub b/modules/openxr/SCsub index 593d1ff3c1..d4469b110b 100644 --- a/modules/openxr/SCsub +++ b/modules/openxr/SCsub @@ -18,38 +18,36 @@ env_openxr.Prepend( thirdparty_dir + "/src", thirdparty_dir + "/src/common", thirdparty_dir + "/src/external/jsoncpp/include", - thirdparty_dir + "/src/loader", ] ) -# may need to check and set: -# - XR_USE_TIMESPEC - -env_thirdparty = env_openxr.Clone() -env_thirdparty.disable_warnings() -env_thirdparty.AppendUnique(CPPDEFINES=["DISABLE_STD_FILESYSTEM"]) - if env["platform"] == "android": # may need to set OPENXR_ANDROID_VERSION_SUFFIX - env_thirdparty.AppendUnique(CPPDEFINES=["XR_OS_ANDROID", "XR_USE_PLATFORM_ANDROID"]) + env_openxr.AppendUnique(CPPDEFINES=["XR_OS_ANDROID", "XR_USE_PLATFORM_ANDROID"]) + env_openxr.AppendUnique(CPPDEFINES=["JSON_USE_EXCEPTION=0"]) # may need to include java parts of the openxr loader elif env["platform"] == "linuxbsd": - env_thirdparty.AppendUnique(CPPDEFINES=["XR_OS_LINUX"]) + env_openxr.AppendUnique(CPPDEFINES=["XR_OS_LINUX"]) if env["x11"]: - env_thirdparty.AppendUnique(CPPDEFINES=["XR_USE_PLATFORM_XLIB"]) + env_openxr.AppendUnique(CPPDEFINES=["XR_USE_PLATFORM_XLIB"]) # FIXME: Review what needs to be set for Android and macOS. - env_thirdparty.AppendUnique(CPPDEFINES=["HAVE_SECURE_GETENV"]) + env_openxr.AppendUnique(CPPDEFINES=["HAVE_SECURE_GETENV"]) elif env["platform"] == "windows": - env_thirdparty.AppendUnique(CPPDEFINES=["XR_OS_WINDOWS", "NOMINMAX", "XR_USE_PLATFORM_WIN32"]) + env_openxr.AppendUnique(CPPDEFINES=["XR_OS_WINDOWS", "NOMINMAX", "XR_USE_PLATFORM_WIN32"]) -env_thirdparty.add_source_files(thirdparty_obj, thirdparty_dir + "/src/xr_generated_dispatch_table.c") +# may need to check and set: +# - XR_USE_TIMESPEC -# add in common files (hope these don't clash with us) -env_thirdparty.add_source_files(thirdparty_obj, thirdparty_dir + "/src/common/filesystem_utils.cpp") -env_thirdparty.add_source_files(thirdparty_obj, thirdparty_dir + "/src/common/object_info.cpp") +env_thirdparty = env_openxr.Clone() +env_thirdparty.disable_warnings() +env_thirdparty.AppendUnique(CPPDEFINES=["DISABLE_STD_FILESYSTEM"]) + +if "-fno-exceptions" in env_thirdparty["CXXFLAGS"]: + env_thirdparty["CXXFLAGS"].remove("-fno-exceptions") +env_thirdparty.Append(CPPPATH=[thirdparty_dir + "/src/loader"]) # add in external jsoncpp dependency env_thirdparty.add_source_files(thirdparty_obj, thirdparty_dir + "/src/external/jsoncpp/src/lib_json/json_reader.cpp") @@ -57,17 +55,24 @@ env_thirdparty.add_source_files(thirdparty_obj, thirdparty_dir + "/src/external/ env_thirdparty.add_source_files(thirdparty_obj, thirdparty_dir + "/src/external/jsoncpp/src/lib_json/json_writer.cpp") # add in load -if env["platform"] == "android": - env_thirdparty.add_source_files(thirdparty_obj, thirdparty_dir + "/src/loader/android_utilities.cpp") - -env_thirdparty.add_source_files(thirdparty_obj, thirdparty_dir + "/src/loader/api_layer_interface.cpp") -env_thirdparty.add_source_files(thirdparty_obj, thirdparty_dir + "/src/loader/loader_core.cpp") -env_thirdparty.add_source_files(thirdparty_obj, thirdparty_dir + "/src/loader/loader_instance.cpp") -env_thirdparty.add_source_files(thirdparty_obj, thirdparty_dir + "/src/loader/loader_logger_recorders.cpp") -env_thirdparty.add_source_files(thirdparty_obj, thirdparty_dir + "/src/loader/loader_logger.cpp") -env_thirdparty.add_source_files(thirdparty_obj, thirdparty_dir + "/src/loader/manifest_file.cpp") -env_thirdparty.add_source_files(thirdparty_obj, thirdparty_dir + "/src/loader/runtime_interface.cpp") -env_thirdparty.add_source_files(thirdparty_obj, thirdparty_dir + "/src/loader/xr_generated_loader.cpp") +if env["platform"] != "android": + # On Android the openxr_loader is provided by separate plugins for each device + # Build the engine using object files + khrloader_obj = [] + env_thirdparty.add_source_files(khrloader_obj, thirdparty_dir + "/src/xr_generated_dispatch_table.c") + + env_thirdparty.add_source_files(khrloader_obj, thirdparty_dir + "/src/common/filesystem_utils.cpp") + env_thirdparty.add_source_files(khrloader_obj, thirdparty_dir + "/src/common/object_info.cpp") + + env_thirdparty.add_source_files(khrloader_obj, thirdparty_dir + "/src/loader/api_layer_interface.cpp") + env_thirdparty.add_source_files(khrloader_obj, thirdparty_dir + "/src/loader/loader_core.cpp") + env_thirdparty.add_source_files(khrloader_obj, thirdparty_dir + "/src/loader/loader_instance.cpp") + env_thirdparty.add_source_files(khrloader_obj, thirdparty_dir + "/src/loader/loader_logger_recorders.cpp") + env_thirdparty.add_source_files(khrloader_obj, thirdparty_dir + "/src/loader/loader_logger.cpp") + env_thirdparty.add_source_files(khrloader_obj, thirdparty_dir + "/src/loader/manifest_file.cpp") + env_thirdparty.add_source_files(khrloader_obj, thirdparty_dir + "/src/loader/runtime_interface.cpp") + env_thirdparty.add_source_files(khrloader_obj, thirdparty_dir + "/src/loader/xr_generated_loader.cpp") + env.modules_sources += khrloader_obj env.modules_sources += thirdparty_obj @@ -78,6 +83,7 @@ module_obj = [] env_openxr.add_source_files(module_obj, "*.cpp") env_openxr.add_source_files(module_obj, "action_map/*.cpp") +env_openxr.add_source_files(module_obj, "scene/*.cpp") # We're a little more targeted with our extensions if env["platform"] == "android": @@ -85,11 +91,14 @@ if env["platform"] == "android": if env["vulkan"]: env_openxr.add_source_files(module_obj, "extensions/openxr_vulkan_extension.cpp") +env_openxr.add_source_files(module_obj, "extensions/openxr_palm_pose_extension.cpp") env_openxr.add_source_files(module_obj, "extensions/openxr_htc_vive_tracker_extension.cpp") +env_openxr.add_source_files(module_obj, "extensions/openxr_hand_tracking_extension.cpp") +env_openxr.add_source_files(module_obj, "extensions/openxr_fb_passthrough_extension_wrapper.cpp") env.modules_sources += module_obj -if env["tools"]: +if env.editor_build: SConscript("editor/SCsub") # Needed to force rebuilding the module files when the thirdparty library is updated. diff --git a/modules/openxr/action_map/openxr_action_map.cpp b/modules/openxr/action_map/openxr_action_map.cpp index 0eb5302442..185e44c29d 100644 --- a/modules/openxr/action_map/openxr_action_map.cpp +++ b/modules/openxr/action_map/openxr_action_map.cpp @@ -157,7 +157,11 @@ void OpenXRActionMap::remove_interaction_profile(Ref<OpenXRInteractionProfile> p } void OpenXRActionMap::create_default_action_sets() { - // Note, if you make changes here make sure to delete your default_action_map.tres file of it will load an old version. + // Note: + // - if you make changes here make sure to delete your default_action_map.tres file of it will load an old version. + // - our palm pose is only available if the relevant extension is supported, + // we still want it to be part of our action map as we may deploy the same game to platforms that do and don't support it. + // - the same applies for interaction profiles that are only supported if the relevant extension is supported. // Create our Godot action set Ref<OpenXRActionSet> action_set = OpenXRActionSet::new_action_set("godot", "Godot action set"); @@ -200,6 +204,7 @@ void OpenXRActionMap::create_default_action_sets() { "/user/vive_tracker_htcx/role/keyboard"); Ref<OpenXRAction> aim_pose = action_set->add_new_action("aim_pose", "Aim pose", OpenXRAction::OPENXR_ACTION_POSE, "/user/hand/left,/user/hand/right"); Ref<OpenXRAction> grip_pose = action_set->add_new_action("grip_pose", "Grip pose", OpenXRAction::OPENXR_ACTION_POSE, "/user/hand/left,/user/hand/right"); + Ref<OpenXRAction> palm_pose = action_set->add_new_action("palm_pose", "Palm pose", OpenXRAction::OPENXR_ACTION_POSE, "/user/hand/left,/user/hand/right"); Ref<OpenXRAction> haptic = action_set->add_new_action("haptic", "Haptic", OpenXRAction::OPENXR_ACTION_HAPTIC, "/user/hand/left," "/user/hand/right," @@ -222,6 +227,7 @@ void OpenXRActionMap::create_default_action_sets() { profile->add_new_binding(default_pose, "/user/hand/left/input/grip/pose,/user/hand/right/input/grip/pose"); profile->add_new_binding(aim_pose, "/user/hand/left/input/aim/pose,/user/hand/right/input/aim/pose"); profile->add_new_binding(grip_pose, "/user/hand/left/input/grip/pose,/user/hand/right/input/grip/pose"); + profile->add_new_binding(palm_pose, "/user/hand/left/input/palm_ext/pose,/user/hand/right/input/palm_ext/pose"); profile->add_new_binding(menu_button, "/user/hand/left/input/menu/click,/user/hand/right/input/menu/click"); profile->add_new_binding(select_button, "/user/hand/left/input/select/click,/user/hand/right/input/select/click"); // generic has no support for triggers, grip, A/B buttons, nor joystick/trackpad inputs @@ -233,6 +239,7 @@ void OpenXRActionMap::create_default_action_sets() { profile->add_new_binding(default_pose, "/user/hand/left/input/grip/pose,/user/hand/right/input/grip/pose"); profile->add_new_binding(aim_pose, "/user/hand/left/input/aim/pose,/user/hand/right/input/aim/pose"); profile->add_new_binding(grip_pose, "/user/hand/left/input/grip/pose,/user/hand/right/input/grip/pose"); + profile->add_new_binding(palm_pose, "/user/hand/left/input/palm_ext/pose,/user/hand/right/input/palm_ext/pose"); profile->add_new_binding(menu_button, "/user/hand/left/input/menu/click,/user/hand/right/input/menu/click"); profile->add_new_binding(select_button, "/user/hand/left/input/system/click,/user/hand/right/input/system/click"); // wmr controller has no a/b/x/y buttons @@ -253,6 +260,7 @@ void OpenXRActionMap::create_default_action_sets() { profile->add_new_binding(default_pose, "/user/hand/left/input/grip/pose,/user/hand/right/input/grip/pose"); profile->add_new_binding(aim_pose, "/user/hand/left/input/aim/pose,/user/hand/right/input/aim/pose"); profile->add_new_binding(grip_pose, "/user/hand/left/input/grip/pose,/user/hand/right/input/grip/pose"); + profile->add_new_binding(palm_pose, "/user/hand/left/input/palm_ext/pose,/user/hand/right/input/palm_ext/pose"); // wmr controllers have no select button we can use profile->add_new_binding(menu_button, "/user/hand/left/input/menu/click,/user/hand/right/input/menu/click"); // wmr controller has no a/b/x/y buttons @@ -275,6 +283,7 @@ void OpenXRActionMap::create_default_action_sets() { profile->add_new_binding(default_pose, "/user/hand/left/input/grip/pose,/user/hand/right/input/grip/pose"); profile->add_new_binding(aim_pose, "/user/hand/left/input/aim/pose,/user/hand/right/input/aim/pose"); profile->add_new_binding(grip_pose, "/user/hand/left/input/grip/pose,/user/hand/right/input/grip/pose"); + profile->add_new_binding(palm_pose, "/user/hand/left/input/palm_ext/pose,/user/hand/right/input/palm_ext/pose"); // touch controllers have no select button we can use profile->add_new_binding(menu_button, "/user/hand/left/input/menu/click,/user/hand/right/input/system/click"); // right hand system click may not be available profile->add_new_binding(ax_button, "/user/hand/left/input/x/click,/user/hand/right/input/a/click"); // x on left hand, a on right hand @@ -299,6 +308,7 @@ void OpenXRActionMap::create_default_action_sets() { profile->add_new_binding(default_pose, "/user/hand/left/input/grip/pose,/user/hand/right/input/grip/pose"); profile->add_new_binding(aim_pose, "/user/hand/left/input/aim/pose,/user/hand/right/input/aim/pose"); profile->add_new_binding(grip_pose, "/user/hand/left/input/grip/pose,/user/hand/right/input/grip/pose"); + profile->add_new_binding(palm_pose, "/user/hand/left/input/palm_ext/pose,/user/hand/right/input/palm_ext/pose"); // index controllers have no select button we can use profile->add_new_binding(menu_button, "/user/hand/left/input/system/click,/user/hand/right/input/system/click"); profile->add_new_binding(ax_button, "/user/hand/left/input/a/click,/user/hand/right/input/a/click"); // a on both controllers @@ -321,16 +331,12 @@ void OpenXRActionMap::create_default_action_sets() { profile->add_new_binding(haptic, "/user/hand/left/output/haptic,/user/hand/right/output/haptic"); add_interaction_profile(profile); - // Note, the following profiles are all part of extensions. - // We include these regardless of whether the extension is active. - // We want our action map to be as complete as possible so our game is as portable as possible. - // It is very possible these will in due time become core. - // Create our HP MR controller profile profile = OpenXRInteractionProfile::new_profile("/interaction_profiles/hp/mixed_reality_controller"); profile->add_new_binding(default_pose, "/user/hand/left/input/grip/pose,/user/hand/right/input/grip/pose"); profile->add_new_binding(aim_pose, "/user/hand/left/input/aim/pose,/user/hand/right/input/aim/pose"); profile->add_new_binding(grip_pose, "/user/hand/left/input/grip/pose,/user/hand/right/input/grip/pose"); + profile->add_new_binding(palm_pose, "/user/hand/left/input/palm_ext/pose,/user/hand/right/input/palm_ext/pose"); // hpmr controllers have no select button we can use profile->add_new_binding(menu_button, "/user/hand/left/input/menu/click,/user/hand/right/input/menu/click"); // hpmr controllers only register click, not touch, on our a/b/x/y buttons @@ -353,6 +359,7 @@ void OpenXRActionMap::create_default_action_sets() { profile->add_new_binding(default_pose, "/user/hand/left/input/grip/pose,/user/hand/right/input/grip/pose"); profile->add_new_binding(aim_pose, "/user/hand/left/input/aim/pose,/user/hand/right/input/aim/pose"); profile->add_new_binding(grip_pose, "/user/hand/left/input/grip/pose,/user/hand/right/input/grip/pose"); + profile->add_new_binding(palm_pose, "/user/hand/left/input/palm_ext/pose,/user/hand/right/input/palm_ext/pose"); // Odyssey controllers have no select button we can use profile->add_new_binding(menu_button, "/user/hand/left/input/menu/click,/user/hand/right/input/menu/click"); // Odyssey controller has no a/b/x/y buttons @@ -375,6 +382,7 @@ void OpenXRActionMap::create_default_action_sets() { profile->add_new_binding(default_pose, "/user/hand/left/input/grip/pose,/user/hand/right/input/grip/pose"); profile->add_new_binding(aim_pose, "/user/hand/left/input/aim/pose,/user/hand/right/input/aim/pose"); profile->add_new_binding(grip_pose, "/user/hand/left/input/grip/pose,/user/hand/right/input/grip/pose"); + profile->add_new_binding(palm_pose, "/user/hand/left/input/palm_ext/pose,/user/hand/right/input/palm_ext/pose"); profile->add_new_binding(menu_button, "/user/hand/left/input/menu/click"); profile->add_new_binding(select_button, "/user/hand/left/input/system/click"); // we'll map system to select profile->add_new_binding(ax_button, "/user/hand/left/input/x/click,/user/hand/right/input/a/click"); // x on left hand, a on right hand @@ -398,6 +406,7 @@ void OpenXRActionMap::create_default_action_sets() { profile->add_new_binding(default_pose, "/user/hand/left/input/grip/pose,/user/hand/right/input/grip/pose"); profile->add_new_binding(aim_pose, "/user/hand/left/input/aim/pose,/user/hand/right/input/aim/pose"); profile->add_new_binding(grip_pose, "/user/hand/left/input/grip/pose,/user/hand/right/input/grip/pose"); + profile->add_new_binding(palm_pose, "/user/hand/left/input/palm_ext/pose,/user/hand/right/input/palm_ext/pose"); profile->add_new_binding(menu_button, "/user/hand/left/input/menu/click"); profile->add_new_binding(select_button, "/user/hand/left/input/system/click"); // we'll map system to select profile->add_new_binding(ax_button, "/user/hand/left/input/x/click,/user/hand/right/input/a/click"); // x on left hand, a on right hand @@ -421,6 +430,7 @@ void OpenXRActionMap::create_default_action_sets() { profile->add_new_binding(default_pose, "/user/hand/left/input/grip/pose,/user/hand/right/input/grip/pose"); profile->add_new_binding(aim_pose, "/user/hand/left/input/aim/pose,/user/hand/right/input/aim/pose"); profile->add_new_binding(grip_pose, "/user/hand/left/input/grip/pose,/user/hand/right/input/grip/pose"); + profile->add_new_binding(palm_pose, "/user/hand/left/input/palm_ext/pose,/user/hand/right/input/palm_ext/pose"); profile->add_new_binding(menu_button, "/user/hand/left/input/home/click,/user/hand/right/input/home/click"); profile->add_new_binding(trigger, "/user/hand/left/input/trigger/value,/user/hand/right/input/trigger/value"); profile->add_new_binding(trigger_click, "/user/hand/left/input/trigger/click,/user/hand/right/input/trigger/click"); diff --git a/modules/openxr/action_map/openxr_defs.cpp b/modules/openxr/action_map/openxr_defs.cpp index 89860199be..59ce829f1b 100644 --- a/modules/openxr/action_map/openxr_defs.cpp +++ b/modules/openxr/action_map/openxr_defs.cpp @@ -62,6 +62,8 @@ OpenXRDefs::IOPath OpenXRDefs::simple_io_paths[] = { { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, @@ -78,6 +80,8 @@ OpenXRDefs::IOPath OpenXRDefs::vive_io_paths[] = { { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, @@ -109,6 +113,8 @@ OpenXRDefs::IOPath OpenXRDefs::motion_io_paths[] = { { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, @@ -143,6 +149,8 @@ OpenXRDefs::IOPath OpenXRDefs::hpmr_io_paths[] = { { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, @@ -175,6 +183,8 @@ OpenXRDefs::IOPath OpenXRDefs::touch_io_paths[] = { { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, { "System click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/system/click", OpenXRAction::OPENXR_ACTION_BOOL }, @@ -213,6 +223,8 @@ OpenXRDefs::IOPath OpenXRDefs::index_io_paths[] = { { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, { "System click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/system/click", OpenXRAction::OPENXR_ACTION_BOOL }, { "System click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/system/click", OpenXRAction::OPENXR_ACTION_BOOL }, @@ -260,6 +272,8 @@ OpenXRDefs::IOPath OpenXRDefs::odyssey_io_paths[] = { { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, @@ -294,6 +308,8 @@ OpenXRDefs::IOPath OpenXRDefs::vive_cosmos_paths[] = { { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, { "System click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/system/click", OpenXRAction::OPENXR_ACTION_BOOL }, @@ -331,6 +347,8 @@ OpenXRDefs::IOPath OpenXRDefs::vive_focus3_paths[] = { { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, { "System click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/system/click", OpenXRAction::OPENXR_ACTION_BOOL }, @@ -371,6 +389,8 @@ OpenXRDefs::IOPath OpenXRDefs::huawei_controller_paths[] = { { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, + { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, { "Home click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/home/click", OpenXRAction::OPENXR_ACTION_BOOL }, { "Home click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/home/click", OpenXRAction::OPENXR_ACTION_BOOL }, diff --git a/modules/openxr/config.py b/modules/openxr/config.py index f91cb1359f..279168cc59 100644 --- a/modules/openxr/config.py +++ b/modules/openxr/config.py @@ -1,7 +1,5 @@ def can_build(env, platform): - if ( - platform == "linuxbsd" or platform == "windows" - ): # or platform == "android" -- temporarily disabled android support + if platform in ("linuxbsd", "windows", "android"): return env["openxr"] else: # not supported on these platforms @@ -20,6 +18,7 @@ def get_doc_classes(): "OpenXRActionMap", "OpenXRInteractionProfile", "OpenXRIPBinding", + "OpenXRHand", ] diff --git a/modules/openxr/doc_classes/OpenXRHand.xml b/modules/openxr/doc_classes/OpenXRHand.xml new file mode 100644 index 0000000000..5d5f8a6126 --- /dev/null +++ b/modules/openxr/doc_classes/OpenXRHand.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="OpenXRHand" inherits="Node3D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../doc/class.xsd"> + <brief_description> + Node supporting finger tracking in OpenXR. + </brief_description> + <description> + This node enables OpenXR's hand tracking functionality. The node should be a child node of an [XROrigin3D] node, tracking will update its position to where the player's actual hand is positioned. This node also updates the skeleton of a properly skinned hand model. The hand mesh should be a child node of this node. + </description> + <tutorials> + </tutorials> + <members> + <member name="hand" type="int" setter="set_hand" getter="get_hand" enum="OpenXRHand.Hands" default="0"> + Specifies whether this node tracks the left or right hand of the player. + </member> + <member name="hand_skeleton" type="NodePath" setter="set_hand_skeleton" getter="get_hand_skeleton" default="NodePath("")"> + Set a [Skeleton3D] node for which the pose positions will be updated. + </member> + <member name="motion_range" type="int" setter="set_motion_range" getter="get_motion_range" enum="OpenXRHand.MotionRange" default="0"> + Set the motion range (if supported) limiting the hand motion. + </member> + </members> + <constants> + <constant name="HAND_LEFT" value="0" enum="Hands"> + Tracking the player's left hand. + </constant> + <constant name="HAND_RIGHT" value="1" enum="Hands"> + Tracking the player's right hand. + </constant> + <constant name="HAND_MAX" value="2" enum="Hands"> + Maximum supported hands. + </constant> + <constant name="MOTION_RANGE_UNOBSTRUCTED" value="0" enum="MotionRange"> + When player grips, hand skeleton will form a full fist. + </constant> + <constant name="MOTION_RANGE_CONFORM_TO_CONTROLLER" value="1" enum="MotionRange"> + When player grips, hand skeleton conforms to the controller the player is holding. + </constant> + <constant name="MOTION_RANGE_MAX" value="2" enum="MotionRange"> + Maximum supported motion ranges. + </constant> + </constants> +</class> diff --git a/modules/openxr/extensions/openxr_android_extension.cpp b/modules/openxr/extensions/openxr_android_extension.cpp index 3bd4db169c..8f6d5c28db 100644 --- a/modules/openxr/extensions/openxr_android_extension.cpp +++ b/modules/openxr/extensions/openxr_android_extension.cpp @@ -29,7 +29,12 @@ /*************************************************************************/ #include "openxr_android_extension.h" +#include "java_godot_wrapper.h" +#include "os_android.h" +#include "thread_jandroid.h" +#include <jni.h> +#include <modules/openxr/openxr_api.h> #include <openxr/openxr.h> #include <openxr/openxr_platform.h> @@ -42,19 +47,16 @@ OpenXRAndroidExtension *OpenXRAndroidExtension::get_singleton() { OpenXRAndroidExtension::OpenXRAndroidExtension(OpenXRAPI *p_openxr_api) : OpenXRExtensionWrapper(p_openxr_api) { singleton = this; - request_extensions[XR_KHR_ANDROID_THREAD_SETTINGS_EXTENSION_NAME] = nullptr; // must be available +} - // Initialize the loader - PFN_xrInitializeLoaderKHR xrInitializeLoaderKHR; - result = xrGetInstanceProcAddr(XR_NULL_HANDLE, "xrInitializeLoaderKHR", (PFN_xrVoidFunction *)(&xrInitializeLoaderKHR)); - ERR_FAIL_COND_MSG(XR_FAILED(result), "Failed to retrieve pointer to xrInitializeLoaderKHR"); +void OpenXRAndroidExtension::on_before_instance_created() { + EXT_INIT_XR_FUNC(xrInitializeLoaderKHR); - // TODO fix this code, this is still code from GDNative! - JNIEnv *env = android_api->godot_android_get_env(); + JNIEnv *env = get_jni_env(); JavaVM *vm; env->GetJavaVM(&vm); - jobject activity_object = env->NewGlobalRef(android_api->godot_android_get_activity()); + jobject activity_object = env->NewGlobalRef(static_cast<OS_Android *>(OS::get_singleton())->get_godot_java()->get_activity()); XrLoaderInitInfoAndroidKHR loader_init_info_android = { .type = XR_TYPE_LOADER_INIT_INFO_ANDROID_KHR, @@ -62,7 +64,7 @@ OpenXRAndroidExtension::OpenXRAndroidExtension(OpenXRAPI *p_openxr_api) : .applicationVM = vm, .applicationContext = activity_object }; - xrInitializeLoaderKHR((const XrLoaderInitInfoBaseHeaderKHR *)&loader_init_info_android); + XrResult result = xrInitializeLoaderKHR((const XrLoaderInitInfoBaseHeaderKHR *)&loader_init_info_android); ERR_FAIL_COND_MSG(XR_FAILED(result), "Failed to call xrInitializeLoaderKHR"); } diff --git a/modules/openxr/extensions/openxr_android_extension.h b/modules/openxr/extensions/openxr_android_extension.h index 88b0e310e7..eda7022064 100644 --- a/modules/openxr/extensions/openxr_android_extension.h +++ b/modules/openxr/extensions/openxr_android_extension.h @@ -31,6 +31,7 @@ #ifndef OPENXR_ANDROID_EXTENSION_H #define OPENXR_ANDROID_EXTENSION_H +#include "../util.h" #include "openxr_extension_wrapper.h" class OpenXRAndroidExtension : public OpenXRExtensionWrapper { @@ -38,10 +39,16 @@ public: static OpenXRAndroidExtension *get_singleton(); OpenXRAndroidExtension(OpenXRAPI *p_openxr_api); + + virtual void on_before_instance_created() override; + virtual ~OpenXRAndroidExtension() override; private: static OpenXRAndroidExtension *singleton; + + // Initialize the loader + EXT_PROTO_XRRESULT_FUNC1(xrInitializeLoaderKHR, (const XrLoaderInitInfoBaseHeaderKHR *), loaderInitInfo) }; #endif // OPENXR_ANDROID_EXTENSION_H diff --git a/modules/openxr/extensions/openxr_composition_layer_provider.h b/modules/openxr/extensions/openxr_composition_layer_provider.h index 019dffa2a8..ba51389f7d 100644 --- a/modules/openxr/extensions/openxr_composition_layer_provider.h +++ b/modules/openxr/extensions/openxr_composition_layer_provider.h @@ -36,10 +36,9 @@ // Interface for OpenXR extensions that provide a composition layer. class OpenXRCompositionLayerProvider { public: - // TODO changed to normal method definition for now - // CI complains until we implement this, haven't ported it yet from plugin - // virtual XrCompositionLayerBaseHeader *get_composition_layer() = 0; - XrCompositionLayerBaseHeader *get_composition_layer() { return nullptr; }; + virtual XrCompositionLayerBaseHeader *get_composition_layer() = 0; + + virtual ~OpenXRCompositionLayerProvider() {} }; #endif // OPENXR_COMPOSITION_LAYER_PROVIDER_H diff --git a/modules/openxr/extensions/openxr_extension_wrapper.h b/modules/openxr/extensions/openxr_extension_wrapper.h index ecc6e0dd4e..623c264e6e 100644 --- a/modules/openxr/extensions/openxr_extension_wrapper.h +++ b/modules/openxr/extensions/openxr_extension_wrapper.h @@ -66,6 +66,7 @@ public: virtual void *set_session_create_and_get_next_pointer(void *p_next_pointer) { return p_next_pointer; } virtual void *set_swapchain_create_info_and_get_next_pointer(void *p_next_pointer) { return p_next_pointer; } + virtual void on_before_instance_created() {} virtual void on_instance_created(const XrInstance p_instance) {} virtual void on_instance_destroyed() {} virtual void on_session_created(const XrSession p_instance) {} @@ -87,6 +88,11 @@ public: return false; } + // Return false if this extension is responsible for this path but the path is not enabled + virtual bool is_path_supported(const String &p_path) { + return true; + } + OpenXRExtensionWrapper(OpenXRAPI *p_openxr_api) { openxr_api = p_openxr_api; }; virtual ~OpenXRExtensionWrapper() = default; }; diff --git a/modules/openxr/extensions/openxr_fb_passthrough_extension_wrapper.cpp b/modules/openxr/extensions/openxr_fb_passthrough_extension_wrapper.cpp new file mode 100644 index 0000000000..259b1236a3 --- /dev/null +++ b/modules/openxr/extensions/openxr_fb_passthrough_extension_wrapper.cpp @@ -0,0 +1,234 @@ +/*************************************************************************/ +/* openxr_fb_passthrough_extension_wrapper.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* 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 "openxr_fb_passthrough_extension_wrapper.h" + +#include "core/os/os.h" +#include "scene/main/viewport.h" +#include "scene/main/window.h" + +using namespace godot; + +OpenXRFbPassthroughExtensionWrapper *OpenXRFbPassthroughExtensionWrapper::singleton = nullptr; + +OpenXRFbPassthroughExtensionWrapper *OpenXRFbPassthroughExtensionWrapper::get_singleton() { + return singleton; +} + +OpenXRFbPassthroughExtensionWrapper::OpenXRFbPassthroughExtensionWrapper(OpenXRAPI *p_openxr_api) : + OpenXRExtensionWrapper(p_openxr_api) { + request_extensions[XR_FB_PASSTHROUGH_EXTENSION_NAME] = &fb_passthrough_ext; + request_extensions[XR_FB_TRIANGLE_MESH_EXTENSION_NAME] = &fb_triangle_mesh_ext; + singleton = this; +} + +OpenXRFbPassthroughExtensionWrapper::~OpenXRFbPassthroughExtensionWrapper() { + cleanup(); +} + +void OpenXRFbPassthroughExtensionWrapper::cleanup() { + fb_passthrough_ext = false; + fb_triangle_mesh_ext = false; +} + +Viewport *OpenXRFbPassthroughExtensionWrapper::get_main_viewport() { + MainLoop *main_loop = OS::get_singleton()->get_main_loop(); + if (!main_loop) { + print_error("Unable to retrieve main loop"); + return nullptr; + } + + auto *scene_tree = Object::cast_to<SceneTree>(main_loop); + if (!scene_tree) { + print_error("Unable to retrieve scene tree"); + return nullptr; + } + + Viewport *viewport = scene_tree->get_root()->get_viewport(); + return viewport; +} + +void OpenXRFbPassthroughExtensionWrapper::on_instance_created(const XrInstance instance) { + if (fb_passthrough_ext) { + bool result = initialize_fb_passthrough_extension(instance); + if (!result) { + print_error("Failed to initialize fb_passthrough extension"); + fb_passthrough_ext = false; + } + } + + if (fb_triangle_mesh_ext) { + bool result = initialize_fb_triangle_mesh_extension(instance); + if (!result) { + print_error("Failed to initialize fb_triangle_mesh extension"); + fb_triangle_mesh_ext = false; + } + } + + if (fb_passthrough_ext) { + openxr_api->register_composition_layer_provider(this); + } +} + +bool OpenXRFbPassthroughExtensionWrapper::is_passthrough_enabled() { + return fb_passthrough_ext && passthrough_handle != XR_NULL_HANDLE && passthrough_layer != XR_NULL_HANDLE; +} + +bool OpenXRFbPassthroughExtensionWrapper::is_composition_passthrough_layer_ready() { + return fb_passthrough_ext && passthrough_handle != XR_NULL_HANDLE && composition_passthrough_layer.layerHandle != XR_NULL_HANDLE; +} + +bool OpenXRFbPassthroughExtensionWrapper::start_passthrough() { + if (passthrough_handle == XR_NULL_HANDLE) { + return false; + } + + if (is_passthrough_enabled()) { + return true; + } + + // Start the passthrough feature + XrResult result = xrPassthroughStartFB(passthrough_handle); + if (!is_valid_passthrough_result(result, "Failed to start passthrough")) { + stop_passthrough(); + return false; + } + + // Create the passthrough layer + result = xrCreatePassthroughLayerFB(openxr_api->get_session(), &passthrough_layer_config, &passthrough_layer); + if (!is_valid_passthrough_result(result, "Failed to create the passthrough layer")) { + stop_passthrough(); + return false; + } + + // Check if the the viewport has transparent background + Viewport *viewport = get_main_viewport(); + if (viewport && !viewport->has_transparent_background()) { + print_error("Main viewport doesn't have transparent background! Passthrough may not properly render."); + } + + composition_passthrough_layer.layerHandle = passthrough_layer; + + return true; +} + +void OpenXRFbPassthroughExtensionWrapper::on_session_created(const XrSession session) { + if (fb_passthrough_ext) { + // Create the passthrough feature and start it. + XrResult result = xrCreatePassthroughFB(openxr_api->get_session(), &passthrough_create_info, &passthrough_handle); + if (!openxr_api->xr_result(result, "Failed to create passthrough")) { + passthrough_handle = XR_NULL_HANDLE; + return; + } + } +} + +XrCompositionLayerBaseHeader *OpenXRFbPassthroughExtensionWrapper::get_composition_layer() { + if (is_composition_passthrough_layer_ready()) { + return (XrCompositionLayerBaseHeader *)&composition_passthrough_layer; + } else { + return nullptr; + } +} + +void OpenXRFbPassthroughExtensionWrapper::stop_passthrough() { + if (!fb_passthrough_ext) { + return; + } + + composition_passthrough_layer.layerHandle = XR_NULL_HANDLE; + + XrResult result; + if (passthrough_layer != XR_NULL_HANDLE) { + // Destroy the layer + result = xrDestroyPassthroughLayerFB(passthrough_layer); + openxr_api->xr_result(result, "Unable to destroy passthrough layer"); + passthrough_layer = XR_NULL_HANDLE; + } + + if (passthrough_handle != XR_NULL_HANDLE) { + result = xrPassthroughPauseFB(passthrough_handle); + openxr_api->xr_result(result, "Unable to stop passthrough feature"); + } +} + +void OpenXRFbPassthroughExtensionWrapper::on_session_destroyed() { + if (fb_passthrough_ext) { + stop_passthrough(); + + XrResult result; + if (passthrough_handle != XR_NULL_HANDLE) { + result = xrDestroyPassthroughFB(passthrough_handle); + openxr_api->xr_result(result, "Unable to destroy passthrough feature"); + passthrough_handle = XR_NULL_HANDLE; + } + } +} + +void OpenXRFbPassthroughExtensionWrapper::on_instance_destroyed() { + if (fb_passthrough_ext) { + openxr_api->unregister_composition_layer_provider(this); + } + cleanup(); +} + +bool OpenXRFbPassthroughExtensionWrapper::initialize_fb_passthrough_extension(const XrInstance p_instance) { + ERR_FAIL_NULL_V(openxr_api, false); + + EXT_INIT_XR_FUNC_V(xrCreatePassthroughFB); + EXT_INIT_XR_FUNC_V(xrDestroyPassthroughFB); + EXT_INIT_XR_FUNC_V(xrPassthroughStartFB); + EXT_INIT_XR_FUNC_V(xrPassthroughPauseFB); + EXT_INIT_XR_FUNC_V(xrCreatePassthroughLayerFB); + EXT_INIT_XR_FUNC_V(xrDestroyPassthroughLayerFB); + EXT_INIT_XR_FUNC_V(xrPassthroughLayerPauseFB); + EXT_INIT_XR_FUNC_V(xrPassthroughLayerResumeFB); + EXT_INIT_XR_FUNC_V(xrPassthroughLayerSetStyleFB); + EXT_INIT_XR_FUNC_V(xrCreateGeometryInstanceFB); + EXT_INIT_XR_FUNC_V(xrDestroyGeometryInstanceFB); + EXT_INIT_XR_FUNC_V(xrGeometryInstanceSetTransformFB); + + return true; +} + +bool OpenXRFbPassthroughExtensionWrapper::initialize_fb_triangle_mesh_extension(const XrInstance p_instance) { + ERR_FAIL_NULL_V(openxr_api, false); + + EXT_INIT_XR_FUNC_V(xrCreateTriangleMeshFB); + EXT_INIT_XR_FUNC_V(xrDestroyTriangleMeshFB); + EXT_INIT_XR_FUNC_V(xrTriangleMeshGetVertexBufferFB); + EXT_INIT_XR_FUNC_V(xrTriangleMeshGetIndexBufferFB); + EXT_INIT_XR_FUNC_V(xrTriangleMeshBeginUpdateFB); + EXT_INIT_XR_FUNC_V(xrTriangleMeshEndUpdateFB); + EXT_INIT_XR_FUNC_V(xrTriangleMeshBeginVertexBufferUpdateFB); + EXT_INIT_XR_FUNC_V(xrTriangleMeshEndVertexBufferUpdateFB); + + return true; +} diff --git a/modules/openxr/extensions/openxr_fb_passthrough_extension_wrapper.h b/modules/openxr/extensions/openxr_fb_passthrough_extension_wrapper.h new file mode 100644 index 0000000000..1959f3fdc4 --- /dev/null +++ b/modules/openxr/extensions/openxr_fb_passthrough_extension_wrapper.h @@ -0,0 +1,254 @@ +/*************************************************************************/ +/* openxr_fb_passthrough_extension_wrapper.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* 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 OPENXR_FB_PASSTHROUGH_EXTENSION_WRAPPER_H +#define OPENXR_FB_PASSTHROUGH_EXTENSION_WRAPPER_H + +#include "../openxr_api.h" +#include "../util.h" + +#include "openxr_composition_layer_provider.h" +#include "openxr_extension_wrapper.h" + +#include <map> + +class Viewport; + +// Wrapper for the set of Facebook XR passthrough extensions. +class OpenXRFbPassthroughExtensionWrapper : public OpenXRExtensionWrapper, public OpenXRCompositionLayerProvider { + friend class OpenXRAPI; + +public: + void on_instance_created(const XrInstance instance) override; + + void on_session_created(const XrSession session) override; + + void on_session_destroyed() override; + + void on_instance_destroyed() override; + + XrCompositionLayerBaseHeader *get_composition_layer() override; + + bool is_passthrough_supported() { + return fb_passthrough_ext; + } + + bool is_passthrough_enabled(); + + bool start_passthrough(); + + void stop_passthrough(); + + static OpenXRFbPassthroughExtensionWrapper *get_singleton(); + +protected: + OpenXRFbPassthroughExtensionWrapper(OpenXRAPI *p_openxr_api); + ~OpenXRFbPassthroughExtensionWrapper(); + +private: + // Create a passthrough feature + EXT_PROTO_XRRESULT_FUNC3(xrCreatePassthroughFB, + (XrSession), session, + (const XrPassthroughCreateInfoFB *), create_info, + (XrPassthroughFB *), feature_out) + + // Destroy a previously created passthrough feature + EXT_PROTO_XRRESULT_FUNC1(xrDestroyPassthroughFB, (XrPassthroughFB), feature) + + //*** Passthrough feature state management functions ********* + // Start the passthrough feature + EXT_PROTO_XRRESULT_FUNC1(xrPassthroughStartFB, (XrPassthroughFB), passthrough) + // Pause the passthrough feature + EXT_PROTO_XRRESULT_FUNC1(xrPassthroughPauseFB, (XrPassthroughFB), passthrough) + + EXT_PROTO_XRRESULT_FUNC3(xrCreatePassthroughLayerFB, (XrSession), session, + (const XrPassthroughLayerCreateInfoFB *), config, + (XrPassthroughLayerFB *), layer_out) + + EXT_PROTO_XRRESULT_FUNC1(xrDestroyPassthroughLayerFB, (XrPassthroughLayerFB), layer) + + EXT_PROTO_XRRESULT_FUNC1(xrPassthroughLayerPauseFB, (XrPassthroughLayerFB), layer) + EXT_PROTO_XRRESULT_FUNC1(xrPassthroughLayerResumeFB, (XrPassthroughLayerFB), layer) + + // Set the style of an existing passthrough layer. If the enabled feature set + // doesn’t change, this is a lightweight operation that can be called in every + // frame to animate the style. Changes that may incur a bigger cost: + // - Enabling/disabling the color mapping, or changing the type of mapping + // (monochromatic to RGBA or back). + // - Changing `textureOpacityFactor` from 0 to non-zero or vice versa + // - Changing `edgeColor[3]` from 0 to non-zero or vice versa + // NOTE: For XR_FB_passthrough, all color values are treated as linear. + EXT_PROTO_XRRESULT_FUNC2(xrPassthroughLayerSetStyleFB, + (XrPassthroughLayerFB), layer, + (const XrPassthroughStyleFB *), style) + + // Create a geometry instance to be used as a projection surface for passthrough. + // A geometry instance assigns a triangle mesh as part of the specified layer's + // projection surface. + // The operation is only valid if the passthrough layer's purpose has been set to + // `XR_PASSTHROUGH_LAYER_PURPOSE_PROJECTED_FB`. Otherwise, the call this function will + // result in an error. In the specified layer, Passthrough will be visible where the view + // is covered by the user-specified geometries. + // + // A triangle mesh object can be instantiated multiple times - in the same or different layers' + // projection surface. Each instantiation has its own transformation, which + // can be updated using `xrGeometryInstanceSetTransformFB`. + EXT_PROTO_XRRESULT_FUNC3(xrCreateGeometryInstanceFB, + (XrSession), session, + (const XrGeometryInstanceCreateInfoFB *), create_info, + (XrGeometryInstanceFB *), out_geometry_instance) + + // Destroys a previously created geometry instance from passthrough rendering. + // This removes the geometry instance from passthrough rendering. + // The operation has no effect on other instances or the underlying mesh. + EXT_PROTO_XRRESULT_FUNC1(xrDestroyGeometryInstanceFB, (XrGeometryInstanceFB), instance) + + // Update the transformation of a passthrough geometry instance. + EXT_PROTO_XRRESULT_FUNC2(xrGeometryInstanceSetTransformFB, + (XrGeometryInstanceFB), instance, + (const XrGeometryInstanceTransformFB *), transformation) + + // Create a triangle mesh geometry object. + // Depending on the behavior flags, the mesh could be created immutable (data is assigned + // at creation and cannot be changed) or mutable (the mesh is created empty and can be updated + // by calling begin/end update functions). + EXT_PROTO_XRRESULT_FUNC3(xrCreateTriangleMeshFB, + (XrSession), session, + (const XrTriangleMeshCreateInfoFB *), create_info, + (XrTriangleMeshFB *), out_triangle_mesh) + + // Destroy an `XrTriangleMeshFB` object along with its data. The mesh buffers must not be + // accessed anymore after their parent mesh object has been destroyed. + EXT_PROTO_XRRESULT_FUNC1(xrDestroyTriangleMeshFB, (XrTriangleMeshFB), mesh) + + // Retrieve a pointer to the vertex buffer. The vertex buffer is structured as an array of 3 floats + // per vertex representing x, y, and z: `[x0, y0, z0, x1, y1, z1, ...]`. The size of the buffer is + // `maxVertexCount * 3` floats. The application must call `xrTriangleMeshBeginUpdateFB` or + // `xrTriangleMeshBeginVertexBufferUpdateFB` before making modifications to the vertex + // buffer. The buffer location is guaranteed to remain constant over the lifecycle of the mesh + // object. + EXT_PROTO_XRRESULT_FUNC2(xrTriangleMeshGetVertexBufferFB, + (XrTriangleMeshFB), mesh, + (XrVector3f **), out_vertex_buffer) + + // Retrieve the index buffer that defines the topology of the triangle mesh. Each triplet of + // consecutive elements point to three vertices in the vertex buffer and thus form a triangle. The + // size of each element is `indexElementSize` bytes, and thus the size of the buffer is + // `maxTriangleCount * 3 * indexElementSize` bytes. The application must call + // `xrTriangleMeshBeginUpdateFB` before making modifications to the index buffer. The buffer + // location is guaranteed to remain constant over the lifecycle of the mesh object. + EXT_PROTO_XRRESULT_FUNC2(xrTriangleMeshGetIndexBufferFB, + (XrTriangleMeshFB), mesh, + (uint32_t **), out_index_buffer) + + // Begin updating the mesh buffer data. The application must call this function before it makes any + // modifications to the buffers retrieved by `xrTriangleMeshGetVertexBufferFB` and + // `xrTriangleMeshGetIndexBufferFB`. If only the vertex buffer needs to be updated, + // `xrTriangleMeshBeginVertexBufferUpdateFB` can be used instead. To commit the + // modifications, the application must call `xrTriangleMeshEndUpdateFB`. + EXT_PROTO_XRRESULT_FUNC1(xrTriangleMeshBeginUpdateFB, (XrTriangleMeshFB), mesh) + + // Signal the API that the application has finished updating the mesh buffers after a call to + // `xrTriangleMeshBeginUpdateFB`. `vertexCount` and `triangleCount` specify the actual + // number of primitives that make up the mesh after the update. They must be larger than zero but + // smaller or equal to the maximum counts defined at create time. Buffer data beyond these counts + // is ignored. + EXT_PROTO_XRRESULT_FUNC3(xrTriangleMeshEndUpdateFB, + (XrTriangleMeshFB), mesh, + (uint32_t), vertexCount, + (uint32_t), triangle_count) + + // Update the vertex positions of a triangle mesh. Can only be called once the mesh topology has + // been set using `xrTriangleMeshBeginUpdateFB`/`xrTriangleMeshEndUpdateFB`. The + // vertex count is defined by the last invocation to `xrTriangleMeshEndUpdateFB`. Once the + // modification is done, `xrTriangleMeshEndVertexBufferUpdateFB` must be called. + EXT_PROTO_XRRESULT_FUNC2(xrTriangleMeshBeginVertexBufferUpdateFB, + (XrTriangleMeshFB), mesh, + (uint32_t *), out_vertex_count) + + // Signal the API that the contents of the vertex buffer data has been updated + // after a call to `xrTriangleMeshBeginVertexBufferUpdateFB`. + EXT_PROTO_XRRESULT_FUNC1(xrTriangleMeshEndVertexBufferUpdateFB, (XrTriangleMeshFB), mesh) + + bool initialize_fb_passthrough_extension(const XrInstance instance); + + bool initialize_fb_triangle_mesh_extension(const XrInstance instance); + + void cleanup(); + + // TODO: Temporary workaround (https://github.com/GodotVR/godot_openxr/issues/138) + // Address a bug in the passthrough api where XR_ERROR_UNEXPECTED_STATE_PASSTHROUGH_FB is + // returned even when the operation is valid on Meta Quest devices. + // The issue should be addressed on that platform in OS release v37. + inline bool is_valid_passthrough_result(XrResult result, const char *format) { + return openxr_api->xr_result(result, format) || result == XR_ERROR_UNEXPECTED_STATE_PASSTHROUGH_FB; + } + + Viewport *get_main_viewport(); + + bool is_composition_passthrough_layer_ready(); + + static OpenXRFbPassthroughExtensionWrapper *singleton; + + bool fb_passthrough_ext = false; // required for any passthrough functionality + bool fb_triangle_mesh_ext = false; // only use for projected passthrough + + XrPassthroughCreateInfoFB passthrough_create_info = { + XR_TYPE_PASSTHROUGH_CREATE_INFO_FB, + nullptr, + 0, + }; + XrPassthroughFB passthrough_handle = XR_NULL_HANDLE; + + XrPassthroughLayerCreateInfoFB passthrough_layer_config = { + XR_TYPE_PASSTHROUGH_LAYER_CREATE_INFO_FB, + nullptr, + passthrough_handle, + XR_PASSTHROUGH_IS_RUNNING_AT_CREATION_BIT_FB, + XR_PASSTHROUGH_LAYER_PURPOSE_RECONSTRUCTION_FB, + }; + XrPassthroughStyleFB passthrough_layer_style = { + XR_TYPE_PASSTHROUGH_STYLE_FB, + nullptr, + 1, + { 0, 0, 0, 0 }, + }; + XrPassthroughLayerFB passthrough_layer = XR_NULL_HANDLE; + + XrCompositionLayerPassthroughFB composition_passthrough_layer = { + XR_TYPE_COMPOSITION_LAYER_PASSTHROUGH_FB, + nullptr, + XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT, + XR_NULL_HANDLE, + XR_NULL_HANDLE, + }; +}; + +#endif // OPENXR_FB_PASSTHROUGH_EXTENSION_WRAPPER_H diff --git a/modules/openxr/extensions/openxr_hand_tracking_extension.cpp b/modules/openxr/extensions/openxr_hand_tracking_extension.cpp new file mode 100644 index 0000000000..4b30965ce5 --- /dev/null +++ b/modules/openxr/extensions/openxr_hand_tracking_extension.cpp @@ -0,0 +1,268 @@ +/*************************************************************************/ +/* openxr_hand_tracking_extension.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* 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 "openxr_hand_tracking_extension.h" +#include "../openxr_api.h" +#include "core/string/print_string.h" +#include "servers/xr_server.h" + +#include <openxr/openxr.h> + +OpenXRHandTrackingExtension *OpenXRHandTrackingExtension::singleton = nullptr; + +OpenXRHandTrackingExtension *OpenXRHandTrackingExtension::get_singleton() { + return singleton; +} + +OpenXRHandTrackingExtension::OpenXRHandTrackingExtension(OpenXRAPI *p_openxr_api) : + OpenXRExtensionWrapper(p_openxr_api) { + singleton = this; + + // Extensions we use for our hand tracking. + request_extensions[XR_EXT_HAND_TRACKING_EXTENSION_NAME] = &hand_tracking_ext; + request_extensions[XR_EXT_HAND_JOINTS_MOTION_RANGE_EXTENSION_NAME] = &hand_motion_range_ext; + request_extensions[XR_FB_HAND_TRACKING_AIM_EXTENSION_NAME] = &hand_tracking_aim_state_ext; + + // Make sure this is cleared until we actually request it + handTrackingSystemProperties.supportsHandTracking = false; +} + +OpenXRHandTrackingExtension::~OpenXRHandTrackingExtension() { + singleton = nullptr; +} + +void OpenXRHandTrackingExtension::on_instance_created(const XrInstance p_instance) { + if (hand_tracking_ext) { + EXT_INIT_XR_FUNC(xrCreateHandTrackerEXT); + EXT_INIT_XR_FUNC(xrDestroyHandTrackerEXT); + EXT_INIT_XR_FUNC(xrLocateHandJointsEXT); + + hand_tracking_ext = xrCreateHandTrackerEXT_ptr && xrDestroyHandTrackerEXT_ptr && xrLocateHandJointsEXT_ptr; + } +} + +void OpenXRHandTrackingExtension::on_session_destroyed() { + cleanup_hand_tracking(); +} + +void OpenXRHandTrackingExtension::on_instance_destroyed() { + xrCreateHandTrackerEXT_ptr = nullptr; + xrDestroyHandTrackerEXT_ptr = nullptr; + xrLocateHandJointsEXT_ptr = nullptr; +} + +void *OpenXRHandTrackingExtension::set_system_properties_and_get_next_pointer(void *p_next_pointer) { + if (!hand_tracking_ext) { + // not supported... + return p_next_pointer; + } + + handTrackingSystemProperties = { + XR_TYPE_SYSTEM_HAND_TRACKING_PROPERTIES_EXT, // type + p_next_pointer, // next + false, // supportsHandTracking + }; + + return &handTrackingSystemProperties; +} + +void OpenXRHandTrackingExtension::on_state_ready() { + if (!handTrackingSystemProperties.supportsHandTracking) { + // not supported... + return; + } + + // Setup our hands and reset data + for (int i = 0; i < MAX_OPENXR_TRACKED_HANDS; i++) { + // we'll do this later + hand_trackers[i].is_initialised = false; + hand_trackers[i].hand_tracker = XR_NULL_HANDLE; + + hand_trackers[i].aimState.aimPose = { { 0.0, 0.0, 0.0, 0.0 }, { 0.0, 0.0, 0.0 } }; + hand_trackers[i].aimState.pinchStrengthIndex = 0.0; + hand_trackers[i].aimState.pinchStrengthMiddle = 0.0; + hand_trackers[i].aimState.pinchStrengthRing = 0.0; + hand_trackers[i].aimState.pinchStrengthLittle = 0.0; + + hand_trackers[i].locations.isActive = false; + + for (int j = 0; j < XR_HAND_JOINT_COUNT_EXT; j++) { + hand_trackers[i].joint_locations[j] = { 0, { { 0.0, 0.0, 0.0, 0.0 }, { 0.0, 0.0, 0.0 } }, 0.0 }; + hand_trackers[i].joint_velocities[j] = { 0, { 0.0, 0.0, 0.0 }, { 0.0, 0.0, 0.0 } }; + } + } +} + +void OpenXRHandTrackingExtension::on_process() { + if (!handTrackingSystemProperties.supportsHandTracking) { + // not supported... + return; + } + + // process our hands + const XrTime time = openxr_api->get_next_frame_time(); // This data will be used for the next frame we render + + XrResult result; + + for (int i = 0; i < MAX_OPENXR_TRACKED_HANDS; i++) { + if (hand_trackers[i].hand_tracker == XR_NULL_HANDLE) { + XrHandTrackerCreateInfoEXT createInfo = { + XR_TYPE_HAND_TRACKER_CREATE_INFO_EXT, // type + nullptr, // next + i == 0 ? XR_HAND_LEFT_EXT : XR_HAND_RIGHT_EXT, // hand + XR_HAND_JOINT_SET_DEFAULT_EXT, // handJointSet + }; + + result = xrCreateHandTrackerEXT(openxr_api->get_session(), &createInfo, &hand_trackers[i].hand_tracker); + if (XR_FAILED(result)) { + // not successful? then we do nothing. + print_line("OpenXR: Failed to obtain hand tracking information [", openxr_api->get_error_string(result), "]"); + hand_trackers[i].is_initialised = false; + } else { + void *next_pointer = nullptr; + if (hand_tracking_aim_state_ext) { + hand_trackers[i].aimState.type = XR_TYPE_HAND_TRACKING_AIM_STATE_FB; + hand_trackers[i].aimState.next = next_pointer; + hand_trackers[i].aimState.status = 0; + hand_trackers[i].aimState.aimPose = { { 0.0, 0.0, 0.0, 0.0 }, { 0.0, 0.0, 0.0 } }; + hand_trackers[i].aimState.pinchStrengthIndex = 0.0; + hand_trackers[i].aimState.pinchStrengthMiddle = 0.0; + hand_trackers[i].aimState.pinchStrengthRing = 0.0; + hand_trackers[i].aimState.pinchStrengthLittle = 0.0; + + next_pointer = &hand_trackers[i].aimState; + } + + hand_trackers[i].velocities.type = XR_TYPE_HAND_JOINT_VELOCITIES_EXT; + hand_trackers[i].velocities.next = next_pointer; + hand_trackers[i].velocities.jointCount = XR_HAND_JOINT_COUNT_EXT; + hand_trackers[i].velocities.jointVelocities = hand_trackers[i].joint_velocities; + next_pointer = &hand_trackers[i].velocities; + + hand_trackers[i].locations.type = XR_TYPE_HAND_JOINT_LOCATIONS_EXT; + hand_trackers[i].locations.next = next_pointer; + hand_trackers[i].locations.isActive = false; + hand_trackers[i].locations.jointCount = XR_HAND_JOINT_COUNT_EXT; + hand_trackers[i].locations.jointLocations = hand_trackers[i].joint_locations; + + hand_trackers[i].is_initialised = true; + } + } + + if (hand_trackers[i].is_initialised) { + void *next_pointer = nullptr; + + XrHandJointsMotionRangeInfoEXT motionRangeInfo; + + if (hand_motion_range_ext) { + motionRangeInfo.type = XR_TYPE_HAND_JOINTS_MOTION_RANGE_INFO_EXT; + motionRangeInfo.next = next_pointer; + motionRangeInfo.handJointsMotionRange = hand_trackers[i].motion_range; + + next_pointer = &motionRangeInfo; + } + + XrHandJointsLocateInfoEXT locateInfo = { + XR_TYPE_HAND_JOINTS_LOCATE_INFO_EXT, // type + next_pointer, // next + openxr_api->get_play_space(), // baseSpace + time, // time + }; + + result = xrLocateHandJointsEXT(hand_trackers[i].hand_tracker, &locateInfo, &hand_trackers[i].locations); + if (XR_FAILED(result)) { + // not successful? then we do nothing. + print_line("OpenXR: Failed to get tracking for hand", i, "[", openxr_api->get_error_string(result), "]"); + continue; + } + + // For some reason an inactive controller isn't coming back as inactive but has coordinates either as NAN or very large + const XrPosef &palm = hand_trackers[i].joint_locations[XR_HAND_JOINT_PALM_EXT].pose; + if ( + !hand_trackers[i].locations.isActive || isnan(palm.position.x) || palm.position.x < -1000000.00 || palm.position.x > 1000000.00) { + hand_trackers[i].locations.isActive = false; // workaround, make sure its inactive + } + + /* TODO change this to managing the controller from openxr_interface + if (hand_tracking_aim_state_ext && hand_trackers[i].locations.isActive && check_bit(XR_HAND_TRACKING_AIM_VALID_BIT_FB, hand_trackers[i].aimState.status)) { + // Controllers are updated based on the aim state's pose and pinches' strength + if (hand_trackers[i].aim_state_godot_controller == -1) { + hand_trackers[i].aim_state_godot_controller = + arvr_api->godot_arvr_add_controller( + const_cast<char *>(hand_controller_names[i]), + i + HAND_CONTROLLER_ID_OFFSET, + true, + true); + } + } + */ + } + } +} + +void OpenXRHandTrackingExtension::on_state_stopping() { + // cleanup + cleanup_hand_tracking(); +} + +void OpenXRHandTrackingExtension::cleanup_hand_tracking() { + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL(xr_server); + + for (int i = 0; i < MAX_OPENXR_TRACKED_HANDS; i++) { + if (hand_trackers[i].hand_tracker != XR_NULL_HANDLE) { + xrDestroyHandTrackerEXT(hand_trackers[i].hand_tracker); + + hand_trackers[i].is_initialised = false; + hand_trackers[i].hand_tracker = XR_NULL_HANDLE; + } + } +} + +bool OpenXRHandTrackingExtension::get_active() { + return handTrackingSystemProperties.supportsHandTracking; +} + +const OpenXRHandTrackingExtension::HandTracker *OpenXRHandTrackingExtension::get_hand_tracker(uint32_t p_hand) const { + ERR_FAIL_UNSIGNED_INDEX_V(p_hand, MAX_OPENXR_TRACKED_HANDS, nullptr); + + return &hand_trackers[p_hand]; +} + +XrHandJointsMotionRangeEXT OpenXRHandTrackingExtension::get_motion_range(uint32_t p_hand) const { + ERR_FAIL_UNSIGNED_INDEX_V(p_hand, MAX_OPENXR_TRACKED_HANDS, XR_HAND_JOINTS_MOTION_RANGE_MAX_ENUM_EXT); + + return hand_trackers[p_hand].motion_range; +} + +void OpenXRHandTrackingExtension::set_motion_range(uint32_t p_hand, XrHandJointsMotionRangeEXT p_motion_range) { + ERR_FAIL_UNSIGNED_INDEX(p_hand, MAX_OPENXR_TRACKED_HANDS); + hand_trackers[p_hand].motion_range = p_motion_range; +} diff --git a/modules/openxr/extensions/openxr_hand_tracking_extension.h b/modules/openxr/extensions/openxr_hand_tracking_extension.h new file mode 100644 index 0000000000..f8c26339b0 --- /dev/null +++ b/modules/openxr/extensions/openxr_hand_tracking_extension.h @@ -0,0 +1,96 @@ +/*************************************************************************/ +/* openxr_hand_tracking_extension.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* 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 OPENXR_HAND_TRACKING_EXTENSION_H +#define OPENXR_HAND_TRACKING_EXTENSION_H + +#include "openxr_extension_wrapper.h" + +#include "../util.h" + +#define MAX_OPENXR_TRACKED_HANDS 2 + +class OpenXRHandTrackingExtension : public OpenXRExtensionWrapper { +public: + struct HandTracker { + bool is_initialised = false; + XrHandJointsMotionRangeEXT motion_range = XR_HAND_JOINTS_MOTION_RANGE_UNOBSTRUCTED_EXT; + + XrHandTrackerEXT hand_tracker = XR_NULL_HANDLE; + XrHandJointLocationEXT joint_locations[XR_HAND_JOINT_COUNT_EXT]; + XrHandJointVelocityEXT joint_velocities[XR_HAND_JOINT_COUNT_EXT]; + + XrHandTrackingAimStateFB aimState; + XrHandJointVelocitiesEXT velocities; + XrHandJointLocationsEXT locations; + }; + + static OpenXRHandTrackingExtension *get_singleton(); + + OpenXRHandTrackingExtension(OpenXRAPI *p_openxr_api); + virtual ~OpenXRHandTrackingExtension() override; + + virtual void on_instance_created(const XrInstance p_instance) override; + virtual void on_instance_destroyed() override; + virtual void on_session_destroyed() override; + + virtual void *set_system_properties_and_get_next_pointer(void *p_next_pointer) override; + virtual void on_state_ready() override; + virtual void on_process() override; + virtual void on_state_stopping() override; + + bool get_active(); + const HandTracker *get_hand_tracker(uint32_t p_hand) const; + + XrHandJointsMotionRangeEXT get_motion_range(uint32_t p_hand) const; + void set_motion_range(uint32_t p_hand, XrHandJointsMotionRangeEXT p_motion_range); + +private: + static OpenXRHandTrackingExtension *singleton; + + // state + XrSystemHandTrackingPropertiesEXT handTrackingSystemProperties; + HandTracker hand_trackers[MAX_OPENXR_TRACKED_HANDS]; // Fixed for left and right hand + + // related extensions + bool hand_tracking_ext = false; + bool hand_motion_range_ext = false; + bool hand_tracking_aim_state_ext = false; + + // functions + void cleanup_hand_tracking(); + + // OpenXR API call wrappers + EXT_PROTO_XRRESULT_FUNC3(xrCreateHandTrackerEXT, (XrSession), p_session, (const XrHandTrackerCreateInfoEXT *), p_createInfo, (XrHandTrackerEXT *), p_handTracker) + EXT_PROTO_XRRESULT_FUNC1(xrDestroyHandTrackerEXT, (XrHandTrackerEXT), p_handTracker) + EXT_PROTO_XRRESULT_FUNC3(xrLocateHandJointsEXT, (XrHandTrackerEXT), p_handTracker, (const XrHandJointsLocateInfoEXT *), p_locateInfo, (XrHandJointLocationsEXT *), p_locations) +}; + +#endif // OPENXR_HAND_TRACKING_EXTENSION_H diff --git a/modules/openxr/extensions/openxr_htc_vive_tracker_extension.cpp b/modules/openxr/extensions/openxr_htc_vive_tracker_extension.cpp index 302acf4e30..88cc7c061c 100644 --- a/modules/openxr/extensions/openxr_htc_vive_tracker_extension.cpp +++ b/modules/openxr/extensions/openxr_htc_vive_tracker_extension.cpp @@ -65,3 +65,12 @@ bool OpenXRHTCViveTrackerExtension::on_event_polled(const XrEventDataBuffer &eve } break; } } + +bool OpenXRHTCViveTrackerExtension::is_path_supported(const String &p_path) { + if (p_path == "/interaction_profiles/htc/vive_tracker_htcx") { + return available; + } + + // Not a path under this extensions control, so we return true; + return true; +} diff --git a/modules/openxr/extensions/openxr_htc_vive_tracker_extension.h b/modules/openxr/extensions/openxr_htc_vive_tracker_extension.h index 7f37351f27..ab8e8535f1 100644 --- a/modules/openxr/extensions/openxr_htc_vive_tracker_extension.h +++ b/modules/openxr/extensions/openxr_htc_vive_tracker_extension.h @@ -41,7 +41,9 @@ public: virtual ~OpenXRHTCViveTrackerExtension() override; bool is_available(); + virtual bool on_event_polled(const XrEventDataBuffer &event) override; + virtual bool is_path_supported(const String &p_path) override; private: static OpenXRHTCViveTrackerExtension *singleton; diff --git a/modules/openxr/extensions/openxr_palm_pose_extension.cpp b/modules/openxr/extensions/openxr_palm_pose_extension.cpp new file mode 100644 index 0000000000..fd3b8f50fe --- /dev/null +++ b/modules/openxr/extensions/openxr_palm_pose_extension.cpp @@ -0,0 +1,66 @@ +/*************************************************************************/ +/* openxr_palm_pose_extension.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* 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 "openxr_palm_pose_extension.h" +#include "core/string/print_string.h" + +OpenXRPalmPoseExtension *OpenXRPalmPoseExtension::singleton = nullptr; + +OpenXRPalmPoseExtension *OpenXRPalmPoseExtension::get_singleton() { + return singleton; +} + +OpenXRPalmPoseExtension::OpenXRPalmPoseExtension(OpenXRAPI *p_openxr_api) : + OpenXRExtensionWrapper(p_openxr_api) { + singleton = this; + + request_extensions[XR_EXT_PALM_POSE_EXTENSION_NAME] = &available; +} + +OpenXRPalmPoseExtension::~OpenXRPalmPoseExtension() { + singleton = nullptr; +} + +bool OpenXRPalmPoseExtension::is_available() { + return available; +} + +bool OpenXRPalmPoseExtension::is_path_supported(const String &p_path) { + if (p_path == "/user/hand/left/input/palm_ext/pose") { + return available; + } + + if (p_path == "/user/hand/right/input/palm_ext/pose") { + return available; + } + + // Not a path under this extensions control, so we return true; + return true; +} diff --git a/modules/openxr/extensions/openxr_palm_pose_extension.h b/modules/openxr/extensions/openxr_palm_pose_extension.h new file mode 100644 index 0000000000..a7ef83c5d5 --- /dev/null +++ b/modules/openxr/extensions/openxr_palm_pose_extension.h @@ -0,0 +1,53 @@ +/*************************************************************************/ +/* openxr_palm_pose_extension.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* 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 OPENXR_PALM_POSE_EXTENSION_H +#define OPENXR_PALM_POSE_EXTENSION_H + +#include "openxr_extension_wrapper.h" + +class OpenXRPalmPoseExtension : public OpenXRExtensionWrapper { +public: + static OpenXRPalmPoseExtension *get_singleton(); + + OpenXRPalmPoseExtension(OpenXRAPI *p_openxr_api); + virtual ~OpenXRPalmPoseExtension() override; + + bool is_available(); + + virtual bool is_path_supported(const String &p_path) override; + +private: + static OpenXRPalmPoseExtension *singleton; + + bool available = false; +}; + +#endif // OPENXR_PALM_POSE_EXTENSION_H diff --git a/modules/openxr/extensions/openxr_vulkan_extension.cpp b/modules/openxr/extensions/openxr_vulkan_extension.cpp index 2608c4ac17..f9e771c934 100644 --- a/modules/openxr/extensions/openxr_vulkan_extension.cpp +++ b/modules/openxr/extensions/openxr_vulkan_extension.cpp @@ -31,30 +31,12 @@ #include "core/string/print_string.h" #include "../extensions/openxr_vulkan_extension.h" -#include "../openxr_api.h" #include "../openxr_util.h" #include "servers/rendering/renderer_rd/effects/copy_effects.h" #include "servers/rendering/renderer_rd/storage_rd/texture_storage.h" #include "servers/rendering/rendering_server_globals.h" #include "servers/rendering_server.h" -// need to include Vulkan so we know of type definitions -#define XR_USE_GRAPHICS_API_VULKAN - -#ifdef WINDOWS_ENABLED -// Including windows.h here is absolutely evil, we shouldn't be doing this outside of platform -// however due to the way the openxr headers are put together, we have no choice. -#include <windows.h> -#endif - -// include platform dependent structs -#include <openxr/openxr_platform.h> - -PFN_xrGetVulkanGraphicsRequirements2KHR xrGetVulkanGraphicsRequirements2KHR_ptr = nullptr; -PFN_xrCreateVulkanInstanceKHR xrCreateVulkanInstanceKHR_ptr = nullptr; -PFN_xrGetVulkanGraphicsDevice2KHR xrGetVulkanGraphicsDevice2KHR_ptr = nullptr; -PFN_xrCreateVulkanDeviceKHR xrCreateVulkanDeviceKHR_ptr = nullptr; - OpenXRVulkanExtension::OpenXRVulkanExtension(OpenXRAPI *p_openxr_api) : OpenXRGraphicsExtensionWrapper(p_openxr_api) { VulkanContext::set_vulkan_hooks(this); @@ -69,36 +51,15 @@ OpenXRVulkanExtension::~OpenXRVulkanExtension() { } void OpenXRVulkanExtension::on_instance_created(const XrInstance p_instance) { - XrResult result; - ERR_FAIL_NULL(openxr_api); // Obtain pointers to functions we're accessing here, they are (not yet) part of core. - result = xrGetInstanceProcAddr(p_instance, "xrGetVulkanGraphicsRequirements2KHR", (PFN_xrVoidFunction *)&xrGetVulkanGraphicsRequirements2KHR_ptr); - if (XR_FAILED(result)) { - print_line("OpenXR: Failed to xrGetVulkanGraphicsRequirements2KHR entry point [", openxr_api->get_error_string(result), "]"); - } - result = xrGetInstanceProcAddr(p_instance, "xrCreateVulkanInstanceKHR", (PFN_xrVoidFunction *)&xrCreateVulkanInstanceKHR_ptr); - if (XR_FAILED(result)) { - print_line("OpenXR: Failed to xrCreateVulkanInstanceKHR entry point [", openxr_api->get_error_string(result), "]"); - } - - result = xrGetInstanceProcAddr(p_instance, "xrGetVulkanGraphicsDevice2KHR", (PFN_xrVoidFunction *)&xrGetVulkanGraphicsDevice2KHR_ptr); - if (XR_FAILED(result)) { - print_line("OpenXR: Failed to xrGetVulkanGraphicsDevice2KHR entry point [", openxr_api->get_error_string(result), "]"); - } - - result = xrGetInstanceProcAddr(p_instance, "xrCreateVulkanDeviceKHR", (PFN_xrVoidFunction *)&xrCreateVulkanDeviceKHR_ptr); - if (XR_FAILED(result)) { - print_line("OpenXR: Failed to xrCreateVulkanDeviceKHR entry point [", openxr_api->get_error_string(result), "]"); - } -} - -XrResult OpenXRVulkanExtension::xrGetVulkanGraphicsRequirements2KHR(XrInstance p_instance, XrSystemId p_system_id, XrGraphicsRequirementsVulkanKHR *p_graphics_requirements) { - ERR_FAIL_NULL_V(xrGetVulkanGraphicsRequirements2KHR_ptr, XR_ERROR_HANDLE_INVALID); - - return (*xrGetVulkanGraphicsRequirements2KHR_ptr)(p_instance, p_system_id, p_graphics_requirements); + EXT_INIT_XR_FUNC(xrGetVulkanGraphicsRequirements2KHR); + EXT_INIT_XR_FUNC(xrCreateVulkanInstanceKHR); + EXT_INIT_XR_FUNC(xrGetVulkanGraphicsDevice2KHR); + EXT_INIT_XR_FUNC(xrCreateVulkanDeviceKHR); + EXT_INIT_XR_FUNC(xrEnumerateSwapchainImages); } bool OpenXRVulkanExtension::check_graphics_api_support(XrVersion p_desired_version) { @@ -141,12 +102,6 @@ bool OpenXRVulkanExtension::check_graphics_api_support(XrVersion p_desired_versi return true; } -XrResult OpenXRVulkanExtension::xrCreateVulkanInstanceKHR(XrInstance p_instance, const XrVulkanInstanceCreateInfoKHR *p_create_info, VkInstance *r_vulkan_instance, VkResult *r_vulkan_result) { - ERR_FAIL_NULL_V(xrCreateVulkanInstanceKHR_ptr, XR_ERROR_HANDLE_INVALID); - - return (*xrCreateVulkanInstanceKHR_ptr)(p_instance, p_create_info, r_vulkan_instance, r_vulkan_result); -} - bool OpenXRVulkanExtension::create_vulkan_instance(const VkInstanceCreateInfo *p_vulkan_create_info, VkInstance *r_instance) { // get the vulkan version we are creating uint32_t vulkan_version = p_vulkan_create_info->pApplicationInfo->apiVersion; @@ -195,12 +150,6 @@ bool OpenXRVulkanExtension::create_vulkan_instance(const VkInstanceCreateInfo *p return true; } -XrResult OpenXRVulkanExtension::xrGetVulkanGraphicsDevice2KHR(XrInstance p_instance, const XrVulkanGraphicsDeviceGetInfoKHR *p_get_info, VkPhysicalDevice *r_vulkan_physical_device) { - ERR_FAIL_NULL_V(xrGetVulkanGraphicsDevice2KHR_ptr, XR_ERROR_HANDLE_INVALID); - - return (*xrGetVulkanGraphicsDevice2KHR_ptr)(p_instance, p_get_info, r_vulkan_physical_device); -} - bool OpenXRVulkanExtension::get_physical_device(VkPhysicalDevice *r_device) { ERR_FAIL_NULL_V(openxr_api, false); @@ -222,12 +171,6 @@ bool OpenXRVulkanExtension::get_physical_device(VkPhysicalDevice *r_device) { return true; } -XrResult OpenXRVulkanExtension::xrCreateVulkanDeviceKHR(XrInstance p_instance, const XrVulkanDeviceCreateInfoKHR *p_create_info, VkDevice *r_device, VkResult *r_result) { - ERR_FAIL_NULL_V(xrCreateVulkanDeviceKHR_ptr, XR_ERROR_HANDLE_INVALID); - - return (*xrCreateVulkanDeviceKHR_ptr)(p_instance, p_create_info, r_device, r_result); -} - bool OpenXRVulkanExtension::create_vulkan_device(const VkDeviceCreateInfo *p_device_create_info, VkDevice *r_device) { ERR_FAIL_NULL_V(openxr_api, false); diff --git a/modules/openxr/extensions/openxr_vulkan_extension.h b/modules/openxr/extensions/openxr_vulkan_extension.h index 5dddc4b9c9..d6e9917900 100644 --- a/modules/openxr/extensions/openxr_vulkan_extension.h +++ b/modules/openxr/extensions/openxr_vulkan_extension.h @@ -36,16 +36,25 @@ #include "drivers/vulkan/vulkan_context.h" -// Forward declare these so we don't need OpenXR headers where-ever this is included -// Including OpenXR at this point gives loads and loads of compile issues especially -// on Windows because windows.h is EVIL and really shouldn't be included outside of platform -// but we really don't have a choice in the matter +#include "../openxr_api.h" +#include "../util.h" -struct XrGraphicsRequirementsVulkanKHR; -struct XrVulkanInstanceCreateInfoKHR; -struct XrVulkanGraphicsDeviceGetInfoKHR; -struct XrVulkanDeviceCreateInfoKHR; -struct XrGraphicsBindingVulkanKHR; +// need to include Vulkan so we know of type definitions +#define XR_USE_GRAPHICS_API_VULKAN + +#ifdef WINDOWS_ENABLED +// Including windows.h here is absolutely evil, we shouldn't be doing this outside of platform +// however due to the way the openxr headers are put together, we have no choice. +#include <windows.h> +#endif + +#ifdef ANDROID_ENABLED +// The jobject type from jni.h is used by openxr_platform.h on Android. +#include <jni.h> +#endif + +// include platform dependent structs +#include <openxr/openxr_platform.h> class OpenXRVulkanExtension : public OpenXRGraphicsExtensionWrapper, VulkanHooks { public: @@ -84,10 +93,11 @@ private: uint32_t vulkan_queue_family_index = 0; uint32_t vulkan_queue_index = 0; - XrResult xrGetVulkanGraphicsRequirements2KHR(XrInstance p_instance, XrSystemId p_system_id, XrGraphicsRequirementsVulkanKHR *p_graphics_requirements); - XrResult xrCreateVulkanInstanceKHR(XrInstance p_instance, const XrVulkanInstanceCreateInfoKHR *p_create_info, VkInstance *r_vulkan_instance, VkResult *r_vulkan_result); - XrResult xrGetVulkanGraphicsDevice2KHR(XrInstance p_instance, const XrVulkanGraphicsDeviceGetInfoKHR *p_get_info, VkPhysicalDevice *r_vulkan_physical_device); - XrResult xrCreateVulkanDeviceKHR(XrInstance p_instance, const XrVulkanDeviceCreateInfoKHR *p_create_info, VkDevice *r_device, VkResult *r_result); + EXT_PROTO_XRRESULT_FUNC3(xrGetVulkanGraphicsRequirements2KHR, (XrInstance), p_instance, (XrSystemId), p_system_id, (XrGraphicsRequirementsVulkanKHR *), p_graphics_requirements) + EXT_PROTO_XRRESULT_FUNC4(xrCreateVulkanInstanceKHR, (XrInstance), p_instance, (const XrVulkanInstanceCreateInfoKHR *), p_create_info, (VkInstance *), r_vulkan_instance, (VkResult *), r_vulkan_result) + EXT_PROTO_XRRESULT_FUNC3(xrGetVulkanGraphicsDevice2KHR, (XrInstance), p_instance, (const XrVulkanGraphicsDeviceGetInfoKHR *), p_get_info, (VkPhysicalDevice *), r_vulkan_physical_device) + EXT_PROTO_XRRESULT_FUNC4(xrCreateVulkanDeviceKHR, (XrInstance), p_instance, (const XrVulkanDeviceCreateInfoKHR *), p_create_info, (VkDevice *), r_device, (VkResult *), r_result) + EXT_PROTO_XRRESULT_FUNC4(xrEnumerateSwapchainImages, (XrSwapchain), p_swapchain, (uint32_t), p_image_capacity_input, (uint32_t *), p_image_count_output, (XrSwapchainImageBaseHeader *), p_images) }; #endif // OPENXR_VULKAN_EXTENSION_H diff --git a/modules/openxr/openxr_api.cpp b/modules/openxr/openxr_api.cpp index 92d074cb75..16879ac4e5 100644 --- a/modules/openxr/openxr_api.cpp +++ b/modules/openxr/openxr_api.cpp @@ -41,6 +41,7 @@ #endif #ifdef ANDROID_ENABLED +#define OPENXR_LOADER_NAME "libopenxr_loader.so" #include "extensions/openxr_android_extension.h" #endif @@ -48,7 +49,10 @@ #include "extensions/openxr_vulkan_extension.h" #endif +#include "extensions/openxr_fb_passthrough_extension_wrapper.h" +#include "extensions/openxr_hand_tracking_extension.h" #include "extensions/openxr_htc_vive_tracker_extension.h" +#include "extensions/openxr_palm_pose_extension.h" #include "modules/openxr/openxr_interface.h" @@ -184,6 +188,20 @@ bool OpenXRAPI::is_extension_supported(const String &p_extension) const { return false; } +bool OpenXRAPI::is_path_supported(const String &p_path) { + // This checks with extensions whether a path is *unsupported* and returns false if this is so. + // This allows us to filter out paths that are only available if related extensions are supported. + // WARNING: This method will return true for unknown/mistyped paths as we have no way to validate those. + + for (OpenXRExtensionWrapper *wrapper : registered_extension_wrappers) { + if (!wrapper->is_path_supported(p_path)) { + return false; + } + } + + return true; +} + void OpenXRAPI::copy_string_to_char_buffer(const String p_string, char *p_buffer, int p_buffer_len) { CharString char_string = p_string.utf8(); int len = char_string.length(); @@ -284,6 +302,9 @@ bool OpenXRAPI::create_instance() { 0, // runtimeVersion, from here will be set by our get call "" // runtimeName }; + + OPENXR_API_INIT_XR_FUNC_V(xrGetInstanceProperties); + result = xrGetInstanceProperties(instance, &instanceProps); if (XR_FAILED(result)) { // not fatal probably @@ -992,9 +1013,94 @@ bool OpenXRAPI::is_running() { return running; } +bool OpenXRAPI::openxr_loader_init() { +#ifdef ANDROID_ENABLED + ERR_FAIL_COND_V_MSG(openxr_loader_library_handle != nullptr, false, "OpenXR Loader library is already loaded."); + + { + Error error_code = OS::get_singleton()->open_dynamic_library(OPENXR_LOADER_NAME, openxr_loader_library_handle); + ERR_FAIL_COND_V_MSG(error_code != OK, false, "OpenXR loader not found."); + } + + { + Error error_code = OS::get_singleton()->get_dynamic_library_symbol_handle(openxr_loader_library_handle, "xrGetInstanceProcAddr", (void *&)xrGetInstanceProcAddr); + ERR_FAIL_COND_V_MSG(error_code != OK, false, "Symbol xrGetInstanceProcAddr not found in OpenXR Loader library."); + } +#endif + + // Resolve the symbols that don't require an instance + OPENXR_API_INIT_XR_FUNC_V(xrCreateInstance); + OPENXR_API_INIT_XR_FUNC_V(xrEnumerateApiLayerProperties); + OPENXR_API_INIT_XR_FUNC_V(xrEnumerateInstanceExtensionProperties); + + return true; +} + +bool OpenXRAPI::resolve_instance_openxr_symbols() { + ERR_FAIL_COND_V(instance == XR_NULL_HANDLE, false); + + OPENXR_API_INIT_XR_FUNC_V(xrAcquireSwapchainImage); + OPENXR_API_INIT_XR_FUNC_V(xrApplyHapticFeedback); + OPENXR_API_INIT_XR_FUNC_V(xrAttachSessionActionSets); + OPENXR_API_INIT_XR_FUNC_V(xrBeginFrame); + OPENXR_API_INIT_XR_FUNC_V(xrBeginSession); + OPENXR_API_INIT_XR_FUNC_V(xrCreateAction); + OPENXR_API_INIT_XR_FUNC_V(xrCreateActionSet); + OPENXR_API_INIT_XR_FUNC_V(xrCreateActionSpace); + OPENXR_API_INIT_XR_FUNC_V(xrCreateReferenceSpace); + OPENXR_API_INIT_XR_FUNC_V(xrCreateSession); + OPENXR_API_INIT_XR_FUNC_V(xrCreateSwapchain); + OPENXR_API_INIT_XR_FUNC_V(xrDestroyAction); + OPENXR_API_INIT_XR_FUNC_V(xrDestroyActionSet); + OPENXR_API_INIT_XR_FUNC_V(xrDestroyInstance); + OPENXR_API_INIT_XR_FUNC_V(xrDestroySession); + OPENXR_API_INIT_XR_FUNC_V(xrDestroySpace); + OPENXR_API_INIT_XR_FUNC_V(xrDestroySwapchain); + OPENXR_API_INIT_XR_FUNC_V(xrEndFrame); + OPENXR_API_INIT_XR_FUNC_V(xrEndSession); + OPENXR_API_INIT_XR_FUNC_V(xrEnumerateReferenceSpaces); + OPENXR_API_INIT_XR_FUNC_V(xrEnumerateSwapchainFormats); + OPENXR_API_INIT_XR_FUNC_V(xrEnumerateViewConfigurations); + OPENXR_API_INIT_XR_FUNC_V(xrEnumerateViewConfigurationViews); + OPENXR_API_INIT_XR_FUNC_V(xrGetActionStateBoolean); + OPENXR_API_INIT_XR_FUNC_V(xrGetActionStateFloat); + OPENXR_API_INIT_XR_FUNC_V(xrGetActionStateVector2f); + OPENXR_API_INIT_XR_FUNC_V(xrGetCurrentInteractionProfile); + OPENXR_API_INIT_XR_FUNC_V(xrGetSystem); + OPENXR_API_INIT_XR_FUNC_V(xrGetSystemProperties); + OPENXR_API_INIT_XR_FUNC_V(xrLocateViews); + OPENXR_API_INIT_XR_FUNC_V(xrLocateSpace); + OPENXR_API_INIT_XR_FUNC_V(xrPathToString); + OPENXR_API_INIT_XR_FUNC_V(xrPollEvent); + OPENXR_API_INIT_XR_FUNC_V(xrReleaseSwapchainImage); + OPENXR_API_INIT_XR_FUNC_V(xrResultToString); + OPENXR_API_INIT_XR_FUNC_V(xrStringToPath); + OPENXR_API_INIT_XR_FUNC_V(xrSuggestInteractionProfileBindings); + OPENXR_API_INIT_XR_FUNC_V(xrSyncActions); + OPENXR_API_INIT_XR_FUNC_V(xrWaitFrame); + OPENXR_API_INIT_XR_FUNC_V(xrWaitSwapchainImage); + + return true; +} + +XrResult OpenXRAPI::get_instance_proc_addr(const char *p_name, PFN_xrVoidFunction *p_addr) { + XrResult result = xrGetInstanceProcAddr(instance, p_name, p_addr); + + if (result != XR_SUCCESS) { + String error_message = String("Symbol ") + p_name + " not found in OpenXR instance."; + ERR_FAIL_COND_V_MSG(true, result, error_message.utf8().get_data()); + } + + return result; +} + bool OpenXRAPI::initialize(const String &p_rendering_driver) { ERR_FAIL_COND_V_MSG(instance != XR_NULL_HANDLE, false, "OpenXR instance was already created"); + if (!openxr_loader_init()) { + return false; + } + if (p_rendering_driver == "vulkan") { #ifdef VULKAN_ENABLED graphics_extension = memnew(OpenXRVulkanExtension(this)); @@ -1017,6 +1123,10 @@ bool OpenXRAPI::initialize(const String &p_rendering_driver) { } // initialize + for (OpenXRExtensionWrapper *wrapper : registered_extension_wrappers) { + wrapper->on_before_instance_created(); + } + if (!load_layer_properties()) { destroy_instance(); return false; @@ -1032,6 +1142,11 @@ bool OpenXRAPI::initialize(const String &p_rendering_driver) { return false; } + if (!resolve_instance_openxr_symbols()) { + destroy_instance(); + return false; + } + if (!get_system_info()) { destroy_instance(); return false; @@ -1382,6 +1497,10 @@ void OpenXRAPI::pre_render() { // 2) It will use the previous timing to pause our thread so that rendering starts as close to displaying as possible // This must thus be called as close to when we start rendering as possible XrFrameWaitInfo frame_wait_info = { XR_TYPE_FRAME_WAIT_INFO, nullptr }; + frame_state.predictedDisplayTime = 0; + frame_state.predictedDisplayPeriod = 0; + frame_state.shouldRender = false; + XrResult result = xrWaitFrame(session, &frame_wait_info, &frame_state); if (XR_FAILED(result)) { print_line("OpenXR: xrWaitFrame() was not successful [", get_error_string(result), "]"); @@ -1557,7 +1676,7 @@ void OpenXRAPI::end_frame() { XrCompositionLayerProjection projection_layer = { XR_TYPE_COMPOSITION_LAYER_PROJECTION, // type nullptr, // next - layers_list.size() > 1 ? XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT | XR_COMPOSITION_LAYER_CORRECT_CHROMATIC_ABERRATION_BIT : XR_COMPOSITION_LAYER_CORRECT_CHROMATIC_ABERRATION_BIT, // layerFlags + layers_list.size() > 0 ? XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT | XR_COMPOSITION_LAYER_CORRECT_CHROMATIC_ABERRATION_BIT : XR_COMPOSITION_LAYER_CORRECT_CHROMATIC_ABERRATION_BIT, // layerFlags play_space, // space view_count, // viewCount projection_views, // views @@ -1643,7 +1762,10 @@ OpenXRAPI::OpenXRAPI() { #endif // register our other extensions + register_extension_wrapper(memnew(OpenXRPalmPoseExtension(this))); register_extension_wrapper(memnew(OpenXRHTCViveTrackerExtension(this))); + register_extension_wrapper(memnew(OpenXRHandTrackingExtension(this))); + register_extension_wrapper(memnew(OpenXRFbPassthroughExtensionWrapper(this))); } OpenXRAPI::~OpenXRAPI() { @@ -1669,6 +1791,13 @@ OpenXRAPI::~OpenXRAPI() { layer_properties = nullptr; } +#ifdef ANDROID_ENABLED + if (openxr_loader_library_handle) { + OS::get_singleton()->close_dynamic_library(openxr_loader_library_handle); + openxr_loader_library_handle = nullptr; + } +#endif + singleton = nullptr; } @@ -1745,6 +1874,18 @@ void OpenXRAPI::parse_velocities(const XrSpaceVelocity &p_velocity, Vector3 &r_l } } +bool OpenXRAPI::xr_result(XrResult result, const char *format, Array args) const { + if (XR_SUCCEEDED(result)) + return true; + + char resultString[XR_MAX_RESULT_STRING_SIZE]; + xrResultToString(instance, result, resultString); + + print_error(String("OpenXR ") + String(format).format(args) + String(" [") + String(resultString) + String("]")); + + return false; +} + RID OpenXRAPI::get_tracker_rid(XrPath p_path) { List<RID> current; tracker_owner.get_owned_list(¤t); @@ -2063,6 +2204,11 @@ XrPath OpenXRAPI::get_interaction_profile_path(RID p_interaction_profile) { } RID OpenXRAPI::interaction_profile_create(const String p_name) { + if (!is_path_supported(p_name)) { + // The extension enabling this path must not be active, we will silently skip this interaction profile + return RID(); + } + InteractionProfile new_interaction_profile; XrResult result = xrStringToPath(instance, p_name.utf8().get_data(), &new_interaction_profile.path); @@ -2099,6 +2245,11 @@ void OpenXRAPI::interaction_profile_clear_bindings(RID p_interaction_profile) { } bool OpenXRAPI::interaction_profile_add_binding(RID p_interaction_profile, RID p_action, const String p_path) { + if (!is_path_supported(p_path)) { + // The extension enabling this path must not be active, we will silently skip this binding + return false; + } + InteractionProfile *ip = interaction_profile_owner.get_or_null(p_interaction_profile); ERR_FAIL_NULL_V(ip, false); @@ -2426,3 +2577,11 @@ bool OpenXRAPI::trigger_haptic_pulse(RID p_action, RID p_tracker, float p_freque return true; } + +void OpenXRAPI::register_composition_layer_provider(OpenXRCompositionLayerProvider *provider) { + composition_layer_providers.append(provider); +} + +void OpenXRAPI::unregister_composition_layer_provider(OpenXRCompositionLayerProvider *provider) { + composition_layer_providers.erase(provider); +} diff --git a/modules/openxr/openxr_api.h b/modules/openxr/openxr_api.h index dc224c4237..316886239e 100644 --- a/modules/openxr/openxr_api.h +++ b/modules/openxr/openxr_api.h @@ -36,6 +36,7 @@ #include "core/math/transform_3d.h" #include "core/math/vector2.h" #include "core/os/memory.h" +#include "core/string/print_string.h" #include "core/string/ustring.h" #include "core/templates/rb_map.h" #include "core/templates/rid_owner.h" @@ -50,6 +51,8 @@ #include "extensions/openxr_composition_layer_provider.h" #include "extensions/openxr_extension_wrapper.h" +#include "util.h" + // Note, OpenXR code that we wrote for our plugin makes use of C++20 notation for initialising structs which ensures zeroing out unspecified members. // Godot is currently restricted to C++17 which doesn't allow this notation. Make sure critical fields are set. @@ -81,6 +84,8 @@ private: bool ext_vive_focus3_available = false; bool ext_huawei_controller_available = false; + bool is_path_supported(const String &p_path); + // composition layer providers Vector<OpenXRCompositionLayerProvider *> composition_layer_providers; @@ -100,7 +105,7 @@ private: XrFormFactor form_factor = XR_FORM_FACTOR_HEAD_MOUNTED_DISPLAY; XrViewConfigurationType view_configuration = XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO; XrReferenceSpaceType reference_space = XR_REFERENCE_SPACE_TYPE_STAGE; - XrEnvironmentBlendMode environment_blend_mode = XR_ENVIRONMENT_BLEND_MODE_OPAQUE; + // XrEnvironmentBlendMode environment_blend_mode = XR_ENVIRONMENT_BLEND_MODE_OPAQUE; // state XrInstance instance = XR_NULL_HANDLE; @@ -134,6 +139,64 @@ private: bool load_supported_extensions(); bool is_extension_supported(const String &p_extension) const; + bool openxr_loader_init(); + bool resolve_instance_openxr_symbols(); + +#ifdef ANDROID_ENABLED + // On Android we keep tracker of our external OpenXR loader + void *openxr_loader_library_handle = nullptr; +#endif + + // function pointers +#ifdef ANDROID_ENABLED + // On non-Android platforms we use the OpenXR symbol linked into the engine binary. + PFN_xrGetInstanceProcAddr xrGetInstanceProcAddr = nullptr; +#endif + EXT_PROTO_XRRESULT_FUNC3(xrAcquireSwapchainImage, (XrSwapchain), swapchain, (const XrSwapchainImageAcquireInfo *), acquireInfo, (uint32_t *), index) + EXT_PROTO_XRRESULT_FUNC3(xrApplyHapticFeedback, (XrSession), session, (const XrHapticActionInfo *), hapticActionInfo, (const XrHapticBaseHeader *), hapticFeedback) + EXT_PROTO_XRRESULT_FUNC2(xrAttachSessionActionSets, (XrSession), session, (const XrSessionActionSetsAttachInfo *), attachInfo) + EXT_PROTO_XRRESULT_FUNC2(xrBeginFrame, (XrSession), session, (const XrFrameBeginInfo *), frameBeginInfo) + EXT_PROTO_XRRESULT_FUNC2(xrBeginSession, (XrSession), session, (const XrSessionBeginInfo *), beginInfo) + EXT_PROTO_XRRESULT_FUNC3(xrCreateAction, (XrActionSet), actionSet, (const XrActionCreateInfo *), createInfo, (XrAction *), action) + EXT_PROTO_XRRESULT_FUNC3(xrCreateActionSet, (XrInstance), instance, (const XrActionSetCreateInfo *), createInfo, (XrActionSet *), actionSet) + EXT_PROTO_XRRESULT_FUNC3(xrCreateActionSpace, (XrSession), session, (const XrActionSpaceCreateInfo *), createInfo, (XrSpace *), space) + EXT_PROTO_XRRESULT_FUNC2(xrCreateInstance, (const XrInstanceCreateInfo *), createInfo, (XrInstance *), instance) + EXT_PROTO_XRRESULT_FUNC3(xrCreateReferenceSpace, (XrSession), session, (const XrReferenceSpaceCreateInfo *), createInfo, (XrSpace *), space) + EXT_PROTO_XRRESULT_FUNC3(xrCreateSession, (XrInstance), instance, (const XrSessionCreateInfo *), createInfo, (XrSession *), session) + EXT_PROTO_XRRESULT_FUNC3(xrCreateSwapchain, (XrSession), session, (const XrSwapchainCreateInfo *), createInfo, (XrSwapchain *), swapchain) + EXT_PROTO_XRRESULT_FUNC1(xrDestroyAction, (XrAction), action) + EXT_PROTO_XRRESULT_FUNC1(xrDestroyActionSet, (XrActionSet), actionSet) + EXT_PROTO_XRRESULT_FUNC1(xrDestroyInstance, (XrInstance), instance) + EXT_PROTO_XRRESULT_FUNC1(xrDestroySession, (XrSession), session) + EXT_PROTO_XRRESULT_FUNC1(xrDestroySpace, (XrSpace), space) + EXT_PROTO_XRRESULT_FUNC1(xrDestroySwapchain, (XrSwapchain), swapchain) + EXT_PROTO_XRRESULT_FUNC2(xrEndFrame, (XrSession), session, (const XrFrameEndInfo *), frameEndInfo) + EXT_PROTO_XRRESULT_FUNC1(xrEndSession, (XrSession), session) + EXT_PROTO_XRRESULT_FUNC3(xrEnumerateApiLayerProperties, (uint32_t), propertyCapacityInput, (uint32_t *), propertyCountOutput, (XrApiLayerProperties *), properties) + EXT_PROTO_XRRESULT_FUNC4(xrEnumerateInstanceExtensionProperties, (const char *), layerName, (uint32_t), propertyCapacityInput, (uint32_t *), propertyCountOutput, (XrExtensionProperties *), properties) + EXT_PROTO_XRRESULT_FUNC4(xrEnumerateReferenceSpaces, (XrSession), session, (uint32_t), spaceCapacityInput, (uint32_t *), spaceCountOutput, (XrReferenceSpaceType *), spaces) + EXT_PROTO_XRRESULT_FUNC4(xrEnumerateSwapchainFormats, (XrSession), session, (uint32_t), formatCapacityInput, (uint32_t *), formatCountOutput, (int64_t *), formats) + EXT_PROTO_XRRESULT_FUNC5(xrEnumerateViewConfigurations, (XrInstance), instance, (XrSystemId), systemId, (uint32_t), viewConfigurationTypeCapacityInput, (uint32_t *), viewConfigurationTypeCountOutput, (XrViewConfigurationType *), viewConfigurationTypes) + EXT_PROTO_XRRESULT_FUNC6(xrEnumerateViewConfigurationViews, (XrInstance), instance, (XrSystemId), systemId, (XrViewConfigurationType), viewConfigurationType, (uint32_t), viewCapacityInput, (uint32_t *), viewCountOutput, (XrViewConfigurationView *), views) + EXT_PROTO_XRRESULT_FUNC3(xrGetActionStateBoolean, (XrSession), session, (const XrActionStateGetInfo *), getInfo, (XrActionStateBoolean *), state) + EXT_PROTO_XRRESULT_FUNC3(xrGetActionStateFloat, (XrSession), session, (const XrActionStateGetInfo *), getInfo, (XrActionStateFloat *), state) + EXT_PROTO_XRRESULT_FUNC3(xrGetActionStateVector2f, (XrSession), session, (const XrActionStateGetInfo *), getInfo, (XrActionStateVector2f *), state) + EXT_PROTO_XRRESULT_FUNC3(xrGetCurrentInteractionProfile, (XrSession), session, (XrPath), topLevelUserPath, (XrInteractionProfileState *), interactionProfile) + EXT_PROTO_XRRESULT_FUNC2(xrGetInstanceProperties, (XrInstance), instance, (XrInstanceProperties *), instanceProperties) + EXT_PROTO_XRRESULT_FUNC3(xrGetSystem, (XrInstance), instance, (const XrSystemGetInfo *), getInfo, (XrSystemId *), systemId) + EXT_PROTO_XRRESULT_FUNC3(xrGetSystemProperties, (XrInstance), instance, (XrSystemId), systemId, (XrSystemProperties *), properties) + EXT_PROTO_XRRESULT_FUNC4(xrLocateSpace, (XrSpace), space, (XrSpace), baseSpace, (XrTime), time, (XrSpaceLocation *), location) + EXT_PROTO_XRRESULT_FUNC6(xrLocateViews, (XrSession), session, (const XrViewLocateInfo *), viewLocateInfo, (XrViewState *), viewState, (uint32_t), viewCapacityInput, (uint32_t *), viewCountOutput, (XrView *), views) + EXT_PROTO_XRRESULT_FUNC5(xrPathToString, (XrInstance), instance, (XrPath), path, (uint32_t), bufferCapacityInput, (uint32_t *), bufferCountOutput, (char *), buffer) + EXT_PROTO_XRRESULT_FUNC2(xrPollEvent, (XrInstance), instance, (XrEventDataBuffer *), eventData) + EXT_PROTO_XRRESULT_FUNC2(xrReleaseSwapchainImage, (XrSwapchain), swapchain, (const XrSwapchainImageReleaseInfo *), releaseInfo) + EXT_PROTO_XRRESULT_FUNC3(xrResultToString, (XrInstance), instance, (XrResult), value, (char *), buffer) + EXT_PROTO_XRRESULT_FUNC3(xrStringToPath, (XrInstance), instance, (const char *), pathString, (XrPath *), path) + EXT_PROTO_XRRESULT_FUNC2(xrSuggestInteractionProfileBindings, (XrInstance), instance, (const XrInteractionProfileSuggestedBinding *), suggestedBindings) + EXT_PROTO_XRRESULT_FUNC2(xrSyncActions, (XrSession), session, (const XrActionsSyncInfo *), syncInfo) + EXT_PROTO_XRRESULT_FUNC3(xrWaitFrame, (XrSession), session, (const XrFrameWaitInfo *), frameWaitInfo, (XrFrameState *), frameState) + EXT_PROTO_XRRESULT_FUNC2(xrWaitSwapchainImage, (XrSwapchain), swapchain, (const XrSwapchainImageWaitInfo *), waitInfo) + // instance bool create_instance(); bool get_system_info(); @@ -212,9 +275,7 @@ private: // convencience void copy_string_to_char_buffer(const String p_string, char *p_buffer, int p_buffer_len); -protected: - friend class OpenXRVulkanExtension; - +public: XrInstance get_instance() const { return instance; }; XrSystemId get_system_id() const { return system_id; }; XrSession get_session() const { return session; }; @@ -227,10 +288,12 @@ protected: XRPose::TrackingConfidence transform_from_location(const XrHandJointLocationEXT &p_location, Transform3D &r_transform); void parse_velocities(const XrSpaceVelocity &p_velocity, Vector3 &r_linear_velocity, Vector3 &r_angular_velocity); -public: + bool xr_result(XrResult result, const char *format, Array args = Array()) const; + static bool openxr_is_enabled(bool p_check_run_in_editor = true); static OpenXRAPI *get_singleton(); + XrResult get_instance_proc_addr(const char *p_name, PFN_xrVoidFunction *p_addr); String get_error_string(XrResult result); String get_swapchain_format_name(int64_t p_swapchain_format) const; @@ -243,8 +306,9 @@ public: bool initialize_session(); void finish(); - XrTime get_next_frame_time() { return frame_state.predictedDisplayTime + frame_state.predictedDisplayPeriod; }; - bool can_render() { return instance != XR_NULL_HANDLE && session != XR_NULL_HANDLE && running && view_pose_valid && frame_state.shouldRender; }; + XrSpace get_play_space() const { return play_space; } + XrTime get_next_frame_time() { return frame_state.predictedDisplayTime + frame_state.predictedDisplayPeriod; } + bool can_render() { return instance != XR_NULL_HANDLE && session != XR_NULL_HANDLE && running && view_pose_valid && frame_state.shouldRender; } Size2 get_recommended_target_size(); XRPose::TrackingConfidence get_head_center(Transform3D &r_transform, Vector3 &r_linear_velocity, Vector3 &r_angular_velocity); @@ -288,6 +352,9 @@ public: XRPose::TrackingConfidence get_action_pose(RID p_action, RID p_tracker, Transform3D &r_transform, Vector3 &r_linear_velocity, Vector3 &r_angular_velocity); bool trigger_haptic_pulse(RID p_action, RID p_tracker, float p_frequency, float p_amplitude, XrDuration p_duration_ns); + void register_composition_layer_provider(OpenXRCompositionLayerProvider *provider); + void unregister_composition_layer_provider(OpenXRCompositionLayerProvider *provider); + OpenXRAPI(); ~OpenXRAPI(); }; diff --git a/modules/openxr/openxr_interface.cpp b/modules/openxr/openxr_interface.cpp index 6c2f08e21d..01e148e00f 100644 --- a/modules/openxr/openxr_interface.cpp +++ b/modules/openxr/openxr_interface.cpp @@ -176,33 +176,35 @@ void OpenXRInterface::_load_action_map() { // Note, we can only have one entry per interaction profile so if it already exists we clear it out RID ip = openxr_api->interaction_profile_create(xr_interaction_profile->get_interaction_profile_path()); - openxr_api->interaction_profile_clear_bindings(ip); - - Array xr_bindings = xr_interaction_profile->get_bindings(); - for (int j = 0; j < xr_bindings.size(); j++) { - Ref<OpenXRIPBinding> xr_binding = xr_bindings[j]; - Ref<OpenXRAction> xr_action = xr_binding->get_action(); - - Action *action = nullptr; - if (xr_actions.has(xr_action)) { - action = xr_actions[xr_action]; - } else { - print_line("Action ", xr_action->get_name(), " isn't part of an action set!"); - continue; - } + if (ip.is_valid()) { + openxr_api->interaction_profile_clear_bindings(ip); + + Array xr_bindings = xr_interaction_profile->get_bindings(); + for (int j = 0; j < xr_bindings.size(); j++) { + Ref<OpenXRIPBinding> xr_binding = xr_bindings[j]; + Ref<OpenXRAction> xr_action = xr_binding->get_action(); + + Action *action = nullptr; + if (xr_actions.has(xr_action)) { + action = xr_actions[xr_action]; + } else { + print_line("Action ", xr_action->get_name(), " isn't part of an action set!"); + continue; + } - PackedStringArray paths = xr_binding->get_paths(); - for (int k = 0; k < paths.size(); k++) { - openxr_api->interaction_profile_add_binding(ip, action->action_rid, paths[k]); + PackedStringArray paths = xr_binding->get_paths(); + for (int k = 0; k < paths.size(); k++) { + openxr_api->interaction_profile_add_binding(ip, action->action_rid, paths[k]); + } } - } - // Now submit our suggestions - openxr_api->interaction_profile_suggest_bindings(ip); + // Now submit our suggestions + openxr_api->interaction_profile_suggest_bindings(ip); - // And record it in our array so we can clean it up later on - if (interaction_profiles.has(ip)) { - interaction_profiles.push_back(ip); + // And record it in our array so we can clean it up later on + if (interaction_profiles.has(ip)) { + interaction_profiles.push_back(ip); + } } } } @@ -744,6 +746,24 @@ void OpenXRInterface::end_frame() { } } +bool OpenXRInterface::is_passthrough_supported() { + return passthrough_wrapper != nullptr && passthrough_wrapper->is_passthrough_supported(); +} + +bool OpenXRInterface::is_passthrough_enabled() { + return passthrough_wrapper != nullptr && passthrough_wrapper->is_passthrough_enabled(); +} + +bool OpenXRInterface::start_passthrough() { + return passthrough_wrapper != nullptr && passthrough_wrapper->start_passthrough(); +} + +void OpenXRInterface::stop_passthrough() { + if (passthrough_wrapper) { + passthrough_wrapper->stop_passthrough(); + } +} + void OpenXRInterface::on_state_ready() { emit_signal(SNAME("session_begun")); } @@ -774,6 +794,8 @@ OpenXRInterface::OpenXRInterface() { _set_default_pos(head_transform, 1.0, 0); _set_default_pos(transform_for_view[0], 1.0, 1); _set_default_pos(transform_for_view[1], 1.0, 2); + + passthrough_wrapper = OpenXRFbPassthroughExtensionWrapper::get_singleton(); } OpenXRInterface::~OpenXRInterface() { diff --git a/modules/openxr/openxr_interface.h b/modules/openxr/openxr_interface.h index a99012fd1d..3765f18637 100644 --- a/modules/openxr/openxr_interface.h +++ b/modules/openxr/openxr_interface.h @@ -37,6 +37,8 @@ #include "action_map/openxr_action_map.h" #include "openxr_api.h" +#include "extensions/openxr_fb_passthrough_extension_wrapper.h" + // declare some default strings #define INTERACTION_PROFILE_NONE "/interaction_profiles/none" @@ -47,6 +49,7 @@ private: OpenXRAPI *openxr_api = nullptr; bool initialized = false; XRInterface::TrackingStatus tracking_state; + OpenXRFbPassthroughExtensionWrapper *passthrough_wrapper = nullptr; // At a minimum we need a tracker for our head Ref<XRPositionalTracker> head; @@ -129,6 +132,11 @@ public: virtual Vector<BlitToScreen> post_draw_viewport(RID p_render_target, const Rect2 &p_screen_rect) override; virtual void end_frame() override; + virtual bool is_passthrough_supported() override; + virtual bool is_passthrough_enabled() override; + virtual bool start_passthrough() override; + virtual void stop_passthrough() override; + void on_state_ready(); void on_state_visible(); void on_state_focused(); diff --git a/modules/openxr/register_types.cpp b/modules/openxr/register_types.cpp index c765f169dc..5694fffe39 100644 --- a/modules/openxr/register_types.cpp +++ b/modules/openxr/register_types.cpp @@ -38,6 +38,8 @@ #include "action_map/openxr_action_set.h" #include "action_map/openxr_interaction_profile.h" +#include "scene/openxr_hand.h" + #ifdef TOOLS_ENABLED #include "editor/editor_node.h" @@ -82,6 +84,8 @@ void initialize_openxr_module(ModuleInitializationLevel p_level) { GDREGISTER_CLASS(OpenXRIPBinding); GDREGISTER_CLASS(OpenXRInteractionProfile); + GDREGISTER_CLASS(OpenXRHand); + XRServer *xr_server = XRServer::get_singleton(); if (xr_server) { openxr_interface.instantiate(); diff --git a/modules/openxr/scene/openxr_hand.cpp b/modules/openxr/scene/openxr_hand.cpp new file mode 100644 index 0000000000..2ae13a1026 --- /dev/null +++ b/modules/openxr/scene/openxr_hand.cpp @@ -0,0 +1,307 @@ +/*************************************************************************/ +/* openxr_hand.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* 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 "../extensions/openxr_hand_tracking_extension.h" +#include "../openxr_api.h" + +#include "openxr_hand.h" +#include "scene/3d/skeleton_3d.h" +#include "servers/xr_server.h" + +void OpenXRHand::_bind_methods() { + ClassDB::bind_method(D_METHOD("set_hand", "hand"), &OpenXRHand::set_hand); + ClassDB::bind_method(D_METHOD("get_hand"), &OpenXRHand::get_hand); + + ClassDB::bind_method(D_METHOD("set_hand_skeleton", "hand_skeleton"), &OpenXRHand::set_hand_skeleton); + ClassDB::bind_method(D_METHOD("get_hand_skeleton"), &OpenXRHand::get_hand_skeleton); + + ClassDB::bind_method(D_METHOD("set_motion_range", "motion_range"), &OpenXRHand::set_motion_range); + ClassDB::bind_method(D_METHOD("get_motion_range"), &OpenXRHand::get_motion_range); + + ADD_PROPERTY(PropertyInfo(Variant::INT, "hand", PROPERTY_HINT_ENUM, "Left,Right"), "set_hand", "get_hand"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "motion_range", PROPERTY_HINT_ENUM, "Unobstructed,Conform to controller"), "set_motion_range", "get_motion_range"); + ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "hand_skeleton", PROPERTY_HINT_NODE_PATH_VALID_TYPES, "Skeleton3D"), "set_hand_skeleton", "get_hand_skeleton"); + + BIND_ENUM_CONSTANT(HAND_LEFT); + BIND_ENUM_CONSTANT(HAND_RIGHT); + BIND_ENUM_CONSTANT(HAND_MAX); + + BIND_ENUM_CONSTANT(MOTION_RANGE_UNOBSTRUCTED); + BIND_ENUM_CONSTANT(MOTION_RANGE_CONFORM_TO_CONTROLLER); + BIND_ENUM_CONSTANT(MOTION_RANGE_MAX); +} + +OpenXRHand::OpenXRHand() { + openxr_api = OpenXRAPI::get_singleton(); + hand_tracking_ext = OpenXRHandTrackingExtension::get_singleton(); +} + +void OpenXRHand::set_hand(const Hands p_hand) { + ERR_FAIL_INDEX(p_hand, HAND_MAX); + + hand = p_hand; +} + +OpenXRHand::Hands OpenXRHand::get_hand() const { + return hand; +} + +void OpenXRHand::set_hand_skeleton(const NodePath &p_hand_skeleton) { + hand_skeleton = p_hand_skeleton; + + // TODO if inside tree call _get_bones() +} + +void OpenXRHand::set_motion_range(const MotionRange p_motion_range) { + ERR_FAIL_INDEX(p_motion_range, MOTION_RANGE_MAX); + motion_range = p_motion_range; + + _set_motion_range(); +} + +OpenXRHand::MotionRange OpenXRHand::get_motion_range() const { + return motion_range; +} + +NodePath OpenXRHand::get_hand_skeleton() const { + return hand_skeleton; +} + +void OpenXRHand::_set_motion_range() { + if (!hand_tracking_ext) { + return; + } + + XrHandJointsMotionRangeEXT xr_motion_range; + switch (motion_range) { + case MOTION_RANGE_UNOBSTRUCTED: + xr_motion_range = XR_HAND_JOINTS_MOTION_RANGE_UNOBSTRUCTED_EXT; + break; + case MOTION_RANGE_CONFORM_TO_CONTROLLER: + xr_motion_range = XR_HAND_JOINTS_MOTION_RANGE_CONFORMING_TO_CONTROLLER_EXT; + break; + default: + xr_motion_range = XR_HAND_JOINTS_MOTION_RANGE_CONFORMING_TO_CONTROLLER_EXT; + break; + } + + hand_tracking_ext->set_motion_range(hand, xr_motion_range); +} + +Skeleton3D *OpenXRHand::get_skeleton() { + if (!has_node(hand_skeleton)) { + return nullptr; + } + + Node *node = get_node(hand_skeleton); + if (!node) { + return nullptr; + } + + Skeleton3D *skeleton = Object::cast_to<Skeleton3D>(node); + return skeleton; +} + +void OpenXRHand::_get_bones() { + const char *bone_names[XR_HAND_JOINT_COUNT_EXT] = { + "Palm", + "Wrist", + "Thumb_Metacarpal", + "Thumb_Proximal", + "Thumb_Distal", + "Thumb_Tip", + "Index_Metacarpal", + "Index_Proximal", + "Index_Intermediate", + "Index_Distal", + "Index_Tip", + "Middle_Metacarpal", + "Middle_Proximal", + "Middle_Intermediate", + "Middle_Distal", + "Middle_Tip", + "Ring_Metacarpal", + "Ring_Proximal", + "Ring_Intermediate", + "Ring_Distal", + "Ring_Tip", + "Little_Metacarpal", + "Little_Proximal", + "Little_Intermediate", + "Little_Distal", + "Little_Tip", + }; + + // reset JIC + for (int i = 0; i < XR_HAND_JOINT_COUNT_EXT; i++) { + bones[i] = -1; + } + + Skeleton3D *skeleton = get_skeleton(); + if (!skeleton) { + return; + } + + // We cast to spatials which should allow us to use any subclass of that. + for (int i = 0; i < XR_HAND_JOINT_COUNT_EXT; i++) { + String bone_name = bone_names[i]; + if (hand == 0) { + bone_name += String("_L"); + } else { + bone_name += String("_R"); + } + + bones[i] = skeleton->find_bone(bone_name); + if (bones[i] == -1) { + print_line("Couldn't obtain bone for", bone_name); + } + } +} + +void OpenXRHand::_update_skeleton() { + if (openxr_api == nullptr || !openxr_api->is_initialized()) { + return; + } else if (hand_tracking_ext == nullptr || !hand_tracking_ext->get_active()) { + return; + } + + Skeleton3D *skeleton = get_skeleton(); + if (!skeleton) { + return; + } + + // we cache our transforms so we can quickly calculate local transforms + XRPose::TrackingConfidence confidences[XR_HAND_JOINT_COUNT_EXT]; + Quaternion quaternions[XR_HAND_JOINT_COUNT_EXT]; + Quaternion inv_quaternions[XR_HAND_JOINT_COUNT_EXT]; + Vector3 positions[XR_HAND_JOINT_COUNT_EXT]; + + const OpenXRHandTrackingExtension::HandTracker *hand_tracker = hand_tracking_ext->get_hand_tracker(hand); + const float ws = XRServer::get_singleton()->get_world_scale(); + + if (hand_tracker->is_initialised && hand_tracker->locations.isActive) { + for (int i = 0; i < XR_HAND_JOINT_COUNT_EXT; i++) { + confidences[i] = XRPose::XR_TRACKING_CONFIDENCE_NONE; + quaternions[i] = Quaternion(); + positions[i] = Vector3(); + + const auto &location = hand_tracker->joint_locations[i]; + const auto &pose = location.pose; + + if (location.locationFlags & XR_SPACE_LOCATION_ORIENTATION_VALID_BIT) { + if (pose.orientation.x != 0 || pose.orientation.y != 0 || pose.orientation.y != 0 || pose.orientation.w != 0) { + quaternions[i] = Quaternion(pose.orientation.x, pose.orientation.y, pose.orientation.z, pose.orientation.w); + inv_quaternions[i] = quaternions[i].inverse(); + + if (location.locationFlags & XR_SPACE_LOCATION_POSITION_VALID_BIT) { + confidences[i] = XRPose::XR_TRACKING_CONFIDENCE_HIGH; + positions[i] = Vector3(pose.position.x * ws, pose.position.y * ws, pose.position.z * ws); + + // TODO get inverse of position, we'll do this later. For now we're ignoring bone positions which generally works better anyway + } else { + confidences[i] = XRPose::XR_TRACKING_CONFIDENCE_LOW; + } + } + } + } + + if (confidences[XR_HAND_JOINT_PALM_EXT] != XRPose::XR_TRACKING_CONFIDENCE_NONE) { + // now update our skeleton + for (int i = 0; i < XR_HAND_JOINT_COUNT_EXT; i++) { + if (bones[i] != -1) { + int bone = bones[i]; + int parent = skeleton->get_bone_parent(bone); + + // Get our target quaternion + Quaternion q = quaternions[i]; + + // get local translation, parent should already be processed + if (parent == -1) { + // use our palm location here, that is what we are tracking + q = inv_quaternions[XR_HAND_JOINT_PALM_EXT] * q; + } else { + int found = false; + for (int b = 0; b < XR_HAND_JOINT_COUNT_EXT && !found; b++) { + if (bones[b] == parent) { + q = inv_quaternions[b] * q; + found = true; + } + } + } + + // And get the movement from our rest position + // Transform3D rest = skeleton->get_bone_rest(bones[i]); + // q = rest.basis.get_quaternion().inverse() * q; + + // and set our pose + // skeleton->set_bone_pose_position(bones[i], v); + skeleton->set_bone_pose_rotation(bones[i], q); + } + } + + Transform3D t; + t.basis = Basis(quaternions[XR_HAND_JOINT_PALM_EXT]); + t.origin = positions[XR_HAND_JOINT_PALM_EXT]; + set_transform(t); + + // show it + set_visible(true); + } else { + // hide it + set_visible(false); + } + } else { + // hide it + set_visible(false); + } +} + +void OpenXRHand::_notification(int p_what) { + switch (p_what) { + case NOTIFICATION_ENTER_TREE: { + _get_bones(); + + set_process_internal(true); + } break; + case NOTIFICATION_EXIT_TREE: { + set_process_internal(false); + + // reset + for (int i = 0; i < XR_HAND_JOINT_COUNT_EXT; i++) { + bones[i] = -1; + } + } break; + case NOTIFICATION_INTERNAL_PROCESS: { + _update_skeleton(); + } break; + default: { + } break; + } +} diff --git a/modules/openxr/scene/openxr_hand.h b/modules/openxr/scene/openxr_hand.h new file mode 100644 index 0000000000..f8499cc172 --- /dev/null +++ b/modules/openxr/scene/openxr_hand.h @@ -0,0 +1,93 @@ +/*************************************************************************/ +/* openxr_hand.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* 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 OPENXR_HAND_H +#define OPENXR_HAND_H + +#include "scene/3d/node_3d.h" +#include "scene/3d/skeleton_3d.h" + +class OpenXRAPI; +class OpenXRHandTrackingExtension; + +class OpenXRHand : public Node3D { + GDCLASS(OpenXRHand, Node3D); + +public: + enum Hands { + HAND_LEFT, + HAND_RIGHT, + HAND_MAX + }; + + enum MotionRange { + MOTION_RANGE_UNOBSTRUCTED, + MOTION_RANGE_CONFORM_TO_CONTROLLER, + MOTION_RANGE_MAX + }; + +private: + OpenXRAPI *openxr_api = nullptr; + OpenXRHandTrackingExtension *hand_tracking_ext = nullptr; + + Hands hand = HAND_LEFT; + MotionRange motion_range = MOTION_RANGE_UNOBSTRUCTED; + NodePath hand_skeleton; + + int64_t bones[XR_HAND_JOINT_COUNT_EXT]; + + void _set_motion_range(); + + Skeleton3D *get_skeleton(); + void _get_bones(); + void _update_skeleton(); + +protected: + static void _bind_methods(); + +public: + OpenXRHand(); + + void set_hand(const Hands p_hand); + Hands get_hand() const; + + void set_motion_range(const MotionRange p_motion_range); + MotionRange get_motion_range() const; + + void set_hand_skeleton(const NodePath &p_hand_skeleton); + NodePath get_hand_skeleton() const; + + void _notification(int p_what); +}; + +VARIANT_ENUM_CAST(OpenXRHand::Hands) +VARIANT_ENUM_CAST(OpenXRHand::MotionRange) + +#endif // OPENXR_HAND_H diff --git a/modules/openxr/util.h b/modules/openxr/util.h new file mode 100644 index 0000000000..5c79890830 --- /dev/null +++ b/modules/openxr/util.h @@ -0,0 +1,110 @@ +/*************************************************************************/ +/* util.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* 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 UTIL_H +#define UTIL_H + +#define UNPACK(...) __VA_ARGS__ + +#define INIT_XR_FUNC_V(openxr_api, name) \ + do { \ + XrResult get_instance_proc_addr_result; \ + get_instance_proc_addr_result = openxr_api->get_instance_proc_addr(#name, (PFN_xrVoidFunction *)&name##_ptr); \ + ERR_FAIL_COND_V(XR_FAILED(get_instance_proc_addr_result), false); \ + } while (0) + +#define EXT_INIT_XR_FUNC_V(name) INIT_XR_FUNC_V(openxr_api, name) +#define OPENXR_API_INIT_XR_FUNC_V(name) INIT_XR_FUNC_V(this, name) + +#define INIT_XR_FUNC(openxr_api, name) \ + do { \ + XrResult get_instance_proc_addr_result; \ + get_instance_proc_addr_result = openxr_api->get_instance_proc_addr(#name, (PFN_xrVoidFunction *)&name##_ptr); \ + ERR_FAIL_COND(XR_FAILED(get_instance_proc_addr_result)); \ + } while (0) + +#define EXT_INIT_XR_FUNC(name) INIT_XR_FUNC(openxr_api, name) +#define OPENXR_API_INIT_XR_FUNC(name) INIT_XR_FUNC(this, name) + +#define EXT_PROTO_XRRESULT_FUNC1(func_name, arg1_type, arg1) \ + PFN_##func_name func_name##_ptr = nullptr; \ + XRAPI_ATTR XrResult XRAPI_CALL func_name(UNPACK arg1_type arg1) const { \ + if (!func_name##_ptr) { \ + return XR_ERROR_HANDLE_INVALID; \ + } \ + return (*func_name##_ptr)(arg1); \ + } + +#define EXT_PROTO_XRRESULT_FUNC2(func_name, arg1_type, arg1, arg2_type, arg2) \ + PFN_##func_name func_name##_ptr = nullptr; \ + XRAPI_ATTR XrResult XRAPI_CALL func_name(UNPACK arg1_type arg1, UNPACK arg2_type arg2) const { \ + if (!func_name##_ptr) { \ + return XR_ERROR_HANDLE_INVALID; \ + } \ + return (*func_name##_ptr)(arg1, arg2); \ + } + +#define EXT_PROTO_XRRESULT_FUNC3(func_name, arg1_type, arg1, arg2_type, arg2, arg3_type, arg3) \ + PFN_##func_name func_name##_ptr = nullptr; \ + XRAPI_ATTR XrResult XRAPI_CALL func_name(UNPACK arg1_type arg1, UNPACK arg2_type arg2, UNPACK arg3_type arg3) const { \ + if (!func_name##_ptr) { \ + return XR_ERROR_HANDLE_INVALID; \ + } \ + return (*func_name##_ptr)(arg1, arg2, arg3); \ + } + +#define EXT_PROTO_XRRESULT_FUNC4(func_name, arg1_type, arg1, arg2_type, arg2, arg3_type, arg3, arg4_type, arg4) \ + PFN_##func_name func_name##_ptr = nullptr; \ + XRAPI_ATTR XrResult XRAPI_CALL func_name(UNPACK arg1_type arg1, UNPACK arg2_type arg2, UNPACK arg3_type arg3, UNPACK arg4_type arg4) const { \ + if (!func_name##_ptr) { \ + return XR_ERROR_HANDLE_INVALID; \ + } \ + return (*func_name##_ptr)(arg1, arg2, arg3, arg4); \ + } + +#define EXT_PROTO_XRRESULT_FUNC5(func_name, arg1_type, arg1, arg2_type, arg2, arg3_type, arg3, arg4_type, arg4, arg5_type, arg5) \ + PFN_##func_name func_name##_ptr = nullptr; \ + XRAPI_ATTR XrResult XRAPI_CALL func_name(UNPACK arg1_type arg1, UNPACK arg2_type arg2, UNPACK arg3_type arg3, UNPACK arg4_type arg4, UNPACK arg5_type arg5) const { \ + if (!func_name##_ptr) { \ + return XR_ERROR_HANDLE_INVALID; \ + } \ + return (*func_name##_ptr)(arg1, arg2, arg3, arg4, arg5); \ + } + +#define EXT_PROTO_XRRESULT_FUNC6(func_name, arg1_type, arg1, arg2_type, arg2, arg3_type, arg3, arg4_type, arg4, arg5_type, arg5, arg6_type, arg6) \ + PFN_##func_name func_name##_ptr = nullptr; \ + XRAPI_ATTR XrResult XRAPI_CALL func_name(UNPACK arg1_type arg1, UNPACK arg2_type arg2, UNPACK arg3_type arg3, UNPACK arg4_type arg4, UNPACK arg5_type arg5, UNPACK arg6_type arg6) const { \ + if (!func_name##_ptr) { \ + return XR_ERROR_HANDLE_INVALID; \ + } \ + return (*func_name##_ptr)(arg1, arg2, arg3, arg4, arg5, arg6); \ + } + +#endif // UTIL_H diff --git a/modules/raycast/SCsub b/modules/raycast/SCsub index 074795759a..20b05816e1 100644 --- a/modules/raycast/SCsub +++ b/modules/raycast/SCsub @@ -63,7 +63,8 @@ if env["builtin_embree"]: thirdparty_sources = [thirdparty_dir + file for file in embree_src] env_raycast.Prepend(CPPPATH=[thirdparty_dir, thirdparty_dir + "include"]) - env_raycast.Append(CPPDEFINES=["EMBREE_TARGET_SSE2", "EMBREE_LOWEST_ISA", "TASKING_INTERNAL", "NDEBUG"]) + env_raycast.Append(CPPDEFINES=["EMBREE_TARGET_SSE2", "EMBREE_LOWEST_ISA", "TASKING_INTERNAL"]) + env_raycast.AppendUnique(CPPDEFINES=["NDEBUG"]) # No assert() even in debug builds. if not env.msvc: if env["arch"] == "x86_64": @@ -78,6 +79,9 @@ if env["builtin_embree"]: else: env.Append(LIBS=["psapi"]) + if env.msvc: # Disable bogus warning about intentional struct padding. + env_raycast.Append(CCFLAGS=["/wd4324"]) + env_thirdparty = env_raycast.Clone() env_thirdparty.force_optimization_on_debug() env_thirdparty.disable_warnings() diff --git a/modules/raycast/lightmap_raycaster.cpp b/modules/raycast/lightmap_raycaster_embree.cpp index 9b35b5616e..e6a579bd3a 100644 --- a/modules/raycast/lightmap_raycaster.cpp +++ b/modules/raycast/lightmap_raycaster_embree.cpp @@ -1,5 +1,5 @@ /*************************************************************************/ -/* lightmap_raycaster.cpp */ +/* lightmap_raycaster_embree.cpp */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -30,7 +30,7 @@ #ifdef TOOLS_ENABLED -#include "lightmap_raycaster.h" +#include "lightmap_raycaster_embree.h" #ifdef __SSE2__ #include <pmmintrin.h> @@ -193,4 +193,4 @@ LightmapRaycasterEmbree::~LightmapRaycasterEmbree() { } } -#endif +#endif // TOOLS_ENABLED diff --git a/modules/raycast/lightmap_raycaster.h b/modules/raycast/lightmap_raycaster_embree.h index 2e9f59dda4..0c3371f07c 100644 --- a/modules/raycast/lightmap_raycaster.h +++ b/modules/raycast/lightmap_raycaster_embree.h @@ -1,5 +1,5 @@ /*************************************************************************/ -/* lightmap_raycaster.h */ +/* lightmap_raycaster_embree.h */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,6 +28,9 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ +#ifndef LIGHTMAP_RAYCASTER_EMBREE_H +#define LIGHTMAP_RAYCASTER_EMBREE_H + #ifdef TOOLS_ENABLED #include "core/io/image.h" @@ -74,4 +77,6 @@ public: ~LightmapRaycasterEmbree(); }; -#endif // LIGHTMAP_RAYCASTER_H +#endif // TOOLS_ENABLED + +#endif // LIGHTMAP_RAYCASTER_EMBREE_H diff --git a/modules/raycast/register_types.cpp b/modules/raycast/register_types.cpp index 42de1d971d..a8380b00ba 100644 --- a/modules/raycast/register_types.cpp +++ b/modules/raycast/register_types.cpp @@ -30,9 +30,9 @@ #include "register_types.h" -#include "lightmap_raycaster.h" +#include "lightmap_raycaster_embree.h" #include "raycast_occlusion_cull.h" -#include "static_raycaster.h" +#include "static_raycaster_embree.h" RaycastOcclusionCull *raycast_occlusion_cull = nullptr; diff --git a/modules/raycast/register_types.h b/modules/raycast/register_types.h index a917285390..25a6c346b9 100644 --- a/modules/raycast/register_types.h +++ b/modules/raycast/register_types.h @@ -28,7 +28,12 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ +#ifndef RAYCAST_REGISTER_TYPES_H +#define RAYCAST_REGISTER_TYPES_H + #include "modules/register_module_types.h" void initialize_raycast_module(ModuleInitializationLevel p_level); void uninitialize_raycast_module(ModuleInitializationLevel p_level); + +#endif // RAYCAST_REGISTER_TYPES_H diff --git a/modules/raycast/static_raycaster.cpp b/modules/raycast/static_raycaster_embree.cpp index 7659eea27f..b5a4ab42d4 100644 --- a/modules/raycast/static_raycaster.cpp +++ b/modules/raycast/static_raycaster_embree.cpp @@ -1,5 +1,5 @@ /*************************************************************************/ -/* static_raycaster.cpp */ +/* static_raycaster_embree.cpp */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -30,7 +30,7 @@ #ifdef TOOLS_ENABLED -#include "static_raycaster.h" +#include "static_raycaster_embree.h" #ifdef __SSE2__ #include <pmmintrin.h> @@ -134,4 +134,4 @@ StaticRaycasterEmbree::~StaticRaycasterEmbree() { } } -#endif +#endif // TOOLS_ENABLED diff --git a/modules/raycast/static_raycaster.h b/modules/raycast/static_raycaster_embree.h index 607a392683..4d631e3ca0 100644 --- a/modules/raycast/static_raycaster.h +++ b/modules/raycast/static_raycaster_embree.h @@ -1,5 +1,5 @@ /*************************************************************************/ -/* static_raycaster.h */ +/* static_raycaster_embree.h */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,6 +28,9 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ +#ifndef STATIC_RAYCASTER_EMBREE_H +#define STATIC_RAYCASTER_EMBREE_H + #ifdef TOOLS_ENABLED #include "core/math/static_raycaster.h" @@ -61,4 +64,6 @@ public: ~StaticRaycasterEmbree(); }; -#endif // STATIC_RAYCASTER_H +#endif // TOOLS_ENABLED + +#endif // STATIC_RAYCASTER_EMBREE_H diff --git a/modules/regex/SCsub b/modules/regex/SCsub index deb9db7591..6fd7cd47f3 100644 --- a/modules/regex/SCsub +++ b/modules/regex/SCsub @@ -58,10 +58,10 @@ if env["builtin_pcre2"]: env_pcre2["OBJSUFFIX"] = "_" + width + env_pcre2["OBJSUFFIX"] env_pcre2.Append(CPPDEFINES=[("PCRE2_CODE_UNIT_WIDTH", width)]) env_pcre2.add_source_files(thirdparty_obj, thirdparty_sources) - env.modules_sources += thirdparty_obj pcre2_builtin("16") pcre2_builtin("32") + env.modules_sources += thirdparty_obj # Godot source files diff --git a/modules/svg/image_loader_svg.cpp b/modules/svg/image_loader_svg.cpp index 5f839bd979..f43f2784c7 100644 --- a/modules/svg/image_loader_svg.cpp +++ b/modules/svg/image_loader_svg.cpp @@ -35,6 +35,12 @@ #include <thorvg.h> +HashMap<Color, Color> ImageLoaderSVG::forced_color_map = HashMap<Color, Color>(); + +void ImageLoaderSVG::set_forced_color_map(const HashMap<Color, Color> &p_color_map) { + forced_color_map = p_color_map; +} + void ImageLoaderSVG::_replace_color_property(const HashMap<Color, Color> &p_color_map, const String &p_prefix, String &r_string) { // Replace colors in the SVG based on what is passed in `p_color_map`. // Used to change the colors of editor icons based on the used theme. @@ -136,9 +142,15 @@ void ImageLoaderSVG::get_recognized_extensions(List<String> *p_extensions) const p_extensions->push_back("svg"); } -Error ImageLoaderSVG::load_image(Ref<Image> p_image, Ref<FileAccess> p_fileaccess, uint32_t p_flags, float p_scale) { +Error ImageLoaderSVG::load_image(Ref<Image> p_image, Ref<FileAccess> p_fileaccess, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale) { String svg = p_fileaccess->get_as_utf8_string(); - create_image_from_string(p_image, svg, p_scale, false, HashMap<Color, Color>()); + + if (p_flags & FLAG_CONVERT_COLORS) { + create_image_from_string(p_image, svg, p_scale, false, forced_color_map); + } else { + create_image_from_string(p_image, svg, p_scale, false, HashMap<Color, Color>()); + } + ERR_FAIL_COND_V(p_image->is_empty(), FAILED); if (p_flags & FLAG_FORCE_LINEAR) { p_image->srgb_to_linear(); diff --git a/modules/svg/image_loader_svg.h b/modules/svg/image_loader_svg.h index fc89b63edb..b0b0963c15 100644 --- a/modules/svg/image_loader_svg.h +++ b/modules/svg/image_loader_svg.h @@ -34,12 +34,16 @@ #include "core/io/image_loader.h" class ImageLoaderSVG : public ImageFormatLoader { + static HashMap<Color, Color> forced_color_map; + void _replace_color_property(const HashMap<Color, Color> &p_color_map, const String &p_prefix, String &r_string); public: + static void set_forced_color_map(const HashMap<Color, Color> &p_color_map); + void create_image_from_string(Ref<Image> p_image, String p_string, float p_scale, bool p_upsample, const HashMap<Color, Color> &p_color_map); - virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> p_fileaccess, uint32_t p_flags, float p_scale) override; + virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> p_fileaccess, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale) override; virtual void get_recognized_extensions(List<String> *p_extensions) const override; }; diff --git a/modules/svg/register_types.cpp b/modules/svg/register_types.cpp index 5b4d1d31ca..323b1d652a 100644 --- a/modules/svg/register_types.cpp +++ b/modules/svg/register_types.cpp @@ -34,7 +34,7 @@ #include <thorvg.h> -static ImageLoaderSVG *image_loader_svg = nullptr; +static Ref<ImageLoaderSVG> image_loader_svg; void initialize_svg_module(ModuleInitializationLevel p_level) { if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) { @@ -45,7 +45,8 @@ void initialize_svg_module(ModuleInitializationLevel p_level) { if (tvg::Initializer::init(tvgEngine, 1) != tvg::Result::Success) { return; } - image_loader_svg = memnew(ImageLoaderSVG); + + image_loader_svg.instantiate(); ImageLoader::add_image_format_loader(image_loader_svg); } @@ -54,9 +55,12 @@ void uninitialize_svg_module(ModuleInitializationLevel p_level) { return; } - if (!image_loader_svg) { + if (image_loader_svg.is_null()) { + // It failed to initialize so it was not added. return; } - memdelete(image_loader_svg); + + ImageLoader::remove_image_format_loader(image_loader_svg); + image_loader_svg.unref(); tvg::Initializer::term(tvg::CanvasEngine::Sw); } diff --git a/modules/text_server_adv/SCsub b/modules/text_server_adv/SCsub index 8d0245f0f6..2261342467 100644 --- a/modules/text_server_adv/SCsub +++ b/modules/text_server_adv/SCsub @@ -215,6 +215,9 @@ if env["builtin_graphite"] and freetype_enabled and env["graphite"]: ] ) + if env.msvc: # Not our business to fix. + env_graphite.Append(CCFLAGS=["-D_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS"]) + lib = env_graphite.add_library("graphite_builtin", thirdparty_sources) thirdparty_obj += lib @@ -445,7 +448,7 @@ if env["builtin_icu"]: icu_data_name = "icudt71l.dat" - if env_icu["tools"]: + if env.editor_build: env_icu.Depends("#thirdparty/icu4c/icudata.gen.h", "#thirdparty/icu4c/" + icu_data_name) env_icu.Command("#thirdparty/icu4c/icudata.gen.h", "#thirdparty/icu4c/" + icu_data_name, make_icu_data) env_text_server_adv.Prepend(CPPPATH=["#thirdparty/icu4c/"]) @@ -479,7 +482,7 @@ if env["builtin_icu"]: "-DICU_DATA_NAME=" + icu_data_name, ] ) - if env_text_server_adv["tools"]: + if env.editor_build: env_text_server_adv.Append(CXXFLAGS=["-DICU_STATIC_DATA"]) env_text_server_adv.Prepend(CPPPATH=["#thirdparty/icu4c/common/", "#thirdparty/icu4c/i18n/"]) diff --git a/modules/text_server_adv/gdextension_build/SConstruct b/modules/text_server_adv/gdextension_build/SConstruct index 0170c007ae..7ca8859ee6 100644 --- a/modules/text_server_adv/gdextension_build/SConstruct +++ b/modules/text_server_adv/gdextension_build/SConstruct @@ -19,6 +19,7 @@ env = SConscript("./godot-cpp/SConstruct") env.__class__.disable_warnings = methods.disable_warnings opts = Variables([], ARGUMENTS) +opts.Add(BoolVariable("brotli_enabled", "Use Brotli library", True)) opts.Add(BoolVariable("freetype_enabled", "Use FreeType library", True)) opts.Add(BoolVariable("msdfgen_enabled", "Use MSDFgen library (require FreeType)", True)) opts.Add(BoolVariable("graphite_enabled", "Use Graphite library (require FreeType)", True)) @@ -162,6 +163,25 @@ if env["freetype_enabled"]: ] thirdparty_freetype_sources += [thirdparty_zlib_dir + file for file in thirdparty_zlib_sources] + if env["brotli_enabled"]: + thirdparty_brotli_dir = "../../../thirdparty/brotli/" + thirdparty_brotli_sources = [ + "common/constants.c", + "common/context.c", + "common/dictionary.c", + "common/platform.c", + "common/shared_dictionary.c", + "common/transform.c", + "dec/bit_reader.c", + "dec/decode.c", + "dec/huffman.c", + "dec/state.c", + ] + thirdparty_freetype_sources += [thirdparty_brotli_dir + file for file in thirdparty_brotli_sources] + env_freetype.Append(CPPDEFINES=["FT_CONFIG_OPTION_USE_BROTLI"]) + env_freetype.Prepend(CPPPATH=[thirdparty_brotli_dir + "include"]) + env.Append(CPPDEFINES=["FT_CONFIG_OPTION_USE_BROTLI"]) + env_freetype.Append(CPPPATH=[thirdparty_freetype_dir + "/include", thirdparty_zlib_dir, thirdparty_png_dir]) env.Append(CPPPATH=[thirdparty_freetype_dir + "/include"]) @@ -173,7 +193,7 @@ if env["freetype_enabled"]: "FT_CONFIG_OPTION_SYSTEM_ZLIB", ] ) - if env["target"] == "debug": + if env.dev_build: env_freetype.Append(CPPDEFINES=["ZLIB_DEBUG"]) env.Append(CPPDEFINES=["MODULE_FREETYPE_ENABLED"]) @@ -265,6 +285,7 @@ env_harfbuzz.Append( CPPPATH=[ "../../../thirdparty/harfbuzz/src", "../../../thirdparty/icu4c/common/", + "../../../thirdparty/icu4c/i18n/", ] ) @@ -569,6 +590,10 @@ thirdparty_icu_sources = [ "common/uvectr32.cpp", "common/uvectr64.cpp", "common/wintz.cpp", + "i18n/scriptset.cpp", + "i18n/ucln_in.cpp", + "i18n/uspoof.cpp", + "i18n/uspoof_impl.cpp", ] thirdparty_icu_sources = [thirdparty_icu_dir + file for file in thirdparty_icu_sources] @@ -584,7 +609,7 @@ if env["static_icu_data"]: else: thirdparty_sources += ["../icu_data/icudata_stub.cpp"] -env_icu.Append(CPPPATH=["../../../thirdparty/icu4c/common/"]) +env_icu.Append(CPPPATH=["../../../thirdparty/icu4c/common/", "../../../thirdparty/icu4c/i18n/"]) env_icu.Append( CXXFLAGS=[ "-DU_STATIC_IMPLEMENTATION", @@ -610,7 +635,7 @@ env.Append( "-DICU_DATA_NAME=" + icu_data_name, ] ) -env.Append(CPPPATH=["../../../thirdparty/icu4c/common/"]) +env.Append(CPPPATH=["../../../thirdparty/icu4c/common/", "../../../thirdparty/icu4c/i18n/"]) if env["platform"] == "windows": env.Append(LIBS=["advapi32"]) diff --git a/modules/text_server_adv/text_server_adv.cpp b/modules/text_server_adv/text_server_adv.cpp index 7aebeafe70..d0301eeae3 100644 --- a/modules/text_server_adv/text_server_adv.cpp +++ b/modules/text_server_adv/text_server_adv.cpp @@ -33,7 +33,7 @@ #ifdef GDEXTENSION // Headers for building as GDExtension plug-in. -#include <godot_cpp/classes/file.hpp> +#include <godot_cpp/classes/file_access.hpp> #include <godot_cpp/classes/project_settings.hpp> #include <godot_cpp/classes/rendering_server.hpp> #include <godot_cpp/classes/translation_server.hpp> @@ -45,7 +45,6 @@ using namespace godot; // Headers for building as built-in module. #include "core/config/project_settings.h" -#include "core/core_bind.h" #include "core/error/error_macros.h" #include "core/object/worker_thread_pool.h" #include "core/string/print_string.h" @@ -53,8 +52,6 @@ using namespace godot; #include "modules/modules_enabled.gen.h" // For freetype, msdfgen. -using namespace core_bind; - #endif // Built-in ICU data. @@ -330,7 +327,7 @@ _FORCE_INLINE_ bool is_connected_to_prev(char32_t p_chr, char32_t p_pchr) { /*************************************************************************/ -bool TextServerAdvanced::has_feature(Feature p_feature) const { +bool TextServerAdvanced::_has_feature(Feature p_feature) const { switch (p_feature) { case FEATURE_SIMPLE_LAYOUT: case FEATURE_BIDI_LAYOUT: @@ -357,7 +354,7 @@ bool TextServerAdvanced::has_feature(Feature p_feature) const { return false; } -String TextServerAdvanced::get_name() const { +String TextServerAdvanced::_get_name() const { #ifdef GDEXTENSION return "ICU / HarfBuzz / Graphite (GDExtension)"; #else @@ -365,7 +362,7 @@ String TextServerAdvanced::get_name() const { #endif } -int64_t TextServerAdvanced::get_features() const { +int64_t TextServerAdvanced::_get_features() const { int64_t interface_features = FEATURE_SIMPLE_LAYOUT | FEATURE_BIDI_LAYOUT | FEATURE_VERTICAL_LAYOUT | FEATURE_SHAPING | FEATURE_KASHIDA_JUSTIFICATION | FEATURE_BREAK_ITERATORS | FEATURE_FONT_BITMAP | FEATURE_FONT_VARIABLE | FEATURE_CONTEXT_SENSITIVE_CASE_CONVERSION | FEATURE_USE_SUPPORT_DATA; #ifdef MODULE_FREETYPE_ENABLED interface_features |= FEATURE_FONT_DYNAMIC; @@ -377,7 +374,7 @@ int64_t TextServerAdvanced::get_features() const { return interface_features; } -void TextServerAdvanced::free_rid(const RID &p_rid) { +void TextServerAdvanced::_free_rid(const RID &p_rid) { _THREAD_SAFE_METHOD_ if (font_owner.owns(p_rid)) { FontAdvanced *fd = font_owner.get_or_null(p_rid); @@ -390,12 +387,12 @@ void TextServerAdvanced::free_rid(const RID &p_rid) { } } -bool TextServerAdvanced::has(const RID &p_rid) { +bool TextServerAdvanced::_has(const RID &p_rid) { _THREAD_SAFE_METHOD_ return font_owner.owns(p_rid) || shaped_owner.owns(p_rid); } -bool TextServerAdvanced::load_support_data(const String &p_filename) { +bool TextServerAdvanced::_load_support_data(const String &p_filename) { _THREAD_SAFE_METHOD_ #ifdef ICU_STATIC_DATA @@ -408,13 +405,16 @@ bool TextServerAdvanced::load_support_data(const String &p_filename) { if (!icu_data_loaded) { String filename = (p_filename.is_empty()) ? String("res://") + _MKSTR(ICU_DATA_NAME) : p_filename; - Ref<File> f; - f.instantiate(); - if (f->open(filename, File::READ) != OK) { + Ref<FileAccess> f = FileAccess::open(filename, FileAccess::READ); + if (f.is_null()) { return false; } uint64_t len = f->get_length(); +#ifdef GDEXTENSION PackedByteArray icu_data = f->get_buffer(len); +#else + PackedByteArray icu_data = f->_get_buffer(len); +#endif UErrorCode err = U_ZERO_ERROR; udata_setCommonData(icu_data.ptr(), &err); @@ -433,7 +433,7 @@ bool TextServerAdvanced::load_support_data(const String &p_filename) { return true; } -String TextServerAdvanced::get_support_data_filename() const { +String TextServerAdvanced::_get_support_data_filename() const { #ifdef ICU_STATIC_DATA return _MKSTR(ICU_DATA_NAME); #else @@ -441,7 +441,7 @@ String TextServerAdvanced::get_support_data_filename() const { #endif } -String TextServerAdvanced::get_support_data_info() const { +String TextServerAdvanced::_get_support_data_info() const { #ifdef ICU_STATIC_DATA return String("ICU break iteration data (") + _MKSTR(ICU_DATA_NAME) + String(")."); #else @@ -449,22 +449,25 @@ String TextServerAdvanced::get_support_data_info() const { #endif } -bool TextServerAdvanced::save_support_data(const String &p_filename) const { +bool TextServerAdvanced::_save_support_data(const String &p_filename) const { _THREAD_SAFE_METHOD_ #ifdef ICU_STATIC_DATA // Store data to the res file if it's available. - Ref<File> f; - f.instantiate(); - if (f->open(p_filename, File::WRITE) != OK) { + Ref<FileAccess> f = FileAccess::open(p_filename, FileAccess::WRITE); + if (f.is_null()) { return false; } PackedByteArray icu_data; icu_data.resize(U_ICUDATA_SIZE); memcpy(icu_data.ptrw(), U_ICUDATA_ENTRY_POINT, U_ICUDATA_SIZE); +#ifdef GDEXTENSION f->store_buffer(icu_data); +#else + f->_store_buffer(icu_data); +#endif return true; #else @@ -472,7 +475,7 @@ bool TextServerAdvanced::save_support_data(const String &p_filename) const { #endif } -bool TextServerAdvanced::is_locale_right_to_left(const String &p_locale) const { +bool TextServerAdvanced::_is_locale_right_to_left(const String &p_locale) const { String l = p_locale.get_slicec('_', 0); if ((l == "ar") || (l == "dv") || (l == "he") || (l == "fa") || (l == "ff") || (l == "ku") || (l == "ur")) { return true; @@ -744,7 +747,7 @@ void TextServerAdvanced::_insert_feature_sets() { _insert_feature("weight", HB_TAG('w', 'g', 'h', 't'), Variant::Type::INT, false); } -int64_t TextServerAdvanced::name_to_tag(const String &p_name) const { +int64_t TextServerAdvanced::_name_to_tag(const String &p_name) const { if (feature_sets.has(p_name)) { return feature_sets[p_name]; } @@ -767,7 +770,7 @@ bool TextServerAdvanced::_get_tag_hidden(int64_t p_tag) const { return false; } -String TextServerAdvanced::tag_to_name(int64_t p_tag) const { +String TextServerAdvanced::_tag_to_name(int64_t p_tag) const { if (feature_sets_inv.has(p_tag)) { return feature_sets_inv[p_tag].name; } @@ -1048,8 +1051,14 @@ _FORCE_INLINE_ TextServerAdvanced::FontGlyph TextServerAdvanced::rasterize_msdf( td.projection = &projection; td.distancePixelConversion = &distancePixelConversion; +#ifdef GDEXTENSION + for (int i = 0; i < h; i++) { + _generateMTSDF_threaded(i, &td); + } +#else WorkerThreadPool::GroupID group_task = WorkerThreadPool::get_singleton()->add_template_group_task(this, &TextServerAdvanced::_generateMTSDF_threaded, &td, h, -1, true, SNAME("FontServerRasterizeMSDF")); WorkerThreadPool::get_singleton()->wait_for_group_task_completion(group_task); +#endif msdfgen::msdfErrorCorrection(image, shape, projection, p_pixel_range, config); @@ -1420,7 +1429,7 @@ _FORCE_INLINE_ bool TextServerAdvanced::_ensure_cache_for_size(FontAdvanced *p_f fd->oversampling = 1.0; fd->size.x = p_font_data->msdf_source_size; } else if (p_font_data->oversampling <= 0.0) { - fd->oversampling = font_get_global_oversampling(); + fd->oversampling = _font_get_global_oversampling(); } else { fd->oversampling = p_font_data->oversampling; } @@ -1813,8 +1822,8 @@ _FORCE_INLINE_ bool TextServerAdvanced::_ensure_cache_for_size(FontAdvanced *p_f coords.write[i] = CLAMP(var.value * 65536.0, amaster->axis[i].minimum, amaster->axis[i].maximum); } - if (p_font_data->variation_coordinates.has(tag_to_name(var.tag))) { - var.value = p_font_data->variation_coordinates[tag_to_name(var.tag)]; + if (p_font_data->variation_coordinates.has(_tag_to_name(var.tag))) { + var.value = p_font_data->variation_coordinates[_tag_to_name(var.tag)]; coords.write[i] = CLAMP(var.value * 65536.0, amaster->axis[i].minimum, amaster->axis[i].maximum); } @@ -1859,7 +1868,7 @@ hb_font_t *TextServerAdvanced::_font_get_hb_handle(const RID &p_font_rid, int64_ return fd->cache[size]->hb_handle; } -RID TextServerAdvanced::create_font() { +RID TextServerAdvanced::_create_font() { _THREAD_SAFE_METHOD_ FontAdvanced *fd = memnew(FontAdvanced); @@ -1867,7 +1876,7 @@ RID TextServerAdvanced::create_font() { return font_owner.make_rid(fd); } -void TextServerAdvanced::font_set_data(const RID &p_font_rid, const PackedByteArray &p_data) { +void TextServerAdvanced::_font_set_data(const RID &p_font_rid, const PackedByteArray &p_data) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1878,7 +1887,7 @@ void TextServerAdvanced::font_set_data(const RID &p_font_rid, const PackedByteAr fd->data_size = fd->data.size(); } -void TextServerAdvanced::font_set_data_ptr(const RID &p_font_rid, const uint8_t *p_data_ptr, int64_t p_data_size) { +void TextServerAdvanced::_font_set_data_ptr(const RID &p_font_rid, const uint8_t *p_data_ptr, int64_t p_data_size) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1889,7 +1898,7 @@ void TextServerAdvanced::font_set_data_ptr(const RID &p_font_rid, const uint8_t fd->data_size = p_data_size; } -void TextServerAdvanced::font_set_face_index(const RID &p_font_rid, int64_t p_face_index) { +void TextServerAdvanced::_font_set_face_index(const RID &p_font_rid, int64_t p_face_index) { ERR_FAIL_COND(p_face_index < 0); ERR_FAIL_COND(p_face_index >= 0x7FFF); @@ -1903,7 +1912,7 @@ void TextServerAdvanced::font_set_face_index(const RID &p_font_rid, int64_t p_fa } } -int64_t TextServerAdvanced::font_get_face_index(const RID &p_font_rid) const { +int64_t TextServerAdvanced::_font_get_face_index(const RID &p_font_rid) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, 0); @@ -1911,7 +1920,7 @@ int64_t TextServerAdvanced::font_get_face_index(const RID &p_font_rid) const { return fd->face_index; } -int64_t TextServerAdvanced::font_get_face_count(const RID &p_font_rid) const { +int64_t TextServerAdvanced::_font_get_face_count(const RID &p_font_rid) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, 0); @@ -1940,19 +1949,19 @@ int64_t TextServerAdvanced::font_get_face_count(const RID &p_font_rid) const { fargs.flags = FT_OPEN_MEMORY; fargs.stream = &stream; - FT_Face tmp_face; + FT_Face tmp_face = nullptr; error = FT_Open_Face(ft_library, &fargs, -1, &tmp_face); if (error == 0) { face_count = tmp_face->num_faces; + FT_Done_Face(tmp_face); } - FT_Done_Face(tmp_face); #endif } return face_count; } -void TextServerAdvanced::font_set_style(const RID &p_font_rid, BitField<FontStyle> p_style) { +void TextServerAdvanced::_font_set_style(const RID &p_font_rid, BitField<FontStyle> p_style) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1962,7 +1971,7 @@ void TextServerAdvanced::font_set_style(const RID &p_font_rid, BitField<FontStyl fd->style_flags = p_style; } -BitField<TextServer::FontStyle> TextServerAdvanced::font_get_style(const RID &p_font_rid) const { +BitField<TextServer::FontStyle> TextServerAdvanced::_font_get_style(const RID &p_font_rid) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, 0); @@ -1972,7 +1981,7 @@ BitField<TextServer::FontStyle> TextServerAdvanced::font_get_style(const RID &p_ return fd->style_flags; } -void TextServerAdvanced::font_set_style_name(const RID &p_font_rid, const String &p_name) { +void TextServerAdvanced::_font_set_style_name(const RID &p_font_rid, const String &p_name) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1982,7 +1991,7 @@ void TextServerAdvanced::font_set_style_name(const RID &p_font_rid, const String fd->style_name = p_name; } -String TextServerAdvanced::font_get_style_name(const RID &p_font_rid) const { +String TextServerAdvanced::_font_get_style_name(const RID &p_font_rid) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, String()); @@ -1992,7 +2001,7 @@ String TextServerAdvanced::font_get_style_name(const RID &p_font_rid) const { return fd->style_name; } -void TextServerAdvanced::font_set_name(const RID &p_font_rid, const String &p_name) { +void TextServerAdvanced::_font_set_name(const RID &p_font_rid, const String &p_name) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2002,7 +2011,7 @@ void TextServerAdvanced::font_set_name(const RID &p_font_rid, const String &p_na fd->font_name = p_name; } -String TextServerAdvanced::font_get_name(const RID &p_font_rid) const { +String TextServerAdvanced::_font_get_name(const RID &p_font_rid) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, String()); @@ -2012,7 +2021,7 @@ String TextServerAdvanced::font_get_name(const RID &p_font_rid) const { return fd->font_name; } -void TextServerAdvanced::font_set_antialiasing(RID p_font_rid, TextServer::FontAntialiasing p_antialiasing) { +void TextServerAdvanced::_font_set_antialiasing(const RID &p_font_rid, TextServer::FontAntialiasing p_antialiasing) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2023,7 +2032,7 @@ void TextServerAdvanced::font_set_antialiasing(RID p_font_rid, TextServer::FontA } } -TextServer::FontAntialiasing TextServerAdvanced::font_get_antialiasing(RID p_font_rid) const { +TextServer::FontAntialiasing TextServerAdvanced::_font_get_antialiasing(const RID &p_font_rid) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, TextServer::FONT_ANTIALIASING_NONE); @@ -2031,7 +2040,7 @@ TextServer::FontAntialiasing TextServerAdvanced::font_get_antialiasing(RID p_fon return fd->antialiasing; } -void TextServerAdvanced::font_set_generate_mipmaps(const RID &p_font_rid, bool p_generate_mipmaps) { +void TextServerAdvanced::_font_set_generate_mipmaps(const RID &p_font_rid, bool p_generate_mipmaps) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2040,13 +2049,14 @@ void TextServerAdvanced::font_set_generate_mipmaps(const RID &p_font_rid, bool p for (KeyValue<Vector2i, FontForSizeAdvanced *> &E : fd->cache) { for (int i = 0; i < E.value->textures.size(); i++) { E.value->textures.write[i].dirty = true; + E.value->textures.write[i].texture = Ref<ImageTexture>(); } } fd->mipmaps = p_generate_mipmaps; } } -bool TextServerAdvanced::font_get_generate_mipmaps(const RID &p_font_rid) const { +bool TextServerAdvanced::_font_get_generate_mipmaps(const RID &p_font_rid) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, false); @@ -2054,7 +2064,7 @@ bool TextServerAdvanced::font_get_generate_mipmaps(const RID &p_font_rid) const return fd->mipmaps; } -void TextServerAdvanced::font_set_multichannel_signed_distance_field(const RID &p_font_rid, bool p_msdf) { +void TextServerAdvanced::_font_set_multichannel_signed_distance_field(const RID &p_font_rid, bool p_msdf) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2065,7 +2075,7 @@ void TextServerAdvanced::font_set_multichannel_signed_distance_field(const RID & } } -bool TextServerAdvanced::font_is_multichannel_signed_distance_field(const RID &p_font_rid) const { +bool TextServerAdvanced::_font_is_multichannel_signed_distance_field(const RID &p_font_rid) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, false); @@ -2073,7 +2083,7 @@ bool TextServerAdvanced::font_is_multichannel_signed_distance_field(const RID &p return fd->msdf; } -void TextServerAdvanced::font_set_msdf_pixel_range(const RID &p_font_rid, int64_t p_msdf_pixel_range) { +void TextServerAdvanced::_font_set_msdf_pixel_range(const RID &p_font_rid, int64_t p_msdf_pixel_range) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2084,7 +2094,7 @@ void TextServerAdvanced::font_set_msdf_pixel_range(const RID &p_font_rid, int64_ } } -int64_t TextServerAdvanced::font_get_msdf_pixel_range(const RID &p_font_rid) const { +int64_t TextServerAdvanced::_font_get_msdf_pixel_range(const RID &p_font_rid) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, false); @@ -2092,7 +2102,7 @@ int64_t TextServerAdvanced::font_get_msdf_pixel_range(const RID &p_font_rid) con return fd->msdf_range; } -void TextServerAdvanced::font_set_msdf_size(const RID &p_font_rid, int64_t p_msdf_size) { +void TextServerAdvanced::_font_set_msdf_size(const RID &p_font_rid, int64_t p_msdf_size) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2103,7 +2113,7 @@ void TextServerAdvanced::font_set_msdf_size(const RID &p_font_rid, int64_t p_msd } } -int64_t TextServerAdvanced::font_get_msdf_size(const RID &p_font_rid) const { +int64_t TextServerAdvanced::_font_get_msdf_size(const RID &p_font_rid) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, false); @@ -2111,7 +2121,7 @@ int64_t TextServerAdvanced::font_get_msdf_size(const RID &p_font_rid) const { return fd->msdf_source_size; } -void TextServerAdvanced::font_set_fixed_size(const RID &p_font_rid, int64_t p_fixed_size) { +void TextServerAdvanced::_font_set_fixed_size(const RID &p_font_rid, int64_t p_fixed_size) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2119,7 +2129,7 @@ void TextServerAdvanced::font_set_fixed_size(const RID &p_font_rid, int64_t p_fi fd->fixed_size = p_fixed_size; } -int64_t TextServerAdvanced::font_get_fixed_size(const RID &p_font_rid) const { +int64_t TextServerAdvanced::_font_get_fixed_size(const RID &p_font_rid) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, false); @@ -2127,7 +2137,7 @@ int64_t TextServerAdvanced::font_get_fixed_size(const RID &p_font_rid) const { return fd->fixed_size; } -void TextServerAdvanced::font_set_force_autohinter(const RID &p_font_rid, bool p_force_autohinter) { +void TextServerAdvanced::_font_set_force_autohinter(const RID &p_font_rid, bool p_force_autohinter) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2138,7 +2148,7 @@ void TextServerAdvanced::font_set_force_autohinter(const RID &p_font_rid, bool p } } -bool TextServerAdvanced::font_is_force_autohinter(const RID &p_font_rid) const { +bool TextServerAdvanced::_font_is_force_autohinter(const RID &p_font_rid) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, false); @@ -2146,7 +2156,7 @@ bool TextServerAdvanced::font_is_force_autohinter(const RID &p_font_rid) const { return fd->force_autohinter; } -void TextServerAdvanced::font_set_hinting(const RID &p_font_rid, TextServer::Hinting p_hinting) { +void TextServerAdvanced::_font_set_hinting(const RID &p_font_rid, TextServer::Hinting p_hinting) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2157,7 +2167,7 @@ void TextServerAdvanced::font_set_hinting(const RID &p_font_rid, TextServer::Hin } } -TextServer::Hinting TextServerAdvanced::font_get_hinting(const RID &p_font_rid) const { +TextServer::Hinting TextServerAdvanced::_font_get_hinting(const RID &p_font_rid) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, HINTING_NONE); @@ -2165,7 +2175,7 @@ TextServer::Hinting TextServerAdvanced::font_get_hinting(const RID &p_font_rid) return fd->hinting; } -void TextServerAdvanced::font_set_subpixel_positioning(const RID &p_font_rid, TextServer::SubpixelPositioning p_subpixel) { +void TextServerAdvanced::_font_set_subpixel_positioning(const RID &p_font_rid, TextServer::SubpixelPositioning p_subpixel) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2173,7 +2183,7 @@ void TextServerAdvanced::font_set_subpixel_positioning(const RID &p_font_rid, Te fd->subpixel_positioning = p_subpixel; } -TextServer::SubpixelPositioning TextServerAdvanced::font_get_subpixel_positioning(const RID &p_font_rid) const { +TextServer::SubpixelPositioning TextServerAdvanced::_font_get_subpixel_positioning(const RID &p_font_rid) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, SUBPIXEL_POSITIONING_DISABLED); @@ -2181,7 +2191,7 @@ TextServer::SubpixelPositioning TextServerAdvanced::font_get_subpixel_positionin return fd->subpixel_positioning; } -void TextServerAdvanced::font_set_embolden(const RID &p_font_rid, double p_strength) { +void TextServerAdvanced::_font_set_embolden(const RID &p_font_rid, double p_strength) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2192,7 +2202,7 @@ void TextServerAdvanced::font_set_embolden(const RID &p_font_rid, double p_stren } } -double TextServerAdvanced::font_get_embolden(const RID &p_font_rid) const { +double TextServerAdvanced::_font_get_embolden(const RID &p_font_rid) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, 0.0); @@ -2200,7 +2210,7 @@ double TextServerAdvanced::font_get_embolden(const RID &p_font_rid) const { return fd->embolden; } -void TextServerAdvanced::font_set_transform(const RID &p_font_rid, const Transform2D &p_transform) { +void TextServerAdvanced::_font_set_transform(const RID &p_font_rid, const Transform2D &p_transform) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2211,7 +2221,7 @@ void TextServerAdvanced::font_set_transform(const RID &p_font_rid, const Transfo } } -Transform2D TextServerAdvanced::font_get_transform(const RID &p_font_rid) const { +Transform2D TextServerAdvanced::_font_get_transform(const RID &p_font_rid) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, Transform2D()); @@ -2219,7 +2229,7 @@ Transform2D TextServerAdvanced::font_get_transform(const RID &p_font_rid) const return fd->transform; } -void TextServerAdvanced::font_set_variation_coordinates(const RID &p_font_rid, const Dictionary &p_variation_coordinates) { +void TextServerAdvanced::_font_set_variation_coordinates(const RID &p_font_rid, const Dictionary &p_variation_coordinates) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2230,7 +2240,7 @@ void TextServerAdvanced::font_set_variation_coordinates(const RID &p_font_rid, c } } -Dictionary TextServerAdvanced::font_get_variation_coordinates(const RID &p_font_rid) const { +Dictionary TextServerAdvanced::_font_get_variation_coordinates(const RID &p_font_rid) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, Dictionary()); @@ -2238,7 +2248,7 @@ Dictionary TextServerAdvanced::font_get_variation_coordinates(const RID &p_font_ return fd->variation_coordinates; } -void TextServerAdvanced::font_set_oversampling(const RID &p_font_rid, double p_oversampling) { +void TextServerAdvanced::_font_set_oversampling(const RID &p_font_rid, double p_oversampling) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2249,7 +2259,7 @@ void TextServerAdvanced::font_set_oversampling(const RID &p_font_rid, double p_o } } -double TextServerAdvanced::font_get_oversampling(const RID &p_font_rid) const { +double TextServerAdvanced::_font_get_oversampling(const RID &p_font_rid) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, 0.0); @@ -2257,7 +2267,7 @@ double TextServerAdvanced::font_get_oversampling(const RID &p_font_rid) const { return fd->oversampling; } -TypedArray<Vector2i> TextServerAdvanced::font_get_size_cache_list(const RID &p_font_rid) const { +TypedArray<Vector2i> TextServerAdvanced::_font_get_size_cache_list(const RID &p_font_rid) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, TypedArray<Vector2i>()); @@ -2269,7 +2279,7 @@ TypedArray<Vector2i> TextServerAdvanced::font_get_size_cache_list(const RID &p_f return ret; } -void TextServerAdvanced::font_clear_size_cache(const RID &p_font_rid) { +void TextServerAdvanced::_font_clear_size_cache(const RID &p_font_rid) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2280,7 +2290,7 @@ void TextServerAdvanced::font_clear_size_cache(const RID &p_font_rid) { fd->cache.clear(); } -void TextServerAdvanced::font_remove_size_cache(const RID &p_font_rid, const Vector2i &p_size) { +void TextServerAdvanced::_font_remove_size_cache(const RID &p_font_rid, const Vector2i &p_size) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2291,7 +2301,7 @@ void TextServerAdvanced::font_remove_size_cache(const RID &p_font_rid, const Vec } } -void TextServerAdvanced::font_set_ascent(const RID &p_font_rid, int64_t p_size, double p_ascent) { +void TextServerAdvanced::_font_set_ascent(const RID &p_font_rid, int64_t p_size, double p_ascent) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2302,7 +2312,7 @@ void TextServerAdvanced::font_set_ascent(const RID &p_font_rid, int64_t p_size, fd->cache[size]->ascent = p_ascent; } -double TextServerAdvanced::font_get_ascent(const RID &p_font_rid, int64_t p_size) const { +double TextServerAdvanced::_font_get_ascent(const RID &p_font_rid, int64_t p_size) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, 0.0); @@ -2318,7 +2328,7 @@ double TextServerAdvanced::font_get_ascent(const RID &p_font_rid, int64_t p_size } } -void TextServerAdvanced::font_set_descent(const RID &p_font_rid, int64_t p_size, double p_descent) { +void TextServerAdvanced::_font_set_descent(const RID &p_font_rid, int64_t p_size, double p_descent) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2328,7 +2338,7 @@ void TextServerAdvanced::font_set_descent(const RID &p_font_rid, int64_t p_size, fd->cache[size]->descent = p_descent; } -double TextServerAdvanced::font_get_descent(const RID &p_font_rid, int64_t p_size) const { +double TextServerAdvanced::_font_get_descent(const RID &p_font_rid, int64_t p_size) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, 0.0); @@ -2344,7 +2354,7 @@ double TextServerAdvanced::font_get_descent(const RID &p_font_rid, int64_t p_siz } } -void TextServerAdvanced::font_set_underline_position(const RID &p_font_rid, int64_t p_size, double p_underline_position) { +void TextServerAdvanced::_font_set_underline_position(const RID &p_font_rid, int64_t p_size, double p_underline_position) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2355,7 +2365,7 @@ void TextServerAdvanced::font_set_underline_position(const RID &p_font_rid, int6 fd->cache[size]->underline_position = p_underline_position; } -double TextServerAdvanced::font_get_underline_position(const RID &p_font_rid, int64_t p_size) const { +double TextServerAdvanced::_font_get_underline_position(const RID &p_font_rid, int64_t p_size) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, 0.0); @@ -2371,7 +2381,7 @@ double TextServerAdvanced::font_get_underline_position(const RID &p_font_rid, in } } -void TextServerAdvanced::font_set_underline_thickness(const RID &p_font_rid, int64_t p_size, double p_underline_thickness) { +void TextServerAdvanced::_font_set_underline_thickness(const RID &p_font_rid, int64_t p_size, double p_underline_thickness) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2382,7 +2392,7 @@ void TextServerAdvanced::font_set_underline_thickness(const RID &p_font_rid, int fd->cache[size]->underline_thickness = p_underline_thickness; } -double TextServerAdvanced::font_get_underline_thickness(const RID &p_font_rid, int64_t p_size) const { +double TextServerAdvanced::_font_get_underline_thickness(const RID &p_font_rid, int64_t p_size) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, 0.0); @@ -2398,7 +2408,7 @@ double TextServerAdvanced::font_get_underline_thickness(const RID &p_font_rid, i } } -void TextServerAdvanced::font_set_scale(const RID &p_font_rid, int64_t p_size, double p_scale) { +void TextServerAdvanced::_font_set_scale(const RID &p_font_rid, int64_t p_size, double p_scale) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2414,7 +2424,7 @@ void TextServerAdvanced::font_set_scale(const RID &p_font_rid, int64_t p_size, d fd->cache[size]->scale = p_scale; } -double TextServerAdvanced::font_get_scale(const RID &p_font_rid, int64_t p_size) const { +double TextServerAdvanced::_font_get_scale(const RID &p_font_rid, int64_t p_size) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, 0.0); @@ -2430,7 +2440,7 @@ double TextServerAdvanced::font_get_scale(const RID &p_font_rid, int64_t p_size) } } -int64_t TextServerAdvanced::font_get_texture_count(const RID &p_font_rid, const Vector2i &p_size) const { +int64_t TextServerAdvanced::_font_get_texture_count(const RID &p_font_rid, const Vector2i &p_size) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, 0); @@ -2442,7 +2452,7 @@ int64_t TextServerAdvanced::font_get_texture_count(const RID &p_font_rid, const return fd->cache[size]->textures.size(); } -void TextServerAdvanced::font_clear_textures(const RID &p_font_rid, const Vector2i &p_size) { +void TextServerAdvanced::_font_clear_textures(const RID &p_font_rid, const Vector2i &p_size) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); MutexLock lock(fd->mutex); @@ -2452,7 +2462,7 @@ void TextServerAdvanced::font_clear_textures(const RID &p_font_rid, const Vector fd->cache[size]->textures.clear(); } -void TextServerAdvanced::font_remove_texture(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index) { +void TextServerAdvanced::_font_remove_texture(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2464,7 +2474,7 @@ void TextServerAdvanced::font_remove_texture(const RID &p_font_rid, const Vector fd->cache[size]->textures.remove_at(p_texture_index); } -void TextServerAdvanced::font_set_texture_image(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index, const Ref<Image> &p_image) { +void TextServerAdvanced::_font_set_texture_image(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index, const Ref<Image> &p_image) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); ERR_FAIL_COND(p_image.is_null()); @@ -2495,7 +2505,7 @@ void TextServerAdvanced::font_set_texture_image(const RID &p_font_rid, const Vec tex.dirty = false; } -Ref<Image> TextServerAdvanced::font_get_texture_image(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index) const { +Ref<Image> TextServerAdvanced::_font_get_texture_image(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, Ref<Image>()); @@ -2512,7 +2522,7 @@ Ref<Image> TextServerAdvanced::font_get_texture_image(const RID &p_font_rid, con return img; } -void TextServerAdvanced::font_set_texture_offsets(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index, const PackedInt32Array &p_offset) { +void TextServerAdvanced::_font_set_texture_offsets(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index, const PackedInt32Array &p_offset) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2528,7 +2538,7 @@ void TextServerAdvanced::font_set_texture_offsets(const RID &p_font_rid, const V tex.offsets = p_offset; } -PackedInt32Array TextServerAdvanced::font_get_texture_offsets(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index) const { +PackedInt32Array TextServerAdvanced::_font_get_texture_offsets(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, PackedInt32Array()); @@ -2541,7 +2551,7 @@ PackedInt32Array TextServerAdvanced::font_get_texture_offsets(const RID &p_font_ return tex.offsets; } -PackedInt32Array TextServerAdvanced::font_get_glyph_list(const RID &p_font_rid, const Vector2i &p_size) const { +PackedInt32Array TextServerAdvanced::_font_get_glyph_list(const RID &p_font_rid, const Vector2i &p_size) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, PackedInt32Array()); @@ -2557,7 +2567,7 @@ PackedInt32Array TextServerAdvanced::font_get_glyph_list(const RID &p_font_rid, return ret; } -void TextServerAdvanced::font_clear_glyphs(const RID &p_font_rid, const Vector2i &p_size) { +void TextServerAdvanced::_font_clear_glyphs(const RID &p_font_rid, const Vector2i &p_size) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2568,7 +2578,7 @@ void TextServerAdvanced::font_clear_glyphs(const RID &p_font_rid, const Vector2i fd->cache[size]->glyph_map.clear(); } -void TextServerAdvanced::font_remove_glyph(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) { +void TextServerAdvanced::_font_remove_glyph(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2593,7 +2603,7 @@ double TextServerAdvanced::_get_extra_advance(RID p_font_rid, int p_font_size) c } } -Vector2 TextServerAdvanced::font_get_glyph_advance(const RID &p_font_rid, int64_t p_size, int64_t p_glyph) const { +Vector2 TextServerAdvanced::_font_get_glyph_advance(const RID &p_font_rid, int64_t p_size, int64_t p_glyph) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, Vector2()); @@ -2604,7 +2614,7 @@ Vector2 TextServerAdvanced::font_get_glyph_advance(const RID &p_font_rid, int64_ int mod = 0; if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); + TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)ProjectSettings::get_singleton()->get("gui/theme/lcd_subpixel_layout"); if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { mod = (layout << 24); } @@ -2630,7 +2640,7 @@ Vector2 TextServerAdvanced::font_get_glyph_advance(const RID &p_font_rid, int64_ } } -void TextServerAdvanced::font_set_glyph_advance(const RID &p_font_rid, int64_t p_size, int64_t p_glyph, const Vector2 &p_advance) { +void TextServerAdvanced::_font_set_glyph_advance(const RID &p_font_rid, int64_t p_size, int64_t p_glyph, const Vector2 &p_advance) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2645,7 +2655,7 @@ void TextServerAdvanced::font_set_glyph_advance(const RID &p_font_rid, int64_t p gl[p_glyph].found = true; } -Vector2 TextServerAdvanced::font_get_glyph_offset(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const { +Vector2 TextServerAdvanced::_font_get_glyph_offset(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, Vector2()); @@ -2656,7 +2666,7 @@ Vector2 TextServerAdvanced::font_get_glyph_offset(const RID &p_font_rid, const V int mod = 0; if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); + TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)ProjectSettings::get_singleton()->get("gui/theme/lcd_subpixel_layout"); if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { mod = (layout << 24); } @@ -2675,7 +2685,7 @@ Vector2 TextServerAdvanced::font_get_glyph_offset(const RID &p_font_rid, const V } } -void TextServerAdvanced::font_set_glyph_offset(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, const Vector2 &p_offset) { +void TextServerAdvanced::_font_set_glyph_offset(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, const Vector2 &p_offset) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2690,7 +2700,7 @@ void TextServerAdvanced::font_set_glyph_offset(const RID &p_font_rid, const Vect gl[p_glyph].found = true; } -Vector2 TextServerAdvanced::font_get_glyph_size(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const { +Vector2 TextServerAdvanced::_font_get_glyph_size(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, Vector2()); @@ -2701,7 +2711,7 @@ Vector2 TextServerAdvanced::font_get_glyph_size(const RID &p_font_rid, const Vec int mod = 0; if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); + TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)ProjectSettings::get_singleton()->get("gui/theme/lcd_subpixel_layout"); if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { mod = (layout << 24); } @@ -2720,7 +2730,7 @@ Vector2 TextServerAdvanced::font_get_glyph_size(const RID &p_font_rid, const Vec } } -void TextServerAdvanced::font_set_glyph_size(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, const Vector2 &p_gl_size) { +void TextServerAdvanced::_font_set_glyph_size(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, const Vector2 &p_gl_size) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2735,7 +2745,7 @@ void TextServerAdvanced::font_set_glyph_size(const RID &p_font_rid, const Vector gl[p_glyph].found = true; } -Rect2 TextServerAdvanced::font_get_glyph_uv_rect(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const { +Rect2 TextServerAdvanced::_font_get_glyph_uv_rect(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, Rect2()); @@ -2746,7 +2756,7 @@ Rect2 TextServerAdvanced::font_get_glyph_uv_rect(const RID &p_font_rid, const Ve int mod = 0; if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); + TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)ProjectSettings::get_singleton()->get("gui/theme/lcd_subpixel_layout"); if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { mod = (layout << 24); } @@ -2760,7 +2770,7 @@ Rect2 TextServerAdvanced::font_get_glyph_uv_rect(const RID &p_font_rid, const Ve return gl[p_glyph | mod].uv_rect; } -void TextServerAdvanced::font_set_glyph_uv_rect(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, const Rect2 &p_uv_rect) { +void TextServerAdvanced::_font_set_glyph_uv_rect(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, const Rect2 &p_uv_rect) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2775,7 +2785,7 @@ void TextServerAdvanced::font_set_glyph_uv_rect(const RID &p_font_rid, const Vec gl[p_glyph].found = true; } -int64_t TextServerAdvanced::font_get_glyph_texture_idx(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const { +int64_t TextServerAdvanced::_font_get_glyph_texture_idx(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, -1); @@ -2786,7 +2796,7 @@ int64_t TextServerAdvanced::font_get_glyph_texture_idx(const RID &p_font_rid, co int mod = 0; if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); + TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)ProjectSettings::get_singleton()->get("gui/theme/lcd_subpixel_layout"); if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { mod = (layout << 24); } @@ -2800,7 +2810,7 @@ int64_t TextServerAdvanced::font_get_glyph_texture_idx(const RID &p_font_rid, co return gl[p_glyph | mod].texture_idx; } -void TextServerAdvanced::font_set_glyph_texture_idx(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, int64_t p_texture_idx) { +void TextServerAdvanced::_font_set_glyph_texture_idx(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, int64_t p_texture_idx) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2815,7 +2825,7 @@ void TextServerAdvanced::font_set_glyph_texture_idx(const RID &p_font_rid, const gl[p_glyph].found = true; } -RID TextServerAdvanced::font_get_glyph_texture_rid(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const { +RID TextServerAdvanced::_font_get_glyph_texture_rid(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, RID()); @@ -2826,7 +2836,7 @@ RID TextServerAdvanced::font_get_glyph_texture_rid(const RID &p_font_rid, const int mod = 0; if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); + TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)ProjectSettings::get_singleton()->get("gui/theme/lcd_subpixel_layout"); if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { mod = (layout << 24); } @@ -2863,7 +2873,7 @@ RID TextServerAdvanced::font_get_glyph_texture_rid(const RID &p_font_rid, const return RID(); } -Size2 TextServerAdvanced::font_get_glyph_texture_size(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const { +Size2 TextServerAdvanced::_font_get_glyph_texture_size(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, Size2()); @@ -2874,7 +2884,7 @@ Size2 TextServerAdvanced::font_get_glyph_texture_size(const RID &p_font_rid, con int mod = 0; if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); + TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)ProjectSettings::get_singleton()->get("gui/theme/lcd_subpixel_layout"); if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { mod = (layout << 24); } @@ -2911,7 +2921,7 @@ Size2 TextServerAdvanced::font_get_glyph_texture_size(const RID &p_font_rid, con return Size2(); } -Dictionary TextServerAdvanced::font_get_glyph_contours(const RID &p_font_rid, int64_t p_size, int64_t p_index) const { +Dictionary TextServerAdvanced::_font_get_glyph_contours(const RID &p_font_rid, int64_t p_size, int64_t p_index) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, Dictionary()); @@ -2961,7 +2971,7 @@ Dictionary TextServerAdvanced::font_get_glyph_contours(const RID &p_font_rid, in #endif } -TypedArray<Vector2i> TextServerAdvanced::font_get_kerning_list(const RID &p_font_rid, int64_t p_size) const { +TypedArray<Vector2i> TextServerAdvanced::_font_get_kerning_list(const RID &p_font_rid, int64_t p_size) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, TypedArray<Vector2i>()); @@ -2977,7 +2987,7 @@ TypedArray<Vector2i> TextServerAdvanced::font_get_kerning_list(const RID &p_font return ret; } -void TextServerAdvanced::font_clear_kerning_map(const RID &p_font_rid, int64_t p_size) { +void TextServerAdvanced::_font_clear_kerning_map(const RID &p_font_rid, int64_t p_size) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2988,7 +2998,7 @@ void TextServerAdvanced::font_clear_kerning_map(const RID &p_font_rid, int64_t p fd->cache[size]->kerning_map.clear(); } -void TextServerAdvanced::font_remove_kerning(const RID &p_font_rid, int64_t p_size, const Vector2i &p_glyph_pair) { +void TextServerAdvanced::_font_remove_kerning(const RID &p_font_rid, int64_t p_size, const Vector2i &p_glyph_pair) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2999,7 +3009,7 @@ void TextServerAdvanced::font_remove_kerning(const RID &p_font_rid, int64_t p_si fd->cache[size]->kerning_map.erase(p_glyph_pair); } -void TextServerAdvanced::font_set_kerning(const RID &p_font_rid, int64_t p_size, const Vector2i &p_glyph_pair, const Vector2 &p_kerning) { +void TextServerAdvanced::_font_set_kerning(const RID &p_font_rid, int64_t p_size, const Vector2i &p_glyph_pair, const Vector2 &p_kerning) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -3010,7 +3020,7 @@ void TextServerAdvanced::font_set_kerning(const RID &p_font_rid, int64_t p_size, fd->cache[size]->kerning_map[p_glyph_pair] = p_kerning; } -Vector2 TextServerAdvanced::font_get_kerning(const RID &p_font_rid, int64_t p_size, const Vector2i &p_glyph_pair) const { +Vector2 TextServerAdvanced::_font_get_kerning(const RID &p_font_rid, int64_t p_size, const Vector2i &p_glyph_pair) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, Vector2()); @@ -3043,7 +3053,7 @@ Vector2 TextServerAdvanced::font_get_kerning(const RID &p_font_rid, int64_t p_si return Vector2(); } -int64_t TextServerAdvanced::font_get_glyph_index(const RID &p_font_rid, int64_t p_size, int64_t p_char, int64_t p_variation_selector) const { +int64_t TextServerAdvanced::_font_get_glyph_index(const RID &p_font_rid, int64_t p_size, int64_t p_char, int64_t p_variation_selector) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, 0); ERR_FAIL_COND_V_MSG((p_char >= 0xd800 && p_char <= 0xdfff) || (p_char > 0x10ffff), 0, "Unicode parsing error: Invalid unicode codepoint " + String::num_int64(p_char, 16) + "."); @@ -3068,10 +3078,12 @@ int64_t TextServerAdvanced::font_get_glyph_index(const RID &p_font_rid, int64_t #endif } -bool TextServerAdvanced::font_has_char(const RID &p_font_rid, int64_t p_char) const { +bool TextServerAdvanced::_font_has_char(const RID &p_font_rid, int64_t p_char) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); - ERR_FAIL_COND_V(!fd, false); ERR_FAIL_COND_V_MSG((p_char >= 0xd800 && p_char <= 0xdfff) || (p_char > 0x10ffff), false, "Unicode parsing error: Invalid unicode codepoint " + String::num_int64(p_char, 16) + "."); + if (!fd) { + return false; + } MutexLock lock(fd->mutex); if (fd->cache.is_empty()) { @@ -3087,7 +3099,7 @@ bool TextServerAdvanced::font_has_char(const RID &p_font_rid, int64_t p_char) co return (at_size) ? at_size->glyph_map.has((int32_t)p_char) : false; } -String TextServerAdvanced::font_get_supported_chars(const RID &p_font_rid) const { +String TextServerAdvanced::_font_get_supported_chars(const RID &p_font_rid) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, String()); @@ -3120,7 +3132,7 @@ String TextServerAdvanced::font_get_supported_chars(const RID &p_font_rid) const return chars; } -void TextServerAdvanced::font_render_range(const RID &p_font_rid, const Vector2i &p_size, int64_t p_start, int64_t p_end) { +void TextServerAdvanced::_font_render_range(const RID &p_font_rid, const Vector2i &p_size, int64_t p_start, int64_t p_end) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); ERR_FAIL_COND_MSG((p_start >= 0xd800 && p_start <= 0xdfff) || (p_start > 0x10ffff), "Unicode parsing error: Invalid unicode codepoint " + String::num_int64(p_start, 16) + "."); @@ -3155,7 +3167,7 @@ void TextServerAdvanced::font_render_range(const RID &p_font_rid, const Vector2i } } -void TextServerAdvanced::font_render_glyph(const RID &p_font_rid, const Vector2i &p_size, int64_t p_index) { +void TextServerAdvanced::_font_render_glyph(const RID &p_font_rid, const Vector2i &p_size, int64_t p_index) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -3186,7 +3198,7 @@ void TextServerAdvanced::font_render_glyph(const RID &p_font_rid, const Vector2i #endif } -void TextServerAdvanced::font_draw_glyph(const RID &p_font_rid, const RID &p_canvas, int64_t p_size, const Vector2 &p_pos, int64_t p_index, const Color &p_color) const { +void TextServerAdvanced::_font_draw_glyph(const RID &p_font_rid, const RID &p_canvas, int64_t p_size, const Vector2 &p_pos, int64_t p_index, const Color &p_color) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -3201,7 +3213,7 @@ void TextServerAdvanced::font_draw_glyph(const RID &p_font_rid, const RID &p_can if (!fd->msdf && fd->cache[size]->face) { // LCD layout, bits 24, 25, 26 if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); + TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)ProjectSettings::get_singleton()->get("gui/theme/lcd_subpixel_layout"); if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { lcd_aa = true; index = index | (layout << 24); @@ -3278,7 +3290,7 @@ void TextServerAdvanced::font_draw_glyph(const RID &p_font_rid, const RID &p_can } } -void TextServerAdvanced::font_draw_glyph_outline(const RID &p_font_rid, const RID &p_canvas, int64_t p_size, int64_t p_outline_size, const Vector2 &p_pos, int64_t p_index, const Color &p_color) const { +void TextServerAdvanced::_font_draw_glyph_outline(const RID &p_font_rid, const RID &p_canvas, int64_t p_size, int64_t p_outline_size, const Vector2 &p_pos, int64_t p_index, const Color &p_color) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -3293,7 +3305,7 @@ void TextServerAdvanced::font_draw_glyph_outline(const RID &p_font_rid, const RI if (!fd->msdf && fd->cache[size]->face) { // LCD layout, bits 24, 25, 26 if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); + TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)ProjectSettings::get_singleton()->get("gui/theme/lcd_subpixel_layout"); if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { lcd_aa = true; index = index | (layout << 24); @@ -3370,7 +3382,7 @@ void TextServerAdvanced::font_draw_glyph_outline(const RID &p_font_rid, const RI } } -bool TextServerAdvanced::font_is_language_supported(const RID &p_font_rid, const String &p_language) const { +bool TextServerAdvanced::_font_is_language_supported(const RID &p_font_rid, const String &p_language) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, false); @@ -3382,7 +3394,7 @@ bool TextServerAdvanced::font_is_language_supported(const RID &p_font_rid, const } } -void TextServerAdvanced::font_set_language_support_override(const RID &p_font_rid, const String &p_language, bool p_supported) { +void TextServerAdvanced::_font_set_language_support_override(const RID &p_font_rid, const String &p_language, bool p_supported) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -3390,7 +3402,7 @@ void TextServerAdvanced::font_set_language_support_override(const RID &p_font_ri fd->language_support_overrides[p_language] = p_supported; } -bool TextServerAdvanced::font_get_language_support_override(const RID &p_font_rid, const String &p_language) { +bool TextServerAdvanced::_font_get_language_support_override(const RID &p_font_rid, const String &p_language) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, false); @@ -3398,7 +3410,7 @@ bool TextServerAdvanced::font_get_language_support_override(const RID &p_font_ri return fd->language_support_overrides[p_language]; } -void TextServerAdvanced::font_remove_language_support_override(const RID &p_font_rid, const String &p_language) { +void TextServerAdvanced::_font_remove_language_support_override(const RID &p_font_rid, const String &p_language) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -3406,7 +3418,7 @@ void TextServerAdvanced::font_remove_language_support_override(const RID &p_font fd->language_support_overrides.erase(p_language); } -PackedStringArray TextServerAdvanced::font_get_language_support_overrides(const RID &p_font_rid) { +PackedStringArray TextServerAdvanced::_font_get_language_support_overrides(const RID &p_font_rid) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, PackedStringArray()); @@ -3418,7 +3430,7 @@ PackedStringArray TextServerAdvanced::font_get_language_support_overrides(const return out; } -bool TextServerAdvanced::font_is_script_supported(const RID &p_font_rid, const String &p_script) const { +bool TextServerAdvanced::_font_is_script_supported(const RID &p_font_rid, const String &p_script) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, false); @@ -3432,7 +3444,7 @@ bool TextServerAdvanced::font_is_script_supported(const RID &p_font_rid, const S } } -void TextServerAdvanced::font_set_script_support_override(const RID &p_font_rid, const String &p_script, bool p_supported) { +void TextServerAdvanced::_font_set_script_support_override(const RID &p_font_rid, const String &p_script, bool p_supported) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -3440,7 +3452,7 @@ void TextServerAdvanced::font_set_script_support_override(const RID &p_font_rid, fd->script_support_overrides[p_script] = p_supported; } -bool TextServerAdvanced::font_get_script_support_override(const RID &p_font_rid, const String &p_script) { +bool TextServerAdvanced::_font_get_script_support_override(const RID &p_font_rid, const String &p_script) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, false); @@ -3448,7 +3460,7 @@ bool TextServerAdvanced::font_get_script_support_override(const RID &p_font_rid, return fd->script_support_overrides[p_script]; } -void TextServerAdvanced::font_remove_script_support_override(const RID &p_font_rid, const String &p_script) { +void TextServerAdvanced::_font_remove_script_support_override(const RID &p_font_rid, const String &p_script) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -3456,7 +3468,7 @@ void TextServerAdvanced::font_remove_script_support_override(const RID &p_font_r fd->script_support_overrides.erase(p_script); } -PackedStringArray TextServerAdvanced::font_get_script_support_overrides(const RID &p_font_rid) { +PackedStringArray TextServerAdvanced::_font_get_script_support_overrides(const RID &p_font_rid) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, PackedStringArray()); @@ -3468,7 +3480,7 @@ PackedStringArray TextServerAdvanced::font_get_script_support_overrides(const RI return out; } -void TextServerAdvanced::font_set_opentype_feature_overrides(const RID &p_font_rid, const Dictionary &p_overrides) { +void TextServerAdvanced::_font_set_opentype_feature_overrides(const RID &p_font_rid, const Dictionary &p_overrides) { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -3478,7 +3490,7 @@ void TextServerAdvanced::font_set_opentype_feature_overrides(const RID &p_font_r fd->feature_overrides = p_overrides; } -Dictionary TextServerAdvanced::font_get_opentype_feature_overrides(const RID &p_font_rid) const { +Dictionary TextServerAdvanced::_font_get_opentype_feature_overrides(const RID &p_font_rid) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, Dictionary()); @@ -3486,7 +3498,7 @@ Dictionary TextServerAdvanced::font_get_opentype_feature_overrides(const RID &p_ return fd->feature_overrides; } -Dictionary TextServerAdvanced::font_supported_feature_list(const RID &p_font_rid) const { +Dictionary TextServerAdvanced::_font_supported_feature_list(const RID &p_font_rid) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, Dictionary()); @@ -3496,7 +3508,7 @@ Dictionary TextServerAdvanced::font_supported_feature_list(const RID &p_font_rid return fd->supported_features; } -Dictionary TextServerAdvanced::font_supported_variation_list(const RID &p_font_rid) const { +Dictionary TextServerAdvanced::_font_supported_variation_list(const RID &p_font_rid) const { FontAdvanced *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, Dictionary()); @@ -3506,11 +3518,11 @@ Dictionary TextServerAdvanced::font_supported_variation_list(const RID &p_font_r return fd->supported_varaitions; } -double TextServerAdvanced::font_get_global_oversampling() const { +double TextServerAdvanced::_font_get_global_oversampling() const { return oversampling; } -void TextServerAdvanced::font_set_global_oversampling(double p_oversampling) { +void TextServerAdvanced::_font_set_global_oversampling(double p_oversampling) { _THREAD_SAFE_METHOD_ if (oversampling != p_oversampling) { oversampling = p_oversampling; @@ -3518,8 +3530,8 @@ void TextServerAdvanced::font_set_global_oversampling(double p_oversampling) { font_owner.get_owned_list(&fonts); bool font_cleared = false; for (const RID &E : fonts) { - if (!font_is_multichannel_signed_distance_field(E) && font_get_oversampling(E) <= 0) { - font_clear_size_cache(E); + if (!_font_is_multichannel_signed_distance_field(E) && _font_get_oversampling(E) <= 0) { + _font_clear_size_cache(E); font_cleared = true; } } @@ -3628,7 +3640,7 @@ void TextServerAdvanced::full_copy(ShapedTextDataAdvanced *p_shaped) { p_shaped->parent = RID(); } -RID TextServerAdvanced::create_shaped_text(TextServer::Direction p_direction, TextServer::Orientation p_orientation) { +RID TextServerAdvanced::_create_shaped_text(TextServer::Direction p_direction, TextServer::Orientation p_orientation) { _THREAD_SAFE_METHOD_ ShapedTextDataAdvanced *sd = memnew(ShapedTextDataAdvanced); @@ -3638,7 +3650,7 @@ RID TextServerAdvanced::create_shaped_text(TextServer::Direction p_direction, Te return shaped_owner.make_rid(sd); } -void TextServerAdvanced::shaped_text_clear(const RID &p_shaped) { +void TextServerAdvanced::_shaped_text_clear(const RID &p_shaped) { ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND(!sd); @@ -3653,7 +3665,7 @@ void TextServerAdvanced::shaped_text_clear(const RID &p_shaped) { invalidate(sd, true); } -void TextServerAdvanced::shaped_text_set_direction(const RID &p_shaped, TextServer::Direction p_direction) { +void TextServerAdvanced::_shaped_text_set_direction(const RID &p_shaped, TextServer::Direction p_direction) { ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND(!sd); @@ -3667,7 +3679,7 @@ void TextServerAdvanced::shaped_text_set_direction(const RID &p_shaped, TextServ } } -TextServer::Direction TextServerAdvanced::shaped_text_get_direction(const RID &p_shaped) const { +TextServer::Direction TextServerAdvanced::_shaped_text_get_direction(const RID &p_shaped) const { const ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, TextServer::DIRECTION_LTR); @@ -3675,7 +3687,7 @@ TextServer::Direction TextServerAdvanced::shaped_text_get_direction(const RID &p return sd->direction; } -TextServer::Direction TextServerAdvanced::shaped_text_get_inferred_direction(const RID &p_shaped) const { +TextServer::Direction TextServerAdvanced::_shaped_text_get_inferred_direction(const RID &p_shaped) const { const ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, TextServer::DIRECTION_LTR); @@ -3683,7 +3695,7 @@ TextServer::Direction TextServerAdvanced::shaped_text_get_inferred_direction(con return sd->para_direction; } -void TextServerAdvanced::shaped_text_set_custom_punctuation(const RID &p_shaped, const String &p_punct) { +void TextServerAdvanced::_shaped_text_set_custom_punctuation(const RID &p_shaped, const String &p_punct) { _THREAD_SAFE_METHOD_ ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND(!sd); @@ -3697,14 +3709,14 @@ void TextServerAdvanced::shaped_text_set_custom_punctuation(const RID &p_shaped, } } -String TextServerAdvanced::shaped_text_get_custom_punctuation(const RID &p_shaped) const { +String TextServerAdvanced::_shaped_text_get_custom_punctuation(const RID &p_shaped) const { _THREAD_SAFE_METHOD_ const ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, String()); return sd->custom_punct; } -void TextServerAdvanced::shaped_text_set_bidi_override(const RID &p_shaped, const Array &p_override) { +void TextServerAdvanced::_shaped_text_set_bidi_override(const RID &p_shaped, const Array &p_override) { ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND(!sd); @@ -3721,7 +3733,7 @@ void TextServerAdvanced::shaped_text_set_bidi_override(const RID &p_shaped, cons invalidate(sd, false); } -void TextServerAdvanced::shaped_text_set_orientation(const RID &p_shaped, TextServer::Orientation p_orientation) { +void TextServerAdvanced::_shaped_text_set_orientation(const RID &p_shaped, TextServer::Orientation p_orientation) { ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND(!sd); @@ -3735,7 +3747,7 @@ void TextServerAdvanced::shaped_text_set_orientation(const RID &p_shaped, TextSe } } -void TextServerAdvanced::shaped_text_set_preserve_invalid(const RID &p_shaped, bool p_enabled) { +void TextServerAdvanced::_shaped_text_set_preserve_invalid(const RID &p_shaped, bool p_enabled) { ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND(!sd); @@ -3747,7 +3759,7 @@ void TextServerAdvanced::shaped_text_set_preserve_invalid(const RID &p_shaped, b } } -bool TextServerAdvanced::shaped_text_get_preserve_invalid(const RID &p_shaped) const { +bool TextServerAdvanced::_shaped_text_get_preserve_invalid(const RID &p_shaped) const { const ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, false); @@ -3755,7 +3767,7 @@ bool TextServerAdvanced::shaped_text_get_preserve_invalid(const RID &p_shaped) c return sd->preserve_invalid; } -void TextServerAdvanced::shaped_text_set_preserve_control(const RID &p_shaped, bool p_enabled) { +void TextServerAdvanced::_shaped_text_set_preserve_control(const RID &p_shaped, bool p_enabled) { ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND(!sd); @@ -3769,7 +3781,7 @@ void TextServerAdvanced::shaped_text_set_preserve_control(const RID &p_shaped, b } } -bool TextServerAdvanced::shaped_text_get_preserve_control(const RID &p_shaped) const { +bool TextServerAdvanced::_shaped_text_get_preserve_control(const RID &p_shaped) const { const ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, false); @@ -3777,7 +3789,7 @@ bool TextServerAdvanced::shaped_text_get_preserve_control(const RID &p_shaped) c return sd->preserve_control; } -void TextServerAdvanced::shaped_text_set_spacing(const RID &p_shaped, SpacingType p_spacing, int64_t p_value) { +void TextServerAdvanced::_shaped_text_set_spacing(const RID &p_shaped, SpacingType p_spacing, int64_t p_value) { ERR_FAIL_INDEX((int)p_spacing, 4); ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND(!sd); @@ -3792,7 +3804,7 @@ void TextServerAdvanced::shaped_text_set_spacing(const RID &p_shaped, SpacingTyp } } -int64_t TextServerAdvanced::shaped_text_get_spacing(const RID &p_shaped, SpacingType p_spacing) const { +int64_t TextServerAdvanced::_shaped_text_get_spacing(const RID &p_shaped, SpacingType p_spacing) const { ERR_FAIL_INDEX_V((int)p_spacing, 4, 0); const ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); @@ -3802,7 +3814,7 @@ int64_t TextServerAdvanced::shaped_text_get_spacing(const RID &p_shaped, Spacing return sd->extra_spacing[p_spacing]; } -TextServer::Orientation TextServerAdvanced::shaped_text_get_orientation(const RID &p_shaped) const { +TextServer::Orientation TextServerAdvanced::_shaped_text_get_orientation(const RID &p_shaped) const { const ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, TextServer::ORIENTATION_HORIZONTAL); @@ -3810,41 +3822,33 @@ TextServer::Orientation TextServerAdvanced::shaped_text_get_orientation(const RI return sd->orientation; } -int64_t TextServerAdvanced::shaped_get_span_count(const RID &p_shaped) const { +int64_t TextServerAdvanced::_shaped_get_span_count(const RID &p_shaped) const { ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, 0); return sd->spans.size(); } -Variant TextServerAdvanced::shaped_get_span_meta(const RID &p_shaped, int64_t p_index) const { +Variant TextServerAdvanced::_shaped_get_span_meta(const RID &p_shaped, int64_t p_index) const { ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, Variant()); ERR_FAIL_INDEX_V(p_index, sd->spans.size(), Variant()); return sd->spans[p_index].meta; } -void TextServerAdvanced::shaped_set_span_update_font(const RID &p_shaped, int64_t p_index, const TypedArray<RID> &p_fonts, int64_t p_size, const Dictionary &p_opentype_features) { +void TextServerAdvanced::_shaped_set_span_update_font(const RID &p_shaped, int64_t p_index, const TypedArray<RID> &p_fonts, int64_t p_size, const Dictionary &p_opentype_features) { ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND(!sd); ERR_FAIL_INDEX(p_index, sd->spans.size()); ShapedTextDataAdvanced::Span &span = sd->spans.ptrw()[p_index]; - bool changed = (span.font_size != p_size) || (span.features != p_opentype_features) || (p_fonts.size() != span.fonts.size()); - if (!changed) { - for (int i = 0; i < p_fonts.size(); i++) { - changed = changed || (span.fonts[i] != p_fonts[i]); - } - } - if (changed) { - span.fonts = p_fonts; - span.font_size = p_size; - span.features = p_opentype_features; + span.fonts = p_fonts; + span.font_size = p_size; + span.features = p_opentype_features; - invalidate(sd, false); - } + invalidate(sd, false); } -bool TextServerAdvanced::shaped_text_add_string(const RID &p_shaped, const String &p_text, const TypedArray<RID> &p_fonts, int64_t p_size, const Dictionary &p_opentype_features, const String &p_language, const Variant &p_meta) { +bool TextServerAdvanced::_shaped_text_add_string(const RID &p_shaped, const String &p_text, const TypedArray<RID> &p_fonts, int64_t p_size, const Dictionary &p_opentype_features, const String &p_language, const Variant &p_meta) { ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, false); ERR_FAIL_COND_V(p_size <= 0, false); @@ -3879,7 +3883,7 @@ bool TextServerAdvanced::shaped_text_add_string(const RID &p_shaped, const Strin return true; } -bool TextServerAdvanced::shaped_text_add_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align, int64_t p_length) { +bool TextServerAdvanced::_shaped_text_add_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align, int64_t p_length) { _THREAD_SAFE_METHOD_ ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, false); @@ -3909,7 +3913,7 @@ bool TextServerAdvanced::shaped_text_add_object(const RID &p_shaped, const Varia return true; } -bool TextServerAdvanced::shaped_text_resize_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align) { +bool TextServerAdvanced::_shaped_text_resize_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align) { ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, false); @@ -3950,14 +3954,14 @@ bool TextServerAdvanced::shaped_text_resize_object(const RID &p_shaped, const Va } else { if (gl.font_rid.is_valid()) { if (sd->orientation == ORIENTATION_HORIZONTAL) { - sd->ascent = MAX(sd->ascent, MAX(font_get_ascent(gl.font_rid, gl.font_size), -gl.y_off)); - sd->descent = MAX(sd->descent, MAX(font_get_descent(gl.font_rid, gl.font_size), gl.y_off)); + sd->ascent = MAX(sd->ascent, MAX(_font_get_ascent(gl.font_rid, gl.font_size), -gl.y_off)); + sd->descent = MAX(sd->descent, MAX(_font_get_descent(gl.font_rid, gl.font_size), gl.y_off)); } else { - sd->ascent = MAX(sd->ascent, Math::round(font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).x * 0.5)); - sd->descent = MAX(sd->descent, Math::round(font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).x * 0.5)); + sd->ascent = MAX(sd->ascent, Math::round(_font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).x * 0.5)); + sd->descent = MAX(sd->descent, Math::round(_font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).x * 0.5)); } - sd->upos = MAX(sd->upos, font_get_underline_position(gl.font_rid, gl.font_size)); - sd->uthk = MAX(sd->uthk, font_get_underline_thickness(gl.font_rid, gl.font_size)); + sd->upos = MAX(sd->upos, _font_get_underline_position(gl.font_rid, gl.font_size)); + sd->uthk = MAX(sd->uthk, _font_get_underline_thickness(gl.font_rid, gl.font_size)); } else if (sd->preserve_invalid || (sd->preserve_control && is_control(gl.index))) { // Glyph not found, replace with hex code box. if (sd->orientation == ORIENTATION_HORIZONTAL) { @@ -4044,7 +4048,7 @@ void TextServerAdvanced::_realign(ShapedTextDataAdvanced *p_sd) const { p_sd->descent = full_descent; } -RID TextServerAdvanced::shaped_text_substr(const RID &p_shaped, int64_t p_start, int64_t p_length) const { +RID TextServerAdvanced::_shaped_text_substr(const RID &p_shaped, int64_t p_start, int64_t p_length) const { _THREAD_SAFE_METHOD_ const ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); @@ -4052,10 +4056,10 @@ RID TextServerAdvanced::shaped_text_substr(const RID &p_shaped, int64_t p_start, MutexLock lock(sd->mutex); if (sd->parent != RID()) { - return shaped_text_substr(sd->parent, p_start, p_length); + return _shaped_text_substr(sd->parent, p_start, p_length); } if (!sd->valid) { - const_cast<TextServerAdvanced *>(this)->shaped_text_shape(p_shaped); + const_cast<TextServerAdvanced *>(this)->_shaped_text_shape(p_shaped); } ERR_FAIL_COND_V(p_start < 0 || p_length < 0, RID()); ERR_FAIL_COND_V(sd->start > p_start || sd->end < p_start, RID()); @@ -4159,11 +4163,11 @@ bool TextServerAdvanced::_shape_substr(ShapedTextDataAdvanced *p_new_sd, const S } else { if (gl.font_rid.is_valid()) { if (p_new_sd->orientation == ORIENTATION_HORIZONTAL) { - p_new_sd->ascent = MAX(p_new_sd->ascent, MAX(font_get_ascent(gl.font_rid, gl.font_size), -gl.y_off)); - p_new_sd->descent = MAX(p_new_sd->descent, MAX(font_get_descent(gl.font_rid, gl.font_size), gl.y_off)); + p_new_sd->ascent = MAX(p_new_sd->ascent, MAX(_font_get_ascent(gl.font_rid, gl.font_size), -gl.y_off)); + p_new_sd->descent = MAX(p_new_sd->descent, MAX(_font_get_descent(gl.font_rid, gl.font_size), gl.y_off)); } else { - p_new_sd->ascent = MAX(p_new_sd->ascent, Math::round(font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).x * 0.5)); - p_new_sd->descent = MAX(p_new_sd->descent, Math::round(font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).x * 0.5)); + p_new_sd->ascent = MAX(p_new_sd->ascent, Math::round(_font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).x * 0.5)); + p_new_sd->descent = MAX(p_new_sd->descent, Math::round(_font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).x * 0.5)); } } else if (p_new_sd->preserve_invalid || (p_new_sd->preserve_control && is_control(gl.index))) { // Glyph not found, replace with hex code box. @@ -4189,7 +4193,7 @@ bool TextServerAdvanced::_shape_substr(ShapedTextDataAdvanced *p_new_sd, const S return true; } -RID TextServerAdvanced::shaped_text_get_parent(const RID &p_shaped) const { +RID TextServerAdvanced::_shaped_text_get_parent(const RID &p_shaped) const { ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, RID()); @@ -4197,16 +4201,16 @@ RID TextServerAdvanced::shaped_text_get_parent(const RID &p_shaped) const { return sd->parent; } -double TextServerAdvanced::shaped_text_fit_to_width(const RID &p_shaped, double p_width, BitField<TextServer::JustificationFlag> p_jst_flags) { +double TextServerAdvanced::_shaped_text_fit_to_width(const RID &p_shaped, double p_width, BitField<TextServer::JustificationFlag> p_jst_flags) { ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, 0.0); MutexLock lock(sd->mutex); if (!sd->valid) { - const_cast<TextServerAdvanced *>(this)->shaped_text_shape(p_shaped); + const_cast<TextServerAdvanced *>(this)->_shaped_text_shape(p_shaped); } if (!sd->justification_ops_valid) { - const_cast<TextServerAdvanced *>(this)->shaped_text_update_justification_ops(p_shaped); + const_cast<TextServerAdvanced *>(this)->_shaped_text_update_justification_ops(p_shaped); } sd->fit_width_minimum_reached = false; @@ -4354,16 +4358,16 @@ double TextServerAdvanced::shaped_text_fit_to_width(const RID &p_shaped, double return Math::ceil(justification_width); } -double TextServerAdvanced::shaped_text_tab_align(const RID &p_shaped, const PackedFloat32Array &p_tab_stops) { +double TextServerAdvanced::_shaped_text_tab_align(const RID &p_shaped, const PackedFloat32Array &p_tab_stops) { ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, 0.0); MutexLock lock(sd->mutex); if (!sd->valid) { - const_cast<TextServerAdvanced *>(this)->shaped_text_shape(p_shaped); + const_cast<TextServerAdvanced *>(this)->_shaped_text_shape(p_shaped); } if (!sd->line_breaks_valid) { - const_cast<TextServerAdvanced *>(this)->shaped_text_update_breaks(p_shaped); + const_cast<TextServerAdvanced *>(this)->_shaped_text_update_breaks(p_shaped); } for (int i = 0; i < p_tab_stops.size(); i++) { @@ -4410,13 +4414,13 @@ double TextServerAdvanced::shaped_text_tab_align(const RID &p_shaped, const Pack return 0.0; } -void TextServerAdvanced::shaped_text_overrun_trim_to_width(const RID &p_shaped_line, double p_width, BitField<TextServer::TextOverrunFlag> p_trim_flags) { +void TextServerAdvanced::_shaped_text_overrun_trim_to_width(const RID &p_shaped_line, double p_width, BitField<TextServer::TextOverrunFlag> p_trim_flags) { ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped_line); ERR_FAIL_COND_MSG(!sd, "ShapedTextDataAdvanced invalid."); MutexLock lock(sd->mutex); if (!sd->valid) { - shaped_text_shape(p_shaped_line); + _shaped_text_shape(p_shaped_line); } sd->text_trimmed = false; @@ -4455,30 +4459,30 @@ void TextServerAdvanced::shaped_text_overrun_trim_to_width(const RID &p_shaped_l // Find usable fonts, if fonts from the last glyph do not have required chars. RID dot_gl_font_rid = sd_glyphs[sd_size - 1].font_rid; - if (!font_has_char(dot_gl_font_rid, '.')) { + if (!_font_has_char(dot_gl_font_rid, '.')) { const Array &fonts = spans[spans.size() - 1].fonts; for (int i = 0; i < fonts.size(); i++) { - if (font_has_char(fonts[i], '.')) { + if (_font_has_char(fonts[i], '.')) { dot_gl_font_rid = fonts[i]; break; } } } RID whitespace_gl_font_rid = sd_glyphs[sd_size - 1].font_rid; - if (!font_has_char(whitespace_gl_font_rid, '.')) { + if (!_font_has_char(whitespace_gl_font_rid, '.')) { const Array &fonts = spans[spans.size() - 1].fonts; for (int i = 0; i < fonts.size(); i++) { - if (font_has_char(fonts[i], ' ')) { + if (_font_has_char(fonts[i], ' ')) { whitespace_gl_font_rid = fonts[i]; break; } } } - int32_t dot_gl_idx = dot_gl_font_rid.is_valid() ? font_get_glyph_index(dot_gl_font_rid, last_gl_font_size, '.') : -10; - Vector2 dot_adv = dot_gl_font_rid.is_valid() ? font_get_glyph_advance(dot_gl_font_rid, last_gl_font_size, dot_gl_idx) : Vector2(); - int32_t whitespace_gl_idx = whitespace_gl_font_rid.is_valid() ? font_get_glyph_index(whitespace_gl_font_rid, last_gl_font_size, ' ') : -10; - Vector2 whitespace_adv = whitespace_gl_font_rid.is_valid() ? font_get_glyph_advance(whitespace_gl_font_rid, last_gl_font_size, whitespace_gl_idx) : Vector2(); + int32_t dot_gl_idx = dot_gl_font_rid.is_valid() ? _font_get_glyph_index(dot_gl_font_rid, last_gl_font_size, '.', 0) : -10; + Vector2 dot_adv = dot_gl_font_rid.is_valid() ? _font_get_glyph_advance(dot_gl_font_rid, last_gl_font_size, dot_gl_idx) : Vector2(); + int32_t whitespace_gl_idx = whitespace_gl_font_rid.is_valid() ? _font_get_glyph_index(whitespace_gl_font_rid, last_gl_font_size, ' ', 0) : -10; + Vector2 whitespace_adv = whitespace_gl_font_rid.is_valid() ? _font_get_glyph_advance(whitespace_gl_font_rid, last_gl_font_size, whitespace_gl_idx) : Vector2(); int ellipsis_width = 0; if (add_ellipsis && whitespace_gl_font_rid.is_valid()) { @@ -4500,35 +4504,40 @@ void TextServerAdvanced::shaped_text_overrun_trim_to_width(const RID &p_shaped_l int glyphs_to = (is_rtl) ? sd_size - 1 : -1; int glyphs_delta = (is_rtl) ? +1 : -1; - for (int i = glyphs_from; i != glyphs_to; i += glyphs_delta) { - if (!is_rtl) { - width -= sd_glyphs[i].advance * sd_glyphs[i].repeat; - } - if (sd_glyphs[i].count > 0) { - bool above_min_char_threshold = ((is_rtl) ? sd_size - 1 - i : i) >= ell_min_characters; + if (enforce_ellipsis && (width + ellipsis_width <= p_width)) { + trim_pos = -1; + ellipsis_pos = (is_rtl) ? 0 : sd_size; + } else { + for (int i = glyphs_from; i != glyphs_to; i += glyphs_delta) { + if (!is_rtl) { + width -= sd_glyphs[i].advance * sd_glyphs[i].repeat; + } + if (sd_glyphs[i].count > 0) { + bool above_min_char_threshold = ((is_rtl) ? sd_size - 1 - i : i) >= ell_min_characters; - if (width + (((above_min_char_threshold && add_ellipsis) || enforce_ellipsis) ? ellipsis_width : 0) <= p_width) { - if (cut_per_word && above_min_char_threshold) { - if ((sd_glyphs[i].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT) { + if (width + (((above_min_char_threshold && add_ellipsis) || enforce_ellipsis) ? ellipsis_width : 0) <= p_width) { + if (cut_per_word && above_min_char_threshold) { + if ((sd_glyphs[i].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT) { + last_valid_cut = i; + found = true; + } + } else { last_valid_cut = i; found = true; } - } else { - last_valid_cut = i; - found = true; - } - if (found) { - trim_pos = last_valid_cut; + if (found) { + trim_pos = last_valid_cut; - if (add_ellipsis && (above_min_char_threshold || enforce_ellipsis) && width - ellipsis_width <= p_width) { - ellipsis_pos = trim_pos; + if (add_ellipsis && (above_min_char_threshold || enforce_ellipsis) && width - ellipsis_width <= p_width) { + ellipsis_pos = trim_pos; + } + break; } - break; } } - } - if (is_rtl) { - width -= sd_glyphs[i].advance * sd_glyphs[i].repeat; + if (is_rtl) { + width -= sd_glyphs[i].advance * sd_glyphs[i].repeat; + } } } @@ -4572,7 +4581,7 @@ void TextServerAdvanced::shaped_text_overrun_trim_to_width(const RID &p_shaped_l } } -int64_t TextServerAdvanced::shaped_text_get_trim_pos(const RID &p_shaped) const { +int64_t TextServerAdvanced::_shaped_text_get_trim_pos(const RID &p_shaped) const { ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V_MSG(!sd, -1, "ShapedTextDataAdvanced invalid."); @@ -4580,7 +4589,7 @@ int64_t TextServerAdvanced::shaped_text_get_trim_pos(const RID &p_shaped) const return sd->overrun_trim_data.trim_pos; } -int64_t TextServerAdvanced::shaped_text_get_ellipsis_pos(const RID &p_shaped) const { +int64_t TextServerAdvanced::_shaped_text_get_ellipsis_pos(const RID &p_shaped) const { ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V_MSG(!sd, -1, "ShapedTextDataAdvanced invalid."); @@ -4588,7 +4597,7 @@ int64_t TextServerAdvanced::shaped_text_get_ellipsis_pos(const RID &p_shaped) co return sd->overrun_trim_data.ellipsis_pos; } -const Glyph *TextServerAdvanced::shaped_text_get_ellipsis_glyphs(const RID &p_shaped) const { +const Glyph *TextServerAdvanced::_shaped_text_get_ellipsis_glyphs(const RID &p_shaped) const { ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V_MSG(!sd, nullptr, "ShapedTextDataAdvanced invalid."); @@ -4596,7 +4605,7 @@ const Glyph *TextServerAdvanced::shaped_text_get_ellipsis_glyphs(const RID &p_sh return sd->overrun_trim_data.ellipsis_glyph_buf.ptr(); } -int64_t TextServerAdvanced::shaped_text_get_ellipsis_glyph_count(const RID &p_shaped) const { +int64_t TextServerAdvanced::_shaped_text_get_ellipsis_glyph_count(const RID &p_shaped) const { ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V_MSG(!sd, 0, "ShapedTextDataAdvanced invalid."); @@ -4604,13 +4613,13 @@ int64_t TextServerAdvanced::shaped_text_get_ellipsis_glyph_count(const RID &p_sh return sd->overrun_trim_data.ellipsis_glyph_buf.size(); } -bool TextServerAdvanced::shaped_text_update_breaks(const RID &p_shaped) { +bool TextServerAdvanced::_shaped_text_update_breaks(const RID &p_shaped) { ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, false); MutexLock lock(sd->mutex); if (!sd->valid) { - shaped_text_shape(p_shaped); + _shaped_text_shape(p_shaped); } if (sd->line_breaks_valid) { @@ -4821,16 +4830,16 @@ _FORCE_INLINE_ int64_t _generate_kashida_justification_opportunies(const String return kashida_pos; } -bool TextServerAdvanced::shaped_text_update_justification_ops(const RID &p_shaped) { +bool TextServerAdvanced::_shaped_text_update_justification_ops(const RID &p_shaped) { ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, false); MutexLock lock(sd->mutex); if (!sd->valid) { - shaped_text_shape(p_shaped); + _shaped_text_shape(p_shaped); } if (!sd->line_breaks_valid) { - shaped_text_update_breaks(p_shaped); + _shaped_text_update_breaks(p_shaped); } if (sd->justification_ops_valid) { @@ -4975,7 +4984,7 @@ bool TextServerAdvanced::shaped_text_update_justification_ops(const RID &p_shape Glyph TextServerAdvanced::_shape_single_glyph(ShapedTextDataAdvanced *p_sd, char32_t p_char, hb_script_t p_script, hb_direction_t p_direction, const RID &p_font, int64_t p_font_size) { hb_font_t *hb_font = _font_get_hb_handle(p_font, p_font_size); - bool subpos = (font_get_subpixel_positioning(p_font) == SUBPIXEL_POSITIONING_ONE_HALF) || (font_get_subpixel_positioning(p_font) == SUBPIXEL_POSITIONING_ONE_QUARTER) || (font_get_subpixel_positioning(p_font) == SUBPIXEL_POSITIONING_AUTO && p_font_size <= SUBPIXEL_POSITIONING_ONE_HALF_MAX_SIZE); + bool subpos = (_font_get_subpixel_positioning(p_font) == SUBPIXEL_POSITIONING_ONE_HALF) || (_font_get_subpixel_positioning(p_font) == SUBPIXEL_POSITIONING_ONE_QUARTER) || (_font_get_subpixel_positioning(p_font) == SUBPIXEL_POSITIONING_AUTO && p_font_size <= SUBPIXEL_POSITIONING_ONE_HALF_MAX_SIZE); ERR_FAIL_COND_V(hb_font == nullptr, Glyph()); hb_buffer_clear_contents(p_sd->hb_buffer); @@ -5001,7 +5010,7 @@ Glyph TextServerAdvanced::_shape_single_glyph(ShapedTextDataAdvanced *p_sd, char gl.font_size = p_font_size; if (glyph_count > 0) { - double scale = font_get_scale(p_font, p_font_size); + double scale = _font_get_scale(p_font, p_font_size); if (p_sd->orientation == ORIENTATION_HORIZONTAL) { if (subpos) { gl.advance = glyph_pos[0].x_advance / (64.0 / scale) + _get_extra_advance(p_font, p_font_size); @@ -5036,7 +5045,7 @@ _FORCE_INLINE_ void TextServerAdvanced::_add_featuers(const Dictionary &p_source if (value >= 0) { hb_feature_t feature; if (keys[i].get_type() == Variant::STRING) { - feature.tag = name_to_tag(keys[i]); + feature.tag = _name_to_tag(keys[i]); } else { feature.tag = keys[i]; } @@ -5087,12 +5096,12 @@ void TextServerAdvanced::_shape_run(ShapedTextDataAdvanced *p_sd, int64_t p_star Vector2i fss = _get_size(fd, fs); hb_font_t *hb_font = _font_get_hb_handle(f, fs); - double scale = font_get_scale(f, fs); + double scale = _font_get_scale(f, fs); double sp_sp = p_sd->extra_spacing[SPACING_SPACE]; double sp_gl = p_sd->extra_spacing[SPACING_GLYPH]; bool last_run = (p_sd->end == p_end); double ea = _get_extra_advance(f, fs); - bool subpos = (font_get_subpixel_positioning(f) == SUBPIXEL_POSITIONING_ONE_HALF) || (font_get_subpixel_positioning(f) == SUBPIXEL_POSITIONING_ONE_QUARTER) || (font_get_subpixel_positioning(f) == SUBPIXEL_POSITIONING_AUTO && fs <= SUBPIXEL_POSITIONING_ONE_HALF_MAX_SIZE); + bool subpos = (_font_get_subpixel_positioning(f) == SUBPIXEL_POSITIONING_ONE_HALF) || (_font_get_subpixel_positioning(f) == SUBPIXEL_POSITIONING_ONE_QUARTER) || (_font_get_subpixel_positioning(f) == SUBPIXEL_POSITIONING_AUTO && fs <= SUBPIXEL_POSITIONING_ONE_HALF_MAX_SIZE); ERR_FAIL_COND(hb_font == nullptr); hb_buffer_clear_contents(p_sd->hb_buffer); @@ -5120,7 +5129,7 @@ void TextServerAdvanced::_shape_run(ShapedTextDataAdvanced *p_sd, int64_t p_star hb_buffer_add_utf32(p_sd->hb_buffer, (const uint32_t *)p_sd->text.ptr(), p_sd->text.length(), p_start, p_end - p_start); Vector<hb_feature_t> ftrs; - _add_featuers(font_get_opentype_feature_overrides(f), ftrs); + _add_featuers(_font_get_opentype_feature_overrides(f), ftrs); _add_featuers(p_sd->spans[p_span].features, ftrs); hb_shape(hb_font, p_sd->hb_buffer, ftrs.is_empty() ? nullptr : &ftrs[0], ftrs.size()); @@ -5131,7 +5140,7 @@ void TextServerAdvanced::_shape_run(ShapedTextDataAdvanced *p_sd, int64_t p_star int mod = 0; if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); + TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)ProjectSettings::get_singleton()->get("gui/theme/lcd_subpixel_layout"); if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { mod = (layout << 24); } @@ -5251,7 +5260,7 @@ void TextServerAdvanced::_shape_run(ShapedTextDataAdvanced *p_sd, int64_t p_star p_sd->ascent = MAX(p_sd->ascent, -w[i + j].y_off); p_sd->descent = MAX(p_sd->descent, w[i + j].y_off); } else { - double gla = Math::round(font_get_glyph_advance(f, fs, w[i + j].index).x * 0.5); + double gla = Math::round(_font_get_glyph_advance(f, fs, w[i + j].index).x * 0.5); p_sd->ascent = MAX(p_sd->ascent, gla); p_sd->descent = MAX(p_sd->descent, gla); } @@ -5274,14 +5283,14 @@ void TextServerAdvanced::_shape_run(ShapedTextDataAdvanced *p_sd, int64_t p_star if (failed_subrun_start != p_end + 1) { _shape_run(p_sd, failed_subrun_start, failed_subrun_end, p_script, p_direction, p_fonts, p_span, p_fb_index + 1); } - p_sd->ascent = MAX(p_sd->ascent, font_get_ascent(f, fs)); - p_sd->descent = MAX(p_sd->descent, font_get_descent(f, fs)); - p_sd->upos = MAX(p_sd->upos, font_get_underline_position(f, fs)); - p_sd->uthk = MAX(p_sd->uthk, font_get_underline_thickness(f, fs)); + p_sd->ascent = MAX(p_sd->ascent, _font_get_ascent(f, fs)); + p_sd->descent = MAX(p_sd->descent, _font_get_descent(f, fs)); + p_sd->upos = MAX(p_sd->upos, _font_get_underline_position(f, fs)); + p_sd->uthk = MAX(p_sd->uthk, _font_get_underline_thickness(f, fs)); } } -bool TextServerAdvanced::shaped_text_shape(const RID &p_shaped) { +bool TextServerAdvanced::_shaped_text_shape(const RID &p_shaped) { ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, false); @@ -5292,7 +5301,7 @@ bool TextServerAdvanced::shaped_text_shape(const RID &p_shaped) { invalidate(sd, false); if (sd->parent != RID()) { - shaped_text_shape(sd->parent); + _shaped_text_shape(sd->parent); ShapedTextDataAdvanced *parent_sd = shaped_owner.get_or_null(sd->parent); ERR_FAIL_COND_V(!parent_sd->valid, false); ERR_FAIL_COND_V(!_shape_substr(sd, parent_sd, sd->start, sd->end - sd->start), false); @@ -5428,9 +5437,12 @@ bool TextServerAdvanced::shaped_text_shape(const RID &p_shaped) { Array fonts_scr_only; Array fonts_no_match; int font_count = span.fonts.size(); - for (int l = 0; l < font_count; l++) { - if (font_is_script_supported(span.fonts[l], script)) { - if (font_is_language_supported(span.fonts[l], span.language)) { + if (font_count > 0) { + fonts.push_back(sd->spans[k].fonts[0]); + } + for (int l = 1; l < font_count; l++) { + if (_font_is_script_supported(span.fonts[l], script)) { + if (_font_is_language_supported(span.fonts[l], span.language)) { fonts.push_back(sd->spans[k].fonts[l]); } else { fonts_scr_only.push_back(sd->spans[k].fonts[l]); @@ -5454,7 +5466,7 @@ bool TextServerAdvanced::shaped_text_shape(const RID &p_shaped) { return sd->valid; } -bool TextServerAdvanced::shaped_text_is_ready(const RID &p_shaped) const { +bool TextServerAdvanced::_shaped_text_is_ready(const RID &p_shaped) const { const ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, false); @@ -5462,35 +5474,35 @@ bool TextServerAdvanced::shaped_text_is_ready(const RID &p_shaped) const { return sd->valid; } -const Glyph *TextServerAdvanced::shaped_text_get_glyphs(const RID &p_shaped) const { +const Glyph *TextServerAdvanced::_shaped_text_get_glyphs(const RID &p_shaped) const { const ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, nullptr); MutexLock lock(sd->mutex); if (!sd->valid) { - const_cast<TextServerAdvanced *>(this)->shaped_text_shape(p_shaped); + const_cast<TextServerAdvanced *>(this)->_shaped_text_shape(p_shaped); } return sd->glyphs.ptr(); } -int64_t TextServerAdvanced::shaped_text_get_glyph_count(const RID &p_shaped) const { +int64_t TextServerAdvanced::_shaped_text_get_glyph_count(const RID &p_shaped) const { const ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, 0); MutexLock lock(sd->mutex); if (!sd->valid) { - const_cast<TextServerAdvanced *>(this)->shaped_text_shape(p_shaped); + const_cast<TextServerAdvanced *>(this)->_shaped_text_shape(p_shaped); } return sd->glyphs.size(); } -const Glyph *TextServerAdvanced::shaped_text_sort_logical(const RID &p_shaped) { +const Glyph *TextServerAdvanced::_shaped_text_sort_logical(const RID &p_shaped) { ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, nullptr); MutexLock lock(sd->mutex); if (!sd->valid) { - const_cast<TextServerAdvanced *>(this)->shaped_text_shape(p_shaped); + const_cast<TextServerAdvanced *>(this)->_shaped_text_shape(p_shaped); } if (!sd->sort_valid) { @@ -5502,7 +5514,7 @@ const Glyph *TextServerAdvanced::shaped_text_sort_logical(const RID &p_shaped) { return sd->glyphs_logical.ptr(); } -Vector2i TextServerAdvanced::shaped_text_get_range(const RID &p_shaped) const { +Vector2i TextServerAdvanced::_shaped_text_get_range(const RID &p_shaped) const { const ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, Vector2i()); @@ -5510,7 +5522,7 @@ Vector2i TextServerAdvanced::shaped_text_get_range(const RID &p_shaped) const { return Vector2(sd->start, sd->end); } -Array TextServerAdvanced::shaped_text_get_objects(const RID &p_shaped) const { +Array TextServerAdvanced::_shaped_text_get_objects(const RID &p_shaped) const { Array ret; const ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, ret); @@ -5523,25 +5535,25 @@ Array TextServerAdvanced::shaped_text_get_objects(const RID &p_shaped) const { return ret; } -Rect2 TextServerAdvanced::shaped_text_get_object_rect(const RID &p_shaped, const Variant &p_key) const { +Rect2 TextServerAdvanced::_shaped_text_get_object_rect(const RID &p_shaped, const Variant &p_key) const { const ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, Rect2()); MutexLock lock(sd->mutex); ERR_FAIL_COND_V(!sd->objects.has(p_key), Rect2()); if (!sd->valid) { - const_cast<TextServerAdvanced *>(this)->shaped_text_shape(p_shaped); + const_cast<TextServerAdvanced *>(this)->_shaped_text_shape(p_shaped); } return sd->objects[p_key].rect; } -Size2 TextServerAdvanced::shaped_text_get_size(const RID &p_shaped) const { +Size2 TextServerAdvanced::_shaped_text_get_size(const RID &p_shaped) const { const ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, Size2()); MutexLock lock(sd->mutex); if (!sd->valid) { - const_cast<TextServerAdvanced *>(this)->shaped_text_shape(p_shaped); + const_cast<TextServerAdvanced *>(this)->_shaped_text_shape(p_shaped); } if (sd->orientation == TextServer::ORIENTATION_HORIZONTAL) { return Size2((sd->text_trimmed ? sd->width_trimmed : sd->width), sd->ascent + sd->descent + sd->extra_spacing[SPACING_TOP] + sd->extra_spacing[SPACING_BOTTOM]).ceil(); @@ -5550,58 +5562,58 @@ Size2 TextServerAdvanced::shaped_text_get_size(const RID &p_shaped) const { } } -double TextServerAdvanced::shaped_text_get_ascent(const RID &p_shaped) const { +double TextServerAdvanced::_shaped_text_get_ascent(const RID &p_shaped) const { const ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, 0.0); MutexLock lock(sd->mutex); if (!sd->valid) { - const_cast<TextServerAdvanced *>(this)->shaped_text_shape(p_shaped); + const_cast<TextServerAdvanced *>(this)->_shaped_text_shape(p_shaped); } return sd->ascent + sd->extra_spacing[SPACING_TOP]; } -double TextServerAdvanced::shaped_text_get_descent(const RID &p_shaped) const { +double TextServerAdvanced::_shaped_text_get_descent(const RID &p_shaped) const { const ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, 0.0); MutexLock lock(sd->mutex); if (!sd->valid) { - const_cast<TextServerAdvanced *>(this)->shaped_text_shape(p_shaped); + const_cast<TextServerAdvanced *>(this)->_shaped_text_shape(p_shaped); } return sd->descent + sd->extra_spacing[SPACING_BOTTOM]; } -double TextServerAdvanced::shaped_text_get_width(const RID &p_shaped) const { +double TextServerAdvanced::_shaped_text_get_width(const RID &p_shaped) const { const ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, 0.0); MutexLock lock(sd->mutex); if (!sd->valid) { - const_cast<TextServerAdvanced *>(this)->shaped_text_shape(p_shaped); + const_cast<TextServerAdvanced *>(this)->_shaped_text_shape(p_shaped); } return Math::ceil(sd->text_trimmed ? sd->width_trimmed : sd->width); } -double TextServerAdvanced::shaped_text_get_underline_position(const RID &p_shaped) const { +double TextServerAdvanced::_shaped_text_get_underline_position(const RID &p_shaped) const { const ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, 0.0); MutexLock lock(sd->mutex); if (!sd->valid) { - const_cast<TextServerAdvanced *>(this)->shaped_text_shape(p_shaped); + const_cast<TextServerAdvanced *>(this)->_shaped_text_shape(p_shaped); } return sd->upos; } -double TextServerAdvanced::shaped_text_get_underline_thickness(const RID &p_shaped) const { +double TextServerAdvanced::_shaped_text_get_underline_thickness(const RID &p_shaped) const { const ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, 0.0); MutexLock lock(sd->mutex); if (!sd->valid) { - const_cast<TextServerAdvanced *>(this)->shaped_text_shape(p_shaped); + const_cast<TextServerAdvanced *>(this)->_shaped_text_shape(p_shaped); } return sd->uthk; @@ -5782,7 +5794,7 @@ void TextServerAdvanced::_insert_num_systems_lang() { } } -String TextServerAdvanced::format_number(const String &p_string, const String &p_language) const { +String TextServerAdvanced::_format_number(const String &p_string, const String &p_language) const { const StringName lang = (p_language.is_empty()) ? TranslationServer::get_singleton()->get_tool_locale() : p_language; String res = p_string; @@ -5807,7 +5819,7 @@ String TextServerAdvanced::format_number(const String &p_string, const String &p return res; } -String TextServerAdvanced::parse_number(const String &p_string, const String &p_language) const { +String TextServerAdvanced::_parse_number(const String &p_string, const String &p_language) const { const StringName lang = (p_language.is_empty()) ? TranslationServer::get_singleton()->get_tool_locale() : p_language; String res = p_string; @@ -5835,7 +5847,7 @@ String TextServerAdvanced::parse_number(const String &p_string, const String &p_ return res; } -String TextServerAdvanced::percent_sign(const String &p_language) const { +String TextServerAdvanced::_percent_sign(const String &p_language) const { const StringName lang = (p_language.is_empty()) ? TranslationServer::get_singleton()->get_tool_locale() : p_language; for (int i = 0; i < num_systems.size(); i++) { @@ -5849,9 +5861,9 @@ String TextServerAdvanced::percent_sign(const String &p_language) const { return "%"; } -int TextServerAdvanced::is_confusable(const String &p_string, const PackedStringArray &p_dict) const { +int64_t TextServerAdvanced::_is_confusable(const String &p_string, const PackedStringArray &p_dict) const { UErrorCode status = U_ZERO_ERROR; - int match_index = -1; + int64_t match_index = -1; Char16String utf16 = p_string.utf16(); Vector<UChar *> skeletons; @@ -5889,7 +5901,7 @@ int TextServerAdvanced::is_confusable(const String &p_string, const PackedString return match_index; } -bool TextServerAdvanced::spoof_check(const String &p_string) const { +bool TextServerAdvanced::_spoof_check(const String &p_string) const { UErrorCode status = U_ZERO_ERROR; Char16String utf16 = p_string.utf16(); @@ -5911,7 +5923,7 @@ bool TextServerAdvanced::spoof_check(const String &p_string) const { return (bitmask != 0); } -String TextServerAdvanced::strip_diacritics(const String &p_string) const { +String TextServerAdvanced::_strip_diacritics(const String &p_string) const { UErrorCode err = U_ZERO_ERROR; // Get NFKD normalizer singleton. @@ -5944,7 +5956,7 @@ String TextServerAdvanced::strip_diacritics(const String &p_string) const { return result; } -String TextServerAdvanced::string_to_upper(const String &p_string, const String &p_language) const { +String TextServerAdvanced::_string_to_upper(const String &p_string, const String &p_language) const { const String lang = (p_language.is_empty()) ? TranslationServer::get_singleton()->get_tool_locale() : p_language; // Convert to UTF-16. @@ -5963,7 +5975,7 @@ String TextServerAdvanced::string_to_upper(const String &p_string, const String return String::utf16(upper.ptr(), len); } -String TextServerAdvanced::string_to_lower(const String &p_string, const String &p_language) const { +String TextServerAdvanced::_string_to_lower(const String &p_string, const String &p_language) const { const String lang = (p_language.is_empty()) ? TranslationServer::get_singleton()->get_tool_locale() : p_language; // Convert to UTF-16. Char16String utf16 = p_string.utf16(); @@ -5981,7 +5993,7 @@ String TextServerAdvanced::string_to_lower(const String &p_string, const String return String::utf16(lower.ptr(), len); } -PackedInt32Array TextServerAdvanced::string_get_word_breaks(const String &p_string, const String &p_language) const { +PackedInt32Array TextServerAdvanced::_string_get_word_breaks(const String &p_string, const String &p_language) const { const String lang = (p_language.is_empty()) ? TranslationServer::get_singleton()->get_tool_locale() : p_language; // Convert to UTF-16. Char16String utf16 = p_string.utf16(); @@ -6029,7 +6041,7 @@ PackedInt32Array TextServerAdvanced::string_get_word_breaks(const String &p_stri return ret; } -bool TextServerAdvanced::is_valid_identifier(const String &p_string) const { +bool TextServerAdvanced::_is_valid_identifier(const String &p_string) const { enum UAX31SequenceStatus { SEQ_NOT_STARTED, SEQ_STARTED, @@ -6050,7 +6062,7 @@ bool TextServerAdvanced::is_valid_identifier(const String &p_string) const { if (U_FAILURE(err)) { return false; // Failed to load normalizer. } - bool isnurom = unorm2_isNormalized(norm_c, utf16.ptr(), utf16.length(), &err); + bool isnurom = unorm2_isNormalized(norm_c, utf16.get_data(), utf16.length(), &err); if (U_FAILURE(err) || !isnurom) { return false; // Do not conform to Normalization Form C. } diff --git a/modules/text_server_adv/text_server_adv.h b/modules/text_server_adv/text_server_adv.h index 1db95d153b..fb5075e835 100644 --- a/modules/text_server_adv/text_server_adv.h +++ b/modules/text_server_adv/text_server_adv.h @@ -42,6 +42,7 @@ #include <godot_cpp/godot.hpp> #include <godot_cpp/core/class_db.hpp> +#include <godot_cpp/core/ext_wrappers.gen.inc> #include <godot_cpp/core/mutex_lock.hpp> #include <godot_cpp/variant/array.hpp> @@ -52,6 +53,7 @@ #include <godot_cpp/variant/rect2.hpp> #include <godot_cpp/variant/rid.hpp> #include <godot_cpp/variant/string.hpp> +#include <godot_cpp/variant/typed_array.hpp> #include <godot_cpp/variant/vector2.hpp> #include <godot_cpp/variant/vector2i.hpp> @@ -78,11 +80,13 @@ using namespace godot; #else // Headers for building as built-in module. +#include "servers/text/text_server_extension.h" + +#include "core/extension/ext_wrappers.gen.inc" #include "core/object/worker_thread_pool.h" #include "core/templates/hash_map.h" #include "core/templates/rid_owner.h" #include "scene/resources/texture.h" -#include "servers/text/text_server_extension.h" #include "modules/modules_enabled.gen.h" // For freetype, msdfgen. @@ -461,258 +465,259 @@ protected: void invalidate(ShapedTextDataAdvanced *p_shaped, bool p_text = false); public: - virtual bool has_feature(Feature p_feature) const override; - virtual String get_name() const override; - virtual int64_t get_features() const override; + MODBIND1RC(bool, has_feature, Feature); + MODBIND0RC(String, get_name); + MODBIND0RC(int64_t, get_features); - virtual void free_rid(const RID &p_rid) override; - virtual bool has(const RID &p_rid) override; - virtual bool load_support_data(const String &p_filename) override; + MODBIND1(free_rid, const RID &); + MODBIND1R(bool, has, const RID &); + MODBIND1R(bool, load_support_data, const String &); - virtual String get_support_data_filename() const override; - virtual String get_support_data_info() const override; - virtual bool save_support_data(const String &p_filename) const override; + MODBIND0RC(String, get_support_data_filename); + MODBIND0RC(String, get_support_data_info); + MODBIND1RC(bool, save_support_data, const String &); - virtual bool is_locale_right_to_left(const String &p_locale) const override; + MODBIND1RC(bool, is_locale_right_to_left, const String &); - virtual int64_t name_to_tag(const String &p_name) const override; - virtual String tag_to_name(int64_t p_tag) const override; + MODBIND1RC(int64_t, name_to_tag, const String &); + MODBIND1RC(String, tag_to_name, int64_t); /* Font interface */ - virtual RID create_font() override; - virtual void font_set_data(const RID &p_font_rid, const PackedByteArray &p_data) override; - virtual void font_set_data_ptr(const RID &p_font_rid, const uint8_t *p_data_ptr, int64_t p_data_size) override; + MODBIND0R(RID, create_font); + + MODBIND2(font_set_data, const RID &, const PackedByteArray &); + MODBIND3(font_set_data_ptr, const RID &, const uint8_t *, int64_t); - virtual void font_set_face_index(const RID &p_font_rid, int64_t p_index) override; - virtual int64_t font_get_face_index(const RID &p_font_rid) const override; + MODBIND2(font_set_face_index, const RID &, int64_t); + MODBIND1RC(int64_t, font_get_face_index, const RID &); - virtual int64_t font_get_face_count(const RID &p_font_rid) const override; + MODBIND1RC(int64_t, font_get_face_count, const RID &); - virtual void font_set_style(const RID &p_font_rid, BitField<FontStyle> p_style) override; - virtual BitField<FontStyle> font_get_style(const RID &p_font_rid) const override; + MODBIND2(font_set_style, const RID &, BitField<FontStyle>); + MODBIND1RC(BitField<FontStyle>, font_get_style, const RID &); - virtual void font_set_style_name(const RID &p_font_rid, const String &p_name) override; - virtual String font_get_style_name(const RID &p_font_rid) const override; + MODBIND2(font_set_style_name, const RID &, const String &); + MODBIND1RC(String, font_get_style_name, const RID &); - virtual void font_set_name(const RID &p_font_rid, const String &p_name) override; - virtual String font_get_name(const RID &p_font_rid) const override; + MODBIND2(font_set_name, const RID &, const String &); + MODBIND1RC(String, font_get_name, const RID &); - virtual void font_set_antialiasing(RID p_font_rid, TextServer::FontAntialiasing p_antialiasing) override; - virtual TextServer::FontAntialiasing font_get_antialiasing(RID p_font_rid) const override; + MODBIND2(font_set_antialiasing, const RID &, TextServer::FontAntialiasing); + MODBIND1RC(TextServer::FontAntialiasing, font_get_antialiasing, const RID &); - virtual void font_set_generate_mipmaps(const RID &p_font_rid, bool p_generate_mipmaps) override; - virtual bool font_get_generate_mipmaps(const RID &p_font_rid) const override; + MODBIND2(font_set_generate_mipmaps, const RID &, bool); + MODBIND1RC(bool, font_get_generate_mipmaps, const RID &); - virtual void font_set_multichannel_signed_distance_field(const RID &p_font_rid, bool p_msdf) override; - virtual bool font_is_multichannel_signed_distance_field(const RID &p_font_rid) const override; + MODBIND2(font_set_multichannel_signed_distance_field, const RID &, bool); + MODBIND1RC(bool, font_is_multichannel_signed_distance_field, const RID &); - virtual void font_set_msdf_pixel_range(const RID &p_font_rid, int64_t p_msdf_pixel_range) override; - virtual int64_t font_get_msdf_pixel_range(const RID &p_font_rid) const override; + MODBIND2(font_set_msdf_pixel_range, const RID &, int64_t); + MODBIND1RC(int64_t, font_get_msdf_pixel_range, const RID &); - virtual void font_set_msdf_size(const RID &p_font_rid, int64_t p_msdf_size) override; - virtual int64_t font_get_msdf_size(const RID &p_font_rid) const override; + MODBIND2(font_set_msdf_size, const RID &, int64_t); + MODBIND1RC(int64_t, font_get_msdf_size, const RID &); - virtual void font_set_fixed_size(const RID &p_font_rid, int64_t p_fixed_size) override; - virtual int64_t font_get_fixed_size(const RID &p_font_rid) const override; + MODBIND2(font_set_fixed_size, const RID &, int64_t); + MODBIND1RC(int64_t, font_get_fixed_size, const RID &); - virtual void font_set_force_autohinter(const RID &p_font_rid, bool p_force_autohinter) override; - virtual bool font_is_force_autohinter(const RID &p_font_rid) const override; + MODBIND2(font_set_force_autohinter, const RID &, bool); + MODBIND1RC(bool, font_is_force_autohinter, const RID &); - virtual void font_set_subpixel_positioning(const RID &p_font_rid, SubpixelPositioning p_subpixel) override; - virtual SubpixelPositioning font_get_subpixel_positioning(const RID &p_font_rid) const override; + MODBIND2(font_set_subpixel_positioning, const RID &, SubpixelPositioning); + MODBIND1RC(SubpixelPositioning, font_get_subpixel_positioning, const RID &); - virtual void font_set_embolden(const RID &p_font_rid, double p_strength) override; - virtual double font_get_embolden(const RID &p_font_rid) const override; + MODBIND2(font_set_embolden, const RID &, double); + MODBIND1RC(double, font_get_embolden, const RID &); - virtual void font_set_transform(const RID &p_font_rid, const Transform2D &p_transform) override; - virtual Transform2D font_get_transform(const RID &p_font_rid) const override; + MODBIND2(font_set_transform, const RID &, const Transform2D &); + MODBIND1RC(Transform2D, font_get_transform, const RID &); - virtual void font_set_variation_coordinates(const RID &p_font_rid, const Dictionary &p_variation_coordinates) override; - virtual Dictionary font_get_variation_coordinates(const RID &p_font_rid) const override; + MODBIND2(font_set_variation_coordinates, const RID &, const Dictionary &); + MODBIND1RC(Dictionary, font_get_variation_coordinates, const RID &); - virtual void font_set_hinting(const RID &p_font_rid, TextServer::Hinting p_hinting) override; - virtual TextServer::Hinting font_get_hinting(const RID &p_font_rid) const override; + MODBIND2(font_set_hinting, const RID &, TextServer::Hinting); + MODBIND1RC(TextServer::Hinting, font_get_hinting, const RID &); - virtual void font_set_oversampling(const RID &p_font_rid, double p_oversampling) override; - virtual double font_get_oversampling(const RID &p_font_rid) const override; + MODBIND2(font_set_oversampling, const RID &, double); + MODBIND1RC(double, font_get_oversampling, const RID &); - virtual TypedArray<Vector2i> font_get_size_cache_list(const RID &p_font_rid) const override; - virtual void font_clear_size_cache(const RID &p_font_rid) override; - virtual void font_remove_size_cache(const RID &p_font_rid, const Vector2i &p_size) override; + MODBIND1RC(TypedArray<Vector2i>, font_get_size_cache_list, const RID &); + MODBIND1(font_clear_size_cache, const RID &); + MODBIND2(font_remove_size_cache, const RID &, const Vector2i &); - virtual void font_set_ascent(const RID &p_font_rid, int64_t p_size, double p_ascent) override; - virtual double font_get_ascent(const RID &p_font_rid, int64_t p_size) const override; + MODBIND3(font_set_ascent, const RID &, int64_t, double); + MODBIND2RC(double, font_get_ascent, const RID &, int64_t); - virtual void font_set_descent(const RID &p_font_rid, int64_t p_size, double p_descent) override; - virtual double font_get_descent(const RID &p_font_rid, int64_t p_size) const override; + MODBIND3(font_set_descent, const RID &, int64_t, double); + MODBIND2RC(double, font_get_descent, const RID &, int64_t); - virtual void font_set_underline_position(const RID &p_font_rid, int64_t p_size, double p_underline_position) override; - virtual double font_get_underline_position(const RID &p_font_rid, int64_t p_size) const override; + MODBIND3(font_set_underline_position, const RID &, int64_t, double); + MODBIND2RC(double, font_get_underline_position, const RID &, int64_t); - virtual void font_set_underline_thickness(const RID &p_font_rid, int64_t p_size, double p_underline_thickness) override; - virtual double font_get_underline_thickness(const RID &p_font_rid, int64_t p_size) const override; + MODBIND3(font_set_underline_thickness, const RID &, int64_t, double); + MODBIND2RC(double, font_get_underline_thickness, const RID &, int64_t); - virtual void font_set_scale(const RID &p_font_rid, int64_t p_size, double p_scale) override; - virtual double font_get_scale(const RID &p_font_rid, int64_t p_size) const override; + MODBIND3(font_set_scale, const RID &, int64_t, double); + MODBIND2RC(double, font_get_scale, const RID &, int64_t); - virtual int64_t font_get_texture_count(const RID &p_font_rid, const Vector2i &p_size) const override; - virtual void font_clear_textures(const RID &p_font_rid, const Vector2i &p_size) override; - virtual void font_remove_texture(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index) override; + MODBIND2RC(int64_t, font_get_texture_count, const RID &, const Vector2i &); + MODBIND2(font_clear_textures, const RID &, const Vector2i &); + MODBIND3(font_remove_texture, const RID &, const Vector2i &, int64_t); - virtual void font_set_texture_image(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index, const Ref<Image> &p_image) override; - virtual Ref<Image> font_get_texture_image(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index) const override; + MODBIND4(font_set_texture_image, const RID &, const Vector2i &, int64_t, const Ref<Image> &); + MODBIND3RC(Ref<Image>, font_get_texture_image, const RID &, const Vector2i &, int64_t); - virtual void font_set_texture_offsets(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index, const PackedInt32Array &p_offset) override; - virtual PackedInt32Array font_get_texture_offsets(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index) const override; + MODBIND4(font_set_texture_offsets, const RID &, const Vector2i &, int64_t, const PackedInt32Array &); + MODBIND3RC(PackedInt32Array, font_get_texture_offsets, const RID &, const Vector2i &, int64_t); - virtual PackedInt32Array font_get_glyph_list(const RID &p_font_rid, const Vector2i &p_size) const override; - virtual void font_clear_glyphs(const RID &p_font_rid, const Vector2i &p_size) override; - virtual void font_remove_glyph(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) override; + MODBIND2RC(PackedInt32Array, font_get_glyph_list, const RID &, const Vector2i &); + MODBIND2(font_clear_glyphs, const RID &, const Vector2i &); + MODBIND3(font_remove_glyph, const RID &, const Vector2i &, int64_t); - virtual Vector2 font_get_glyph_advance(const RID &p_font_rid, int64_t p_size, int64_t p_glyph) const override; - virtual void font_set_glyph_advance(const RID &p_font_rid, int64_t p_size, int64_t p_glyph, const Vector2 &p_advance) override; + MODBIND3RC(Vector2, font_get_glyph_advance, const RID &, int64_t, int64_t); + MODBIND4(font_set_glyph_advance, const RID &, int64_t, int64_t, const Vector2 &); - virtual Vector2 font_get_glyph_offset(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const override; - virtual void font_set_glyph_offset(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, const Vector2 &p_offset) override; + MODBIND3RC(Vector2, font_get_glyph_offset, const RID &, const Vector2i &, int64_t); + MODBIND4(font_set_glyph_offset, const RID &, const Vector2i &, int64_t, const Vector2 &); - virtual Vector2 font_get_glyph_size(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const override; - virtual void font_set_glyph_size(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, const Vector2 &p_gl_size) override; + MODBIND3RC(Vector2, font_get_glyph_size, const RID &, const Vector2i &, int64_t); + MODBIND4(font_set_glyph_size, const RID &, const Vector2i &, int64_t, const Vector2 &); - virtual Rect2 font_get_glyph_uv_rect(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const override; - virtual void font_set_glyph_uv_rect(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, const Rect2 &p_uv_rect) override; + MODBIND3RC(Rect2, font_get_glyph_uv_rect, const RID &, const Vector2i &, int64_t); + MODBIND4(font_set_glyph_uv_rect, const RID &, const Vector2i &, int64_t, const Rect2 &); - virtual int64_t font_get_glyph_texture_idx(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const override; - virtual void font_set_glyph_texture_idx(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, int64_t p_texture_idx) override; + MODBIND3RC(int64_t, font_get_glyph_texture_idx, const RID &, const Vector2i &, int64_t); + MODBIND4(font_set_glyph_texture_idx, const RID &, const Vector2i &, int64_t, int64_t); - virtual RID font_get_glyph_texture_rid(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const override; - virtual Size2 font_get_glyph_texture_size(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const override; + MODBIND3RC(RID, font_get_glyph_texture_rid, const RID &, const Vector2i &, int64_t); + MODBIND3RC(Size2, font_get_glyph_texture_size, const RID &, const Vector2i &, int64_t); - virtual Dictionary font_get_glyph_contours(const RID &p_font, int64_t p_size, int64_t p_index) const override; + MODBIND3RC(Dictionary, font_get_glyph_contours, const RID &, int64_t, int64_t); - virtual TypedArray<Vector2i> font_get_kerning_list(const RID &p_font_rid, int64_t p_size) const override; - virtual void font_clear_kerning_map(const RID &p_font_rid, int64_t p_size) override; - virtual void font_remove_kerning(const RID &p_font_rid, int64_t p_size, const Vector2i &p_glyph_pair) override; + MODBIND2RC(TypedArray<Vector2i>, font_get_kerning_list, const RID &, int64_t); + MODBIND2(font_clear_kerning_map, const RID &, int64_t); + MODBIND3(font_remove_kerning, const RID &, int64_t, const Vector2i &); - virtual void font_set_kerning(const RID &p_font_rid, int64_t p_size, const Vector2i &p_glyph_pair, const Vector2 &p_kerning) override; - virtual Vector2 font_get_kerning(const RID &p_font_rid, int64_t p_size, const Vector2i &p_glyph_pair) const override; + MODBIND4(font_set_kerning, const RID &, int64_t, const Vector2i &, const Vector2 &); + MODBIND3RC(Vector2, font_get_kerning, const RID &, int64_t, const Vector2i &); - virtual int64_t font_get_glyph_index(const RID &p_font_rid, int64_t p_size, int64_t p_char, int64_t p_variation_selector = 0) const override; + MODBIND4RC(int64_t, font_get_glyph_index, const RID &, int64_t, int64_t, int64_t); - virtual bool font_has_char(const RID &p_font_rid, int64_t p_char) const override; - virtual String font_get_supported_chars(const RID &p_font_rid) const override; + MODBIND2RC(bool, font_has_char, const RID &, int64_t); + MODBIND1RC(String, font_get_supported_chars, const RID &); - virtual void font_render_range(const RID &p_font, const Vector2i &p_size, int64_t p_start, int64_t p_end) override; - virtual void font_render_glyph(const RID &p_font_rid, const Vector2i &p_size, int64_t p_index) override; + MODBIND4(font_render_range, const RID &, const Vector2i &, int64_t, int64_t); + MODBIND3(font_render_glyph, const RID &, const Vector2i &, int64_t); - virtual void font_draw_glyph(const RID &p_font, const RID &p_canvas, int64_t p_size, const Vector2 &p_pos, int64_t p_index, const Color &p_color = Color(1, 1, 1)) const override; - virtual void font_draw_glyph_outline(const RID &p_font, const RID &p_canvas, int64_t p_size, int64_t p_outline_size, const Vector2 &p_pos, int64_t p_index, const Color &p_color = Color(1, 1, 1)) const override; + MODBIND6C(font_draw_glyph, const RID &, const RID &, int64_t, const Vector2 &, int64_t, const Color &); + MODBIND7C(font_draw_glyph_outline, const RID &, const RID &, int64_t, int64_t, const Vector2 &, int64_t, const Color &); - virtual bool font_is_language_supported(const RID &p_font_rid, const String &p_language) const override; - virtual void font_set_language_support_override(const RID &p_font_rid, const String &p_language, bool p_supported) override; - virtual bool font_get_language_support_override(const RID &p_font_rid, const String &p_language) override; - virtual void font_remove_language_support_override(const RID &p_font_rid, const String &p_language) override; - virtual PackedStringArray font_get_language_support_overrides(const RID &p_font_rid) override; + MODBIND2RC(bool, font_is_language_supported, const RID &, const String &); + MODBIND3(font_set_language_support_override, const RID &, const String &, bool); + MODBIND2R(bool, font_get_language_support_override, const RID &, const String &); + MODBIND2(font_remove_language_support_override, const RID &, const String &); + MODBIND1R(PackedStringArray, font_get_language_support_overrides, const RID &); - virtual bool font_is_script_supported(const RID &p_font_rid, const String &p_script) const override; - virtual void font_set_script_support_override(const RID &p_font_rid, const String &p_script, bool p_supported) override; - virtual bool font_get_script_support_override(const RID &p_font_rid, const String &p_script) override; - virtual void font_remove_script_support_override(const RID &p_font_rid, const String &p_script) override; - virtual PackedStringArray font_get_script_support_overrides(const RID &p_font_rid) override; + MODBIND2RC(bool, font_is_script_supported, const RID &, const String &); + MODBIND3(font_set_script_support_override, const RID &, const String &, bool); + MODBIND2R(bool, font_get_script_support_override, const RID &, const String &); + MODBIND2(font_remove_script_support_override, const RID &, const String &); + MODBIND1R(PackedStringArray, font_get_script_support_overrides, const RID &); - virtual void font_set_opentype_feature_overrides(const RID &p_font_rid, const Dictionary &p_overrides) override; - virtual Dictionary font_get_opentype_feature_overrides(const RID &p_font_rid) const override; + MODBIND2(font_set_opentype_feature_overrides, const RID &, const Dictionary &); + MODBIND1RC(Dictionary, font_get_opentype_feature_overrides, const RID &); - virtual Dictionary font_supported_feature_list(const RID &p_font_rid) const override; - virtual Dictionary font_supported_variation_list(const RID &p_font_rid) const override; + MODBIND1RC(Dictionary, font_supported_feature_list, const RID &); + MODBIND1RC(Dictionary, font_supported_variation_list, const RID &); - virtual double font_get_global_oversampling() const override; - virtual void font_set_global_oversampling(double p_oversampling) override; + MODBIND0RC(double, font_get_global_oversampling); + MODBIND1(font_set_global_oversampling, double); /* Shaped text buffer interface */ - virtual RID create_shaped_text(Direction p_direction = DIRECTION_AUTO, Orientation p_orientation = ORIENTATION_HORIZONTAL) override; + MODBIND2R(RID, create_shaped_text, Direction, Orientation); - virtual void shaped_text_clear(const RID &p_shaped) override; + MODBIND1(shaped_text_clear, const RID &); - virtual void shaped_text_set_direction(const RID &p_shaped, Direction p_direction = DIRECTION_AUTO) override; - virtual Direction shaped_text_get_direction(const RID &p_shaped) const override; - virtual Direction shaped_text_get_inferred_direction(const RID &p_shaped) const override; + MODBIND2(shaped_text_set_direction, const RID &, Direction); + MODBIND1RC(Direction, shaped_text_get_direction, const RID &); + MODBIND1RC(Direction, shaped_text_get_inferred_direction, const RID &); - virtual void shaped_text_set_bidi_override(const RID &p_shaped, const Array &p_override) override; + MODBIND2(shaped_text_set_bidi_override, const RID &, const Array &); - virtual void shaped_text_set_custom_punctuation(const RID &p_shaped, const String &p_punct) override; - virtual String shaped_text_get_custom_punctuation(const RID &p_shaped) const override; + MODBIND2(shaped_text_set_custom_punctuation, const RID &, const String &); + MODBIND1RC(String, shaped_text_get_custom_punctuation, const RID &); - virtual void shaped_text_set_orientation(const RID &p_shaped, Orientation p_orientation = ORIENTATION_HORIZONTAL) override; - virtual Orientation shaped_text_get_orientation(const RID &p_shaped) const override; + MODBIND2(shaped_text_set_orientation, const RID &, Orientation); + MODBIND1RC(Orientation, shaped_text_get_orientation, const RID &); - virtual void shaped_text_set_preserve_invalid(const RID &p_shaped, bool p_enabled) override; - virtual bool shaped_text_get_preserve_invalid(const RID &p_shaped) const override; + MODBIND2(shaped_text_set_preserve_invalid, const RID &, bool); + MODBIND1RC(bool, shaped_text_get_preserve_invalid, const RID &); - virtual void shaped_text_set_preserve_control(const RID &p_shaped, bool p_enabled) override; - virtual bool shaped_text_get_preserve_control(const RID &p_shaped) const override; + MODBIND2(shaped_text_set_preserve_control, const RID &, bool); + MODBIND1RC(bool, shaped_text_get_preserve_control, const RID &); - virtual void shaped_text_set_spacing(const RID &p_shaped, SpacingType p_spacing, int64_t p_value) override; - virtual int64_t shaped_text_get_spacing(const RID &p_shaped, SpacingType p_spacing) const override; + MODBIND3(shaped_text_set_spacing, const RID &, SpacingType, int64_t); + MODBIND2RC(int64_t, shaped_text_get_spacing, const RID &, SpacingType); - virtual bool shaped_text_add_string(const RID &p_shaped, const String &p_text, const TypedArray<RID> &p_fonts, int64_t p_size, const Dictionary &p_opentype_features = Dictionary(), const String &p_language = "", const Variant &p_meta = Variant()) override; - virtual bool shaped_text_add_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER, int64_t p_length = 1) override; - virtual bool shaped_text_resize_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER) override; + MODBIND7R(bool, shaped_text_add_string, const RID &, const String &, const TypedArray<RID> &, int64_t, const Dictionary &, const String &, const Variant &); + MODBIND5R(bool, shaped_text_add_object, const RID &, const Variant &, const Size2 &, InlineAlignment, int64_t); + MODBIND4R(bool, shaped_text_resize_object, const RID &, const Variant &, const Size2 &, InlineAlignment); - virtual int64_t shaped_get_span_count(const RID &p_shaped) const override; - virtual Variant shaped_get_span_meta(const RID &p_shaped, int64_t p_index) const override; - virtual void shaped_set_span_update_font(const RID &p_shaped, int64_t p_index, const TypedArray<RID> &p_fonts, int64_t p_size, const Dictionary &p_opentype_features = Dictionary()) override; + MODBIND1RC(int64_t, shaped_get_span_count, const RID &); + MODBIND2RC(Variant, shaped_get_span_meta, const RID &, int64_t); + MODBIND5(shaped_set_span_update_font, const RID &, int64_t, const TypedArray<RID> &, int64_t, const Dictionary &); - virtual RID shaped_text_substr(const RID &p_shaped, int64_t p_start, int64_t p_length) const override; - virtual RID shaped_text_get_parent(const RID &p_shaped) const override; + MODBIND3RC(RID, shaped_text_substr, const RID &, int64_t, int64_t); + MODBIND1RC(RID, shaped_text_get_parent, const RID &); - virtual double shaped_text_fit_to_width(const RID &p_shaped, double p_width, BitField<TextServer::JustificationFlag> p_jst_flags = JUSTIFICATION_WORD_BOUND | JUSTIFICATION_KASHIDA) override; - virtual double shaped_text_tab_align(const RID &p_shaped, const PackedFloat32Array &p_tab_stops) override; + MODBIND3R(double, shaped_text_fit_to_width, const RID &, double, BitField<TextServer::JustificationFlag>); + MODBIND2R(double, shaped_text_tab_align, const RID &, const PackedFloat32Array &); - virtual bool shaped_text_shape(const RID &p_shaped) override; - virtual bool shaped_text_update_breaks(const RID &p_shaped) override; - virtual bool shaped_text_update_justification_ops(const RID &p_shaped) override; + MODBIND1R(bool, shaped_text_shape, const RID &); + MODBIND1R(bool, shaped_text_update_breaks, const RID &); + MODBIND1R(bool, shaped_text_update_justification_ops, const RID &); - virtual int64_t shaped_text_get_trim_pos(const RID &p_shaped) const override; - virtual int64_t shaped_text_get_ellipsis_pos(const RID &p_shaped) const override; - virtual const Glyph *shaped_text_get_ellipsis_glyphs(const RID &p_shaped) const override; - virtual int64_t shaped_text_get_ellipsis_glyph_count(const RID &p_shaped) const override; + MODBIND1RC(int64_t, shaped_text_get_trim_pos, const RID &); + MODBIND1RC(int64_t, shaped_text_get_ellipsis_pos, const RID &); + MODBIND1RC(const Glyph *, shaped_text_get_ellipsis_glyphs, const RID &); + MODBIND1RC(int64_t, shaped_text_get_ellipsis_glyph_count, const RID &); - virtual void shaped_text_overrun_trim_to_width(const RID &p_shaped, double p_width, BitField<TextServer::TextOverrunFlag> p_trim_flags) override; + MODBIND3(shaped_text_overrun_trim_to_width, const RID &, double, BitField<TextServer::TextOverrunFlag>); - virtual bool shaped_text_is_ready(const RID &p_shaped) const override; + MODBIND1RC(bool, shaped_text_is_ready, const RID &); - virtual const Glyph *shaped_text_get_glyphs(const RID &p_shaped) const override; - virtual const Glyph *shaped_text_sort_logical(const RID &p_shaped) override; - virtual int64_t shaped_text_get_glyph_count(const RID &p_shaped) const override; + MODBIND1RC(const Glyph *, shaped_text_get_glyphs, const RID &); + MODBIND1R(const Glyph *, shaped_text_sort_logical, const RID &); + MODBIND1RC(int64_t, shaped_text_get_glyph_count, const RID &); - virtual Vector2i shaped_text_get_range(const RID &p_shaped) const override; + MODBIND1RC(Vector2i, shaped_text_get_range, const RID &); - virtual Array shaped_text_get_objects(const RID &p_shaped) const override; - virtual Rect2 shaped_text_get_object_rect(const RID &p_shaped, const Variant &p_key) const override; + MODBIND1RC(Array, shaped_text_get_objects, const RID &); + MODBIND2RC(Rect2, shaped_text_get_object_rect, const RID &, const Variant &); - virtual Size2 shaped_text_get_size(const RID &p_shaped) const override; - virtual double shaped_text_get_ascent(const RID &p_shaped) const override; - virtual double shaped_text_get_descent(const RID &p_shaped) const override; - virtual double shaped_text_get_width(const RID &p_shaped) const override; - virtual double shaped_text_get_underline_position(const RID &p_shaped) const override; - virtual double shaped_text_get_underline_thickness(const RID &p_shaped) const override; + MODBIND1RC(Size2, shaped_text_get_size, const RID &); + MODBIND1RC(double, shaped_text_get_ascent, const RID &); + MODBIND1RC(double, shaped_text_get_descent, const RID &); + MODBIND1RC(double, shaped_text_get_width, const RID &); + MODBIND1RC(double, shaped_text_get_underline_position, const RID &); + MODBIND1RC(double, shaped_text_get_underline_thickness, const RID &); - virtual String format_number(const String &p_string, const String &p_language = "") const override; - virtual String parse_number(const String &p_string, const String &p_language = "") const override; - virtual String percent_sign(const String &p_language = "") const override; + MODBIND2RC(String, format_number, const String &, const String &); + MODBIND2RC(String, parse_number, const String &, const String &); + MODBIND1RC(String, percent_sign, const String &); - virtual PackedInt32Array string_get_word_breaks(const String &p_string, const String &p_language = "") const override; + MODBIND2RC(PackedInt32Array, string_get_word_breaks, const String &, const String &); - virtual int is_confusable(const String &p_string, const PackedStringArray &p_dict) const override; - virtual bool spoof_check(const String &p_string) const override; + MODBIND2RC(int64_t, is_confusable, const String &, const PackedStringArray &); + MODBIND1RC(bool, spoof_check, const String &); - virtual String strip_diacritics(const String &p_string) const override; - virtual bool is_valid_identifier(const String &p_string) const override; + MODBIND1RC(String, strip_diacritics, const String &); + MODBIND1RC(bool, is_valid_identifier, const String &); - virtual String string_to_upper(const String &p_string, const String &p_language = "") const override; - virtual String string_to_lower(const String &p_string, const String &p_language = "") const override; + MODBIND2RC(String, string_to_upper, const String &, const String &); + MODBIND2RC(String, string_to_lower, const String &, const String &); TextServerAdvanced(); ~TextServerAdvanced(); diff --git a/modules/text_server_fb/gdextension_build/SConstruct b/modules/text_server_fb/gdextension_build/SConstruct index de0a549900..eae8e031bf 100644 --- a/modules/text_server_fb/gdextension_build/SConstruct +++ b/modules/text_server_fb/gdextension_build/SConstruct @@ -19,6 +19,7 @@ env = SConscript("./godot-cpp/SConstruct") env.__class__.disable_warnings = methods.disable_warnings opts = Variables([], ARGUMENTS) +opts.Add(BoolVariable("brotli_enabled", "Use Brotli library", True)) opts.Add(BoolVariable("freetype_enabled", "Use FreeType library", True)) opts.Add(BoolVariable("msdfgen_enabled", "Use MSDFgen library (require FreeType)", True)) opts.Add(BoolVariable("verbose", "Enable verbose output for the compilation", False)) @@ -157,6 +158,25 @@ if env["freetype_enabled"]: ] thirdparty_freetype_sources += [thirdparty_zlib_dir + file for file in thirdparty_zlib_sources] + if env["brotli_enabled"]: + thirdparty_brotli_dir = "../../../thirdparty/brotli/" + thirdparty_brotli_sources = [ + "common/constants.c", + "common/context.c", + "common/dictionary.c", + "common/platform.c", + "common/shared_dictionary.c", + "common/transform.c", + "dec/bit_reader.c", + "dec/decode.c", + "dec/huffman.c", + "dec/state.c", + ] + thirdparty_freetype_sources += [thirdparty_brotli_dir + file for file in thirdparty_brotli_sources] + env_freetype.Append(CPPDEFINES=["FT_CONFIG_OPTION_USE_BROTLI"]) + env_freetype.Prepend(CPPPATH=[thirdparty_brotli_dir + "include"]) + env.Append(CPPDEFINES=["FT_CONFIG_OPTION_USE_BROTLI"]) + env_freetype.Append(CPPPATH=[thirdparty_freetype_dir + "/include", thirdparty_zlib_dir, thirdparty_png_dir]) env.Append(CPPPATH=[thirdparty_freetype_dir + "/include"]) @@ -168,7 +188,7 @@ if env["freetype_enabled"]: "FT_CONFIG_OPTION_SYSTEM_ZLIB", ] ) - if env["target"] == "debug": + if env.dev_build: env_freetype.Append(CPPDEFINES=["ZLIB_DEBUG"]) env.Append(CPPDEFINES=["MODULE_FREETYPE_ENABLED"]) diff --git a/modules/text_server_fb/text_server_fb.cpp b/modules/text_server_fb/text_server_fb.cpp index 4d599dbcb5..518c877baa 100644 --- a/modules/text_server_fb/text_server_fb.cpp +++ b/modules/text_server_fb/text_server_fb.cpp @@ -33,7 +33,7 @@ #ifdef GDEXTENSION // Headers for building as GDExtension plug-in. -#include <godot_cpp/classes/file.hpp> +#include <godot_cpp/classes/file_access.hpp> #include <godot_cpp/classes/project_settings.hpp> #include <godot_cpp/classes/rendering_server.hpp> #include <godot_cpp/classes/translation_server.hpp> @@ -66,7 +66,7 @@ using namespace godot; #define OT_TAG(c1, c2, c3, c4) ((int32_t)((((uint32_t)(c1)&0xff) << 24) | (((uint32_t)(c2)&0xff) << 16) | (((uint32_t)(c3)&0xff) << 8) | ((uint32_t)(c4)&0xff))) -bool TextServerFallback::has_feature(Feature p_feature) const { +bool TextServerFallback::_has_feature(Feature p_feature) const { switch (p_feature) { case FEATURE_SIMPLE_LAYOUT: case FEATURE_FONT_BITMAP: @@ -83,7 +83,7 @@ bool TextServerFallback::has_feature(Feature p_feature) const { return false; } -String TextServerFallback::get_name() const { +String TextServerFallback::_get_name() const { #ifdef GDEXTENSION return "Fallback (GDExtension)"; #else @@ -91,7 +91,7 @@ String TextServerFallback::get_name() const { #endif } -int64_t TextServerFallback::get_features() const { +int64_t TextServerFallback::_get_features() const { int64_t interface_features = FEATURE_SIMPLE_LAYOUT | FEATURE_FONT_BITMAP; #ifdef MODULE_FREETYPE_ENABLED interface_features |= FEATURE_FONT_DYNAMIC; @@ -103,7 +103,7 @@ int64_t TextServerFallback::get_features() const { return interface_features; } -void TextServerFallback::free_rid(const RID &p_rid) { +void TextServerFallback::_free_rid(const RID &p_rid) { _THREAD_SAFE_METHOD_ if (font_owner.owns(p_rid)) { FontFallback *fd = font_owner.get_or_null(p_rid); @@ -116,20 +116,28 @@ void TextServerFallback::free_rid(const RID &p_rid) { } } -bool TextServerFallback::has(const RID &p_rid) { +bool TextServerFallback::_has(const RID &p_rid) { _THREAD_SAFE_METHOD_ return font_owner.owns(p_rid) || shaped_owner.owns(p_rid); } -bool TextServerFallback::load_support_data(const String &p_filename) { +String TextServerFallback::_get_support_data_filename() const { + return ""; +}; + +String TextServerFallback::_get_support_data_info() const { + return "Not supported"; +}; + +bool TextServerFallback::_load_support_data(const String &p_filename) { return false; // No extra data used. } -bool TextServerFallback::save_support_data(const String &p_filename) const { +bool TextServerFallback::_save_support_data(const String &p_filename) const { return false; // No extra data used. } -bool TextServerFallback::is_locale_right_to_left(const String &p_locale) const { +bool TextServerFallback::_is_locale_right_to_left(const String &p_locale) const { return false; // No RTL support. } @@ -169,7 +177,7 @@ _FORCE_INLINE_ int32_t ot_tag_from_string(const char *p_str, int p_len) { return OT_TAG(tag[0], tag[1], tag[2], tag[3]); } -int64_t TextServerFallback::name_to_tag(const String &p_name) const { +int64_t TextServerFallback::_name_to_tag(const String &p_name) const { if (feature_sets.has(p_name)) { return feature_sets[p_name]; } @@ -185,7 +193,7 @@ _FORCE_INLINE_ void ot_tag_to_string(int32_t p_tag, char *p_buf) { p_buf[3] = (char)(uint8_t)(p_tag >> 0); } -String TextServerFallback::tag_to_name(int64_t p_tag) const { +String TextServerFallback::_tag_to_name(int64_t p_tag) const { if (feature_sets_inv.has(p_tag)) { return feature_sets_inv[p_tag]; } @@ -467,8 +475,14 @@ _FORCE_INLINE_ TextServerFallback::FontGlyph TextServerFallback::rasterize_msdf( td.projection = &projection; td.distancePixelConversion = &distancePixelConversion; +#ifdef GDEXTENSION + for (int i = 0; i < h; i++) { + _generateMTSDF_threaded(i, &td); + } +#else WorkerThreadPool::GroupID group_id = WorkerThreadPool::get_singleton()->add_template_group_task(this, &TextServerFallback::_generateMTSDF_threaded, &td, h, -1, true, SNAME("TextServerFBRenderMSDF")); WorkerThreadPool::get_singleton()->wait_for_group_task_completion(group_id); +#endif msdfgen::msdfErrorCorrection(image, shape, projection, p_pixel_range, config); @@ -840,7 +854,7 @@ _FORCE_INLINE_ bool TextServerFallback::_ensure_cache_for_size(FontFallback *p_f fd->oversampling = 1.0; fd->size.x = p_font_data->msdf_source_size; } else if (p_font_data->oversampling <= 0.0) { - fd->oversampling = font_get_global_oversampling(); + fd->oversampling = _font_get_global_oversampling(); } else { fd->oversampling = p_font_data->oversampling; } @@ -921,8 +935,8 @@ _FORCE_INLINE_ bool TextServerFallback::_ensure_cache_for_size(FontFallback *p_f coords.write[i] = CLAMP(var_value * 65536.0, amaster->axis[i].minimum, amaster->axis[i].maximum); } - if (p_font_data->variation_coordinates.has(tag_to_name(var_tag))) { - var_value = p_font_data->variation_coordinates[tag_to_name(var_tag)]; + if (p_font_data->variation_coordinates.has(_tag_to_name(var_tag))) { + var_value = p_font_data->variation_coordinates[_tag_to_name(var_tag)]; coords.write[i] = CLAMP(var_value * 65536.0, amaster->axis[i].minimum, amaster->axis[i].maximum); } } @@ -948,7 +962,7 @@ _FORCE_INLINE_ void TextServerFallback::_font_clear_cache(FontFallback *p_font_d p_font_data->supported_varaitions.clear(); } -RID TextServerFallback::create_font() { +RID TextServerFallback::_create_font() { _THREAD_SAFE_METHOD_ FontFallback *fd = memnew(FontFallback); @@ -956,7 +970,7 @@ RID TextServerFallback::create_font() { return font_owner.make_rid(fd); } -void TextServerFallback::font_set_data(const RID &p_font_rid, const PackedByteArray &p_data) { +void TextServerFallback::_font_set_data(const RID &p_font_rid, const PackedByteArray &p_data) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -967,7 +981,7 @@ void TextServerFallback::font_set_data(const RID &p_font_rid, const PackedByteAr fd->data_size = fd->data.size(); } -void TextServerFallback::font_set_data_ptr(const RID &p_font_rid, const uint8_t *p_data_ptr, int64_t p_data_size) { +void TextServerFallback::_font_set_data_ptr(const RID &p_font_rid, const uint8_t *p_data_ptr, int64_t p_data_size) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -978,7 +992,7 @@ void TextServerFallback::font_set_data_ptr(const RID &p_font_rid, const uint8_t fd->data_size = p_data_size; } -void TextServerFallback::font_set_style(const RID &p_font_rid, BitField<FontStyle> p_style) { +void TextServerFallback::_font_set_style(const RID &p_font_rid, BitField<FontStyle> p_style) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -988,7 +1002,7 @@ void TextServerFallback::font_set_style(const RID &p_font_rid, BitField<FontStyl fd->style_flags = p_style; } -void TextServerFallback::font_set_face_index(const RID &p_font_rid, int64_t p_face_index) { +void TextServerFallback::_font_set_face_index(const RID &p_font_rid, int64_t p_face_index) { ERR_FAIL_COND(p_face_index < 0); ERR_FAIL_COND(p_face_index >= 0x7FFF); @@ -1002,7 +1016,7 @@ void TextServerFallback::font_set_face_index(const RID &p_font_rid, int64_t p_fa } } -int64_t TextServerFallback::font_get_face_index(const RID &p_font_rid) const { +int64_t TextServerFallback::_font_get_face_index(const RID &p_font_rid) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, 0); @@ -1010,7 +1024,7 @@ int64_t TextServerFallback::font_get_face_index(const RID &p_font_rid) const { return fd->face_index; } -int64_t TextServerFallback::font_get_face_count(const RID &p_font_rid) const { +int64_t TextServerFallback::_font_get_face_count(const RID &p_font_rid) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, 0); @@ -1039,19 +1053,19 @@ int64_t TextServerFallback::font_get_face_count(const RID &p_font_rid) const { fargs.flags = FT_OPEN_MEMORY; fargs.stream = &stream; - FT_Face tmp_face; + FT_Face tmp_face = nullptr; error = FT_Open_Face(ft_library, &fargs, -1, &tmp_face); if (error == 0) { face_count = tmp_face->num_faces; + FT_Done_Face(tmp_face); } - FT_Done_Face(tmp_face); #endif } return face_count; } -BitField<TextServer::FontStyle> TextServerFallback::font_get_style(const RID &p_font_rid) const { +BitField<TextServer::FontStyle> TextServerFallback::_font_get_style(const RID &p_font_rid) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, 0); @@ -1061,7 +1075,7 @@ BitField<TextServer::FontStyle> TextServerFallback::font_get_style(const RID &p_ return fd->style_flags; } -void TextServerFallback::font_set_style_name(const RID &p_font_rid, const String &p_name) { +void TextServerFallback::_font_set_style_name(const RID &p_font_rid, const String &p_name) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1071,7 +1085,7 @@ void TextServerFallback::font_set_style_name(const RID &p_font_rid, const String fd->style_name = p_name; } -String TextServerFallback::font_get_style_name(const RID &p_font_rid) const { +String TextServerFallback::_font_get_style_name(const RID &p_font_rid) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, String()); @@ -1081,7 +1095,7 @@ String TextServerFallback::font_get_style_name(const RID &p_font_rid) const { return fd->style_name; } -void TextServerFallback::font_set_name(const RID &p_font_rid, const String &p_name) { +void TextServerFallback::_font_set_name(const RID &p_font_rid, const String &p_name) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1091,7 +1105,7 @@ void TextServerFallback::font_set_name(const RID &p_font_rid, const String &p_na fd->font_name = p_name; } -String TextServerFallback::font_get_name(const RID &p_font_rid) const { +String TextServerFallback::_font_get_name(const RID &p_font_rid) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, String()); @@ -1101,7 +1115,7 @@ String TextServerFallback::font_get_name(const RID &p_font_rid) const { return fd->font_name; } -void TextServerFallback::font_set_antialiasing(RID p_font_rid, TextServer::FontAntialiasing p_antialiasing) { +void TextServerFallback::_font_set_antialiasing(const RID &p_font_rid, TextServer::FontAntialiasing p_antialiasing) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1112,7 +1126,7 @@ void TextServerFallback::font_set_antialiasing(RID p_font_rid, TextServer::FontA } } -TextServer::FontAntialiasing TextServerFallback::font_get_antialiasing(RID p_font_rid) const { +TextServer::FontAntialiasing TextServerFallback::_font_get_antialiasing(const RID &p_font_rid) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, TextServer::FONT_ANTIALIASING_NONE); @@ -1120,7 +1134,7 @@ TextServer::FontAntialiasing TextServerFallback::font_get_antialiasing(RID p_fon return fd->antialiasing; } -void TextServerFallback::font_set_generate_mipmaps(const RID &p_font_rid, bool p_generate_mipmaps) { +void TextServerFallback::_font_set_generate_mipmaps(const RID &p_font_rid, bool p_generate_mipmaps) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1129,13 +1143,14 @@ void TextServerFallback::font_set_generate_mipmaps(const RID &p_font_rid, bool p for (KeyValue<Vector2i, FontForSizeFallback *> &E : fd->cache) { for (int i = 0; i < E.value->textures.size(); i++) { E.value->textures.write[i].dirty = true; + E.value->textures.write[i].texture = Ref<ImageTexture>(); } } fd->mipmaps = p_generate_mipmaps; } } -bool TextServerFallback::font_get_generate_mipmaps(const RID &p_font_rid) const { +bool TextServerFallback::_font_get_generate_mipmaps(const RID &p_font_rid) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, false); @@ -1143,7 +1158,7 @@ bool TextServerFallback::font_get_generate_mipmaps(const RID &p_font_rid) const return fd->mipmaps; } -void TextServerFallback::font_set_multichannel_signed_distance_field(const RID &p_font_rid, bool p_msdf) { +void TextServerFallback::_font_set_multichannel_signed_distance_field(const RID &p_font_rid, bool p_msdf) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1154,7 +1169,7 @@ void TextServerFallback::font_set_multichannel_signed_distance_field(const RID & } } -bool TextServerFallback::font_is_multichannel_signed_distance_field(const RID &p_font_rid) const { +bool TextServerFallback::_font_is_multichannel_signed_distance_field(const RID &p_font_rid) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, false); @@ -1162,7 +1177,7 @@ bool TextServerFallback::font_is_multichannel_signed_distance_field(const RID &p return fd->msdf; } -void TextServerFallback::font_set_msdf_pixel_range(const RID &p_font_rid, int64_t p_msdf_pixel_range) { +void TextServerFallback::_font_set_msdf_pixel_range(const RID &p_font_rid, int64_t p_msdf_pixel_range) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1173,7 +1188,7 @@ void TextServerFallback::font_set_msdf_pixel_range(const RID &p_font_rid, int64_ } } -int64_t TextServerFallback::font_get_msdf_pixel_range(const RID &p_font_rid) const { +int64_t TextServerFallback::_font_get_msdf_pixel_range(const RID &p_font_rid) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, false); @@ -1181,7 +1196,7 @@ int64_t TextServerFallback::font_get_msdf_pixel_range(const RID &p_font_rid) con return fd->msdf_range; } -void TextServerFallback::font_set_msdf_size(const RID &p_font_rid, int64_t p_msdf_size) { +void TextServerFallback::_font_set_msdf_size(const RID &p_font_rid, int64_t p_msdf_size) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1192,7 +1207,7 @@ void TextServerFallback::font_set_msdf_size(const RID &p_font_rid, int64_t p_msd } } -int64_t TextServerFallback::font_get_msdf_size(const RID &p_font_rid) const { +int64_t TextServerFallback::_font_get_msdf_size(const RID &p_font_rid) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, false); @@ -1200,7 +1215,7 @@ int64_t TextServerFallback::font_get_msdf_size(const RID &p_font_rid) const { return fd->msdf_source_size; } -void TextServerFallback::font_set_fixed_size(const RID &p_font_rid, int64_t p_fixed_size) { +void TextServerFallback::_font_set_fixed_size(const RID &p_font_rid, int64_t p_fixed_size) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1208,7 +1223,7 @@ void TextServerFallback::font_set_fixed_size(const RID &p_font_rid, int64_t p_fi fd->fixed_size = p_fixed_size; } -int64_t TextServerFallback::font_get_fixed_size(const RID &p_font_rid) const { +int64_t TextServerFallback::_font_get_fixed_size(const RID &p_font_rid) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, false); @@ -1216,7 +1231,7 @@ int64_t TextServerFallback::font_get_fixed_size(const RID &p_font_rid) const { return fd->fixed_size; } -void TextServerFallback::font_set_force_autohinter(const RID &p_font_rid, bool p_force_autohinter) { +void TextServerFallback::_font_set_force_autohinter(const RID &p_font_rid, bool p_force_autohinter) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1227,7 +1242,7 @@ void TextServerFallback::font_set_force_autohinter(const RID &p_font_rid, bool p } } -bool TextServerFallback::font_is_force_autohinter(const RID &p_font_rid) const { +bool TextServerFallback::_font_is_force_autohinter(const RID &p_font_rid) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, false); @@ -1235,7 +1250,7 @@ bool TextServerFallback::font_is_force_autohinter(const RID &p_font_rid) const { return fd->force_autohinter; } -void TextServerFallback::font_set_hinting(const RID &p_font_rid, TextServer::Hinting p_hinting) { +void TextServerFallback::_font_set_hinting(const RID &p_font_rid, TextServer::Hinting p_hinting) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1246,7 +1261,7 @@ void TextServerFallback::font_set_hinting(const RID &p_font_rid, TextServer::Hin } } -TextServer::Hinting TextServerFallback::font_get_hinting(const RID &p_font_rid) const { +TextServer::Hinting TextServerFallback::_font_get_hinting(const RID &p_font_rid) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, HINTING_NONE); @@ -1254,7 +1269,7 @@ TextServer::Hinting TextServerFallback::font_get_hinting(const RID &p_font_rid) return fd->hinting; } -void TextServerFallback::font_set_subpixel_positioning(const RID &p_font_rid, TextServer::SubpixelPositioning p_subpixel) { +void TextServerFallback::_font_set_subpixel_positioning(const RID &p_font_rid, TextServer::SubpixelPositioning p_subpixel) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1262,7 +1277,7 @@ void TextServerFallback::font_set_subpixel_positioning(const RID &p_font_rid, Te fd->subpixel_positioning = p_subpixel; } -TextServer::SubpixelPositioning TextServerFallback::font_get_subpixel_positioning(const RID &p_font_rid) const { +TextServer::SubpixelPositioning TextServerFallback::_font_get_subpixel_positioning(const RID &p_font_rid) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, SUBPIXEL_POSITIONING_DISABLED); @@ -1270,7 +1285,7 @@ TextServer::SubpixelPositioning TextServerFallback::font_get_subpixel_positionin return fd->subpixel_positioning; } -void TextServerFallback::font_set_embolden(const RID &p_font_rid, double p_strength) { +void TextServerFallback::_font_set_embolden(const RID &p_font_rid, double p_strength) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1281,7 +1296,7 @@ void TextServerFallback::font_set_embolden(const RID &p_font_rid, double p_stren } } -double TextServerFallback::font_get_embolden(const RID &p_font_rid) const { +double TextServerFallback::_font_get_embolden(const RID &p_font_rid) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, 0.0); @@ -1289,7 +1304,7 @@ double TextServerFallback::font_get_embolden(const RID &p_font_rid) const { return fd->embolden; } -void TextServerFallback::font_set_transform(const RID &p_font_rid, const Transform2D &p_transform) { +void TextServerFallback::_font_set_transform(const RID &p_font_rid, const Transform2D &p_transform) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1300,7 +1315,7 @@ void TextServerFallback::font_set_transform(const RID &p_font_rid, const Transfo } } -Transform2D TextServerFallback::font_get_transform(const RID &p_font_rid) const { +Transform2D TextServerFallback::_font_get_transform(const RID &p_font_rid) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, Transform2D()); @@ -1308,7 +1323,7 @@ Transform2D TextServerFallback::font_get_transform(const RID &p_font_rid) const return fd->transform; } -void TextServerFallback::font_set_variation_coordinates(const RID &p_font_rid, const Dictionary &p_variation_coordinates) { +void TextServerFallback::_font_set_variation_coordinates(const RID &p_font_rid, const Dictionary &p_variation_coordinates) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1319,7 +1334,7 @@ void TextServerFallback::font_set_variation_coordinates(const RID &p_font_rid, c } } -Dictionary TextServerFallback::font_get_variation_coordinates(const RID &p_font_rid) const { +Dictionary TextServerFallback::_font_get_variation_coordinates(const RID &p_font_rid) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, Dictionary()); @@ -1327,7 +1342,7 @@ Dictionary TextServerFallback::font_get_variation_coordinates(const RID &p_font_ return fd->variation_coordinates; } -void TextServerFallback::font_set_oversampling(const RID &p_font_rid, double p_oversampling) { +void TextServerFallback::_font_set_oversampling(const RID &p_font_rid, double p_oversampling) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1338,7 +1353,7 @@ void TextServerFallback::font_set_oversampling(const RID &p_font_rid, double p_o } } -double TextServerFallback::font_get_oversampling(const RID &p_font_rid) const { +double TextServerFallback::_font_get_oversampling(const RID &p_font_rid) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, 0.0); @@ -1346,7 +1361,7 @@ double TextServerFallback::font_get_oversampling(const RID &p_font_rid) const { return fd->oversampling; } -TypedArray<Vector2i> TextServerFallback::font_get_size_cache_list(const RID &p_font_rid) const { +TypedArray<Vector2i> TextServerFallback::_font_get_size_cache_list(const RID &p_font_rid) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, TypedArray<Vector2i>()); @@ -1358,7 +1373,7 @@ TypedArray<Vector2i> TextServerFallback::font_get_size_cache_list(const RID &p_f return ret; } -void TextServerFallback::font_clear_size_cache(const RID &p_font_rid) { +void TextServerFallback::_font_clear_size_cache(const RID &p_font_rid) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1369,7 +1384,7 @@ void TextServerFallback::font_clear_size_cache(const RID &p_font_rid) { fd->cache.clear(); } -void TextServerFallback::font_remove_size_cache(const RID &p_font_rid, const Vector2i &p_size) { +void TextServerFallback::_font_remove_size_cache(const RID &p_font_rid, const Vector2i &p_size) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1380,7 +1395,7 @@ void TextServerFallback::font_remove_size_cache(const RID &p_font_rid, const Vec } } -void TextServerFallback::font_set_ascent(const RID &p_font_rid, int64_t p_size, double p_ascent) { +void TextServerFallback::_font_set_ascent(const RID &p_font_rid, int64_t p_size, double p_ascent) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1391,7 +1406,7 @@ void TextServerFallback::font_set_ascent(const RID &p_font_rid, int64_t p_size, fd->cache[size]->ascent = p_ascent; } -double TextServerFallback::font_get_ascent(const RID &p_font_rid, int64_t p_size) const { +double TextServerFallback::_font_get_ascent(const RID &p_font_rid, int64_t p_size) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, 0.0); @@ -1407,7 +1422,7 @@ double TextServerFallback::font_get_ascent(const RID &p_font_rid, int64_t p_size } } -void TextServerFallback::font_set_descent(const RID &p_font_rid, int64_t p_size, double p_descent) { +void TextServerFallback::_font_set_descent(const RID &p_font_rid, int64_t p_size, double p_descent) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1417,7 +1432,7 @@ void TextServerFallback::font_set_descent(const RID &p_font_rid, int64_t p_size, fd->cache[size]->descent = p_descent; } -double TextServerFallback::font_get_descent(const RID &p_font_rid, int64_t p_size) const { +double TextServerFallback::_font_get_descent(const RID &p_font_rid, int64_t p_size) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, 0.0); @@ -1433,7 +1448,7 @@ double TextServerFallback::font_get_descent(const RID &p_font_rid, int64_t p_siz } } -void TextServerFallback::font_set_underline_position(const RID &p_font_rid, int64_t p_size, double p_underline_position) { +void TextServerFallback::_font_set_underline_position(const RID &p_font_rid, int64_t p_size, double p_underline_position) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1444,7 +1459,7 @@ void TextServerFallback::font_set_underline_position(const RID &p_font_rid, int6 fd->cache[size]->underline_position = p_underline_position; } -double TextServerFallback::font_get_underline_position(const RID &p_font_rid, int64_t p_size) const { +double TextServerFallback::_font_get_underline_position(const RID &p_font_rid, int64_t p_size) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, 0.0); @@ -1460,7 +1475,7 @@ double TextServerFallback::font_get_underline_position(const RID &p_font_rid, in } } -void TextServerFallback::font_set_underline_thickness(const RID &p_font_rid, int64_t p_size, double p_underline_thickness) { +void TextServerFallback::_font_set_underline_thickness(const RID &p_font_rid, int64_t p_size, double p_underline_thickness) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1471,7 +1486,7 @@ void TextServerFallback::font_set_underline_thickness(const RID &p_font_rid, int fd->cache[size]->underline_thickness = p_underline_thickness; } -double TextServerFallback::font_get_underline_thickness(const RID &p_font_rid, int64_t p_size) const { +double TextServerFallback::_font_get_underline_thickness(const RID &p_font_rid, int64_t p_size) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, 0.0); @@ -1487,7 +1502,7 @@ double TextServerFallback::font_get_underline_thickness(const RID &p_font_rid, i } } -void TextServerFallback::font_set_scale(const RID &p_font_rid, int64_t p_size, double p_scale) { +void TextServerFallback::_font_set_scale(const RID &p_font_rid, int64_t p_size, double p_scale) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1503,7 +1518,7 @@ void TextServerFallback::font_set_scale(const RID &p_font_rid, int64_t p_size, d fd->cache[size]->scale = p_scale; } -double TextServerFallback::font_get_scale(const RID &p_font_rid, int64_t p_size) const { +double TextServerFallback::_font_get_scale(const RID &p_font_rid, int64_t p_size) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, 0.0); @@ -1519,7 +1534,7 @@ double TextServerFallback::font_get_scale(const RID &p_font_rid, int64_t p_size) } } -int64_t TextServerFallback::font_get_texture_count(const RID &p_font_rid, const Vector2i &p_size) const { +int64_t TextServerFallback::_font_get_texture_count(const RID &p_font_rid, const Vector2i &p_size) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, 0); @@ -1531,7 +1546,7 @@ int64_t TextServerFallback::font_get_texture_count(const RID &p_font_rid, const return fd->cache[size]->textures.size(); } -void TextServerFallback::font_clear_textures(const RID &p_font_rid, const Vector2i &p_size) { +void TextServerFallback::_font_clear_textures(const RID &p_font_rid, const Vector2i &p_size) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); MutexLock lock(fd->mutex); @@ -1541,7 +1556,7 @@ void TextServerFallback::font_clear_textures(const RID &p_font_rid, const Vector fd->cache[size]->textures.clear(); } -void TextServerFallback::font_remove_texture(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index) { +void TextServerFallback::_font_remove_texture(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1553,7 +1568,7 @@ void TextServerFallback::font_remove_texture(const RID &p_font_rid, const Vector fd->cache[size]->textures.remove_at(p_texture_index); } -void TextServerFallback::font_set_texture_image(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index, const Ref<Image> &p_image) { +void TextServerFallback::_font_set_texture_image(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index, const Ref<Image> &p_image) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); ERR_FAIL_COND(p_image.is_null()); @@ -1584,7 +1599,7 @@ void TextServerFallback::font_set_texture_image(const RID &p_font_rid, const Vec tex.dirty = false; } -Ref<Image> TextServerFallback::font_get_texture_image(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index) const { +Ref<Image> TextServerFallback::_font_get_texture_image(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, Ref<Image>()); @@ -1601,7 +1616,7 @@ Ref<Image> TextServerFallback::font_get_texture_image(const RID &p_font_rid, con return img; } -void TextServerFallback::font_set_texture_offsets(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index, const PackedInt32Array &p_offset) { +void TextServerFallback::_font_set_texture_offsets(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index, const PackedInt32Array &p_offset) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1617,7 +1632,7 @@ void TextServerFallback::font_set_texture_offsets(const RID &p_font_rid, const V tex.offsets = p_offset; } -PackedInt32Array TextServerFallback::font_get_texture_offsets(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index) const { +PackedInt32Array TextServerFallback::_font_get_texture_offsets(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, PackedInt32Array()); @@ -1630,7 +1645,7 @@ PackedInt32Array TextServerFallback::font_get_texture_offsets(const RID &p_font_ return tex.offsets; } -PackedInt32Array TextServerFallback::font_get_glyph_list(const RID &p_font_rid, const Vector2i &p_size) const { +PackedInt32Array TextServerFallback::_font_get_glyph_list(const RID &p_font_rid, const Vector2i &p_size) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, PackedInt32Array()); @@ -1646,7 +1661,7 @@ PackedInt32Array TextServerFallback::font_get_glyph_list(const RID &p_font_rid, return ret; } -void TextServerFallback::font_clear_glyphs(const RID &p_font_rid, const Vector2i &p_size) { +void TextServerFallback::_font_clear_glyphs(const RID &p_font_rid, const Vector2i &p_size) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1657,7 +1672,7 @@ void TextServerFallback::font_clear_glyphs(const RID &p_font_rid, const Vector2i fd->cache[size]->glyph_map.clear(); } -void TextServerFallback::font_remove_glyph(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) { +void TextServerFallback::_font_remove_glyph(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1668,7 +1683,7 @@ void TextServerFallback::font_remove_glyph(const RID &p_font_rid, const Vector2i fd->cache[size]->glyph_map.erase(p_glyph); } -Vector2 TextServerFallback::font_get_glyph_advance(const RID &p_font_rid, int64_t p_size, int64_t p_glyph) const { +Vector2 TextServerFallback::_font_get_glyph_advance(const RID &p_font_rid, int64_t p_size, int64_t p_glyph) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, Vector2()); @@ -1679,7 +1694,7 @@ Vector2 TextServerFallback::font_get_glyph_advance(const RID &p_font_rid, int64_ int mod = 0; if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); + TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)ProjectSettings::get_singleton()->get("gui/theme/lcd_subpixel_layout"); if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { mod = (layout << 24); } @@ -1705,7 +1720,7 @@ Vector2 TextServerFallback::font_get_glyph_advance(const RID &p_font_rid, int64_ } } -void TextServerFallback::font_set_glyph_advance(const RID &p_font_rid, int64_t p_size, int64_t p_glyph, const Vector2 &p_advance) { +void TextServerFallback::_font_set_glyph_advance(const RID &p_font_rid, int64_t p_size, int64_t p_glyph, const Vector2 &p_advance) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1720,7 +1735,7 @@ void TextServerFallback::font_set_glyph_advance(const RID &p_font_rid, int64_t p gl[p_glyph].found = true; } -Vector2 TextServerFallback::font_get_glyph_offset(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const { +Vector2 TextServerFallback::_font_get_glyph_offset(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, Vector2()); @@ -1731,7 +1746,7 @@ Vector2 TextServerFallback::font_get_glyph_offset(const RID &p_font_rid, const V int mod = 0; if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); + TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)ProjectSettings::get_singleton()->get("gui/theme/lcd_subpixel_layout"); if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { mod = (layout << 24); } @@ -1750,7 +1765,7 @@ Vector2 TextServerFallback::font_get_glyph_offset(const RID &p_font_rid, const V } } -void TextServerFallback::font_set_glyph_offset(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, const Vector2 &p_offset) { +void TextServerFallback::_font_set_glyph_offset(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, const Vector2 &p_offset) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1765,7 +1780,7 @@ void TextServerFallback::font_set_glyph_offset(const RID &p_font_rid, const Vect gl[p_glyph].found = true; } -Vector2 TextServerFallback::font_get_glyph_size(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const { +Vector2 TextServerFallback::_font_get_glyph_size(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, Vector2()); @@ -1776,7 +1791,7 @@ Vector2 TextServerFallback::font_get_glyph_size(const RID &p_font_rid, const Vec int mod = 0; if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); + TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)ProjectSettings::get_singleton()->get("gui/theme/lcd_subpixel_layout"); if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { mod = (layout << 24); } @@ -1795,7 +1810,7 @@ Vector2 TextServerFallback::font_get_glyph_size(const RID &p_font_rid, const Vec } } -void TextServerFallback::font_set_glyph_size(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, const Vector2 &p_gl_size) { +void TextServerFallback::_font_set_glyph_size(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, const Vector2 &p_gl_size) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1810,7 +1825,7 @@ void TextServerFallback::font_set_glyph_size(const RID &p_font_rid, const Vector gl[p_glyph].found = true; } -Rect2 TextServerFallback::font_get_glyph_uv_rect(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const { +Rect2 TextServerFallback::_font_get_glyph_uv_rect(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, Rect2()); @@ -1821,7 +1836,7 @@ Rect2 TextServerFallback::font_get_glyph_uv_rect(const RID &p_font_rid, const Ve int mod = 0; if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); + TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)ProjectSettings::get_singleton()->get("gui/theme/lcd_subpixel_layout"); if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { mod = (layout << 24); } @@ -1835,7 +1850,7 @@ Rect2 TextServerFallback::font_get_glyph_uv_rect(const RID &p_font_rid, const Ve return gl[p_glyph | mod].uv_rect; } -void TextServerFallback::font_set_glyph_uv_rect(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, const Rect2 &p_uv_rect) { +void TextServerFallback::_font_set_glyph_uv_rect(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, const Rect2 &p_uv_rect) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1850,7 +1865,7 @@ void TextServerFallback::font_set_glyph_uv_rect(const RID &p_font_rid, const Vec gl[p_glyph].found = true; } -int64_t TextServerFallback::font_get_glyph_texture_idx(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const { +int64_t TextServerFallback::_font_get_glyph_texture_idx(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, -1); @@ -1861,7 +1876,7 @@ int64_t TextServerFallback::font_get_glyph_texture_idx(const RID &p_font_rid, co int mod = 0; if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); + TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)ProjectSettings::get_singleton()->get("gui/theme/lcd_subpixel_layout"); if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { mod = (layout << 24); } @@ -1875,7 +1890,7 @@ int64_t TextServerFallback::font_get_glyph_texture_idx(const RID &p_font_rid, co return gl[p_glyph | mod].texture_idx; } -void TextServerFallback::font_set_glyph_texture_idx(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, int64_t p_texture_idx) { +void TextServerFallback::_font_set_glyph_texture_idx(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, int64_t p_texture_idx) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -1890,7 +1905,7 @@ void TextServerFallback::font_set_glyph_texture_idx(const RID &p_font_rid, const gl[p_glyph].found = true; } -RID TextServerFallback::font_get_glyph_texture_rid(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const { +RID TextServerFallback::_font_get_glyph_texture_rid(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, RID()); @@ -1901,7 +1916,7 @@ RID TextServerFallback::font_get_glyph_texture_rid(const RID &p_font_rid, const int mod = 0; if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); + TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)ProjectSettings::get_singleton()->get("gui/theme/lcd_subpixel_layout"); if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { mod = (layout << 24); } @@ -1938,7 +1953,7 @@ RID TextServerFallback::font_get_glyph_texture_rid(const RID &p_font_rid, const return RID(); } -Size2 TextServerFallback::font_get_glyph_texture_size(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const { +Size2 TextServerFallback::_font_get_glyph_texture_size(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, Size2()); @@ -1949,7 +1964,7 @@ Size2 TextServerFallback::font_get_glyph_texture_size(const RID &p_font_rid, con int mod = 0; if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); + TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)ProjectSettings::get_singleton()->get("gui/theme/lcd_subpixel_layout"); if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { mod = (layout << 24); } @@ -1986,7 +2001,7 @@ Size2 TextServerFallback::font_get_glyph_texture_size(const RID &p_font_rid, con return Size2(); } -Dictionary TextServerFallback::font_get_glyph_contours(const RID &p_font_rid, int64_t p_size, int64_t p_index) const { +Dictionary TextServerFallback::_font_get_glyph_contours(const RID &p_font_rid, int64_t p_size, int64_t p_index) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, Dictionary()); @@ -2036,7 +2051,7 @@ Dictionary TextServerFallback::font_get_glyph_contours(const RID &p_font_rid, in #endif } -TypedArray<Vector2i> TextServerFallback::font_get_kerning_list(const RID &p_font_rid, int64_t p_size) const { +TypedArray<Vector2i> TextServerFallback::_font_get_kerning_list(const RID &p_font_rid, int64_t p_size) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, TypedArray<Vector2i>()); @@ -2052,7 +2067,7 @@ TypedArray<Vector2i> TextServerFallback::font_get_kerning_list(const RID &p_font return ret; } -void TextServerFallback::font_clear_kerning_map(const RID &p_font_rid, int64_t p_size) { +void TextServerFallback::_font_clear_kerning_map(const RID &p_font_rid, int64_t p_size) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2063,7 +2078,7 @@ void TextServerFallback::font_clear_kerning_map(const RID &p_font_rid, int64_t p fd->cache[size]->kerning_map.clear(); } -void TextServerFallback::font_remove_kerning(const RID &p_font_rid, int64_t p_size, const Vector2i &p_glyph_pair) { +void TextServerFallback::_font_remove_kerning(const RID &p_font_rid, int64_t p_size, const Vector2i &p_glyph_pair) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2074,7 +2089,7 @@ void TextServerFallback::font_remove_kerning(const RID &p_font_rid, int64_t p_si fd->cache[size]->kerning_map.erase(p_glyph_pair); } -void TextServerFallback::font_set_kerning(const RID &p_font_rid, int64_t p_size, const Vector2i &p_glyph_pair, const Vector2 &p_kerning) { +void TextServerFallback::_font_set_kerning(const RID &p_font_rid, int64_t p_size, const Vector2i &p_glyph_pair, const Vector2 &p_kerning) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2085,7 +2100,7 @@ void TextServerFallback::font_set_kerning(const RID &p_font_rid, int64_t p_size, fd->cache[size]->kerning_map[p_glyph_pair] = p_kerning; } -Vector2 TextServerFallback::font_get_kerning(const RID &p_font_rid, int64_t p_size, const Vector2i &p_glyph_pair) const { +Vector2 TextServerFallback::_font_get_kerning(const RID &p_font_rid, int64_t p_size, const Vector2i &p_glyph_pair) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, Vector2()); @@ -2120,15 +2135,17 @@ Vector2 TextServerFallback::font_get_kerning(const RID &p_font_rid, int64_t p_si return Vector2(); } -int64_t TextServerFallback::font_get_glyph_index(const RID &p_font_rid, int64_t p_size, int64_t p_char, int64_t p_variation_selector) const { +int64_t TextServerFallback::_font_get_glyph_index(const RID &p_font_rid, int64_t p_size, int64_t p_char, int64_t p_variation_selector) const { ERR_FAIL_COND_V_MSG((p_char >= 0xd800 && p_char <= 0xdfff) || (p_char > 0x10ffff), 0, "Unicode parsing error: Invalid unicode codepoint " + String::num_int64(p_char, 16) + "."); return (int64_t)p_char; } -bool TextServerFallback::font_has_char(const RID &p_font_rid, int64_t p_char) const { +bool TextServerFallback::_font_has_char(const RID &p_font_rid, int64_t p_char) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); - ERR_FAIL_COND_V(!fd, false); ERR_FAIL_COND_V_MSG((p_char >= 0xd800 && p_char <= 0xdfff) || (p_char > 0x10ffff), false, "Unicode parsing error: Invalid unicode codepoint " + String::num_int64(p_char, 16) + "."); + if (!fd) { + return false; + } MutexLock lock(fd->mutex); if (fd->cache.is_empty()) { @@ -2144,7 +2161,7 @@ bool TextServerFallback::font_has_char(const RID &p_font_rid, int64_t p_char) co return (at_size) ? at_size->glyph_map.has((int32_t)p_char) : false; } -String TextServerFallback::font_get_supported_chars(const RID &p_font_rid) const { +String TextServerFallback::_font_get_supported_chars(const RID &p_font_rid) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, String()); @@ -2177,7 +2194,7 @@ String TextServerFallback::font_get_supported_chars(const RID &p_font_rid) const return chars; } -void TextServerFallback::font_render_range(const RID &p_font_rid, const Vector2i &p_size, int64_t p_start, int64_t p_end) { +void TextServerFallback::_font_render_range(const RID &p_font_rid, const Vector2i &p_size, int64_t p_start, int64_t p_end) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); ERR_FAIL_COND_MSG((p_start >= 0xd800 && p_start <= 0xdfff) || (p_start > 0x10ffff), "Unicode parsing error: Invalid unicode codepoint " + String::num_int64(p_start, 16) + "."); @@ -2212,7 +2229,7 @@ void TextServerFallback::font_render_range(const RID &p_font_rid, const Vector2i } } -void TextServerFallback::font_render_glyph(const RID &p_font_rid, const Vector2i &p_size, int64_t p_index) { +void TextServerFallback::_font_render_glyph(const RID &p_font_rid, const Vector2i &p_size, int64_t p_index) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2243,7 +2260,7 @@ void TextServerFallback::font_render_glyph(const RID &p_font_rid, const Vector2i #endif } -void TextServerFallback::font_draw_glyph(const RID &p_font_rid, const RID &p_canvas, int64_t p_size, const Vector2 &p_pos, int64_t p_index, const Color &p_color) const { +void TextServerFallback::_font_draw_glyph(const RID &p_font_rid, const RID &p_canvas, int64_t p_size, const Vector2 &p_pos, int64_t p_index, const Color &p_color) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2258,7 +2275,7 @@ void TextServerFallback::font_draw_glyph(const RID &p_font_rid, const RID &p_can if (!fd->msdf && fd->cache[size]->face) { // LCD layout, bits 24, 25, 26 if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); + TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)ProjectSettings::get_singleton()->get("gui/theme/lcd_subpixel_layout"); if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { lcd_aa = true; index = index | (layout << 24); @@ -2335,7 +2352,7 @@ void TextServerFallback::font_draw_glyph(const RID &p_font_rid, const RID &p_can } } -void TextServerFallback::font_draw_glyph_outline(const RID &p_font_rid, const RID &p_canvas, int64_t p_size, int64_t p_outline_size, const Vector2 &p_pos, int64_t p_index, const Color &p_color) const { +void TextServerFallback::_font_draw_glyph_outline(const RID &p_font_rid, const RID &p_canvas, int64_t p_size, int64_t p_outline_size, const Vector2 &p_pos, int64_t p_index, const Color &p_color) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2350,7 +2367,7 @@ void TextServerFallback::font_draw_glyph_outline(const RID &p_font_rid, const RI if (!fd->msdf && fd->cache[size]->face) { // LCD layout, bits 24, 25, 26 if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); + TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)ProjectSettings::get_singleton()->get("gui/theme/lcd_subpixel_layout"); if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { lcd_aa = true; index = index | (layout << 24); @@ -2427,7 +2444,7 @@ void TextServerFallback::font_draw_glyph_outline(const RID &p_font_rid, const RI } } -bool TextServerFallback::font_is_language_supported(const RID &p_font_rid, const String &p_language) const { +bool TextServerFallback::_font_is_language_supported(const RID &p_font_rid, const String &p_language) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, false); @@ -2439,7 +2456,7 @@ bool TextServerFallback::font_is_language_supported(const RID &p_font_rid, const } } -void TextServerFallback::font_set_language_support_override(const RID &p_font_rid, const String &p_language, bool p_supported) { +void TextServerFallback::_font_set_language_support_override(const RID &p_font_rid, const String &p_language, bool p_supported) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2447,7 +2464,7 @@ void TextServerFallback::font_set_language_support_override(const RID &p_font_ri fd->language_support_overrides[p_language] = p_supported; } -bool TextServerFallback::font_get_language_support_override(const RID &p_font_rid, const String &p_language) { +bool TextServerFallback::_font_get_language_support_override(const RID &p_font_rid, const String &p_language) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, false); @@ -2455,7 +2472,7 @@ bool TextServerFallback::font_get_language_support_override(const RID &p_font_ri return fd->language_support_overrides[p_language]; } -void TextServerFallback::font_remove_language_support_override(const RID &p_font_rid, const String &p_language) { +void TextServerFallback::_font_remove_language_support_override(const RID &p_font_rid, const String &p_language) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2463,7 +2480,7 @@ void TextServerFallback::font_remove_language_support_override(const RID &p_font fd->language_support_overrides.erase(p_language); } -PackedStringArray TextServerFallback::font_get_language_support_overrides(const RID &p_font_rid) { +PackedStringArray TextServerFallback::_font_get_language_support_overrides(const RID &p_font_rid) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, PackedStringArray()); @@ -2475,7 +2492,7 @@ PackedStringArray TextServerFallback::font_get_language_support_overrides(const return out; } -bool TextServerFallback::font_is_script_supported(const RID &p_font_rid, const String &p_script) const { +bool TextServerFallback::_font_is_script_supported(const RID &p_font_rid, const String &p_script) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, false); @@ -2487,7 +2504,7 @@ bool TextServerFallback::font_is_script_supported(const RID &p_font_rid, const S } } -void TextServerFallback::font_set_script_support_override(const RID &p_font_rid, const String &p_script, bool p_supported) { +void TextServerFallback::_font_set_script_support_override(const RID &p_font_rid, const String &p_script, bool p_supported) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2495,7 +2512,7 @@ void TextServerFallback::font_set_script_support_override(const RID &p_font_rid, fd->script_support_overrides[p_script] = p_supported; } -bool TextServerFallback::font_get_script_support_override(const RID &p_font_rid, const String &p_script) { +bool TextServerFallback::_font_get_script_support_override(const RID &p_font_rid, const String &p_script) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, false); @@ -2503,7 +2520,7 @@ bool TextServerFallback::font_get_script_support_override(const RID &p_font_rid, return fd->script_support_overrides[p_script]; } -void TextServerFallback::font_remove_script_support_override(const RID &p_font_rid, const String &p_script) { +void TextServerFallback::_font_remove_script_support_override(const RID &p_font_rid, const String &p_script) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2513,7 +2530,7 @@ void TextServerFallback::font_remove_script_support_override(const RID &p_font_r fd->script_support_overrides.erase(p_script); } -PackedStringArray TextServerFallback::font_get_script_support_overrides(const RID &p_font_rid) { +PackedStringArray TextServerFallback::_font_get_script_support_overrides(const RID &p_font_rid) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, PackedStringArray()); @@ -2525,7 +2542,7 @@ PackedStringArray TextServerFallback::font_get_script_support_overrides(const RI return out; } -void TextServerFallback::font_set_opentype_feature_overrides(const RID &p_font_rid, const Dictionary &p_overrides) { +void TextServerFallback::_font_set_opentype_feature_overrides(const RID &p_font_rid, const Dictionary &p_overrides) { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND(!fd); @@ -2535,7 +2552,7 @@ void TextServerFallback::font_set_opentype_feature_overrides(const RID &p_font_r fd->feature_overrides = p_overrides; } -Dictionary TextServerFallback::font_get_opentype_feature_overrides(const RID &p_font_rid) const { +Dictionary TextServerFallback::_font_get_opentype_feature_overrides(const RID &p_font_rid) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, Dictionary()); @@ -2543,11 +2560,11 @@ Dictionary TextServerFallback::font_get_opentype_feature_overrides(const RID &p_ return fd->feature_overrides; } -Dictionary TextServerFallback::font_supported_feature_list(const RID &p_font_rid) const { +Dictionary TextServerFallback::_font_supported_feature_list(const RID &p_font_rid) const { return Dictionary(); } -Dictionary TextServerFallback::font_supported_variation_list(const RID &p_font_rid) const { +Dictionary TextServerFallback::_font_supported_variation_list(const RID &p_font_rid) const { FontFallback *fd = font_owner.get_or_null(p_font_rid); ERR_FAIL_COND_V(!fd, Dictionary()); @@ -2557,11 +2574,11 @@ Dictionary TextServerFallback::font_supported_variation_list(const RID &p_font_r return fd->supported_varaitions; } -double TextServerFallback::font_get_global_oversampling() const { +double TextServerFallback::_font_get_global_oversampling() const { return oversampling; } -void TextServerFallback::font_set_global_oversampling(double p_oversampling) { +void TextServerFallback::_font_set_global_oversampling(double p_oversampling) { _THREAD_SAFE_METHOD_ if (oversampling != p_oversampling) { oversampling = p_oversampling; @@ -2569,8 +2586,8 @@ void TextServerFallback::font_set_global_oversampling(double p_oversampling) { font_owner.get_owned_list(&fonts); bool font_cleared = false; for (const RID &E : fonts) { - if (!font_is_multichannel_signed_distance_field(E) && font_get_oversampling(E) <= 0) { - font_clear_size_cache(E); + if (!_font_is_multichannel_signed_distance_field(E) && _font_get_oversampling(E) <= 0) { + _font_clear_size_cache(E); font_cleared = true; } } @@ -2625,7 +2642,7 @@ void TextServerFallback::full_copy(ShapedTextDataFallback *p_shaped) { p_shaped->parent = RID(); } -RID TextServerFallback::create_shaped_text(TextServer::Direction p_direction, TextServer::Orientation p_orientation) { +RID TextServerFallback::_create_shaped_text(TextServer::Direction p_direction, TextServer::Orientation p_orientation) { _THREAD_SAFE_METHOD_ ShapedTextDataFallback *sd = memnew(ShapedTextDataFallback); @@ -2635,7 +2652,7 @@ RID TextServerFallback::create_shaped_text(TextServer::Direction p_direction, Te return shaped_owner.make_rid(sd); } -void TextServerFallback::shaped_text_clear(const RID &p_shaped) { +void TextServerFallback::_shaped_text_clear(const RID &p_shaped) { ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND(!sd); @@ -2649,21 +2666,21 @@ void TextServerFallback::shaped_text_clear(const RID &p_shaped) { invalidate(sd); } -void TextServerFallback::shaped_text_set_direction(const RID &p_shaped, TextServer::Direction p_direction) { +void TextServerFallback::_shaped_text_set_direction(const RID &p_shaped, TextServer::Direction p_direction) { if (p_direction == DIRECTION_RTL) { ERR_PRINT_ONCE("Right-to-left layout is not supported by this text server."); } } -TextServer::Direction TextServerFallback::shaped_text_get_direction(const RID &p_shaped) const { +TextServer::Direction TextServerFallback::_shaped_text_get_direction(const RID &p_shaped) const { return TextServer::DIRECTION_LTR; } -TextServer::Direction TextServerFallback::shaped_text_get_inferred_direction(const RID &p_shaped) const { +TextServer::Direction TextServerFallback::_shaped_text_get_inferred_direction(const RID &p_shaped) const { return TextServer::DIRECTION_LTR; } -void TextServerFallback::shaped_text_set_custom_punctuation(const RID &p_shaped, const String &p_punct) { +void TextServerFallback::_shaped_text_set_custom_punctuation(const RID &p_shaped, const String &p_punct) { _THREAD_SAFE_METHOD_ ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND(!sd); @@ -2677,14 +2694,14 @@ void TextServerFallback::shaped_text_set_custom_punctuation(const RID &p_shaped, } } -String TextServerFallback::shaped_text_get_custom_punctuation(const RID &p_shaped) const { +String TextServerFallback::_shaped_text_get_custom_punctuation(const RID &p_shaped) const { _THREAD_SAFE_METHOD_ const ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, String()); return sd->custom_punct; } -void TextServerFallback::shaped_text_set_orientation(const RID &p_shaped, TextServer::Orientation p_orientation) { +void TextServerFallback::_shaped_text_set_orientation(const RID &p_shaped, TextServer::Orientation p_orientation) { ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND(!sd); @@ -2698,11 +2715,11 @@ void TextServerFallback::shaped_text_set_orientation(const RID &p_shaped, TextSe } } -void TextServerFallback::shaped_text_set_bidi_override(const RID &p_shaped, const Array &p_override) { +void TextServerFallback::_shaped_text_set_bidi_override(const RID &p_shaped, const Array &p_override) { // No BiDi support, ignore. } -TextServer::Orientation TextServerFallback::shaped_text_get_orientation(const RID &p_shaped) const { +TextServer::Orientation TextServerFallback::_shaped_text_get_orientation(const RID &p_shaped) const { const ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, TextServer::ORIENTATION_HORIZONTAL); @@ -2710,7 +2727,7 @@ TextServer::Orientation TextServerFallback::shaped_text_get_orientation(const RI return sd->orientation; } -void TextServerFallback::shaped_text_set_preserve_invalid(const RID &p_shaped, bool p_enabled) { +void TextServerFallback::_shaped_text_set_preserve_invalid(const RID &p_shaped, bool p_enabled) { ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); MutexLock lock(sd->mutex); @@ -2724,7 +2741,7 @@ void TextServerFallback::shaped_text_set_preserve_invalid(const RID &p_shaped, b } } -bool TextServerFallback::shaped_text_get_preserve_invalid(const RID &p_shaped) const { +bool TextServerFallback::_shaped_text_get_preserve_invalid(const RID &p_shaped) const { const ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, false); @@ -2732,7 +2749,7 @@ bool TextServerFallback::shaped_text_get_preserve_invalid(const RID &p_shaped) c return sd->preserve_invalid; } -void TextServerFallback::shaped_text_set_preserve_control(const RID &p_shaped, bool p_enabled) { +void TextServerFallback::_shaped_text_set_preserve_control(const RID &p_shaped, bool p_enabled) { ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND(!sd); @@ -2746,7 +2763,7 @@ void TextServerFallback::shaped_text_set_preserve_control(const RID &p_shaped, b } } -bool TextServerFallback::shaped_text_get_preserve_control(const RID &p_shaped) const { +bool TextServerFallback::_shaped_text_get_preserve_control(const RID &p_shaped) const { const ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, false); @@ -2754,7 +2771,7 @@ bool TextServerFallback::shaped_text_get_preserve_control(const RID &p_shaped) c return sd->preserve_control; } -void TextServerFallback::shaped_text_set_spacing(const RID &p_shaped, SpacingType p_spacing, int64_t p_value) { +void TextServerFallback::_shaped_text_set_spacing(const RID &p_shaped, SpacingType p_spacing, int64_t p_value) { ERR_FAIL_INDEX((int)p_spacing, 4); ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND(!sd); @@ -2769,7 +2786,7 @@ void TextServerFallback::shaped_text_set_spacing(const RID &p_shaped, SpacingTyp } } -int64_t TextServerFallback::shaped_text_get_spacing(const RID &p_shaped, SpacingType p_spacing) const { +int64_t TextServerFallback::_shaped_text_get_spacing(const RID &p_shaped, SpacingType p_spacing) const { ERR_FAIL_INDEX_V((int)p_spacing, 4, 0); const ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); @@ -2779,20 +2796,20 @@ int64_t TextServerFallback::shaped_text_get_spacing(const RID &p_shaped, Spacing return sd->extra_spacing[p_spacing]; } -int64_t TextServerFallback::shaped_get_span_count(const RID &p_shaped) const { +int64_t TextServerFallback::_shaped_get_span_count(const RID &p_shaped) const { ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, 0); return sd->spans.size(); } -Variant TextServerFallback::shaped_get_span_meta(const RID &p_shaped, int64_t p_index) const { +Variant TextServerFallback::_shaped_get_span_meta(const RID &p_shaped, int64_t p_index) const { ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, Variant()); ERR_FAIL_INDEX_V(p_index, sd->spans.size(), Variant()); return sd->spans[p_index].meta; } -void TextServerFallback::shaped_set_span_update_font(const RID &p_shaped, int64_t p_index, const TypedArray<RID> &p_fonts, int64_t p_size, const Dictionary &p_opentype_features) { +void TextServerFallback::_shaped_set_span_update_font(const RID &p_shaped, int64_t p_index, const TypedArray<RID> &p_fonts, int64_t p_size, const Dictionary &p_opentype_features) { ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND(!sd); ERR_FAIL_INDEX(p_index, sd->spans.size()); @@ -2803,7 +2820,7 @@ void TextServerFallback::shaped_set_span_update_font(const RID &p_shaped, int64_ Array fonts_no_match; int font_count = p_fonts.size(); for (int i = 0; i < font_count; i++) { - if (font_is_language_supported(p_fonts[i], span.language)) { + if (_font_is_language_supported(p_fonts[i], span.language)) { span.fonts.push_back(p_fonts[i]); } else { fonts_no_match.push_back(p_fonts[i]); @@ -2816,7 +2833,7 @@ void TextServerFallback::shaped_set_span_update_font(const RID &p_shaped, int64_ sd->valid = false; } -bool TextServerFallback::shaped_text_add_string(const RID &p_shaped, const String &p_text, const TypedArray<RID> &p_fonts, int64_t p_size, const Dictionary &p_opentype_features, const String &p_language, const Variant &p_meta) { +bool TextServerFallback::_shaped_text_add_string(const RID &p_shaped, const String &p_text, const TypedArray<RID> &p_fonts, int64_t p_size, const Dictionary &p_opentype_features, const String &p_language, const Variant &p_meta) { ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, false); @@ -2842,8 +2859,11 @@ bool TextServerFallback::shaped_text_add_string(const RID &p_shaped, const Strin // Pre-sort fonts, push fonts with the language support first. Array fonts_no_match; int font_count = p_fonts.size(); - for (int i = 0; i < font_count; i++) { - if (font_is_language_supported(p_fonts[i], p_language)) { + if (font_count > 0) { + span.fonts.push_back(p_fonts[0]); + } + for (int i = 1; i < font_count; i++) { + if (_font_is_language_supported(p_fonts[i], p_language)) { span.fonts.push_back(p_fonts[i]); } else { fonts_no_match.push_back(p_fonts[i]); @@ -2864,7 +2884,7 @@ bool TextServerFallback::shaped_text_add_string(const RID &p_shaped, const Strin return true; } -bool TextServerFallback::shaped_text_add_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align, int64_t p_length) { +bool TextServerFallback::_shaped_text_add_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align, int64_t p_length) { ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, false); @@ -2895,7 +2915,7 @@ bool TextServerFallback::shaped_text_add_object(const RID &p_shaped, const Varia return true; } -bool TextServerFallback::shaped_text_resize_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align) { +bool TextServerFallback::_shaped_text_resize_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align) { ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, false); @@ -2936,14 +2956,14 @@ bool TextServerFallback::shaped_text_resize_object(const RID &p_shaped, const Va } else { if (gl.font_rid.is_valid()) { if (sd->orientation == ORIENTATION_HORIZONTAL) { - sd->ascent = MAX(sd->ascent, font_get_ascent(gl.font_rid, gl.font_size)); - sd->descent = MAX(sd->descent, font_get_descent(gl.font_rid, gl.font_size)); + sd->ascent = MAX(sd->ascent, _font_get_ascent(gl.font_rid, gl.font_size)); + sd->descent = MAX(sd->descent, _font_get_descent(gl.font_rid, gl.font_size)); } else { - sd->ascent = MAX(sd->ascent, Math::round(font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).x * 0.5)); - sd->descent = MAX(sd->descent, Math::round(font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).x * 0.5)); + sd->ascent = MAX(sd->ascent, Math::round(_font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).x * 0.5)); + sd->descent = MAX(sd->descent, Math::round(_font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).x * 0.5)); } - sd->upos = MAX(sd->upos, font_get_underline_position(gl.font_rid, gl.font_size)); - sd->uthk = MAX(sd->uthk, font_get_underline_thickness(gl.font_rid, gl.font_size)); + sd->upos = MAX(sd->upos, _font_get_underline_position(gl.font_rid, gl.font_size)); + sd->uthk = MAX(sd->uthk, _font_get_underline_thickness(gl.font_rid, gl.font_size)); } else if (sd->preserve_invalid || (sd->preserve_control && is_control(gl.index))) { // Glyph not found, replace with hex code box. if (sd->orientation == ORIENTATION_HORIZONTAL) { @@ -3030,7 +3050,7 @@ void TextServerFallback::_realign(ShapedTextDataFallback *p_sd) const { p_sd->descent = full_descent; } -RID TextServerFallback::shaped_text_substr(const RID &p_shaped, int64_t p_start, int64_t p_length) const { +RID TextServerFallback::_shaped_text_substr(const RID &p_shaped, int64_t p_start, int64_t p_length) const { _THREAD_SAFE_METHOD_ const ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); @@ -3038,10 +3058,10 @@ RID TextServerFallback::shaped_text_substr(const RID &p_shaped, int64_t p_start, MutexLock lock(sd->mutex); if (sd->parent != RID()) { - return shaped_text_substr(sd->parent, p_start, p_length); + return _shaped_text_substr(sd->parent, p_start, p_length); } if (!sd->valid) { - const_cast<TextServerFallback *>(this)->shaped_text_shape(p_shaped); + const_cast<TextServerFallback *>(this)->_shaped_text_shape(p_shaped); } ERR_FAIL_COND_V(p_start < 0 || p_length < 0, RID()); ERR_FAIL_COND_V(sd->start > p_start || sd->end < p_start, RID()); @@ -3096,11 +3116,11 @@ RID TextServerFallback::shaped_text_substr(const RID &p_shaped, int64_t p_start, } else { if (gl.font_rid.is_valid()) { if (new_sd->orientation == ORIENTATION_HORIZONTAL) { - new_sd->ascent = MAX(new_sd->ascent, font_get_ascent(gl.font_rid, gl.font_size)); - new_sd->descent = MAX(new_sd->descent, font_get_descent(gl.font_rid, gl.font_size)); + new_sd->ascent = MAX(new_sd->ascent, _font_get_ascent(gl.font_rid, gl.font_size)); + new_sd->descent = MAX(new_sd->descent, _font_get_descent(gl.font_rid, gl.font_size)); } else { - new_sd->ascent = MAX(new_sd->ascent, Math::round(font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).x * 0.5)); - new_sd->descent = MAX(new_sd->descent, Math::round(font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).x * 0.5)); + new_sd->ascent = MAX(new_sd->ascent, Math::round(_font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).x * 0.5)); + new_sd->descent = MAX(new_sd->descent, Math::round(_font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).x * 0.5)); } } else if (new_sd->preserve_invalid || (new_sd->preserve_control && is_control(gl.index))) { // Glyph not found, replace with hex code box. @@ -3124,7 +3144,7 @@ RID TextServerFallback::shaped_text_substr(const RID &p_shaped, int64_t p_start, return shaped_owner.make_rid(new_sd); } -RID TextServerFallback::shaped_text_get_parent(const RID &p_shaped) const { +RID TextServerFallback::_shaped_text_get_parent(const RID &p_shaped) const { ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, RID()); @@ -3132,16 +3152,16 @@ RID TextServerFallback::shaped_text_get_parent(const RID &p_shaped) const { return sd->parent; } -double TextServerFallback::shaped_text_fit_to_width(const RID &p_shaped, double p_width, BitField<JustificationFlag> p_jst_flags) { +double TextServerFallback::_shaped_text_fit_to_width(const RID &p_shaped, double p_width, BitField<JustificationFlag> p_jst_flags) { ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, 0.0); MutexLock lock(sd->mutex); if (!sd->valid) { - const_cast<TextServerFallback *>(this)->shaped_text_shape(p_shaped); + const_cast<TextServerFallback *>(this)->_shaped_text_shape(p_shaped); } if (!sd->justification_ops_valid) { - const_cast<TextServerFallback *>(this)->shaped_text_update_justification_ops(p_shaped); + const_cast<TextServerFallback *>(this)->_shaped_text_update_justification_ops(p_shaped); } int start_pos = 0; @@ -3241,16 +3261,16 @@ double TextServerFallback::shaped_text_fit_to_width(const RID &p_shaped, double return Math::ceil(justification_width); } -double TextServerFallback::shaped_text_tab_align(const RID &p_shaped, const PackedFloat32Array &p_tab_stops) { +double TextServerFallback::_shaped_text_tab_align(const RID &p_shaped, const PackedFloat32Array &p_tab_stops) { ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, 0.0); MutexLock lock(sd->mutex); if (!sd->valid) { - const_cast<TextServerFallback *>(this)->shaped_text_shape(p_shaped); + const_cast<TextServerFallback *>(this)->_shaped_text_shape(p_shaped); } if (!sd->line_breaks_valid) { - const_cast<TextServerFallback *>(this)->shaped_text_update_breaks(p_shaped); + const_cast<TextServerFallback *>(this)->_shaped_text_update_breaks(p_shaped); } for (int i = 0; i < p_tab_stops.size(); i++) { @@ -3297,13 +3317,13 @@ double TextServerFallback::shaped_text_tab_align(const RID &p_shaped, const Pack return 0.0; } -bool TextServerFallback::shaped_text_update_breaks(const RID &p_shaped) { +bool TextServerFallback::_shaped_text_update_breaks(const RID &p_shaped) { ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, false); MutexLock lock(sd->mutex); if (!sd->valid) { - shaped_text_shape(p_shaped); + _shaped_text_shape(p_shaped); } if (sd->line_breaks_valid) { @@ -3353,29 +3373,29 @@ bool TextServerFallback::shaped_text_update_breaks(const RID &p_shaped) { return sd->line_breaks_valid; } -bool TextServerFallback::shaped_text_update_justification_ops(const RID &p_shaped) { +bool TextServerFallback::_shaped_text_update_justification_ops(const RID &p_shaped) { ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, false); MutexLock lock(sd->mutex); if (!sd->valid) { - shaped_text_shape(p_shaped); + _shaped_text_shape(p_shaped); } if (!sd->line_breaks_valid) { - shaped_text_update_breaks(p_shaped); + _shaped_text_update_breaks(p_shaped); } sd->justification_ops_valid = true; // Not supported by fallback server. return true; } -void TextServerFallback::shaped_text_overrun_trim_to_width(const RID &p_shaped_line, double p_width, BitField<TextServer::TextOverrunFlag> p_trim_flags) { +void TextServerFallback::_shaped_text_overrun_trim_to_width(const RID &p_shaped_line, double p_width, BitField<TextServer::TextOverrunFlag> p_trim_flags) { ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped_line); ERR_FAIL_COND_MSG(!sd, "ShapedTextDataFallback invalid."); MutexLock lock(sd->mutex); if (!sd->valid) { - shaped_text_shape(p_shaped_line); + _shaped_text_shape(p_shaped_line); } sd->text_trimmed = false; @@ -3414,30 +3434,30 @@ void TextServerFallback::shaped_text_overrun_trim_to_width(const RID &p_shaped_l // Find usable fonts, if fonts from the last glyph do not have required chars. RID dot_gl_font_rid = sd_glyphs[sd_size - 1].font_rid; - if (!font_has_char(dot_gl_font_rid, '.')) { + if (!_font_has_char(dot_gl_font_rid, '.')) { const Array &fonts = spans[spans.size() - 1].fonts; for (int i = 0; i < fonts.size(); i++) { - if (font_has_char(fonts[i], '.')) { + if (_font_has_char(fonts[i], '.')) { dot_gl_font_rid = fonts[i]; break; } } } RID whitespace_gl_font_rid = sd_glyphs[sd_size - 1].font_rid; - if (!font_has_char(whitespace_gl_font_rid, '.')) { + if (!_font_has_char(whitespace_gl_font_rid, '.')) { const Array &fonts = spans[spans.size() - 1].fonts; for (int i = 0; i < fonts.size(); i++) { - if (font_has_char(fonts[i], ' ')) { + if (_font_has_char(fonts[i], ' ')) { whitespace_gl_font_rid = fonts[i]; break; } } } - int32_t dot_gl_idx = dot_gl_font_rid.is_valid() ? font_get_glyph_index(dot_gl_font_rid, last_gl_font_size, '.') : -10; - Vector2 dot_adv = dot_gl_font_rid.is_valid() ? font_get_glyph_advance(dot_gl_font_rid, last_gl_font_size, dot_gl_idx) : Vector2(); - int32_t whitespace_gl_idx = whitespace_gl_font_rid.is_valid() ? font_get_glyph_index(whitespace_gl_font_rid, last_gl_font_size, ' ') : -10; - Vector2 whitespace_adv = whitespace_gl_font_rid.is_valid() ? font_get_glyph_advance(whitespace_gl_font_rid, last_gl_font_size, whitespace_gl_idx) : Vector2(); + int32_t dot_gl_idx = dot_gl_font_rid.is_valid() ? _font_get_glyph_index(dot_gl_font_rid, last_gl_font_size, '.', 0) : -10; + Vector2 dot_adv = dot_gl_font_rid.is_valid() ? _font_get_glyph_advance(dot_gl_font_rid, last_gl_font_size, dot_gl_idx) : Vector2(); + int32_t whitespace_gl_idx = whitespace_gl_font_rid.is_valid() ? _font_get_glyph_index(whitespace_gl_font_rid, last_gl_font_size, ' ', 0) : -10; + Vector2 whitespace_adv = whitespace_gl_font_rid.is_valid() ? _font_get_glyph_advance(whitespace_gl_font_rid, last_gl_font_size, whitespace_gl_idx) : Vector2(); int ellipsis_width = 0; if (add_ellipsis && whitespace_gl_font_rid.is_valid()) { @@ -3453,29 +3473,34 @@ void TextServerFallback::shaped_text_overrun_trim_to_width(const RID &p_shaped_l int last_valid_cut = 0; bool found = false; - for (int i = sd_size - 1; i != -1; i--) { - width -= sd_glyphs[i].advance * sd_glyphs[i].repeat; + if (enforce_ellipsis && (width + ellipsis_width <= p_width)) { + trim_pos = -1; + ellipsis_pos = sd_size; + } else { + for (int i = sd_size - 1; i != -1; i--) { + width -= sd_glyphs[i].advance * sd_glyphs[i].repeat; - if (sd_glyphs[i].count > 0) { - bool above_min_char_threshold = (i >= ell_min_characters); + if (sd_glyphs[i].count > 0) { + bool above_min_char_threshold = (i >= ell_min_characters); - if (width + (((above_min_char_threshold && add_ellipsis) || enforce_ellipsis) ? ellipsis_width : 0) <= p_width) { - if (cut_per_word && above_min_char_threshold) { - if ((sd_glyphs[i].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT) { + if (width + (((above_min_char_threshold && add_ellipsis) || enforce_ellipsis) ? ellipsis_width : 0) <= p_width) { + if (cut_per_word && above_min_char_threshold) { + if ((sd_glyphs[i].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT) { + last_valid_cut = i; + found = true; + } + } else { last_valid_cut = i; found = true; } - } else { - last_valid_cut = i; - found = true; - } - if (found) { - trim_pos = last_valid_cut; + if (found) { + trim_pos = last_valid_cut; - if (add_ellipsis && (above_min_char_threshold || enforce_ellipsis) && width - ellipsis_width <= p_width) { - ellipsis_pos = trim_pos; + if (add_ellipsis && (above_min_char_threshold || enforce_ellipsis) && width - ellipsis_width <= p_width) { + ellipsis_pos = trim_pos; + } + break; } - break; } } } @@ -3521,7 +3546,7 @@ void TextServerFallback::shaped_text_overrun_trim_to_width(const RID &p_shaped_l } } -int64_t TextServerFallback::shaped_text_get_trim_pos(const RID &p_shaped) const { +int64_t TextServerFallback::_shaped_text_get_trim_pos(const RID &p_shaped) const { ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V_MSG(!sd, -1, "ShapedTextDataFallback invalid."); @@ -3529,7 +3554,7 @@ int64_t TextServerFallback::shaped_text_get_trim_pos(const RID &p_shaped) const return sd->overrun_trim_data.trim_pos; } -int64_t TextServerFallback::shaped_text_get_ellipsis_pos(const RID &p_shaped) const { +int64_t TextServerFallback::_shaped_text_get_ellipsis_pos(const RID &p_shaped) const { ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V_MSG(!sd, -1, "ShapedTextDataFallback invalid."); @@ -3537,7 +3562,7 @@ int64_t TextServerFallback::shaped_text_get_ellipsis_pos(const RID &p_shaped) co return sd->overrun_trim_data.ellipsis_pos; } -const Glyph *TextServerFallback::shaped_text_get_ellipsis_glyphs(const RID &p_shaped) const { +const Glyph *TextServerFallback::_shaped_text_get_ellipsis_glyphs(const RID &p_shaped) const { ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V_MSG(!sd, nullptr, "ShapedTextDataFallback invalid."); @@ -3545,7 +3570,7 @@ const Glyph *TextServerFallback::shaped_text_get_ellipsis_glyphs(const RID &p_sh return sd->overrun_trim_data.ellipsis_glyph_buf.ptr(); } -int64_t TextServerFallback::shaped_text_get_ellipsis_glyph_count(const RID &p_shaped) const { +int64_t TextServerFallback::_shaped_text_get_ellipsis_glyph_count(const RID &p_shaped) const { ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V_MSG(!sd, 0, "ShapedTextDataFallback invalid."); @@ -3553,7 +3578,7 @@ int64_t TextServerFallback::shaped_text_get_ellipsis_glyph_count(const RID &p_sh return sd->overrun_trim_data.ellipsis_glyph_buf.size(); } -bool TextServerFallback::shaped_text_shape(const RID &p_shaped) { +bool TextServerFallback::_shaped_text_shape(const RID &p_shaped) { ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, false); @@ -3620,27 +3645,27 @@ bool TextServerFallback::shaped_text_shape(const RID &p_shaped) { } // Select first font which has character (font are already sorted by span language). for (int k = 0; k < span.fonts.size(); k++) { - if (font_has_char(span.fonts[k], gl.index)) { + if (_font_has_char(span.fonts[k], gl.index)) { gl.font_rid = span.fonts[k]; break; } } if (gl.font_rid.is_valid()) { - bool subpos = (font_get_subpixel_positioning(gl.font_rid) == SUBPIXEL_POSITIONING_ONE_HALF) || (font_get_subpixel_positioning(gl.font_rid) == SUBPIXEL_POSITIONING_ONE_QUARTER) || (font_get_subpixel_positioning(gl.font_rid) == SUBPIXEL_POSITIONING_AUTO && gl.font_size <= SUBPIXEL_POSITIONING_ONE_HALF_MAX_SIZE); + bool subpos = (_font_get_subpixel_positioning(gl.font_rid) == SUBPIXEL_POSITIONING_ONE_HALF) || (_font_get_subpixel_positioning(gl.font_rid) == SUBPIXEL_POSITIONING_ONE_QUARTER) || (_font_get_subpixel_positioning(gl.font_rid) == SUBPIXEL_POSITIONING_AUTO && gl.font_size <= SUBPIXEL_POSITIONING_ONE_HALF_MAX_SIZE); if (sd->text[j - sd->start] != 0 && !is_linebreak(sd->text[j - sd->start])) { if (sd->orientation == ORIENTATION_HORIZONTAL) { - gl.advance = Math::round(font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).x); + gl.advance = Math::round(_font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).x); gl.x_off = 0; gl.y_off = 0; - sd->ascent = MAX(sd->ascent, font_get_ascent(gl.font_rid, gl.font_size)); - sd->descent = MAX(sd->descent, font_get_descent(gl.font_rid, gl.font_size)); + sd->ascent = MAX(sd->ascent, _font_get_ascent(gl.font_rid, gl.font_size)); + sd->descent = MAX(sd->descent, _font_get_descent(gl.font_rid, gl.font_size)); } else { - gl.advance = Math::round(font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).y); - gl.x_off = -Math::round(font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).x * 0.5); - gl.y_off = font_get_ascent(gl.font_rid, gl.font_size); - sd->ascent = MAX(sd->ascent, Math::round(font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).x * 0.5)); - sd->descent = MAX(sd->descent, Math::round(font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).x * 0.5)); + gl.advance = Math::round(_font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).y); + gl.x_off = -Math::round(_font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).x * 0.5); + gl.y_off = _font_get_ascent(gl.font_rid, gl.font_size); + sd->ascent = MAX(sd->ascent, Math::round(_font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).x * 0.5)); + sd->descent = MAX(sd->descent, Math::round(_font_get_glyph_advance(gl.font_rid, gl.font_size, gl.index).x * 0.5)); } } if (j < sd->end - 1) { @@ -3651,17 +3676,17 @@ bool TextServerFallback::shaped_text_shape(const RID &p_shaped) { gl.advance += sd->extra_spacing[SPACING_GLYPH]; } } - sd->upos = MAX(sd->upos, font_get_underline_position(gl.font_rid, gl.font_size)); - sd->uthk = MAX(sd->uthk, font_get_underline_thickness(gl.font_rid, gl.font_size)); + sd->upos = MAX(sd->upos, _font_get_underline_position(gl.font_rid, gl.font_size)); + sd->uthk = MAX(sd->uthk, _font_get_underline_thickness(gl.font_rid, gl.font_size)); // Add kerning to previous glyph. if (sd->glyphs.size() > 0) { Glyph &prev_gl = sd->glyphs.write[sd->glyphs.size() - 1]; if (prev_gl.font_rid == gl.font_rid && prev_gl.font_size == gl.font_size) { if (sd->orientation == ORIENTATION_HORIZONTAL) { - prev_gl.advance += font_get_kerning(gl.font_rid, gl.font_size, Vector2i(prev_gl.index, gl.index)).x; + prev_gl.advance += _font_get_kerning(gl.font_rid, gl.font_size, Vector2i(prev_gl.index, gl.index)).x; } else { - prev_gl.advance += font_get_kerning(gl.font_rid, gl.font_size, Vector2i(prev_gl.index, gl.index)).y; + prev_gl.advance += _font_get_kerning(gl.font_rid, gl.font_size, Vector2i(prev_gl.index, gl.index)).y; } } } @@ -3692,7 +3717,7 @@ bool TextServerFallback::shaped_text_shape(const RID &p_shaped) { return sd->valid; } -bool TextServerFallback::shaped_text_is_ready(const RID &p_shaped) const { +bool TextServerFallback::_shaped_text_is_ready(const RID &p_shaped) const { const ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, false); @@ -3700,41 +3725,41 @@ bool TextServerFallback::shaped_text_is_ready(const RID &p_shaped) const { return sd->valid; } -const Glyph *TextServerFallback::shaped_text_get_glyphs(const RID &p_shaped) const { +const Glyph *TextServerFallback::_shaped_text_get_glyphs(const RID &p_shaped) const { const ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, nullptr); MutexLock lock(sd->mutex); if (!sd->valid) { - const_cast<TextServerFallback *>(this)->shaped_text_shape(p_shaped); + const_cast<TextServerFallback *>(this)->_shaped_text_shape(p_shaped); } return sd->glyphs.ptr(); } -int64_t TextServerFallback::shaped_text_get_glyph_count(const RID &p_shaped) const { +int64_t TextServerFallback::_shaped_text_get_glyph_count(const RID &p_shaped) const { const ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, 0); MutexLock lock(sd->mutex); if (!sd->valid) { - const_cast<TextServerFallback *>(this)->shaped_text_shape(p_shaped); + const_cast<TextServerFallback *>(this)->_shaped_text_shape(p_shaped); } return sd->glyphs.size(); } -const Glyph *TextServerFallback::shaped_text_sort_logical(const RID &p_shaped) { +const Glyph *TextServerFallback::_shaped_text_sort_logical(const RID &p_shaped) { const ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, nullptr); MutexLock lock(sd->mutex); if (!sd->valid) { - const_cast<TextServerFallback *>(this)->shaped_text_shape(p_shaped); + const_cast<TextServerFallback *>(this)->_shaped_text_shape(p_shaped); } return sd->glyphs.ptr(); // Already in the logical order, return as is. } -Vector2i TextServerFallback::shaped_text_get_range(const RID &p_shaped) const { +Vector2i TextServerFallback::_shaped_text_get_range(const RID &p_shaped) const { const ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, Vector2i()); @@ -3742,7 +3767,7 @@ Vector2i TextServerFallback::shaped_text_get_range(const RID &p_shaped) const { return Vector2(sd->start, sd->end); } -Array TextServerFallback::shaped_text_get_objects(const RID &p_shaped) const { +Array TextServerFallback::_shaped_text_get_objects(const RID &p_shaped) const { Array ret; const ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, ret); @@ -3755,25 +3780,25 @@ Array TextServerFallback::shaped_text_get_objects(const RID &p_shaped) const { return ret; } -Rect2 TextServerFallback::shaped_text_get_object_rect(const RID &p_shaped, const Variant &p_key) const { +Rect2 TextServerFallback::_shaped_text_get_object_rect(const RID &p_shaped, const Variant &p_key) const { const ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, Rect2()); MutexLock lock(sd->mutex); ERR_FAIL_COND_V(!sd->objects.has(p_key), Rect2()); if (!sd->valid) { - const_cast<TextServerFallback *>(this)->shaped_text_shape(p_shaped); + const_cast<TextServerFallback *>(this)->_shaped_text_shape(p_shaped); } return sd->objects[p_key].rect; } -Size2 TextServerFallback::shaped_text_get_size(const RID &p_shaped) const { +Size2 TextServerFallback::_shaped_text_get_size(const RID &p_shaped) const { const ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, Size2()); MutexLock lock(sd->mutex); if (!sd->valid) { - const_cast<TextServerFallback *>(this)->shaped_text_shape(p_shaped); + const_cast<TextServerFallback *>(this)->_shaped_text_shape(p_shaped); } if (sd->orientation == TextServer::ORIENTATION_HORIZONTAL) { return Size2(sd->width, sd->ascent + sd->descent + sd->extra_spacing[SPACING_TOP] + sd->extra_spacing[SPACING_BOTTOM]).ceil(); @@ -3782,64 +3807,64 @@ Size2 TextServerFallback::shaped_text_get_size(const RID &p_shaped) const { } } -double TextServerFallback::shaped_text_get_ascent(const RID &p_shaped) const { +double TextServerFallback::_shaped_text_get_ascent(const RID &p_shaped) const { const ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, 0.0); MutexLock lock(sd->mutex); if (!sd->valid) { - const_cast<TextServerFallback *>(this)->shaped_text_shape(p_shaped); + const_cast<TextServerFallback *>(this)->_shaped_text_shape(p_shaped); } return sd->ascent + sd->extra_spacing[SPACING_TOP]; } -double TextServerFallback::shaped_text_get_descent(const RID &p_shaped) const { +double TextServerFallback::_shaped_text_get_descent(const RID &p_shaped) const { const ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, 0.0); MutexLock lock(sd->mutex); if (!sd->valid) { - const_cast<TextServerFallback *>(this)->shaped_text_shape(p_shaped); + const_cast<TextServerFallback *>(this)->_shaped_text_shape(p_shaped); } return sd->descent + sd->extra_spacing[SPACING_BOTTOM]; } -double TextServerFallback::shaped_text_get_width(const RID &p_shaped) const { +double TextServerFallback::_shaped_text_get_width(const RID &p_shaped) const { const ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, 0.0); MutexLock lock(sd->mutex); if (!sd->valid) { - const_cast<TextServerFallback *>(this)->shaped_text_shape(p_shaped); + const_cast<TextServerFallback *>(this)->_shaped_text_shape(p_shaped); } return Math::ceil(sd->width); } -double TextServerFallback::shaped_text_get_underline_position(const RID &p_shaped) const { +double TextServerFallback::_shaped_text_get_underline_position(const RID &p_shaped) const { const ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, 0.0); MutexLock lock(sd->mutex); if (!sd->valid) { - const_cast<TextServerFallback *>(this)->shaped_text_shape(p_shaped); + const_cast<TextServerFallback *>(this)->_shaped_text_shape(p_shaped); } return sd->upos; } -double TextServerFallback::shaped_text_get_underline_thickness(const RID &p_shaped) const { +double TextServerFallback::_shaped_text_get_underline_thickness(const RID &p_shaped) const { const ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, 0.0); MutexLock lock(sd->mutex); if (!sd->valid) { - const_cast<TextServerFallback *>(this)->shaped_text_shape(p_shaped); + const_cast<TextServerFallback *>(this)->_shaped_text_shape(p_shaped); } return sd->uthk; } -String TextServerFallback::string_to_upper(const String &p_string, const String &p_language) const { +String TextServerFallback::_string_to_upper(const String &p_string, const String &p_language) const { String upper = p_string; for (int i = 0; i <= upper.length(); i++) { @@ -3853,7 +3878,7 @@ String TextServerFallback::string_to_upper(const String &p_string, const String return upper; } -String TextServerFallback::string_to_lower(const String &p_string, const String &p_language) const { +String TextServerFallback::_string_to_lower(const String &p_string, const String &p_language) const { String lower = p_string; for (int i = 0; i <= lower.length(); i++) { @@ -3867,7 +3892,7 @@ String TextServerFallback::string_to_lower(const String &p_string, const String return lower; } -PackedInt32Array TextServerFallback::string_get_word_breaks(const String &p_string, const String &p_language) const { +PackedInt32Array TextServerFallback::_string_get_word_breaks(const String &p_string, const String &p_language) const { PackedInt32Array ret; for (int i = 0; i < p_string.length(); i++) { char32_t c = p_string[i]; diff --git a/modules/text_server_fb/text_server_fb.h b/modules/text_server_fb/text_server_fb.h index cbb2fb03f2..4aeec4f452 100644 --- a/modules/text_server_fb/text_server_fb.h +++ b/modules/text_server_fb/text_server_fb.h @@ -42,6 +42,7 @@ #include <godot_cpp/godot.hpp> #include <godot_cpp/core/class_db.hpp> +#include <godot_cpp/core/ext_wrappers.gen.inc> #include <godot_cpp/core/mutex_lock.hpp> #include <godot_cpp/variant/array.hpp> @@ -52,6 +53,7 @@ #include <godot_cpp/variant/rect2.hpp> #include <godot_cpp/variant/rid.hpp> #include <godot_cpp/variant/string.hpp> +#include <godot_cpp/variant/typed_array.hpp> #include <godot_cpp/variant/vector2.hpp> #include <godot_cpp/variant/vector2i.hpp> @@ -79,6 +81,7 @@ using namespace godot; #include "servers/text/text_server_extension.h" +#include "core/extension/ext_wrappers.gen.inc" #include "core/object/worker_thread_pool.h" #include "core/templates/hash_map.h" #include "core/templates/rid_owner.h" @@ -337,251 +340,249 @@ protected: void invalidate(ShapedTextDataFallback *p_shaped); public: - virtual bool has_feature(Feature p_feature) const override; - virtual String get_name() const override; - virtual int64_t get_features() const override; + MODBIND1RC(bool, has_feature, Feature); + MODBIND0RC(String, get_name); + MODBIND0RC(int64_t, get_features); - virtual void free_rid(const RID &p_rid) override; - virtual bool has(const RID &p_rid) override; - virtual bool load_support_data(const String &p_filename) override; + MODBIND1(free_rid, const RID &); + MODBIND1R(bool, has, const RID &); + MODBIND1R(bool, load_support_data, const String &); - virtual String get_support_data_filename() const override { - return ""; - }; - virtual String get_support_data_info() const override { - return "Not supported"; - }; - virtual bool save_support_data(const String &p_filename) const override; + MODBIND0RC(String, get_support_data_filename); + MODBIND0RC(String, get_support_data_info); + MODBIND1RC(bool, save_support_data, const String &); - virtual bool is_locale_right_to_left(const String &p_locale) const override; + MODBIND1RC(bool, is_locale_right_to_left, const String &); - virtual int64_t name_to_tag(const String &p_name) const override; - virtual String tag_to_name(int64_t p_tag) const override; + MODBIND1RC(int64_t, name_to_tag, const String &); + MODBIND1RC(String, tag_to_name, int64_t); /* Font interface */ - virtual RID create_font() override; - virtual void font_set_data(const RID &p_font_rid, const PackedByteArray &p_data) override; - virtual void font_set_data_ptr(const RID &p_font_rid, const uint8_t *p_data_ptr, int64_t p_data_size) override; + MODBIND0R(RID, create_font); + + MODBIND2(font_set_data, const RID &, const PackedByteArray &); + MODBIND3(font_set_data_ptr, const RID &, const uint8_t *, int64_t); + + MODBIND2(font_set_face_index, const RID &, int64_t); + MODBIND1RC(int64_t, font_get_face_index, const RID &); - virtual void font_set_face_index(const RID &p_font_rid, int64_t p_index) override; - virtual int64_t font_get_face_index(const RID &p_font_rid) const override; + MODBIND1RC(int64_t, font_get_face_count, const RID &); - virtual int64_t font_get_face_count(const RID &p_font_rid) const override; + MODBIND2(font_set_style, const RID &, BitField<FontStyle>); + MODBIND1RC(BitField<FontStyle>, font_get_style, const RID &); - virtual void font_set_style(const RID &p_font_rid, BitField<FontStyle> p_style) override; - virtual BitField<FontStyle> font_get_style(const RID &p_font_rid) const override; + MODBIND2(font_set_style_name, const RID &, const String &); + MODBIND1RC(String, font_get_style_name, const RID &); - virtual void font_set_style_name(const RID &p_font_rid, const String &p_name) override; - virtual String font_get_style_name(const RID &p_font_rid) const override; + MODBIND2(font_set_name, const RID &, const String &); + MODBIND1RC(String, font_get_name, const RID &); - virtual void font_set_name(const RID &p_font_rid, const String &p_name) override; - virtual String font_get_name(const RID &p_font_rid) const override; + MODBIND2(font_set_antialiasing, const RID &, TextServer::FontAntialiasing); + MODBIND1RC(TextServer::FontAntialiasing, font_get_antialiasing, const RID &); - virtual void font_set_antialiasing(RID p_font_rid, TextServer::FontAntialiasing p_antialiasing) override; - virtual TextServer::FontAntialiasing font_get_antialiasing(RID p_font_rid) const override; + MODBIND2(font_set_generate_mipmaps, const RID &, bool); + MODBIND1RC(bool, font_get_generate_mipmaps, const RID &); - virtual void font_set_generate_mipmaps(const RID &p_font_rid, bool p_generate_mipmaps) override; - virtual bool font_get_generate_mipmaps(const RID &p_font_rid) const override; + MODBIND2(font_set_multichannel_signed_distance_field, const RID &, bool); + MODBIND1RC(bool, font_is_multichannel_signed_distance_field, const RID &); - virtual void font_set_multichannel_signed_distance_field(const RID &p_font_rid, bool p_msdf) override; - virtual bool font_is_multichannel_signed_distance_field(const RID &p_font_rid) const override; + MODBIND2(font_set_msdf_pixel_range, const RID &, int64_t); + MODBIND1RC(int64_t, font_get_msdf_pixel_range, const RID &); - virtual void font_set_msdf_pixel_range(const RID &p_font_rid, int64_t p_msdf_pixel_range) override; - virtual int64_t font_get_msdf_pixel_range(const RID &p_font_rid) const override; + MODBIND2(font_set_msdf_size, const RID &, int64_t); + MODBIND1RC(int64_t, font_get_msdf_size, const RID &); - virtual void font_set_msdf_size(const RID &p_font_rid, int64_t p_msdf_size) override; - virtual int64_t font_get_msdf_size(const RID &p_font_rid) const override; + MODBIND2(font_set_fixed_size, const RID &, int64_t); + MODBIND1RC(int64_t, font_get_fixed_size, const RID &); - virtual void font_set_fixed_size(const RID &p_font_rid, int64_t p_fixed_size) override; - virtual int64_t font_get_fixed_size(const RID &p_font_rid) const override; + MODBIND2(font_set_force_autohinter, const RID &, bool); + MODBIND1RC(bool, font_is_force_autohinter, const RID &); - virtual void font_set_force_autohinter(const RID &p_font_rid, bool p_force_autohinter) override; - virtual bool font_is_force_autohinter(const RID &p_font_rid) const override; + MODBIND2(font_set_subpixel_positioning, const RID &, SubpixelPositioning); + MODBIND1RC(SubpixelPositioning, font_get_subpixel_positioning, const RID &); - virtual void font_set_hinting(const RID &p_font_rid, TextServer::Hinting p_hinting) override; - virtual TextServer::Hinting font_get_hinting(const RID &p_font_rid) const override; + MODBIND2(font_set_embolden, const RID &, double); + MODBIND1RC(double, font_get_embolden, const RID &); - virtual void font_set_subpixel_positioning(const RID &p_font_rid, SubpixelPositioning p_subpixel) override; - virtual SubpixelPositioning font_get_subpixel_positioning(const RID &p_font_rid) const override; + MODBIND2(font_set_transform, const RID &, const Transform2D &); + MODBIND1RC(Transform2D, font_get_transform, const RID &); - virtual void font_set_embolden(const RID &p_font_rid, double p_strength) override; - virtual double font_get_embolden(const RID &p_font_rid) const override; + MODBIND2(font_set_variation_coordinates, const RID &, const Dictionary &); + MODBIND1RC(Dictionary, font_get_variation_coordinates, const RID &); - virtual void font_set_transform(const RID &p_font_rid, const Transform2D &p_transform) override; - virtual Transform2D font_get_transform(const RID &p_font_rid) const override; + MODBIND2(font_set_hinting, const RID &, TextServer::Hinting); + MODBIND1RC(TextServer::Hinting, font_get_hinting, const RID &); - virtual void font_set_variation_coordinates(const RID &p_font_rid, const Dictionary &p_variation_coordinates) override; - virtual Dictionary font_get_variation_coordinates(const RID &p_font_rid) const override; + MODBIND2(font_set_oversampling, const RID &, double); + MODBIND1RC(double, font_get_oversampling, const RID &); - virtual void font_set_oversampling(const RID &p_font_rid, double p_oversampling) override; - virtual double font_get_oversampling(const RID &p_font_rid) const override; + MODBIND1RC(TypedArray<Vector2i>, font_get_size_cache_list, const RID &); + MODBIND1(font_clear_size_cache, const RID &); + MODBIND2(font_remove_size_cache, const RID &, const Vector2i &); - virtual TypedArray<Vector2i> font_get_size_cache_list(const RID &p_font_rid) const override; - virtual void font_clear_size_cache(const RID &p_font_rid) override; - virtual void font_remove_size_cache(const RID &p_font_rid, const Vector2i &p_size) override; + MODBIND3(font_set_ascent, const RID &, int64_t, double); + MODBIND2RC(double, font_get_ascent, const RID &, int64_t); - virtual void font_set_ascent(const RID &p_font_rid, int64_t p_size, double p_ascent) override; - virtual double font_get_ascent(const RID &p_font_rid, int64_t p_size) const override; + MODBIND3(font_set_descent, const RID &, int64_t, double); + MODBIND2RC(double, font_get_descent, const RID &, int64_t); - virtual void font_set_descent(const RID &p_font_rid, int64_t p_size, double p_descent) override; - virtual double font_get_descent(const RID &p_font_rid, int64_t p_size) const override; + MODBIND3(font_set_underline_position, const RID &, int64_t, double); + MODBIND2RC(double, font_get_underline_position, const RID &, int64_t); - virtual void font_set_underline_position(const RID &p_font_rid, int64_t p_size, double p_underline_position) override; - virtual double font_get_underline_position(const RID &p_font_rid, int64_t p_size) const override; + MODBIND3(font_set_underline_thickness, const RID &, int64_t, double); + MODBIND2RC(double, font_get_underline_thickness, const RID &, int64_t); - virtual void font_set_underline_thickness(const RID &p_font_rid, int64_t p_size, double p_underline_thickness) override; - virtual double font_get_underline_thickness(const RID &p_font_rid, int64_t p_size) const override; + MODBIND3(font_set_scale, const RID &, int64_t, double); + MODBIND2RC(double, font_get_scale, const RID &, int64_t); - virtual void font_set_scale(const RID &p_font_rid, int64_t p_size, double p_scale) override; - virtual double font_get_scale(const RID &p_font_rid, int64_t p_size) const override; + MODBIND2RC(int64_t, font_get_texture_count, const RID &, const Vector2i &); + MODBIND2(font_clear_textures, const RID &, const Vector2i &); + MODBIND3(font_remove_texture, const RID &, const Vector2i &, int64_t); - virtual int64_t font_get_texture_count(const RID &p_font_rid, const Vector2i &p_size) const override; - virtual void font_clear_textures(const RID &p_font_rid, const Vector2i &p_size) override; - virtual void font_remove_texture(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index) override; + MODBIND4(font_set_texture_image, const RID &, const Vector2i &, int64_t, const Ref<Image> &); + MODBIND3RC(Ref<Image>, font_get_texture_image, const RID &, const Vector2i &, int64_t); - virtual void font_set_texture_image(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index, const Ref<Image> &p_image) override; - virtual Ref<Image> font_get_texture_image(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index) const override; + MODBIND4(font_set_texture_offsets, const RID &, const Vector2i &, int64_t, const PackedInt32Array &); + MODBIND3RC(PackedInt32Array, font_get_texture_offsets, const RID &, const Vector2i &, int64_t); - virtual void font_set_texture_offsets(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index, const PackedInt32Array &p_offset) override; - virtual PackedInt32Array font_get_texture_offsets(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index) const override; + MODBIND2RC(PackedInt32Array, font_get_glyph_list, const RID &, const Vector2i &); + MODBIND2(font_clear_glyphs, const RID &, const Vector2i &); + MODBIND3(font_remove_glyph, const RID &, const Vector2i &, int64_t); - virtual PackedInt32Array font_get_glyph_list(const RID &p_font_rid, const Vector2i &p_size) const override; - virtual void font_clear_glyphs(const RID &p_font_rid, const Vector2i &p_size) override; - virtual void font_remove_glyph(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) override; + MODBIND3RC(Vector2, font_get_glyph_advance, const RID &, int64_t, int64_t); + MODBIND4(font_set_glyph_advance, const RID &, int64_t, int64_t, const Vector2 &); - virtual Vector2 font_get_glyph_advance(const RID &p_font_rid, int64_t p_size, int64_t p_glyph) const override; - virtual void font_set_glyph_advance(const RID &p_font_rid, int64_t p_size, int64_t p_glyph, const Vector2 &p_advance) override; + MODBIND3RC(Vector2, font_get_glyph_offset, const RID &, const Vector2i &, int64_t); + MODBIND4(font_set_glyph_offset, const RID &, const Vector2i &, int64_t, const Vector2 &); - virtual Vector2 font_get_glyph_offset(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const override; - virtual void font_set_glyph_offset(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, const Vector2 &p_offset) override; + MODBIND3RC(Vector2, font_get_glyph_size, const RID &, const Vector2i &, int64_t); + MODBIND4(font_set_glyph_size, const RID &, const Vector2i &, int64_t, const Vector2 &); - virtual Vector2 font_get_glyph_size(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const override; - virtual void font_set_glyph_size(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, const Vector2 &p_gl_size) override; + MODBIND3RC(Rect2, font_get_glyph_uv_rect, const RID &, const Vector2i &, int64_t); + MODBIND4(font_set_glyph_uv_rect, const RID &, const Vector2i &, int64_t, const Rect2 &); - virtual Rect2 font_get_glyph_uv_rect(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const override; - virtual void font_set_glyph_uv_rect(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, const Rect2 &p_uv_rect) override; + MODBIND3RC(int64_t, font_get_glyph_texture_idx, const RID &, const Vector2i &, int64_t); + MODBIND4(font_set_glyph_texture_idx, const RID &, const Vector2i &, int64_t, int64_t); - virtual int64_t font_get_glyph_texture_idx(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const override; - virtual void font_set_glyph_texture_idx(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, int64_t p_texture_idx) override; - virtual RID font_get_glyph_texture_rid(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const override; - virtual Size2 font_get_glyph_texture_size(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const override; + MODBIND3RC(RID, font_get_glyph_texture_rid, const RID &, const Vector2i &, int64_t); + MODBIND3RC(Size2, font_get_glyph_texture_size, const RID &, const Vector2i &, int64_t); - virtual Dictionary font_get_glyph_contours(const RID &p_font, int64_t p_size, int64_t p_index) const override; + MODBIND3RC(Dictionary, font_get_glyph_contours, const RID &, int64_t, int64_t); - virtual TypedArray<Vector2i> font_get_kerning_list(const RID &p_font_rid, int64_t p_size) const override; - virtual void font_clear_kerning_map(const RID &p_font_rid, int64_t p_size) override; - virtual void font_remove_kerning(const RID &p_font_rid, int64_t p_size, const Vector2i &p_glyph_pair) override; + MODBIND2RC(TypedArray<Vector2i>, font_get_kerning_list, const RID &, int64_t); + MODBIND2(font_clear_kerning_map, const RID &, int64_t); + MODBIND3(font_remove_kerning, const RID &, int64_t, const Vector2i &); - virtual void font_set_kerning(const RID &p_font_rid, int64_t p_size, const Vector2i &p_glyph_pair, const Vector2 &p_kerning) override; - virtual Vector2 font_get_kerning(const RID &p_font_rid, int64_t p_size, const Vector2i &p_glyph_pair) const override; + MODBIND4(font_set_kerning, const RID &, int64_t, const Vector2i &, const Vector2 &); + MODBIND3RC(Vector2, font_get_kerning, const RID &, int64_t, const Vector2i &); - virtual int64_t font_get_glyph_index(const RID &p_font_rid, int64_t p_size, int64_t p_char, int64_t p_variation_selector = 0) const override; + MODBIND4RC(int64_t, font_get_glyph_index, const RID &, int64_t, int64_t, int64_t); - virtual bool font_has_char(const RID &p_font_rid, int64_t p_char) const override; - virtual String font_get_supported_chars(const RID &p_font_rid) const override; + MODBIND2RC(bool, font_has_char, const RID &, int64_t); + MODBIND1RC(String, font_get_supported_chars, const RID &); - virtual void font_render_range(const RID &p_font, const Vector2i &p_size, int64_t p_start, int64_t p_end) override; - virtual void font_render_glyph(const RID &p_font_rid, const Vector2i &p_size, int64_t p_index) override; + MODBIND4(font_render_range, const RID &, const Vector2i &, int64_t, int64_t); + MODBIND3(font_render_glyph, const RID &, const Vector2i &, int64_t); - virtual void font_draw_glyph(const RID &p_font, const RID &p_canvas, int64_t p_size, const Vector2 &p_pos, int64_t p_index, const Color &p_color = Color(1, 1, 1)) const override; - virtual void font_draw_glyph_outline(const RID &p_font, const RID &p_canvas, int64_t p_size, int64_t p_outline_size, const Vector2 &p_pos, int64_t p_index, const Color &p_color = Color(1, 1, 1)) const override; + MODBIND6C(font_draw_glyph, const RID &, const RID &, int64_t, const Vector2 &, int64_t, const Color &); + MODBIND7C(font_draw_glyph_outline, const RID &, const RID &, int64_t, int64_t, const Vector2 &, int64_t, const Color &); - virtual bool font_is_language_supported(const RID &p_font_rid, const String &p_language) const override; - virtual void font_set_language_support_override(const RID &p_font_rid, const String &p_language, bool p_supported) override; - virtual bool font_get_language_support_override(const RID &p_font_rid, const String &p_language) override; - virtual void font_remove_language_support_override(const RID &p_font_rid, const String &p_language) override; - virtual PackedStringArray font_get_language_support_overrides(const RID &p_font_rid) override; + MODBIND2RC(bool, font_is_language_supported, const RID &, const String &); + MODBIND3(font_set_language_support_override, const RID &, const String &, bool); + MODBIND2R(bool, font_get_language_support_override, const RID &, const String &); + MODBIND2(font_remove_language_support_override, const RID &, const String &); + MODBIND1R(PackedStringArray, font_get_language_support_overrides, const RID &); - virtual bool font_is_script_supported(const RID &p_font_rid, const String &p_script) const override; - virtual void font_set_script_support_override(const RID &p_font_rid, const String &p_script, bool p_supported) override; - virtual bool font_get_script_support_override(const RID &p_font_rid, const String &p_script) override; - virtual void font_remove_script_support_override(const RID &p_font_rid, const String &p_script) override; - virtual PackedStringArray font_get_script_support_overrides(const RID &p_font_rid) override; + MODBIND2RC(bool, font_is_script_supported, const RID &, const String &); + MODBIND3(font_set_script_support_override, const RID &, const String &, bool); + MODBIND2R(bool, font_get_script_support_override, const RID &, const String &); + MODBIND2(font_remove_script_support_override, const RID &, const String &); + MODBIND1R(PackedStringArray, font_get_script_support_overrides, const RID &); - virtual void font_set_opentype_feature_overrides(const RID &p_font_rid, const Dictionary &p_overrides) override; - virtual Dictionary font_get_opentype_feature_overrides(const RID &p_font_rid) const override; + MODBIND2(font_set_opentype_feature_overrides, const RID &, const Dictionary &); + MODBIND1RC(Dictionary, font_get_opentype_feature_overrides, const RID &); - virtual Dictionary font_supported_feature_list(const RID &p_font_rid) const override; - virtual Dictionary font_supported_variation_list(const RID &p_font_rid) const override; + MODBIND1RC(Dictionary, font_supported_feature_list, const RID &); + MODBIND1RC(Dictionary, font_supported_variation_list, const RID &); - virtual double font_get_global_oversampling() const override; - virtual void font_set_global_oversampling(double p_oversampling) override; + MODBIND0RC(double, font_get_global_oversampling); + MODBIND1(font_set_global_oversampling, double); /* Shaped text buffer interface */ - virtual RID create_shaped_text(Direction p_direction = DIRECTION_AUTO, Orientation p_orientation = ORIENTATION_HORIZONTAL) override; + MODBIND2R(RID, create_shaped_text, Direction, Orientation); - virtual void shaped_text_clear(const RID &p_shaped) override; + MODBIND1(shaped_text_clear, const RID &); - virtual void shaped_text_set_direction(const RID &p_shaped, Direction p_direction = DIRECTION_AUTO) override; - virtual Direction shaped_text_get_direction(const RID &p_shaped) const override; - virtual Direction shaped_text_get_inferred_direction(const RID &p_shaped) const override; + MODBIND2(shaped_text_set_direction, const RID &, Direction); + MODBIND1RC(Direction, shaped_text_get_direction, const RID &); + MODBIND1RC(Direction, shaped_text_get_inferred_direction, const RID &); - virtual void shaped_text_set_bidi_override(const RID &p_shaped, const Array &p_override) override; + MODBIND2(shaped_text_set_bidi_override, const RID &, const Array &); - virtual void shaped_text_set_custom_punctuation(const RID &p_shaped, const String &p_punct) override; - virtual String shaped_text_get_custom_punctuation(const RID &p_shaped) const override; + MODBIND2(shaped_text_set_custom_punctuation, const RID &, const String &); + MODBIND1RC(String, shaped_text_get_custom_punctuation, const RID &); - virtual void shaped_text_set_orientation(const RID &p_shaped, Orientation p_orientation = ORIENTATION_HORIZONTAL) override; - virtual Orientation shaped_text_get_orientation(const RID &p_shaped) const override; + MODBIND2(shaped_text_set_orientation, const RID &, Orientation); + MODBIND1RC(Orientation, shaped_text_get_orientation, const RID &); - virtual void shaped_text_set_preserve_invalid(const RID &p_shaped, bool p_enabled) override; - virtual bool shaped_text_get_preserve_invalid(const RID &p_shaped) const override; + MODBIND2(shaped_text_set_preserve_invalid, const RID &, bool); + MODBIND1RC(bool, shaped_text_get_preserve_invalid, const RID &); - virtual void shaped_text_set_preserve_control(const RID &p_shaped, bool p_enabled) override; - virtual bool shaped_text_get_preserve_control(const RID &p_shaped) const override; + MODBIND2(shaped_text_set_preserve_control, const RID &, bool); + MODBIND1RC(bool, shaped_text_get_preserve_control, const RID &); - virtual void shaped_text_set_spacing(const RID &p_shaped, SpacingType p_spacing, int64_t p_value) override; - virtual int64_t shaped_text_get_spacing(const RID &p_shaped, SpacingType p_spacing) const override; + MODBIND3(shaped_text_set_spacing, const RID &, SpacingType, int64_t); + MODBIND2RC(int64_t, shaped_text_get_spacing, const RID &, SpacingType); - virtual bool shaped_text_add_string(const RID &p_shaped, const String &p_text, const TypedArray<RID> &p_fonts, int64_t p_size, const Dictionary &p_opentype_features = Dictionary(), const String &p_language = "", const Variant &p_meta = Variant()) override; - virtual bool shaped_text_add_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER, int64_t p_length = 1) override; - virtual bool shaped_text_resize_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER) override; + MODBIND7R(bool, shaped_text_add_string, const RID &, const String &, const TypedArray<RID> &, int64_t, const Dictionary &, const String &, const Variant &); + MODBIND5R(bool, shaped_text_add_object, const RID &, const Variant &, const Size2 &, InlineAlignment, int64_t); + MODBIND4R(bool, shaped_text_resize_object, const RID &, const Variant &, const Size2 &, InlineAlignment); - virtual int64_t shaped_get_span_count(const RID &p_shaped) const override; - virtual Variant shaped_get_span_meta(const RID &p_shaped, int64_t p_index) const override; - virtual void shaped_set_span_update_font(const RID &p_shaped, int64_t p_index, const TypedArray<RID> &p_fonts, int64_t p_size, const Dictionary &p_opentype_features = Dictionary()) override; + MODBIND1RC(int64_t, shaped_get_span_count, const RID &); + MODBIND2RC(Variant, shaped_get_span_meta, const RID &, int64_t); + MODBIND5(shaped_set_span_update_font, const RID &, int64_t, const TypedArray<RID> &, int64_t, const Dictionary &); - virtual RID shaped_text_substr(const RID &p_shaped, int64_t p_start, int64_t p_length) const override; - virtual RID shaped_text_get_parent(const RID &p_shaped) const override; + MODBIND3RC(RID, shaped_text_substr, const RID &, int64_t, int64_t); + MODBIND1RC(RID, shaped_text_get_parent, const RID &); - virtual double shaped_text_fit_to_width(const RID &p_shaped, double p_width, BitField<TextServer::JustificationFlag> p_jst_flags = JUSTIFICATION_WORD_BOUND | JUSTIFICATION_KASHIDA) override; - virtual double shaped_text_tab_align(const RID &p_shaped, const PackedFloat32Array &p_tab_stops) override; + MODBIND3R(double, shaped_text_fit_to_width, const RID &, double, BitField<TextServer::JustificationFlag>); + MODBIND2R(double, shaped_text_tab_align, const RID &, const PackedFloat32Array &); - virtual bool shaped_text_shape(const RID &p_shaped) override; - virtual bool shaped_text_update_breaks(const RID &p_shaped) override; - virtual bool shaped_text_update_justification_ops(const RID &p_shaped) override; + MODBIND1R(bool, shaped_text_shape, const RID &); + MODBIND1R(bool, shaped_text_update_breaks, const RID &); + MODBIND1R(bool, shaped_text_update_justification_ops, const RID &); - virtual int64_t shaped_text_get_trim_pos(const RID &p_shaped) const override; - virtual int64_t shaped_text_get_ellipsis_pos(const RID &p_shaped) const override; - virtual const Glyph *shaped_text_get_ellipsis_glyphs(const RID &p_shaped) const override; - virtual int64_t shaped_text_get_ellipsis_glyph_count(const RID &p_shaped) const override; + MODBIND1RC(int64_t, shaped_text_get_trim_pos, const RID &); + MODBIND1RC(int64_t, shaped_text_get_ellipsis_pos, const RID &); + MODBIND1RC(const Glyph *, shaped_text_get_ellipsis_glyphs, const RID &); + MODBIND1RC(int64_t, shaped_text_get_ellipsis_glyph_count, const RID &); - virtual void shaped_text_overrun_trim_to_width(const RID &p_shaped, double p_width, BitField<TextServer::TextOverrunFlag> p_trim_flags) override; + MODBIND3(shaped_text_overrun_trim_to_width, const RID &, double, BitField<TextServer::TextOverrunFlag>); - virtual bool shaped_text_is_ready(const RID &p_shaped) const override; + MODBIND1RC(bool, shaped_text_is_ready, const RID &); - virtual const Glyph *shaped_text_get_glyphs(const RID &p_shaped) const override; - virtual const Glyph *shaped_text_sort_logical(const RID &p_shaped) override; - virtual int64_t shaped_text_get_glyph_count(const RID &p_shaped) const override; + MODBIND1RC(const Glyph *, shaped_text_get_glyphs, const RID &); + MODBIND1R(const Glyph *, shaped_text_sort_logical, const RID &); + MODBIND1RC(int64_t, shaped_text_get_glyph_count, const RID &); - virtual Vector2i shaped_text_get_range(const RID &p_shaped) const override; + MODBIND1RC(Vector2i, shaped_text_get_range, const RID &); - virtual Array shaped_text_get_objects(const RID &p_shaped) const override; - virtual Rect2 shaped_text_get_object_rect(const RID &p_shaped, const Variant &p_key) const override; + MODBIND1RC(Array, shaped_text_get_objects, const RID &); + MODBIND2RC(Rect2, shaped_text_get_object_rect, const RID &, const Variant &); - virtual Size2 shaped_text_get_size(const RID &p_shaped) const override; - virtual double shaped_text_get_ascent(const RID &p_shaped) const override; - virtual double shaped_text_get_descent(const RID &p_shaped) const override; - virtual double shaped_text_get_width(const RID &p_shaped) const override; - virtual double shaped_text_get_underline_position(const RID &p_shaped) const override; - virtual double shaped_text_get_underline_thickness(const RID &p_shaped) const override; + MODBIND1RC(Size2, shaped_text_get_size, const RID &); + MODBIND1RC(double, shaped_text_get_ascent, const RID &); + MODBIND1RC(double, shaped_text_get_descent, const RID &); + MODBIND1RC(double, shaped_text_get_width, const RID &); + MODBIND1RC(double, shaped_text_get_underline_position, const RID &); + MODBIND1RC(double, shaped_text_get_underline_thickness, const RID &); - virtual PackedInt32Array string_get_word_breaks(const String &p_string, const String &p_language = "") const override; + MODBIND2RC(PackedInt32Array, string_get_word_breaks, const String &, const String &); - virtual String string_to_upper(const String &p_string, const String &p_language = "") const override; - virtual String string_to_lower(const String &p_string, const String &p_language = "") const override; + MODBIND2RC(String, string_to_upper, const String &, const String &); + MODBIND2RC(String, string_to_lower, const String &, const String &); TextServerFallback(); ~TextServerFallback(); diff --git a/modules/tga/image_loader_tga.cpp b/modules/tga/image_loader_tga.cpp index 16d9bf7b93..aed95294e7 100644 --- a/modules/tga/image_loader_tga.cpp +++ b/modules/tga/image_loader_tga.cpp @@ -100,7 +100,7 @@ Error ImageLoaderTGA::convert_to_image(Ref<Image> p_image, const uint8_t *p_buff uint32_t width = p_header.image_width; uint32_t height = p_header.image_height; tga_origin_e origin = static_cast<tga_origin_e>((p_header.image_descriptor & TGA_ORIGIN_MASK) >> TGA_ORIGIN_SHIFT); - + uint8_t alpha_bits = p_header.image_descriptor & TGA_IMAGE_DESCRIPTOR_ALPHA_MASK; uint32_t x_start; int32_t x_step; uint32_t x_end; @@ -184,6 +184,27 @@ Error ImageLoaderTGA::convert_to_image(Ref<Image> p_image, const uint8_t *p_buff y += y_step; } } + } else if (p_header.pixel_depth == 16) { + while (y != y_end) { + while (x != x_end) { + if (i + 1 >= p_input_size) { + return ERR_PARSE_ERROR; + } + + // Always stored as RGBA5551 + uint8_t r = (p_buffer[i + 1] & 0x7c) << 1; + uint8_t g = ((p_buffer[i + 1] & 0x03) << 6) | ((p_buffer[i + 0] & 0xe0) >> 2); + uint8_t b = (p_buffer[i + 0] & 0x1f) << 3; + uint8_t a = (p_buffer[i + 1] & 0x80) ? 0xff : 0; + + TGA_PUT_PIXEL(r, g, b, alpha_bits ? a : 0xff); + + x += x_step; + i += 2; + } + x = x_start; + y += y_step; + } } else if (p_header.pixel_depth == 24) { while (y != y_end) { while (x != x_end) { @@ -230,7 +251,7 @@ Error ImageLoaderTGA::convert_to_image(Ref<Image> p_image, const uint8_t *p_buff return OK; } -Error ImageLoaderTGA::load_image(Ref<Image> p_image, Ref<FileAccess> f, uint32_t p_flags, float p_scale) { +Error ImageLoaderTGA::load_image(Ref<Image> p_image, Ref<FileAccess> f, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale) { Vector<uint8_t> src_image; uint64_t src_image_len = f->get_length(); ERR_FAIL_COND_V(src_image_len == 0, ERR_FILE_CORRUPT); @@ -277,7 +298,7 @@ Error ImageLoaderTGA::load_image(Ref<Image> p_image, Ref<FileAccess> f, uint32_t err = FAILED; } - if (!(tga_header.pixel_depth == 8 || tga_header.pixel_depth == 24 || tga_header.pixel_depth == 32)) { + if (!(tga_header.pixel_depth == 8 || tga_header.pixel_depth == 16 || tga_header.pixel_depth == 24 || tga_header.pixel_depth == 32)) { err = FAILED; } diff --git a/modules/tga/image_loader_tga.h b/modules/tga/image_loader_tga.h index d95c5ff30b..de964373ed 100644 --- a/modules/tga/image_loader_tga.h +++ b/modules/tga/image_loader_tga.h @@ -33,6 +33,8 @@ #include "core/io/image_loader.h" +#define TGA_IMAGE_DESCRIPTOR_ALPHA_MASK 0xf + class ImageLoaderTGA : public ImageFormatLoader { enum tga_type_e { TGA_TYPE_NO_DATA = 0, @@ -73,7 +75,7 @@ class ImageLoaderTGA : public ImageFormatLoader { static Error convert_to_image(Ref<Image> p_image, const uint8_t *p_buffer, const tga_header_s &p_header, const uint8_t *p_palette, const bool p_is_monochrome, size_t p_input_size); public: - virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> f, uint32_t p_flags, float p_scale); + virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> f, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale); virtual void get_recognized_extensions(List<String> *p_extensions) const; ImageLoaderTGA(); }; diff --git a/modules/tga/register_types.cpp b/modules/tga/register_types.cpp index 520ed5f799..3a9d2324e7 100644 --- a/modules/tga/register_types.cpp +++ b/modules/tga/register_types.cpp @@ -32,14 +32,14 @@ #include "image_loader_tga.h" -static ImageLoaderTGA *image_loader_tga = nullptr; +static Ref<ImageLoaderTGA> image_loader_tga; void initialize_tga_module(ModuleInitializationLevel p_level) { if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) { return; } - image_loader_tga = memnew(ImageLoaderTGA); + image_loader_tga.instantiate(); ImageLoader::add_image_format_loader(image_loader_tga); } @@ -48,5 +48,6 @@ void uninitialize_tga_module(ModuleInitializationLevel p_level) { return; } - memdelete(image_loader_tga); + ImageLoader::remove_image_format_loader(image_loader_tga); + image_loader_tga.unref(); } diff --git a/modules/theora/video_stream_theora.cpp b/modules/theora/video_stream_theora.cpp index c4462ba687..57f055ca42 100644 --- a/modules/theora/video_stream_theora.cpp +++ b/modules/theora/video_stream_theora.cpp @@ -91,8 +91,6 @@ void VideoStreamPlaybackTheora::video_write() { uint8_t *w = frame_data.ptrw(); char *dst = (char *)w; - //uv_offset=(ti.pic_x/2)+(yuv[1].stride)*(ti.pic_y/2); - if (px_fmt == TH_PF_444) { yuv444_2_rgb8888((uint8_t *)dst, (uint8_t *)yuv[0].data, (uint8_t *)yuv[1].data, (uint8_t *)yuv[2].data, size.x, size.y, yuv[0].stride, yuv[1].stride, size.x << 2); @@ -101,7 +99,7 @@ void VideoStreamPlaybackTheora::video_write() { } else if (px_fmt == TH_PF_420) { yuv420_2_rgb8888((uint8_t *)dst, (uint8_t *)yuv[0].data, (uint8_t *)yuv[1].data, (uint8_t *)yuv[2].data, size.x, size.y, yuv[0].stride, yuv[1].stride, size.x << 2); - }; + } format = Image::FORMAT_RGBA8; } @@ -123,7 +121,7 @@ void VideoStreamPlaybackTheora::clear() { if (vorbis_p >= 3) { vorbis_block_clear(&vb); vorbis_dsp_clear(&vd); - }; + } vorbis_comment_clear(&vc); vorbis_info_clear(&vi); vorbis_p = 0; @@ -154,7 +152,7 @@ void VideoStreamPlaybackTheora::clear() { file.unref(); playing = false; -}; +} void VideoStreamPlaybackTheora::set_file(const String &p_file) { ERR_FAIL_COND(playing); @@ -174,7 +172,6 @@ void VideoStreamPlaybackTheora::set_file(const String &p_file) { ring_buffer.write(read_buffer.ptr(), read); thread.start(_streaming_thread, this); - #endif ogg_sync_init(&oy); @@ -245,6 +242,12 @@ void VideoStreamPlaybackTheora::set_file(const String &p_file) { /* we're expecting more header packets. */ while ((theora_p && theora_p < 3) || (vorbis_p && vorbis_p < 3)) { +#ifdef _MSC_VER + // Make exception for these assignments in conditional expression. +#pragma warning(push) +#pragma warning(disable : 4706) +#endif + int ret; /* look for further theora headers */ @@ -281,6 +284,10 @@ void VideoStreamPlaybackTheora::set_file(const String &p_file) { } } +#ifdef _MSC_VER +#pragma warning(pop) +#endif + /* The header pages/packets will arrive before anything else we care about, or the stream is not obeying spec */ @@ -355,20 +362,20 @@ void VideoStreamPlaybackTheora::set_file(const String &p_file) { buffering = true; time = 0; audio_frames_wrote = 0; -}; +} -float VideoStreamPlaybackTheora::get_time() const { +double VideoStreamPlaybackTheora::get_time() const { // FIXME: AudioServer output latency was fixed in af9bb0e, previously it used to // systematically return 0. Now that it gives a proper latency, it broke this // code where the delay compensation likely never really worked. return time - /* AudioServer::get_singleton()->get_output_latency() - */ delay_compensation; -}; +} Ref<Texture2D> VideoStreamPlaybackTheora::get_texture() const { return texture; } -void VideoStreamPlaybackTheora::update(float p_delta) { +void VideoStreamPlaybackTheora::update(double p_delta) { if (file.is_null()) { return; } @@ -376,7 +383,7 @@ void VideoStreamPlaybackTheora::update(float p_delta) { if (!playing || paused) { //printf("not playing\n"); return; - }; + } #ifdef THEORA_USE_THREAD_STREAMING thread_sem->post(); @@ -444,7 +451,7 @@ void VideoStreamPlaybackTheora::update(float p_delta) { } } else { /* we need more data; break out to suck in another page */ break; - }; + } } audio_done = videobuf_time < (audio_frames_wrote / float(vi.rate)); @@ -507,7 +514,7 @@ void VideoStreamPlaybackTheora::update(float p_delta) { //printf("video done, stopping\n"); stop(); return; - }; + } if (!frame_done || !audio_done) { //what's the point of waiting for audio to grab a page? @@ -529,7 +536,7 @@ void VideoStreamPlaybackTheora::update(float p_delta) { //printf("frame at %f not ready (time %f), ready %i\n", (float)videobuf_time, get_time(), videobuf_ready); } - float tdiff = videobuf_time - get_time(); + double tdiff = videobuf_time - get_time(); /*If we have lots of extra time, increase the post-processing level.*/ if (tdiff > ti.fps_denominator * 0.25 / ti.fps_numerator) { pp_inc = pp_level < pp_level_max ? 1 : 0; @@ -539,7 +546,7 @@ void VideoStreamPlaybackTheora::update(float p_delta) { } video_write(); -}; +} void VideoStreamPlaybackTheora::play() { if (!playing) { @@ -551,7 +558,7 @@ void VideoStreamPlaybackTheora::play() { playing = true; delay_compensation = ProjectSettings::get_singleton()->get("audio/video/video_delay_compensation_ms"); delay_compensation /= 1000.0; -}; +} void VideoStreamPlaybackTheora::stop() { if (playing) { @@ -560,44 +567,44 @@ void VideoStreamPlaybackTheora::stop() { } playing = false; time = 0; -}; +} bool VideoStreamPlaybackTheora::is_playing() const { return playing; -}; +} void VideoStreamPlaybackTheora::set_paused(bool p_paused) { paused = p_paused; -}; +} bool VideoStreamPlaybackTheora::is_paused() const { return paused; -}; +} void VideoStreamPlaybackTheora::set_loop(bool p_enable) { } bool VideoStreamPlaybackTheora::has_loop() const { return false; -}; +} -float VideoStreamPlaybackTheora::get_length() const { +double VideoStreamPlaybackTheora::get_length() const { return 0; -}; +} String VideoStreamPlaybackTheora::get_stream_name() const { return ""; -}; +} int VideoStreamPlaybackTheora::get_loop_count() const { return 0; -}; +} -float VideoStreamPlaybackTheora::get_playback_position() const { +double VideoStreamPlaybackTheora::get_playback_position() const { return get_time(); -}; +} -void VideoStreamPlaybackTheora::seek(float p_time) { +void VideoStreamPlaybackTheora::seek(double p_time) { WARN_PRINT_ONCE("Seeking in Theora videos is not implemented yet (it's only supported for GDExtension-provided video streams)."); } @@ -650,15 +657,14 @@ VideoStreamPlaybackTheora::VideoStreamPlaybackTheora() { thread_sem = Semaphore::create(); #endif -}; +} VideoStreamPlaybackTheora::~VideoStreamPlaybackTheora() { #ifdef THEORA_USE_THREAD_STREAMING - memdelete(thread_sem); #endif clear(); -}; +} void VideoStreamTheora::_bind_methods() { ClassDB::bind_method(D_METHOD("set_file", "file"), &VideoStreamTheora::set_file); diff --git a/modules/theora/video_stream_theora.h b/modules/theora/video_stream_theora.h index 00d799dc24..3efb653651 100644 --- a/modules/theora/video_stream_theora.h +++ b/modules/theora/video_stream_theora.h @@ -64,7 +64,7 @@ class VideoStreamPlaybackTheora : public VideoStreamPlayback { int buffer_data(); int queue_page(ogg_page *page); void video_write(); - float get_time() const; + double get_time() const; bool theora_eos = false; bool vorbis_eos = false; @@ -136,19 +136,19 @@ public: virtual void set_loop(bool p_enable) override; virtual bool has_loop() const override; - virtual float get_length() const override; + virtual double get_length() const override; virtual String get_stream_name() const; virtual int get_loop_count() const; - virtual float get_playback_position() const override; - virtual void seek(float p_time) override; + virtual double get_playback_position() const override; + virtual void seek(double p_time) override; void set_file(const String &p_file); virtual Ref<Texture2D> get_texture() const override; - virtual void update(float p_delta) override; + virtual void update(double p_delta) override; virtual void set_mix_callback(AudioMixCallback p_callback, void *p_userdata) override; virtual int get_channels() const override; diff --git a/modules/tinyexr/config.py b/modules/tinyexr/config.py index 53b8f2f2e3..eb565b85b9 100644 --- a/modules/tinyexr/config.py +++ b/modules/tinyexr/config.py @@ -1,5 +1,5 @@ def can_build(env, platform): - return env["tools"] + return env.editor_build def configure(env): diff --git a/modules/tinyexr/image_loader_tinyexr.cpp b/modules/tinyexr/image_loader_tinyexr.cpp index 6f61251f9b..5c43bfc8b7 100644 --- a/modules/tinyexr/image_loader_tinyexr.cpp +++ b/modules/tinyexr/image_loader_tinyexr.cpp @@ -37,7 +37,7 @@ #include "thirdparty/tinyexr/tinyexr.h" -Error ImageLoaderTinyEXR::load_image(Ref<Image> p_image, Ref<FileAccess> f, uint32_t p_flags, float p_scale) { +Error ImageLoaderTinyEXR::load_image(Ref<Image> p_image, Ref<FileAccess> f, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale) { Vector<uint8_t> src_image; uint64_t src_image_len = f->get_length(); ERR_FAIL_COND_V(src_image_len == 0, ERR_FILE_CORRUPT); diff --git a/modules/tinyexr/image_loader_tinyexr.h b/modules/tinyexr/image_loader_tinyexr.h index 8da2a0d4af..ab34a59da5 100644 --- a/modules/tinyexr/image_loader_tinyexr.h +++ b/modules/tinyexr/image_loader_tinyexr.h @@ -35,7 +35,7 @@ class ImageLoaderTinyEXR : public ImageFormatLoader { public: - virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> f, uint32_t p_flags, float p_scale); + virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> f, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale); virtual void get_recognized_extensions(List<String> *p_extensions) const; ImageLoaderTinyEXR(); }; diff --git a/modules/tinyexr/register_types.cpp b/modules/tinyexr/register_types.cpp index c5897f37c3..b1a9f18e3b 100644 --- a/modules/tinyexr/register_types.cpp +++ b/modules/tinyexr/register_types.cpp @@ -33,14 +33,14 @@ #include "image_loader_tinyexr.h" #include "image_saver_tinyexr.h" -static ImageLoaderTinyEXR *image_loader_tinyexr = nullptr; +static Ref<ImageLoaderTinyEXR> image_loader_tinyexr; void initialize_tinyexr_module(ModuleInitializationLevel p_level) { if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) { return; } - image_loader_tinyexr = memnew(ImageLoaderTinyEXR); + image_loader_tinyexr.instantiate(); ImageLoader::add_image_format_loader(image_loader_tinyexr); Image::save_exr_func = save_exr; @@ -52,7 +52,8 @@ void uninitialize_tinyexr_module(ModuleInitializationLevel p_level) { return; } - memdelete(image_loader_tinyexr); + ImageLoader::remove_image_format_loader(image_loader_tinyexr); + image_loader_tinyexr.unref(); Image::save_exr_func = nullptr; } diff --git a/modules/vorbis/audio_stream_ogg_vorbis.cpp b/modules/vorbis/audio_stream_ogg_vorbis.cpp index 8315eea614..792103cd31 100644 --- a/modules/vorbis/audio_stream_ogg_vorbis.cpp +++ b/modules/vorbis/audio_stream_ogg_vorbis.cpp @@ -74,7 +74,7 @@ int AudioStreamPlaybackOggVorbis::_mix_internal(AudioFrame *p_buffer, int p_fram if (beat_length_frames >= 0) { /** * Length determined by beat length - * This code is commented out because, in practice, it is prefered that the fade + * This code is commented out because, in practice, it is preferred that the fade * is done by the transitioner and this stream just goes on until it ends while fading out. * * End fade implementation is left here for reference in case at some point this feature @@ -153,8 +153,11 @@ int AudioStreamPlaybackOggVorbis::_mix_frames_vorbis(AudioFrame *p_buffer, int p return -1; } - ERR_FAIL_COND_V_MSG((err = vorbis_synthesis(&block, packet)), 0, "Error during vorbis synthesis " + itos(err)); - ERR_FAIL_COND_V_MSG((err = vorbis_synthesis_blockin(&dsp_state, &block)), 0, "Error during vorbis block processing " + itos(err)); + err = vorbis_synthesis(&block, packet); + ERR_FAIL_COND_V_MSG(err != 0, 0, "Error during vorbis synthesis " + itos(err)); + + err = vorbis_synthesis_blockin(&dsp_state, &block); + ERR_FAIL_COND_V_MSG(err != 0, 0, "Error during vorbis block processing " + itos(err)); have_packets_left = !packet->e_o_s; } @@ -223,7 +226,7 @@ bool AudioStreamPlaybackOggVorbis::_alloc_vorbis() { return true; } -void AudioStreamPlaybackOggVorbis::start(float p_from_pos) { +void AudioStreamPlaybackOggVorbis::start(double p_from_pos) { ERR_FAIL_COND(!ready); loop_fade_remaining = FADE_SIZE; active = true; @@ -244,15 +247,15 @@ int AudioStreamPlaybackOggVorbis::get_loop_count() const { return loops; } -float AudioStreamPlaybackOggVorbis::get_playback_position() const { - return float(frames_mixed) / vorbis_data->get_sampling_rate(); +double AudioStreamPlaybackOggVorbis::get_playback_position() const { + return double(frames_mixed) / (double)vorbis_data->get_sampling_rate(); } void AudioStreamPlaybackOggVorbis::tag_used_streams() { vorbis_stream->tag_used(get_playback_position()); } -void AudioStreamPlaybackOggVorbis::seek(float p_time) { +void AudioStreamPlaybackOggVorbis::seek(double p_time) { ERR_FAIL_COND(!ready); ERR_FAIL_COND(vorbis_stream.is_null()); if (!active) { @@ -290,11 +293,15 @@ void AudioStreamPlaybackOggVorbis::seek(float p_time) { headers_remaining = 3; } if (!headers_remaining) { - ERR_FAIL_COND_MSG((err = vorbis_synthesis(&block, packet)), "Error during vorbis synthesis " + itos(err)); - ERR_FAIL_COND_MSG((err = vorbis_synthesis_blockin(&dsp_state, &block)), "Error during vorbis block processing " + itos(err)); + err = vorbis_synthesis(&block, packet); + ERR_FAIL_COND_MSG(err != 0, "Error during vorbis synthesis " + itos(err)); + + err = vorbis_synthesis_blockin(&dsp_state, &block); + ERR_FAIL_COND_MSG(err != 0, "Error during vorbis block processing " + itos(err)); int samples_out = vorbis_synthesis_pcmout(&dsp_state, nullptr); - ERR_FAIL_COND_MSG((err = vorbis_synthesis_read(&dsp_state, samples_out)), "Error during vorbis read updating " + itos(err)); + err = vorbis_synthesis_read(&dsp_state, samples_out); + ERR_FAIL_COND_MSG(err != 0, "Error during vorbis read updating " + itos(err)); samples_in_page += samples_out; @@ -341,12 +348,16 @@ void AudioStreamPlaybackOggVorbis::seek(float p_time) { headers_remaining = 3; } if (!headers_remaining) { - ERR_FAIL_COND_MSG((err = vorbis_synthesis(&block, packet)), "Error during vorbis synthesis " + itos(err)); - ERR_FAIL_COND_MSG((err = vorbis_synthesis_blockin(&dsp_state, &block)), "Error during vorbis block processing " + itos(err)); + err = vorbis_synthesis(&block, packet); + ERR_FAIL_COND_MSG(err != 0, "Error during vorbis synthesis " + itos(err)); + + err = vorbis_synthesis_blockin(&dsp_state, &block); + ERR_FAIL_COND_MSG(err != 0, "Error during vorbis block processing " + itos(err)); int samples_out = vorbis_synthesis_pcmout(&dsp_state, nullptr); int read_samples = samples_to_burn > samples_out ? samples_out : samples_to_burn; - ERR_FAIL_COND_MSG((err = vorbis_synthesis_read(&dsp_state, samples_out)), "Error during vorbis read updating " + itos(err)); + err = vorbis_synthesis_read(&dsp_state, samples_out); + ERR_FAIL_COND_MSG(err != 0, "Error during vorbis read updating " + itos(err)); samples_to_burn -= read_samples; if (samples_to_burn <= 0) { @@ -462,15 +473,15 @@ bool AudioStreamOggVorbis::has_loop() const { return loop; } -void AudioStreamOggVorbis::set_loop_offset(float p_seconds) { +void AudioStreamOggVorbis::set_loop_offset(double p_seconds) { loop_offset = p_seconds; } -float AudioStreamOggVorbis::get_loop_offset() const { +double AudioStreamOggVorbis::get_loop_offset() const { return loop_offset; } -float AudioStreamOggVorbis::get_length() const { +double AudioStreamOggVorbis::get_length() const { ERR_FAIL_COND_V(packet_sequence.is_null(), 0); return packet_sequence->get_length(); } diff --git a/modules/vorbis/audio_stream_ogg_vorbis.h b/modules/vorbis/audio_stream_ogg_vorbis.h index 0350e1f761..3aa99971be 100644 --- a/modules/vorbis/audio_stream_ogg_vorbis.h +++ b/modules/vorbis/audio_stream_ogg_vorbis.h @@ -83,14 +83,14 @@ protected: virtual float get_stream_sampling_rate() override; public: - virtual void start(float p_from_pos = 0.0) override; + virtual void start(double p_from_pos = 0.0) override; virtual void stop() override; virtual bool is_playing() const override; virtual int get_loop_count() const override; //times it looped - virtual float get_playback_position() const override; - virtual void seek(float p_time) override; + virtual double get_playback_position() const override; + virtual void seek(double p_time) override; virtual void tag_used_streams() override; @@ -127,8 +127,8 @@ public: void set_loop(bool p_enable); virtual bool has_loop() const override; - void set_loop_offset(float p_seconds); - float get_loop_offset() const; + void set_loop_offset(double p_seconds); + double get_loop_offset() const; void set_bpm(double p_bpm); virtual double get_bpm() const override; @@ -145,7 +145,7 @@ public: void set_packet_sequence(Ref<OggPacketSequence> p_packet_sequence); Ref<OggPacketSequence> get_packet_sequence() const; - virtual float get_length() const override; //if supported, otherwise return 0 + virtual double get_length() const override; //if supported, otherwise return 0 virtual bool is_monophonic() const override; diff --git a/modules/vorbis/resource_importer_ogg_vorbis.cpp b/modules/vorbis/resource_importer_ogg_vorbis.cpp index bf5f7206b8..a491c3d3fb 100644 --- a/modules/vorbis/resource_importer_ogg_vorbis.cpp +++ b/modules/vorbis/resource_importer_ogg_vorbis.cpp @@ -110,15 +110,18 @@ Ref<AudioStreamOggVorbis> ResourceImporterOggVorbis::import_ogg_vorbis(const Str size_t packet_count = 0; bool done = false; while (!done) { - ERR_FAIL_COND_V_MSG((err = ogg_sync_check(&sync_state)), Ref<AudioStreamOggVorbis>(), "Ogg sync error " + itos(err)); + err = ogg_sync_check(&sync_state); + ERR_FAIL_COND_V_MSG(err != 0, Ref<AudioStreamOggVorbis>(), "Ogg sync error " + itos(err)); while (ogg_sync_pageout(&sync_state, &page) != 1) { if (cursor >= len) { done = true; break; } - ERR_FAIL_COND_V_MSG((err = ogg_sync_check(&sync_state)), Ref<AudioStreamOggVorbis>(), "Ogg sync error " + itos(err)); + err = ogg_sync_check(&sync_state); + ERR_FAIL_COND_V_MSG(err != 0, Ref<AudioStreamOggVorbis>(), "Ogg sync error " + itos(err)); char *sync_buf = ogg_sync_buffer(&sync_state, OGG_SYNC_BUFFER_SIZE); - ERR_FAIL_COND_V_MSG((err = ogg_sync_check(&sync_state)), Ref<AudioStreamOggVorbis>(), "Ogg sync error " + itos(err)); + err = ogg_sync_check(&sync_state); + ERR_FAIL_COND_V_MSG(err != 0, Ref<AudioStreamOggVorbis>(), "Ogg sync error " + itos(err)); ERR_FAIL_COND_V(cursor > len, Ref<AudioStreamOggVorbis>()); size_t copy_size = len - cursor; if (copy_size > OGG_SYNC_BUFFER_SIZE) { @@ -127,12 +130,14 @@ Ref<AudioStreamOggVorbis> ResourceImporterOggVorbis::import_ogg_vorbis(const Str memcpy(sync_buf, &file_data[cursor], copy_size); ogg_sync_wrote(&sync_state, copy_size); cursor += copy_size; - ERR_FAIL_COND_V_MSG((err = ogg_sync_check(&sync_state)), Ref<AudioStreamOggVorbis>(), "Ogg sync error " + itos(err)); + err = ogg_sync_check(&sync_state); + ERR_FAIL_COND_V_MSG(err != 0, Ref<AudioStreamOggVorbis>(), "Ogg sync error " + itos(err)); } if (done) { break; } - ERR_FAIL_COND_V_MSG((err = ogg_sync_check(&sync_state)), Ref<AudioStreamOggVorbis>(), "Ogg sync error " + itos(err)); + err = ogg_sync_check(&sync_state); + ERR_FAIL_COND_V_MSG(err != 0, Ref<AudioStreamOggVorbis>(), "Ogg sync error " + itos(err)); // Have a page now. if (!initialized_stream) { @@ -142,7 +147,8 @@ Ref<AudioStreamOggVorbis> ResourceImporterOggVorbis::import_ogg_vorbis(const Str initialized_stream = true; } ogg_stream_pagein(&stream_state, &page); - ERR_FAIL_COND_V_MSG((err = ogg_stream_check(&stream_state)), Ref<AudioStreamOggVorbis>(), "Ogg stream error " + itos(err)); + err = ogg_stream_check(&stream_state); + ERR_FAIL_COND_V_MSG(err != 0, Ref<AudioStreamOggVorbis>(), "Ogg stream error " + itos(err)); int desync_iters = 0; Vector<Vector<uint8_t>> packet_data; diff --git a/modules/webp/image_loader_webp.cpp b/modules/webp/image_loader_webp.cpp index 705ab508ab..dd387db554 100644 --- a/modules/webp/image_loader_webp.cpp +++ b/modules/webp/image_loader_webp.cpp @@ -48,7 +48,7 @@ static Ref<Image> _webp_mem_loader_func(const uint8_t *p_png, int p_size) { return img; } -Error ImageLoaderWebP::load_image(Ref<Image> p_image, Ref<FileAccess> f, uint32_t p_flags, float p_scale) { +Error ImageLoaderWebP::load_image(Ref<Image> p_image, Ref<FileAccess> f, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale) { Vector<uint8_t> src_image; uint64_t src_image_len = f->get_length(); ERR_FAIL_COND_V(src_image_len == 0, ERR_FILE_CORRUPT); diff --git a/modules/webp/image_loader_webp.h b/modules/webp/image_loader_webp.h index d868ae3f7f..0522e4ef91 100644 --- a/modules/webp/image_loader_webp.h +++ b/modules/webp/image_loader_webp.h @@ -35,7 +35,7 @@ class ImageLoaderWebP : public ImageFormatLoader { public: - virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> f, uint32_t p_flags, float p_scale); + virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> f, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale); virtual void get_recognized_extensions(List<String> *p_extensions) const; ImageLoaderWebP(); }; diff --git a/modules/webp/register_types.cpp b/modules/webp/register_types.cpp index 29f633743e..e523f43cfe 100644 --- a/modules/webp/register_types.cpp +++ b/modules/webp/register_types.cpp @@ -33,7 +33,7 @@ #include "image_loader_webp.h" #include "resource_saver_webp.h" -static ImageLoaderWebP *image_loader_webp = nullptr; +static Ref<ImageLoaderWebP> image_loader_webp; static Ref<ResourceSaverWebP> resource_saver_webp; void initialize_webp_module(ModuleInitializationLevel p_level) { @@ -41,9 +41,10 @@ void initialize_webp_module(ModuleInitializationLevel p_level) { return; } - image_loader_webp = memnew(ImageLoaderWebP); - resource_saver_webp.instantiate(); + image_loader_webp.instantiate(); ImageLoader::add_image_format_loader(image_loader_webp); + + resource_saver_webp.instantiate(); ResourceSaver::add_resource_format_saver(resource_saver_webp); } @@ -52,7 +53,9 @@ void uninitialize_webp_module(ModuleInitializationLevel p_level) { return; } - memdelete(image_loader_webp); + ImageLoader::remove_image_format_loader(image_loader_webp); + image_loader_webp.unref(); + ResourceSaver::remove_resource_format_saver(resource_saver_webp); resource_saver_webp.unref(); } diff --git a/modules/webrtc/doc_classes/WebRTCPeerConnection.xml b/modules/webrtc/doc_classes/WebRTCPeerConnection.xml index e99aeb4f51..4ecc71ddbb 100644 --- a/modules/webrtc/doc_classes/WebRTCPeerConnection.xml +++ b/modules/webrtc/doc_classes/WebRTCPeerConnection.xml @@ -67,6 +67,18 @@ Returns the connection state. See [enum ConnectionState]. </description> </method> + <method name="get_gathering_state" qualifiers="const"> + <return type="int" enum="WebRTCPeerConnection.GatheringState" /> + <description> + Returns the ICE [enum GatheringState] of the connection. This lets you detect, for example, when collection of ICE candidates has finished. + </description> + </method> + <method name="get_signaling_state" qualifiers="const"> + <return type="int" enum="WebRTCPeerConnection.SignalingState" /> + <description> + Returns the [enum SignalingState] on the local end of the connection while connecting or reconnecting to another peer. + </description> + </method> <method name="initialize"> <return type="int" enum="Error" /> <param index="0" name="configuration" type="Dictionary" default="{}" /> @@ -165,5 +177,32 @@ <constant name="STATE_CLOSED" value="5" enum="ConnectionState"> The peer connection is closed (after calling [method close] for example). </constant> + <constant name="GATHERING_STATE_NEW" value="0" enum="GatheringState"> + The peer connection was just created and hasn't done any networking yet. + </constant> + <constant name="GATHERING_STATE_GATHERING" value="1" enum="GatheringState"> + The ICE agent is in the process of gathering candidates for the connection. + </constant> + <constant name="GATHERING_STATE_COMPLETE" value="2" enum="GatheringState"> + The ICE agent has finished gathering candidates. If something happens that requires collecting new candidates, such as a new interface being added or the addition of a new ICE server, the state will revert to gathering to gather those candidates. + </constant> + <constant name="SIGNALING_STATE_STABLE" value="0" enum="SignalingState"> + There is no ongoing exchange of offer and answer underway. This may mean that the [WebRTCPeerConnection] is new ([constant STATE_NEW]) or that negotiation is complete and a connection has been established ([constant STATE_CONNECTED]). + </constant> + <constant name="SIGNALING_STATE_HAVE_LOCAL_OFFER" value="1" enum="SignalingState"> + The local peer has called [method set_local_description], passing in SDP representing an offer (usually created by calling [method create_offer]), and the offer has been applied successfully. + </constant> + <constant name="SIGNALING_STATE_HAVE_REMOTE_OFFER" value="2" enum="SignalingState"> + The remote peer has created an offer and used the signaling server to deliver it to the local peer, which has set the offer as the remote description by calling [method set_remote_description]. + </constant> + <constant name="SIGNALING_STATE_HAVE_LOCAL_PRANSWER" value="3" enum="SignalingState"> + The offer sent by the remote peer has been applied and an answer has been created and applied by calling [method set_local_description]. This provisional answer describes the supported media formats and so forth, but may not have a complete set of ICE candidates included. Further candidates will be delivered separately later. + </constant> + <constant name="SIGNALING_STATE_HAVE_REMOTE_PRANSWER" value="4" enum="SignalingState"> + A provisional answer has been received and successfully applied in response to an offer previously sent and established by calling [method set_local_description]. + </constant> + <constant name="SIGNALING_STATE_CLOSED" value="5" enum="SignalingState"> + The [WebRTCPeerConnection] has been closed. + </constant> </constants> </class> diff --git a/modules/webrtc/doc_classes/WebRTCPeerConnectionExtension.xml b/modules/webrtc/doc_classes/WebRTCPeerConnectionExtension.xml index 3c4bf18a76..474d2f6a89 100644 --- a/modules/webrtc/doc_classes/WebRTCPeerConnectionExtension.xml +++ b/modules/webrtc/doc_classes/WebRTCPeerConnectionExtension.xml @@ -37,6 +37,16 @@ <description> </description> </method> + <method name="_get_gathering_state" qualifiers="virtual const"> + <return type="int" enum="WebRTCPeerConnection.GatheringState" /> + <description> + </description> + </method> + <method name="_get_signaling_state" qualifiers="virtual const"> + <return type="int" enum="WebRTCPeerConnection.SignalingState" /> + <description> + </description> + </method> <method name="_initialize" qualifiers="virtual"> <return type="int" enum="Error" /> <param index="0" name="p_config" type="Dictionary" /> diff --git a/modules/webrtc/library_godot_webrtc.js b/modules/webrtc/library_godot_webrtc.js index e57e4299e0..e6604eecd7 100644 --- a/modules/webrtc/library_godot_webrtc.js +++ b/modules/webrtc/library_godot_webrtc.js @@ -220,64 +220,123 @@ mergeInto(LibraryManager.library, GodotRTCDataChannel); const GodotRTCPeerConnection = { $GodotRTCPeerConnection__deps: ['$IDHandler', '$GodotRuntime', '$GodotRTCDataChannel'], $GodotRTCPeerConnection: { - onstatechange: function (p_id, p_conn, callback, event) { - const ref = IDHandler.get(p_id); - if (!ref) { - return; - } - let state; - switch (p_conn.iceConnectionState) { - case 'new': - state = 0; - break; - case 'checking': - state = 1; - break; - case 'connected': - case 'completed': - state = 2; - break; - case 'disconnected': - state = 3; - break; - case 'failed': - state = 4; - break; - case 'closed': - default: - state = 5; - break; - } - callback(state); + // Enums + ConnectionState: { + 'new': 0, + 'connecting': 1, + 'connected': 2, + 'disconnected': 3, + 'failed': 4, + 'closed': 5, }, - onicecandidate: function (p_id, callback, event) { - const ref = IDHandler.get(p_id); - if (!ref || !event.candidate) { - return; + ConnectionStateCompat: { + // Using values from IceConnectionState for browsers that do not support ConnectionState (notably Firefox). + 'new': 0, + 'checking': 1, + 'connected': 2, + 'completed': 2, + 'disconnected': 3, + 'failed': 4, + 'closed': 5, + }, + + IceGatheringState: { + 'new': 0, + 'gathering': 1, + 'complete': 2, + }, + + SignalingState: { + 'stable': 0, + 'have-local-offer': 1, + 'have-remote-offer': 2, + 'have-local-pranswer': 3, + 'have-remote-pranswer': 4, + 'closed': 5, + }, + + // Callbacks + create: function (config, onConnectionChange, onSignalingChange, onIceGatheringChange, onIceCandidate, onDataChannel) { + let conn = null; + try { + conn = new RTCPeerConnection(config); + } catch (e) { + GodotRuntime.error(e); + return 0; } - const c = event.candidate; - const candidate_str = GodotRuntime.allocString(c.candidate); - const mid_str = GodotRuntime.allocString(c.sdpMid); - callback(mid_str, c.sdpMLineIndex, candidate_str); - GodotRuntime.free(candidate_str); - GodotRuntime.free(mid_str); + const id = IDHandler.add(conn); + + if ('connectionState' in conn && conn['connectionState'] !== undefined) { + // Use "connectionState" if supported + conn.onconnectionstatechange = function (event) { + if (!IDHandler.get(id)) { + return; + } + onConnectionChange(GodotRTCPeerConnection.ConnectionState[conn.connectionState] || 0); + }; + } else { + // Fall back to using "iceConnectionState" when "connectionState" is not supported (notably Firefox). + conn.oniceconnectionstatechange = function (event) { + if (!IDHandler.get(id)) { + return; + } + onConnectionChange(GodotRTCPeerConnection.ConnectionStateCompat[conn.iceConnectionState] || 0); + }; + } + conn.onicegatheringstatechange = function (event) { + if (!IDHandler.get(id)) { + return; + } + onIceGatheringChange(GodotRTCPeerConnection.IceGatheringState[conn.iceGatheringState] || 0); + }; + conn.onsignalingstatechange = function (event) { + if (!IDHandler.get(id)) { + return; + } + onSignalingChange(GodotRTCPeerConnection.SignalingState[conn.signalingState] || 0); + }; + conn.onicecandidate = function (event) { + if (!IDHandler.get(id)) { + return; + } + const c = event.candidate; + if (!c || !c.candidate) { + return; + } + const candidate_str = GodotRuntime.allocString(c.candidate); + const mid_str = GodotRuntime.allocString(c.sdpMid); + onIceCandidate(mid_str, c.sdpMLineIndex, candidate_str); + GodotRuntime.free(candidate_str); + GodotRuntime.free(mid_str); + }; + conn.ondatachannel = function (event) { + if (!IDHandler.get(id)) { + return; + } + const cid = IDHandler.add(event.channel); + onDataChannel(cid); + }; + return id; }, - ondatachannel: function (p_id, callback, event) { - const ref = IDHandler.get(p_id); - if (!ref) { + destroy: function (p_id) { + const conn = IDHandler.get(p_id); + if (!conn) { return; } - - const cid = IDHandler.add(event.channel); - callback(cid); + conn.onconnectionstatechange = null; + conn.oniceconnectionstatechange = null; + conn.onicegatheringstatechange = null; + conn.onsignalingstatechange = null; + conn.onicecandidate = null; + conn.ondatachannel = null; + IDHandler.remove(p_id); }, onsession: function (p_id, callback, session) { - const ref = IDHandler.get(p_id); - if (!ref) { + if (!IDHandler.get(p_id)) { return; } const type_str = GodotRuntime.allocString(session.type); @@ -297,27 +356,19 @@ const GodotRTCPeerConnection = { }, }, - godot_js_rtc_pc_create__sig: 'iiiiii', - godot_js_rtc_pc_create: function (p_config, p_ref, p_on_state_change, p_on_candidate, p_on_datachannel) { - const onstatechange = GodotRuntime.get_func(p_on_state_change).bind(null, p_ref); - const oncandidate = GodotRuntime.get_func(p_on_candidate).bind(null, p_ref); - const ondatachannel = GodotRuntime.get_func(p_on_datachannel).bind(null, p_ref); - - const config = JSON.parse(GodotRuntime.parseString(p_config)); - let conn = null; - try { - conn = new RTCPeerConnection(config); - } catch (e) { - GodotRuntime.error(e); - return 0; - } - - const base = GodotRTCPeerConnection; - const id = IDHandler.add(conn); - conn.oniceconnectionstatechange = base.onstatechange.bind(null, id, conn, onstatechange); - conn.onicecandidate = base.onicecandidate.bind(null, id, oncandidate); - conn.ondatachannel = base.ondatachannel.bind(null, id, ondatachannel); - return id; + godot_js_rtc_pc_create__sig: 'iiiiiiii', + godot_js_rtc_pc_create: function (p_config, p_ref, p_on_connection_state_change, p_on_ice_gathering_state_change, p_on_signaling_state_change, p_on_ice_candidate, p_on_datachannel) { + const wrap = function (p_func) { + return GodotRuntime.get_func(p_func).bind(null, p_ref); + }; + return GodotRTCPeerConnection.create( + JSON.parse(GodotRuntime.parseString(p_config)), + wrap(p_on_connection_state_change), + wrap(p_on_signaling_state_change), + wrap(p_on_ice_gathering_state_change), + wrap(p_on_ice_candidate), + wrap(p_on_datachannel) + ); }, godot_js_rtc_pc_close__sig: 'vi', @@ -331,14 +382,7 @@ const GodotRTCPeerConnection = { godot_js_rtc_pc_destroy__sig: 'vi', godot_js_rtc_pc_destroy: function (p_id) { - const ref = IDHandler.get(p_id); - if (!ref) { - return; - } - ref.oniceconnectionstatechange = null; - ref.onicecandidate = null; - ref.ondatachannel = null; - IDHandler.remove(p_id); + GodotRTCPeerConnection.destroy(p_id); }, godot_js_rtc_pc_offer_create__sig: 'viiii', diff --git a/modules/webrtc/webrtc_peer_connection.cpp b/modules/webrtc/webrtc_peer_connection.cpp index d885b9262b..5aa891d35c 100644 --- a/modules/webrtc/webrtc_peer_connection.cpp +++ b/modules/webrtc/webrtc_peer_connection.cpp @@ -69,6 +69,8 @@ void WebRTCPeerConnection::_bind_methods() { ClassDB::bind_method(D_METHOD("close"), &WebRTCPeerConnection::close); ClassDB::bind_method(D_METHOD("get_connection_state"), &WebRTCPeerConnection::get_connection_state); + ClassDB::bind_method(D_METHOD("get_gathering_state"), &WebRTCPeerConnection::get_gathering_state); + ClassDB::bind_method(D_METHOD("get_signaling_state"), &WebRTCPeerConnection::get_signaling_state); ADD_SIGNAL(MethodInfo("session_description_created", PropertyInfo(Variant::STRING, "type"), PropertyInfo(Variant::STRING, "sdp"))); ADD_SIGNAL(MethodInfo("ice_candidate_created", PropertyInfo(Variant::STRING, "media"), PropertyInfo(Variant::INT, "index"), PropertyInfo(Variant::STRING, "name"))); @@ -80,6 +82,17 @@ void WebRTCPeerConnection::_bind_methods() { BIND_ENUM_CONSTANT(STATE_DISCONNECTED); BIND_ENUM_CONSTANT(STATE_FAILED); BIND_ENUM_CONSTANT(STATE_CLOSED); + + BIND_ENUM_CONSTANT(GATHERING_STATE_NEW); + BIND_ENUM_CONSTANT(GATHERING_STATE_GATHERING); + BIND_ENUM_CONSTANT(GATHERING_STATE_COMPLETE); + + BIND_ENUM_CONSTANT(SIGNALING_STATE_STABLE); + BIND_ENUM_CONSTANT(SIGNALING_STATE_HAVE_LOCAL_OFFER); + BIND_ENUM_CONSTANT(SIGNALING_STATE_HAVE_REMOTE_OFFER); + BIND_ENUM_CONSTANT(SIGNALING_STATE_HAVE_LOCAL_PRANSWER); + BIND_ENUM_CONSTANT(SIGNALING_STATE_HAVE_REMOTE_PRANSWER); + BIND_ENUM_CONSTANT(SIGNALING_STATE_CLOSED); } WebRTCPeerConnection::WebRTCPeerConnection() { diff --git a/modules/webrtc/webrtc_peer_connection.h b/modules/webrtc/webrtc_peer_connection.h index 122ea3d00f..76f29f9d68 100644 --- a/modules/webrtc/webrtc_peer_connection.h +++ b/modules/webrtc/webrtc_peer_connection.h @@ -47,6 +47,21 @@ public: STATE_CLOSED }; + enum GatheringState { + GATHERING_STATE_NEW, + GATHERING_STATE_GATHERING, + GATHERING_STATE_COMPLETE, + }; + + enum SignalingState { + SIGNALING_STATE_STABLE, + SIGNALING_STATE_HAVE_LOCAL_OFFER, + SIGNALING_STATE_HAVE_REMOTE_OFFER, + SIGNALING_STATE_HAVE_LOCAL_PRANSWER, + SIGNALING_STATE_HAVE_REMOTE_PRANSWER, + SIGNALING_STATE_CLOSED, + }; + private: static StringName default_extension; @@ -57,6 +72,8 @@ public: static void set_default_extension(const StringName &p_name); virtual ConnectionState get_connection_state() const = 0; + virtual GatheringState get_gathering_state() const = 0; + virtual SignalingState get_signaling_state() const = 0; virtual Error initialize(Dictionary p_config = Dictionary()) = 0; virtual Ref<WebRTCDataChannel> create_data_channel(String p_label, Dictionary p_options = Dictionary()) = 0; @@ -74,5 +91,7 @@ public: }; VARIANT_ENUM_CAST(WebRTCPeerConnection::ConnectionState); +VARIANT_ENUM_CAST(WebRTCPeerConnection::GatheringState); +VARIANT_ENUM_CAST(WebRTCPeerConnection::SignalingState); #endif // WEBRTC_PEER_CONNECTION_H diff --git a/modules/webrtc/webrtc_peer_connection_extension.cpp b/modules/webrtc/webrtc_peer_connection_extension.cpp index 54143e4b79..592a1f8a97 100644 --- a/modules/webrtc/webrtc_peer_connection_extension.cpp +++ b/modules/webrtc/webrtc_peer_connection_extension.cpp @@ -32,6 +32,8 @@ void WebRTCPeerConnectionExtension::_bind_methods() { GDVIRTUAL_BIND(_get_connection_state); + GDVIRTUAL_BIND(_get_gathering_state); + GDVIRTUAL_BIND(_get_signaling_state); GDVIRTUAL_BIND(_initialize, "p_config"); GDVIRTUAL_BIND(_create_data_channel, "p_label", "p_config"); GDVIRTUAL_BIND(_create_offer); diff --git a/modules/webrtc/webrtc_peer_connection_extension.h b/modules/webrtc/webrtc_peer_connection_extension.h index 0c324ca45f..085069debb 100644 --- a/modules/webrtc/webrtc_peer_connection_extension.h +++ b/modules/webrtc/webrtc_peer_connection_extension.h @@ -53,6 +53,8 @@ public: /** GDExtension **/ EXBIND0RC(ConnectionState, get_connection_state); + EXBIND0RC(GatheringState, get_gathering_state); + EXBIND0RC(SignalingState, get_signaling_state); EXBIND1R(Error, initialize, Dictionary); EXBIND0R(Error, create_offer); EXBIND2R(Error, set_remote_description, String, String); diff --git a/modules/webrtc/webrtc_peer_connection_js.cpp b/modules/webrtc/webrtc_peer_connection_js.cpp index f48705253b..a371312ae9 100644 --- a/modules/webrtc/webrtc_peer_connection_js.cpp +++ b/modules/webrtc/webrtc_peer_connection_js.cpp @@ -51,6 +51,16 @@ void WebRTCPeerConnectionJS::_on_connection_state_changed(void *p_obj, int p_sta peer->_conn_state = (ConnectionState)p_state; } +void WebRTCPeerConnectionJS::_on_gathering_state_changed(void *p_obj, int p_state) { + WebRTCPeerConnectionJS *peer = static_cast<WebRTCPeerConnectionJS *>(p_obj); + peer->_gathering_state = (GatheringState)p_state; +} + +void WebRTCPeerConnectionJS::_on_signaling_state_changed(void *p_obj, int p_state) { + WebRTCPeerConnectionJS *peer = static_cast<WebRTCPeerConnectionJS *>(p_obj); + peer->_signaling_state = (SignalingState)p_state; +} + void WebRTCPeerConnectionJS::_on_error(void *p_obj) { ERR_PRINT("RTCPeerConnection error!"); } @@ -100,7 +110,7 @@ Error WebRTCPeerConnectionJS::initialize(Dictionary p_config) { _conn_state = STATE_NEW; String config = Variant(p_config).to_json_string(); - _js_id = godot_js_rtc_pc_create(config.utf8().get_data(), this, &_on_connection_state_changed, &_on_ice_candidate, &_on_data_channel); + _js_id = godot_js_rtc_pc_create(config.utf8().get_data(), this, &_on_connection_state_changed, &_on_gathering_state_changed, &_on_signaling_state_changed, &_on_ice_candidate, &_on_data_channel); return _js_id ? OK : FAILED; } @@ -117,14 +127,19 @@ Error WebRTCPeerConnectionJS::poll() { return OK; } +WebRTCPeerConnection::GatheringState WebRTCPeerConnectionJS::get_gathering_state() const { + return _gathering_state; +} + +WebRTCPeerConnection::SignalingState WebRTCPeerConnectionJS::get_signaling_state() const { + return _signaling_state; +} + WebRTCPeerConnection::ConnectionState WebRTCPeerConnectionJS::get_connection_state() const { return _conn_state; } WebRTCPeerConnectionJS::WebRTCPeerConnectionJS() { - _conn_state = STATE_NEW; - _js_id = 0; - Dictionary config; initialize(config); } diff --git a/modules/webrtc/webrtc_peer_connection_js.h b/modules/webrtc/webrtc_peer_connection_js.h index 50266129e4..e62ad6af28 100644 --- a/modules/webrtc/webrtc_peer_connection_js.h +++ b/modules/webrtc/webrtc_peer_connection_js.h @@ -37,11 +37,13 @@ extern "C" { typedef void (*RTCOnIceConnectionStateChange)(void *p_obj, int p_state); +typedef void (*RTCOnIceGatheringStateChange)(void *p_obj, int p_state); +typedef void (*RTCOnSignalingStateChange)(void *p_obj, int p_state); typedef void (*RTCOnIceCandidate)(void *p_obj, const char *p_mid, int p_mline_idx, const char *p_candidate); typedef void (*RTCOnDataChannel)(void *p_obj, int p_id); typedef void (*RTCOnSession)(void *p_obj, const char *p_type, const char *p_sdp); typedef void (*RTCOnError)(void *p_obj); -extern int godot_js_rtc_pc_create(const char *p_config, void *p_obj, RTCOnIceConnectionStateChange p_on_state_change, RTCOnIceCandidate p_on_candidate, RTCOnDataChannel p_on_datachannel); +extern int godot_js_rtc_pc_create(const char *p_config, void *p_obj, RTCOnIceConnectionStateChange p_on_connection_state_change, RTCOnIceGatheringStateChange p_on_gathering_state_change, RTCOnSignalingStateChange p_on_signaling_state_change, RTCOnIceCandidate p_on_candidate, RTCOnDataChannel p_on_datachannel); extern void godot_js_rtc_pc_close(int p_id); extern void godot_js_rtc_pc_destroy(int p_id); extern void godot_js_rtc_pc_offer_create(int p_id, void *p_obj, RTCOnSession p_on_session, RTCOnError p_on_error); @@ -55,10 +57,14 @@ class WebRTCPeerConnectionJS : public WebRTCPeerConnection { GDCLASS(WebRTCPeerConnectionJS, WebRTCPeerConnection); private: - int _js_id; - ConnectionState _conn_state; + int _js_id = 0; + ConnectionState _conn_state = STATE_NEW; + GatheringState _gathering_state = GATHERING_STATE_NEW; + SignalingState _signaling_state = SIGNALING_STATE_STABLE; static void _on_connection_state_changed(void *p_obj, int p_state); + static void _on_gathering_state_changed(void *p_obj, int p_state); + static void _on_signaling_state_changed(void *p_obj, int p_state); static void _on_ice_candidate(void *p_obj, const char *p_mid_name, int p_mline_idx, const char *p_candidate); static void _on_data_channel(void *p_obj, int p_channel); static void _on_session_created(void *p_obj, const char *p_type, const char *p_session); @@ -66,6 +72,8 @@ private: public: virtual ConnectionState get_connection_state() const override; + virtual GatheringState get_gathering_state() const override; + virtual SignalingState get_signaling_state() const override; virtual Error initialize(Dictionary configuration = Dictionary()) override; virtual Ref<WebRTCDataChannel> create_data_channel(String p_channel_name, Dictionary p_channel_config = Dictionary()) override; diff --git a/modules/websocket/SCsub b/modules/websocket/SCsub index 890fb71592..3f834471e5 100644 --- a/modules/websocket/SCsub +++ b/modules/websocket/SCsub @@ -41,7 +41,7 @@ elif env["builtin_wslay"]: module_obj = [] env_ws.add_source_files(module_obj, "*.cpp") -if env["tools"]: +if env.editor_build: env_ws.add_source_files(module_obj, "editor/*.cpp") env.modules_sources += module_obj diff --git a/modules/websocket/remote_debugger_peer_websocket.h b/modules/websocket/remote_debugger_peer_websocket.h index a37a789cbe..0292de68ad 100644 --- a/modules/websocket/remote_debugger_peer_websocket.h +++ b/modules/websocket/remote_debugger_peer_websocket.h @@ -51,6 +51,7 @@ public: static RemoteDebuggerPeer *create(const String &p_uri); Error connect_to_host(const String &p_uri); + bool is_peer_connected() override; int get_max_message_size() const override; bool has_message() override; diff --git a/modules/websocket/websocket_macros.h b/modules/websocket/websocket_macros.h index a01ae65c56..b03bd8f45c 100644 --- a/modules/websocket/websocket_macros.h +++ b/modules/websocket/websocket_macros.h @@ -35,34 +35,32 @@ #define DEF_PKT_SHIFT 10 #define DEF_BUF_SHIFT 16 -/* clang-format off */ -#define GDCICLASS(CNAME) \ -public:\ - static CNAME *(*_create)();\ -\ - static Ref<CNAME > create_ref() {\ -\ - if (!_create)\ - return Ref<CNAME >();\ - return Ref<CNAME >(_create());\ - }\ -\ - static CNAME *create() {\ -\ - if (!_create)\ - return nullptr;\ - return _create();\ - }\ -protected:\ +#define GDCICLASS(CNAME) \ +public: \ + static CNAME *(*_create)(); \ + \ + static Ref<CNAME> create_ref() { \ + if (!_create) \ + return Ref<CNAME>(); \ + return Ref<CNAME>(_create()); \ + } \ + \ + static CNAME *create() { \ + if (!_create) \ + return nullptr; \ + return _create(); \ + } \ + \ +protected: #define GDCINULL(CNAME) \ -CNAME *(*CNAME::_create)() = nullptr; + CNAME *(*CNAME::_create)() = nullptr; -#define GDCIIMPL(IMPNAME, CNAME) \ -public:\ - static CNAME *_create() { return memnew(IMPNAME); }\ - static void make_default() { CNAME::_create = IMPNAME::_create; }\ -protected:\ -/* clang-format on */ +#define GDCIIMPL(IMPNAME, CNAME) \ +public: \ + static CNAME *_create() { return memnew(IMPNAME); } \ + static void make_default() { CNAME::_create = IMPNAME::_create; } \ + \ +protected: #endif // WEBSOCKET_MACROS_H diff --git a/modules/webxr/config.py b/modules/webxr/config.py index f676ef3483..8d75e7f531 100644 --- a/modules/webxr/config.py +++ b/modules/webxr/config.py @@ -1,5 +1,5 @@ def can_build(env, platform): - return not env["disable_3d"] + return env["opengl3"] and not env["disable_3d"] def configure(env): diff --git a/modules/webxr/godot_webxr.h b/modules/webxr/godot_webxr.h index 52104895d4..34d068be3e 100644 --- a/modules/webxr/godot_webxr.h +++ b/modules/webxr/godot_webxr.h @@ -65,8 +65,7 @@ extern int godot_webxr_get_view_count(); extern int *godot_webxr_get_render_target_size(); extern float *godot_webxr_get_transform_for_eye(int p_eye); extern float *godot_webxr_get_projection_for_eye(int p_eye); -extern int godot_webxr_get_external_texture_for_eye(int p_eye); -extern void godot_webxr_commit_for_eye(int p_eye); +extern void godot_webxr_commit_for_eye(int p_eye, unsigned int p_destination_fbo); extern void godot_webxr_sample_controller_data(); extern int godot_webxr_get_controller_count(); diff --git a/modules/webxr/native/library_godot_webxr.js b/modules/webxr/native/library_godot_webxr.js index c4b21defce..9b75796ee5 100644 --- a/modules/webxr/native/library_godot_webxr.js +++ b/modules/webxr/native/library_godot_webxr.js @@ -32,9 +32,6 @@ const GodotWebXR = { $GodotWebXR: { gl: null, - texture_ids: [null, null], - textures: [null, null], - session: null, space: null, frame: null, @@ -77,110 +74,6 @@ const GodotWebXR = { }, 0); }, - // Some custom WebGL code for blitting our eye textures to the - // framebuffer we get from WebXR. - shaderProgram: null, - programInfo: null, - buffer: null, - // Vertex shader source. - vsSource: ` - const vec2 scale = vec2(0.5, 0.5); - attribute vec4 aVertexPosition; - - varying highp vec2 vTextureCoord; - - void main () { - gl_Position = aVertexPosition; - vTextureCoord = aVertexPosition.xy * scale + scale; - } - `, - // Fragment shader source. - fsSource: ` - varying highp vec2 vTextureCoord; - - uniform sampler2D uSampler; - - void main() { - gl_FragColor = texture2D(uSampler, vTextureCoord); - } - `, - - initShaderProgram: (gl, vsSource, fsSource) => { - const vertexShader = GodotWebXR.loadShader(gl, gl.VERTEX_SHADER, vsSource); - const fragmentShader = GodotWebXR.loadShader(gl, gl.FRAGMENT_SHADER, fsSource); - - const shaderProgram = gl.createProgram(); - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - GodotRuntime.error(`Unable to initialize the shader program: ${gl.getProgramInfoLog(shaderProgram)}`); - return null; - } - - return shaderProgram; - }, - loadShader: (gl, type, source) => { - const shader = gl.createShader(type); - gl.shaderSource(shader, source); - gl.compileShader(shader); - - if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { - GodotRuntime.error(`An error occurred compiling the shader: ${gl.getShaderInfoLog(shader)}`); - gl.deleteShader(shader); - return null; - } - - return shader; - }, - initBuffer: (gl) => { - const positionBuffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer); - const positions = [ - -1.0, -1.0, - 1.0, -1.0, - -1.0, 1.0, - 1.0, 1.0, - ]; - gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW); - return positionBuffer; - }, - blitTexture: (gl, texture) => { - if (GodotWebXR.shaderProgram === null) { - GodotWebXR.shaderProgram = GodotWebXR.initShaderProgram(gl, GodotWebXR.vsSource, GodotWebXR.fsSource); - GodotWebXR.programInfo = { - program: GodotWebXR.shaderProgram, - attribLocations: { - vertexPosition: gl.getAttribLocation(GodotWebXR.shaderProgram, 'aVertexPosition'), - }, - uniformLocations: { - uSampler: gl.getUniformLocation(GodotWebXR.shaderProgram, 'uSampler'), - }, - }; - GodotWebXR.buffer = GodotWebXR.initBuffer(gl); - } - - const orig_program = gl.getParameter(gl.CURRENT_PROGRAM); - gl.useProgram(GodotWebXR.shaderProgram); - - gl.bindBuffer(gl.ARRAY_BUFFER, GodotWebXR.buffer); - gl.vertexAttribPointer(GodotWebXR.programInfo.attribLocations.vertexPosition, 2, gl.FLOAT, false, 0, 0); - gl.enableVertexAttribArray(GodotWebXR.programInfo.attribLocations.vertexPosition); - - gl.activeTexture(gl.TEXTURE0); - gl.bindTexture(gl.TEXTURE_2D, texture); - gl.uniform1i(GodotWebXR.programInfo.uniformLocations.uSampler, 0); - - gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); - - // Restore state. - gl.bindTexture(gl.TEXTURE_2D, null); - gl.disableVertexAttribArray(GodotWebXR.programInfo.attribLocations.vertexPosition); - gl.bindBuffer(gl.ARRAY_BUFFER, null); - gl.useProgram(orig_program); - }, - // Holds the controllers list between function calls. controllers: [], @@ -370,22 +263,6 @@ const GodotWebXR = { .catch((e) => { }); } - // Clean-up the textures we allocated for each view. - const gl = GodotWebXR.gl; - for (let i = 0; i < GodotWebXR.textures.length; i++) { - const texture = GodotWebXR.textures[i]; - if (texture !== null) { - gl.deleteTexture(texture); - } - GodotWebXR.textures[i] = null; - - const texture_id = GodotWebXR.texture_ids[i]; - if (texture_id !== null) { - GL.textures[texture_id] = null; - } - GodotWebXR.texture_ids[i] = null; - } - GodotWebXR.session = null; GodotWebXR.space = null; GodotWebXR.frame = null; @@ -460,50 +337,9 @@ const GodotWebXR = { return buf; }, - godot_webxr_get_external_texture_for_eye__proxy: 'sync', - godot_webxr_get_external_texture_for_eye__sig: 'ii', - godot_webxr_get_external_texture_for_eye: function (p_eye) { - if (!GodotWebXR.session) { - return 0; - } - - const view_index = (p_eye === 2 /* ARVRInterface::EYE_RIGHT */) ? 1 : 0; - if (GodotWebXR.texture_ids[view_index]) { - return GodotWebXR.texture_ids[view_index]; - } - - // Check pose separately and after returning the cached texture id, - // because we won't get a pose in some cases if we lose tracking, and - // we don't want to return 0 just because tracking was lost. - if (!GodotWebXR.pose) { - return 0; - } - - const glLayer = GodotWebXR.session.renderState.baseLayer; - const view = GodotWebXR.pose.views[view_index]; - const viewport = glLayer.getViewport(view); - const gl = GodotWebXR.gl; - - const texture = gl.createTexture(); - gl.bindTexture(gl.TEXTURE_2D, texture); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, viewport.width, viewport.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); - - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - gl.bindTexture(gl.TEXTURE_2D, null); - - const texture_id = GL.getNewId(GL.textures); - GL.textures[texture_id] = texture; - GodotWebXR.textures[view_index] = texture; - GodotWebXR.texture_ids[view_index] = texture_id; - return texture_id; - }, - godot_webxr_commit_for_eye__proxy: 'sync', - godot_webxr_commit_for_eye__sig: 'vi', - godot_webxr_commit_for_eye: function (p_eye) { + godot_webxr_commit_for_eye__sig: 'vii', + godot_webxr_commit_for_eye: function (p_eye, p_destination_fbo) { if (!GodotWebXR.session || !GodotWebXR.pose) { return; } @@ -514,18 +350,29 @@ const GodotWebXR = { const viewport = glLayer.getViewport(view); const gl = GodotWebXR.gl; + const framebuffer = GL.framebuffers[p_destination_fbo]; + const orig_framebuffer = gl.getParameter(gl.FRAMEBUFFER_BINDING); - const orig_viewport = gl.getParameter(gl.VIEWPORT); + const orig_read_framebuffer = gl.getParameter(gl.READ_FRAMEBUFFER_BINDING); + const orig_read_buffer = gl.getParameter(gl.READ_BUFFER); + const orig_draw_framebuffer = gl.getParameter(gl.DRAW_FRAMEBUFFER_BINDING); - // Bind to WebXR's framebuffer. - gl.bindFramebuffer(gl.FRAMEBUFFER, glLayer.framebuffer); - gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height); + // Copy from Godot render target into framebuffer from WebXR. + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + gl.bindFramebuffer(gl.READ_FRAMEBUFFER, framebuffer); + gl.readBuffer(gl.COLOR_ATTACHMENT0); + gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, glLayer.framebuffer); - GodotWebXR.blitTexture(gl, GodotWebXR.textures[view_index]); + // Flip Y upside down on destination. + gl.blitFramebuffer(0, 0, viewport.width, viewport.height, + viewport.x, viewport.height, viewport.width, viewport.y, + gl.COLOR_BUFFER_BIT, gl.NEAREST); // Restore state. gl.bindFramebuffer(gl.FRAMEBUFFER, orig_framebuffer); - gl.viewport(orig_viewport[0], orig_viewport[1], orig_viewport[2], orig_viewport[3]); + gl.bindFramebuffer(gl.READ_FRAMEBUFFER, orig_read_framebuffer); + gl.readBuffer(orig_read_buffer); + gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, orig_draw_framebuffer); }, godot_webxr_sample_controller_data__proxy: 'sync', diff --git a/modules/webxr/webxr_interface_js.cpp b/modules/webxr/webxr_interface_js.cpp index 7d97dbfa0b..d0c7484aa1 100644 --- a/modules/webxr/webxr_interface_js.cpp +++ b/modules/webxr/webxr_interface_js.cpp @@ -34,9 +34,11 @@ #include "core/input/input.h" #include "core/os/os.h" +#include "drivers/gles3/storage/texture_storage.h" #include "emscripten.h" #include "godot_webxr.h" #include "servers/rendering/renderer_compositor.h" +#include "servers/rendering/rendering_server_globals.h" #include <stdlib.h> @@ -232,6 +234,8 @@ bool WebXRInterfaceJS::initialize() { } // we must create a tracker for our head + head_transform.basis = Basis(); + head_transform.origin = Vector3(); head_tracker.instantiate(); head_tracker->set_tracker_type(XRServer::TRACKER_HEAD); head_tracker->set_tracker_name("head"); @@ -334,15 +338,17 @@ Transform3D WebXRInterfaceJS::get_camera_transform() { XRServer *xr_server = XRServer::get_singleton(); ERR_FAIL_NULL_V(xr_server, transform_for_eye); - float *js_matrix = godot_webxr_get_transform_for_eye(0); - if (!initialized || js_matrix == nullptr) { - return transform_for_eye; - } + if (initialized) { + float world_scale = xr_server->get_world_scale(); - transform_for_eye = _js_matrix_to_transform(js_matrix); - free(js_matrix); + // just scale our origin point of our transform + Transform3D _head_transform = head_transform; + _head_transform.origin *= world_scale; + + transform_for_eye = (xr_server->get_reference_frame()) * _head_transform; + } - return xr_server->get_reference_frame() * transform_for_eye; + return transform_for_eye; }; Transform3D WebXRInterfaceJS::get_transform_for_view(uint32_t p_view, const Transform3D &p_cam_transform) { @@ -360,6 +366,14 @@ Transform3D WebXRInterfaceJS::get_transform_for_view(uint32_t p_view, const Tran transform_for_eye = _js_matrix_to_transform(js_matrix); free(js_matrix); + float world_scale = xr_server->get_world_scale(); + // Scale only the center point of our eye transform, so we don't scale the + // distance between the eyes. + Transform3D _head_transform = head_transform; + transform_for_eye.origin -= _head_transform.origin; + _head_transform.origin *= world_scale; + transform_for_eye.origin += _head_transform.origin; + return p_cam_transform * xr_server->get_reference_frame() * transform_for_eye; }; @@ -394,29 +408,33 @@ Vector<BlitToScreen> WebXRInterfaceJS::post_draw_viewport(RID p_render_target, c return blit_to_screen; } - // @todo Refactor this to be based on "views" rather than "eyes". - godot_webxr_commit_for_eye(1); - if (godot_webxr_get_view_count() > 1) { - godot_webxr_commit_for_eye(2); + GLES3::TextureStorage *texture_storage = dynamic_cast<GLES3::TextureStorage *>(RSG::texture_storage); + if (!texture_storage) { + return blit_to_screen; } + GLES3::RenderTarget *rt = texture_storage->get_render_target(p_render_target); + + // @todo Support multiple eyes! + godot_webxr_commit_for_eye(1, rt->fbo); + return blit_to_screen; }; void WebXRInterfaceJS::process() { if (initialized) { - godot_webxr_sample_controller_data(); - + // Get the "head" position. + float *js_matrix = godot_webxr_get_transform_for_eye(0); + if (js_matrix != nullptr) { + head_transform = _js_matrix_to_transform(js_matrix); + free(js_matrix); + } if (head_tracker.is_valid()) { - // TODO set default pose to our head location (i.e. get_camera_transform without world scale and reference frame applied) - // head_tracker->set_pose("default", head_transform, Vector3(), Vector3()); + head_tracker->set_pose("default", head_transform, Vector3(), Vector3()); } + godot_webxr_sample_controller_data(); int controller_count = godot_webxr_get_controller_count(); - if (controller_count == 0) { - return; - } - for (int i = 0; i < controller_count; i++) { _update_tracker(i); } diff --git a/modules/webxr/webxr_interface_js.h b/modules/webxr/webxr_interface_js.h index dbe89dad83..319adc2ac9 100644 --- a/modules/webxr/webxr_interface_js.h +++ b/modules/webxr/webxr_interface_js.h @@ -45,6 +45,7 @@ class WebXRInterfaceJS : public WebXRInterface { private: bool initialized; Ref<XRPositionalTracker> head_tracker; + Transform3D head_transform; String session_mode; String required_features; diff --git a/modules/xatlas_unwrap/config.py b/modules/xatlas_unwrap/config.py index 2e73c51626..ecc61c2d7e 100644 --- a/modules/xatlas_unwrap/config.py +++ b/modules/xatlas_unwrap/config.py @@ -1,5 +1,5 @@ def can_build(env, platform): - return env["tools"] and platform not in ["android", "ios"] + return env.editor_build and platform not in ["android", "ios"] def configure(env): diff --git a/platform/android/SCsub b/platform/android/SCsub index 344ca036de..9f5b8d8387 100644 --- a/platform/android/SCsub +++ b/platform/android/SCsub @@ -53,14 +53,14 @@ else: print("WARN: Architecture not suitable for embedding into APK; keeping .so at \\bin") if lib_arch_dir != "": - if env["target"] == "release": - lib_type_dir = "release" - elif env["target"] == "release_debug": + if env.debug_features: lib_type_dir = "debug" - else: # debug + elif env.dev_build: lib_type_dir = "dev" + else: # Release + lib_type_dir = "release" - if env["tools"]: + if env.editor_build: lib_tools_dir = "tools/" else: lib_tools_dir = "" diff --git a/platform/android/detect.py b/platform/android/detect.py index 1d9bcdd932..6eb8ba34ed 100644 --- a/platform/android/detect.py +++ b/platform/android/detect.py @@ -3,6 +3,11 @@ import sys import platform import subprocess +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from SCons import Environment + def is_active(): return True @@ -17,8 +22,6 @@ def can_build(): def get_opts(): - from SCons.Variables import BoolVariable, EnumVariable - return [ ("ANDROID_SDK_ROOT", "Path to the Android SDK", get_env_android_sdk_root()), ("ndk_platform", 'Target platform (android-<api>, e.g. "android-24")', "android-24"), @@ -46,10 +49,7 @@ def get_ndk_version(): def get_flags(): return [ ("arch", "arm64"), # Default for convenience. - ("tools", False), - # Benefits of LTO for Android (size, performance) haven't been clearly established yet. - # So for now we override the default value which may be set when using `production=yes`. - ("lto", "none"), + ("target", "template_debug"), ] @@ -77,7 +77,7 @@ def install_ndk_if_needed(env): env["ANDROID_NDK_ROOT"] = get_android_ndk_root(env) -def configure(env): +def configure(env: "Environment"): # Validate arch. supported_arches = ["x86_32", "x86_64", "arm32", "arm64"] if env["arch"] not in supported_arches: @@ -117,25 +117,11 @@ def configure(env): env.Append(CCFLAGS=target_option) env.Append(LINKFLAGS=target_option) - # Build type - - if env["target"].startswith("release"): - if env["optimize"] == "speed": # optimize for speed (default) - # `-O2` is more friendly to debuggers than `-O3`, leading to better crash backtraces - # when using `target=release_debug`. - opt = "-O3" if env["target"] == "release" else "-O2" - env.Append(CCFLAGS=[opt, "-fomit-frame-pointer"]) - elif env["optimize"] == "size": # optimize for size - env.Append(CCFLAGS=["-Oz"]) - env.Append(CPPDEFINES=["NDEBUG"]) - env.Append(CCFLAGS=["-ftree-vectorize"]) - elif env["target"] == "debug": - env.Append(LINKFLAGS=["-O0"]) - env.Append(CCFLAGS=["-O0", "-g", "-fno-limit-debug-info"]) - env.Append(CPPDEFINES=["_DEBUG"]) - env.Append(CPPFLAGS=["-UNDEBUG"]) - # LTO + + if env["lto"] == "auto": # LTO benefits for Android (size, performance) haven't been clearly established yet. + env["lto"] = "none" + if env["lto"] != "none": if env["lto"] == "thin": env.Append(CCFLAGS=["-flto=thin"]) @@ -170,22 +156,16 @@ def configure(env): env["RANLIB"] = compiler_path + "/llvm-ranlib" env["AS"] = compiler_path + "/clang" - # Disable exceptions and rtti on non-tools (template) builds - if env["tools"]: - env.Append(CXXFLAGS=["-frtti"]) - elif env["builtin_icu"]: - env.Append(CXXFLAGS=["-frtti", "-fno-exceptions"]) - else: - env.Append(CXXFLAGS=["-fno-rtti", "-fno-exceptions"]) - # Don't use dynamic_cast, necessary with no-rtti. - env.Append(CPPDEFINES=["NO_SAFE_CAST"]) + # Disable exceptions on template builds + if not env.editor_build: + env.Append(CXXFLAGS=["-fno-exceptions"]) env.Append( CCFLAGS=( "-fpic -ffunction-sections -funwind-tables -fstack-protector-strong -fvisibility=hidden -fno-strict-aliasing".split() ) ) - env.Append(CPPDEFINES=["NO_STATVFS", "GLES_ENABLED"]) + env.Append(CPPDEFINES=["GLES_ENABLED"]) if get_min_sdk_version(env["ndk_platform"]) >= 24: env.Append(CPPDEFINES=[("_FILE_OFFSET_BITS", 64)]) @@ -207,7 +187,7 @@ def configure(env): env.Append(LINKFLAGS="-Wl,-soname,libgodot_android.so") env.Prepend(CPPPATH=["#platform/android"]) - env.Append(CPPDEFINES=["ANDROID_ENABLED", "UNIX_ENABLED", "NO_FCNTL"]) + env.Append(CPPDEFINES=["ANDROID_ENABLED", "UNIX_ENABLED"]) env.Append(LIBS=["OpenSLES", "EGL", "GLESv2", "android", "log", "z", "dl"]) if env["vulkan"]: diff --git a/platform/android/export/export.cpp b/platform/android/export/export.cpp index 5bbe0ffab6..f4c4e985fe 100644 --- a/platform/android/export/export.cpp +++ b/platform/android/export/export.cpp @@ -36,6 +36,7 @@ #include "export_plugin.h" void register_android_exporter() { +#ifndef ANDROID_ENABLED EDITOR_DEF("export/android/android_sdk_path", ""); EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/android/android_sdk_path", PROPERTY_HINT_GLOBAL_DIR)); EDITOR_DEF("export/android/debug_keystore", ""); @@ -47,6 +48,7 @@ void register_android_exporter() { EDITOR_DEF("export/android/shutdown_adb_on_exit", true); EDITOR_DEF("export/android/one_click_deploy_clear_previous_install", false); +#endif Ref<EditorExportPlatformAndroid> exporter = Ref<EditorExportPlatformAndroid>(memnew(EditorExportPlatformAndroid)); EditorExport::get_singleton()->add_export_platform(exporter); diff --git a/platform/android/export/export_plugin.cpp b/platform/android/export/export_plugin.cpp index 0f8ef3f7d6..366bd1c48c 100644 --- a/platform/android/export/export_plugin.cpp +++ b/platform/android/export/export_plugin.cpp @@ -569,16 +569,15 @@ bool EditorExportPlatformAndroid::_should_compress_asset(const String &p_path, c } zip_fileinfo EditorExportPlatformAndroid::get_zip_fileinfo() { - OS::Time time = OS::get_singleton()->get_time(); - OS::Date date = OS::get_singleton()->get_date(); + OS::DateTime dt = OS::get_singleton()->get_datetime(); zip_fileinfo zipfi; - zipfi.tmz_date.tm_hour = time.hour; - zipfi.tmz_date.tm_mday = date.day; - zipfi.tmz_date.tm_min = time.minute; - zipfi.tmz_date.tm_mon = date.month - 1; // tm_mon is zero indexed - zipfi.tmz_date.tm_sec = time.second; - zipfi.tmz_date.tm_year = date.year; + zipfi.tmz_date.tm_year = dt.year; + zipfi.tmz_date.tm_mon = dt.month - 1; // tm_mon is zero indexed + zipfi.tmz_date.tm_mday = dt.day; + zipfi.tmz_date.tm_hour = dt.hour; + zipfi.tmz_date.tm_min = dt.minute; + zipfi.tmz_date.tm_sec = dt.second; zipfi.dosDate = 0; zipfi.external_fa = 0; zipfi.internal_fa = 0; @@ -1670,14 +1669,7 @@ Vector<String> EditorExportPlatformAndroid::get_enabled_abis(const Ref<EditorExp } void EditorExportPlatformAndroid::get_preset_features(const Ref<EditorExportPreset> &p_preset, List<String> *r_features) const { - String driver = ProjectSettings::get_singleton()->get("rendering/driver/driver_name"); - if (driver == "opengl3") { - r_features->push_back("etc"); - } - // FIXME: Review what texture formats are used for Vulkan. - if (driver == "vulkan") { - r_features->push_back("etc2"); - } + r_features->push_back("etc2"); Vector<String> abis = get_enabled_abis(p_preset); for (int i = 0; i < abis.size(); ++i) { diff --git a/platform/android/export/gradle_export_util.cpp b/platform/android/export/gradle_export_util.cpp index 8d370a31a4..2f53942f76 100644 --- a/platform/android/export/gradle_export_util.cpp +++ b/platform/android/export/gradle_export_util.cpp @@ -189,9 +189,7 @@ String bool_to_string(bool v) { } String _get_gles_tag() { - bool min_gles3 = ProjectSettings::get_singleton()->get("rendering/driver/driver_name") == "GLES3" && - !ProjectSettings::get_singleton()->get("rendering/driver/fallback_to_gles2"); - return min_gles3 ? " <uses-feature android:glEsVersion=\"0x00030000\" android:required=\"true\" />\n" : ""; + return " <uses-feature android:glEsVersion=\"0x00030000\" android:required=\"true\" />\n"; } String _get_screen_sizes_tag(const Ref<EditorExportPreset> &p_preset) { diff --git a/platform/android/file_access_android.cpp b/platform/android/file_access_android.cpp index ace7636e6c..d6cd62e9f5 100644 --- a/platform/android/file_access_android.cpp +++ b/platform/android/file_access_android.cpp @@ -42,7 +42,7 @@ String FileAccessAndroid::get_path_absolute() const { return absolute_path; } -Error FileAccessAndroid::_open(const String &p_path, int p_mode_flags) { +Error FileAccessAndroid::open_internal(const String &p_path, int p_mode_flags) { _close(); path_src = p_path; diff --git a/platform/android/file_access_android.h b/platform/android/file_access_android.h index 8d7ade8ead..55f8fbe0f4 100644 --- a/platform/android/file_access_android.h +++ b/platform/android/file_access_android.h @@ -49,7 +49,7 @@ class FileAccessAndroid : public FileAccess { public: static AAssetManager *asset_manager; - virtual Error _open(const String &p_path, int p_mode_flags) override; // open a file + virtual Error open_internal(const String &p_path, int p_mode_flags) override; // open a file virtual bool is_open() const override; // true when file is open /// returns the path for the current open file diff --git a/platform/android/file_access_filesystem_jandroid.cpp b/platform/android/file_access_filesystem_jandroid.cpp index 56561cb616..c2ee3389ae 100644 --- a/platform/android/file_access_filesystem_jandroid.cpp +++ b/platform/android/file_access_filesystem_jandroid.cpp @@ -61,7 +61,7 @@ String FileAccessFilesystemJAndroid::get_path_absolute() const { return absolute_path; } -Error FileAccessFilesystemJAndroid::_open(const String &p_path, int p_mode_flags) { +Error FileAccessFilesystemJAndroid::open_internal(const String &p_path, int p_mode_flags) { if (is_open()) { _close(); } diff --git a/platform/android/file_access_filesystem_jandroid.h b/platform/android/file_access_filesystem_jandroid.h index 76d7db6e3a..815ab36516 100644 --- a/platform/android/file_access_filesystem_jandroid.h +++ b/platform/android/file_access_filesystem_jandroid.h @@ -60,7 +60,7 @@ class FileAccessFilesystemJAndroid : public FileAccess { void _set_eof(bool eof); public: - virtual Error _open(const String &p_path, int p_mode_flags) override; ///< open a file + virtual Error open_internal(const String &p_path, int p_mode_flags) override; ///< open a file virtual bool is_open() const override; ///< true when file is open /// returns the path for the current open file diff --git a/platform/android/java/app/config.gradle b/platform/android/java/app/config.gradle index fbd97fae0b..0346625e4b 100644 --- a/platform/android/java/app/config.gradle +++ b/platform/android/java/app/config.gradle @@ -127,16 +127,36 @@ ext.generateGodotLibraryVersion = { List<String> requiredKeys -> if (requiredKeys.empty) { libraryVersionName = map.values().join(".") try { + if (map.containsKey("status")) { + int statusCode = 0 + String statusValue = map["status"] + if (statusValue == null) { + statusCode = 0 + } else if (statusValue.startsWith("alpha")) { + statusCode = 1 + } else if (statusValue.startsWith("beta")) { + statusCode = 2 + } else if (statusValue.startsWith("rc")) { + statusCode = 3 + } else if (statusValue.startsWith("stable")) { + statusCode = 4 + } else { + statusCode = 0 + } + + libraryVersionCode = statusCode + } + if (map.containsKey("patch")) { - libraryVersionCode = Integer.parseInt(map["patch"]) + libraryVersionCode += Integer.parseInt(map["patch"]) * 10 } if (map.containsKey("minor")) { - libraryVersionCode += (Integer.parseInt(map["minor"]) * 100) + libraryVersionCode += (Integer.parseInt(map["minor"]) * 1000) } if (map.containsKey("major")) { - libraryVersionCode += (Integer.parseInt(map["major"]) * 10000) + libraryVersionCode += (Integer.parseInt(map["major"]) * 100000) } } catch (NumberFormatException ignore) { libraryVersionCode = 1 diff --git a/platform/android/java/editor/build.gradle b/platform/android/java/editor/build.gradle index 729966ee69..9152492e9d 100644 --- a/platform/android/java/editor/build.gradle +++ b/platform/android/java/editor/build.gradle @@ -12,6 +12,25 @@ dependencies { implementation "androidx.window:window:1.0.0" } +ext { + // Build number added as a suffix to the version code, and incremented for each build/upload to + // the Google Play store. + // This should be reset on each stable release of Godot. + editorBuildNumber = 0 + // Value by which the Godot version code should be offset by to make room for the build number + editorBuildNumberOffset = 100 +} + +def generateVersionCode() { + int libraryVersionCode = getGodotLibraryVersionCode() + return (libraryVersionCode * editorBuildNumberOffset) + editorBuildNumber +} + +def generateVersionName() { + String libraryVersionName = getGodotLibraryVersionName() + return libraryVersionName + ".$editorBuildNumber" +} + android { compileSdkVersion versions.compileSdk buildToolsVersion versions.buildTools @@ -20,8 +39,8 @@ android { defaultConfig { // The 'applicationId' suffix allows to install Godot 3.x(v3) and 4.x(v4) on the same device applicationId "org.godotengine.editor.v4" - versionCode getGodotLibraryVersionCode() - versionName getGodotLibraryVersionName() + versionCode generateVersionCode() + versionName generateVersionName() minSdkVersion versions.minSdk targetSdkVersion versions.targetSdk diff --git a/platform/android/java/editor/src/main/AndroidManifest.xml b/platform/android/java/editor/src/main/AndroidManifest.xml index abf506a83c..6aa5f06f31 100644 --- a/platform/android/java/editor/src/main/AndroidManifest.xml +++ b/platform/android/java/editor/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ <supports-screens android:largeScreens="true" android:normalScreens="true" - android:smallScreens="true" + android:smallScreens="false" android:xlargeScreens="true" /> <uses-feature diff --git a/platform/android/java/lib/src/org/godotengine/godot/Godot.java b/platform/android/java/lib/src/org/godotengine/godot/Godot.java index a75c69484c..92e5e59496 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/Godot.java +++ b/platform/android/java/lib/src/org/godotengine/godot/Godot.java @@ -274,11 +274,11 @@ public class Godot extends Fragment implements SensorEventListener, IDownloaderC return false; } - final String videoDriver = GodotLib.getGlobal("rendering/driver/driver_name"); - if (videoDriver.equals("vulkan")) { - mRenderView = new GodotVulkanRenderView(activity, this); - } else { + final String renderer = GodotLib.getGlobal("rendering/renderer/rendering_method"); + if (renderer.equals("gl_compatibility")) { mRenderView = new GodotGLRenderView(activity, this, xrMode, use_debug_opengl); + } else { + mRenderView = new GodotVulkanRenderView(activity, this); } View view = mRenderView.getView(); diff --git a/platform/android/java_godot_io_wrapper.h b/platform/android/java_godot_io_wrapper.h index 9a1a877b6f..24995147d4 100644 --- a/platform/android/java_godot_io_wrapper.h +++ b/platform/android/java_godot_io_wrapper.h @@ -28,9 +28,6 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -// note, swapped java and godot around in the file name so all the java -// wrappers are together - #ifndef JAVA_GODOT_IO_WRAPPER_H #define JAVA_GODOT_IO_WRAPPER_H diff --git a/platform/android/java_godot_wrapper.h b/platform/android/java_godot_wrapper.h index a6c7853107..0e96a4e1f3 100644 --- a/platform/android/java_godot_wrapper.h +++ b/platform/android/java_godot_wrapper.h @@ -28,9 +28,6 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -// note, swapped java and godot around in the file name so all the java -// wrappers are together - #ifndef JAVA_GODOT_WRAPPER_H #define JAVA_GODOT_WRAPPER_H diff --git a/platform/android/os_android.cpp b/platform/android/os_android.cpp index 142dc54c45..4469c7a0f7 100644 --- a/platform/android/os_android.cpp +++ b/platform/android/os_android.cpp @@ -44,6 +44,7 @@ #include "net_socket_android.h" #include <dlfcn.h> +#include <sys/system_properties.h> #include "java_godot_io_wrapper.h" #include "java_godot_wrapper.h" @@ -175,6 +176,79 @@ String OS_Android::get_name() const { return "Android"; } +String OS_Android::get_system_property(const char *key) const { + static String value; + char value_str[PROP_VALUE_MAX]; + if (__system_property_get(key, value_str)) { + value = String(value_str); + } + return value; +} + +String OS_Android::get_distribution_name() const { + if (!get_system_property("ro.havoc.version").is_empty()) { + return "Havoc OS"; + } else if (!get_system_property("org.pex.version").is_empty()) { // Putting before "Pixel Experience", because it's derivating from it. + return "Pixel Extended"; + } else if (!get_system_property("org.pixelexperience.version").is_empty()) { + return "Pixel Experience"; + } else if (!get_system_property("ro.potato.version").is_empty()) { + return "POSP"; + } else if (!get_system_property("ro.xtended.version").is_empty()) { + return "Project-Xtended"; + } else if (!get_system_property("org.evolution.version").is_empty()) { + return "Evolution X"; + } else if (!get_system_property("ro.corvus.version").is_empty()) { + return "Corvus-Q"; + } else if (!get_system_property("ro.pa.version").is_empty()) { + return "Paranoid Android"; + } else if (!get_system_property("ro.crdroid.version").is_empty()) { + return "crDroid Android"; + } else if (!get_system_property("ro.syberia.version").is_empty()) { + return "Syberia Project"; + } else if (!get_system_property("ro.arrow.version").is_empty()) { + return "ArrowOS"; + } else if (!get_system_property("ro.lineage.version").is_empty()) { // Putting LineageOS last, just in case any derivative writes to "ro.lineage.version". + return "LineageOS"; + } + + if (!get_system_property("ro.modversion").is_empty()) { // Handles other Android custom ROMs. + return vformat("%s %s", get_name(), "Custom ROM"); + } + + // Handles stock Android. + return get_name(); +} + +String OS_Android::get_version() const { + const Vector<const char *> roms = { "ro.havoc.version", "org.pex.version", "org.pixelexperience.version", + "ro.potato.version", "ro.xtended.version", "org.evolution.version", "ro.corvus.version", "ro.pa.version", + "ro.crdroid.version", "ro.syberia.version", "ro.arrow.version", "ro.lineage.version" }; + for (int i = 0; i < roms.size(); i++) { + static String rom_version = get_system_property(roms[i]); + if (!rom_version.is_empty()) { + return rom_version; + } + } + + static String mod_version = get_system_property("ro.modversion"); // Handles other Android custom ROMs. + if (!mod_version.is_empty()) { + return mod_version; + } + + // Handles stock Android. + static String sdk_version = get_system_property("ro.build.version.sdk_int"); + static String build = get_system_property("ro.build.version.incremental"); + if (!sdk_version.is_empty()) { + if (!build.is_empty()) { + return vformat("%s.%s", sdk_version, build); + } + return sdk_version; + } + + return ""; +} + MainLoop *OS_Android::get_main_loop() const { return main_loop; } diff --git a/platform/android/os_android.h b/platform/android/os_android.h index 96c06d715c..d6546a3507 100644 --- a/platform/android/os_android.h +++ b/platform/android/os_android.h @@ -65,6 +65,8 @@ private: GodotJavaWrapper *godot_java = nullptr; GodotIOJavaWrapper *godot_io_java = nullptr; + String get_system_property(const char *key) const; + public: static const char *ANDROID_EXEC_PATH; @@ -93,6 +95,8 @@ public: virtual Error open_dynamic_library(const String p_path, void *&p_library_handle, bool p_also_set_library_path = false, String *r_resolved_path = nullptr) override; virtual String get_name() const override; + virtual String get_distribution_name() const override; + virtual String get_version() const override; virtual MainLoop *get_main_loop() const override; void main_loop_begin(); diff --git a/platform/ios/detect.py b/platform/ios/detect.py index 3cfb25cf61..38e62134b5 100644 --- a/platform/ios/detect.py +++ b/platform/ios/detect.py @@ -2,6 +2,11 @@ import os import sys from methods import detect_darwin_sdk_path +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from SCons import Environment + def is_active(): return True @@ -37,15 +42,12 @@ def get_opts(): def get_flags(): return [ ("arch", "arm64"), # Default for convenience. - ("tools", False), + ("target", "template_debug"), ("use_volk", False), - # Disable by default even if production is set, as it makes linking in Xcode - # on exports very slow and that's not what most users expect. - ("lto", "none"), ] -def configure(env): +def configure(env: "Environment"): # Validate arch. supported_arches = ["x86_64", "arm64"] if env["arch"] not in supported_arches: @@ -55,25 +57,11 @@ def configure(env): ) sys.exit() - ## Build type - - if env["target"].startswith("release"): - env.Append(CPPDEFINES=["NDEBUG", ("NS_BLOCK_ASSERTIONS", 1)]) - if env["optimize"] == "speed": # optimize for speed (default) - # `-O2` is more friendly to debuggers than `-O3`, leading to better crash backtraces - # when using `target=release_debug`. - opt = "-O3" if env["target"] == "release" else "-O2" - env.Append(CCFLAGS=[opt, "-ftree-vectorize", "-fomit-frame-pointer"]) - env.Append(LINKFLAGS=[opt]) - elif env["optimize"] == "size": # optimize for size - env.Append(CCFLAGS=["-Os", "-ftree-vectorize"]) - env.Append(LINKFLAGS=["-Os"]) - - elif env["target"] == "debug": - env.Append(CCFLAGS=["-gdwarf-2", "-O0"]) - env.Append(CPPDEFINES=["_DEBUG", ("DEBUG", 1)]) - - # LTO + ## LTO + + if env["lto"] == "auto": # Disable by default as it makes linking in Xcode very slow. + env["lto"] = "none" + if env["lto"] != "none": if env["lto"] == "thin": env.Append(CCFLAGS=["-flto=thin"]) @@ -120,6 +108,10 @@ def configure(env): env.Append(CCFLAGS=["-miphoneos-version-min=11.0"]) if env["arch"] == "x86_64": + if not env["ios_simulator"]: + print("ERROR: Building for iOS with 'arch=x86_64' requires 'ios_simulator=yes'.") + sys.exit(255) + env["ENV"]["MACOSX_DEPLOYMENT_TARGET"] = "10.9" env.Append( CCFLAGS=( @@ -141,12 +133,10 @@ def configure(env): env.Append(ASFLAGS=["-arch", "arm64"]) env.Append(CPPDEFINES=["NEED_LONG_INT"]) - # Disable exceptions on non-tools (template) builds - if not env["tools"]: - if env["ios_exceptions"]: - env.Append(CCFLAGS=["-fexceptions"]) - else: - env.Append(CCFLAGS=["-fno-exceptions"]) + if env["ios_exceptions"]: + env.Append(CCFLAGS=["-fexceptions"]) + else: + env.Append(CCFLAGS=["-fno-exceptions"]) # Temp fix for ABS/MAX/MIN macros in iOS SDK blocking compilation env.Append(CCFLAGS=["-Wno-ambiguous-macro"]) diff --git a/platform/ios/display_layer.mm b/platform/ios/display_layer.mm index 7c83494768..74c760ae9a 100644 --- a/platform/ios/display_layer.mm +++ b/platform/ios/display_layer.mm @@ -89,12 +89,12 @@ // FIXME: Add Vulkan support via MoltenVK. Add fallback code back? - // Create GL ES 2 context - if (GLOBAL_GET("rendering/driver/driver_name") == "opengl3") { - context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; - NSLog(@"Setting up an OpenGL ES 2.0 context."); + // Create GL ES 3 context + if (GLOBAL_GET("rendering/renderer/rendering_method") == "gl_compatibility") { + context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3]; + NSLog(@"Setting up an OpenGL ES 3.0 context."); if (!context) { - NSLog(@"Failed to create OpenGL ES 2.0 context!"); + NSLog(@"Failed to create OpenGL ES 3.0 context!"); return; } } diff --git a/platform/ios/display_server_ios.mm b/platform/ios/display_server_ios.mm index 74d6bc2e97..d3a0f38463 100644 --- a/platform/ios/display_server_ios.mm +++ b/platform/ios/display_server_ios.mm @@ -62,7 +62,7 @@ DisplayServerIOS::DisplayServerIOS(const String &p_rendering_driver, WindowMode // Note that we should be checking "opengl3" as the driver, might never enable this seeing OpenGL is deprecated on iOS // We are hardcoding the rendering_driver to "vulkan" down below - if (rendering_driver == "opengl_es") { + if (rendering_driver == "opengl3") { bool gl_initialization_error = false; // FIXME: Add Vulkan support via MoltenVK. Add fallback code back? @@ -163,7 +163,7 @@ Vector<String> DisplayServerIOS::get_rendering_drivers_func() { drivers.push_back("vulkan"); #endif #if defined(GLES3_ENABLED) - drivers.push_back("opengl_es"); + drivers.push_back("opengl3"); #endif return drivers; diff --git a/platform/ios/export/export_plugin.cpp b/platform/ios/export/export_plugin.cpp index 7aacb2de85..74a57dc614 100644 --- a/platform/ios/export/export_plugin.cpp +++ b/platform/ios/export/export_plugin.cpp @@ -34,7 +34,6 @@ #include "editor/editor_node.h" void EditorExportPlatformIOS::get_preset_features(const Ref<EditorExportPreset> &p_preset, List<String> *r_features) const { - String driver = ProjectSettings::get_singleton()->get("rendering/driver/driver_name"); // Vulkan and OpenGL ES 3.0 both mandate ETC2 support. r_features->push_back("etc2"); diff --git a/platform/ios/godot_view.mm b/platform/ios/godot_view.mm index 9ed219508c..ff90c05b1d 100644 --- a/platform/ios/godot_view.mm +++ b/platform/ios/godot_view.mm @@ -74,7 +74,7 @@ static const float earth_gravity = 9.80665; if ([driverName isEqualToString:@"vulkan"]) { layer = [GodotMetalLayer layer]; - } else if ([driverName isEqualToString:@"opengl_es"]) { + } else if ([driverName isEqualToString:@"opengl3"]) { if (@available(iOS 13, *)) { NSLog(@"OpenGL ES is deprecated on iOS 13"); } diff --git a/platform/ios/os_ios.h b/platform/ios/os_ios.h index 3b88f53b6a..400040875f 100644 --- a/platform/ios/os_ios.h +++ b/platform/ios/os_ios.h @@ -28,11 +28,11 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifdef IOS_ENABLED - #ifndef OS_IOS_H #define OS_IOS_H +#ifdef IOS_ENABLED + #include "drivers/coreaudio/audio_driver_coreaudio.h" #include "drivers/unix/os_unix.h" #include "ios.h" @@ -100,6 +100,8 @@ public: virtual Error get_dynamic_library_symbol_handle(void *p_library_handle, const String p_name, void *&p_symbol_handle, bool p_optional = false) override; virtual String get_name() const override; + virtual String get_distribution_name() const override; + virtual String get_version() const override; virtual String get_model_name() const override; virtual Error shell_open(String p_uri) override; @@ -122,6 +124,6 @@ public: void on_focus_in(); }; -#endif // OS_IOS_H +#endif // IOS_ENABLED #endif // OS_IOS_H diff --git a/platform/ios/os_ios.mm b/platform/ios/os_ios.mm index b9d186f355..a674498620 100644 --- a/platform/ios/os_ios.mm +++ b/platform/ios/os_ios.mm @@ -240,6 +240,15 @@ String OS_IOS::get_name() const { return "iOS"; } +String OS_IOS::get_distribution_name() const { + return get_name(); +} + +String OS_IOS::get_version() const { + NSOperatingSystemVersion ver = [NSProcessInfo processInfo].operatingSystemVersion; + return vformat("%d.%d.%d", (int64_t)ver.majorVersion, (int64_t)ver.minorVersion, (int64_t)ver.patchVersion); +} + String OS_IOS::get_model_name() const { String model = ios->get_model(); if (model != "") { diff --git a/platform/linuxbsd/detect.py b/platform/linuxbsd/detect.py index 36644d5f29..dfde0d249c 100644 --- a/platform/linuxbsd/detect.py +++ b/platform/linuxbsd/detect.py @@ -4,6 +4,11 @@ import sys from methods import get_compiler_version, using_gcc from platform_methods import detect_arch +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from SCons import Environment + def is_active(): return True @@ -44,8 +49,6 @@ def get_opts(): BoolVariable("fontconfig", "Detect and use fontconfig for system fonts support", True), BoolVariable("udev", "Use udev for gamepad connection callbacks", True), BoolVariable("x11", "Enable X11 display", True), - BoolVariable("debug_symbols", "Add debugging symbols to release/release_debug builds", True), - BoolVariable("separate_debug_symbols", "Create a separate file containing debugging symbols", False), BoolVariable("touch", "Enable touch events", True), BoolVariable("execinfo", "Use libexecinfo on systems where glibc is not available", False), ] @@ -57,7 +60,7 @@ def get_flags(): ] -def configure(env): +def configure(env: "Environment"): # Validate arch. supported_arches = ["x86_32", "x86_64", "arm32", "arm64", "rv64", "ppc32", "ppc64"] if env["arch"] not in supported_arches: @@ -69,26 +72,9 @@ def configure(env): ## Build type - if env["target"] == "release": - if env["optimize"] == "speed": # optimize for speed (default) - env.Prepend(CCFLAGS=["-O3"]) - elif env["optimize"] == "size": # optimize for size - env.Prepend(CCFLAGS=["-Os"]) - - if env["debug_symbols"]: - env.Prepend(CCFLAGS=["-g2"]) - - elif env["target"] == "release_debug": - if env["optimize"] == "speed": # optimize for speed (default) - env.Prepend(CCFLAGS=["-O2"]) - elif env["optimize"] == "size": # optimize for size - env.Prepend(CCFLAGS=["-Os"]) - - if env["debug_symbols"]: - env.Prepend(CCFLAGS=["-g2"]) - - elif env["target"] == "debug": - env.Prepend(CCFLAGS=["-g3"]) + if env.dev_build: + # This is needed for our crash handler to work properly. + # gdb works fine without it though, so maybe our crash handler could too. env.Append(LINKFLAGS=["-rdynamic"]) # CPU architecture flags. @@ -171,6 +157,10 @@ def configure(env): env.Append(LINKFLAGS=["-fsanitize=memory"]) # LTO + + if env["lto"] == "auto": # Full LTO for production. + env["lto"] = "full" + if env["lto"] != "none": if env["lto"] == "thin": if not env["use_llvm"]: @@ -379,7 +369,7 @@ def configure(env): if env["execinfo"]: env.Append(LIBS=["execinfo"]) - if not env["tools"]: + if not env.editor_build: import subprocess import re diff --git a/platform/linuxbsd/detect_prime_x11.h b/platform/linuxbsd/detect_prime_x11.h index 21ebaead32..7eb7064cc5 100644 --- a/platform/linuxbsd/detect_prime_x11.h +++ b/platform/linuxbsd/detect_prime_x11.h @@ -28,11 +28,13 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifdef X11_ENABLED -#if defined(GLES3_ENABLED) +#ifndef DETECT_PRIME_X11_H +#define DETECT_PRIME_X11_H + +#if defined(X11_ENABLED) && defined(GLES3_ENABLED) int detect_prime(); -#endif +#endif // X11_ENABLED && GLES3_ENABLED #endif // DETECT_PRIME_X11_H diff --git a/platform/linuxbsd/display_server_x11.cpp b/platform/linuxbsd/display_server_x11.cpp index 0236e134fb..1ef1deb971 100644 --- a/platform/linuxbsd/display_server_x11.cpp +++ b/platform/linuxbsd/display_server_x11.cpp @@ -49,10 +49,14 @@ #include "drivers/gles3/rasterizer_gles3.h" #endif +#include <dlfcn.h> #include <limits.h> #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <unistd.h> #include <X11/Xatom.h> #include <X11/Xutil.h> @@ -66,17 +70,6 @@ #define _NET_WM_STATE_REMOVE 0L // remove/unset property #define _NET_WM_STATE_ADD 1L // add/set property -#include <dlfcn.h> -#include <fcntl.h> -#include <sys/stat.h> -#include <sys/types.h> -#include <unistd.h> - -//stupid linux.h -#ifdef KEY_TAB -#undef KEY_TAB -#endif - #undef CursorShape #include <X11/XKBlib.h> @@ -397,7 +390,10 @@ void DisplayServerX11::mouse_set_mode(MouseMode p_mode) { if (mouse_mode == MOUSE_MODE_CAPTURED || mouse_mode == MOUSE_MODE_CONFINED || mouse_mode == MOUSE_MODE_CONFINED_HIDDEN) { //flush pending motion events _flush_mouse_motion(); - WindowID window_id = windows.has(last_focused_window) ? last_focused_window : MAIN_WINDOW_ID; + WindowID window_id = _get_focused_window_or_popup(); + if (!windows.has(window_id)) { + window_id = MAIN_WINDOW_ID; + } WindowData &window = windows[window_id]; if (XGrabPointer( @@ -433,7 +429,11 @@ void DisplayServerX11::warp_mouse(const Point2i &p_position) { if (mouse_mode == MOUSE_MODE_CAPTURED) { last_mouse_pos = p_position; } else { - WindowID window_id = windows.has(last_focused_window) ? last_focused_window : MAIN_WINDOW_ID; + WindowID window_id = _get_focused_window_or_popup(); + if (!windows.has(window_id)) { + window_id = MAIN_WINDOW_ID; + } + XWarpPointer(x11_display, None, windows[window_id].x11_window, 0, 0, 0, 0, (int)p_position.x, (int)p_position.y); } @@ -3135,6 +3135,11 @@ void DisplayServerX11::_window_changed(XEvent *event) { return; } + // Query display server about a possible new window state. + wd.fullscreen = _window_fullscreen_check(window_id); + wd.minimized = _window_minimize_check(window_id); + wd.maximized = _window_maximize_check(window_id, "_NET_WM_STATE"); + { //the position in xconfigure is not useful here, obtain it manually int x, y; @@ -3181,6 +3186,15 @@ void DisplayServerX11::_window_changed(XEvent *event) { } } +DisplayServer::WindowID DisplayServerX11::_get_focused_window_or_popup() const { + const List<WindowID>::Element *E = popup_list.back(); + if (E) { + return E->get(); + } + + return last_focused_window; +} + void DisplayServerX11::_dispatch_input_events(const Ref<InputEvent> &p_event) { static_cast<DisplayServerX11 *>(get_singleton())->_dispatch_input_event(p_event); } @@ -3936,7 +3950,11 @@ void DisplayServerX11::process_events() { // The X11 API requires filtering one-by-one through the motion // notify events, in order to figure out which event is the one // generated by warping the mouse pointer. - WindowID focused_window_id = windows.has(last_focused_window) ? last_focused_window : MAIN_WINDOW_ID; + WindowID focused_window_id = _get_focused_window_or_popup(); + if (!windows.has(focused_window_id)) { + focused_window_id = MAIN_WINDOW_ID; + } + while (true) { if (mouse_mode == MOUSE_MODE_CAPTURED && event.xmotion.x == windows[focused_window_id].size.width / 2 && event.xmotion.y == windows[focused_window_id].size.height / 2) { //this is likely the warp event since it was warped here diff --git a/platform/linuxbsd/display_server_x11.h b/platform/linuxbsd/display_server_x11.h index ea03b2328c..a5fa7613bc 100644 --- a/platform/linuxbsd/display_server_x11.h +++ b/platform/linuxbsd/display_server_x11.h @@ -284,6 +284,8 @@ class DisplayServerX11 : public DisplayServer { Context context = CONTEXT_ENGINE; + WindowID _get_focused_window_or_popup() const; + void _send_window_event(const WindowData &wd, WindowEvent p_event); static void _dispatch_input_events(const Ref<InputEvent> &p_event); void _dispatch_input_event(const Ref<InputEvent> &p_event); diff --git a/platform/linuxbsd/gl_manager_x11.cpp b/platform/linuxbsd/gl_manager_x11.cpp index 04c1df71fb..f586c57dda 100644 --- a/platform/linuxbsd/gl_manager_x11.cpp +++ b/platform/linuxbsd/gl_manager_x11.cpp @@ -256,7 +256,11 @@ void GLManager_X11::release_current() { if (!_current_window) { return; } - glXMakeCurrent(_x_windisp.x11_display, None, nullptr); + + if (!glXMakeCurrent(_x_windisp.x11_display, None, nullptr)) { + ERR_PRINT("glXMakeCurrent failed"); + } + _current_window = nullptr; } void GLManager_X11::window_make_current(DisplayServer::WindowID p_window_id) { @@ -276,7 +280,9 @@ void GLManager_X11::window_make_current(DisplayServer::WindowID p_window_id) { const GLDisplay &disp = get_display(win.gldisplay_id); - glXMakeCurrent(disp.x11_display, win.x11_window, disp.context->glx_context); + if (!glXMakeCurrent(disp.x11_display, win.x11_window, disp.context->glx_context)) { + ERR_PRINT("glXMakeCurrent failed"); + } _internal_set_current_window(&win); } @@ -290,13 +296,12 @@ void GLManager_X11::make_current() { return; } const GLDisplay &disp = get_current_display(); - glXMakeCurrent(_x_windisp.x11_display, _x_windisp.x11_window, disp.context->glx_context); + if (!glXMakeCurrent(_x_windisp.x11_display, _x_windisp.x11_window, disp.context->glx_context)) { + ERR_PRINT("glXMakeCurrent failed"); + } } void GLManager_X11::swap_buffers() { - // NO NEED TO CALL SWAP BUFFERS for each window... - // see https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glXSwapBuffers.xml - if (!_current_window) { return; } @@ -305,7 +310,7 @@ void GLManager_X11::swap_buffers() { return; } - // On X11, when enabled, transparancy is always active, so clear alpha manually. + // On X11, when enabled, transparency is always active, so clear alpha manually. if (OS::get_singleton()->is_layered_allowed()) { if (!DisplayServer::get_singleton()->window_get_flag(DisplayServer::WINDOW_FLAG_TRANSPARENT, _current_window->window_id)) { glColorMask(false, false, false, true); @@ -315,13 +320,6 @@ void GLManager_X11::swap_buffers() { } } - // print_line("\tswap_buffers"); - - // only for debugging without drawing anything - // glClearColor(Math::randf(), 0, 1, 1); - //glClear(GL_COLOR_BUFFER_BIT); - - //const GLDisplay &disp = get_current_display(); glXSwapBuffers(_x_windisp.x11_display, _x_windisp.x11_window); } diff --git a/platform/linuxbsd/key_mapping_x11.cpp b/platform/linuxbsd/key_mapping_x11.cpp index 047ee74671..f774c99d99 100644 --- a/platform/linuxbsd/key_mapping_x11.cpp +++ b/platform/linuxbsd/key_mapping_x11.cpp @@ -108,17 +108,21 @@ static _XTranslatePair _xkeysym_to_keycode[] = { { XK_KP_7, Key::KP_7 }, { XK_KP_8, Key::KP_8 }, { XK_KP_9, Key::KP_9 }, - // same but with numlock - { XK_KP_Insert, Key::KP_0 }, - { XK_KP_End, Key::KP_1 }, - { XK_KP_Down, Key::KP_2 }, - { XK_KP_Page_Down, Key::KP_3 }, - { XK_KP_Left, Key::KP_4 }, - { XK_KP_Begin, Key::KP_5 }, - { XK_KP_Right, Key::KP_6 }, - { XK_KP_Home, Key::KP_7 }, - { XK_KP_Up, Key::KP_8 }, - { XK_KP_Page_Up, Key::KP_9 }, + // same keys but with numlock off + { XK_KP_Insert, Key::INSERT }, + { XK_KP_End, Key::END }, + { XK_KP_Down, Key::DOWN }, + { XK_KP_Page_Down, Key::PAGEDOWN }, + { XK_KP_Left, Key::LEFT }, + // X11 documents this (numpad 5) as "begin of line" but no toolkit + // seems to interpret it this way. + // On Windows this is emitting Key::Clear so for consistency it + // will be mapped to Key::Clear + { XK_KP_Begin, Key::CLEAR }, + { XK_KP_Right, Key::RIGHT }, + { XK_KP_Home, Key::HOME }, + { XK_KP_Up, Key::UP }, + { XK_KP_Page_Up, Key::PAGEUP }, { XK_F1, Key::F1 }, { XK_F2, Key::F2 }, { XK_F3, Key::F3 }, diff --git a/platform/linuxbsd/os_linuxbsd.cpp b/platform/linuxbsd/os_linuxbsd.cpp index 61faf3061c..4cbd9722ad 100644 --- a/platform/linuxbsd/os_linuxbsd.cpp +++ b/platform/linuxbsd/os_linuxbsd.cpp @@ -42,14 +42,13 @@ #include <mntent.h> #endif +#include <dlfcn.h> #include <stdio.h> #include <stdlib.h> #include <string.h> - -#include <dlfcn.h> -#include <fcntl.h> #include <sys/stat.h> #include <sys/types.h> +#include <sys/utsname.h> #include <unistd.h> #ifdef FONTCONFIG_ENABLED @@ -205,6 +204,42 @@ String OS_LinuxBSD::get_name() const { #endif } +String OS_LinuxBSD::get_systemd_os_release_info_value(const String &key) const { + static String info; + if (info.is_empty()) { + Ref<FileAccess> f = FileAccess::open("/etc/os-release", FileAccess::READ); + if (f.is_valid()) { + while (!f->eof_reached()) { + const String line = f->get_line(); + if (line.find(key) != -1) { + return line.split("=")[1].strip_edges(); + } + } + } + } + return info; +} + +String OS_LinuxBSD::get_distribution_name() const { + static String systemd_name = get_systemd_os_release_info_value("NAME"); // returns a value for systemd users, otherwise an empty string. + if (!systemd_name.is_empty()) { + return systemd_name; + } + struct utsname uts; // returns a decent value for BSD family. + uname(&uts); + return uts.sysname; +} + +String OS_LinuxBSD::get_version() const { + static String systemd_version = get_systemd_os_release_info_value("VERSION"); // returns a value for systemd users, otherwise an empty string. + if (!systemd_version.is_empty()) { + return systemd_version; + } + struct utsname uts; // returns a decent value for BSD family. + uname(&uts); + return uts.version; +} + Error OS_LinuxBSD::shell_open(String p_uri) { Error ok; int err_code; @@ -686,10 +721,9 @@ Error OS_LinuxBSD::move_to_trash(const String &p_path) { String renamed_path = path.get_base_dir() + "/" + file_name; // Generates the .trashinfo file - OS::Date date = OS::get_singleton()->get_date(false); - OS::Time time = OS::get_singleton()->get_time(false); - String timestamp = vformat("%04d-%02d-%02dT%02d:%02d:", date.year, (int)date.month, date.day, time.hour, time.minute); - timestamp = vformat("%s%02d", timestamp, time.second); // vformat only supports up to 6 arguments. + OS::DateTime dt = OS::get_singleton()->get_datetime(false); + String timestamp = vformat("%04d-%02d-%02dT%02d:%02d:", dt.year, (int)dt.month, dt.day, dt.hour, dt.minute); + timestamp = vformat("%s%02d", timestamp, dt.second); // vformat only supports up to 6 arguments. String trash_info = "[Trash Info]\nPath=" + path.uri_encode() + "\nDeletionDate=" + timestamp + "\n"; { Error err; diff --git a/platform/linuxbsd/os_linuxbsd.h b/platform/linuxbsd/os_linuxbsd.h index d5b2321316..722d83ba19 100644 --- a/platform/linuxbsd/os_linuxbsd.h +++ b/platform/linuxbsd/os_linuxbsd.h @@ -67,6 +67,8 @@ class OS_LinuxBSD : public OS_Unix { MainLoop *main_loop = nullptr; + String get_systemd_os_release_info_value(const String &key) const; + protected: virtual void initialize() override; virtual void finalize() override; @@ -77,6 +79,8 @@ protected: public: virtual String get_name() const override; + virtual String get_distribution_name() const override; + virtual String get_version() const override; virtual MainLoop *get_main_loop() const override; diff --git a/platform/macos/SCsub b/platform/macos/SCsub index bbd461fba9..7ffb80f70b 100644 --- a/platform/macos/SCsub +++ b/platform/macos/SCsub @@ -12,6 +12,7 @@ files = [ "crash_handler_macos.mm", "macos_terminal_logger.mm", "display_server_macos.mm", + "godot_button_view.mm", "godot_content_view.mm", "godot_window_delegate.mm", "godot_window.mm", diff --git a/platform/macos/detect.py b/platform/macos/detect.py index bcf4776609..511286d52b 100644 --- a/platform/macos/detect.py +++ b/platform/macos/detect.py @@ -3,6 +3,11 @@ import sys from methods import detect_darwin_sdk_path from platform_methods import detect_arch +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from SCons import Environment + def is_active(): return True @@ -27,8 +32,6 @@ def get_opts(): ("MACOS_SDK_PATH", "Path to the macOS SDK", ""), ("vulkan_sdk_path", "Path to the Vulkan SDK", ""), EnumVariable("macports_clang", "Build using Clang from MacPorts", "no", ("no", "5.0", "devel")), - BoolVariable("debug_symbols", "Add debugging symbols to release/release_debug builds", True), - BoolVariable("separate_debug_symbols", "Create a separate file containing debugging symbols", False), BoolVariable("use_ubsan", "Use LLVM/GCC compiler undefined behavior sanitizer (UBSAN)", False), BoolVariable("use_asan", "Use LLVM/GCC compiler address sanitizer (ASAN)", False), BoolVariable("use_tsan", "Use LLVM/GCC compiler thread sanitizer (TSAN)", False), @@ -40,9 +43,6 @@ def get_flags(): return [ ("arch", detect_arch()), ("use_volk", False), - # Benefits of LTO for macOS (size, performance) haven't been clearly established yet. - # So for now we override the default value which may be set when using `production=yes`. - ("lto", "none"), ] @@ -77,7 +77,7 @@ def get_mvk_sdk_path(): return os.path.join(os.path.join(dirname, ver_file), "MoltenVK/MoltenVK.xcframework/macos-arm64_x86_64/") -def configure(env): +def configure(env: "Environment"): # Validate arch. supported_arches = ["x86_64", "arm64"] if env["arch"] not in supported_arches: @@ -89,27 +89,10 @@ def configure(env): ## Build type - if env["target"] == "release": - if env["optimize"] == "speed": # optimize for speed (default) - env.Prepend(CCFLAGS=["-O3", "-fomit-frame-pointer", "-ftree-vectorize"]) - elif env["optimize"] == "size": # optimize for size - env.Prepend(CCFLAGS=["-Os", "-ftree-vectorize"]) + if env["target"] == "template_release": if env["arch"] != "arm64": env.Prepend(CCFLAGS=["-msse2"]) - - if env["debug_symbols"]: - env.Prepend(CCFLAGS=["-g2"]) - - elif env["target"] == "release_debug": - if env["optimize"] == "speed": # optimize for speed (default) - env.Prepend(CCFLAGS=["-O2"]) - elif env["optimize"] == "size": # optimize for size - env.Prepend(CCFLAGS=["-Os"]) - if env["debug_symbols"]: - env.Prepend(CCFLAGS=["-g2"]) - - elif env["target"] == "debug": - env.Prepend(CCFLAGS=["-g3"]) + elif env.dev_build: env.Prepend(LINKFLAGS=["-Xlinker", "-no_deduplicate"]) ## Compiler configuration @@ -170,6 +153,10 @@ def configure(env): env["AS"] = basecmd + "as" # LTO + + if env["lto"] == "auto": # LTO benefits for macOS (size, performance) haven't been clearly established yet. + env["lto"] = "none" + if env["lto"] != "none": if env["lto"] == "thin": env.Append(CCFLAGS=["-flto=thin"]) @@ -178,6 +165,8 @@ def configure(env): env.Append(CCFLAGS=["-flto"]) env.Append(LINKFLAGS=["-flto"]) + # Sanitizers + if env["use_ubsan"] or env["use_asan"] or env["use_tsan"]: env.extra_suffix += ".san" env.Append(CCFLAGS=["-DSANITIZERS_ENABLED"]) diff --git a/platform/macos/dir_access_macos.h b/platform/macos/dir_access_macos.h index 920e69ef3e..c76b2835e8 100644 --- a/platform/macos/dir_access_macos.h +++ b/platform/macos/dir_access_macos.h @@ -31,16 +31,16 @@ #ifndef DIR_ACCESS_MACOS_H #define DIR_ACCESS_MACOS_H -#if defined(UNIX_ENABLED) || defined(LIBC_FILEIO_ENABLED) +#if defined(UNIX_ENABLED) + +#include "core/io/dir_access.h" +#include "drivers/unix/dir_access_unix.h" #include <dirent.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> -#include "core/io/dir_access.h" -#include "drivers/unix/dir_access_unix.h" - class DirAccessMacOS : public DirAccessUnix { protected: virtual String fix_unicode_name(const char *p_name) const override; @@ -51,6 +51,6 @@ protected: virtual bool is_hidden(const String &p_name) override; }; -#endif // UNIX ENABLED || LIBC_FILEIO_ENABLED +#endif // UNIX ENABLED #endif // DIR_ACCESS_MACOS_H diff --git a/platform/macos/dir_access_macos.mm b/platform/macos/dir_access_macos.mm index 3373cada1f..22ebac2db4 100644 --- a/platform/macos/dir_access_macos.mm +++ b/platform/macos/dir_access_macos.mm @@ -30,7 +30,7 @@ #include "dir_access_macos.h" -#if defined(UNIX_ENABLED) || defined(LIBC_FILEIO_ENABLED) +#if defined(UNIX_ENABLED) #include <errno.h> @@ -78,4 +78,4 @@ bool DirAccessMacOS::is_hidden(const String &p_name) { return [hidden boolValue]; } -#endif // UNIX_ENABLED || LIBC_FILEIO_ENABLED +#endif // UNIX_ENABLED diff --git a/platform/macos/display_server_macos.h b/platform/macos/display_server_macos.h index 769cba2de5..e72273a681 100644 --- a/platform/macos/display_server_macos.h +++ b/platform/macos/display_server_macos.h @@ -76,6 +76,7 @@ public: id window_delegate; id window_object; id window_view; + id window_button_view; Vector<Vector2> mpath; @@ -84,6 +85,9 @@ public: Size2i min_size; Size2i max_size; Size2i size; + Vector2i wb_offset = Vector2i(14, 14); + + NSRect last_frame_rect; bool im_active = false; Size2i im_position; @@ -175,6 +179,12 @@ private: IOPMAssertionID screen_keep_on_assertion = kIOPMNullAssertionID; + struct MenuCall { + Variant tag; + Callable callback; + }; + Vector<MenuCall> deferred_menu_calls; + const NSMenu *_get_menu_root(const String &p_menu_root) const; NSMenu *_get_menu_root(const String &p_menu_root); @@ -187,6 +197,8 @@ private: Point2i _get_native_screen_position(int p_screen) const; static void _displays_arrangement_changed(CGDirectDisplayID display_id, CGDisplayChangeSummaryFlags flags, void *user_info); + WindowID _get_focused_window_or_popup() const; + static void _dispatch_input_events(const Ref<InputEvent> &p_event); void _dispatch_input_event(const Ref<InputEvent> &p_event); void _push_input(const Ref<InputEvent> &p_event); @@ -224,6 +236,7 @@ public: void window_update(WindowID p_window); void window_destroy(WindowID p_window); void window_resize(WindowID p_window, int p_width, int p_height); + void window_set_custom_window_buttons(WindowData &p_wd, bool p_enabled); virtual bool has_feature(Feature p_feature) const override; virtual String get_name() const override; @@ -387,6 +400,7 @@ public: virtual bool window_maximize_on_title_dbl_click() const override; virtual bool window_minimize_on_title_dbl_click() const override; + virtual void window_set_window_buttons_offset(const Vector2i &p_offset, WindowID p_window = MAIN_WINDOW_ID) override; virtual Vector2i window_get_safe_title_margins(WindowID p_window = MAIN_WINDOW_ID) const override; virtual Point2i ime_get_selection() const override; diff --git a/platform/macos/display_server_macos.mm b/platform/macos/display_server_macos.mm index b009007d73..f980129081 100644 --- a/platform/macos/display_server_macos.mm +++ b/platform/macos/display_server_macos.mm @@ -30,6 +30,7 @@ #include "display_server_macos.h" +#include "godot_button_view.h" #include "godot_content_view.h" #include "godot_menu_delegate.h" #include "godot_menu_item.h" @@ -166,6 +167,7 @@ DisplayServerMacOS::WindowID DisplayServerMacOS::_create_window(WindowMode p_mod ERR_FAIL_COND_V_MSG(err != OK, INVALID_WINDOW_ID, "Can't create an OpenGL context"); } #endif + [wd.window_view updateLayerDelegate]; id = window_id_counter++; windows[id] = wd; } @@ -316,6 +318,15 @@ void DisplayServerMacOS::_displays_arrangement_changed(CGDirectDisplayID display } } +DisplayServer::WindowID DisplayServerMacOS::_get_focused_window_or_popup() const { + const List<WindowID>::Element *E = popup_list.back(); + if (E) { + return E->get(); + } + + return last_focused_window; +} + void DisplayServerMacOS::_dispatch_input_events(const Ref<InputEvent> &p_event) { ((DisplayServerMacOS *)(get_singleton()))->_dispatch_input_event(p_event); } @@ -554,11 +565,11 @@ void DisplayServerMacOS::menu_callback(id p_sender) { } if (value->callback != Callable()) { - Variant tag = value->meta; - Variant *tagp = &tag; - Variant ret; - Callable::CallError ce; - value->callback.callp((const Variant **)&tagp, 1, ret, ce); + MenuCall mc; + mc.tag = value->meta; + mc.callback = value->callback; + deferred_menu_calls.push_back(mc); + // Do not run callback from here! If it is opening a new window or calling process_events, it will corrupt OS event queue and crash. } } } @@ -575,7 +586,7 @@ void DisplayServerMacOS::send_event(NSEvent *p_event) { // Special case handling of command-period, which is traditionally a special // shortcut in macOS and doesn't arrive at our regular keyDown handler. if ([p_event type] == NSEventTypeKeyDown) { - if (([p_event modifierFlags] & NSEventModifierFlagCommand) && [p_event keyCode] == 0x2f) { + if ((([p_event modifierFlags] & NSEventModifierFlagDeviceIndependentFlagsMask) == NSEventModifierFlagCommand) && [p_event keyCode] == 0x2f) { Ref<InputEventKey> k; k.instantiate(); @@ -1827,7 +1838,10 @@ void DisplayServerMacOS::mouse_set_mode(MouseMode p_mode) { return; } - WindowID window_id = windows.has(last_focused_window) ? last_focused_window : MAIN_WINDOW_ID; + WindowID window_id = _get_focused_window_or_popup(); + if (!windows.has(window_id)) { + window_id = MAIN_WINDOW_ID; + } WindowData &wd = windows[window_id]; if (p_mode == MOUSE_MODE_CAPTURED) { // Apple Docs state that the display parameter is not used. @@ -1942,7 +1956,10 @@ void DisplayServerMacOS::warp_mouse(const Point2i &p_position) { _THREAD_SAFE_METHOD_ if (mouse_mode != MOUSE_MODE_CAPTURED) { - WindowID window_id = windows.has(last_focused_window) ? last_focused_window : MAIN_WINDOW_ID; + WindowID window_id = _get_focused_window_or_popup(); + if (!windows.has(window_id)) { + window_id = MAIN_WINDOW_ID; + } WindowData &wd = windows[window_id]; // Local point in window coords. @@ -2196,7 +2213,9 @@ void DisplayServerMacOS::show_window(WindowID p_id) { WindowData &wd = windows[p_id]; popup_open(p_id); - if (wd.no_focus || wd.is_popup) { + if ([wd.window_object isMiniaturized]) { + return; + } else if (wd.no_focus || wd.is_popup) { [wd.window_object orderFront:nil]; } else { [wd.window_object makeKeyAndOrderFront:nil]; @@ -2353,6 +2372,10 @@ void DisplayServerMacOS::window_set_position(const Point2i &p_position, WindowID ERR_FAIL_COND(!windows.has(p_window)); WindowData &wd = windows[p_window]; + if ([wd.window_object isZoomed]) { + return; + } + Point2i position = p_position; // OS X native y-coordinate relative to _get_screens_origin() is negative, // Godot passes a positive value. @@ -2477,6 +2500,10 @@ void DisplayServerMacOS::window_set_size(const Size2i p_size, WindowID p_window) ERR_FAIL_COND(!windows.has(p_window)); WindowData &wd = windows[p_window]; + if ([wd.window_object isZoomed]) { + return; + } + Size2i size = p_size / screen_get_max_scale(); NSPoint top_left; @@ -2623,27 +2650,59 @@ bool DisplayServerMacOS::window_minimize_on_title_dbl_click() const { return false; } +void DisplayServerMacOS::window_set_window_buttons_offset(const Vector2i &p_offset, WindowID p_window) { + _THREAD_SAFE_METHOD_ + + ERR_FAIL_COND(!windows.has(p_window)); + WindowData &wd = windows[p_window]; + wd.wb_offset = p_offset; +} + Vector2i DisplayServerMacOS::window_get_safe_title_margins(WindowID p_window) const { _THREAD_SAFE_METHOD_ ERR_FAIL_COND_V(!windows.has(p_window), Vector2i()); const WindowData &wd = windows[p_window]; - float max_x = 0.f; - NSButton *cb = [wd.window_object standardWindowButton:NSWindowCloseButton]; - if (cb) { - max_x = MAX(max_x, [cb frame].origin.x + [cb frame].size.width); + if (!wd.window_button_view) { + return Vector2i(); } - NSButton *mb = [wd.window_object standardWindowButton:NSWindowMiniaturizeButton]; - if (mb) { - max_x = MAX(max_x, [mb frame].origin.x + [mb frame].size.width); + + float max_x = wd.wb_offset.x + [wd.window_button_view frame].size.width; + + if ([wd.window_object windowTitlebarLayoutDirection] == NSUserInterfaceLayoutDirectionRightToLeft) { + return Vector2i(0, max_x * screen_get_max_scale()); + } else { + return Vector2i(max_x * screen_get_max_scale(), 0); } - NSButton *zb = [wd.window_object standardWindowButton:NSWindowZoomButton]; - if (zb) { - max_x = MAX(max_x, [zb frame].origin.x + [zb frame].size.width); +} + +void DisplayServerMacOS::window_set_custom_window_buttons(WindowData &p_wd, bool p_enabled) { + if (p_wd.window_button_view) { + [p_wd.window_button_view removeFromSuperview]; + p_wd.window_button_view = nil; } + if (p_enabled) { + float cb_frame = NSMinX([[p_wd.window_object standardWindowButton:NSWindowCloseButton] frame]); + float mb_frame = NSMinX([[p_wd.window_object standardWindowButton:NSWindowMiniaturizeButton] frame]); + bool is_rtl = ([p_wd.window_object windowTitlebarLayoutDirection] == NSUserInterfaceLayoutDirectionRightToLeft); + + float window_buttons_spacing = (is_rtl) ? (cb_frame - mb_frame) : (mb_frame - cb_frame); + + [p_wd.window_object setTitleVisibility:NSWindowTitleHidden]; + [[p_wd.window_object standardWindowButton:NSWindowZoomButton] setHidden:YES]; + [[p_wd.window_object standardWindowButton:NSWindowMiniaturizeButton] setHidden:YES]; + [[p_wd.window_object standardWindowButton:NSWindowCloseButton] setHidden:YES]; - return Vector2i(max_x * screen_get_max_scale(), 0); + p_wd.window_button_view = [[GodotButtonView alloc] initWithFrame:NSZeroRect]; + [p_wd.window_button_view initButtons:window_buttons_spacing offset:NSMakePoint(p_wd.wb_offset.x, p_wd.wb_offset.y) rtl:is_rtl]; + [p_wd.window_view addSubview:p_wd.window_button_view]; + } else { + [p_wd.window_object setTitleVisibility:NSWindowTitleVisible]; + [[p_wd.window_object standardWindowButton:NSWindowZoomButton] setHidden:NO]; + [[p_wd.window_object standardWindowButton:NSWindowMiniaturizeButton] setHidden:NO]; + [[p_wd.window_object standardWindowButton:NSWindowCloseButton] setHidden:NO]; + } } void DisplayServerMacOS::window_set_flag(WindowFlags p_flag, bool p_enabled, WindowID p_window) { @@ -2668,14 +2727,21 @@ void DisplayServerMacOS::window_set_flag(WindowFlags p_flag, bool p_enabled, Win NSRect rect = [wd.window_object frame]; if (p_enabled) { [wd.window_object setTitlebarAppearsTransparent:YES]; - [wd.window_object setTitleVisibility:NSWindowTitleHidden]; [wd.window_object setStyleMask:[wd.window_object styleMask] | NSWindowStyleMaskFullSizeContentView]; + + if (!wd.fullscreen) { + window_set_custom_window_buttons(wd, true); + } } else { [wd.window_object setTitlebarAppearsTransparent:NO]; - [wd.window_object setTitleVisibility:NSWindowTitleVisible]; [wd.window_object setStyleMask:[wd.window_object styleMask] & ~NSWindowStyleMaskFullSizeContentView]; + + if (!wd.fullscreen) { + window_set_custom_window_buttons(wd, false); + } } [wd.window_object setFrame:rect display:YES]; + send_window_event(wd, DisplayServerMacOS::WINDOW_EVENT_TITLEBAR_CHANGE); } break; case WINDOW_FLAG_BORDERLESS: { // OrderOut prevents a lose focus bug with the window. @@ -2695,7 +2761,9 @@ void DisplayServerMacOS::window_set_flag(WindowFlags p_flag, bool p_enabled, Win } _update_window_style(wd); if ([wd.window_object isVisible]) { - if (wd.no_focus || wd.is_popup) { + if ([wd.window_object isMiniaturized]) { + return; + } else if (wd.no_focus || wd.is_popup) { [wd.window_object orderFront:nil]; } else { [wd.window_object makeKeyAndOrderFront:nil]; @@ -3212,6 +3280,16 @@ void DisplayServerMacOS::process_events() { [NSApp sendEvent:event]; } + // Process "menu_callback"s. + for (MenuCall &E : deferred_menu_calls) { + Variant tag = E.tag; + Variant *tagp = &tag; + Variant ret; + Callable::CallError ce; + E.callback.callp((const Variant **)&tagp, 1, ret, ce); + } + deferred_menu_calls.clear(); + if (!drop_events) { _process_key_events(); Input::get_singleton()->flush_buffered_events(); @@ -3536,7 +3614,7 @@ DisplayServerMacOS::DisplayServerMacOS(const String &p_rendering_driver, WindowM [apple_menu addItem:[NSMenuItem separatorItem]]; - title = [NSString stringWithFormat:NSLocalizedString(@"\t\tQuit %@", nil), nsappname]; + title = [NSString stringWithFormat:NSLocalizedString(@"Quit %@", nil), nsappname]; [apple_menu addItemWithTitle:title action:@selector(terminate:) keyEquivalent:@"q"]; // Add items to the menu bar. diff --git a/platform/macos/export/codesign.h b/platform/macos/export/codesign.h index fea7b117d0..01e97bca81 100644 --- a/platform/macos/export/codesign.h +++ b/platform/macos/export/codesign.h @@ -28,6 +28,9 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ +#ifndef MACOS_CODESIGN_H +#define MACOS_CODESIGN_H + // macOS code signature creation utility. // // Current implementation has the following limitation: @@ -38,9 +41,6 @@ // - Requirements code generator is not implemented (only hard-coded requirements for the ad-hoc signing is supported). // - RFC5652/CMS blob generation is not implemented, supports ad-hoc signing only. -#ifndef MACOS_CODESIGN_H -#define MACOS_CODESIGN_H - #include "core/crypto/crypto_core.h" #include "core/io/dir_access.h" #include "core/io/file_access.h" diff --git a/platform/macos/export/export.cpp b/platform/macos/export/export.cpp index f219616df4..5f9cf22ccf 100644 --- a/platform/macos/export/export.cpp +++ b/platform/macos/export/export.cpp @@ -33,12 +33,14 @@ #include "export_plugin.h" void register_macos_exporter() { +#ifndef ANDROID_ENABLED EDITOR_DEF("export/macos/rcodesign", ""); #ifdef WINDOWS_ENABLED EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/macos/rcodesign", PROPERTY_HINT_GLOBAL_FILE, "*.exe")); #else EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/macos/rcodesign", PROPERTY_HINT_GLOBAL_FILE)); #endif +#endif Ref<EditorExportPlatformMacOS> platform; platform.instantiate(); diff --git a/platform/macos/export/export_plugin.cpp b/platform/macos/export/export_plugin.cpp index 50104aced5..070830c486 100644 --- a/platform/macos/export/export_plugin.cpp +++ b/platform/macos/export/export_plugin.cpp @@ -1641,16 +1641,15 @@ void EditorExportPlatformMacOS::_zip_folder_recursive(zipFile &p_zip, const Stri continue; } if (da->is_link(f)) { - OS::Time time = OS::get_singleton()->get_time(); - OS::Date date = OS::get_singleton()->get_date(); + OS::DateTime dt = OS::get_singleton()->get_datetime(); zip_fileinfo zipfi; - zipfi.tmz_date.tm_hour = time.hour; - zipfi.tmz_date.tm_mday = date.day; - zipfi.tmz_date.tm_min = time.minute; - zipfi.tmz_date.tm_mon = date.month - 1; // Note: "tm" month range - 0..11, Godot month range - 1..12, https://www.cplusplus.com/reference/ctime/tm/ - zipfi.tmz_date.tm_sec = time.second; - zipfi.tmz_date.tm_year = date.year; + zipfi.tmz_date.tm_year = dt.year; + zipfi.tmz_date.tm_mon = dt.month - 1; // Note: "tm" month range - 0..11, Godot month range - 1..12, https://www.cplusplus.com/reference/ctime/tm/ + zipfi.tmz_date.tm_mday = dt.day; + zipfi.tmz_date.tm_hour = dt.hour; + zipfi.tmz_date.tm_min = dt.minute; + zipfi.tmz_date.tm_sec = dt.second; zipfi.dosDate = 0; // 0120000: symbolic link type // 0000755: permissions rwxr-xr-x @@ -1686,16 +1685,15 @@ void EditorExportPlatformMacOS::_zip_folder_recursive(zipFile &p_zip, const Stri } else { bool is_executable = (p_folder.ends_with("MacOS") && (f == p_pkg_name)) || p_folder.ends_with("Helpers") || f.ends_with(".command"); - OS::Time time = OS::get_singleton()->get_time(); - OS::Date date = OS::get_singleton()->get_date(); + OS::DateTime dt = OS::get_singleton()->get_datetime(); zip_fileinfo zipfi; - zipfi.tmz_date.tm_hour = time.hour; - zipfi.tmz_date.tm_mday = date.day; - zipfi.tmz_date.tm_min = time.minute; - zipfi.tmz_date.tm_mon = date.month - 1; // Note: "tm" month range - 0..11, Godot month range - 1..12, https://www.cplusplus.com/reference/ctime/tm/ - zipfi.tmz_date.tm_sec = time.second; - zipfi.tmz_date.tm_year = date.year; + zipfi.tmz_date.tm_year = dt.year; + zipfi.tmz_date.tm_mon = dt.month - 1; // Note: "tm" month range - 0..11, Godot month range - 1..12, https://www.cplusplus.com/reference/ctime/tm/ + zipfi.tmz_date.tm_mday = dt.day; + zipfi.tmz_date.tm_hour = dt.hour; + zipfi.tmz_date.tm_min = dt.minute; + zipfi.tmz_date.tm_sec = dt.second; zipfi.dosDate = 0; // 0100000: regular file type // 0000755: permissions rwxr-xr-x diff --git a/platform/macos/export/lipo.h b/platform/macos/export/lipo.h index 516ef99860..6378f9899c 100644 --- a/platform/macos/export/lipo.h +++ b/platform/macos/export/lipo.h @@ -28,11 +28,11 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -// Universal / Universal 2 fat binary file creator and extractor. - #ifndef MACOS_LIPO_H #define MACOS_LIPO_H +// Universal / Universal 2 fat binary file creator and extractor. + #include "core/io/file_access.h" #include "core/object/ref_counted.h" #include "modules/modules_enabled.gen.h" // For regex. diff --git a/platform/macos/export/macho.h b/platform/macos/export/macho.h index 7ef0d9067e..0d42a7013f 100644 --- a/platform/macos/export/macho.h +++ b/platform/macos/export/macho.h @@ -28,11 +28,11 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -// Mach-O binary object file format parser and editor. - #ifndef MACOS_MACHO_H #define MACOS_MACHO_H +// Mach-O binary object file format parser and editor. + #include "core/crypto/crypto.h" #include "core/crypto/crypto_core.h" #include "core/io/file_access.h" diff --git a/platform/macos/export/plist.h b/platform/macos/export/plist.h index 79cb928d0a..b3c51a9635 100644 --- a/platform/macos/export/plist.h +++ b/platform/macos/export/plist.h @@ -28,11 +28,11 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -// Property list file format (application/x-plist) parser, property list ASN-1 serialization. - #ifndef MACOS_PLIST_H #define MACOS_PLIST_H +// Property list file format (application/x-plist) parser, property list ASN-1 serialization. + #include "core/crypto/crypto_core.h" #include "core/io/file_access.h" #include "modules/modules_enabled.gen.h" // For regex. diff --git a/platform/macos/gl_manager_macos_legacy.mm b/platform/macos/gl_manager_macos_legacy.mm index e6bb7aaa85..dec4821b86 100644 --- a/platform/macos/gl_manager_macos_legacy.mm +++ b/platform/macos/gl_manager_macos_legacy.mm @@ -167,9 +167,8 @@ void GLManager_MacOS::make_current() { } void GLManager_MacOS::swap_buffers() { - for (const KeyValue<DisplayServer::WindowID, GLWindow> &E : windows) { - [E.value.context flushBuffer]; - } + GLWindow &win = windows[current_window]; + [win.context flushBuffer]; } void GLManager_MacOS::window_update(DisplayServer::WindowID p_window_id) { diff --git a/platform/macos/godot_button_view.h b/platform/macos/godot_button_view.h new file mode 100644 index 0000000000..e7627a9e9b --- /dev/null +++ b/platform/macos/godot_button_view.h @@ -0,0 +1,52 @@ +/*************************************************************************/ +/* godot_button_view.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* 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 GODOT_BUTTON_VIEW_H +#define GODOT_BUTTON_VIEW_H + +#include "servers/display_server.h" + +#import <AppKit/AppKit.h> +#import <Foundation/Foundation.h> + +@interface GodotButtonView : NSView { + NSTrackingArea *tracking_area; + NSPoint offset; + CGFloat spacing; + bool mouse_in_group; + bool rtl; +} + +- (void)initButtons:(CGFloat)button_spacing offset:(NSPoint)button_offset rtl:(bool)is_rtl; +- (void)displayButtons; + +@end + +#endif // GODOT_BUTTON_VIEW_H diff --git a/platform/macos/godot_button_view.mm b/platform/macos/godot_button_view.mm new file mode 100644 index 0000000000..9106f0b0db --- /dev/null +++ b/platform/macos/godot_button_view.mm @@ -0,0 +1,123 @@ +/*************************************************************************/ +/* godot_button_view.mm */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* 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 "godot_button_view.h" + +@implementation GodotButtonView + +- (id)initWithFrame:(NSRect)frame { + self = [super initWithFrame:frame]; + + tracking_area = nil; + offset = NSMakePoint(8, 8); + spacing = 20; + mouse_in_group = false; + rtl = false; + + return self; +} + +- (void)initButtons:(CGFloat)button_spacing offset:(NSPoint)button_offset rtl:(bool)is_rtl { + spacing = button_spacing; + rtl = is_rtl; + + NSButton *close_button = [NSWindow standardWindowButton:NSWindowCloseButton forStyleMask:NSWindowStyleMaskTitled]; + [close_button setFrameOrigin:NSMakePoint(rtl ? spacing * 2 : 0, 0)]; + [self addSubview:close_button]; + + NSButton *miniaturize_button = [NSWindow standardWindowButton:NSWindowMiniaturizeButton forStyleMask:NSWindowStyleMaskTitled]; + [miniaturize_button setFrameOrigin:NSMakePoint(spacing, 0)]; + [self addSubview:miniaturize_button]; + + NSButton *zoom_button = [NSWindow standardWindowButton:NSWindowZoomButton forStyleMask:NSWindowStyleMaskTitled]; + [zoom_button setFrameOrigin:NSMakePoint(rtl ? 0 : spacing * 2, 0)]; + [self addSubview:zoom_button]; + + offset.y = button_offset.y - zoom_button.frame.size.height / 2; + offset.x = button_offset.x - zoom_button.frame.size.width / 2; + + if (rtl) { + [self setFrameSize:NSMakeSize(close_button.frame.origin.x + close_button.frame.size.width, close_button.frame.size.height)]; + } else { + [self setFrameSize:NSMakeSize(zoom_button.frame.origin.x + zoom_button.frame.size.width, zoom_button.frame.size.height)]; + } + [self displayButtons]; +} + +- (void)viewDidMoveToWindow { + if (!self.window) { + return; + } + + if (rtl) { + [self setAutoresizingMask:NSViewMinXMargin | NSViewMinYMargin]; + [self setFrameOrigin:NSMakePoint(self.window.frame.size.width - self.frame.size.width - offset.x, self.window.frame.size.height - self.frame.size.height - offset.y)]; + } else { + [self setAutoresizingMask:NSViewMaxXMargin | NSViewMinYMargin]; + [self setFrameOrigin:NSMakePoint(offset.x, self.window.frame.size.height - self.frame.size.height - offset.y)]; + } +} + +- (BOOL)_mouseInGroup:(NSButton *)button { + return mouse_in_group; +} + +- (void)updateTrackingAreas { + if (tracking_area != nil) { + [self removeTrackingArea:tracking_area]; + } + + NSTrackingAreaOptions options = NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways | NSTrackingInVisibleRect; + tracking_area = [[NSTrackingArea alloc] initWithRect:NSZeroRect options:options owner:self userInfo:nil]; + + [self addTrackingArea:tracking_area]; +} + +- (void)mouseEntered:(NSEvent *)event { + [super mouseEntered:event]; + + mouse_in_group = true; + [self displayButtons]; +} + +- (void)mouseExited:(NSEvent *)event { + [super mouseExited:event]; + + mouse_in_group = false; + [self displayButtons]; +} + +- (void)displayButtons { + for (NSView *subview in self.subviews) { + [subview setNeedsDisplay:YES]; + } +} + +@end diff --git a/platform/macos/godot_content_view.h b/platform/macos/godot_content_view.h index 353305aec1..a6318ab903 100644 --- a/platform/macos/godot_content_view.h +++ b/platform/macos/godot_content_view.h @@ -45,6 +45,14 @@ #import <QuartzCore/CAMetalLayer.h> +@interface GodotContentLayerDelegate : NSObject <CALayerDelegate> { + DisplayServer::WindowID window_id; +} + +- (void)setWindowID:(DisplayServer::WindowID)wid; + +@end + @interface GodotContentView : RootView <NSTextInputClient> { DisplayServer::WindowID window_id; NSTrackingArea *tracking_area; @@ -53,12 +61,14 @@ bool mouse_down_control; bool ignore_momentum_scroll; bool last_pen_inverted; + id layer_delegate; } - (void)processScrollEvent:(NSEvent *)event button:(MouseButton)button factor:(double)factor; - (void)processPanEvent:(NSEvent *)event dx:(double)dx dy:(double)dy; - (void)processMouseEvent:(NSEvent *)event index:(MouseButton)index mask:(MouseButton)mask pressed:(bool)pressed; - (void)setWindowID:(DisplayServer::WindowID)wid; +- (void)updateLayerDelegate; - (void)cancelComposition; @end diff --git a/platform/macos/godot_content_view.mm b/platform/macos/godot_content_view.mm index dbed969901..cb70a5db86 100644 --- a/platform/macos/godot_content_view.mm +++ b/platform/macos/godot_content_view.mm @@ -32,11 +32,66 @@ #include "display_server_macos.h" #include "key_mapping_macos.h" +#include "main/main.h" + +@implementation GodotContentLayerDelegate + +- (id)init { + self = [super init]; + window_id = DisplayServer::INVALID_WINDOW_ID; + return self; +} + +- (void)setWindowID:(DisplayServerMacOS::WindowID)wid { + window_id = wid; +} + +- (void)displayLayer:(CALayer *)layer { + DisplayServerMacOS *ds = (DisplayServerMacOS *)DisplayServer::get_singleton(); + if (OS::get_singleton()->get_main_loop() && ds->get_is_resizing()) { + Main::force_redraw(); + if (!Main::is_iterating()) { // Avoid cyclic loop. + Main::iteration(); + } + } +} + +@end @implementation GodotContentView +- (void)setFrameSize:(NSSize)newSize { + DisplayServerMacOS *ds = (DisplayServerMacOS *)DisplayServer::get_singleton(); + if (ds && ds->has_window(window_id)) { + DisplayServerMacOS::WindowData &wd = ds->get_window(window_id); + NSRect frameRect = [wd.window_object frame]; + bool left = (wd.last_frame_rect.origin.x != frameRect.origin.x); + bool top = (wd.last_frame_rect.origin.y == frameRect.origin.y); + if (left && top) { + self.layerContentsPlacement = NSViewLayerContentsPlacementBottomRight; + } else if (left && !top) { + self.layerContentsPlacement = NSViewLayerContentsPlacementTopRight; + } else if (!left && top) { + self.layerContentsPlacement = NSViewLayerContentsPlacementBottomLeft; + } else { + self.layerContentsPlacement = NSViewLayerContentsPlacementTopLeft; + } + wd.last_frame_rect = frameRect; + } + + [super setFrameSize:newSize]; + [self.layer setNeedsDisplay]; // Force "drawRect" call. +} + +- (void)updateLayerDelegate { + self.layer.delegate = layer_delegate; + self.layer.autoresizingMask = kCALayerHeightSizable | kCALayerWidthSizable; + self.layer.needsDisplayOnBoundsChange = YES; +} + - (id)init { self = [super init]; + layer_delegate = [[GodotContentLayerDelegate alloc] init]; window_id = DisplayServer::INVALID_WINDOW_ID; tracking_area = nil; ime_input_event_in_progress = false; @@ -45,6 +100,9 @@ last_pen_inverted = false; [self updateTrackingAreas]; + self.layerContentsRedrawPolicy = NSViewLayerContentsRedrawDuringViewResize; + self.layerContentsPlacement = NSViewLayerContentsPlacementTopLeft; + if (@available(macOS 10.13, *)) { [self registerForDraggedTypes:[NSArray arrayWithObject:NSPasteboardTypeFileURL]]; #if !defined(__aarch64__) // Do not build deprectead 10.13 code on ARM. @@ -58,6 +116,7 @@ - (void)setWindowID:(DisplayServerMacOS::WindowID)wid { window_id = wid; + [layer_delegate setWindowID:window_id]; } // MARK: Backing Layer diff --git a/platform/macos/godot_window.h b/platform/macos/godot_window.h index 9fc5599e86..d3653fda82 100644 --- a/platform/macos/godot_window.h +++ b/platform/macos/godot_window.h @@ -38,9 +38,11 @@ @interface GodotWindow : NSWindow { DisplayServer::WindowID window_id; + NSTimeInterval anim_duration; } - (void)setWindowID:(DisplayServer::WindowID)wid; +- (void)setAnimDuration:(NSTimeInterval)duration; @end diff --git a/platform/macos/godot_window.mm b/platform/macos/godot_window.mm index e205e7546d..bc51da4f72 100644 --- a/platform/macos/godot_window.mm +++ b/platform/macos/godot_window.mm @@ -37,9 +37,22 @@ - (id)init { self = [super init]; window_id = DisplayServer::INVALID_WINDOW_ID; + anim_duration = -1.0f; return self; } +- (void)setAnimDuration:(NSTimeInterval)duration { + anim_duration = duration; +} + +- (NSTimeInterval)animationResizeTime:(NSRect)newFrame { + if (anim_duration > 0) { + return anim_duration; + } else { + return [super animationResizeTime:newFrame]; + } +} + - (void)setWindowID:(DisplayServerMacOS::WindowID)wid { window_id = wid; } diff --git a/platform/macos/godot_window_delegate.h b/platform/macos/godot_window_delegate.h index 98c226aa2f..01cc13a016 100644 --- a/platform/macos/godot_window_delegate.h +++ b/platform/macos/godot_window_delegate.h @@ -38,6 +38,8 @@ @interface GodotWindowDelegate : NSObject <NSWindowDelegate> { DisplayServer::WindowID window_id; + NSRect old_frame; + NSWindowStyleMask old_style_mask; } - (void)setWindowID:(DisplayServer::WindowID)wid; diff --git a/platform/macos/godot_window_delegate.mm b/platform/macos/godot_window_delegate.mm index 2d9329ab3c..279fd2a359 100644 --- a/platform/macos/godot_window_delegate.mm +++ b/platform/macos/godot_window_delegate.mm @@ -31,6 +31,8 @@ #include "godot_window_delegate.h" #include "display_server_macos.h" +#include "godot_button_view.h" +#include "godot_window.h" @implementation GodotWindowDelegate @@ -68,6 +70,26 @@ ds->window_destroy(window_id); } +- (NSArray<NSWindow *> *)customWindowsToEnterFullScreenForWindow:(NSWindow *)window { + DisplayServerMacOS *ds = (DisplayServerMacOS *)DisplayServer::get_singleton(); + if (!ds || !ds->has_window(window_id)) { + return nullptr; + } + + old_frame = [window frame]; + old_style_mask = [window styleMask]; + + NSMutableArray<NSWindow *> *windows = [[NSMutableArray alloc] init]; + [windows addObject:window]; + + return windows; +} + +- (void)window:(NSWindow *)window startCustomAnimationToEnterFullScreenWithDuration:(NSTimeInterval)duration { + [(GodotWindow *)window setAnimDuration:duration]; + [window setFrame:[[window screen] frame] display:YES animate:YES]; +} + - (void)windowDidEnterFullScreen:(NSNotification *)notification { DisplayServerMacOS *ds = (DisplayServerMacOS *)DisplayServer::get_singleton(); if (!ds || !ds->has_window(window_id)) { @@ -76,12 +98,46 @@ DisplayServerMacOS::WindowData &wd = ds->get_window(window_id); wd.fullscreen = true; + // Reset window size limits. [wd.window_object setContentMinSize:NSMakeSize(0, 0)]; [wd.window_object setContentMaxSize:NSMakeSize(FLT_MAX, FLT_MAX)]; + [(GodotWindow *)wd.window_object setAnimDuration:-1.0f]; + + // Reset custom window buttons. + if ([wd.window_object styleMask] & NSWindowStyleMaskFullSizeContentView) { + ds->window_set_custom_window_buttons(wd, false); + } // Force window resize event. [self windowDidResize:notification]; + ds->send_window_event(wd, DisplayServerMacOS::WINDOW_EVENT_TITLEBAR_CHANGE); +} + +- (NSArray<NSWindow *> *)customWindowsToExitFullScreenForWindow:(NSWindow *)window { + DisplayServerMacOS *ds = (DisplayServerMacOS *)DisplayServer::get_singleton(); + if (!ds || !ds->has_window(window_id)) { + return nullptr; + } + + DisplayServerMacOS::WindowData &wd = ds->get_window(window_id); + + // Restore custom window buttons. + if ([wd.window_object styleMask] & NSWindowStyleMaskFullSizeContentView) { + ds->window_set_custom_window_buttons(wd, true); + } + + ds->send_window_event(wd, DisplayServerMacOS::WINDOW_EVENT_TITLEBAR_CHANGE); + + NSMutableArray<NSWindow *> *windows = [[NSMutableArray alloc] init]; + [windows addObject:wd.window_object]; + return windows; +} + +- (void)window:(NSWindow *)window startCustomAnimationToExitFullScreenWithDuration:(NSTimeInterval)duration { + [(GodotWindow *)window setAnimDuration:duration]; + [window setStyleMask:old_style_mask]; + [window setFrame:old_frame display:YES animate:YES]; } - (void)windowDidExitFullScreen:(NSNotification *)notification { @@ -93,6 +149,8 @@ DisplayServerMacOS::WindowData &wd = ds->get_window(window_id); wd.fullscreen = false; + [(GodotWindow *)wd.window_object setAnimDuration:-1.0f]; + // Set window size limits. const float scale = ds->screen_get_max_scale(); if (wd.min_size != Size2i()) { @@ -151,7 +209,9 @@ - (void)windowWillStartLiveResize:(NSNotification *)notification { DisplayServerMacOS *ds = (DisplayServerMacOS *)DisplayServer::get_singleton(); - if (ds) { + if (ds && ds->has_window(window_id)) { + DisplayServerMacOS::WindowData &wd = ds->get_window(window_id); + wd.last_frame_rect = [wd.window_object frame]; ds->set_is_resizing(true); } } @@ -217,6 +277,10 @@ DisplayServerMacOS::WindowData &wd = ds->get_window(window_id); + if (wd.window_button_view) { + [(GodotButtonView *)wd.window_button_view displayButtons]; + } + if (ds->mouse_get_mode() == DisplayServer::MOUSE_MODE_CAPTURED) { const NSRect content_rect = [wd.window_view frame]; NSRect point_in_window_rect = NSMakeRect(content_rect.size.width / 2, content_rect.size.height / 2, 0, 0); @@ -239,6 +303,10 @@ DisplayServerMacOS::WindowData &wd = ds->get_window(window_id); + if (wd.window_button_view) { + [(GodotButtonView *)wd.window_button_view displayButtons]; + } + ds->release_pressed_events(); ds->send_window_event(wd, DisplayServerMacOS::WINDOW_EVENT_FOCUS_OUT); } diff --git a/platform/macos/os_macos.h b/platform/macos/os_macos.h index 61db99689c..46e7c17ebe 100644 --- a/platform/macos/os_macos.h +++ b/platform/macos/os_macos.h @@ -75,6 +75,8 @@ public: virtual List<String> get_cmdline_platform_args() const override; virtual String get_name() const override; + virtual String get_distribution_name() const override; + virtual String get_version() const override; virtual void alert(const String &p_alert, const String &p_title = "ALERT!") override; diff --git a/platform/macos/os_macos.mm b/platform/macos/os_macos.mm index 35c4e4b03d..ae8534f6ab 100644 --- a/platform/macos/os_macos.mm +++ b/platform/macos/os_macos.mm @@ -56,10 +56,11 @@ _FORCE_INLINE_ String OS_MacOS::get_framework_executable(const String &p_path) { } void OS_MacOS::pre_wait_observer_cb(CFRunLoopObserverRef p_observer, CFRunLoopActivity p_activiy, void *p_context) { - // Prevent main loop from sleeping and redraw window during resize / modal popups. + // Prevent main loop from sleeping and redraw window during modal popup display. + // Do not redraw when rendering is done from the separate thread, it will conflict with the OpenGL context updates. DisplayServerMacOS *ds = (DisplayServerMacOS *)DisplayServer::get_singleton(); - if (get_singleton()->get_main_loop() && ds && (get_singleton()->get_render_thread_mode() != RENDER_SEPARATE_THREAD || !ds->get_is_resizing())) { + if (get_singleton()->get_main_loop() && ds && (get_singleton()->get_render_thread_mode() != RENDER_SEPARATE_THREAD) && !ds->get_is_resizing()) { Main::force_redraw(); if (!Main::is_iterating()) { // Avoid cyclic loop. Main::iteration(); @@ -133,6 +134,15 @@ String OS_MacOS::get_name() const { return "macOS"; } +String OS_MacOS::get_distribution_name() const { + return get_name(); +} + +String OS_MacOS::get_version() const { + NSOperatingSystemVersion ver = [NSProcessInfo processInfo].operatingSystemVersion; + return vformat("%d.%d.%d", (int64_t)ver.majorVersion, (int64_t)ver.minorVersion, (int64_t)ver.patchVersion); +} + void OS_MacOS::alert(const String &p_alert, const String &p_title) { NSAlert *window = [[NSAlert alloc] init]; NSString *ns_title = [NSString stringWithUTF8String:p_title.utf8().get_data()]; diff --git a/platform/uwp/detect.py b/platform/uwp/detect.py index 2c5746cb06..64fe5bc4a2 100644 --- a/platform/uwp/detect.py +++ b/platform/uwp/detect.py @@ -3,6 +3,11 @@ import os import sys from platform_methods import detect_arch +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from SCons import Environment + def is_active(): return True @@ -39,7 +44,7 @@ def get_flags(): ] -def configure(env): +def configure(env: "Environment"): # Validate arch. supported_arches = ["x86_32", "x86_64", "arm32"] if env["arch"] not in supported_arches: @@ -83,7 +88,7 @@ def configure(env): env.AppendUnique(CCFLAGS=["/utf-8"]) # ANGLE - angle_root = os.getenv("ANGLE_SRC_PATH") + angle_root = os.environ["ANGLE_SRC_PATH"] env.Prepend(CPPPATH=[angle_root + "/include"]) jobs = str(env.GetOption("num_jobs")) angle_build_cmd = ( @@ -94,7 +99,7 @@ def configure(env): + " /p:Configuration=Release /p:Platform=" ) - if os.path.isfile(str(os.getenv("ANGLE_SRC_PATH")) + "/winrt/10/src/angle.sln"): + if os.path.isfile(f"{angle_root}/winrt/10/src/angle.sln"): env["build_angle"] = True ## Architecture diff --git a/platform/uwp/export/app_packager.cpp b/platform/uwp/export/app_packager.cpp index 87224d38b8..6f8966b9ff 100644 --- a/platform/uwp/export/app_packager.cpp +++ b/platform/uwp/export/app_packager.cpp @@ -301,7 +301,7 @@ Error AppxPackager::add_file(String p_file_name, const uint8_t *p_buffer, size_t Vector<uint8_t> file_buffer; // Data for compression - z_stream strm; + z_stream strm{}; Vector<uint8_t> strm_in; strm_in.resize(BLOCK_SIZE); Vector<uint8_t> strm_out; diff --git a/platform/uwp/os_uwp.cpp b/platform/uwp/os_uwp.cpp index 494f5ec4b9..8050d299f0 100644 --- a/platform/uwp/os_uwp.cpp +++ b/platform/uwp/os_uwp.cpp @@ -444,24 +444,17 @@ String OS_UWP::get_name() const { return "UWP"; } -OS::Date OS_UWP::get_date(bool p_utc) const { - SYSTEMTIME systemtime; - if (p_utc) { - GetSystemTime(&systemtime); - } else { - GetLocalTime(&systemtime); - } +String OS_UWP::get_distribution_name() const { + return get_name(); +} - Date date; - date.day = systemtime.wDay; - date.month = Month(systemtime.wMonth); - date.weekday = Weekday(systemtime.wDayOfWeek); - date.year = systemtime.wYear; - date.dst = false; - return date; +String OS_UWP::get_version() const { + winrt::hstring df_version = VersionInfo().DeviceFamilyVersion(); + static String version = String(winrt::to_string(df_version).c_str()); + return version; } -OS::Time OS_UWP::get_time(bool p_utc) const { +OS::DateTime OS_UWP::get_datetime(bool p_utc) const { SYSTEMTIME systemtime; if (p_utc) { GetSystemTime(&systemtime); @@ -469,11 +462,23 @@ OS::Time OS_UWP::get_time(bool p_utc) const { GetLocalTime(&systemtime); } - Time time; - time.hour = systemtime.wHour; - time.min = systemtime.wMinute; - time.sec = systemtime.wSecond; - return time; + //Get DST information from Windows, but only if p_utc is false. + TIME_ZONE_INFORMATION info; + bool daylight = false; + if (!p_utc && GetTimeZoneInformation(&info) == TIME_ZONE_ID_DAYLIGHT) { + daylight = true; + } + + DateTime dt; + dt.year = systemtime.wYear; + dt.month = Month(systemtime.wMonth); + dt.day = systemtime.wDay; + dt.weekday = Weekday(systemtime.wDayOfWeek); + dt.hour = systemtime.wHour; + dt.minute = systemtime.wMinute; + dt.second = systemtime.wSecond; + dt.dst = daylight; + return dt; } OS::TimeZoneInfo OS_UWP::get_time_zone_info() const { diff --git a/platform/uwp/os_uwp.h b/platform/uwp/os_uwp.h index 5a58486ee7..c1df7827cd 100644 --- a/platform/uwp/os_uwp.h +++ b/platform/uwp/os_uwp.h @@ -42,9 +42,9 @@ #include "servers/rendering/renderer_compositor.h" #include "servers/rendering_server.h" -#include <fcntl.h> #include <io.h> #include <stdio.h> + #define WIN32_LEAN_AND_MEAN #include <windows.h> @@ -183,9 +183,10 @@ public: virtual MainLoop *get_main_loop() const; virtual String get_name() const; + virtual String get_distribution_name() const; + virtual String get_version() const; - virtual Date get_date(bool p_utc) const; - virtual Time get_time(bool p_utc) const; + virtual DateTime get_datetime(bool p_utc) const; virtual TimeZoneInfo get_time_zone_info() const; virtual uint64_t get_unix_time() const; diff --git a/platform/web/.eslintrc.engine.js b/platform/web/.eslintrc.engine.js index 78df6d41d9..a76bd46b9e 100644 --- a/platform/web/.eslintrc.engine.js +++ b/platform/web/.eslintrc.engine.js @@ -5,6 +5,7 @@ module.exports = { "globals": { "InternalConfig": true, "Godot": true, + "Features": true, "Preloader": true, }, }; diff --git a/platform/web/SCsub b/platform/web/SCsub index e8d0181ede..013b734be2 100644 --- a/platform/web/SCsub +++ b/platform/web/SCsub @@ -66,6 +66,7 @@ sys_env.Depends(build[0], sys_env["JS_PRE"]) sys_env.Depends(build[0], sys_env["JS_EXTERNS"]) engine = [ + "js/engine/features.js", "js/engine/preloader.js", "js/engine/config.js", "js/engine/engine.js", diff --git a/platform/web/audio_driver_web.cpp b/platform/web/audio_driver_web.cpp index 0e37afc2cc..c4b27c782d 100644 --- a/platform/web/audio_driver_web.cpp +++ b/platform/web/audio_driver_web.cpp @@ -184,51 +184,6 @@ Error AudioDriverWeb::capture_stop() { return OK; } -#ifdef NO_THREADS -/// ScriptProcessorNode implementation -AudioDriverScriptProcessor *AudioDriverScriptProcessor::singleton = nullptr; - -void AudioDriverScriptProcessor::_process_callback() { - AudioDriverScriptProcessor::singleton->_audio_driver_capture(); - AudioDriverScriptProcessor::singleton->_audio_driver_process(); -} - -Error AudioDriverScriptProcessor::create(int &p_buffer_samples, int p_channels) { - if (!godot_audio_has_script_processor()) { - return ERR_UNAVAILABLE; - } - return (Error)godot_audio_script_create(&p_buffer_samples, p_channels); -} - -void AudioDriverScriptProcessor::start(float *p_out_buf, int p_out_buf_size, float *p_in_buf, int p_in_buf_size) { - godot_audio_script_start(p_in_buf, p_in_buf_size, p_out_buf, p_out_buf_size, &_process_callback); -} - -/// AudioWorkletNode implementation (no threads) -AudioDriverWorklet *AudioDriverWorklet::singleton = nullptr; - -Error AudioDriverWorklet::create(int &p_buffer_size, int p_channels) { - if (!godot_audio_has_worklet()) { - return ERR_UNAVAILABLE; - } - return (Error)godot_audio_worklet_create(p_channels); -} - -void AudioDriverWorklet::start(float *p_out_buf, int p_out_buf_size, float *p_in_buf, int p_in_buf_size) { - _audio_driver_process(); - godot_audio_worklet_start_no_threads(p_out_buf, p_out_buf_size, &_process_callback, p_in_buf, p_in_buf_size, &_capture_callback); -} - -void AudioDriverWorklet::_process_callback(int p_pos, int p_samples) { - AudioDriverWorklet *driver = AudioDriverWorklet::singleton; - driver->_audio_driver_process(p_pos, p_samples); -} - -void AudioDriverWorklet::_capture_callback(int p_pos, int p_samples) { - AudioDriverWorklet *driver = AudioDriverWorklet::singleton; - driver->_audio_driver_capture(p_pos, p_samples); -} -#else /// AudioWorkletNode implementation (threads) void AudioDriverWorklet::_audio_thread_func(void *p_data) { AudioDriverWorklet *driver = static_cast<AudioDriverWorklet *>(p_data); @@ -290,4 +245,3 @@ void AudioDriverWorklet::finish_driver() { quit = true; // Ask thread to quit. thread.wait_to_finish(); } -#endif diff --git a/platform/web/audio_driver_web.h b/platform/web/audio_driver_web.h index dfce277c0c..0a322d61b4 100644 --- a/platform/web/audio_driver_web.h +++ b/platform/web/audio_driver_web.h @@ -89,46 +89,6 @@ public: AudioDriverWeb() {} }; -#ifdef NO_THREADS -class AudioDriverScriptProcessor : public AudioDriverWeb { -private: - static void _process_callback(); - - static AudioDriverScriptProcessor *singleton; - -protected: - Error create(int &p_buffer_samples, int p_channels) override; - void start(float *p_out_buf, int p_out_buf_size, float *p_in_buf, int p_in_buf_size) override; - -public: - virtual const char *get_name() const override { return "ScriptProcessor"; } - - virtual void lock() override {} - virtual void unlock() override {} - - AudioDriverScriptProcessor() { singleton = this; } -}; - -class AudioDriverWorklet : public AudioDriverWeb { -private: - static void _process_callback(int p_pos, int p_samples); - static void _capture_callback(int p_pos, int p_samples); - - static AudioDriverWorklet *singleton; - -protected: - virtual Error create(int &p_buffer_size, int p_output_channels) override; - virtual void start(float *p_out_buf, int p_out_buf_size, float *p_in_buf, int p_in_buf_size) override; - -public: - virtual const char *get_name() const override { return "AudioWorklet"; } - - virtual void lock() override {} - virtual void unlock() override {} - - AudioDriverWorklet() { singleton = this; } -}; -#else class AudioDriverWorklet : public AudioDriverWeb { private: enum { @@ -156,6 +116,5 @@ public: void lock() override; void unlock() override; }; -#endif #endif // AUDIO_DRIVER_WEB_H diff --git a/platform/web/detect.py b/platform/web/detect.py index e055af8400..08c1ff7b4a 100644 --- a/platform/web/detect.py +++ b/platform/web/detect.py @@ -11,6 +11,10 @@ from emscripten_helpers import ( ) from methods import get_compiler_version from SCons.Util import WhereIs +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from SCons import Environment def is_active(): @@ -47,7 +51,7 @@ def get_opts(): def get_flags(): return [ ("arch", "wasm32"), - ("tools", False), + ("target", "template_debug"), ("builtin_pcre2_with_jit", False), ("vulkan", False), # Use -Os to prioritize optimizing for reduced file size. This is @@ -60,7 +64,7 @@ def get_flags(): ] -def configure(env): +def configure(env: "Environment"): # Validate arch. supported_arches = ["wasm32"] if env["arch"] not in supported_arches: @@ -77,26 +81,17 @@ def configure(env): sys.exit(255) ## Build type - if env["target"].startswith("release"): - if env["optimize"] == "size": - env.Append(CCFLAGS=["-Os"]) - env.Append(LINKFLAGS=["-Os"]) - elif env["optimize"] == "speed": - env.Append(CCFLAGS=["-O3"]) - env.Append(LINKFLAGS=["-O3"]) - - if env["target"] == "release_debug": - # Retain function names for backtraces at the cost of file size. - env.Append(LINKFLAGS=["--profiling-funcs"]) - else: # "debug" - env.Append(CCFLAGS=["-O1", "-g"]) - env.Append(LINKFLAGS=["-O1", "-g"]) + + if env.debug_features: + # Retain function names for backtraces at the cost of file size. + env.Append(LINKFLAGS=["--profiling-funcs"]) + else: env["use_assertions"] = True if env["use_assertions"]: env.Append(LINKFLAGS=["-s", "ASSERTIONS=1"]) - if env["tools"]: + if env.editor_build: if env["initial_memory"] < 64: print('Note: Forcing "initial_memory=64" as it is required for the web editor.') env["initial_memory"] = 64 @@ -109,6 +104,10 @@ def configure(env): env["ENV"] = os.environ # LTO + + if env["lto"] == "auto": # Full LTO for production. + env["lto"] = "full" + if env["lto"] != "none": if env["lto"] == "thin": env.Append(CCFLAGS=["-flto=thin"]) @@ -227,3 +226,7 @@ def configure(env): # Add code that allow exiting runtime. env.Append(LINKFLAGS=["-s", "EXIT_RUNTIME=1"]) + + # This workaround creates a closure that prevents the garbage collector from freeing the WebGL context. + # We also only use WebGL2, and changing context version is not widely supported anyway. + env.Append(LINKFLAGS=["-s", "GL_WORKAROUND_SAFARI_GETCONTEXT_BUG=0"]) diff --git a/platform/web/display_server_web.cpp b/platform/web/display_server_web.cpp index b36f9d14a4..f6a61b18e4 100644 --- a/platform/web/display_server_web.cpp +++ b/platform/web/display_server_web.cpp @@ -764,10 +764,10 @@ DisplayServerWeb::DisplayServerWeb(const String &p_rendering_driver, WindowMode if (wants_webgl2 && !webgl2_init_failed) { EmscriptenWebGLContextAttributes attributes; emscripten_webgl_init_context_attributes(&attributes); - //attributes.alpha = GLOBAL_GET("display/window/per_pixel_transparency/allowed"); - attributes.alpha = true; + attributes.alpha = OS::get_singleton()->is_layered_allowed(); attributes.antialias = false; attributes.majorVersion = 2; + attributes.explicitSwapControl = true; webgl_ctx = emscripten_webgl_create_context(canvas_id, &attributes); if (emscripten_webgl_make_context_current(webgl_ctx) != EMSCRIPTEN_RESULT_SUCCESS) { @@ -997,7 +997,7 @@ void DisplayServerWeb::window_set_mode(WindowMode p_mode, WindowID p_window) { } break; case WINDOW_MODE_MAXIMIZED: case WINDOW_MODE_MINIMIZED: - WARN_PRINT("WindowMode MAXIMIZED and MINIMIZED are not supported in Web platform."); + // WindowMode MAXIMIZED and MINIMIZED are not supported in Web platform. break; default: break; diff --git a/platform/web/emscripten_helpers.py b/platform/web/emscripten_helpers.py index 6045bc6fbd..ec33397842 100644 --- a/platform/web/emscripten_helpers.py +++ b/platform/web/emscripten_helpers.py @@ -38,7 +38,7 @@ def create_engine_file(env, target, source, externs): def create_template_zip(env, js, wasm, worker, side): - binary_name = "godot.tools" if env["tools"] else "godot" + binary_name = "godot.editor" if env.editor_build else "godot" zip_dir = env.Dir("#bin/.web_zip") in_files = [ js, @@ -58,19 +58,19 @@ def create_template_zip(env, js, wasm, worker, side): out_files.append(zip_dir.File(binary_name + ".side.wasm")) service_worker = "#misc/dist/html/service-worker.js" - if env["tools"]: + if env.editor_build: # HTML html = "#misc/dist/html/editor.html" cache = [ - "godot.tools.html", + "godot.editor.html", "offline.html", - "godot.tools.js", - "godot.tools.worker.js", - "godot.tools.audio.worklet.js", + "godot.editor.js", + "godot.editor.worker.js", + "godot.editor.audio.worklet.js", "logo.svg", "favicon.png", ] - opt_cache = ["godot.tools.wasm"] + opt_cache = ["godot.editor.wasm"] subst_dict = { "@GODOT_VERSION@": get_build_version(), "@GODOT_NAME@": "GodotEngine", diff --git a/platform/web/export/export.cpp b/platform/web/export/export.cpp index 7193bc6ac4..4b4e8b2705 100644 --- a/platform/web/export/export.cpp +++ b/platform/web/export/export.cpp @@ -34,6 +34,7 @@ #include "export_plugin.h" void register_web_exporter() { +#ifndef ANDROID_ENABLED EDITOR_DEF("export/web/http_host", "localhost"); EDITOR_DEF("export/web/http_port", 8060); EDITOR_DEF("export/web/use_tls", false); @@ -42,6 +43,7 @@ void register_web_exporter() { EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::INT, "export/web/http_port", PROPERTY_HINT_RANGE, "1,65535,1")); EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/web/tls_key", PROPERTY_HINT_GLOBAL_FILE, "*.key")); EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/web/tls_certificate", PROPERTY_HINT_GLOBAL_FILE, "*.crt,*.pem")); +#endif Ref<EditorExportPlatformWeb> platform; platform.instantiate(); diff --git a/platform/web/export/export_plugin.cpp b/platform/web/export/export_plugin.cpp index 306453c1eb..1c327fe4b2 100644 --- a/platform/web/export/export_plugin.cpp +++ b/platform/web/export/export_plugin.cpp @@ -307,13 +307,7 @@ void EditorExportPlatformWeb::get_preset_features(const Ref<EditorExportPreset> } if (p_preset->get("vram_texture_compression/for_mobile")) { - String driver = ProjectSettings::get_singleton()->get("rendering/driver/driver_name"); - if (driver == "opengl3") { - r_features->push_back("etc"); - } else if (driver == "vulkan") { - // FIXME: Review if this is correct. - r_features->push_back("etc2"); - } + r_features->push_back("etc2"); } r_features->push_back("wasm32"); } diff --git a/platform/web/js/engine/config.js b/platform/web/js/engine/config.js index 9c4b6c2012..41be7b2512 100644 --- a/platform/web/js/engine/config.js +++ b/platform/web/js/engine/config.js @@ -317,7 +317,8 @@ const InternalConfig = function (initConfig) { // eslint-disable-line no-unused- if (!(this.canvas instanceof HTMLCanvasElement)) { const nodes = document.getElementsByTagName('canvas'); if (nodes.length && nodes[0] instanceof HTMLCanvasElement) { - this.canvas = nodes[0]; + const first = nodes[0]; + this.canvas = /** @type {!HTMLCanvasElement} */ (first); } if (!this.canvas) { throw new Error('No canvas found in page'); diff --git a/platform/web/js/engine/engine.js b/platform/web/js/engine/engine.js index 6f0d51b2be..9227aa1f05 100644 --- a/platform/web/js/engine/engine.js +++ b/platform/web/js/engine/engine.js @@ -61,20 +61,6 @@ const Engine = (function () { }; /** - * Check whether WebGL is available. Optionally, specify a particular version of WebGL to check for. - * - * @param {number=} [majorVersion=1] The major WebGL version to check for. - * @returns {boolean} If the given major version of WebGL is available. - * @function Engine.isWebGLAvailable - */ - Engine.isWebGLAvailable = function (majorVersion = 1) { - try { - return !!document.createElement('canvas').getContext(['webgl', 'webgl2'][majorVersion - 1]); - } catch (e) { /* Not available */ } - return false; - }; - - /** * Safe Engine constructor, creates a new prototype for every new instance to avoid prototype pollution. * @ignore * @constructor @@ -265,14 +251,21 @@ const Engine = (function () { // Also expose static methods as instance methods Engine.prototype['load'] = Engine.load; Engine.prototype['unload'] = Engine.unload; - Engine.prototype['isWebGLAvailable'] = Engine.isWebGLAvailable; return new Engine(initConfig); } // Closure compiler exported static methods. SafeEngine['load'] = Engine.load; SafeEngine['unload'] = Engine.unload; - SafeEngine['isWebGLAvailable'] = Engine.isWebGLAvailable; + + // Feature-detection utilities. + SafeEngine['isWebGLAvailable'] = Features.isWebGLAvailable; + SafeEngine['isFetchAvailable'] = Features.isFetchAvailable; + SafeEngine['isSecureContext'] = Features.isSecureContext; + SafeEngine['isCrossOriginIsolated'] = Features.isCrossOriginIsolated; + SafeEngine['isSharedArrayBufferAvailable'] = Features.isSharedArrayBufferAvailable; + SafeEngine['isAudioWorkletAvailable'] = Features.isAudioWorkletAvailable; + SafeEngine['getMissingFeatures'] = Features.getMissingFeatures; return SafeEngine; }()); diff --git a/platform/web/js/engine/features.js b/platform/web/js/engine/features.js new file mode 100644 index 0000000000..f91a4eff81 --- /dev/null +++ b/platform/web/js/engine/features.js @@ -0,0 +1,96 @@ +const Features = { // eslint-disable-line no-unused-vars + /** + * Check whether WebGL is available. Optionally, specify a particular version of WebGL to check for. + * + * @param {number=} [majorVersion=1] The major WebGL version to check for. + * @returns {boolean} If the given major version of WebGL is available. + * @function Engine.isWebGLAvailable + */ + isWebGLAvailable: function (majorVersion = 1) { + try { + return !!document.createElement('canvas').getContext(['webgl', 'webgl2'][majorVersion - 1]); + } catch (e) { /* Not available */ } + return false; + }, + + /** + * Check whether the Fetch API available and supports streaming responses. + * + * @returns {boolean} If the Fetch API is available and supports streaming responses. + * @function Engine.isFetchAvailable + */ + isFetchAvailable: function () { + return 'fetch' in window && 'Response' in window && 'body' in window.Response.prototype; + }, + + /** + * Check whether the engine is running in a Secure Context. + * + * @returns {boolean} If the engine is running in a Secure Context. + * @function Engine.isSecureContext + */ + isSecureContext: function () { + return window['isSecureContext'] === true; + }, + + /** + * Check whether the engine is cross origin isolated. + * This value is dependent on Cross-Origin-Opener-Policy and Cross-Origin-Embedder-Policy headers sent by the server. + * + * @returns {boolean} If the engine is running in a Secure Context. + * @function Engine.isSecureContext + */ + isCrossOriginIsolated: function () { + return window['crossOriginIsolated'] === true; + }, + + /** + * Check whether SharedBufferArray is available. + * + * Most browsers require the page to be running in a secure context, and the + * the server to provide specific CORS headers for SharedArrayBuffer to be available. + * + * @returns {boolean} If SharedArrayBuffer is available. + * @function Engine.isSharedArrayBufferAvailable + */ + isSharedArrayBufferAvailable: function () { + return 'SharedArrayBuffer' in window; + }, + + /** + * Check whether the AudioContext supports AudioWorkletNodes. + * + * @returns {boolean} If AudioWorkletNode is available. + * @function Engine.isAudioWorkletAvailable + */ + isAudioWorkletAvailable: function () { + return 'AudioContext' in window && 'audioWorklet' in AudioContext.prototype; + }, + + /** + * Return an array of missing required features (as string). + * + * @returns {Array<string>} A list of human-readable missing features. + * @function Engine.getMissingFeatures + */ + getMissingFeatures: function () { + const missing = []; + if (!Features.isWebGLAvailable(2)) { + missing.push('WebGL2'); + } + if (!Features.isFetchAvailable()) { + missing.push('Fetch'); + } + if (!Features.isSecureContext()) { + missing.push('Secure Context'); + } + if (!Features.isCrossOriginIsolated()) { + missing.push('Cross Origin Isolation'); + } + if (!Features.isSharedArrayBufferAvailable()) { + missing.push('SharedArrayBuffer'); + } + // Audio is normally optional since we have a dummy fallback. + return missing; + }, +}; diff --git a/platform/web/js/libs/audio.worklet.js b/platform/web/js/libs/audio.worklet.js index ea4d8cb221..daf5c9ef12 100644 --- a/platform/web/js/libs/audio.worklet.js +++ b/platform/web/js/libs/audio.worklet.js @@ -133,6 +133,8 @@ class GodotProcessor extends AudioWorkletProcessor { this.running = false; this.output = null; this.input = null; + this.lock = null; + this.notifier = null; } else if (p_cmd === 'start_nothreads') { this.output = new RingBuffer(p_data[0], p_data[0].length, false); } else if (p_cmd === 'chunk') { diff --git a/platform/web/js/libs/library_godot_audio.js b/platform/web/js/libs/library_godot_audio.js index 756c1ac595..68e100cca0 100644 --- a/platform/web/js/libs/library_godot_audio.js +++ b/platform/web/js/libs/library_godot_audio.js @@ -339,16 +339,21 @@ const GodotAudioWorklet = { if (GodotAudioWorklet.promise === null) { return; } - GodotAudioWorklet.promise.then(function () { + const p = GodotAudioWorklet.promise; + p.then(function () { GodotAudioWorklet.worklet.port.postMessage({ 'cmd': 'stop', 'data': null, }); GodotAudioWorklet.worklet.disconnect(); + GodotAudioWorklet.worklet.port.onmessage = null; GodotAudioWorklet.worklet = null; GodotAudioWorklet.promise = null; resolve(); - }).catch(function (err) { /* aborted? */ }); + }).catch(function (err) { + // Aborted? + GodotRuntime.error(err); + }); }); }, }, diff --git a/platform/web/js/libs/library_godot_os.js b/platform/web/js/libs/library_godot_os.js index 377eec3234..ce64fb98c0 100644 --- a/platform/web/js/libs/library_godot_os.js +++ b/platform/web/js/libs/library_godot_os.js @@ -106,12 +106,14 @@ autoAddDeps(GodotConfig, '$GodotConfig'); mergeInto(LibraryManager.library, GodotConfig); const GodotFS = { - $GodotFS__deps: ['$ERRNO_CODES', '$FS', '$IDBFS', '$GodotRuntime'], + $GodotFS__deps: ['$FS', '$IDBFS', '$GodotRuntime'], $GodotFS__postset: [ 'Module["initFS"] = GodotFS.init;', 'Module["copyToFS"] = GodotFS.copy_to_fs;', ].join(''), $GodotFS: { + // ERRNO_CODES works every odd version of emscripten, but this will break too eventually. + ENOENT: 44, _idbfs: false, _syncing: false, _mount_points: [], @@ -138,8 +140,9 @@ const GodotFS = { try { FS.stat(dir); } catch (e) { - if (e.errno !== ERRNO_CODES.ENOENT) { - throw e; + if (e.errno !== GodotFS.ENOENT) { + // Let mkdirTree throw in case, we cannot trust the above check. + GodotRuntime.error(e); } FS.mkdirTree(dir); } @@ -208,8 +211,9 @@ const GodotFS = { try { FS.stat(dir); } catch (e) { - if (e.errno !== ERRNO_CODES.ENOENT) { - throw e; + if (e.errno !== GodotFS.ENOENT) { + // Let mkdirTree throw in case, we cannot trust the above check. + GodotRuntime.error(e); } FS.mkdirTree(dir); } diff --git a/platform/web/os_web.cpp b/platform/web/os_web.cpp index ebe56924df..c263ee094b 100644 --- a/platform/web/os_web.cpp +++ b/platform/web/os_web.cpp @@ -239,9 +239,6 @@ OS_Web::OS_Web() { godot_js_pwa_cb(&OS_Web::update_pwa_state_callback); if (AudioDriverWeb::is_available()) { -#ifdef NO_THREADS - audio_drivers.push_back(memnew(AudioDriverScriptProcessor)); -#endif audio_drivers.push_back(memnew(AudioDriverWorklet)); } for (int i = 0; i < audio_drivers.size(); i++) { diff --git a/platform/web/package.json b/platform/web/package.json index a57205415a..0a8d9e4334 100644 --- a/platform/web/package.json +++ b/platform/web/package.json @@ -4,7 +4,7 @@ "version": "1.0.0", "description": "Development and linting setup for Godot's Web platform code", "scripts": { - "docs": "jsdoc --template js/jsdoc2rst/ js/engine/engine.js js/engine/config.js --destination ''", + "docs": "jsdoc --template js/jsdoc2rst/ js/engine/engine.js js/engine/config.js js/engine/features.js --destination ''", "lint": "npm run lint:engine && npm run lint:libs && npm run lint:modules && npm run lint:tools", "lint:engine": "eslint \"js/engine/*.js\" --no-eslintrc -c .eslintrc.engine.js", "lint:libs": "eslint \"js/libs/*.js\" --no-eslintrc -c .eslintrc.libs.js", diff --git a/platform/web/web_main.cpp b/platform/web/web_main.cpp index 0f4411727a..a76b98f4e9 100644 --- a/platform/web/web_main.cpp +++ b/platform/web/web_main.cpp @@ -55,6 +55,18 @@ void cleanup_after_sync() { emscripten_set_main_loop(exit_callback, -1, false); } +void early_cleanup() { + emscripten_cancel_main_loop(); // After this, we can exit! + int exit_code = OS_Web::get_singleton()->get_exit_code(); + memdelete(os); + os = nullptr; + emscripten_force_exit(exit_code); // No matter that we call cancel_main_loop, regular "exit" will not work, forcing. +} + +void early_cleanup_sync() { + emscripten_set_main_loop(early_cleanup, -1, false); +} + void main_loop_callback() { uint64_t current_ticks = os->get_ticks_usec(); @@ -65,14 +77,14 @@ void main_loop_callback() { return; // Skip frame. } - int target_fps = Engine::get_singleton()->get_target_fps(); - if (target_fps > 0) { + int max_fps = Engine::get_singleton()->get_max_fps(); + if (max_fps > 0) { if (current_ticks - target_ticks > 1000000) { // When the window loses focus, we stop getting updates and accumulate delay. // For this reason, if the difference is too big, we reset target ticks to the current ticks. target_ticks = current_ticks; } - target_ticks += (uint64_t)(1000000 / target_fps); + target_ticks += (uint64_t)(1000000 / max_fps); } if (os->main_loop_iterate()) { emscripten_cancel_main_loop(); // Cancel current loop and wait for cleanup_after_sync. @@ -87,7 +99,19 @@ extern EMSCRIPTEN_KEEPALIVE int godot_web_main(int argc, char *argv[]) { // We must override main when testing is enabled TEST_MAIN_OVERRIDE - Main::setup(argv[0], argc - 1, &argv[1]); + Error err = Main::setup(argv[0], argc - 1, &argv[1]); + + // Proper shutdown in case of setup failure. + if (err != OK) { + int exit_code = (int)err; + if (err == ERR_HELP) { + exit_code = 0; // Called with --help. + } + os->set_exit_code(exit_code); + // Will only exit after sync. + godot_js_os_finish_async(early_cleanup_sync); + return exit_code; + } // Ease up compatibility. ResourceLoader::set_abort_on_missing_resources(false); diff --git a/platform/windows/detect.py b/platform/windows/detect.py index e6e1874fc0..a5d8d0344b 100644 --- a/platform/windows/detect.py +++ b/platform/windows/detect.py @@ -4,6 +4,11 @@ import subprocess import sys from platform_methods import detect_arch +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from SCons import Environment + # To match other platforms STACK_SIZE = 8388608 @@ -173,17 +178,7 @@ def get_opts(): "Targeted Windows version, >= 0x0601 (Windows 7)", "0x0601", ), - BoolVariable( - "debug_symbols", - "Add debugging symbols to release/release_debug builds", - True, - ), EnumVariable("windows_subsystem", "Windows subsystem", "gui", ("gui", "console")), - BoolVariable( - "separate_debug_symbols", - "Create a separate file containing debugging symbols", - False, - ), ( "msvc_version", "MSVC version to use. Ignored if VCINSTALLDIR is set in shell env.", @@ -330,32 +325,11 @@ def setup_mingw(env): def configure_msvc(env, vcvars_msvc_config): """Configure env to work with MSVC""" - # Build type - if env["target"] == "release": - if env["optimize"] == "speed": # optimize for speed (default) - env.Append(CCFLAGS=["/O2"]) - env.Append(LINKFLAGS=["/OPT:REF"]) - elif env["optimize"] == "size": # optimize for size - env.Append(CCFLAGS=["/O1"]) - env.Append(LINKFLAGS=["/OPT:REF"]) - env.Append(LINKFLAGS=["/ENTRY:mainCRTStartup"]) - - elif env["target"] == "release_debug": - if env["optimize"] == "speed": # optimize for speed (default) - env.Append(CCFLAGS=["/O2"]) - env.Append(LINKFLAGS=["/OPT:REF"]) - elif env["optimize"] == "size": # optimize for size - env.Append(CCFLAGS=["/O1"]) - env.Append(LINKFLAGS=["/OPT:REF"]) - - elif env["target"] == "debug": - env.AppendUnique(CCFLAGS=["/Zi", "/FS", "/Od", "/EHsc"]) - # Allow big objects. Only needed for debug, see MinGW branch for rationale. - env.Append(LINKFLAGS=["/DEBUG"]) + ## Build type - if env["debug_symbols"]: - env.AppendUnique(CCFLAGS=["/Zi", "/FS"]) - env.AppendUnique(LINKFLAGS=["/DEBUG"]) + # TODO: Re-evaluate the need for this / streamline with common config. + if env["target"] == "template_release": + env.Append(LINKFLAGS=["/ENTRY:mainCRTStartup"]) if env["windows_subsystem"] == "gui": env.Append(LINKFLAGS=["/SUBSYSTEM:WINDOWS"]) @@ -448,6 +422,9 @@ def configure_msvc(env, vcvars_msvc_config): ## LTO + if env["lto"] == "auto": # No LTO by default for MSVC, doesn't help. + env["lto"] = "none" + if env["lto"] != "none": if env["lto"] == "thin": print("ThinLTO is only compatible with LLVM, use `use_llvm=yes` or `lto=full`.") @@ -489,31 +466,10 @@ def configure_mingw(env): if env["use_llvm"] and not try_cmd("clang --version", env["mingw_prefix"], env["arch"]): env["use_llvm"] = False - if env["target"] == "release": + # TODO: Re-evaluate the need for this / streamline with common config. + if env["target"] == "template_release": env.Append(CCFLAGS=["-msse2"]) - - if env["optimize"] == "speed": # optimize for speed (default) - if env["arch"] == "x86_32": - env.Append(CCFLAGS=["-O2"]) - else: - env.Append(CCFLAGS=["-O3"]) - else: # optimize for size - env.Prepend(CCFLAGS=["-Os"]) - - if env["debug_symbols"]: - env.Prepend(CCFLAGS=["-g2"]) - - elif env["target"] == "release_debug": - env.Append(CCFLAGS=["-O2"]) - if env["debug_symbols"]: - env.Prepend(CCFLAGS=["-g2"]) - if env["optimize"] == "speed": # optimize for speed (default) - env.Append(CCFLAGS=["-O2"]) - else: # optimize for size - env.Prepend(CCFLAGS=["-Os"]) - - elif env["target"] == "debug": - env.Append(CCFLAGS=["-g3"]) + elif env.dev_build: # Allow big objects. It's supposed not to have drawbacks but seems to break # GCC LTO, so enabling for debug builds only (which are not built with LTO # and are the only ones with too big objects). @@ -564,6 +520,11 @@ def configure_mingw(env): if try_cmd("gcc-ranlib --version", env["mingw_prefix"], env["arch"]): env["RANLIB"] = mingw_bin_prefix + "gcc-ranlib" + ## LTO + + if env["lto"] == "auto": # Full LTO for production with MinGW. + env["lto"] = "full" + if env["lto"] != "none": if env["lto"] == "thin": if not env["use_llvm"]: @@ -632,7 +593,7 @@ def configure_mingw(env): env.Append(BUILDERS={"RES": env.Builder(action=build_res_file, suffix=".o", src_suffix=".rc")}) -def configure(env): +def configure(env: "Environment"): # Validate arch. supported_arches = ["x86_32", "x86_64", "arm32", "arm64"] if env["arch"] not in supported_arches: diff --git a/platform/windows/display_server_windows.cpp b/platform/windows/display_server_windows.cpp index b4949de3f7..9e958be26f 100644 --- a/platform/windows/display_server_windows.cpp +++ b/platform/windows/display_server_windows.cpp @@ -104,7 +104,10 @@ void DisplayServerWindows::_set_mouse_mode_impl(MouseMode p_mode) { if (windows.has(MAIN_WINDOW_ID) && (p_mode == MOUSE_MODE_CAPTURED || p_mode == MOUSE_MODE_CONFINED || p_mode == MOUSE_MODE_CONFINED_HIDDEN)) { // Mouse is grabbed (captured or confined). - WindowID window_id = windows.has(last_focused_window) ? last_focused_window : MAIN_WINDOW_ID; + WindowID window_id = _get_focused_window_or_popup(); + if (!windows.has(window_id)) { + window_id = MAIN_WINDOW_ID; + } WindowData &wd = windows[window_id]; @@ -119,11 +122,15 @@ void DisplayServerWindows::_set_mouse_mode_impl(MouseMode p_mode) { ClientToScreen(wd.hWnd, &pos); SetCursorPos(pos.x, pos.y); SetCapture(wd.hWnd); + + _register_raw_input_devices(window_id); } } else { // Mouse is free to move around (not captured or confined). ReleaseCapture(); ClipCursor(nullptr); + + _register_raw_input_devices(INVALID_WINDOW_ID); } if (p_mode == MOUSE_MODE_HIDDEN || p_mode == MOUSE_MODE_CAPTURED || p_mode == MOUSE_MODE_CONFINED_HIDDEN) { @@ -139,6 +146,37 @@ void DisplayServerWindows::_set_mouse_mode_impl(MouseMode p_mode) { } } +DisplayServer::WindowID DisplayServerWindows::_get_focused_window_or_popup() const { + const List<WindowID>::Element *E = popup_list.back(); + if (E) { + return E->get(); + } + + return last_focused_window; +} + +void DisplayServerWindows::_register_raw_input_devices(WindowID p_target_window) { + use_raw_input = true; + + RAWINPUTDEVICE rid[1] = {}; + rid[0].usUsagePage = 0x01; + rid[0].usUsage = 0x02; + rid[0].dwFlags = 0; + + if (p_target_window != INVALID_WINDOW_ID && windows.has(p_target_window)) { + // Follow the defined window + rid[0].hwndTarget = windows[p_target_window].hWnd; + } else { + // Follow the keyboard focus + rid[0].hwndTarget = 0; + } + + if (RegisterRawInputDevices(rid, 1, sizeof(rid[0])) == FALSE) { + // Registration failed. + use_raw_input = false; + } +} + bool DisplayServerWindows::tts_is_speaking() const { ERR_FAIL_COND_V(!tts, false); return tts->is_speaking(); @@ -194,7 +232,9 @@ DisplayServer::MouseMode DisplayServerWindows::mouse_get_mode() const { void DisplayServerWindows::warp_mouse(const Point2i &p_position) { _THREAD_SAFE_METHOD_ - if (!windows.has(last_focused_window)) { + WindowID window_id = _get_focused_window_or_popup(); + + if (!windows.has(window_id)) { return; // No focused window? } @@ -205,7 +245,7 @@ void DisplayServerWindows::warp_mouse(const Point2i &p_position) { POINT p; p.x = p_position.x; p.y = p_position.y; - ClientToScreen(windows[last_focused_window].hWnd, &p); + ClientToScreen(windows[window_id].hWnd, &p); SetCursorPos(p.x, p.y); } @@ -525,7 +565,7 @@ bool DisplayServerWindows::screen_is_touchscreen(int p_screen) const { #ifndef _MSC_VER #warning touchscreen not working #endif - return false; + return DisplayServer::screen_is_touchscreen(p_screen); } void DisplayServerWindows::screen_set_orientation(ScreenOrientation p_orientation, int p_screen) { @@ -645,7 +685,13 @@ void DisplayServerWindows::show_window(WindowID p_id) { _update_window_style(p_id); } - if (wd.no_focus || wd.is_popup) { + if (wd.maximized) { + ShowWindow(wd.hWnd, SW_SHOWMAXIMIZED); + SetForegroundWindow(wd.hWnd); // Slightly higher priority. + SetFocus(wd.hWnd); // Set keyboard focus. + } else if (wd.minimized) { + ShowWindow(wd.hWnd, SW_SHOWMINIMIZED); + } else if (wd.no_focus || wd.is_popup) { // https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-showwindow ShowWindow(wd.hWnd, SW_SHOWNA); } else { @@ -886,7 +932,7 @@ void DisplayServerWindows::window_set_position(const Point2i &p_position, Window ERR_FAIL_COND(!windows.has(p_window)); WindowData &wd = windows[p_window]; - if (wd.fullscreen) { + if (wd.fullscreen || wd.maximized) { return; } @@ -1019,6 +1065,10 @@ void DisplayServerWindows::window_set_size(const Size2i p_size, WindowID p_windo ERR_FAIL_COND(!windows.has(p_window)); WindowData &wd = windows[p_window]; + if (wd.fullscreen || wd.maximized) { + return; + } + int w = p_size.width; int h = p_size.height; @@ -1036,10 +1086,6 @@ void DisplayServerWindows::window_set_size(const Size2i p_size, WindowID p_windo } #endif - if (wd.fullscreen) { - return; - } - RECT rect; GetWindowRect(wd.hWnd, &rect); @@ -1496,7 +1542,7 @@ void DisplayServerWindows::cursor_set_shape(CursorShape p_shape) { IDC_HELP }; - if (cursors[p_shape] != nullptr) { + if (cursors_cache.has(p_shape)) { SetCursor(cursors[p_shape]); } else { SetCursor(LoadCursor(hInstance, win_cursors[p_shape])); @@ -1509,55 +1555,6 @@ DisplayServer::CursorShape DisplayServerWindows::cursor_get_shape() const { return cursor_shape; } -void DisplayServerWindows::GetMaskBitmaps(HBITMAP hSourceBitmap, COLORREF clrTransparent, OUT HBITMAP &hAndMaskBitmap, OUT HBITMAP &hXorMaskBitmap) { - // Get the system display DC. - HDC hDC = GetDC(nullptr); - - // Create helper DC. - HDC hMainDC = CreateCompatibleDC(hDC); - HDC hAndMaskDC = CreateCompatibleDC(hDC); - HDC hXorMaskDC = CreateCompatibleDC(hDC); - - // Get the dimensions of the source bitmap. - BITMAP bm; - GetObject(hSourceBitmap, sizeof(BITMAP), &bm); - - // Create the mask bitmaps. - hAndMaskBitmap = CreateCompatibleBitmap(hDC, bm.bmWidth, bm.bmHeight); // Color. - hXorMaskBitmap = CreateCompatibleBitmap(hDC, bm.bmWidth, bm.bmHeight); // Color. - - // Release the system display DC. - ReleaseDC(nullptr, hDC); - - // Select the bitmaps to helper DC. - HBITMAP hOldMainBitmap = (HBITMAP)SelectObject(hMainDC, hSourceBitmap); - HBITMAP hOldAndMaskBitmap = (HBITMAP)SelectObject(hAndMaskDC, hAndMaskBitmap); - HBITMAP hOldXorMaskBitmap = (HBITMAP)SelectObject(hXorMaskDC, hXorMaskBitmap); - - // Assign the monochrome AND mask bitmap pixels so that the pixels of the source bitmap - // with 'clrTransparent' will be white pixels of the monochrome bitmap. - SetBkColor(hMainDC, clrTransparent); - BitBlt(hAndMaskDC, 0, 0, bm.bmWidth, bm.bmHeight, hMainDC, 0, 0, SRCCOPY); - - // Assign the color XOR mask bitmap pixels so that the pixels of the source bitmap - // with 'clrTransparent' will be black and rest the pixels same as corresponding - // pixels of the source bitmap. - SetBkColor(hXorMaskDC, RGB(0, 0, 0)); - SetTextColor(hXorMaskDC, RGB(255, 255, 255)); - BitBlt(hXorMaskDC, 0, 0, bm.bmWidth, bm.bmHeight, hAndMaskDC, 0, 0, SRCCOPY); - BitBlt(hXorMaskDC, 0, 0, bm.bmWidth, bm.bmHeight, hMainDC, 0, 0, SRCAND); - - // Deselect bitmaps from the helper DC. - SelectObject(hMainDC, hOldMainBitmap); - SelectObject(hAndMaskDC, hOldAndMaskBitmap); - SelectObject(hXorMaskDC, hOldXorMaskBitmap); - - // Delete the helper DC. - DeleteDC(hXorMaskDC); - DeleteDC(hAndMaskDC); - DeleteDC(hMainDC); -} - void DisplayServerWindows::cursor_set_custom_image(const Ref<Resource> &p_cursor, CursorShape p_shape, const Vector2 &p_hotspot) { _THREAD_SAFE_METHOD_ @@ -1610,8 +1607,26 @@ void DisplayServerWindows::cursor_set_custom_image(const Ref<Resource> &p_cursor UINT image_size = texture_size.width * texture_size.height; // Create the BITMAP with alpha channel. - COLORREF *buffer = (COLORREF *)memalloc(sizeof(COLORREF) * image_size); - + COLORREF *buffer = nullptr; + + BITMAPV5HEADER bi; + ZeroMemory(&bi, sizeof(bi)); + bi.bV5Size = sizeof(bi); + bi.bV5Width = texture_size.width; + bi.bV5Height = -texture_size.height; + bi.bV5Planes = 1; + bi.bV5BitCount = 32; + bi.bV5Compression = BI_BITFIELDS; + bi.bV5RedMask = 0x00ff0000; + bi.bV5GreenMask = 0x0000ff00; + bi.bV5BlueMask = 0x000000ff; + bi.bV5AlphaMask = 0xff000000; + + HDC dc = GetDC(nullptr); + HBITMAP bitmap = CreateDIBSection(dc, reinterpret_cast<BITMAPINFO *>(&bi), DIB_RGB_COLORS, reinterpret_cast<void **>(&buffer), nullptr, 0); + HBITMAP mask = CreateBitmap(texture_size.width, texture_size.height, 1, 1, nullptr); + + bool fully_transparent = true; for (UINT index = 0; index < image_size; index++) { int row_index = floor(index / texture_size.width) + atlas_rect.position.y; int column_index = (index % int(texture_size.width)) + atlas_rect.position.x; @@ -1620,39 +1635,28 @@ void DisplayServerWindows::cursor_set_custom_image(const Ref<Resource> &p_cursor column_index = MIN(column_index, atlas_rect.size.width - 1); row_index = MIN(row_index, atlas_rect.size.height - 1); } + const Color &c = image->get_pixel(column_index, row_index); + fully_transparent = fully_transparent && (c.a == 0.f); - *(buffer + index) = image->get_pixel(column_index, row_index).to_argb32(); - } - - // Using 4 channels, so 4 * 8 bits. - HBITMAP bitmap = CreateBitmap(texture_size.width, texture_size.height, 1, 4 * 8, buffer); - COLORREF clrTransparent = -1; - - // Create the AND and XOR masks for the bitmap. - HBITMAP hAndMask = nullptr; - HBITMAP hXorMask = nullptr; - - GetMaskBitmaps(bitmap, clrTransparent, hAndMask, hXorMask); - - if (nullptr == hAndMask || nullptr == hXorMask) { - memfree(buffer); - DeleteObject(bitmap); - return; + *(buffer + index) = c.to_argb32(); } // Finally, create the icon. - ICONINFO iconinfo; - iconinfo.fIcon = FALSE; - iconinfo.xHotspot = p_hotspot.x; - iconinfo.yHotspot = p_hotspot.y; - iconinfo.hbmMask = hAndMask; - iconinfo.hbmColor = hXorMask; - if (cursors[p_shape]) { DestroyIcon(cursors[p_shape]); } - cursors[p_shape] = CreateIconIndirect(&iconinfo); + if (fully_transparent) { + cursors[p_shape] = nullptr; + } else { + ICONINFO iconinfo; + iconinfo.fIcon = FALSE; + iconinfo.xHotspot = p_hotspot.x; + iconinfo.yHotspot = p_hotspot.y; + iconinfo.hbmMask = mask; + iconinfo.hbmColor = bitmap; + cursors[p_shape] = CreateIconIndirect(&iconinfo); + } Vector<Variant> params; params.push_back(p_cursor); @@ -1665,17 +1669,15 @@ void DisplayServerWindows::cursor_set_custom_image(const Ref<Resource> &p_cursor } } - DeleteObject(hAndMask); - DeleteObject(hXorMask); - - memfree(buffer); + DeleteObject(mask); DeleteObject(bitmap); + ReleaseDC(nullptr, dc); } else { // Reset to default system cursor. if (cursors[p_shape]) { DestroyIcon(cursors[p_shape]); - cursors[p_shape] = nullptr; } + cursors[p_shape] = nullptr; CursorShape c = cursor_shape; cursor_shape = CURSOR_MAX; @@ -2419,14 +2421,14 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA } break; case WM_SETTINGCHANGE: { if (lParam && CompareStringOrdinal(reinterpret_cast<LPCWCH>(lParam), -1, L"ImmersiveColorSet", -1, true) == CSTR_EQUAL) { - if (is_dark_mode_supported()) { + if (is_dark_mode_supported() && dark_title_available) { BOOL value = is_dark_mode(); ::DwmSetWindowAttribute(windows[window_id].hWnd, DWMWA_USE_IMMERSIVE_DARK_MODE, &value, sizeof(value)); } } } break; case WM_THEMECHANGED: { - if (is_dark_mode_supported()) { + if (is_dark_mode_supported() && dark_title_available) { BOOL value = is_dark_mode(); ::DwmSetWindowAttribute(windows[window_id].hWnd, DWMWA_USE_IMMERSIVE_DARK_MODE, &value, sizeof(value)); } @@ -2527,7 +2529,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA old_y = coords.y; } - if (windows[window_id].window_has_focus && mm->get_relative() != Vector2()) { + if ((windows[window_id].window_has_focus || windows[window_id].is_popup) && mm->get_relative() != Vector2()) { Input::get_singleton()->parse_input_event(mm); } } @@ -2552,24 +2554,27 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA if ((tablet_get_current_driver() == "wintab") && wintab_available && windows[window_id].wtctx) { PACKET packet; if (wintab_WTPacket(windows[window_id].wtctx, wParam, &packet)) { - float pressure = float(packet.pkNormalPressure - windows[window_id].min_pressure) / float(windows[window_id].max_pressure - windows[window_id].min_pressure); - windows[window_id].last_pressure = pressure; + POINT coords; + GetCursorPos(&coords); + ScreenToClient(windows[window_id].hWnd, &coords); + windows[window_id].last_pressure_update = 0; + float pressure = float(packet.pkNormalPressure - windows[window_id].min_pressure) / float(windows[window_id].max_pressure - windows[window_id].min_pressure); double azim = (packet.pkOrientation.orAzimuth / 10.0f) * (Math_PI / 180); double alt = Math::tan((Math::abs(packet.pkOrientation.orAltitude / 10.0f)) * (Math_PI / 180)); + bool inverted = packet.pkStatus & TPS_INVERT; - if (windows[window_id].tilt_supported) { - windows[window_id].last_tilt = Vector2(Math::atan(Math::sin(azim) / alt), Math::atan(Math::cos(azim) / alt)); - } else { - windows[window_id].last_tilt = Vector2(); - } + Vector2 tilt = (windows[window_id].tilt_supported) ? Vector2(Math::atan(Math::sin(azim) / alt), Math::atan(Math::cos(azim) / alt)) : Vector2(); - windows[window_id].last_pen_inverted = packet.pkStatus & TPS_INVERT; + // Nothing changed, ignore event. + if (!old_invalid && coords.x == old_x && coords.y == old_y && windows[window_id].last_pressure == pressure && windows[window_id].last_tilt == tilt && windows[window_id].last_pen_inverted == inverted) { + break; + } - POINT coords; - GetCursorPos(&coords); - ScreenToClient(windows[window_id].hWnd, &coords); + windows[window_id].last_pressure = pressure; + windows[window_id].last_tilt = tilt; + windows[window_id].last_pen_inverted = inverted; // Don't calculate relative mouse movement if we don't have focus in CAPTURED mode. if (!windows[window_id].window_has_focus && mouse_mode == MOUSE_MODE_CAPTURED) { @@ -3350,7 +3355,7 @@ void DisplayServerWindows::_process_key_events() { k->set_ctrl_pressed(ke.control); k->set_meta_pressed(ke.meta); k->set_pressed(true); - k->set_keycode((Key)KeyMappingWindows::get_keysym(ke.wParam)); + k->set_keycode((Key)KeyMappingWindows::get_keysym(MapVirtualKey((ke.lParam >> 16) & 0xFF, MAPVK_VSC_TO_VK))); k->set_physical_keycode((Key)(KeyMappingWindows::get_scansym((ke.lParam >> 16) & 0xFF, ke.lParam & (1 << 24)))); k->set_unicode(unicode); if (k->get_unicode() && gr_mem) { @@ -3541,7 +3546,7 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode, wd.pre_fs_valid = true; } - if (is_dark_mode_supported()) { + if (is_dark_mode_supported() && dark_title_available) { BOOL value = is_dark_mode(); ::DwmSetWindowAttribute(wd.hWnd, DWMWA_USE_IMMERSIVE_DARK_MODE, &value, sizeof(value)); } @@ -3603,6 +3608,16 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode, wd.wtctx = 0; } + if (p_mode == WINDOW_MODE_MAXIMIZED) { + wd.maximized = true; + wd.minimized = false; + } + + if (p_mode == WINDOW_MODE_MINIMIZED) { + wd.maximized = false; + wd.minimized = true; + } + wd.last_pressure = 0; wd.last_pressure_update = 0; wd.last_tilt = Vector2(); @@ -3633,6 +3648,7 @@ WTPacketPtr DisplayServerWindows::wintab_WTPacket = nullptr; WTEnablePtr DisplayServerWindows::wintab_WTEnable = nullptr; // UXTheme API. +bool DisplayServerWindows::dark_title_available = false; bool DisplayServerWindows::ux_theme_available = false; IsDarkModeAllowedForAppPtr DisplayServerWindows::IsDarkModeAllowedForApp = nullptr; ShouldAppsUseDarkModePtr DisplayServerWindows::ShouldAppsUseDarkMode = nullptr; @@ -3725,7 +3741,21 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win // Enforce default keep screen on value. screen_set_keep_on(GLOBAL_GET("display/window/energy_saving/keep_screen_on")); - // Load UXTheme + // Load Windows version info. + OSVERSIONINFOW os_ver; + ZeroMemory(&os_ver, sizeof(OSVERSIONINFOW)); + os_ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW); + + HMODULE nt_lib = LoadLibraryW(L"ntdll.dll"); + if (nt_lib) { + RtlGetVersionPtr RtlGetVersion = (RtlGetVersionPtr)GetProcAddress(nt_lib, "RtlGetVersion"); + if (RtlGetVersion) { + RtlGetVersion(&os_ver); + } + FreeLibrary(nt_lib); + } + + // Load UXTheme. HMODULE ux_theme_lib = LoadLibraryW(L"uxtheme.dll"); if (ux_theme_lib) { IsDarkModeAllowedForApp = (IsDarkModeAllowedForAppPtr)GetProcAddress(ux_theme_lib, MAKEINTRESOURCEA(136)); @@ -3735,6 +3765,9 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win GetImmersiveUserColorSetPreference = (GetImmersiveUserColorSetPreferencePtr)GetProcAddress(ux_theme_lib, MAKEINTRESOURCEA(98)); ux_theme_available = IsDarkModeAllowedForApp && ShouldAppsUseDarkMode && GetImmersiveColorFromColorSetEx && GetImmersiveColorTypeFromName && GetImmersiveUserColorSetPreference; + if (os_ver.dwBuildNumber >= 22000) { + dark_title_available = true; + } } // Note: Wacom WinTab driver API for pen input, for devices incompatible with Windows Ink. @@ -3799,19 +3832,7 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win return; } - use_raw_input = true; - - RAWINPUTDEVICE Rid[1]; - - Rid[0].usUsagePage = 0x01; - Rid[0].usUsage = 0x02; - Rid[0].dwFlags = 0; - Rid[0].hwndTarget = 0; - - if (RegisterRawInputDevices(Rid, 1, sizeof(Rid[0])) == FALSE) { - // Registration failed. - use_raw_input = false; - } + _register_raw_input_devices(INVALID_WINDOW_ID); #if defined(VULKAN_ENABLED) if (rendering_driver == "vulkan") { diff --git a/platform/windows/display_server_windows.h b/platform/windows/display_server_windows.h index dbc9821970..3523e8b3d1 100644 --- a/platform/windows/display_server_windows.h +++ b/platform/windows/display_server_windows.h @@ -61,9 +61,9 @@ #include "gl_manager_windows.h" #endif -#include <fcntl.h> #include <io.h> #include <stdio.h> + #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <windowsx.h> @@ -157,6 +157,7 @@ typedef bool(WINAPI *ShouldAppsUseDarkModePtr)(); typedef DWORD(WINAPI *GetImmersiveColorFromColorSetExPtr)(UINT dwImmersiveColorSet, UINT dwImmersiveColorType, bool bIgnoreHighContrast, UINT dwHighContrastCacheMode); typedef int(WINAPI *GetImmersiveColorTypeFromNamePtr)(const WCHAR *name); typedef int(WINAPI *GetImmersiveUserColorSetPreferencePtr)(bool bForceCheckRegistry, bool bSkipCheckOnFail); +typedef HRESULT(WINAPI *RtlGetVersionPtr)(OSVERSIONINFOW *lpVersionInformation); // Windows Ink API #ifndef POINTER_STRUCTURES @@ -285,6 +286,7 @@ class DisplayServerWindows : public DisplayServer { _THREAD_SAFE_CLASS_ // UXTheme API + static bool dark_title_available; static bool ux_theme_available; static IsDarkModeAllowedForAppPtr IsDarkModeAllowedForApp; static ShouldAppsUseDarkModePtr ShouldAppsUseDarkMode; @@ -309,8 +311,6 @@ class DisplayServerWindows : public DisplayServer { String tablet_driver; Vector<String> tablet_drivers; - void GetMaskBitmaps(HBITMAP hSourceBitmap, COLORREF clrTransparent, OUT HBITMAP &hAndMaskBitmap, OUT HBITMAP &hXorMaskBitmap); - enum { KEY_EVENT_BUFFER_SIZE = 512 }; @@ -466,6 +466,8 @@ class DisplayServerWindows : public DisplayServer { void _update_real_mouse_position(WindowID p_window); void _set_mouse_mode_impl(MouseMode p_mode); + WindowID _get_focused_window_or_popup() const; + void _register_raw_input_devices(WindowID p_target_window); void _process_activate_event(WindowID p_window_id, WPARAM wParam, LPARAM lParam); void _process_key_events(); diff --git a/platform/windows/export/export.cpp b/platform/windows/export/export.cpp index 20320470b8..8f91756c02 100644 --- a/platform/windows/export/export.cpp +++ b/platform/windows/export/export.cpp @@ -34,6 +34,7 @@ #include "export_plugin.h" void register_windows_exporter() { +#ifndef ANDROID_ENABLED EDITOR_DEF("export/windows/rcedit", ""); EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/windows/rcedit", PROPERTY_HINT_GLOBAL_FILE, "*.exe")); #ifdef WINDOWS_ENABLED @@ -46,6 +47,7 @@ void register_windows_exporter() { EDITOR_DEF("export/windows/wine", ""); EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/windows/wine", PROPERTY_HINT_GLOBAL_FILE)); #endif +#endif Ref<EditorExportPlatformWindows> platform; platform.instantiate(); diff --git a/platform/windows/gl_manager_windows.cpp b/platform/windows/gl_manager_windows.cpp index d509ff8c51..7689751f1b 100644 --- a/platform/windows/gl_manager_windows.cpp +++ b/platform/windows/gl_manager_windows.cpp @@ -289,12 +289,7 @@ void GLManager_Windows::make_current() { } void GLManager_Windows::swap_buffers() { - // on other platforms, OpenGL swaps buffers for all windows (on all displays, really?) - // Windows swaps buffers on a per-window basis - // REVISIT: this could be structurally bad, should we have "dirty" flags then? - for (KeyValue<DisplayServer::WindowID, GLWindow> &entry : _windows) { - SwapBuffers(entry.value.hDC); - } + SwapBuffers(_current_window->hDC); } Error GLManager_Windows::initialize() { diff --git a/platform/windows/godot.natvis b/platform/windows/godot.natvis index cdd1c14978..36b0919185 100644 --- a/platform/windows/godot.natvis +++ b/platform/windows/godot.natvis @@ -32,6 +32,38 @@ </Expand> </Type> + <Type Name="HashMap<*,*>"> + <Expand> + <Item Name="[size]">num_elements</Item> + <LinkedListItems> + <Size>num_elements</Size> + <HeadPointer>head_element</HeadPointer> + <NextPointer>next</NextPointer> + <ValueNode>data</ValueNode> + </LinkedListItems> + </Expand> + </Type> + + <Type Name="VMap<*,*>"> + <Expand> + <Item Condition="_cowdata._ptr" Name="[size]">*(reinterpret_cast<int*>(_cowdata._ptr) - 1)</Item> + <ArrayItems Condition="_cowdata._ptr"> + <Size>*(reinterpret_cast<int*>(_cowdata._ptr) - 1)</Size> + <ValuePointer>reinterpret_cast<VMap<$T1,$T2>::Pair*>(_cowdata._ptr)</ValuePointer> + </ArrayItems> + </Expand> + </Type> + + <Type Name="VMap<Callable,*>::Pair"> + <DisplayString Condition="dynamic_cast<CallableCustomMethodPointerBase*>(key.custom)">{dynamic_cast<CallableCustomMethodPointerBase*>(key.custom)->text}</DisplayString> + </Type> + + <!-- requires PR 64364 + <Type Name="GDScriptThreadContext"> + <DisplayString Condition="_is_main == true">main thread {_debug_thread_id}</DisplayString> + </Type> + --> + <Type Name="Variant"> <DisplayString Condition="type == Variant::NIL">nil</DisplayString> <DisplayString Condition="type == Variant::BOOL">{_data._bool}</DisplayString> @@ -55,15 +87,17 @@ <DisplayString Condition="type == Variant::OBJECT">{*(Object *)_data._mem}</DisplayString> <DisplayString Condition="type == Variant::DICTIONARY">{*(Dictionary *)_data._mem}</DisplayString> <DisplayString Condition="type == Variant::ARRAY">{*(Array *)_data._mem}</DisplayString> - <DisplayString Condition="type == Variant::PACKED_BYTE_ARRAY">{*(PackedByteArray *)_data._mem}</DisplayString> - <DisplayString Condition="type == Variant::PACKED_INT32_ARRAY">{*(PackedInt32Array *)_data._mem}</DisplayString> + <DisplayString Condition="type == Variant::PACKED_BYTE_ARRAY">{reinterpret_cast<const Variant::PackedArrayRef<unsigned char>*>(_data.packed_array)->array}</DisplayString> + <DisplayString Condition="type == Variant::PACKED_INT32_ARRAY">{reinterpret_cast<const Variant::PackedArrayRef<int>*>(_data.packed_array)->array}</DisplayString> + <!-- broken, will show incorrect data <DisplayString Condition="type == Variant::PACKED_INT64_ARRAY">{*(PackedInt64Array *)_data._mem}</DisplayString> - <DisplayString Condition="type == Variant::PACKED_FLOAT32_ARRAY">{*(PackedFloat32Array *)_data._mem}</DisplayString> - <DisplayString Condition="type == Variant::PACKED_FLOAT64_ARRAY">{*(PackedFloat64Array *)_data._mem}</DisplayString> - <DisplayString Condition="type == Variant::PACKED_STRING_ARRAY">{*(PackedStringArray *)_data._mem}</DisplayString> - <DisplayString Condition="type == Variant::PACKED_VECTOR2_ARRAY">{*(PackedVector2Array *)_data._mem}</DisplayString> - <DisplayString Condition="type == Variant::PACKED_VECTOR3_ARRAY">{*(PackedVector3Array *)_data._mem}</DisplayString> - <DisplayString Condition="type == Variant::PACKED_COLOR_ARRAY">{*(PackedColorArray *)_data._mem}</DisplayString> + --> + <DisplayString Condition="type == Variant::PACKED_FLOAT32_ARRAY">{reinterpret_cast<const Variant::PackedArrayRef<float>*>(_data.packed_array)->array}</DisplayString> + <DisplayString Condition="type == Variant::PACKED_FLOAT64_ARRAY">{reinterpret_cast<const Variant::PackedArrayRef<double>*>(_data.packed_array)->array}</DisplayString> + <DisplayString Condition="type == Variant::PACKED_STRING_ARRAY">{reinterpret_cast<const Variant::PackedArrayRef<String>*>(_data.packed_array)->array}</DisplayString> + <DisplayString Condition="type == Variant::PACKED_VECTOR2_ARRAY">{reinterpret_cast<const Variant::PackedArrayRef<Vector2>*>(_data.packed_array)->array}</DisplayString> + <DisplayString Condition="type == Variant::PACKED_VECTOR3_ARRAY">{reinterpret_cast<const Variant::PackedArrayRef<Vector3>*>(_data.packed_array)->array}</DisplayString> + <DisplayString Condition="type == Variant::PACKED_COLOR_ARRAY">{reinterpret_cast<const Variant::PackedArrayRef<Color>*>(_data.packed_array)->array}</DisplayString> <StringView Condition="type == Variant::STRING && ((String *)(_data._mem))->_cowdata._ptr">((String *)(_data._mem))->_cowdata._ptr,s32</StringView> @@ -87,7 +121,7 @@ <Item Name="[value]" Condition="type == Variant::OBJECT">*(Object *)_data._mem</Item> <Item Name="[value]" Condition="type == Variant::DICTIONARY">*(Dictionary *)_data._mem</Item> <Item Name="[value]" Condition="type == Variant::ARRAY">*(Array *)_data._mem</Item> - <Item Name="[value]" Condition="type == Variant::PACKED_BYTE_ARRAY">*(PackedByteArray *)_data._mem</Item> + <Item Name="[value]" Condition="type == Variant::PACKED_BYTE_ARRAY">reinterpret_cast<const Variant::PackedArrayRef<unsigned char>*>(_data.packed_array)->array</Item> <Item Name="[value]" Condition="type == Variant::PACKED_INT32_ARRAY">*(PackedInt32Array *)_data._mem</Item> <Item Name="[value]" Condition="type == Variant::PACKED_INT64_ARRAY">*(PackedInt64Array *)_data._mem</Item> <Item Name="[value]" Condition="type == Variant::PACKED_FLOAT32_ARRAY">*(PackedFloat32Array *)_data._mem</Item> @@ -105,6 +139,14 @@ <StringView Condition="_cowdata._ptr != 0">_cowdata._ptr,s32</StringView> </Type> + <Type Name="godot::String"> + <DisplayString>{*reinterpret_cast<void**>(opaque),s32}</DisplayString> + <Expand> + <Item Name="opaque_ptr">*reinterpret_cast<void**>(opaque)</Item> + <Item Name="string">*reinterpret_cast<void**>(opaque),s32</Item> + </Expand> + </Type> + <Type Name="StringName"> <DisplayString Condition="_data && _data->cname">{_data->cname}</DisplayString> <DisplayString Condition="_data && !_data->cname">{_data->name,s32}</DisplayString> @@ -113,6 +155,22 @@ <StringView Condition="_data && !_data->cname">_data->name,s32</StringView> </Type> + <!-- can't cast the opaque to ::StringName because Natvis does not support global namespace specifier? --> + <Type Name="godot::StringName"> + <DisplayString Condition="(*reinterpret_cast<const char***>(opaque))[1]">{(*reinterpret_cast<const char***>(opaque))[1],s8}</DisplayString> + <DisplayString Condition="!(*reinterpret_cast<const char***>(opaque))[1]">{(*reinterpret_cast<const char***>(opaque))[2],s32}</DisplayString> + <Expand> + <Item Name="opaque_ptr">*reinterpret_cast<void**>(opaque)</Item> + <Item Name="&cname">(*reinterpret_cast<const char***>(opaque))+1</Item> + <Item Name="cname">(*reinterpret_cast<const char***>(opaque))[1],s8</Item> + </Expand> + </Type> + + <Type Name="Object::SignalData"> + <DisplayString Condition="user.name._cowdata._ptr">"{user.name}" {slot_map}</DisplayString> + <DisplayString Condition="!user.name._cowdata._ptr">"{slot_map}</DisplayString> + </Type> + <Type Name="Vector2"> <DisplayString>{{{x},{y}}}</DisplayString> <Expand> @@ -149,12 +207,4 @@ <Item Name="alpha">a</Item> </Expand> </Type> - - <Type Name="Node" Inheritable="false"> - <Expand> - <Item Name="Object">(Object*)this</Item> - <Item Name="class_name">(StringName*)(((char*)this) + sizeof(Object))</Item> - <Item Name="data">(Node::Data*)(((char*)this) + sizeof(Object) + sizeof(StringName))</Item> - </Expand> - </Type> </AutoVisualizer> diff --git a/platform/windows/godot_windows.cpp b/platform/windows/godot_windows.cpp index 72920d2816..13602f7cbc 100644 --- a/platform/windows/godot_windows.cpp +++ b/platform/windows/godot_windows.cpp @@ -87,7 +87,8 @@ CommandLineToArgvA( i = 0; j = 0; - while ((a = CmdLine[i])) { + a = CmdLine[i]; + while (a) { if (in_QM) { if (a == '\"') { in_QM = FALSE; @@ -130,6 +131,7 @@ CommandLineToArgvA( } } i++; + a = CmdLine[i]; } _argv[j] = '\0'; argv[argc] = nullptr; diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index 403d53ae53..1978ec5ab6 100644 --- a/platform/windows/os_windows.cpp +++ b/platform/windows/os_windows.cpp @@ -290,7 +290,25 @@ String OS_Windows::get_name() const { return "Windows"; } -OS::Date OS_Windows::get_date(bool p_utc) const { +String OS_Windows::get_distribution_name() const { + return get_name(); +} + +String OS_Windows::get_version() const { + typedef LONG NTSTATUS, *PNTSTATUS; + typedef NTSTATUS(WINAPI * RtlGetVersionPtr)(PRTL_OSVERSIONINFOW); + RtlGetVersionPtr version_ptr = (RtlGetVersionPtr)GetProcAddress(GetModuleHandle("ntdll.dll"), "RtlGetVersion"); + if (version_ptr != nullptr) { + RTL_OSVERSIONINFOW fow = { 0 }; + fow.dwOSVersionInfoSize = sizeof(fow); + if (version_ptr(&fow) == 0x00000000) { + return vformat("%d.%d.%d", (int64_t)fow.dwMajorVersion, (int64_t)fow.dwMinorVersion, (int64_t)fow.dwBuildNumber); + } + } + return ""; +} + +OS::DateTime OS_Windows::get_datetime(bool p_utc) const { SYSTEMTIME systemtime; if (p_utc) { GetSystemTime(&systemtime); @@ -305,28 +323,16 @@ OS::Date OS_Windows::get_date(bool p_utc) const { daylight = true; } - Date date; - date.day = systemtime.wDay; - date.month = Month(systemtime.wMonth); - date.weekday = Weekday(systemtime.wDayOfWeek); - date.year = systemtime.wYear; - date.dst = daylight; - return date; -} - -OS::Time OS_Windows::get_time(bool p_utc) const { - SYSTEMTIME systemtime; - if (p_utc) { - GetSystemTime(&systemtime); - } else { - GetLocalTime(&systemtime); - } - - Time time; - time.hour = systemtime.wHour; - time.minute = systemtime.wMinute; - time.second = systemtime.wSecond; - return time; + DateTime dt; + dt.year = systemtime.wYear; + dt.month = Month(systemtime.wMonth); + dt.day = systemtime.wDay; + dt.weekday = Weekday(systemtime.wDayOfWeek); + dt.hour = systemtime.wHour; + dt.minute = systemtime.wMinute; + dt.second = systemtime.wSecond; + dt.dst = daylight; + return dt; } OS::TimeZoneInfo OS_Windows::get_time_zone_info() const { @@ -1146,6 +1152,21 @@ OS_Windows::OS_Windows(HINSTANCE _hInstance) { DisplayServerWindows::register_windows_driver(); + // Enable ANSI escape code support on Windows 10 v1607 (Anniversary Update) and later. + // This lets the engine and projects use ANSI escape codes to color text just like on macOS and Linux. + // + // NOTE: The engine does not use ANSI escape codes to color error/warning messages; it uses Windows API calls instead. + // Therefore, error/warning messages are still colored on Windows versions older than 10. + HANDLE stdoutHandle; + stdoutHandle = GetStdHandle(STD_OUTPUT_HANDLE); + DWORD outMode = 0; + outMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; + + if (!SetConsoleMode(stdoutHandle, outMode)) { + // Windows 8.1 or below, or Windows 10 prior to Anniversary Update. + print_verbose("Can't set the ENABLE_VIRTUAL_TERMINAL_PROCESSING Windows console mode. `print_rich()` will not work as expected."); + } + Vector<Logger *> loggers; loggers.push_back(memnew(WindowsTerminalLogger)); _set_logger(memnew(CompositeLogger(loggers))); diff --git a/platform/windows/os_windows.h b/platform/windows/os_windows.h index 3e054c068c..419871f8bf 100644 --- a/platform/windows/os_windows.h +++ b/platform/windows/os_windows.h @@ -40,6 +40,7 @@ #include "drivers/winmidi/midi_driver_winmidi.h" #include "key_mapping_windows.h" #include "servers/audio_server.h" + #ifdef XAUDIO2_ENABLED #include "drivers/xaudio2/audio_driver_xaudio2.h" #endif @@ -49,10 +50,10 @@ #include "platform/windows/vulkan_context_win.h" #endif -#include <fcntl.h> #include <io.h> #include <shellapi.h> #include <stdio.h> + #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <windowsx.h> @@ -143,11 +144,12 @@ public: virtual MainLoop *get_main_loop() const override; virtual String get_name() const override; + virtual String get_distribution_name() const override; + virtual String get_version() const override; virtual void initialize_joypads() override {} - virtual Date get_date(bool p_utc) const override; - virtual Time get_time(bool p_utc) const override; + virtual DateTime get_datetime(bool p_utc) const override; virtual TimeZoneInfo get_time_zone_info() const override; virtual double get_unix_time() const override; diff --git a/scene/2d/animated_sprite_2d.cpp b/scene/2d/animated_sprite_2d.cpp index b1b1cb23ed..7ee9861d3f 100644 --- a/scene/2d/animated_sprite_2d.cpp +++ b/scene/2d/animated_sprite_2d.cpp @@ -63,9 +63,13 @@ Rect2 AnimatedSprite2D::_edit_get_rect() const { } bool AnimatedSprite2D::_edit_use_rect() const { - if (!frames.is_valid() || !frames->has_animation(animation) || frame < 0 || frame >= frames->get_frame_count(animation)) { + if (frames.is_null() || !frames->has_animation(animation)) { return false; } + if (frame < 0 || frame >= frames->get_frame_count(animation)) { + return false; + } + Ref<Texture2D> t; if (animation) { t = frames->get_frame(animation, frame); @@ -79,7 +83,10 @@ Rect2 AnimatedSprite2D::get_anchorable_rect() const { } Rect2 AnimatedSprite2D::_get_rect() const { - if (!frames.is_valid() || !frames->has_animation(animation) || frame < 0 || frame >= frames->get_frame_count(animation)) { + if (frames.is_null() || !frames->has_animation(animation)) { + return Rect2(); + } + if (frame < 0 || frame >= frames->get_frame_count(animation)) { return Rect2(); } @@ -108,6 +115,7 @@ void AnimatedSprite2D::_validate_property(PropertyInfo &p_property) const { if (!frames.is_valid()) { return; } + if (p_property.name == "animation") { p_property.hint = PROPERTY_HINT_ENUM; List<StringName> names; @@ -137,9 +145,15 @@ void AnimatedSprite2D::_validate_property(PropertyInfo &p_property) const { p_property.hint_string = String(animation) + "," + p_property.hint_string; } } + return; } if (p_property.name == "frame") { + if (playing) { + p_property.usage = PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_READ_ONLY; + return; + } + p_property.hint = PROPERTY_HINT_RANGE; if (frames->has_animation(animation) && frames->get_frame_count(animation) > 0) { p_property.hint_string = "0," + itos(frames->get_frame_count(animation) - 1) + ",1"; @@ -154,54 +168,52 @@ void AnimatedSprite2D::_validate_property(PropertyInfo &p_property) const { void AnimatedSprite2D::_notification(int p_what) { switch (p_what) { case NOTIFICATION_INTERNAL_PROCESS: { - if (frames.is_null()) { + if (frames.is_null() || !frames->has_animation(animation)) { return; } - if (!frames->has_animation(animation)) { - return; - } - if (frame < 0) { - return; + + double speed = frames->get_animation_speed(animation) * Math::abs(speed_scale); + if (speed == 0) { + return; // Do nothing. } + int last_frame = frames->get_frame_count(animation) - 1; double remaining = get_process_delta_time(); - while (remaining) { - double speed = frames->get_animation_speed(animation) * speed_scale; - if (speed == 0) { - return; // Do nothing. - } - if (timeout <= 0) { timeout = _get_frame_duration(); - int fc = frames->get_frame_count(animation); - if ((!backwards && frame >= fc - 1) || (backwards && frame <= 0)) { - if (frames->get_animation_loop(animation)) { - if (backwards) { - frame = fc - 1; - } else { - frame = 0; - } - - emit_signal(SceneStringNames::get_singleton()->animation_finished); - } else { - if (backwards) { + if (!playing_backwards) { + // Forward. + if (frame >= last_frame) { + if (frames->get_animation_loop(animation)) { frame = 0; - } else { - frame = fc - 1; - } - - if (!is_over) { - is_over = true; emit_signal(SceneStringNames::get_singleton()->animation_finished); + } else { + frame = last_frame; + if (!is_over) { + is_over = true; + emit_signal(SceneStringNames::get_singleton()->animation_finished); + } } + } else { + frame++; } } else { - if (backwards) { - frame--; + // Reversed. + if (frame <= 0) { + if (frames->get_animation_loop(animation)) { + frame = last_frame; + emit_signal(SceneStringNames::get_singleton()->animation_finished); + } else { + frame = 0; + if (!is_over) { + is_over = true; + emit_signal(SceneStringNames::get_singleton()->animation_finished); + } + } } else { - frame++; + frame--; } } @@ -217,13 +229,7 @@ void AnimatedSprite2D::_notification(int p_what) { } break; case NOTIFICATION_DRAW: { - if (frames.is_null()) { - return; - } - if (frame < 0) { - return; - } - if (!frames->has_animation(animation)) { + if (frames.is_null() || !frames->has_animation(animation)) { return; } @@ -259,14 +265,15 @@ void AnimatedSprite2D::_notification(int p_what) { void AnimatedSprite2D::set_sprite_frames(const Ref<SpriteFrames> &p_frames) { if (frames.is_valid()) { - frames->disconnect("changed", callable_mp(this, &AnimatedSprite2D::_res_changed)); + frames->disconnect(SceneStringNames::get_singleton()->changed, callable_mp(this, &AnimatedSprite2D::_res_changed)); } + frames = p_frames; if (frames.is_valid()) { - frames->connect("changed", callable_mp(this, &AnimatedSprite2D::_res_changed)); + frames->connect(SceneStringNames::get_singleton()->changed, callable_mp(this, &AnimatedSprite2D::_res_changed)); } - if (!frames.is_valid()) { + if (frames.is_null()) { frame = 0; } else { set_frame(frame); @@ -283,7 +290,7 @@ Ref<SpriteFrames> AnimatedSprite2D::get_sprite_frames() const { } void AnimatedSprite2D::set_frame(int p_frame) { - if (!frames.is_valid()) { + if (frames.is_null()) { return; } @@ -314,11 +321,16 @@ int AnimatedSprite2D::get_frame() const { } void AnimatedSprite2D::set_speed_scale(double p_speed_scale) { + if (speed_scale == p_speed_scale) { + return; + } + double elapsed = _get_frame_duration() - timeout; - speed_scale = MAX(p_speed_scale, 0.0f); + speed_scale = p_speed_scale; + playing_backwards = signbit(speed_scale) != backwards; - // We adapt the timeout so that the animation speed adapts as soon as the speed scale is changed + // We adapt the timeout so that the animation speed adapts as soon as the speed scale is changed. _reset_timeout(); timeout -= elapsed; } @@ -378,18 +390,20 @@ void AnimatedSprite2D::set_playing(bool p_playing) { playing = p_playing; _reset_timeout(); set_process_internal(playing); + notify_property_list_changed(); } bool AnimatedSprite2D::is_playing() const { return playing; } -void AnimatedSprite2D::play(const StringName &p_animation, const bool p_backwards) { +void AnimatedSprite2D::play(const StringName &p_animation, bool p_backwards) { backwards = p_backwards; + playing_backwards = signbit(speed_scale) != backwards; if (p_animation) { set_animation(p_animation); - if (frames.is_valid() && backwards && get_frame() == 0) { + if (frames.is_valid() && playing_backwards && get_frame() == 0) { set_frame(frames->get_frame_count(p_animation) - 1); } } @@ -404,7 +418,7 @@ void AnimatedSprite2D::stop() { double AnimatedSprite2D::_get_frame_duration() { if (frames.is_valid() && frames->has_animation(animation)) { - double speed = frames->get_animation_speed(animation) * speed_scale; + double speed = frames->get_animation_speed(animation) * Math::abs(speed_scale); if (speed > 0) { return 1.0 / speed; } @@ -440,11 +454,11 @@ StringName AnimatedSprite2D::get_animation() const { return animation; } -TypedArray<String> AnimatedSprite2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray AnimatedSprite2D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (frames.is_null()) { - warnings.push_back(RTR("A SpriteFrames resource must be created or set in the \"Frames\" property in order for AnimatedSprite to display frames.")); + warnings.push_back(RTR("A SpriteFrames resource must be created or set in the \"Frames\" property in order for AnimatedSprite2D to display frames.")); } return warnings; diff --git a/scene/2d/animated_sprite_2d.h b/scene/2d/animated_sprite_2d.h index 0a19e250d8..11c4adb816 100644 --- a/scene/2d/animated_sprite_2d.h +++ b/scene/2d/animated_sprite_2d.h @@ -39,6 +39,7 @@ class AnimatedSprite2D : public Node2D { Ref<SpriteFrames> frames; bool playing = false; + bool playing_backwards = false; bool backwards = false; StringName animation = "default"; int frame = 0; @@ -81,7 +82,7 @@ public: void set_sprite_frames(const Ref<SpriteFrames> &p_frames); Ref<SpriteFrames> get_sprite_frames() const; - void play(const StringName &p_animation = StringName(), const bool p_backwards = false); + void play(const StringName &p_animation = StringName(), bool p_backwards = false); void stop(); void set_playing(bool p_playing); @@ -108,7 +109,7 @@ public: void set_flip_v(bool p_flip); bool is_flipped_v() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; virtual void get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const override; AnimatedSprite2D(); diff --git a/scene/2d/area_2d.cpp b/scene/2d/area_2d.cpp index 3def41eaa5..b3f80b5e43 100644 --- a/scene/2d/area_2d.cpp +++ b/scene/2d/area_2d.cpp @@ -459,6 +459,16 @@ TypedArray<Area2D> Area2D::get_overlapping_areas() const { return ret; } +bool Area2D::has_overlapping_bodies() const { + ERR_FAIL_COND_V_MSG(!monitoring, false, "Can't find overlapping bodies when monitoring is off."); + return !body_map.is_empty(); +} + +bool Area2D::has_overlapping_areas() const { + ERR_FAIL_COND_V_MSG(!monitoring, false, "Can't find overlapping areas when monitoring is off."); + return !area_map.is_empty(); +} + bool Area2D::overlaps_area(Node *p_area) const { ERR_FAIL_NULL_V(p_area, false); HashMap<ObjectID, AreaState>::ConstIterator E = area_map.find(p_area->get_instance_id()); @@ -578,6 +588,9 @@ void Area2D::_bind_methods() { ClassDB::bind_method(D_METHOD("get_overlapping_bodies"), &Area2D::get_overlapping_bodies); ClassDB::bind_method(D_METHOD("get_overlapping_areas"), &Area2D::get_overlapping_areas); + ClassDB::bind_method(D_METHOD("has_overlapping_bodies"), &Area2D::has_overlapping_bodies); + ClassDB::bind_method(D_METHOD("has_overlapping_areas"), &Area2D::has_overlapping_areas); + ClassDB::bind_method(D_METHOD("overlaps_body", "body"), &Area2D::overlaps_body); ClassDB::bind_method(D_METHOD("overlaps_area", "area"), &Area2D::overlaps_area); diff --git a/scene/2d/area_2d.h b/scene/2d/area_2d.h index 3d8d77eabb..f70f1dfc3d 100644 --- a/scene/2d/area_2d.h +++ b/scene/2d/area_2d.h @@ -180,6 +180,9 @@ public: TypedArray<Node2D> get_overlapping_bodies() const; //function for script TypedArray<Area2D> get_overlapping_areas() const; //function for script + bool has_overlapping_bodies() const; + bool has_overlapping_areas() const; + bool overlaps_area(Node *p_area) const; bool overlaps_body(Node *p_body) const; diff --git a/scene/2d/camera_2d.cpp b/scene/2d/camera_2d.cpp index a11b2b66bf..e120aa871b 100644 --- a/scene/2d/camera_2d.cpp +++ b/scene/2d/camera_2d.cpp @@ -172,7 +172,7 @@ Transform2D Camera2D::get_camera_transform() { Point2 screen_offset = (anchor_mode == ANCHOR_MODE_DRAG_CENTER ? (screen_size * 0.5 * zoom_scale) : Point2()); real_t angle = get_global_rotation(); - if (rotating) { + if (!ignore_rotation) { screen_offset = screen_offset.rotated(angle); } @@ -204,7 +204,7 @@ Transform2D Camera2D::get_camera_transform() { Transform2D xform; xform.scale_basis(zoom_scale); - if (rotating) { + if (!ignore_rotation) { xform.set_rotation(angle); } xform.set_origin(screen_rect.position); @@ -363,15 +363,15 @@ Camera2D::AnchorMode Camera2D::get_anchor_mode() const { return anchor_mode; } -void Camera2D::set_rotating(bool p_rotating) { - rotating = p_rotating; +void Camera2D::set_ignore_rotation(bool p_ignore) { + ignore_rotation = p_ignore; Point2 old_smoothed_camera_pos = smoothed_camera_pos; _update_scroll(); smoothed_camera_pos = old_smoothed_camera_pos; } -bool Camera2D::is_rotating() const { - return rotating; +bool Camera2D::is_ignoring_rotation() const { + return ignore_rotation; } void Camera2D::set_process_callback(Camera2DProcessCallback p_mode) { @@ -668,8 +668,8 @@ void Camera2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_anchor_mode", "anchor_mode"), &Camera2D::set_anchor_mode); ClassDB::bind_method(D_METHOD("get_anchor_mode"), &Camera2D::get_anchor_mode); - ClassDB::bind_method(D_METHOD("set_rotating", "rotating"), &Camera2D::set_rotating); - ClassDB::bind_method(D_METHOD("is_rotating"), &Camera2D::is_rotating); + ClassDB::bind_method(D_METHOD("set_ignore_rotation", "ignore"), &Camera2D::set_ignore_rotation); + ClassDB::bind_method(D_METHOD("is_ignoring_rotation"), &Camera2D::is_ignoring_rotation); ClassDB::bind_method(D_METHOD("_update_scroll"), &Camera2D::_update_scroll); @@ -733,7 +733,7 @@ void Camera2D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "offset", PROPERTY_HINT_NONE, "suffix:px"), "set_offset", "get_offset"); ADD_PROPERTY(PropertyInfo(Variant::INT, "anchor_mode", PROPERTY_HINT_ENUM, "Fixed TopLeft,Drag Center"), "set_anchor_mode", "get_anchor_mode"); - ADD_PROPERTY(PropertyInfo(Variant::BOOL, "rotating"), "set_rotating", "is_rotating"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "ignore_rotation"), "set_ignore_rotation", "is_ignoring_rotation"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "current"), "set_current", "is_current"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "zoom", PROPERTY_HINT_LINK), "set_zoom", "get_zoom"); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "custom_viewport", PROPERTY_HINT_RESOURCE_TYPE, "Viewport", PROPERTY_USAGE_NONE), "set_custom_viewport", "get_custom_viewport"); diff --git a/scene/2d/camera_2d.h b/scene/2d/camera_2d.h index 78654ee606..1ce622388c 100644 --- a/scene/2d/camera_2d.h +++ b/scene/2d/camera_2d.h @@ -63,7 +63,7 @@ protected: Vector2 zoom = Vector2(1, 1); Vector2 zoom_scale = Vector2(1, 1); AnchorMode anchor_mode = ANCHOR_MODE_DRAG_CENTER; - bool rotating = false; + bool ignore_rotation = true; bool current = false; real_t smoothing = 5.0; bool smoothing_enabled = false; @@ -109,8 +109,8 @@ public: void set_anchor_mode(AnchorMode p_anchor_mode); AnchorMode get_anchor_mode() const; - void set_rotating(bool p_rotating); - bool is_rotating() const; + void set_ignore_rotation(bool p_ignore); + bool is_ignoring_rotation() const; void set_limit(Side p_side, int p_limit); int get_limit(Side p_side) const; diff --git a/scene/2d/canvas_modulate.cpp b/scene/2d/canvas_modulate.cpp index 61a17a4845..330afe4a1b 100644 --- a/scene/2d/canvas_modulate.cpp +++ b/scene/2d/canvas_modulate.cpp @@ -78,8 +78,8 @@ Color CanvasModulate::get_color() const { return color; } -TypedArray<String> CanvasModulate::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray CanvasModulate::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (is_visible_in_tree() && is_inside_tree()) { List<Node *> nodes; diff --git a/scene/2d/canvas_modulate.h b/scene/2d/canvas_modulate.h index 1fd54898f8..4f522ca1c7 100644 --- a/scene/2d/canvas_modulate.h +++ b/scene/2d/canvas_modulate.h @@ -46,7 +46,7 @@ public: void set_color(const Color &p_color); Color get_color() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; CanvasModulate(); ~CanvasModulate(); diff --git a/scene/2d/collision_object_2d.cpp b/scene/2d/collision_object_2d.cpp index a79c81e8bd..23948c2fd3 100644 --- a/scene/2d/collision_object_2d.cpp +++ b/scene/2d/collision_object_2d.cpp @@ -565,8 +565,8 @@ void CollisionObject2D::_update_pickable() { } } -TypedArray<String> CollisionObject2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray CollisionObject2D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (shapes.is_empty()) { warnings.push_back(RTR("This node has no shape, so it can't collide or interact with other objects.\nConsider adding a CollisionShape2D or CollisionPolygon2D as a child to define its shape.")); diff --git a/scene/2d/collision_object_2d.h b/scene/2d/collision_object_2d.h index 48ea59e040..6b778d1b60 100644 --- a/scene/2d/collision_object_2d.h +++ b/scene/2d/collision_object_2d.h @@ -157,7 +157,7 @@ public: void set_pickable(bool p_enabled); bool is_pickable() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; _FORCE_INLINE_ RID get_rid() const { return rid; } diff --git a/scene/2d/collision_polygon_2d.cpp b/scene/2d/collision_polygon_2d.cpp index b69b19d30d..d06461b566 100644 --- a/scene/2d/collision_polygon_2d.cpp +++ b/scene/2d/collision_polygon_2d.cpp @@ -235,8 +235,8 @@ bool CollisionPolygon2D::_edit_is_selected_on_click(const Point2 &p_point, doubl } #endif -TypedArray<String> CollisionPolygon2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray CollisionPolygon2D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!Object::cast_to<CollisionObject2D>(get_parent())) { warnings.push_back(RTR("CollisionPolygon2D only serves to provide a collision shape to a CollisionObject2D derived node. Please only use it as a child of Area2D, StaticBody2D, RigidBody2D, CharacterBody2D, etc. to give them a shape.")); diff --git a/scene/2d/collision_polygon_2d.h b/scene/2d/collision_polygon_2d.h index e18022ab7e..066f7271c6 100644 --- a/scene/2d/collision_polygon_2d.h +++ b/scene/2d/collision_polygon_2d.h @@ -77,7 +77,7 @@ public: void set_polygon(const Vector<Point2> &p_polygon); Vector<Point2> get_polygon() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; void set_disabled(bool p_disabled); bool is_disabled() const; diff --git a/scene/2d/collision_shape_2d.cpp b/scene/2d/collision_shape_2d.cpp index 039bfee451..5fe05c4ddd 100644 --- a/scene/2d/collision_shape_2d.cpp +++ b/scene/2d/collision_shape_2d.cpp @@ -49,6 +49,11 @@ void CollisionShape2D::_update_in_shape_owner(bool p_xform_only) { parent->shape_owner_set_one_way_collision_margin(owner_id, one_way_collision_margin); } +Color CollisionShape2D::_get_default_debug_color() const { + SceneTree *st = SceneTree::get_singleton(); + return st ? st->get_debug_collisions_color() : Color(); +} + void CollisionShape2D::_notification(int p_what) { switch (p_what) { case NOTIFICATION_PARENTED: { @@ -95,7 +100,7 @@ void CollisionShape2D::_notification(int p_what) { rect = Rect2(); - Color draw_col = get_tree()->get_debug_collisions_color(); + Color draw_col = debug_color; if (disabled) { float g = draw_col.get_v(); draw_col.r = g; @@ -110,7 +115,7 @@ void CollisionShape2D::_notification(int p_what) { if (one_way_collision) { // Draw an arrow indicating the one-way collision direction - draw_col = get_tree()->get_debug_collisions_color().inverted(); + draw_col = debug_color.inverted(); if (disabled) { draw_col = draw_col.darkened(0.25); } @@ -168,8 +173,8 @@ bool CollisionShape2D::_edit_is_selected_on_click(const Point2 &p_point, double return shape->_edit_is_selected_on_click(p_point, p_tolerance); } -TypedArray<String> CollisionShape2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray CollisionShape2D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!Object::cast_to<CollisionObject2D>(get_parent())) { warnings.push_back(RTR("CollisionShape2D only serves to provide a collision shape to a CollisionObject2D derived node. Please only use it as a child of Area2D, StaticBody2D, RigidBody2D, CharacterBody2D, etc. to give them a shape.")); @@ -226,6 +231,40 @@ real_t CollisionShape2D::get_one_way_collision_margin() const { return one_way_collision_margin; } +void CollisionShape2D::set_debug_color(const Color &p_color) { + debug_color = p_color; + queue_redraw(); +} + +Color CollisionShape2D::get_debug_color() const { + return debug_color; +} + +bool CollisionShape2D::_property_can_revert(const StringName &p_name) const { + if (p_name == "debug_color") { + return true; + } + return false; +} + +bool CollisionShape2D::_property_get_revert(const StringName &p_name, Variant &r_property) const { + if (p_name == "debug_color") { + r_property = _get_default_debug_color(); + return true; + } + return false; +} + +void CollisionShape2D::_validate_property(PropertyInfo &p_property) const { + if (p_property.name == "debug_color") { + if (debug_color == _get_default_debug_color()) { + p_property.usage = PROPERTY_USAGE_DEFAULT & ~PROPERTY_USAGE_STORAGE; + } else { + p_property.usage = PROPERTY_USAGE_DEFAULT; + } + } +} + void CollisionShape2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_shape", "shape"), &CollisionShape2D::set_shape); ClassDB::bind_method(D_METHOD("get_shape"), &CollisionShape2D::get_shape); @@ -235,13 +274,19 @@ void CollisionShape2D::_bind_methods() { ClassDB::bind_method(D_METHOD("is_one_way_collision_enabled"), &CollisionShape2D::is_one_way_collision_enabled); ClassDB::bind_method(D_METHOD("set_one_way_collision_margin", "margin"), &CollisionShape2D::set_one_way_collision_margin); ClassDB::bind_method(D_METHOD("get_one_way_collision_margin"), &CollisionShape2D::get_one_way_collision_margin); + ClassDB::bind_method(D_METHOD("set_debug_color", "color"), &CollisionShape2D::set_debug_color); + ClassDB::bind_method(D_METHOD("get_debug_color"), &CollisionShape2D::get_debug_color); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "shape", PROPERTY_HINT_RESOURCE_TYPE, "Shape2D"), "set_shape", "get_shape"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "disabled"), "set_disabled", "is_disabled"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "one_way_collision"), "set_one_way_collision", "is_one_way_collision_enabled"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "one_way_collision_margin", PROPERTY_HINT_RANGE, "0,128,0.1,suffix:px"), "set_one_way_collision_margin", "get_one_way_collision_margin"); + ADD_PROPERTY(PropertyInfo(Variant::COLOR, "debug_color"), "set_debug_color", "get_debug_color"); + // Default value depends on a project setting, override for doc generation purposes. + ADD_PROPERTY_DEFAULT("debug_color", Color()); } CollisionShape2D::CollisionShape2D() { set_notify_local_transform(true); + debug_color = _get_default_debug_color(); } diff --git a/scene/2d/collision_shape_2d.h b/scene/2d/collision_shape_2d.h index dbc81e8424..b0b8a7cb0f 100644 --- a/scene/2d/collision_shape_2d.h +++ b/scene/2d/collision_shape_2d.h @@ -42,15 +42,20 @@ class CollisionShape2D : public Node2D { Rect2 rect = Rect2(-Point2(10, 10), Point2(20, 20)); uint32_t owner_id = 0; CollisionObject2D *parent = nullptr; - void _shape_changed(); bool disabled = false; bool one_way_collision = false; real_t one_way_collision_margin = 1.0; + Color debug_color; + void _shape_changed(); void _update_in_shape_owner(bool p_xform_only = false); + Color _get_default_debug_color() const; protected: void _notification(int p_what); + bool _property_can_revert(const StringName &p_name) const; + bool _property_get_revert(const StringName &p_name, Variant &r_property) const; + void _validate_property(PropertyInfo &p_property) const; static void _bind_methods(); public: @@ -72,7 +77,10 @@ public: void set_one_way_collision_margin(real_t p_margin); real_t get_one_way_collision_margin() const; - TypedArray<String> get_configuration_warnings() const override; + void set_debug_color(const Color &p_color); + Color get_debug_color() const; + + PackedStringArray get_configuration_warnings() const override; CollisionShape2D(); }; diff --git a/scene/2d/cpu_particles_2d.cpp b/scene/2d/cpu_particles_2d.cpp index 4523e5dfe9..eece90190b 100644 --- a/scene/2d/cpu_particles_2d.cpp +++ b/scene/2d/cpu_particles_2d.cpp @@ -242,8 +242,8 @@ bool CPUParticles2D::get_fractional_delta() const { return fractional_delta; } -TypedArray<String> CPUParticles2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node2D::get_configuration_warnings(); +PackedStringArray CPUParticles2D::get_configuration_warnings() const { + PackedStringArray warnings = Node2D::get_configuration_warnings(); CanvasItemMaterial *mat = Object::cast_to<CanvasItemMaterial>(get_material().ptr()); diff --git a/scene/2d/cpu_particles_2d.h b/scene/2d/cpu_particles_2d.h index 3fd1c7fd0f..ea735411a8 100644 --- a/scene/2d/cpu_particles_2d.h +++ b/scene/2d/cpu_particles_2d.h @@ -282,7 +282,7 @@ public: void set_gravity(const Vector2 &p_gravity); Vector2 get_gravity() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; void restart(); diff --git a/scene/2d/gpu_particles_2d.cpp b/scene/2d/gpu_particles_2d.cpp index bed68b4ee0..18f709f241 100644 --- a/scene/2d/gpu_particles_2d.cpp +++ b/scene/2d/gpu_particles_2d.cpp @@ -296,8 +296,8 @@ bool GPUParticles2D::get_interpolate() const { return interpolate; } -TypedArray<String> GPUParticles2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node2D::get_configuration_warnings(); +PackedStringArray GPUParticles2D::get_configuration_warnings() const { + PackedStringArray warnings = Node2D::get_configuration_warnings(); if (RenderingServer::get_singleton()->is_low_end()) { warnings.push_back(RTR("GPU-based particles are not supported by the OpenGL video driver.\nUse the CPUParticles2D node instead. You can use the \"Convert to CPUParticles2D\" option for this purpose.")); diff --git a/scene/2d/gpu_particles_2d.h b/scene/2d/gpu_particles_2d.h index 10ae91775f..d613b4ef51 100644 --- a/scene/2d/gpu_particles_2d.h +++ b/scene/2d/gpu_particles_2d.h @@ -145,7 +145,7 @@ public: void set_texture(const Ref<Texture2D> &p_texture); Ref<Texture2D> get_texture() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; void set_sub_emitter(const NodePath &p_path); NodePath get_sub_emitter() const; diff --git a/scene/2d/joint_2d.cpp b/scene/2d/joint_2d.cpp index 89b6f3f9da..6000508f36 100644 --- a/scene/2d/joint_2d.cpp +++ b/scene/2d/joint_2d.cpp @@ -202,8 +202,8 @@ bool Joint2D::get_exclude_nodes_from_collision() const { return exclude_from_collision; } -TypedArray<String> Joint2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node2D::get_configuration_warnings(); +PackedStringArray Joint2D::get_configuration_warnings() const { + PackedStringArray warnings = Node2D::get_configuration_warnings(); if (!warning.is_empty()) { warnings.push_back(warning); diff --git a/scene/2d/joint_2d.h b/scene/2d/joint_2d.h index e3cd600cbd..8b145be6ae 100644 --- a/scene/2d/joint_2d.h +++ b/scene/2d/joint_2d.h @@ -62,7 +62,7 @@ protected: _FORCE_INLINE_ bool is_configured() const { return configured; } public: - virtual TypedArray<String> get_configuration_warnings() const override; + virtual PackedStringArray get_configuration_warnings() const override; void set_node_a(const NodePath &p_node_a); NodePath get_node_a() const; diff --git a/scene/2d/light_2d.cpp b/scene/2d/light_2d.cpp index 7eb6b43af7..90402260ed 100644 --- a/scene/2d/light_2d.cpp +++ b/scene/2d/light_2d.cpp @@ -395,8 +395,8 @@ Vector2 PointLight2D::get_texture_offset() const { return texture_offset; } -TypedArray<String> PointLight2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray PointLight2D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!texture.is_valid()) { warnings.push_back(RTR("A texture with the shape of the light must be supplied to the \"Texture\" property.")); diff --git a/scene/2d/light_2d.h b/scene/2d/light_2d.h index 373cfe59fd..29870923aa 100644 --- a/scene/2d/light_2d.h +++ b/scene/2d/light_2d.h @@ -171,7 +171,7 @@ public: void set_texture_scale(real_t p_scale); real_t get_texture_scale() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; PointLight2D(); }; diff --git a/scene/2d/light_occluder_2d.cpp b/scene/2d/light_occluder_2d.cpp index 6c171383ca..67e82140e4 100644 --- a/scene/2d/light_occluder_2d.cpp +++ b/scene/2d/light_occluder_2d.cpp @@ -246,8 +246,8 @@ int LightOccluder2D::get_occluder_light_mask() const { return mask; } -TypedArray<String> LightOccluder2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray LightOccluder2D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!occluder_polygon.is_valid()) { warnings.push_back(RTR("An occluder polygon must be set (or drawn) for this occluder to take effect.")); diff --git a/scene/2d/light_occluder_2d.h b/scene/2d/light_occluder_2d.h index b61e23464a..ee4d87e54b 100644 --- a/scene/2d/light_occluder_2d.h +++ b/scene/2d/light_occluder_2d.h @@ -105,7 +105,7 @@ public: void set_as_sdf_collision(bool p_enable); bool is_set_as_sdf_collision() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; LightOccluder2D(); ~LightOccluder2D(); diff --git a/scene/2d/navigation_agent_2d.cpp b/scene/2d/navigation_agent_2d.cpp index d7f75c63a4..f077f7f5e6 100644 --- a/scene/2d/navigation_agent_2d.cpp +++ b/scene/2d/navigation_agent_2d.cpp @@ -178,6 +178,13 @@ NavigationAgent2D::NavigationAgent2D() { set_time_horizon(20.0); set_radius(10.0); set_max_speed(200.0); + + // Preallocate query and result objects to improve performance. + navigation_query = Ref<NavigationPathQueryParameters2D>(); + navigation_query.instantiate(); + + navigation_result = Ref<NavigationPathQueryResult2D>(); + navigation_result.instantiate(); } NavigationAgent2D::~NavigationAgent2D() { @@ -314,6 +321,8 @@ Vector2 NavigationAgent2D::get_target_location() const { Vector2 NavigationAgent2D::get_next_location() { update_navigation(); + + const Vector<Vector2> &navigation_path = navigation_result->get_path(); if (navigation_path.size() == 0) { ERR_FAIL_COND_V_MSG(agent_parent == nullptr, Vector2(), "The agent has no parent."); return agent_parent->get_global_position(); @@ -322,6 +331,10 @@ Vector2 NavigationAgent2D::get_next_location() { } } +const Vector<Vector2> &NavigationAgent2D::get_nav_path() const { + return navigation_result->get_path(); +} + real_t NavigationAgent2D::distance_to_target() const { ERR_FAIL_COND_V_MSG(agent_parent == nullptr, 0.0, "The agent has no parent."); return agent_parent->get_global_position().distance_to(target_location); @@ -342,6 +355,8 @@ bool NavigationAgent2D::is_navigation_finished() { Vector2 NavigationAgent2D::get_final_location() { update_navigation(); + + const Vector<Vector2> &navigation_path = navigation_result->get_path(); if (navigation_path.size() == 0) { return Vector2(); } @@ -368,8 +383,8 @@ void NavigationAgent2D::_avoidance_done(Vector3 p_new_velocity) { emit_signal(SNAME("velocity_computed"), velocity); } -TypedArray<String> NavigationAgent2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray NavigationAgent2D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!Object::cast_to<Node2D>(get_parent())) { warnings.push_back(RTR("The NavigationAgent2D can be used only under a Node2D inheriting parent node.")); @@ -391,22 +406,24 @@ void NavigationAgent2D::update_navigation() { update_frame_id = Engine::get_singleton()->get_physics_frames(); - Vector2 o = agent_parent->get_global_position(); + Vector2 origin = agent_parent->get_global_position(); bool reload_path = false; if (NavigationServer2D::get_singleton()->agent_is_map_changed(agent)) { reload_path = true; - } else if (navigation_path.size() == 0) { + } else if (navigation_result->get_path().size() == 0) { reload_path = true; } else { // Check if too far from the navigation path if (nav_path_index > 0) { + const Vector<Vector2> &navigation_path = navigation_result->get_path(); + Vector2 segment[2]; segment[0] = navigation_path[nav_path_index - 1]; segment[1] = navigation_path[nav_path_index]; - Vector2 p = Geometry2D::get_closest_point_to_segment(o, segment); - if (o.distance_to(p) >= path_max_distance) { + Vector2 p = Geometry2D::get_closest_point_to_segment(origin, segment); + if (origin.distance_to(p) >= path_max_distance) { // To faraway, reload path reload_path = true; } @@ -414,24 +431,31 @@ void NavigationAgent2D::update_navigation() { } if (reload_path) { + navigation_query->set_start_position(origin); + navigation_query->set_target_position(target_location); + navigation_query->set_navigation_layers(navigation_layers); + if (map_override.is_valid()) { - navigation_path = NavigationServer2D::get_singleton()->map_get_path(map_override, o, target_location, true, navigation_layers); + navigation_query->set_map(map_override); } else { - navigation_path = NavigationServer2D::get_singleton()->map_get_path(agent_parent->get_world_2d()->get_navigation_map(), o, target_location, true, navigation_layers); + navigation_query->set_map(agent_parent->get_world_2d()->get_navigation_map()); } + + NavigationServer2D::get_singleton()->query_path(navigation_query, navigation_result); navigation_finished = false; nav_path_index = 0; emit_signal(SNAME("path_changed")); } - if (navigation_path.size() == 0) { + if (navigation_result->get_path().size() == 0) { return; } // Check if we can advance the navigation path if (navigation_finished == false) { // Advances to the next far away location. - while (o.distance_to(navigation_path[nav_path_index]) < path_desired_distance) { + const Vector<Vector2> &navigation_path = navigation_result->get_path(); + while (origin.distance_to(navigation_path[nav_path_index]) < path_desired_distance) { nav_path_index += 1; if (nav_path_index == navigation_path.size()) { _check_distance_to_target(); @@ -445,7 +469,7 @@ void NavigationAgent2D::update_navigation() { } void NavigationAgent2D::_request_repath() { - navigation_path.clear(); + navigation_result->reset(); target_reached = false; navigation_finished = false; update_frame_id = 0; diff --git a/scene/2d/navigation_agent_2d.h b/scene/2d/navigation_agent_2d.h index 11b845665d..5abd3c0317 100644 --- a/scene/2d/navigation_agent_2d.h +++ b/scene/2d/navigation_agent_2d.h @@ -34,6 +34,8 @@ #include "scene/main/node.h" class Node2D; +class NavigationPathQueryParameters2D; +class NavigationPathQueryResult2D; class NavigationAgent2D : public Node { GDCLASS(NavigationAgent2D, Node); @@ -58,7 +60,8 @@ class NavigationAgent2D : public Node { real_t path_max_distance = 3.0; Vector2 target_location; - Vector<Vector2> navigation_path; + Ref<NavigationPathQueryParameters2D> navigation_query; + Ref<NavigationPathQueryResult2D> navigation_result; int nav_path_index = 0; bool velocity_submitted = false; Vector2 prev_safe_velocity; @@ -138,9 +141,7 @@ public: Vector2 get_next_location(); - Vector<Vector2> get_nav_path() const { - return navigation_path; - } + const Vector<Vector2> &get_nav_path() const; int get_nav_path_index() const { return nav_path_index; @@ -155,7 +156,7 @@ public: void set_velocity(Vector2 p_velocity); void _avoidance_done(Vector3 p_new_velocity); - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; private: void update_navigation(); diff --git a/scene/2d/navigation_link_2d.cpp b/scene/2d/navigation_link_2d.cpp index 8ba51482ee..3f7e10eaea 100644 --- a/scene/2d/navigation_link_2d.cpp +++ b/scene/2d/navigation_link_2d.cpp @@ -267,8 +267,8 @@ void NavigationLink2D::set_travel_cost(real_t p_travel_cost) { NavigationServer2D::get_singleton()->link_set_travel_cost(link, travel_cost); } -TypedArray<String> NavigationLink2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray NavigationLink2D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (start_location.is_equal_approx(end_location)) { warnings.push_back(RTR("NavigationLink2D start location should be different than the end location to be useful.")); diff --git a/scene/2d/navigation_link_2d.h b/scene/2d/navigation_link_2d.h index 5990ea082c..2a5092216d 100644 --- a/scene/2d/navigation_link_2d.h +++ b/scene/2d/navigation_link_2d.h @@ -79,7 +79,7 @@ public: void set_travel_cost(real_t p_travel_cost); real_t get_travel_cost() const { return travel_cost; } - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; NavigationLink2D(); ~NavigationLink2D(); diff --git a/scene/2d/navigation_obstacle_2d.cpp b/scene/2d/navigation_obstacle_2d.cpp index a592d20cba..e46bb79551 100644 --- a/scene/2d/navigation_obstacle_2d.cpp +++ b/scene/2d/navigation_obstacle_2d.cpp @@ -38,6 +38,9 @@ void NavigationObstacle2D::_bind_methods() { ClassDB::bind_method(D_METHOD("get_rid"), &NavigationObstacle2D::get_rid); + ClassDB::bind_method(D_METHOD("set_navigation_map", "navigation_map"), &NavigationObstacle2D::set_navigation_map); + ClassDB::bind_method(D_METHOD("get_navigation_map"), &NavigationObstacle2D::get_navigation_map); + ClassDB::bind_method(D_METHOD("set_estimate_radius", "estimate_radius"), &NavigationObstacle2D::set_estimate_radius); ClassDB::bind_method(D_METHOD("is_radius_estimated"), &NavigationObstacle2D::is_radius_estimated); ClassDB::bind_method(D_METHOD("set_radius", "radius"), &NavigationObstacle2D::set_radius); @@ -57,28 +60,26 @@ void NavigationObstacle2D::_validate_property(PropertyInfo &p_property) const { void NavigationObstacle2D::_notification(int p_what) { switch (p_what) { - case NOTIFICATION_ENTER_TREE: { - parent_node2d = Object::cast_to<Node2D>(get_parent()); - reevaluate_agent_radius(); - if (parent_node2d != nullptr) { - // place agent on navigation map first or else the RVO agent callback creation fails silently later - NavigationServer2D::get_singleton()->agent_set_map(get_rid(), parent_node2d->get_world_2d()->get_navigation_map()); - } + case NOTIFICATION_POST_ENTER_TREE: { + set_agent_parent(get_parent()); set_physics_process_internal(true); } break; case NOTIFICATION_EXIT_TREE: { - parent_node2d = nullptr; + set_agent_parent(nullptr); set_physics_process_internal(false); } break; case NOTIFICATION_PARENTED: { - parent_node2d = Object::cast_to<Node2D>(get_parent()); - reevaluate_agent_radius(); + if (is_inside_tree() && (get_parent() != parent_node2d)) { + set_agent_parent(get_parent()); + set_physics_process_internal(true); + } } break; case NOTIFICATION_UNPARENTED: { - parent_node2d = nullptr; + set_agent_parent(nullptr); + set_physics_process_internal(false); } break; case NOTIFICATION_PAUSED: { @@ -119,8 +120,8 @@ NavigationObstacle2D::~NavigationObstacle2D() { agent = RID(); // Pointless } -TypedArray<String> NavigationObstacle2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray NavigationObstacle2D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!Object::cast_to<Node2D>(get_parent())) { warnings.push_back(RTR("The NavigationObstacle2D only serves to provide collision avoidance to a Node2D object.")); @@ -182,6 +183,35 @@ real_t NavigationObstacle2D::estimate_agent_radius() const { return 1.0; // Never a 0 radius } +void NavigationObstacle2D::set_agent_parent(Node *p_agent_parent) { + if (Object::cast_to<Node2D>(p_agent_parent) != nullptr) { + parent_node2d = Object::cast_to<Node2D>(p_agent_parent); + if (map_override.is_valid()) { + NavigationServer2D::get_singleton()->agent_set_map(get_rid(), map_override); + } else { + NavigationServer2D::get_singleton()->agent_set_map(get_rid(), parent_node2d->get_world_2d()->get_navigation_map()); + } + reevaluate_agent_radius(); + } else { + parent_node2d = nullptr; + NavigationServer2D::get_singleton()->agent_set_map(get_rid(), RID()); + } +} + +void NavigationObstacle2D::set_navigation_map(RID p_navigation_map) { + map_override = p_navigation_map; + NavigationServer2D::get_singleton()->agent_set_map(agent, map_override); +} + +RID NavigationObstacle2D::get_navigation_map() const { + if (map_override.is_valid()) { + return map_override; + } else if (parent_node2d != nullptr) { + return parent_node2d->get_world_2d()->get_navigation_map(); + } + return RID(); +} + void NavigationObstacle2D::set_estimate_radius(bool p_estimate_radius) { estimate_radius = p_estimate_radius; notify_property_list_changed(); diff --git a/scene/2d/navigation_obstacle_2d.h b/scene/2d/navigation_obstacle_2d.h index 5795c6c94f..d4c1df343f 100644 --- a/scene/2d/navigation_obstacle_2d.h +++ b/scene/2d/navigation_obstacle_2d.h @@ -38,8 +38,10 @@ class NavigationObstacle2D : public Node { GDCLASS(NavigationObstacle2D, Node); Node2D *parent_node2d = nullptr; + RID agent; RID map_before_pause; + RID map_override; bool estimate_radius = true; real_t radius = 1.0; @@ -57,6 +59,11 @@ public: return agent; } + void set_agent_parent(Node *p_agent_parent); + + void set_navigation_map(RID p_navigation_map); + RID get_navigation_map() const; + void set_estimate_radius(bool p_estimate_radius); bool is_radius_estimated() const { return estimate_radius; @@ -66,7 +73,7 @@ public: return radius; } - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; private: void initialize_agent(); diff --git a/scene/2d/navigation_region_2d.cpp b/scene/2d/navigation_region_2d.cpp index ffccb95a22..6e8ecb13b1 100644 --- a/scene/2d/navigation_region_2d.cpp +++ b/scene/2d/navigation_region_2d.cpp @@ -354,10 +354,13 @@ void NavigationPolygon::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "outlines", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR | PROPERTY_USAGE_INTERNAL), "_set_outlines", "_get_outlines"); } +///////////////////////////// + void NavigationRegion2D::set_enabled(bool p_enabled) { if (enabled == p_enabled) { return; } + enabled = p_enabled; if (!is_inside_tree()) { @@ -384,35 +387,50 @@ bool NavigationRegion2D::is_enabled() const { } void NavigationRegion2D::set_navigation_layers(uint32_t p_navigation_layers) { - NavigationServer2D::get_singleton()->region_set_navigation_layers(region, p_navigation_layers); + if (navigation_layers == p_navigation_layers) { + return; + } + + navigation_layers = p_navigation_layers; + + NavigationServer2D::get_singleton()->region_set_navigation_layers(region, navigation_layers); } uint32_t NavigationRegion2D::get_navigation_layers() const { - return NavigationServer2D::get_singleton()->region_get_navigation_layers(region); + return navigation_layers; } void NavigationRegion2D::set_navigation_layer_value(int p_layer_number, bool p_value) { ERR_FAIL_COND_MSG(p_layer_number < 1, "Navigation layer number must be between 1 and 32 inclusive."); ERR_FAIL_COND_MSG(p_layer_number > 32, "Navigation layer number must be between 1 and 32 inclusive."); + uint32_t _navigation_layers = get_navigation_layers(); + if (p_value) { _navigation_layers |= 1 << (p_layer_number - 1); } else { _navigation_layers &= ~(1 << (p_layer_number - 1)); } + set_navigation_layers(_navigation_layers); } bool NavigationRegion2D::get_navigation_layer_value(int p_layer_number) const { ERR_FAIL_COND_V_MSG(p_layer_number < 1, false, "Navigation layer number must be between 1 and 32 inclusive."); ERR_FAIL_COND_V_MSG(p_layer_number > 32, false, "Navigation layer number must be between 1 and 32 inclusive."); + return get_navigation_layers() & (1 << (p_layer_number - 1)); } void NavigationRegion2D::set_enter_cost(real_t p_enter_cost) { ERR_FAIL_COND_MSG(p_enter_cost < 0.0, "The enter_cost must be positive."); - enter_cost = MAX(p_enter_cost, 0.0); - NavigationServer2D::get_singleton()->region_set_enter_cost(region, p_enter_cost); + if (Math::is_equal_approx(enter_cost, p_enter_cost)) { + return; + } + + enter_cost = p_enter_cost; + + NavigationServer2D::get_singleton()->region_set_enter_cost(region, enter_cost); } real_t NavigationRegion2D::get_enter_cost() const { @@ -421,7 +439,12 @@ real_t NavigationRegion2D::get_enter_cost() const { void NavigationRegion2D::set_travel_cost(real_t p_travel_cost) { ERR_FAIL_COND_MSG(p_travel_cost < 0.0, "The travel_cost must be positive."); - travel_cost = MAX(p_travel_cost, 0.0); + if (Math::is_equal_approx(travel_cost, p_travel_cost)) { + return; + } + + travel_cost = p_travel_cost; + NavigationServer2D::get_singleton()->region_set_travel_cost(region, travel_cost); } @@ -433,7 +456,6 @@ RID NavigationRegion2D::get_region_rid() const { return region; } -///////////////////////////// #ifdef TOOLS_ENABLED Rect2 NavigationRegion2D::_edit_get_rect() const { return navpoly.is_valid() ? navpoly->_edit_get_rect() : Rect2(); @@ -566,8 +588,8 @@ void NavigationRegion2D::_map_changed(RID p_map) { #endif // DEBUG_ENABLED } -TypedArray<String> NavigationRegion2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node2D::get_configuration_warnings(); +PackedStringArray NavigationRegion2D::get_configuration_warnings() const { + PackedStringArray warnings = Node2D::get_configuration_warnings(); if (is_visible_in_tree() && is_inside_tree()) { if (!navpoly.is_valid()) { diff --git a/scene/2d/navigation_region_2d.h b/scene/2d/navigation_region_2d.h index 3c9df91fe3..c630e20780 100644 --- a/scene/2d/navigation_region_2d.h +++ b/scene/2d/navigation_region_2d.h @@ -96,10 +96,10 @@ class NavigationRegion2D : public Node2D { bool enabled = true; RID region; - Ref<NavigationPolygon> navpoly; - + uint32_t navigation_layers = 1; real_t enter_cost = 0.0; real_t travel_cost = 1.0; + Ref<NavigationPolygon> navpoly; void _navpoly_changed(); void _map_changed(RID p_RID); @@ -134,7 +134,7 @@ public: void set_navigation_polygon(const Ref<NavigationPolygon> &p_navpoly); Ref<NavigationPolygon> get_navigation_polygon() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; NavigationRegion2D(); ~NavigationRegion2D(); diff --git a/scene/2d/parallax_background.cpp b/scene/2d/parallax_background.cpp index bd5a01f5a4..f1a28b7852 100644 --- a/scene/2d/parallax_background.cpp +++ b/scene/2d/parallax_background.cpp @@ -102,9 +102,9 @@ void ParallaxBackground::_update_scroll() { } if (ignore_camera_zoom) { - l->set_base_offset_and_scale((ofs + screen_offset * (scale - 1)) / scale, 1.0, screen_offset); + l->set_base_offset_and_scale((ofs + screen_offset * (scale - 1)) / scale, 1.0); } else { - l->set_base_offset_and_scale(ofs, scale, screen_offset); + l->set_base_offset_and_scale(ofs, scale); } } } diff --git a/scene/2d/parallax_layer.cpp b/scene/2d/parallax_layer.cpp index f0aad1b8a4..01e4bf19f3 100644 --- a/scene/2d/parallax_layer.cpp +++ b/scene/2d/parallax_layer.cpp @@ -39,7 +39,7 @@ void ParallaxLayer::set_motion_scale(const Size2 &p_scale) { if (pb && is_inside_tree()) { Vector2 ofs = pb->get_final_offset(); real_t scale = pb->get_scroll_scale(); - set_base_offset_and_scale(ofs, scale, screen_offset); + set_base_offset_and_scale(ofs, scale); } } @@ -54,7 +54,7 @@ void ParallaxLayer::set_motion_offset(const Size2 &p_offset) { if (pb && is_inside_tree()) { Vector2 ofs = pb->get_final_offset(); real_t scale = pb->get_scroll_scale(); - set_base_offset_and_scale(ofs, scale, screen_offset); + set_base_offset_and_scale(ofs, scale); } } @@ -111,9 +111,7 @@ void ParallaxLayer::_notification(int p_what) { } } -void ParallaxLayer::set_base_offset_and_scale(const Point2 &p_offset, real_t p_scale, const Point2 &p_screen_offset) { - screen_offset = p_screen_offset; - +void ParallaxLayer::set_base_offset_and_scale(const Point2 &p_offset, real_t p_scale) { if (!is_inside_tree()) { return; } @@ -121,7 +119,7 @@ void ParallaxLayer::set_base_offset_and_scale(const Point2 &p_offset, real_t p_s return; } - Point2 new_ofs = (screen_offset + (p_offset - screen_offset) * motion_scale) + motion_offset * p_scale + orig_offset * p_scale; + Point2 new_ofs = p_offset * motion_scale + motion_offset * p_scale + orig_offset * p_scale; if (mirroring.x) { real_t den = mirroring.x * p_scale; @@ -139,8 +137,8 @@ void ParallaxLayer::set_base_offset_and_scale(const Point2 &p_offset, real_t p_s _update_mirroring(); } -TypedArray<String> ParallaxLayer::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray ParallaxLayer::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!Object::cast_to<ParallaxBackground>(get_parent())) { warnings.push_back(RTR("ParallaxLayer node only works when set as child of a ParallaxBackground node.")); diff --git a/scene/2d/parallax_layer.h b/scene/2d/parallax_layer.h index b4dcf0ea61..6471f56c5c 100644 --- a/scene/2d/parallax_layer.h +++ b/scene/2d/parallax_layer.h @@ -43,8 +43,6 @@ class ParallaxLayer : public Node2D { Vector2 mirroring; void _update_mirroring(); - Point2 screen_offset; - protected: void _notification(int p_what); static void _bind_methods(); @@ -59,9 +57,9 @@ public: void set_mirroring(const Size2 &p_mirroring); Size2 get_mirroring() const; - void set_base_offset_and_scale(const Point2 &p_offset, real_t p_scale, const Point2 &p_screen_offset); + void set_base_offset_and_scale(const Point2 &p_offset, real_t p_scale); - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; ParallaxLayer(); }; diff --git a/scene/2d/path_2d.cpp b/scene/2d/path_2d.cpp index 90b2e3d460..c1044fdf5b 100644 --- a/scene/2d/path_2d.cpp +++ b/scene/2d/path_2d.cpp @@ -256,8 +256,8 @@ void PathFollow2D::_validate_property(PropertyInfo &p_property) const { } } -TypedArray<String> PathFollow2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray PathFollow2D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (is_visible_in_tree() && is_inside_tree()) { if (!Object::cast_to<Path2D>(get_parent())) { diff --git a/scene/2d/path_2d.h b/scene/2d/path_2d.h index 3d66ca1fab..5e436fb9f6 100644 --- a/scene/2d/path_2d.h +++ b/scene/2d/path_2d.h @@ -106,7 +106,7 @@ public: void set_cubic_interpolation(bool p_enable); bool get_cubic_interpolation() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; PathFollow2D() {} }; diff --git a/scene/2d/physical_bone_2d.cpp b/scene/2d/physical_bone_2d.cpp index e6933b8a40..5ff706ebb7 100644 --- a/scene/2d/physical_bone_2d.cpp +++ b/scene/2d/physical_bone_2d.cpp @@ -106,8 +106,8 @@ void PhysicalBone2D::_find_joint_child() { } } -TypedArray<String> PhysicalBone2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray PhysicalBone2D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!parent_skeleton) { warnings.push_back(RTR("A PhysicalBone2D only works with a Skeleton2D or another PhysicalBone2D as a parent node!")); diff --git a/scene/2d/physical_bone_2d.h b/scene/2d/physical_bone_2d.h index 9fbfa04100..33ac0d9935 100644 --- a/scene/2d/physical_bone_2d.h +++ b/scene/2d/physical_bone_2d.h @@ -79,7 +79,7 @@ public: void set_follow_bone_when_simulating(bool p_follow); bool get_follow_bone_when_simulating() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; PhysicalBone2D(); ~PhysicalBone2D(); diff --git a/scene/2d/physics_body_2d.cpp b/scene/2d/physics_body_2d.cpp index 714d196779..4e6b37a860 100644 --- a/scene/2d/physics_body_2d.cpp +++ b/scene/2d/physics_body_2d.cpp @@ -34,8 +34,8 @@ #include "scene/scene_string_names.h" void PhysicsBody2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("move_and_collide", "distance", "test_only", "safe_margin"), &PhysicsBody2D::_move, DEFVAL(false), DEFVAL(0.08)); - ClassDB::bind_method(D_METHOD("test_move", "from", "distance", "collision", "safe_margin"), &PhysicsBody2D::test_move, DEFVAL(Variant()), DEFVAL(0.08)); + ClassDB::bind_method(D_METHOD("move_and_collide", "distance", "test_only", "safe_margin", "recovery_as_collision"), &PhysicsBody2D::_move, DEFVAL(false), DEFVAL(0.08), DEFVAL(false)); + ClassDB::bind_method(D_METHOD("test_move", "from", "distance", "collision", "safe_margin", "recovery_as_collision"), &PhysicsBody2D::test_move, DEFVAL(Variant()), DEFVAL(0.08), DEFVAL(false)); ClassDB::bind_method(D_METHOD("get_collision_exceptions"), &PhysicsBody2D::get_collision_exceptions); ClassDB::bind_method(D_METHOD("add_collision_exception_with", "body"), &PhysicsBody2D::add_collision_exception_with); @@ -54,15 +54,15 @@ PhysicsBody2D::~PhysicsBody2D() { } } -Ref<KinematicCollision2D> PhysicsBody2D::_move(const Vector2 &p_distance, bool p_test_only, real_t p_margin) { +Ref<KinematicCollision2D> PhysicsBody2D::_move(const Vector2 &p_distance, bool p_test_only, real_t p_margin, bool p_recovery_as_collision) { PhysicsServer2D::MotionParameters parameters(get_global_transform(), p_distance, p_margin); - parameters.recovery_as_collision = false; // Don't report collisions generated only from recovery. + parameters.recovery_as_collision = p_recovery_as_collision; PhysicsServer2D::MotionResult result; if (move_and_collide(parameters, result, p_test_only)) { // Create a new instance when the cached reference is invalid or still in use in script. - if (motion_cache.is_null() || motion_cache->reference_get_count() > 1) { + if (motion_cache.is_null() || motion_cache->get_reference_count() > 1) { motion_cache.instantiate(); motion_cache->owner = this; } @@ -128,7 +128,7 @@ bool PhysicsBody2D::move_and_collide(const PhysicsServer2D::MotionParameters &p_ return colliding; } -bool PhysicsBody2D::test_move(const Transform2D &p_from, const Vector2 &p_distance, const Ref<KinematicCollision2D> &r_collision, real_t p_margin) { +bool PhysicsBody2D::test_move(const Transform2D &p_from, const Vector2 &p_distance, const Ref<KinematicCollision2D> &r_collision, real_t p_margin, bool p_recovery_as_collision) { ERR_FAIL_COND_V(!is_inside_tree(), false); PhysicsServer2D::MotionResult *r = nullptr; @@ -141,7 +141,7 @@ bool PhysicsBody2D::test_move(const Transform2D &p_from, const Vector2 &p_distan } PhysicsServer2D::MotionParameters parameters(p_from, p_distance, p_margin); - parameters.recovery_as_collision = false; // Don't report collisions generated only from recovery. + parameters.recovery_as_collision = p_recovery_as_collision; return PhysicsServer2D::get_singleton()->body_test_motion(get_rid(), parameters, r); } @@ -262,21 +262,16 @@ void AnimatableBody2D::_update_kinematic_motion() { #endif if (sync_to_physics) { - PhysicsServer2D::get_singleton()->body_set_state_sync_callback(get_rid(), this, _body_state_changed_callback); + PhysicsServer2D::get_singleton()->body_set_state_sync_callback(get_rid(), callable_mp(this, &AnimatableBody2D::_body_state_changed)); set_only_update_transform_changes(true); set_notify_local_transform(true); } else { - PhysicsServer2D::get_singleton()->body_set_state_sync_callback(get_rid(), nullptr, nullptr); + PhysicsServer2D::get_singleton()->body_set_state_sync_callback(get_rid(), Callable()); set_only_update_transform_changes(false); set_notify_local_transform(false); } } -void AnimatableBody2D::_body_state_changed_callback(void *p_instance, PhysicsDirectBodyState2D *p_state) { - AnimatableBody2D *body = static_cast<AnimatableBody2D *>(p_instance); - body->_body_state_changed(p_state); -} - void AnimatableBody2D::_body_state_changed(PhysicsDirectBodyState2D *p_state) { if (!sync_to_physics) { return; @@ -438,11 +433,6 @@ struct _RigidBody2DInOut { int local_shape = 0; }; -void RigidBody2D::_body_state_changed_callback(void *p_instance, PhysicsDirectBodyState2D *p_state) { - RigidBody2D *body = static_cast<RigidBody2D *>(p_instance); - body->_body_state_changed(p_state); -} - void RigidBody2D::_body_state_changed(PhysicsDirectBodyState2D *p_state) { set_block_transform_notify(true); // don't want notify (would feedback loop) if (!freeze || freeze_mode != FREEZE_MODE_KINEMATIC) { @@ -921,10 +911,10 @@ void RigidBody2D::_notification(int p_what) { #endif } -TypedArray<String> RigidBody2D::get_configuration_warnings() const { +PackedStringArray RigidBody2D::get_configuration_warnings() const { Transform2D t = get_transform(); - TypedArray<String> warnings = CollisionObject2D::get_configuration_warnings(); + PackedStringArray warnings = CollisionObject2D::get_configuration_warnings(); if (ABS(t.columns[0].length() - 1.0) > 0.05 || ABS(t.columns[1].length() - 1.0) > 0.05) { warnings.push_back(RTR("Size changes to RigidBody2D will be overridden by the physics engine when running.\nChange the size in children collision shapes instead.")); @@ -1079,7 +1069,7 @@ void RigidBody2D::_validate_property(PropertyInfo &p_property) const { RigidBody2D::RigidBody2D() : PhysicsBody2D(PhysicsServer2D::BODY_MODE_RIGID) { - PhysicsServer2D::get_singleton()->body_set_state_sync_callback(get_rid(), this, _body_state_changed_callback); + PhysicsServer2D::get_singleton()->body_set_state_sync_callback(get_rid(), callable_mp(this, &RigidBody2D::_body_state_changed)); } RigidBody2D::~RigidBody2D() { @@ -1144,7 +1134,6 @@ bool CharacterBody2D::move_and_slide() { if (!current_platform_velocity.is_zero_approx()) { PhysicsServer2D::MotionParameters parameters(get_global_transform(), current_platform_velocity * delta, margin); - parameters.recovery_as_collision = true; // Also report collisions generated only from recovery. parameters.exclude_bodies.insert(platform_rid); if (platform_object_id.is_valid()) { parameters.exclude_objects.insert(platform_object_id); @@ -1203,7 +1192,6 @@ void CharacterBody2D::_move_and_slide_grounded(double p_delta, bool p_was_on_flo for (int iteration = 0; iteration < max_slides; ++iteration) { PhysicsServer2D::MotionParameters parameters(get_global_transform(), motion, margin); - parameters.recovery_as_collision = true; // Also report collisions generated only from recovery. Vector2 prev_position = parameters.from.columns[2]; @@ -1360,7 +1348,6 @@ void CharacterBody2D::_move_and_slide_floating(double p_delta) { bool first_slide = true; for (int iteration = 0; iteration < max_slides; ++iteration) { PhysicsServer2D::MotionParameters parameters(get_global_transform(), motion, margin); - parameters.recovery_as_collision = true; // Also report collisions generated only from recovery. PhysicsServer2D::MotionResult result; bool collided = move_and_collide(parameters, result, false, false); @@ -1407,7 +1394,7 @@ void CharacterBody2D::_snap_on_floor(bool p_was_on_floor, bool p_vel_dir_facing_ real_t length = MAX(floor_snap_length, margin); PhysicsServer2D::MotionParameters parameters(get_global_transform(), -up_direction * length, margin); - parameters.recovery_as_collision = true; // Also report collisions generated only from recovery. + parameters.recovery_as_collision = true; // Report margin recovery as collision to improve floor detection. parameters.collide_separation_ray = true; PhysicsServer2D::MotionResult result; @@ -1443,7 +1430,7 @@ bool CharacterBody2D::_on_floor_if_snapped(bool p_was_on_floor, bool p_vel_dir_f real_t length = MAX(floor_snap_length, margin); PhysicsServer2D::MotionParameters parameters(get_global_transform(), -up_direction * length, margin); - parameters.recovery_as_collision = true; // Also report collisions generated only from recovery. + parameters.recovery_as_collision = true; // Report margin recovery as collision to improve floor detection. parameters.collide_separation_ray = true; PhysicsServer2D::MotionResult result; @@ -1557,7 +1544,7 @@ Ref<KinematicCollision2D> CharacterBody2D::_get_slide_collision(int p_bounce) { } // Create a new instance when the cached reference is invalid or still in use in script. - if (slide_colliders[p_bounce].is_null() || slide_colliders[p_bounce]->reference_get_count() > 1) { + if (slide_colliders[p_bounce].is_null() || slide_colliders[p_bounce]->get_reference_count() > 1) { slide_colliders.write[p_bounce].instantiate(); slide_colliders.write[p_bounce]->owner = this; } diff --git a/scene/2d/physics_body_2d.h b/scene/2d/physics_body_2d.h index eaba9aadad..932ec1de16 100644 --- a/scene/2d/physics_body_2d.h +++ b/scene/2d/physics_body_2d.h @@ -47,11 +47,11 @@ protected: Ref<KinematicCollision2D> motion_cache; - Ref<KinematicCollision2D> _move(const Vector2 &p_distance, bool p_test_only = false, real_t p_margin = 0.08); + Ref<KinematicCollision2D> _move(const Vector2 &p_distance, bool p_test_only = false, real_t p_margin = 0.08, bool p_recovery_as_collision = false); public: bool move_and_collide(const PhysicsServer2D::MotionParameters &p_parameters, PhysicsServer2D::MotionResult &r_result, bool p_test_only = false, bool p_cancel_sliding = true); - bool test_move(const Transform2D &p_from, const Vector2 &p_distance, const Ref<KinematicCollision2D> &r_collision = Ref<KinematicCollision2D>(), real_t p_margin = 0.08); + bool test_move(const Transform2D &p_from, const Vector2 &p_distance, const Ref<KinematicCollision2D> &r_collision = Ref<KinematicCollision2D>(), real_t p_margin = 0.08, bool p_recovery_as_collision = false); TypedArray<PhysicsBody2D> get_collision_exceptions(); void add_collision_exception_with(Node *p_node); //must be physicsbody @@ -309,7 +309,7 @@ public: TypedArray<Node2D> get_colliding_bodies() const; //function for script - virtual TypedArray<String> get_configuration_warnings() const override; + virtual PackedStringArray get_configuration_warnings() const override; RigidBody2D(); ~RigidBody2D(); diff --git a/scene/2d/remote_transform_2d.cpp b/scene/2d/remote_transform_2d.cpp index 6c4bfd58ce..f4343e4c03 100644 --- a/scene/2d/remote_transform_2d.cpp +++ b/scene/2d/remote_transform_2d.cpp @@ -183,8 +183,8 @@ void RemoteTransform2D::force_update_cache() { _update_cache(); } -TypedArray<String> RemoteTransform2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray RemoteTransform2D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!has_node(remote_node) || !Object::cast_to<Node2D>(get_node(remote_node))) { warnings.push_back(RTR("Path property must point to a valid Node2D node to work.")); diff --git a/scene/2d/remote_transform_2d.h b/scene/2d/remote_transform_2d.h index bd352e1054..f98eec75c6 100644 --- a/scene/2d/remote_transform_2d.h +++ b/scene/2d/remote_transform_2d.h @@ -70,7 +70,7 @@ public: void force_update_cache(); - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; RemoteTransform2D(); }; diff --git a/scene/2d/shape_cast_2d.cpp b/scene/2d/shape_cast_2d.cpp index a25d5934ee..6222b0db14 100644 --- a/scene/2d/shape_cast_2d.cpp +++ b/scene/2d/shape_cast_2d.cpp @@ -391,8 +391,8 @@ Array ShapeCast2D::_get_collision_result() const { return ret; } -TypedArray<String> ShapeCast2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node2D::get_configuration_warnings(); +PackedStringArray ShapeCast2D::get_configuration_warnings() const { + PackedStringArray warnings = Node2D::get_configuration_warnings(); if (shape.is_null()) { warnings.push_back(RTR("This node cannot interact with other objects unless a Shape2D is assigned.")); diff --git a/scene/2d/shape_cast_2d.h b/scene/2d/shape_cast_2d.h index 660e52f189..7b55566b01 100644 --- a/scene/2d/shape_cast_2d.h +++ b/scene/2d/shape_cast_2d.h @@ -117,7 +117,7 @@ public: void remove_exception(const CollisionObject2D *p_node); void clear_exceptions(); - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; }; #endif // SHAPE_CAST_2D_H diff --git a/scene/2d/skeleton_2d.cpp b/scene/2d/skeleton_2d.cpp index 8f0bf22617..b5759c54f7 100644 --- a/scene/2d/skeleton_2d.cpp +++ b/scene/2d/skeleton_2d.cpp @@ -434,8 +434,8 @@ int Bone2D::get_index_in_skeleton() const { return skeleton_index; } -TypedArray<String> Bone2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray Bone2D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!skeleton) { if (parent_bone) { warnings.push_back(RTR("This Bone2D chain should end at a Skeleton2D node.")); diff --git a/scene/2d/skeleton_2d.h b/scene/2d/skeleton_2d.h index 98fb867d99..580aed97ce 100644 --- a/scene/2d/skeleton_2d.h +++ b/scene/2d/skeleton_2d.h @@ -78,7 +78,7 @@ public: void apply_rest(); Transform2D get_skeleton_rest() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; void set_default_length(real_t p_length); real_t get_default_length() const; diff --git a/scene/2d/tile_map.cpp b/scene/2d/tile_map.cpp index 5de6d547d7..bdcd1f2f28 100644 --- a/scene/2d/tile_map.cpp +++ b/scene/2d/tile_map.cpp @@ -1861,7 +1861,6 @@ void TileMap::_scenes_update_dirty_quadrants(SelfList<TileMapQuadrant>::List &r_ Ref<PackedScene> packed_scene = scenes_collection_source->get_scene_tile_scene(c.alternative_tile); if (packed_scene.is_valid()) { Node *scene = packed_scene->instantiate(); - add_child(scene); Control *scene_as_control = Object::cast_to<Control>(scene); Node2D *scene_as_node2d = Object::cast_to<Node2D>(scene); if (scene_as_control) { @@ -1871,6 +1870,7 @@ void TileMap::_scenes_update_dirty_quadrants(SelfList<TileMapQuadrant>::List &r_ xform.set_origin(map_to_local(E_cell)); scene_as_node2d->set_transform(xform * scene_as_node2d->get_transform()); } + add_child(scene); q.scenes[E_cell] = scene->get_name(); } } @@ -3615,7 +3615,7 @@ TypedArray<Vector2i> TileMap::get_used_cells(int p_layer) const { return a; } -Rect2 TileMap::get_used_rect() { // Not const because of cache +Rect2i TileMap::get_used_rect() { // Not const because of cache // Return the rect of the currently used area if (used_rect_cache_dirty) { bool first = true; @@ -3819,8 +3819,8 @@ void TileMap::draw_cells_outline(Control *p_control, RBSet<Vector2i> p_cells, Co #undef DRAW_SIDE_IF_NEEDED } -TypedArray<String> TileMap::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray TileMap::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); // Retrieve the set of Z index values with a Y-sorted layer. RBSet<int> y_sorted_z_index; diff --git a/scene/2d/tile_map.h b/scene/2d/tile_map.h index a819eeab71..902926291d 100644 --- a/scene/2d/tile_map.h +++ b/scene/2d/tile_map.h @@ -375,7 +375,7 @@ public: Vector2i get_neighbor_cell(const Vector2i &p_coords, TileSet::CellNeighbor p_cell_neighbor) const; TypedArray<Vector2i> get_used_cells(int p_layer) const; - Rect2 get_used_rect(); // Not const because of cache + Rect2i get_used_rect(); // Not const because of cache // Override some methods of the CanvasItem class to pass the changes to the quadrants CanvasItems virtual void set_light_mask(int p_light_mask) override; @@ -406,7 +406,7 @@ public: GDVIRTUAL3(_tile_data_runtime_update, int, Vector2i, TileData *); // Configuration warnings. - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; TileMap(); ~TileMap(); diff --git a/scene/3d/area_3d.cpp b/scene/3d/area_3d.cpp index f118080009..cefa9eceff 100644 --- a/scene/3d/area_3d.cpp +++ b/scene/3d/area_3d.cpp @@ -489,6 +489,11 @@ TypedArray<Node3D> Area3D::get_overlapping_bodies() const { return ret; } +bool Area3D::has_overlapping_bodies() const { + ERR_FAIL_COND_V_MSG(!monitoring, false, "Can't find overlapping bodies when monitoring is off."); + return !body_map.is_empty(); +} + void Area3D::set_monitorable(bool p_enable) { ERR_FAIL_COND_MSG(locked || (is_inside_tree() && PhysicsServer3D::get_singleton()->is_flushing_queries()), "Function blocked during in/out signal. Use set_deferred(\"monitorable\", true/false)."); @@ -521,6 +526,11 @@ TypedArray<Area3D> Area3D::get_overlapping_areas() const { return ret; } +bool Area3D::has_overlapping_areas() const { + ERR_FAIL_COND_V_MSG(!monitoring, false, "Can't find overlapping areas when monitoring is off."); + return !area_map.is_empty(); +} + bool Area3D::overlaps_area(Node *p_area) const { ERR_FAIL_NULL_V(p_area, false); HashMap<ObjectID, AreaState>::ConstIterator E = area_map.find(p_area->get_instance_id()); @@ -686,6 +696,9 @@ void Area3D::_bind_methods() { ClassDB::bind_method(D_METHOD("get_overlapping_bodies"), &Area3D::get_overlapping_bodies); ClassDB::bind_method(D_METHOD("get_overlapping_areas"), &Area3D::get_overlapping_areas); + ClassDB::bind_method(D_METHOD("has_overlapping_bodies"), &Area3D::has_overlapping_bodies); + ClassDB::bind_method(D_METHOD("has_overlapping_areas"), &Area3D::has_overlapping_areas); + ClassDB::bind_method(D_METHOD("overlaps_body", "body"), &Area3D::overlaps_body); ClassDB::bind_method(D_METHOD("overlaps_area", "area"), &Area3D::overlaps_area); diff --git a/scene/3d/area_3d.h b/scene/3d/area_3d.h index 48364739b7..0f0bcc7ce0 100644 --- a/scene/3d/area_3d.h +++ b/scene/3d/area_3d.h @@ -201,6 +201,9 @@ public: TypedArray<Node3D> get_overlapping_bodies() const; TypedArray<Area3D> get_overlapping_areas() const; //function for script + bool has_overlapping_bodies() const; + bool has_overlapping_areas() const; + bool overlaps_area(Node *p_area) const; bool overlaps_body(Node *p_body) const; diff --git a/scene/3d/bone_attachment_3d.cpp b/scene/3d/bone_attachment_3d.cpp index b3ff6497a7..7b0a6c7e3e 100644 --- a/scene/3d/bone_attachment_3d.cpp +++ b/scene/3d/bone_attachment_3d.cpp @@ -100,8 +100,8 @@ void BoneAttachment3D::_get_property_list(List<PropertyInfo> *p_list) const { } } -TypedArray<String> BoneAttachment3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node3D::get_configuration_warnings(); +PackedStringArray BoneAttachment3D::get_configuration_warnings() const { + PackedStringArray warnings = Node3D::get_configuration_warnings(); if (use_external_skeleton) { if (external_skeleton_node_cache.is_null()) { diff --git a/scene/3d/bone_attachment_3d.h b/scene/3d/bone_attachment_3d.h index f85053e614..2db6ba6268 100644 --- a/scene/3d/bone_attachment_3d.h +++ b/scene/3d/bone_attachment_3d.h @@ -76,7 +76,7 @@ protected: #endif // TOOLS_ENABLED public: - virtual TypedArray<String> get_configuration_warnings() const override; + virtual PackedStringArray get_configuration_warnings() const override; void set_bone_name(const String &p_name); String get_bone_name() const; diff --git a/scene/3d/collision_object_3d.cpp b/scene/3d/collision_object_3d.cpp index f5e3e8b015..c3c1c8ba36 100644 --- a/scene/3d/collision_object_3d.cpp +++ b/scene/3d/collision_object_3d.cpp @@ -703,8 +703,8 @@ bool CollisionObject3D::get_capture_input_on_drag() const { return capture_input_on_drag; } -TypedArray<String> CollisionObject3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray CollisionObject3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (shapes.is_empty()) { warnings.push_back(RTR("This node has no shape, so it can't collide or interact with other objects.\nConsider adding a CollisionShape3D or CollisionPolygon3D as a child to define its shape.")); diff --git a/scene/3d/collision_object_3d.h b/scene/3d/collision_object_3d.h index c638be9d90..1406e6c698 100644 --- a/scene/3d/collision_object_3d.h +++ b/scene/3d/collision_object_3d.h @@ -164,7 +164,7 @@ public: _FORCE_INLINE_ RID get_rid() const { return rid; } - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; CollisionObject3D(); ~CollisionObject3D(); diff --git a/scene/3d/collision_polygon_3d.cpp b/scene/3d/collision_polygon_3d.cpp index 90099d787b..81b2c85de4 100644 --- a/scene/3d/collision_polygon_3d.cpp +++ b/scene/3d/collision_polygon_3d.cpp @@ -167,8 +167,8 @@ void CollisionPolygon3D::set_margin(real_t p_margin) { } } -TypedArray<String> CollisionPolygon3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray CollisionPolygon3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!Object::cast_to<CollisionObject3D>(get_parent())) { warnings.push_back(RTR("CollisionPolygon3D only serves to provide a collision shape to a CollisionObject3D derived node. Please only use it as a child of Area3D, StaticBody3D, RigidBody3D, CharacterBody3D, etc. to give them a shape.")); diff --git a/scene/3d/collision_polygon_3d.h b/scene/3d/collision_polygon_3d.h index 74e5867a2f..bbcea539b2 100644 --- a/scene/3d/collision_polygon_3d.h +++ b/scene/3d/collision_polygon_3d.h @@ -74,7 +74,7 @@ public: real_t get_margin() const; void set_margin(real_t p_margin); - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; CollisionPolygon3D(); }; diff --git a/scene/3d/collision_shape_3d.cpp b/scene/3d/collision_shape_3d.cpp index a9bc28b464..7a0001bc6f 100644 --- a/scene/3d/collision_shape_3d.cpp +++ b/scene/3d/collision_shape_3d.cpp @@ -114,8 +114,8 @@ void CollisionShape3D::resource_changed(Ref<Resource> res) { update_gizmos(); } -TypedArray<String> CollisionShape3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray CollisionShape3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!Object::cast_to<CollisionObject3D>(get_parent())) { warnings.push_back(RTR("CollisionShape3D only serves to provide a collision shape to a CollisionObject3D derived node. Please only use it as a child of Area3D, StaticBody3D, RigidBody3D, CharacterBody3D, etc. to give them a shape.")); diff --git a/scene/3d/collision_shape_3d.h b/scene/3d/collision_shape_3d.h index 124c0d166d..70653daa19 100644 --- a/scene/3d/collision_shape_3d.h +++ b/scene/3d/collision_shape_3d.h @@ -62,7 +62,7 @@ public: void set_disabled(bool p_disabled); bool is_disabled() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; CollisionShape3D(); ~CollisionShape3D(); diff --git a/scene/3d/cpu_particles_3d.cpp b/scene/3d/cpu_particles_3d.cpp index d7bf76a6f6..ef373cf9ca 100644 --- a/scene/3d/cpu_particles_3d.cpp +++ b/scene/3d/cpu_particles_3d.cpp @@ -188,8 +188,8 @@ bool CPUParticles3D::get_fractional_delta() const { return fractional_delta; } -TypedArray<String> CPUParticles3D::get_configuration_warnings() const { - TypedArray<String> warnings = GeometryInstance3D::get_configuration_warnings(); +PackedStringArray CPUParticles3D::get_configuration_warnings() const { + PackedStringArray warnings = GeometryInstance3D::get_configuration_warnings(); bool mesh_found = false; bool anim_material_found = false; diff --git a/scene/3d/cpu_particles_3d.h b/scene/3d/cpu_particles_3d.h index d84b0aedd2..26c702172b 100644 --- a/scene/3d/cpu_particles_3d.h +++ b/scene/3d/cpu_particles_3d.h @@ -302,7 +302,7 @@ public: void set_gravity(const Vector3 &p_gravity); Vector3 get_gravity() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; void restart(); diff --git a/scene/3d/decal.cpp b/scene/3d/decal.cpp index 460402ad1d..fc442986a8 100644 --- a/scene/3d/decal.cpp +++ b/scene/3d/decal.cpp @@ -158,8 +158,8 @@ void Decal::_validate_property(PropertyInfo &p_property) const { } } -TypedArray<String> Decal::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray Decal::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (textures[TEXTURE_ALBEDO].is_null() && textures[TEXTURE_NORMAL].is_null() && textures[TEXTURE_ORM].is_null() && textures[TEXTURE_EMISSION].is_null()) { warnings.push_back(RTR("The decal has no textures loaded into any of its texture properties, and will therefore not be visible.")); diff --git a/scene/3d/decal.h b/scene/3d/decal.h index 1a7d55b108..ab39350b75 100644 --- a/scene/3d/decal.h +++ b/scene/3d/decal.h @@ -65,7 +65,7 @@ protected: void _validate_property(PropertyInfo &p_property) const; public: - virtual TypedArray<String> get_configuration_warnings() const override; + virtual PackedStringArray get_configuration_warnings() const override; void set_extents(const Vector3 &p_extents); Vector3 get_extents() const; diff --git a/scene/3d/fog_volume.cpp b/scene/3d/fog_volume.cpp index cfee7028d4..4606e70310 100644 --- a/scene/3d/fog_volume.cpp +++ b/scene/3d/fog_volume.cpp @@ -99,8 +99,8 @@ AABB FogVolume::get_aabb() const { return AABB(); } -TypedArray<String> FogVolume::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray FogVolume::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); Ref<Environment> environment = get_viewport()->find_world_3d()->get_environment(); diff --git a/scene/3d/fog_volume.h b/scene/3d/fog_volume.h index fcdc1e2807..d79836be0e 100644 --- a/scene/3d/fog_volume.h +++ b/scene/3d/fog_volume.h @@ -62,7 +62,7 @@ public: Ref<Material> get_material() const; virtual AABB get_aabb() const override; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; FogVolume(); ~FogVolume(); diff --git a/scene/3d/gpu_particles_3d.cpp b/scene/3d/gpu_particles_3d.cpp index bd63939d74..dbbf196f7a 100644 --- a/scene/3d/gpu_particles_3d.cpp +++ b/scene/3d/gpu_particles_3d.cpp @@ -269,8 +269,8 @@ bool GPUParticles3D::get_interpolate() const { return interpolate; } -TypedArray<String> GPUParticles3D::get_configuration_warnings() const { - TypedArray<String> warnings = GeometryInstance3D::get_configuration_warnings(); +PackedStringArray GPUParticles3D::get_configuration_warnings() const { + PackedStringArray warnings = GeometryInstance3D::get_configuration_warnings(); if (RenderingServer::get_singleton()->is_low_end()) { warnings.push_back(RTR("GPU-based particles are not supported by the OpenGL video driver.\nUse the CPUParticles3D node instead. You can use the \"Convert to CPUParticles3D\" option for this purpose.")); diff --git a/scene/3d/gpu_particles_3d.h b/scene/3d/gpu_particles_3d.h index 2ad9672474..ef92218e4d 100644 --- a/scene/3d/gpu_particles_3d.h +++ b/scene/3d/gpu_particles_3d.h @@ -147,7 +147,7 @@ public: void set_draw_pass_mesh(int p_pass, const Ref<Mesh> &p_mesh); Ref<Mesh> get_draw_pass_mesh(int p_pass) const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; void set_sub_emitter(const NodePath &p_path); NodePath get_sub_emitter() const; diff --git a/scene/3d/gpu_particles_collision_3d.cpp b/scene/3d/gpu_particles_collision_3d.cpp index 24bfa7b6de..d3f53d9c0d 100644 --- a/scene/3d/gpu_particles_collision_3d.cpp +++ b/scene/3d/gpu_particles_collision_3d.cpp @@ -503,8 +503,8 @@ Ref<Image> GPUParticlesCollisionSDF3D::bake() { return ret; } -TypedArray<String> GPUParticlesCollisionSDF3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray GPUParticlesCollisionSDF3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (bake_mask == 0) { warnings.push_back(RTR("The Bake Mask has no bits enabled, which means baking will not produce any collision for this GPUParticlesCollisionSDF3D.\nTo resolve this, enable at least one bit in the Bake Mask property.")); diff --git a/scene/3d/gpu_particles_collision_3d.h b/scene/3d/gpu_particles_collision_3d.h index 712bd015ff..548552bb70 100644 --- a/scene/3d/gpu_particles_collision_3d.h +++ b/scene/3d/gpu_particles_collision_3d.h @@ -162,7 +162,7 @@ protected: static void _bind_methods(); public: - virtual TypedArray<String> get_configuration_warnings() const override; + virtual PackedStringArray get_configuration_warnings() const override; void set_thickness(float p_thickness); float get_thickness() const; diff --git a/scene/3d/joint_3d.cpp b/scene/3d/joint_3d.cpp index 7dc094062b..1a18f43e7b 100644 --- a/scene/3d/joint_3d.cpp +++ b/scene/3d/joint_3d.cpp @@ -198,8 +198,8 @@ bool Joint3D::get_exclude_nodes_from_collision() const { return exclude_from_collision; } -TypedArray<String> Joint3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node3D::get_configuration_warnings(); +PackedStringArray Joint3D::get_configuration_warnings() const { + PackedStringArray warnings = Node3D::get_configuration_warnings(); if (!warning.is_empty()) { warnings.push_back(warning); diff --git a/scene/3d/joint_3d.h b/scene/3d/joint_3d.h index cb967023e8..5af427446f 100644 --- a/scene/3d/joint_3d.h +++ b/scene/3d/joint_3d.h @@ -63,7 +63,7 @@ protected: _FORCE_INLINE_ bool is_configured() const { return configured; } public: - virtual TypedArray<String> get_configuration_warnings() const override; + virtual PackedStringArray get_configuration_warnings() const override; void set_node_a(const NodePath &p_node_a); NodePath get_node_a() const; diff --git a/scene/3d/light_3d.cpp b/scene/3d/light_3d.cpp index e51f06e083..23fd091be6 100644 --- a/scene/3d/light_3d.cpp +++ b/scene/3d/light_3d.cpp @@ -578,8 +578,8 @@ OmniLight3D::ShadowMode OmniLight3D::get_shadow_mode() const { return shadow_mode; } -TypedArray<String> OmniLight3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray OmniLight3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!has_shadow() && get_projector().is_valid()) { warnings.push_back(RTR("Projector texture only works with shadows active.")); @@ -608,8 +608,8 @@ OmniLight3D::OmniLight3D() : set_param(PARAM_SHADOW_BIAS, 0.2); } -TypedArray<String> SpotLight3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray SpotLight3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (has_shadow() && get_param(PARAM_SPOT_ANGLE) >= 90.0) { warnings.push_back(RTR("A SpotLight3D with an angle wider than 90 degrees cannot cast shadows.")); diff --git a/scene/3d/light_3d.h b/scene/3d/light_3d.h index e43d6f0419..8da45bee79 100644 --- a/scene/3d/light_3d.h +++ b/scene/3d/light_3d.h @@ -216,7 +216,7 @@ public: void set_shadow_mode(ShadowMode p_mode); ShadowMode get_shadow_mode() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; OmniLight3D(); }; @@ -230,7 +230,7 @@ protected: static void _bind_methods(); public: - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; SpotLight3D() : Light3D(RenderingServer::LIGHT_SPOT) {} diff --git a/scene/3d/lightmap_gi.cpp b/scene/3d/lightmap_gi.cpp index b0bccc4571..cbcbac7b83 100644 --- a/scene/3d/lightmap_gi.cpp +++ b/scene/3d/lightmap_gi.cpp @@ -1001,10 +1001,16 @@ LightmapGI::BakeError LightmapGI::bake(Node *p_from_node, String p_image_data_pa lightmapper->add_directional_light(light->get_bake_mode() == Light3D::BAKE_STATIC, -xf.basis.get_column(Vector3::AXIS_Z).normalized(), linear_color, energy, l->get_param(Light3D::PARAM_SIZE), l->get_param(Light3D::PARAM_SHADOW_BLUR)); } else if (Object::cast_to<OmniLight3D>(light)) { OmniLight3D *l = Object::cast_to<OmniLight3D>(light); - lightmapper->add_omni_light(light->get_bake_mode() == Light3D::BAKE_STATIC, xf.origin, linear_color, energy * (1.0 / (Math_PI * 4.0)), l->get_param(Light3D::PARAM_RANGE), l->get_param(Light3D::PARAM_ATTENUATION), l->get_param(Light3D::PARAM_SIZE), l->get_param(Light3D::PARAM_SHADOW_BLUR)); + if (GLOBAL_GET("rendering/lights_and_shadows/use_physical_light_units")) { + energy *= (1.0 / (Math_PI * 4.0)); + } + lightmapper->add_omni_light(light->get_bake_mode() == Light3D::BAKE_STATIC, xf.origin, linear_color, energy, l->get_param(Light3D::PARAM_RANGE), l->get_param(Light3D::PARAM_ATTENUATION), l->get_param(Light3D::PARAM_SIZE), l->get_param(Light3D::PARAM_SHADOW_BLUR)); } else if (Object::cast_to<SpotLight3D>(light)) { SpotLight3D *l = Object::cast_to<SpotLight3D>(light); - lightmapper->add_spot_light(light->get_bake_mode() == Light3D::BAKE_STATIC, xf.origin, -xf.basis.get_column(Vector3::AXIS_Z).normalized(), linear_color, energy * (1.0 / Math_PI), l->get_param(Light3D::PARAM_RANGE), l->get_param(Light3D::PARAM_ATTENUATION), l->get_param(Light3D::PARAM_SPOT_ANGLE), l->get_param(Light3D::PARAM_SPOT_ATTENUATION), l->get_param(Light3D::PARAM_SIZE), l->get_param(Light3D::PARAM_SHADOW_BLUR)); + if (GLOBAL_GET("rendering/lights_and_shadows/use_physical_light_units")) { + energy *= (1.0 / Math_PI); + } + lightmapper->add_spot_light(light->get_bake_mode() == Light3D::BAKE_STATIC, xf.origin, -xf.basis.get_column(Vector3::AXIS_Z).normalized(), linear_color, energy, l->get_param(Light3D::PARAM_RANGE), l->get_param(Light3D::PARAM_ATTENUATION), l->get_param(Light3D::PARAM_SPOT_ANGLE), l->get_param(Light3D::PARAM_SPOT_ATTENUATION), l->get_param(Light3D::PARAM_SIZE), l->get_param(Light3D::PARAM_SHADOW_BLUR)); } } for (int i = 0; i < probes_found.size(); i++) { @@ -1061,7 +1067,10 @@ LightmapGI::BakeError LightmapGI::bake(Node *p_from_node, String p_image_data_pa float exposure_normalization = 1.0; if (camera_attributes.is_valid()) { - exposure_normalization = camera_attributes->calculate_exposure_normalization() * camera_attributes->get_exposure_multiplier(); + exposure_normalization = camera_attributes->get_exposure_multiplier(); + if (GLOBAL_GET("rendering/lights_and_shadows/use_physical_light_units")) { + exposure_normalization = camera_attributes->calculate_exposure_normalization(); + } } Lightmapper::BakeError bake_err = lightmapper->bake(Lightmapper::BakeQuality(bake_quality), use_denoiser, bounces, bias, max_texture_size, directional, Lightmapper::GenerateProbes(gen_probes), environment_image, environment_transform, _lightmap_bake_step_function, &bsud, exposure_normalization); @@ -1418,7 +1427,8 @@ float LightmapGI::get_bias() const { } void LightmapGI::set_max_texture_size(int p_size) { - ERR_FAIL_COND(p_size < 2048); + ERR_FAIL_COND_MSG(p_size < 2048, vformat("The LightmapGI maximum texture size supplied (%d) is too small. The minimum allowed value is 2048.", p_size)); + ERR_FAIL_COND_MSG(p_size > 16384, vformat("The LightmapGI maximum texture size supplied (%d) is too large. The maximum allowed value is 16384.", p_size)); max_texture_size = p_size; } @@ -1506,7 +1516,7 @@ void LightmapGI::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "interior"), "set_interior", "is_interior"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "use_denoiser"), "set_use_denoiser", "is_using_denoiser"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "bias", PROPERTY_HINT_RANGE, "0.00001,0.1,0.00001,or_greater"), "set_bias", "get_bias"); - ADD_PROPERTY(PropertyInfo(Variant::INT, "max_texture_size"), "set_max_texture_size", "get_max_texture_size"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "max_texture_size", PROPERTY_HINT_RANGE, "2048,16384,1"), "set_max_texture_size", "get_max_texture_size"); ADD_GROUP("Environment", "environment_"); ADD_PROPERTY(PropertyInfo(Variant::INT, "environment_mode", PROPERTY_HINT_ENUM, "Disabled,Scene,Custom Sky,Custom Color"), "set_environment_mode", "get_environment_mode"); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "environment_custom_sky", PROPERTY_HINT_RESOURCE_TYPE, "Sky"), "set_environment_custom_sky", "get_environment_custom_sky"); diff --git a/scene/3d/lightmap_gi.h b/scene/3d/lightmap_gi.h index 0062a4a093..1d282e92c8 100644 --- a/scene/3d/lightmap_gi.h +++ b/scene/3d/lightmap_gi.h @@ -142,16 +142,16 @@ public: private: BakeQuality bake_quality = BAKE_QUALITY_MEDIUM; bool use_denoiser = true; - int bounces = 1; + int bounces = 3; float bias = 0.0005; int max_texture_size = 16384; bool interior = false; - EnvironmentMode environment_mode = ENVIRONMENT_MODE_DISABLED; + EnvironmentMode environment_mode = ENVIRONMENT_MODE_SCENE; Ref<Sky> environment_custom_sky; - Color environment_custom_color = Color(0.2, 0.7, 1.0); + Color environment_custom_color = Color(1, 1, 1); float environment_custom_energy = 1.0; bool directional = false; - GenerateProbes gen_probes = GENERATE_PROBES_DISABLED; + GenerateProbes gen_probes = GENERATE_PROBES_SUBDIV_8; Ref<CameraAttributes> camera_attributes; Ref<LightmapGIData> light_data; diff --git a/scene/3d/mesh_instance_3d.cpp b/scene/3d/mesh_instance_3d.cpp index a76f4dd0d5..b0503c9c02 100644 --- a/scene/3d/mesh_instance_3d.cpp +++ b/scene/3d/mesh_instance_3d.cpp @@ -390,13 +390,13 @@ void MeshInstance3D::_mesh_changed() { update_gizmos(); } -void MeshInstance3D::create_debug_tangents() { +MeshInstance3D *MeshInstance3D::create_debug_tangents_node() { Vector<Vector3> lines; Vector<Color> colors; Ref<Mesh> mesh = get_mesh(); if (!mesh.is_valid()) { - return; + return nullptr; } for (int i = 0; i < mesh->get_surface_count(); i++) { @@ -457,15 +457,23 @@ void MeshInstance3D::create_debug_tangents() { MeshInstance3D *mi = memnew(MeshInstance3D); mi->set_mesh(am); mi->set_name("DebugTangents"); - add_child(mi, true); -#ifdef TOOLS_ENABLED + return mi; + } - if (is_inside_tree() && this == get_tree()->get_edited_scene_root()) { - mi->set_owner(this); - } else { - mi->set_owner(get_owner()); - } -#endif + return nullptr; +} + +void MeshInstance3D::create_debug_tangents() { + MeshInstance3D *mi = create_debug_tangents_node(); + if (!mi) { + return; + } + + add_child(mi, true); + if (is_inside_tree() && this == get_tree()->get_edited_scene_root()) { + mi->set_owner(this); + } else { + mi->set_owner(get_owner()); } } @@ -495,8 +503,6 @@ void MeshInstance3D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_blend_shape_value", "blend_shape_idx", "value"), &MeshInstance3D::set_blend_shape_value); ClassDB::bind_method(D_METHOD("create_debug_tangents"), &MeshInstance3D::create_debug_tangents); - ClassDB::set_method_flags("MeshInstance3D", "create_debug_tangents", METHOD_FLAGS_DEFAULT | METHOD_FLAG_EDITOR); - ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "mesh", PROPERTY_HINT_RESOURCE_TYPE, "Mesh"), "set_mesh", "get_mesh"); ADD_GROUP("Skeleton", ""); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "skin", PROPERTY_HINT_RESOURCE_TYPE, "Skin"), "set_skin", "get_skin"); diff --git a/scene/3d/mesh_instance_3d.h b/scene/3d/mesh_instance_3d.h index 48d76b9a88..caf7d25616 100644 --- a/scene/3d/mesh_instance_3d.h +++ b/scene/3d/mesh_instance_3d.h @@ -90,6 +90,7 @@ public: Node *create_multiple_convex_collisions_node(); void create_multiple_convex_collisions(); + MeshInstance3D *create_debug_tangents_node(); void create_debug_tangents(); virtual AABB get_aabb() const override; diff --git a/scene/3d/navigation_agent_3d.cpp b/scene/3d/navigation_agent_3d.cpp index 34e84861a2..39068fe83c 100644 --- a/scene/3d/navigation_agent_3d.cpp +++ b/scene/3d/navigation_agent_3d.cpp @@ -185,6 +185,13 @@ NavigationAgent3D::NavigationAgent3D() { set_radius(1.0); set_max_speed(10.0); set_ignore_y(true); + + // Preallocate query and result objects to improve performance. + navigation_query = Ref<NavigationPathQueryParameters3D>(); + navigation_query.instantiate(); + + navigation_result = Ref<NavigationPathQueryResult3D>(); + navigation_result.instantiate(); } NavigationAgent3D::~NavigationAgent3D() { @@ -330,6 +337,8 @@ Vector3 NavigationAgent3D::get_target_location() const { Vector3 NavigationAgent3D::get_next_location() { update_navigation(); + + const Vector<Vector3> &navigation_path = navigation_result->get_path(); if (navigation_path.size() == 0) { ERR_FAIL_COND_V_MSG(agent_parent == nullptr, Vector3(), "The agent has no parent."); return agent_parent->get_global_transform().origin; @@ -338,6 +347,10 @@ Vector3 NavigationAgent3D::get_next_location() { } } +const Vector<Vector3> &NavigationAgent3D::get_nav_path() const { + return navigation_result->get_path(); +} + real_t NavigationAgent3D::distance_to_target() const { ERR_FAIL_COND_V_MSG(agent_parent == nullptr, 0.0, "The agent has no parent."); return agent_parent->get_global_transform().origin.distance_to(target_location); @@ -358,6 +371,8 @@ bool NavigationAgent3D::is_navigation_finished() { Vector3 NavigationAgent3D::get_final_location() { update_navigation(); + + const Vector<Vector3> &navigation_path = navigation_result->get_path(); if (navigation_path.size() == 0) { return Vector3(); } @@ -383,8 +398,8 @@ void NavigationAgent3D::_avoidance_done(Vector3 p_new_velocity) { emit_signal(SNAME("velocity_computed"), p_new_velocity); } -TypedArray<String> NavigationAgent3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray NavigationAgent3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!Object::cast_to<Node3D>(get_parent())) { warnings.push_back(RTR("The NavigationAgent3D can be used only under a Node3D inheriting parent node.")); @@ -406,24 +421,26 @@ void NavigationAgent3D::update_navigation() { update_frame_id = Engine::get_singleton()->get_physics_frames(); - Vector3 o = agent_parent->get_global_transform().origin; + Vector3 origin = agent_parent->get_global_transform().origin; bool reload_path = false; if (NavigationServer3D::get_singleton()->agent_is_map_changed(agent)) { reload_path = true; - } else if (navigation_path.size() == 0) { + } else if (navigation_result->get_path().size() == 0) { reload_path = true; } else { // Check if too far from the navigation path if (nav_path_index > 0) { + const Vector<Vector3> &navigation_path = navigation_result->get_path(); + Vector3 segment[2]; segment[0] = navigation_path[nav_path_index - 1]; segment[1] = navigation_path[nav_path_index]; segment[0].y -= navigation_height_offset; segment[1].y -= navigation_height_offset; - Vector3 p = Geometry3D::get_closest_point_to_segment(o, segment); - if (o.distance_to(p) >= path_max_distance) { + Vector3 p = Geometry3D::get_closest_point_to_segment(origin, segment); + if (origin.distance_to(p) >= path_max_distance) { // To faraway, reload path reload_path = true; } @@ -431,24 +448,31 @@ void NavigationAgent3D::update_navigation() { } if (reload_path) { + navigation_query->set_start_position(origin); + navigation_query->set_target_position(target_location); + navigation_query->set_navigation_layers(navigation_layers); + if (map_override.is_valid()) { - navigation_path = NavigationServer3D::get_singleton()->map_get_path(map_override, o, target_location, true, navigation_layers); + navigation_query->set_map(map_override); } else { - navigation_path = NavigationServer3D::get_singleton()->map_get_path(agent_parent->get_world_3d()->get_navigation_map(), o, target_location, true, navigation_layers); + navigation_query->set_map(agent_parent->get_world_3d()->get_navigation_map()); } + + NavigationServer3D::get_singleton()->query_path(navigation_query, navigation_result); navigation_finished = false; nav_path_index = 0; emit_signal(SNAME("path_changed")); } - if (navigation_path.size() == 0) { + if (navigation_result->get_path().size() == 0) { return; } // Check if we can advance the navigation path if (navigation_finished == false) { // Advances to the next far away location. - while (o.distance_to(navigation_path[nav_path_index] - Vector3(0, navigation_height_offset, 0)) < path_desired_distance) { + const Vector<Vector3> &navigation_path = navigation_result->get_path(); + while (origin.distance_to(navigation_path[nav_path_index] - Vector3(0, navigation_height_offset, 0)) < path_desired_distance) { nav_path_index += 1; if (nav_path_index == navigation_path.size()) { _check_distance_to_target(); @@ -462,7 +486,7 @@ void NavigationAgent3D::update_navigation() { } void NavigationAgent3D::_request_repath() { - navigation_path.clear(); + navigation_result->reset(); target_reached = false; navigation_finished = false; update_frame_id = 0; diff --git a/scene/3d/navigation_agent_3d.h b/scene/3d/navigation_agent_3d.h index 35c1b1175a..90ceab0242 100644 --- a/scene/3d/navigation_agent_3d.h +++ b/scene/3d/navigation_agent_3d.h @@ -34,6 +34,8 @@ #include "scene/main/node.h" class Node3D; +class NavigationPathQueryParameters3D; +class NavigationPathQueryResult3D; class NavigationAgent3D : public Node { GDCLASS(NavigationAgent3D, Node); @@ -60,7 +62,8 @@ class NavigationAgent3D : public Node { real_t path_max_distance = 3.0; Vector3 target_location; - Vector<Vector3> navigation_path; + Ref<NavigationPathQueryParameters3D> navigation_query; + Ref<NavigationPathQueryResult3D> navigation_result; int nav_path_index = 0; bool velocity_submitted = false; Vector3 prev_safe_velocity; @@ -150,9 +153,7 @@ public: Vector3 get_next_location(); - Vector<Vector3> get_nav_path() const { - return navigation_path; - } + const Vector<Vector3> &get_nav_path() const; int get_nav_path_index() const { return nav_path_index; @@ -167,7 +168,7 @@ public: void set_velocity(Vector3 p_velocity); void _avoidance_done(Vector3 p_new_velocity); - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; private: void update_navigation(); diff --git a/scene/3d/navigation_link_3d.cpp b/scene/3d/navigation_link_3d.cpp index 47b602c966..78fe4754ea 100644 --- a/scene/3d/navigation_link_3d.cpp +++ b/scene/3d/navigation_link_3d.cpp @@ -378,8 +378,8 @@ void NavigationLink3D::set_travel_cost(real_t p_travel_cost) { NavigationServer3D::get_singleton()->link_set_travel_cost(link, travel_cost); } -TypedArray<String> NavigationLink3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray NavigationLink3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (start_location.is_equal_approx(end_location)) { warnings.push_back(RTR("NavigationLink3D start location should be different than the end location to be useful.")); diff --git a/scene/3d/navigation_link_3d.h b/scene/3d/navigation_link_3d.h index 1f88075527..1fc03546fa 100644 --- a/scene/3d/navigation_link_3d.h +++ b/scene/3d/navigation_link_3d.h @@ -84,7 +84,7 @@ public: void set_travel_cost(real_t p_travel_cost); real_t get_travel_cost() const { return travel_cost; } - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; }; #endif // NAVIGATION_LINK_3D_H diff --git a/scene/3d/navigation_obstacle_3d.cpp b/scene/3d/navigation_obstacle_3d.cpp index 953e52e591..07d8cd9289 100644 --- a/scene/3d/navigation_obstacle_3d.cpp +++ b/scene/3d/navigation_obstacle_3d.cpp @@ -37,6 +37,9 @@ void NavigationObstacle3D::_bind_methods() { ClassDB::bind_method(D_METHOD("get_rid"), &NavigationObstacle3D::get_rid); + ClassDB::bind_method(D_METHOD("set_navigation_map", "navigation_map"), &NavigationObstacle3D::set_navigation_map); + ClassDB::bind_method(D_METHOD("get_navigation_map"), &NavigationObstacle3D::get_navigation_map); + ClassDB::bind_method(D_METHOD("set_estimate_radius", "estimate_radius"), &NavigationObstacle3D::set_estimate_radius); ClassDB::bind_method(D_METHOD("is_radius_estimated"), &NavigationObstacle3D::is_radius_estimated); ClassDB::bind_method(D_METHOD("set_radius", "radius"), &NavigationObstacle3D::set_radius); @@ -56,28 +59,26 @@ void NavigationObstacle3D::_validate_property(PropertyInfo &p_property) const { void NavigationObstacle3D::_notification(int p_what) { switch (p_what) { - case NOTIFICATION_ENTER_TREE: { - parent_node3d = Object::cast_to<Node3D>(get_parent()); - reevaluate_agent_radius(); - if (parent_node3d != nullptr) { - // place agent on navigation map first or else the RVO agent callback creation fails silently later - NavigationServer3D::get_singleton()->agent_set_map(get_rid(), parent_node3d->get_world_3d()->get_navigation_map()); - } + case NOTIFICATION_POST_ENTER_TREE: { + set_agent_parent(get_parent()); set_physics_process_internal(true); } break; case NOTIFICATION_EXIT_TREE: { - parent_node3d = nullptr; + set_agent_parent(nullptr); set_physics_process_internal(false); } break; case NOTIFICATION_PARENTED: { - parent_node3d = Object::cast_to<Node3D>(get_parent()); - reevaluate_agent_radius(); + if (is_inside_tree() && (get_parent() != parent_node3d)) { + set_agent_parent(get_parent()); + set_physics_process_internal(true); + } } break; case NOTIFICATION_UNPARENTED: { - parent_node3d = nullptr; + set_agent_parent(nullptr); + set_physics_process_internal(false); } break; case NOTIFICATION_PAUSED: { @@ -125,8 +126,8 @@ NavigationObstacle3D::~NavigationObstacle3D() { agent = RID(); // Pointless } -TypedArray<String> NavigationObstacle3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray NavigationObstacle3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!Object::cast_to<Node3D>(get_parent())) { warnings.push_back(RTR("The NavigationObstacle3D only serves to provide collision avoidance to a Node3D inheriting parent object.")); @@ -189,6 +190,35 @@ real_t NavigationObstacle3D::estimate_agent_radius() const { return 1.0; // Never a 0 radius } +void NavigationObstacle3D::set_agent_parent(Node *p_agent_parent) { + if (Object::cast_to<Node3D>(p_agent_parent) != nullptr) { + parent_node3d = Object::cast_to<Node3D>(p_agent_parent); + if (map_override.is_valid()) { + NavigationServer3D::get_singleton()->agent_set_map(get_rid(), map_override); + } else { + NavigationServer3D::get_singleton()->agent_set_map(get_rid(), parent_node3d->get_world_3d()->get_navigation_map()); + } + reevaluate_agent_radius(); + } else { + parent_node3d = nullptr; + NavigationServer3D::get_singleton()->agent_set_map(get_rid(), RID()); + } +} + +void NavigationObstacle3D::set_navigation_map(RID p_navigation_map) { + map_override = p_navigation_map; + NavigationServer3D::get_singleton()->agent_set_map(agent, map_override); +} + +RID NavigationObstacle3D::get_navigation_map() const { + if (map_override.is_valid()) { + return map_override; + } else if (parent_node3d != nullptr) { + return parent_node3d->get_world_3d()->get_navigation_map(); + } + return RID(); +} + void NavigationObstacle3D::set_estimate_radius(bool p_estimate_radius) { estimate_radius = p_estimate_radius; notify_property_list_changed(); diff --git a/scene/3d/navigation_obstacle_3d.h b/scene/3d/navigation_obstacle_3d.h index 7f6af668b6..f242d2f99e 100644 --- a/scene/3d/navigation_obstacle_3d.h +++ b/scene/3d/navigation_obstacle_3d.h @@ -37,8 +37,10 @@ class NavigationObstacle3D : public Node { GDCLASS(NavigationObstacle3D, Node); Node3D *parent_node3d = nullptr; + RID agent; RID map_before_pause; + RID map_override; bool estimate_radius = true; real_t radius = 1.0; @@ -56,6 +58,11 @@ public: return agent; } + void set_agent_parent(Node *p_agent_parent); + + void set_navigation_map(RID p_navigation_map); + RID get_navigation_map() const; + void set_estimate_radius(bool p_estimate_radius); bool is_radius_estimated() const { return estimate_radius; @@ -65,7 +72,7 @@ public: return radius; } - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; private: void initialize_agent(); diff --git a/scene/3d/navigation_region_3d.cpp b/scene/3d/navigation_region_3d.cpp index 049ca4c8a0..06182d921c 100644 --- a/scene/3d/navigation_region_3d.cpp +++ b/scene/3d/navigation_region_3d.cpp @@ -37,6 +37,7 @@ void NavigationRegion3D::set_enabled(bool p_enabled) { if (enabled == p_enabled) { return; } + enabled = p_enabled; if (!is_inside_tree()) { @@ -81,35 +82,50 @@ bool NavigationRegion3D::is_enabled() const { } void NavigationRegion3D::set_navigation_layers(uint32_t p_navigation_layers) { - NavigationServer3D::get_singleton()->region_set_navigation_layers(region, p_navigation_layers); + if (navigation_layers == p_navigation_layers) { + return; + } + + navigation_layers = p_navigation_layers; + + NavigationServer3D::get_singleton()->region_set_navigation_layers(region, navigation_layers); } uint32_t NavigationRegion3D::get_navigation_layers() const { - return NavigationServer3D::get_singleton()->region_get_navigation_layers(region); + return navigation_layers; } void NavigationRegion3D::set_navigation_layer_value(int p_layer_number, bool p_value) { ERR_FAIL_COND_MSG(p_layer_number < 1, "Navigation layer number must be between 1 and 32 inclusive."); ERR_FAIL_COND_MSG(p_layer_number > 32, "Navigation layer number must be between 1 and 32 inclusive."); + uint32_t _navigation_layers = get_navigation_layers(); + if (p_value) { _navigation_layers |= 1 << (p_layer_number - 1); } else { _navigation_layers &= ~(1 << (p_layer_number - 1)); } + set_navigation_layers(_navigation_layers); } bool NavigationRegion3D::get_navigation_layer_value(int p_layer_number) const { ERR_FAIL_COND_V_MSG(p_layer_number < 1, false, "Navigation layer number must be between 1 and 32 inclusive."); ERR_FAIL_COND_V_MSG(p_layer_number > 32, false, "Navigation layer number must be between 1 and 32 inclusive."); + return get_navigation_layers() & (1 << (p_layer_number - 1)); } void NavigationRegion3D::set_enter_cost(real_t p_enter_cost) { ERR_FAIL_COND_MSG(p_enter_cost < 0.0, "The enter_cost must be positive."); - enter_cost = MAX(p_enter_cost, 0.0); - NavigationServer3D::get_singleton()->region_set_enter_cost(region, p_enter_cost); + if (Math::is_equal_approx(enter_cost, p_enter_cost)) { + return; + } + + enter_cost = p_enter_cost; + + NavigationServer3D::get_singleton()->region_set_enter_cost(region, enter_cost); } real_t NavigationRegion3D::get_enter_cost() const { @@ -118,7 +134,12 @@ real_t NavigationRegion3D::get_enter_cost() const { void NavigationRegion3D::set_travel_cost(real_t p_travel_cost) { ERR_FAIL_COND_MSG(p_travel_cost < 0.0, "The travel_cost must be positive."); - travel_cost = MAX(p_travel_cost, 0.0); + if (Math::is_equal_approx(travel_cost, p_travel_cost)) { + return; + } + + travel_cost = p_travel_cost; + NavigationServer3D::get_singleton()->region_set_travel_cost(region, travel_cost); } @@ -130,8 +151,6 @@ RID NavigationRegion3D::get_region_rid() const { return region; } -///////////////////////////// - void NavigationRegion3D::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: { @@ -242,12 +261,7 @@ void NavigationRegion3D::bake_navigation_mesh(bool p_on_thread) { BakeThreadsArgs *args = memnew(BakeThreadsArgs); args->nav_region = this; - if (p_on_thread && !OS::get_singleton()->can_use_threads()) { - WARN_PRINT("NavigationMesh bake 'on_thread' will be disabled as the current OS does not support multiple threads." - "\nAs a fallback the navigation mesh will bake on the main thread which can cause framerate issues."); - } - - if (p_on_thread && OS::get_singleton()->can_use_threads()) { + if (p_on_thread) { bake_thread.start(_bake_navigation_mesh, args); } else { _bake_navigation_mesh(args); @@ -260,8 +274,8 @@ void NavigationRegion3D::_bake_finished(Ref<NavigationMesh> p_nav_mesh) { emit_signal(SNAME("bake_finished")); } -TypedArray<String> NavigationRegion3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray NavigationRegion3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (is_visible_in_tree() && is_inside_tree()) { if (!navmesh.is_valid()) { diff --git a/scene/3d/navigation_region_3d.h b/scene/3d/navigation_region_3d.h index ba326abb46..660538d314 100644 --- a/scene/3d/navigation_region_3d.h +++ b/scene/3d/navigation_region_3d.h @@ -39,10 +39,10 @@ class NavigationRegion3D : public Node3D { bool enabled = true; RID region; - Ref<NavigationMesh> navmesh; - + uint32_t navigation_layers = 1; real_t enter_cost = 0.0; real_t travel_cost = 1.0; + Ref<NavigationMesh> navmesh; Thread bake_thread; @@ -90,7 +90,7 @@ public: void bake_navigation_mesh(bool p_on_thread); void _bake_finished(Ref<NavigationMesh> p_nav_mesh); - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; NavigationRegion3D(); ~NavigationRegion3D(); diff --git a/scene/3d/node_3d.cpp b/scene/3d/node_3d.cpp index 59ec036558..12d2e66b41 100644 --- a/scene/3d/node_3d.cpp +++ b/scene/3d/node_3d.cpp @@ -786,6 +786,7 @@ void Node3D::set_identity() { } void Node3D::look_at(const Vector3 &p_target, const Vector3 &p_up) { + ERR_FAIL_COND_MSG(!is_inside_tree(), "Node not inside tree. Use look_at_from_position() instead."); Vector3 origin = get_global_transform().origin; look_at_from_position(origin, p_target, p_up); } @@ -1037,6 +1038,7 @@ void Node3D::_bind_methods() { BIND_CONSTANT(NOTIFICATION_ENTER_WORLD); BIND_CONSTANT(NOTIFICATION_EXIT_WORLD); BIND_CONSTANT(NOTIFICATION_VISIBILITY_CHANGED); + BIND_CONSTANT(NOTIFICATION_LOCAL_TRANSFORM_CHANGED); BIND_ENUM_CONSTANT(ROTATION_EDIT_MODE_EULER); BIND_ENUM_CONSTANT(ROTATION_EDIT_MODE_QUATERNION); diff --git a/scene/3d/occluder_instance_3d.cpp b/scene/3d/occluder_instance_3d.cpp index 015cb9a21d..4e1ed5654a 100644 --- a/scene/3d/occluder_instance_3d.cpp +++ b/scene/3d/occluder_instance_3d.cpp @@ -682,8 +682,8 @@ OccluderInstance3D::BakeError OccluderInstance3D::bake_scene(Node *p_from_node, return BAKE_ERROR_OK; } -TypedArray<String> OccluderInstance3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray OccluderInstance3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!bool(GLOBAL_GET("rendering/occlusion_culling/use_occlusion_culling"))) { warnings.push_back(RTR("Occlusion culling is disabled in the Project Settings, which means occlusion culling won't be performed in the root viewport.\nTo resolve this, open the Project Settings and enable Rendering > Occlusion Culling > Use Occlusion Culling.")); diff --git a/scene/3d/occluder_instance_3d.h b/scene/3d/occluder_instance_3d.h index 69a80e63fc..f507fee024 100644 --- a/scene/3d/occluder_instance_3d.h +++ b/scene/3d/occluder_instance_3d.h @@ -181,7 +181,7 @@ protected: static void _bind_methods(); public: - virtual TypedArray<String> get_configuration_warnings() const override; + virtual PackedStringArray get_configuration_warnings() const override; enum BakeError { BAKE_ERROR_OK, diff --git a/scene/3d/path_3d.cpp b/scene/3d/path_3d.cpp index 2d1f4a579b..123a044b84 100644 --- a/scene/3d/path_3d.cpp +++ b/scene/3d/path_3d.cpp @@ -341,8 +341,8 @@ void PathFollow3D::_validate_property(PropertyInfo &p_property) const { } } -TypedArray<String> PathFollow3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray PathFollow3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (is_visible_in_tree() && is_inside_tree()) { if (!Object::cast_to<Path3D>(get_parent())) { diff --git a/scene/3d/path_3d.h b/scene/3d/path_3d.h index 45fa2c8917..b161b12185 100644 --- a/scene/3d/path_3d.h +++ b/scene/3d/path_3d.h @@ -112,7 +112,7 @@ public: void set_cubic_interpolation(bool p_enable); bool get_cubic_interpolation() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; PathFollow3D() {} }; diff --git a/scene/3d/physics_body_3d.cpp b/scene/3d/physics_body_3d.cpp index 8888aa183a..594e94644c 100644 --- a/scene/3d/physics_body_3d.cpp +++ b/scene/3d/physics_body_3d.cpp @@ -34,8 +34,8 @@ #include "scene/scene_string_names.h" void PhysicsBody3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("move_and_collide", "distance", "test_only", "safe_margin", "max_collisions"), &PhysicsBody3D::_move, DEFVAL(false), DEFVAL(0.001), DEFVAL(1)); - ClassDB::bind_method(D_METHOD("test_move", "from", "distance", "collision", "safe_margin", "max_collisions"), &PhysicsBody3D::test_move, DEFVAL(Variant()), DEFVAL(0.001), DEFVAL(1)); + ClassDB::bind_method(D_METHOD("move_and_collide", "distance", "test_only", "safe_margin", "recovery_as_collision", "max_collisions"), &PhysicsBody3D::_move, DEFVAL(false), DEFVAL(0.001), DEFVAL(false), DEFVAL(1)); + ClassDB::bind_method(D_METHOD("test_move", "from", "distance", "collision", "safe_margin", "recovery_as_collision", "max_collisions"), &PhysicsBody3D::test_move, DEFVAL(Variant()), DEFVAL(0.001), DEFVAL(false), DEFVAL(1)); ClassDB::bind_method(D_METHOD("set_axis_lock", "axis", "lock"), &PhysicsBody3D::set_axis_lock); ClassDB::bind_method(D_METHOD("get_axis_lock", "axis"), &PhysicsBody3D::get_axis_lock); @@ -91,16 +91,16 @@ void PhysicsBody3D::remove_collision_exception_with(Node *p_node) { PhysicsServer3D::get_singleton()->body_remove_collision_exception(get_rid(), collision_object->get_rid()); } -Ref<KinematicCollision3D> PhysicsBody3D::_move(const Vector3 &p_distance, bool p_test_only, real_t p_margin, int p_max_collisions) { +Ref<KinematicCollision3D> PhysicsBody3D::_move(const Vector3 &p_distance, bool p_test_only, real_t p_margin, bool p_recovery_as_collision, int p_max_collisions) { PhysicsServer3D::MotionParameters parameters(get_global_transform(), p_distance, p_margin); parameters.max_collisions = p_max_collisions; - parameters.recovery_as_collision = false; // Don't report collisions generated only from recovery. + parameters.recovery_as_collision = p_recovery_as_collision; PhysicsServer3D::MotionResult result; if (move_and_collide(parameters, result, p_test_only)) { // Create a new instance when the cached reference is invalid or still in use in script. - if (motion_cache.is_null() || motion_cache->reference_get_count() > 1) { + if (motion_cache.is_null() || motion_cache->get_reference_count() > 1) { motion_cache.instantiate(); motion_cache->owner = this; } @@ -169,7 +169,7 @@ bool PhysicsBody3D::move_and_collide(const PhysicsServer3D::MotionParameters &p_ return colliding; } -bool PhysicsBody3D::test_move(const Transform3D &p_from, const Vector3 &p_distance, const Ref<KinematicCollision3D> &r_collision, real_t p_margin, int p_max_collisions) { +bool PhysicsBody3D::test_move(const Transform3D &p_from, const Vector3 &p_distance, const Ref<KinematicCollision3D> &r_collision, real_t p_margin, bool p_recovery_as_collision, int p_max_collisions) { ERR_FAIL_COND_V(!is_inside_tree(), false); PhysicsServer3D::MotionResult *r = nullptr; @@ -182,7 +182,7 @@ bool PhysicsBody3D::test_move(const Transform3D &p_from, const Vector3 &p_distan } PhysicsServer3D::MotionParameters parameters(p_from, p_distance, p_margin); - parameters.recovery_as_collision = false; // Don't report collisions generated only from recovery. + parameters.recovery_as_collision = p_recovery_as_collision; return PhysicsServer3D::get_singleton()->body_test_motion(get_rid(), parameters, r); } @@ -317,11 +317,6 @@ void AnimatableBody3D::_update_kinematic_motion() { } } -void AnimatableBody3D::_body_state_changed_callback(void *p_instance, PhysicsDirectBodyState3D *p_state) { - AnimatableBody3D *body = (AnimatableBody3D *)p_instance; - body->_body_state_changed(p_state); -} - void AnimatableBody3D::_body_state_changed(PhysicsDirectBodyState3D *p_state) { linear_velocity = p_state->get_linear_velocity(); angular_velocity = p_state->get_angular_velocity(); @@ -373,7 +368,7 @@ void AnimatableBody3D::_bind_methods() { AnimatableBody3D::AnimatableBody3D() : StaticBody3D(PhysicsServer3D::BODY_MODE_KINEMATIC) { - PhysicsServer3D::get_singleton()->body_set_state_sync_callback(get_rid(), this, _body_state_changed_callback); + PhysicsServer3D::get_singleton()->body_set_state_sync_callback(get_rid(), callable_mp(this, &AnimatableBody3D::_body_state_changed)); } void RigidBody3D::_body_enter_tree(ObjectID p_id) { @@ -488,11 +483,6 @@ struct _RigidBodyInOut { int local_shape = 0; }; -void RigidBody3D::_body_state_changed_callback(void *p_instance, PhysicsDirectBodyState3D *p_state) { - RigidBody3D *body = (RigidBody3D *)p_instance; - body->_body_state_changed(p_state); -} - void RigidBody3D::_body_state_changed(PhysicsDirectBodyState3D *p_state) { set_ignore_transform_notification(true); set_global_transform(p_state->get_transform()); @@ -982,10 +972,10 @@ TypedArray<Node3D> RigidBody3D::get_colliding_bodies() const { return ret; } -TypedArray<String> RigidBody3D::get_configuration_warnings() const { +PackedStringArray RigidBody3D::get_configuration_warnings() const { Transform3D t = get_transform(); - TypedArray<String> warnings = Node::get_configuration_warnings(); + PackedStringArray warnings = Node::get_configuration_warnings(); if (ABS(t.basis.get_column(0).length() - 1.0) > 0.05 || ABS(t.basis.get_column(1).length() - 1.0) > 0.05 || ABS(t.basis.get_column(2).length() - 1.0) > 0.05) { warnings.push_back(RTR("Size changes to RigidBody will be overridden by the physics engine when running.\nChange the size in children collision shapes instead.")); @@ -1139,7 +1129,7 @@ void RigidBody3D::_validate_property(PropertyInfo &p_property) const { RigidBody3D::RigidBody3D() : PhysicsBody3D(PhysicsServer3D::BODY_MODE_RIGID) { - PhysicsServer3D::get_singleton()->body_set_state_sync_callback(get_rid(), this, _body_state_changed_callback); + PhysicsServer3D::get_singleton()->body_set_state_sync_callback(get_rid(), callable_mp(this, &RigidBody3D::_body_state_changed)); } RigidBody3D::~RigidBody3D() { @@ -1210,7 +1200,6 @@ bool CharacterBody3D::move_and_slide() { if (!current_platform_velocity.is_zero_approx()) { PhysicsServer3D::MotionParameters parameters(get_global_transform(), current_platform_velocity * delta, margin); - parameters.recovery_as_collision = true; // Also report collisions generated only from recovery. parameters.exclude_bodies.insert(platform_rid); if (platform_object_id.is_valid()) { @@ -1274,8 +1263,7 @@ void CharacterBody3D::_move_and_slide_grounded(double p_delta, bool p_was_on_flo for (int iteration = 0; iteration < max_slides; ++iteration) { PhysicsServer3D::MotionParameters parameters(get_global_transform(), motion, margin); - parameters.max_collisions = 4; - parameters.recovery_as_collision = true; // Also report collisions generated only from recovery. + parameters.max_collisions = 6; // There can be 4 collisions between 2 walls + 2 more for the floor. PhysicsServer3D::MotionResult result; bool collided = move_and_collide(parameters, result, false, !sliding_enabled); @@ -1520,7 +1508,6 @@ void CharacterBody3D::_move_and_slide_floating(double p_delta) { bool first_slide = true; for (int iteration = 0; iteration < max_slides; ++iteration) { PhysicsServer3D::MotionParameters parameters(get_global_transform(), motion, margin); - parameters.recovery_as_collision = true; // Also report collisions generated only from recovery. PhysicsServer3D::MotionResult result; bool collided = move_and_collide(parameters, result, false, false); @@ -1575,7 +1562,7 @@ void CharacterBody3D::_snap_on_floor(bool p_was_on_floor, bool p_vel_dir_facing_ PhysicsServer3D::MotionParameters parameters(get_global_transform(), -up_direction * length, margin); parameters.max_collisions = 4; - parameters.recovery_as_collision = true; // Also report collisions generated only from recovery. + parameters.recovery_as_collision = true; // Report margin recovery as collision to improve floor detection. parameters.collide_separation_ray = true; PhysicsServer3D::MotionResult result; @@ -1611,7 +1598,7 @@ bool CharacterBody3D::_on_floor_if_snapped(bool p_was_on_floor, bool p_vel_dir_f PhysicsServer3D::MotionParameters parameters(get_global_transform(), -up_direction * length, margin); parameters.max_collisions = 4; - parameters.recovery_as_collision = true; // Also report collisions generated only from recovery. + parameters.recovery_as_collision = true; // Report margin recovery as collision to improve floor detection. parameters.collide_separation_ray = true; PhysicsServer3D::MotionResult result; @@ -1810,7 +1797,7 @@ Ref<KinematicCollision3D> CharacterBody3D::_get_slide_collision(int p_bounce) { } // Create a new instance when the cached reference is invalid or still in use in script. - if (slide_colliders[p_bounce].is_null() || slide_colliders[p_bounce]->reference_get_count() > 1) { + if (slide_colliders[p_bounce].is_null() || slide_colliders[p_bounce]->get_reference_count() > 1) { slide_colliders.write[p_bounce].instantiate(); slide_colliders.write[p_bounce]->owner = this; } @@ -2903,11 +2890,6 @@ void PhysicalBone3D::_notification(int p_what) { } } -void PhysicalBone3D::_body_state_changed_callback(void *p_instance, PhysicsDirectBodyState3D *p_state) { - PhysicalBone3D *bone = (PhysicalBone3D *)p_instance; - bone->_body_state_changed(p_state); -} - void PhysicalBone3D::_body_state_changed(PhysicsDirectBodyState3D *p_state) { if (!simulate_physics || !_internal_simulate_physics) { return; @@ -3425,7 +3407,7 @@ void PhysicalBone3D::_start_physics_simulation() { PhysicsServer3D::get_singleton()->body_set_collision_layer(get_rid(), get_collision_layer()); PhysicsServer3D::get_singleton()->body_set_collision_mask(get_rid(), get_collision_mask()); PhysicsServer3D::get_singleton()->body_set_collision_priority(get_rid(), get_collision_priority()); - PhysicsServer3D::get_singleton()->body_set_state_sync_callback(get_rid(), this, _body_state_changed_callback); + PhysicsServer3D::get_singleton()->body_set_state_sync_callback(get_rid(), callable_mp(this, &PhysicalBone3D::_body_state_changed)); set_as_top_level(true); _internal_simulate_physics = true; } @@ -3446,7 +3428,7 @@ void PhysicalBone3D::_stop_physics_simulation() { PhysicsServer3D::get_singleton()->body_set_collision_priority(get_rid(), 1.0); } if (_internal_simulate_physics) { - PhysicsServer3D::get_singleton()->body_set_state_sync_callback(get_rid(), nullptr, nullptr); + PhysicsServer3D::get_singleton()->body_set_state_sync_callback(get_rid(), Callable()); parent_skeleton->set_bone_global_pose_override(bone_id, Transform3D(), 0.0, false); set_as_top_level(false); _internal_simulate_physics = false; diff --git a/scene/3d/physics_body_3d.h b/scene/3d/physics_body_3d.h index 184d8b00d0..4b874b91d9 100644 --- a/scene/3d/physics_body_3d.h +++ b/scene/3d/physics_body_3d.h @@ -50,11 +50,11 @@ protected: uint16_t locked_axis = 0; - Ref<KinematicCollision3D> _move(const Vector3 &p_distance, bool p_test_only = false, real_t p_margin = 0.001, int p_max_collisions = 1); + Ref<KinematicCollision3D> _move(const Vector3 &p_distance, bool p_test_only = false, real_t p_margin = 0.001, bool p_recovery_as_collision = false, int p_max_collisions = 1); public: bool move_and_collide(const PhysicsServer3D::MotionParameters &p_parameters, PhysicsServer3D::MotionResult &r_result, bool p_test_only = false, bool p_cancel_sliding = true); - bool test_move(const Transform3D &p_from, const Vector3 &p_distance, const Ref<KinematicCollision3D> &r_collision = Ref<KinematicCollision3D>(), real_t p_margin = 0.001, int p_max_collisions = 1); + bool test_move(const Transform3D &p_from, const Vector3 &p_distance, const Ref<KinematicCollision3D> &r_collision = Ref<KinematicCollision3D>(), real_t p_margin = 0.001, bool p_recovery_as_collision = false, int p_max_collisions = 1); void set_axis_lock(PhysicsServer3D::BodyAxis p_axis, bool p_lock); bool get_axis_lock(PhysicsServer3D::BodyAxis p_axis) const; @@ -325,7 +325,7 @@ public: void set_constant_torque(const Vector3 &p_torque); Vector3 get_constant_torque() const; - virtual TypedArray<String> get_configuration_warnings() const override; + virtual PackedStringArray get_configuration_warnings() const override; RigidBody3D(); ~RigidBody3D(); diff --git a/scene/3d/remote_transform_3d.cpp b/scene/3d/remote_transform_3d.cpp index 9979052385..ff05e88241 100644 --- a/scene/3d/remote_transform_3d.cpp +++ b/scene/3d/remote_transform_3d.cpp @@ -178,8 +178,8 @@ void RemoteTransform3D::force_update_cache() { _update_cache(); } -TypedArray<String> RemoteTransform3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray RemoteTransform3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!has_node(remote_node) || !Object::cast_to<Node3D>(get_node(remote_node))) { warnings.push_back(RTR("The \"Remote Path\" property must point to a valid Node3D or Node3D-derived node to work.")); diff --git a/scene/3d/remote_transform_3d.h b/scene/3d/remote_transform_3d.h index ab134c1261..cc83661f26 100644 --- a/scene/3d/remote_transform_3d.h +++ b/scene/3d/remote_transform_3d.h @@ -70,7 +70,7 @@ public: void force_update_cache(); - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; RemoteTransform3D(); }; diff --git a/scene/3d/shape_cast_3d.cpp b/scene/3d/shape_cast_3d.cpp index a2fecf9c31..e7d1a8ec7d 100644 --- a/scene/3d/shape_cast_3d.cpp +++ b/scene/3d/shape_cast_3d.cpp @@ -167,8 +167,8 @@ void ShapeCast3D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::COLOR, "debug_shape_custom_color"), "set_debug_shape_custom_color", "get_debug_shape_custom_color"); } -TypedArray<String> ShapeCast3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node3D::get_configuration_warnings(); +PackedStringArray ShapeCast3D::get_configuration_warnings() const { + PackedStringArray warnings = Node3D::get_configuration_warnings(); if (shape.is_null()) { warnings.push_back(RTR("This node cannot interact with other objects unless a Shape3D is assigned.")); diff --git a/scene/3d/shape_cast_3d.h b/scene/3d/shape_cast_3d.h index 5bda15e4b0..2526d8d32c 100644 --- a/scene/3d/shape_cast_3d.h +++ b/scene/3d/shape_cast_3d.h @@ -136,7 +136,7 @@ public: void remove_exception(const Object *p_object); void clear_exceptions(); - virtual TypedArray<String> get_configuration_warnings() const override; + virtual PackedStringArray get_configuration_warnings() const override; }; #endif // SHAPE_CAST_3D_H diff --git a/scene/3d/skeleton_3d.cpp b/scene/3d/skeleton_3d.cpp index e04e1866db..85b2c5154b 100644 --- a/scene/3d/skeleton_3d.cpp +++ b/scene/3d/skeleton_3d.cpp @@ -45,7 +45,6 @@ void SkinReference::_skin_changed() { } void SkinReference::_bind_methods() { - ClassDB::bind_method(D_METHOD("_skin_changed"), &SkinReference::_skin_changed); ClassDB::bind_method(D_METHOD("get_skeleton"), &SkinReference::get_skeleton); ClassDB::bind_method(D_METHOD("get_skin"), &SkinReference::get_skin); } @@ -1007,7 +1006,7 @@ Ref<SkinReference> Skeleton3D::register_skin(const Ref<Skin> &p_skin) { skin_bindings.insert(skin_ref.operator->()); - skin_ref->skin->connect("changed", Callable(skin_ref.operator->(), "_skin_changed")); + skin_ref->skin->connect("changed", callable_mp(skin_ref.operator->(), &SkinReference::_skin_changed)); _make_dirty(); // Skin needs to be updated, so update skeleton. diff --git a/scene/3d/skeleton_3d.h b/scene/3d/skeleton_3d.h index 5e49dfa1f4..c2e9cfcced 100644 --- a/scene/3d/skeleton_3d.h +++ b/scene/3d/skeleton_3d.h @@ -51,12 +51,14 @@ class SkinReference : public RefCounted { uint64_t skeleton_version = 0; Vector<uint32_t> skin_bone_indices; uint32_t *skin_bone_indices_ptrs = nullptr; - void _skin_changed(); protected: static void _bind_methods(); public: + // Public for use with callable_mp. + void _skin_changed(); + RID get_skeleton() const; Ref<Skin> get_skin() const; ~SkinReference(); diff --git a/scene/3d/soft_body_3d.cpp b/scene/3d/soft_body_3d.cpp index 47858b372c..2466b71aea 100644 --- a/scene/3d/soft_body_3d.cpp +++ b/scene/3d/soft_body_3d.cpp @@ -384,8 +384,8 @@ void SoftBody3D::_bind_methods() { BIND_ENUM_CONSTANT(DISABLE_MODE_KEEP_ACTIVE); } -TypedArray<String> SoftBody3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray SoftBody3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (mesh.is_null()) { warnings.push_back(RTR("This body will be ignored until you set a mesh.")); diff --git a/scene/3d/soft_body_3d.h b/scene/3d/soft_body_3d.h index 40f3d6f1f4..9ec1f18396 100644 --- a/scene/3d/soft_body_3d.h +++ b/scene/3d/soft_body_3d.h @@ -125,7 +125,7 @@ protected: void _notification(int p_what); static void _bind_methods(); - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; public: RID get_physics_rid() const { return physics_rid; } diff --git a/scene/3d/sprite_3d.cpp b/scene/3d/sprite_3d.cpp index 4515277dc3..4b83bcdfc4 100644 --- a/scene/3d/sprite_3d.cpp +++ b/scene/3d/sprite_3d.cpp @@ -30,7 +30,6 @@ #include "sprite_3d.h" -#include "core/core_string_names.h" #include "scene/scene_string_names.h" Color SpriteBase3D::_get_color_accum() { @@ -58,7 +57,7 @@ void SpriteBase3D::_propagate_color_changed() { } color_dirty = true; - _queue_update(); + _queue_redraw(); for (SpriteBase3D *&E : children) { E->_propagate_color_changed(); @@ -88,9 +87,185 @@ void SpriteBase3D::_notification(int p_what) { } } +void SpriteBase3D::draw_texture_rect(Ref<Texture2D> p_texture, Rect2 p_dst_rect, Rect2 p_src_rect) { + ERR_FAIL_COND(p_texture.is_null()); + + Rect2 final_rect; + Rect2 final_src_rect; + if (!p_texture->get_rect_region(p_dst_rect, p_src_rect, final_rect, final_src_rect)) { + return; + } + + if (final_rect.size.x == 0 || final_rect.size.y == 0) { + return; + } + + // 2D: 3D plane (axes match exactly when `axis == Vector3::AXIS_Z`): + // -X+ -X+ + // - + + // Y +--------+ +--------+ +--------+ Y +--------+ + // + | +--+ | | | (2) | | - | 0--1 | + // | |ab| | (1) | +--+ | (3) | 3--2 | | |ab| | + // | |cd| | --> | |ab| | --> | |cd| | <==> | |cd| | + // | +--+ | | |cd| | | |ab| | | 3--2 | + // | | | +--+ | | 0--1 | | | + // +--------+ +--------+ +--------+ +--------+ + + // (1) Y-wise shift `final_rect` within `p_dst_rect` so after inverting Y + // axis distances between top/bottom borders will be preserved (so for + // example AtlasTextures with vertical margins will look the same in 2D/3D). + final_rect.position.y = (p_dst_rect.position.y + p_dst_rect.size.y) - ((final_rect.position.y + final_rect.size.y) - p_dst_rect.position.y); + + Color color = _get_color_accum(); + + real_t pixel_size = get_pixel_size(); + + // (2) Order vertices (0123) bottom-top in 2D / top-bottom in 3D. + Vector2 vertices[4] = { + (final_rect.position + Vector2(0, final_rect.size.y)) * pixel_size, + (final_rect.position + final_rect.size) * pixel_size, + (final_rect.position + Vector2(final_rect.size.x, 0)) * pixel_size, + final_rect.position * pixel_size, + }; + + Vector2 src_tsize = p_texture->get_size(); + + // Properly setup UVs for impostor textures (AtlasTexture). + Ref<AtlasTexture> atlas_tex = p_texture; + if (atlas_tex != nullptr) { + src_tsize[0] = atlas_tex->get_atlas()->get_width(); + src_tsize[1] = atlas_tex->get_atlas()->get_height(); + } + + // (3) Assign UVs (abcd) according to the vertices order (bottom-top in 2D / top-bottom in 3D). + Vector2 uvs[4] = { + final_src_rect.position / src_tsize, + (final_src_rect.position + Vector2(final_src_rect.size.x, 0)) / src_tsize, + (final_src_rect.position + final_src_rect.size) / src_tsize, + (final_src_rect.position + Vector2(0, final_src_rect.size.y)) / src_tsize, + }; + + if (is_flipped_h()) { + SWAP(uvs[0], uvs[1]); + SWAP(uvs[2], uvs[3]); + } + + if (is_flipped_v()) { + SWAP(uvs[0], uvs[3]); + SWAP(uvs[1], uvs[2]); + } + + Vector3 normal; + int axis = get_axis(); + normal[axis] = 1.0; + + Plane tangent; + if (axis == Vector3::AXIS_X) { + tangent = Plane(0, 0, -1, 1); + } else { + tangent = Plane(1, 0, 0, 1); + } + + int x_axis = ((axis + 1) % 3); + int y_axis = ((axis + 2) % 3); + + if (axis != Vector3::AXIS_Z) { + SWAP(x_axis, y_axis); + + for (int i = 0; i < 4; i++) { + //uvs[i] = Vector2(1.0,1.0)-uvs[i]; + //SWAP(vertices[i].x,vertices[i].y); + if (axis == Vector3::AXIS_Y) { + vertices[i].y = -vertices[i].y; + } else if (axis == Vector3::AXIS_X) { + vertices[i].x = -vertices[i].x; + } + } + } + + AABB aabb; + + // Everything except position and UV is compressed. + uint8_t *vertex_write_buffer = vertex_buffer.ptrw(); + uint8_t *attribute_write_buffer = attribute_buffer.ptrw(); + + uint32_t v_normal; + { + Vector3 n = normal * Vector3(0.5, 0.5, 0.5) + Vector3(0.5, 0.5, 0.5); + + Vector2 res = n.octahedron_encode(); + uint32_t value = 0; + value |= (uint16_t)CLAMP(res.x * 65535, 0, 65535); + value |= (uint16_t)CLAMP(res.y * 65535, 0, 65535) << 16; + + v_normal = value; + } + uint32_t v_tangent; + { + Plane t = tangent; + Vector2 res = t.normal.octahedron_tangent_encode(t.d); + uint32_t value = 0; + value |= (uint16_t)CLAMP(res.x * 65535, 0, 65535); + value |= (uint16_t)CLAMP(res.y * 65535, 0, 65535) << 16; + + v_tangent = value; + } + + uint8_t v_color[4] = { + uint8_t(CLAMP(color.r * 255.0, 0.0, 255.0)), + uint8_t(CLAMP(color.g * 255.0, 0.0, 255.0)), + uint8_t(CLAMP(color.b * 255.0, 0.0, 255.0)), + uint8_t(CLAMP(color.a * 255.0, 0.0, 255.0)) + }; + + for (int i = 0; i < 4; i++) { + Vector3 vtx; + vtx[x_axis] = vertices[i][0]; + vtx[y_axis] = vertices[i][1]; + if (i == 0) { + aabb.position = vtx; + aabb.size = Vector3(); + } else { + aabb.expand_to(vtx); + } + + float v_uv[2] = { (float)uvs[i].x, (float)uvs[i].y }; + memcpy(&attribute_write_buffer[i * attrib_stride + mesh_surface_offsets[RS::ARRAY_TEX_UV]], v_uv, 8); + + float v_vertex[3] = { (float)vtx.x, (float)vtx.y, (float)vtx.z }; + + memcpy(&vertex_write_buffer[i * vertex_stride + mesh_surface_offsets[RS::ARRAY_VERTEX]], &v_vertex, sizeof(float) * 3); + memcpy(&vertex_write_buffer[i * vertex_stride + mesh_surface_offsets[RS::ARRAY_NORMAL]], &v_normal, 4); + memcpy(&vertex_write_buffer[i * vertex_stride + mesh_surface_offsets[RS::ARRAY_TANGENT]], &v_tangent, 4); + memcpy(&attribute_write_buffer[i * attrib_stride + mesh_surface_offsets[RS::ARRAY_COLOR]], v_color, 4); + } + + RID mesh = get_mesh(); + RS::get_singleton()->mesh_surface_update_vertex_region(mesh, 0, 0, vertex_buffer); + RS::get_singleton()->mesh_surface_update_attribute_region(mesh, 0, 0, attribute_buffer); + + RS::get_singleton()->mesh_set_custom_aabb(mesh, aabb); + set_aabb(aabb); + + RID shader_rid; + StandardMaterial3D::get_material_for_2d(get_draw_flag(FLAG_SHADED), get_draw_flag(FLAG_TRANSPARENT), get_draw_flag(FLAG_DOUBLE_SIDED), get_alpha_cut_mode() == ALPHA_CUT_DISCARD, get_alpha_cut_mode() == ALPHA_CUT_OPAQUE_PREPASS, get_billboard_mode() == StandardMaterial3D::BILLBOARD_ENABLED, get_billboard_mode() == StandardMaterial3D::BILLBOARD_FIXED_Y, false, get_draw_flag(FLAG_DISABLE_DEPTH_TEST), get_draw_flag(FLAG_FIXED_SIZE), get_texture_filter(), &shader_rid); + if (last_shader != shader_rid) { + RS::get_singleton()->material_set_shader(get_material(), shader_rid); + last_shader = shader_rid; + } + if (last_texture != p_texture->get_rid()) { + RS::get_singleton()->material_set_param(get_material(), "texture_albedo", p_texture->get_rid()); + last_texture = p_texture->get_rid(); + } + if (get_alpha_cut_mode() == ALPHA_CUT_DISABLED) { + RS::get_singleton()->material_set_render_priority(get_material(), get_render_priority()); + RS::get_singleton()->mesh_surface_set_material(mesh, 0, get_material()); + } +} + void SpriteBase3D::set_centered(bool p_center) { centered = p_center; - _queue_update(); + _queue_redraw(); } bool SpriteBase3D::is_centered() const { @@ -99,7 +274,7 @@ bool SpriteBase3D::is_centered() const { void SpriteBase3D::set_offset(const Point2 &p_offset) { offset = p_offset; - _queue_update(); + _queue_redraw(); } Point2 SpriteBase3D::get_offset() const { @@ -108,7 +283,7 @@ Point2 SpriteBase3D::get_offset() const { void SpriteBase3D::set_flip_h(bool p_flip) { hflip = p_flip; - _queue_update(); + _queue_redraw(); } bool SpriteBase3D::is_flipped_h() const { @@ -117,7 +292,7 @@ bool SpriteBase3D::is_flipped_h() const { void SpriteBase3D::set_flip_v(bool p_flip) { vflip = p_flip; - _queue_update(); + _queue_redraw(); } bool SpriteBase3D::is_flipped_v() const { @@ -127,7 +302,7 @@ bool SpriteBase3D::is_flipped_v() const { void SpriteBase3D::set_modulate(const Color &p_color) { modulate = p_color; _propagate_color_changed(); - _queue_update(); + _queue_redraw(); } Color SpriteBase3D::get_modulate() const { @@ -137,7 +312,7 @@ Color SpriteBase3D::get_modulate() const { void SpriteBase3D::set_render_priority(int p_priority) { ERR_FAIL_COND(p_priority < RS::MATERIAL_RENDER_PRIORITY_MIN || p_priority > RS::MATERIAL_RENDER_PRIORITY_MAX); render_priority = p_priority; - _queue_update(); + _queue_redraw(); } int SpriteBase3D::get_render_priority() const { @@ -146,7 +321,7 @@ int SpriteBase3D::get_render_priority() const { void SpriteBase3D::set_pixel_size(real_t p_amount) { pixel_size = p_amount; - _queue_update(); + _queue_redraw(); } real_t SpriteBase3D::get_pixel_size() const { @@ -156,7 +331,7 @@ real_t SpriteBase3D::get_pixel_size() const { void SpriteBase3D::set_axis(Vector3::Axis p_axis) { ERR_FAIL_INDEX(p_axis, 3); axis = p_axis; - _queue_update(); + _queue_redraw(); } Vector3::Axis SpriteBase3D::get_axis() const { @@ -171,7 +346,8 @@ void SpriteBase3D::_im_update() { //texture->draw_rect_region(ci,dst_rect,src_rect,modulate); } -void SpriteBase3D::_queue_update() { +void SpriteBase3D::_queue_redraw() { + // The 3D equivalent of CanvasItem.queue_redraw(). if (pending_update) { return; } @@ -250,7 +426,7 @@ Ref<TriangleMesh> SpriteBase3D::generate_triangle_mesh() const { void SpriteBase3D::set_draw_flag(DrawFlags p_flag, bool p_enable) { ERR_FAIL_INDEX(p_flag, FLAG_MAX); flags[p_flag] = p_enable; - _queue_update(); + _queue_redraw(); } bool SpriteBase3D::get_draw_flag(DrawFlags p_flag) const { @@ -261,7 +437,7 @@ bool SpriteBase3D::get_draw_flag(DrawFlags p_flag) const { void SpriteBase3D::set_alpha_cut_mode(AlphaCutMode p_mode) { ERR_FAIL_INDEX(p_mode, 3); alpha_cut = p_mode; - _queue_update(); + _queue_redraw(); } SpriteBase3D::AlphaCutMode SpriteBase3D::get_alpha_cut_mode() const { @@ -269,9 +445,9 @@ SpriteBase3D::AlphaCutMode SpriteBase3D::get_alpha_cut_mode() const { } void SpriteBase3D::set_billboard_mode(StandardMaterial3D::BillboardMode p_mode) { - ERR_FAIL_INDEX(p_mode, 3); + ERR_FAIL_INDEX(p_mode, 3); // Cannot use BILLBOARD_PARTICLES. billboard_mode = p_mode; - _queue_update(); + _queue_redraw(); } StandardMaterial3D::BillboardMode SpriteBase3D::get_billboard_mode() const { @@ -281,7 +457,7 @@ StandardMaterial3D::BillboardMode SpriteBase3D::get_billboard_mode() const { void SpriteBase3D::set_texture_filter(StandardMaterial3D::TextureFilter p_filter) { if (texture_filter != p_filter) { texture_filter = p_filter; - _queue_update(); + _queue_redraw(); } } @@ -329,7 +505,6 @@ void SpriteBase3D::_bind_methods() { ClassDB::bind_method(D_METHOD("get_item_rect"), &SpriteBase3D::get_item_rect); ClassDB::bind_method(D_METHOD("generate_triangle_mesh"), &SpriteBase3D::generate_triangle_mesh); - ClassDB::bind_method(D_METHOD("_queue_update"), &SpriteBase3D::_queue_update); ClassDB::bind_method(D_METHOD("_im_update"), &SpriteBase3D::_im_update); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "centered"), "set_centered", "is_centered"); @@ -368,7 +543,7 @@ SpriteBase3D::SpriteBase3D() { } material = RenderingServer::get_singleton()->material_create(); - // Set defaults for material, names need to match up those in StandardMaterial3D + // Set defaults for material, names need to match up those in StandardMaterial3D. RS::get_singleton()->material_set_param(material, "albedo", Color(1, 1, 1, 1)); RS::get_singleton()->material_set_param(material, "specular", 0.5); RS::get_singleton()->material_set_param(material, "metallic", 0.0); @@ -394,7 +569,7 @@ SpriteBase3D::SpriteBase3D() { mesh_colors.resize(4); mesh_uvs.resize(4); - // create basic mesh and store format information + // Create basic mesh and store format information. for (int i = 0; i < 4; i++) { mesh_normals.write[i] = Vector3(0.0, 0.0, 0.0); mesh_tangents.write[i * 4 + 0] = 0.0; @@ -448,7 +623,7 @@ void Sprite3D::_draw() { if (get_base() != get_mesh()) { set_base(get_mesh()); } - if (!texture.is_valid()) { + if (texture.is_null()) { set_base(RID()); return; } @@ -465,171 +640,17 @@ void Sprite3D::_draw() { } Size2 frame_size = base_rect.size / Size2(hframes, vframes); - Point2 frame_offset = Point2(frame % hframes, frame / hframes); - frame_offset *= frame_size; + Point2 frame_offset = Point2(frame % hframes, frame / hframes) * frame_size; - Point2 dest_offset = get_offset(); + Point2 dst_offset = get_offset(); if (is_centered()) { - dest_offset -= frame_size / 2; + dst_offset -= frame_size / 2.0f; } Rect2 src_rect(base_rect.position + frame_offset, frame_size); - Rect2 final_dst_rect(dest_offset, frame_size); - Rect2 final_rect; - Rect2 final_src_rect; - if (!texture->get_rect_region(final_dst_rect, src_rect, final_rect, final_src_rect)) { - return; - } - - if (final_rect.size.x == 0 || final_rect.size.y == 0) { - return; - } - - Color color = _get_color_accum(); - - real_t pixel_size = get_pixel_size(); - - Vector2 vertices[4] = { - - (final_rect.position + Vector2(0, final_rect.size.y)) * pixel_size, - (final_rect.position + final_rect.size) * pixel_size, - (final_rect.position + Vector2(final_rect.size.x, 0)) * pixel_size, - final_rect.position * pixel_size, - - }; - - Vector2 src_tsize = tsize; - - // Properly setup UVs for impostor textures (AtlasTexture). - Ref<AtlasTexture> atlas_tex = texture; - if (atlas_tex != nullptr) { - src_tsize[0] = atlas_tex->get_atlas()->get_width(); - src_tsize[1] = atlas_tex->get_atlas()->get_height(); - } - - Vector2 uvs[4] = { - final_src_rect.position / src_tsize, - (final_src_rect.position + Vector2(final_src_rect.size.x, 0)) / src_tsize, - (final_src_rect.position + final_src_rect.size) / src_tsize, - (final_src_rect.position + Vector2(0, final_src_rect.size.y)) / src_tsize, - }; - - if (is_flipped_h()) { - SWAP(uvs[0], uvs[1]); - SWAP(uvs[2], uvs[3]); - } - - if (is_flipped_v()) { - SWAP(uvs[0], uvs[3]); - SWAP(uvs[1], uvs[2]); - } - - Vector3 normal; - int axis = get_axis(); - normal[axis] = 1.0; - - Plane tangent; - if (axis == Vector3::AXIS_X) { - tangent = Plane(0, 0, -1, 1); - } else { - tangent = Plane(1, 0, 0, 1); - } - - int x_axis = ((axis + 1) % 3); - int y_axis = ((axis + 2) % 3); - - if (axis != Vector3::AXIS_Z) { - SWAP(x_axis, y_axis); - - for (int i = 0; i < 4; i++) { - //uvs[i] = Vector2(1.0,1.0)-uvs[i]; - //SWAP(vertices[i].x,vertices[i].y); - if (axis == Vector3::AXIS_Y) { - vertices[i].y = -vertices[i].y; - } else if (axis == Vector3::AXIS_X) { - vertices[i].x = -vertices[i].x; - } - } - } - - AABB aabb; - - // Everything except position and UV is compressed - uint8_t *vertex_write_buffer = vertex_buffer.ptrw(); - uint8_t *attribute_write_buffer = attribute_buffer.ptrw(); - - uint32_t v_normal; - { - Vector3 n = normal * Vector3(0.5, 0.5, 0.5) + Vector3(0.5, 0.5, 0.5); - - Vector2 res = n.octahedron_encode(); - uint32_t value = 0; - value |= (uint16_t)CLAMP(res.x * 65535, 0, 65535); - value |= (uint16_t)CLAMP(res.y * 65535, 0, 65535) << 16; - - v_normal = value; - } - uint32_t v_tangent; - { - Plane t = tangent; - Vector2 res = t.normal.octahedron_tangent_encode(t.d); - uint32_t value = 0; - value |= (uint16_t)CLAMP(res.x * 65535, 0, 65535); - value |= (uint16_t)CLAMP(res.y * 65535, 0, 65535) << 16; - - v_tangent = value; - } - - uint8_t v_color[4] = { - uint8_t(CLAMP(color.r * 255.0, 0.0, 255.0)), - uint8_t(CLAMP(color.g * 255.0, 0.0, 255.0)), - uint8_t(CLAMP(color.b * 255.0, 0.0, 255.0)), - uint8_t(CLAMP(color.a * 255.0, 0.0, 255.0)) - }; - - for (int i = 0; i < 4; i++) { - Vector3 vtx; - vtx[x_axis] = vertices[i][0]; - vtx[y_axis] = vertices[i][1]; - if (i == 0) { - aabb.position = vtx; - aabb.size = Vector3(); - } else { - aabb.expand_to(vtx); - } - - float v_uv[2] = { (float)uvs[i].x, (float)uvs[i].y }; - memcpy(&attribute_write_buffer[i * attrib_stride + mesh_surface_offsets[RS::ARRAY_TEX_UV]], v_uv, 8); - - float v_vertex[3] = { (float)vtx.x, (float)vtx.y, (float)vtx.z }; + Rect2 dst_rect(dst_offset, frame_size); - memcpy(&vertex_write_buffer[i * vertex_stride + mesh_surface_offsets[RS::ARRAY_VERTEX]], &v_vertex, sizeof(float) * 3); - memcpy(&vertex_write_buffer[i * vertex_stride + mesh_surface_offsets[RS::ARRAY_NORMAL]], &v_normal, 4); - memcpy(&vertex_write_buffer[i * vertex_stride + mesh_surface_offsets[RS::ARRAY_TANGENT]], &v_tangent, 4); - memcpy(&attribute_write_buffer[i * attrib_stride + mesh_surface_offsets[RS::ARRAY_COLOR]], v_color, 4); - } - - RID mesh = get_mesh(); - RS::get_singleton()->mesh_surface_update_vertex_region(mesh, 0, 0, vertex_buffer); - RS::get_singleton()->mesh_surface_update_attribute_region(mesh, 0, 0, attribute_buffer); - - RS::get_singleton()->mesh_set_custom_aabb(mesh, aabb); - set_aabb(aabb); - - RID shader_rid; - StandardMaterial3D::get_material_for_2d(get_draw_flag(FLAG_SHADED), get_draw_flag(FLAG_TRANSPARENT), get_draw_flag(FLAG_DOUBLE_SIDED), get_alpha_cut_mode() == ALPHA_CUT_DISCARD, get_alpha_cut_mode() == ALPHA_CUT_OPAQUE_PREPASS, get_billboard_mode() == StandardMaterial3D::BILLBOARD_ENABLED, get_billboard_mode() == StandardMaterial3D::BILLBOARD_FIXED_Y, false, get_draw_flag(FLAG_DISABLE_DEPTH_TEST), get_draw_flag(FLAG_FIXED_SIZE), get_texture_filter(), &shader_rid); - if (last_shader != shader_rid) { - RS::get_singleton()->material_set_shader(get_material(), shader_rid); - last_shader = shader_rid; - } - if (last_texture != texture->get_rid()) { - RS::get_singleton()->material_set_param(get_material(), "texture_albedo", texture->get_rid()); - last_texture = texture->get_rid(); - } - if (get_alpha_cut_mode() == ALPHA_CUT_DISABLED) { - RS::get_singleton()->material_set_render_priority(get_material(), get_render_priority()); - RS::get_singleton()->mesh_surface_set_material(mesh, 0, get_material()); - } + draw_texture_rect(texture, dst_rect, src_rect); } void Sprite3D::set_texture(const Ref<Texture2D> &p_texture) { @@ -637,13 +658,14 @@ void Sprite3D::set_texture(const Ref<Texture2D> &p_texture) { return; } if (texture.is_valid()) { - texture->disconnect(CoreStringNames::get_singleton()->changed, Callable(this, "_queue_update")); + texture->disconnect(SceneStringNames::get_singleton()->changed, callable_mp((SpriteBase3D *)this, &Sprite3D::_queue_redraw)); } texture = p_texture; if (texture.is_valid()) { - texture->connect(CoreStringNames::get_singleton()->changed, Callable(this, "_queue_update")); + texture->connect(SceneStringNames::get_singleton()->changed, callable_mp((SpriteBase3D *)this, &Sprite3D::_queue_redraw)); } - _queue_update(); + + _queue_redraw(); emit_signal(SceneStringNames::get_singleton()->texture_changed); } @@ -657,7 +679,7 @@ void Sprite3D::set_region_enabled(bool p_region) { } region = p_region; - _queue_update(); + _queue_redraw(); } bool Sprite3D::is_region_enabled() const { @@ -668,7 +690,7 @@ void Sprite3D::set_region_rect(const Rect2 &p_region_rect) { bool changed = region_rect != p_region_rect; region_rect = p_region_rect; if (region && changed) { - _queue_update(); + _queue_redraw(); } } @@ -681,7 +703,7 @@ void Sprite3D::set_frame(int p_frame) { frame = p_frame; - _queue_update(); + _queue_redraw(); emit_signal(SceneStringNames::get_singleton()->frame_changed); } @@ -704,7 +726,7 @@ Vector2i Sprite3D::get_frame_coords() const { void Sprite3D::set_vframes(int p_amount) { ERR_FAIL_COND(p_amount < 1); vframes = p_amount; - _queue_update(); + _queue_redraw(); notify_property_list_changed(); } @@ -715,7 +737,7 @@ int Sprite3D::get_vframes() const { void Sprite3D::set_hframes(int p_amount) { ERR_FAIL_COND(p_amount < 1); hframes = p_amount; - _queue_update(); + _queue_redraw(); notify_property_list_changed(); } @@ -807,22 +829,14 @@ void AnimatedSprite3D::_draw() { set_base(get_mesh()); } - if (frames.is_null()) { - return; - } - - if (frame < 0) { - return; - } - - if (!frames->has_animation(animation)) { + if (frames.is_null() || !frames->has_animation(animation)) { return; } Ref<Texture2D> texture = frames->get_frame(animation, frame); - if (!texture.is_valid()) { + if (texture.is_null()) { set_base(RID()); - return; //no texuture no life + return; } Size2 tsize = texture->get_size(); if (tsize.x == 0 || tsize.y == 0) { @@ -839,164 +853,14 @@ void AnimatedSprite3D::_draw() { Rect2 dst_rect(ofs, tsize); - Rect2 final_rect; - Rect2 final_src_rect; - if (!texture->get_rect_region(dst_rect, src_rect, final_rect, final_src_rect)) { - return; - } - - if (final_rect.size.x == 0 || final_rect.size.y == 0) { - return; - } - - Color color = _get_color_accum(); - - real_t pixel_size = get_pixel_size(); - - Vector2 vertices[4] = { - - (final_rect.position + Vector2(0, final_rect.size.y)) * pixel_size, - (final_rect.position + final_rect.size) * pixel_size, - (final_rect.position + Vector2(final_rect.size.x, 0)) * pixel_size, - final_rect.position * pixel_size, - - }; - - Vector2 src_tsize = tsize; - - // Properly setup UVs for impostor textures (AtlasTexture). - Ref<AtlasTexture> atlas_tex = texture; - if (atlas_tex != nullptr) { - src_tsize[0] = atlas_tex->get_atlas()->get_width(); - src_tsize[1] = atlas_tex->get_atlas()->get_height(); - } - - Vector2 uvs[4] = { - final_src_rect.position / src_tsize, - (final_src_rect.position + Vector2(final_src_rect.size.x, 0)) / src_tsize, - (final_src_rect.position + final_src_rect.size) / src_tsize, - (final_src_rect.position + Vector2(0, final_src_rect.size.y)) / src_tsize, - }; - - if (is_flipped_h()) { - SWAP(uvs[0], uvs[1]); - SWAP(uvs[2], uvs[3]); - } - if (is_flipped_v()) { - SWAP(uvs[0], uvs[3]); - SWAP(uvs[1], uvs[2]); - } - - Vector3 normal; - int axis = get_axis(); - normal[axis] = 1.0; - - Plane tangent; - if (axis == Vector3::AXIS_X) { - tangent = Plane(0, 0, -1, -1); - } else { - tangent = Plane(1, 0, 0, -1); - } - - int x_axis = ((axis + 1) % 3); - int y_axis = ((axis + 2) % 3); - - if (axis != Vector3::AXIS_Z) { - SWAP(x_axis, y_axis); - - for (int i = 0; i < 4; i++) { - //uvs[i] = Vector2(1.0,1.0)-uvs[i]; - //SWAP(vertices[i].x,vertices[i].y); - if (axis == Vector3::AXIS_Y) { - vertices[i].y = -vertices[i].y; - } else if (axis == Vector3::AXIS_X) { - vertices[i].x = -vertices[i].x; - } - } - } - - AABB aabb; - - // Everything except position and UV is compressed - uint8_t *vertex_write_buffer = vertex_buffer.ptrw(); - uint8_t *attribute_write_buffer = attribute_buffer.ptrw(); - - uint32_t v_normal; - { - Vector3 n = normal * Vector3(0.5, 0.5, 0.5) + Vector3(0.5, 0.5, 0.5); - - Vector2 res = n.octahedron_encode(); - uint32_t value = 0; - value |= (uint16_t)CLAMP(res.x * 65535, 0, 65535); - value |= (uint16_t)CLAMP(res.y * 65535, 0, 65535) << 16; - - v_normal = value; - } - uint32_t v_tangent; - { - Plane t = tangent; - Vector2 res = t.normal.octahedron_tangent_encode(t.d); - uint32_t value = 0; - value |= (uint16_t)CLAMP(res.x * 65535, 0, 65535); - value |= (uint16_t)CLAMP(res.y * 65535, 0, 65535) << 16; - v_tangent = value; - } - - uint8_t v_color[4] = { - uint8_t(CLAMP(color.r * 255.0, 0.0, 255.0)), - uint8_t(CLAMP(color.g * 255.0, 0.0, 255.0)), - uint8_t(CLAMP(color.b * 255.0, 0.0, 255.0)), - uint8_t(CLAMP(color.a * 255.0, 0.0, 255.0)) - }; - - for (int i = 0; i < 4; i++) { - Vector3 vtx; - vtx[x_axis] = vertices[i][0]; - vtx[y_axis] = vertices[i][1]; - if (i == 0) { - aabb.position = vtx; - aabb.size = Vector3(); - } else { - aabb.expand_to(vtx); - } - - float v_uv[2] = { (float)uvs[i].x, (float)uvs[i].y }; - memcpy(&attribute_write_buffer[i * attrib_stride + mesh_surface_offsets[RS::ARRAY_TEX_UV]], v_uv, 8); - - float v_vertex[3] = { (float)vtx.x, (float)vtx.y, (float)vtx.z }; - memcpy(&vertex_write_buffer[i * vertex_stride + mesh_surface_offsets[RS::ARRAY_VERTEX]], &v_vertex, sizeof(float) * 3); - memcpy(&vertex_write_buffer[i * vertex_stride + mesh_surface_offsets[RS::ARRAY_NORMAL]], &v_normal, 4); - memcpy(&vertex_write_buffer[i * vertex_stride + mesh_surface_offsets[RS::ARRAY_TANGENT]], &v_tangent, 4); - memcpy(&attribute_write_buffer[i * attrib_stride + mesh_surface_offsets[RS::ARRAY_COLOR]], v_color, 4); - } - - RID mesh = get_mesh(); - RS::get_singleton()->mesh_surface_update_vertex_region(mesh, 0, 0, vertex_buffer); - RS::get_singleton()->mesh_surface_update_attribute_region(mesh, 0, 0, attribute_buffer); - - RS::get_singleton()->mesh_set_custom_aabb(mesh, aabb); - set_aabb(aabb); - - RID shader_rid; - StandardMaterial3D::get_material_for_2d(get_draw_flag(FLAG_SHADED), get_draw_flag(FLAG_TRANSPARENT), get_draw_flag(FLAG_DOUBLE_SIDED), get_alpha_cut_mode() == ALPHA_CUT_DISCARD, get_alpha_cut_mode() == ALPHA_CUT_OPAQUE_PREPASS, get_billboard_mode() == StandardMaterial3D::BILLBOARD_ENABLED, get_billboard_mode() == StandardMaterial3D::BILLBOARD_FIXED_Y, false, get_draw_flag(FLAG_DISABLE_DEPTH_TEST), get_draw_flag(FLAG_FIXED_SIZE), get_texture_filter(), &shader_rid); - if (last_shader != shader_rid) { - RS::get_singleton()->material_set_shader(get_material(), shader_rid); - last_shader = shader_rid; - } - if (last_texture != texture->get_rid()) { - RS::get_singleton()->material_set_param(get_material(), "texture_albedo", texture->get_rid()); - last_texture = texture->get_rid(); - } - if (get_alpha_cut_mode() == ALPHA_CUT_DISABLED) { - RS::get_singleton()->material_set_render_priority(get_material(), get_render_priority()); - RS::get_singleton()->mesh_surface_set_material(mesh, 0, get_material()); - } + draw_texture_rect(texture, dst_rect, src_rect); } void AnimatedSprite3D::_validate_property(PropertyInfo &p_property) const { if (!frames.is_valid()) { return; } + if (p_property.name == "animation") { p_property.hint = PROPERTY_HINT_ENUM; List<StringName> names; @@ -1026,9 +890,15 @@ void AnimatedSprite3D::_validate_property(PropertyInfo &p_property) const { p_property.hint_string = String(animation) + "," + p_property.hint_string; } } + return; } if (p_property.name == "frame") { + if (playing) { + p_property.usage = PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_READ_ONLY; + return; + } + p_property.hint = PROPERTY_HINT_RANGE; if (frames->has_animation(animation) && frames->get_frame_count(animation) > 0) { p_property.hint_string = "0," + itos(frames->get_frame_count(animation) - 1) + ",1"; @@ -1043,40 +913,57 @@ void AnimatedSprite3D::_validate_property(PropertyInfo &p_property) const { void AnimatedSprite3D::_notification(int p_what) { switch (p_what) { case NOTIFICATION_INTERNAL_PROCESS: { - if (frames.is_null()) { + if (frames.is_null() || !frames->has_animation(animation)) { return; } - if (!frames->has_animation(animation)) { - return; - } - if (frame < 0) { - return; + + double speed = frames->get_animation_speed(animation) * Math::abs(speed_scale); + if (speed == 0) { + return; // Do nothing. } + int last_frame = frames->get_frame_count(animation) - 1; double remaining = get_process_delta_time(); - while (remaining) { - double speed = frames->get_animation_speed(animation); - if (speed == 0) { - return; // Do nothing. - } - if (timeout <= 0) { - timeout = 1.0 / speed; - - int fc = frames->get_frame_count(animation); - if (frame >= fc - 1) { - if (frames->get_animation_loop(animation)) { - frame = 0; + timeout = _get_frame_duration(); + + if (!playing_backwards) { + // Forward. + if (frame >= last_frame) { + if (frames->get_animation_loop(animation)) { + frame = 0; + emit_signal(SceneStringNames::get_singleton()->animation_finished); + } else { + frame = last_frame; + if (!is_over) { + is_over = true; + emit_signal(SceneStringNames::get_singleton()->animation_finished); + } + } } else { - frame = fc - 1; + frame++; } - emit_signal(SceneStringNames::get_singleton()->animation_finished); } else { - frame++; + // Reversed. + if (frame <= 0) { + if (frames->get_animation_loop(animation)) { + frame = last_frame; + emit_signal(SceneStringNames::get_singleton()->animation_finished); + } else { + frame = 0; + if (!is_over) { + is_over = true; + emit_signal(SceneStringNames::get_singleton()->animation_finished); + } + } + } else { + frame--; + } } - _queue_update(); + _queue_redraw(); + emit_signal(SceneStringNames::get_singleton()->frame_changed); } @@ -1090,14 +977,15 @@ void AnimatedSprite3D::_notification(int p_what) { void AnimatedSprite3D::set_sprite_frames(const Ref<SpriteFrames> &p_frames) { if (frames.is_valid()) { - frames->disconnect("changed", Callable(this, "_res_changed")); + frames->disconnect(SceneStringNames::get_singleton()->changed, callable_mp(this, &AnimatedSprite3D::_res_changed)); } + frames = p_frames; if (frames.is_valid()) { - frames->connect("changed", Callable(this, "_res_changed")); + frames->connect(SceneStringNames::get_singleton()->changed, callable_mp(this, &AnimatedSprite3D::_res_changed)); } - if (!frames.is_valid()) { + if (frames.is_null()) { frame = 0; } else { set_frame(frame); @@ -1105,7 +993,7 @@ void AnimatedSprite3D::set_sprite_frames(const Ref<SpriteFrames> &p_frames) { notify_property_list_changed(); _reset_timeout(); - _queue_update(); + _queue_redraw(); update_configuration_warnings(); } @@ -1114,7 +1002,7 @@ Ref<SpriteFrames> AnimatedSprite3D::get_sprite_frames() const { } void AnimatedSprite3D::set_frame(int p_frame) { - if (!frames.is_valid()) { + if (frames.is_null()) { return; } @@ -1135,7 +1023,8 @@ void AnimatedSprite3D::set_frame(int p_frame) { frame = p_frame; _reset_timeout(); - _queue_update(); + _queue_redraw(); + emit_signal(SceneStringNames::get_singleton()->frame_changed); } @@ -1143,8 +1032,30 @@ int AnimatedSprite3D::get_frame() const { return frame; } +void AnimatedSprite3D::set_speed_scale(double p_speed_scale) { + if (speed_scale == p_speed_scale) { + return; + } + + double elapsed = _get_frame_duration() - timeout; + + speed_scale = p_speed_scale; + playing_backwards = signbit(speed_scale) != backwards; + + // We adapt the timeout so that the animation speed adapts as soon as the speed scale is changed. + _reset_timeout(); + timeout -= elapsed; +} + +double AnimatedSprite3D::get_speed_scale() const { + return speed_scale; +} + Rect2 AnimatedSprite3D::get_item_rect() const { - if (!frames.is_valid() || !frames->has_animation(animation) || frame < 0 || frame >= frames->get_frame_count(animation)) { + if (frames.is_null() || !frames->has_animation(animation)) { + return Rect2(0, 0, 1, 1); + } + if (frame < 0 || frame >= frames->get_frame_count(animation)) { return Rect2(0, 0, 1, 1); } @@ -1171,7 +1082,8 @@ Rect2 AnimatedSprite3D::get_item_rect() const { void AnimatedSprite3D::_res_changed() { set_frame(frame); - _queue_update(); + + _queue_redraw(); } void AnimatedSprite3D::set_playing(bool p_playing) { @@ -1181,16 +1093,25 @@ void AnimatedSprite3D::set_playing(bool p_playing) { playing = p_playing; _reset_timeout(); set_process_internal(playing); + notify_property_list_changed(); } bool AnimatedSprite3D::is_playing() const { return playing; } -void AnimatedSprite3D::play(const StringName &p_animation) { +void AnimatedSprite3D::play(const StringName &p_animation, bool p_backwards) { + backwards = p_backwards; + playing_backwards = signbit(speed_scale) != backwards; + if (p_animation) { set_animation(p_animation); + if (frames.is_valid() && playing_backwards && get_frame() == 0) { + set_frame(frames->get_frame_count(p_animation) - 1); + } } + + is_over = false; set_playing(true); } @@ -1198,24 +1119,28 @@ void AnimatedSprite3D::stop() { set_playing(false); } +double AnimatedSprite3D::_get_frame_duration() { + if (frames.is_valid() && frames->has_animation(animation)) { + double speed = frames->get_animation_speed(animation) * Math::abs(speed_scale); + if (speed > 0) { + return 1.0 / speed; + } + } + return 0.0; +} + void AnimatedSprite3D::_reset_timeout() { if (!playing) { return; } - if (frames.is_valid() && frames->has_animation(animation)) { - float speed = frames->get_animation_speed(animation); - if (speed > 0) { - timeout = 1.0 / speed; - } else { - timeout = 0; - } - } else { - timeout = 0; - } + timeout = _get_frame_duration(); + is_over = false; } void AnimatedSprite3D::set_animation(const StringName &p_animation) { + ERR_FAIL_COND_MSG(frames == nullptr, vformat("There is no animation with name '%s'.", p_animation)); + ERR_FAIL_COND_MSG(!frames->get_animation_names().has(p_animation), vformat("There is no animation with name '%s'.", p_animation)); if (animation == p_animation) { return; } @@ -1224,15 +1149,15 @@ void AnimatedSprite3D::set_animation(const StringName &p_animation) { _reset_timeout(); set_frame(0); notify_property_list_changed(); - _queue_update(); + _queue_redraw(); } StringName AnimatedSprite3D::get_animation() const { return animation; } -TypedArray<String> AnimatedSprite3D::get_configuration_warnings() const { - TypedArray<String> warnings = SpriteBase3D::get_configuration_warnings(); +PackedStringArray AnimatedSprite3D::get_configuration_warnings() const { + PackedStringArray warnings = SpriteBase3D::get_configuration_warnings(); if (frames.is_null()) { warnings.push_back(RTR("A SpriteFrames resource must be created or set in the \"Frames\" property in order for AnimatedSprite3D to display frames.")); } @@ -1261,12 +1186,15 @@ void AnimatedSprite3D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_playing", "playing"), &AnimatedSprite3D::set_playing); ClassDB::bind_method(D_METHOD("is_playing"), &AnimatedSprite3D::is_playing); - ClassDB::bind_method(D_METHOD("play", "anim"), &AnimatedSprite3D::play, DEFVAL(StringName())); + ClassDB::bind_method(D_METHOD("play", "anim", "backwards"), &AnimatedSprite3D::play, DEFVAL(StringName()), DEFVAL(false)); ClassDB::bind_method(D_METHOD("stop"), &AnimatedSprite3D::stop); ClassDB::bind_method(D_METHOD("set_frame", "frame"), &AnimatedSprite3D::set_frame); ClassDB::bind_method(D_METHOD("get_frame"), &AnimatedSprite3D::get_frame); + ClassDB::bind_method(D_METHOD("set_speed_scale", "speed_scale"), &AnimatedSprite3D::set_speed_scale); + ClassDB::bind_method(D_METHOD("get_speed_scale"), &AnimatedSprite3D::get_speed_scale); + ClassDB::bind_method(D_METHOD("_res_changed"), &AnimatedSprite3D::_res_changed); ADD_SIGNAL(MethodInfo("frame_changed")); @@ -1275,6 +1203,7 @@ void AnimatedSprite3D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "frames", PROPERTY_HINT_RESOURCE_TYPE, "SpriteFrames"), "set_sprite_frames", "get_sprite_frames"); ADD_PROPERTY(PropertyInfo(Variant::STRING, "animation"), "set_animation", "get_animation"); ADD_PROPERTY(PropertyInfo(Variant::INT, "frame"), "set_frame", "get_frame"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "speed_scale"), "set_speed_scale", "get_speed_scale"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "playing"), "set_playing", "is_playing"); } diff --git a/scene/3d/sprite_3d.h b/scene/3d/sprite_3d.h index 84244a2476..edc48c7b71 100644 --- a/scene/3d/sprite_3d.h +++ b/scene/3d/sprite_3d.h @@ -80,6 +80,9 @@ private: RID mesh; RID material; + RID last_shader; + RID last_texture; + bool flags[FLAG_MAX] = {}; AlphaCutMode alpha_cut = ALPHA_CUT_DISABLED; StandardMaterial3D::BillboardMode billboard_mode = StandardMaterial3D::BILLBOARD_DISABLED; @@ -94,6 +97,7 @@ protected: void _notification(int p_what); static void _bind_methods(); virtual void _draw() = 0; + void draw_texture_rect(Ref<Texture2D> p_texture, Rect2 p_dst_rect, Rect2 p_src_rect); _FORCE_INLINE_ void set_aabb(const AABB &p_aabb) { aabb = p_aabb; } _FORCE_INLINE_ RID &get_mesh() { return mesh; } _FORCE_INLINE_ RID &get_material() { return material; } @@ -106,7 +110,7 @@ protected: uint32_t skin_stride = 0; uint32_t mesh_surface_format = 0; - void _queue_update(); + void _queue_redraw(); public: void set_centered(bool p_center); @@ -167,9 +171,6 @@ class Sprite3D : public SpriteBase3D { int vframes = 1; int hframes = 1; - RID last_shader; - RID last_texture; - protected: virtual void _draw() override; static void _bind_methods(); @@ -209,20 +210,22 @@ class AnimatedSprite3D : public SpriteBase3D { Ref<SpriteFrames> frames; bool playing = false; + bool playing_backwards = false; + bool backwards = false; StringName animation = "default"; int frame = 0; + float speed_scale = 1.0f; bool centered = false; + bool is_over = false; double timeout = 0.0; void _res_changed(); + double _get_frame_duration(); void _reset_timeout(); - RID last_shader; - RID last_texture; - protected: virtual void _draw() override; static void _bind_methods(); @@ -233,7 +236,7 @@ public: void set_sprite_frames(const Ref<SpriteFrames> &p_frames); Ref<SpriteFrames> get_sprite_frames() const; - void play(const StringName &p_animation = StringName()); + void play(const StringName &p_animation = StringName(), bool p_backwards = false); void stop(); void set_playing(bool p_playing); @@ -245,9 +248,12 @@ public: void set_frame(int p_frame); int get_frame() const; + void set_speed_scale(double p_speed_scale); + double get_speed_scale() const; + virtual Rect2 get_item_rect() const override; - virtual TypedArray<String> get_configuration_warnings() const override; + virtual PackedStringArray get_configuration_warnings() const override; virtual void get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const override; AnimatedSprite3D(); diff --git a/scene/3d/vehicle_body_3d.cpp b/scene/3d/vehicle_body_3d.cpp index d61b49eaa7..36b5e61f45 100644 --- a/scene/3d/vehicle_body_3d.cpp +++ b/scene/3d/vehicle_body_3d.cpp @@ -105,8 +105,8 @@ void VehicleWheel3D::_notification(int p_what) { } } -TypedArray<String> VehicleWheel3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray VehicleWheel3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!Object::cast_to<VehicleBody3D>(get_parent())) { warnings.push_back(RTR("VehicleWheel3D serves to provide a wheel system to a VehicleBody3D. Please use it as a child of a VehicleBody3D.")); diff --git a/scene/3d/vehicle_body_3d.h b/scene/3d/vehicle_body_3d.h index 5c4f4beaea..a6a49ee88a 100644 --- a/scene/3d/vehicle_body_3d.h +++ b/scene/3d/vehicle_body_3d.h @@ -147,7 +147,7 @@ public: void set_steering(real_t p_steering); real_t get_steering() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; VehicleWheel3D(); }; diff --git a/scene/3d/visual_instance_3d.cpp b/scene/3d/visual_instance_3d.cpp index db9f68544b..e93ad5ecbf 100644 --- a/scene/3d/visual_instance_3d.cpp +++ b/scene/3d/visual_instance_3d.cpp @@ -385,8 +385,8 @@ bool GeometryInstance3D::is_ignoring_occlusion_culling() { return ignore_occlusion_culling; } -TypedArray<String> GeometryInstance3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray GeometryInstance3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!Math::is_zero_approx(visibility_range_end) && visibility_range_end <= visibility_range_begin) { warnings.push_back(RTR("The GeometryInstance3D visibility range's End distance is set to a non-zero value, but is lower than the Begin distance.\nThis means the GeometryInstance3D will never be visible.\nTo resolve this, set the End distance to 0 or to a value greater than the Begin distance.")); diff --git a/scene/3d/visual_instance_3d.h b/scene/3d/visual_instance_3d.h index 100d8d8836..4755545516 100644 --- a/scene/3d/visual_instance_3d.h +++ b/scene/3d/visual_instance_3d.h @@ -186,7 +186,7 @@ public: void set_ignore_occlusion_culling(bool p_enabled); bool is_ignoring_occlusion_culling(); - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; GeometryInstance3D(); virtual ~GeometryInstance3D(); }; diff --git a/scene/3d/voxel_gi.cpp b/scene/3d/voxel_gi.cpp index c97af087bf..c2728960ee 100644 --- a/scene/3d/voxel_gi.cpp +++ b/scene/3d/voxel_gi.cpp @@ -30,6 +30,7 @@ #include "voxel_gi.h" +#include "core/config/project_settings.h" #include "core/core_string_names.h" #include "mesh_instance_3d.h" #include "multimesh_instance_3d.h" @@ -382,7 +383,10 @@ void VoxelGI::bake(Node *p_from_node, bool p_create_visual_debug) { float exposure_normalization = 1.0; if (camera_attributes.is_valid()) { - exposure_normalization = camera_attributes->calculate_exposure_normalization() * camera_attributes->get_exposure_multiplier(); + exposure_normalization = camera_attributes->get_exposure_multiplier(); + if (GLOBAL_GET("rendering/lights_and_shadows/use_physical_light_units")) { + exposure_normalization = camera_attributes->calculate_exposure_normalization(); + } } Voxelizer baker; @@ -468,8 +472,8 @@ AABB VoxelGI::get_aabb() const { return AABB(-extents, extents * 2); } -TypedArray<String> VoxelGI::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray VoxelGI::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (RenderingServer::get_singleton()->is_low_end()) { warnings.push_back(RTR("VoxelGIs are not supported by the OpenGL video driver.\nUse a LightmapGI instead.")); diff --git a/scene/3d/voxel_gi.h b/scene/3d/voxel_gi.h index b31ae4cd95..fc10091d4f 100644 --- a/scene/3d/voxel_gi.h +++ b/scene/3d/voxel_gi.h @@ -157,7 +157,7 @@ public: virtual AABB get_aabb() const override; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; VoxelGI(); ~VoxelGI(); diff --git a/scene/3d/world_environment.cpp b/scene/3d/world_environment.cpp index ae7d79e8b0..6cc5e9ef20 100644 --- a/scene/3d/world_environment.cpp +++ b/scene/3d/world_environment.cpp @@ -135,8 +135,8 @@ Ref<CameraAttributes> WorldEnvironment::get_camera_attributes() const { return camera_attributes; } -TypedArray<String> WorldEnvironment::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray WorldEnvironment::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!environment.is_valid() && !camera_attributes.is_valid()) { warnings.push_back(RTR("To have any visible effect, WorldEnvironment requires its \"Environment\" property to contain an Environment, its \"Camera Attributes\" property to contain a CameraAttributes resource, or both.")); diff --git a/scene/3d/world_environment.h b/scene/3d/world_environment.h index 07f243c750..cc46a06b4c 100644 --- a/scene/3d/world_environment.h +++ b/scene/3d/world_environment.h @@ -55,7 +55,7 @@ public: void set_camera_attributes(const Ref<CameraAttributes> &p_camera_attributes); Ref<CameraAttributes> get_camera_attributes() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; WorldEnvironment(); }; diff --git a/scene/3d/xr_nodes.cpp b/scene/3d/xr_nodes.cpp index de765d7ccb..4401d22f30 100644 --- a/scene/3d/xr_nodes.cpp +++ b/scene/3d/xr_nodes.cpp @@ -88,8 +88,8 @@ void XRCamera3D::_pose_changed(const Ref<XRPose> &p_pose) { } } -TypedArray<String> XRCamera3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray XRCamera3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (is_visible() && is_inside_tree()) { // must be child node of XROrigin3D! @@ -414,8 +414,8 @@ XRNode3D::~XRNode3D() { xr_server->disconnect("tracker_removed", callable_mp(this, &XRNode3D::_removed_tracker)); } -TypedArray<String> XRNode3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray XRNode3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (is_visible() && is_inside_tree()) { // must be child node of XROrigin! @@ -582,8 +582,8 @@ Plane XRAnchor3D::get_plane() const { //////////////////////////////////////////////////////////////////////////////////////////////////// -TypedArray<String> XROrigin3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray XROrigin3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (is_visible() && is_inside_tree()) { if (tracked_camera == nullptr) { diff --git a/scene/3d/xr_nodes.h b/scene/3d/xr_nodes.h index 312bef7856..ef846cc3a3 100644 --- a/scene/3d/xr_nodes.h +++ b/scene/3d/xr_nodes.h @@ -55,7 +55,7 @@ protected: void _pose_changed(const Ref<XRPose> &p_pose); public: - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; virtual Vector3 project_local_ray_normal(const Point2 &p_pos) const override; virtual Point2 unproject_position(const Vector3 &p_pos) const override; @@ -107,7 +107,7 @@ public: Ref<XRPose> get_pose(); - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; XRNode3D(); ~XRNode3D(); @@ -187,7 +187,7 @@ protected: static void _bind_methods(); public: - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; void set_tracked_camera(XRCamera3D *p_tracked_camera); XRCamera3D *get_tracked_camera() const; diff --git a/scene/animation/animation_blend_tree.cpp b/scene/animation/animation_blend_tree.cpp index 99f17a1eef..c063d8f1bf 100644 --- a/scene/animation/animation_blend_tree.cpp +++ b/scene/animation/animation_blend_tree.cpp @@ -217,19 +217,19 @@ Variant AnimationNodeOneShot::get_parameter_default_value(const StringName &p_pa } } -void AnimationNodeOneShot::set_fadein_time(float p_time) { +void AnimationNodeOneShot::set_fadein_time(double p_time) { fade_in = p_time; } -void AnimationNodeOneShot::set_fadeout_time(float p_time) { +void AnimationNodeOneShot::set_fadeout_time(double p_time) { fade_out = p_time; } -float AnimationNodeOneShot::get_fadein_time() const { +double AnimationNodeOneShot::get_fadein_time() const { return fade_in; } -float AnimationNodeOneShot::get_fadeout_time() const { +double AnimationNodeOneShot::get_fadeout_time() const { return fade_out; } @@ -237,11 +237,11 @@ void AnimationNodeOneShot::set_autorestart(bool p_active) { autorestart = p_active; } -void AnimationNodeOneShot::set_autorestart_delay(float p_time) { +void AnimationNodeOneShot::set_autorestart_delay(double p_time) { autorestart_delay = p_time; } -void AnimationNodeOneShot::set_autorestart_random_delay(float p_time) { +void AnimationNodeOneShot::set_autorestart_random_delay(double p_time) { autorestart_random_delay = p_time; } @@ -249,11 +249,11 @@ bool AnimationNodeOneShot::has_autorestart() const { return autorestart; } -float AnimationNodeOneShot::get_autorestart_delay() const { +double AnimationNodeOneShot::get_autorestart_delay() const { return autorestart_delay; } -float AnimationNodeOneShot::get_autorestart_random_delay() const { +double AnimationNodeOneShot::get_autorestart_random_delay() const { return autorestart_random_delay; } @@ -313,7 +313,7 @@ double AnimationNodeOneShot::process(double p_time, bool p_seek, bool p_seek_roo set_parameter(this->prev_active, true); } - float blend; + real_t blend; if (time < fade_in) { if (fade_in > 0) { @@ -351,7 +351,7 @@ double AnimationNodeOneShot::process(double p_time, bool p_seek, bool p_seek_roo set_parameter(this->active, false); set_parameter(this->prev_active, false); if (autorestart) { - float restart_sec = autorestart_delay + Math::randf() * autorestart_random_delay; + double restart_sec = autorestart_delay + Math::randd() * autorestart_random_delay; set_parameter(this->time_to_restart, restart_sec); } } @@ -676,11 +676,11 @@ String AnimationNodeTransition::get_input_caption(int p_input) const { return inputs[p_input].name; } -void AnimationNodeTransition::set_xfade_time(float p_fade) { +void AnimationNodeTransition::set_xfade_time(double p_fade) { xfade_time = p_fade; } -float AnimationNodeTransition::get_xfade_time() const { +double AnimationNodeTransition::get_xfade_time() const { return xfade_time; } @@ -748,7 +748,7 @@ double AnimationNodeTransition::process(double p_time, bool p_seek, bool p_seek_ } else { // cross-fading from prev to current - float blend = xfade_time == 0 ? 0 : (prev_xfading / xfade_time); + real_t blend = xfade_time == 0 ? 0 : (prev_xfading / xfade_time); if (xfade_curve.is_valid()) { blend = xfade_curve->sample(blend); } @@ -1175,6 +1175,7 @@ void AnimationNodeBlendTree::_tree_changed() { void AnimationNodeBlendTree::_node_changed(const StringName &p_node) { ERR_FAIL_COND(!nodes.has(p_node)); nodes[p_node].connections.resize(nodes[p_node].node->get_input_count()); + emit_signal(SNAME("node_changed"), p_node); } void AnimationNodeBlendTree::_bind_methods() { @@ -1200,6 +1201,8 @@ void AnimationNodeBlendTree::_bind_methods() { BIND_CONSTANT(CONNECTION_ERROR_NO_OUTPUT); BIND_CONSTANT(CONNECTION_ERROR_SAME_NODE); BIND_CONSTANT(CONNECTION_ERROR_CONNECTION_EXISTS); + + ADD_SIGNAL(MethodInfo("node_changed", PropertyInfo(Variant::STRING_NAME, "node_name"))); } void AnimationNodeBlendTree::_initialize_node_tree() { diff --git a/scene/animation/animation_blend_tree.h b/scene/animation/animation_blend_tree.h index 59c074cc80..1c31718259 100644 --- a/scene/animation/animation_blend_tree.h +++ b/scene/animation/animation_blend_tree.h @@ -102,18 +102,18 @@ public: }; private: - float fade_in = 0.0; - float fade_out = 0.0; + double fade_in = 0.0; + double fade_out = 0.0; bool autorestart = false; - float autorestart_delay = 1.0; - float autorestart_random_delay = 0.0; + double autorestart_delay = 1.0; + double autorestart_random_delay = 0.0; MixMode mix = MIX_MODE_BLEND; /* bool active; bool do_start; - float time; - float remaining;*/ + double time; + double remaining;*/ StringName active = PNAME("active"); StringName prev_active = "prev_active"; @@ -130,19 +130,19 @@ public: virtual String get_caption() const override; - void set_fadein_time(float p_time); - void set_fadeout_time(float p_time); + void set_fadein_time(double p_time); + void set_fadeout_time(double p_time); - float get_fadein_time() const; - float get_fadeout_time() const; + double get_fadein_time() const; + double get_fadeout_time() const; void set_autorestart(bool p_active); - void set_autorestart_delay(float p_time); - void set_autorestart_random_delay(float p_time); + void set_autorestart_delay(double p_time); + void set_autorestart_random_delay(double p_time); bool has_autorestart() const; - float get_autorestart_delay() const; - float get_autorestart_random_delay() const; + double get_autorestart_delay() const; + double get_autorestart_random_delay() const; void set_mix_mode(MixMode p_mix); MixMode get_mix_mode() const; @@ -285,9 +285,9 @@ class AnimationNodeTransition : public AnimationNodeSync { int enabled_inputs = 0; /* - float prev_xfading; + double prev_xfading; int prev; - float time; + double time; int current; int prev_current; */ @@ -297,7 +297,7 @@ class AnimationNodeTransition : public AnimationNodeSync { StringName current = PNAME("current"); StringName prev_current = "prev_current"; - float xfade_time = 0.0; + double xfade_time = 0.0; Ref<Curve> xfade_curve; bool from_start = true; @@ -322,8 +322,8 @@ public: void set_input_caption(int p_input, const String &p_name); String get_input_caption(int p_input) const; - void set_xfade_time(float p_fade); - float get_xfade_time() const; + void set_xfade_time(double p_fade); + double get_xfade_time() const; void set_xfade_curve(const Ref<Curve> &p_curve); Ref<Curve> get_xfade_curve() const; diff --git a/scene/animation/animation_node_state_machine.cpp b/scene/animation/animation_node_state_machine.cpp index 49a59de9b2..facffb99ee 100644 --- a/scene/animation/animation_node_state_machine.cpp +++ b/scene/animation/animation_node_state_machine.cpp @@ -29,6 +29,7 @@ /*************************************************************************/ #include "animation_node_state_machine.h" +#include "scene/main/window.h" ///////////////////////////////////////////////// @@ -169,7 +170,7 @@ void AnimationNodeStateMachineTransition::_bind_methods() { ADD_GROUP("Advance", "advance_"); ADD_PROPERTY(PropertyInfo(Variant::STRING_NAME, "advance_condition"), "set_advance_condition", "get_advance_condition"); ADD_PROPERTY(PropertyInfo(Variant::STRING, "advance_expression", PROPERTY_HINT_EXPRESSION, ""), "set_advance_expression", "get_advance_expression"); - ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "advance_expression_base_node"), "set_advance_expression_base_node", "get_advance_expression_base_node"); + ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "advance_expression_base_node", PROPERTY_HINT_NODE_PATH_VALID_TYPES, "Node"), "set_advance_expression_base_node", "get_advance_expression_base_node"); ADD_GROUP("Disabling", ""); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "disabled"), "set_disabled", "is_disabled"); @@ -656,13 +657,15 @@ bool AnimationNodeStateMachinePlayback::_check_advance_condition(const Ref<Anima ERR_FAIL_COND_V(tree_base == nullptr, false); NodePath advance_expression_base_node_path; - if (!transition->advance_expression_base_node.is_empty()) { - advance_expression_base_node_path = transition->advance_expression_base_node; + Node *expression_base = nullptr; + if (!transition->get_advance_expression_base_node().is_empty()) { + advance_expression_base_node_path = transition->get_advance_expression_base_node(); + expression_base = tree_base->get_tree()->get_root()->get_child(0)->get_node_or_null(advance_expression_base_node_path); } else { advance_expression_base_node_path = tree_base->get_advance_expression_base_node(); + expression_base = tree_base->get_node_or_null(advance_expression_base_node_path); } - Node *expression_base = tree_base->get_node_or_null(advance_expression_base_node_path); if (expression_base) { Ref<Expression> exp = transition->expression; bool ret = exp->execute(Array(), expression_base, false, Engine::get_singleton()->is_editor_hint()); // Avoids allowing the user to crash the system with an expression by only allowing const calls. diff --git a/scene/animation/animation_player.cpp b/scene/animation/animation_player.cpp index 096f4edee2..54b10d9d57 100644 --- a/scene/animation/animation_player.cpp +++ b/scene/animation/animation_player.cpp @@ -156,7 +156,7 @@ bool AnimationPlayer::_get(const StringName &p_name, Variant &r_ret) const { } else if (name == "blend_times") { Vector<BlendKey> keys; - for (const KeyValue<BlendKey, float> &E : blend_times) { + for (const KeyValue<BlendKey, double> &E : blend_times) { keys.ordered_insert(E.key); } @@ -216,7 +216,7 @@ void AnimationPlayer::_get_property_list(List<PropertyInfo> *p_list) const { p_list->push_back(PropertyInfo(Variant::ARRAY, "blend_times", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR | PROPERTY_USAGE_INTERNAL)); } -void AnimationPlayer::advance(float p_time) { +void AnimationPlayer::advance(double p_time) { _animation_process(p_time); } @@ -650,15 +650,14 @@ void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, double double c = Math::ease(p_time / first_key_time, transition); Variant first_value = a->track_get_key_value(i, first_key); first_value = _post_process_key_value(a, i, first_value, nc->node); - Variant interp_value; - Variant::interpolate(pa->capture, first_value, c, interp_value); + Variant interp_value = Animation::interpolate_variant(pa->capture, first_value, c); if (pa->accum_pass != accum_pass) { ERR_CONTINUE(cache_update_prop_size >= NODE_CACHE_UPDATE_MAX); cache_update_prop[cache_update_prop_size++] = pa; pa->value_accum = interp_value; pa->accum_pass = accum_pass; } else { - Variant::interpolate(pa->value_accum, interp_value, p_interp, pa->value_accum); + pa->value_accum = Animation::interpolate_variant(pa->value_accum, interp_value, p_interp); } continue; //handled @@ -679,7 +678,7 @@ void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, double pa->value_accum = value; pa->accum_pass = accum_pass; } else { - Variant::interpolate(pa->value_accum, value, p_interp, pa->value_accum); + pa->value_accum = Animation::interpolate_variant(pa->value_accum, value, p_interp); } } else if (p_is_current && p_delta != 0) { @@ -1270,6 +1269,8 @@ void AnimationPlayer::_animation_set_cache_update() { // If something was modified or removed, caches need to be cleared clear_caches(); } + + emit_signal(SNAME("animation_list_changed")); } void AnimationPlayer::_animation_added(const StringName &p_name, const StringName &p_library) { @@ -1286,7 +1287,7 @@ void AnimationPlayer::_animation_removed(const StringName &p_name, const StringN // Erase blends if needed List<BlendKey> to_erase; - for (const KeyValue<BlendKey, float> &E : blend_times) { + for (const KeyValue<BlendKey, double> &E : blend_times) { BlendKey bk = E.key; if (bk.from == name || bk.to == name) { to_erase.push_back(bk); @@ -1302,8 +1303,8 @@ void AnimationPlayer::_animation_removed(const StringName &p_name, const StringN void AnimationPlayer::_rename_animation(const StringName &p_from_name, const StringName &p_to_name) { // Rename autoplay or blends if needed. List<BlendKey> to_erase; - HashMap<BlendKey, float, BlendKey> to_insert; - for (const KeyValue<BlendKey, float> &E : blend_times) { + HashMap<BlendKey, double, BlendKey> to_insert; + for (const KeyValue<BlendKey, double> &E : blend_times) { BlendKey bk = E.key; BlendKey new_bk = bk; bool erase = false; @@ -1522,7 +1523,7 @@ void AnimationPlayer::get_animation_list(List<StringName> *p_animations) const { } } -void AnimationPlayer::set_blend_time(const StringName &p_animation1, const StringName &p_animation2, float p_time) { +void AnimationPlayer::set_blend_time(const StringName &p_animation1, const StringName &p_animation2, double p_time) { ERR_FAIL_COND_MSG(!animation_set.has(p_animation1), vformat("Animation not found: %s.", p_animation1)); ERR_FAIL_COND_MSG(!animation_set.has(p_animation2), vformat("Animation not found: %s.", p_animation2)); ERR_FAIL_COND_MSG(p_time < 0, "Blend time cannot be smaller than 0."); @@ -1537,7 +1538,7 @@ void AnimationPlayer::set_blend_time(const StringName &p_animation1, const Strin } } -float AnimationPlayer::get_blend_time(const StringName &p_animation1, const StringName &p_animation2) const { +double AnimationPlayer::get_blend_time(const StringName &p_animation1, const StringName &p_animation2) const { BlendKey bk; bk.from = p_animation1; bk.to = p_animation2; @@ -1570,11 +1571,11 @@ void AnimationPlayer::clear_queue() { queued.clear(); } -void AnimationPlayer::play_backwards(const StringName &p_name, float p_custom_blend) { +void AnimationPlayer::play_backwards(const StringName &p_name, double p_custom_blend) { play(p_name, p_custom_blend, -1, true); } -void AnimationPlayer::play(const StringName &p_name, float p_custom_blend, float p_custom_scale, bool p_from_end) { +void AnimationPlayer::play(const StringName &p_name, double p_custom_blend, float p_custom_scale, bool p_from_end) { StringName name = p_name; if (String(name) == "") { @@ -1586,7 +1587,7 @@ void AnimationPlayer::play(const StringName &p_name, float p_custom_blend, float Playback &c = playback; if (c.current.from) { - float blend_time = 0.0; + double blend_time = 0.0; // find if it can blend BlendKey bk; bk.from = c.current.from->name; @@ -1740,7 +1741,7 @@ void AnimationPlayer::seek(double p_time, bool p_update) { } } -void AnimationPlayer::seek_delta(double p_time, float p_delta) { +void AnimationPlayer::seek_delta(double p_time, double p_delta) { if (!playback.current.from) { if (playback.assigned) { ERR_FAIL_COND_MSG(!animation_set.has(playback.assigned), vformat("Animation not found: %s.", playback.assigned)); @@ -1761,12 +1762,12 @@ bool AnimationPlayer::is_valid() const { return (playback.current.from); } -float AnimationPlayer::get_current_animation_position() const { +double AnimationPlayer::get_current_animation_position() const { ERR_FAIL_COND_V_MSG(!playback.current.from, 0, "AnimationPlayer has no current animation"); return playback.current.pos; } -float AnimationPlayer::get_current_animation_length() const { +double AnimationPlayer::get_current_animation_length() const { ERR_FAIL_COND_V_MSG(!playback.current.from, 0, "AnimationPlayer has no current animation"); return playback.current.from->animation->get_length(); } @@ -1932,11 +1933,11 @@ StringName AnimationPlayer::animation_get_next(const StringName &p_animation) co return animation_set[p_animation].next; } -void AnimationPlayer::set_default_blend_time(float p_default) { +void AnimationPlayer::set_default_blend_time(double p_default) { default_blend_time = p_default; } -float AnimationPlayer::get_default_blend_time() const { +double AnimationPlayer::get_default_blend_time() const { return default_blend_time; } @@ -2150,6 +2151,7 @@ void AnimationPlayer::_bind_methods() { ADD_SIGNAL(MethodInfo("animation_finished", PropertyInfo(Variant::STRING_NAME, "anim_name"))); ADD_SIGNAL(MethodInfo("animation_changed", PropertyInfo(Variant::STRING_NAME, "old_name"), PropertyInfo(Variant::STRING_NAME, "new_name"))); ADD_SIGNAL(MethodInfo("animation_started", PropertyInfo(Variant::STRING_NAME, "anim_name"))); + ADD_SIGNAL(MethodInfo("animation_list_changed")); ADD_SIGNAL(MethodInfo("caches_cleared")); BIND_ENUM_CONSTANT(ANIMATION_PROCESS_PHYSICS); diff --git a/scene/animation/animation_player.h b/scene/animation/animation_player.h index caf1387ff0..4f32927d25 100644 --- a/scene/animation/animation_player.h +++ b/scene/animation/animation_player.h @@ -191,7 +191,7 @@ private: uint64_t accum_pass = 1; float speed_scale = 1.0; - float default_blend_time = 0.0; + double default_blend_time = 0.0; struct AnimationData { String name; @@ -230,7 +230,7 @@ private: } }; - HashMap<BlendKey, float, BlendKey> blend_times; + HashMap<BlendKey, double, BlendKey> blend_times; struct PlaybackData { AnimationData *from = nullptr; @@ -241,8 +241,8 @@ private: struct Blend { PlaybackData data; - float blend_time = 0.0; - float blend_left = 0.0; + double blend_time = 0.0; + double blend_left = 0.0; }; struct Playback { @@ -334,17 +334,17 @@ public: void get_animation_list(List<StringName> *p_animations) const; bool has_animation(const StringName &p_name) const; - void set_blend_time(const StringName &p_animation1, const StringName &p_animation2, float p_time); - float get_blend_time(const StringName &p_animation1, const StringName &p_animation2) const; + void set_blend_time(const StringName &p_animation1, const StringName &p_animation2, double p_time); + double get_blend_time(const StringName &p_animation1, const StringName &p_animation2) const; void animation_set_next(const StringName &p_animation, const StringName &p_next); StringName animation_get_next(const StringName &p_animation) const; - void set_default_blend_time(float p_default); - float get_default_blend_time() const; + void set_default_blend_time(double p_default); + double get_default_blend_time() const; - void play(const StringName &p_name = StringName(), float p_custom_blend = -1, float p_custom_scale = 1.0, bool p_from_end = false); - void play_backwards(const StringName &p_name = StringName(), float p_custom_blend = -1); + void play(const StringName &p_name = StringName(), double p_custom_blend = -1, float p_custom_scale = 1.0, bool p_from_end = false); + void play_backwards(const StringName &p_name = StringName(), double p_custom_blend = -1); void queue(const StringName &p_name); Vector<String> get_queue(); void clear_queue(); @@ -378,11 +378,11 @@ public: bool is_movie_quit_on_finish_enabled() const; void seek(double p_time, bool p_update = false); - void seek_delta(double p_time, float p_delta); - float get_current_animation_position() const; - float get_current_animation_length() const; + void seek_delta(double p_time, double p_delta); + double get_current_animation_position() const; + double get_current_animation_length() const; - void advance(float p_time); + void advance(double p_time); void set_root(const NodePath &p_root); NodePath get_root() const; diff --git a/scene/animation/animation_tree.cpp b/scene/animation/animation_tree.cpp index d06324f0aa..05a4a2d024 100644 --- a/scene/animation/animation_tree.cpp +++ b/scene/animation/animation_tree.cpp @@ -847,6 +847,11 @@ bool AnimationTree::_update_caches(AnimationPlayer *player) { return true; } +void AnimationTree::_animation_player_changed() { + emit_signal(SNAME("animation_player_changed")); + _clear_caches(); +} + void AnimationTree::_clear_caches() { for (KeyValue<NodePath, TrackCache *> &K : track_cache) { memdelete(K.value); @@ -1378,8 +1383,13 @@ void AnimationTree::_process_graph(double p_delta) { } t->value = Math::fposmod(rot_a + (rot_b - rot_init) * (float)blend, (float)Math_TAU); } else { - Variant::sub(value, t->init_value, value); - Variant::blend(t->value, value, blend, t->value); + if (t->init_value.get_type() == Variant::BOOL) { + value = Animation::subtract_variant(value.operator real_t(), t->init_value.operator real_t()); + t->value = Animation::blend_variant(t->value.operator real_t(), value.operator real_t(), blend); + } else { + value = Animation::subtract_variant(value, t->init_value); + t->value = Animation::blend_variant(t->value, value, blend); + } } } else { if (blend < CMP_EPSILON) { @@ -1698,7 +1708,11 @@ void AnimationTree::_process_graph(double p_delta) { case Animation::TYPE_VALUE: { TrackCacheValue *t = static_cast<TrackCacheValue *>(track); - t->object->set_indexed(t->subpath, t->value); + if (t->init_value.get_type() == Variant::BOOL) { + t->object->set_indexed(t->subpath, t->value.operator real_t() >= 0.5); + } else { + t->object->set_indexed(t->subpath, t->value); + } } break; case Animation::TYPE_BEZIER: { @@ -1731,13 +1745,14 @@ Variant AnimationTree::_post_process_key_value(const Ref<Animation> &p_anim, int return p_value; } -void AnimationTree::advance(real_t p_time) { +void AnimationTree::advance(double p_time) { _process_graph(p_time); } void AnimationTree::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: { + _setup_animation_player(); if (last_animation_player.is_valid()) { Object *player = ObjectDB::get_instance(last_animation_player); if (player) { @@ -1770,8 +1785,43 @@ void AnimationTree::_notification(int p_what) { } } +void AnimationTree::_setup_animation_player() { + if (!is_inside_tree()) { + return; + } + + AnimationPlayer *new_player = nullptr; + if (!animation_player.is_empty()) { + new_player = Object::cast_to<AnimationPlayer>(get_node(animation_player)); + if (new_player && !new_player->is_connected("animation_list_changed", callable_mp(this, &AnimationTree::_animation_player_changed))) { + new_player->connect("animation_list_changed", callable_mp(this, &AnimationTree::_animation_player_changed)); + } + } + + if (new_player) { + if (!last_animation_player.is_valid()) { + // Animation player set newly. + emit_signal(SNAME("animation_player_changed")); + return; + } else if (last_animation_player == new_player->get_instance_id()) { + // Animation player isn't changed. + return; + } + } else if (!last_animation_player.is_valid()) { + // Animation player is being empty. + return; + } + + AnimationPlayer *old_player = Object::cast_to<AnimationPlayer>(ObjectDB::get_instance(last_animation_player)); + if (old_player && old_player->is_connected("animation_list_changed", callable_mp(this, &AnimationTree::_animation_player_changed))) { + old_player->disconnect("animation_list_changed", callable_mp(this, &AnimationTree::_animation_player_changed)); + } + emit_signal(SNAME("animation_player_changed")); +} + void AnimationTree::set_animation_player(const NodePath &p_player) { animation_player = p_player; + _setup_animation_player(); update_configuration_warnings(); } @@ -1799,8 +1849,8 @@ uint64_t AnimationTree::get_last_process_pass() const { return process_pass; } -TypedArray<String> AnimationTree::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray AnimationTree::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!root.is_valid()) { warnings.push_back(RTR("No root AnimationNode for the graph is set.")); @@ -2008,6 +2058,8 @@ void AnimationTree::_bind_methods() { BIND_ENUM_CONSTANT(ANIMATION_PROCESS_PHYSICS); BIND_ENUM_CONSTANT(ANIMATION_PROCESS_IDLE); BIND_ENUM_CONSTANT(ANIMATION_PROCESS_MANUAL); + + ADD_SIGNAL(MethodInfo("animation_player_changed")); } AnimationTree::AnimationTree() { diff --git a/scene/animation/animation_tree.h b/scene/animation/animation_tree.h index ee0c0303dc..96c1279f82 100644 --- a/scene/animation/animation_tree.h +++ b/scene/animation/animation_tree.h @@ -282,6 +282,8 @@ private: bool cache_valid = false; void _node_removed(Node *p_node); + void _setup_animation_player(); + void _animation_player_changed(); void _clear_caches(); bool _update_caches(AnimationPlayer *player); void _process_graph(double p_delta); @@ -340,7 +342,7 @@ public: void set_advance_expression_base_node(const NodePath &p_advance_expression_base_node); NodePath get_advance_expression_base_node() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; bool is_state_invalid() const; String get_invalid_state_reason() const; @@ -351,7 +353,7 @@ public: Transform3D get_root_motion_transform() const; real_t get_connection_activity(const StringName &p_path, int p_connection) const; - void advance(real_t p_time); + void advance(double p_time); void rename_parameter(const String &p_base, const String &p_new_base); diff --git a/scene/animation/easing_equations.h b/scene/animation/easing_equations.h index 094829e406..03d9e16454 100644 --- a/scene/animation/easing_equations.h +++ b/scene/animation/easing_equations.h @@ -28,6 +28,9 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ +#ifndef EASING_EQUATIONS_H +#define EASING_EQUATIONS_H + /* * Derived from Robert Penner's easing equations: http://robertpenner.com/easing/ * @@ -52,9 +55,6 @@ * SOFTWARE. */ -#ifndef EASING_EQUATIONS_H -#define EASING_EQUATIONS_H - namespace linear { static real_t in(real_t t, real_t b, real_t c, real_t d) { return c * t / d + b; diff --git a/scene/animation/tween.cpp b/scene/animation/tween.cpp index 5b18d4e457..4a0f870406 100644 --- a/scene/animation/tween.cpp +++ b/scene/animation/tween.cpp @@ -32,6 +32,7 @@ #include "scene/animation/easing_equations.h" #include "scene/main/node.h" +#include "scene/resources/animation.h" Tween::interpolater Tween::interpolaters[Tween::TRANS_MAX][Tween::EASE_MAX] = { { &linear::in, &linear::in, &linear::in, &linear::in }, // Linear is the same for each easing. @@ -70,16 +71,16 @@ void Tween::start_tweeners() { } } -Ref<PropertyTweener> Tween::tween_property(Object *p_target, NodePath p_property, Variant p_to, float p_duration) { +Ref<PropertyTweener> Tween::tween_property(Object *p_target, NodePath p_property, Variant p_to, double p_duration) { ERR_FAIL_NULL_V(p_target, nullptr); ERR_FAIL_COND_V_MSG(!valid, nullptr, "Tween invalid. Either finished or created outside scene tree."); ERR_FAIL_COND_V_MSG(started, nullptr, "Can't append to a Tween that has started. Use stop() first."); Variant::Type property_type = p_target->get_indexed(p_property.get_as_property_path().get_subnames()).get_type(); if (property_type != p_to.get_type()) { - // Cast p_to between floats and ints to avoid minor annoyances. + // Cast p_to between double and int to avoid minor annoyances. if (property_type == Variant::FLOAT && p_to.get_type() == Variant::INT) { - p_to = float(p_to); + p_to = double(p_to); } else if (property_type == Variant::INT && p_to.get_type() == Variant::FLOAT) { p_to = int(p_to); } else { @@ -92,7 +93,7 @@ Ref<PropertyTweener> Tween::tween_property(Object *p_target, NodePath p_property return tweener; } -Ref<IntervalTweener> Tween::tween_interval(float p_time) { +Ref<IntervalTweener> Tween::tween_interval(double p_time) { ERR_FAIL_COND_V_MSG(!valid, nullptr, "Tween invalid. Either finished or created outside scene tree."); ERR_FAIL_COND_V_MSG(started, nullptr, "Can't append to a Tween that has started. Use stop() first."); @@ -110,7 +111,7 @@ Ref<CallbackTweener> Tween::tween_callback(Callable p_callback) { return tweener; } -Ref<MethodTweener> Tween::tween_method(Callable p_callback, Variant p_from, Variant p_to, float p_duration) { +Ref<MethodTweener> Tween::tween_method(Callable p_callback, Variant p_from, Variant p_to, double p_duration) { ERR_FAIL_COND_V_MSG(!valid, nullptr, "Tween invalid. Either finished or created outside scene tree."); ERR_FAIL_COND_V_MSG(started, nullptr, "Can't append to a Tween that has started. Use stop() first."); @@ -244,7 +245,7 @@ Ref<Tween> Tween::chain() { return this; } -bool Tween::custom_step(float p_delta) { +bool Tween::custom_step(double p_delta) { bool r = running; running = true; bool ret = step(p_delta); @@ -252,7 +253,7 @@ bool Tween::custom_step(float p_delta) { return ret; } -bool Tween::step(float p_delta) { +bool Tween::step(double p_delta) { if (dead) { return false; } @@ -281,22 +282,22 @@ bool Tween::step(float p_delta) { started = true; } - float rem_delta = p_delta * speed_scale; + double rem_delta = p_delta * speed_scale; bool step_active = false; total_time += rem_delta; #ifdef DEBUG_ENABLED - float initial_delta = rem_delta; + double initial_delta = rem_delta; bool potential_infinite = false; #endif while (rem_delta > 0 && running) { - float step_delta = rem_delta; + double step_delta = rem_delta; step_active = false; for (Ref<Tweener> &tweener : tweeners.write[current_step]) { // Modified inside Tweener.step(). - float temp_delta = rem_delta; + double temp_delta = rem_delta; // Turns to true if any Tweener returns true (i.e. is still not finished). step_active = tweener->step(temp_delta) || step_active; step_delta = MIN(temp_delta, step_delta); @@ -314,6 +315,7 @@ bool Tween::step(float p_delta) { running = false; dead = true; emit_signal(SNAME("finished")); + break; } else { emit_signal(SNAME("loop_finished"), loops_done); current_step = 0; @@ -357,7 +359,7 @@ Node *Tween::get_bound_node() const { } } -float Tween::get_total_time() const { +double Tween::get_total_time() const { return total_time; } @@ -371,268 +373,18 @@ real_t Tween::run_equation(TransitionType p_trans_type, EaseType p_ease_type, re return func(p_time, p_initial, p_delta, p_duration); } -Variant Tween::interpolate_variant(Variant p_initial_val, Variant p_delta_val, float p_time, float p_duration, TransitionType p_trans, EaseType p_ease) { +Variant Tween::interpolate_variant(Variant p_initial_val, Variant p_delta_val, double p_time, double p_duration, TransitionType p_trans, EaseType p_ease) { ERR_FAIL_INDEX_V(p_trans, TransitionType::TRANS_MAX, Variant()); ERR_FAIL_INDEX_V(p_ease, EaseType::EASE_MAX, Variant()); -// Helper macro to run equation on sub-elements of the value (e.g. x and y of Vector2). -#define APPLY_EQUATION(element) \ - r.element = run_equation(p_trans, p_ease, p_time, i.element, d.element, p_duration); - - switch (p_initial_val.get_type()) { - case Variant::BOOL: { - return (run_equation(p_trans, p_ease, p_time, p_initial_val, p_delta_val, p_duration)) >= 0.5; - } - - case Variant::INT: { - return (int)run_equation(p_trans, p_ease, p_time, (int)p_initial_val, (int)p_delta_val, p_duration); - } - - case Variant::FLOAT: { - return run_equation(p_trans, p_ease, p_time, (real_t)p_initial_val, (real_t)p_delta_val, p_duration); - } - - case Variant::VECTOR2: { - Vector2 i = p_initial_val; - Vector2 d = p_delta_val; - Vector2 r; - - APPLY_EQUATION(x); - APPLY_EQUATION(y); - return r; - } - - case Variant::VECTOR2I: { - Vector2i i = p_initial_val; - Vector2i d = p_delta_val; - Vector2i r; - - APPLY_EQUATION(x); - APPLY_EQUATION(y); - return r; - } - - case Variant::RECT2: { - Rect2 i = p_initial_val; - Rect2 d = p_delta_val; - Rect2 r; - - APPLY_EQUATION(position.x); - APPLY_EQUATION(position.y); - APPLY_EQUATION(size.x); - APPLY_EQUATION(size.y); - return r; - } - - case Variant::RECT2I: { - Rect2i i = p_initial_val; - Rect2i d = p_delta_val; - Rect2i r; - - APPLY_EQUATION(position.x); - APPLY_EQUATION(position.y); - APPLY_EQUATION(size.x); - APPLY_EQUATION(size.y); - return r; - } - - case Variant::VECTOR3: { - Vector3 i = p_initial_val; - Vector3 d = p_delta_val; - Vector3 r; - - APPLY_EQUATION(x); - APPLY_EQUATION(y); - APPLY_EQUATION(z); - return r; - } - - case Variant::VECTOR3I: { - Vector3i i = p_initial_val; - Vector3i d = p_delta_val; - Vector3i r; - - APPLY_EQUATION(x); - APPLY_EQUATION(y); - APPLY_EQUATION(z); - return r; - } - - case Variant::TRANSFORM2D: { - Transform2D i = p_initial_val; - Transform2D d = p_delta_val; - Transform2D r; - - APPLY_EQUATION(columns[0][0]); - APPLY_EQUATION(columns[0][1]); - APPLY_EQUATION(columns[1][0]); - APPLY_EQUATION(columns[1][1]); - APPLY_EQUATION(columns[2][0]); - APPLY_EQUATION(columns[2][1]); - return r; - } - case Variant::VECTOR4: { - Vector4 i = p_initial_val; - Vector4 d = p_delta_val; - Vector4 r; - - APPLY_EQUATION(x); - APPLY_EQUATION(y); - APPLY_EQUATION(z); - APPLY_EQUATION(w); - return r; - } - - case Variant::QUATERNION: { - Quaternion i = p_initial_val; - Quaternion d = p_delta_val; - Quaternion r = i * d; - r = i.slerp(r, run_equation(p_trans, p_ease, p_time, 0.0, 1.0, p_duration)); - return r; - } - - case Variant::AABB: { - AABB i = p_initial_val; - AABB d = p_delta_val; - AABB r; - - APPLY_EQUATION(position.x); - APPLY_EQUATION(position.y); - APPLY_EQUATION(position.z); - APPLY_EQUATION(size.x); - APPLY_EQUATION(size.y); - APPLY_EQUATION(size.z); - return r; - } - - case Variant::BASIS: { - Basis i = p_initial_val; - Basis d = p_delta_val; - Basis r; - - APPLY_EQUATION(rows[0][0]); - APPLY_EQUATION(rows[0][1]); - APPLY_EQUATION(rows[0][2]); - APPLY_EQUATION(rows[1][0]); - APPLY_EQUATION(rows[1][1]); - APPLY_EQUATION(rows[1][2]); - APPLY_EQUATION(rows[2][0]); - APPLY_EQUATION(rows[2][1]); - APPLY_EQUATION(rows[2][2]); - return r; - } - - case Variant::TRANSFORM3D: { - Transform3D i = p_initial_val; - Transform3D d = p_delta_val; - Transform3D r; - - APPLY_EQUATION(basis.rows[0][0]); - APPLY_EQUATION(basis.rows[0][1]); - APPLY_EQUATION(basis.rows[0][2]); - APPLY_EQUATION(basis.rows[1][0]); - APPLY_EQUATION(basis.rows[1][1]); - APPLY_EQUATION(basis.rows[1][2]); - APPLY_EQUATION(basis.rows[2][0]); - APPLY_EQUATION(basis.rows[2][1]); - APPLY_EQUATION(basis.rows[2][2]); - APPLY_EQUATION(origin.x); - APPLY_EQUATION(origin.y); - APPLY_EQUATION(origin.z); - return r; - } - - case Variant::COLOR: { - Color i = p_initial_val; - Color d = p_delta_val; - Color r; - - APPLY_EQUATION(r); - APPLY_EQUATION(g); - APPLY_EQUATION(b); - APPLY_EQUATION(a); - return r; - } - - default: { - return p_initial_val; - } - }; -#undef APPLY_EQUATION -} - -Variant Tween::calculate_delta_value(Variant p_intial_val, Variant p_final_val) { - ERR_FAIL_COND_V_MSG(p_intial_val.get_type() != p_final_val.get_type(), p_intial_val, "Type mismatch between initial and final value: " + Variant::get_type_name(p_intial_val.get_type()) + " and " + Variant::get_type_name(p_final_val.get_type())); - - switch (p_intial_val.get_type()) { - case Variant::BOOL: { - return (int)p_final_val - (int)p_intial_val; - } - - case Variant::RECT2: { - Rect2 i = p_intial_val; - Rect2 f = p_final_val; - return Rect2(f.position - i.position, f.size - i.size); - } - - case Variant::RECT2I: { - Rect2i i = p_intial_val; - Rect2i f = p_final_val; - return Rect2i(f.position - i.position, f.size - i.size); - } - - case Variant::TRANSFORM2D: { - Transform2D i = p_intial_val; - Transform2D f = p_final_val; - return Transform2D(f.columns[0][0] - i.columns[0][0], - f.columns[0][1] - i.columns[0][1], - f.columns[1][0] - i.columns[1][0], - f.columns[1][1] - i.columns[1][1], - f.columns[2][0] - i.columns[2][0], - f.columns[2][1] - i.columns[2][1]); - } - - case Variant::AABB: { - AABB i = p_intial_val; - AABB f = p_final_val; - return AABB(f.position - i.position, f.size - i.size); - } - - case Variant::BASIS: { - Basis i = p_intial_val; - Basis f = p_final_val; - return Basis(f.rows[0][0] - i.rows[0][0], - f.rows[0][1] - i.rows[0][1], - f.rows[0][2] - i.rows[0][2], - f.rows[1][0] - i.rows[1][0], - f.rows[1][1] - i.rows[1][1], - f.rows[1][2] - i.rows[1][2], - f.rows[2][0] - i.rows[2][0], - f.rows[2][1] - i.rows[2][1], - f.rows[2][2] - i.rows[2][2]); - } - - case Variant::TRANSFORM3D: { - Transform3D i = p_intial_val; - Transform3D f = p_final_val; - return Transform3D(f.basis.rows[0][0] - i.basis.rows[0][0], - f.basis.rows[0][1] - i.basis.rows[0][1], - f.basis.rows[0][2] - i.basis.rows[0][2], - f.basis.rows[1][0] - i.basis.rows[1][0], - f.basis.rows[1][1] - i.basis.rows[1][1], - f.basis.rows[1][2] - i.basis.rows[1][2], - f.basis.rows[2][0] - i.basis.rows[2][0], - f.basis.rows[2][1] - i.basis.rows[2][1], - f.basis.rows[2][2] - i.basis.rows[2][2], - f.origin.x - i.origin.x, - f.origin.y - i.origin.y, - f.origin.z - i.origin.z); - } + // Special case for bool. + if (p_initial_val.get_type() == Variant::BOOL) { + return run_equation(p_trans, p_ease, p_time, p_initial_val, p_delta_val, p_duration) >= 0.5; + } - default: { - return Variant::evaluate(Variant::OP_SUBTRACT, p_final_val, p_intial_val); - } - }; + Variant ret = Animation::add_variant(p_initial_val, p_delta_val); + ret = Animation::interpolate_variant(p_initial_val, ret, run_equation(p_trans, p_ease, p_time, 0.0, 1.0, p_duration)); + return ret; } void Tween::_bind_methods() { @@ -728,7 +480,7 @@ Ref<PropertyTweener> PropertyTweener::set_ease(Tween::EaseType p_ease) { return this; } -Ref<PropertyTweener> PropertyTweener::set_delay(float p_delay) { +Ref<PropertyTweener> PropertyTweener::set_delay(double p_delay) { delay = p_delay; return this; } @@ -748,13 +500,13 @@ void PropertyTweener::start() { } if (relative) { - final_val = Variant::evaluate(Variant::Operator::OP_ADD, initial_val, base_final_val); + final_val = Animation::add_variant(initial_val, base_final_val); } - delta_val = tween->calculate_delta_value(initial_val, final_val); + delta_val = Animation::subtract_variant(final_val, initial_val); } -bool PropertyTweener::step(float &r_delta) { +bool PropertyTweener::step(double &r_delta) { if (finished) { // This is needed in case there's a parallel Tweener with longer duration. return false; @@ -771,7 +523,7 @@ bool PropertyTweener::step(float &r_delta) { return true; } - float time = MIN(elapsed_time - delay, duration); + double time = MIN(elapsed_time - delay, duration); if (time < duration) { target_instance->set_indexed(property, tween->interpolate_variant(initial_val, delta_val, time, duration, trans_type, ease_type)); r_delta = 0; @@ -804,7 +556,7 @@ void PropertyTweener::_bind_methods() { ClassDB::bind_method(D_METHOD("set_delay", "delay"), &PropertyTweener::set_delay); } -PropertyTweener::PropertyTweener(Object *p_target, NodePath p_property, Variant p_to, float p_duration) { +PropertyTweener::PropertyTweener(Object *p_target, NodePath p_property, Variant p_to, double p_duration) { target = p_target->get_instance_id(); property = p_property.get_as_property_path().get_subnames(); initial_val = p_target->get_indexed(property); @@ -822,7 +574,7 @@ void IntervalTweener::start() { finished = false; } -bool IntervalTweener::step(float &r_delta) { +bool IntervalTweener::step(double &r_delta) { if (finished) { return false; } @@ -840,7 +592,7 @@ bool IntervalTweener::step(float &r_delta) { } } -IntervalTweener::IntervalTweener(float p_time) { +IntervalTweener::IntervalTweener(double p_time) { duration = p_time; } @@ -848,7 +600,7 @@ IntervalTweener::IntervalTweener() { ERR_FAIL_MSG("Can't create empty IntervalTweener. Use get_tree().tween_interval() instead."); } -Ref<CallbackTweener> CallbackTweener::set_delay(float p_delay) { +Ref<CallbackTweener> CallbackTweener::set_delay(double p_delay) { delay = p_delay; return this; } @@ -858,7 +610,7 @@ void CallbackTweener::start() { finished = false; } -bool CallbackTweener::step(float &r_delta) { +bool CallbackTweener::step(double &r_delta) { if (finished) { return false; } @@ -894,7 +646,7 @@ CallbackTweener::CallbackTweener() { ERR_FAIL_MSG("Can't create empty CallbackTweener. Use get_tree().tween_callback() instead."); } -Ref<MethodTweener> MethodTweener::set_delay(float p_delay) { +Ref<MethodTweener> MethodTweener::set_delay(double p_delay) { delay = p_delay; return this; } @@ -914,7 +666,7 @@ void MethodTweener::start() { finished = false; } -bool MethodTweener::step(float &r_delta) { +bool MethodTweener::step(double &r_delta) { if (finished) { return false; } @@ -927,7 +679,7 @@ bool MethodTweener::step(float &r_delta) { } Variant current_val; - float time = MIN(elapsed_time - delay, duration); + double time = MIN(elapsed_time - delay, duration); if (time < duration) { current_val = tween->interpolate_variant(initial_val, delta_val, time, duration, trans_type, ease_type); } else { @@ -970,10 +722,10 @@ void MethodTweener::_bind_methods() { ClassDB::bind_method(D_METHOD("set_ease", "ease"), &MethodTweener::set_ease); } -MethodTweener::MethodTweener(Callable p_callback, Variant p_from, Variant p_to, float p_duration) { +MethodTweener::MethodTweener(Callable p_callback, Variant p_from, Variant p_to, double p_duration) { callback = p_callback; initial_val = p_from; - delta_val = tween->calculate_delta_value(p_from, p_to); + delta_val = Animation::subtract_variant(p_to, p_from); final_val = p_to; duration = p_duration; } diff --git a/scene/animation/tween.h b/scene/animation/tween.h index b57ec2e5e7..345974ecc5 100644 --- a/scene/animation/tween.h +++ b/scene/animation/tween.h @@ -42,13 +42,13 @@ class Tweener : public RefCounted { public: virtual void set_tween(Ref<Tween> p_tween); virtual void start() = 0; - virtual bool step(float &r_delta) = 0; + virtual bool step(double &r_delta) = 0; void clear_tween(); protected: static void _bind_methods(); Ref<Tween> tween; - float elapsed_time = 0; + double elapsed_time = 0; bool finished = false; }; @@ -103,7 +103,7 @@ private: ObjectID bound_node; Vector<List<Ref<Tweener>>> tweeners; - float total_time = 0; + double total_time = 0; int current_step = -1; int loops = 1; int loops_done = 0; @@ -129,13 +129,13 @@ protected: static void _bind_methods(); public: - Ref<PropertyTweener> tween_property(Object *p_target, NodePath p_property, Variant p_to, float p_duration); - Ref<IntervalTweener> tween_interval(float p_time); + Ref<PropertyTweener> tween_property(Object *p_target, NodePath p_property, Variant p_to, double p_duration); + Ref<IntervalTweener> tween_interval(double p_time); Ref<CallbackTweener> tween_callback(Callable p_callback); - Ref<MethodTweener> tween_method(Callable p_callback, Variant p_from, Variant p_to, float p_duration); + Ref<MethodTweener> tween_method(Callable p_callback, Variant p_from, Variant p_to, double p_duration); void append(Ref<Tweener> p_tweener); - bool custom_step(float p_delta); + bool custom_step(double p_delta); void stop(); void pause(); void play(); @@ -163,13 +163,12 @@ public: Ref<Tween> chain(); static real_t run_equation(TransitionType p_trans_type, EaseType p_ease_type, real_t t, real_t b, real_t c, real_t d); - static Variant interpolate_variant(Variant p_initial_val, Variant p_delta_val, float p_time, float p_duration, Tween::TransitionType p_trans, Tween::EaseType p_ease); - Variant calculate_delta_value(Variant p_intial_val, Variant p_final_val); + static Variant interpolate_variant(Variant p_initial_val, Variant p_delta_val, double p_time, double p_duration, Tween::TransitionType p_trans, Tween::EaseType p_ease); - bool step(float p_delta); + bool step(double p_delta); bool can_process(bool p_tree_paused) const; Node *get_bound_node() const; - float get_total_time() const; + double get_total_time() const; Tween(); Tween(bool p_valid); @@ -189,13 +188,13 @@ public: Ref<PropertyTweener> as_relative(); Ref<PropertyTweener> set_trans(Tween::TransitionType p_trans); Ref<PropertyTweener> set_ease(Tween::EaseType p_ease); - Ref<PropertyTweener> set_delay(float p_delay); + Ref<PropertyTweener> set_delay(double p_delay); void set_tween(Ref<Tween> p_tween) override; void start() override; - bool step(float &r_delta) override; + bool step(double &r_delta) override; - PropertyTweener(Object *p_target, NodePath p_property, Variant p_to, float p_duration); + PropertyTweener(Object *p_target, NodePath p_property, Variant p_to, double p_duration); PropertyTweener(); protected: @@ -209,11 +208,11 @@ private: Variant final_val; Variant delta_val; - float duration = 0; + double duration = 0; Tween::TransitionType trans_type = Tween::TRANS_MAX; // This is set inside set_tween(); Tween::EaseType ease_type = Tween::EASE_MAX; - float delay = 0; + double delay = 0; bool do_continue = true; bool relative = false; }; @@ -223,23 +222,23 @@ class IntervalTweener : public Tweener { public: void start() override; - bool step(float &r_delta) override; + bool step(double &r_delta) override; - IntervalTweener(float p_time); + IntervalTweener(double p_time); IntervalTweener(); private: - float duration = 0; + double duration = 0; }; class CallbackTweener : public Tweener { GDCLASS(CallbackTweener, Tweener); public: - Ref<CallbackTweener> set_delay(float p_delay); + Ref<CallbackTweener> set_delay(double p_delay); void start() override; - bool step(float &r_delta) override; + bool step(double &r_delta) override; CallbackTweener(Callable p_callback); CallbackTweener(); @@ -249,7 +248,7 @@ protected: private: Callable callback; - float delay = 0; + double delay = 0; }; class MethodTweener : public Tweener { @@ -258,21 +257,21 @@ class MethodTweener : public Tweener { public: Ref<MethodTweener> set_trans(Tween::TransitionType p_trans); Ref<MethodTweener> set_ease(Tween::EaseType p_ease); - Ref<MethodTweener> set_delay(float p_delay); + Ref<MethodTweener> set_delay(double p_delay); void set_tween(Ref<Tween> p_tween) override; void start() override; - bool step(float &r_delta) override; + bool step(double &r_delta) override; - MethodTweener(Callable p_callback, Variant p_from, Variant p_to, float p_duration); + MethodTweener(Callable p_callback, Variant p_from, Variant p_to, double p_duration); MethodTweener(); protected: static void _bind_methods(); private: - float duration = 0; - float delay = 0; + double duration = 0; + double delay = 0; Tween::TransitionType trans_type = Tween::TRANS_MAX; Tween::EaseType ease_type = Tween::EASE_MAX; diff --git a/scene/gui/base_button.cpp b/scene/gui/base_button.cpp index cf467ceafb..af6a99ca62 100644 --- a/scene/gui/base_button.cpp +++ b/scene/gui/base_button.cpp @@ -264,7 +264,7 @@ bool BaseButton::is_hovered() const { BaseButton::DrawMode BaseButton::get_draw_mode() const { if (status.disabled) { return DRAW_DISABLED; - }; + } if (!status.press_attempt && status.hovering) { if (status.pressed) { @@ -273,8 +273,7 @@ BaseButton::DrawMode BaseButton::get_draw_mode() const { return DRAW_HOVER; } else { - /* determine if pressed or not */ - + // Determine if pressed or not. bool pressing; if (status.press_attempt) { pressing = (status.pressing_inside || keep_pressed_outside); @@ -291,8 +290,6 @@ BaseButton::DrawMode BaseButton::get_draw_mode() const { return DRAW_NORMAL; } } - - return DRAW_NORMAL; } void BaseButton::set_toggle_mode(bool p_on) { @@ -469,7 +466,7 @@ void BaseButton::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "keep_pressed_outside"), "set_keep_pressed_outside", "is_keep_pressed_outside"); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "shortcut", PROPERTY_HINT_RESOURCE_TYPE, "Shortcut"), "set_shortcut", "get_shortcut"); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "button_group", PROPERTY_HINT_RESOURCE_TYPE, "ButtonGroup"), "set_button_group", "get_button_group"); - ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "shortcut_context", PROPERTY_HINT_RESOURCE_TYPE, "Node"), "set_shortcut_context", "get_shortcut_context"); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "shortcut_context", PROPERTY_HINT_NODE_TYPE, "Node"), "set_shortcut_context", "get_shortcut_context"); BIND_ENUM_CONSTANT(DRAW_NORMAL); BIND_ENUM_CONSTANT(DRAW_PRESSED); diff --git a/scene/gui/code_edit.cpp b/scene/gui/code_edit.cpp index f6e0e4216d..8069ab465b 100644 --- a/scene/gui/code_edit.cpp +++ b/scene/gui/code_edit.cpp @@ -1216,30 +1216,39 @@ bool CodeEdit::is_drawing_executing_lines_gutter() const { } void CodeEdit::_main_gutter_draw_callback(int p_line, int p_gutter, const Rect2 &p_region) { + bool shift_pressed = Input::get_singleton()->is_key_pressed(Key::SHIFT); + if (draw_breakpoints && breakpoint_icon.is_valid()) { bool hovering = p_region.has_point(get_local_mouse_pos()); bool breakpointed = is_line_breakpointed(p_line); - if (breakpointed || (hovering && !is_dragging_cursor())) { + if (breakpointed || (hovering && !is_dragging_cursor() && !shift_pressed)) { int padding = p_region.size.x / 6; Rect2 icon_region = p_region; icon_region.position += Point2(padding, padding); icon_region.size -= Point2(padding, padding) * 2; - // Darken icon when hovering & not yet breakpointed. - Color use_color = hovering && !breakpointed ? breakpoint_color.darkened(0.4) : breakpoint_color; + // Darken icon when hovering, shift not pressed & not yet breakpointed. + Color use_color = hovering && !breakpointed && !shift_pressed ? breakpoint_color.darkened(0.4) : breakpoint_color; breakpoint_icon->draw_rect(get_canvas_item(), icon_region, false, use_color); } } - if (draw_bookmarks && is_line_bookmarked(p_line) && bookmark_icon.is_valid()) { - int horizontal_padding = p_region.size.x / 2; - int vertical_padding = p_region.size.y / 4; + if (draw_bookmarks && bookmark_icon.is_valid()) { + bool hovering = p_region.has_point(get_local_mouse_pos()); + bool bookmarked = is_line_bookmarked(p_line); - Rect2 bookmark_region = p_region; - bookmark_region.position += Point2(horizontal_padding, 0); - bookmark_region.size -= Point2(horizontal_padding * 1.1, vertical_padding); - bookmark_icon->draw_rect(get_canvas_item(), bookmark_region, false, bookmark_color); + if (bookmarked || (hovering && !is_dragging_cursor() && shift_pressed)) { + int horizontal_padding = p_region.size.x / 2; + int vertical_padding = p_region.size.y / 4; + Rect2 icon_region = p_region; + icon_region.position += Point2(horizontal_padding, 0); + icon_region.size -= Point2(horizontal_padding * 1.1, vertical_padding); + + // Darken icon when hovering, shift pressed & not yet bookmarked. + Color use_color = hovering && !bookmarked && shift_pressed ? bookmark_color.darkened(0.4) : bookmark_color; + bookmark_icon->draw_rect(get_canvas_item(), icon_region, false, use_color); + } } if (draw_executing_lines && is_line_executing(p_line) && executing_line_icon.is_valid()) { @@ -2378,9 +2387,13 @@ int CodeEdit::_get_auto_brace_pair_close_at_pos(int p_line, int p_col) { /* Gutters */ void CodeEdit::_gutter_clicked(int p_line, int p_gutter) { + bool shift_pressed = Input::get_singleton()->is_key_pressed(Key::SHIFT); + if (p_gutter == main_gutter) { - if (draw_breakpoints) { + if (draw_breakpoints && !shift_pressed) { set_line_as_breakpoint(p_line, !is_line_breakpointed(p_line)); + } else if (draw_bookmarks && shift_pressed) { + set_line_as_bookmarked(p_line, !is_line_bookmarked(p_line)); } return; } diff --git a/scene/gui/color_picker.cpp b/scene/gui/color_picker.cpp index 4a1f2ab7c6..5751c54877 100644 --- a/scene/gui/color_picker.cpp +++ b/scene/gui/color_picker.cpp @@ -427,12 +427,15 @@ void ColorPicker::_html_submitted(const String &p_html) { return; } - float last_alpha = color.a; + Color previous_color = color; color = Color::html(p_html); if (!is_editing_alpha()) { - color.a = last_alpha; + color.a = previous_color.a; } + if (color == previous_color) { + return; + } if (!is_inside_tree()) { return; } diff --git a/scene/gui/container.cpp b/scene/gui/container.cpp index 5512c0f1fd..3c29c37479 100644 --- a/scene/gui/container.cpp +++ b/scene/gui/container.cpp @@ -192,8 +192,8 @@ void Container::_notification(int p_what) { } } -TypedArray<String> Container::get_configuration_warnings() const { - TypedArray<String> warnings = Control::get_configuration_warnings(); +PackedStringArray Container::get_configuration_warnings() const { + PackedStringArray warnings = Control::get_configuration_warnings(); if (get_class() == "Container" && get_script().is_null()) { warnings.push_back(RTR("Container by itself serves no purpose unless a script configures its children placement behavior.\nIf you don't intend to add a script, use a plain Control node instead.")); diff --git a/scene/gui/container.h b/scene/gui/container.h index 9ec4ad3200..21bdb95186 100644 --- a/scene/gui/container.h +++ b/scene/gui/container.h @@ -63,7 +63,7 @@ public: virtual Vector<int> get_allowed_size_flags_horizontal() const; virtual Vector<int> get_allowed_size_flags_vertical() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; Container(); }; diff --git a/scene/gui/control.cpp b/scene/gui/control.cpp index b4e603d5ed..dc9294df6d 100644 --- a/scene/gui/control.cpp +++ b/scene/gui/control.cpp @@ -213,8 +213,8 @@ void Control::get_argument_options(const StringName &p_function, int p_idx, List } } -TypedArray<String> Control::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray Control::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (data.mouse_filter == MOUSE_FILTER_IGNORE && !data.tooltip.is_empty()) { warnings.push_back(RTR("The Hint Tooltip won't be displayed as the control's Mouse Filter is set to \"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\".")); @@ -1564,7 +1564,7 @@ Size2 Control::get_minimum_size() const { return Vector2(); } -void Control::set_custom_minimum_size(const Size2 &p_custom) { +void Control::set_custom_minimum_size(const Size2i &p_custom) { if (p_custom == data.custom_minimum_size) { return; } @@ -1572,7 +1572,7 @@ void Control::set_custom_minimum_size(const Size2 &p_custom) { update_minimum_size(); } -Size2 Control::get_custom_minimum_size() const { +Size2i Control::get_custom_minimum_size() const { return data.custom_minimum_size; } @@ -2225,7 +2225,19 @@ void Control::_window_find_focus_neighbor(const Vector2 &p_dir, Node *p_at, cons void Control::set_default_cursor_shape(CursorShape p_shape) { ERR_FAIL_INDEX(int(p_shape), CURSOR_MAX); + if (data.default_cursor == p_shape) { + return; + } data.default_cursor = p_shape; + + if (!is_inside_tree()) { + return; + } + if (!get_global_rect().has_point(get_global_mouse_position())) { + return; + } + + get_viewport()->get_base_window()->update_mouse_cursor_shape(); } Control::CursorShape Control::get_default_cursor_shape() const { @@ -3132,7 +3144,7 @@ void Control::_bind_methods() { ADD_GROUP("Layout", ""); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "clip_contents"), "set_clip_contents", "is_clipping_contents"); - ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "custom_minimum_size", PROPERTY_HINT_NONE, "suffix:px"), "set_custom_minimum_size", "get_custom_minimum_size"); + ADD_PROPERTY(PropertyInfo(Variant::VECTOR2I, "custom_minimum_size", PROPERTY_HINT_NONE, "suffix:px"), "set_custom_minimum_size", "get_custom_minimum_size"); ADD_PROPERTY(PropertyInfo(Variant::INT, "layout_direction", PROPERTY_HINT_ENUM, "Inherited,Locale,Left-to-Right,Right-to-Left"), "set_layout_direction", "get_layout_direction"); ADD_PROPERTY(PropertyInfo(Variant::INT, "layout_mode", PROPERTY_HINT_ENUM, "Position,Anchors,Container,Uncontrolled", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_INTERNAL), "_set_layout_mode", "_get_layout_mode"); ADD_PROPERTY_DEFAULT("layout_mode", LayoutMode::LAYOUT_MODE_POSITION); diff --git a/scene/gui/control.h b/scene/gui/control.h index 3fb1494d66..ee6443c81c 100644 --- a/scene/gui/control.h +++ b/scene/gui/control.h @@ -200,7 +200,7 @@ private: int h_size_flags = SIZE_FILL; int v_size_flags = SIZE_FILL; real_t expand = 1.0; - Point2 custom_minimum_size; + Point2i custom_minimum_size; // Input events and rendering. @@ -387,7 +387,7 @@ public: // Editor integration. virtual void get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const override; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; virtual bool is_text_field() const; @@ -460,8 +460,8 @@ public: virtual Size2 get_minimum_size() const; virtual Size2 get_combined_minimum_size() const; - void set_custom_minimum_size(const Size2 &p_custom); - Size2 get_custom_minimum_size() const; + void set_custom_minimum_size(const Size2i &p_custom); + Size2i get_custom_minimum_size() const; // Container sizing. diff --git a/scene/gui/file_dialog.cpp b/scene/gui/file_dialog.cpp index 57f27e299f..cf7f439aef 100644 --- a/scene/gui/file_dialog.cpp +++ b/scene/gui/file_dialog.cpp @@ -172,18 +172,20 @@ void FileDialog::shortcut_input(const Ref<InputEvent> &p_event) { void FileDialog::set_enable_multiple_selection(bool p_enable) { tree->set_select_mode(p_enable ? Tree::SELECT_MULTI : Tree::SELECT_SINGLE); -}; +} Vector<String> FileDialog::get_selected_files() const { Vector<String> list; TreeItem *item = tree->get_root(); - while ((item = tree->get_next_selected(item))) { + item = tree->get_next_selected(item); + while (item) { list.push_back(dir_access->get_current_dir().path_join(item->get_text(0))); - }; + item = tree->get_next_selected(item); + } return list; -}; +} void FileDialog::update_dir() { if (root_prefix.is_empty()) { diff --git a/scene/gui/graph_edit.cpp b/scene/gui/graph_edit.cpp index c8de8789fe..7295ab9e9d 100644 --- a/scene/gui/graph_edit.cpp +++ b/scene/gui/graph_edit.cpp @@ -190,6 +190,14 @@ void GraphEditMinimap::_adjust_graph_scroll(const Vector2 &p_offset) { ge->set_scroll_ofs(p_offset + graph_offset - camera_size / 2); } +PackedStringArray GraphEdit::get_configuration_warnings() const { + PackedStringArray warnings = Control::get_configuration_warnings(); + + warnings.push_back(RTR("Please be aware that GraphEdit and GraphNode will undergo extensive refactoring in a future beta version involving compatibility-breaking API changes.")); + + return warnings; +} + Error GraphEdit::connect_node(const StringName &p_from, int p_from_port, const StringName &p_to, int p_to_port) { if (is_node_connected(p_from, p_from_port, p_to, p_to_port)) { return OK; @@ -773,25 +781,25 @@ void GraphEdit::_top_layer_input(const Ref<InputEvent> &p_ev) { if (connecting_valid) { if (connecting && connecting_target) { String from = connecting_from; - int from_slot = connecting_index; + int from_port = connecting_index; String to = connecting_target_to; - int to_slot = connecting_target_index; + int to_port = connecting_target_index; if (!connecting_out) { SWAP(from, to); - SWAP(from_slot, to_slot); + SWAP(from_port, to_port); } - emit_signal(SNAME("connection_request"), from, from_slot, to, to_slot); + emit_signal(SNAME("connection_request"), from, from_port, to, to_port); } else if (!just_disconnected) { String from = connecting_from; - int from_slot = connecting_index; + int from_port = connecting_index; Vector2 ofs = mb->get_position(); if (!connecting_out) { - emit_signal(SNAME("connection_from_empty"), from, from_slot, ofs); + emit_signal(SNAME("connection_from_empty"), from, from_port, ofs); } else { - emit_signal(SNAME("connection_to_empty"), from, from_slot, ofs); + emit_signal(SNAME("connection_to_empty"), from, from_port, ofs); } } } @@ -830,22 +838,22 @@ bool GraphEdit::_check_clickable_control(Control *p_control, const Vector2 &mpos } } -bool GraphEdit::is_in_input_hotzone(GraphNode *p_graph_node, int p_slot_index, const Vector2 &p_mouse_pos, const Vector2i &p_port_size) { +bool GraphEdit::is_in_input_hotzone(GraphNode *p_node, int p_port, const Vector2 &p_mouse_pos, const Vector2i &p_port_size) { bool success; - if (GDVIRTUAL_CALL(_is_in_input_hotzone, p_graph_node, p_slot_index, p_mouse_pos, success)) { + if (GDVIRTUAL_CALL(_is_in_input_hotzone, p_node, p_port, p_mouse_pos, success)) { return success; } else { - Vector2 pos = p_graph_node->get_connection_input_position(p_slot_index) + p_graph_node->get_position(); + Vector2 pos = p_node->get_connection_input_position(p_port) + p_node->get_position(); return is_in_port_hotzone(pos / zoom, p_mouse_pos, p_port_size, true); } } -bool GraphEdit::is_in_output_hotzone(GraphNode *p_graph_node, int p_slot_index, const Vector2 &p_mouse_pos, const Vector2i &p_port_size) { +bool GraphEdit::is_in_output_hotzone(GraphNode *p_node, int p_port, const Vector2 &p_mouse_pos, const Vector2i &p_port_size) { bool success; - if (GDVIRTUAL_CALL(_is_in_output_hotzone, p_graph_node, p_slot_index, p_mouse_pos, success)) { + if (GDVIRTUAL_CALL(_is_in_output_hotzone, p_node, p_port, p_mouse_pos, success)) { return success; } else { - Vector2 pos = p_graph_node->get_connection_output_position(p_slot_index) + p_graph_node->get_position(); + Vector2 pos = p_node->get_connection_output_position(p_port) + p_node->get_position(); return is_in_port_hotzone(pos / zoom, p_mouse_pos, p_port_size, false); } } @@ -1100,11 +1108,11 @@ void GraphEdit::_minimap_draw() { continue; } - Vector2 from_slot_position = gfrom->get_position_offset() * zoom + gfrom->get_connection_output_position(E.from_port); - Vector2 from_position = minimap->_convert_from_graph_position(from_slot_position - graph_offset) + minimap_offset; + Vector2 from_port_position = gfrom->get_position_offset() * zoom + gfrom->get_connection_output_position(E.from_port); + Vector2 from_position = minimap->_convert_from_graph_position(from_port_position - graph_offset) + minimap_offset; Color from_color = gfrom->get_connection_output_color(E.from_port); - Vector2 to_slot_position = gto->get_position_offset() * zoom + gto->get_connection_input_position(E.to_port); - Vector2 to_position = minimap->_convert_from_graph_position(to_slot_position - graph_offset) + minimap_offset; + Vector2 to_port_position = gto->get_position_offset() * zoom + gto->get_connection_input_position(E.to_port); + Vector2 to_position = minimap->_convert_from_graph_position(to_port_position - graph_offset) + minimap_offset; Color to_color = gto->get_connection_input_color(E.to_port); if (E.activity > 0) { @@ -2303,10 +2311,10 @@ void GraphEdit::arrange_nodes() { } void GraphEdit::_bind_methods() { - ClassDB::bind_method(D_METHOD("connect_node", "from", "from_port", "to", "to_port"), &GraphEdit::connect_node); - ClassDB::bind_method(D_METHOD("is_node_connected", "from", "from_port", "to", "to_port"), &GraphEdit::is_node_connected); - ClassDB::bind_method(D_METHOD("disconnect_node", "from", "from_port", "to", "to_port"), &GraphEdit::disconnect_node); - ClassDB::bind_method(D_METHOD("set_connection_activity", "from", "from_port", "to", "to_port", "amount"), &GraphEdit::set_connection_activity); + ClassDB::bind_method(D_METHOD("connect_node", "from_node", "from_port", "to_node", "to_port"), &GraphEdit::connect_node); + ClassDB::bind_method(D_METHOD("is_node_connected", "from_node", "from_port", "to_node", "to_port"), &GraphEdit::is_node_connected); + ClassDB::bind_method(D_METHOD("disconnect_node", "from_node", "from_port", "to_node", "to_port"), &GraphEdit::disconnect_node); + ClassDB::bind_method(D_METHOD("set_connection_activity", "from_node", "from_port", "to_node", "to_port", "amount"), &GraphEdit::set_connection_activity); ClassDB::bind_method(D_METHOD("get_connection_list"), &GraphEdit::_get_connection_list); ClassDB::bind_method(D_METHOD("clear_connections"), &GraphEdit::clear_connections); ClassDB::bind_method(D_METHOD("force_connection_drag_end"), &GraphEdit::force_connection_drag_end); @@ -2320,7 +2328,7 @@ void GraphEdit::_bind_methods() { ClassDB::bind_method(D_METHOD("add_valid_connection_type", "from_type", "to_type"), &GraphEdit::add_valid_connection_type); ClassDB::bind_method(D_METHOD("remove_valid_connection_type", "from_type", "to_type"), &GraphEdit::remove_valid_connection_type); ClassDB::bind_method(D_METHOD("is_valid_connection_type", "from_type", "to_type"), &GraphEdit::is_valid_connection_type); - ClassDB::bind_method(D_METHOD("get_connection_line", "from", "to"), &GraphEdit::get_connection_line); + ClassDB::bind_method(D_METHOD("get_connection_line", "from_node", "to_node"), &GraphEdit::get_connection_line); ClassDB::bind_method(D_METHOD("set_panning_scheme", "scheme"), &GraphEdit::set_panning_scheme); ClassDB::bind_method(D_METHOD("get_panning_scheme"), &GraphEdit::get_panning_scheme); @@ -2370,8 +2378,8 @@ void GraphEdit::_bind_methods() { ClassDB::bind_method(D_METHOD("is_right_disconnects_enabled"), &GraphEdit::is_right_disconnects_enabled); ClassDB::bind_method(D_METHOD("_update_scroll_offset"), &GraphEdit::_update_scroll_offset); - GDVIRTUAL_BIND(_is_in_input_hotzone, "graph_node", "slot_index", "mouse_position"); - GDVIRTUAL_BIND(_is_in_output_hotzone, "graph_node", "slot_index", "mouse_position"); + GDVIRTUAL_BIND(_is_in_input_hotzone, "in_node", "in_port", "mouse_position"); + GDVIRTUAL_BIND(_is_in_output_hotzone, "in_node", "in_port", "mouse_position"); ClassDB::bind_method(D_METHOD("get_zoom_hbox"), &GraphEdit::get_zoom_hbox); @@ -2379,8 +2387,8 @@ void GraphEdit::_bind_methods() { ClassDB::bind_method(D_METHOD("set_selected", "node"), &GraphEdit::set_selected); - GDVIRTUAL_BIND(_get_connection_line, "from", "to") - GDVIRTUAL_BIND(_is_node_hover_valid, "from", "from_slot", "to", "to_slot"); + GDVIRTUAL_BIND(_get_connection_line, "from_position", "to_position") + GDVIRTUAL_BIND(_is_node_hover_valid, "from_node", "from_port", "to_node", "to_port"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "right_disconnects"), "set_right_disconnects", "is_right_disconnects_enabled"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "scroll_offset", PROPERTY_HINT_NONE, "suffix:px"), "set_scroll_ofs", "get_scroll_ofs"); @@ -2408,21 +2416,21 @@ void GraphEdit::_bind_methods() { ADD_GROUP("UI", ""); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "arrange_nodes_button_hidden"), "set_arrange_nodes_button_hidden", "is_arrange_nodes_button_hidden"); - ADD_SIGNAL(MethodInfo("connection_request", PropertyInfo(Variant::STRING_NAME, "from"), PropertyInfo(Variant::INT, "from_slot"), PropertyInfo(Variant::STRING_NAME, "to"), PropertyInfo(Variant::INT, "to_slot"))); - ADD_SIGNAL(MethodInfo("disconnection_request", PropertyInfo(Variant::STRING_NAME, "from"), PropertyInfo(Variant::INT, "from_slot"), PropertyInfo(Variant::STRING_NAME, "to"), PropertyInfo(Variant::INT, "to_slot"))); + ADD_SIGNAL(MethodInfo("connection_request", PropertyInfo(Variant::STRING_NAME, "from_node"), PropertyInfo(Variant::INT, "from_port"), PropertyInfo(Variant::STRING_NAME, "to_node"), PropertyInfo(Variant::INT, "to_port"))); + ADD_SIGNAL(MethodInfo("disconnection_request", PropertyInfo(Variant::STRING_NAME, "from_node"), PropertyInfo(Variant::INT, "from_port"), PropertyInfo(Variant::STRING_NAME, "to_node"), PropertyInfo(Variant::INT, "to_port"))); ADD_SIGNAL(MethodInfo("popup_request", PropertyInfo(Variant::VECTOR2, "position"))); ADD_SIGNAL(MethodInfo("duplicate_nodes_request")); ADD_SIGNAL(MethodInfo("copy_nodes_request")); ADD_SIGNAL(MethodInfo("paste_nodes_request")); ADD_SIGNAL(MethodInfo("node_selected", PropertyInfo(Variant::OBJECT, "node", PROPERTY_HINT_RESOURCE_TYPE, "Node"))); ADD_SIGNAL(MethodInfo("node_deselected", PropertyInfo(Variant::OBJECT, "node", PROPERTY_HINT_RESOURCE_TYPE, "Node"))); - ADD_SIGNAL(MethodInfo("connection_to_empty", PropertyInfo(Variant::STRING_NAME, "from"), PropertyInfo(Variant::INT, "from_slot"), PropertyInfo(Variant::VECTOR2, "release_position"))); - ADD_SIGNAL(MethodInfo("connection_from_empty", PropertyInfo(Variant::STRING_NAME, "to"), PropertyInfo(Variant::INT, "to_slot"), PropertyInfo(Variant::VECTOR2, "release_position"))); + ADD_SIGNAL(MethodInfo("connection_to_empty", PropertyInfo(Variant::STRING_NAME, "from_node"), PropertyInfo(Variant::INT, "from_port"), PropertyInfo(Variant::VECTOR2, "release_position"))); + ADD_SIGNAL(MethodInfo("connection_from_empty", PropertyInfo(Variant::STRING_NAME, "to_node"), PropertyInfo(Variant::INT, "to_port"), PropertyInfo(Variant::VECTOR2, "release_position"))); ADD_SIGNAL(MethodInfo("delete_nodes_request", PropertyInfo(Variant::ARRAY, "nodes", PROPERTY_HINT_ARRAY_TYPE, "StringName"))); ADD_SIGNAL(MethodInfo("begin_node_move")); ADD_SIGNAL(MethodInfo("end_node_move")); ADD_SIGNAL(MethodInfo("scroll_offset_changed", PropertyInfo(Variant::VECTOR2, "offset"))); - ADD_SIGNAL(MethodInfo("connection_drag_started", PropertyInfo(Variant::STRING, "from"), PropertyInfo(Variant::INT, "slot"), PropertyInfo(Variant::BOOL, "is_output"))); + ADD_SIGNAL(MethodInfo("connection_drag_started", PropertyInfo(Variant::STRING, "from_node"), PropertyInfo(Variant::INT, "from_port"), PropertyInfo(Variant::BOOL, "is_output"))); ADD_SIGNAL(MethodInfo("connection_drag_ended")); BIND_ENUM_CONSTANT(SCROLL_ZOOMS); diff --git a/scene/gui/graph_edit.h b/scene/gui/graph_edit.h index b6ce575009..101087bdbd 100644 --- a/scene/gui/graph_edit.h +++ b/scene/gui/graph_edit.h @@ -201,8 +201,8 @@ private: GraphEditMinimap *minimap = nullptr; void _top_layer_input(const Ref<InputEvent> &p_ev); - bool is_in_input_hotzone(GraphNode *p_graph_node, int p_slot_index, const Vector2 &p_mouse_pos, const Vector2i &p_port_size); - bool is_in_output_hotzone(GraphNode *p_graph_node, int p_slot_index, const Vector2 &p_mouse_pos, const Vector2i &p_port_size); + bool is_in_input_hotzone(GraphNode *p_node, int p_port, const Vector2 &p_mouse_pos, const Vector2i &p_port_size); + bool is_in_output_hotzone(GraphNode *p_node, int p_port, const Vector2 &p_mouse_pos, const Vector2i &p_port_size); bool is_in_port_hotzone(const Vector2 &pos, const Vector2 &p_mouse_pos, const Vector2i &p_port_size, bool p_left); void _top_layer_draw(); @@ -287,6 +287,8 @@ protected: GDVIRTUAL4R(bool, _is_node_hover_valid, StringName, int, StringName, int); public: + PackedStringArray get_configuration_warnings() const override; + Error connect_node(const StringName &p_from, int p_from_port, const StringName &p_to, int p_to_port); bool is_node_connected(const StringName &p_from, int p_from_port, const StringName &p_to, int p_to_port); void disconnect_node(const StringName &p_from, int p_from_port, const StringName &p_to, int p_to_port); diff --git a/scene/gui/graph_node.cpp b/scene/gui/graph_node.cpp index f441144a8e..21c0b5a842 100644 --- a/scene/gui/graph_node.cpp +++ b/scene/gui/graph_node.cpp @@ -779,8 +779,8 @@ void GraphNode::_connpos_update() { int sep = get_theme_constant(SNAME("separation")); Ref<StyleBox> sb = get_theme_stylebox(SNAME("frame")); - conn_input_cache.clear(); - conn_output_cache.clear(); + left_port_cache.clear(); + right_port_cache.clear(); int vofs = 0; int idx = 0; @@ -801,20 +801,26 @@ void GraphNode::_connpos_update() { if (slot_info.has(idx)) { if (slot_info[idx].enable_left) { - ConnCache cc; - cc.pos = Point2i(edgeofs, y + h / 2); + PortCache cc; + cc.position = Point2i(edgeofs, y + h / 2); + cc.height = size.height; + + cc.slot_idx = idx; cc.type = slot_info[idx].type_left; cc.color = slot_info[idx].color_left; - cc.height = size.height; - conn_input_cache.push_back(cc); + + left_port_cache.push_back(cc); } if (slot_info[idx].enable_right) { - ConnCache cc; - cc.pos = Point2i(get_size().width - edgeofs, y + h / 2); + PortCache cc; + cc.position = Point2i(get_size().width - edgeofs, y + h / 2); + cc.height = size.height; + + cc.slot_idx = idx; cc.type = slot_info[idx].type_right; cc.color = slot_info[idx].color_right; - cc.height = size.height; - conn_output_cache.push_back(cc); + + right_port_cache.push_back(cc); } } @@ -831,46 +837,55 @@ int GraphNode::get_connection_input_count() { _connpos_update(); } - return conn_input_cache.size(); + return left_port_cache.size(); } -int GraphNode::get_connection_input_height(int p_idx) { +int GraphNode::get_connection_input_height(int p_port) { if (connpos_dirty) { _connpos_update(); } - ERR_FAIL_INDEX_V(p_idx, conn_input_cache.size(), 0); - return conn_input_cache[p_idx].height; + ERR_FAIL_INDEX_V(p_port, left_port_cache.size(), 0); + return left_port_cache[p_port].height; } -Vector2 GraphNode::get_connection_input_position(int p_idx) { +Vector2 GraphNode::get_connection_input_position(int p_port) { if (connpos_dirty) { _connpos_update(); } - ERR_FAIL_INDEX_V(p_idx, conn_input_cache.size(), Vector2()); - Vector2 pos = conn_input_cache[p_idx].pos; + ERR_FAIL_INDEX_V(p_port, left_port_cache.size(), Vector2()); + Vector2 pos = left_port_cache[p_port].position; pos.x *= get_scale().x; pos.y *= get_scale().y; return pos; } -int GraphNode::get_connection_input_type(int p_idx) { +int GraphNode::get_connection_input_type(int p_port) { + if (connpos_dirty) { + _connpos_update(); + } + + ERR_FAIL_INDEX_V(p_port, left_port_cache.size(), 0); + return left_port_cache[p_port].type; +} + +Color GraphNode::get_connection_input_color(int p_port) { if (connpos_dirty) { _connpos_update(); } - ERR_FAIL_INDEX_V(p_idx, conn_input_cache.size(), 0); - return conn_input_cache[p_idx].type; + ERR_FAIL_INDEX_V(p_port, left_port_cache.size(), Color()); + return left_port_cache[p_port].color; } -Color GraphNode::get_connection_input_color(int p_idx) { +int GraphNode::get_connection_input_slot(int p_port) { if (connpos_dirty) { _connpos_update(); } - ERR_FAIL_INDEX_V(p_idx, conn_input_cache.size(), Color()); - return conn_input_cache[p_idx].color; + ERR_FAIL_INDEX_V(p_port, left_port_cache.size(), -1); + return left_port_cache[p_port].slot_idx; } int GraphNode::get_connection_output_count() { @@ -878,46 +893,55 @@ int GraphNode::get_connection_output_count() { _connpos_update(); } - return conn_output_cache.size(); + return right_port_cache.size(); } -int GraphNode::get_connection_output_height(int p_idx) { +int GraphNode::get_connection_output_height(int p_port) { if (connpos_dirty) { _connpos_update(); } - ERR_FAIL_INDEX_V(p_idx, conn_output_cache.size(), 0); - return conn_output_cache[p_idx].height; + ERR_FAIL_INDEX_V(p_port, right_port_cache.size(), 0); + return right_port_cache[p_port].height; } -Vector2 GraphNode::get_connection_output_position(int p_idx) { +Vector2 GraphNode::get_connection_output_position(int p_port) { if (connpos_dirty) { _connpos_update(); } - ERR_FAIL_INDEX_V(p_idx, conn_output_cache.size(), Vector2()); - Vector2 pos = conn_output_cache[p_idx].pos; + ERR_FAIL_INDEX_V(p_port, right_port_cache.size(), Vector2()); + Vector2 pos = right_port_cache[p_port].position; pos.x *= get_scale().x; pos.y *= get_scale().y; return pos; } -int GraphNode::get_connection_output_type(int p_idx) { +int GraphNode::get_connection_output_type(int p_port) { + if (connpos_dirty) { + _connpos_update(); + } + + ERR_FAIL_INDEX_V(p_port, right_port_cache.size(), 0); + return right_port_cache[p_port].type; +} + +Color GraphNode::get_connection_output_color(int p_port) { if (connpos_dirty) { _connpos_update(); } - ERR_FAIL_INDEX_V(p_idx, conn_output_cache.size(), 0); - return conn_output_cache[p_idx].type; + ERR_FAIL_INDEX_V(p_port, right_port_cache.size(), Color()); + return right_port_cache[p_port].color; } -Color GraphNode::get_connection_output_color(int p_idx) { +int GraphNode::get_connection_output_slot(int p_port) { if (connpos_dirty) { _connpos_update(); } - ERR_FAIL_INDEX_V(p_idx, conn_output_cache.size(), Color()); - return conn_output_cache[p_idx].color; + ERR_FAIL_INDEX_V(p_port, right_port_cache.size(), -1); + return right_port_cache[p_port].slot_idx; } void GraphNode::gui_input(const Ref<InputEvent> &p_ev) { @@ -1050,30 +1074,30 @@ void GraphNode::_bind_methods() { ClassDB::bind_method(D_METHOD("set_language", "language"), &GraphNode::set_language); ClassDB::bind_method(D_METHOD("get_language"), &GraphNode::get_language); - ClassDB::bind_method(D_METHOD("set_slot", "idx", "enable_left", "type_left", "color_left", "enable_right", "type_right", "color_right", "custom_left", "custom_right", "enable"), &GraphNode::set_slot, DEFVAL(Ref<Texture2D>()), DEFVAL(Ref<Texture2D>()), DEFVAL(true)); - ClassDB::bind_method(D_METHOD("clear_slot", "idx"), &GraphNode::clear_slot); + ClassDB::bind_method(D_METHOD("set_slot", "slot_index", "enable_left_port", "type_left", "color_left", "enable_right_port", "type_right", "color_right", "custom_icon_left", "custom_icon_right", "draw_stylebox"), &GraphNode::set_slot, DEFVAL(Ref<Texture2D>()), DEFVAL(Ref<Texture2D>()), DEFVAL(true)); + ClassDB::bind_method(D_METHOD("clear_slot", "slot_index"), &GraphNode::clear_slot); ClassDB::bind_method(D_METHOD("clear_all_slots"), &GraphNode::clear_all_slots); - ClassDB::bind_method(D_METHOD("is_slot_enabled_left", "idx"), &GraphNode::is_slot_enabled_left); - ClassDB::bind_method(D_METHOD("set_slot_enabled_left", "idx", "enable_left"), &GraphNode::set_slot_enabled_left); + ClassDB::bind_method(D_METHOD("set_slot_enabled_left", "slot_index", "enable"), &GraphNode::set_slot_enabled_left); + ClassDB::bind_method(D_METHOD("is_slot_enabled_left", "slot_index"), &GraphNode::is_slot_enabled_left); - ClassDB::bind_method(D_METHOD("set_slot_type_left", "idx", "type_left"), &GraphNode::set_slot_type_left); - ClassDB::bind_method(D_METHOD("get_slot_type_left", "idx"), &GraphNode::get_slot_type_left); + ClassDB::bind_method(D_METHOD("set_slot_type_left", "slot_index", "type"), &GraphNode::set_slot_type_left); + ClassDB::bind_method(D_METHOD("get_slot_type_left", "slot_index"), &GraphNode::get_slot_type_left); - ClassDB::bind_method(D_METHOD("set_slot_color_left", "idx", "color_left"), &GraphNode::set_slot_color_left); - ClassDB::bind_method(D_METHOD("get_slot_color_left", "idx"), &GraphNode::get_slot_color_left); + ClassDB::bind_method(D_METHOD("set_slot_color_left", "slot_index", "color"), &GraphNode::set_slot_color_left); + ClassDB::bind_method(D_METHOD("get_slot_color_left", "slot_index"), &GraphNode::get_slot_color_left); - ClassDB::bind_method(D_METHOD("is_slot_enabled_right", "idx"), &GraphNode::is_slot_enabled_right); - ClassDB::bind_method(D_METHOD("set_slot_enabled_right", "idx", "enable_right"), &GraphNode::set_slot_enabled_right); + ClassDB::bind_method(D_METHOD("set_slot_enabled_right", "slot_index", "enable"), &GraphNode::set_slot_enabled_right); + ClassDB::bind_method(D_METHOD("is_slot_enabled_right", "slot_index"), &GraphNode::is_slot_enabled_right); - ClassDB::bind_method(D_METHOD("set_slot_type_right", "idx", "type_right"), &GraphNode::set_slot_type_right); - ClassDB::bind_method(D_METHOD("get_slot_type_right", "idx"), &GraphNode::get_slot_type_right); + ClassDB::bind_method(D_METHOD("set_slot_type_right", "slot_index", "type"), &GraphNode::set_slot_type_right); + ClassDB::bind_method(D_METHOD("get_slot_type_right", "slot_index"), &GraphNode::get_slot_type_right); - ClassDB::bind_method(D_METHOD("set_slot_color_right", "idx", "color_right"), &GraphNode::set_slot_color_right); - ClassDB::bind_method(D_METHOD("get_slot_color_right", "idx"), &GraphNode::get_slot_color_right); + ClassDB::bind_method(D_METHOD("set_slot_color_right", "slot_index", "color"), &GraphNode::set_slot_color_right); + ClassDB::bind_method(D_METHOD("get_slot_color_right", "slot_index"), &GraphNode::get_slot_color_right); - ClassDB::bind_method(D_METHOD("is_slot_draw_stylebox", "idx"), &GraphNode::is_slot_draw_stylebox); - ClassDB::bind_method(D_METHOD("set_slot_draw_stylebox", "idx", "draw_stylebox"), &GraphNode::set_slot_draw_stylebox); + ClassDB::bind_method(D_METHOD("is_slot_draw_stylebox", "slot_index"), &GraphNode::is_slot_draw_stylebox); + ClassDB::bind_method(D_METHOD("set_slot_draw_stylebox", "slot_index", "enable"), &GraphNode::set_slot_draw_stylebox); ClassDB::bind_method(D_METHOD("set_position_offset", "offset"), &GraphNode::set_position_offset); ClassDB::bind_method(D_METHOD("get_position_offset"), &GraphNode::get_position_offset); @@ -1094,16 +1118,18 @@ void GraphNode::_bind_methods() { ClassDB::bind_method(D_METHOD("is_selected"), &GraphNode::is_selected); ClassDB::bind_method(D_METHOD("get_connection_input_count"), &GraphNode::get_connection_input_count); - ClassDB::bind_method(D_METHOD("get_connection_input_height", "idx"), &GraphNode::get_connection_input_height); - ClassDB::bind_method(D_METHOD("get_connection_input_position", "idx"), &GraphNode::get_connection_input_position); - ClassDB::bind_method(D_METHOD("get_connection_input_type", "idx"), &GraphNode::get_connection_input_type); - ClassDB::bind_method(D_METHOD("get_connection_input_color", "idx"), &GraphNode::get_connection_input_color); + ClassDB::bind_method(D_METHOD("get_connection_input_height", "port"), &GraphNode::get_connection_input_height); + ClassDB::bind_method(D_METHOD("get_connection_input_position", "port"), &GraphNode::get_connection_input_position); + ClassDB::bind_method(D_METHOD("get_connection_input_type", "port"), &GraphNode::get_connection_input_type); + ClassDB::bind_method(D_METHOD("get_connection_input_color", "port"), &GraphNode::get_connection_input_color); + ClassDB::bind_method(D_METHOD("get_connection_input_slot", "port"), &GraphNode::get_connection_input_slot); ClassDB::bind_method(D_METHOD("get_connection_output_count"), &GraphNode::get_connection_output_count); - ClassDB::bind_method(D_METHOD("get_connection_output_height", "idx"), &GraphNode::get_connection_output_height); - ClassDB::bind_method(D_METHOD("get_connection_output_position", "idx"), &GraphNode::get_connection_output_position); - ClassDB::bind_method(D_METHOD("get_connection_output_type", "idx"), &GraphNode::get_connection_output_type); - ClassDB::bind_method(D_METHOD("get_connection_output_color", "idx"), &GraphNode::get_connection_output_color); + ClassDB::bind_method(D_METHOD("get_connection_output_height", "port"), &GraphNode::get_connection_output_height); + ClassDB::bind_method(D_METHOD("get_connection_output_position", "port"), &GraphNode::get_connection_output_position); + ClassDB::bind_method(D_METHOD("get_connection_output_type", "port"), &GraphNode::get_connection_output_type); + ClassDB::bind_method(D_METHOD("get_connection_output_color", "port"), &GraphNode::get_connection_output_color); + ClassDB::bind_method(D_METHOD("get_connection_output_slot", "port"), &GraphNode::get_connection_output_slot); ClassDB::bind_method(D_METHOD("set_show_close_button", "show"), &GraphNode::set_show_close_button); ClassDB::bind_method(D_METHOD("is_close_button_visible"), &GraphNode::is_close_button_visible); diff --git a/scene/gui/graph_node.h b/scene/gui/graph_node.h index 9c8f926403..e66b0cfc20 100644 --- a/scene/gui/graph_node.h +++ b/scene/gui/graph_node.h @@ -78,15 +78,17 @@ private: Vector<int> cache_y; - struct ConnCache { - Vector2 pos; + struct PortCache { + Vector2 position; + int height; + + int slot_idx; int type = 0; Color color; - int height; }; - Vector<ConnCache> conn_input_cache; - Vector<ConnCache> conn_output_cache; + Vector<PortCache> left_port_cache; + Vector<PortCache> right_port_cache; HashMap<int, Slot> slot_info; @@ -165,16 +167,18 @@ public: bool is_close_button_visible() const; int get_connection_input_count(); - int get_connection_input_height(int p_idx); - Vector2 get_connection_input_position(int p_idx); - int get_connection_input_type(int p_idx); - Color get_connection_input_color(int p_idx); + int get_connection_input_height(int p_port); + Vector2 get_connection_input_position(int p_port); + int get_connection_input_type(int p_port); + Color get_connection_input_color(int p_port); + int get_connection_input_slot(int p_port); int get_connection_output_count(); - int get_connection_output_height(int p_idx); - Vector2 get_connection_output_position(int p_idx); - int get_connection_output_type(int p_idx); - Color get_connection_output_color(int p_idx); + int get_connection_output_height(int p_port); + Vector2 get_connection_output_position(int p_port); + int get_connection_output_type(int p_port); + Color get_connection_output_color(int p_port); + int get_connection_output_slot(int p_port); void set_overlay(Overlay p_overlay); Overlay get_overlay() const; diff --git a/scene/gui/item_list.cpp b/scene/gui/item_list.cpp index 5db4d8306f..357f2480bd 100644 --- a/scene/gui/item_list.cpp +++ b/scene/gui/item_list.cpp @@ -596,7 +596,7 @@ ItemList::IconMode ItemList::get_icon_mode() const { return icon_mode; } -void ItemList::set_fixed_icon_size(const Size2 &p_size) { +void ItemList::set_fixed_icon_size(const Size2i &p_size) { if (fixed_icon_size == p_size) { return; } @@ -605,7 +605,7 @@ void ItemList::set_fixed_icon_size(const Size2 &p_size) { queue_redraw(); } -Size2 ItemList::get_fixed_icon_size() const { +Size2i ItemList::get_fixed_icon_size() const { return fixed_icon_size; } @@ -662,19 +662,7 @@ void ItemList::gui_input(const Ref<InputEvent> &p_event) { pos.x = get_size().width - pos.x; } - int closest = -1; - - for (int i = 0; i < items.size(); i++) { - Rect2 rc = items[i].rect_cache; - if (i % current_columns == current_columns - 1) { - rc.size.width = get_size().width; //not right but works - } - - if (rc.has_point(pos)) { - closest = i; - break; - } - } + int closest = get_item_at_position(mb->get_position(), true); if (closest != -1 && (mb->get_button_index() == MouseButton::LEFT || (allow_rmb_select && mb->get_button_index() == MouseButton::RIGHT))) { int i = closest; @@ -1467,7 +1455,7 @@ int ItemList::get_item_at_position(const Point2 &p_pos, bool p_exact) const { for (int i = 0; i < items.size(); i++) { Rect2 rc = items[i].rect_cache; if (i % current_columns == current_columns - 1) { - rc.size.width = get_size().width - rc.position.x; //make sure you can still select the last item when clicking past the column + rc.size.width = get_size().width - rc.position.x; // Make sure you can still select the last item when clicking past the column. } if (rc.has_point(pos)) { @@ -1830,7 +1818,7 @@ void ItemList::_bind_methods() { ADD_GROUP("Icon", ""); ADD_PROPERTY(PropertyInfo(Variant::INT, "icon_mode", PROPERTY_HINT_ENUM, "Top,Left"), "set_icon_mode", "get_icon_mode"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "icon_scale"), "set_icon_scale", "get_icon_scale"); - ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "fixed_icon_size", PROPERTY_HINT_NONE, "suffix:px"), "set_fixed_icon_size", "get_fixed_icon_size"); + ADD_PROPERTY(PropertyInfo(Variant::VECTOR2I, "fixed_icon_size", PROPERTY_HINT_NONE, "suffix:px"), "set_fixed_icon_size", "get_fixed_icon_size"); BIND_ENUM_CONSTANT(ICON_MODE_TOP); BIND_ENUM_CONSTANT(ICON_MODE_LEFT); diff --git a/scene/gui/item_list.h b/scene/gui/item_list.h index 486c609034..4b1b9d9282 100644 --- a/scene/gui/item_list.h +++ b/scene/gui/item_list.h @@ -244,8 +244,8 @@ public: void set_icon_mode(IconMode p_mode); IconMode get_icon_mode() const; - void set_fixed_icon_size(const Size2 &p_size); - Size2 get_fixed_icon_size() const; + void set_fixed_icon_size(const Size2i &p_size); + Size2i get_fixed_icon_size() const; void set_allow_rmb_select(bool p_allow); bool get_allow_rmb_select() const; diff --git a/scene/gui/menu_bar.cpp b/scene/gui/menu_bar.cpp index d6bf84ea5a..75592a1b99 100644 --- a/scene/gui/menu_bar.cpp +++ b/scene/gui/menu_bar.cpp @@ -703,7 +703,7 @@ void MenuBar::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "start_index"), "set_start_index", "get_start_index"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "switch_on_hover"), "set_switch_on_hover", "is_switch_on_hover"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "prefer_global_menu"), "set_prefer_global_menu", "is_prefer_global_menu"); - ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "shortcut_context", PROPERTY_HINT_RESOURCE_TYPE, "Node"), "set_shortcut_context", "get_shortcut_context"); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "shortcut_context", PROPERTY_HINT_NODE_TYPE, "Node"), "set_shortcut_context", "get_shortcut_context"); ADD_GROUP("BiDi", ""); ADD_PROPERTY(PropertyInfo(Variant::INT, "text_direction", PROPERTY_HINT_ENUM, "Auto,Left-to-Right,Right-to-Left,Inherited"), "set_text_direction", "get_text_direction"); diff --git a/scene/gui/menu_button.cpp b/scene/gui/menu_button.cpp index 67a36240a2..fa8df48412 100644 --- a/scene/gui/menu_button.cpp +++ b/scene/gui/menu_button.cpp @@ -44,15 +44,12 @@ void MenuButton::shortcut_input(const Ref<InputEvent> &p_event) { return; } - if (p_event->is_pressed() && !p_event->is_echo() && (Object::cast_to<InputEventKey>(p_event.ptr()) || Object::cast_to<InputEventJoypadButton>(p_event.ptr()) || Object::cast_to<InputEventAction>(*p_event) || Object::cast_to<InputEventShortcut>(*p_event))) { - if (!get_parent() || !is_visible_in_tree() || is_disabled()) { - return; - } - - if (popup->activate_item_by_event(p_event, false)) { - accept_event(); - } + if (p_event->is_pressed() && !p_event->is_echo() && !is_disabled() && is_visible_in_tree() && popup->activate_item_by_event(p_event, false)) { + accept_event(); + return; } + + Button::shortcut_input(p_event); } void MenuButton::_popup_visibility_changed(bool p_visible) { @@ -91,6 +88,18 @@ void MenuButton::pressed() { return; } + show_popup(); +} + +PopupMenu *MenuButton::get_popup() const { + return popup; +} + +void MenuButton::show_popup() { + if (!get_viewport()) { + return; + } + emit_signal(SNAME("about_to_popup")); Size2 size = get_size() * get_viewport()->get_canvas_transform().get_scale(); @@ -116,14 +125,6 @@ void MenuButton::pressed() { popup->popup(); } -void MenuButton::gui_input(const Ref<InputEvent> &p_event) { - BaseButton::gui_input(p_event); -} - -PopupMenu *MenuButton::get_popup() const { - return popup; -} - void MenuButton::set_switch_on_hover(bool p_enabled) { switch_on_hover = p_enabled; } @@ -226,6 +227,7 @@ void MenuButton::_get_property_list(List<PropertyInfo> *p_list) const { void MenuButton::_bind_methods() { ClassDB::bind_method(D_METHOD("get_popup"), &MenuButton::get_popup); + ClassDB::bind_method(D_METHOD("show_popup"), &MenuButton::show_popup); ClassDB::bind_method(D_METHOD("set_switch_on_hover", "enable"), &MenuButton::set_switch_on_hover); ClassDB::bind_method(D_METHOD("is_switch_on_hover"), &MenuButton::is_switch_on_hover); ClassDB::bind_method(D_METHOD("set_disable_shortcuts", "disabled"), &MenuButton::set_disable_shortcuts); diff --git a/scene/gui/menu_button.h b/scene/gui/menu_button.h index 97c0d21f1e..3aacbca3a8 100644 --- a/scene/gui/menu_button.h +++ b/scene/gui/menu_button.h @@ -44,8 +44,6 @@ class MenuButton : public Button { Vector2i mouse_pos_adjusted; - virtual void gui_input(const Ref<InputEvent> &p_event) override; - void _popup_visibility_changed(bool p_visible); protected: @@ -60,6 +58,8 @@ public: virtual void pressed() override; PopupMenu *get_popup() const; + void show_popup(); + void set_switch_on_hover(bool p_enabled); bool is_switch_on_hover(); void set_disable_shortcuts(bool p_disabled); diff --git a/scene/gui/option_button.cpp b/scene/gui/option_button.cpp index 08f5e0bbfb..2cbece69f2 100644 --- a/scene/gui/option_button.cpp +++ b/scene/gui/option_button.cpp @@ -231,32 +231,7 @@ void OptionButton::pressed() { return; } - Size2 size = get_size() * get_viewport()->get_canvas_transform().get_scale(); - popup->set_position(get_screen_position() + Size2(0, size.height * get_global_transform().get_scale().y)); - popup->set_size(Size2(size.width, 0)); - - // If not triggered by the mouse, start the popup with the checked item (or the first enabled one) focused. - if (current != NONE_SELECTED && !popup->is_item_disabled(current)) { - if (!_was_pressed_by_mouse()) { - popup->set_focused_item(current); - } else { - popup->scroll_to_item(current); - } - } else { - for (int i = 0; i < popup->get_item_count(); i++) { - if (!popup->is_item_disabled(i)) { - if (!_was_pressed_by_mouse()) { - popup->set_focused_item(i); - } else { - popup->scroll_to_item(i); - } - - break; - } - } - } - - popup->popup(); + show_popup(); } void OptionButton::add_icon_item(const Ref<Texture2D> &p_icon, const String &p_label, int p_id) { @@ -511,6 +486,39 @@ PopupMenu *OptionButton::get_popup() const { return popup; } +void OptionButton::show_popup() { + if (!get_viewport()) { + return; + } + + Size2 size = get_size() * get_viewport()->get_canvas_transform().get_scale(); + popup->set_position(get_screen_position() + Size2(0, size.height * get_global_transform().get_scale().y)); + popup->set_size(Size2(size.width, 0)); + + // If not triggered by the mouse, start the popup with the checked item (or the first enabled one) focused. + if (current != NONE_SELECTED && !popup->is_item_disabled(current)) { + if (!_was_pressed_by_mouse()) { + popup->set_focused_item(current); + } else { + popup->scroll_to_item(current); + } + } else { + for (int i = 0; i < popup->get_item_count(); i++) { + if (!popup->is_item_disabled(i)) { + if (!_was_pressed_by_mouse()) { + popup->set_focused_item(i); + } else { + popup->scroll_to_item(i); + } + + break; + } + } + } + + popup->popup(); +} + void OptionButton::get_translatable_strings(List<String> *p_strings) const { popup->get_translatable_strings(p_strings); } @@ -548,6 +556,7 @@ void OptionButton::_bind_methods() { ClassDB::bind_method(D_METHOD("_select_int", "idx"), &OptionButton::_select_int); ClassDB::bind_method(D_METHOD("get_popup"), &OptionButton::get_popup); + ClassDB::bind_method(D_METHOD("show_popup"), &OptionButton::show_popup); ClassDB::bind_method(D_METHOD("set_item_count", "count"), &OptionButton::set_item_count); ClassDB::bind_method(D_METHOD("get_item_count"), &OptionButton::get_item_count); diff --git a/scene/gui/option_button.h b/scene/gui/option_button.h index 2c7e0510f5..b76a31d37e 100644 --- a/scene/gui/option_button.h +++ b/scene/gui/option_button.h @@ -123,6 +123,7 @@ public: void remove_item(int p_idx); PopupMenu *get_popup() const; + void show_popup(); virtual void get_translatable_strings(List<String> *p_strings) const override; diff --git a/scene/gui/popup_menu.cpp b/scene/gui/popup_menu.cpp index d4a4efd578..10e13042a7 100644 --- a/scene/gui/popup_menu.cpp +++ b/scene/gui/popup_menu.cpp @@ -1762,7 +1762,7 @@ void PopupMenu::clear() { void PopupMenu::_ref_shortcut(Ref<Shortcut> p_sc) { if (!shortcut_refcount.has(p_sc)) { shortcut_refcount[p_sc] = 1; - p_sc->connect("changed", callable_mp((CanvasItem *)this, &CanvasItem::queue_redraw)); + p_sc->connect("changed", callable_mp(this, &PopupMenu::_shortcut_changed)); } else { shortcut_refcount[p_sc] += 1; } @@ -1772,11 +1772,18 @@ void PopupMenu::_unref_shortcut(Ref<Shortcut> p_sc) { ERR_FAIL_COND(!shortcut_refcount.has(p_sc)); shortcut_refcount[p_sc]--; if (shortcut_refcount[p_sc] == 0) { - p_sc->disconnect("changed", callable_mp((CanvasItem *)this, &CanvasItem::queue_redraw)); + p_sc->disconnect("changed", callable_mp(this, &PopupMenu::_shortcut_changed)); shortcut_refcount.erase(p_sc); } } +void PopupMenu::_shortcut_changed() { + for (int i = 0; i < items.size(); i++) { + items.write[i].dirty = true; + } + control->queue_redraw(); +} + // Hide on item selection determines whether or not the popup will close after item selection void PopupMenu::set_hide_on_item_selection(bool p_enabled) { hide_on_item_selection = p_enabled; diff --git a/scene/gui/popup_menu.h b/scene/gui/popup_menu.h index ad7909842e..89d3904456 100644 --- a/scene/gui/popup_menu.h +++ b/scene/gui/popup_menu.h @@ -121,6 +121,8 @@ class PopupMenu : public Popup { void _ref_shortcut(Ref<Shortcut> p_sc); void _unref_shortcut(Ref<Shortcut> p_sc); + void _shortcut_changed(); + bool allow_search = true; uint64_t search_time_msec = 0; String search_string = ""; diff --git a/scene/gui/range.cpp b/scene/gui/range.cpp index 1eb412abaf..2d2b3e413d 100644 --- a/scene/gui/range.cpp +++ b/scene/gui/range.cpp @@ -30,8 +30,8 @@ #include "range.h" -TypedArray<String> Range::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray Range::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (shared->exp_ratio && shared->min <= 0) { warnings.push_back(RTR("If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0.")); diff --git a/scene/gui/range.h b/scene/gui/range.h index 87bd0d88af..19452243cf 100644 --- a/scene/gui/range.h +++ b/scene/gui/range.h @@ -100,7 +100,7 @@ public: void share(Range *p_range); void unshare(); - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; Range(); ~Range(); diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp index c936fe9738..7ea46a0b4f 100644 --- a/scene/gui/rich_text_label.cpp +++ b/scene/gui/rich_text_label.cpp @@ -52,7 +52,7 @@ RichTextLabel::Item *RichTextLabel::_get_next_item(Item *p_item, bool p_free) co } else if (p_item->E->next()) { return p_item->E->next()->get(); } else { - //go up until something with a next is found + // Go up until something with a next is found. while (p_item->parent && !p_item->E->next()) { p_item = p_item->parent; } @@ -72,7 +72,7 @@ RichTextLabel::Item *RichTextLabel::_get_next_item(Item *p_item, bool p_free) co } else if (p_item->E->next()) { return p_item->E->next()->get(); } else { - //go up until something with a next is found + // Go up until something with a next is found. while (p_item->type != ITEM_FRAME && !p_item->E->next()) { p_item = p_item->parent; } @@ -84,8 +84,6 @@ RichTextLabel::Item *RichTextLabel::_get_next_item(Item *p_item, bool p_free) co } } } - - return nullptr; } RichTextLabel::Item *RichTextLabel::_get_prev_item(Item *p_item, bool p_free) const { @@ -97,7 +95,7 @@ RichTextLabel::Item *RichTextLabel::_get_prev_item(Item *p_item, bool p_free) co } else if (p_item->E->prev()) { return p_item->E->prev()->get(); } else { - //go back until something with a prev is found + // Go back until something with a prev is found. while (p_item->parent && !p_item->E->prev()) { p_item = p_item->parent; } @@ -117,7 +115,7 @@ RichTextLabel::Item *RichTextLabel::_get_prev_item(Item *p_item, bool p_free) co } else if (p_item->E->prev()) { return p_item->E->prev()->get(); } else { - //go back until something with a prev is found + // Go back until something with a prev is found. while (p_item->type != ITEM_FRAME && !p_item->E->prev()) { p_item = p_item->parent; } @@ -129,8 +127,6 @@ RichTextLabel::Item *RichTextLabel::_get_prev_item(Item *p_item, bool p_free) co } } } - - return nullptr; } Rect2 RichTextLabel::_get_text_rect() { @@ -965,17 +961,18 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o uint32_t gl = glyphs[i].index; uint16_t gl_fl = glyphs[i].flags; uint8_t gl_cn = glyphs[i].count; - bool cprev = false; + bool cprev_cluster = false; + bool cprev_conn = false; if (gl_cn == 0) { // Parts of the same cluster, always connected. - cprev = true; + cprev_cluster = true; } if (gl_fl & TextServer::GRAPHEME_IS_RTL) { // Check if previous grapheme cluster is connected. if (i > 0 && (glyphs[i - 1].flags & TextServer::GRAPHEME_IS_CONNECTED)) { - cprev = true; + cprev_conn = true; } } else { if (glyphs[i].flags & TextServer::GRAPHEME_IS_CONNECTED) { - cprev = true; + cprev_conn = true; } } @@ -994,6 +991,8 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o for (int j = 0; j < fx_stack.size(); j++) { ItemFX *item_fx = fx_stack[j]; + bool cn = cprev_cluster || (cprev_conn && item_fx->connected); + if (item_fx->type == ITEM_CUSTOMFX && custom_fx_ok) { ItemCustomFX *item_custom = static_cast<ItemCustomFX *>(item_fx); @@ -1024,7 +1023,7 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o } else if (item_fx->type == ITEM_SHAKE) { ItemShake *item_shake = static_cast<ItemShake *>(item_fx); - if (!cprev) { + if (!cn) { uint64_t char_current_rand = item_shake->offset_random(glyphs[i].start); uint64_t char_previous_rand = item_shake->offset_previous_random(glyphs[i].start); uint64_t max_rand = 2147483647; @@ -1038,7 +1037,7 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o } else if (item_fx->type == ITEM_WAVE) { ItemWave *item_wave = static_cast<ItemWave *>(item_fx); - if (!cprev) { + if (!cn) { double value = Math::sin(item_wave->frequency * item_wave->elapsed_time + ((p_ofs.x + gloff.x) / 50)) * (item_wave->amplitude / 10.0f); item_wave->prev_off = Point2(0, 1) * value; } @@ -1046,7 +1045,7 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o } else if (item_fx->type == ITEM_TORNADO) { ItemTornado *item_tornado = static_cast<ItemTornado *>(item_fx); - if (!cprev) { + if (!cn) { double torn_x = Math::sin(item_tornado->frequency * item_tornado->elapsed_time + ((p_ofs.x + gloff.x) / 50)) * (item_tornado->radius); double torn_y = Math::cos(item_tornado->frequency * item_tornado->elapsed_time + ((p_ofs.x + gloff.x) / 50)) * (item_tornado->radius); item_tornado->prev_off = Point2(torn_x, torn_y); @@ -1181,17 +1180,18 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o uint32_t gl = glyphs[i].index; uint16_t gl_fl = glyphs[i].flags; uint8_t gl_cn = glyphs[i].count; - bool cprev = false; + bool cprev_cluster = false; + bool cprev_conn = false; if (gl_cn == 0) { // Parts of the same grapheme cluster, always connected. - cprev = true; + cprev_cluster = true; } if (gl_fl & TextServer::GRAPHEME_IS_RTL) { // Check if previous grapheme cluster is connected. if (i > 0 && (glyphs[i - 1].flags & TextServer::GRAPHEME_IS_CONNECTED)) { - cprev = true; + cprev_conn = true; } } else { if (glyphs[i].flags & TextServer::GRAPHEME_IS_CONNECTED) { - cprev = true; + cprev_conn = true; } } @@ -1209,6 +1209,8 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o for (int j = 0; j < fx_stack.size(); j++) { ItemFX *item_fx = fx_stack[j]; + bool cn = cprev_cluster || (cprev_conn && item_fx->connected); + if (item_fx->type == ITEM_CUSTOMFX && custom_fx_ok) { ItemCustomFX *item_custom = static_cast<ItemCustomFX *>(item_fx); @@ -1239,7 +1241,7 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o } else if (item_fx->type == ITEM_SHAKE) { ItemShake *item_shake = static_cast<ItemShake *>(item_fx); - if (!cprev) { + if (!cn) { uint64_t char_current_rand = item_shake->offset_random(glyphs[i].start); uint64_t char_previous_rand = item_shake->offset_previous_random(glyphs[i].start); uint64_t max_rand = 2147483647; @@ -1253,7 +1255,7 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o } else if (item_fx->type == ITEM_WAVE) { ItemWave *item_wave = static_cast<ItemWave *>(item_fx); - if (!cprev) { + if (!cn) { double value = Math::sin(item_wave->frequency * item_wave->elapsed_time + ((p_ofs.x + off.x) / 50)) * (item_wave->amplitude / 10.0f); item_wave->prev_off = Point2(0, 1) * value; } @@ -1261,7 +1263,7 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o } else if (item_fx->type == ITEM_TORNADO) { ItemTornado *item_tornado = static_cast<ItemTornado *>(item_fx); - if (!cprev) { + if (!cn) { double torn_x = Math::sin(item_tornado->frequency * item_tornado->elapsed_time + ((p_ofs.x + off.x) / 50)) * (item_tornado->radius); double torn_y = Math::cos(item_tornado->frequency * item_tornado->elapsed_time + ((p_ofs.x + off.x) / 50)) * (item_tornado->radius); item_tornado->prev_off = Point2(torn_x, torn_y); @@ -1664,7 +1666,7 @@ int RichTextLabel::_find_first_line(int p_from, int p_to, int p_vofs) const { r = m; } } - return l; + return MIN(l, (int)main->lines.size() - 1); } _FORCE_INLINE_ float RichTextLabel::_calculate_line_vertical_offset(const RichTextLabel::Line &line) const { @@ -2188,6 +2190,75 @@ RichTextLabel::ItemFont *RichTextLabel::_find_font(Item *p_item) { while (fontitem) { if (fontitem->type == ITEM_FONT) { ItemFont *fi = static_cast<ItemFont *>(fontitem); + switch (fi->def_font) { + case NORMAL_FONT: { + if (fi->variation) { + Ref<FontVariation> fc = fi->font; + if (fc.is_valid()) { + fc->set_base_font(theme_cache.normal_font); + } + } else { + fi->font = theme_cache.normal_font; + } + if (fi->def_size) { + fi->font_size = theme_cache.normal_font_size; + } + } break; + case BOLD_FONT: { + if (fi->variation) { + Ref<FontVariation> fc = fi->font; + if (fc.is_valid()) { + fc->set_base_font(theme_cache.bold_font); + } + } else { + fi->font = theme_cache.bold_font; + } + if (fi->def_size) { + fi->font_size = theme_cache.bold_font_size; + } + } break; + case ITALICS_FONT: { + if (fi->variation) { + Ref<FontVariation> fc = fi->font; + if (fc.is_valid()) { + fc->set_base_font(theme_cache.italics_font); + } + } else { + fi->font = theme_cache.italics_font; + } + if (fi->def_size) { + fi->font_size = theme_cache.italics_font_size; + } + } break; + case BOLD_ITALICS_FONT: { + if (fi->variation) { + Ref<FontVariation> fc = fi->font; + if (fc.is_valid()) { + fc->set_base_font(theme_cache.bold_italics_font); + } + } else { + fi->font = theme_cache.bold_italics_font; + } + if (fi->def_size) { + fi->font_size = theme_cache.bold_italics_font_size; + } + } break; + case MONO_FONT: { + if (fi->variation) { + Ref<FontVariation> fc = fi->font; + if (fc.is_valid()) { + fc->set_base_font(theme_cache.mono_font); + } + } else { + fi->font = theme_cache.mono_font; + } + if (fi->def_size) { + fi->font_size = theme_cache.mono_font_size; + } + } break; + default: { + } break; + } return fi; } @@ -3004,6 +3075,33 @@ void RichTextLabel::push_dropcap(const String &p_string, const Ref<Font> &p_font _add_item(item, false); } +void RichTextLabel::_push_def_font_var(DefaultFont p_def_font, const Ref<Font> &p_font, int p_size) { + _stop_thread(); + MutexLock data_lock(data_mutex); + + ERR_FAIL_COND(current->type == ITEM_TABLE); + ItemFont *item = memnew(ItemFont); + + item->def_font = p_def_font; + item->variation = true; + item->font = p_font; + item->font_size = p_size; + item->def_size = (p_size <= 0); + _add_item(item, true); +} + +void RichTextLabel::_push_def_font(DefaultFont p_def_font) { + _stop_thread(); + MutexLock data_lock(data_mutex); + + ERR_FAIL_COND(current->type == ITEM_TABLE); + ItemFont *item = memnew(ItemFont); + + item->def_font = p_def_font; + item->def_size = true; + _add_item(item, true); +} + void RichTextLabel::push_font(const Ref<Font> &p_font, int p_size) { _stop_thread(); MutexLock data_lock(data_mutex); @@ -3020,31 +3118,31 @@ void RichTextLabel::push_font(const Ref<Font> &p_font, int p_size) { void RichTextLabel::push_normal() { ERR_FAIL_COND(theme_cache.normal_font.is_null()); - push_font(theme_cache.normal_font, theme_cache.normal_font_size); + _push_def_font(NORMAL_FONT); } void RichTextLabel::push_bold() { ERR_FAIL_COND(theme_cache.bold_font.is_null()); - push_font(theme_cache.bold_font, theme_cache.bold_font_size); + _push_def_font(BOLD_FONT); } void RichTextLabel::push_bold_italics() { ERR_FAIL_COND(theme_cache.bold_italics_font.is_null()); - push_font(theme_cache.bold_italics_font, theme_cache.bold_italics_font_size); + _push_def_font(BOLD_ITALICS_FONT); } void RichTextLabel::push_italics() { ERR_FAIL_COND(theme_cache.italics_font.is_null()); - push_font(theme_cache.italics_font, theme_cache.italics_font_size); + _push_def_font(ITALICS_FONT); } void RichTextLabel::push_mono() { ERR_FAIL_COND(theme_cache.mono_font.is_null()); - push_font(theme_cache.mono_font, theme_cache.mono_font_size); + _push_def_font(MONO_FONT); } void RichTextLabel::push_font_size(int p_font_size) { @@ -3201,33 +3299,36 @@ void RichTextLabel::push_fade(int p_start_index, int p_length) { _add_item(item, true); } -void RichTextLabel::push_shake(int p_strength = 10, float p_rate = 24.0f) { +void RichTextLabel::push_shake(int p_strength = 10, float p_rate = 24.0f, bool p_connected = true) { _stop_thread(); MutexLock data_lock(data_mutex); ItemShake *item = memnew(ItemShake); item->strength = p_strength; item->rate = p_rate; + item->connected = p_connected; _add_item(item, true); } -void RichTextLabel::push_wave(float p_frequency = 1.0f, float p_amplitude = 10.0f) { +void RichTextLabel::push_wave(float p_frequency = 1.0f, float p_amplitude = 10.0f, bool p_connected = true) { _stop_thread(); MutexLock data_lock(data_mutex); ItemWave *item = memnew(ItemWave); item->frequency = p_frequency; item->amplitude = p_amplitude; + item->connected = p_connected; _add_item(item, true); } -void RichTextLabel::push_tornado(float p_frequency = 1.0f, float p_radius = 10.0f) { +void RichTextLabel::push_tornado(float p_frequency = 1.0f, float p_radius = 10.0f, bool p_connected = true) { _stop_thread(); MutexLock data_lock(data_mutex); ItemTornado *item = memnew(ItemTornado); item->frequency = p_frequency; item->radius = p_radius; + item->connected = p_connected; _add_item(item, true); } @@ -3635,9 +3736,9 @@ void RichTextLabel::append_text(const String &p_bbcode) { //use bold font in_bold = true; if (in_italics) { - push_font(theme_cache.bold_italics_font, theme_cache.bold_italics_font_size); + _push_def_font(BOLD_ITALICS_FONT); } else { - push_font(theme_cache.bold_font, theme_cache.bold_font_size); + _push_def_font(BOLD_FONT); } pos = brk_end + 1; tag_stack.push_front(tag); @@ -3645,15 +3746,15 @@ void RichTextLabel::append_text(const String &p_bbcode) { //use italics font in_italics = true; if (in_bold) { - push_font(theme_cache.bold_italics_font, theme_cache.bold_italics_font_size); + _push_def_font(BOLD_ITALICS_FONT); } else { - push_font(theme_cache.italics_font, theme_cache.italics_font_size); + _push_def_font(ITALICS_FONT); } pos = brk_end + 1; tag_stack.push_front(tag); } else if (tag == "code") { //use monospace font - push_font(theme_cache.mono_font, theme_cache.mono_font_size); + _push_def_font(MONO_FONT); pos = brk_end + 1; tag_stack.push_front(tag); } else if (tag.begins_with("table=")) { @@ -4078,24 +4179,21 @@ void RichTextLabel::append_text(const String &p_bbcode) { pos = brk_end + 1; tag_stack.push_front("font_size"); - } else if (tag.begins_with("opentype_features=")) { - String fnt_ftr = tag.substr(18, tag.length()); + } else if (tag.begins_with("opentype_features=") || tag.begins_with("otf=")) { + int value_pos = tag.find("="); + String fnt_ftr = tag.substr(value_pos + 1); Vector<String> subtag = fnt_ftr.split(","); if (subtag.size() > 0) { Ref<Font> font = theme_cache.normal_font; - int font_size = 0; + DefaultFont def_font = NORMAL_FONT; + ItemFont *font_it = _find_font(current); if (font_it) { if (font_it->font.is_valid()) { font = font_it->font; - } - if (font_it->font_size > 0) { - font_size = font_it->font_size; + def_font = font_it->def_font; } } - Ref<FontVariation> fc; - fc.instantiate(); - fc->set_base_font(font); Dictionary features; for (int i = 0; i < subtag.size(); i++) { Vector<String> subtag_a = subtag[i].split("="); @@ -4105,11 +4203,21 @@ void RichTextLabel::append_text(const String &p_bbcode) { features[TS->name_to_tag(subtag_a[0])] = 1; } } + + Ref<FontVariation> fc; + fc.instantiate(); + + fc->set_base_font(font); fc->set_opentype_features(features); - push_font(fc, font_size); + + if (def_font != CUSTOM_FONT) { + _push_def_font_var(def_font, fc); + } else { + push_font(fc); + } } pos = brk_end + 1; - tag_stack.push_front("opentype_features"); + tag_stack.push_front(tag.substr(0, value_pos)); } else if (tag.begins_with("font=")) { String fnt = tag.substr(5, tag.length()); @@ -4125,9 +4233,21 @@ void RichTextLabel::append_text(const String &p_bbcode) { } else if (tag.begins_with("font ")) { Vector<String> subtag = tag.substr(2, tag.length()).split(" "); + Ref<Font> font = theme_cache.normal_font; + DefaultFont def_font = NORMAL_FONT; + + ItemFont *font_it = _find_font(current); + if (font_it) { + if (font_it->font.is_valid()) { + font = font_it->font; + def_font = font_it->def_font; + } + } + Ref<FontVariation> fc; fc.instantiate(); - int fnt_size = 0; + + int fnt_size = -1; for (int i = 1; i < subtag.size(); i++) { Vector<String> subtag_a = subtag[i].split("=", true, 2); if (subtag_a.size() == 2) { @@ -4135,7 +4255,8 @@ void RichTextLabel::append_text(const String &p_bbcode) { String fnt = subtag_a[1]; Ref<Font> font_data = ResourceLoader::load(fnt, "Font"); if (font_data.is_valid()) { - fc->set_base_font(font_data); + font = font_data; + def_font = CUSTOM_FONT; } } else if (subtag_a[0] == "size" || subtag_a[0] == "s") { fnt_size = subtag_a[1].to_int(); @@ -4189,7 +4310,14 @@ void RichTextLabel::append_text(const String &p_bbcode) { } } } - push_font(fc, fnt_size); + fc->set_base_font(font); + + if (def_font != CUSTOM_FONT) { + _push_def_font_var(def_font, fc, fnt_size); + } else { + push_font(fc, fnt_size); + } + pos = brk_end + 1; tag_stack.push_front("font"); @@ -4230,7 +4358,13 @@ void RichTextLabel::append_text(const String &p_bbcode) { rate = rate_option->value.to_float(); } - push_shake(strength, rate); + bool connected = true; + OptionMap::Iterator connected_option = bbcode_options.find("connected"); + if (connected_option) { + connected = connected_option->value.to_int(); + } + + push_shake(strength, rate, connected); pos = brk_end + 1; tag_stack.push_front("shake"); set_process_internal(true); @@ -4247,7 +4381,13 @@ void RichTextLabel::append_text(const String &p_bbcode) { period = period_option->value.to_float(); } - push_wave(period, amplitude); + bool connected = true; + OptionMap::Iterator connected_option = bbcode_options.find("connected"); + if (connected_option) { + connected = connected_option->value.to_int(); + } + + push_wave(period, amplitude, connected); pos = brk_end + 1; tag_stack.push_front("wave"); set_process_internal(true); @@ -4264,7 +4404,13 @@ void RichTextLabel::append_text(const String &p_bbcode) { frequency = frequency_option->value.to_float(); } - push_tornado(frequency, radius); + bool connected = true; + OptionMap::Iterator connected_option = bbcode_options.find("connected"); + if (connected_option) { + connected = connected_option->value.to_int(); + } + + push_tornado(frequency, radius, connected); pos = brk_end + 1; tag_stack.push_front("tornado"); set_process_internal(true); @@ -4364,6 +4510,8 @@ int RichTextLabel::get_visible_paragraph_count() const { if (!is_visible()) { return 0; } + + const_cast<RichTextLabel *>(this)->_validate_line_caches(); return visible_paragraph_count; } @@ -4392,6 +4540,8 @@ void RichTextLabel::scroll_to_line(int p_line) { } float RichTextLabel::get_line_offset(int p_line) { + _validate_line_caches(); + int line_count = 0; int to_line = main->first_invalid_line.load(); for (int i = 0; i < to_line; i++) { @@ -4409,6 +4559,8 @@ float RichTextLabel::get_line_offset(int p_line) { } float RichTextLabel::get_paragraph_offset(int p_paragraph) { + _validate_line_caches(); + int to_line = main->first_invalid_line.load(); if (0 <= p_paragraph && p_paragraph < to_line) { return main->lines[p_paragraph].offset.y; @@ -4417,6 +4569,8 @@ float RichTextLabel::get_paragraph_offset(int p_paragraph) { } int RichTextLabel::get_line_count() const { + const_cast<RichTextLabel *>(this)->_validate_line_caches(); + int line_count = 0; int to_line = main->first_invalid_line.load(); for (int i = 0; i < to_line; i++) { @@ -4430,6 +4584,8 @@ int RichTextLabel::get_visible_line_count() const { if (!is_visible()) { return 0; } + const_cast<RichTextLabel *>(this)->_validate_line_caches(); + return visible_line_count; } @@ -4631,7 +4787,10 @@ bool RichTextLabel::search(const String &p_string, bool p_from_selection, bool p queue_redraw(); return true; } - p_search_previous ? current_line-- : current_line++; + + if (current_line != ending_line) { + p_search_previous ? current_line-- : current_line++; + } } if (p_from_selection && selection.active) { @@ -4844,7 +5003,14 @@ void RichTextLabel::set_use_bbcode(bool p_enable) { } use_bbcode = p_enable; notify_property_list_changed(); - set_text(text); + + const String current_text = text; + if (use_bbcode) { + parse_bbcode(current_text); + } else { // raw text + clear(); + add_text(current_text); + } } bool RichTextLabel::is_using_bbcode() const { @@ -5005,7 +5171,12 @@ int RichTextLabel::get_content_height() const { int to_line = main->first_invalid_line.load(); if (to_line) { MutexLock lock(main->lines[to_line - 1].text_buf->get_mutex()); - total_height = main->lines[to_line - 1].offset.y + main->lines[to_line - 1].text_buf->get_size().y + main->lines[to_line - 1].text_buf->get_line_count() * theme_cache.line_separation; + if (theme_cache.line_separation < 0) { + // Do not apply to the last line to avoid cutting text. + total_height = main->lines[to_line - 1].offset.y + main->lines[to_line - 1].text_buf->get_size().y + (main->lines[to_line - 1].text_buf->get_line_count() - 1) * theme_cache.line_separation; + } else { + total_height = main->lines[to_line - 1].offset.y + main->lines[to_line - 1].text_buf->get_size().y + main->lines[to_line - 1].text_buf->get_line_count() * theme_cache.line_separation; + } } return total_height; } @@ -5298,6 +5469,8 @@ int RichTextLabel::get_visible_characters() const { } int RichTextLabel::get_character_line(int p_char) { + _validate_line_caches(); + int line_count = 0; int to_line = main->first_invalid_line.load(); for (int i = 0; i < to_line; i++) { @@ -5318,6 +5491,8 @@ int RichTextLabel::get_character_line(int p_char) { } int RichTextLabel::get_character_paragraph(int p_char) { + _validate_line_caches(); + int para_count = 0; int to_line = main->first_invalid_line.load(); for (int i = 0; i < to_line; i++) { @@ -5349,6 +5524,8 @@ int RichTextLabel::get_total_character_count() const { } int RichTextLabel::get_total_glyph_count() const { + const_cast<RichTextLabel *>(this)->_validate_line_caches(); + int tg = 0; Item *it = main; while (it) { diff --git a/scene/gui/rich_text_label.h b/scene/gui/rich_text_label.h index 8bc28a9ecf..71123602ad 100644 --- a/scene/gui/rich_text_label.h +++ b/scene/gui/rich_text_label.h @@ -82,6 +82,15 @@ public: MENU_SELECT_ALL, }; + enum DefaultFont { + NORMAL_FONT, + BOLD_FONT, + ITALICS_FONT, + BOLD_ITALICS_FONT, + MONO_FONT, + CUSTOM_FONT, + }; + protected: virtual void _update_theme_item_cache() override; void _notification(int p_what); @@ -178,7 +187,10 @@ private: }; struct ItemFont : public Item { + DefaultFont def_font = CUSTOM_FONT; Ref<Font> font; + bool variation = false; + bool def_size = false; int font_size = 0; ItemFont() { type = ITEM_FONT; } }; @@ -272,6 +284,7 @@ private: struct ItemFX : public Item { double elapsed_time = 0.f; + bool connected = true; }; struct ItemShake : public ItemFX { @@ -560,6 +573,8 @@ public: void add_newline(); bool remove_line(const int p_line); void push_dropcap(const String &p_string, const Ref<Font> &p_font, int p_size, const Rect2 &p_dropcap_margins = Rect2(), const Color &p_color = Color(1, 1, 1), int p_ol_size = 0, const Color &p_ol_color = Color(0, 0, 0, 0)); + void _push_def_font(DefaultFont p_def_font); + void _push_def_font_var(DefaultFont p_def_font, const Ref<Font> &p_font, int p_size = -1); void push_font(const Ref<Font> &p_font, int p_size = 0); void push_font_size(int p_font_size); void push_outline_size(int p_font_size); @@ -579,9 +594,9 @@ public: void push_hint(const String &p_string); void push_table(int p_columns, InlineAlignment p_alignment = INLINE_ALIGNMENT_TOP); void push_fade(int p_start_index, int p_length); - void push_shake(int p_strength, float p_rate); - void push_wave(float p_frequency, float p_amplitude); - void push_tornado(float p_frequency, float p_radius); + void push_shake(int p_strength, float p_rate, bool p_connected); + void push_wave(float p_frequency, float p_amplitude, bool p_connected); + void push_tornado(float p_frequency, float p_radius, bool p_connected); void push_rainbow(float p_saturation, float p_value, float p_frequency); void push_bgcolor(const Color &p_color); void push_fgcolor(const Color &p_color); diff --git a/scene/gui/scroll_container.cpp b/scene/gui/scroll_container.cpp index c12ac115b7..a6aa4707ff 100644 --- a/scene/gui/scroll_container.cpp +++ b/scene/gui/scroll_container.cpp @@ -162,7 +162,7 @@ void ScrollContainer::gui_input(const Ref<InputEvent> &p_gui_input) { drag_accum = Vector2(); last_drag_accum = Vector2(); drag_from = Vector2(h_scroll->get_value(), v_scroll->get_value()); - drag_touching = !DisplayServer::get_singleton()->screen_is_touchscreen(DisplayServer::get_singleton()->window_get_current_screen(get_viewport()->get_window_id())); + drag_touching = DisplayServer::get_singleton()->screen_is_touchscreen(DisplayServer::get_singleton()->window_get_current_screen(get_viewport()->get_window_id())); drag_touching_deaccel = false; beyond_deadzone = false; time_since_motion = 0; @@ -501,8 +501,8 @@ void ScrollContainer::set_follow_focus(bool p_follow) { follow_focus = p_follow; } -TypedArray<String> ScrollContainer::get_configuration_warnings() const { - TypedArray<String> warnings = Container::get_configuration_warnings(); +PackedStringArray ScrollContainer::get_configuration_warnings() const { + PackedStringArray warnings = Container::get_configuration_warnings(); int found = 0; diff --git a/scene/gui/scroll_container.h b/scene/gui/scroll_container.h index f4899846f4..0079358ef7 100644 --- a/scene/gui/scroll_container.h +++ b/scene/gui/scroll_container.h @@ -114,7 +114,7 @@ public: VScrollBar *get_v_scroll_bar(); void ensure_control_visible(Control *p_control); - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; ScrollContainer(); }; diff --git a/scene/gui/subviewport_container.cpp b/scene/gui/subviewport_container.cpp index 88e68ec763..3ad84cbc6d 100644 --- a/scene/gui/subviewport_container.cpp +++ b/scene/gui/subviewport_container.cpp @@ -227,8 +227,8 @@ void SubViewportContainer::unhandled_input(const Ref<InputEvent> &p_event) { } } -TypedArray<String> SubViewportContainer::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray SubViewportContainer::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); bool has_viewport = false; for (int i = 0; i < get_child_count(); i++) { diff --git a/scene/gui/subviewport_container.h b/scene/gui/subviewport_container.h index 5b488fb79e..63a58b5f07 100644 --- a/scene/gui/subviewport_container.h +++ b/scene/gui/subviewport_container.h @@ -58,7 +58,7 @@ public: virtual Vector<int> get_allowed_size_flags_horizontal() const override; virtual Vector<int> get_allowed_size_flags_vertical() const override; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; SubViewportContainer(); }; diff --git a/scene/gui/tab_container.cpp b/scene/gui/tab_container.cpp index f45d132a66..ab4808d312 100644 --- a/scene/gui/tab_container.cpp +++ b/scene/gui/tab_container.cpp @@ -519,12 +519,12 @@ void TabContainer::_refresh_tab_names() { } void TabContainer::add_child_notify(Node *p_child) { + Container::add_child_notify(p_child); + if (p_child == tab_bar) { return; } - Container::add_child_notify(p_child); - Control *c = Object::cast_to<Control>(p_child); if (!c || c->is_set_as_top_level()) { return; @@ -838,7 +838,7 @@ Size2 TabContainer::get_minimum_size() const { } Vector<Control *> controls = _get_tab_controls(); - int max_control_height = 0; + Size2 largest_child_min_size; for (int i = 0; i < controls.size(); i++) { Control *c = controls[i]; @@ -847,13 +847,14 @@ Size2 TabContainer::get_minimum_size() const { } Size2 cms = c->get_combined_minimum_size(); - ms.x = MAX(ms.x, cms.x); - max_control_height = MAX(max_control_height, cms.y); + largest_child_min_size.x = MAX(largest_child_min_size.x, cms.x); + largest_child_min_size.y = MAX(largest_child_min_size.y, cms.y); } - ms.y += max_control_height; + ms.y += largest_child_min_size.y; Size2 panel_ms = theme_cache.panel_style->get_minimum_size(); - ms.x = MAX(ms.x, panel_ms.x); + + ms.x = MAX(ms.x, largest_child_min_size.x + panel_ms.x); ms.y += panel_ms.y; return ms; diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index 318447ecd8..38302136d6 100644 --- a/scene/gui/text_edit.cpp +++ b/scene/gui/text_edit.cpp @@ -1201,13 +1201,14 @@ void TextEdit::_notification(int p_what) { current_color.a = font_readonly_color.a; } } + Color gl_color = current_color; if (selection.active && line >= selection.from_line && line <= selection.to_line) { // Selection int sel_from = (line > selection.from_line) ? TS->shaped_text_get_range(rid).x : selection.from_column; int sel_to = (line < selection.to_line) ? TS->shaped_text_get_range(rid).y : selection.to_column; if (glyphs[j].start >= sel_from && glyphs[j].end <= sel_to && override_selected_font_color) { - current_color = font_selected_color; + gl_color = font_selected_color; } } @@ -1217,29 +1218,29 @@ void TextEdit::_notification(int p_what) { if ((brace_open_match_line == line && brace_open_match_column == glyphs[j].start) || (caret.column == glyphs[j].start && caret.line == line && caret_wrap_index == line_wrap_index && (brace_open_matching || brace_open_mismatch))) { if (brace_open_mismatch) { - current_color = brace_mismatch_color; + gl_color = brace_mismatch_color; } Rect2 rect = Rect2(char_pos, ofs_y + font->get_underline_position(font_size), glyphs[j].advance * glyphs[j].repeat, MAX(font->get_underline_thickness(font_size) * get_theme_default_base_scale(), 1)); - draw_rect(rect, current_color); + draw_rect(rect, gl_color); } if ((brace_close_match_line == line && brace_close_match_column == glyphs[j].start) || (caret.column == glyphs[j].start + 1 && caret.line == line && caret_wrap_index == line_wrap_index && (brace_close_matching || brace_close_mismatch))) { if (brace_close_mismatch) { - current_color = brace_mismatch_color; + gl_color = brace_mismatch_color; } Rect2 rect = Rect2(char_pos, ofs_y + font->get_underline_position(font_size), glyphs[j].advance * glyphs[j].repeat, MAX(font->get_underline_thickness(font_size) * get_theme_default_base_scale(), 1)); - draw_rect(rect, current_color); + draw_rect(rect, gl_color); } } if (draw_tabs && ((glyphs[j].flags & TextServer::GRAPHEME_IS_TAB) == TextServer::GRAPHEME_IS_TAB)) { int yofs = (text_height - tab_icon->get_height()) / 2 - ldata->get_line_ascent(line_wrap_index); - tab_icon->draw(ci, Point2(char_pos, ofs_y + yofs), current_color); + tab_icon->draw(ci, Point2(char_pos, ofs_y + yofs), gl_color); } else if (draw_spaces && ((glyphs[j].flags & TextServer::GRAPHEME_IS_SPACE) == TextServer::GRAPHEME_IS_SPACE)) { int yofs = (text_height - space_icon->get_height()) / 2 - ldata->get_line_ascent(line_wrap_index); int xofs = (glyphs[j].advance * glyphs[j].repeat - space_icon->get_width()) / 2; - space_icon->draw(ci, Point2(char_pos + xofs, ofs_y + yofs), current_color); + space_icon->draw(ci, Point2(char_pos + xofs, ofs_y + yofs), gl_color); } } @@ -1247,10 +1248,10 @@ void TextEdit::_notification(int p_what) { for (int k = 0; k < glyphs[j].repeat; k++) { if (!clipped && (char_ofs + char_margin) >= xmargin_beg && (char_ofs + glyphs[j].advance + char_margin) <= xmargin_end) { if (glyphs[j].font_rid != RID()) { - TS->font_draw_glyph(glyphs[j].font_rid, ci, glyphs[j].font_size, Vector2(char_margin + char_ofs + ofs_x + glyphs[j].x_off, ofs_y + glyphs[j].y_off), glyphs[j].index, current_color); + TS->font_draw_glyph(glyphs[j].font_rid, ci, glyphs[j].font_size, Vector2(char_margin + char_ofs + ofs_x + glyphs[j].x_off, ofs_y + glyphs[j].y_off), glyphs[j].index, gl_color); had_glyphs_drawn = true; } else if ((glyphs[j].flags & TextServer::GRAPHEME_IS_VIRTUAL) != TextServer::GRAPHEME_IS_VIRTUAL) { - TS->draw_hex_code_box(ci, glyphs[j].font_size, Vector2(char_margin + char_ofs + ofs_x + glyphs[j].x_off, ofs_y + glyphs[j].y_off), glyphs[j].index, current_color); + TS->draw_hex_code_box(ci, glyphs[j].font_size, Vector2(char_margin + char_ofs + ofs_x + glyphs[j].x_off, ofs_y + glyphs[j].y_off), glyphs[j].index, gl_color); had_glyphs_drawn = true; } } diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp index 237c78407b..f82a853e56 100644 --- a/scene/gui/tree.cpp +++ b/scene/gui/tree.cpp @@ -563,6 +563,57 @@ bool TreeItem::is_collapsed() { return collapsed; } +void TreeItem::set_collapsed_recursive(bool p_collapsed) { + if (!tree) { + return; + } + + set_collapsed(p_collapsed); + + TreeItem *child = get_first_child(); + while (child) { + child->set_collapsed_recursive(p_collapsed); + child = child->get_next(); + } +} + +bool TreeItem::_is_any_collapsed(bool p_only_visible) { + TreeItem *child = get_first_child(); + + // Check on children directly first (avoid recursing if possible). + while (child) { + if (child->get_first_child() && child->is_collapsed() && (!p_only_visible || (child->is_visible() && child->get_visible_child_count()))) { + return true; + } + child = child->get_next(); + } + + child = get_first_child(); + + // Otherwise recurse on children. + while (child) { + if (child->get_first_child() && (!p_only_visible || (child->is_visible() && child->get_visible_child_count())) && child->_is_any_collapsed(p_only_visible)) { + return true; + } + child = child->get_next(); + } + + return false; +} + +bool TreeItem::is_any_collapsed(bool p_only_visible) { + if (p_only_visible && !is_visible()) { + return false; + } + + // Collapsed if this is collapsed and it has children (only considers visible if only visible is set). + if (is_collapsed() && get_first_child() && (!p_only_visible || get_visible_child_count())) { + return true; + } + + return _is_any_collapsed(p_only_visible); +} + void TreeItem::set_visible(bool p_visible) { if (visible == p_visible) { return; @@ -1406,6 +1457,9 @@ void TreeItem::_bind_methods() { ClassDB::bind_method(D_METHOD("set_collapsed", "enable"), &TreeItem::set_collapsed); ClassDB::bind_method(D_METHOD("is_collapsed"), &TreeItem::is_collapsed); + ClassDB::bind_method(D_METHOD("set_collapsed_recursive", "enable"), &TreeItem::set_collapsed_recursive); + ClassDB::bind_method(D_METHOD("is_any_collapsed", "only_visible"), &TreeItem::is_any_collapsed, DEFVAL(false)); + ClassDB::bind_method(D_METHOD("set_visible", "enable"), &TreeItem::set_visible); ClassDB::bind_method(D_METHOD("is_visible"), &TreeItem::is_visible); @@ -2572,7 +2626,11 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, int } if (!p_item->disable_folding && !hide_folding && p_item->first_child && (p_pos.x >= x_ofs && p_pos.x < (x_ofs + theme_cache.item_margin))) { - p_item->set_collapsed(!p_item->is_collapsed()); + if (enable_recursive_folding && p_mod->is_shift_pressed()) { + p_item->set_collapsed_recursive(!p_item->is_collapsed()); + } else { + p_item->set_collapsed(!p_item->is_collapsed()); + } return -1; } @@ -2623,7 +2681,11 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, int } if (!p_item->disable_folding && !hide_folding && !p_item->cells[col].editable && !p_item->cells[col].selectable && p_item->get_first_child()) { - p_item->set_collapsed(!p_item->is_collapsed()); + if (enable_recursive_folding && p_mod->is_shift_pressed()) { + p_item->set_collapsed_recursive(!p_item->is_collapsed()); + } else { + p_item->set_collapsed(!p_item->is_collapsed()); + } return -1; //collapse/uncollapse because nothing can be done with item } @@ -5026,6 +5088,14 @@ bool Tree::is_folding_hidden() const { return hide_folding; } +void Tree::set_enable_recursive_folding(bool p_enable) { + enable_recursive_folding = p_enable; +} + +bool Tree::is_recursive_folding_enabled() const { + return enable_recursive_folding; +} + void Tree::set_drop_mode_flags(int p_flags) { if (drop_mode_flags == p_flags) { return; @@ -5129,6 +5199,9 @@ void Tree::_bind_methods() { ClassDB::bind_method(D_METHOD("set_hide_folding", "hide"), &Tree::set_hide_folding); ClassDB::bind_method(D_METHOD("is_folding_hidden"), &Tree::is_folding_hidden); + ClassDB::bind_method(D_METHOD("set_enable_recursive_folding", "enable"), &Tree::set_enable_recursive_folding); + ClassDB::bind_method(D_METHOD("is_recursive_folding_enabled"), &Tree::is_recursive_folding_enabled); + ClassDB::bind_method(D_METHOD("set_drop_mode_flags", "flags"), &Tree::set_drop_mode_flags); ClassDB::bind_method(D_METHOD("get_drop_mode_flags"), &Tree::get_drop_mode_flags); @@ -5143,6 +5216,7 @@ void Tree::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "allow_reselect"), "set_allow_reselect", "get_allow_reselect"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "allow_rmb_select"), "set_allow_rmb_select", "get_allow_rmb_select"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "hide_folding"), "set_hide_folding", "is_folding_hidden"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "enable_recursive_folding"), "set_enable_recursive_folding", "is_recursive_folding_enabled"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "hide_root"), "set_hide_root", "is_root_hidden"); ADD_PROPERTY(PropertyInfo(Variant::INT, "drop_mode_flags", PROPERTY_HINT_FLAGS, "On Item,In Between"), "set_drop_mode_flags", "get_drop_mode_flags"); ADD_PROPERTY(PropertyInfo(Variant::INT, "select_mode", PROPERTY_HINT_ENUM, "Single,Row,Multi"), "set_select_mode", "get_select_mode"); diff --git a/scene/gui/tree.h b/scene/gui/tree.h index 450943c048..f994a5cec1 100644 --- a/scene/gui/tree.h +++ b/scene/gui/tree.h @@ -173,6 +173,8 @@ private: } } + bool _is_any_collapsed(bool p_only_visible); + protected: static void _bind_methods(); @@ -272,6 +274,9 @@ public: void set_collapsed(bool p_collapsed); bool is_collapsed(); + void set_collapsed_recursive(bool p_collapsed); + bool is_any_collapsed(bool p_only_visible = false); + void set_visible(bool p_visible); bool is_visible(); @@ -613,6 +618,8 @@ private: bool hide_folding = false; + bool enable_recursive_folding = true; + int _count_selected_items(TreeItem *p_from) const; bool _is_branch_selected(TreeItem *p_from) const; bool _is_sibling_branch_selected(TreeItem *p_from) const; @@ -712,6 +719,9 @@ public: void set_hide_folding(bool p_hide); bool is_folding_hidden() const; + void set_enable_recursive_folding(bool p_enable); + bool is_recursive_folding_enabled() const; + void set_drop_mode_flags(int p_flags); int get_drop_mode_flags() const; diff --git a/scene/gui/video_stream_player.cpp b/scene/gui/video_stream_player.cpp index 1e03ed6e76..0ea49b1645 100644 --- a/scene/gui/video_stream_player.cpp +++ b/scene/gui/video_stream_player.cpp @@ -381,14 +381,14 @@ String VideoStreamPlayer::get_stream_name() const { return stream->get_name(); } -float VideoStreamPlayer::get_stream_position() const { +double VideoStreamPlayer::get_stream_position() const { if (playback.is_null()) { return 0; } return playback->get_playback_position(); } -void VideoStreamPlayer::set_stream_position(float p_position) { +void VideoStreamPlayer::set_stream_position(double p_position) { if (playback.is_valid()) { playback->seek(p_position); } diff --git a/scene/gui/video_stream_player.h b/scene/gui/video_stream_player.h index 9974eb8488..b1ba8a65d7 100644 --- a/scene/gui/video_stream_player.h +++ b/scene/gui/video_stream_player.h @@ -105,8 +105,8 @@ public: float get_volume_db() const; String get_stream_name() const; - float get_stream_position() const; - void set_stream_position(float p_position); + double get_stream_position() const; + void set_stream_position(double p_position); void set_autoplay(bool p_enable); bool has_autoplay() const; diff --git a/scene/main/canvas_item.cpp b/scene/main/canvas_item.cpp index 093e4a8cd3..05d86f77f2 100644 --- a/scene/main/canvas_item.cpp +++ b/scene/main/canvas_item.cpp @@ -373,7 +373,7 @@ void CanvasItem::move_to_front() { if (!get_parent()) { return; } - get_parent()->move_child(this, get_parent()->get_child_count() - 1); + get_parent()->move_child(this, -1); } void CanvasItem::set_modulate(const Color &p_modulate) { diff --git a/scene/main/http_request.cpp b/scene/main/http_request.cpp index bec378dd91..2c395ec07d 100644 --- a/scene/main/http_request.cpp +++ b/scene/main/http_request.cpp @@ -32,9 +32,6 @@ #include "core/io/compression.h" #include "scene/main/timer.h" -void HTTPRequest::_redirect_request(const String &p_new_url) { -} - Error HTTPRequest::_request() { return client->connect_to_host(url, port, use_tls, validate_tls); } @@ -48,6 +45,7 @@ Error HTTPRequest::_parse_url(const String &p_url) { body_len = -1; body.clear(); downloaded.set(0); + final_body_size.set(0); redirections = 0; String scheme; @@ -153,7 +151,7 @@ Error HTTPRequest::request_raw(const String &p_url, const Vector<String> &p_cust client->set_blocking_mode(false); err = _request(); if (err != OK) { - call_deferred(SNAME("_request_done"), RESULT_CANT_CONNECT, 0, PackedStringArray(), PackedByteArray()); + _defer_done(RESULT_CANT_CONNECT, 0, PackedStringArray(), PackedByteArray()); return ERR_CANT_CONNECT; } @@ -169,7 +167,7 @@ void HTTPRequest::_thread_func(void *p_userdata) { Error err = hr->_request(); if (err != OK) { - hr->call_deferred(SNAME("_request_done"), RESULT_CANT_CONNECT, 0, PackedStringArray(), PackedByteArray()); + hr->_defer_done(RESULT_CANT_CONNECT, 0, PackedStringArray(), PackedByteArray()); } else { while (!hr->thread_request_quit.is_set()) { bool exit = hr->_update_connection(); @@ -198,6 +196,7 @@ void HTTPRequest::cancel_request() { } file.unref(); + decompressor.unref(); client->close(); body.clear(); got_response = false; @@ -208,7 +207,7 @@ void HTTPRequest::cancel_request() { bool HTTPRequest::_handle_response(bool *ret_value) { if (!client->has_response()) { - call_deferred(SNAME("_request_done"), RESULT_NO_RESPONSE, 0, PackedStringArray(), PackedByteArray()); + _defer_done(RESULT_NO_RESPONSE, 0, PackedStringArray(), PackedByteArray()); *ret_value = true; return true; } @@ -219,6 +218,9 @@ bool HTTPRequest::_handle_response(bool *ret_value) { client->get_response_headers(&rheaders); response_headers.clear(); downloaded.set(0); + final_body_size.set(0); + decompressor.unref(); + for (const String &E : rheaders) { response_headers.push_back(E); } @@ -227,7 +229,7 @@ bool HTTPRequest::_handle_response(bool *ret_value) { // Handle redirect. if (max_redirects >= 0 && redirections >= max_redirects) { - call_deferred(SNAME("_request_done"), RESULT_REDIRECT_LIMIT_REACHED, response_code, response_headers, PackedByteArray()); + _defer_done(RESULT_REDIRECT_LIMIT_REACHED, response_code, response_headers, PackedByteArray()); *ret_value = true; return true; } @@ -259,6 +261,7 @@ bool HTTPRequest::_handle_response(bool *ret_value) { body_len = -1; body.clear(); downloaded.set(0); + final_body_size.set(0); redirections = new_redirs; *ret_value = false; return true; @@ -266,13 +269,26 @@ bool HTTPRequest::_handle_response(bool *ret_value) { } } + // Check if we need to start streaming decompression. + String content_encoding; + if (accept_gzip) { + content_encoding = get_header_value(response_headers, "Content-Encoding").to_lower(); + } + if (content_encoding == "gzip") { + decompressor.instantiate(); + decompressor->start_decompression(false, get_download_chunk_size() * 2); + } else if (content_encoding == "deflate") { + decompressor.instantiate(); + decompressor->start_decompression(true, get_download_chunk_size() * 2); + } + return false; } bool HTTPRequest::_update_connection() { switch (client->get_status()) { case HTTPClient::STATUS_DISCONNECTED: { - call_deferred(SNAME("_request_done"), RESULT_CANT_CONNECT, 0, PackedStringArray(), PackedByteArray()); + _defer_done(RESULT_CANT_CONNECT, 0, PackedStringArray(), PackedByteArray()); return true; // End it, since it's disconnected. } break; case HTTPClient::STATUS_RESOLVING: { @@ -281,7 +297,7 @@ bool HTTPRequest::_update_connection() { return false; } break; case HTTPClient::STATUS_CANT_RESOLVE: { - call_deferred(SNAME("_request_done"), RESULT_CANT_RESOLVE, 0, PackedStringArray(), PackedByteArray()); + _defer_done(RESULT_CANT_RESOLVE, 0, PackedStringArray(), PackedByteArray()); return true; } break; @@ -291,7 +307,7 @@ bool HTTPRequest::_update_connection() { return false; } break; // Connecting to IP. case HTTPClient::STATUS_CANT_CONNECT: { - call_deferred(SNAME("_request_done"), RESULT_CANT_CONNECT, 0, PackedStringArray(), PackedByteArray()); + _defer_done(RESULT_CANT_CONNECT, 0, PackedStringArray(), PackedByteArray()); return true; } break; @@ -306,16 +322,16 @@ bool HTTPRequest::_update_connection() { return ret_value; } - call_deferred(SNAME("_request_done"), RESULT_SUCCESS, response_code, response_headers, PackedByteArray()); + _defer_done(RESULT_SUCCESS, response_code, response_headers, PackedByteArray()); return true; } if (body_len < 0) { // Chunked transfer is done. - call_deferred(SNAME("_request_done"), RESULT_SUCCESS, response_code, response_headers, body); + _defer_done(RESULT_SUCCESS, response_code, response_headers, body); return true; } - call_deferred(SNAME("_request_done"), RESULT_CHUNKED_BODY_SIZE_MISMATCH, response_code, response_headers, PackedByteArray()); + _defer_done(RESULT_CHUNKED_BODY_SIZE_MISMATCH, response_code, response_headers, PackedByteArray()); return true; // Request might have been done. } else { @@ -324,7 +340,7 @@ bool HTTPRequest::_update_connection() { int size = request_data.size(); Error err = client->request(method, request_string, headers, size > 0 ? request_data.ptr() : nullptr, size); if (err != OK) { - call_deferred(SNAME("_request_done"), RESULT_CONNECTION_ERROR, 0, PackedStringArray(), PackedByteArray()); + _defer_done(RESULT_CONNECTION_ERROR, 0, PackedStringArray(), PackedByteArray()); return true; } @@ -347,7 +363,7 @@ bool HTTPRequest::_update_connection() { } if (!client->is_response_chunked() && client->get_response_body_length() == 0) { - call_deferred(SNAME("_request_done"), RESULT_SUCCESS, response_code, response_headers, PackedByteArray()); + _defer_done(RESULT_SUCCESS, response_code, response_headers, PackedByteArray()); return true; } @@ -356,14 +372,14 @@ bool HTTPRequest::_update_connection() { body_len = client->get_response_body_length(); if (body_size_limit >= 0 && body_len > body_size_limit) { - call_deferred(SNAME("_request_done"), RESULT_BODY_SIZE_LIMIT_EXCEEDED, response_code, response_headers, PackedByteArray()); + _defer_done(RESULT_BODY_SIZE_LIMIT_EXCEEDED, response_code, response_headers, PackedByteArray()); return true; } if (!download_to_file.is_empty()) { file = FileAccess::open(download_to_file, FileAccess::WRITE); if (file.is_null()) { - call_deferred(SNAME("_request_done"), RESULT_DOWNLOAD_FILE_CANT_OPEN, response_code, response_headers, PackedByteArray()); + _defer_done(RESULT_DOWNLOAD_FILE_CANT_OPEN, response_code, response_headers, PackedByteArray()); return true; } } @@ -375,14 +391,33 @@ bool HTTPRequest::_update_connection() { } PackedByteArray chunk = client->read_response_body_chunk(); + downloaded.add(chunk.size()); + + // Decompress chunk if needed. + if (decompressor.is_valid()) { + Error err = decompressor->put_data(chunk.ptr(), chunk.size()); + if (err == OK) { + chunk.resize(decompressor->get_available_bytes()); + err = decompressor->get_data(chunk.ptrw(), chunk.size()); + } + if (err != OK) { + _defer_done(RESULT_BODY_DECOMPRESS_FAILED, response_code, response_headers, PackedByteArray()); + return true; + } + } + final_body_size.add(chunk.size()); + + if (body_size_limit >= 0 && final_body_size.get() > body_size_limit) { + _defer_done(RESULT_BODY_SIZE_LIMIT_EXCEEDED, response_code, response_headers, PackedByteArray()); + return true; + } if (chunk.size()) { - downloaded.add(chunk.size()); if (file.is_valid()) { const uint8_t *r = chunk.ptr(); file->store_buffer(r, chunk.size()); if (file->get_error() != OK) { - call_deferred(SNAME("_request_done"), RESULT_DOWNLOAD_FILE_WRITE_ERROR, response_code, response_headers, PackedByteArray()); + _defer_done(RESULT_DOWNLOAD_FILE_WRITE_ERROR, response_code, response_headers, PackedByteArray()); return true; } } else { @@ -390,19 +425,14 @@ bool HTTPRequest::_update_connection() { } } - if (body_size_limit >= 0 && downloaded.get() > body_size_limit) { - call_deferred(SNAME("_request_done"), RESULT_BODY_SIZE_LIMIT_EXCEEDED, response_code, response_headers, PackedByteArray()); - return true; - } - if (body_len >= 0) { if (downloaded.get() == body_len) { - call_deferred(SNAME("_request_done"), RESULT_SUCCESS, response_code, response_headers, body); + _defer_done(RESULT_SUCCESS, response_code, response_headers, body); return true; } } else if (client->get_status() == HTTPClient::STATUS_DISCONNECTED) { // We read till EOF, with no errors. Request is done. - call_deferred(SNAME("_request_done"), RESULT_SUCCESS, response_code, response_headers, body); + _defer_done(RESULT_SUCCESS, response_code, response_headers, body); return true; } @@ -410,11 +440,11 @@ bool HTTPRequest::_update_connection() { } break; // Request resulted in body: break which must be read. case HTTPClient::STATUS_CONNECTION_ERROR: { - call_deferred(SNAME("_request_done"), RESULT_CONNECTION_ERROR, 0, PackedStringArray(), PackedByteArray()); + _defer_done(RESULT_CONNECTION_ERROR, 0, PackedStringArray(), PackedByteArray()); return true; } break; case HTTPClient::STATUS_TLS_HANDSHAKE_ERROR: { - call_deferred(SNAME("_request_done"), RESULT_TLS_HANDSHAKE_ERROR, 0, PackedStringArray(), PackedByteArray()); + _defer_done(RESULT_TLS_HANDSHAKE_ERROR, 0, PackedStringArray(), PackedByteArray()); return true; } break; } @@ -422,41 +452,13 @@ bool HTTPRequest::_update_connection() { ERR_FAIL_V(false); } +void HTTPRequest::_defer_done(int p_status, int p_code, const PackedStringArray &p_headers, const PackedByteArray &p_data) { + call_deferred(SNAME("_request_done"), p_status, p_code, p_headers, p_data); +} + void HTTPRequest::_request_done(int p_status, int p_code, const PackedStringArray &p_headers, const PackedByteArray &p_data) { cancel_request(); - // Determine if the request body is compressed. - bool is_compressed; - String content_encoding = get_header_value(p_headers, "Content-Encoding").to_lower(); - Compression::Mode mode; - if (content_encoding == "gzip") { - mode = Compression::Mode::MODE_GZIP; - is_compressed = true; - } else if (content_encoding == "deflate") { - mode = Compression::Mode::MODE_DEFLATE; - is_compressed = true; - } else { - is_compressed = false; - } - - if (accept_gzip && is_compressed && p_data.size() > 0) { - // Decompress request body - PackedByteArray decompressed; - int result = Compression::decompress_dynamic(&decompressed, body_size_limit, p_data.ptr(), p_data.size(), mode); - if (result == OK) { - emit_signal(SNAME("request_completed"), p_status, p_code, p_headers, decompressed); - return; - } else if (result == -5) { - WARN_PRINT("Decompressed size of HTTP response body exceeded body_size_limit"); - p_status = RESULT_BODY_SIZE_LIMIT_EXCEEDED; - // Just return the raw data if we failed to decompress it. - } else { - WARN_PRINT("Failed to decompress HTTP response body"); - p_status = RESULT_BODY_DECOMPRESS_FAILED; - // Just return the raw data if we failed to decompress it. - } - } - emit_signal(SNAME("request_completed"), p_status, p_code, p_headers, p_data); } @@ -566,7 +568,7 @@ double HTTPRequest::get_timeout() { void HTTPRequest::_timeout() { cancel_request(); - call_deferred(SNAME("_request_done"), RESULT_TIMEOUT, 0, PackedStringArray(), PackedByteArray()); + _defer_done(RESULT_TIMEOUT, 0, PackedStringArray(), PackedByteArray()); } void HTTPRequest::_bind_methods() { @@ -594,7 +596,6 @@ void HTTPRequest::_bind_methods() { ClassDB::bind_method(D_METHOD("get_downloaded_bytes"), &HTTPRequest::get_downloaded_bytes); ClassDB::bind_method(D_METHOD("get_body_size"), &HTTPRequest::get_body_size); - ClassDB::bind_method(D_METHOD("_redirect_request"), &HTTPRequest::_redirect_request); ClassDB::bind_method(D_METHOD("_request_done"), &HTTPRequest::_request_done); ClassDB::bind_method(D_METHOD("set_timeout", "timeout"), &HTTPRequest::set_timeout); diff --git a/scene/main/http_request.h b/scene/main/http_request.h index 290bacd9d2..80445684b0 100644 --- a/scene/main/http_request.h +++ b/scene/main/http_request.h @@ -32,6 +32,7 @@ #define HTTP_REQUEST_H #include "core/io/http_client.h" +#include "core/io/stream_peer_gzip.h" #include "core/os/thread.h" #include "core/templates/safe_refcount.h" #include "scene/main/node.h" @@ -84,10 +85,12 @@ private: String download_to_file; + Ref<StreamPeerGZIP> decompressor; Ref<FileAccess> file; int body_len = -1; SafeNumeric<int> downloaded; + SafeNumeric<int> final_body_size; int body_size_limit = -1; int redirections = 0; @@ -113,6 +116,7 @@ private: Thread thread; + void _defer_done(int p_status, int p_code, const PackedStringArray &p_headers, const PackedByteArray &p_data); void _request_done(int p_status, int p_code, const PackedStringArray &p_headers, const PackedByteArray &p_data); static void _thread_func(void *p_userdata); diff --git a/scene/main/missing_node.cpp b/scene/main/missing_node.cpp index 395fdad9e4..7ce527fd9c 100644 --- a/scene/main/missing_node.cpp +++ b/scene/main/missing_node.cpp @@ -74,9 +74,9 @@ bool MissingNode::is_recording_properties() const { return recording_properties; } -TypedArray<String> MissingNode::get_configuration_warnings() const { +PackedStringArray MissingNode::get_configuration_warnings() const { // The mere existence of this node is warning. - TypedArray<String> ret; + PackedStringArray ret; ret.push_back(vformat(RTR("This node was saved as class type '%s', which was no longer available when this scene was loaded."), original_class)); ret.push_back(RTR("Data from the original node is kept as a placeholder until this type of node is available again. It can hence be safely re-saved without risk of data loss.")); return ret; diff --git a/scene/main/missing_node.h b/scene/main/missing_node.h index d200fbb47f..0003f71f29 100644 --- a/scene/main/missing_node.h +++ b/scene/main/missing_node.h @@ -55,7 +55,7 @@ public: void set_recording_properties(bool p_enable); bool is_recording_properties() const; - virtual TypedArray<String> get_configuration_warnings() const override; + virtual PackedStringArray get_configuration_warnings() const override; MissingNode(); }; diff --git a/scene/main/node.cpp b/scene/main/node.cpp index f01ec99205..bbdba16cb5 100644 --- a/scene/main/node.cpp +++ b/scene/main/node.cpp @@ -328,12 +328,21 @@ void Node::move_child(Node *p_child, int p_pos) { // We need to check whether node is internal and move it only in the relevant node range. if (p_child->_is_internal_front()) { + if (p_pos < 0) { + p_pos += data.internal_children_front; + } ERR_FAIL_INDEX_MSG(p_pos, data.internal_children_front, vformat("Invalid new child position: %d. Child is internal.", p_pos)); _move_child(p_child, p_pos); } else if (p_child->_is_internal_back()) { + if (p_pos < 0) { + p_pos += data.internal_children_back; + } ERR_FAIL_INDEX_MSG(p_pos, data.internal_children_back, vformat("Invalid new child position: %d. Child is internal.", p_pos)); _move_child(p_child, data.children.size() - data.internal_children_back + p_pos); } else { + if (p_pos < 0) { + p_pos += get_child_count(false); + } ERR_FAIL_INDEX_MSG(p_pos, data.children.size() + 1 - data.internal_children_front - data.internal_children_back, vformat("Invalid new child position: %d.", p_pos)); _move_child(p_child, p_pos + data.internal_children_front); } @@ -1457,20 +1466,10 @@ bool Node::is_greater_than(const Node *p_node) const { ERR_FAIL_COND_V(data.depth < 0, false); ERR_FAIL_COND_V(p_node->data.depth < 0, false); -#ifdef NO_ALLOCA - - Vector<int> this_stack; - Vector<int> that_stack; - this_stack.resize(data.depth); - that_stack.resize(p_node->data.depth); - -#else int *this_stack = (int *)alloca(sizeof(int) * data.depth); int *that_stack = (int *)alloca(sizeof(int) * p_node->data.depth); -#endif - const Node *n = this; int idx = data.depth - 1; @@ -1907,43 +1906,6 @@ Ref<Tween> Node::create_tween() { return tween; } -void Node::remove_and_skip() { - ERR_FAIL_COND(!data.parent); - - Node *new_owner = get_owner(); - - List<Node *> children; - - while (true) { - bool clear = true; - for (int i = 0; i < data.children.size(); i++) { - Node *c_node = data.children[i]; - if (!c_node->get_owner()) { - continue; - } - - remove_child(c_node); - c_node->_propagate_replace_owner(this, nullptr); - children.push_back(c_node); - clear = false; - break; - } - - if (clear) { - break; - } - } - - while (!children.is_empty()) { - Node *c_node = children.front()->get(); - data.parent->add_child(c_node); - c_node->_propagate_replace_owner(nullptr, new_owner); - children.pop_front(); - } - - data.parent->remove_child(this); -} - void Node::set_scene_file_path(const String &p_scene_file_path) { data.scene_file_path = p_scene_file_path; } @@ -2668,21 +2630,19 @@ void Node::clear_internal_tree_resource_paths() { } } -TypedArray<String> Node::get_configuration_warnings() const { - TypedArray<String> ret; +PackedStringArray Node::get_configuration_warnings() const { + PackedStringArray ret; Vector<String> warnings; if (GDVIRTUAL_CALL(_get_configuration_warnings, warnings)) { - for (int i = 0; i < warnings.size(); i++) { - ret.push_back(warnings[i]); - } + ret.append_array(warnings); } return ret; } String Node::get_configuration_warnings_as_string() const { - TypedArray<String> warnings = get_configuration_warnings(); + PackedStringArray warnings = get_configuration_warnings(); String all_warnings = String(); for (int i = 0; i < warnings.size(); i++) { if (i > 0) { @@ -2690,7 +2650,7 @@ String Node::get_configuration_warnings_as_string() const { } // Format as a bullet point list to make multiple warnings easier to distinguish // from each other. - all_warnings += String::utf8("• ") + String(warnings[i]); + all_warnings += String::utf8("• ") + warnings[i]; } return all_warnings; } @@ -2803,7 +2763,6 @@ void Node::_bind_methods() { ClassDB::bind_method(D_METHOD("get_groups"), &Node::_get_groups); ClassDB::bind_method(D_METHOD("set_owner", "owner"), &Node::set_owner); ClassDB::bind_method(D_METHOD("get_owner"), &Node::get_owner); - ClassDB::bind_method(D_METHOD("remove_and_skip"), &Node::remove_and_skip); ClassDB::bind_method(D_METHOD("get_index", "include_internal"), &Node::get_index, DEFVAL(false)); ClassDB::bind_method(D_METHOD("print_tree"), &Node::print_tree); ClassDB::bind_method(D_METHOD("print_tree_pretty"), &Node::print_tree_pretty); diff --git a/scene/main/node.h b/scene/main/node.h index 9f07bc28bc..4e6530cccd 100644 --- a/scene/main/node.h +++ b/scene/main/node.h @@ -356,7 +356,6 @@ public: void set_unique_name_in_owner(bool p_enabled); bool is_unique_name_in_owner() const; - void remove_and_skip(); int get_index(bool p_include_internal = true) const; Ref<Tween> create_tween(); @@ -478,7 +477,7 @@ public: _FORCE_INLINE_ Viewport *get_viewport() const { return data.viewport; } - virtual TypedArray<String> get_configuration_warnings() const; + virtual PackedStringArray get_configuration_warnings() const; String get_configuration_warnings_as_string() const; void update_configuration_warnings(); @@ -530,4 +529,8 @@ Error Node::rpc_id(int p_peer_id, const StringName &p_method, VarArgs... p_args) return rpcp(p_peer_id, p_method, sizeof...(p_args) == 0 ? nullptr : (const Variant **)argptrs, sizeof...(p_args)); } +// Add these macro to your class's 'get_configuration_warnings' function to have warnings show up in the scene tree inspector. +#define DEPRECATED_NODE_WARNING warnings.push_back(RTR("This node is marked as deprecated and will be removed in future versions.\nPlease check the Godot documentation for information about migration.")); +#define EXPERIMENTAL_NODE_WARNING warnings.push_back(RTR("This node is marked as experimental and may be subject to removal or major changes in future versions.")); + #endif // NODE_H diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp index c18aa5aaa2..3f71de1b18 100644 --- a/scene/main/scene_tree.cpp +++ b/scene/main/scene_tree.cpp @@ -510,7 +510,7 @@ bool SceneTree::process(double p_time) { return _quit; } -void SceneTree::process_timers(float p_delta, bool p_physics_frame) { +void SceneTree::process_timers(double p_delta, bool p_physics_frame) { List<Ref<SceneTreeTimer>>::Element *L = timers.back(); //last element for (List<Ref<SceneTreeTimer>>::Element *E = timers.front(); E;) { @@ -542,7 +542,7 @@ void SceneTree::process_timers(float p_delta, bool p_physics_frame) { } } -void SceneTree::process_tweens(float p_delta, bool p_physics) { +void SceneTree::process_tweens(double p_delta, bool p_physics) { // This methods works similarly to how SceneTreeTimers are handled. List<Ref<Tween>>::Element *L = tweens.back(); @@ -1085,6 +1085,7 @@ void SceneTree::_change_scene(Node *p_to) { if (p_to) { current_scene = p_to; root->add_child(p_to); + root->update_mouse_cursor_shape(); } } diff --git a/scene/main/scene_tree.h b/scene/main/scene_tree.h index 031a331a99..a460e40597 100644 --- a/scene/main/scene_tree.h +++ b/scene/main/scene_tree.h @@ -180,8 +180,8 @@ private: void node_added(Node *p_node); void node_removed(Node *p_node); void node_renamed(Node *p_node); - void process_timers(float p_delta, bool p_physics_frame); - void process_tweens(float p_delta, bool p_physics_frame); + void process_timers(double p_delta, bool p_physics_frame); + void process_tweens(double p_delta, bool p_physics_frame); Group *add_to_group(const StringName &p_group, Node *p_node); void remove_from_group(const StringName &p_group, Node *p_node); diff --git a/scene/main/shader_globals_override.cpp b/scene/main/shader_globals_override.cpp index 13034c5447..455b8c6866 100644 --- a/scene/main/shader_globals_override.cpp +++ b/scene/main/shader_globals_override.cpp @@ -271,8 +271,8 @@ void ShaderGlobalsOverride::_notification(int p_what) { } } -TypedArray<String> ShaderGlobalsOverride::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray ShaderGlobalsOverride::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!active) { warnings.push_back(RTR("ShaderGlobalsOverride is not active because another node of the same type is in the scene.")); diff --git a/scene/main/shader_globals_override.h b/scene/main/shader_globals_override.h index af99bf9aa7..f3d0074f28 100644 --- a/scene/main/shader_globals_override.h +++ b/scene/main/shader_globals_override.h @@ -58,7 +58,7 @@ protected: static void _bind_methods(); public: - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; ShaderGlobalsOverride(); }; diff --git a/scene/main/timer.cpp b/scene/main/timer.cpp index bb9359ef59..210b60171a 100644 --- a/scene/main/timer.cpp +++ b/scene/main/timer.cpp @@ -180,8 +180,8 @@ void Timer::_set_process(bool p_process, bool p_force) { processing = p_process; } -TypedArray<String> Timer::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray Timer::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (wait_time < 0.05 - CMP_EPSILON) { warnings.push_back(RTR("Very low timer wait times (< 0.05 seconds) may behave in significantly different ways depending on the rendered or physics frame rate.\nConsider using a script's process loop instead of relying on a Timer for very low wait times.")); diff --git a/scene/main/timer.h b/scene/main/timer.h index 8785d31a8a..53503e31b2 100644 --- a/scene/main/timer.h +++ b/scene/main/timer.h @@ -73,7 +73,7 @@ public: double get_time_left() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; void set_timer_process_callback(TimerProcessCallback p_callback); TimerProcessCallback get_timer_process_callback() const; diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index 5295de5c09..234cebd821 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -499,6 +499,13 @@ void Viewport::_notification(int p_what) { // exit event if the change in focus results in the mouse exiting // the window. } break; + + case NOTIFICATION_PREDELETE: { + if (gui_parent) { + gui_parent->gui.tooltip_popup = nullptr; + gui_parent->gui.tooltip_label = nullptr; + } + } break; } } @@ -795,11 +802,20 @@ void Viewport::_set_size(const Size2i &p_size, const Size2i &p_size_2d_override, stretch_transform = p_stretch_transform; to_screen_rect = p_to_screen_rect; - if (p_allocated) { - RS::get_singleton()->viewport_set_size(viewport, size.width, size.height); - } else { - RS::get_singleton()->viewport_set_size(viewport, 0, 0); - } +#ifndef _3D_DISABLED + if (!use_xr) { +#endif + + if (p_allocated) { + RS::get_singleton()->viewport_set_size(viewport, size.width, size.height); + } else { + RS::get_singleton()->viewport_set_size(viewport, 0, 0); + } + +#ifndef _3D_DISABLED + } // if (!use_xr) +#endif + _update_global_transform(); update_configuration_warnings(); @@ -813,6 +829,19 @@ void Viewport::_set_size(const Size2i &p_size, const Size2i &p_size_2d_override, } Size2i Viewport::_get_size() const { +#ifndef _3D_DISABLED + if (use_xr) { + if (XRServer::get_singleton() != nullptr) { + Ref<XRInterface> xr_interface = XRServer::get_singleton()->get_primary_interface(); + if (xr_interface.is_valid() && xr_interface->is_initialized()) { + Size2 xr_size = xr_interface->get_render_target_size(); + return (Size2i)xr_size; + } + } + return Size2i(); + } +#endif // _3D_DISABLED + return size; } @@ -1133,8 +1162,6 @@ void Viewport::_gui_cancel_tooltip() { } if (gui.tooltip_popup) { gui.tooltip_popup->queue_delete(); - gui.tooltip_popup = nullptr; - gui.tooltip_label = nullptr; } } @@ -1197,8 +1224,6 @@ void Viewport::_gui_show_tooltip() { // Remove previous popup if we change something. if (gui.tooltip_popup) { memdelete(gui.tooltip_popup); - gui.tooltip_popup = nullptr; - gui.tooltip_label = nullptr; } if (!tooltip_owner) { @@ -1230,6 +1255,7 @@ void Viewport::_gui_show_tooltip() { panel->set_flag(Window::FLAG_POPUP, false); panel->set_wrap_controls(true); panel->add_child(base_tooltip); + panel->gui_parent = this; gui.tooltip_popup = panel; @@ -1554,7 +1580,7 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { gui.drag_preview_id = ObjectID(); } _propagate_viewport_notification(this, NOTIFICATION_DRAG_END); - // Change mouse accordingly. + get_base_window()->update_mouse_cursor_shape(); } _gui_cancel_tooltip(); @@ -1575,7 +1601,7 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { gui.dragging = false; gui.drag_mouse_over = nullptr; _propagate_viewport_notification(this, NOTIFICATION_DRAG_END); - // Change mouse accordingly. + get_base_window()->update_mouse_cursor_shape(); } gui.mouse_focus_mask &= ~mouse_button_to_mask(mb->get_button_index()); // Remove from mask. @@ -2777,7 +2803,7 @@ void Viewport::push_unhandled_input(const Ref<InputEvent> &p_event, bool p_local } // Shortcut Input. - if (Object::cast_to<InputEventKey>(*ev) != nullptr || Object::cast_to<InputEventShortcut>(*ev) != nullptr) { + if (Object::cast_to<InputEventKey>(*ev) != nullptr || Object::cast_to<InputEventShortcut>(*ev) != nullptr || Object::cast_to<InputEventJoypadButton>(*ev) != nullptr) { get_tree()->_call_input_pause(shortcut_input_group, SceneTree::CALL_INPUT_TYPE_SHORTCUT_INPUT, ev, this); } @@ -2850,8 +2876,8 @@ Variant Viewport::gui_get_drag_data() const { return gui.drag_data; } -TypedArray<String> Viewport::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray Viewport::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (size.x <= 1 || size.y <= 1) { warnings.push_back(RTR("The Viewport size must be greater than or equal to 2 pixels on both dimensions to render anything.")); @@ -3612,9 +3638,20 @@ void Viewport::_propagate_exit_world_3d(Node *p_node) { } void Viewport::set_use_xr(bool p_use_xr) { - use_xr = p_use_xr; + if (use_xr != p_use_xr) { + use_xr = p_use_xr; + + RS::get_singleton()->viewport_set_use_xr(viewport, use_xr); - RS::get_singleton()->viewport_set_use_xr(viewport, use_xr); + if (!use_xr) { + // Set viewport to previous size when exiting XR. + if (size_allocated) { + RS::get_singleton()->viewport_set_size(viewport, size.width, size.height); + } else { + RS::get_singleton()->viewport_set_size(viewport, 0, 0); + } + } + } } bool Viewport::is_using_xr() { @@ -4102,7 +4139,7 @@ Transform2D SubViewport::_stretch_transform() { Transform2D transform = Transform2D(); Size2i view_size_2d_override = _get_size_2d_override(); if (size_2d_override_stretch && view_size_2d_override.width > 0 && view_size_2d_override.height > 0) { - Size2 scale = _get_size() / view_size_2d_override; + Size2 scale = Size2(_get_size()) / Size2(view_size_2d_override); transform.scale(scale); } diff --git a/scene/main/viewport.h b/scene/main/viewport.h index afea3ea56c..6f67649ea3 100644 --- a/scene/main/viewport.h +++ b/scene/main/viewport.h @@ -208,6 +208,7 @@ private: friend class ViewportTexture; Viewport *parent = nullptr; + Viewport *gui_parent = nullptr; // Whose gui.tooltip_popup it is. AudioListener2D *audio_listener_2d = nullptr; Camera2D *camera_2d = nullptr; @@ -568,7 +569,7 @@ public: bool is_input_disabled() const; Vector2 get_mouse_position() const; - virtual void warp_mouse(const Vector2 &p_position); + void warp_mouse(const Vector2 &p_position); void set_physics_object_picking(bool p_enable); bool get_physics_object_picking(); @@ -581,7 +582,7 @@ public: void gui_release_focus(); Control *gui_get_focus_owner(); - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; void set_debug_draw(DebugDraw p_debug_draw); DebugDraw get_debug_draw() const; diff --git a/scene/main/window.cpp b/scene/main/window.cpp index 04f56bb874..f7099f3765 100644 --- a/scene/main/window.cpp +++ b/scene/main/window.cpp @@ -389,9 +389,24 @@ void Window::_event_callback(DisplayServer::WindowEvent p_event) { _propagate_window_notification(this, NOTIFICATION_WM_DPI_CHANGE); emit_signal(SNAME("dpi_changed")); } break; + case DisplayServer::WINDOW_EVENT_TITLEBAR_CHANGE: { + emit_signal(SNAME("titlebar_changed")); + } break; } } +void Window::update_mouse_cursor_shape() { + // The default shape is set in Viewport::_gui_input_event. To instantly + // see the shape in the viewport we need to trigger a mouse motion event. + Ref<InputEventMouseMotion> mm; + Vector2 pos = get_mouse_position(); + Transform2D xform = get_global_canvas_transform().affine_inverse(); + mm.instantiate(); + mm->set_position(pos); + mm->set_global_position(xform.xform(pos)); + push_input(mm); +} + void Window::show() { set_visible(true); } @@ -986,18 +1001,6 @@ DisplayServer::WindowID Window::get_window_id() const { return window_id; } -void Window::warp_mouse(const Vector2 &p_position) { - Transform2D xform = get_screen_transform(); - Vector2 gpos = xform.xform(p_position); - - if (transient_parent && !transient_parent->is_embedding_subwindows()) { - Transform2D window_trans = Transform2D().translated(get_position() + (transient_parent->get_visible_rect().size - transient_parent->get_real_size())); - gpos = window_trans.xform(gpos); - } - - Input::get_singleton()->warp_mouse(gpos); -} - void Window::set_wrap_controls(bool p_enable) { wrap_controls = p_enable; if (wrap_controls) { @@ -1153,7 +1156,7 @@ void Window::popup_centered_clamped(const Size2i &p_size, float p_fallback_ratio Rect2 parent_rect; if (is_embedded()) { - parent_rect = get_parent_viewport()->get_visible_rect(); + parent_rect = _get_embedder()->get_visible_rect(); } else { DisplayServer::WindowID parent_id = get_parent_visible_window()->get_window_id(); int parent_screen = DisplayServer::get_singleton()->window_get_current_screen(parent_id); @@ -1179,7 +1182,7 @@ void Window::popup_centered(const Size2i &p_minsize) { Rect2 parent_rect; if (is_embedded()) { - parent_rect = get_parent_viewport()->get_visible_rect(); + parent_rect = _get_embedder()->get_visible_rect(); } else { DisplayServer::WindowID parent_id = get_parent_visible_window()->get_window_id(); int parent_screen = DisplayServer::get_singleton()->window_get_current_screen(parent_id); @@ -1207,7 +1210,7 @@ void Window::popup_centered_ratio(float p_ratio) { Rect2 parent_rect; if (is_embedded()) { - parent_rect = get_parent_viewport()->get_visible_rect(); + parent_rect = _get_embedder()->get_visible_rect(); } else { DisplayServer::WindowID parent_id = get_parent_visible_window()->get_window_id(); int parent_screen = DisplayServer::get_singleton()->window_get_current_screen(parent_id); @@ -1260,6 +1263,19 @@ void Window::popup(const Rect2i &p_screen_rect) { set_transient(true); set_visible(true); + + Rect2i parent_rect; + if (is_embedded()) { + parent_rect = _get_embedder()->get_visible_rect(); + } else { + int screen_id = DisplayServer::get_singleton()->window_get_current_screen(get_window_id()); + parent_rect = DisplayServer::get_singleton()->screen_get_usable_rect(screen_id); + } + if (parent_rect != Rect2i() && !parent_rect.intersects(Rect2i(position, size))) { + ERR_PRINT(vformat("Window %d spawned at invalid position: %s.", get_window_id(), position)); + set_position((parent_rect.size - size) / 2); + } + _post_popup(); notification(NOTIFICATION_POST_POPUP); } @@ -1794,6 +1810,7 @@ void Window::_bind_methods() { ADD_SIGNAL(MethodInfo("visibility_changed")); ADD_SIGNAL(MethodInfo("about_to_popup")); ADD_SIGNAL(MethodInfo("theme_changed")); + ADD_SIGNAL(MethodInfo("titlebar_changed")); BIND_CONSTANT(NOTIFICATION_VISIBILITY_CHANGED); BIND_CONSTANT(NOTIFICATION_THEME_CHANGED); diff --git a/scene/main/window.h b/scene/main/window.h index 8113117103..786f0ada38 100644 --- a/scene/main/window.h +++ b/scene/main/window.h @@ -220,6 +220,8 @@ public: void set_visible(bool p_visible); bool is_visible() const; + void update_mouse_cursor_shape(); + void show(); void hide(); @@ -254,8 +256,6 @@ public: void set_use_font_oversampling(bool p_oversampling); bool is_using_font_oversampling() const; - void warp_mouse(const Vector2 &p_position) override; - void set_wrap_controls(bool p_enable); bool is_wrapping_controls() const; void child_controls_changed(); diff --git a/scene/register_scene_types.cpp b/scene/register_scene_types.cpp index 72c57f1bfc..e536aeee51 100644 --- a/scene/register_scene_types.cpp +++ b/scene/register_scene_types.cpp @@ -794,6 +794,7 @@ void register_scene_types() { GDREGISTER_CLASS(CylinderMesh); GDREGISTER_CLASS(PlaneMesh); GDREGISTER_CLASS(PrismMesh); + GDREGISTER_CLASS(QuadMesh); GDREGISTER_CLASS(SphereMesh); GDREGISTER_CLASS(TextMesh); GDREGISTER_CLASS(TorusMesh); @@ -959,7 +960,6 @@ void register_scene_types() { ClassDB::add_compatibility_class("Navigation3D", "Node3D"); ClassDB::add_compatibility_class("Navigation2D", "Node2D"); ClassDB::add_compatibility_class("OpenSimplexNoise", "FastNoiseLite"); - ClassDB::add_compatibility_class("QuadMesh", "PlaneMesh"); ClassDB::add_compatibility_class("ToolButton", "Button"); ClassDB::add_compatibility_class("YSort", "Node2D"); // Portal and room occlusion was replaced by raster occlusion (OccluderInstance3D node). diff --git a/scene/resources/animation.cpp b/scene/resources/animation.cpp index 9d5bc18c96..f2ac1c2e58 100644 --- a/scene/resources/animation.cpp +++ b/scene/resources/animation.cpp @@ -2102,11 +2102,9 @@ bool Animation::track_is_compressed(int p_track) const { return bst->compressed_track >= 0; } break; default: { - return false; //animation does not really use transitions + return false; // Animation does not really use transitions. } break; } - - ERR_FAIL_V(false); } void Animation::track_set_key_value(int p_track, int p_key_idx, const Variant &p_value) { @@ -2317,9 +2315,7 @@ Quaternion Animation::_interpolate(const Quaternion &p_a, const Quaternion &p_b, } Variant Animation::_interpolate(const Variant &p_a, const Variant &p_b, real_t p_c) const { - Variant dst; - Variant::interpolate(p_a, p_b, p_c, dst); - return dst; + return interpolate_variant(p_a, p_b, p_c); } real_t Animation::_interpolate(const real_t &p_a, const real_t &p_b, real_t p_c) const { @@ -5563,6 +5559,466 @@ bool Animation::_fetch_compressed_by_index(uint32_t p_compressed_track, int p_in return false; } +// Helper math functions for Variant. +Variant Animation::add_variant(const Variant &a, const Variant &b) { + if (a.get_type() != b.get_type()) { + return a; + } + + switch (a.get_type()) { + case Variant::NIL: { + return Variant(); + } + case Variant::BOOL: { + return (a.operator real_t()) + (b.operator real_t()); // It is cast for interpolation. + } + case Variant::RECT2: { + const Rect2 ra = a.operator Rect2(); + const Rect2 rb = b.operator Rect2(); + return Rect2(ra.position + rb.position, ra.size + rb.size); + } + case Variant::RECT2I: { + const Rect2i ra = a.operator Rect2i(); + const Rect2i rb = b.operator Rect2i(); + return Rect2i(ra.position + rb.position, ra.size + rb.size); + } + case Variant::PLANE: { + const Plane pa = a.operator Plane(); + const Plane pb = b.operator Plane(); + return Plane(pa.normal + pb.normal, pa.d + pb.d); + } + case Variant::AABB: { + const ::AABB aa = a.operator ::AABB(); + const ::AABB ab = b.operator ::AABB(); + return ::AABB(aa.position + ab.position, aa.size + ab.size); + } + case Variant::QUATERNION: { + return (a.operator Quaternion()) * (b.operator Quaternion()); + } + case Variant::TRANSFORM2D: { + return (a.operator Transform2D()) * (b.operator Transform2D()); + } + case Variant::TRANSFORM3D: { + return (a.operator Transform3D()) * (b.operator Transform3D()); + } + default: { + return Variant::evaluate(Variant::OP_ADD, a, b); + } + } +} + +Variant Animation::subtract_variant(const Variant &a, const Variant &b) { + if (a.get_type() != b.get_type()) { + return a; + } + + switch (a.get_type()) { + case Variant::NIL: { + return Variant(); + } + case Variant::BOOL: { + return (a.operator real_t()) - (b.operator real_t()); // It is cast for interpolation. + } + case Variant::RECT2: { + const Rect2 ra = a.operator Rect2(); + const Rect2 rb = b.operator Rect2(); + return Rect2(ra.position - rb.position, ra.size - rb.size); + } + case Variant::RECT2I: { + const Rect2i ra = a.operator Rect2i(); + const Rect2i rb = b.operator Rect2i(); + return Rect2i(ra.position - rb.position, ra.size - rb.size); + } + case Variant::PLANE: { + const Plane pa = a.operator Plane(); + const Plane pb = b.operator Plane(); + return Plane(pa.normal - pb.normal, pa.d - pb.d); + } + case Variant::AABB: { + const ::AABB aa = a.operator ::AABB(); + const ::AABB ab = b.operator ::AABB(); + return ::AABB(aa.position - ab.position, aa.size - ab.size); + } + case Variant::QUATERNION: { + return (b.operator Quaternion()).inverse() * (a.operator Quaternion()); + } + case Variant::TRANSFORM2D: { + return (b.operator Transform2D()).inverse() * (a.operator Transform2D()); + } + case Variant::TRANSFORM3D: { + return (b.operator Transform3D()).inverse() * (a.operator Transform3D()); + } + default: { + return Variant::evaluate(Variant::OP_SUBTRACT, a, b); + } + } +} + +Variant Animation::blend_variant(const Variant &a, const Variant &b, float c) { + if (a.get_type() != b.get_type()) { + if (a.is_num() && b.is_num()) { + real_t va = a; + real_t vb = b; + return va + vb * c; + } + return a; + } + + switch (a.get_type()) { + case Variant::NIL: { + return Variant(); + } + case Variant::INT: { + return int((a.operator int64_t()) + (b.operator int64_t()) * c + 0.5); + } + case Variant::FLOAT: { + return (a.operator double()) + (b.operator double()) * c; + } + case Variant::VECTOR2: { + return (a.operator Vector2()) + (b.operator Vector2()) * c; + } + case Variant::VECTOR2I: { + const Vector2i va = a.operator Vector2i(); + const Vector2i vb = b.operator Vector2i(); + return Vector2i(int32_t(va.x + vb.x * c + 0.5), int32_t(va.y + vb.y * c + 0.5)); + } + case Variant::RECT2: { + const Rect2 ra = a.operator Rect2(); + const Rect2 rb = b.operator Rect2(); + return Rect2(ra.position + rb.position * c, ra.size + rb.size * c); + } + case Variant::RECT2I: { + const Rect2i ra = a.operator Rect2i(); + const Rect2i rb = b.operator Rect2i(); + return Rect2i(int32_t(ra.position.x + rb.position.x * c + 0.5), int32_t(ra.position.y + rb.position.y * c + 0.5), int32_t(ra.size.x + rb.size.x * c + 0.5), int32_t(ra.size.y + rb.size.y * c + 0.5)); + } + case Variant::VECTOR3: { + return (a.operator Vector3()) + (b.operator Vector3()) * c; + } + case Variant::VECTOR3I: { + const Vector3i va = a.operator Vector3i(); + const Vector3i vb = b.operator Vector3i(); + return Vector3i(int32_t(va.x + vb.x * c + 0.5), int32_t(va.y + vb.y * c + 0.5), int32_t(va.z + vb.z * c + 0.5)); + } + case Variant::VECTOR4: { + return (a.operator Vector4()) + (b.operator Vector4()) * c; + } + case Variant::VECTOR4I: { + const Vector4i va = a.operator Vector4i(); + const Vector4i vb = b.operator Vector4i(); + return Vector4i(int32_t(va.x + vb.x * c + 0.5), int32_t(va.y + vb.y * c + 0.5), int32_t(va.z + vb.z * c + 0.5), int32_t(va.w + vb.w * c + 0.5)); + } + case Variant::PLANE: { + const Plane pa = a.operator Plane(); + const Plane pb = b.operator Plane(); + return Plane(pa.normal + pb.normal * c, pa.d + pb.d * c); + } + case Variant::COLOR: { + return (a.operator Color()) + (b.operator Color()) * c; + } + case Variant::AABB: { + const ::AABB aa = a.operator ::AABB(); + const ::AABB ab = b.operator ::AABB(); + return ::AABB(aa.position + ab.position * c, aa.size + ab.size * c); + } + case Variant::BASIS: { + return (a.operator Basis()) + (b.operator Basis()) * c; + } + case Variant::QUATERNION: { + return (a.operator Quaternion()) * Quaternion().slerp((b.operator Quaternion()), c); + } + case Variant::TRANSFORM2D: { + return (a.operator Transform2D()) * Transform2D().interpolate_with((b.operator Transform2D()), c); + } + case Variant::TRANSFORM3D: { + return (a.operator Transform3D()) * Transform3D().interpolate_with((b.operator Transform3D()), c); + } + default: { + return c < 0.5 ? a : b; + } + } +} + +Variant Animation::interpolate_variant(const Variant &a, const Variant &b, float c) { + if (a.get_type() != b.get_type()) { + if (a.is_num() && b.is_num()) { + real_t va = a; + real_t vb = b; + return va + (vb - va) * c; + } + return a; + } + + switch (a.get_type()) { + case Variant::NIL: { + return Variant(); + } + case Variant::INT: { + const int64_t va = a.operator int64_t(); + return int(va + ((b.operator int64_t()) - va) * c); + } + case Variant::FLOAT: { + const real_t va = a.operator real_t(); + return va + ((b.operator real_t()) - va) * c; + } + case Variant::VECTOR2: { + return (a.operator Vector2()).lerp(b.operator Vector2(), c); + } + case Variant::VECTOR2I: { + const Vector2i va = a.operator Vector2i(); + const Vector2i vb = b.operator Vector2i(); + return Vector2i(int32_t(va.x + (vb.x - va.x) * c), int32_t(va.y + (vb.y - va.y) * c)); + } + case Variant::RECT2: { + const Rect2 ra = a.operator Rect2(); + const Rect2 rb = b.operator Rect2(); + return Rect2(ra.position.lerp(rb.position, c), ra.size.lerp(rb.size, c)); + } + case Variant::RECT2I: { + const Rect2i ra = a.operator Rect2i(); + const Rect2i rb = b.operator Rect2i(); + return Rect2i(int32_t(ra.position.x + (rb.position.x - ra.position.x) * c), int32_t(ra.position.y + (rb.position.y - ra.position.y) * c), int32_t(ra.size.x + (rb.size.x - ra.size.x) * c), int32_t(ra.size.y + (rb.size.y - ra.size.y) * c)); + } + case Variant::VECTOR3: { + return (a.operator Vector3()).lerp(b.operator Vector3(), c); + } + case Variant::VECTOR3I: { + const Vector3i va = a.operator Vector3i(); + const Vector3i vb = b.operator Vector3i(); + return Vector3i(int32_t(va.x + (vb.x - va.x) * c), int32_t(va.y + (vb.y - va.y) * c), int32_t(va.z + (vb.z - va.z) * c)); + } + case Variant::VECTOR4: { + return (a.operator Vector4()).lerp(b.operator Vector4(), c); + } + case Variant::VECTOR4I: { + const Vector4i va = a.operator Vector4i(); + const Vector4i vb = b.operator Vector4i(); + return Vector4i(int32_t(va.x + (vb.x - va.x) * c), int32_t(va.y + (vb.y - va.y) * c), int32_t(va.z + (vb.z - va.z) * c), int32_t(va.w + (vb.w - va.w) * c)); + } + case Variant::PLANE: { + const Plane pa = a.operator Plane(); + const Plane pb = b.operator Plane(); + return Plane(pa.normal.lerp(pb.normal, c), pa.d + (pb.d - pa.d) * c); + } + case Variant::COLOR: { + return (a.operator Color()).lerp(b.operator Color(), c); + } + case Variant::AABB: { + const ::AABB aa = a.operator ::AABB(); + const ::AABB ab = b.operator ::AABB(); + return ::AABB(aa.position.lerp(ab.position, c), aa.size.lerp(ab.size, c)); + } + case Variant::BASIS: { + return (a.operator Basis()).lerp(b.operator Basis(), c); + } + case Variant::QUATERNION: { + return (a.operator Quaternion()).slerp(b.operator Quaternion(), c); + } + case Variant::TRANSFORM2D: { + return (a.operator Transform2D()).interpolate_with(b.operator Transform2D(), c); + } + case Variant::TRANSFORM3D: { + return (a.operator Transform3D()).interpolate_with(b.operator Transform3D(), c); + } + case Variant::STRING: { + // This is pretty funny and bizarre, but artists like to use it for typewriter effects. + const String sa = a.operator String(); + const String sb = b.operator String(); + String dst; + int sa_len = sa.length(); + int sb_len = sb.length(); + int csize = sa_len + (sb_len - sa_len) * c; + if (csize == 0) { + return ""; + } + dst.resize(csize + 1); + dst[csize] = 0; + int split = csize / 2; + + for (int i = 0; i < csize; i++) { + char32_t chr = ' '; + + if (i < split) { + if (i < sa.length()) { + chr = sa[i]; + } else if (i < sb.length()) { + chr = sb[i]; + } + + } else { + if (i < sb.length()) { + chr = sb[i]; + } else if (i < sa.length()) { + chr = sa[i]; + } + } + + dst[i] = chr; + } + + return dst; + } + case Variant::PACKED_INT32_ARRAY: { + const Vector<int32_t> *arr_a = Object::cast_to<Vector<int32_t>>(a); + const Vector<int32_t> *arr_b = Object::cast_to<Vector<int32_t>>(b); + int32_t sz = arr_a->size(); + if (sz == 0 || arr_b->size() != sz) { + return a; + } else { + Vector<int32_t> v; + v.resize(sz); + { + int32_t *vw = v.ptrw(); + const int32_t *ar = arr_a->ptr(); + const int32_t *br = arr_b->ptr(); + + Variant va; + for (int32_t i = 0; i < sz; i++) { + va = interpolate_variant(ar[i], br[i], c); + vw[i] = va; + } + } + return v; + } + } + case Variant::PACKED_INT64_ARRAY: { + const Vector<int64_t> *arr_a = Object::cast_to<Vector<int64_t>>(a); + const Vector<int64_t> *arr_b = Object::cast_to<Vector<int64_t>>(b); + int64_t sz = arr_a->size(); + if (sz == 0 || arr_b->size() != sz) { + return a; + } else { + Vector<int64_t> v; + v.resize(sz); + { + int64_t *vw = v.ptrw(); + const int64_t *ar = arr_a->ptr(); + const int64_t *br = arr_b->ptr(); + + Variant va; + for (int64_t i = 0; i < sz; i++) { + va = interpolate_variant(ar[i], br[i], c); + vw[i] = va; + } + } + return v; + } + } + case Variant::PACKED_FLOAT32_ARRAY: { + const Vector<float> *arr_a = Object::cast_to<Vector<float>>(a); + const Vector<float> *arr_b = Object::cast_to<Vector<float>>(b); + int sz = arr_a->size(); + if (sz == 0 || arr_b->size() != sz) { + return a; + } else { + Vector<float> v; + v.resize(sz); + { + float *vw = v.ptrw(); + const float *ar = arr_a->ptr(); + const float *br = arr_b->ptr(); + + Variant va; + for (int i = 0; i < sz; i++) { + va = interpolate_variant(ar[i], br[i], c); + vw[i] = va; + } + } + return v; + } + } + case Variant::PACKED_FLOAT64_ARRAY: { + const Vector<double> *arr_a = Object::cast_to<Vector<double>>(a); + const Vector<double> *arr_b = Object::cast_to<Vector<double>>(b); + int sz = arr_a->size(); + if (sz == 0 || arr_b->size() != sz) { + return a; + } else { + Vector<double> v; + v.resize(sz); + { + double *vw = v.ptrw(); + const double *ar = arr_a->ptr(); + const double *br = arr_b->ptr(); + + Variant va; + for (int i = 0; i < sz; i++) { + va = interpolate_variant(ar[i], br[i], c); + vw[i] = va; + } + } + return v; + } + } + case Variant::PACKED_VECTOR2_ARRAY: { + const Vector<Vector2> *arr_a = Object::cast_to<Vector<Vector2>>(a); + const Vector<Vector2> *arr_b = Object::cast_to<Vector<Vector2>>(b); + int sz = arr_a->size(); + if (sz == 0 || arr_b->size() != sz) { + return a; + } else { + Vector<Vector2> v; + v.resize(sz); + { + Vector2 *vw = v.ptrw(); + const Vector2 *ar = arr_a->ptr(); + const Vector2 *br = arr_b->ptr(); + + for (int i = 0; i < sz; i++) { + vw[i] = ar[i].lerp(br[i], c); + } + } + return v; + } + } + case Variant::PACKED_VECTOR3_ARRAY: { + const Vector<Vector3> *arr_a = Object::cast_to<Vector<Vector3>>(a); + const Vector<Vector3> *arr_b = Object::cast_to<Vector<Vector3>>(b); + int sz = arr_a->size(); + if (sz == 0 || arr_b->size() != sz) { + return a; + } else { + Vector<Vector3> v; + v.resize(sz); + { + Vector3 *vw = v.ptrw(); + const Vector3 *ar = arr_a->ptr(); + const Vector3 *br = arr_b->ptr(); + + for (int i = 0; i < sz; i++) { + vw[i] = ar[i].lerp(br[i], c); + } + } + return v; + } + } + case Variant::PACKED_COLOR_ARRAY: { + const Vector<Color> *arr_a = Object::cast_to<Vector<Color>>(a); + const Vector<Color> *arr_b = Object::cast_to<Vector<Color>>(b); + int sz = arr_a->size(); + if (sz == 0 || arr_b->size() != sz) { + return a; + } else { + Vector<Color> v; + v.resize(sz); + { + Color *vw = v.ptrw(); + const Color *ar = arr_a->ptr(); + const Color *br = arr_b->ptr(); + + for (int i = 0; i < sz; i++) { + vw[i] = ar[i].lerp(br[i], c); + } + } + return v; + } + } + default: { + return c < 0.5 ? a : b; + } + } +} + Animation::Animation() {} Animation::~Animation() { diff --git a/scene/resources/animation.h b/scene/resources/animation.h index 46a88df130..49c8fa4c22 100644 --- a/scene/resources/animation.h +++ b/scene/resources/animation.h @@ -496,6 +496,12 @@ public: void optimize(real_t p_allowed_velocity_err = 0.01, real_t p_allowed_angular_err = 0.01, int p_precision = 3); void compress(uint32_t p_page_size = 8192, uint32_t p_fps = 120, float p_split_tolerance = 4.0); // 4.0 seems to be the split tolerance sweet spot from many tests + // Helper math functions for Variant. + static Variant add_variant(const Variant &a, const Variant &b); + static Variant subtract_variant(const Variant &a, const Variant &b); + static Variant blend_variant(const Variant &a, const Variant &b, float c); + static Variant interpolate_variant(const Variant &a, const Variant &b, float c); + Animation(); ~Animation(); }; diff --git a/scene/resources/audio_stream_wav.cpp b/scene/resources/audio_stream_wav.cpp index a87c8272ea..26204583ef 100644 --- a/scene/resources/audio_stream_wav.cpp +++ b/scene/resources/audio_stream_wav.cpp @@ -33,7 +33,7 @@ #include "core/io/file_access.h" #include "core/io/marshalls.h" -void AudioStreamPlaybackWAV::start(float p_from_pos) { +void AudioStreamPlaybackWAV::start(double p_from_pos) { if (base->format == AudioStreamWAV::FORMAT_IMA_ADPCM) { //no seeking in IMA_ADPCM for (int i = 0; i < 2; i++) { @@ -67,16 +67,16 @@ int AudioStreamPlaybackWAV::get_loop_count() const { return 0; } -float AudioStreamPlaybackWAV::get_playback_position() const { +double AudioStreamPlaybackWAV::get_playback_position() const { return float(offset >> MIX_FRAC_BITS) / base->mix_rate; } -void AudioStreamPlaybackWAV::seek(float p_time) { +void AudioStreamPlaybackWAV::seek(double p_time) { if (base->format == AudioStreamWAV::FORMAT_IMA_ADPCM) { return; //no seeking in ima-adpcm } - float max = base->get_length(); + double max = base->get_length(); if (p_time < 0) { p_time = 0; } else if (p_time >= max) { @@ -180,7 +180,7 @@ void AudioStreamPlaybackWAV::do_resample(const Depth *p_src, AudioFrame *p_dst, final_r = p_src[pos + 1]; } - if (sizeof(Depth) == 1) { /* conditions will not exist anymore when compiled! */ + if constexpr (sizeof(Depth) == 1) { /* conditions will not exist anymore when compiled! */ final <<= 8; if (is_stereo) { final_r <<= 8; @@ -194,7 +194,7 @@ void AudioStreamPlaybackWAV::do_resample(const Depth *p_src, AudioFrame *p_dst, next = p_src[pos + 1]; } - if (sizeof(Depth) == 1) { + if constexpr (sizeof(Depth) == 1) { next <<= 8; if (is_stereo) { next_r <<= 8; @@ -463,7 +463,7 @@ bool AudioStreamWAV::is_stereo() const { return stereo; } -float AudioStreamWAV::get_length() const { +double AudioStreamWAV::get_length() const { int len = data_bytes; switch (format) { case AudioStreamWAV::FORMAT_8_BITS: @@ -481,7 +481,7 @@ float AudioStreamWAV::get_length() const { len /= 2; } - return float(len) / mix_rate; + return double(len) / mix_rate; } bool AudioStreamWAV::is_monophonic() const { diff --git a/scene/resources/audio_stream_wav.h b/scene/resources/audio_stream_wav.h index d800388d96..d0edc52031 100644 --- a/scene/resources/audio_stream_wav.h +++ b/scene/resources/audio_stream_wav.h @@ -64,14 +64,14 @@ class AudioStreamPlaybackWAV : public AudioStreamPlayback { void do_resample(const Depth *p_src, AudioFrame *p_dst, int64_t &offset, int32_t &increment, uint32_t amount, IMA_ADPCM_State *ima_adpcm); public: - virtual void start(float p_from_pos = 0.0) override; + virtual void start(double p_from_pos = 0.0) override; virtual void stop() override; virtual bool is_playing() const override; virtual int get_loop_count() const override; //times it looped - virtual float get_playback_position() const override; - virtual void seek(float p_time) override; + virtual double get_playback_position() const override; + virtual void seek(double p_time) override; virtual int mix(AudioFrame *p_buffer, float p_rate_scale, int p_frames) override; @@ -137,7 +137,7 @@ public: void set_stereo(bool p_enable); bool is_stereo() const; - virtual float get_length() const override; //if supported, otherwise return 0 + virtual double get_length() const override; //if supported, otherwise return 0 virtual bool is_monophonic() const override; diff --git a/scene/resources/default_theme/default_theme.cpp b/scene/resources/default_theme/default_theme.cpp index 869d582935..f03e3813cc 100644 --- a/scene/resources/default_theme/default_theme.cpp +++ b/scene/resources/default_theme/default_theme.cpp @@ -43,6 +43,8 @@ #include "modules/svg/image_loader_svg.h" #endif +static const int default_font_size = 16; + static float scale = 1.0; static const int default_margin = 4; diff --git a/scene/resources/default_theme/default_theme.h b/scene/resources/default_theme/default_theme.h index 003934ce90..5243bcefa7 100644 --- a/scene/resources/default_theme/default_theme.h +++ b/scene/resources/default_theme/default_theme.h @@ -33,8 +33,6 @@ #include "scene/resources/theme.h" -const int default_font_size = 16; - void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const Ref<Font> &bold_font, const Ref<Font> &bold_italics_font, const Ref<Font> &italics_font, Ref<Texture2D> &default_icon, Ref<StyleBox> &default_style, float p_scale); void make_default_theme(float p_scale, Ref<Font> p_font, TextServer::SubpixelPositioning p_font_subpixel = TextServer::SUBPIXEL_POSITIONING_AUTO, TextServer::Hinting p_font_hinting = TextServer::HINTING_LIGHT, TextServer::FontAntialiasing p_font_antialiased = TextServer::FONT_ANTIALIASING_GRAY, bool p_font_msdf = false, bool p_font_generate_mipmaps = false); diff --git a/scene/resources/fog_material.cpp b/scene/resources/fog_material.cpp index 0395ed0346..46b44d681f 100644 --- a/scene/resources/fog_material.cpp +++ b/scene/resources/fog_material.cpp @@ -122,7 +122,7 @@ void FogMaterial::_bind_methods() { ClassDB::bind_method(D_METHOD("set_density_texture", "density_texture"), &FogMaterial::set_density_texture); ClassDB::bind_method(D_METHOD("get_density_texture"), &FogMaterial::get_density_texture); - ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "density", PROPERTY_HINT_RANGE, "0.0,16.0,0.0001,or_greater,or_less"), "set_density", "get_density"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "density", PROPERTY_HINT_RANGE, "-8.0,8.0,0.0001,or_greater,or_less"), "set_density", "get_density"); ADD_PROPERTY(PropertyInfo(Variant::COLOR, "albedo", PROPERTY_HINT_COLOR_NO_ALPHA), "set_albedo", "get_albedo"); ADD_PROPERTY(PropertyInfo(Variant::COLOR, "emission", PROPERTY_HINT_COLOR_NO_ALPHA), "set_emission", "get_emission"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "height_falloff", PROPERTY_HINT_EXP_EASING, "attenuation"), "set_height_falloff", "get_height_falloff"); diff --git a/scene/resources/font.cpp b/scene/resources/font.cpp index 189d8d5502..6a278f1f39 100644 --- a/scene/resources/font.cpp +++ b/scene/resources/font.cpp @@ -127,16 +127,18 @@ void Font::_invalidate_rids() { } bool Font::_is_cyclic(const Ref<Font> &p_f, int p_depth) const { - ERR_FAIL_COND_V(p_depth > MAX_FALLBACK_DEPTH, false); + ERR_FAIL_COND_V(p_depth > MAX_FALLBACK_DEPTH, true); if (p_f.is_null()) { return false; } + if (p_f == this) { + return true; + } for (int i = 0; i < p_f->fallbacks.size(); i++) { const Ref<Font> &f = p_f->fallbacks[i]; - if (f == this) { + if (_is_cyclic(f, p_depth + 1)) { return true; } - return _is_cyclic(f, p_depth + 1); } return false; } @@ -147,7 +149,10 @@ void Font::reset_state() { // Fallbacks. void Font::set_fallbacks(const TypedArray<Font> &p_fallbacks) { - ERR_FAIL_COND(_is_cyclic(this, 0)); + for (int i = 0; i < p_fallbacks.size(); i++) { + const Ref<Font> &f = p_fallbacks[i]; + ERR_FAIL_COND_MSG(_is_cyclic(f, 0), "Cyclic font fallback."); + } for (int i = 0; i < fallbacks.size(); i++) { Ref<Font> f = fallbacks[i]; if (f.is_valid()) { @@ -259,7 +264,7 @@ Size2 Font::get_string_size(const String &p_text, HorizontalAlignment p_alignmen hash = hash_djb2_one_64(p_font_size, hash); if (p_alignment == HORIZONTAL_ALIGNMENT_FILL) { hash = hash_djb2_one_64(hash_murmur3_one_float(p_width), hash); - hash = hash_djb2_one_64(p_jst_flags.operator uint32_t(), hash); + hash = hash_djb2_one_64(p_jst_flags.operator int64_t(), hash); } hash = hash_djb2_one_64(p_direction, hash); hash = hash_djb2_one_64(p_orientation, hash); @@ -272,13 +277,15 @@ Size2 Font::get_string_size(const String &p_text, HorizontalAlignment p_alignmen buffer->set_direction(p_direction); buffer->set_orientation(p_orientation); buffer->add_string(p_text, Ref<Font>(this), p_font_size); - if (p_alignment == HORIZONTAL_ALIGNMENT_FILL) { - buffer->set_horizontal_alignment(p_alignment); - buffer->set_width(p_width); - buffer->set_flags(p_jst_flags); - } cache.insert(hash, buffer); } + + buffer->set_width(p_width); + buffer->set_horizontal_alignment(p_alignment); + if (p_alignment == HORIZONTAL_ALIGNMENT_FILL) { + buffer->set_flags(p_jst_flags); + } + return buffer->get_size(); } @@ -286,8 +293,8 @@ Size2 Font::get_multiline_string_size(const String &p_text, HorizontalAlignment uint64_t hash = p_text.hash64(); hash = hash_djb2_one_64(p_font_size, hash); hash = hash_djb2_one_64(hash_murmur3_one_float(p_width), hash); - hash = hash_djb2_one_64(p_brk_flags.operator uint32_t(), hash); - hash = hash_djb2_one_64(p_jst_flags.operator uint32_t(), hash); + hash = hash_djb2_one_64(p_brk_flags.operator int64_t(), hash); + hash = hash_djb2_one_64(p_jst_flags.operator int64_t(), hash); hash = hash_djb2_one_64(p_direction, hash); hash = hash_djb2_one_64(p_orientation, hash); @@ -316,7 +323,7 @@ void Font::draw_string(RID p_canvas_item, const Point2 &p_pos, const String &p_t hash = hash_djb2_one_64(p_font_size, hash); if (p_alignment == HORIZONTAL_ALIGNMENT_FILL) { hash = hash_djb2_one_64(hash_murmur3_one_float(p_width), hash); - hash = hash_djb2_one_64(p_jst_flags.operator uint32_t(), hash); + hash = hash_djb2_one_64(p_jst_flags.operator int64_t(), hash); } hash = hash_djb2_one_64(p_direction, hash); hash = hash_djb2_one_64(p_orientation, hash); @@ -352,8 +359,8 @@ void Font::draw_multiline_string(RID p_canvas_item, const Point2 &p_pos, const S uint64_t hash = p_text.hash64(); hash = hash_djb2_one_64(p_font_size, hash); hash = hash_djb2_one_64(hash_murmur3_one_float(p_width), hash); - hash = hash_djb2_one_64(p_brk_flags.operator uint32_t(), hash); - hash = hash_djb2_one_64(p_jst_flags.operator uint32_t(), hash); + hash = hash_djb2_one_64(p_brk_flags.operator int64_t(), hash); + hash = hash_djb2_one_64(p_jst_flags.operator int64_t(), hash); hash = hash_djb2_one_64(p_direction, hash); hash = hash_djb2_one_64(p_orientation, hash); @@ -389,7 +396,7 @@ void Font::draw_string_outline(RID p_canvas_item, const Point2 &p_pos, const Str hash = hash_djb2_one_64(p_font_size, hash); if (p_alignment == HORIZONTAL_ALIGNMENT_FILL) { hash = hash_djb2_one_64(hash_murmur3_one_float(p_width), hash); - hash = hash_djb2_one_64(p_jst_flags.operator uint32_t(), hash); + hash = hash_djb2_one_64(p_jst_flags.operator int64_t(), hash); } hash = hash_djb2_one_64(p_direction, hash); hash = hash_djb2_one_64(p_orientation, hash); @@ -425,8 +432,8 @@ void Font::draw_multiline_string_outline(RID p_canvas_item, const Point2 &p_pos, uint64_t hash = p_text.hash64(); hash = hash_djb2_one_64(p_font_size, hash); hash = hash_djb2_one_64(hash_murmur3_one_float(p_width), hash); - hash = hash_djb2_one_64(p_brk_flags.operator uint32_t(), hash); - hash = hash_djb2_one_64(p_jst_flags.operator uint32_t(), hash); + hash = hash_djb2_one_64(p_brk_flags.operator int64_t(), hash); + hash = hash_djb2_one_64(p_jst_flags.operator int64_t(), hash); hash = hash_djb2_one_64(p_direction, hash); hash = hash_djb2_one_64(p_orientation, hash); @@ -554,7 +561,6 @@ Font::Font() { } Font::~Font() { - reset_state(); } /*************************************************************************/ @@ -2433,11 +2439,10 @@ int32_t FontFile::get_glyph_index(int p_size, char32_t p_char, char32_t p_variat } FontFile::FontFile() { - /* NOP */ } FontFile::~FontFile() { - reset_state(); + _clear_cache(); } /*************************************************************************/ @@ -2688,7 +2693,6 @@ FontVariation::FontVariation() { } FontVariation::~FontVariation() { - reset_state(); } /*************************************************************************/ @@ -3081,5 +3085,4 @@ SystemFont::SystemFont() { } SystemFont::~SystemFont() { - reset_state(); } diff --git a/scene/resources/importer_mesh.cpp b/scene/resources/importer_mesh.cpp index 0afca95de0..de3d502102 100644 --- a/scene/resources/importer_mesh.cpp +++ b/scene/resources/importer_mesh.cpp @@ -254,7 +254,20 @@ void ImporterMesh::set_surface_material(int p_surface, const Ref<Material> &p_ma mesh.unref(); } -void ImporterMesh::generate_lods(float p_normal_merge_angle, float p_normal_split_angle) { +#define VERTEX_SKIN_FUNC(bone_count, vert_idx, read_array, write_array, transform_array, bone_array, weight_array) \ + Vector3 transformed_vert = Vector3(); \ + for (unsigned int weight_idx = 0; weight_idx < bone_count; weight_idx++) { \ + int bone_idx = bone_array[vert_idx * bone_count + weight_idx]; \ + float w = weight_array[vert_idx * bone_count + weight_idx]; \ + if (w < FLT_EPSILON) { \ + continue; \ + } \ + ERR_FAIL_INDEX(bone_idx, static_cast<int>(transform_array.size())); \ + transformed_vert += transform_array[bone_idx].xform(read_array[vert_idx]) * w; \ + } \ + write_array[vert_idx] = transformed_vert; + +void ImporterMesh::generate_lods(float p_normal_merge_angle, float p_normal_split_angle, Array p_bone_transform_array) { if (!SurfaceTool::simplify_scale_func) { return; } @@ -265,6 +278,12 @@ void ImporterMesh::generate_lods(float p_normal_merge_angle, float p_normal_spli return; } + LocalVector<Transform3D> bone_transform_vector; + for (int i = 0; i < p_bone_transform_array.size(); i++) { + ERR_FAIL_COND(p_bone_transform_array[i].get_type() != Variant::TRANSFORM3D); + bone_transform_vector.push_back(p_bone_transform_array[i]); + } + for (int i = 0; i < surfaces.size(); i++) { if (surfaces[i].primitive != Mesh::PRIMITIVE_TRIANGLES) { continue; @@ -276,6 +295,8 @@ void ImporterMesh::generate_lods(float p_normal_merge_angle, float p_normal_spli Vector<Vector3> normals = surfaces[i].arrays[RS::ARRAY_NORMAL]; Vector<Vector2> uvs = surfaces[i].arrays[RS::ARRAY_TEX_UV]; Vector<Vector2> uv2s = surfaces[i].arrays[RS::ARRAY_TEX_UV2]; + Vector<int> bones = surfaces[i].arrays[RS::ARRAY_BONES]; + Vector<float> weights = surfaces[i].arrays[RS::ARRAY_WEIGHTS]; unsigned int index_count = indices.size(); unsigned int vertex_count = vertices.size(); @@ -301,6 +322,22 @@ void ImporterMesh::generate_lods(float p_normal_merge_angle, float p_normal_spli } } + if (bones.size() > 0 && weights.size() && bone_transform_vector.size() > 0) { + Vector3 *vertices_ptrw = vertices.ptrw(); + + // Apply bone transforms to regular surface. + unsigned int bone_weight_length = surfaces[i].flags & Mesh::ARRAY_FLAG_USE_8_BONE_WEIGHTS ? 8 : 4; + + const int *bo = bones.ptr(); + const float *we = weights.ptr(); + + for (unsigned int j = 0; j < vertex_count; j++) { + VERTEX_SKIN_FUNC(bone_weight_length, j, vertices_ptr, vertices_ptrw, bone_transform_vector, bo, we) + } + + vertices_ptr = vertices.ptr(); + } + float normal_merge_threshold = Math::cos(Math::deg_to_rad(p_normal_merge_angle)); float normal_pre_split_threshold = Math::cos(Math::deg_to_rad(MIN(180.0f, p_normal_split_angle * 2.0f))); float normal_split_threshold = Math::cos(Math::deg_to_rad(p_normal_split_angle)); @@ -1246,7 +1283,7 @@ void ImporterMesh::_bind_methods() { ClassDB::bind_method(D_METHOD("set_surface_name", "surface_idx", "name"), &ImporterMesh::set_surface_name); ClassDB::bind_method(D_METHOD("set_surface_material", "surface_idx", "material"), &ImporterMesh::set_surface_material); - ClassDB::bind_method(D_METHOD("generate_lods", "normal_merge_angle", "normal_split_angle"), &ImporterMesh::generate_lods); + ClassDB::bind_method(D_METHOD("generate_lods", "normal_merge_angle", "normal_split_angle", "bone_transform_array"), &ImporterMesh::generate_lods); ClassDB::bind_method(D_METHOD("get_mesh", "base_mesh"), &ImporterMesh::get_mesh, DEFVAL(Ref<ArrayMesh>())); ClassDB::bind_method(D_METHOD("clear"), &ImporterMesh::clear); diff --git a/scene/resources/importer_mesh.h b/scene/resources/importer_mesh.h index dce2638c19..088a77edd1 100644 --- a/scene/resources/importer_mesh.h +++ b/scene/resources/importer_mesh.h @@ -112,7 +112,7 @@ public: void set_surface_material(int p_surface, const Ref<Material> &p_material); - void generate_lods(float p_normal_merge_angle, float p_normal_split_angle); + void generate_lods(float p_normal_merge_angle, float p_normal_split_angle, Array p_skin_pose_transform_array); void create_shadow_mesh(); Ref<ImporterMesh> get_shadow_mesh() const; diff --git a/scene/resources/material.cpp b/scene/resources/material.cpp index 448ff74a53..838927e34f 100644 --- a/scene/resources/material.cpp +++ b/scene/resources/material.cpp @@ -156,17 +156,7 @@ Material::~Material() { bool ShaderMaterial::_set(const StringName &p_name, const Variant &p_value) { if (shader.is_valid()) { - StringName pr = shader->remap_uniform(p_name); - if (!pr) { - String n = p_name; - if (n.find("shader_parameter/") == 0) { //backwards compatibility - pr = n.replace_first("shader_parameter/", ""); - } else if (n.find("shader_uniform/") == 0) { //backwards compatibility - pr = n.replace_first("shader_uniform/", ""); - } else if (n.find("param/") == 0) { //backwards compatibility - pr = n.substr(6, n.length()); - } - } + StringName pr = shader->remap_parameter(p_name); if (pr) { set_shader_parameter(pr, p_value); return true; @@ -178,25 +168,9 @@ bool ShaderMaterial::_set(const StringName &p_name, const Variant &p_value) { bool ShaderMaterial::_get(const StringName &p_name, Variant &r_ret) const { if (shader.is_valid()) { - StringName pr = shader->remap_uniform(p_name); - if (!pr) { - String n = p_name; - if (n.find("shader_parameter/") == 0) { //backwards compatibility - pr = n.replace_first("shader_parameter/", ""); - } else if (n.find("shader_uniform/") == 0) { //backwards compatibility - pr = n.replace_first("shader_uniform/", ""); - } else if (n.find("param/") == 0) { //backwards compatibility - pr = n.substr(6, n.length()); - } - } - + StringName pr = shader->remap_parameter(p_name); if (pr) { - HashMap<StringName, Variant>::ConstIterator E = param_cache.find(pr); - if (E) { - r_ret = E->value; - } else { - r_ret = Variant(); - } + r_ret = get_shader_parameter(pr); return true; } } @@ -238,6 +212,7 @@ void ShaderMaterial::_get_property_list(List<PropertyInfo> *p_list) const { PropertyInfo info; info.usage = PROPERTY_USAGE_GROUP; info.name = last_group.capitalize(); + info.hint_string = "shader_parameter/"; List<PropertyInfo> none_subgroup; none_subgroup.push_back(info); @@ -252,6 +227,7 @@ void ShaderMaterial::_get_property_list(List<PropertyInfo> *p_list) const { PropertyInfo info; info.usage = PROPERTY_USAGE_SUBGROUP; info.name = last_subgroup.capitalize(); + info.hint_string = "shader_parameter/"; List<PropertyInfo> subgroup; subgroup.push_back(info); @@ -271,39 +247,42 @@ void ShaderMaterial::_get_property_list(List<PropertyInfo> *p_list) const { PropertyInfo info; info.usage = PROPERTY_USAGE_GROUP; - info.name = "Shader Param"; + info.name = "Shader Parameters"; + info.hint_string = "shader_parameter/"; groups["<None>"]["<None>"].push_back(info); } PropertyInfo info = E->get(); - info.name = info.name; + info.name = "shader_parameter/" + info.name; groups[last_group][last_subgroup].push_back(info); } - // Sort groups alphabetically. - List<UniformProp> props; + List<String> group_names; for (HashMap<String, HashMap<String, List<PropertyInfo>>>::Iterator group = groups.begin(); group; ++group) { - for (HashMap<String, List<PropertyInfo>>::Iterator subgroup = group->value.begin(); subgroup; ++subgroup) { - for (List<PropertyInfo>::Element *item = subgroup->value.front(); item; item = item->next()) { - if (subgroup->key == "<None>") { - props.push_back({ group->key, item->get() }); - } else { - props.push_back({ group->key + "::" + subgroup->key, item->get() }); - } - } - } + group_names.push_back(group->key); } - props.sort_custom<UniformPropComparator>(); + group_names.sort(); - for (List<UniformProp>::Element *E = props.front(); E; E = E->next()) { - p_list->push_back(E->get().info); + for (const String &group_name : group_names) { + List<String> subgroup_names; + HashMap<String, List<PropertyInfo>> &subgroups = groups[group_name]; + for (HashMap<String, List<PropertyInfo>>::Iterator subgroup = subgroups.begin(); subgroup; ++subgroup) { + subgroup_names.push_back(subgroup->key); + } + subgroup_names.sort(); + for (const String &subgroup_name : subgroup_names) { + List<PropertyInfo> &prop_infos = subgroups[subgroup_name]; + for (List<PropertyInfo>::Element *item = prop_infos.front(); item; item = item->next()) { + p_list->push_back(item->get()); + } + } } } } bool ShaderMaterial::_property_can_revert(const StringName &p_name) const { if (shader.is_valid()) { - StringName pr = shader->remap_uniform(p_name); + StringName pr = shader->remap_parameter(p_name); if (pr) { Variant default_value = RenderingServer::get_singleton()->shader_get_parameter_default(shader->get_rid(), pr); Variant current_value; @@ -316,7 +295,7 @@ bool ShaderMaterial::_property_can_revert(const StringName &p_name) const { bool ShaderMaterial::_property_get_revert(const StringName &p_name, Variant &r_property) const { if (shader.is_valid()) { - StringName pr = shader->remap_uniform(p_name); + StringName pr = shader->remap_parameter(p_name); if (pr) { r_property = RenderingServer::get_singleton()->shader_get_parameter_default(shader->get_rid(), pr); return true; @@ -924,6 +903,7 @@ void BaseMaterial3D::_update_shader() { if (flags[FLAG_BILLBOARD_KEEP_SCALE]) { code += " MODELVIEW_MATRIX = MODELVIEW_MATRIX * mat4(vec4(length(MODEL_MATRIX[0].xyz), 0.0, 0.0, 0.0), vec4(0.0, length(MODEL_MATRIX[1].xyz), 0.0, 0.0), vec4(0.0, 0.0, length(MODEL_MATRIX[2].xyz), 0.0), vec4(0.0, 0.0, 0.0, 1.0));\n"; } + code += " MODELVIEW_NORMAL_MATRIX = mat3(MODELVIEW_MATRIX);\n"; } break; case BILLBOARD_FIXED_Y: { code += " MODELVIEW_MATRIX = VIEW_MATRIX * mat4(vec4(normalize(cross(vec3(0.0, 1.0, 0.0), INV_VIEW_MATRIX[2].xyz)), 0.0), vec4(0.0, 1.0, 0.0, 0.0), vec4(normalize(cross(INV_VIEW_MATRIX[0].xyz, vec3(0.0, 1.0, 0.0))), 0.0), MODEL_MATRIX[3]);\n"; @@ -931,6 +911,7 @@ void BaseMaterial3D::_update_shader() { if (flags[FLAG_BILLBOARD_KEEP_SCALE]) { code += " MODELVIEW_MATRIX = MODELVIEW_MATRIX * mat4(vec4(length(MODEL_MATRIX[0].xyz), 0.0, 0.0, 0.0),vec4(0.0, length(MODEL_MATRIX[1].xyz), 0.0, 0.0), vec4(0.0, 0.0, length(MODEL_MATRIX[2].xyz), 0.0), vec4(0.0, 0.0, 0.0, 1.0));\n"; } + code += " MODELVIEW_NORMAL_MATRIX = mat3(MODELVIEW_MATRIX);\n"; } break; case BILLBOARD_PARTICLES: { //make billboard @@ -939,6 +920,8 @@ void BaseMaterial3D::_update_shader() { code += " mat_world = mat_world * mat4(vec4(cos(INSTANCE_CUSTOM.x), -sin(INSTANCE_CUSTOM.x), 0.0, 0.0), vec4(sin(INSTANCE_CUSTOM.x), cos(INSTANCE_CUSTOM.x), 0.0, 0.0), vec4(0.0, 0.0, 1.0, 0.0), vec4(0.0, 0.0, 0.0, 1.0));\n"; //set modelview code += " MODELVIEW_MATRIX = VIEW_MATRIX * mat_world;\n"; + //set modelview normal + code += " MODELVIEW_NORMAL_MATRIX = mat3(MODELVIEW_MATRIX);\n"; //handle animation code += " float h_frames = float(particles_anim_h_frames);\n"; @@ -949,7 +932,7 @@ void BaseMaterial3D::_update_shader() { code += " particle_frame = clamp(particle_frame, 0.0, particle_total_frames - 1.0);\n"; code += " } else {\n"; code += " particle_frame = mod(particle_frame, particle_total_frames);\n"; - code += " }"; + code += " }\n"; code += " UV /= vec2(h_frames, v_frames);\n"; code += " UV += vec2(mod(particle_frame, h_frames) / h_frames, floor((particle_frame + 0.5) / h_frames) / v_frames);\n"; } break; @@ -3140,8 +3123,6 @@ bool StandardMaterial3D::_set(const StringName &p_name, const Variant &p_value) WARN_PRINT("Godot 3.x SpatialMaterial remapped parameter not found: " + String(p_name)); return true; } - - return false; } #endif // DISABLE_DEPRECATED diff --git a/scene/resources/material.h b/scene/resources/material.h index 6c81293ee3..dd9589c577 100644 --- a/scene/resources/material.h +++ b/scene/resources/material.h @@ -84,17 +84,6 @@ class ShaderMaterial : public Material { HashMap<StringName, Variant> param_cache; - struct UniformProp { - String str; - PropertyInfo info; - }; - - struct UniformPropComparator { - bool operator()(const UniformProp &p_a, const UniformProp &p_b) const { - return p_a.str.naturalnocasecmp_to(p_b.str) < 0; - } - }; - protected: bool _set(const StringName &p_name, const Variant &p_value); bool _get(const StringName &p_name, Variant &r_ret) const; diff --git a/scene/resources/particle_process_material.h b/scene/resources/particle_process_material.h index fe4741d6e5..9430e5797d 100644 --- a/scene/resources/particle_process_material.h +++ b/scene/resources/particle_process_material.h @@ -28,12 +28,12 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "core/templates/rid.h" -#include "scene/resources/material.h" - #ifndef PARTICLE_PROCESS_MATERIAL_H #define PARTICLE_PROCESS_MATERIAL_H +#include "core/templates/rid.h" +#include "scene/resources/material.h" + /* TODO: -Path following diff --git a/scene/resources/primitive_meshes.h b/scene/resources/primitive_meshes.h index 280477ebfa..ee61f0ac55 100644 --- a/scene/resources/primitive_meshes.h +++ b/scene/resources/primitive_meshes.h @@ -262,6 +262,19 @@ public: VARIANT_ENUM_CAST(PlaneMesh::Orientation) +/* + A flat rectangle, inherits from PlaneMesh but defaults to facing the Z-plane. +*/ +class QuadMesh : public PlaneMesh { + GDCLASS(QuadMesh, PlaneMesh); + +public: + QuadMesh() { + set_orientation(FACE_Z); + set_size(Size2(1, 1)); + } +}; + /** A prism shapen, handy for ramps, triangles, etc. */ diff --git a/scene/resources/shader.h b/scene/resources/shader.h index d267e6520e..57be142a95 100644 --- a/scene/resources/shader.h +++ b/scene/resources/shader.h @@ -87,15 +87,44 @@ public: virtual bool is_text_shader() const; - _FORCE_INLINE_ StringName remap_uniform(const StringName &p_uniform) const { + // Finds the shader parameter name for the given property name, which should start with "shader_parameter/". + _FORCE_INLINE_ StringName remap_parameter(const StringName &p_property) const { if (params_cache_dirty) { get_shader_uniform_list(nullptr); } - const HashMap<StringName, StringName>::Iterator E = params_cache.find(p_uniform); - if (E) { - return E->value; + String n = p_property; + + // Backwards compatibility with old shader parameter names. + // Note: The if statements are important to make sure we are only replacing text exactly at index 0. + if (n.find("param/") == 0) { + n = n.replace_first("param/", "shader_parameter/"); + } + if (n.find("shader_param/") == 0) { + n = n.replace_first("shader_param/", "shader_parameter/"); + } + if (n.find("shader_uniform/") == 0) { + n = n.replace_first("shader_uniform/", "shader_parameter/"); + } + + { + // Additional backwards compatibility for projects between #62972 and #64092 (about a month of v4.0 development). + // These projects did not have any prefix for shader uniforms due to a bug. + // This code should be removed during beta or rc of 4.0. + const HashMap<StringName, StringName>::Iterator E = params_cache.find(n); + if (E) { + return E->value; + } + } + + if (n.begins_with("shader_parameter/")) { + n = n.replace_first("shader_parameter/", ""); + const HashMap<StringName, StringName>::Iterator E = params_cache.find(n); + if (E) { + return E->value; + } } + return StringName(); } diff --git a/scene/resources/skeleton_modification_stack_2d.cpp b/scene/resources/skeleton_modification_stack_2d.cpp index 068c756849..56234a8a14 100644 --- a/scene/resources/skeleton_modification_stack_2d.cpp +++ b/scene/resources/skeleton_modification_stack_2d.cpp @@ -182,11 +182,11 @@ void SkeletonModificationStack2D::delete_modification(int p_mod_idx) { void SkeletonModificationStack2D::set_modification(int p_mod_idx, Ref<SkeletonModification2D> p_mod) { ERR_FAIL_INDEX(p_mod_idx, modifications.size()); - if (p_mod == nullptr) { - modifications.insert(p_mod_idx, nullptr); + if (p_mod.is_null()) { + modifications.write[p_mod_idx] = Ref<SkeletonModification2D>(); } else { + modifications.write[p_mod_idx] = p_mod; p_mod->_setup_modification(this); - modifications.insert(p_mod_idx, p_mod); } #ifdef TOOLS_ENABLED diff --git a/scene/resources/skeleton_profile.cpp b/scene/resources/skeleton_profile.cpp index 1367ea86dd..61a0350440 100644 --- a/scene/resources/skeleton_profile.cpp +++ b/scene/resources/skeleton_profile.cpp @@ -566,7 +566,7 @@ SkeletonProfileHumanoid::SkeletonProfileHumanoid() { bones.write[14].bone_name = "LeftThumbMetacarpal"; bones.write[14].bone_parent = "LeftHand"; - bones.write[14].reference_pose = Transform3D(0, -0.577, 0.816, 0.707, 0.577, 0.408, -0.707, 0.577, 0.408, -0.025, 0, 0); + bones.write[14].reference_pose = Transform3D(0, -0.577, 0.816, 0, 0.816, 0.577, -1, 0, 0, -0.025, 0.025, 0); bones.write[14].handle_offset = Vector2(0.4, 0.8); bones.write[14].group = "LeftHand"; @@ -686,7 +686,7 @@ SkeletonProfileHumanoid::SkeletonProfileHumanoid() { bones.write[33].bone_name = "RightThumbMetacarpal"; bones.write[33].bone_parent = "RightHand"; - bones.write[33].reference_pose = Transform3D(0, 0.577, -0.816, -0.707, 0.577, 0.408, 0.707, 0.577, 0.408, 0.025, 0, 0); + bones.write[33].reference_pose = Transform3D(0, 0.577, -0.816, 0, 0.816, 0.577, 1, 0, 0, 0.025, 0.025, 0); bones.write[33].handle_offset = Vector2(0.6, 0.8); bones.write[33].group = "RightHand"; diff --git a/scene/resources/sky_material.cpp b/scene/resources/sky_material.cpp index fc999d5fcb..d21f04fab8 100644 --- a/scene/resources/sky_material.cpp +++ b/scene/resources/sky_material.cpp @@ -34,7 +34,7 @@ #include "core/version.h" Mutex ProceduralSkyMaterial::shader_mutex; -RID ProceduralSkyMaterial::shader; +RID ProceduralSkyMaterial::shader_cache[2]; void ProceduralSkyMaterial::set_sky_top_color(const Color &p_sky_top) { sky_top_color = p_sky_top; @@ -147,7 +147,11 @@ float ProceduralSkyMaterial::get_sun_curve() const { void ProceduralSkyMaterial::set_use_debanding(bool p_use_debanding) { use_debanding = p_use_debanding; - RS::get_singleton()->material_set_param(_get_material(), "use_debanding", use_debanding); + _update_shader(); + // Only set if shader already compiled + if (shader_set) { + RS::get_singleton()->material_set_shader(_get_material(), shader_cache[int(use_debanding)]); + } } bool ProceduralSkyMaterial::get_use_debanding() const { @@ -161,7 +165,8 @@ Shader::Mode ProceduralSkyMaterial::get_shader_mode() const { RID ProceduralSkyMaterial::get_rid() const { _update_shader(); if (!shader_set) { - RS::get_singleton()->material_set_shader(_get_material(), shader); + RS::get_singleton()->material_set_shader(_get_material(), shader_cache[1 - int(use_debanding)]); + RS::get_singleton()->material_set_shader(_get_material(), shader_cache[int(use_debanding)]); shader_set = true; } return _get_material(); @@ -169,7 +174,7 @@ RID ProceduralSkyMaterial::get_rid() const { RID ProceduralSkyMaterial::get_shader_rid() const { _update_shader(); - return shader; + return shader_cache[int(use_debanding)]; } void ProceduralSkyMaterial::_validate_property(PropertyInfo &p_property) const { @@ -241,21 +246,24 @@ void ProceduralSkyMaterial::_bind_methods() { } void ProceduralSkyMaterial::cleanup_shader() { - if (shader.is_valid()) { - RS::get_singleton()->free(shader); + if (shader_cache[0].is_valid()) { + RS::get_singleton()->free(shader_cache[0]); + RS::get_singleton()->free(shader_cache[1]); } } void ProceduralSkyMaterial::_update_shader() { shader_mutex.lock(); - if (shader.is_null()) { - shader = RS::get_singleton()->shader_create(); + if (shader_cache[0].is_null()) { + for (int i = 0; i < 2; i++) { + shader_cache[i] = RS::get_singleton()->shader_create(); - // Add a comment to describe the shader origin (useful when converting to ShaderMaterial). - RS::get_singleton()->shader_set_code(shader, R"( + // Add a comment to describe the shader origin (useful when converting to ShaderMaterial). + RS::get_singleton()->shader_set_code(shader_cache[i], vformat(R"( // NOTE: Shader automatically converted from )" VERSION_NAME " " VERSION_FULL_CONFIG R"('s ProceduralSkyMaterial. shader_type sky; +%s uniform vec4 sky_top_color : source_color = vec4(0.385, 0.454, 0.55, 1.0); uniform vec4 sky_horizon_color : source_color = vec4(0.646, 0.656, 0.67, 1.0); @@ -269,14 +277,6 @@ uniform float ground_curve : hint_range(0, 1) = 0.02; uniform float ground_energy = 1.0; uniform float sun_angle_max = 30.0; uniform float sun_curve : hint_range(0, 1) = 0.15; -uniform bool use_debanding = true; - -// https://www.iryoku.com/next-generation-post-processing-in-call-of-duty-advanced-warfare -vec3 interleaved_gradient_noise(vec2 pos) { - const vec3 magic = vec3(0.06711056f, 0.00583715f, 52.9829189f); - float res = fract(magic.z * fract(dot(pos, magic.xy))) * 2.0 - 1.0; - return vec3(res, -res, res) / 255.0; -} void sky() { float v_angle = acos(clamp(EYEDIR.y, -1.0, 1.0)); @@ -332,11 +332,10 @@ void sky() { ground *= ground_energy; COLOR = mix(ground, sky, step(0.0, EYEDIR.y)); - if (use_debanding) { - COLOR += interleaved_gradient_noise(FRAGCOORD.xy); - } } -)"); +)", + i ? "render_mode use_debanding;" : "")); + } } shader_mutex.unlock(); } @@ -546,7 +545,11 @@ float PhysicalSkyMaterial::get_energy_multiplier() const { void PhysicalSkyMaterial::set_use_debanding(bool p_use_debanding) { use_debanding = p_use_debanding; - RS::get_singleton()->material_set_param(_get_material(), "use_debanding", use_debanding); + _update_shader(); + // Only set if shader already compiled + if (shader_set) { + RS::get_singleton()->material_set_shader(_get_material(), shader_cache[int(use_debanding)]); + } } bool PhysicalSkyMaterial::get_use_debanding() const { @@ -570,7 +573,8 @@ Shader::Mode PhysicalSkyMaterial::get_shader_mode() const { RID PhysicalSkyMaterial::get_rid() const { _update_shader(); if (!shader_set) { - RS::get_singleton()->material_set_shader(_get_material(), shader); + RS::get_singleton()->material_set_shader(_get_material(), shader_cache[1 - int(use_debanding)]); + RS::get_singleton()->material_set_shader(_get_material(), shader_cache[int(use_debanding)]); shader_set = true; } return _get_material(); @@ -578,7 +582,7 @@ RID PhysicalSkyMaterial::get_rid() const { RID PhysicalSkyMaterial::get_shader_rid() const { _update_shader(); - return shader; + return shader_cache[int(use_debanding)]; } void PhysicalSkyMaterial::_validate_property(PropertyInfo &p_property) const { @@ -588,7 +592,7 @@ void PhysicalSkyMaterial::_validate_property(PropertyInfo &p_property) const { } Mutex PhysicalSkyMaterial::shader_mutex; -RID PhysicalSkyMaterial::shader; +RID PhysicalSkyMaterial::shader_cache[2]; void PhysicalSkyMaterial::_bind_methods() { ClassDB::bind_method(D_METHOD("set_rayleigh_coefficient", "rayleigh"), &PhysicalSkyMaterial::set_rayleigh_coefficient); @@ -642,21 +646,24 @@ void PhysicalSkyMaterial::_bind_methods() { } void PhysicalSkyMaterial::cleanup_shader() { - if (shader.is_valid()) { - RS::get_singleton()->free(shader); + if (shader_cache[0].is_valid()) { + RS::get_singleton()->free(shader_cache[0]); + RS::get_singleton()->free(shader_cache[1]); } } void PhysicalSkyMaterial::_update_shader() { shader_mutex.lock(); - if (shader.is_null()) { - shader = RS::get_singleton()->shader_create(); + if (shader_cache[0].is_null()) { + for (int i = 0; i < 2; i++) { + shader_cache[i] = RS::get_singleton()->shader_create(); - // Add a comment to describe the shader origin (useful when converting to ShaderMaterial). - RS::get_singleton()->shader_set_code(shader, R"( + // Add a comment to describe the shader origin (useful when converting to ShaderMaterial). + RS::get_singleton()->shader_set_code(shader_cache[i], vformat(R"( // NOTE: Shader automatically converted from )" VERSION_NAME " " VERSION_FULL_CONFIG R"('s PhysicalSkyMaterial. shader_type sky; +%s uniform float rayleigh : hint_range(0, 64) = 2.0; uniform vec4 rayleigh_color : source_color = vec4(0.3, 0.405, 0.6, 1.0); @@ -668,7 +675,6 @@ uniform float turbidity : hint_range(0, 1000) = 10.0; uniform float sun_disk_scale : hint_range(0, 360) = 1.0; uniform vec4 ground_color : source_color = vec4(0.1, 0.07, 0.034, 1.0); uniform float exposure : hint_range(0, 128) = 1.0; -uniform bool use_debanding = true; uniform sampler2D night_sky : source_color, hint_default_black; @@ -683,13 +689,6 @@ float henyey_greenstein(float cos_theta, float g) { return k * (1.0 - g * g) / (pow(1.0 + g * g - 2.0 * g * cos_theta, 1.5)); } -// https://www.iryoku.com/next-generation-post-processing-in-call-of-duty-advanced-warfare -vec3 interleaved_gradient_noise(vec2 pos) { - const vec3 magic = vec3(0.06711056f, 0.00583715f, 52.9829189f); - float res = fract(magic.z * fract(dot(pos, magic.xy))) * 2.0 - 1.0; - return vec3(res, -res, res) / 255.0; -} - void sky() { if (LIGHT0_ENABLED) { float zenith_angle = clamp( dot(UP, normalize(LIGHT0_DIRECTION)), -1.0, 1.0 ); @@ -737,16 +736,15 @@ void sky() { vec3 color = Lin + L0; COLOR = pow(color, vec3(1.0 / (1.2 + (1.2 * sun_fade)))); COLOR *= exposure; - if (use_debanding) { - COLOR += interleaved_gradient_noise(FRAGCOORD.xy); - } } else { // There is no sun, so display night_sky and nothing else. COLOR = texture(night_sky, SKY_COORDS).xyz; COLOR *= exposure; } } -)"); +)", + i ? "render_mode use_debanding;" : "")); + } } shader_mutex.unlock(); diff --git a/scene/resources/sky_material.h b/scene/resources/sky_material.h index b517fd806b..3de1a4b26f 100644 --- a/scene/resources/sky_material.h +++ b/scene/resources/sky_material.h @@ -28,12 +28,12 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "core/templates/rid.h" -#include "scene/resources/material.h" - #ifndef SKY_MATERIAL_H #define SKY_MATERIAL_H +#include "core/templates/rid.h" +#include "scene/resources/material.h" + class ProceduralSkyMaterial : public Material { GDCLASS(ProceduralSkyMaterial, Material); @@ -55,7 +55,7 @@ private: bool use_debanding = true; static Mutex shader_mutex; - static RID shader; + static RID shader_cache[2]; static void _update_shader(); mutable bool shader_set = false; @@ -160,7 +160,7 @@ class PhysicalSkyMaterial : public Material { private: static Mutex shader_mutex; - static RID shader; + static RID shader_cache[2]; float rayleigh = 0.0f; Color rayleigh_color; diff --git a/scene/resources/texture.cpp b/scene/resources/texture.cpp index d53dc1a8fc..15678c9281 100644 --- a/scene/resources/texture.cpp +++ b/scene/resources/texture.cpp @@ -38,6 +38,7 @@ #include "scene/resources/bit_map.h" #include "scene/resources/mesh.h" #include "servers/camera/camera_feed.h" + int Texture2D::get_width() const { int ret; if (GDVIRTUAL_REQUIRED_CALL(_get_width, ret)) { @@ -3105,7 +3106,7 @@ Error CompressedTextureLayered::_load_data(const String &p_path, Vector<Ref<Imag uint32_t layer_count = f->get_32(); //layer count uint32_t type = f->get_32(); //layer count - ERR_FAIL_COND_V(type != layered_type, ERR_INVALID_DATA); + ERR_FAIL_COND_V((int)type != layered_type, ERR_INVALID_DATA); uint32_t df = f->get_32(); //data format mipmap_limit = int(f->get_32()); diff --git a/scene/resources/texture.h b/scene/resources/texture.h index da4b8046a5..4e529de8ee 100644 --- a/scene/resources/texture.h +++ b/scene/resources/texture.h @@ -769,15 +769,6 @@ public: class GradientTexture1D : public Texture2D { GDCLASS(GradientTexture1D, Texture2D); -public: - struct Point { - float offset = 0.0; - Color color; - bool operator<(const Point &p_ponit) const { - return offset < p_ponit.offset; - } - }; - private: Ref<Gradient> gradient; bool update_pending = false; diff --git a/scene/resources/tile_set.cpp b/scene/resources/tile_set.cpp index 9138a82ba8..65f3767449 100644 --- a/scene/resources/tile_set.cpp +++ b/scene/resources/tile_set.cpp @@ -1537,7 +1537,6 @@ Vector<Point2> TileSet::get_terrain_polygon(int p_terrain_set) { } return _get_half_offset_terrain_polygon(tile_size, overlap, tile_offset_axis); } - return Vector<Point2>(); } Vector<Point2> TileSet::get_terrain_peering_bit_polygon(int p_terrain_set, TileSet::CellNeighbor p_bit) { @@ -5276,6 +5275,7 @@ void TileData::set_terrain_set(int p_terrain_set) { } if (tile_set) { ERR_FAIL_COND(p_terrain_set >= tile_set->get_terrain_sets_count()); + terrain = -1; for (int i = 0; i < 16; i++) { terrain_peering_bits[i] = -1; } diff --git a/scene/resources/video_stream.h b/scene/resources/video_stream.h index 35686b293c..e14081c681 100644 --- a/scene/resources/video_stream.h +++ b/scene/resources/video_stream.h @@ -50,16 +50,16 @@ public: virtual void set_loop(bool p_enable) = 0; virtual bool has_loop() const = 0; - virtual float get_length() const = 0; + virtual double get_length() const = 0; - virtual float get_playback_position() const = 0; - virtual void seek(float p_time) = 0; + virtual double get_playback_position() const = 0; + virtual void seek(double p_time) = 0; virtual void set_audio_track(int p_idx) = 0; virtual Ref<Texture2D> get_texture() const = 0; - virtual void update(float p_delta) = 0; + virtual void update(double p_delta) = 0; virtual void set_mix_callback(AudioMixCallback p_callback, void *p_userdata) = 0; virtual int get_channels() const = 0; diff --git a/scene/resources/visual_shader.cpp b/scene/resources/visual_shader.cpp index 262dbe28ed..9174fcd9e3 100644 --- a/scene/resources/visual_shader.cpp +++ b/scene/resources/visual_shader.cpp @@ -955,7 +955,7 @@ bool VisualShader::can_connect_nodes(Type p_type, int p_from_node, int p_from_po } bool VisualShader::is_port_types_compatible(int p_a, int p_b) const { - return MAX(0, p_a - 4) == (MAX(0, p_b - 4)); + return MAX(0, p_a - 5) == (MAX(0, p_b - 5)); } void VisualShader::connect_nodes_forced(Type p_type, int p_from_node, int p_from_port, int p_to_node, int p_to_port) { @@ -2763,6 +2763,9 @@ const VisualShaderNodeInput::Port VisualShaderNodeInput::ports[] = { { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR_4D, "light", "LIGHT" }, { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR_4D, "light_color", "LIGHT_COLOR" }, { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR_3D, "light_position", "LIGHT_POSITION" }, + { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR_3D, "light_direction", "LIGHT_DIRECTION" }, + { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_BOOLEAN, "light_is_directional", "LIGHT_IS_DIRECTIONAL" }, + { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "light_energy", "LIGHT_ENERGY" }, { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR_3D, "light_vertex", "LIGHT_VERTEX" }, { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR_4D, "shadow", "SHADOW_MODULATE" }, { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR_2D, "screen_uv", "SCREEN_UV" }, diff --git a/scene/resources/visual_shader.h b/scene/resources/visual_shader.h index 4116eaa196..3aba550f03 100644 --- a/scene/resources/visual_shader.h +++ b/scene/resources/visual_shader.h @@ -90,11 +90,10 @@ public: struct Varying { String name; - VaryingMode mode; - VaryingType type; + VaryingMode mode = VARYING_MODE_MAX; + VaryingType type = VARYING_TYPE_MAX; - Varying() { - } + Varying() {} Varying(String p_name, VaryingMode p_mode, VaryingType p_type) : name(p_name), mode(p_mode), type(p_type) {} diff --git a/scene/resources/visual_shader_particle_nodes.cpp b/scene/resources/visual_shader_particle_nodes.cpp index bdfbb59fa6..df6abe161e 100644 --- a/scene/resources/visual_shader_particle_nodes.cpp +++ b/scene/resources/visual_shader_particle_nodes.cpp @@ -1130,31 +1130,38 @@ VisualShaderNodeParticleAccelerator::VisualShaderNodeParticleAccelerator() { // VisualShaderNodeParticleOutput String VisualShaderNodeParticleOutput::get_caption() const { - if (shader_type == VisualShader::TYPE_START) { - return "StartOutput"; - } else if (shader_type == VisualShader::TYPE_PROCESS) { - return "ProcessOutput"; - } else if (shader_type == VisualShader::TYPE_COLLIDE) { - return "CollideOutput"; - } else if (shader_type == VisualShader::TYPE_START_CUSTOM) { - return "CustomStartOutput"; - } else if (shader_type == VisualShader::TYPE_PROCESS_CUSTOM) { - return "CustomProcessOutput"; + switch (shader_type) { + case VisualShader::TYPE_START: + return "StartOutput"; + case VisualShader::TYPE_PROCESS: + return "ProcessOutput"; + case VisualShader::TYPE_COLLIDE: + return "CollideOutput"; + case VisualShader::TYPE_START_CUSTOM: + return "CustomStartOutput"; + case VisualShader::TYPE_PROCESS_CUSTOM: + return "CustomProcessOutput"; + default: + ERR_PRINT(vformat("Unexpected shader_type %d for VisualShaderNodeParticleOutput.", shader_type)); + return ""; } - return String(); } int VisualShaderNodeParticleOutput::get_input_port_count() const { - if (shader_type == VisualShader::TYPE_START) { - return 8; - } else if (shader_type == VisualShader::TYPE_COLLIDE) { - return 5; - } else if (shader_type == VisualShader::TYPE_START_CUSTOM || shader_type == VisualShader::TYPE_PROCESS_CUSTOM) { - return 6; - } else { // TYPE_PROCESS - return 7; + switch (shader_type) { + case VisualShader::TYPE_START: + return 8; + case VisualShader::TYPE_PROCESS: + return 7; + case VisualShader::TYPE_COLLIDE: + return 5; + case VisualShader::TYPE_START_CUSTOM: + case VisualShader::TYPE_PROCESS_CUSTOM: + return 6; + default: + ERR_PRINT(vformat("Unexpected shader_type %d for VisualShaderNodeParticleOutput.", shader_type)); + return 0; } - return 0; } VisualShaderNodeParticleOutput::PortType VisualShaderNodeParticleOutput::get_input_port_type(int p_port) const { diff --git a/servers/SCsub b/servers/SCsub index 2ce90e970b..788a368a4f 100644 --- a/servers/SCsub +++ b/servers/SCsub @@ -15,6 +15,7 @@ SConscript("text/SCsub") SConscript("debugger/SCsub") SConscript("extensions/SCsub") SConscript("movie_writer/SCsub") +SConscript("navigation/SCsub") lib = env.add_library("servers", env.servers_sources) diff --git a/servers/audio/audio_rb_resampler.cpp b/servers/audio/audio_rb_resampler.cpp index 0cfba17563..adb0dc32ea 100644 --- a/servers/audio/audio_rb_resampler.cpp +++ b/servers/audio/audio_rb_resampler.cpp @@ -57,14 +57,14 @@ uint32_t AudioRBResampler::_resample(AudioFrame *p_dest, int p_todo, int32_t p_i uint32_t pos_next = (pos + 1) & rb_mask; // since this is a template with a known compile time value (C), conditionals go away when compiling. - if (C == 1) { + if constexpr (C == 1) { float v0 = rb[pos]; float v0n = rb[pos_next]; v0 += (v0n - v0) * frac; p_dest[i] = AudioFrame(v0, v0); } - if (C == 2) { + if constexpr (C == 2) { float v0 = rb[(pos << 1) + 0]; float v1 = rb[(pos << 1) + 1]; float v0n = rb[(pos_next << 1) + 0]; @@ -76,7 +76,7 @@ uint32_t AudioRBResampler::_resample(AudioFrame *p_dest, int p_todo, int32_t p_i } // This will probably never be used, but added anyway - if (C == 4) { + if constexpr (C == 4) { float v0 = rb[(pos << 2) + 0]; float v1 = rb[(pos << 2) + 1]; float v0n = rb[(pos_next << 2) + 0]; @@ -86,7 +86,7 @@ uint32_t AudioRBResampler::_resample(AudioFrame *p_dest, int p_todo, int32_t p_i p_dest[i] = AudioFrame(v0, v1); } - if (C == 6) { + if constexpr (C == 6) { float v0 = rb[(pos * 6) + 0]; float v1 = rb[(pos * 6) + 1]; float v0n = rb[(pos_next * 6) + 0]; diff --git a/servers/audio/audio_stream.cpp b/servers/audio/audio_stream.cpp index 4252131161..1bfe6a3eb5 100644 --- a/servers/audio/audio_stream.cpp +++ b/servers/audio/audio_stream.cpp @@ -33,7 +33,7 @@ #include "core/config/project_settings.h" #include "core/os/os.h" -void AudioStreamPlayback::start(float p_from_pos) { +void AudioStreamPlayback::start(double p_from_pos) { if (GDVIRTUAL_CALL(_start, p_from_pos)) { return; } @@ -61,14 +61,14 @@ int AudioStreamPlayback::get_loop_count() const { return 0; } -float AudioStreamPlayback::get_playback_position() const { - float ret; +double AudioStreamPlayback::get_playback_position() const { + double ret; if (GDVIRTUAL_CALL(_get_playback_position, ret)) { return ret; } ERR_FAIL_V_MSG(0, "AudioStreamPlayback::get_playback_position unimplemented!"); } -void AudioStreamPlayback::seek(float p_time) { +void AudioStreamPlayback::seek(double p_time) { if (GDVIRTUAL_CALL(_seek, p_time)) { return; } @@ -207,8 +207,8 @@ String AudioStream::get_stream_name() const { return String(); } -float AudioStream::get_length() const { - float ret; +double AudioStream::get_length() const { + double ret; if (GDVIRTUAL_CALL(_get_length, ret)) { return ret; } @@ -309,7 +309,7 @@ String AudioStreamMicrophone::get_stream_name() const { return "Microphone"; } -float AudioStreamMicrophone::get_length() const { +double AudioStreamMicrophone::get_length() const { return 0; } @@ -382,7 +382,7 @@ float AudioStreamPlaybackMicrophone::get_stream_sampling_rate() { return AudioDriver::get_singleton()->get_mix_rate(); } -void AudioStreamPlaybackMicrophone::start(float p_from_pos) { +void AudioStreamPlaybackMicrophone::start(double p_from_pos) { if (active) { return; } @@ -415,11 +415,11 @@ int AudioStreamPlaybackMicrophone::get_loop_count() const { return 0; } -float AudioStreamPlaybackMicrophone::get_playback_position() const { +double AudioStreamPlaybackMicrophone::get_playback_position() const { return 0; } -void AudioStreamPlaybackMicrophone::seek(float p_time) { +void AudioStreamPlaybackMicrophone::seek(double p_time) { // Can't seek a microphone input } @@ -664,7 +664,7 @@ String AudioStreamRandomizer::get_stream_name() const { return "Randomizer"; } -float AudioStreamRandomizer::get_length() const { +double AudioStreamRandomizer::get_length() const { return 0; } @@ -769,7 +769,7 @@ void AudioStreamRandomizer::_bind_methods() { AudioStreamRandomizer::AudioStreamRandomizer() {} -void AudioStreamPlaybackRandomizer::start(float p_from_pos) { +void AudioStreamPlaybackRandomizer::start(double p_from_pos) { playing = playback; { float range_from = 1.0 / randomizer->random_pitch_scale; @@ -812,7 +812,7 @@ int AudioStreamPlaybackRandomizer::get_loop_count() const { return 0; } -float AudioStreamPlaybackRandomizer::get_playback_position() const { +double AudioStreamPlaybackRandomizer::get_playback_position() const { if (playing.is_valid()) { return playing->get_playback_position(); } @@ -820,7 +820,7 @@ float AudioStreamPlaybackRandomizer::get_playback_position() const { return 0; } -void AudioStreamPlaybackRandomizer::seek(float p_time) { +void AudioStreamPlaybackRandomizer::seek(double p_time) { if (playing.is_valid()) { playing->seek(p_time); } diff --git a/servers/audio/audio_stream.h b/servers/audio/audio_stream.h index 7c4577977d..c41475010c 100644 --- a/servers/audio/audio_stream.h +++ b/servers/audio/audio_stream.h @@ -47,23 +47,23 @@ class AudioStreamPlayback : public RefCounted { protected: static void _bind_methods(); - GDVIRTUAL1(_start, float) + GDVIRTUAL1(_start, double) GDVIRTUAL0(_stop) GDVIRTUAL0RC(bool, _is_playing) GDVIRTUAL0RC(int, _get_loop_count) - GDVIRTUAL0RC(float, _get_playback_position) - GDVIRTUAL1(_seek, float) + GDVIRTUAL0RC(double, _get_playback_position) + GDVIRTUAL1(_seek, double) GDVIRTUAL3R(int, _mix, GDNativePtr<AudioFrame>, float, int) GDVIRTUAL0(_tag_used_streams) public: - virtual void start(float p_from_pos = 0.0); + virtual void start(double p_from_pos = 0.0); virtual void stop(); virtual bool is_playing() const; virtual int get_loop_count() const; //times it looped - virtual float get_playback_position() const; - virtual void seek(float p_time); + virtual double get_playback_position() const; + virtual void seek(double p_time); virtual void tag_used_streams(); @@ -119,7 +119,7 @@ protected: GDVIRTUAL0RC(Ref<AudioStreamPlayback>, _instantiate_playback) GDVIRTUAL0RC(String, _get_stream_name) - GDVIRTUAL0RC(float, _get_length) + GDVIRTUAL0RC(double, _get_length) GDVIRTUAL0RC(bool, _is_monophonic) GDVIRTUAL0RC(double, _get_bpm) GDVIRTUAL0RC(bool, _has_loop) @@ -135,7 +135,7 @@ public: virtual int get_bar_beats() const; virtual int get_beat_count() const; - virtual float get_length() const; + virtual double get_length() const; virtual bool is_monophonic() const; void tag_used(float p_offset); @@ -161,7 +161,7 @@ public: virtual Ref<AudioStreamPlayback> instantiate_playback() override; virtual String get_stream_name() const override; - virtual float get_length() const override; //if supported, otherwise return 0 + virtual double get_length() const override; //if supported, otherwise return 0 virtual bool is_monophonic() const override; @@ -180,18 +180,18 @@ class AudioStreamPlaybackMicrophone : public AudioStreamPlaybackResampled { protected: virtual int _mix_internal(AudioFrame *p_buffer, int p_frames) override; virtual float get_stream_sampling_rate() override; - virtual float get_playback_position() const override; + virtual double get_playback_position() const override; public: virtual int mix(AudioFrame *p_buffer, float p_rate_scale, int p_frames) override; - virtual void start(float p_from_pos = 0.0) override; + virtual void start(double p_from_pos = 0.0) override; virtual void stop() override; virtual bool is_playing() const override; virtual int get_loop_count() const override; //times it looped - virtual void seek(float p_time) override; + virtual void seek(double p_time) override; virtual void tag_used_streams() override; @@ -265,7 +265,7 @@ public: virtual Ref<AudioStreamPlayback> instantiate_playback() override; virtual String get_stream_name() const override; - virtual float get_length() const override; //if supported, otherwise return 0 + virtual double get_length() const override; //if supported, otherwise return 0 virtual bool is_monophonic() const override; AudioStreamRandomizer(); @@ -283,14 +283,14 @@ class AudioStreamPlaybackRandomizer : public AudioStreamPlayback { float volume_scale; public: - virtual void start(float p_from_pos = 0.0) override; + virtual void start(double p_from_pos = 0.0) override; virtual void stop() override; virtual bool is_playing() const override; virtual int get_loop_count() const override; //times it looped - virtual float get_playback_position() const override; - virtual void seek(float p_time) override; + virtual double get_playback_position() const override; + virtual void seek(double p_time) override; virtual int mix(AudioFrame *p_buffer, float p_rate_scale, int p_frames) override; diff --git a/servers/audio/effects/audio_effect_filter.cpp b/servers/audio/effects/audio_effect_filter.cpp index a9409076cd..68f8e334df 100644 --- a/servers/audio/effects/audio_effect_filter.cpp +++ b/servers/audio/effects/audio_effect_filter.cpp @@ -36,13 +36,13 @@ void AudioEffectFilterInstance::_process_filter(const AudioFrame *p_src_frames, for (int i = 0; i < p_frame_count; i++) { float f = p_src_frames[i].l; filter_process[0][0].process_one(f); - if (S > 1) { + if constexpr (S > 1) { filter_process[0][1].process_one(f); } - if (S > 2) { + if constexpr (S > 2) { filter_process[0][2].process_one(f); } - if (S > 3) { + if constexpr (S > 3) { filter_process[0][3].process_one(f); } @@ -52,13 +52,13 @@ void AudioEffectFilterInstance::_process_filter(const AudioFrame *p_src_frames, for (int i = 0; i < p_frame_count; i++) { float f = p_src_frames[i].r; filter_process[1][0].process_one(f); - if (S > 1) { + if constexpr (S > 1) { filter_process[1][1].process_one(f); } - if (S > 2) { + if constexpr (S > 2) { filter_process[1][2].process_one(f); } - if (S > 3) { + if constexpr (S > 3) { filter_process[1][3].process_one(f); } diff --git a/servers/audio/effects/audio_effect_record.cpp b/servers/audio/effects/audio_effect_record.cpp index fff6dbc32a..b2e57c9a01 100644 --- a/servers/audio/effects/audio_effect_record.cpp +++ b/servers/audio/effects/audio_effect_record.cpp @@ -116,19 +116,11 @@ void AudioEffectRecordInstance::init() { recording_data.clear(); //Clear data completely and reset length is_recording = true; -#ifdef NO_THREADS - AudioServer::get_singleton()->add_update_callback(&AudioEffectRecordInstance::_update, this); -#else io_thread.start(_thread_callback, this); -#endif } void AudioEffectRecordInstance::finish() { -#ifdef NO_THREADS - AudioServer::get_singleton()->remove_update_callback(&AudioEffectRecordInstance::_update, this); -#else io_thread.wait_to_finish(); -#endif } AudioEffectRecordInstance::~AudioEffectRecordInstance() { diff --git a/servers/audio/effects/audio_stream_generator.cpp b/servers/audio/effects/audio_stream_generator.cpp index 6365dacc80..547b60a317 100644 --- a/servers/audio/effects/audio_stream_generator.cpp +++ b/servers/audio/effects/audio_stream_generator.cpp @@ -60,7 +60,7 @@ String AudioStreamGenerator::get_stream_name() const { return "UserFeed"; } -float AudioStreamGenerator::get_length() const { +double AudioStreamGenerator::get_length() const { return 0; } @@ -108,7 +108,7 @@ bool AudioStreamGeneratorPlayback::push_buffer(const PackedVector2Array &p_frame } const Vector2 *r = p_frames.ptr(); - if (sizeof(real_t) == 4) { + if constexpr (sizeof(real_t) == 4) { //write directly buffer.write((const AudioFrame *)r, to_write); } else { @@ -167,7 +167,7 @@ float AudioStreamGeneratorPlayback::get_stream_sampling_rate() { return generator->get_mix_rate(); } -void AudioStreamGeneratorPlayback::start(float p_from_pos) { +void AudioStreamGeneratorPlayback::start(double p_from_pos) { if (mixed == 0.0) { begin_resample(); } @@ -188,11 +188,11 @@ int AudioStreamGeneratorPlayback::get_loop_count() const { return 0; } -float AudioStreamGeneratorPlayback::get_playback_position() const { +double AudioStreamGeneratorPlayback::get_playback_position() const { return mixed; } -void AudioStreamGeneratorPlayback::seek(float p_time) { +void AudioStreamGeneratorPlayback::seek(double p_time) { //no seek possible } diff --git a/servers/audio/effects/audio_stream_generator.h b/servers/audio/effects/audio_stream_generator.h index a0bed0fda5..21cb3954d3 100644 --- a/servers/audio/effects/audio_stream_generator.h +++ b/servers/audio/effects/audio_stream_generator.h @@ -53,7 +53,7 @@ public: virtual Ref<AudioStreamPlayback> instantiate_playback() override; virtual String get_stream_name() const override; - virtual float get_length() const override; + virtual double get_length() const override; virtual bool is_monophonic() const override; AudioStreamGenerator(); }; @@ -74,14 +74,14 @@ protected: static void _bind_methods(); public: - virtual void start(float p_from_pos = 0.0) override; + virtual void start(double p_from_pos = 0.0) override; virtual void stop() override; virtual bool is_playing() const override; virtual int get_loop_count() const override; //times it looped - virtual float get_playback_position() const override; - virtual void seek(float p_time) override; + virtual double get_playback_position() const override; + virtual void seek(double p_time) override; bool push_frame(const Vector2 &p_frame); bool can_push_buffer(int p_frames) const; diff --git a/servers/display_server.cpp b/servers/display_server.cpp index dda8e29b6a..4b97bede56 100644 --- a/servers/display_server.cpp +++ b/servers/display_server.cpp @@ -678,6 +678,7 @@ void DisplayServer::_bind_methods() { ClassDB::bind_method(D_METHOD("window_set_flag", "flag", "enabled", "window_id"), &DisplayServer::window_set_flag, DEFVAL(MAIN_WINDOW_ID)); ClassDB::bind_method(D_METHOD("window_get_flag", "flag", "window_id"), &DisplayServer::window_get_flag, DEFVAL(MAIN_WINDOW_ID)); + ClassDB::bind_method(D_METHOD("window_set_window_buttons_offset", "offset", "window_id"), &DisplayServer::window_set_window_buttons_offset, DEFVAL(MAIN_WINDOW_ID)); ClassDB::bind_method(D_METHOD("window_get_safe_title_margins", "window_id"), &DisplayServer::window_get_safe_title_margins, DEFVAL(MAIN_WINDOW_ID)); ClassDB::bind_method(D_METHOD("window_request_attention", "window_id"), &DisplayServer::window_request_attention, DEFVAL(MAIN_WINDOW_ID)); @@ -823,6 +824,7 @@ void DisplayServer::_bind_methods() { BIND_ENUM_CONSTANT(WINDOW_EVENT_CLOSE_REQUEST); BIND_ENUM_CONSTANT(WINDOW_EVENT_GO_BACK_REQUEST); BIND_ENUM_CONSTANT(WINDOW_EVENT_DPI_CHANGE); + BIND_ENUM_CONSTANT(WINDOW_EVENT_TITLEBAR_CHANGE); BIND_ENUM_CONSTANT(VSYNC_DISABLED); BIND_ENUM_CONSTANT(VSYNC_ENABLED); diff --git a/servers/display_server.h b/servers/display_server.h index ab4f9fc499..8eafccc040 100644 --- a/servers/display_server.h +++ b/servers/display_server.h @@ -336,6 +336,7 @@ public: WINDOW_EVENT_CLOSE_REQUEST, WINDOW_EVENT_GO_BACK_REQUEST, WINDOW_EVENT_DPI_CHANGE, + WINDOW_EVENT_TITLEBAR_CHANGE, }; virtual void window_set_window_event_callback(const Callable &p_callable, WindowID p_window = MAIN_WINDOW_ID) = 0; virtual void window_set_input_event_callback(const Callable &p_callable, WindowID p_window = MAIN_WINDOW_ID) = 0; @@ -380,7 +381,8 @@ public: virtual void window_request_attention(WindowID p_window = MAIN_WINDOW_ID) = 0; virtual void window_move_to_foreground(WindowID p_window = MAIN_WINDOW_ID) = 0; - virtual Vector2i window_get_safe_title_margins(WindowID p_window = MAIN_WINDOW_ID) const { return Vector2i(); }; + virtual void window_set_window_buttons_offset(const Vector2i &p_offset, WindowID p_window = MAIN_WINDOW_ID) {} + virtual Vector2i window_get_safe_title_margins(WindowID p_window = MAIN_WINDOW_ID) const { return Vector2i(); } virtual bool window_can_draw(WindowID p_window = MAIN_WINDOW_ID) const = 0; diff --git a/servers/extensions/physics_server_2d_extension.cpp b/servers/extensions/physics_server_2d_extension.cpp index c56f31e6f9..e5920c78d4 100644 --- a/servers/extensions/physics_server_2d_extension.cpp +++ b/servers/extensions/physics_server_2d_extension.cpp @@ -123,6 +123,8 @@ bool PhysicsServer2DExtension::body_test_motion_is_excluding_object(ObjectID p_o } void PhysicsServer2DExtension::_bind_methods() { + /* SHAPE API */ + GDVIRTUAL_BIND(_world_boundary_shape_create); GDVIRTUAL_BIND(_separation_ray_shape_create); GDVIRTUAL_BIND(_segment_shape_create); @@ -133,18 +135,32 @@ void PhysicsServer2DExtension::_bind_methods() { GDVIRTUAL_BIND(_concave_polygon_shape_create); GDVIRTUAL_BIND(_shape_set_data, "shape", "data"); + GDVIRTUAL_BIND(_shape_set_custom_solver_bias, "shape", "bias"); GDVIRTUAL_BIND(_shape_get_type, "shape"); GDVIRTUAL_BIND(_shape_get_data, "shape"); + GDVIRTUAL_BIND(_shape_get_custom_solver_bias, "shape"); + GDVIRTUAL_BIND(_shape_collide, "shape_A", "xform_A", "motion_A", "shape_B", "xform_B", "motion_B", "results", "result_max", "result_count"); + + /* SPACE API */ GDVIRTUAL_BIND(_space_create); GDVIRTUAL_BIND(_space_set_active, "space", "active"); GDVIRTUAL_BIND(_space_is_active, "space"); + GDVIRTUAL_BIND(_space_set_param, "space", "param", "value"); GDVIRTUAL_BIND(_space_get_param, "space", "param"); + GDVIRTUAL_BIND(_space_get_direct_state, "space"); + GDVIRTUAL_BIND(_space_set_debug_contacts, "space", "max_contacts"); + GDVIRTUAL_BIND(_space_get_contacts, "space"); + GDVIRTUAL_BIND(_space_get_contact_count, "space"); + + /* AREA API */ + GDVIRTUAL_BIND(_area_create); + GDVIRTUAL_BIND(_area_set_space, "area", "space"); GDVIRTUAL_BIND(_area_get_space, "area"); @@ -160,8 +176,11 @@ void PhysicsServer2DExtension::_bind_methods() { GDVIRTUAL_BIND(_area_remove_shape, "area", "shape_idx"); GDVIRTUAL_BIND(_area_clear_shapes, "area"); - GDVIRTUAL_BIND(_area_set_collision_layer, "area", "layer"); - GDVIRTUAL_BIND(_area_set_collision_mask, "area", "mask"); + GDVIRTUAL_BIND(_area_attach_object_instance_id, "area", "id"); + GDVIRTUAL_BIND(_area_get_object_instance_id, "area"); + + GDVIRTUAL_BIND(_area_attach_canvas_instance_id, "area", "id"); + GDVIRTUAL_BIND(_area_get_canvas_instance_id, "area"); GDVIRTUAL_BIND(_area_set_param, "area", "param", "value"); GDVIRTUAL_BIND(_area_set_transform, "area", "transform"); @@ -169,15 +188,19 @@ void PhysicsServer2DExtension::_bind_methods() { GDVIRTUAL_BIND(_area_get_param, "area", "param"); GDVIRTUAL_BIND(_area_get_transform, "area"); - GDVIRTUAL_BIND(_area_attach_object_instance_id, "area", "id"); - GDVIRTUAL_BIND(_area_get_object_instance_id, "area"); + GDVIRTUAL_BIND(_area_set_collision_layer, "area", "layer"); + GDVIRTUAL_BIND(_area_get_collision_layer, "area"); - GDVIRTUAL_BIND(_area_attach_canvas_instance_id, "area", "id"); - GDVIRTUAL_BIND(_area_get_canvas_instance_id, "area"); + GDVIRTUAL_BIND(_area_set_collision_mask, "area", "mask"); + GDVIRTUAL_BIND(_area_get_collision_mask, "area"); + + GDVIRTUAL_BIND(_area_set_monitorable, "area", "monitorable"); + GDVIRTUAL_BIND(_area_set_pickable, "area", "pickable"); GDVIRTUAL_BIND(_area_set_monitor_callback, "area", "callback"); GDVIRTUAL_BIND(_area_set_area_monitor_callback, "area", "callback"); - GDVIRTUAL_BIND(_area_set_monitorable, "area", "monitorable"); + + /* BODY API */ GDVIRTUAL_BIND(_body_create); @@ -195,12 +218,12 @@ void PhysicsServer2DExtension::_bind_methods() { GDVIRTUAL_BIND(_body_get_shape, "body", "shape_idx"); GDVIRTUAL_BIND(_body_get_shape_transform, "body", "shape_idx"); - GDVIRTUAL_BIND(_body_remove_shape, "body", "shape_idx"); - GDVIRTUAL_BIND(_body_clear_shapes, "body"); - GDVIRTUAL_BIND(_body_set_shape_disabled, "body", "shape_idx", "disabled"); GDVIRTUAL_BIND(_body_set_shape_as_one_way_collision, "body", "shape_idx", "enable", "margin"); + GDVIRTUAL_BIND(_body_remove_shape, "body", "shape_idx"); + GDVIRTUAL_BIND(_body_clear_shapes, "body"); + GDVIRTUAL_BIND(_body_attach_object_instance_id, "body", "id"); GDVIRTUAL_BIND(_body_get_object_instance_id, "body"); @@ -249,25 +272,39 @@ void PhysicsServer2DExtension::_bind_methods() { GDVIRTUAL_BIND(_body_add_collision_exception, "body", "excepted_body"); GDVIRTUAL_BIND(_body_remove_collision_exception, "body", "excepted_body"); + GDVIRTUAL_BIND(_body_get_collision_exceptions, "body"); GDVIRTUAL_BIND(_body_set_max_contacts_reported, "body", "amount"); GDVIRTUAL_BIND(_body_get_max_contacts_reported, "body"); + GDVIRTUAL_BIND(_body_set_contacts_reported_depth_threshold, "body", "threshold"); + GDVIRTUAL_BIND(_body_get_contacts_reported_depth_threshold, "body"); + GDVIRTUAL_BIND(_body_set_omit_force_integration, "body", "enable"); GDVIRTUAL_BIND(_body_is_omitting_force_integration, "body"); + GDVIRTUAL_BIND(_body_set_state_sync_callback, "body", "callable"); GDVIRTUAL_BIND(_body_set_force_integration_callback, "body", "callable", "userdata"); - GDVIRTUAL_BIND(_body_test_motion, "body", "from", "motion", "margin", "collide_separation_ray", "recovery_as_collision", "result"); + GDVIRTUAL_BIND(_body_collide_shape, "body", "body_shape", "shape", "shape_xform", "motion", "results", "result_max", "result_count"); + + GDVIRTUAL_BIND(_body_set_pickable, "body", "pickable"); GDVIRTUAL_BIND(_body_get_direct_state, "body"); + GDVIRTUAL_BIND(_body_test_motion, "body", "from", "motion", "margin", "collide_separation_ray", "recovery_as_collision", "result"); + + /* JOINT API */ + GDVIRTUAL_BIND(_joint_create); GDVIRTUAL_BIND(_joint_clear, "joint"); GDVIRTUAL_BIND(_joint_set_param, "joint", "param", "value"); GDVIRTUAL_BIND(_joint_get_param, "joint", "param"); + GDVIRTUAL_BIND(_joint_disable_collisions_between_bodies, "joint", "disable"); + GDVIRTUAL_BIND(_joint_is_disabled_collisions_between_bodies, "joint"); + GDVIRTUAL_BIND(_joint_make_pin, "joint", "anchor", "body_a", "body_b"); GDVIRTUAL_BIND(_joint_make_groove, "joint", "a_groove1", "a_groove2", "b_anchor", "body_a", "body_b"); GDVIRTUAL_BIND(_joint_make_damped_spring, "joint", "anchor_a", "anchor_b", "body_a", "body_b"); @@ -280,6 +317,8 @@ void PhysicsServer2DExtension::_bind_methods() { GDVIRTUAL_BIND(_joint_get_type, "joint"); + /* MISC */ + GDVIRTUAL_BIND(_free_rid, "rid"); GDVIRTUAL_BIND(_set_active, "active"); diff --git a/servers/extensions/physics_server_2d_extension.h b/servers/extensions/physics_server_2d_extension.h index 4c83664b14..573b51ee12 100644 --- a/servers/extensions/physics_server_2d_extension.h +++ b/servers/extensions/physics_server_2d_extension.h @@ -94,7 +94,6 @@ public: EXBIND1RC(Vector2, get_contact_local_position, int) EXBIND1RC(Vector2, get_contact_local_normal, int) EXBIND1RC(int, get_contact_local_shape, int) - EXBIND1RC(RID, get_contact_collider, int) EXBIND1RC(Vector2, get_contact_collider_position, int) EXBIND1RC(ObjectID, get_contact_collider_id, int) @@ -183,13 +182,7 @@ public: typedef PhysicsServer2D::MotionResult PhysicsServer2DExtensionMotionResult; -struct PhysicsServer2DExtensionStateCallback { - void *instance = nullptr; - void (*callback)(void *p_instance, PhysicsDirectBodyState2D *p_state); -}; - GDVIRTUAL_NATIVE_PTR(PhysicsServer2DExtensionMotionResult) -GDVIRTUAL_NATIVE_PTR(PhysicsServer2DExtensionStateCallback) class PhysicsServer2DExtension : public PhysicsServer2D { GDCLASS(PhysicsServer2DExtension, PhysicsServer2D); @@ -204,6 +197,8 @@ protected: public: // The warning is valid, but unavoidable. If the function is not overridden it will error anyway. + /* SHAPE API */ + EXBIND0R(RID, world_boundary_shape_create) EXBIND0R(RID, separation_ray_shape_create) EXBIND0R(RID, segment_shape_create) @@ -252,6 +247,7 @@ public: EXBIND4(area_add_shape, RID, RID, const Transform2D &, bool) EXBIND3(area_set_shape, RID, int, RID) EXBIND3(area_set_shape_transform, RID, int, const Transform2D &) + EXBIND3(area_set_shape_disabled, RID, int, bool) EXBIND1RC(int, area_get_shape_count, RID) EXBIND2RC(RID, area_get_shape, RID, int) @@ -260,8 +256,6 @@ public: EXBIND2(area_remove_shape, RID, int) EXBIND1(area_clear_shapes, RID) - EXBIND3(area_set_shape_disabled, RID, int, bool) - EXBIND2(area_attach_object_instance_id, RID, ObjectID) EXBIND1RC(ObjectID, area_get_object_instance_id, RID) @@ -274,8 +268,11 @@ public: EXBIND2RC(Variant, area_get_param, RID, AreaParameter) EXBIND1RC(Transform2D, area_get_transform, RID) - EXBIND2(area_set_collision_mask, RID, uint32_t) EXBIND2(area_set_collision_layer, RID, uint32_t) + EXBIND1RC(uint32_t, area_get_collision_layer, RID) + + EXBIND2(area_set_collision_mask, RID, uint32_t) + EXBIND1RC(uint32_t, area_get_collision_mask, RID) EXBIND2(area_set_monitorable, RID, bool) EXBIND2(area_set_pickable, RID, bool) @@ -375,13 +372,7 @@ public: EXBIND2(body_set_omit_force_integration, RID, bool) EXBIND1RC(bool, body_is_omitting_force_integration, RID) - GDVIRTUAL2(_body_set_state_sync_callback, RID, GDNativePtr<PhysicsServer2DExtensionStateCallback>) - void body_set_state_sync_callback(RID p_body, void *p_instance, BodyStateCallback p_callback) override { - PhysicsServer2DExtensionStateCallback callback; - callback.callback = p_callback; - callback.instance = p_instance; - GDVIRTUAL_REQUIRED_CALL(_body_set_state_sync_callback, p_body, &callback); - } + EXBIND2(body_set_state_sync_callback, RID, const Callable &) EXBIND3(body_set_force_integration_callback, RID, const Callable &, const Variant &) virtual bool body_collide_shape(RID p_body, int p_body_shape, RID p_shape, const Transform2D &p_shape_xform, const Vector2 &p_motion, Vector2 *r_results, int p_result_max, int &r_result_count) override { @@ -415,7 +406,6 @@ public: /* JOINT API */ EXBIND0R(RID, joint_create) - EXBIND1(joint_clear, RID) EXBIND3(joint_set_param, RID, JointParam, real_t) diff --git a/servers/extensions/physics_server_3d_extension.cpp b/servers/extensions/physics_server_3d_extension.cpp index 6ed5dca968..27f9ed2cb3 100644 --- a/servers/extensions/physics_server_3d_extension.cpp +++ b/servers/extensions/physics_server_3d_extension.cpp @@ -125,6 +125,8 @@ bool PhysicsServer3DExtension::body_test_motion_is_excluding_object(ObjectID p_o } void PhysicsServer3DExtension::_bind_methods() { + /* SHAPE API */ + GDVIRTUAL_BIND(_world_boundary_shape_create); GDVIRTUAL_BIND(_separation_ray_shape_create); GDVIRTUAL_BIND(_sphere_shape_create); @@ -137,18 +139,34 @@ void PhysicsServer3DExtension::_bind_methods() { GDVIRTUAL_BIND(_custom_shape_create); GDVIRTUAL_BIND(_shape_set_data, "shape", "data"); + GDVIRTUAL_BIND(_shape_set_custom_solver_bias, "shape", "bias"); + + GDVIRTUAL_BIND(_shape_set_margin, "shape", "margin"); + GDVIRTUAL_BIND(_shape_get_margin, "shape"); GDVIRTUAL_BIND(_shape_get_type, "shape"); GDVIRTUAL_BIND(_shape_get_data, "shape"); + GDVIRTUAL_BIND(_shape_get_custom_solver_bias, "shape"); + + /* SPACE API */ GDVIRTUAL_BIND(_space_create); GDVIRTUAL_BIND(_space_set_active, "space", "active"); GDVIRTUAL_BIND(_space_is_active, "space"); + GDVIRTUAL_BIND(_space_set_param, "space", "param", "value"); GDVIRTUAL_BIND(_space_get_param, "space", "param"); + GDVIRTUAL_BIND(_space_get_direct_state, "space"); + GDVIRTUAL_BIND(_space_set_debug_contacts, "space", "max_contacts"); + GDVIRTUAL_BIND(_space_get_contacts, "space"); + GDVIRTUAL_BIND(_space_get_contact_count, "space"); + + /* AREA API */ + GDVIRTUAL_BIND(_area_create); + GDVIRTUAL_BIND(_area_set_space, "area", "space"); GDVIRTUAL_BIND(_area_get_space, "area"); @@ -164,8 +182,8 @@ void PhysicsServer3DExtension::_bind_methods() { GDVIRTUAL_BIND(_area_remove_shape, "area", "shape_idx"); GDVIRTUAL_BIND(_area_clear_shapes, "area"); - GDVIRTUAL_BIND(_area_set_collision_layer, "area", "layer"); - GDVIRTUAL_BIND(_area_set_collision_mask, "area", "mask"); + GDVIRTUAL_BIND(_area_attach_object_instance_id, "area", "id"); + GDVIRTUAL_BIND(_area_get_object_instance_id, "area"); GDVIRTUAL_BIND(_area_set_param, "area", "param", "value"); GDVIRTUAL_BIND(_area_set_transform, "area", "transform"); @@ -173,14 +191,19 @@ void PhysicsServer3DExtension::_bind_methods() { GDVIRTUAL_BIND(_area_get_param, "area", "param"); GDVIRTUAL_BIND(_area_get_transform, "area"); - GDVIRTUAL_BIND(_area_attach_object_instance_id, "area", "id"); - GDVIRTUAL_BIND(_area_get_object_instance_id, "area"); + GDVIRTUAL_BIND(_area_set_collision_layer, "area", "layer"); + GDVIRTUAL_BIND(_area_get_collision_layer, "area"); + + GDVIRTUAL_BIND(_area_set_collision_mask, "area", "mask"); + GDVIRTUAL_BIND(_area_get_collision_mask, "area"); + + GDVIRTUAL_BIND(_area_set_monitorable, "area", "monitorable"); + GDVIRTUAL_BIND(_area_set_ray_pickable, "area", "enable"); GDVIRTUAL_BIND(_area_set_monitor_callback, "area", "callback"); GDVIRTUAL_BIND(_area_set_area_monitor_callback, "area", "callback"); - GDVIRTUAL_BIND(_area_set_monitorable, "area", "monitorable"); - GDVIRTUAL_BIND(_area_set_ray_pickable, "area", "enable"); + /* BODY API */ GDVIRTUAL_BIND(_body_create); @@ -190,15 +213,6 @@ void PhysicsServer3DExtension::_bind_methods() { GDVIRTUAL_BIND(_body_set_mode, "body", "mode"); GDVIRTUAL_BIND(_body_get_mode, "body"); - GDVIRTUAL_BIND(_body_set_collision_layer, "body", "layer"); - GDVIRTUAL_BIND(_body_get_collision_layer, "body"); - - GDVIRTUAL_BIND(_body_set_collision_mask, "body", "mask"); - GDVIRTUAL_BIND(_body_get_collision_mask, "body"); - - GDVIRTUAL_BIND(_body_set_collision_priority, "body", "priority"); - GDVIRTUAL_BIND(_body_get_collision_priority, "body"); - GDVIRTUAL_BIND(_body_add_shape, "body", "shape", "transform", "disabled"); GDVIRTUAL_BIND(_body_set_shape, "body", "shape_idx", "shape"); GDVIRTUAL_BIND(_body_set_shape_transform, "body", "shape_idx", "transform"); @@ -217,6 +231,18 @@ void PhysicsServer3DExtension::_bind_methods() { GDVIRTUAL_BIND(_body_set_enable_continuous_collision_detection, "body", "enable"); GDVIRTUAL_BIND(_body_is_continuous_collision_detection_enabled, "body"); + GDVIRTUAL_BIND(_body_set_collision_layer, "body", "layer"); + GDVIRTUAL_BIND(_body_get_collision_layer, "body"); + + GDVIRTUAL_BIND(_body_set_collision_mask, "body", "mask"); + GDVIRTUAL_BIND(_body_get_collision_mask, "body"); + + GDVIRTUAL_BIND(_body_set_collision_priority, "body", "priority"); + GDVIRTUAL_BIND(_body_get_collision_priority, "body"); + + GDVIRTUAL_BIND(_body_set_user_flags, "body", "flags"); + GDVIRTUAL_BIND(_body_get_user_flags, "body"); + GDVIRTUAL_BIND(_body_set_param, "body", "param", "value"); GDVIRTUAL_BIND(_body_get_param, "body", "param"); @@ -250,13 +276,18 @@ void PhysicsServer3DExtension::_bind_methods() { GDVIRTUAL_BIND(_body_add_collision_exception, "body", "excepted_body"); GDVIRTUAL_BIND(_body_remove_collision_exception, "body", "excepted_body"); + GDVIRTUAL_BIND(_body_get_collision_exceptions, "body"); GDVIRTUAL_BIND(_body_set_max_contacts_reported, "body", "amount"); GDVIRTUAL_BIND(_body_get_max_contacts_reported, "body"); + GDVIRTUAL_BIND(_body_set_contacts_reported_depth_threshold, "body", "threshold"); + GDVIRTUAL_BIND(_body_get_contacts_reported_depth_threshold, "body"); + GDVIRTUAL_BIND(_body_set_omit_force_integration, "body", "enable"); GDVIRTUAL_BIND(_body_is_omitting_force_integration, "body"); + GDVIRTUAL_BIND(_body_set_state_sync_callback, "body", "callable"); GDVIRTUAL_BIND(_body_set_force_integration_callback, "body", "callable", "userdata"); GDVIRTUAL_BIND(_body_set_ray_pickable, "body", "enable"); @@ -265,12 +296,68 @@ void PhysicsServer3DExtension::_bind_methods() { GDVIRTUAL_BIND(_body_get_direct_state, "body"); + /* SOFT BODY API */ + + GDVIRTUAL_BIND(_soft_body_create); + + GDVIRTUAL_BIND(_soft_body_update_rendering_server, "body", "rendering_server_handler"); + + GDVIRTUAL_BIND(_soft_body_set_space, "body", "space"); + GDVIRTUAL_BIND(_soft_body_get_space, "body"); + + GDVIRTUAL_BIND(_soft_body_set_ray_pickable, "body", "enable"); + + GDVIRTUAL_BIND(_soft_body_set_collision_layer, "body", "layer"); + GDVIRTUAL_BIND(_soft_body_get_collision_layer, "body"); + + GDVIRTUAL_BIND(_soft_body_set_collision_mask, "body", "mask"); + GDVIRTUAL_BIND(_soft_body_get_collision_mask, "body"); + + GDVIRTUAL_BIND(_soft_body_add_collision_exception, "body", "body_b"); + GDVIRTUAL_BIND(_soft_body_remove_collision_exception, "body", "body_b"); + GDVIRTUAL_BIND(_soft_body_get_collision_exceptions, "body"); + + GDVIRTUAL_BIND(_soft_body_set_state, "body", "state", "variant"); + GDVIRTUAL_BIND(_soft_body_get_state, "body", "state"); + + GDVIRTUAL_BIND(_soft_body_set_transform, "body", "transform"); + + GDVIRTUAL_BIND(_soft_body_set_simulation_precision, "body", "simulation_precision"); + GDVIRTUAL_BIND(_soft_body_get_simulation_precision, "body"); + + GDVIRTUAL_BIND(_soft_body_set_total_mass, "body", "total_mass"); + GDVIRTUAL_BIND(_soft_body_get_total_mass, "body"); + + GDVIRTUAL_BIND(_soft_body_set_linear_stiffness, "body", "linear_stiffness"); + GDVIRTUAL_BIND(_soft_body_get_linear_stiffness, "body"); + + GDVIRTUAL_BIND(_soft_body_set_pressure_coefficient, "body", "pressure_coefficient"); + GDVIRTUAL_BIND(_soft_body_get_pressure_coefficient, "body"); + + GDVIRTUAL_BIND(_soft_body_set_damping_coefficient, "body", "damping_coefficient"); + GDVIRTUAL_BIND(_soft_body_get_damping_coefficient, "body"); + + GDVIRTUAL_BIND(_soft_body_set_drag_coefficient, "body", "drag_coefficient"); + GDVIRTUAL_BIND(_soft_body_get_drag_coefficient, "body"); + + GDVIRTUAL_BIND(_soft_body_set_mesh, "body", "mesh"); + GDVIRTUAL_BIND(_soft_body_get_bounds, "body"); + GDVIRTUAL_BIND(_soft_body_move_point, "body", "point_index", "global_position"); + GDVIRTUAL_BIND(_soft_body_get_point_global_position, "body", "point_index"); + + GDVIRTUAL_BIND(_soft_body_remove_all_pinned_points, "body"); + GDVIRTUAL_BIND(_soft_body_pin_point, "body", "point_index", "pin"); + GDVIRTUAL_BIND(_soft_body_is_point_pinned, "body", "point_index"); + + /* JOINT API */ + GDVIRTUAL_BIND(_joint_create); GDVIRTUAL_BIND(_joint_clear, "joint"); GDVIRTUAL_BIND(_joint_make_pin, "joint", "body_A", "local_A", "body_B", "local_B"); + GDVIRTUAL_BIND(_pin_joint_set_param, "joint", "param", "value"); GDVIRTUAL_BIND(_pin_joint_get_param, "joint", "param"); @@ -281,6 +368,7 @@ void PhysicsServer3DExtension::_bind_methods() { GDVIRTUAL_BIND(_pin_joint_get_local_b, "joint"); GDVIRTUAL_BIND(_joint_make_hinge, "joint", "body_A", "hinge_A", "body_B", "hinge_B"); + GDVIRTUAL_BIND(_joint_make_hinge_simple, "joint", "body_A", "pivot_A", "axis_A", "body_B", "pivot_B", "axis_B"); GDVIRTUAL_BIND(_hinge_joint_set_param, "joint", "param", "value"); GDVIRTUAL_BIND(_hinge_joint_get_param, "joint", "param"); @@ -298,11 +386,6 @@ void PhysicsServer3DExtension::_bind_methods() { GDVIRTUAL_BIND(_cone_twist_joint_set_param, "joint", "param", "value"); GDVIRTUAL_BIND(_cone_twist_joint_get_param, "joint", "param"); - GDVIRTUAL_BIND(_joint_get_type, "joint"); - - GDVIRTUAL_BIND(_joint_set_solver_priority, "joint", "priority"); - GDVIRTUAL_BIND(_joint_get_solver_priority, "joint"); - GDVIRTUAL_BIND(_joint_make_generic_6dof, "joint", "body_A", "local_ref_A", "body_B", "local_ref_B"); GDVIRTUAL_BIND(_generic_6dof_joint_set_param, "joint", "axis", "param", "value"); @@ -311,6 +394,11 @@ void PhysicsServer3DExtension::_bind_methods() { GDVIRTUAL_BIND(_generic_6dof_joint_set_flag, "joint", "axis", "flag", "enable"); GDVIRTUAL_BIND(_generic_6dof_joint_get_flag, "joint", "axis", "flag"); + GDVIRTUAL_BIND(_joint_get_type, "joint"); + + GDVIRTUAL_BIND(_joint_set_solver_priority, "joint", "priority"); + GDVIRTUAL_BIND(_joint_get_solver_priority, "joint"); + GDVIRTUAL_BIND(_free_rid, "rid"); GDVIRTUAL_BIND(_set_active, "active"); diff --git a/servers/extensions/physics_server_3d_extension.h b/servers/extensions/physics_server_3d_extension.h index c84582bf31..57f2a2d790 100644 --- a/servers/extensions/physics_server_3d_extension.h +++ b/servers/extensions/physics_server_3d_extension.h @@ -192,14 +192,8 @@ public: typedef PhysicsServer3D::MotionCollision PhysicsServer3DExtensionMotionCollision; typedef PhysicsServer3D::MotionResult PhysicsServer3DExtensionMotionResult; -struct PhysicsServer3DExtensionStateCallback { - void *instance = nullptr; - void (*callback)(void *p_instance, PhysicsDirectBodyState3D *p_state); -}; - GDVIRTUAL_NATIVE_PTR(PhysicsServer3DExtensionMotionCollision) GDVIRTUAL_NATIVE_PTR(PhysicsServer3DExtensionMotionResult) -GDVIRTUAL_NATIVE_PTR(PhysicsServer3DExtensionStateCallback) class PhysicsServer3DExtension : public PhysicsServer3D { GDCLASS(PhysicsServer3DExtension, PhysicsServer3D); @@ -210,6 +204,8 @@ protected: public: // The warning is valid, but unavoidable. If the function is not overridden it will error anyway. + /* SHAPE API */ + EXBIND0R(RID, world_boundary_shape_create) EXBIND0R(RID, separation_ray_shape_create) EXBIND0R(RID, sphere_shape_create) @@ -262,6 +258,7 @@ public: EXBIND1RC(int, area_get_shape_count, RID) EXBIND2RC(RID, area_get_shape, RID, int) EXBIND2RC(Transform3D, area_get_shape_transform, RID, int) + EXBIND2(area_remove_shape, RID, int) EXBIND1(area_clear_shapes, RID) @@ -274,8 +271,11 @@ public: EXBIND2RC(Variant, area_get_param, RID, AreaParameter) EXBIND1RC(Transform3D, area_get_transform, RID) - EXBIND2(area_set_collision_mask, RID, uint32_t) EXBIND2(area_set_collision_layer, RID, uint32_t) + EXBIND1RC(uint32_t, area_get_collision_layer, RID) + + EXBIND2(area_set_collision_mask, RID, uint32_t) + EXBIND1RC(uint32_t, area_get_collision_mask, RID) EXBIND2(area_set_monitorable, RID, bool) EXBIND2(area_set_ray_pickable, RID, bool) @@ -297,12 +297,11 @@ public: EXBIND4(body_add_shape, RID, RID, const Transform3D &, bool) EXBIND3(body_set_shape, RID, int, RID) EXBIND3(body_set_shape_transform, RID, int, const Transform3D &) + EXBIND3(body_set_shape_disabled, RID, int, bool) EXBIND1RC(int, body_get_shape_count, RID) - EXBIND2RC(Transform3D, body_get_shape_transform, RID, int) EXBIND2RC(RID, body_get_shape, RID, int) - - EXBIND3(body_set_shape_disabled, RID, int, bool) + EXBIND2RC(Transform3D, body_get_shape_transform, RID, int) EXBIND2(body_remove_shape, RID, int) EXBIND1(body_clear_shapes, RID) @@ -333,9 +332,9 @@ public: EXBIND3(body_set_state, RID, BodyState, const Variant &) EXBIND2RC(Variant, body_get_state, RID, BodyState) - EXBIND2(body_apply_torque_impulse, RID, const Vector3 &) EXBIND2(body_apply_central_impulse, RID, const Vector3 &) EXBIND3(body_apply_impulse, RID, const Vector3 &, const Vector3 &) + EXBIND2(body_apply_torque_impulse, RID, const Vector3 &) EXBIND2(body_apply_central_force, RID, const Vector3 &) EXBIND3(body_apply_force, RID, const Vector3 &, const Vector3 &) @@ -378,13 +377,7 @@ public: EXBIND2(body_set_omit_force_integration, RID, bool) EXBIND1RC(bool, body_is_omitting_force_integration, RID) - GDVIRTUAL2(_body_set_state_sync_callback, RID, GDNativePtr<PhysicsServer3DExtensionStateCallback>) - void body_set_state_sync_callback(RID p_body, void *p_instance, BodyStateCallback p_callback) override { - PhysicsServer3DExtensionStateCallback callback; - callback.callback = p_callback; - callback.instance = p_instance; - GDVIRTUAL_REQUIRED_CALL(_body_set_state_sync_callback, p_body, &callback); - } + EXBIND2(body_set_state_sync_callback, RID, const Callable &) EXBIND3(body_set_force_integration_callback, RID, const Callable &, const Variant &) EXBIND2(body_set_ray_pickable, RID, bool) @@ -476,7 +469,6 @@ public: /* JOINT API */ EXBIND0R(RID, joint_create) - EXBIND1(joint_clear, RID) EXBIND5(joint_make_pin, RID, RID, const Vector3 &, RID, const Vector3 &) diff --git a/servers/navigation/SCsub b/servers/navigation/SCsub new file mode 100644 index 0000000000..86681f9c74 --- /dev/null +++ b/servers/navigation/SCsub @@ -0,0 +1,5 @@ +#!/usr/bin/env python + +Import("env") + +env.add_source_files(env.servers_sources, "*.cpp") diff --git a/servers/navigation/navigation_path_query_parameters_2d.cpp b/servers/navigation/navigation_path_query_parameters_2d.cpp new file mode 100644 index 0000000000..574af90be1 --- /dev/null +++ b/servers/navigation/navigation_path_query_parameters_2d.cpp @@ -0,0 +1,144 @@ +/*************************************************************************/ +/* navigation_path_query_parameters_2d.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* 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 "navigation_path_query_parameters_2d.h" + +void NavigationPathQueryParameters2D::set_pathfinding_algorithm(const NavigationPathQueryParameters2D::PathfindingAlgorithm p_pathfinding_algorithm) { + switch (p_pathfinding_algorithm) { + case PATHFINDING_ALGORITHM_ASTAR: { + parameters.pathfinding_algorithm = NavigationUtilities::PathfindingAlgorithm::PATHFINDING_ALGORITHM_ASTAR; + } break; + default: { + WARN_PRINT_ONCE("No match for used PathfindingAlgorithm - fallback to default"); + parameters.pathfinding_algorithm = NavigationUtilities::PathfindingAlgorithm::PATHFINDING_ALGORITHM_ASTAR; + } break; + } +} + +NavigationPathQueryParameters2D::PathfindingAlgorithm NavigationPathQueryParameters2D::get_pathfinding_algorithm() const { + switch (parameters.pathfinding_algorithm) { + case NavigationUtilities::PathfindingAlgorithm::PATHFINDING_ALGORITHM_ASTAR: + return PATHFINDING_ALGORITHM_ASTAR; + default: + WARN_PRINT_ONCE("No match for used PathfindingAlgorithm - fallback to default"); + return PATHFINDING_ALGORITHM_ASTAR; + } +} + +void NavigationPathQueryParameters2D::set_path_postprocessing(const NavigationPathQueryParameters2D::PathPostProcessing p_path_postprocessing) { + switch (p_path_postprocessing) { + case PATH_POSTPROCESSING_CORRIDORFUNNEL: { + parameters.path_postprocessing = NavigationUtilities::PathPostProcessing::PATH_POSTPROCESSING_CORRIDORFUNNEL; + } break; + case PATH_POSTPROCESSING_EDGECENTERED: { + parameters.path_postprocessing = NavigationUtilities::PathPostProcessing::PATH_POSTPROCESSING_EDGECENTERED; + } break; + default: { + WARN_PRINT_ONCE("No match for used PathPostProcessing - fallback to default"); + parameters.path_postprocessing = NavigationUtilities::PathPostProcessing::PATH_POSTPROCESSING_CORRIDORFUNNEL; + } break; + } +} + +NavigationPathQueryParameters2D::PathPostProcessing NavigationPathQueryParameters2D::get_path_postprocessing() const { + switch (parameters.path_postprocessing) { + case NavigationUtilities::PathPostProcessing::PATH_POSTPROCESSING_CORRIDORFUNNEL: + return PATH_POSTPROCESSING_CORRIDORFUNNEL; + case NavigationUtilities::PathPostProcessing::PATH_POSTPROCESSING_EDGECENTERED: + return PATH_POSTPROCESSING_EDGECENTERED; + default: + WARN_PRINT_ONCE("No match for used PathPostProcessing - fallback to default"); + return PATH_POSTPROCESSING_CORRIDORFUNNEL; + } +} + +void NavigationPathQueryParameters2D::set_map(const RID &p_map) { + parameters.map = p_map; +} + +const RID &NavigationPathQueryParameters2D::get_map() const { + return parameters.map; +} + +void NavigationPathQueryParameters2D::set_start_position(const Vector2 p_start_position) { + parameters.start_position = Vector3(p_start_position.x, 0.0, p_start_position.y); +} + +Vector2 NavigationPathQueryParameters2D::get_start_position() const { + return Vector2(parameters.start_position.x, parameters.start_position.z); +} + +void NavigationPathQueryParameters2D::set_target_position(const Vector2 p_target_position) { + parameters.target_position = Vector3(p_target_position.x, 0.0, p_target_position.y); +} + +Vector2 NavigationPathQueryParameters2D::get_target_position() const { + return Vector2(parameters.target_position.x, parameters.target_position.z); +} + +void NavigationPathQueryParameters2D::set_navigation_layers(uint32_t p_navigation_layers) { + parameters.navigation_layers = p_navigation_layers; +}; + +uint32_t NavigationPathQueryParameters2D::get_navigation_layers() const { + return parameters.navigation_layers; +}; + +void NavigationPathQueryParameters2D::_bind_methods() { + ClassDB::bind_method(D_METHOD("set_pathfinding_algorithm", "pathfinding_algorithm"), &NavigationPathQueryParameters2D::set_pathfinding_algorithm); + ClassDB::bind_method(D_METHOD("get_pathfinding_algorithm"), &NavigationPathQueryParameters2D::get_pathfinding_algorithm); + + ClassDB::bind_method(D_METHOD("set_path_postprocessing", "path_postprocessing"), &NavigationPathQueryParameters2D::set_path_postprocessing); + ClassDB::bind_method(D_METHOD("get_path_postprocessing"), &NavigationPathQueryParameters2D::get_path_postprocessing); + + ClassDB::bind_method(D_METHOD("set_map", "map"), &NavigationPathQueryParameters2D::set_map); + ClassDB::bind_method(D_METHOD("get_map"), &NavigationPathQueryParameters2D::get_map); + + ClassDB::bind_method(D_METHOD("set_start_position", "start_position"), &NavigationPathQueryParameters2D::set_start_position); + ClassDB::bind_method(D_METHOD("get_start_position"), &NavigationPathQueryParameters2D::get_start_position); + + ClassDB::bind_method(D_METHOD("set_target_position", "target_position"), &NavigationPathQueryParameters2D::set_target_position); + ClassDB::bind_method(D_METHOD("get_target_position"), &NavigationPathQueryParameters2D::get_target_position); + + ClassDB::bind_method(D_METHOD("set_navigation_layers", "navigation_layers"), &NavigationPathQueryParameters2D::set_navigation_layers); + ClassDB::bind_method(D_METHOD("get_navigation_layers"), &NavigationPathQueryParameters2D::get_navigation_layers); + + ADD_PROPERTY(PropertyInfo(Variant::RID, "map"), "set_map", "get_map"); + ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "start_position"), "set_start_position", "get_start_position"); + ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "target_position"), "set_target_position", "get_target_position"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "navigation_layers", PROPERTY_HINT_LAYERS_2D_NAVIGATION), "set_navigation_layers", "get_navigation_layers"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "pathfinding_algorithm", PROPERTY_HINT_ENUM, "AStar"), "set_pathfinding_algorithm", "get_pathfinding_algorithm"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "path_postprocessing", PROPERTY_HINT_ENUM, "Corridorfunnel,Edgecentered"), "set_path_postprocessing", "get_path_postprocessing"); + + BIND_ENUM_CONSTANT(PATHFINDING_ALGORITHM_ASTAR); + + BIND_ENUM_CONSTANT(PATH_POSTPROCESSING_CORRIDORFUNNEL); + BIND_ENUM_CONSTANT(PATH_POSTPROCESSING_EDGECENTERED); +} diff --git a/servers/navigation/navigation_path_query_parameters_2d.h b/servers/navigation/navigation_path_query_parameters_2d.h new file mode 100644 index 0000000000..c0ef337a27 --- /dev/null +++ b/servers/navigation/navigation_path_query_parameters_2d.h @@ -0,0 +1,79 @@ +/*************************************************************************/ +/* navigation_path_query_parameters_2d.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* 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 NAVIGATION_PATH_QUERY_PARAMETERS_2D_H +#define NAVIGATION_PATH_QUERY_PARAMETERS_2D_H + +#include "core/object/ref_counted.h" +#include "servers/navigation/navigation_utilities.h" + +class NavigationPathQueryParameters2D : public RefCounted { + GDCLASS(NavigationPathQueryParameters2D, RefCounted); + + NavigationUtilities::PathQueryParameters parameters; + +protected: + static void _bind_methods(); + +public: + enum PathfindingAlgorithm { + PATHFINDING_ALGORITHM_ASTAR = 0, + }; + + enum PathPostProcessing { + PATH_POSTPROCESSING_CORRIDORFUNNEL = 0, + PATH_POSTPROCESSING_EDGECENTERED, + }; + + const NavigationUtilities::PathQueryParameters &get_parameters() const { return parameters; } + + void set_pathfinding_algorithm(const PathfindingAlgorithm p_pathfinding_algorithm); + PathfindingAlgorithm get_pathfinding_algorithm() const; + + void set_path_postprocessing(const PathPostProcessing p_path_postprocessing); + PathPostProcessing get_path_postprocessing() const; + + void set_map(const RID &p_map); + const RID &get_map() const; + + void set_start_position(const Vector2 p_start_position); + Vector2 get_start_position() const; + + void set_target_position(const Vector2 p_target_position); + Vector2 get_target_position() const; + + void set_navigation_layers(uint32_t p_navigation_layers); + uint32_t get_navigation_layers() const; +}; + +VARIANT_ENUM_CAST(NavigationPathQueryParameters2D::PathfindingAlgorithm); +VARIANT_ENUM_CAST(NavigationPathQueryParameters2D::PathPostProcessing); + +#endif // NAVIGATION_PATH_QUERY_PARAMETERS_2D_H diff --git a/servers/navigation/navigation_path_query_parameters_3d.cpp b/servers/navigation/navigation_path_query_parameters_3d.cpp new file mode 100644 index 0000000000..b09448e82e --- /dev/null +++ b/servers/navigation/navigation_path_query_parameters_3d.cpp @@ -0,0 +1,144 @@ +/*************************************************************************/ +/* navigation_path_query_parameters_3d.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* 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 "navigation_path_query_parameters_3d.h" + +void NavigationPathQueryParameters3D::set_pathfinding_algorithm(const NavigationPathQueryParameters3D::PathfindingAlgorithm p_pathfinding_algorithm) { + switch (p_pathfinding_algorithm) { + case PATHFINDING_ALGORITHM_ASTAR: { + parameters.pathfinding_algorithm = NavigationUtilities::PathfindingAlgorithm::PATHFINDING_ALGORITHM_ASTAR; + } break; + default: { + WARN_PRINT_ONCE("No match for used PathfindingAlgorithm - fallback to default"); + parameters.pathfinding_algorithm = NavigationUtilities::PathfindingAlgorithm::PATHFINDING_ALGORITHM_ASTAR; + } break; + } +} + +NavigationPathQueryParameters3D::PathfindingAlgorithm NavigationPathQueryParameters3D::get_pathfinding_algorithm() const { + switch (parameters.pathfinding_algorithm) { + case NavigationUtilities::PathfindingAlgorithm::PATHFINDING_ALGORITHM_ASTAR: + return PATHFINDING_ALGORITHM_ASTAR; + default: + WARN_PRINT_ONCE("No match for used PathfindingAlgorithm - fallback to default"); + return PATHFINDING_ALGORITHM_ASTAR; + } +} + +void NavigationPathQueryParameters3D::set_path_postprocessing(const NavigationPathQueryParameters3D::PathPostProcessing p_path_postprocessing) { + switch (p_path_postprocessing) { + case PATH_POSTPROCESSING_CORRIDORFUNNEL: { + parameters.path_postprocessing = NavigationUtilities::PathPostProcessing::PATH_POSTPROCESSING_CORRIDORFUNNEL; + } break; + case PATH_POSTPROCESSING_EDGECENTERED: { + parameters.path_postprocessing = NavigationUtilities::PathPostProcessing::PATH_POSTPROCESSING_EDGECENTERED; + } break; + default: { + WARN_PRINT_ONCE("No match for used PathPostProcessing - fallback to default"); + parameters.path_postprocessing = NavigationUtilities::PathPostProcessing::PATH_POSTPROCESSING_CORRIDORFUNNEL; + } break; + } +} + +NavigationPathQueryParameters3D::PathPostProcessing NavigationPathQueryParameters3D::get_path_postprocessing() const { + switch (parameters.path_postprocessing) { + case NavigationUtilities::PathPostProcessing::PATH_POSTPROCESSING_CORRIDORFUNNEL: + return PATH_POSTPROCESSING_CORRIDORFUNNEL; + case NavigationUtilities::PathPostProcessing::PATH_POSTPROCESSING_EDGECENTERED: + return PATH_POSTPROCESSING_EDGECENTERED; + default: + WARN_PRINT_ONCE("No match for used PathPostProcessing - fallback to default"); + return PATH_POSTPROCESSING_CORRIDORFUNNEL; + } +} + +void NavigationPathQueryParameters3D::set_map(const RID &p_map) { + parameters.map = p_map; +} + +const RID &NavigationPathQueryParameters3D::get_map() const { + return parameters.map; +} + +void NavigationPathQueryParameters3D::set_start_position(const Vector3 &p_start_position) { + parameters.start_position = p_start_position; +} + +const Vector3 &NavigationPathQueryParameters3D::get_start_position() const { + return parameters.start_position; +} + +void NavigationPathQueryParameters3D::set_target_position(const Vector3 &p_target_position) { + parameters.target_position = p_target_position; +} + +const Vector3 &NavigationPathQueryParameters3D::get_target_position() const { + return parameters.target_position; +} + +void NavigationPathQueryParameters3D::set_navigation_layers(uint32_t p_navigation_layers) { + parameters.navigation_layers = p_navigation_layers; +} + +uint32_t NavigationPathQueryParameters3D::get_navigation_layers() const { + return parameters.navigation_layers; +} + +void NavigationPathQueryParameters3D::_bind_methods() { + ClassDB::bind_method(D_METHOD("set_pathfinding_algorithm", "pathfinding_algorithm"), &NavigationPathQueryParameters3D::set_pathfinding_algorithm); + ClassDB::bind_method(D_METHOD("get_pathfinding_algorithm"), &NavigationPathQueryParameters3D::get_pathfinding_algorithm); + + ClassDB::bind_method(D_METHOD("set_path_postprocessing", "path_postprocessing"), &NavigationPathQueryParameters3D::set_path_postprocessing); + ClassDB::bind_method(D_METHOD("get_path_postprocessing"), &NavigationPathQueryParameters3D::get_path_postprocessing); + + ClassDB::bind_method(D_METHOD("set_map", "map"), &NavigationPathQueryParameters3D::set_map); + ClassDB::bind_method(D_METHOD("get_map"), &NavigationPathQueryParameters3D::get_map); + + ClassDB::bind_method(D_METHOD("set_start_position", "start_position"), &NavigationPathQueryParameters3D::set_start_position); + ClassDB::bind_method(D_METHOD("get_start_position"), &NavigationPathQueryParameters3D::get_start_position); + + ClassDB::bind_method(D_METHOD("set_target_position", "target_position"), &NavigationPathQueryParameters3D::set_target_position); + ClassDB::bind_method(D_METHOD("get_target_position"), &NavigationPathQueryParameters3D::get_target_position); + + ClassDB::bind_method(D_METHOD("set_navigation_layers", "navigation_layers"), &NavigationPathQueryParameters3D::set_navigation_layers); + ClassDB::bind_method(D_METHOD("get_navigation_layers"), &NavigationPathQueryParameters3D::get_navigation_layers); + + ADD_PROPERTY(PropertyInfo(Variant::RID, "map"), "set_map", "get_map"); + ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "start_position"), "set_start_position", "get_start_position"); + ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "target_position"), "set_target_position", "get_target_position"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "navigation_layers", PROPERTY_HINT_LAYERS_3D_NAVIGATION), "set_navigation_layers", "get_navigation_layers"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "pathfinding_algorithm", PROPERTY_HINT_ENUM, "AStar"), "set_pathfinding_algorithm", "get_pathfinding_algorithm"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "path_postprocessing", PROPERTY_HINT_ENUM, "Corridorfunnel,Edgecentered"), "set_path_postprocessing", "get_path_postprocessing"); + + BIND_ENUM_CONSTANT(PATHFINDING_ALGORITHM_ASTAR); + + BIND_ENUM_CONSTANT(PATH_POSTPROCESSING_CORRIDORFUNNEL); + BIND_ENUM_CONSTANT(PATH_POSTPROCESSING_EDGECENTERED); +} diff --git a/servers/navigation/navigation_path_query_parameters_3d.h b/servers/navigation/navigation_path_query_parameters_3d.h new file mode 100644 index 0000000000..b4cf02fc79 --- /dev/null +++ b/servers/navigation/navigation_path_query_parameters_3d.h @@ -0,0 +1,79 @@ +/*************************************************************************/ +/* navigation_path_query_parameters_3d.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* 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 NAVIGATION_PATH_QUERY_PARAMETERS_3D_H +#define NAVIGATION_PATH_QUERY_PARAMETERS_3D_H + +#include "core/object/ref_counted.h" +#include "servers/navigation/navigation_utilities.h" + +class NavigationPathQueryParameters3D : public RefCounted { + GDCLASS(NavigationPathQueryParameters3D, RefCounted); + + NavigationUtilities::PathQueryParameters parameters; + +protected: + static void _bind_methods(); + +public: + enum PathfindingAlgorithm { + PATHFINDING_ALGORITHM_ASTAR = 0, + }; + + enum PathPostProcessing { + PATH_POSTPROCESSING_CORRIDORFUNNEL = 0, + PATH_POSTPROCESSING_EDGECENTERED, + }; + + const NavigationUtilities::PathQueryParameters &get_parameters() const { return parameters; } + + void set_pathfinding_algorithm(const PathfindingAlgorithm p_pathfinding_algorithm); + PathfindingAlgorithm get_pathfinding_algorithm() const; + + void set_path_postprocessing(const PathPostProcessing p_path_postprocessing); + PathPostProcessing get_path_postprocessing() const; + + void set_map(const RID &p_map); + const RID &get_map() const; + + void set_start_position(const Vector3 &p_start_position); + const Vector3 &get_start_position() const; + + void set_target_position(const Vector3 &p_target_position); + const Vector3 &get_target_position() const; + + void set_navigation_layers(uint32_t p_navigation_layers); + uint32_t get_navigation_layers() const; +}; + +VARIANT_ENUM_CAST(NavigationPathQueryParameters3D::PathfindingAlgorithm); +VARIANT_ENUM_CAST(NavigationPathQueryParameters3D::PathPostProcessing); + +#endif // NAVIGATION_PATH_QUERY_PARAMETERS_3D_H diff --git a/servers/navigation/navigation_path_query_result_2d.cpp b/servers/navigation/navigation_path_query_result_2d.cpp new file mode 100644 index 0000000000..8a55451e40 --- /dev/null +++ b/servers/navigation/navigation_path_query_result_2d.cpp @@ -0,0 +1,52 @@ +/*************************************************************************/ +/* navigation_path_query_result_2d.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* 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 "navigation_path_query_result_2d.h" + +void NavigationPathQueryResult2D::set_path(const Vector<Vector2> &p_path) { + path = p_path; +} + +const Vector<Vector2> &NavigationPathQueryResult2D::get_path() const { + return path; +} + +void NavigationPathQueryResult2D::reset() { + path.clear(); +} + +void NavigationPathQueryResult2D::_bind_methods() { + ClassDB::bind_method(D_METHOD("set_path", "path"), &NavigationPathQueryResult2D::set_path); + ClassDB::bind_method(D_METHOD("get_path"), &NavigationPathQueryResult2D::get_path); + + ClassDB::bind_method(D_METHOD("reset"), &NavigationPathQueryResult2D::reset); + + ADD_PROPERTY(PropertyInfo(Variant::PACKED_VECTOR2_ARRAY, "path"), "set_path", "get_path"); +} diff --git a/servers/navigation/navigation_path_query_result_2d.h b/servers/navigation/navigation_path_query_result_2d.h new file mode 100644 index 0000000000..da251ef32d --- /dev/null +++ b/servers/navigation/navigation_path_query_result_2d.h @@ -0,0 +1,52 @@ +/*************************************************************************/ +/* navigation_path_query_result_2d.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* 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 NAVIGATION_PATH_QUERY_RESULT_2D_H +#define NAVIGATION_PATH_QUERY_RESULT_2D_H + +#include "core/object/ref_counted.h" +#include "servers/navigation/navigation_utilities.h" + +class NavigationPathQueryResult2D : public RefCounted { + GDCLASS(NavigationPathQueryResult2D, RefCounted); + + Vector<Vector2> path; + +protected: + static void _bind_methods(); + +public: + void set_path(const Vector<Vector2> &p_path); + const Vector<Vector2> &get_path() const; + + void reset(); +}; + +#endif // NAVIGATION_PATH_QUERY_RESULT_2D_H diff --git a/servers/navigation/navigation_path_query_result_3d.cpp b/servers/navigation/navigation_path_query_result_3d.cpp new file mode 100644 index 0000000000..1e28352995 --- /dev/null +++ b/servers/navigation/navigation_path_query_result_3d.cpp @@ -0,0 +1,52 @@ +/*************************************************************************/ +/* navigation_path_query_result_3d.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* 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 "navigation_path_query_result_3d.h" + +void NavigationPathQueryResult3D::set_path(const Vector<Vector3> &p_path) { + path = p_path; +} + +const Vector<Vector3> &NavigationPathQueryResult3D::get_path() const { + return path; +} + +void NavigationPathQueryResult3D::reset() { + path.clear(); +} + +void NavigationPathQueryResult3D::_bind_methods() { + ClassDB::bind_method(D_METHOD("set_path", "path"), &NavigationPathQueryResult3D::set_path); + ClassDB::bind_method(D_METHOD("get_path"), &NavigationPathQueryResult3D::get_path); + + ClassDB::bind_method(D_METHOD("reset"), &NavigationPathQueryResult3D::reset); + + ADD_PROPERTY(PropertyInfo(Variant::PACKED_VECTOR3_ARRAY, "path"), "set_path", "get_path"); +} diff --git a/servers/navigation/navigation_path_query_result_3d.h b/servers/navigation/navigation_path_query_result_3d.h new file mode 100644 index 0000000000..fc143ac389 --- /dev/null +++ b/servers/navigation/navigation_path_query_result_3d.h @@ -0,0 +1,52 @@ +/*************************************************************************/ +/* navigation_path_query_result_3d.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* 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 NAVIGATION_PATH_QUERY_RESULT_3D_H +#define NAVIGATION_PATH_QUERY_RESULT_3D_H + +#include "core/object/ref_counted.h" +#include "servers/navigation/navigation_utilities.h" + +class NavigationPathQueryResult3D : public RefCounted { + GDCLASS(NavigationPathQueryResult3D, RefCounted); + + Vector<Vector3> path; + +protected: + static void _bind_methods(); + +public: + void set_path(const Vector<Vector3> &p_path); + const Vector<Vector3> &get_path() const; + + void reset(); +}; + +#endif // NAVIGATION_PATH_QUERY_RESULT_3D_H diff --git a/servers/navigation/navigation_utilities.h b/servers/navigation/navigation_utilities.h new file mode 100644 index 0000000000..bedcc16a67 --- /dev/null +++ b/servers/navigation/navigation_utilities.h @@ -0,0 +1,62 @@ +/*************************************************************************/ +/* navigation_utilities.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* 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 NAVIGATION_UTILITIES_H +#define NAVIGATION_UTILITIES_H + +#include "core/math/vector3.h" + +namespace NavigationUtilities { + +enum PathfindingAlgorithm { + PATHFINDING_ALGORITHM_ASTAR = 0, +}; + +enum PathPostProcessing { + PATH_POSTPROCESSING_CORRIDORFUNNEL = 0, + PATH_POSTPROCESSING_EDGECENTERED, +}; + +struct PathQueryParameters { + PathfindingAlgorithm pathfinding_algorithm = PATHFINDING_ALGORITHM_ASTAR; + PathPostProcessing path_postprocessing = PATH_POSTPROCESSING_CORRIDORFUNNEL; + RID map; + Vector3 start_position = Vector3(); + Vector3 target_position = Vector3(); + uint32_t navigation_layers = 1; +}; + +struct PathQueryResult { + Vector<Vector3> path; +}; + +} //namespace NavigationUtilities + +#endif // NAVIGATION_UTILITIES_H diff --git a/servers/navigation_server_2d.cpp b/servers/navigation_server_2d.cpp index cec8b95225..04e5d2f6a1 100644 --- a/servers/navigation_server_2d.cpp +++ b/servers/navigation_server_2d.cpp @@ -243,6 +243,8 @@ void NavigationServer2D::_bind_methods() { ClassDB::bind_method(D_METHOD("map_force_update", "map"), &NavigationServer2D::map_force_update); + ClassDB::bind_method(D_METHOD("query_path", "parameters", "result"), &NavigationServer2D::query_path); + ClassDB::bind_method(D_METHOD("region_create"), &NavigationServer2D::region_create); ClassDB::bind_method(D_METHOD("region_set_enter_cost", "region", "enter_cost"), &NavigationServer2D::region_set_enter_cost); ClassDB::bind_method(D_METHOD("region_get_enter_cost", "region"), &NavigationServer2D::region_get_enter_cost); @@ -409,3 +411,12 @@ bool FORWARD_1_C(agent_is_map_changed, RID, p_agent, rid_to_rid); void FORWARD_4_C(agent_set_callback, RID, p_agent, Object *, p_receiver, StringName, p_method, Variant, p_udata, rid_to_rid, obj_to_obj, sn_to_sn, var_to_var); void FORWARD_1_C(free, RID, p_object, rid_to_rid); + +void NavigationServer2D::query_path(const Ref<NavigationPathQueryParameters2D> &p_query_parameters, Ref<NavigationPathQueryResult2D> p_query_result) const { + ERR_FAIL_COND(!p_query_parameters.is_valid()); + ERR_FAIL_COND(!p_query_result.is_valid()); + + const NavigationUtilities::PathQueryResult _query_result = NavigationServer3D::get_singleton()->_query_path(p_query_parameters->get_parameters()); + + p_query_result->set_path(vector_v3_to_v2(_query_result.path)); +} diff --git a/servers/navigation_server_2d.h b/servers/navigation_server_2d.h index b2ea4c28a0..54cfc6b14e 100644 --- a/servers/navigation_server_2d.h +++ b/servers/navigation_server_2d.h @@ -33,7 +33,10 @@ #include "core/object/class_db.h" #include "core/templates/rid.h" + #include "scene/2d/navigation_region_2d.h" +#include "servers/navigation/navigation_path_query_parameters_2d.h" +#include "servers/navigation/navigation_path_query_result_2d.h" // This server exposes the `NavigationServer3D` features in the 2D world. class NavigationServer2D : public Object { @@ -217,6 +220,8 @@ public: /// Callback called at the end of the RVO process virtual void agent_set_callback(RID p_agent, Object *p_receiver, StringName p_method, Variant p_udata = Variant()) const; + virtual void query_path(const Ref<NavigationPathQueryParameters2D> &p_query_parameters, Ref<NavigationPathQueryResult2D> p_query_result) const; + /// Destroy the `RID` virtual void free(RID p_object) const; diff --git a/servers/navigation_server_3d.cpp b/servers/navigation_server_3d.cpp index bc0602e1df..783d32641e 100644 --- a/servers/navigation_server_3d.cpp +++ b/servers/navigation_server_3d.cpp @@ -62,6 +62,8 @@ void NavigationServer3D::_bind_methods() { ClassDB::bind_method(D_METHOD("map_force_update", "map"), &NavigationServer3D::map_force_update); + ClassDB::bind_method(D_METHOD("query_path", "parameters", "result"), &NavigationServer3D::query_path); + ClassDB::bind_method(D_METHOD("region_create"), &NavigationServer3D::region_create); ClassDB::bind_method(D_METHOD("region_set_enter_cost", "region", "enter_cost"), &NavigationServer3D::region_set_enter_cost); ClassDB::bind_method(D_METHOD("region_get_enter_cost", "region"), &NavigationServer3D::region_get_enter_cost); @@ -485,3 +487,14 @@ bool NavigationServer3D::get_debug_enabled() const { return debug_enabled; } #endif // DEBUG_ENABLED + +/////////////////////////////////////////////////////// + +void NavigationServer3D::query_path(const Ref<NavigationPathQueryParameters3D> &p_query_parameters, Ref<NavigationPathQueryResult3D> p_query_result) const { + ERR_FAIL_COND(!p_query_parameters.is_valid()); + ERR_FAIL_COND(!p_query_result.is_valid()); + + const NavigationUtilities::PathQueryResult _query_result = _query_path(p_query_parameters->get_parameters()); + + p_query_result->set_path(_query_result.path); +} diff --git a/servers/navigation_server_3d.h b/servers/navigation_server_3d.h index 02770794c6..0f537383a2 100644 --- a/servers/navigation_server_3d.h +++ b/servers/navigation_server_3d.h @@ -33,7 +33,10 @@ #include "core/object/class_db.h" #include "core/templates/rid.h" + #include "scene/3d/navigation_region_3d.h" +#include "servers/navigation/navigation_path_query_parameters_3d.h" +#include "servers/navigation/navigation_path_query_result_3d.h" /// This server uses the concept of internal mutability. /// All the constant functions can be called in multithread because internally @@ -41,6 +44,7 @@ /// /// Note: All the `set` functions are commands executed during the `sync` phase, /// don't expect that a change is immediately propagated. + class NavigationServer3D : public Object { GDCLASS(NavigationServer3D, Object); @@ -243,6 +247,11 @@ public: /// Note: This function is not thread safe. virtual void process(real_t delta_time) = 0; + /// Returns a customized navigation path using a query parameters object + void query_path(const Ref<NavigationPathQueryParameters3D> &p_query_parameters, Ref<NavigationPathQueryResult3D> p_query_result) const; + + virtual NavigationUtilities::PathQueryResult _query_path(const NavigationUtilities::PathQueryParameters &p_parameters) const = 0; + NavigationServer3D(); virtual ~NavigationServer3D(); diff --git a/servers/physics_2d/godot_body_2d.cpp b/servers/physics_2d/godot_body_2d.cpp index ef6a6b1ae2..90124cd991 100644 --- a/servers/physics_2d/godot_body_2d.cpp +++ b/servers/physics_2d/godot_body_2d.cpp @@ -615,7 +615,7 @@ void GodotBody2D::integrate_velocities(real_t p_step) { return; } - if (fi_callback_data || body_state_callback) { + if (fi_callback_data || body_state_callback.get_object()) { get_space()->body_add_to_state_query_list(&direct_state_query_list); } @@ -673,11 +673,12 @@ void GodotBody2D::wakeup_neighbours() { } void GodotBody2D::call_queries() { + Variant direct_state_variant = get_direct_state(); + if (fi_callback_data) { if (!fi_callback_data->callable.get_object()) { set_force_integration_callback(Callable()); } else { - Variant direct_state_variant = get_direct_state(); const Variant *vp[2] = { &direct_state_variant, &fi_callback_data->udata }; Callable::CallError ce; @@ -691,8 +692,11 @@ void GodotBody2D::call_queries() { } } - if (body_state_callback) { - (body_state_callback)(body_state_callback_instance, get_direct_state()); + if (body_state_callback.get_object()) { + const Variant *vp[1] = { &direct_state_variant }; + Callable::CallError ce; + Variant rv; + body_state_callback.callp(vp, 1, rv, ce); } } @@ -713,9 +717,8 @@ bool GodotBody2D::sleep_test(real_t p_step) { } } -void GodotBody2D::set_state_sync_callback(void *p_instance, PhysicsServer2D::BodyStateCallback p_callback) { - body_state_callback_instance = p_instance; - body_state_callback = p_callback; +void GodotBody2D::set_state_sync_callback(const Callable &p_callable) { + body_state_callback = p_callable; } void GodotBody2D::set_force_integration_callback(const Callable &p_callable, const Variant &p_udata) { diff --git a/servers/physics_2d/godot_body_2d.h b/servers/physics_2d/godot_body_2d.h index 409940d4f8..86d42ae7f8 100644 --- a/servers/physics_2d/godot_body_2d.h +++ b/servers/physics_2d/godot_body_2d.h @@ -137,8 +137,7 @@ class GodotBody2D : public GodotCollisionObject2D { Vector<Contact> contacts; //no contacts by default int contact_count = 0; - void *body_state_callback_instance = nullptr; - PhysicsServer2D::BodyStateCallback body_state_callback = nullptr; + Callable body_state_callback; struct ForceIntegrationCallbackData { Callable callable; @@ -156,7 +155,7 @@ class GodotBody2D : public GodotCollisionObject2D { friend class GodotPhysicsDirectBodyState2D; // i give up, too many functions to expose public: - void set_state_sync_callback(void *p_instance, PhysicsServer2D::BodyStateCallback p_callback); + void set_state_sync_callback(const Callable &p_callable); void set_force_integration_callback(const Callable &p_callable, const Variant &p_udata = Variant()); GodotPhysicsDirectBodyState2D *get_direct_state(); diff --git a/servers/physics_2d/godot_collision_solver_2d.cpp b/servers/physics_2d/godot_collision_solver_2d.cpp index 0d7b42b80d..52237539c0 100644 --- a/servers/physics_2d/godot_collision_solver_2d.cpp +++ b/servers/physics_2d/godot_collision_solver_2d.cpp @@ -34,7 +34,7 @@ #define collision_solver sat_2d_calculate_penetration //#define collision_solver gjk_epa_calculate_penetration -bool GodotCollisionSolver2D::solve_static_world_boundary(const GodotShape2D *p_shape_A, const Transform2D &p_transform_A, const GodotShape2D *p_shape_B, const Transform2D &p_transform_B, CallbackResult p_result_callback, void *p_userdata, bool p_swap_result) { +bool GodotCollisionSolver2D::solve_static_world_boundary(const GodotShape2D *p_shape_A, const Transform2D &p_transform_A, const GodotShape2D *p_shape_B, const Transform2D &p_transform_B, const Vector2 &p_motion_B, CallbackResult p_result_callback, void *p_userdata, bool p_swap_result, real_t p_margin) { const GodotWorldBoundaryShape2D *world_boundary = static_cast<const GodotWorldBoundaryShape2D *>(p_shape_A); if (p_shape_B->get_type() == PhysicsServer2D::SHAPE_WORLD_BOUNDARY) { return false; @@ -52,7 +52,9 @@ bool GodotCollisionSolver2D::solve_static_world_boundary(const GodotShape2D *p_s bool found = false; for (int i = 0; i < support_count; i++) { + supports[i] += p_margin * supports[i].normalized(); supports[i] = p_transform_B.xform(supports[i]); + supports[i] += p_motion_B; real_t pd = n.dot(supports[i]); if (pd >= d) { continue; @@ -227,17 +229,19 @@ bool GodotCollisionSolver2D::solve(const GodotShape2D *p_shape_A, const Transfor if (type_A == PhysicsServer2D::SHAPE_WORLD_BOUNDARY) { if (type_B == PhysicsServer2D::SHAPE_WORLD_BOUNDARY) { + WARN_PRINT_ONCE("Collisions between world boundaries are not supported."); return false; } if (swap) { - return solve_static_world_boundary(p_shape_B, p_transform_B, p_shape_A, p_transform_A, p_result_callback, p_userdata, true); + return solve_static_world_boundary(p_shape_B, p_transform_B, p_shape_A, p_transform_A, p_motion_A, p_result_callback, p_userdata, true, p_margin_A); } else { - return solve_static_world_boundary(p_shape_A, p_transform_A, p_shape_B, p_transform_B, p_result_callback, p_userdata, false); + return solve_static_world_boundary(p_shape_A, p_transform_A, p_shape_B, p_transform_B, p_motion_B, p_result_callback, p_userdata, false, p_margin_B); } } else if (type_A == PhysicsServer2D::SHAPE_SEPARATION_RAY) { if (type_B == PhysicsServer2D::SHAPE_SEPARATION_RAY) { + WARN_PRINT_ONCE("Collisions between two rays are not supported."); return false; //no ray-ray } @@ -249,6 +253,7 @@ bool GodotCollisionSolver2D::solve(const GodotShape2D *p_shape_A, const Transfor } else if (concave_B) { if (concave_A) { + WARN_PRINT_ONCE("Collisions between two concave shapes are not supported."); return false; } diff --git a/servers/physics_2d/godot_collision_solver_2d.h b/servers/physics_2d/godot_collision_solver_2d.h index bd90641f04..3aac2751e0 100644 --- a/servers/physics_2d/godot_collision_solver_2d.h +++ b/servers/physics_2d/godot_collision_solver_2d.h @@ -38,7 +38,7 @@ public: typedef void (*CallbackResult)(const Vector2 &p_point_A, const Vector2 &p_point_B, void *p_userdata); private: - static bool solve_static_world_boundary(const GodotShape2D *p_shape_A, const Transform2D &p_transform_A, const GodotShape2D *p_shape_B, const Transform2D &p_transform_B, CallbackResult p_result_callback, void *p_userdata, bool p_swap_result); + static bool solve_static_world_boundary(const GodotShape2D *p_shape_A, const Transform2D &p_transform_A, const GodotShape2D *p_shape_B, const Transform2D &p_transform_B, const Vector2 &p_motion_B, CallbackResult p_result_callback, void *p_userdata, bool p_swap_result, real_t p_margin = 0); static bool concave_callback(void *p_userdata, GodotShape2D *p_convex); static bool solve_concave(const GodotShape2D *p_shape_A, const Transform2D &p_transform_A, const Vector2 &p_motion_A, const GodotShape2D *p_shape_B, const Transform2D &p_transform_B, const Vector2 &p_motion_B, CallbackResult p_result_callback, void *p_userdata, bool p_swap_result, Vector2 *r_sep_axis = nullptr, real_t p_margin_A = 0, real_t p_margin_B = 0); static bool solve_separation_ray(const GodotShape2D *p_shape_A, const Vector2 &p_motion_A, const Transform2D &p_transform_A, const GodotShape2D *p_shape_B, const Transform2D &p_transform_B, CallbackResult p_result_callback, void *p_userdata, bool p_swap_result, Vector2 *r_sep_axis = nullptr, real_t p_margin = 0); diff --git a/servers/physics_2d/godot_collision_solver_2d_sat.cpp b/servers/physics_2d/godot_collision_solver_2d_sat.cpp index 77186d3810..8aa30ad6a4 100644 --- a/servers/physics_2d/godot_collision_solver_2d_sat.cpp +++ b/servers/physics_2d/godot_collision_solver_2d_sat.cpp @@ -498,7 +498,7 @@ static void _collision_segment_rectangle(const GodotShape2D *p_a, const Transfor return; } - if (castA) { + if constexpr (castA) { if (!separator.test_axis(rectangle_B->get_circle_axis(p_transform_b, inv, a + p_motion_a))) { return; } @@ -507,7 +507,7 @@ static void _collision_segment_rectangle(const GodotShape2D *p_a, const Transfor } } - if (castB) { + if constexpr (castB) { if (!separator.test_axis(rectangle_B->get_circle_axis(p_transform_b, inv, a - p_motion_b))) { return; } @@ -516,7 +516,7 @@ static void _collision_segment_rectangle(const GodotShape2D *p_a, const Transfor } } - if (castA && castB) { + if constexpr (castA && castB) { if (!separator.test_axis(rectangle_B->get_circle_axis(p_transform_b, inv, a - p_motion_b + p_motion_a))) { return; } @@ -665,21 +665,21 @@ static void _collision_circle_rectangle(const GodotShape2D *p_a, const Transform } } - if (castA) { + if constexpr (castA) { Vector2 sphereofs = sphere + p_motion_a; if (!separator.test_axis(rectangle_B->get_circle_axis(p_transform_b, binv, sphereofs))) { return; } } - if (castB) { + if constexpr (castB) { Vector2 sphereofs = sphere - p_motion_b; if (!separator.test_axis(rectangle_B->get_circle_axis(p_transform_b, binv, sphereofs))) { return; } } - if (castA && castB) { + if constexpr (castA && castB) { Vector2 sphereofs = sphere - p_motion_b + p_motion_a; if (!separator.test_axis(rectangle_B->get_circle_axis(p_transform_b, binv, sphereofs))) { return; @@ -786,7 +786,7 @@ static void _collision_rectangle_rectangle(const GodotShape2D *p_a, const Transf return; } - if (withMargin) { + if constexpr (withMargin) { Transform2D invA = p_transform_a.affine_inverse(); Transform2D invB = p_transform_b.affine_inverse(); @@ -794,29 +794,29 @@ static void _collision_rectangle_rectangle(const GodotShape2D *p_a, const Transf return; } - if (castA || castB) { + if constexpr (castA || castB) { Transform2D aofs = p_transform_a; aofs.columns[2] += p_motion_a; Transform2D bofs = p_transform_b; bofs.columns[2] += p_motion_b; - Transform2D aofsinv = aofs.affine_inverse(); - Transform2D bofsinv = bofs.affine_inverse(); + [[maybe_unused]] Transform2D aofsinv = aofs.affine_inverse(); + [[maybe_unused]] Transform2D bofsinv = bofs.affine_inverse(); - if (castA) { + if constexpr (castA) { if (!separator.test_axis(rectangle_A->get_box_axis(aofs, aofsinv, rectangle_B, p_transform_b, invB))) { return; } } - if (castB) { + if constexpr (castB) { if (!separator.test_axis(rectangle_A->get_box_axis(p_transform_a, invA, rectangle_B, bofs, bofsinv))) { return; } } - if (castA && castB) { + if constexpr (castA && castB) { if (!separator.test_axis(rectangle_A->get_box_axis(aofs, aofsinv, rectangle_B, bofs, bofsinv))) { return; } @@ -871,7 +871,7 @@ static void _collision_rectangle_capsule(const GodotShape2D *p_a, const Transfor } } - if (castA) { + if constexpr (castA) { Vector2 capsule_endpoint = p_transform_b.get_origin() + p_transform_b.columns[1] * capsule_dir; capsule_endpoint -= p_motion_a; @@ -880,7 +880,7 @@ static void _collision_rectangle_capsule(const GodotShape2D *p_a, const Transfor } } - if (castB) { + if constexpr (castB) { Vector2 capsule_endpoint = p_transform_b.get_origin() + p_transform_b.columns[1] * capsule_dir; capsule_endpoint += p_motion_b; @@ -889,7 +889,7 @@ static void _collision_rectangle_capsule(const GodotShape2D *p_a, const Transfor } } - if (castA && castB) { + if constexpr (castA && castB) { Vector2 capsule_endpoint = p_transform_b.get_origin() + p_transform_b.columns[1] * capsule_dir; capsule_endpoint -= p_motion_a; capsule_endpoint += p_motion_b; @@ -931,7 +931,7 @@ static void _collision_rectangle_convex_polygon(const GodotShape2D *p_a, const T //convex faces Transform2D boxinv; - if (withMargin) { + if constexpr (withMargin) { boxinv = p_transform_a.affine_inverse(); } for (int i = 0; i < convex_B->get_point_count(); i++) { @@ -939,22 +939,22 @@ static void _collision_rectangle_convex_polygon(const GodotShape2D *p_a, const T return; } - if (withMargin) { + if constexpr (withMargin) { //all points vs all points need to be tested if margin exist if (!separator.test_axis(rectangle_A->get_circle_axis(p_transform_a, boxinv, p_transform_b.xform(convex_B->get_point(i))))) { return; } - if (castA) { + if constexpr (castA) { if (!separator.test_axis(rectangle_A->get_circle_axis(p_transform_a, boxinv, p_transform_b.xform(convex_B->get_point(i)) - p_motion_a))) { return; } } - if (castB) { + if constexpr (castB) { if (!separator.test_axis(rectangle_A->get_circle_axis(p_transform_a, boxinv, p_transform_b.xform(convex_B->get_point(i)) + p_motion_b))) { return; } } - if (castA && castB) { + if constexpr (castA && castB) { if (!separator.test_axis(rectangle_A->get_circle_axis(p_transform_a, boxinv, p_transform_b.xform(convex_B->get_point(i)) + p_motion_b - p_motion_a))) { return; } diff --git a/servers/physics_2d/godot_physics_server_2d.cpp b/servers/physics_2d/godot_physics_server_2d.cpp index cec31bdc31..f1551df2e3 100644 --- a/servers/physics_2d/godot_physics_server_2d.cpp +++ b/servers/physics_2d/godot_physics_server_2d.cpp @@ -485,6 +485,20 @@ void GodotPhysicsServer2D::area_set_monitorable(RID p_area, bool p_monitorable) area->set_monitorable(p_monitorable); } +void GodotPhysicsServer2D::area_set_collision_layer(RID p_area, uint32_t p_layer) { + GodotArea2D *area = area_owner.get_or_null(p_area); + ERR_FAIL_COND(!area); + + area->set_collision_layer(p_layer); +} + +uint32_t GodotPhysicsServer2D::area_get_collision_layer(RID p_area) const { + GodotArea2D *area = area_owner.get_or_null(p_area); + ERR_FAIL_COND_V(!area, 0); + + return area->get_collision_layer(); +} + void GodotPhysicsServer2D::area_set_collision_mask(RID p_area, uint32_t p_mask) { GodotArea2D *area = area_owner.get_or_null(p_area); ERR_FAIL_COND(!area); @@ -492,11 +506,11 @@ void GodotPhysicsServer2D::area_set_collision_mask(RID p_area, uint32_t p_mask) area->set_collision_mask(p_mask); } -void GodotPhysicsServer2D::area_set_collision_layer(RID p_area, uint32_t p_layer) { +uint32_t GodotPhysicsServer2D::area_get_collision_mask(RID p_area) const { GodotArea2D *area = area_owner.get_or_null(p_area); - ERR_FAIL_COND(!area); + ERR_FAIL_COND_V(!area, 0); - area->set_collision_layer(p_layer); + return area->get_collision_mask(); } void GodotPhysicsServer2D::area_set_monitor_callback(RID p_area, const Callable &p_callback) { @@ -951,10 +965,10 @@ int GodotPhysicsServer2D::body_get_max_contacts_reported(RID p_body) const { return body->get_max_contacts_reported(); } -void GodotPhysicsServer2D::body_set_state_sync_callback(RID p_body, void *p_instance, BodyStateCallback p_callback) { +void GodotPhysicsServer2D::body_set_state_sync_callback(RID p_body, const Callable &p_callable) { GodotBody2D *body = body_owner.get_or_null(p_body); ERR_FAIL_COND(!body); - body->set_state_sync_callback(p_instance, p_callback); + body->set_state_sync_callback(p_callable); } void GodotPhysicsServer2D::body_set_force_integration_callback(RID p_body, const Callable &p_callable, const Variant &p_udata) { @@ -1018,6 +1032,7 @@ RID GodotPhysicsServer2D::joint_create() { void GodotPhysicsServer2D::joint_clear(RID p_joint) { GodotJoint2D *joint = joint_owner.get_or_null(p_joint); + ERR_FAIL_NULL(joint); if (joint->get_type() != JOINT_TYPE_MAX) { GodotJoint2D *empty_joint = memnew(GodotJoint2D); empty_joint->copy_settings_from(joint); @@ -1144,38 +1159,38 @@ void GodotPhysicsServer2D::joint_make_damped_spring(RID p_joint, const Vector2 & } void GodotPhysicsServer2D::pin_joint_set_param(RID p_joint, PinJointParam p_param, real_t p_value) { - GodotJoint2D *j = joint_owner.get_or_null(p_joint); - ERR_FAIL_COND(!j); - ERR_FAIL_COND(j->get_type() != JOINT_TYPE_PIN); + GodotJoint2D *joint = joint_owner.get_or_null(p_joint); + ERR_FAIL_NULL(joint); + ERR_FAIL_COND(joint->get_type() != JOINT_TYPE_PIN); - GodotPinJoint2D *pin_joint = static_cast<GodotPinJoint2D *>(j); + GodotPinJoint2D *pin_joint = static_cast<GodotPinJoint2D *>(joint); pin_joint->set_param(p_param, p_value); } real_t GodotPhysicsServer2D::pin_joint_get_param(RID p_joint, PinJointParam p_param) const { - GodotJoint2D *j = joint_owner.get_or_null(p_joint); - ERR_FAIL_COND_V(!j, 0); - ERR_FAIL_COND_V(j->get_type() != JOINT_TYPE_PIN, 0); + GodotJoint2D *joint = joint_owner.get_or_null(p_joint); + ERR_FAIL_NULL_V(joint, 0); + ERR_FAIL_COND_V(joint->get_type() != JOINT_TYPE_PIN, 0); - GodotPinJoint2D *pin_joint = static_cast<GodotPinJoint2D *>(j); + GodotPinJoint2D *pin_joint = static_cast<GodotPinJoint2D *>(joint); return pin_joint->get_param(p_param); } void GodotPhysicsServer2D::damped_spring_joint_set_param(RID p_joint, DampedSpringParam p_param, real_t p_value) { - GodotJoint2D *j = joint_owner.get_or_null(p_joint); - ERR_FAIL_COND(!j); - ERR_FAIL_COND(j->get_type() != JOINT_TYPE_DAMPED_SPRING); + GodotJoint2D *joint = joint_owner.get_or_null(p_joint); + ERR_FAIL_NULL(joint); + ERR_FAIL_COND(joint->get_type() != JOINT_TYPE_DAMPED_SPRING); - GodotDampedSpringJoint2D *dsj = static_cast<GodotDampedSpringJoint2D *>(j); + GodotDampedSpringJoint2D *dsj = static_cast<GodotDampedSpringJoint2D *>(joint); dsj->set_param(p_param, p_value); } real_t GodotPhysicsServer2D::damped_spring_joint_get_param(RID p_joint, DampedSpringParam p_param) const { - GodotJoint2D *j = joint_owner.get_or_null(p_joint); - ERR_FAIL_COND_V(!j, 0); - ERR_FAIL_COND_V(j->get_type() != JOINT_TYPE_DAMPED_SPRING, 0); + GodotJoint2D *joint = joint_owner.get_or_null(p_joint); + ERR_FAIL_NULL_V(joint, 0); + ERR_FAIL_COND_V(joint->get_type() != JOINT_TYPE_DAMPED_SPRING, 0); - GodotDampedSpringJoint2D *dsj = static_cast<GodotDampedSpringJoint2D *>(j); + GodotDampedSpringJoint2D *dsj = static_cast<GodotDampedSpringJoint2D *>(joint); return dsj->get_param(p_param); } diff --git a/servers/physics_2d/godot_physics_server_2d.h b/servers/physics_2d/godot_physics_server_2d.h index 20e492d87a..b96677700c 100644 --- a/servers/physics_2d/godot_physics_server_2d.h +++ b/servers/physics_2d/godot_physics_server_2d.h @@ -151,8 +151,12 @@ public: virtual Variant area_get_param(RID p_area, AreaParameter p_param) const override; virtual Transform2D area_get_transform(RID p_area) const override; virtual void area_set_monitorable(RID p_area, bool p_monitorable) override; - virtual void area_set_collision_mask(RID p_area, uint32_t p_mask) override; + virtual void area_set_collision_layer(RID p_area, uint32_t p_layer) override; + virtual uint32_t area_get_collision_layer(RID p_area) const override; + + virtual void area_set_collision_mask(RID p_area, uint32_t p_mask) override; + virtual uint32_t area_get_collision_mask(RID p_area) const override; virtual void area_set_monitor_callback(RID p_area, const Callable &p_callback) override; virtual void area_set_area_monitor_callback(RID p_area, const Callable &p_callback) override; @@ -243,7 +247,7 @@ public: virtual void body_set_max_contacts_reported(RID p_body, int p_contacts) override; virtual int body_get_max_contacts_reported(RID p_body) const override; - virtual void body_set_state_sync_callback(RID p_body, void *p_instance, BodyStateCallback p_callback) override; + virtual void body_set_state_sync_callback(RID p_body, const Callable &p_callable) override; virtual void body_set_force_integration_callback(RID p_body, const Callable &p_callable, const Variant &p_udata = Variant()) override; virtual bool body_collide_shape(RID p_body, int p_body_shape, RID p_shape, const Transform2D &p_shape_xform, const Vector2 &p_motion, Vector2 *r_results, int p_result_max, int &r_result_count) override; diff --git a/servers/physics_2d/godot_space_2d.cpp b/servers/physics_2d/godot_space_2d.cpp index afcc5af951..a82d7dbbc4 100644 --- a/servers/physics_2d/godot_space_2d.cpp +++ b/servers/physics_2d/godot_space_2d.cpp @@ -129,8 +129,8 @@ bool GodotPhysicsDirectSpaceState2D::intersect_ray(const RayParameters &p_parame bool collided = false; Vector2 res_point, res_normal; - int res_shape; - const GodotCollisionObject2D *res_obj; + int res_shape = -1; + const GodotCollisionObject2D *res_obj = nullptr; real_t min_d = 1e10; for (int i = 0; i < amount; i++) { @@ -190,6 +190,7 @@ bool GodotPhysicsDirectSpaceState2D::intersect_ray(const RayParameters &p_parame if (!collided) { return false; } + ERR_FAIL_NULL_V(res_obj, false); // Shouldn't happen but silences warning. r_result.collider_id = res_obj->get_instance_id(); if (r_result.collider_id.is_valid()) { @@ -1036,8 +1037,6 @@ void *GodotSpace2D::_broadphase_pair(GodotCollisionObject2D *A, int p_subindex_A GodotBodyPair2D *b = memnew(GodotBodyPair2D(static_cast<GodotBody2D *>(A), p_subindex_A, static_cast<GodotBody2D *>(B), p_subindex_B)); return b; } - - return nullptr; } void GodotSpace2D::_broadphase_unpair(GodotCollisionObject2D *A, int p_subindex_A, GodotCollisionObject2D *B, int p_subindex_B, void *p_data, void *p_self) { diff --git a/servers/physics_3d/godot_body_3d.cpp b/servers/physics_3d/godot_body_3d.cpp index b632f7f461..19f065c319 100644 --- a/servers/physics_3d/godot_body_3d.cpp +++ b/servers/physics_3d/godot_body_3d.cpp @@ -674,7 +674,7 @@ void GodotBody3D::integrate_velocities(real_t p_step) { return; } - if (fi_callback_data || body_state_callback) { + if (fi_callback_data || body_state_callback.get_object()) { get_space()->body_add_to_state_query_list(&direct_state_query_list); } @@ -756,11 +756,12 @@ void GodotBody3D::wakeup_neighbours() { } void GodotBody3D::call_queries() { + Variant direct_state_variant = get_direct_state(); + if (fi_callback_data) { if (!fi_callback_data->callable.get_object()) { set_force_integration_callback(Callable()); } else { - Variant direct_state_variant = get_direct_state(); const Variant *vp[2] = { &direct_state_variant, &fi_callback_data->udata }; Callable::CallError ce; @@ -770,8 +771,11 @@ void GodotBody3D::call_queries() { } } - if (body_state_callback_instance) { - (body_state_callback)(body_state_callback_instance, get_direct_state()); + if (body_state_callback.get_object()) { + const Variant *vp[1] = { &direct_state_variant }; + Callable::CallError ce; + Variant rv; + body_state_callback.callp(vp, 1, rv, ce); } } @@ -792,9 +796,8 @@ bool GodotBody3D::sleep_test(real_t p_step) { } } -void GodotBody3D::set_state_sync_callback(void *p_instance, PhysicsServer3D::BodyStateCallback p_callback) { - body_state_callback_instance = p_instance; - body_state_callback = p_callback; +void GodotBody3D::set_state_sync_callback(const Callable &p_callable) { + body_state_callback = p_callable; } void GodotBody3D::set_force_integration_callback(const Callable &p_callable, const Variant &p_udata) { diff --git a/servers/physics_3d/godot_body_3d.h b/servers/physics_3d/godot_body_3d.h index 2153ca4e91..412cbebc7d 100644 --- a/servers/physics_3d/godot_body_3d.h +++ b/servers/physics_3d/godot_body_3d.h @@ -131,8 +131,7 @@ class GodotBody3D : public GodotCollisionObject3D { Vector<Contact> contacts; //no contacts by default int contact_count = 0; - void *body_state_callback_instance = nullptr; - PhysicsServer3D::BodyStateCallback body_state_callback = nullptr; + Callable body_state_callback; struct ForceIntegrationCallbackData { Callable callable; @@ -150,7 +149,7 @@ class GodotBody3D : public GodotCollisionObject3D { friend class GodotPhysicsDirectBodyState3D; // i give up, too many functions to expose public: - void set_state_sync_callback(void *p_instance, PhysicsServer3D::BodyStateCallback p_callback); + void set_state_sync_callback(const Callable &p_callable); void set_force_integration_callback(const Callable &p_callable, const Variant &p_udata = Variant()); GodotPhysicsDirectBodyState3D *get_direct_state(); diff --git a/servers/physics_3d/godot_collision_solver_3d.cpp b/servers/physics_3d/godot_collision_solver_3d.cpp index 094d77a582..9fe0e3eb84 100644 --- a/servers/physics_3d/godot_collision_solver_3d.cpp +++ b/servers/physics_3d/godot_collision_solver_3d.cpp @@ -370,12 +370,15 @@ bool GodotCollisionSolver3D::solve_static(const GodotShape3D *p_shape_A, const T if (type_A == PhysicsServer3D::SHAPE_WORLD_BOUNDARY) { if (type_B == PhysicsServer3D::SHAPE_WORLD_BOUNDARY) { + WARN_PRINT_ONCE("Collisions between world boundaries are not supported."); return false; } if (type_B == PhysicsServer3D::SHAPE_SEPARATION_RAY) { + WARN_PRINT_ONCE("Collisions between world boundaries and rays are not supported."); return false; } if (type_B == PhysicsServer3D::SHAPE_SOFT_BODY) { + WARN_PRINT_ONCE("Collisions between world boundaries and soft bodies are not supported."); return false; } @@ -387,6 +390,7 @@ bool GodotCollisionSolver3D::solve_static(const GodotShape3D *p_shape_A, const T } else if (type_A == PhysicsServer3D::SHAPE_SEPARATION_RAY) { if (type_B == PhysicsServer3D::SHAPE_SEPARATION_RAY) { + WARN_PRINT_ONCE("Collisions between rays are not supported."); return false; } @@ -398,7 +402,7 @@ bool GodotCollisionSolver3D::solve_static(const GodotShape3D *p_shape_A, const T } else if (type_B == PhysicsServer3D::SHAPE_SOFT_BODY) { if (type_A == PhysicsServer3D::SHAPE_SOFT_BODY) { - // Soft Body / Soft Body not supported. + WARN_PRINT_ONCE("Collisions between soft bodies are not supported."); return false; } @@ -410,6 +414,7 @@ bool GodotCollisionSolver3D::solve_static(const GodotShape3D *p_shape_A, const T } else if (concave_B) { if (concave_A) { + WARN_PRINT_ONCE("Collisions between two concave shapes are not supported."); return false; } diff --git a/servers/physics_3d/godot_physics_server_3d.cpp b/servers/physics_3d/godot_physics_server_3d.cpp index b028c00a31..68db5df144 100644 --- a/servers/physics_3d/godot_physics_server_3d.cpp +++ b/servers/physics_3d/godot_physics_server_3d.cpp @@ -387,6 +387,13 @@ void GodotPhysicsServer3D::area_set_collision_layer(RID p_area, uint32_t p_layer area->set_collision_layer(p_layer); } +uint32_t GodotPhysicsServer3D::area_get_collision_layer(RID p_area) const { + GodotArea3D *area = area_owner.get_or_null(p_area); + ERR_FAIL_COND_V(!area, 0); + + return area->get_collision_layer(); +} + void GodotPhysicsServer3D::area_set_collision_mask(RID p_area, uint32_t p_mask) { GodotArea3D *area = area_owner.get_or_null(p_area); ERR_FAIL_COND(!area); @@ -394,6 +401,13 @@ void GodotPhysicsServer3D::area_set_collision_mask(RID p_area, uint32_t p_mask) area->set_collision_mask(p_mask); } +uint32_t GodotPhysicsServer3D::area_get_collision_mask(RID p_area) const { + GodotArea3D *area = area_owner.get_or_null(p_area); + ERR_FAIL_COND_V(!area, 0); + + return area->get_collision_mask(); +} + void GodotPhysicsServer3D::area_set_monitorable(RID p_area, bool p_monitorable) { GodotArea3D *area = area_owner.get_or_null(p_area); ERR_FAIL_COND(!area); @@ -877,10 +891,10 @@ int GodotPhysicsServer3D::body_get_max_contacts_reported(RID p_body) const { return body->get_max_contacts_reported(); } -void GodotPhysicsServer3D::body_set_state_sync_callback(RID p_body, void *p_instance, BodyStateCallback p_callback) { +void GodotPhysicsServer3D::body_set_state_sync_callback(RID p_body, const Callable &p_callable) { GodotBody3D *body = body_owner.get_or_null(p_body); ERR_FAIL_COND(!body); - body->set_state_sync_callback(p_instance, p_callback); + body->set_state_sync_callback(p_callable); } void GodotPhysicsServer3D::body_set_force_integration_callback(RID p_body, const Callable &p_callable, const Variant &p_udata) { @@ -1196,6 +1210,7 @@ RID GodotPhysicsServer3D::joint_create() { void GodotPhysicsServer3D::joint_clear(RID p_joint) { GodotJoint3D *joint = joint_owner.get_or_null(p_joint); + ERR_FAIL_NULL(joint); if (joint->get_type() != JOINT_TYPE_MAX) { GodotJoint3D *empty_joint = memnew(GodotJoint3D); empty_joint->copy_settings_from(joint); diff --git a/servers/physics_3d/godot_physics_server_3d.h b/servers/physics_3d/godot_physics_server_3d.h index b429f23a0c..e3e649da57 100644 --- a/servers/physics_3d/godot_physics_server_3d.h +++ b/servers/physics_3d/godot_physics_server_3d.h @@ -148,8 +148,11 @@ public: virtual void area_set_ray_pickable(RID p_area, bool p_enable) override; - virtual void area_set_collision_mask(RID p_area, uint32_t p_mask) override; virtual void area_set_collision_layer(RID p_area, uint32_t p_layer) override; + virtual uint32_t area_get_collision_layer(RID p_area) const override; + + virtual void area_set_collision_mask(RID p_area, uint32_t p_mask) override; + virtual uint32_t area_get_collision_mask(RID p_area) const override; virtual void area_set_monitorable(RID p_area, bool p_monitorable) override; @@ -242,7 +245,7 @@ public: virtual void body_set_max_contacts_reported(RID p_body, int p_contacts) override; virtual int body_get_max_contacts_reported(RID p_body) const override; - virtual void body_set_state_sync_callback(RID p_body, void *p_instance, BodyStateCallback p_callback) override; + virtual void body_set_state_sync_callback(RID p_body, const Callable &p_callable) override; virtual void body_set_force_integration_callback(RID p_body, const Callable &p_callable, const Variant &p_udata = Variant()) override; virtual void body_set_ray_pickable(RID p_body, bool p_enable) override; diff --git a/servers/physics_3d/godot_shape_3d.cpp b/servers/physics_3d/godot_shape_3d.cpp index 5e310670a5..5574be20b7 100644 --- a/servers/physics_3d/godot_shape_3d.cpp +++ b/servers/physics_3d/godot_shape_3d.cpp @@ -735,29 +735,6 @@ void GodotCylinderShape3D::get_supports(const Vector3 &p_normal, int p_max, Vect r_amount = 1; r_type = FEATURE_POINT; r_supports[0] = get_support(p_normal); - return; - - Vector3 n = p_normal; - real_t h = n.y * Math::sqrt(0.25 * height * height + radius * radius); - if (Math::abs(h) > 1.0) { - // Top or bottom surface. - n.y = (n.y > 0.0) ? height * 0.5 : -height * 0.5; - } else { - // Lateral surface. - n.y = height * 0.5 * h; - } - - real_t s = Math::sqrt(n.x * n.x + n.z * n.z); - if (Math::is_zero_approx(s)) { - n.x = 0.0; - n.z = 0.0; - } else { - real_t scaled_radius = radius / s; - n.x = n.x * scaled_radius; - n.z = n.z * scaled_radius; - } - - r_supports[0] = n; } } diff --git a/servers/physics_3d/godot_space_3d.cpp b/servers/physics_3d/godot_space_3d.cpp index 76d59202c9..c23485279d 100644 --- a/servers/physics_3d/godot_space_3d.cpp +++ b/servers/physics_3d/godot_space_3d.cpp @@ -120,8 +120,8 @@ bool GodotPhysicsDirectSpaceState3D::intersect_ray(const RayParameters &p_parame bool collided = false; Vector3 res_point, res_normal; - int res_shape; - const GodotCollisionObject3D *res_obj; + int res_shape = -1; + const GodotCollisionObject3D *res_obj = nullptr; real_t min_d = 1e10; for (int i = 0; i < amount; i++) { @@ -185,6 +185,7 @@ bool GodotPhysicsDirectSpaceState3D::intersect_ray(const RayParameters &p_parame if (!collided) { return false; } + ERR_FAIL_NULL_V(res_obj, false); // Shouldn't happen but silences warning. r_result.collider_id = res_obj->get_instance_id(); if (r_result.collider_id.is_valid()) { diff --git a/servers/physics_3d/joints/godot_cone_twist_joint_3d.h b/servers/physics_3d/joints/godot_cone_twist_joint_3d.h index fdcc2ceea3..1651d34916 100644 --- a/servers/physics_3d/joints/godot_cone_twist_joint_3d.h +++ b/servers/physics_3d/joints/godot_cone_twist_joint_3d.h @@ -28,6 +28,9 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ +#ifndef GODOT_CONE_TWIST_JOINT_3D_H +#define GODOT_CONE_TWIST_JOINT_3D_H + /* Adapted to Godot from the Bullet library. */ @@ -49,9 +52,6 @@ subject to the following restrictions: Written by: Marcus Hennix */ -#ifndef GODOT_CONE_TWIST_JOINT_3D_H -#define GODOT_CONE_TWIST_JOINT_3D_H - #include "servers/physics_3d/godot_joint_3d.h" #include "servers/physics_3d/joints/godot_jacobian_entry_3d.h" diff --git a/servers/physics_3d/joints/godot_generic_6dof_joint_3d.h b/servers/physics_3d/joints/godot_generic_6dof_joint_3d.h index bcf2d18647..6a0ab81461 100644 --- a/servers/physics_3d/joints/godot_generic_6dof_joint_3d.h +++ b/servers/physics_3d/joints/godot_generic_6dof_joint_3d.h @@ -28,13 +28,13 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ +#ifndef GODOT_GENERIC_6DOF_JOINT_3D_H +#define GODOT_GENERIC_6DOF_JOINT_3D_H + /* Adapted to Godot from the Bullet library. */ -#ifndef GODOT_GENERIC_6DOF_JOINT_3D_H -#define GODOT_GENERIC_6DOF_JOINT_3D_H - #include "servers/physics_3d/godot_joint_3d.h" #include "servers/physics_3d/joints/godot_jacobian_entry_3d.h" diff --git a/servers/physics_3d/joints/godot_hinge_joint_3d.h b/servers/physics_3d/joints/godot_hinge_joint_3d.h index b934540e8d..f1187771af 100644 --- a/servers/physics_3d/joints/godot_hinge_joint_3d.h +++ b/servers/physics_3d/joints/godot_hinge_joint_3d.h @@ -28,13 +28,13 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ +#ifndef GODOT_HINGE_JOINT_3D_H +#define GODOT_HINGE_JOINT_3D_H + /* Adapted to Godot from the Bullet library. */ -#ifndef GODOT_HINGE_JOINT_3D_H -#define GODOT_HINGE_JOINT_3D_H - #include "servers/physics_3d/godot_joint_3d.h" #include "servers/physics_3d/joints/godot_jacobian_entry_3d.h" diff --git a/servers/physics_3d/joints/godot_jacobian_entry_3d.h b/servers/physics_3d/joints/godot_jacobian_entry_3d.h index 0fe15751d5..a46ce830ec 100644 --- a/servers/physics_3d/joints/godot_jacobian_entry_3d.h +++ b/servers/physics_3d/joints/godot_jacobian_entry_3d.h @@ -28,13 +28,13 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ +#ifndef GODOT_JACOBIAN_ENTRY_3D_H +#define GODOT_JACOBIAN_ENTRY_3D_H + /* Adapted to Godot from the Bullet library. */ -#ifndef GODOT_JACOBIAN_ENTRY_3D_H -#define GODOT_JACOBIAN_ENTRY_3D_H - /* Bullet Continuous Collision Detection and Physics Library Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ diff --git a/servers/physics_3d/joints/godot_pin_joint_3d.h b/servers/physics_3d/joints/godot_pin_joint_3d.h index eeeaa650bd..b3e2389d5a 100644 --- a/servers/physics_3d/joints/godot_pin_joint_3d.h +++ b/servers/physics_3d/joints/godot_pin_joint_3d.h @@ -28,13 +28,13 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ +#ifndef GODOT_PIN_JOINT_3D_H +#define GODOT_PIN_JOINT_3D_H + /* Adapted to Godot from the Bullet library. */ -#ifndef GODOT_PIN_JOINT_3D_H -#define GODOT_PIN_JOINT_3D_H - #include "servers/physics_3d/godot_joint_3d.h" #include "servers/physics_3d/joints/godot_jacobian_entry_3d.h" diff --git a/servers/physics_3d/joints/godot_slider_joint_3d.h b/servers/physics_3d/joints/godot_slider_joint_3d.h index f596c9ff75..29d19be0d7 100644 --- a/servers/physics_3d/joints/godot_slider_joint_3d.h +++ b/servers/physics_3d/joints/godot_slider_joint_3d.h @@ -28,13 +28,13 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ +#ifndef GODOT_SLIDER_JOINT_3D_H +#define GODOT_SLIDER_JOINT_3D_H + /* Adapted to Godot from the Bullet library. */ -#ifndef GODOT_SLIDER_JOINT_3D_H -#define GODOT_SLIDER_JOINT_3D_H - #include "servers/physics_3d/godot_joint_3d.h" #include "servers/physics_3d/joints/godot_jacobian_entry_3d.h" diff --git a/servers/physics_server_2d.cpp b/servers/physics_server_2d.cpp index abaa473017..21be311637 100644 --- a/servers/physics_server_2d.cpp +++ b/servers/physics_server_2d.cpp @@ -652,7 +652,10 @@ void PhysicsServer2D::_bind_methods() { ClassDB::bind_method(D_METHOD("area_clear_shapes", "area"), &PhysicsServer2D::area_clear_shapes); ClassDB::bind_method(D_METHOD("area_set_collision_layer", "area", "layer"), &PhysicsServer2D::area_set_collision_layer); + ClassDB::bind_method(D_METHOD("area_get_collision_layer", "area"), &PhysicsServer2D::area_get_collision_layer); + ClassDB::bind_method(D_METHOD("area_set_collision_mask", "area", "mask"), &PhysicsServer2D::area_set_collision_mask); + ClassDB::bind_method(D_METHOD("area_get_collision_mask", "area"), &PhysicsServer2D::area_get_collision_mask); ClassDB::bind_method(D_METHOD("area_set_param", "area", "param", "value"), &PhysicsServer2D::area_set_param); ClassDB::bind_method(D_METHOD("area_set_transform", "area", "transform"), &PhysicsServer2D::area_set_transform); diff --git a/servers/physics_server_2d.h b/servers/physics_server_2d.h index d5b4dc05e6..a3feb97d5d 100644 --- a/servers/physics_server_2d.h +++ b/servers/physics_server_2d.h @@ -332,8 +332,11 @@ public: virtual Variant area_get_param(RID p_parea, AreaParameter p_param) const = 0; virtual Transform2D area_get_transform(RID p_area) const = 0; - virtual void area_set_collision_mask(RID p_area, uint32_t p_mask) = 0; virtual void area_set_collision_layer(RID p_area, uint32_t p_layer) = 0; + virtual uint32_t area_get_collision_layer(RID p_area) const = 0; + + virtual void area_set_collision_mask(RID p_area, uint32_t p_mask) = 0; + virtual uint32_t area_get_collision_mask(RID p_area) const = 0; virtual void area_set_monitorable(RID p_area, bool p_monitorable) = 0; virtual void area_set_pickable(RID p_area, bool p_pickable) = 0; @@ -470,10 +473,7 @@ public: virtual void body_set_omit_force_integration(RID p_body, bool p_omit) = 0; virtual bool body_is_omitting_force_integration(RID p_body) const = 0; - // Callback for C++ use only. - typedef void (*BodyStateCallback)(void *p_instance, PhysicsDirectBodyState2D *p_state); - virtual void body_set_state_sync_callback(RID p_body, void *p_instance, BodyStateCallback p_callback) = 0; - + virtual void body_set_state_sync_callback(RID p_body, const Callable &p_callable) = 0; virtual void body_set_force_integration_callback(RID p_body, const Callable &p_callable, const Variant &p_udata = Variant()) = 0; virtual bool body_collide_shape(RID p_body, int p_body_shape, RID p_shape, const Transform2D &p_shape_xform, const Vector2 &p_motion, Vector2 *r_results, int p_result_max, int &r_result_count) = 0; @@ -490,7 +490,7 @@ public: bool collide_separation_ray = false; HashSet<RID> exclude_bodies; HashSet<ObjectID> exclude_objects; - bool recovery_as_collision = false; + bool recovery_as_collision = false; // Don't report margin recovery as collision by default, only used for floor snapping. MotionParameters() {} diff --git a/servers/physics_server_2d_wrap_mt.h b/servers/physics_server_2d_wrap_mt.h index d080aac438..14a6a5c2a1 100644 --- a/servers/physics_server_2d_wrap_mt.h +++ b/servers/physics_server_2d_wrap_mt.h @@ -156,8 +156,11 @@ public: FUNC2RC(Variant, area_get_param, RID, AreaParameter); FUNC1RC(Transform2D, area_get_transform, RID); - FUNC2(area_set_collision_mask, RID, uint32_t); FUNC2(area_set_collision_layer, RID, uint32_t); + FUNC1RC(uint32_t, area_get_collision_layer, RID); + + FUNC2(area_set_collision_mask, RID, uint32_t); + FUNC1RC(uint32_t, area_get_collision_mask, RID); FUNC2(area_set_monitorable, RID, bool); FUNC2(area_set_pickable, RID, bool); @@ -249,7 +252,7 @@ public: FUNC2(body_set_omit_force_integration, RID, bool); FUNC1RC(bool, body_is_omitting_force_integration, RID); - FUNC3(body_set_state_sync_callback, RID, void *, BodyStateCallback); + FUNC2(body_set_state_sync_callback, RID, const Callable &); FUNC3(body_set_force_integration_callback, RID, const Callable &, const Variant &); bool body_collide_shape(RID p_body, int p_body_shape, RID p_shape, const Transform2D &p_shape_xform, const Vector2 &p_motion, Vector2 *r_results, int p_result_max, int &r_result_count) override { diff --git a/servers/physics_server_3d.cpp b/servers/physics_server_3d.cpp index b4f30d7649..24cc7e8459 100644 --- a/servers/physics_server_3d.cpp +++ b/servers/physics_server_3d.cpp @@ -720,7 +720,10 @@ void PhysicsServer3D::_bind_methods() { ClassDB::bind_method(D_METHOD("area_clear_shapes", "area"), &PhysicsServer3D::area_clear_shapes); ClassDB::bind_method(D_METHOD("area_set_collision_layer", "area", "layer"), &PhysicsServer3D::area_set_collision_layer); + ClassDB::bind_method(D_METHOD("area_get_collision_layer", "area"), &PhysicsServer3D::area_get_collision_layer); + ClassDB::bind_method(D_METHOD("area_set_collision_mask", "area", "mask"), &PhysicsServer3D::area_set_collision_mask); + ClassDB::bind_method(D_METHOD("area_get_collision_mask", "area"), &PhysicsServer3D::area_get_collision_mask); ClassDB::bind_method(D_METHOD("area_set_param", "area", "param", "value"), &PhysicsServer3D::area_set_param); ClassDB::bind_method(D_METHOD("area_set_transform", "area", "transform"), &PhysicsServer3D::area_set_transform); diff --git a/servers/physics_server_3d.h b/servers/physics_server_3d.h index 1308e4cd36..b21c4e9249 100644 --- a/servers/physics_server_3d.h +++ b/servers/physics_server_3d.h @@ -364,8 +364,11 @@ public: virtual Variant area_get_param(RID p_parea, AreaParameter p_param) const = 0; virtual Transform3D area_get_transform(RID p_area) const = 0; - virtual void area_set_collision_mask(RID p_area, uint32_t p_mask) = 0; virtual void area_set_collision_layer(RID p_area, uint32_t p_layer) = 0; + virtual uint32_t area_get_collision_layer(RID p_area) const = 0; + + virtual void area_set_collision_mask(RID p_area, uint32_t p_mask) = 0; + virtual uint32_t area_get_collision_mask(RID p_area) const = 0; virtual void area_set_monitorable(RID p_area, bool p_monitorable) = 0; @@ -508,10 +511,7 @@ public: virtual void body_set_omit_force_integration(RID p_body, bool p_omit) = 0; virtual bool body_is_omitting_force_integration(RID p_body) const = 0; - // Callback for C++ use only. - typedef void (*BodyStateCallback)(void *p_instance, PhysicsDirectBodyState3D *p_state); - virtual void body_set_state_sync_callback(RID p_body, void *p_instance, BodyStateCallback p_callback) = 0; - + virtual void body_set_state_sync_callback(RID p_body, const Callable &p_callable) = 0; virtual void body_set_force_integration_callback(RID p_body, const Callable &p_callable, const Variant &p_udata = Variant()) = 0; virtual void body_set_ray_pickable(RID p_body, bool p_enable) = 0; @@ -527,7 +527,7 @@ public: bool collide_separation_ray = false; HashSet<RID> exclude_bodies; HashSet<ObjectID> exclude_objects; - bool recovery_as_collision = false; + bool recovery_as_collision = false; // Don't report margin recovery as collision by default, only used for floor snapping. MotionParameters() {} diff --git a/servers/physics_server_3d_wrap_mt.h b/servers/physics_server_3d_wrap_mt.h index ed4546b240..1d5fa95bfb 100644 --- a/servers/physics_server_3d_wrap_mt.h +++ b/servers/physics_server_3d_wrap_mt.h @@ -157,8 +157,11 @@ public: FUNC2RC(Variant, area_get_param, RID, AreaParameter); FUNC1RC(Transform3D, area_get_transform, RID); - FUNC2(area_set_collision_mask, RID, uint32_t); FUNC2(area_set_collision_layer, RID, uint32_t); + FUNC1RC(uint32_t, area_get_collision_layer, RID); + + FUNC2(area_set_collision_mask, RID, uint32_t); + FUNC1RC(uint32_t, area_get_collision_mask, RID); FUNC2(area_set_monitorable, RID, bool); FUNC2(area_set_ray_pickable, RID, bool); @@ -252,7 +255,7 @@ public: FUNC2(body_set_omit_force_integration, RID, bool); FUNC1RC(bool, body_is_omitting_force_integration, RID); - FUNC3(body_set_state_sync_callback, RID, void *, BodyStateCallback); + FUNC2(body_set_state_sync_callback, RID, const Callable &); FUNC3(body_set_force_integration_callback, RID, const Callable &, const Variant &); FUNC2(body_set_ray_pickable, RID, bool); diff --git a/servers/register_server_types.cpp b/servers/register_server_types.cpp index b9667f338c..1356fedb82 100644 --- a/servers/register_server_types.cpp +++ b/servers/register_server_types.cpp @@ -145,7 +145,6 @@ void register_server_types() { GDREGISTER_NATIVE_STRUCT(PhysicsServer2DExtensionShapeResult, "RID rid;ObjectID collider_id;Object *collider;int shape"); GDREGISTER_NATIVE_STRUCT(PhysicsServer2DExtensionShapeRestInfo, "Vector2 point;Vector2 normal;RID rid;ObjectID collider_id;int shape;Vector2 linear_velocity"); GDREGISTER_NATIVE_STRUCT(PhysicsServer2DExtensionMotionResult, "Vector2 travel;Vector2 remainder;Vector2 collision_point;Vector2 collision_normal;Vector2 collider_velocity;real_t collision_depth;real_t collision_safe_fraction;real_t collision_unsafe_fraction;int collision_local_shape;ObjectID collider_id;RID collider;int collider_shape"); - GDREGISTER_NATIVE_STRUCT(PhysicsServer2DExtensionStateCallback, "void *instance;void (*callback)(void *p_instance, PhysicsDirectBodyState2D *p_state)"); GDREGISTER_CLASS(PhysicsServer3DManager); Engine::get_singleton()->add_singleton(Engine::Singleton("PhysicsServer3DManager", PhysicsServer3DManager::get_singleton(), "PhysicsServer3DManager")); @@ -161,10 +160,14 @@ void register_server_types() { GDREGISTER_NATIVE_STRUCT(PhysicsServer3DExtensionShapeRestInfo, "Vector3 point;Vector3 normal;RID rid;ObjectID collider_id;int shape;Vector3 linear_velocity"); GDREGISTER_NATIVE_STRUCT(PhysicsServer3DExtensionMotionCollision, "Vector3 position;Vector3 normal;Vector3 collider_velocity;real_t depth;int local_shape;ObjectID collider_id;RID collider;int collider_shape"); GDREGISTER_NATIVE_STRUCT(PhysicsServer3DExtensionMotionResult, "Vector3 travel;Vector3 remainder;real_t collision_safe_fraction;real_t collision_unsafe_fraction;PhysicsServer3DExtensionMotionCollision collisions[32];int collision_count"); - GDREGISTER_NATIVE_STRUCT(PhysicsServer3DExtensionStateCallback, "void *instance;void (*callback)(void *p_instance, PhysicsDirectBodyState3D *p_state)"); GDREGISTER_ABSTRACT_CLASS(NavigationServer2D); GDREGISTER_ABSTRACT_CLASS(NavigationServer3D); + GDREGISTER_CLASS(NavigationPathQueryParameters2D); + GDREGISTER_CLASS(NavigationPathQueryParameters3D); + GDREGISTER_CLASS(NavigationPathQueryResult2D); + GDREGISTER_CLASS(NavigationPathQueryResult3D); + GDREGISTER_CLASS(XRServer); GDREGISTER_CLASS(CameraServer); diff --git a/servers/rendering/dummy/environment/fog.h b/servers/rendering/dummy/environment/fog.h index 623f94b95f..047b8e133d 100644 --- a/servers/rendering/dummy/environment/fog.h +++ b/servers/rendering/dummy/environment/fog.h @@ -41,7 +41,7 @@ public: virtual RID fog_volume_allocate() override { return RID(); } virtual void fog_volume_initialize(RID p_rid) override {} - virtual void fog_free(RID p_rid) override {} + virtual void fog_volume_free(RID p_rid) override {} virtual void fog_volume_set_shape(RID p_fog_volume, RS::FogVolumeShape p_shape) override {} virtual void fog_volume_set_extents(RID p_fog_volume, const Vector3 &p_extents) override {} diff --git a/servers/rendering/dummy/rasterizer_scene_dummy.h b/servers/rendering/dummy/rasterizer_scene_dummy.h index 4a2a947b94..bc8f7c523b 100644 --- a/servers/rendering/dummy/rasterizer_scene_dummy.h +++ b/servers/rendering/dummy/rasterizer_scene_dummy.h @@ -93,17 +93,6 @@ public: uint32_t geometry_instance_get_pair_mask() override { return 0; } - /* SHADOW ATLAS API */ - - RID shadow_atlas_create() override { return RID(); } - void shadow_atlas_set_size(RID p_atlas, int p_size, bool p_16_bits = true) override {} - void shadow_atlas_set_quadrant_subdivision(RID p_atlas, int p_quadrant, int p_subdivision) override {} - bool shadow_atlas_update_light(RID p_atlas, RID p_light_intance, float p_coverage, uint64_t p_light_version) override { return false; } - - void directional_shadow_atlas_set_size(int p_size, bool p_16_bits = true) override {} - int get_directional_light_shadow_size(RID p_light_intance) override { return 0; } - void set_directional_shadow_count(int p_count) override {} - /* SDFGI UPDATE */ void sdfgi_update(const Ref<RenderSceneBuffers> &p_render_buffers, RID p_environment, const Vector3 &p_world_position) override {} @@ -143,36 +132,12 @@ public: void positional_soft_shadow_filter_set_quality(RS::ShadowQuality p_quality) override {} void directional_soft_shadow_filter_set_quality(RS::ShadowQuality p_quality) override {} - RID light_instance_create(RID p_light) override { return RID(); } - void light_instance_set_transform(RID p_light_instance, const Transform3D &p_transform) override {} - void light_instance_set_aabb(RID p_light_instance, const AABB &p_aabb) override {} - void light_instance_set_shadow_transform(RID p_light_instance, const Projection &p_projection, const Transform3D &p_transform, float p_far, float p_split, int p_pass, float p_shadow_texel_size, float p_bias_scale = 1.0, float p_range_begin = 0, const Vector2 &p_uv_scale = Vector2()) override {} - void light_instance_mark_visible(RID p_light_instance) override {} - RID fog_volume_instance_create(RID p_fog_volume) override { return RID(); } void fog_volume_instance_set_transform(RID p_fog_volume_instance, const Transform3D &p_transform) override {} void fog_volume_instance_set_active(RID p_fog_volume_instance, bool p_active) override {} RID fog_volume_instance_get_volume(RID p_fog_volume_instance) const override { return RID(); } Vector3 fog_volume_instance_get_position(RID p_fog_volume_instance) const override { return Vector3(); } - RID reflection_atlas_create() override { return RID(); } - int reflection_atlas_get_size(RID p_ref_atlas) const override { return 0; } - void reflection_atlas_set_size(RID p_ref_atlas, int p_reflection_size, int p_reflection_count) override {} - - RID reflection_probe_instance_create(RID p_probe) override { return RID(); } - void reflection_probe_instance_set_transform(RID p_instance, const Transform3D &p_transform) override {} - void reflection_probe_release_atlas_index(RID p_instance) override {} - bool reflection_probe_instance_needs_redraw(RID p_instance) override { return false; } - bool reflection_probe_instance_has_reflection(RID p_instance) override { return false; } - bool reflection_probe_instance_begin_render(RID p_instance, RID p_reflection_atlas) override { return false; } - bool reflection_probe_instance_postprocess_step(RID p_instance) override { return true; } - - RID decal_instance_create(RID p_decal) override { return RID(); } - void decal_instance_set_transform(RID p_decal, const Transform3D &p_transform) override {} - - RID lightmap_instance_create(RID p_lightmap) override { return RID(); } - void lightmap_instance_set_transform(RID p_lightmap, const Transform3D &p_transform) override {} - RID voxel_gi_instance_create(RID p_voxel_gi) override { return RID(); } void voxel_gi_instance_set_transform_to_data(RID p_probe, const Transform3D &p_xform) override {} bool voxel_gi_needs_update(RID p_probe) const override { return false; } @@ -180,7 +145,7 @@ public: void voxel_gi_set_quality(RS::VoxelGIQuality) override {} - void render_scene(const Ref<RenderSceneBuffers> &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray<RenderGeometryInstance *> &p_instances, const PagedArray<RID> &p_lights, const PagedArray<RID> &p_reflection_probes, const PagedArray<RID> &p_voxel_gi_instances, const PagedArray<RID> &p_decals, const PagedArray<RID> &p_lightmaps, const PagedArray<RID> &p_fog_volumes, RID p_environment, RID p_camera_attributes, RID p_shadow_atlas, RID p_occluder_debug_tex, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, const RenderShadowData *p_render_shadows, int p_render_shadow_count, const RenderSDFGIData *p_render_sdfgi_regions, int p_render_sdfgi_region_count, const RenderSDFGIUpdateData *p_sdfgi_update_data = nullptr, RendererScene::RenderInfo *r_info = nullptr) override {} + void render_scene(const Ref<RenderSceneBuffers> &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray<RenderGeometryInstance *> &p_instances, const PagedArray<RID> &p_lights, const PagedArray<RID> &p_reflection_probes, const PagedArray<RID> &p_voxel_gi_instances, const PagedArray<RID> &p_decals, const PagedArray<RID> &p_lightmaps, const PagedArray<RID> &p_fog_volumes, RID p_environment, RID p_camera_attributes, RID p_shadow_atlas, RID p_occluder_debug_tex, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, const RenderShadowData *p_render_shadows, int p_render_shadow_count, const RenderSDFGIData *p_render_sdfgi_regions, int p_render_sdfgi_region_count, const RenderSDFGIUpdateData *p_sdfgi_update_data = nullptr, RenderingMethod::RenderInfo *r_info = nullptr) override {} void render_material(const Transform3D &p_cam_transform, const Projection &p_cam_projection, bool p_cam_orthogonal, const PagedArray<RenderGeometryInstance *> &p_instances, RID p_framebuffer, const Rect2i &p_region) override {} void render_particle_collider_heightfield(RID p_collider, const Transform3D &p_transform, const PagedArray<RenderGeometryInstance *> &p_instances) override {} diff --git a/servers/rendering/dummy/storage/light_storage.h b/servers/rendering/dummy/storage/light_storage.h index 79f484d513..13c342d823 100644 --- a/servers/rendering/dummy/storage/light_storage.h +++ b/servers/rendering/dummy/storage/light_storage.h @@ -81,6 +81,15 @@ public: virtual uint32_t light_get_max_sdfgi_cascade(RID p_light) override { return 0; } virtual uint64_t light_get_version(RID p_light) const override { return 0; } + /* LIGHT INSTANCE API */ + + RID light_instance_create(RID p_light) override { return RID(); } + void light_instance_free(RID p_light) override {} + void light_instance_set_transform(RID p_light_instance, const Transform3D &p_transform) override {} + void light_instance_set_aabb(RID p_light_instance, const AABB &p_aabb) override {} + void light_instance_set_shadow_transform(RID p_light_instance, const Projection &p_projection, const Transform3D &p_transform, float p_far, float p_split, int p_pass, float p_shadow_texel_size, float p_bias_scale = 1.0, float p_range_begin = 0, const Vector2 &p_uv_scale = Vector2()) override {} + void light_instance_mark_visible(RID p_light_instance) override {} + /* PROBE API */ virtual RID reflection_probe_allocate() override { return RID(); } virtual void reflection_probe_initialize(RID p_rid) override {} @@ -110,7 +119,26 @@ public: virtual float reflection_probe_get_origin_max_distance(RID p_probe) const override { return 0.0; } virtual bool reflection_probe_renders_shadows(RID p_probe) const override { return false; } + /* REFLECTION ATLAS */ + + virtual RID reflection_atlas_create() override { return RID(); } + virtual void reflection_atlas_free(RID p_ref_atlas) override {} + virtual int reflection_atlas_get_size(RID p_ref_atlas) const override { return 0; } + virtual void reflection_atlas_set_size(RID p_ref_atlas, int p_reflection_size, int p_reflection_count) override {} + + /* REFLECTION PROBE INSTANCE */ + + virtual RID reflection_probe_instance_create(RID p_probe) override { return RID(); } + virtual void reflection_probe_instance_free(RID p_instance) override {} + virtual void reflection_probe_instance_set_transform(RID p_instance, const Transform3D &p_transform) override {} + virtual void reflection_probe_release_atlas_index(RID p_instance) override {} + virtual bool reflection_probe_instance_needs_redraw(RID p_instance) override { return false; } + virtual bool reflection_probe_instance_has_reflection(RID p_instance) override { return false; } + virtual bool reflection_probe_instance_begin_render(RID p_instance, RID p_reflection_atlas) override { return false; } + virtual bool reflection_probe_instance_postprocess_step(RID p_instance) override { return true; } + /* LIGHTMAP CAPTURE */ + virtual RID lightmap_allocate() override { return RID(); } virtual void lightmap_initialize(RID p_rid) override {} virtual void lightmap_free(RID p_rid) override {} @@ -129,6 +157,25 @@ public: virtual bool lightmap_is_interior(RID p_lightmap) const override { return false; } virtual void lightmap_set_probe_capture_update_speed(float p_speed) override {} virtual float lightmap_get_probe_capture_update_speed() const override { return 0; } + + /* LIGHTMAP INSTANCE */ + + RID lightmap_instance_create(RID p_lightmap) override { return RID(); } + void lightmap_instance_free(RID p_lightmap) override {} + void lightmap_instance_set_transform(RID p_lightmap, const Transform3D &p_transform) override {} + + /* SHADOW ATLAS API */ + virtual RID shadow_atlas_create() override { return RID(); } + virtual void shadow_atlas_free(RID p_atlas) override {} + virtual void shadow_atlas_set_size(RID p_atlas, int p_size, bool p_16_bits = true) override {} + virtual void shadow_atlas_set_quadrant_subdivision(RID p_atlas, int p_quadrant, int p_subdivision) override {} + virtual bool shadow_atlas_update_light(RID p_atlas, RID p_light_intance, float p_coverage, uint64_t p_light_version) override { return false; } + + virtual void shadow_atlas_update(RID p_atlas) override {} + + virtual void directional_shadow_atlas_set_size(int p_size, bool p_16_bits = true) override {} + virtual int get_directional_light_shadow_size(RID p_light_intance) override { return 0; } + virtual void set_directional_shadow_count(int p_count) override {} }; } // namespace RendererDummy diff --git a/servers/rendering/dummy/storage/texture_storage.h b/servers/rendering/dummy/storage/texture_storage.h index c15b656d06..f5bdccca68 100644 --- a/servers/rendering/dummy/storage/texture_storage.h +++ b/servers/rendering/dummy/storage/texture_storage.h @@ -146,6 +146,12 @@ public: virtual void texture_add_to_decal_atlas(RID p_texture, bool p_panorama_to_dp = false) override {} virtual void texture_remove_from_decal_atlas(RID p_texture, bool p_panorama_to_dp = false) override {} + /* DECAL INSTANCE */ + + virtual RID decal_instance_create(RID p_decal) override { return RID(); } + virtual void decal_instance_free(RID p_decal_instance) override {} + virtual void decal_instance_set_transform(RID p_decal, const Transform3D &p_transform) override {} + /* RENDER TARGET */ virtual RID render_target_create() override { return RID(); } diff --git a/servers/rendering/environment/renderer_fog.h b/servers/rendering/environment/renderer_fog.h index c55021e1a1..8f38d5745e 100644 --- a/servers/rendering/environment/renderer_fog.h +++ b/servers/rendering/environment/renderer_fog.h @@ -41,7 +41,7 @@ public: virtual RID fog_volume_allocate() = 0; virtual void fog_volume_initialize(RID p_rid) = 0; - virtual void fog_free(RID p_rid) = 0; + virtual void fog_volume_free(RID p_rid) = 0; virtual void fog_volume_set_shape(RID p_fog_volume, RS::FogVolumeShape p_shape) = 0; virtual void fog_volume_set_extents(RID p_fog_volume, const Vector3 &p_extents) = 0; diff --git a/servers/rendering/renderer_canvas_cull.cpp b/servers/rendering/renderer_canvas_cull.cpp index aa9772a483..c5818d9290 100644 --- a/servers/rendering/renderer_canvas_cull.cpp +++ b/servers/rendering/renderer_canvas_cull.cpp @@ -189,7 +189,7 @@ void RendererCanvasCull::_attach_canvas_item_for_draw(RendererCanvasCull::Item * RenderingServerDefault::redraw_request(); } - if (ci->commands != nullptr) { + if (ci->commands != nullptr || ci->copy_back_buffer) { ci->final_transform = xform; ci->final_modulate = modulate * ci->self_modulate; ci->global_rect_cache = global_rect; diff --git a/servers/rendering/renderer_compositor.h b/servers/rendering/renderer_compositor.h index 78d4ded617..8e04191e35 100644 --- a/servers/rendering/renderer_compositor.h +++ b/servers/rendering/renderer_compositor.h @@ -34,7 +34,7 @@ #include "servers/rendering/environment/renderer_fog.h" #include "servers/rendering/environment/renderer_gi.h" #include "servers/rendering/renderer_canvas_render.h" -#include "servers/rendering/renderer_scene.h" +#include "servers/rendering/rendering_method.h" #include "servers/rendering/storage/camera_attributes_storage.h" #include "servers/rendering/storage/light_storage.h" #include "servers/rendering/storage/material_storage.h" diff --git a/servers/rendering/renderer_rd/effects/fsr.cpp b/servers/rendering/renderer_rd/effects/fsr.cpp index 5fde24a926..92b34ede0e 100644 --- a/servers/rendering/renderer_rd/effects/fsr.cpp +++ b/servers/rendering/renderer_rd/effects/fsr.cpp @@ -29,7 +29,8 @@ /*************************************************************************/ #include "fsr.h" -#include "servers/rendering/renderer_rd/uniform_set_cache_rd.h" +#include "../storage_rd/material_storage.h" +#include "../uniform_set_cache_rd.h" using namespace RendererRD; diff --git a/servers/rendering/renderer_rd/effects/fsr.h b/servers/rendering/renderer_rd/effects/fsr.h index 1adfba527a..69088e526a 100644 --- a/servers/rendering/renderer_rd/effects/fsr.h +++ b/servers/rendering/renderer_rd/effects/fsr.h @@ -31,11 +31,10 @@ #ifndef FSR_RD_H #define FSR_RD_H -#include "servers/rendering/renderer_rd/pipeline_cache_rd.h" -#include "servers/rendering/renderer_rd/shaders/effects/fsr_upscale.glsl.gen.h" -#include "servers/rendering/renderer_rd/storage_rd/render_scene_buffers_rd.h" +#include "../pipeline_cache_rd.h" +#include "../shaders/effects/fsr_upscale.glsl.gen.h" +#include "../storage_rd/render_scene_buffers_rd.h" #include "servers/rendering/renderer_scene_render.h" - #include "servers/rendering_server.h" namespace RendererRD { diff --git a/servers/rendering/renderer_rd/effects/ss_effects.cpp b/servers/rendering/renderer_rd/effects/ss_effects.cpp index 315bea2e67..1cbc52dec3 100644 --- a/servers/rendering/renderer_rd/effects/ss_effects.cpp +++ b/servers/rendering/renderer_rd/effects/ss_effects.cpp @@ -30,6 +30,7 @@ #include "ss_effects.h" +#include "core/config/project_settings.h" #include "servers/rendering/renderer_rd/renderer_compositor_rd.h" #include "servers/rendering/renderer_rd/storage_rd/material_storage.h" #include "servers/rendering/renderer_rd/storage_rd/render_scene_buffers_rd.h" @@ -50,8 +51,8 @@ static _FORCE_INLINE_ void store_camera(const Projection &p_mtx, float *p_array) SSEffects::SSEffects() { singleton = this; + // Initialize depth buffer for screen space effects { - // Initialize depth buffer for screen space effects Vector<String> downsampler_modes; downsampler_modes.push_back("\n"); downsampler_modes.push_back("\n#define USE_HALF_SIZE\n"); @@ -100,6 +101,7 @@ SSEffects::SSEffects() { } // Initialize Screen Space Indirect Lighting (SSIL) + ssil_set_quality(RS::EnvironmentSSILQuality(int(GLOBAL_GET("rendering/environment/ssil/quality"))), GLOBAL_GET("rendering/environment/ssil/half_size"), GLOBAL_GET("rendering/environment/ssil/adaptive_target"), GLOBAL_GET("rendering/environment/ssil/blur_passes"), GLOBAL_GET("rendering/environment/ssil/fadeout_from"), GLOBAL_GET("rendering/environment/ssil/fadeout_to")); { Vector<String> ssil_modes; @@ -175,9 +177,10 @@ SSEffects::SSEffects() { } } - { - // Initialize Screen Space Ambient Occlusion (SSAO) + // Initialize Screen Space Ambient Occlusion (SSAO) + ssao_set_quality(RS::EnvironmentSSAOQuality(int(GLOBAL_GET("rendering/environment/ssao/quality"))), GLOBAL_GET("rendering/environment/ssao/half_size"), GLOBAL_GET("rendering/environment/ssao/adaptive_target"), GLOBAL_GET("rendering/environment/ssao/blur_passes"), GLOBAL_GET("rendering/environment/ssao/fadeout_from"), GLOBAL_GET("rendering/environment/ssao/fadeout_to")); + { RD::SamplerState sampler; sampler.mag_filter = RD::SAMPLER_FILTER_NEAREST; sampler.min_filter = RD::SAMPLER_FILTER_NEAREST; @@ -276,9 +279,10 @@ SSEffects::SSEffects() { ss_effects.mirror_sampler = RD::get_singleton()->sampler_create(sampler); } - { - // Screen Space Reflections + // Screen Space Reflections + ssr_roughness_quality = RS::EnvironmentSSRRoughnessQuality(int(GLOBAL_GET("rendering/environment/screen_space_reflection/roughness_quality"))); + { Vector<RD::PipelineSpecializationConstant> specialization_constants; { @@ -336,6 +340,10 @@ SSEffects::SSEffects() { } // Subsurface scattering + sss_quality = RS::SubSurfaceScatteringQuality(int(GLOBAL_GET("rendering/environment/subsurface_scattering/subsurface_scattering_quality"))); + sss_scale = GLOBAL_GET("rendering/environment/subsurface_scattering/subsurface_scattering_scale"); + sss_depth_scale = GLOBAL_GET("rendering/environment/subsurface_scattering/subsurface_scattering_depth_scale"); + { Vector<String> sss_modes; sss_modes.push_back("\n#define USE_11_SAMPLES\n"); @@ -403,7 +411,7 @@ SSEffects::~SSEffects() { /* SS Downsampler */ -void SSEffects::downsample_depth(RID p_depth_buffer, const Vector<RID> &p_depth_mipmaps, RS::EnvironmentSSAOQuality p_ssao_quality, RS::EnvironmentSSILQuality p_ssil_quality, bool p_invalidate_uniform_set, bool p_ssao_half_size, bool p_ssil_half_size, Size2i p_full_screen_size, const Projection &p_projection) { +void SSEffects::downsample_depth(RID p_depth_buffer, const Vector<RID> &p_depth_mipmaps, bool p_invalidate_uniform_set, Size2i p_full_screen_size, const Projection &p_projection) { UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton(); ERR_FAIL_NULL(uniform_set_cache); MaterialStorage *material_storage = MaterialStorage::get_singleton(); @@ -413,9 +421,9 @@ void SSEffects::downsample_depth(RID p_depth_buffer, const Vector<RID> &p_depth_ RD::ComputeListID compute_list = RD::get_singleton()->compute_list_begin(); int downsample_mode = SS_EFFECTS_DOWNSAMPLE; - bool use_mips = p_ssao_quality > RS::ENV_SSAO_QUALITY_MEDIUM || p_ssil_quality > RS::ENV_SSIL_QUALITY_MEDIUM; + bool use_mips = ssao_quality > RS::ENV_SSAO_QUALITY_MEDIUM || ssil_quality > RS::ENV_SSIL_QUALITY_MEDIUM; - if (p_ssao_quality == RS::ENV_SSAO_QUALITY_VERY_LOW && p_ssil_quality == RS::ENV_SSIL_QUALITY_VERY_LOW) { + if (ssao_quality == RS::ENV_SSAO_QUALITY_VERY_LOW && ssil_quality == RS::ENV_SSIL_QUALITY_VERY_LOW) { downsample_mode = SS_EFFECTS_DOWNSAMPLE_HALF; } else if (use_mips) { downsample_mode = SS_EFFECTS_DOWNSAMPLE_MIPMAP; @@ -424,10 +432,10 @@ void SSEffects::downsample_depth(RID p_depth_buffer, const Vector<RID> &p_depth_ bool use_half_size = false; bool use_full_mips = false; - if (p_ssao_half_size && p_ssil_half_size) { + if (ssao_half_size && ssil_half_size) { downsample_mode++; use_half_size = true; - } else if (p_ssao_half_size != p_ssil_half_size) { + } else if (ssao_half_size != ssil_half_size) { if (use_mips) { downsample_mode = SS_EFFECTS_DOWNSAMPLE_FULL_MIPS; use_full_mips = true; @@ -443,6 +451,11 @@ void SSEffects::downsample_depth(RID p_depth_buffer, const Vector<RID> &p_depth_ RD::get_singleton()->draw_command_begin_label("Downsample Depth"); if (p_invalidate_uniform_set || use_full_mips != ss_effects.used_full_mips_last_frame || use_half_size != ss_effects.used_half_size_last_frame || use_mips != ss_effects.used_mips_last_frame) { + if (ss_effects.downsample_uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(ss_effects.downsample_uniform_set)) { + RD::get_singleton()->free(ss_effects.downsample_uniform_set); + ss_effects.downsample_uniform_set = RID(); + } + Vector<RD::Uniform> uniforms; { RD::Uniform u; @@ -516,16 +529,26 @@ void SSEffects::downsample_depth(RID p_depth_buffer, const Vector<RID> &p_depth_ ss_effects.used_full_mips_last_frame = use_full_mips; ss_effects.used_half_size_last_frame = use_half_size; + ss_effects.used_mips_last_frame = use_mips; } /* SSIL */ +void SSEffects::ssil_set_quality(RS::EnvironmentSSILQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) { + ssil_quality = p_quality; + ssil_half_size = p_half_size; + ssil_adaptive_target = p_adaptive_target; + ssil_blur_passes = p_blur_passes; + ssil_fadeout_from = p_fadeout_from; + ssil_fadeout_to = p_fadeout_to; +} + void SSEffects::gather_ssil(RD::ComputeListID p_compute_list, const Vector<RID> p_ssil_slices, const Vector<RID> p_edges_slices, const SSILSettings &p_settings, bool p_adaptive_base_pass, RID p_gather_uniform_set, RID p_importance_map_uniform_set, RID p_projection_uniform_set) { UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton(); ERR_FAIL_NULL(uniform_set_cache); RD::get_singleton()->compute_list_bind_uniform_set(p_compute_list, p_gather_uniform_set, 0); - if ((p_settings.quality == RS::ENV_SSIL_QUALITY_ULTRA) && !p_adaptive_base_pass) { + if ((ssil_quality == RS::ENV_SSIL_QUALITY_ULTRA) && !p_adaptive_base_pass) { RD::get_singleton()->compute_list_bind_uniform_set(p_compute_list, p_importance_map_uniform_set, 1); } RD::get_singleton()->compute_list_bind_uniform_set(p_compute_list, p_projection_uniform_set, 3); @@ -533,7 +556,7 @@ void SSEffects::gather_ssil(RD::ComputeListID p_compute_list, const Vector<RID> RID shader = ssil.gather_shader.version_get_shader(ssil.gather_shader_version, 0); for (int i = 0; i < 4; i++) { - if ((p_settings.quality == RS::ENV_SSIL_QUALITY_VERY_LOW) && ((i == 1) || (i == 2))) { + if ((ssil_quality == RS::ENV_SSIL_QUALITY_VERY_LOW) && ((i == 1) || (i == 2))) { continue; } @@ -548,7 +571,7 @@ void SSEffects::gather_ssil(RD::ComputeListID p_compute_list, const Vector<RID> RD::get_singleton()->compute_list_bind_uniform_set(p_compute_list, uniform_set_cache->get_cache(shader, 2, u_ssil_slice, u_edges_slice), 2); RD::get_singleton()->compute_list_set_push_constant(p_compute_list, &ssil.gather_push_constant, sizeof(SSILGatherPushConstant)); - Size2i size = Size2i(p_settings.full_screen_size.x >> (p_settings.half_size ? 2 : 1), p_settings.full_screen_size.y >> (p_settings.half_size ? 2 : 1)); + Size2i size = Size2i(p_settings.full_screen_size.x >> (ssil_half_size ? 2 : 1), p_settings.full_screen_size.y >> (ssil_half_size ? 2 : 1)); RD::get_singleton()->compute_list_dispatch_threads(p_compute_list, size.x, size.y, 1); } @@ -556,11 +579,11 @@ void SSEffects::gather_ssil(RD::ComputeListID p_compute_list, const Vector<RID> } void SSEffects::ssil_allocate_buffers(SSILRenderBuffers &p_ssil_buffers, const SSILSettings &p_settings, RID p_linear_depth) { - if (p_ssil_buffers.half_size != p_settings.half_size) { + if (p_ssil_buffers.half_size != ssil_half_size) { ssil_free(p_ssil_buffers); } - if (p_settings.half_size) { + if (ssil_half_size) { p_ssil_buffers.buffer_width = (p_settings.full_screen_size.x + 3) / 4; p_ssil_buffers.buffer_height = (p_settings.full_screen_size.y + 3) / 4; p_ssil_buffers.half_buffer_width = (p_settings.full_screen_size.x + 7) / 8; @@ -574,7 +597,7 @@ void SSEffects::ssil_allocate_buffers(SSILRenderBuffers &p_ssil_buffers, const S if (p_ssil_buffers.ssil_final.is_null()) { { - p_ssil_buffers.depth_texture_view = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), p_linear_depth, 0, p_settings.half_size ? 1 : 0, 4, RD::TEXTURE_SLICE_2D_ARRAY); + p_ssil_buffers.depth_texture_view = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), p_linear_depth, 0, ssil_half_size ? 1 : 0, 4, RD::TEXTURE_SLICE_2D_ARRAY); } { RD::TextureFormat tf; @@ -659,7 +682,7 @@ void SSEffects::ssil_allocate_buffers(SSILRenderBuffers &p_ssil_buffers, const S p_ssil_buffers.importance_map[1] = RD::get_singleton()->texture_create(tf, RD::TextureView()); RD::get_singleton()->set_resource_name(p_ssil_buffers.importance_map[1], "SSIL Importance Map Pong"); } - p_ssil_buffers.half_size = p_settings.half_size; + p_ssil_buffers.half_size = ssil_half_size; } } @@ -705,26 +728,26 @@ void SSEffects::screen_space_indirect_lighting(SSILRenderBuffers &p_ssil_buffers ssil.gather_push_constant.radius = p_settings.radius; float radius_near_limit = (p_settings.radius * 1.2f); - if (p_settings.quality <= RS::ENV_SSIL_QUALITY_LOW) { + if (ssil_quality <= RS::ENV_SSIL_QUALITY_LOW) { radius_near_limit *= 1.50f; - if (p_settings.quality == RS::ENV_SSIL_QUALITY_VERY_LOW) { + if (ssil_quality == RS::ENV_SSIL_QUALITY_VERY_LOW) { ssil.gather_push_constant.radius *= 0.8f; } } radius_near_limit /= tan_half_fov_y; ssil.gather_push_constant.intensity = p_settings.intensity * Math_PI; - ssil.gather_push_constant.fade_out_mul = -1.0 / (p_settings.fadeout_to - p_settings.fadeout_from); - ssil.gather_push_constant.fade_out_add = p_settings.fadeout_from / (p_settings.fadeout_to - p_settings.fadeout_from) + 1.0; + ssil.gather_push_constant.fade_out_mul = -1.0 / (ssil_fadeout_to - ssil_fadeout_from); + ssil.gather_push_constant.fade_out_add = ssil_fadeout_from / (ssil_fadeout_to - ssil_fadeout_from) + 1.0; ssil.gather_push_constant.inv_radius_near_limit = 1.0f / radius_near_limit; ssil.gather_push_constant.neg_inv_radius = -1.0 / ssil.gather_push_constant.radius; ssil.gather_push_constant.normal_rejection_amount = p_settings.normal_rejection; ssil.gather_push_constant.load_counter_avg_div = 9.0 / float((p_ssil_buffers.half_buffer_width) * (p_ssil_buffers.half_buffer_height) * 255); - ssil.gather_push_constant.adaptive_sample_limit = p_settings.adaptive_target; + ssil.gather_push_constant.adaptive_sample_limit = ssil_adaptive_target; - ssil.gather_push_constant.quality = MAX(0, p_settings.quality - 1); - ssil.gather_push_constant.size_multiplier = p_settings.half_size ? 2 : 1; + ssil.gather_push_constant.quality = MAX(0, ssil_quality - 1); + ssil.gather_push_constant.size_multiplier = ssil_half_size ? 2 : 1; if (p_ssil_buffers.projection_uniform_set.is_null()) { Vector<RD::Uniform> uniforms; @@ -800,7 +823,7 @@ void SSEffects::screen_space_indirect_lighting(SSILRenderBuffers &p_ssil_buffers p_ssil_buffers.importance_map_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, ssil.gather_shader.version_get_shader(ssil.gather_shader_version, 2), 1); } - if (p_settings.quality == RS::ENV_SSIL_QUALITY_ULTRA) { + if (ssil_quality == RS::ENV_SSIL_QUALITY_ULTRA) { RD::get_singleton()->draw_command_begin_label("Generate Importance Map"); ssil.importance_map_push_constant.half_screen_pixel_size[0] = 1.0 / p_ssil_buffers.buffer_width; ssil.importance_map_push_constant.half_screen_pixel_size[1] = 1.0 / p_ssil_buffers.buffer_height; @@ -859,13 +882,13 @@ void SSEffects::screen_space_indirect_lighting(SSILRenderBuffers &p_ssil_buffers ssil.blur_push_constant.half_screen_pixel_size[0] = 1.0 / p_ssil_buffers.buffer_width; ssil.blur_push_constant.half_screen_pixel_size[1] = 1.0 / p_ssil_buffers.buffer_height; - int blur_passes = p_settings.quality > RS::ENV_SSIL_QUALITY_VERY_LOW ? p_settings.blur_passes : 1; + int blur_passes = ssil_quality > RS::ENV_SSIL_QUALITY_VERY_LOW ? ssil_blur_passes : 1; shader = ssil.blur_shader.version_get_shader(ssil.blur_shader_version, 0); for (int pass = 0; pass < blur_passes; pass++) { int blur_pipeline = SSIL_BLUR_PASS; - if (p_settings.quality > RS::ENV_SSIL_QUALITY_VERY_LOW) { + if (ssil_quality > RS::ENV_SSIL_QUALITY_VERY_LOW) { blur_pipeline = SSIL_BLUR_PASS_SMART; if (pass < blur_passes - 2) { blur_pipeline = SSIL_BLUR_PASS_WIDE; @@ -873,13 +896,13 @@ void SSEffects::screen_space_indirect_lighting(SSILRenderBuffers &p_ssil_buffers } for (int i = 0; i < 4; i++) { - if ((p_settings.quality == RS::ENV_SSIL_QUALITY_VERY_LOW) && ((i == 1) || (i == 2))) { + if ((ssil_quality == RS::ENV_SSIL_QUALITY_VERY_LOW) && ((i == 1) || (i == 2))) { continue; } RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssil.pipelines[blur_pipeline]); if (pass % 2 == 0) { - if (p_settings.quality == RS::ENV_SSIL_QUALITY_VERY_LOW) { + if (ssil_quality == RS::ENV_SSIL_QUALITY_VERY_LOW) { RD::Uniform u_ssil_slice(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssil_buffers.deinterleaved_slices[i] })); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_ssil_slice), 0); } else { @@ -890,7 +913,7 @@ void SSEffects::screen_space_indirect_lighting(SSILRenderBuffers &p_ssil_buffers RD::Uniform u_ssil_pong_slice(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssil_buffers.pong_slices[i] })); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_ssil_pong_slice), 1); } else { - if (p_settings.quality == RS::ENV_SSIL_QUALITY_VERY_LOW) { + if (ssil_quality == RS::ENV_SSIL_QUALITY_VERY_LOW) { RD::Uniform u_ssil_pong_slice(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssil_buffers.pong_slices[i] })); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_ssil_pong_slice), 0); } else { @@ -907,11 +930,11 @@ void SSEffects::screen_space_indirect_lighting(SSILRenderBuffers &p_ssil_buffers RD::get_singleton()->compute_list_set_push_constant(compute_list, &ssil.blur_push_constant, sizeof(SSILBlurPushConstant)); - int x_groups = (p_settings.full_screen_size.x >> (p_settings.half_size ? 2 : 1)); - int y_groups = (p_settings.full_screen_size.y >> (p_settings.half_size ? 2 : 1)); + int x_groups = (p_settings.full_screen_size.x >> (ssil_half_size ? 2 : 1)); + int y_groups = (p_settings.full_screen_size.y >> (ssil_half_size ? 2 : 1)); RD::get_singleton()->compute_list_dispatch_threads(compute_list, x_groups, y_groups, 1); - if (p_settings.quality > RS::ENV_SSIL_QUALITY_VERY_LOW) { + if (ssil_quality > RS::ENV_SSIL_QUALITY_VERY_LOW) { RD::get_singleton()->compute_list_add_barrier(compute_list); } } @@ -925,12 +948,12 @@ void SSEffects::screen_space_indirect_lighting(SSILRenderBuffers &p_ssil_buffers ssil.interleave_push_constant.inv_sharpness = 1.0 - p_settings.sharpness; ssil.interleave_push_constant.pixel_size[0] = 1.0 / p_settings.full_screen_size.x; ssil.interleave_push_constant.pixel_size[1] = 1.0 / p_settings.full_screen_size.y; - ssil.interleave_push_constant.size_modifier = uint32_t(p_settings.half_size ? 4 : 2); + ssil.interleave_push_constant.size_modifier = uint32_t(ssil_half_size ? 4 : 2); int interleave_pipeline = SSIL_INTERLEAVE_HALF; - if (p_settings.quality == RS::ENV_SSIL_QUALITY_LOW) { + if (ssil_quality == RS::ENV_SSIL_QUALITY_LOW) { interleave_pipeline = SSIL_INTERLEAVE; - } else if (p_settings.quality >= RS::ENV_SSIL_QUALITY_MEDIUM) { + } else if (ssil_quality >= RS::ENV_SSIL_QUALITY_MEDIUM) { interleave_pipeline = SSIL_INTERLEAVE_SMART; } @@ -941,7 +964,7 @@ void SSEffects::screen_space_indirect_lighting(SSILRenderBuffers &p_ssil_buffers RD::Uniform u_destination(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssil_buffers.ssil_final })); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_destination), 0); - if (p_settings.quality > RS::ENV_SSIL_QUALITY_VERY_LOW && p_settings.blur_passes % 2 == 0) { + if (ssil_quality > RS::ENV_SSIL_QUALITY_VERY_LOW && ssil_blur_passes % 2 == 0) { RD::Uniform u_ssil(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssil_buffers.deinterleaved })); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_ssil), 1); } else { @@ -997,19 +1020,28 @@ void SSEffects::ssil_free(SSILRenderBuffers &p_ssil_buffers) { /* SSAO */ +void SSEffects::ssao_set_quality(RS::EnvironmentSSAOQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) { + ssao_quality = p_quality; + ssao_half_size = p_half_size; + ssao_adaptive_target = p_adaptive_target; + ssao_blur_passes = p_blur_passes; + ssao_fadeout_from = p_fadeout_from; + ssao_fadeout_to = p_fadeout_to; +} + void SSEffects::gather_ssao(RD::ComputeListID p_compute_list, const Vector<RID> p_ao_slices, const SSAOSettings &p_settings, bool p_adaptive_base_pass, RID p_gather_uniform_set, RID p_importance_map_uniform_set) { UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton(); ERR_FAIL_NULL(uniform_set_cache); RD::get_singleton()->compute_list_bind_uniform_set(p_compute_list, p_gather_uniform_set, 0); - if ((p_settings.quality == RS::ENV_SSAO_QUALITY_ULTRA) && !p_adaptive_base_pass) { + if ((ssao_quality == RS::ENV_SSAO_QUALITY_ULTRA) && !p_adaptive_base_pass) { RD::get_singleton()->compute_list_bind_uniform_set(p_compute_list, p_importance_map_uniform_set, 0); } RID shader = ssao.gather_shader.version_get_shader(ssao.gather_shader_version, 1); // for (int i = 0; i < 4; i++) { - if ((p_settings.quality == RS::ENV_SSAO_QUALITY_VERY_LOW) && ((i == 1) || (i == 2))) { + if ((ssao_quality == RS::ENV_SSAO_QUALITY_VERY_LOW) && ((i == 1) || (i == 2))) { continue; } @@ -1023,7 +1055,7 @@ void SSEffects::gather_ssao(RD::ComputeListID p_compute_list, const Vector<RID> RD::get_singleton()->compute_list_bind_uniform_set(p_compute_list, uniform_set_cache->get_cache(shader, 2, u_ao_slice), 2); RD::get_singleton()->compute_list_set_push_constant(p_compute_list, &ssao.gather_push_constant, sizeof(SSAOGatherPushConstant)); - Size2i size = Size2i(p_settings.full_screen_size.x >> (p_settings.half_size ? 2 : 1), p_settings.full_screen_size.y >> (p_settings.half_size ? 2 : 1)); + Size2i size = Size2i(p_settings.full_screen_size.x >> (ssao_half_size ? 2 : 1), p_settings.full_screen_size.y >> (ssao_half_size ? 2 : 1)); RD::get_singleton()->compute_list_dispatch_threads(p_compute_list, size.x, size.y, 1); } @@ -1031,11 +1063,11 @@ void SSEffects::gather_ssao(RD::ComputeListID p_compute_list, const Vector<RID> } void SSEffects::ssao_allocate_buffers(SSAORenderBuffers &p_ssao_buffers, const SSAOSettings &p_settings, RID p_linear_depth) { - if (p_ssao_buffers.half_size != p_settings.half_size) { + if (p_ssao_buffers.half_size != ssao_half_size) { ssao_free(p_ssao_buffers); } - if (p_settings.half_size) { + if (ssao_half_size) { p_ssao_buffers.buffer_width = (p_settings.full_screen_size.x + 3) / 4; p_ssao_buffers.buffer_height = (p_settings.full_screen_size.y + 3) / 4; p_ssao_buffers.half_buffer_width = (p_settings.full_screen_size.x + 7) / 8; @@ -1049,7 +1081,7 @@ void SSEffects::ssao_allocate_buffers(SSAORenderBuffers &p_ssao_buffers, const S if (p_ssao_buffers.ao_deinterleaved.is_null()) { { - p_ssao_buffers.depth_texture_view = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), p_linear_depth, 0, p_settings.half_size ? 1 : 0, 4, RD::TEXTURE_SLICE_2D_ARRAY); + p_ssao_buffers.depth_texture_view = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), p_linear_depth, 0, ssao_half_size ? 1 : 0, 4, RD::TEXTURE_SLICE_2D_ARRAY); } { RD::TextureFormat tf; @@ -1105,7 +1137,7 @@ void SSEffects::ssao_allocate_buffers(SSAORenderBuffers &p_ssao_buffers, const S p_ssao_buffers.ao_final = RD::get_singleton()->texture_create(tf, RD::TextureView()); RD::get_singleton()->set_resource_name(p_ssao_buffers.ao_final, "SSAO Final"); } - p_ssao_buffers.half_size = p_settings.half_size; + p_ssao_buffers.half_size = ssao_half_size; } } @@ -1145,10 +1177,10 @@ void SSEffects::generate_ssao(SSAORenderBuffers &p_ssao_buffers, RID p_normal_bu ssao.gather_push_constant.radius = p_settings.radius; float radius_near_limit = (p_settings.radius * 1.2f); - if (p_settings.quality <= RS::ENV_SSAO_QUALITY_LOW) { + if (ssao_quality <= RS::ENV_SSAO_QUALITY_LOW) { radius_near_limit *= 1.50f; - if (p_settings.quality == RS::ENV_SSAO_QUALITY_VERY_LOW) { + if (ssao_quality == RS::ENV_SSAO_QUALITY_VERY_LOW) { ssao.gather_push_constant.radius *= 0.8f; } } @@ -1156,18 +1188,18 @@ void SSEffects::generate_ssao(SSAORenderBuffers &p_ssao_buffers, RID p_normal_bu ssao.gather_push_constant.intensity = p_settings.intensity; ssao.gather_push_constant.shadow_power = p_settings.power; ssao.gather_push_constant.shadow_clamp = 0.98; - ssao.gather_push_constant.fade_out_mul = -1.0 / (p_settings.fadeout_to - p_settings.fadeout_from); - ssao.gather_push_constant.fade_out_add = p_settings.fadeout_from / (p_settings.fadeout_to - p_settings.fadeout_from) + 1.0; + ssao.gather_push_constant.fade_out_mul = -1.0 / (ssao_fadeout_to - ssao_fadeout_from); + ssao.gather_push_constant.fade_out_add = ssao_fadeout_from / (ssao_fadeout_to - ssao_fadeout_from) + 1.0; ssao.gather_push_constant.horizon_angle_threshold = p_settings.horizon; ssao.gather_push_constant.inv_radius_near_limit = 1.0f / radius_near_limit; ssao.gather_push_constant.neg_inv_radius = -1.0 / ssao.gather_push_constant.radius; ssao.gather_push_constant.load_counter_avg_div = 9.0 / float((p_ssao_buffers.half_buffer_width) * (p_ssao_buffers.half_buffer_height) * 255); - ssao.gather_push_constant.adaptive_sample_limit = p_settings.adaptive_target; + ssao.gather_push_constant.adaptive_sample_limit = ssao_adaptive_target; ssao.gather_push_constant.detail_intensity = p_settings.detail; - ssao.gather_push_constant.quality = MAX(0, p_settings.quality - 1); - ssao.gather_push_constant.size_multiplier = p_settings.half_size ? 2 : 1; + ssao.gather_push_constant.quality = MAX(0, ssao_quality - 1); + ssao.gather_push_constant.size_multiplier = ssao_half_size ? 2 : 1; if (p_ssao_buffers.gather_uniform_set.is_null()) { Vector<RD::Uniform> uniforms; @@ -1225,7 +1257,7 @@ void SSEffects::generate_ssao(SSAORenderBuffers &p_ssao_buffers, RID p_normal_bu RD::get_singleton()->set_resource_name(p_ssao_buffers.importance_map_uniform_set, "SSAO Importance Map Uniform Set"); } - if (p_settings.quality == RS::ENV_SSAO_QUALITY_ULTRA) { + if (ssao_quality == RS::ENV_SSAO_QUALITY_ULTRA) { RD::get_singleton()->draw_command_begin_label("Generate Importance Map"); ssao.importance_map_push_constant.half_screen_pixel_size[0] = 1.0 / p_ssao_buffers.buffer_width; ssao.importance_map_push_constant.half_screen_pixel_size[1] = 1.0 / p_ssao_buffers.buffer_height; @@ -1293,13 +1325,13 @@ void SSEffects::generate_ssao(SSAORenderBuffers &p_ssao_buffers, RID p_normal_bu ssao.blur_push_constant.half_screen_pixel_size[0] = 1.0 / p_ssao_buffers.buffer_width; ssao.blur_push_constant.half_screen_pixel_size[1] = 1.0 / p_ssao_buffers.buffer_height; - int blur_passes = p_settings.quality > RS::ENV_SSAO_QUALITY_VERY_LOW ? p_settings.blur_passes : 1; + int blur_passes = ssao_quality > RS::ENV_SSAO_QUALITY_VERY_LOW ? ssao_blur_passes : 1; shader = ssao.blur_shader.version_get_shader(ssao.blur_shader_version, 0); for (int pass = 0; pass < blur_passes; pass++) { int blur_pipeline = SSAO_BLUR_PASS; - if (p_settings.quality > RS::ENV_SSAO_QUALITY_VERY_LOW) { + if (ssao_quality > RS::ENV_SSAO_QUALITY_VERY_LOW) { blur_pipeline = SSAO_BLUR_PASS_SMART; if (pass < blur_passes - 2) { blur_pipeline = SSAO_BLUR_PASS_WIDE; @@ -1309,13 +1341,13 @@ void SSEffects::generate_ssao(SSAORenderBuffers &p_ssao_buffers, RID p_normal_bu } for (int i = 0; i < 4; i++) { - if ((p_settings.quality == RS::ENV_SSAO_QUALITY_VERY_LOW) && ((i == 1) || (i == 2))) { + if ((ssao_quality == RS::ENV_SSAO_QUALITY_VERY_LOW) && ((i == 1) || (i == 2))) { continue; } RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssao.pipelines[blur_pipeline]); if (pass % 2 == 0) { - if (p_settings.quality == RS::ENV_SSAO_QUALITY_VERY_LOW) { + if (ssao_quality == RS::ENV_SSAO_QUALITY_VERY_LOW) { RD::Uniform u_ao_slices_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssao_buffers.ao_deinterleaved_slices[i] })); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_ao_slices_with_sampler), 0); } else { @@ -1326,7 +1358,7 @@ void SSEffects::generate_ssao(SSAORenderBuffers &p_ssao_buffers, RID p_normal_bu RD::Uniform u_ao_pong_slices(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssao_buffers.ao_pong_slices[i] })); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_ao_pong_slices), 1); } else { - if (p_settings.quality == RS::ENV_SSAO_QUALITY_VERY_LOW) { + if (ssao_quality == RS::ENV_SSAO_QUALITY_VERY_LOW) { RD::Uniform u_ao_pong_slices_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssao_buffers.ao_pong_slices[i] })); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_ao_pong_slices_with_sampler), 0); } else { @@ -1339,11 +1371,11 @@ void SSEffects::generate_ssao(SSAORenderBuffers &p_ssao_buffers, RID p_normal_bu } RD::get_singleton()->compute_list_set_push_constant(compute_list, &ssao.blur_push_constant, sizeof(SSAOBlurPushConstant)); - Size2i size(p_settings.full_screen_size.x >> (p_settings.half_size ? 2 : 1), p_settings.full_screen_size.y >> (p_settings.half_size ? 2 : 1)); + Size2i size(p_settings.full_screen_size.x >> (ssao_half_size ? 2 : 1), p_settings.full_screen_size.y >> (ssao_half_size ? 2 : 1)); RD::get_singleton()->compute_list_dispatch_threads(compute_list, size.x, size.y, 1); } - if (p_settings.quality > RS::ENV_SSAO_QUALITY_VERY_LOW) { + if (ssao_quality > RS::ENV_SSAO_QUALITY_VERY_LOW) { RD::get_singleton()->compute_list_add_barrier(compute_list); } } @@ -1358,14 +1390,14 @@ void SSEffects::generate_ssao(SSAORenderBuffers &p_ssao_buffers, RID p_normal_bu ssao.interleave_push_constant.inv_sharpness = 1.0 - p_settings.sharpness; ssao.interleave_push_constant.pixel_size[0] = 1.0 / p_settings.full_screen_size.x; ssao.interleave_push_constant.pixel_size[1] = 1.0 / p_settings.full_screen_size.y; - ssao.interleave_push_constant.size_modifier = uint32_t(p_settings.half_size ? 4 : 2); + ssao.interleave_push_constant.size_modifier = uint32_t(ssao_half_size ? 4 : 2); shader = ssao.interleave_shader.version_get_shader(ssao.interleave_shader_version, 0); int interleave_pipeline = SSAO_INTERLEAVE_HALF; - if (p_settings.quality == RS::ENV_SSAO_QUALITY_LOW) { + if (ssao_quality == RS::ENV_SSAO_QUALITY_LOW) { interleave_pipeline = SSAO_INTERLEAVE; - } else if (p_settings.quality >= RS::ENV_SSAO_QUALITY_MEDIUM) { + } else if (ssao_quality >= RS::ENV_SSAO_QUALITY_MEDIUM) { interleave_pipeline = SSAO_INTERLEAVE_SMART; } @@ -1374,7 +1406,7 @@ void SSEffects::generate_ssao(SSAORenderBuffers &p_ssao_buffers, RID p_normal_bu RD::Uniform u_upscale_buffer(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssao_buffers.ao_final })); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_upscale_buffer), 0); - if (p_settings.quality > RS::ENV_SSAO_QUALITY_VERY_LOW && p_settings.blur_passes % 2 == 0) { + if (ssao_quality > RS::ENV_SSAO_QUALITY_VERY_LOW && ssao_blur_passes % 2 == 0) { RD::Uniform u_ao(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssao_buffers.ao_deinterleaved })); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_ao), 1); } else { @@ -1419,7 +1451,11 @@ void SSEffects::ssao_free(SSAORenderBuffers &p_ssao_buffers) { /* Screen Space Reflection */ -void SSEffects::ssr_allocate_buffers(SSRRenderBuffers &p_ssr_buffers, const RenderingDevice::DataFormat p_color_format, RenderingServer::EnvironmentSSRRoughnessQuality p_roughness_quality, const Size2i &p_screen_size, const uint32_t p_view_count) { +void SSEffects::ssr_set_roughness_quality(RS::EnvironmentSSRRoughnessQuality p_quality) { + ssr_roughness_quality = p_quality; +} + +void SSEffects::ssr_allocate_buffers(SSRRenderBuffers &p_ssr_buffers, const RenderingDevice::DataFormat p_color_format, const Size2i &p_screen_size, const uint32_t p_view_count) { // As we are processing one view at a time, we can reuse buffers, only our output needs to have layers for each view. if (p_ssr_buffers.depth_scaled.is_null()) { @@ -1440,7 +1476,7 @@ void SSEffects::ssr_allocate_buffers(SSRRenderBuffers &p_ssr_buffers, const Rend RD::get_singleton()->set_resource_name(p_ssr_buffers.normal_scaled, "SSR Normal Scaled"); } - if (p_roughness_quality != RS::ENV_SSR_ROUGHNESS_QUALITY_DISABLED && !p_ssr_buffers.blur_radius[0].is_valid()) { + if (ssr_roughness_quality != RS::ENV_SSR_ROUGHNESS_QUALITY_DISABLED && !p_ssr_buffers.blur_radius[0].is_valid()) { RD::TextureFormat tf; tf.format = RD::DATA_FORMAT_R8_UNORM; tf.width = p_screen_size.x; @@ -1484,7 +1520,7 @@ void SSEffects::ssr_allocate_buffers(SSRRenderBuffers &p_ssr_buffers, const Rend } } -void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const RID *p_diffuse_slices, const RID *p_normal_roughness_slices, RenderingServer::EnvironmentSSRRoughnessQuality p_roughness_quality, const RID *p_metallic_slices, const Color &p_metallic_mask, const RID *p_depth_slices, const Size2i &p_screen_size, int p_max_steps, float p_fade_in, float p_fade_out, float p_tolerance, const uint32_t p_view_count, const Projection *p_projections, const Vector3 *p_eye_offsets) { +void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const RID *p_diffuse_slices, const RID *p_normal_roughness_slices, const RID *p_metallic_slices, const RID *p_depth_slices, const Size2i &p_screen_size, int p_max_steps, float p_fade_in, float p_fade_out, float p_tolerance, const uint32_t p_view_count, const Projection *p_projections, const Vector3 *p_eye_offsets) { UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton(); ERR_FAIL_NULL(uniform_set_cache); MaterialStorage *material_storage = MaterialStorage::get_singleton(); @@ -1579,12 +1615,8 @@ void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const R push_constant.proj_info[1] = -2.0f / (p_screen_size.height * p_projections[v].matrix[1][1]); push_constant.proj_info[2] = (1.0f - p_projections[v].matrix[0][2]) / p_projections[v].matrix[0][0]; push_constant.proj_info[3] = (1.0f + p_projections[v].matrix[1][2]) / p_projections[v].matrix[1][1]; - push_constant.metallic_mask[0] = CLAMP(p_metallic_mask.r * 255.0, 0, 255); - push_constant.metallic_mask[1] = CLAMP(p_metallic_mask.g * 255.0, 0, 255); - push_constant.metallic_mask[2] = CLAMP(p_metallic_mask.b * 255.0, 0, 255); - push_constant.metallic_mask[3] = CLAMP(p_metallic_mask.a * 255.0, 0, 255); - ScreenSpaceReflectionMode mode = (p_roughness_quality != RS::ENV_SSR_ROUGHNESS_QUALITY_DISABLED) ? SCREEN_SPACE_REFLECTION_ROUGH : SCREEN_SPACE_REFLECTION_NORMAL; + ScreenSpaceReflectionMode mode = (ssr_roughness_quality != RS::ENV_SSR_ROUGHNESS_QUALITY_DISABLED) ? SCREEN_SPACE_REFLECTION_ROUGH : SCREEN_SPACE_REFLECTION_NORMAL; RID shader = ssr.shader.version_get_shader(ssr.shader_version, mode); RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssr.pipelines[pipeline_specialization][mode]); @@ -1596,7 +1628,7 @@ void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const R RD::Uniform u_scale_depth(RD::UNIFORM_TYPE_IMAGE, 1, Vector<RID>({ p_ssr_buffers.depth_scaled })); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_output_blur, u_scale_depth), 0); - if (p_roughness_quality != RS::ENV_SSR_ROUGHNESS_QUALITY_DISABLED) { + if (ssr_roughness_quality != RS::ENV_SSR_ROUGHNESS_QUALITY_DISABLED) { RD::Uniform u_intermediate(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssr_buffers.intermediate })); RD::Uniform u_blur_radius(RD::UNIFORM_TYPE_IMAGE, 1, Vector<RID>({ p_ssr_buffers.blur_radius[0] })); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_intermediate, u_blur_radius), 1); @@ -1617,7 +1649,7 @@ void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const R RD::get_singleton()->draw_command_end_label(); } - if (p_roughness_quality != RS::ENV_SSR_ROUGHNESS_QUALITY_DISABLED) { + if (ssr_roughness_quality != RS::ENV_SSR_ROUGHNESS_QUALITY_DISABLED) { RD::get_singleton()->draw_command_begin_label("SSR filter"); //blur @@ -1632,10 +1664,10 @@ void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const R push_constant.proj_info[2] = (1.0f - p_projections[v].matrix[0][2]) / p_projections[v].matrix[0][0]; push_constant.proj_info[3] = (1.0f + p_projections[v].matrix[1][2]) / p_projections[v].matrix[1][1]; push_constant.vertical = 0; - if (p_roughness_quality == RS::ENV_SSR_ROUGHNESS_QUALITY_LOW) { + if (ssr_roughness_quality == RS::ENV_SSR_ROUGHNESS_QUALITY_LOW) { push_constant.steps = p_max_steps / 3; push_constant.increment = 3; - } else if (p_roughness_quality == RS::ENV_SSR_ROUGHNESS_QUALITY_MEDIUM) { + } else if (ssr_roughness_quality == RS::ENV_SSR_ROUGHNESS_QUALITY_MEDIUM) { push_constant.steps = p_max_steps / 2; push_constant.increment = 2; } else { @@ -1738,7 +1770,20 @@ void SSEffects::ssr_free(SSRRenderBuffers &p_ssr_buffers) { /* Subsurface scattering */ -void SSEffects::sub_surface_scattering(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_diffuse, RID p_depth, const Projection &p_camera, const Size2i &p_screen_size, float p_scale, float p_depth_scale, RenderingServer::SubSurfaceScatteringQuality p_quality) { +void SSEffects::sss_set_quality(RS::SubSurfaceScatteringQuality p_quality) { + sss_quality = p_quality; +} + +RS::SubSurfaceScatteringQuality SSEffects::sss_get_quality() const { + return sss_quality; +} + +void SSEffects::sss_set_scale(float p_scale, float p_depth_scale) { + sss_scale = p_scale; + sss_depth_scale = p_depth_scale; +} + +void SSEffects::sub_surface_scattering(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_diffuse, RID p_depth, const Projection &p_camera, const Size2i &p_screen_size) { UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton(); ERR_FAIL_NULL(uniform_set_cache); MaterialStorage *material_storage = MaterialStorage::get_singleton(); @@ -1767,11 +1812,11 @@ void SSEffects::sub_surface_scattering(Ref<RenderSceneBuffersRD> p_render_buffer sss.push_constant.screen_size[0] = p_screen_size.x; sss.push_constant.screen_size[1] = p_screen_size.y; sss.push_constant.vertical = false; - sss.push_constant.scale = p_scale; - sss.push_constant.depth_scale = p_depth_scale; + sss.push_constant.scale = sss_scale; + sss.push_constant.depth_scale = sss_depth_scale; - RID shader = sss.shader.version_get_shader(sss.shader_version, p_quality - 1); - RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, sss.pipelines[p_quality - 1]); + RID shader = sss.shader.version_get_shader(sss.shader_version, sss_quality - 1); + RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, sss.pipelines[sss_quality - 1]); RD::Uniform u_diffuse_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_diffuse })); RD::Uniform u_diffuse(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_diffuse })); diff --git a/servers/rendering/renderer_rd/effects/ss_effects.h b/servers/rendering/renderer_rd/effects/ss_effects.h index a60f3a48ab..7c264b4d76 100644 --- a/servers/rendering/renderer_rd/effects/ss_effects.h +++ b/servers/rendering/renderer_rd/effects/ss_effects.h @@ -64,9 +64,10 @@ public: /* SS Downsampler */ - void downsample_depth(RID p_depth_buffer, const Vector<RID> &p_depth_mipmaps, RS::EnvironmentSSAOQuality p_ssao_quality, RS::EnvironmentSSILQuality p_ssil_quality, bool p_invalidate_uniform_set, bool p_ssao_half_size, bool p_ssil_half_size, Size2i p_full_screen_size, const Projection &p_projection); + void downsample_depth(RID p_depth_buffer, const Vector<RID> &p_depth_mipmaps, bool p_invalidate_uniform_set, Size2i p_full_screen_size, const Projection &p_projection); /* SSIL */ + void ssil_set_quality(RS::EnvironmentSSILQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to); struct SSILRenderBuffers { bool half_size = false; @@ -99,13 +100,6 @@ public: float sharpness = 0.98; float normal_rejection = 1.0; - RS::EnvironmentSSILQuality quality = RS::ENV_SSIL_QUALITY_MEDIUM; - bool half_size = true; - float adaptive_target = 0.5; - int blur_passes = 4; - float fadeout_from = 50.0; - float fadeout_to = 300.0; - Size2i full_screen_size = Size2i(); }; @@ -114,6 +108,7 @@ public: void ssil_free(SSILRenderBuffers &p_ssil_buffers); /* SSAO */ + void ssao_set_quality(RS::EnvironmentSSAOQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to); struct SSAORenderBuffers { bool half_size = false; @@ -142,13 +137,6 @@ public: float horizon = 0.06; float sharpness = 0.98; - RS::EnvironmentSSAOQuality quality = RS::ENV_SSAO_QUALITY_MEDIUM; - bool half_size = false; - float adaptive_target = 0.5; - int blur_passes = 2; - float fadeout_from = 50.0; - float fadeout_to = 300.0; - Size2i full_screen_size = Size2i(); }; @@ -157,6 +145,7 @@ public: void ssao_free(SSAORenderBuffers &p_ssao_buffers); /* Screen Space Reflection */ + void ssr_set_roughness_quality(RS::EnvironmentSSRRoughnessQuality p_quality); struct SSRRenderBuffers { RID normal_scaled; @@ -167,14 +156,40 @@ public: RID output_slices[RendererSceneRender::MAX_RENDER_VIEWS]; }; - void ssr_allocate_buffers(SSRRenderBuffers &p_ssr_buffers, const RenderingDevice::DataFormat p_color_format, RenderingServer::EnvironmentSSRRoughnessQuality p_roughness_quality, const Size2i &p_screen_size, const uint32_t p_view_count); - void screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const RID *p_diffuse_slices, const RID *p_normal_roughness_slices, RS::EnvironmentSSRRoughnessQuality p_roughness_quality, const RID *p_metallic_slices, const Color &p_metallic_mask, const RID *p_depth_slices, const Size2i &p_screen_size, int p_max_steps, float p_fade_in, float p_fade_out, float p_tolerance, const uint32_t p_view_count, const Projection *p_projections, const Vector3 *p_eye_offsets); + void ssr_allocate_buffers(SSRRenderBuffers &p_ssr_buffers, const RenderingDevice::DataFormat p_color_format, const Size2i &p_screen_size, const uint32_t p_view_count); + void screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const RID *p_diffuse_slices, const RID *p_normal_roughness_slices, const RID *p_metallic_slices, const RID *p_depth_slices, const Size2i &p_screen_size, int p_max_steps, float p_fade_in, float p_fade_out, float p_tolerance, const uint32_t p_view_count, const Projection *p_projections, const Vector3 *p_eye_offsets); void ssr_free(SSRRenderBuffers &p_ssr_buffers); /* subsurface scattering */ - void sub_surface_scattering(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_diffuse, RID p_depth, const Projection &p_camera, const Size2i &p_screen_size, float p_scale, float p_depth_scale, RS::SubSurfaceScatteringQuality p_quality); + void sss_set_quality(RS::SubSurfaceScatteringQuality p_quality); + RS::SubSurfaceScatteringQuality sss_get_quality() const; + void sss_set_scale(float p_scale, float p_depth_scale); + + void sub_surface_scattering(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_diffuse, RID p_depth, const Projection &p_camera, const Size2i &p_screen_size); private: + /* Settings */ + + RS::EnvironmentSSAOQuality ssao_quality = RS::ENV_SSAO_QUALITY_MEDIUM; + bool ssao_half_size = false; + float ssao_adaptive_target = 0.5; + int ssao_blur_passes = 2; + float ssao_fadeout_from = 50.0; + float ssao_fadeout_to = 300.0; + + RS::EnvironmentSSILQuality ssil_quality = RS::ENV_SSIL_QUALITY_MEDIUM; + bool ssil_half_size = false; + float ssil_adaptive_target = 0.5; + int ssil_blur_passes = 4; + float ssil_fadeout_from = 50.0; + float ssil_fadeout_to = 300.0; + + RS::EnvironmentSSRRoughnessQuality ssr_roughness_quality = RS::ENV_SSR_ROUGHNESS_QUALITY_LOW; + + RS::SubSurfaceScatteringQuality sss_quality = RS::SUB_SURFACE_SCATTERING_QUALITY_MEDIUM; + float sss_scale = 0.05; + float sss_depth_scale = 0.01; + /* SS Downsampler */ struct SSEffectsDownsamplePushConstant { @@ -465,10 +480,7 @@ private: uint32_t orthogonal; // 4 - 52 float filter_mipmap_levels; // 4 - 56 uint32_t use_half_res; // 4 - 60 - uint8_t metallic_mask[4]; // 4 - 64 - - uint32_t view_index; // 4 - 68 - uint32_t pad[3]; // 12 - 80 + uint32_t view_index; // 4 - 64 // float projection[16]; // this is in our ScreenSpaceReflectionSceneData now }; diff --git a/servers/rendering/renderer_rd/environment/fog.cpp b/servers/rendering/renderer_rd/environment/fog.cpp index a41552cd5c..4c72f0a56e 100644 --- a/servers/rendering/renderer_rd/environment/fog.cpp +++ b/servers/rendering/renderer_rd/environment/fog.cpp @@ -57,12 +57,19 @@ void Fog::fog_volume_initialize(RID p_rid) { fog_volume_owner.initialize_rid(p_rid, FogVolume()); } -void Fog::fog_free(RID p_rid) { +void Fog::fog_volume_free(RID p_rid) { FogVolume *fog_volume = fog_volume_owner.get_or_null(p_rid); fog_volume->dependency.deleted_notify(p_rid); fog_volume_owner.free(p_rid); } +Dependency *Fog::fog_volume_get_dependency(RID p_fog_volume) const { + FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume); + ERR_FAIL_NULL_V(fog_volume, nullptr); + + return &fog_volume->dependency; +} + void Fog::fog_volume_set_shape(RID p_fog_volume, RS::FogVolumeShape p_shape) { FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume); ERR_FAIL_COND(!fog_volume); @@ -122,8 +129,6 @@ AABB Fog::fog_volume_get_aabb(RID p_fog_volume) const { return AABB(Vector3(-1, -1, -1), Vector3(2, 2, 2)); } } - - return AABB(); } Vector3 Fog::fog_volume_get_extents(RID p_fog_volume) const { diff --git a/servers/rendering/renderer_rd/environment/fog.h b/servers/rendering/renderer_rd/environment/fog.h index 9ecd5699dc..0ade995758 100644 --- a/servers/rendering/renderer_rd/environment/fog.h +++ b/servers/rendering/renderer_rd/environment/fog.h @@ -46,7 +46,9 @@ namespace RendererRD { class Fog : public RendererFog { -public: +private: + static Fog *singleton; + /* FOG VOLUMES */ struct FogVolume { @@ -58,16 +60,14 @@ public: Dependency dependency; }; + mutable RID_Owner<FogVolume, true> fog_volume_owner; + struct FogVolumeInstance { RID volume; Transform3D transform; bool active = false; }; -private: - static Fog *singleton; - - mutable RID_Owner<FogVolume, true> fog_volume_owner; mutable RID_Owner<FogVolumeInstance> fog_volume_instance_owner; /* Volumetric Fog */ @@ -240,12 +240,12 @@ public: /* FOG VOLUMES */ - FogVolume *get_fog_volume(RID p_rid) { return fog_volume_owner.get_or_null(p_rid); }; bool owns_fog_volume(RID p_rid) { return fog_volume_owner.owns(p_rid); }; virtual RID fog_volume_allocate() override; virtual void fog_volume_initialize(RID p_rid) override; - virtual void fog_free(RID p_rid) override; + virtual void fog_volume_free(RID p_rid) override; + Dependency *fog_volume_get_dependency(RID p_fog_volume) const; virtual void fog_volume_set_shape(RID p_fog_volume, RS::FogVolumeShape p_shape) override; virtual void fog_volume_set_extents(RID p_fog_volume, const Vector3 &p_extents) override; @@ -257,12 +257,35 @@ public: /* FOG VOLUMES INSTANCE */ - FogVolumeInstance *get_fog_volume_instance(RID p_rid) { return fog_volume_instance_owner.get_or_null(p_rid); }; bool owns_fog_volume_instance(RID p_rid) { return fog_volume_instance_owner.owns(p_rid); }; RID fog_volume_instance_create(RID p_fog_volume); void fog_instance_free(RID p_rid); + void fog_volume_instance_set_transform(RID p_fog_volume_instance, const Transform3D &p_transform) { + Fog::FogVolumeInstance *fvi = fog_volume_instance_owner.get_or_null(p_fog_volume_instance); + ERR_FAIL_COND(!fvi); + fvi->transform = p_transform; + } + + void fog_volume_instance_set_active(RID p_fog_volume_instance, bool p_active) { + Fog::FogVolumeInstance *fvi = fog_volume_instance_owner.get_or_null(p_fog_volume_instance); + ERR_FAIL_COND(!fvi); + fvi->active = p_active; + } + + RID fog_volume_instance_get_volume(RID p_fog_volume_instance) const { + Fog::FogVolumeInstance *fvi = fog_volume_instance_owner.get_or_null(p_fog_volume_instance); + ERR_FAIL_COND_V(!fvi, RID()); + return fvi->volume; + } + + Vector3 fog_volume_instance_get_position(RID p_fog_volume_instance) const { + Fog::FogVolumeInstance *fvi = fog_volume_instance_owner.get_or_null(p_fog_volume_instance); + ERR_FAIL_COND_V(!fvi, Vector3()); + return fvi->transform.get_origin(); + } + /* Volumetric FOG */ class VolumetricFog : public RenderBufferCustomDataRD { GDCLASS(VolumetricFog, RenderBufferCustomDataRD) diff --git a/servers/rendering/renderer_rd/environment/gi.cpp b/servers/rendering/renderer_rd/environment/gi.cpp index ced0f6380f..0853460861 100644 --- a/servers/rendering/renderer_rd/environment/gi.cpp +++ b/servers/rendering/renderer_rd/environment/gi.cpp @@ -1798,7 +1798,8 @@ void GI::SDFGI::debug_probes(RID p_framebuffer, const uint32_t p_view_count, con RD::get_singleton()->draw_list_end(); } -void GI::SDFGI::pre_process_gi(const Transform3D &p_transform, RenderDataRD *p_render_data, RendererSceneRenderRD *p_scene_render) { +void GI::SDFGI::pre_process_gi(const Transform3D &p_transform, RenderDataRD *p_render_data) { + RendererRD::LightStorage *light_storage = RendererRD::LightStorage::get_singleton(); /* Update general SDFGI Buffer */ SDFGIData sdfgi_data; @@ -1881,40 +1882,43 @@ void GI::SDFGI::pre_process_gi(const Transform3D &p_transform, RenderDataRD *p_r SDFGIShader::Light lights[SDFGI::MAX_DYNAMIC_LIGHTS]; uint32_t idx = 0; - for (uint32_t j = 0; j < (uint32_t)p_scene_render->render_state.sdfgi_update_data->directional_lights->size(); j++) { + for (uint32_t j = 0; j < (uint32_t)p_render_data->sdfgi_update_data->directional_lights->size(); j++) { if (idx == SDFGI::MAX_DYNAMIC_LIGHTS) { break; } - RendererSceneRenderRD::LightInstance *li = p_scene_render->light_instance_owner.get_or_null(p_scene_render->render_state.sdfgi_update_data->directional_lights->get(j)); - ERR_CONTINUE(!li); + RID light_instance = p_render_data->sdfgi_update_data->directional_lights->get(j); + ERR_CONTINUE(!light_storage->owns_light_instance(light_instance)); - if (RSG::light_storage->light_directional_get_sky_mode(li->light) == RS::LIGHT_DIRECTIONAL_SKY_MODE_SKY_ONLY) { + RID light = light_storage->light_instance_get_base_light(light_instance); + Transform3D light_transform = light_storage->light_instance_get_base_transform(light_instance); + + if (RSG::light_storage->light_directional_get_sky_mode(light) == RS::LIGHT_DIRECTIONAL_SKY_MODE_SKY_ONLY) { continue; } - Vector3 dir = -li->transform.basis.get_column(Vector3::AXIS_Z); + Vector3 dir = -light_transform.basis.get_column(Vector3::AXIS_Z); dir.y *= y_mult; dir.normalize(); lights[idx].direction[0] = dir.x; lights[idx].direction[1] = dir.y; lights[idx].direction[2] = dir.z; - Color color = RSG::light_storage->light_get_color(li->light); + Color color = RSG::light_storage->light_get_color(light); color = color.srgb_to_linear(); lights[idx].color[0] = color.r; lights[idx].color[1] = color.g; lights[idx].color[2] = color.b; lights[idx].type = RS::LIGHT_DIRECTIONAL; - lights[idx].energy = RSG::light_storage->light_get_param(li->light, RS::LIGHT_PARAM_ENERGY) * RSG::light_storage->light_get_param(li->light, RS::LIGHT_PARAM_INDIRECT_ENERGY); - if (p_scene_render->is_using_physical_light_units()) { - lights[idx].energy *= RSG::light_storage->light_get_param(li->light, RS::LIGHT_PARAM_INTENSITY); + lights[idx].energy = RSG::light_storage->light_get_param(light, RS::LIGHT_PARAM_ENERGY) * RSG::light_storage->light_get_param(light, RS::LIGHT_PARAM_INDIRECT_ENERGY); + if (RendererSceneRenderRD::get_singleton()->is_using_physical_light_units()) { + lights[idx].energy *= RSG::light_storage->light_get_param(light, RS::LIGHT_PARAM_INTENSITY); } if (p_render_data->camera_attributes.is_valid()) { lights[idx].energy *= RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor(p_render_data->camera_attributes); } - lights[idx].has_shadow = RSG::light_storage->light_has_shadow(li->light); + lights[idx].has_shadow = RSG::light_storage->light_has_shadow(light); idx++; } @@ -1923,45 +1927,49 @@ void GI::SDFGI::pre_process_gi(const Transform3D &p_transform, RenderDataRD *p_r cascade_aabb.position = Vector3((Vector3i(1, 1, 1) * -int32_t(cascade_size >> 1) + cascade.position)) * cascade.cell_size; cascade_aabb.size = Vector3(1, 1, 1) * cascade_size * cascade.cell_size; - for (uint32_t j = 0; j < p_scene_render->render_state.sdfgi_update_data->positional_light_count; j++) { + for (uint32_t j = 0; j < p_render_data->sdfgi_update_data->positional_light_count; j++) { if (idx == SDFGI::MAX_DYNAMIC_LIGHTS) { break; } - RendererSceneRenderRD::LightInstance *li = p_scene_render->light_instance_owner.get_or_null(p_scene_render->render_state.sdfgi_update_data->positional_light_instances[j]); - ERR_CONTINUE(!li); + RID light_instance = p_render_data->sdfgi_update_data->positional_light_instances[j]; + ERR_CONTINUE(!light_storage->owns_light_instance(light_instance)); + + RID light = light_storage->light_instance_get_base_light(light_instance); + AABB light_aabb = light_storage->light_instance_get_base_aabb(light_instance); + Transform3D light_transform = light_storage->light_instance_get_base_transform(light_instance); - uint32_t max_sdfgi_cascade = RSG::light_storage->light_get_max_sdfgi_cascade(li->light); + uint32_t max_sdfgi_cascade = RSG::light_storage->light_get_max_sdfgi_cascade(light); if (i > max_sdfgi_cascade) { continue; } - if (!cascade_aabb.intersects(li->aabb)) { + if (!cascade_aabb.intersects(light_aabb)) { continue; } - Vector3 dir = -li->transform.basis.get_column(Vector3::AXIS_Z); + Vector3 dir = -light_transform.basis.get_column(Vector3::AXIS_Z); //faster to not do this here //dir.y *= y_mult; //dir.normalize(); lights[idx].direction[0] = dir.x; lights[idx].direction[1] = dir.y; lights[idx].direction[2] = dir.z; - Vector3 pos = li->transform.origin; + Vector3 pos = light_transform.origin; pos.y *= y_mult; lights[idx].position[0] = pos.x; lights[idx].position[1] = pos.y; lights[idx].position[2] = pos.z; - Color color = RSG::light_storage->light_get_color(li->light); + Color color = RSG::light_storage->light_get_color(light); color = color.srgb_to_linear(); lights[idx].color[0] = color.r; lights[idx].color[1] = color.g; lights[idx].color[2] = color.b; - lights[idx].type = RSG::light_storage->light_get_type(li->light); + lights[idx].type = RSG::light_storage->light_get_type(light); - lights[idx].energy = RSG::light_storage->light_get_param(li->light, RS::LIGHT_PARAM_ENERGY) * RSG::light_storage->light_get_param(li->light, RS::LIGHT_PARAM_INDIRECT_ENERGY); - if (p_scene_render->is_using_physical_light_units()) { - lights[idx].energy *= RSG::light_storage->light_get_param(li->light, RS::LIGHT_PARAM_INTENSITY); + lights[idx].energy = RSG::light_storage->light_get_param(light, RS::LIGHT_PARAM_ENERGY) * RSG::light_storage->light_get_param(light, RS::LIGHT_PARAM_INDIRECT_ENERGY); + if (RendererSceneRenderRD::get_singleton()->is_using_physical_light_units()) { + lights[idx].energy *= RSG::light_storage->light_get_param(light, RS::LIGHT_PARAM_INTENSITY); // Convert from Luminous Power to Luminous Intensity if (lights[idx].type == RS::LIGHT_OMNI) { @@ -1977,11 +1985,11 @@ void GI::SDFGI::pre_process_gi(const Transform3D &p_transform, RenderDataRD *p_r lights[idx].energy *= RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor(p_render_data->camera_attributes); } - lights[idx].has_shadow = RSG::light_storage->light_has_shadow(li->light); - lights[idx].attenuation = RSG::light_storage->light_get_param(li->light, RS::LIGHT_PARAM_ATTENUATION); - lights[idx].radius = RSG::light_storage->light_get_param(li->light, RS::LIGHT_PARAM_RANGE); - lights[idx].cos_spot_angle = Math::cos(Math::deg_to_rad(RSG::light_storage->light_get_param(li->light, RS::LIGHT_PARAM_SPOT_ANGLE))); - lights[idx].inv_spot_attenuation = 1.0f / RSG::light_storage->light_get_param(li->light, RS::LIGHT_PARAM_SPOT_ATTENUATION); + lights[idx].has_shadow = RSG::light_storage->light_has_shadow(light); + lights[idx].attenuation = RSG::light_storage->light_get_param(light, RS::LIGHT_PARAM_ATTENUATION); + lights[idx].radius = RSG::light_storage->light_get_param(light, RS::LIGHT_PARAM_RANGE); + lights[idx].cos_spot_angle = Math::cos(Math::deg_to_rad(RSG::light_storage->light_get_param(light, RS::LIGHT_PARAM_SPOT_ANGLE))); + lights[idx].inv_spot_attenuation = 1.0f / RSG::light_storage->light_get_param(light, RS::LIGHT_PARAM_SPOT_ATTENUATION); idx++; } @@ -1994,7 +2002,7 @@ void GI::SDFGI::pre_process_gi(const Transform3D &p_transform, RenderDataRD *p_r } } -void GI::SDFGI::render_region(Ref<RenderSceneBuffersRD> p_render_buffers, int p_region, const PagedArray<RenderGeometryInstance *> &p_instances, RendererSceneRenderRD *p_scene_render, float p_exposure_normalization) { +void GI::SDFGI::render_region(Ref<RenderSceneBuffersRD> p_render_buffers, int p_region, const PagedArray<RenderGeometryInstance *> &p_instances, float p_exposure_normalization) { //print_line("rendering region " + itos(p_region)); ERR_FAIL_COND(p_render_buffers.is_null()); // we wouldn't be here if this failed but... AABB bounds; @@ -2015,7 +2023,7 @@ void GI::SDFGI::render_region(Ref<RenderSceneBuffersRD> p_render_buffers, int p_ } //print_line("rendering cascade " + itos(p_region) + " objects: " + itos(p_cull_count) + " bounds: " + bounds + " from: " + from + " size: " + size + " cell size: " + rtos(cascades[cascade].cell_size)); - p_scene_render->_render_sdfgi(p_render_buffers, from, size, bounds, p_instances, render_albedo, render_emission, render_emission_aniso, render_geom_facing, p_exposure_normalization); + RendererSceneRenderRD::get_singleton()->_render_sdfgi(p_render_buffers, from, size, bounds, p_instances, render_albedo, render_emission, render_emission_aniso, render_geom_facing, p_exposure_normalization); if (cascade_next != cascade) { RD::get_singleton()->draw_command_begin_label("SDFGI Pre-Process Cascade"); @@ -2353,9 +2361,11 @@ void GI::SDFGI::render_region(Ref<RenderSceneBuffersRD> p_render_buffers, int p_ } } -void GI::SDFGI::render_static_lights(RenderDataRD *p_render_data, Ref<RenderSceneBuffersRD> p_render_buffers, uint32_t p_cascade_count, const uint32_t *p_cascade_indices, const PagedArray<RID> *p_positional_light_cull_result, RendererSceneRenderRD *p_scene_render) { +void GI::SDFGI::render_static_lights(RenderDataRD *p_render_data, Ref<RenderSceneBuffersRD> p_render_buffers, uint32_t p_cascade_count, const uint32_t *p_cascade_indices, const PagedArray<RID> *p_positional_light_cull_result) { ERR_FAIL_COND(p_render_buffers.is_null()); // we wouldn't be here if this failed but... + RendererRD::LightStorage *light_storage = RendererRD::LightStorage::get_singleton(); + RD::get_singleton()->draw_command_begin_label("SDFGI Render Static Lights"); update_cascades(); @@ -2381,21 +2391,25 @@ void GI::SDFGI::render_static_lights(RenderDataRD *p_render_data, Ref<RenderScen break; } - RendererSceneRenderRD::LightInstance *li = p_scene_render->light_instance_owner.get_or_null(p_positional_light_cull_result[i][j]); - ERR_CONTINUE(!li); + RID light_instance = p_positional_light_cull_result[i][j]; + ERR_CONTINUE(!light_storage->owns_light_instance(light_instance)); + + RID light = light_storage->light_instance_get_base_light(light_instance); + AABB light_aabb = light_storage->light_instance_get_base_aabb(light_instance); + Transform3D light_transform = light_storage->light_instance_get_base_transform(light_instance); - uint32_t max_sdfgi_cascade = RSG::light_storage->light_get_max_sdfgi_cascade(li->light); + uint32_t max_sdfgi_cascade = RSG::light_storage->light_get_max_sdfgi_cascade(light); if (p_cascade_indices[i] > max_sdfgi_cascade) { continue; } - if (!cascade_aabb.intersects(li->aabb)) { + if (!cascade_aabb.intersects(light_aabb)) { continue; } - lights[idx].type = RSG::light_storage->light_get_type(li->light); + lights[idx].type = RSG::light_storage->light_get_type(light); - Vector3 dir = -li->transform.basis.get_column(Vector3::AXIS_Z); + Vector3 dir = -light_transform.basis.get_column(Vector3::AXIS_Z); if (lights[idx].type == RS::LIGHT_DIRECTIONAL) { dir.y *= y_mult; //only makes sense for directional dir.normalize(); @@ -2403,20 +2417,20 @@ void GI::SDFGI::render_static_lights(RenderDataRD *p_render_data, Ref<RenderScen lights[idx].direction[0] = dir.x; lights[idx].direction[1] = dir.y; lights[idx].direction[2] = dir.z; - Vector3 pos = li->transform.origin; + Vector3 pos = light_transform.origin; pos.y *= y_mult; lights[idx].position[0] = pos.x; lights[idx].position[1] = pos.y; lights[idx].position[2] = pos.z; - Color color = RSG::light_storage->light_get_color(li->light); + Color color = RSG::light_storage->light_get_color(light); color = color.srgb_to_linear(); lights[idx].color[0] = color.r; lights[idx].color[1] = color.g; lights[idx].color[2] = color.b; - lights[idx].energy = RSG::light_storage->light_get_param(li->light, RS::LIGHT_PARAM_ENERGY) * RSG::light_storage->light_get_param(li->light, RS::LIGHT_PARAM_INDIRECT_ENERGY); - if (p_scene_render->is_using_physical_light_units()) { - lights[idx].energy *= RSG::light_storage->light_get_param(li->light, RS::LIGHT_PARAM_INTENSITY); + lights[idx].energy = RSG::light_storage->light_get_param(light, RS::LIGHT_PARAM_ENERGY) * RSG::light_storage->light_get_param(light, RS::LIGHT_PARAM_INDIRECT_ENERGY); + if (RendererSceneRenderRD::get_singleton()->is_using_physical_light_units()) { + lights[idx].energy *= RSG::light_storage->light_get_param(light, RS::LIGHT_PARAM_INTENSITY); // Convert from Luminous Power to Luminous Intensity if (lights[idx].type == RS::LIGHT_OMNI) { @@ -2432,11 +2446,11 @@ void GI::SDFGI::render_static_lights(RenderDataRD *p_render_data, Ref<RenderScen lights[idx].energy *= RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor(p_render_data->camera_attributes); } - lights[idx].has_shadow = RSG::light_storage->light_has_shadow(li->light); - lights[idx].attenuation = RSG::light_storage->light_get_param(li->light, RS::LIGHT_PARAM_ATTENUATION); - lights[idx].radius = RSG::light_storage->light_get_param(li->light, RS::LIGHT_PARAM_RANGE); - lights[idx].cos_spot_angle = Math::cos(Math::deg_to_rad(RSG::light_storage->light_get_param(li->light, RS::LIGHT_PARAM_SPOT_ANGLE))); - lights[idx].inv_spot_attenuation = 1.0f / RSG::light_storage->light_get_param(li->light, RS::LIGHT_PARAM_SPOT_ATTENUATION); + lights[idx].has_shadow = RSG::light_storage->light_has_shadow(light); + lights[idx].attenuation = RSG::light_storage->light_get_param(light, RS::LIGHT_PARAM_ATTENUATION); + lights[idx].radius = RSG::light_storage->light_get_param(light, RS::LIGHT_PARAM_RANGE); + lights[idx].cos_spot_angle = Math::cos(Math::deg_to_rad(RSG::light_storage->light_get_param(light, RS::LIGHT_PARAM_SPOT_ANGLE))); + lights[idx].inv_spot_attenuation = 1.0f / RSG::light_storage->light_get_param(light, RS::LIGHT_PARAM_SPOT_ATTENUATION); idx++; } @@ -2492,7 +2506,8 @@ void GI::SDFGI::render_static_lights(RenderDataRD *p_render_data, Ref<RenderScen //////////////////////////////////////////////////////////////////////////////// // VoxelGIInstance -void GI::VoxelGIInstance::update(bool p_update_light_instances, const Vector<RID> &p_light_instances, const PagedArray<RenderGeometryInstance *> &p_dynamic_objects, RendererSceneRenderRD *p_scene_render) { +void GI::VoxelGIInstance::update(bool p_update_light_instances, const Vector<RID> &p_light_instances, const PagedArray<RenderGeometryInstance *> &p_dynamic_objects) { + RendererRD::LightStorage *light_storage = RendererRD::LightStorage::get_singleton(); RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton(); uint32_t data_version = gi->voxel_gi_get_data_version(probe); @@ -2834,7 +2849,7 @@ void GI::VoxelGIInstance::update(bool p_update_light_instances, const Vector<RID last_probe_data_version = data_version; p_update_light_instances = true; //just in case - p_scene_render->_base_uniforms_changed(); + RendererSceneRenderRD::get_singleton()->base_uniforms_changed(); } // UDPDATE TIME @@ -2857,7 +2872,7 @@ void GI::VoxelGIInstance::update(bool p_update_light_instances, const Vector<RID for (uint32_t i = 0; i < light_count; i++) { VoxelGILight &l = gi->voxel_gi_lights[i]; RID light_instance = p_light_instances[i]; - RID light = p_scene_render->light_instance_get_base_light(light_instance); + RID light = light_storage->light_instance_get_base_light(light_instance); l.type = RSG::light_storage->light_get_type(light); if (l.type == RS::LIGHT_DIRECTIONAL && RSG::light_storage->light_directional_get_sky_mode(light) == RS::LIGHT_DIRECTIONAL_SKY_MODE_SKY_ONLY) { @@ -2868,7 +2883,7 @@ void GI::VoxelGIInstance::update(bool p_update_light_instances, const Vector<RID l.attenuation = RSG::light_storage->light_get_param(light, RS::LIGHT_PARAM_ATTENUATION); l.energy = RSG::light_storage->light_get_param(light, RS::LIGHT_PARAM_ENERGY) * RSG::light_storage->light_get_param(light, RS::LIGHT_PARAM_INDIRECT_ENERGY); - if (p_scene_render->is_using_physical_light_units()) { + if (RendererSceneRenderRD::get_singleton()->is_using_physical_light_units()) { l.energy *= RSG::light_storage->light_get_param(light, RS::LIGHT_PARAM_INTENSITY); l.energy *= gi->voxel_gi_get_baked_exposure_normalization(probe); @@ -2892,7 +2907,7 @@ void GI::VoxelGIInstance::update(bool p_update_light_instances, const Vector<RID l.cos_spot_angle = Math::cos(Math::deg_to_rad(RSG::light_storage->light_get_param(light, RS::LIGHT_PARAM_SPOT_ANGLE))); l.inv_spot_attenuation = 1.0f / RSG::light_storage->light_get_param(light, RS::LIGHT_PARAM_SPOT_ATTENUATION); - Transform3D xform = p_scene_render->light_instance_get_base_transform(light_instance); + Transform3D xform = light_storage->light_instance_get_base_transform(light_instance); Vector3 pos = to_probe_xform.xform(xform.origin); Vector3 dir = to_probe_xform.basis.xform(-xform.basis.get_column(2)).normalized(); @@ -3087,17 +3102,17 @@ void GI::VoxelGIInstance::update(bool p_update_light_instances, const Vector<RID Projection cm; cm.set_orthogonal(-rect.size.width / 2, rect.size.width / 2, -rect.size.height / 2, rect.size.height / 2, 0.0001, aabb.size[z_axis]); - if (p_scene_render->cull_argument.size() == 0) { - p_scene_render->cull_argument.push_back(nullptr); + if (RendererSceneRenderRD::get_singleton()->cull_argument.size() == 0) { + RendererSceneRenderRD::get_singleton()->cull_argument.push_back(nullptr); } - p_scene_render->cull_argument[0] = instance; + RendererSceneRenderRD::get_singleton()->cull_argument[0] = instance; float exposure_normalization = 1.0; - if (p_scene_render->is_using_physical_light_units()) { + if (RendererSceneRenderRD::get_singleton()->is_using_physical_light_units()) { exposure_normalization = gi->voxel_gi_get_baked_exposure_normalization(probe); } - p_scene_render->_render_material(to_world_xform * xform, cm, true, p_scene_render->cull_argument, dynamic_maps[0].fb, Rect2i(Vector2i(), rect.size), exposure_normalization); + RendererSceneRenderRD::get_singleton()->_render_material(to_world_xform * xform, cm, true, RendererSceneRenderRD::get_singleton()->cull_argument, dynamic_maps[0].fb, Rect2i(Vector2i(), rect.size), exposure_normalization); VoxelGIDynamicPushConstant push_constant; memset(&push_constant, 0, sizeof(VoxelGIDynamicPushConstant)); @@ -3591,7 +3606,7 @@ Ref<GI::SDFGI> GI::create_sdfgi(RID p_env, const Vector3 &p_world_position, uint return sdfgi; } -void GI::setup_voxel_gi_instances(RenderDataRD *p_render_data, Ref<RenderSceneBuffersRD> p_render_buffers, const Transform3D &p_transform, const PagedArray<RID> &p_voxel_gi_instances, uint32_t &r_voxel_gi_instances_used, RendererSceneRenderRD *p_scene_render) { +void GI::setup_voxel_gi_instances(RenderDataRD *p_render_data, Ref<RenderSceneBuffersRD> p_render_buffers, const Transform3D &p_transform, const PagedArray<RID> &p_voxel_gi_instances, uint32_t &r_voxel_gi_instances_used) { ERR_FAIL_COND(p_render_buffers.is_null()); RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton(); @@ -4051,11 +4066,11 @@ bool GI::voxel_gi_needs_update(RID p_probe) const { return voxel_gi->last_probe_version != voxel_gi_get_version(voxel_gi->probe); } -void GI::voxel_gi_update(RID p_probe, bool p_update_light_instances, const Vector<RID> &p_light_instances, const PagedArray<RenderGeometryInstance *> &p_dynamic_objects, RendererSceneRenderRD *p_scene_render) { +void GI::voxel_gi_update(RID p_probe, bool p_update_light_instances, const Vector<RID> &p_light_instances, const PagedArray<RenderGeometryInstance *> &p_dynamic_objects) { VoxelGIInstance *voxel_gi = voxel_gi_instance_owner.get_or_null(p_probe); ERR_FAIL_COND(!voxel_gi); - voxel_gi->update(p_update_light_instances, p_light_instances, p_dynamic_objects, p_scene_render); + voxel_gi->update(p_update_light_instances, p_light_instances, p_dynamic_objects); } void GI::debug_voxel_gi(RID p_voxel_gi, RD::DrawListID p_draw_list, RID p_framebuffer, const Projection &p_camera_with_transform, bool p_lighting, bool p_emission, float p_alpha) { diff --git a/servers/rendering/renderer_rd/environment/gi.h b/servers/rendering/renderer_rd/environment/gi.h index e567c67a3b..2182ca6a20 100644 --- a/servers/rendering/renderer_rd/environment/gi.h +++ b/servers/rendering/renderer_rd/environment/gi.h @@ -145,7 +145,7 @@ public: Transform3D transform; - void update(bool p_update_light_instances, const Vector<RID> &p_light_instances, const PagedArray<RenderGeometryInstance *> &p_dynamic_objects, RendererSceneRenderRD *p_scene_render); + void update(bool p_update_light_instances, const Vector<RID> &p_light_instances, const PagedArray<RenderGeometryInstance *> &p_dynamic_objects); void debug(RD::DrawListID p_draw_list, RID p_framebuffer, const Projection &p_camera_with_transform, bool p_lighting, bool p_emission, float p_alpha); void free_resources(); }; @@ -687,9 +687,9 @@ public: void debug_draw(uint32_t p_view_count, const Projection *p_projections, const Transform3D &p_transform, int p_width, int p_height, RID p_render_target, RID p_texture, const Vector<RID> &p_texture_views); void debug_probes(RID p_framebuffer, const uint32_t p_view_count, const Projection *p_camera_with_transforms, bool p_will_continue_color, bool p_will_continue_depth); - void pre_process_gi(const Transform3D &p_transform, RenderDataRD *p_render_data, RendererSceneRenderRD *p_scene_render); - void render_region(Ref<RenderSceneBuffersRD> p_render_buffers, int p_region, const PagedArray<RenderGeometryInstance *> &p_instances, RendererSceneRenderRD *p_scene_render, float p_exposure_normalization); - void render_static_lights(RenderDataRD *p_render_data, Ref<RenderSceneBuffersRD> p_render_buffers, uint32_t p_cascade_count, const uint32_t *p_cascade_indices, const PagedArray<RID> *p_positional_light_cull_result, RendererSceneRenderRD *p_scene_render); + void pre_process_gi(const Transform3D &p_transform, RenderDataRD *p_render_data); + void render_region(Ref<RenderSceneBuffersRD> p_render_buffers, int p_region, const PagedArray<RenderGeometryInstance *> &p_instances, float p_exposure_normalization); + void render_static_lights(RenderDataRD *p_render_data, Ref<RenderSceneBuffersRD> p_render_buffers, uint32_t p_cascade_count, const uint32_t *p_cascade_indices, const PagedArray<RID> *p_positional_light_cull_result); }; RS::EnvironmentSDFGIRayCount sdfgi_ray_count = RS::ENV_SDFGI_RAY_COUNT_16; @@ -812,13 +812,13 @@ public: Ref<SDFGI> create_sdfgi(RID p_env, const Vector3 &p_world_position, uint32_t p_requested_history_size); - void setup_voxel_gi_instances(RenderDataRD *p_render_data, Ref<RenderSceneBuffersRD> p_render_buffers, const Transform3D &p_transform, const PagedArray<RID> &p_voxel_gi_instances, uint32_t &r_voxel_gi_instances_used, RendererSceneRenderRD *p_scene_render); + void setup_voxel_gi_instances(RenderDataRD *p_render_data, Ref<RenderSceneBuffersRD> p_render_buffers, const Transform3D &p_transform, const PagedArray<RID> &p_voxel_gi_instances, uint32_t &r_voxel_gi_instances_used); void process_gi(Ref<RenderSceneBuffersRD> p_render_buffers, const RID *p_normal_roughness_slices, RID p_voxel_gi_buffer, RID p_environment, uint32_t p_view_count, const Projection *p_projections, const Vector3 *p_eye_offsets, const Transform3D &p_cam_transform, const PagedArray<RID> &p_voxel_gi_instances); RID voxel_gi_instance_create(RID p_base); void voxel_gi_instance_set_transform_to_data(RID p_probe, const Transform3D &p_xform); bool voxel_gi_needs_update(RID p_probe) const; - void voxel_gi_update(RID p_probe, bool p_update_light_instances, const Vector<RID> &p_light_instances, const PagedArray<RenderGeometryInstance *> &p_dynamic_objects, RendererSceneRenderRD *p_scene_render); + void voxel_gi_update(RID p_probe, bool p_update_light_instances, const Vector<RID> &p_light_instances, const PagedArray<RenderGeometryInstance *> &p_dynamic_objects); void debug_voxel_gi(RID p_voxel_gi, RD::DrawListID p_draw_list, RID p_framebuffer, const Projection &p_camera_with_transform, bool p_lighting, bool p_emission, float p_alpha); }; diff --git a/servers/rendering/renderer_rd/environment/sky.cpp b/servers/rendering/renderer_rd/environment/sky.cpp index 65d1d9e705..21a15ed475 100644 --- a/servers/rendering/renderer_rd/environment/sky.cpp +++ b/servers/rendering/renderer_rd/environment/sky.cpp @@ -907,6 +907,7 @@ void SkyRD::init() { actions.usage_defines["HALF_RES_COLOR"] = "\n#define USES_HALF_RES_COLOR\n"; actions.usage_defines["QUARTER_RES_COLOR"] = "\n#define USES_QUARTER_RES_COLOR\n"; actions.render_mode_defines["disable_fog"] = "#define DISABLE_FOG\n"; + actions.render_mode_defines["use_debanding"] = "#define USE_DEBANDING\n"; actions.sampler_array_name = "material_samplers"; actions.base_texture_binding_index = 1; @@ -1199,18 +1200,17 @@ void SkyRD::setup(RID p_env, Ref<RenderSceneBuffersRD> p_render_buffers, const P // This can't be done in RenderSceneRenderRD::_setup lights because that needs to be called // after the depth prepass, but this runs before the depth prepass for (int i = 0; i < (int)p_lights.size(); i++) { - RendererSceneRenderRD::LightInstance *li = p_scene_render->light_instance_owner.get_or_null(p_lights[i]); - if (!li) { + if (!light_storage->owns_light_instance(p_lights[i])) { continue; } - RID base = li->light; + RID base = light_storage->light_instance_get_base_light(p_lights[i]); ERR_CONTINUE(base.is_null()); RS::LightType type = light_storage->light_get_type(base); if (type == RS::LIGHT_DIRECTIONAL && light_storage->light_directional_get_sky_mode(base) != RS::LIGHT_DIRECTIONAL_SKY_MODE_LIGHT_ONLY) { SkyDirectionalLightData &sky_light_data = sky_scene_state.directional_lights[sky_scene_state.ubo.directional_light_count]; - Transform3D light_transform = li->transform; + Transform3D light_transform = light_storage->light_instance_get_base_transform(p_lights[i]); Vector3 world_direction = light_transform.basis.xform(Vector3(0, 0, 1)).normalized(); sky_light_data.direction[0] = world_direction.x; @@ -1260,6 +1260,7 @@ void SkyRD::setup(RID p_env, Ref<RenderSceneBuffersRD> p_render_buffers, const P light_data_dirty = true; for (uint32_t i = sky_scene_state.ubo.directional_light_count; i < sky_scene_state.max_directional_lights; i++) { sky_scene_state.directional_lights[i].enabled = false; + sky_scene_state.last_frame_directional_lights[i].enabled = false; } } diff --git a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp index a0f6e69fd5..c1a7818921 100644 --- a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp +++ b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp @@ -110,9 +110,29 @@ void RenderForwardClustered::RenderBufferDataForwardClustered::free_data() { render_buffers->clear_context(RB_SCOPE_FORWARD_CLUSTERED); } + if (cluster_builder) { + memdelete(cluster_builder); + cluster_builder = nullptr; + } + if (!render_sdfgi_uniform_set.is_null() && RD::get_singleton()->uniform_set_is_valid(render_sdfgi_uniform_set)) { RD::get_singleton()->free(render_sdfgi_uniform_set); } + + if (ss_effects_data.linear_depth.is_valid()) { + RD::get_singleton()->free(ss_effects_data.linear_depth); + ss_effects_data.linear_depth = RID(); + ss_effects_data.linear_depth_slices.clear(); + } + + if (ss_effects_data.downsample_uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(ss_effects_data.downsample_uniform_set)) { + RD::get_singleton()->free(ss_effects_data.downsample_uniform_set); + ss_effects_data.downsample_uniform_set = RID(); + } + + RenderForwardClustered::get_singleton()->get_ss_effects()->ssao_free(ss_effects_data.ssao); + RenderForwardClustered::get_singleton()->get_ss_effects()->ssil_free(ss_effects_data.ssil); + RenderForwardClustered::get_singleton()->get_ss_effects()->ssr_free(ss_effects_data.ssr); } void RenderForwardClustered::RenderBufferDataForwardClustered::configure(RenderSceneBuffersRD *p_render_buffers) { @@ -124,7 +144,7 @@ void RenderForwardClustered::RenderBufferDataForwardClustered::configure(RenderS render_buffers = p_render_buffers; ERR_FAIL_NULL(render_buffers); - bool msaa_3d = render_buffers->get_msaa_3d(); + RS::ViewportMSAA msaa_3d = render_buffers->get_msaa_3d(); if (msaa_3d != RS::VIEWPORT_MSAA_DISABLED) { RD::DataFormat format = RD::DATA_FORMAT_R16G16B16A16_SFLOAT; @@ -146,6 +166,14 @@ void RenderForwardClustered::RenderBufferDataForwardClustered::configure(RenderS p_render_buffers->create_texture(RB_SCOPE_FORWARD_CLUSTERED, RB_TEX_DEPTH_MSAA, format, usage_bits, texture_samples); } + + if (cluster_builder == nullptr) { + cluster_builder = memnew(ClusterBuilderRD); + } + cluster_builder->set_shared(RenderForwardClustered::get_singleton()->get_cluster_builder_shared()); + + RID sampler = RendererRD::MaterialStorage::get_singleton()->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED); + cluster_builder->setup(p_render_buffers->get_internal_size(), p_render_buffers->get_max_cluster_elements(), p_render_buffers->get_depth_texture(), sampler, p_render_buffers->get_internal_texture()); } RID RenderForwardClustered::RenderBufferDataForwardClustered::get_color_only_fb() { @@ -276,7 +304,7 @@ void RenderForwardClustered::_render_list_template(RenderingDevice::DrawListID p SceneState::PushConstant push_constant; - if (p_pass_mode == PASS_MODE_DEPTH_MATERIAL) { + if constexpr (p_pass_mode == PASS_MODE_DEPTH_MATERIAL) { push_constant.uv_offset = Math::make_half_float(p_params->uv_offset.y) << 16; push_constant.uv_offset |= Math::make_half_float(p_params->uv_offset.x); } else { @@ -355,7 +383,7 @@ void RenderForwardClustered::_render_list_template(RenderingDevice::DrawListID p uint32_t pipeline_color_pass_flags = 0; uint32_t pipeline_specialization = 0; - if (p_pass_mode == PASS_MODE_COLOR) { + if constexpr (p_pass_mode == PASS_MODE_COLOR) { if (element_info.uses_softshadow) { pipeline_specialization |= SceneShaderForwardClustered::SHADER_SPECIALIZATION_SOFT_SHADOWS; } @@ -477,6 +505,13 @@ void RenderForwardClustered::_render_list_template(RenderingDevice::DrawListID p prev_material_uniform_set = material_uniform_set; } + if ((surf->owner->base_flags & (INSTANCE_DATA_FLAG_MULTIMESH | INSTANCE_DATA_FLAG_PARTICLES)) == INSTANCE_DATA_FLAG_MULTIMESH) { + mesh_storage->_multimesh_get_motion_vectors_offsets(surf->owner->data->base, push_constant.multimesh_motion_vectors_current_offset, push_constant.multimesh_motion_vectors_previous_offset); + } else { + push_constant.multimesh_motion_vectors_current_offset = 0; + push_constant.multimesh_motion_vectors_previous_offset = 0; + } + RD::get_singleton()->draw_list_set_push_constant(draw_list, &push_constant, sizeof(SceneState::PushConstant)); uint32_t instance_count = surf->owner->instance_count > 1 ? surf->owner->instance_count : element_info.repeat; @@ -573,48 +608,24 @@ void RenderForwardClustered::_render_list_with_threads(RenderListParameters *p_p } void RenderForwardClustered::_setup_environment(const RenderDataRD *p_render_data, bool p_no_fog, const Size2i &p_screen_size, bool p_flip_y, const Color &p_default_bg_color, bool p_opaque_render_buffers, bool p_pancake_shadows, int p_index) { - Ref<RenderSceneBuffersRD> rd = p_render_data->render_buffers; - - //Projection projection = p_render_data->cam_projection; - //projection.flip_y(); // Vulkan and modern APIs use Y-Down - Projection correction; - correction.set_depth_correction(p_flip_y); - correction.add_jitter_offset(p_render_data->taa_jitter); - Projection projection = correction * p_render_data->cam_projection; - - //store camera into ubo - RendererRD::MaterialStorage::store_camera(projection, scene_state.ubo.projection_matrix); - RendererRD::MaterialStorage::store_camera(projection.inverse(), scene_state.ubo.inv_projection_matrix); - RendererRD::MaterialStorage::store_transform(p_render_data->cam_transform, scene_state.ubo.inv_view_matrix); - RendererRD::MaterialStorage::store_transform(p_render_data->cam_transform.affine_inverse(), scene_state.ubo.view_matrix); + RendererRD::LightStorage *light_storage = RendererRD::LightStorage::get_singleton(); - for (uint32_t v = 0; v < p_render_data->view_count; v++) { - projection = correction * p_render_data->view_projection[v]; - RendererRD::MaterialStorage::store_camera(projection, scene_state.ubo.projection_matrix_view[v]); - RendererRD::MaterialStorage::store_camera(projection.inverse(), scene_state.ubo.inv_projection_matrix_view[v]); + Ref<RenderSceneBuffersRD> rd = p_render_data->render_buffers; + RID env = is_environment(p_render_data->environment) ? p_render_data->environment : RID(); + RID reflection_probe_instance = p_render_data->reflection_probe.is_valid() ? light_storage->reflection_probe_instance_get_probe(p_render_data->reflection_probe) : RID(); - scene_state.ubo.eye_offset[v][0] = p_render_data->view_eye_offset[v].x; - scene_state.ubo.eye_offset[v][1] = p_render_data->view_eye_offset[v].y; - scene_state.ubo.eye_offset[v][2] = p_render_data->view_eye_offset[v].z; - scene_state.ubo.eye_offset[v][3] = 0.0; + // May do this earlier in RenderSceneRenderRD::render_scene + if (p_index >= (int)scene_state.uniform_buffers.size()) { + uint32_t from = scene_state.uniform_buffers.size(); + scene_state.uniform_buffers.resize(p_index + 1); + for (uint32_t i = from; i < scene_state.uniform_buffers.size(); i++) { + scene_state.uniform_buffers[i] = p_render_data->scene_data->create_uniform_buffer(); + } } - scene_state.ubo.taa_jitter[0] = p_render_data->taa_jitter.x; - scene_state.ubo.taa_jitter[1] = p_render_data->taa_jitter.y; - - scene_state.ubo.z_far = p_render_data->z_far; - scene_state.ubo.z_near = p_render_data->z_near; + p_render_data->scene_data->update_ubo(scene_state.uniform_buffers[p_index], get_debug_draw_mode(), env, reflection_probe_instance, p_render_data->camera_attributes, p_flip_y, p_pancake_shadows, p_screen_size, p_default_bg_color, _render_buffers_get_luminance_multiplier(), p_opaque_render_buffers); - scene_state.ubo.pancake_shadows = p_pancake_shadows; - - RendererRD::MaterialStorage::store_soft_shadow_kernel(directional_penumbra_shadow_kernel_get(), scene_state.ubo.directional_penumbra_shadow_kernel); - RendererRD::MaterialStorage::store_soft_shadow_kernel(directional_soft_shadow_kernel_get(), scene_state.ubo.directional_soft_shadow_kernel); - RendererRD::MaterialStorage::store_soft_shadow_kernel(penumbra_shadow_kernel_get(), scene_state.ubo.penumbra_shadow_kernel); - RendererRD::MaterialStorage::store_soft_shadow_kernel(soft_shadow_kernel_get(), scene_state.ubo.soft_shadow_kernel); - - Size2 screen_pixel_size = Vector2(1.0, 1.0) / Size2(p_screen_size); - scene_state.ubo.screen_pixel_size[0] = screen_pixel_size.x; - scene_state.ubo.screen_pixel_size[1] = screen_pixel_size.y; + // now do implementation UBO scene_state.ubo.cluster_shift = get_shift_from_power_of_2(p_render_data->cluster_size); scene_state.ubo.max_cluster_element_count_div_32 = p_render_data->cluster_max_elements / 32; @@ -625,22 +636,8 @@ void RenderForwardClustered::_setup_environment(const RenderDataRD *p_render_dat scene_state.ubo.cluster_width = cluster_screen_width; } - if (p_render_data->shadow_atlas.is_valid()) { - Vector2 sas = shadow_atlas_get_size(p_render_data->shadow_atlas); - scene_state.ubo.shadow_atlas_pixel_size[0] = 1.0 / sas.x; - scene_state.ubo.shadow_atlas_pixel_size[1] = 1.0 / sas.y; - } - { - Vector2 dss = directional_shadow_get_size(); - scene_state.ubo.directional_shadow_pixel_size[0] = 1.0 / dss.x; - scene_state.ubo.directional_shadow_pixel_size[1] = 1.0 / dss.y; - } - //time global variables - scene_state.ubo.time = time; - scene_state.ubo.gi_upscale_for_msaa = false; scene_state.ubo.volumetric_fog_enabled = false; - scene_state.ubo.fog_enabled = false; if (rd.is_valid()) { if (rd->get_msaa_3d() != RS::VIEWPORT_MSAA_DISABLED) { @@ -668,59 +665,8 @@ void RenderForwardClustered::_setup_environment(const RenderDataRD *p_render_dat } if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_UNSHADED) { - scene_state.ubo.use_ambient_light = true; - scene_state.ubo.ambient_light_color_energy[0] = 1; - scene_state.ubo.ambient_light_color_energy[1] = 1; - scene_state.ubo.ambient_light_color_energy[2] = 1; - scene_state.ubo.ambient_light_color_energy[3] = 1.0; - scene_state.ubo.use_ambient_cubemap = false; - scene_state.ubo.use_reflection_cubemap = false; scene_state.ubo.ss_effects_flags = 0; - } else if (is_environment(p_render_data->environment)) { - RS::EnvironmentBG env_bg = environment_get_background(p_render_data->environment); - RS::EnvironmentAmbientSource ambient_src = environment_get_ambient_source(p_render_data->environment); - - float bg_energy_multiplier = environment_get_bg_energy_multiplier(p_render_data->environment); - - scene_state.ubo.ambient_light_color_energy[3] = bg_energy_multiplier; - - scene_state.ubo.ambient_color_sky_mix = environment_get_ambient_sky_contribution(p_render_data->environment); - - //ambient - if (ambient_src == RS::ENV_AMBIENT_SOURCE_BG && (env_bg == RS::ENV_BG_CLEAR_COLOR || env_bg == RS::ENV_BG_COLOR)) { - Color color = env_bg == RS::ENV_BG_CLEAR_COLOR ? p_default_bg_color : environment_get_bg_color(p_render_data->environment); - color = color.srgb_to_linear(); - - scene_state.ubo.ambient_light_color_energy[0] = color.r * bg_energy_multiplier; - scene_state.ubo.ambient_light_color_energy[1] = color.g * bg_energy_multiplier; - scene_state.ubo.ambient_light_color_energy[2] = color.b * bg_energy_multiplier; - scene_state.ubo.use_ambient_light = true; - scene_state.ubo.use_ambient_cubemap = false; - } else { - float energy = environment_get_ambient_light_energy(p_render_data->environment); - Color color = environment_get_ambient_light(p_render_data->environment); - color = color.srgb_to_linear(); - scene_state.ubo.ambient_light_color_energy[0] = color.r * energy; - scene_state.ubo.ambient_light_color_energy[1] = color.g * energy; - scene_state.ubo.ambient_light_color_energy[2] = color.b * energy; - - Basis sky_transform = environment_get_sky_orientation(p_render_data->environment); - sky_transform = sky_transform.inverse() * p_render_data->cam_transform.basis; - RendererRD::MaterialStorage::store_transform_3x3(sky_transform, scene_state.ubo.radiance_inverse_xform); - - scene_state.ubo.use_ambient_cubemap = (ambient_src == RS::ENV_AMBIENT_SOURCE_BG && env_bg == RS::ENV_BG_SKY) || ambient_src == RS::ENV_AMBIENT_SOURCE_SKY; - scene_state.ubo.use_ambient_light = scene_state.ubo.use_ambient_cubemap || ambient_src == RS::ENV_AMBIENT_SOURCE_COLOR; - } - - //specular - RS::EnvironmentReflectionSource ref_src = environment_get_reflection_source(p_render_data->environment); - if ((ref_src == RS::ENV_REFLECTION_SOURCE_BG && env_bg == RS::ENV_BG_SKY) || ref_src == RS::ENV_REFLECTION_SOURCE_SKY) { - scene_state.ubo.use_reflection_cubemap = true; - } else { - scene_state.ubo.use_reflection_cubemap = false; - } - scene_state.ubo.ssao_ao_affect = environment_get_ssao_ao_channel_affect(p_render_data->environment); scene_state.ubo.ssao_light_affect = environment_get_ssao_direct_light_affect(p_render_data->environment); uint32_t ss_flags = 0; @@ -729,97 +675,19 @@ void RenderForwardClustered::_setup_environment(const RenderDataRD *p_render_dat ss_flags |= environment_get_ssil_enabled(p_render_data->environment) ? 2 : 0; } scene_state.ubo.ss_effects_flags = ss_flags; - - scene_state.ubo.fog_enabled = environment_get_fog_enabled(p_render_data->environment); - scene_state.ubo.fog_density = environment_get_fog_density(p_render_data->environment); - scene_state.ubo.fog_height = environment_get_fog_height(p_render_data->environment); - scene_state.ubo.fog_height_density = environment_get_fog_height_density(p_render_data->environment); - scene_state.ubo.fog_aerial_perspective = environment_get_fog_aerial_perspective(p_render_data->environment); - - Color fog_color = environment_get_fog_light_color(p_render_data->environment).srgb_to_linear(); - float fog_energy = environment_get_fog_light_energy(p_render_data->environment); - - scene_state.ubo.fog_light_color[0] = fog_color.r * fog_energy; - scene_state.ubo.fog_light_color[1] = fog_color.g * fog_energy; - scene_state.ubo.fog_light_color[2] = fog_color.b * fog_energy; - - scene_state.ubo.fog_sun_scatter = environment_get_fog_sun_scatter(p_render_data->environment); - } else { - if (p_render_data->reflection_probe.is_valid() && RendererRD::LightStorage::get_singleton()->reflection_probe_is_interior(reflection_probe_instance_get_probe(p_render_data->reflection_probe))) { - scene_state.ubo.use_ambient_light = false; - } else { - scene_state.ubo.use_ambient_light = true; - Color clear_color = p_default_bg_color; - clear_color = clear_color.srgb_to_linear(); - scene_state.ubo.ambient_light_color_energy[0] = clear_color.r; - scene_state.ubo.ambient_light_color_energy[1] = clear_color.g; - scene_state.ubo.ambient_light_color_energy[2] = clear_color.b; - scene_state.ubo.ambient_light_color_energy[3] = 1.0; - } - - scene_state.ubo.use_ambient_cubemap = false; - scene_state.ubo.use_reflection_cubemap = false; scene_state.ubo.ss_effects_flags = 0; } - if (p_render_data->camera_attributes.is_valid()) { - scene_state.ubo.emissive_exposure_normalization = RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor(p_render_data->camera_attributes); - scene_state.ubo.IBL_exposure_normalization = 1.0; - if (is_environment(p_render_data->environment)) { - RID sky_rid = environment_get_sky(p_render_data->environment); - if (sky_rid.is_valid()) { - float current_exposure = RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor(p_render_data->camera_attributes) * environment_get_bg_intensity(p_render_data->environment) / _render_buffers_get_luminance_multiplier(); - scene_state.ubo.IBL_exposure_normalization = current_exposure / MAX(0.001, sky.sky_get_baked_exposure(sky_rid)); - } - } - } else if (scene_state.ubo.emissive_exposure_normalization > 0.0) { - // This branch is triggered when using render_material(). - // Emissive is set outside the function, so don't set it. - // IBL isn't used don't set it. - } else { - scene_state.ubo.emissive_exposure_normalization = 1.0; - scene_state.ubo.IBL_exposure_normalization = 1.0; - } - - scene_state.ubo.roughness_limiter_enabled = p_opaque_render_buffers && screen_space_roughness_limiter_is_active(); - scene_state.ubo.roughness_limiter_amount = screen_space_roughness_limiter_get_amount(); - scene_state.ubo.roughness_limiter_limit = screen_space_roughness_limiter_get_limit(); - - if (rd.is_valid()) { - if (rd->get_use_taa() || get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_MOTION_VECTORS) { - memcpy(&scene_state.prev_ubo, &scene_state.ubo, sizeof(SceneState::UBO)); - - Projection prev_correction; - prev_correction.set_depth_correction(true); - prev_correction.add_jitter_offset(p_render_data->prev_taa_jitter); - Projection prev_projection = prev_correction * p_render_data->prev_cam_projection; - - //store camera into ubo - RendererRD::MaterialStorage::store_camera(prev_projection, scene_state.prev_ubo.projection_matrix); - RendererRD::MaterialStorage::store_camera(prev_projection.inverse(), scene_state.prev_ubo.inv_projection_matrix); - RendererRD::MaterialStorage::store_transform(p_render_data->prev_cam_transform, scene_state.prev_ubo.inv_view_matrix); - RendererRD::MaterialStorage::store_transform(p_render_data->prev_cam_transform.affine_inverse(), scene_state.prev_ubo.view_matrix); - - for (uint32_t v = 0; v < p_render_data->view_count; v++) { - prev_projection = prev_correction * p_render_data->view_projection[v]; - RendererRD::MaterialStorage::store_camera(prev_projection, scene_state.prev_ubo.projection_matrix_view[v]); - RendererRD::MaterialStorage::store_camera(prev_projection.inverse(), scene_state.prev_ubo.inv_projection_matrix_view[v]); - } - scene_state.prev_ubo.taa_jitter[0] = p_render_data->prev_taa_jitter.x; - scene_state.prev_ubo.taa_jitter[1] = p_render_data->prev_taa_jitter.y; - scene_state.prev_ubo.time -= time_step; + if (p_index >= (int)scene_state.implementation_uniform_buffers.size()) { + uint32_t from = scene_state.implementation_uniform_buffers.size(); + scene_state.implementation_uniform_buffers.resize(p_index + 1); + for (uint32_t i = from; i < scene_state.implementation_uniform_buffers.size(); i++) { + scene_state.implementation_uniform_buffers[i] = RD::get_singleton()->uniform_buffer_create(sizeof(SceneState::UBO)); } } - if (p_index >= (int)scene_state.uniform_buffers.size()) { - uint32_t from = scene_state.uniform_buffers.size(); - scene_state.uniform_buffers.resize(p_index + 1); - for (uint32_t i = from; i < scene_state.uniform_buffers.size(); i++) { - scene_state.uniform_buffers[i] = RD::get_singleton()->uniform_buffer_create(sizeof(SceneState::UBO) * 2); - } - } - RD::get_singleton()->buffer_update(scene_state.uniform_buffers[p_index], 0, sizeof(SceneState::UBO) * 2, &scene_state.ubo_data, RD::BARRIER_MASK_RASTER); + RD::get_singleton()->buffer_update(scene_state.implementation_uniform_buffers[p_index], 0, sizeof(SceneState::UBO), &scene_state.ubo, RD::BARRIER_MASK_RASTER); } void RenderForwardClustered::_update_instance_data_buffer(RenderListType p_render_list) { @@ -876,6 +744,14 @@ void RenderForwardClustered::_fill_instance_data(RenderListType p_render_list, i instance_data.lightmap_uv_scale[2] = inst->lightmap_uv_scale.size.x; instance_data.lightmap_uv_scale[3] = inst->lightmap_uv_scale.size.y; +#ifdef REAL_T_IS_DOUBLE + // Split the origin into two components, the float approximation and the missing precision + // In the shader we will combine these back together to restore the lost precision. + RendererRD::MaterialStorage::split_double(inst->transform.origin.x, &instance_data.transform[12], &instance_data.transform[3]); + RendererRD::MaterialStorage::split_double(inst->transform.origin.y, &instance_data.transform[13], &instance_data.transform[7]); + RendererRD::MaterialStorage::split_double(inst->transform.origin.z, &instance_data.transform[14], &instance_data.transform[11]); +#endif + bool cant_repeat = instance_data.flags & INSTANCE_DATA_FLAG_MULTIMESH || inst->mesh_instance.is_valid(); if (prev_surface != nullptr && !cant_repeat && prev_surface->sort.sort_key1 == surface->sort.sort_key1 && prev_surface->sort.sort_key2 == surface->sort.sort_key2 && repeats < RenderElementInfo::MAX_REPEATS) { @@ -924,7 +800,7 @@ _FORCE_INLINE_ static uint32_t _indices_to_primitives(RS::PrimitiveType p_primit static const uint32_t subtractor[RS::PRIMITIVE_MAX] = { 0, 0, 1, 0, 1 }; return (p_indices - subtractor[p_primitive]) / divisor[p_primitive]; } -void RenderForwardClustered::_fill_render_list(RenderListType p_render_list, const RenderDataRD *p_render_data, PassMode p_pass_mode, bool p_using_sdfgi, bool p_using_opaque_gi, bool p_append) { +void RenderForwardClustered::_fill_render_list(RenderListType p_render_list, const RenderDataRD *p_render_data, PassMode p_pass_mode, uint32_t p_color_pass_flags = 0, bool p_using_sdfgi, bool p_using_opaque_gi, bool p_append) { RendererRD::MeshStorage *mesh_storage = RendererRD::MeshStorage::get_singleton(); if (p_render_list == RENDER_LIST_OPAQUE) { @@ -935,9 +811,9 @@ void RenderForwardClustered::_fill_render_list(RenderListType p_render_list, con } uint32_t lightmap_captures_used = 0; - Plane near_plane = Plane(-p_render_data->cam_transform.basis.get_column(Vector3::AXIS_Z), p_render_data->cam_transform.origin); - near_plane.d += p_render_data->cam_projection.get_z_near(); - float z_max = p_render_data->cam_projection.get_z_far() - p_render_data->cam_projection.get_z_near(); + Plane near_plane = Plane(-p_render_data->scene_data->cam_transform.basis.get_column(Vector3::AXIS_Z), p_render_data->scene_data->cam_transform.origin); + near_plane.d += p_render_data->scene_data->cam_projection.get_z_near(); + float z_max = p_render_data->scene_data->cam_projection.get_z_far() - p_render_data->scene_data->cam_projection.get_z_near(); RenderList *rl = &render_list[p_render_list]; _update_dirty_geometry_instances(); @@ -968,7 +844,7 @@ void RenderForwardClustered::_fill_render_list(RenderListType p_render_list, con float fade_alpha = 1.0; if (inst->fade_near || inst->fade_far) { - float fade_dist = inst->transform.origin.distance_to(p_render_data->cam_transform.origin); + float fade_dist = inst->transform.origin.distance_to(p_render_data->scene_data->cam_transform.origin); // Use `smoothstep()` to make opacity changes more gradual and less noticeable to the player. if (inst->fade_far && fade_dist > inst->fade_far_begin) { fade_alpha = Math::smoothstep(0.0f, 1.0f, 1.0f - (fade_dist - inst->fade_far_begin) / (inst->fade_far_end - inst->fade_far_begin)); @@ -1063,13 +939,13 @@ void RenderForwardClustered::_fill_render_list(RenderListType p_render_list, con // LOD - if (p_render_data->screen_mesh_lod_threshold > 0.0 && mesh_storage->mesh_surface_has_lod(surf->surface)) { + if (p_render_data->scene_data->screen_mesh_lod_threshold > 0.0 && mesh_storage->mesh_surface_has_lod(surf->surface)) { //lod - Vector3 lod_support_min = inst->transformed_aabb.get_support(-p_render_data->lod_camera_plane.normal); - Vector3 lod_support_max = inst->transformed_aabb.get_support(p_render_data->lod_camera_plane.normal); + Vector3 lod_support_min = inst->transformed_aabb.get_support(-p_render_data->scene_data->lod_camera_plane.normal); + Vector3 lod_support_max = inst->transformed_aabb.get_support(p_render_data->scene_data->lod_camera_plane.normal); - float distance_min = p_render_data->lod_camera_plane.distance_to(lod_support_min); - float distance_max = p_render_data->lod_camera_plane.distance_to(lod_support_max); + float distance_min = p_render_data->scene_data->lod_camera_plane.distance_to(lod_support_min); + float distance_max = p_render_data->scene_data->lod_camera_plane.distance_to(lod_support_max); float distance = 0.0; @@ -1082,12 +958,12 @@ void RenderForwardClustered::_fill_render_list(RenderListType p_render_list, con distance = -distance_max; } - if (p_render_data->cam_orthogonal) { + if (p_render_data->scene_data->cam_orthogonal) { distance = 1.0; } uint32_t indices; - surf->sort.lod_index = mesh_storage->mesh_surface_get_lod(surf->surface, inst->lod_model_scale * inst->lod_bias, distance * p_render_data->lod_distance_multiplier, p_render_data->screen_mesh_lod_threshold, &indices); + surf->sort.lod_index = mesh_storage->mesh_surface_get_lod(surf->surface, inst->lod_model_scale * inst->lod_bias, distance * p_render_data->scene_data->lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, &indices); if (p_render_data->render_info) { indices = _indices_to_primitives(surf->primitive, indices); if (p_render_list == RENDER_LIST_OPAQUE) { //opaque @@ -1149,6 +1025,12 @@ void RenderForwardClustered::_fill_render_list(RenderListType p_render_list, con scene_state.used_depth_texture = true; } + if (p_color_pass_flags & COLOR_PASS_FLAG_MOTION_VECTORS) { + if ((flags & (INSTANCE_DATA_FLAG_MULTIMESH | INSTANCE_DATA_FLAG_PARTICLES)) == INSTANCE_DATA_FLAG_MULTIMESH && RendererRD::MeshStorage::get_singleton()->_multimesh_enable_motion_vectors(inst->data->base)) { + inst->transforms_uniform_set = mesh_storage->multimesh_get_3d_uniform_set(inst->data->base, scene_shader.default_shader_rd, TRANSFORMS_UNIFORM_SET); + } + } + } else if (p_pass_mode == PASS_MODE_SHADOW || p_pass_mode == PASS_MODE_SHADOW_DP) { if (surf->flags & GeometryInstanceSurfaceDataCache::FLAG_PASS_SHADOW) { rl->add_element(surf); @@ -1178,26 +1060,28 @@ void RenderForwardClustered::_setup_voxelgis(const PagedArray<RID> &p_voxelgis) } void RenderForwardClustered::_setup_lightmaps(const RenderDataRD *p_render_data, const PagedArray<RID> &p_lightmaps, const Transform3D &p_cam_transform) { + RendererRD::LightStorage *light_storage = RendererRD::LightStorage::get_singleton(); + scene_state.lightmaps_used = 0; for (int i = 0; i < (int)p_lightmaps.size(); i++) { if (i >= (int)scene_state.max_lightmaps) { break; } - RID lightmap = lightmap_instance_get_lightmap(p_lightmaps[i]); + RID lightmap = light_storage->lightmap_instance_get_lightmap(p_lightmaps[i]); - Basis to_lm = lightmap_instance_get_transform(p_lightmaps[i]).basis.inverse() * p_cam_transform.basis; + Basis to_lm = light_storage->lightmap_instance_get_transform(p_lightmaps[i]).basis.inverse() * p_cam_transform.basis; to_lm = to_lm.inverse().transposed(); //will transform normals RendererRD::MaterialStorage::store_transform_3x3(to_lm, scene_state.lightmaps[i].normal_xform); scene_state.lightmaps[i].exposure_normalization = 1.0; if (p_render_data->camera_attributes.is_valid()) { - float baked_exposure = RendererRD::LightStorage::get_singleton()->lightmap_get_baked_exposure_normalization(lightmap); + float baked_exposure = light_storage->lightmap_get_baked_exposure_normalization(lightmap); float enf = RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor(p_render_data->camera_attributes); scene_state.lightmaps[i].exposure_normalization = enf / baked_exposure; } scene_state.lightmap_ids[i] = p_lightmaps[i]; - scene_state.lightmap_has_sh[i] = RendererRD::LightStorage::get_singleton()->lightmap_uses_spherical_harmonics(lightmap); + scene_state.lightmap_has_sh[i] = light_storage->lightmap_uses_spherical_harmonics(lightmap); scene_state.lightmaps_used++; } @@ -1206,7 +1090,452 @@ void RenderForwardClustered::_setup_lightmaps(const RenderDataRD *p_render_data, } } +/* SDFGI */ + +void RenderForwardClustered::_update_sdfgi(RenderDataRD *p_render_data) { + Ref<RenderSceneBuffersRD> rb; + if (p_render_data && p_render_data->render_buffers.is_valid()) { + rb = p_render_data->render_buffers; + } + + if (rb.is_valid() && rb->has_custom_data(RB_SCOPE_SDFGI)) { + Ref<RendererRD::GI::SDFGI> sdfgi = rb->get_custom_data(RB_SCOPE_SDFGI); + float exposure_normalization = 1.0; + + if (p_render_data->camera_attributes.is_valid()) { + exposure_normalization = RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor(p_render_data->camera_attributes); + } + for (int i = 0; i < p_render_data->render_sdfgi_region_count; i++) { + sdfgi->render_region(rb, p_render_data->render_sdfgi_regions[i].region, p_render_data->render_sdfgi_regions[i].instances, exposure_normalization); + } + if (p_render_data->sdfgi_update_data->update_static) { + sdfgi->render_static_lights(p_render_data, rb, p_render_data->sdfgi_update_data->static_cascade_count, p_render_data->sdfgi_update_data->static_cascade_indices, p_render_data->sdfgi_update_data->static_positional_lights); + } + } +} + +/* Debug */ + +void RenderForwardClustered::_debug_draw_cluster(Ref<RenderSceneBuffersRD> p_render_buffers) { + if (p_render_buffers.is_valid() && current_cluster_builder != nullptr) { + RS::ViewportDebugDraw dd = get_debug_draw_mode(); + + if (dd == RS::VIEWPORT_DEBUG_DRAW_CLUSTER_OMNI_LIGHTS || dd == RS::VIEWPORT_DEBUG_DRAW_CLUSTER_SPOT_LIGHTS || dd == RS::VIEWPORT_DEBUG_DRAW_CLUSTER_DECALS || dd == RS::VIEWPORT_DEBUG_DRAW_CLUSTER_REFLECTION_PROBES) { + ClusterBuilderRD::ElementType elem_type = ClusterBuilderRD::ELEMENT_TYPE_MAX; + switch (dd) { + case RS::VIEWPORT_DEBUG_DRAW_CLUSTER_OMNI_LIGHTS: + elem_type = ClusterBuilderRD::ELEMENT_TYPE_OMNI_LIGHT; + break; + case RS::VIEWPORT_DEBUG_DRAW_CLUSTER_SPOT_LIGHTS: + elem_type = ClusterBuilderRD::ELEMENT_TYPE_SPOT_LIGHT; + break; + case RS::VIEWPORT_DEBUG_DRAW_CLUSTER_DECALS: + elem_type = ClusterBuilderRD::ELEMENT_TYPE_DECAL; + break; + case RS::VIEWPORT_DEBUG_DRAW_CLUSTER_REFLECTION_PROBES: + elem_type = ClusterBuilderRD::ELEMENT_TYPE_REFLECTION_PROBE; + break; + default: { + } + } + current_cluster_builder->debug(elem_type); + } + } +} + +//////////////////////////////////////////////////////////////////////////////// +// FOG SHADER + +void RenderForwardClustered::_update_volumetric_fog(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, const Projection &p_cam_projection, const Transform3D &p_cam_transform, const Transform3D &p_prev_cam_inv_transform, RID p_shadow_atlas, int p_directional_light_count, bool p_use_directional_shadows, int p_positional_light_count, int p_voxel_gi_count, const PagedArray<RID> &p_fog_volumes) { + ERR_FAIL_COND(p_render_buffers.is_null()); + + Ref<RenderBufferDataForwardClustered> rb_data = p_render_buffers->get_custom_data(RB_SCOPE_FORWARD_CLUSTERED); + + ERR_FAIL_COND(!p_render_buffers->has_custom_data(RB_SCOPE_GI)); + Ref<RendererRD::GI::RenderBuffersGI> rbgi = p_render_buffers->get_custom_data(RB_SCOPE_GI); + + Ref<RendererRD::GI::SDFGI> sdfgi; + if (p_render_buffers->has_custom_data(RB_SCOPE_SDFGI)) { + sdfgi = p_render_buffers->get_custom_data(RB_SCOPE_SDFGI); + } + + Size2i size = p_render_buffers->get_internal_size(); + float ratio = float(size.x) / float((size.x + size.y) / 2); + uint32_t target_width = uint32_t(float(get_volumetric_fog_size()) * ratio); + uint32_t target_height = uint32_t(float(get_volumetric_fog_size()) / ratio); + + if (p_render_buffers->has_custom_data(RB_SCOPE_FOG)) { + Ref<RendererRD::Fog::VolumetricFog> fog = p_render_buffers->get_custom_data(RB_SCOPE_FOG); + //validate + if (p_environment.is_null() || !environment_get_volumetric_fog_enabled(p_environment) || fog->width != target_width || fog->height != target_height || fog->depth != get_volumetric_fog_depth()) { + p_render_buffers->set_custom_data(RB_SCOPE_FOG, Ref<RenderBufferCustomDataRD>()); + } + } + + if (p_environment.is_null() || !environment_get_volumetric_fog_enabled(p_environment)) { + //no reason to enable or update, bye + return; + } + + if (p_environment.is_valid() && environment_get_volumetric_fog_enabled(p_environment) && !p_render_buffers->has_custom_data(RB_SCOPE_FOG)) { + //required volumetric fog but not existing, create + Ref<RendererRD::Fog::VolumetricFog> fog; + + fog.instantiate(); + fog->init(Vector3i(target_width, target_height, get_volumetric_fog_depth()), sky.sky_shader.default_shader_rd); + + p_render_buffers->set_custom_data(RB_SCOPE_FOG, fog); + } + + if (p_render_buffers->has_custom_data(RB_SCOPE_FOG)) { + Ref<RendererRD::Fog::VolumetricFog> fog = p_render_buffers->get_custom_data(RB_SCOPE_FOG); + + RendererRD::Fog::VolumetricFogSettings settings; + settings.rb_size = size; + settings.time = time; + settings.is_using_radiance_cubemap_array = is_using_radiance_cubemap_array(); + settings.max_cluster_elements = RendererRD::LightStorage::get_singleton()->get_max_cluster_elements(); + settings.volumetric_fog_filter_active = get_volumetric_fog_filter_active(); + + settings.shadow_sampler = shadow_sampler; + settings.shadow_atlas_depth = RendererRD::LightStorage::get_singleton()->owns_shadow_atlas(p_shadow_atlas) ? RendererRD::LightStorage::get_singleton()->shadow_atlas_get_texture(p_shadow_atlas) : RID(); + settings.voxel_gi_buffer = rbgi->get_voxel_gi_buffer(); + settings.omni_light_buffer = RendererRD::LightStorage::get_singleton()->get_omni_light_buffer(); + settings.spot_light_buffer = RendererRD::LightStorage::get_singleton()->get_spot_light_buffer(); + settings.directional_shadow_depth = RendererRD::LightStorage::get_singleton()->directional_shadow_get_texture(); + settings.directional_light_buffer = RendererRD::LightStorage::get_singleton()->get_directional_light_buffer(); + + settings.vfog = fog; + settings.cluster_builder = rb_data->cluster_builder; + settings.rbgi = rbgi; + settings.sdfgi = sdfgi; + settings.env = p_environment; + settings.sky = &sky; + settings.gi = &gi; + + RendererRD::Fog::get_singleton()->volumetric_fog_update(settings, p_cam_projection, p_cam_transform, p_prev_cam_inv_transform, p_shadow_atlas, p_directional_light_count, p_use_directional_shadows, p_positional_light_count, p_voxel_gi_count, p_fog_volumes); + } +} + +/* Lighting */ + +void RenderForwardClustered::setup_added_reflection_probe(const Transform3D &p_transform, const Vector3 &p_half_extents) { + if (current_cluster_builder != nullptr) { + current_cluster_builder->add_box(ClusterBuilderRD::BOX_TYPE_REFLECTION_PROBE, p_transform, p_half_extents); + } +} + +void RenderForwardClustered::setup_added_light(const RS::LightType p_type, const Transform3D &p_transform, float p_radius, float p_spot_aperture) { + if (current_cluster_builder != nullptr) { + current_cluster_builder->add_light(p_type == RS::LIGHT_SPOT ? ClusterBuilderRD::LIGHT_TYPE_SPOT : ClusterBuilderRD::LIGHT_TYPE_OMNI, p_transform, p_radius, p_spot_aperture); + } +} + +void RenderForwardClustered::setup_added_decal(const Transform3D &p_transform, const Vector3 &p_half_extents) { + if (current_cluster_builder != nullptr) { + current_cluster_builder->add_box(ClusterBuilderRD::BOX_TYPE_DECAL, p_transform, p_half_extents); + } +} + +/* Render scene */ + +void RenderForwardClustered::_process_ssao(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, RID p_normal_buffer, const Projection &p_projection) { + ERR_FAIL_NULL(ss_effects); + ERR_FAIL_COND(p_render_buffers.is_null()); + ERR_FAIL_COND(p_environment.is_null()); + + Ref<RenderBufferDataForwardClustered> rb_data = p_render_buffers->get_custom_data(RB_SCOPE_FORWARD_CLUSTERED); + ERR_FAIL_COND(rb_data.is_null()); + + RENDER_TIMESTAMP("Process SSAO"); + + RendererRD::SSEffects::SSAOSettings settings; + settings.radius = environment_get_ssao_radius(p_environment); + settings.intensity = environment_get_ssao_intensity(p_environment); + settings.power = environment_get_ssao_power(p_environment); + settings.detail = environment_get_ssao_detail(p_environment); + settings.horizon = environment_get_ssao_horizon(p_environment); + settings.sharpness = environment_get_ssao_sharpness(p_environment); + settings.full_screen_size = p_render_buffers->get_internal_size(); + + ss_effects->ssao_allocate_buffers(rb_data->ss_effects_data.ssao, settings, rb_data->ss_effects_data.linear_depth); + ss_effects->generate_ssao(rb_data->ss_effects_data.ssao, p_normal_buffer, p_projection, settings); +} + +void RenderForwardClustered::_process_ssil(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, RID p_normal_buffer, const Projection &p_projection, const Transform3D &p_transform) { + ERR_FAIL_NULL(ss_effects); + ERR_FAIL_COND(p_render_buffers.is_null()); + ERR_FAIL_COND(p_environment.is_null()); + + Ref<RenderBufferDataForwardClustered> rb_data = p_render_buffers->get_custom_data(RB_SCOPE_FORWARD_CLUSTERED); + ERR_FAIL_COND(rb_data.is_null()); + + RENDER_TIMESTAMP("Process SSIL"); + + RendererRD::SSEffects::SSILSettings settings; + settings.radius = environment_get_ssil_radius(p_environment); + settings.intensity = environment_get_ssil_intensity(p_environment); + settings.sharpness = environment_get_ssil_sharpness(p_environment); + settings.normal_rejection = environment_get_ssil_normal_rejection(p_environment); + settings.full_screen_size = p_render_buffers->get_internal_size(); + + Projection correction; + correction.set_depth_correction(true); + Projection projection = correction * p_projection; + Transform3D transform = p_transform; + transform.set_origin(Vector3(0.0, 0.0, 0.0)); + Projection last_frame_projection = rb_data->ss_effects_data.last_frame_projection * Projection(rb_data->ss_effects_data.last_frame_transform.affine_inverse()) * Projection(transform) * projection.inverse(); + + ss_effects->ssil_allocate_buffers(rb_data->ss_effects_data.ssil, settings, rb_data->ss_effects_data.linear_depth); + ss_effects->screen_space_indirect_lighting(rb_data->ss_effects_data.ssil, p_normal_buffer, p_projection, last_frame_projection, settings); + rb_data->ss_effects_data.last_frame_projection = projection; + rb_data->ss_effects_data.last_frame_transform = transform; +} + +void RenderForwardClustered::_copy_framebuffer_to_ssil(Ref<RenderSceneBuffersRD> p_render_buffers) { + ERR_FAIL_COND(p_render_buffers.is_null()); + + Ref<RenderBufferDataForwardClustered> rb_data = p_render_buffers->get_custom_data(RB_SCOPE_FORWARD_CLUSTERED); + ERR_FAIL_COND(rb_data.is_null()); + + if (rb_data->ss_effects_data.ssil.last_frame.is_valid()) { + Size2i size = p_render_buffers->get_internal_size(); + RID texture = p_render_buffers->get_internal_texture(); + copy_effects->copy_to_rect(texture, rb_data->ss_effects_data.ssil.last_frame, Rect2i(0, 0, size.x, size.y)); + + int width = size.x; + int height = size.y; + for (int i = 0; i < rb_data->ss_effects_data.ssil.last_frame_slices.size() - 1; i++) { + width = MAX(1, width >> 1); + height = MAX(1, height >> 1); + copy_effects->make_mipmap(rb_data->ss_effects_data.ssil.last_frame_slices[i], rb_data->ss_effects_data.ssil.last_frame_slices[i + 1], Size2i(width, height)); + } + } +} + +void RenderForwardClustered::_pre_opaque_render(RenderDataRD *p_render_data, bool p_use_ssao, bool p_use_ssil, bool p_use_gi, const RID *p_normal_roughness_slices, RID p_voxel_gi_buffer) { + // Render shadows while GI is rendering, due to how barriers are handled, this should happen at the same time + RendererRD::LightStorage *light_storage = RendererRD::LightStorage::get_singleton(); + RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton(); + + Ref<RenderSceneBuffersRD> rb = p_render_data->render_buffers; + Ref<RenderBufferDataForwardClustered> rb_data; + if (rb.is_valid()) { + rb_data = rb->get_custom_data(RB_SCOPE_FORWARD_CLUSTERED); + } + + if (rb.is_valid() && p_use_gi && rb->has_custom_data(RB_SCOPE_SDFGI)) { + Ref<RendererRD::GI::SDFGI> sdfgi = rb->get_custom_data(RB_SCOPE_SDFGI); + sdfgi->store_probes(); + } + + p_render_data->cube_shadows.clear(); + p_render_data->shadows.clear(); + p_render_data->directional_shadows.clear(); + + Plane camera_plane(-p_render_data->scene_data->cam_transform.basis.get_column(Vector3::AXIS_Z), p_render_data->scene_data->cam_transform.origin); + float lod_distance_multiplier = p_render_data->scene_data->cam_projection.get_lod_multiplier(); + { + for (int i = 0; i < p_render_data->render_shadow_count; i++) { + RID li = p_render_data->render_shadows[i].light; + RID base = light_storage->light_instance_get_base_light(li); + + if (light_storage->light_get_type(base) == RS::LIGHT_DIRECTIONAL) { + p_render_data->directional_shadows.push_back(i); + } else if (light_storage->light_get_type(base) == RS::LIGHT_OMNI && light_storage->light_omni_get_shadow_mode(base) == RS::LIGHT_OMNI_SHADOW_CUBE) { + p_render_data->cube_shadows.push_back(i); + } else { + p_render_data->shadows.push_back(i); + } + } + + //cube shadows are rendered in their own way + for (uint32_t i = 0; i < p_render_data->cube_shadows.size(); i++) { + _render_shadow_pass(p_render_data->render_shadows[p_render_data->cube_shadows[i]].light, p_render_data->shadow_atlas, p_render_data->render_shadows[p_render_data->cube_shadows[i]].pass, p_render_data->render_shadows[p_render_data->cube_shadows[i]].instances, camera_plane, lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, true, true, true, p_render_data->render_info); + } + + if (p_render_data->directional_shadows.size()) { + //open the pass for directional shadows + light_storage->update_directional_shadow_atlas(); + RD::get_singleton()->draw_list_begin(light_storage->direction_shadow_get_fb(), RD::INITIAL_ACTION_DROP, RD::FINAL_ACTION_DISCARD, RD::INITIAL_ACTION_CLEAR, RD::FINAL_ACTION_CONTINUE); + RD::get_singleton()->draw_list_end(); + } + } + + // Render GI + + bool render_shadows = p_render_data->directional_shadows.size() || p_render_data->shadows.size(); + bool render_gi = rb.is_valid() && p_use_gi; + + if (render_shadows && render_gi) { + RENDER_TIMESTAMP("Render GI + Render Shadows (Parallel)"); + } else if (render_shadows) { + RENDER_TIMESTAMP("Render Shadows"); + } else if (render_gi) { + RENDER_TIMESTAMP("Render GI"); + } + + //prepare shadow rendering + if (render_shadows) { + _render_shadow_begin(); + + //render directional shadows + for (uint32_t i = 0; i < p_render_data->directional_shadows.size(); i++) { + _render_shadow_pass(p_render_data->render_shadows[p_render_data->directional_shadows[i]].light, p_render_data->shadow_atlas, p_render_data->render_shadows[p_render_data->directional_shadows[i]].pass, p_render_data->render_shadows[p_render_data->directional_shadows[i]].instances, camera_plane, lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, false, i == p_render_data->directional_shadows.size() - 1, false, p_render_data->render_info); + } + //render positional shadows + for (uint32_t i = 0; i < p_render_data->shadows.size(); i++) { + _render_shadow_pass(p_render_data->render_shadows[p_render_data->shadows[i]].light, p_render_data->shadow_atlas, p_render_data->render_shadows[p_render_data->shadows[i]].pass, p_render_data->render_shadows[p_render_data->shadows[i]].instances, camera_plane, lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, i == 0, i == p_render_data->shadows.size() - 1, true, p_render_data->render_info); + } + + _render_shadow_process(); + } + + //start GI + if (render_gi) { + gi.process_gi(rb, p_normal_roughness_slices, p_voxel_gi_buffer, p_render_data->environment, p_render_data->scene_data->view_count, p_render_data->scene_data->view_projection, p_render_data->scene_data->view_eye_offset, p_render_data->scene_data->cam_transform, *p_render_data->voxel_gi_instances); + } + + //Do shadow rendering (in parallel with GI) + if (render_shadows) { + _render_shadow_end(RD::BARRIER_MASK_NO_BARRIER); + } + + if (render_gi) { + RD::get_singleton()->compute_list_end(RD::BARRIER_MASK_NO_BARRIER); //use a later barrier + } + + if (rb_data.is_valid() && ss_effects) { + if (p_use_ssao || p_use_ssil) { + Size2i size = rb->get_internal_size(); + + bool invalidate_uniform_set = false; + if (rb_data->ss_effects_data.linear_depth.is_null()) { + RD::TextureFormat tf; + tf.format = RD::DATA_FORMAT_R16_SFLOAT; + tf.texture_type = RD::TEXTURE_TYPE_2D_ARRAY; + tf.width = (size.x + 1) / 2; + tf.height = (size.y + 1) / 2; + tf.mipmaps = 5; + tf.array_layers = 4; + tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT; + rb_data->ss_effects_data.linear_depth = RD::get_singleton()->texture_create(tf, RD::TextureView()); + RD::get_singleton()->set_resource_name(rb_data->ss_effects_data.linear_depth, "SS Effects Depth"); + for (uint32_t i = 0; i < tf.mipmaps; i++) { + RID slice = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), rb_data->ss_effects_data.linear_depth, 0, i, 1, RD::TEXTURE_SLICE_2D_ARRAY); + rb_data->ss_effects_data.linear_depth_slices.push_back(slice); + RD::get_singleton()->set_resource_name(slice, "SS Effects Depth Mip " + itos(i) + " "); + } + invalidate_uniform_set = true; + } + + RID depth_texture = rb->get_depth_texture(); + ss_effects->downsample_depth(depth_texture, rb_data->ss_effects_data.linear_depth_slices, invalidate_uniform_set, size, p_render_data->scene_data->cam_projection); + } + + if (p_use_ssao) { + // TODO make these proper stereo + _process_ssao(rb, p_render_data->environment, p_normal_roughness_slices[0], p_render_data->scene_data->cam_projection); + } + + if (p_use_ssil) { + // TODO make these proper stereo + _process_ssil(rb, p_render_data->environment, p_normal_roughness_slices[0], p_render_data->scene_data->cam_projection, p_render_data->scene_data->cam_transform); + } + } + + //full barrier here, we need raster, transfer and compute and it depends from the previous work + RD::get_singleton()->barrier(RD::BARRIER_MASK_ALL, RD::BARRIER_MASK_ALL); + + if (current_cluster_builder) { + current_cluster_builder->begin(p_render_data->scene_data->cam_transform, p_render_data->scene_data->cam_projection, !p_render_data->reflection_probe.is_valid()); + } + + bool using_shadows = true; + + if (p_render_data->reflection_probe.is_valid()) { + if (!RSG::light_storage->reflection_probe_renders_shadows(light_storage->reflection_probe_instance_get_probe(p_render_data->reflection_probe))) { + using_shadows = false; + } + } else { + //do not render reflections when rendering a reflection probe + light_storage->update_reflection_probe_buffer(p_render_data, *p_render_data->reflection_probes, p_render_data->scene_data->cam_transform.affine_inverse(), p_render_data->environment); + } + + uint32_t directional_light_count = 0; + uint32_t positional_light_count = 0; + light_storage->update_light_buffers(p_render_data, *p_render_data->lights, p_render_data->scene_data->cam_transform, p_render_data->shadow_atlas, using_shadows, directional_light_count, positional_light_count, p_render_data->directional_light_soft_shadows); + texture_storage->update_decal_buffer(*p_render_data->decals, p_render_data->scene_data->cam_transform.affine_inverse()); + + p_render_data->directional_light_count = directional_light_count; + + if (current_cluster_builder) { + current_cluster_builder->bake_cluster(); + } + + if (rb.is_valid()) { + bool directional_shadows = RendererRD::LightStorage::get_singleton()->has_directional_shadows(directional_light_count); + _update_volumetric_fog(rb, p_render_data->environment, p_render_data->scene_data->cam_projection, p_render_data->scene_data->cam_transform, p_render_data->scene_data->prev_cam_transform.affine_inverse(), p_render_data->shadow_atlas, directional_light_count, directional_shadows, positional_light_count, p_render_data->voxel_gi_count, *p_render_data->fog_volumes); + } +} + +void RenderForwardClustered::_process_ssr(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_dest_framebuffer, const RID *p_normal_slices, RID p_specular_buffer, const RID *p_metallic_slices, RID p_environment, const Projection *p_projections, const Vector3 *p_eye_offsets, bool p_use_additive) { + ERR_FAIL_NULL(ss_effects); + ERR_FAIL_COND(p_render_buffers.is_null()); + + Ref<RenderBufferDataForwardClustered> rb_data = p_render_buffers->get_custom_data(RB_SCOPE_FORWARD_CLUSTERED); + ERR_FAIL_COND(rb_data.is_null()); + + Size2i internal_size = p_render_buffers->get_internal_size(); + bool can_use_effects = internal_size.x >= 8 && internal_size.y >= 8; + uint32_t view_count = p_render_buffers->get_view_count(); + + if (!can_use_effects) { + //just copy + copy_effects->merge_specular(p_dest_framebuffer, p_specular_buffer, p_use_additive ? RID() : p_render_buffers->get_internal_texture(), RID(), view_count); + return; + } + + ERR_FAIL_COND(p_environment.is_null()); + ERR_FAIL_COND(!environment_get_ssr_enabled(p_environment)); + + Size2i half_size = Size2i(internal_size.x / 2, internal_size.y / 2); + if (rb_data->ss_effects_data.ssr.output.is_null()) { + ss_effects->ssr_allocate_buffers(rb_data->ss_effects_data.ssr, _render_buffers_get_color_format(), half_size, view_count); + } + RID texture_slices[RendererSceneRender::MAX_RENDER_VIEWS]; + RID depth_slices[RendererSceneRender::MAX_RENDER_VIEWS]; + for (uint32_t v = 0; v < view_count; v++) { + texture_slices[v] = p_render_buffers->get_internal_texture(v); + depth_slices[v] = p_render_buffers->get_depth_texture(v); + } + ss_effects->screen_space_reflection(rb_data->ss_effects_data.ssr, texture_slices, p_normal_slices, p_metallic_slices, depth_slices, half_size, environment_get_ssr_max_steps(p_environment), environment_get_ssr_fade_in(p_environment), environment_get_ssr_fade_out(p_environment), environment_get_ssr_depth_tolerance(p_environment), view_count, p_projections, p_eye_offsets); + copy_effects->merge_specular(p_dest_framebuffer, p_specular_buffer, p_use_additive ? RID() : p_render_buffers->get_internal_texture(), rb_data->ss_effects_data.ssr.output, view_count); +} + +void RenderForwardClustered::_process_sss(Ref<RenderSceneBuffersRD> p_render_buffers, const Projection &p_camera) { + ERR_FAIL_COND(p_render_buffers.is_null()); + + Size2i internal_size = p_render_buffers->get_internal_size(); + bool can_use_effects = internal_size.x >= 8 && internal_size.y >= 8; + + if (!can_use_effects) { + //just copy + return; + } + + p_render_buffers->allocate_blur_textures(); + + for (uint32_t v = 0; v < p_render_buffers->get_view_count(); v++) { + RID internal_texture = p_render_buffers->get_internal_texture(v); + RID depth_texture = p_render_buffers->get_depth_texture(v); + ss_effects->sub_surface_scattering(p_render_buffers, internal_texture, depth_texture, p_camera, internal_size); + } +} + void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Color &p_default_bg_color) { + RendererRD::LightStorage *light_storage = RendererRD::LightStorage::get_singleton(); + Ref<RenderSceneBuffersRD> rb; Ref<RenderBufferDataForwardClustered> rb_data; if (p_render_data && p_render_data->render_buffers.is_valid()) { @@ -1218,11 +1547,68 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co //first of all, make a new render pass //fill up ubo + RENDER_TIMESTAMP("Prepare 3D Scene"); + + // sdfgi first + _update_sdfgi(p_render_data); + + // assign render indices to voxel_gi_instances + for (uint32_t i = 0; i < (uint32_t)p_render_data->voxel_gi_instances->size(); i++) { + RID voxel_gi_instance = (*p_render_data->voxel_gi_instances)[i]; + gi.voxel_gi_instance_set_render_index(voxel_gi_instance, i); + } + + // obtain cluster builder + if (rb_data.is_valid()) { + current_cluster_builder = rb_data->cluster_builder; + } else if (light_storage->owns_reflection_probe_instance(p_render_data->reflection_probe)) { + current_cluster_builder = light_storage->reflection_probe_instance_get_cluster_builder(p_render_data->reflection_probe, &cluster_builder_shared); + + if (p_render_data->camera_attributes.is_valid()) { + light_storage->reflection_probe_set_baked_exposure(light_storage->reflection_probe_instance_get_probe(p_render_data->reflection_probe), RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor(p_render_data->camera_attributes)); + } + } else { + ERR_PRINT("No render buffer nor reflection atlas, bug"); //should never happen, will crash + current_cluster_builder = nullptr; + } + + p_render_data->voxel_gi_count = 0; + + if (rb.is_valid()) { + if (rb->has_custom_data(RB_SCOPE_SDFGI)) { + Ref<RendererRD::GI::SDFGI> sdfgi = rb->get_custom_data(RB_SCOPE_SDFGI); + if (sdfgi.is_valid()) { + sdfgi->update_cascades(); + sdfgi->pre_process_gi(p_render_data->scene_data->cam_transform, p_render_data); + sdfgi->update_light(); + } + } + + gi.setup_voxel_gi_instances(p_render_data, p_render_data->render_buffers, p_render_data->scene_data->cam_transform, *p_render_data->voxel_gi_instances, p_render_data->voxel_gi_count); + } + + if (current_cluster_builder != nullptr) { + p_render_data->cluster_buffer = current_cluster_builder->get_cluster_buffer(); + p_render_data->cluster_size = current_cluster_builder->get_cluster_size(); + p_render_data->cluster_max_elements = current_cluster_builder->get_max_cluster_elements(); + } + + _update_vrs(rb); + RENDER_TIMESTAMP("Setup 3D Scene"); - //scene_state.ubo.subsurface_scatter_width = subsurface_scatter_size; - scene_state.ubo.directional_light_count = 0; - scene_state.ubo.opaque_prepass_threshold = 0.99f; + // check if we need motion vectors + if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_MOTION_VECTORS) { + p_render_data->scene_data->calculate_motion_vectors = true; + } else if (rb.is_valid() && rb->get_use_taa()) { + p_render_data->scene_data->calculate_motion_vectors = true; + } else { + p_render_data->scene_data->calculate_motion_vectors = false; + } + + //p_render_data->scene_data->subsurface_scatter_width = subsurface_scatter_size; + p_render_data->scene_data->directional_light_count = 0; + p_render_data->scene_data->opaque_prepass_threshold = 0.99f; Size2i screen_size; RID color_framebuffer; @@ -1285,22 +1671,22 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co }; } - if (p_render_data->view_count > 1) { + if (p_render_data->scene_data->view_count > 1) { color_pass_flags |= COLOR_PASS_FLAG_MULTIVIEW; } color_framebuffer = rb_data->get_color_pass_fb(color_pass_flags); color_only_framebuffer = rb_data->get_color_only_fb(); } else if (p_render_data->reflection_probe.is_valid()) { - uint32_t resolution = reflection_probe_instance_get_resolution(p_render_data->reflection_probe); + uint32_t resolution = light_storage->reflection_probe_instance_get_resolution(p_render_data->reflection_probe); screen_size.x = resolution; screen_size.y = resolution; - color_framebuffer = reflection_probe_instance_get_framebuffer(p_render_data->reflection_probe, p_render_data->reflection_probe_pass); + color_framebuffer = light_storage->reflection_probe_instance_get_framebuffer(p_render_data->reflection_probe, p_render_data->reflection_probe_pass); color_only_framebuffer = color_framebuffer; - depth_framebuffer = reflection_probe_instance_get_depth_framebuffer(p_render_data->reflection_probe, p_render_data->reflection_probe_pass); + depth_framebuffer = light_storage->reflection_probe_instance_get_depth_framebuffer(p_render_data->reflection_probe, p_render_data->reflection_probe_pass); - if (RendererRD::LightStorage::get_singleton()->reflection_probe_is_interior(reflection_probe_instance_get_probe(p_render_data->reflection_probe))) { + if (light_storage->reflection_probe_is_interior(light_storage->reflection_probe_instance_get_probe(p_render_data->reflection_probe))) { p_render_data->environment = RID(); //no environment on interiors } @@ -1309,20 +1695,17 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co ERR_FAIL(); //bug? } - scene_state.ubo.viewport_size[0] = screen_size.x; - scene_state.ubo.viewport_size[1] = screen_size.y; - - scene_state.ubo.emissive_exposure_normalization = -1.0; + p_render_data->scene_data->emissive_exposure_normalization = -1.0; RD::get_singleton()->draw_command_begin_label("Render Setup"); - _setup_lightmaps(p_render_data, *p_render_data->lightmaps, p_render_data->cam_transform); + _setup_lightmaps(p_render_data, *p_render_data->lightmaps, p_render_data->scene_data->cam_transform); _setup_voxelgis(*p_render_data->voxel_gi_instances); _setup_environment(p_render_data, p_render_data->reflection_probe.is_valid(), screen_size, !p_render_data->reflection_probe.is_valid(), p_default_bg_color, false); _update_render_base_uniform_set(); //may have changed due to the above (light buffer enlarged, as an example) - _fill_render_list(RENDER_LIST_OPAQUE, p_render_data, PASS_MODE_COLOR, using_sdfgi, using_sdfgi || using_voxelgi); + _fill_render_list(RENDER_LIST_OPAQUE, p_render_data, PASS_MODE_COLOR, color_pass_flags, using_sdfgi, using_sdfgi || using_voxelgi); render_list[RENDER_LIST_OPAQUE].sort_by_key(); render_list[RENDER_LIST_ALPHA].sort_by_reverse_depth_and_priority(); _fill_instance_data(RENDER_LIST_OPAQUE, p_render_data->render_info ? p_render_data->render_info->info[RS::VIEWPORT_RENDER_INFO_TYPE_VISIBLE] : (int *)nullptr); @@ -1330,7 +1713,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co RD::get_singleton()->draw_command_end_label(); - bool using_sss = rb_data.is_valid() && scene_state.used_sss && sub_surface_scattering_get_quality() != RS::SUB_SURFACE_SCATTERING_QUALITY_DISABLED; + bool using_sss = rb_data.is_valid() && scene_state.used_sss && ss_effects->sss_get_quality() != RS::SUB_SURFACE_SCATTERING_QUALITY_DISABLED; if (using_sss && !using_separate_specular) { using_separate_specular = true; @@ -1396,20 +1779,20 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co if (draw_sky || draw_sky_fog_only || environment_get_reflection_source(p_render_data->environment) == RS::ENV_REFLECTION_SOURCE_SKY || environment_get_ambient_source(p_render_data->environment) == RS::ENV_AMBIENT_SOURCE_SKY) { RENDER_TIMESTAMP("Setup Sky"); RD::get_singleton()->draw_command_begin_label("Setup Sky"); - Projection projection = p_render_data->cam_projection; + Projection projection = p_render_data->scene_data->cam_projection; if (p_render_data->reflection_probe.is_valid()) { Projection correction; correction.set_depth_correction(true); - projection = correction * p_render_data->cam_projection; + projection = correction * p_render_data->scene_data->cam_projection; } - sky.setup(p_render_data->environment, rb, *p_render_data->lights, p_render_data->camera_attributes, projection, p_render_data->cam_transform, screen_size, this); + sky.setup(p_render_data->environment, rb, *p_render_data->lights, p_render_data->camera_attributes, projection, p_render_data->scene_data->cam_transform, screen_size, this); sky_energy_multiplier *= bg_energy_multiplier; RID sky_rid = environment_get_sky(p_render_data->environment); if (sky_rid.is_valid()) { - sky.update(p_render_data->environment, projection, p_render_data->cam_transform, time, sky_energy_multiplier); + sky.update(p_render_data->environment, projection, p_render_data->scene_data->cam_transform, time, sky_energy_multiplier); radiance_texture = sky.sky_get_radiance_texture_rd(sky_rid); } else { // do not try to draw sky if invalid @@ -1448,7 +1831,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co RID rp_uniform_set = _setup_render_pass_uniform_set(RENDER_LIST_OPAQUE, nullptr, RID()); bool finish_depth = using_ssao || using_sdfgi || using_voxelgi; - RenderListParameters render_list_params(render_list[RENDER_LIST_OPAQUE].elements.ptr(), render_list[RENDER_LIST_OPAQUE].element_info.ptr(), render_list[RENDER_LIST_OPAQUE].elements.size(), reverse_cull, depth_pass_mode, 0, rb_data.is_null(), p_render_data->directional_light_soft_shadows, rp_uniform_set, get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_WIREFRAME, Vector2(), p_render_data->lod_camera_plane, p_render_data->lod_distance_multiplier, p_render_data->screen_mesh_lod_threshold, p_render_data->view_count); + RenderListParameters render_list_params(render_list[RENDER_LIST_OPAQUE].elements.ptr(), render_list[RENDER_LIST_OPAQUE].element_info.ptr(), render_list[RENDER_LIST_OPAQUE].elements.size(), reverse_cull, depth_pass_mode, 0, rb_data.is_null(), p_render_data->directional_light_soft_shadows, rp_uniform_set, get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_WIREFRAME, Vector2(), p_render_data->scene_data->lod_camera_plane, p_render_data->scene_data->lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, p_render_data->scene_data->view_count); _render_list_with_threads(&render_list_params, depth_framebuffer, needs_pre_resolve ? RD::INITIAL_ACTION_CONTINUE : RD::INITIAL_ACTION_CLEAR, RD::FINAL_ACTION_READ, needs_pre_resolve ? RD::INITIAL_ACTION_CONTINUE : RD::INITIAL_ACTION_CLEAR, finish_depth ? RD::FINAL_ACTION_READ : RD::FINAL_ACTION_CONTINUE, needs_pre_resolve ? Vector<Color>() : depth_pass_clear); RD::get_singleton()->draw_command_end_label(); @@ -1488,8 +1871,8 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co RD::get_singleton()->draw_command_begin_label("Render Opaque Pass"); - scene_state.ubo.directional_light_count = p_render_data->directional_light_count; - scene_state.ubo.opaque_prepass_threshold = 0.0f; + p_render_data->scene_data->directional_light_count = p_render_data->directional_light_count; + p_render_data->scene_data->opaque_prepass_threshold = 0.0f; _setup_environment(p_render_data, p_render_data->reflection_probe.is_valid(), screen_size, !p_render_data->reflection_probe.is_valid(), p_default_bg_color, rb.is_valid()); @@ -1518,7 +1901,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co } } - RenderListParameters render_list_params(render_list[RENDER_LIST_OPAQUE].elements.ptr(), render_list[RENDER_LIST_OPAQUE].element_info.ptr(), render_list[RENDER_LIST_OPAQUE].elements.size(), reverse_cull, PASS_MODE_COLOR, color_pass_flags, rb_data.is_null(), p_render_data->directional_light_soft_shadows, rp_uniform_set, get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_WIREFRAME, Vector2(), p_render_data->lod_camera_plane, p_render_data->lod_distance_multiplier, p_render_data->screen_mesh_lod_threshold, p_render_data->view_count); + RenderListParameters render_list_params(render_list[RENDER_LIST_OPAQUE].elements.ptr(), render_list[RENDER_LIST_OPAQUE].element_info.ptr(), render_list[RENDER_LIST_OPAQUE].elements.size(), reverse_cull, PASS_MODE_COLOR, color_pass_flags, rb_data.is_null(), p_render_data->directional_light_soft_shadows, rp_uniform_set, get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_WIREFRAME, Vector2(), p_render_data->scene_data->lod_camera_plane, p_render_data->scene_data->lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, p_render_data->scene_data->view_count); _render_list_with_threads(&render_list_params, color_framebuffer, keep_color ? RD::INITIAL_ACTION_KEEP : RD::INITIAL_ACTION_CLEAR, will_continue_color ? RD::FINAL_ACTION_CONTINUE : RD::FINAL_ACTION_READ, depth_pre_pass ? (continue_depth ? RD::INITIAL_ACTION_CONTINUE : RD::INITIAL_ACTION_KEEP) : RD::INITIAL_ACTION_CLEAR, will_continue_depth ? RD::FINAL_ACTION_CONTINUE : RD::FINAL_ACTION_READ, c, 1.0, 0); if (will_continue_color && using_separate_specular) { // close the specular framebuffer, as it's no longer used @@ -1536,7 +1919,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co Projection dc; dc.set_depth_correction(true); - Projection cm = (dc * p_render_data->cam_projection) * Projection(p_render_data->cam_transform.affine_inverse()); + Projection cm = (dc * p_render_data->scene_data->cam_projection) * Projection(p_render_data->scene_data->cam_transform.affine_inverse()); RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(color_only_framebuffer, RD::INITIAL_ACTION_CONTINUE, will_continue_color ? RD::FINAL_ACTION_CONTINUE : RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_CONTINUE, will_continue_depth ? RD::FINAL_ACTION_CONTINUE : RD::FINAL_ACTION_READ); RD::get_singleton()->draw_command_begin_label("Debug VoxelGIs"); for (int i = 0; i < (int)p_render_data->voxel_gi_instances->size(); i++) { @@ -1554,10 +1937,10 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co Projection dc; dc.set_depth_correction(true); Projection cms[RendererSceneRender::MAX_RENDER_VIEWS]; - for (uint32_t v = 0; v < p_render_data->view_count; v++) { - cms[v] = (dc * p_render_data->view_projection[v]) * Projection(p_render_data->cam_transform.affine_inverse()); + for (uint32_t v = 0; v < p_render_data->scene_data->view_count; v++) { + cms[v] = (dc * p_render_data->scene_data->view_projection[v]) * Projection(p_render_data->scene_data->cam_transform.affine_inverse()); } - _debug_sdfgi_probes(rb, color_only_framebuffer, p_render_data->view_count, cms, will_continue_color, will_continue_depth); + _debug_sdfgi_probes(rb, color_only_framebuffer, p_render_data->scene_data->view_count, cms, will_continue_color, will_continue_depth); } if (draw_sky || draw_sky_fog_only) { @@ -1568,10 +1951,10 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co if (p_render_data->reflection_probe.is_valid()) { Projection correction; correction.set_depth_correction(true); - Projection projection = correction * p_render_data->cam_projection; - sky.draw(p_render_data->environment, can_continue_color, can_continue_depth, color_only_framebuffer, 1, &projection, p_render_data->cam_transform, time, sky_energy_multiplier); + Projection projection = correction * p_render_data->scene_data->cam_projection; + sky.draw(p_render_data->environment, can_continue_color, can_continue_depth, color_only_framebuffer, 1, &projection, p_render_data->scene_data->cam_transform, time, sky_energy_multiplier); } else { - sky.draw(p_render_data->environment, can_continue_color, can_continue_depth, color_only_framebuffer, p_render_data->view_count, p_render_data->view_projection, p_render_data->cam_transform, time, sky_energy_multiplier); + sky.draw(p_render_data->environment, can_continue_color, can_continue_depth, color_only_framebuffer, p_render_data->scene_data->view_count, p_render_data->scene_data->view_projection, p_render_data->scene_data->cam_transform, time, sky_energy_multiplier); } RD::get_singleton()->draw_command_end_label(); } @@ -1598,7 +1981,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co if (using_sss) { RENDER_TIMESTAMP("Sub-Surface Scattering"); RD::get_singleton()->draw_command_begin_label("Process Sub-Surface Scattering"); - _process_sss(rb, p_render_data->cam_projection); + _process_sss(rb, p_render_data->scene_data->cam_projection); RD::get_singleton()->draw_command_end_label(); } @@ -1606,15 +1989,15 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co RENDER_TIMESTAMP("Screen-Space Reflections"); RD::get_singleton()->draw_command_begin_label("Process Screen-Space Reflections"); RID specular_views[RendererSceneRender::MAX_RENDER_VIEWS]; - for (uint32_t v = 0; v < p_render_data->view_count; v++) { + for (uint32_t v = 0; v < p_render_data->scene_data->view_count; v++) { specular_views[v] = rb_data->get_specular(v); } - _process_ssr(rb, color_only_framebuffer, normal_roughness_views, rb_data->get_specular(), specular_views, Color(0, 0, 0, 1), p_render_data->environment, p_render_data->view_projection, p_render_data->view_eye_offset, rb->get_msaa_3d() == RS::VIEWPORT_MSAA_DISABLED); + _process_ssr(rb, color_only_framebuffer, normal_roughness_views, rb_data->get_specular(), specular_views, p_render_data->environment, p_render_data->scene_data->view_projection, p_render_data->scene_data->view_eye_offset, rb->get_msaa_3d() == RS::VIEWPORT_MSAA_DISABLED); RD::get_singleton()->draw_command_end_label(); } else { //just mix specular back RENDER_TIMESTAMP("Merge Specular"); - copy_effects->merge_specular(color_only_framebuffer, rb_data->get_specular(), rb->get_msaa_3d() == RS::VIEWPORT_MSAA_DISABLED ? RID() : rb->get_internal_texture(), RID(), p_render_data->view_count); + copy_effects->merge_specular(color_only_framebuffer, rb_data->get_specular(), rb->get_msaa_3d() == RS::VIEWPORT_MSAA_DISABLED ? RID() : rb->get_internal_texture(), RID(), p_render_data->scene_data->view_count); } } @@ -1639,7 +2022,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co { uint32_t transparent_color_pass_flags = (color_pass_flags | COLOR_PASS_FLAG_TRANSPARENT) & ~(COLOR_PASS_FLAG_SEPARATE_SPECULAR); RID alpha_framebuffer = rb_data.is_valid() ? rb_data->get_color_pass_fb(transparent_color_pass_flags) : color_only_framebuffer; - RenderListParameters render_list_params(render_list[RENDER_LIST_ALPHA].elements.ptr(), render_list[RENDER_LIST_ALPHA].element_info.ptr(), render_list[RENDER_LIST_ALPHA].elements.size(), false, PASS_MODE_COLOR, transparent_color_pass_flags, rb_data.is_null(), p_render_data->directional_light_soft_shadows, rp_uniform_set, get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_WIREFRAME, Vector2(), p_render_data->lod_camera_plane, p_render_data->lod_distance_multiplier, p_render_data->screen_mesh_lod_threshold, p_render_data->view_count); + RenderListParameters render_list_params(render_list[RENDER_LIST_ALPHA].elements.ptr(), render_list[RENDER_LIST_ALPHA].element_info.ptr(), render_list[RENDER_LIST_ALPHA].elements.size(), false, PASS_MODE_COLOR, transparent_color_pass_flags, rb_data.is_null(), p_render_data->directional_light_soft_shadows, rp_uniform_set, get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_WIREFRAME, Vector2(), p_render_data->scene_data->lod_camera_plane, p_render_data->scene_data->lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, p_render_data->scene_data->view_count); _render_list_with_threads(&render_list_params, alpha_framebuffer, can_continue_color ? RD::INITIAL_ACTION_CONTINUE : RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ, can_continue_depth ? RD::INITIAL_ACTION_CONTINUE : RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ); } @@ -1670,7 +2053,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co if (rb.is_valid() && taa && rb->get_use_taa()) { RENDER_TIMESTAMP("TAA") - taa->process(rb, _render_buffers_get_color_format(), p_render_data->z_near, p_render_data->z_far); + taa->process(rb, _render_buffers_get_color_format(), p_render_data->scene_data->z_near, p_render_data->scene_data->z_far); } if (rb.is_valid()) { @@ -1680,6 +2063,229 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co _render_buffers_post_process_and_tonemap(p_render_data); } + + if (rb.is_valid()) { + _render_buffers_debug_draw(rb, p_render_data->shadow_atlas, p_render_data->occluder_debug_tex); + + if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_SDFGI && rb->has_custom_data(RB_SCOPE_SDFGI)) { + Ref<RendererRD::GI::SDFGI> sdfgi = rb->get_custom_data(RB_SCOPE_SDFGI); + Vector<RID> view_rids; + + // SDFGI renders at internal resolution, need to check if our debug correctly supports outputting upscaled. + Size2i size = rb->get_internal_size(); + RID source_texture = rb->get_internal_texture(); + for (uint32_t v = 0; v < rb->get_view_count(); v++) { + view_rids.push_back(rb->get_internal_texture(v)); + } + + sdfgi->debug_draw(p_render_data->scene_data->view_count, p_render_data->scene_data->view_projection, p_render_data->scene_data->cam_transform, size.x, size.y, rb->get_render_target(), source_texture, view_rids); + } + } +} + +void RenderForwardClustered::_render_buffers_debug_draw(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_shadow_atlas, RID p_occlusion_buffer) { + RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton(); + ERR_FAIL_COND(p_render_buffers.is_null()); + + Ref<RenderBufferDataForwardClustered> rb_data = p_render_buffers->get_custom_data(RB_SCOPE_FORWARD_CLUSTERED); + ERR_FAIL_COND(rb_data.is_null()); + + RendererSceneRenderRD::_render_buffers_debug_draw(p_render_buffers, p_shadow_atlas, p_occlusion_buffer); + + RID render_target = p_render_buffers->get_render_target(); + + if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_SSAO && rb_data->ss_effects_data.ssao.ao_final.is_valid()) { + Size2 rtsize = texture_storage->render_target_get_size(render_target); + copy_effects->copy_to_fb_rect(rb_data->ss_effects_data.ssao.ao_final, texture_storage->render_target_get_rd_framebuffer(render_target), Rect2(Vector2(), rtsize), false, true); + } + + if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_SSIL && rb_data->ss_effects_data.ssil.ssil_final.is_valid()) { + Size2 rtsize = texture_storage->render_target_get_size(render_target); + copy_effects->copy_to_fb_rect(rb_data->ss_effects_data.ssil.ssil_final, texture_storage->render_target_get_rd_framebuffer(render_target), Rect2(Vector2(), rtsize), false, false); + } + + if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_GI_BUFFER && p_render_buffers->has_texture(RB_SCOPE_GI, RB_TEX_AMBIENT)) { + Size2 rtsize = texture_storage->render_target_get_size(render_target); + RID ambient_texture = p_render_buffers->get_texture(RB_SCOPE_GI, RB_TEX_AMBIENT); + RID reflection_texture = p_render_buffers->get_texture(RB_SCOPE_GI, RB_TEX_REFLECTION); + copy_effects->copy_to_fb_rect(ambient_texture, texture_storage->render_target_get_rd_framebuffer(render_target), Rect2(Vector2(), rtsize), false, false, false, true, reflection_texture, p_render_buffers->get_view_count() > 1); + } +} + +void RenderForwardClustered::_render_shadow_pass(RID p_light, RID p_shadow_atlas, int p_pass, const PagedArray<RenderGeometryInstance *> &p_instances, const Plane &p_camera_plane, float p_lod_distance_multiplier, float p_screen_mesh_lod_threshold, bool p_open_pass, bool p_close_pass, bool p_clear_region, RenderingMethod::RenderInfo *p_render_info) { + RendererRD::LightStorage *light_storage = RendererRD::LightStorage::get_singleton(); + + ERR_FAIL_COND(!light_storage->owns_light_instance(p_light)); + + RID base = light_storage->light_instance_get_base_light(p_light); + + Rect2i atlas_rect; + uint32_t atlas_size = 1; + RID atlas_fb; + + bool using_dual_paraboloid = false; + bool using_dual_paraboloid_flip = false; + Vector2i dual_paraboloid_offset; + RID render_fb; + RID render_texture; + float zfar; + + bool use_pancake = false; + bool render_cubemap = false; + bool finalize_cubemap = false; + + bool flip_y = false; + + Projection light_projection; + Transform3D light_transform; + + if (light_storage->light_get_type(base) == RS::LIGHT_DIRECTIONAL) { + //set pssm stuff + uint64_t last_scene_shadow_pass = light_storage->light_instance_get_shadow_pass(p_light); + if (last_scene_shadow_pass != get_scene_pass()) { + light_storage->light_instance_set_directional_rect(p_light, light_storage->get_directional_shadow_rect()); + light_storage->directional_shadow_increase_current_light(); + light_storage->light_instance_set_shadow_pass(p_light, get_scene_pass()); + } + + use_pancake = light_storage->light_get_param(base, RS::LIGHT_PARAM_SHADOW_PANCAKE_SIZE) > 0; + light_projection = light_storage->light_instance_get_shadow_camera(p_light, p_pass); + light_transform = light_storage->light_instance_get_shadow_transform(p_light, p_pass); + + atlas_rect = light_storage->light_instance_get_directional_rect(p_light); + + if (light_storage->light_directional_get_shadow_mode(base) == RS::LIGHT_DIRECTIONAL_SHADOW_PARALLEL_4_SPLITS) { + atlas_rect.size.width /= 2; + atlas_rect.size.height /= 2; + + if (p_pass == 1) { + atlas_rect.position.x += atlas_rect.size.width; + } else if (p_pass == 2) { + atlas_rect.position.y += atlas_rect.size.height; + } else if (p_pass == 3) { + atlas_rect.position += atlas_rect.size; + } + } else if (light_storage->light_directional_get_shadow_mode(base) == RS::LIGHT_DIRECTIONAL_SHADOW_PARALLEL_2_SPLITS) { + atlas_rect.size.height /= 2; + + if (p_pass == 0) { + } else { + atlas_rect.position.y += atlas_rect.size.height; + } + } + + int directional_shadow_size = light_storage->directional_shadow_get_size(); + atlas_rect.position /= directional_shadow_size; + atlas_rect.size /= directional_shadow_size; + + light_storage->light_instance_set_directional_shadow_atlas_rect(p_light, p_pass, atlas_rect); + + zfar = RSG::light_storage->light_get_param(base, RS::LIGHT_PARAM_RANGE); + + render_fb = light_storage->direction_shadow_get_fb(); + render_texture = RID(); + flip_y = true; + + } else { + //set from shadow atlas + + ERR_FAIL_COND(!light_storage->owns_shadow_atlas(p_shadow_atlas)); + ERR_FAIL_COND(!light_storage->shadow_atlas_owns_light_instance(p_shadow_atlas, p_light)); + + RSG::light_storage->shadow_atlas_update(p_shadow_atlas); + + uint32_t key = light_storage->shadow_atlas_get_light_instance_key(p_shadow_atlas, p_light); + + uint32_t quadrant = (key >> RendererRD::LightStorage::QUADRANT_SHIFT) & 0x3; + uint32_t shadow = key & RendererRD::LightStorage::SHADOW_INDEX_MASK; + uint32_t subdivision = light_storage->shadow_atlas_get_quadrant_subdivision(p_shadow_atlas, quadrant); + + ERR_FAIL_INDEX((int)shadow, light_storage->shadow_atlas_get_quadrant_shadow_size(p_shadow_atlas, quadrant)); + + uint32_t shadow_atlas_size = light_storage->shadow_atlas_get_size(p_shadow_atlas); + uint32_t quadrant_size = shadow_atlas_size >> 1; + + atlas_rect.position.x = (quadrant & 1) * quadrant_size; + atlas_rect.position.y = (quadrant >> 1) * quadrant_size; + + uint32_t shadow_size = (quadrant_size / subdivision); + atlas_rect.position.x += (shadow % subdivision) * shadow_size; + atlas_rect.position.y += (shadow / subdivision) * shadow_size; + + atlas_rect.size.width = shadow_size; + atlas_rect.size.height = shadow_size; + + zfar = light_storage->light_get_param(base, RS::LIGHT_PARAM_RANGE); + + if (light_storage->light_get_type(base) == RS::LIGHT_OMNI) { + bool wrap = (shadow + 1) % subdivision == 0; + dual_paraboloid_offset = wrap ? Vector2i(1 - subdivision, 1) : Vector2i(1, 0); + + if (light_storage->light_omni_get_shadow_mode(base) == RS::LIGHT_OMNI_SHADOW_CUBE) { + render_texture = light_storage->get_cubemap(shadow_size / 2); + render_fb = light_storage->get_cubemap_fb(shadow_size / 2, p_pass); + + light_projection = light_storage->light_instance_get_shadow_camera(p_light, p_pass); + light_transform = light_storage->light_instance_get_shadow_transform(p_light, p_pass); + render_cubemap = true; + finalize_cubemap = p_pass == 5; + atlas_fb = light_storage->shadow_atlas_get_fb(p_shadow_atlas); + + atlas_size = shadow_atlas_size; + + if (p_pass == 0) { + _render_shadow_begin(); + } + + } else { + atlas_rect.position.x += 1; + atlas_rect.position.y += 1; + atlas_rect.size.x -= 2; + atlas_rect.size.y -= 2; + + atlas_rect.position += p_pass * atlas_rect.size * dual_paraboloid_offset; + + light_projection = light_storage->light_instance_get_shadow_camera(p_light, 0); + light_transform = light_storage->light_instance_get_shadow_transform(p_light, 0); + + using_dual_paraboloid = true; + using_dual_paraboloid_flip = p_pass == 1; + render_fb = light_storage->shadow_atlas_get_fb(p_shadow_atlas); + flip_y = true; + } + + } else if (light_storage->light_get_type(base) == RS::LIGHT_SPOT) { + light_projection = light_storage->light_instance_get_shadow_camera(p_light, 0); + light_transform = light_storage->light_instance_get_shadow_transform(p_light, 0); + + render_fb = light_storage->shadow_atlas_get_fb(p_shadow_atlas); + + flip_y = true; + } + } + + if (render_cubemap) { + //rendering to cubemap + _render_shadow_append(render_fb, p_instances, light_projection, light_transform, zfar, 0, 0, false, false, use_pancake, p_camera_plane, p_lod_distance_multiplier, p_screen_mesh_lod_threshold, Rect2(), false, true, true, true, p_render_info); + if (finalize_cubemap) { + _render_shadow_process(); + _render_shadow_end(); + //reblit + Rect2 atlas_rect_norm = atlas_rect; + atlas_rect_norm.position /= float(atlas_size); + atlas_rect_norm.size /= float(atlas_size); + copy_effects->copy_cubemap_to_dp(render_texture, atlas_fb, atlas_rect_norm, atlas_rect.size, light_projection.get_z_near(), light_projection.get_z_far(), false); + atlas_rect_norm.position += Vector2(dual_paraboloid_offset) * atlas_rect_norm.size; + copy_effects->copy_cubemap_to_dp(render_texture, atlas_fb, atlas_rect_norm, atlas_rect.size, light_projection.get_z_near(), light_projection.get_z_far(), true); + + //restore transform so it can be properly used + light_storage->light_instance_set_shadow_transform(p_light, Projection(), light_storage->light_instance_get_base_transform(p_light), zfar, 0, 0, 0); + } + + } else { + //render shadow + _render_shadow_append(render_fb, p_instances, light_projection, light_transform, zfar, 0, 0, using_dual_paraboloid, using_dual_paraboloid_flip, use_pancake, p_camera_plane, p_lod_distance_multiplier, p_screen_mesh_lod_threshold, atlas_rect, flip_y, p_clear_region, p_open_pass, p_close_pass, p_render_info); + } } void RenderForwardClustered::_render_shadow_begin() { @@ -1691,39 +2297,41 @@ void RenderForwardClustered::_render_shadow_begin() { scene_state.instance_data[RENDER_LIST_SECONDARY].clear(); } -void RenderForwardClustered::_render_shadow_append(RID p_framebuffer, const PagedArray<RenderGeometryInstance *> &p_instances, const Projection &p_projection, const Transform3D &p_transform, float p_zfar, float p_bias, float p_normal_bias, bool p_use_dp, bool p_use_dp_flip, bool p_use_pancake, const Plane &p_camera_plane, float p_lod_distance_multiplier, float p_screen_mesh_lod_threshold, const Rect2i &p_rect, bool p_flip_y, bool p_clear_region, bool p_begin, bool p_end, RendererScene::RenderInfo *p_render_info) { +void RenderForwardClustered::_render_shadow_append(RID p_framebuffer, const PagedArray<RenderGeometryInstance *> &p_instances, const Projection &p_projection, const Transform3D &p_transform, float p_zfar, float p_bias, float p_normal_bias, bool p_use_dp, bool p_use_dp_flip, bool p_use_pancake, const Plane &p_camera_plane, float p_lod_distance_multiplier, float p_screen_mesh_lod_threshold, const Rect2i &p_rect, bool p_flip_y, bool p_clear_region, bool p_begin, bool p_end, RenderingMethod::RenderInfo *p_render_info) { uint32_t shadow_pass_index = scene_state.shadow_passes.size(); SceneState::ShadowPass shadow_pass; + RenderSceneDataRD scene_data; + scene_data.cam_projection = p_projection; + scene_data.cam_transform = p_transform; + scene_data.view_projection[0] = p_projection; + scene_data.z_far = p_zfar; + scene_data.z_near = 0.0; + scene_data.lod_camera_plane = p_camera_plane; + scene_data.lod_distance_multiplier = p_lod_distance_multiplier; + scene_data.dual_paraboloid_side = p_use_dp_flip ? -1 : 1; + scene_data.opaque_prepass_threshold = 0.1f; + RenderDataRD render_data; - render_data.cam_projection = p_projection; - render_data.cam_transform = p_transform; - render_data.view_projection[0] = p_projection; - render_data.z_far = p_zfar; - render_data.z_near = 0.0; + render_data.scene_data = &scene_data; render_data.cluster_size = 1; render_data.cluster_max_elements = 32; render_data.instances = &p_instances; - render_data.lod_camera_plane = p_camera_plane; - render_data.lod_distance_multiplier = p_lod_distance_multiplier; render_data.render_info = p_render_info; - scene_state.ubo.dual_paraboloid_side = p_use_dp_flip ? -1 : 1; - scene_state.ubo.opaque_prepass_threshold = 0.1f; - _setup_environment(&render_data, true, Vector2(1, 1), !p_flip_y, Color(), false, p_use_pancake, shadow_pass_index); if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_DISABLE_LOD) { - render_data.screen_mesh_lod_threshold = 0.0; + scene_data.screen_mesh_lod_threshold = 0.0; } else { - render_data.screen_mesh_lod_threshold = p_screen_mesh_lod_threshold; + scene_data.screen_mesh_lod_threshold = p_screen_mesh_lod_threshold; } PassMode pass_mode = p_use_dp ? PASS_MODE_SHADOW_DP : PASS_MODE_SHADOW; uint32_t render_list_from = render_list[RENDER_LIST_SECONDARY].elements.size(); - _fill_render_list(RENDER_LIST_SECONDARY, &render_data, pass_mode, false, false, true); + _fill_render_list(RENDER_LIST_SECONDARY, &render_data, pass_mode, 0, false, false, true); uint32_t render_list_size = render_list[RENDER_LIST_SECONDARY].elements.size() - render_list_from; render_list[RENDER_LIST_SECONDARY].sort_by_key_range(render_list_from, render_list_size); _fill_instance_data(RENDER_LIST_SECONDARY, p_render_info ? p_render_info->info[RS::VIEWPORT_RENDER_INFO_TYPE_SHADOW] : (int *)nullptr, render_list_from, render_list_size, false); @@ -1742,8 +2350,8 @@ void RenderForwardClustered::_render_shadow_append(RID p_framebuffer, const Page shadow_pass.rp_uniform_set = RID(); //will be filled later when instance buffer is complete shadow_pass.camera_plane = p_camera_plane; - shadow_pass.screen_mesh_lod_threshold = render_data.screen_mesh_lod_threshold; - shadow_pass.lod_distance_multiplier = render_data.lod_distance_multiplier; + shadow_pass.screen_mesh_lod_threshold = scene_data.screen_mesh_lod_threshold; + shadow_pass.lod_distance_multiplier = scene_data.lod_distance_multiplier; shadow_pass.framebuffer = p_framebuffer; shadow_pass.initial_depth_action = p_begin ? (p_clear_region ? RD::INITIAL_ACTION_CLEAR_REGION : RD::INITIAL_ACTION_CLEAR) : (p_clear_region ? RD::INITIAL_ACTION_CLEAR_REGION_CONTINUE : RD::INITIAL_ACTION_CONTINUE); @@ -1786,19 +2394,22 @@ void RenderForwardClustered::_render_particle_collider_heightfield(RID p_fb, con RD::get_singleton()->draw_command_begin_label("Render Collider Heightfield"); + RenderSceneDataRD scene_data; + scene_data.cam_projection = p_cam_projection; + scene_data.cam_transform = p_cam_transform; + scene_data.view_projection[0] = p_cam_projection; + scene_data.z_near = 0.0; + scene_data.z_far = p_cam_projection.get_z_far(); + scene_data.dual_paraboloid_side = 0; + scene_data.opaque_prepass_threshold = 0.0; + RenderDataRD render_data; - render_data.cam_projection = p_cam_projection; - render_data.cam_transform = p_cam_transform; - render_data.view_projection[0] = p_cam_projection; - render_data.z_near = 0.0; - render_data.z_far = p_cam_projection.get_z_far(); + render_data.scene_data = &scene_data; render_data.cluster_size = 1; render_data.cluster_max_elements = 32; render_data.instances = &p_instances; _update_render_base_uniform_set(); - scene_state.ubo.dual_paraboloid_side = 0; - scene_state.ubo.opaque_prepass_threshold = 0.0; _setup_environment(&render_data, true, Vector2(1, 1), true, Color(), false, false); @@ -1825,21 +2436,23 @@ void RenderForwardClustered::_render_material(const Transform3D &p_cam_transform RD::get_singleton()->draw_command_begin_label("Render 3D Material"); + RenderSceneDataRD scene_data; + scene_data.cam_projection = p_cam_projection; + scene_data.cam_transform = p_cam_transform; + scene_data.view_projection[0] = p_cam_projection; + scene_data.dual_paraboloid_side = 0; + scene_data.material_uv2_mode = false; + scene_data.opaque_prepass_threshold = 0.0f; + scene_data.emissive_exposure_normalization = p_exposure_normalization; + RenderDataRD render_data; - render_data.cam_projection = p_cam_projection; - render_data.cam_transform = p_cam_transform; - render_data.view_projection[0] = p_cam_projection; + render_data.scene_data = &scene_data; render_data.cluster_size = 1; render_data.cluster_max_elements = 32; render_data.instances = &p_instances; _update_render_base_uniform_set(); - scene_state.ubo.dual_paraboloid_side = 0; - scene_state.ubo.material_uv2_mode = false; - scene_state.ubo.opaque_prepass_threshold = 0.0f; - scene_state.ubo.emissive_exposure_normalization = p_exposure_normalization; - _setup_environment(&render_data, true, Vector2(1, 1), false, Color()); PassMode pass_mode = PASS_MODE_DEPTH_MATERIAL; @@ -1875,18 +2488,20 @@ void RenderForwardClustered::_render_uv2(const PagedArray<RenderGeometryInstance RD::get_singleton()->draw_command_begin_label("Render UV2"); + RenderSceneDataRD scene_data; + scene_data.dual_paraboloid_side = 0; + scene_data.material_uv2_mode = true; + scene_data.opaque_prepass_threshold = 0.0; + scene_data.emissive_exposure_normalization = -1.0; + RenderDataRD render_data; + render_data.scene_data = &scene_data; render_data.cluster_size = 1; render_data.cluster_max_elements = 32; render_data.instances = &p_instances; _update_render_base_uniform_set(); - scene_state.ubo.dual_paraboloid_side = 0; - scene_state.ubo.material_uv2_mode = true; - scene_state.ubo.opaque_prepass_threshold = 0.0; - scene_state.ubo.emissive_exposure_normalization = -1.0; - _setup_environment(&render_data, true, Vector2(1, 1), false, Color()); PassMode pass_mode = PASS_MODE_DEPTH_MATERIAL; @@ -1946,7 +2561,10 @@ void RenderForwardClustered::_render_sdfgi(Ref<RenderSceneBuffersRD> p_render_bu RD::get_singleton()->draw_command_begin_label("Render SDFGI Voxel"); + RenderSceneDataRD scene_data; + RenderDataRD render_data; + render_data.scene_data = &scene_data; render_data.cluster_size = 1; render_data.cluster_max_elements = 32; render_data.instances = &p_instances; @@ -1987,26 +2605,26 @@ void RenderForwardClustered::_render_sdfgi(Ref<RenderSceneBuffersRD> p_render_bu fb_size.x = p_size[right_axis]; fb_size.y = p_size[up_axis]; - render_data.cam_transform.origin = center + axis * half_extents; - render_data.cam_transform.basis.set_column(0, right); - render_data.cam_transform.basis.set_column(1, up); - render_data.cam_transform.basis.set_column(2, axis); + scene_data.cam_transform.origin = center + axis * half_extents; + scene_data.cam_transform.basis.set_column(0, right); + scene_data.cam_transform.basis.set_column(1, up); + scene_data.cam_transform.basis.set_column(2, axis); - //print_line("pass: " + itos(i) + " xform " + render_data.cam_transform); + //print_line("pass: " + itos(i) + " xform " + scene_data.cam_transform); float h_size = half_extents[right_axis]; float v_size = half_extents[up_axis]; float d_size = half_extents[i] * 2.0; - render_data.cam_projection.set_orthogonal(-h_size, h_size, -v_size, v_size, 0, d_size); + scene_data.cam_projection.set_orthogonal(-h_size, h_size, -v_size, v_size, 0, d_size); //print_line("pass: " + itos(i) + " cam hsize: " + rtos(h_size) + " vsize: " + rtos(v_size) + " dsize " + rtos(d_size)); Transform3D to_bounds; to_bounds.origin = p_bounds.position; to_bounds.basis.scale(p_bounds.size); - RendererRD::MaterialStorage::store_transform(to_bounds.affine_inverse() * render_data.cam_transform, scene_state.ubo.sdf_to_bounds); + RendererRD::MaterialStorage::store_transform(to_bounds.affine_inverse() * scene_data.cam_transform, scene_state.ubo.sdf_to_bounds); - scene_state.ubo.emissive_exposure_normalization = p_exposure_normalization; + scene_data.emissive_exposure_normalization = p_exposure_normalization; _setup_environment(&render_data, true, Vector2(1, 1), false, Color()); RID rp_uniform_set = _setup_sdfgi_render_pass_uniform_set(p_albedo_texture, p_emission_texture, p_emission_aniso_texture, p_geom_facing_texture); @@ -2024,7 +2642,7 @@ void RenderForwardClustered::_render_sdfgi(Ref<RenderSceneBuffersRD> p_render_bu RD::get_singleton()->draw_command_end_label(); } -void RenderForwardClustered::_base_uniforms_changed() { +void RenderForwardClustered::base_uniforms_changed() { if (!render_base_uniform_set.is_null() && RD::get_singleton()->uniform_set_is_valid(render_base_uniform_set)) { RD::get_singleton()->free(render_base_uniform_set); } @@ -2140,14 +2758,14 @@ void RenderForwardClustered::_update_render_base_uniform_set() { RD::Uniform u; u.binding = 5; u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER; - u.append_id(get_omni_light_buffer()); + u.append_id(RendererRD::LightStorage::get_singleton()->get_omni_light_buffer()); uniforms.push_back(u); } { RD::Uniform u; u.binding = 6; u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER; - u.append_id(get_spot_light_buffer()); + u.append_id(RendererRD::LightStorage::get_singleton()->get_spot_light_buffer()); uniforms.push_back(u); } @@ -2155,14 +2773,14 @@ void RenderForwardClustered::_update_render_base_uniform_set() { RD::Uniform u; u.binding = 7; u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER; - u.append_id(get_reflection_probe_buffer()); + u.append_id(RendererRD::LightStorage::get_singleton()->get_reflection_probe_buffer()); uniforms.push_back(u); } { RD::Uniform u; u.binding = 8; u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER; - u.append_id(get_directional_light_buffer()); + u.append_id(RendererRD::LightStorage::get_singleton()->get_directional_light_buffer()); uniforms.push_back(u); } { @@ -2199,7 +2817,7 @@ void RenderForwardClustered::_update_render_base_uniform_set() { RD::Uniform u; u.binding = 13; u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER; - u.append_id(get_decal_buffer()); + u.append_id(RendererRD::TextureStorage::get_singleton()->get_decal_buffer()); uniforms.push_back(u); } @@ -2248,6 +2866,13 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend { RD::Uniform u; u.binding = 1; + u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER; + u.append_id(scene_state.implementation_uniform_buffers[p_index]); + uniforms.push_back(u); + } + { + RD::Uniform u; + u.binding = 2; u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER; RID instance_buffer = scene_state.instance_buffer[p_render_list]; if (instance_buffer == RID()) { @@ -2264,16 +2889,15 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend radiance_texture = texture_storage->texture_rd_get_default(is_using_radiance_cubemap_array() ? RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_CUBEMAP_ARRAY_BLACK : RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_CUBEMAP_BLACK); } RD::Uniform u; - u.binding = 2; + u.binding = 3; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; u.append_id(radiance_texture); uniforms.push_back(u); } - { - RID ref_texture = (p_render_data && p_render_data->reflection_atlas.is_valid()) ? reflection_atlas_get_texture(p_render_data->reflection_atlas) : RID(); + RID ref_texture = (p_render_data && p_render_data->reflection_atlas.is_valid()) ? light_storage->reflection_atlas_get_texture(p_render_data->reflection_atlas) : RID(); RD::Uniform u; - u.binding = 3; + u.binding = 4; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; if (ref_texture.is_valid()) { u.append_id(ref_texture); @@ -2282,14 +2906,13 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend } uniforms.push_back(u); } - { RD::Uniform u; - u.binding = 4; + u.binding = 5; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; RID texture; if (p_render_data && p_render_data->shadow_atlas.is_valid()) { - texture = shadow_atlas_get_texture(p_render_data->shadow_atlas); + texture = RendererRD::LightStorage::get_singleton()->shadow_atlas_get_texture(p_render_data->shadow_atlas); } if (!texture.is_valid()) { texture = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_DEPTH); @@ -2299,10 +2922,10 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend } { RD::Uniform u; - u.binding = 5; + u.binding = 6; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; - if (p_use_directional_shadow_atlas && directional_shadow_get_texture().is_valid()) { - u.append_id(directional_shadow_get_texture()); + if (p_use_directional_shadow_atlas && RendererRD::LightStorage::get_singleton()->directional_shadow_get_texture().is_valid()) { + u.append_id(RendererRD::LightStorage::get_singleton()->directional_shadow_get_texture()); } else { u.append_id(texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_DEPTH)); } @@ -2310,13 +2933,13 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend } { RD::Uniform u; - u.binding = 6; + u.binding = 7; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; RID default_tex = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_WHITE); for (uint32_t i = 0; i < scene_state.max_lightmaps; i++) { if (p_render_data && i < p_render_data->lightmaps->size()) { - RID base = lightmap_instance_get_lightmap((*p_render_data->lightmaps)[i]); + RID base = light_storage->lightmap_instance_get_lightmap((*p_render_data->lightmaps)[i]); RID texture = light_storage->lightmap_get_texture(base); RID rd_texture = texture_storage->texture_get_rd_texture(texture); u.append_id(rd_texture); @@ -2329,7 +2952,7 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend } { RD::Uniform u; - u.binding = 7; + u.binding = 8; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; RID default_tex = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_3D_WHITE); for (int i = 0; i < MAX_VOXEL_GI_INSTANCESS; i++) { @@ -2349,7 +2972,7 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend { RD::Uniform u; - u.binding = 8; + u.binding = 9; u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER; RID cb = (p_render_data && p_render_data->cluster_buffer.is_valid()) ? p_render_data->cluster_buffer : scene_shader.default_vec4_xform_buffer; u.append_id(cb); @@ -2358,7 +2981,7 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend { RD::Uniform u; - u.binding = 9; + u.binding = 10; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; RID texture; if (rb.is_valid() && rb->has_texture(RB_SCOPE_BUFFERS, RB_TEX_BACK_DEPTH)) { @@ -2371,7 +2994,7 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend } { RD::Uniform u; - u.binding = 10; + u.binding = 11; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; RID bbt = rb_data.is_valid() ? rb->get_back_buffer_texture() : RID(); RID texture = bbt.is_valid() ? bbt : texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK); @@ -2380,110 +3003,108 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend } { - { - RD::Uniform u; - u.binding = 11; - u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; - RID texture = rb_data.is_valid() && rb_data->has_normal_roughness() ? rb_data->get_normal_roughness() : texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_NORMAL); - u.append_id(texture); - uniforms.push_back(u); - } + RD::Uniform u; + u.binding = 12; + u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; + RID texture = rb_data.is_valid() && rb_data->has_normal_roughness() ? rb_data->get_normal_roughness() : texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_NORMAL); + u.append_id(texture); + uniforms.push_back(u); + } - { - RD::Uniform u; - u.binding = 12; - u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; - RID aot = rb_data.is_valid() ? rb->get_ao_texture() : RID(); - RID texture = aot.is_valid() ? aot : texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK); - u.append_id(texture); - uniforms.push_back(u); - } + { + RD::Uniform u; + u.binding = 13; + u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; + RID aot = rb_data.is_valid() ? rb_data->get_ao_texture() : RID(); + RID texture = aot.is_valid() ? aot : texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK); + u.append_id(texture); + uniforms.push_back(u); + } - { - RD::Uniform u; - u.binding = 13; - u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; - RID texture = rb_data.is_valid() && rb->has_texture(RB_SCOPE_GI, RB_TEX_AMBIENT) ? rb->get_texture(RB_SCOPE_GI, RB_TEX_AMBIENT) : texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK); - u.append_id(texture); - uniforms.push_back(u); - } + { + RD::Uniform u; + u.binding = 14; + u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; + RID texture = rb_data.is_valid() && rb->has_texture(RB_SCOPE_GI, RB_TEX_AMBIENT) ? rb->get_texture(RB_SCOPE_GI, RB_TEX_AMBIENT) : texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK); + u.append_id(texture); + uniforms.push_back(u); + } - { - RD::Uniform u; - u.binding = 14; - u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; - RID texture = rb_data.is_valid() && rb->has_texture(RB_SCOPE_GI, RB_TEX_REFLECTION) ? rb->get_texture(RB_SCOPE_GI, RB_TEX_REFLECTION) : texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK); - u.append_id(texture); - uniforms.push_back(u); + { + RD::Uniform u; + u.binding = 15; + u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; + RID texture = rb_data.is_valid() && rb->has_texture(RB_SCOPE_GI, RB_TEX_REFLECTION) ? rb->get_texture(RB_SCOPE_GI, RB_TEX_REFLECTION) : texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK); + u.append_id(texture); + uniforms.push_back(u); + } + { + RD::Uniform u; + u.binding = 16; + u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; + RID t; + if (rb.is_valid() && rb->has_custom_data(RB_SCOPE_SDFGI)) { + Ref<RendererRD::GI::SDFGI> sdfgi = rb->get_custom_data(RB_SCOPE_SDFGI); + t = sdfgi->lightprobe_texture; } - { - RD::Uniform u; - u.binding = 15; - u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; - RID t; - if (rb.is_valid() && rb->has_custom_data(RB_SCOPE_SDFGI)) { - Ref<RendererRD::GI::SDFGI> sdfgi = rb->get_custom_data(RB_SCOPE_SDFGI); - t = sdfgi->lightprobe_texture; - } - if (t.is_null()) { - t = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_WHITE); - } - u.append_id(t); - uniforms.push_back(u); + if (t.is_null()) { + t = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_WHITE); } - { - RD::Uniform u; - u.binding = 16; - u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; - RID t; - if (rb.is_valid() && rb->has_custom_data(RB_SCOPE_SDFGI)) { - Ref<RendererRD::GI::SDFGI> sdfgi = rb->get_custom_data(RB_SCOPE_SDFGI); - t = sdfgi->occlusion_texture; - } - if (t.is_null()) { - t = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_3D_WHITE); - } - u.append_id(t); - uniforms.push_back(u); + u.append_id(t); + uniforms.push_back(u); + } + { + RD::Uniform u; + u.binding = 17; + u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; + RID t; + if (rb.is_valid() && rb->has_custom_data(RB_SCOPE_SDFGI)) { + Ref<RendererRD::GI::SDFGI> sdfgi = rb->get_custom_data(RB_SCOPE_SDFGI); + t = sdfgi->occlusion_texture; } - { - RD::Uniform u; - u.binding = 17; - u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER; - RID voxel_gi; - if (rb.is_valid() && rb->has_custom_data(RB_SCOPE_GI)) { - Ref<RendererRD::GI::RenderBuffersGI> rbgi = rb->get_custom_data(RB_SCOPE_GI); - voxel_gi = rbgi->get_voxel_gi_buffer(); - } - u.append_id(voxel_gi.is_valid() ? voxel_gi : render_buffers_get_default_voxel_gi_buffer()); - uniforms.push_back(u); + if (t.is_null()) { + t = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_3D_WHITE); } - { - RD::Uniform u; - u.binding = 18; - u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; - RID vfog = RID(); - if (rb_data.is_valid() && rb->has_custom_data(RB_SCOPE_FOG)) { - Ref<RendererRD::Fog::VolumetricFog> fog = rb->get_custom_data(RB_SCOPE_FOG); - vfog = fog->fog_map; - if (vfog.is_null()) { - vfog = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_3D_WHITE); - } - } else { + u.append_id(t); + uniforms.push_back(u); + } + { + RD::Uniform u; + u.binding = 18; + u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER; + RID voxel_gi; + if (rb.is_valid() && rb->has_custom_data(RB_SCOPE_GI)) { + Ref<RendererRD::GI::RenderBuffersGI> rbgi = rb->get_custom_data(RB_SCOPE_GI); + voxel_gi = rbgi->get_voxel_gi_buffer(); + } + u.append_id(voxel_gi.is_valid() ? voxel_gi : render_buffers_get_default_voxel_gi_buffer()); + uniforms.push_back(u); + } + { + RD::Uniform u; + u.binding = 19; + u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; + RID vfog = RID(); + if (rb_data.is_valid() && rb->has_custom_data(RB_SCOPE_FOG)) { + Ref<RendererRD::Fog::VolumetricFog> fog = rb->get_custom_data(RB_SCOPE_FOG); + vfog = fog->fog_map; + if (vfog.is_null()) { vfog = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_3D_WHITE); } - u.append_id(vfog); - uniforms.push_back(u); - } - { - RD::Uniform u; - u.binding = 19; - u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; - RID ssil = rb_data.is_valid() ? rb->get_ssil_texture() : RID(); - RID texture = ssil.is_valid() ? ssil : texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK); - u.append_id(texture); - uniforms.push_back(u); + } else { + vfog = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_3D_WHITE); } + u.append_id(vfog); + uniforms.push_back(u); + } + { + RD::Uniform u; + u.binding = 20; + u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; + RID ssil = rb_data.is_valid() ? rb_data->get_ssil_texture() : RID(); + RID texture = ssil.is_valid() ? ssil : texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK); + u.append_id(texture); + uniforms.push_back(u); } return UniformSetCacheRD::get_singleton()->get_cache_vec(scene_shader.default_shader_rd, RENDER_PASS_UNIFORM_SET, uniforms); @@ -2503,6 +3124,13 @@ RID RenderForwardClustered::_setup_sdfgi_render_pass_uniform_set(RID p_albedo_te { RD::Uniform u; u.binding = 1; + u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER; + u.append_id(scene_state.implementation_uniform_buffers[0]); + uniforms.push_back(u); + } + { + RD::Uniform u; + u.binding = 2; u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER; RID instance_buffer = scene_state.instance_buffer[RENDER_LIST_SECONDARY]; if (instance_buffer == RID()) { @@ -2515,7 +3143,7 @@ RID RenderForwardClustered::_setup_sdfgi_render_pass_uniform_set(RID p_albedo_te // No radiance texture. RID radiance_texture = texture_storage->texture_rd_get_default(is_using_radiance_cubemap_array() ? RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_CUBEMAP_ARRAY_BLACK : RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_CUBEMAP_BLACK); RD::Uniform u; - u.binding = 2; + u.binding = 3; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; u.append_id(radiance_texture); uniforms.push_back(u); @@ -2525,7 +3153,7 @@ RID RenderForwardClustered::_setup_sdfgi_render_pass_uniform_set(RID p_albedo_te // No reflection atlas. RID ref_texture = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_CUBEMAP_ARRAY_BLACK); RD::Uniform u; - u.binding = 3; + u.binding = 4; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; u.append_id(ref_texture); uniforms.push_back(u); @@ -2534,7 +3162,7 @@ RID RenderForwardClustered::_setup_sdfgi_render_pass_uniform_set(RID p_albedo_te { // No shadow atlas. RD::Uniform u; - u.binding = 4; + u.binding = 5; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; RID texture = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_DEPTH); u.append_id(texture); @@ -2544,7 +3172,7 @@ RID RenderForwardClustered::_setup_sdfgi_render_pass_uniform_set(RID p_albedo_te { // No directional shadow atlas. RD::Uniform u; - u.binding = 5; + u.binding = 6; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; RID texture = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_DEPTH); u.append_id(texture); @@ -2554,7 +3182,7 @@ RID RenderForwardClustered::_setup_sdfgi_render_pass_uniform_set(RID p_albedo_te { // No Lightmaps RD::Uniform u; - u.binding = 6; + u.binding = 7; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; RID default_tex = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_WHITE); @@ -2568,7 +3196,7 @@ RID RenderForwardClustered::_setup_sdfgi_render_pass_uniform_set(RID p_albedo_te { // No VoxelGIs RD::Uniform u; - u.binding = 7; + u.binding = 8; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; RID default_tex = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_3D_WHITE); @@ -2581,7 +3209,7 @@ RID RenderForwardClustered::_setup_sdfgi_render_pass_uniform_set(RID p_albedo_te { RD::Uniform u; - u.binding = 8; + u.binding = 9; u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER; RID cb = scene_shader.default_vec4_xform_buffer; u.append_id(cb); @@ -2593,28 +3221,28 @@ RID RenderForwardClustered::_setup_sdfgi_render_pass_uniform_set(RID p_albedo_te { RD::Uniform u; u.uniform_type = RD::UNIFORM_TYPE_IMAGE; - u.binding = 9; + u.binding = 10; u.append_id(p_albedo_texture); uniforms.push_back(u); } { RD::Uniform u; u.uniform_type = RD::UNIFORM_TYPE_IMAGE; - u.binding = 10; + u.binding = 11; u.append_id(p_emission_texture); uniforms.push_back(u); } { RD::Uniform u; u.uniform_type = RD::UNIFORM_TYPE_IMAGE; - u.binding = 11; + u.binding = 12; u.append_id(p_emission_aniso_texture); uniforms.push_back(u); } { RD::Uniform u; u.uniform_type = RD::UNIFORM_TYPE_IMAGE; - u.binding = 12; + u.binding = 13; u.append_id(p_geom_facing_texture); uniforms.push_back(u); } @@ -2632,6 +3260,26 @@ RID RenderForwardClustered::_render_buffers_get_velocity_texture(Ref<RenderScene return p_render_buffers->get_velocity_buffer(p_render_buffers->get_msaa_3d() != RS::VIEWPORT_MSAA_DISABLED); } +void RenderForwardClustered::environment_set_ssao_quality(RS::EnvironmentSSAOQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) { + ss_effects->ssao_set_quality(p_quality, p_half_size, p_adaptive_target, p_blur_passes, p_fadeout_from, p_fadeout_to); +} + +void RenderForwardClustered::environment_set_ssil_quality(RS::EnvironmentSSILQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) { + ss_effects->ssil_set_quality(p_quality, p_half_size, p_adaptive_target, p_blur_passes, p_fadeout_from, p_fadeout_to); +} + +void RenderForwardClustered::environment_set_ssr_roughness_quality(RS::EnvironmentSSRRoughnessQuality p_quality) { + ss_effects->ssr_set_roughness_quality(p_quality); +} + +void RenderForwardClustered::sub_surface_scattering_set_quality(RS::SubSurfaceScatteringQuality p_quality) { + ss_effects->sss_set_quality(p_quality); +} + +void RenderForwardClustered::sub_surface_scattering_set_scale(float p_scale, float p_depth_scale) { + ss_effects->sss_set_scale(p_scale, p_depth_scale); +} + RenderForwardClustered *RenderForwardClustered::singleton = nullptr; void RenderForwardClustered::GeometryInstanceForwardClustered::_mark_dirty() { @@ -2925,6 +3573,7 @@ void RenderForwardClustered::_geometry_instance_update(RenderGeometryInstance *p ginstance->transforms_uniform_set = mesh_storage->multimesh_get_3d_uniform_set(ginstance->data->base, scene_shader.default_shader_rd, TRANSFORMS_UNIFORM_SET); } else if (ginstance->data->base_type == RS::INSTANCE_PARTICLES) { + ginstance->base_flags |= INSTANCE_DATA_FLAG_PARTICLES; ginstance->base_flags |= INSTANCE_DATA_FLAG_MULTIMESH; ginstance->base_flags |= INSTANCE_DATA_FLAG_MULTIMESH_HAS_COLOR; @@ -2950,7 +3599,7 @@ void RenderForwardClustered::_geometry_instance_update(RenderGeometryInstance *p ginstance->store_transform_cache = store_transform; ginstance->can_sdfgi = false; - if (!lightmap_instance_is_valid(ginstance->lightmap_instance)) { + if (!RendererRD::LightStorage::get_singleton()->lightmap_instance_is_valid(ginstance->lightmap_instance)) { if (ginstance->voxel_gi_instances[0].is_null() && (ginstance->data->use_baked_light || ginstance->data->use_dynamic_gi)) { ginstance->can_sdfgi = true; } @@ -3132,7 +3781,7 @@ void RenderForwardClustered::_update_shader_quality_settings() { scene_shader.set_default_specialization_constants(spec_constants); - _base_uniforms_changed(); //also need this + base_uniforms_changed(); //also need this } RenderForwardClustered::RenderForwardClustered() { @@ -3166,19 +3815,40 @@ RenderForwardClustered::RenderForwardClustered() { { defines += "\n#define MATERIAL_UNIFORM_SET " + itos(MATERIAL_UNIFORM_SET) + "\n"; } +#ifdef REAL_T_IS_DOUBLE + { + defines += "\n#define USE_DOUBLE_PRECISION \n"; + } +#endif scene_shader.init(defines); } + /* shadow sampler */ + { + RD::SamplerState sampler; + sampler.mag_filter = RD::SAMPLER_FILTER_NEAREST; + sampler.min_filter = RD::SAMPLER_FILTER_NEAREST; + sampler.enable_compare = true; + sampler.compare_op = RD::COMPARE_OP_LESS; + shadow_sampler = RD::get_singleton()->sampler_create(sampler); + } + render_list_thread_threshold = GLOBAL_GET("rendering/limits/forward_renderer/threaded_render_minimum_instances"); _update_shader_quality_settings(); resolve_effects = memnew(RendererRD::Resolve()); taa = memnew(RendererRD::TAA); + ss_effects = memnew(RendererRD::SSEffects); } RenderForwardClustered::~RenderForwardClustered() { + if (ss_effects != nullptr) { + memdelete(ss_effects); + ss_effects = nullptr; + } + if (taa != nullptr) { memdelete(taa); taa = nullptr; @@ -3189,12 +3859,16 @@ RenderForwardClustered::~RenderForwardClustered() { resolve_effects = nullptr; } - directional_shadow_atlas_set_size(0); + RD::get_singleton()->free(shadow_sampler); + RSG::light_storage->directional_shadow_atlas_set_size(0); { for (uint32_t i = 0; i < scene_state.uniform_buffers.size(); i++) { RD::get_singleton()->free(scene_state.uniform_buffers[i]); } + for (uint32_t i = 0; i < scene_state.implementation_uniform_buffers.size(); i++) { + RD::get_singleton()->free(scene_state.implementation_uniform_buffers[i]); + } RD::get_singleton()->free(scene_state.lightmap_buffer); RD::get_singleton()->free(scene_state.lightmap_capture_buffer); for (uint32_t i = 0; i < RENDER_LIST_MAX; i++) { diff --git a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h index 35379cd69b..55f1ef01af 100644 --- a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h +++ b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h @@ -32,12 +32,14 @@ #define RENDER_FORWARD_CLUSTERED_H #include "core/templates/paged_allocator.h" +#include "servers/rendering/renderer_rd/cluster_builder_rd.h" #include "servers/rendering/renderer_rd/effects/resolve.h" +#include "servers/rendering/renderer_rd/effects/ss_effects.h" #include "servers/rendering/renderer_rd/effects/taa.h" #include "servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.h" #include "servers/rendering/renderer_rd/pipeline_cache_rd.h" #include "servers/rendering/renderer_rd/renderer_scene_render_rd.h" -#include "servers/rendering/renderer_rd/shaders/scene_forward_clustered.glsl.gen.h" +#include "servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl.gen.h" #include "servers/rendering/renderer_rd/storage_rd/utilities.h" #define RB_SCOPE_FORWARD_CLUSTERED SNAME("forward_clustered") @@ -99,7 +101,21 @@ class RenderForwardClustered : public RendererSceneRenderRD { RD::TextureSamples texture_samples = RD::TEXTURE_SAMPLES_1; public: - //for rendering, may be MSAAd + ClusterBuilderRD *cluster_builder = nullptr; + + struct SSEffectsData { + RID linear_depth; + Vector<RID> linear_depth_slices; + + RID downsample_uniform_set; + + Projection last_frame_projection; + Transform3D last_frame_transform; + + RendererRD::SSEffects::SSAORenderBuffers ssao; + RendererRD::SSEffects::SSILRenderBuffers ssil; + RendererRD::SSEffects::SSRRenderBuffers ssr; + } ss_effects_data; enum DepthFrameBufferType { DEPTH_FB, @@ -139,6 +155,9 @@ class RenderForwardClustered : public RendererSceneRenderRD { RID get_depth_fb(DepthFrameBufferType p_type = DEPTH_FB); RID get_specular_only_fb(); + RID get_ao_texture() const { return ss_effects_data.ssao.ao_final; } + RID get_ssil_texture() const { return ss_effects_data.ssil.ssil_final; } + virtual void configure(RenderSceneBuffersRD *p_render_buffers) override; virtual void free_data() override; }; @@ -149,10 +168,6 @@ class RenderForwardClustered : public RendererSceneRenderRD { uint64_t lightmap_texture_array_version = 0xFFFFFFFF; - virtual void _base_uniforms_changed() override; - virtual RID _render_buffers_get_normal_texture(Ref<RenderSceneBuffersRD> p_render_buffers) override; - virtual RID _render_buffers_get_velocity_texture(Ref<RenderSceneBuffersRD> p_render_buffers) override; - bool base_uniform_set_updated = false; void _update_render_base_uniform_set(); RID _setup_sdfgi_render_pass_uniform_set(RID p_albedo_texture, RID p_emission_texture, RID p_emission_aniso_texture, RID p_geom_facing_texture); @@ -230,14 +245,16 @@ class RenderForwardClustered : public RendererSceneRenderRD { float sh[9 * 4]; }; + // When changing any of these enums, remember to change the corresponding enums in the shader files as well. enum { - INSTANCE_DATA_FLAGS_NON_UNIFORM_SCALE = 1 << 5, - INSTANCE_DATA_FLAG_USE_GI_BUFFERS = 1 << 6, - INSTANCE_DATA_FLAG_USE_SDFGI = 1 << 7, - INSTANCE_DATA_FLAG_USE_LIGHTMAP_CAPTURE = 1 << 8, - INSTANCE_DATA_FLAG_USE_LIGHTMAP = 1 << 9, - INSTANCE_DATA_FLAG_USE_SH_LIGHTMAP = 1 << 10, - INSTANCE_DATA_FLAG_USE_VOXEL_GI = 1 << 11, + INSTANCE_DATA_FLAGS_NON_UNIFORM_SCALE = 1 << 4, + INSTANCE_DATA_FLAG_USE_GI_BUFFERS = 1 << 5, + INSTANCE_DATA_FLAG_USE_SDFGI = 1 << 6, + INSTANCE_DATA_FLAG_USE_LIGHTMAP_CAPTURE = 1 << 7, + INSTANCE_DATA_FLAG_USE_LIGHTMAP = 1 << 8, + INSTANCE_DATA_FLAG_USE_SH_LIGHTMAP = 1 << 9, + INSTANCE_DATA_FLAG_USE_VOXEL_GI = 1 << 10, + INSTANCE_DATA_FLAG_PARTICLES = 1 << 11, INSTANCE_DATA_FLAG_MULTIMESH = 1 << 12, INSTANCE_DATA_FLAG_MULTIMESH_FORMAT_2D = 1 << 13, INSTANCE_DATA_FLAG_MULTIMESH_HAS_COLOR = 1 << 14, @@ -249,61 +266,22 @@ class RenderForwardClustered : public RendererSceneRenderRD { }; struct SceneState { - // This struct is loaded into Set 1 - Binding 0, populated at start of rendering a frame, must match with shader code + // This struct is loaded into Set 1 - Binding 1, populated at start of rendering a frame, must match with shader code struct UBO { - float projection_matrix[16]; - float inv_projection_matrix[16]; - float inv_view_matrix[16]; - float view_matrix[16]; - - float projection_matrix_view[RendererSceneRender::MAX_RENDER_VIEWS][16]; - float inv_projection_matrix_view[RendererSceneRender::MAX_RENDER_VIEWS][16]; - float eye_offset[RendererSceneRender::MAX_RENDER_VIEWS][4]; - - float viewport_size[2]; - float screen_pixel_size[2]; - uint32_t cluster_shift; uint32_t cluster_width; uint32_t cluster_type_size; uint32_t max_cluster_element_count_div_32; - float directional_penumbra_shadow_kernel[128]; //32 vec4s - float directional_soft_shadow_kernel[128]; - float penumbra_shadow_kernel[128]; - float soft_shadow_kernel[128]; - - float ambient_light_color_energy[4]; - - float ambient_color_sky_mix; - uint32_t use_ambient_light; - uint32_t use_ambient_cubemap; - uint32_t use_reflection_cubemap; - - float radiance_inverse_xform[12]; - - float shadow_atlas_pixel_size[2]; - float directional_shadow_pixel_size[2]; - - uint32_t directional_light_count; - float dual_paraboloid_side; - float z_far; - float z_near; - uint32_t ss_effects_flags; float ssao_light_affect; float ssao_ao_affect; - uint32_t roughness_limiter_enabled; - - float roughness_limiter_amount; - float roughness_limiter_limit; - float opaque_prepass_threshold; - uint32_t roughness_limiter_pad; + uint32_t pad1; float sdf_to_bounds[16]; int32_t sdf_offset[3]; - uint32_t material_uv2_mode; + uint32_t pad2; int32_t sdf_size[3]; uint32_t gi_upscale_for_msaa; @@ -312,32 +290,13 @@ class RenderForwardClustered : public RendererSceneRenderRD { float volumetric_fog_inv_length; float volumetric_fog_detail_spread; uint32_t volumetric_fog_pad; - - // Fog - uint32_t fog_enabled; - float fog_density; - float fog_height; - float fog_height_density; - - float fog_light_color[3]; - float fog_sun_scatter; - - float fog_aerial_perspective; - - float time; - float reflection_multiplier; - - uint32_t pancake_shadows; - - float taa_jitter[2]; - float emissive_exposure_normalization; // Needed to normalize emissive when using physical units. - float IBL_exposure_normalization; }; struct PushConstant { uint32_t base_index; // uint32_t uv_offset; //packed - uint32_t pad[2]; + uint32_t multimesh_motion_vectors_current_offset; + uint32_t multimesh_motion_vectors_previous_offset; }; struct InstanceData { @@ -350,11 +309,10 @@ class RenderForwardClustered : public RendererSceneRenderRD { float lightmap_uv_scale[4]; }; - UBO ubo_data[2]; - UBO &ubo = ubo_data[0]; - UBO &prev_ubo = ubo_data[1]; + UBO ubo; LocalVector<RID> uniform_buffers; + LocalVector<RID> implementation_uniform_buffers; LightmapData lightmaps[MAX_LIGHTMAPS]; RID lightmap_ids[MAX_LIGHTMAPS]; @@ -429,7 +387,7 @@ class RenderForwardClustered : public RendererSceneRenderRD { void _update_instance_data_buffer(RenderListType p_render_list); void _fill_instance_data(RenderListType p_render_list, int *p_render_info = nullptr, uint32_t p_offset = 0, int32_t p_max_elements = -1, bool p_update_buffer = true); - void _fill_render_list(RenderListType p_render_list, const RenderDataRD *p_render_data, PassMode p_pass_mode, bool p_using_sdfgi = false, bool p_using_opaque_gi = false, bool p_append = false); + void _fill_render_list(RenderListType p_render_list, const RenderDataRD *p_render_data, PassMode p_pass_mode, uint32_t p_color_pass_flags, bool p_using_sdfgi = false, bool p_using_opaque_gi = false, bool p_append = false); HashMap<Size2i, RID> sdfgi_framebuffer_size_cache; @@ -615,16 +573,61 @@ class RenderForwardClustered : public RendererSceneRenderRD { virtual void _update_shader_quality_settings() override; + /* Effects */ + RendererRD::Resolve *resolve_effects = nullptr; RendererRD::TAA *taa = nullptr; + RendererRD::SSEffects *ss_effects = nullptr; + + /* Cluster builder */ + + ClusterBuilderSharedDataRD cluster_builder_shared; + ClusterBuilderRD *current_cluster_builder = nullptr; + + /* SDFGI */ + void _update_sdfgi(RenderDataRD *p_render_data); + + /* Volumetric fog */ + RID shadow_sampler; + + void _update_volumetric_fog(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, const Projection &p_cam_projection, const Transform3D &p_cam_transform, const Transform3D &p_prev_cam_inv_transform, RID p_shadow_atlas, int p_directional_light_count, bool p_use_directional_shadows, int p_positional_light_count, int p_voxel_gi_count, const PagedArray<RID> &p_fog_volumes); + + /* Render shadows */ + + void _render_shadow_pass(RID p_light, RID p_shadow_atlas, int p_pass, const PagedArray<RenderGeometryInstance *> &p_instances, const Plane &p_camera_plane = Plane(), float p_lod_distance_multiplier = 0, float p_screen_mesh_lod_threshold = 0.0, bool p_open_pass = true, bool p_close_pass = true, bool p_clear_region = true, RenderingMethod::RenderInfo *p_render_info = nullptr); + void _render_shadow_begin(); + void _render_shadow_append(RID p_framebuffer, const PagedArray<RenderGeometryInstance *> &p_instances, const Projection &p_projection, const Transform3D &p_transform, float p_zfar, float p_bias, float p_normal_bias, bool p_use_dp, bool p_use_dp_flip, bool p_use_pancake, const Plane &p_camera_plane = Plane(), float p_lod_distance_multiplier = 0.0, float p_screen_mesh_lod_threshold = 0.0, const Rect2i &p_rect = Rect2i(), bool p_flip_y = false, bool p_clear_region = true, bool p_begin = true, bool p_end = true, RenderingMethod::RenderInfo *p_render_info = nullptr); + void _render_shadow_process(); + void _render_shadow_end(uint32_t p_barrier = RD::BARRIER_MASK_ALL); + + /* Render Scene */ + void _process_ssao(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, RID p_normal_buffer, const Projection &p_projection); + void _process_ssil(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, RID p_normal_buffer, const Projection &p_projection, const Transform3D &p_transform); + void _copy_framebuffer_to_ssil(Ref<RenderSceneBuffersRD> p_render_buffers); + void _pre_opaque_render(RenderDataRD *p_render_data, bool p_use_ssao, bool p_use_ssil, bool p_use_gi, const RID *p_normal_roughness_slices, RID p_voxel_gi_buffer); + void _process_ssr(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_dest_framebuffer, const RID *p_normal_buffer_slices, RID p_specular_buffer, const RID *p_metallic_slices, RID p_environment, const Projection *p_projections, const Vector3 *p_eye_offsets, bool p_use_additive); + void _process_sss(Ref<RenderSceneBuffersRD> p_render_buffers, const Projection &p_camera); + + /* Debug */ + void _debug_draw_cluster(Ref<RenderSceneBuffersRD> p_render_buffers); protected: - virtual void _render_scene(RenderDataRD *p_render_data, const Color &p_default_bg_color) override; + /* setup */ + + virtual RID _render_buffers_get_normal_texture(Ref<RenderSceneBuffersRD> p_render_buffers) override; + virtual RID _render_buffers_get_velocity_texture(Ref<RenderSceneBuffersRD> p_render_buffers) override; + + virtual void environment_set_ssao_quality(RS::EnvironmentSSAOQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) override; + virtual void environment_set_ssil_quality(RS::EnvironmentSSILQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) override; + virtual void environment_set_ssr_roughness_quality(RS::EnvironmentSSRRoughnessQuality p_quality) override; - virtual void _render_shadow_begin() override; - virtual void _render_shadow_append(RID p_framebuffer, const PagedArray<RenderGeometryInstance *> &p_instances, const Projection &p_projection, const Transform3D &p_transform, float p_zfar, float p_bias, float p_normal_bias, bool p_use_dp, bool p_use_dp_flip, bool p_use_pancake, const Plane &p_camera_plane = Plane(), float p_lod_distance_multiplier = 0.0, float p_screen_mesh_lod_threshold = 0.0, const Rect2i &p_rect = Rect2i(), bool p_flip_y = false, bool p_clear_region = true, bool p_begin = true, bool p_end = true, RendererScene::RenderInfo *p_render_info = nullptr) override; - virtual void _render_shadow_process() override; - virtual void _render_shadow_end(uint32_t p_barrier = RD::BARRIER_MASK_ALL) override; + virtual void sub_surface_scattering_set_quality(RS::SubSurfaceScatteringQuality p_quality) override; + virtual void sub_surface_scattering_set_scale(float p_scale, float p_depth_scale) override; + + /* Rendering */ + + virtual void _render_scene(RenderDataRD *p_render_data, const Color &p_default_bg_color) override; + virtual void _render_buffers_debug_draw(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_shadow_atlas, RID p_occlusion_buffer) override; virtual void _render_material(const Transform3D &p_cam_transform, const Projection &p_cam_projection, bool p_cam_orthogonal, const PagedArray<RenderGeometryInstance *> &p_instances, RID p_framebuffer, const Rect2i &p_region, float p_exposure_normalization) override; virtual void _render_uv2(const PagedArray<RenderGeometryInstance *> &p_instances, RID p_framebuffer, const Rect2i &p_region) override; @@ -634,6 +637,15 @@ protected: public: static RenderForwardClustered *get_singleton() { return singleton; } + ClusterBuilderSharedDataRD *get_cluster_builder_shared() { return &cluster_builder_shared; } + RendererRD::SSEffects *get_ss_effects() { return ss_effects; } + + /* callback from updating our lighting UBOs, used to populate cluster builder */ + virtual void setup_added_reflection_probe(const Transform3D &p_transform, const Vector3 &p_half_extents) override; + virtual void setup_added_light(const RS::LightType p_type, const Transform3D &p_transform, float p_radius, float p_spot_aperture) override; + virtual void setup_added_decal(const Transform3D &p_transform, const Vector3 &p_half_extents) override; + + virtual void base_uniforms_changed() override; _FORCE_INLINE_ virtual void update_uniform_sets() override { base_uniform_set_updated = true; _update_render_base_uniform_set(); diff --git a/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.cpp b/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.cpp index 75ccf1add5..1987577464 100644 --- a/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.cpp +++ b/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.cpp @@ -621,10 +621,10 @@ void SceneShaderForwardClustered::init(const String p_defines) { //shader compiler ShaderCompiler::DefaultIdentifierActions actions; - actions.renames["MODEL_MATRIX"] = "model_matrix"; + actions.renames["MODEL_MATRIX"] = "read_model_matrix"; actions.renames["MODEL_NORMAL_MATRIX"] = "model_normal_matrix"; actions.renames["VIEW_MATRIX"] = "scene_data.view_matrix"; - actions.renames["INV_VIEW_MATRIX"] = "scene_data.inv_view_matrix"; + actions.renames["INV_VIEW_MATRIX"] = "inv_view_matrix"; actions.renames["PROJECTION_MATRIX"] = "projection_matrix"; actions.renames["INV_PROJECTION_MATRIX"] = "inv_projection_matrix"; actions.renames["MODELVIEW_MATRIX"] = "modelview"; @@ -757,6 +757,8 @@ void SceneShaderForwardClustered::init(const String p_defines) { actions.usage_defines["RADIANCE"] = "#define CUSTOM_RADIANCE_USED\n"; actions.usage_defines["IRRADIANCE"] = "#define CUSTOM_IRRADIANCE_USED\n"; + actions.usage_defines["MODEL_MATRIX"] = "#define MODEL_MATRIX_USED\n"; + actions.render_mode_defines["skip_vertex_transform"] = "#define SKIP_TRANSFORM_USED\n"; actions.render_mode_defines["world_vertex_coords"] = "#define VERTEX_WORLD_COORDS_USED\n"; actions.render_mode_defines["ensure_correct_normals"] = "#define ENSURE_CORRECT_NORMALS\n"; diff --git a/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.h b/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.h index c2f56eb164..a9a9fa94de 100644 --- a/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.h +++ b/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.h @@ -32,7 +32,7 @@ #define SCENE_SHADER_FORWARD_CLUSTERED_H #include "servers/rendering/renderer_rd/renderer_scene_render_rd.h" -#include "servers/rendering/renderer_rd/shaders/scene_forward_clustered.glsl.gen.h" +#include "servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl.gen.h" namespace RendererSceneRenderImplementation { diff --git a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp index 46d90e75fb..c3ce1b05f1 100644 --- a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp +++ b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp @@ -39,7 +39,7 @@ using namespace RendererSceneRenderImplementation; -RenderForwardMobile::ForwardID RenderForwardMobile::_allocate_forward_id(ForwardIDType p_type) { +RendererRD::ForwardID RenderForwardMobile::ForwardIDStorageMobile::allocate_forward_id(RendererRD::ForwardIDType p_type) { int32_t index = -1; for (uint32_t i = 0; i < forward_id_allocators[p_type].allocations.size(); i++) { if (forward_id_allocators[p_type].allocations[i] == false) { @@ -58,15 +58,66 @@ RenderForwardMobile::ForwardID RenderForwardMobile::_allocate_forward_id(Forward return index; } -void RenderForwardMobile::_free_forward_id(ForwardIDType p_type, ForwardID p_id) { - ERR_FAIL_INDEX(p_id, (ForwardID)forward_id_allocators[p_type].allocations.size()); +void RenderForwardMobile::ForwardIDStorageMobile::free_forward_id(RendererRD::ForwardIDType p_type, RendererRD::ForwardID p_id) { + ERR_FAIL_INDEX(p_id, (RendererRD::ForwardID)forward_id_allocators[p_type].allocations.size()); forward_id_allocators[p_type].allocations[p_id] = false; } -void RenderForwardMobile::_map_forward_id(ForwardIDType p_type, ForwardID p_id, uint32_t p_index) { +void RenderForwardMobile::ForwardIDStorageMobile::map_forward_id(RendererRD::ForwardIDType p_type, RendererRD::ForwardID p_id, uint32_t p_index) { forward_id_allocators[p_type].map[p_id] = p_index; } +void RenderForwardMobile::ForwardIDStorageMobile::fill_push_constant_instance_indices(GeometryInstanceForwardMobile::PushConstant *p_push_constant, uint32_t &spec_constants, const GeometryInstanceForwardMobile *p_instance) { + // first zero out our indices + + p_push_constant->omni_lights[0] = 0xFFFF; + p_push_constant->omni_lights[1] = 0xFFFF; + + p_push_constant->spot_lights[0] = 0xFFFF; + p_push_constant->spot_lights[1] = 0xFFFF; + + p_push_constant->decals[0] = 0xFFFF; + p_push_constant->decals[1] = 0xFFFF; + + p_push_constant->reflection_probes[0] = 0xFFFF; + p_push_constant->reflection_probes[1] = 0xFFFF; + + if (p_instance->omni_light_count == 0) { + spec_constants |= 1 << SPEC_CONSTANT_DISABLE_OMNI_LIGHTS; + } + if (p_instance->spot_light_count == 0) { + spec_constants |= 1 << SPEC_CONSTANT_DISABLE_SPOT_LIGHTS; + } + if (p_instance->reflection_probe_count == 0) { + spec_constants |= 1 << SPEC_CONSTANT_DISABLE_REFLECTION_PROBES; + } + if (p_instance->decals_count == 0) { + spec_constants |= 1 << SPEC_CONSTANT_DISABLE_DECALS; + } + + for (uint32_t i = 0; i < MAX_RDL_CULL; i++) { + uint32_t ofs = i < 4 ? 0 : 1; + uint32_t shift = (i & 0x3) << 3; + uint32_t mask = ~(0xFF << shift); + if (i < p_instance->omni_light_count) { + p_push_constant->omni_lights[ofs] &= mask; + p_push_constant->omni_lights[ofs] |= uint32_t(forward_id_allocators[RendererRD::FORWARD_ID_TYPE_OMNI_LIGHT].map[p_instance->omni_lights[i]]) << shift; + } + if (i < p_instance->spot_light_count) { + p_push_constant->spot_lights[ofs] &= mask; + p_push_constant->spot_lights[ofs] |= uint32_t(forward_id_allocators[RendererRD::FORWARD_ID_TYPE_SPOT_LIGHT].map[p_instance->spot_lights[i]]) << shift; + } + if (i < p_instance->decals_count) { + p_push_constant->decals[ofs] &= mask; + p_push_constant->decals[ofs] |= uint32_t(forward_id_allocators[RendererRD::FORWARD_ID_TYPE_DECAL].map[p_instance->decals[i]]) << shift; + } + if (i < p_instance->reflection_probe_count) { + p_push_constant->reflection_probes[ofs] &= mask; + p_push_constant->reflection_probes[ofs] |= uint32_t(forward_id_allocators[RendererRD::FORWARD_ID_TYPE_REFLECTION_PROBE].map[p_instance->reflection_probes[i]]) << shift; + } + } +} + /* Render buffer */ void RenderForwardMobile::RenderBufferDataForwardMobile::free_data() { @@ -300,6 +351,7 @@ bool RenderForwardMobile::_render_buffers_can_be_storage() { } RID RenderForwardMobile::_setup_render_pass_uniform_set(RenderListType p_render_list, const RenderDataRD *p_render_data, RID p_radiance_texture, bool p_use_directional_shadow_atlas, int p_index) { + RendererRD::LightStorage *light_storage = RendererRD::LightStorage::get_singleton(); RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton(); //there should always be enough uniform buffers for render passes, otherwise bugs @@ -340,7 +392,7 @@ RID RenderForwardMobile::_setup_render_pass_uniform_set(RenderListType p_render_ } { - RID ref_texture = (p_render_data && p_render_data->reflection_atlas.is_valid()) ? reflection_atlas_get_texture(p_render_data->reflection_atlas) : RID(); + RID ref_texture = (p_render_data && p_render_data->reflection_atlas.is_valid()) ? light_storage->reflection_atlas_get_texture(p_render_data->reflection_atlas) : RID(); RD::Uniform u; u.binding = 3; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; @@ -358,7 +410,7 @@ RID RenderForwardMobile::_setup_render_pass_uniform_set(RenderListType p_render_ u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; RID texture; if (p_render_data && p_render_data->shadow_atlas.is_valid()) { - texture = shadow_atlas_get_texture(p_render_data->shadow_atlas); + texture = light_storage->shadow_atlas_get_texture(p_render_data->shadow_atlas); } if (!texture.is_valid()) { texture = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_DEPTH); @@ -370,8 +422,8 @@ RID RenderForwardMobile::_setup_render_pass_uniform_set(RenderListType p_render_ RD::Uniform u; u.binding = 5; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; - if (p_use_directional_shadow_atlas && directional_shadow_get_texture().is_valid()) { - u.append_id(directional_shadow_get_texture()); + if (p_use_directional_shadow_atlas && light_storage->directional_shadow_get_texture().is_valid()) { + u.append_id(light_storage->directional_shadow_get_texture()); } else { u.append_id(texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_DEPTH)); } @@ -387,8 +439,8 @@ RID RenderForwardMobile::_setup_render_pass_uniform_set(RenderListType p_render_ RID default_tex = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_WHITE); for (uint32_t i = 0; i < scene_state.max_lightmaps; i++) { if (p_render_data && i < p_render_data->lightmaps->size()) { - RID base = lightmap_instance_get_lightmap((*p_render_data->lightmaps)[i]); - RID texture = RendererRD::LightStorage::get_singleton()->lightmap_get_texture(base); + RID base = light_storage->lightmap_instance_get_lightmap((*p_render_data->lightmaps)[i]); + RID texture = light_storage->lightmap_get_texture(base); RID rd_texture = texture_storage->texture_get_rd_texture(texture); u.append_id(rd_texture); } else { @@ -467,6 +519,8 @@ RID RenderForwardMobile::_setup_render_pass_uniform_set(RenderListType p_render_ } void RenderForwardMobile::_setup_lightmaps(const RenderDataRD *p_render_data, const PagedArray<RID> &p_lightmaps, const Transform3D &p_cam_transform) { + RendererRD::LightStorage *light_storage = RendererRD::LightStorage::get_singleton(); + // This probably needs to change... scene_state.lightmaps_used = 0; for (int i = 0; i < (int)p_lightmaps.size(); i++) { @@ -474,20 +528,20 @@ void RenderForwardMobile::_setup_lightmaps(const RenderDataRD *p_render_data, co break; } - RID lightmap = lightmap_instance_get_lightmap(p_lightmaps[i]); + RID lightmap = light_storage->lightmap_instance_get_lightmap(p_lightmaps[i]); - Basis to_lm = lightmap_instance_get_transform(p_lightmaps[i]).basis.inverse() * p_cam_transform.basis; + Basis to_lm = light_storage->lightmap_instance_get_transform(p_lightmaps[i]).basis.inverse() * p_cam_transform.basis; to_lm = to_lm.inverse().transposed(); //will transform normals RendererRD::MaterialStorage::store_transform_3x3(to_lm, scene_state.lightmaps[i].normal_xform); scene_state.lightmaps[i].exposure_normalization = 1.0; if (p_render_data->camera_attributes.is_valid()) { - float baked_exposure = RendererRD::LightStorage::get_singleton()->lightmap_get_baked_exposure_normalization(lightmap); + float baked_exposure = light_storage->lightmap_get_baked_exposure_normalization(lightmap); float enf = RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor(p_render_data->camera_attributes); scene_state.lightmaps[i].exposure_normalization = enf / baked_exposure; } scene_state.lightmap_ids[i] = p_lightmaps[i]; - scene_state.lightmap_has_sh[i] = RendererRD::LightStorage::get_singleton()->lightmap_uses_spherical_harmonics(lightmap); + scene_state.lightmap_has_sh[i] = light_storage->lightmap_uses_spherical_harmonics(lightmap); scene_state.lightmaps_used++; } @@ -496,16 +550,119 @@ void RenderForwardMobile::_setup_lightmaps(const RenderDataRD *p_render_data, co } } +void RenderForwardMobile::_pre_opaque_render(RenderDataRD *p_render_data) { + RendererRD::LightStorage *light_storage = RendererRD::LightStorage::get_singleton(); + RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton(); + + p_render_data->cube_shadows.clear(); + p_render_data->shadows.clear(); + p_render_data->directional_shadows.clear(); + + Plane camera_plane(-p_render_data->scene_data->cam_transform.basis.get_column(Vector3::AXIS_Z), p_render_data->scene_data->cam_transform.origin); + float lod_distance_multiplier = p_render_data->scene_data->cam_projection.get_lod_multiplier(); + { + for (int i = 0; i < p_render_data->render_shadow_count; i++) { + RID li = p_render_data->render_shadows[i].light; + RID base = light_storage->light_instance_get_base_light(li); + + if (light_storage->light_get_type(base) == RS::LIGHT_DIRECTIONAL) { + p_render_data->directional_shadows.push_back(i); + } else if (light_storage->light_get_type(base) == RS::LIGHT_OMNI && light_storage->light_omni_get_shadow_mode(base) == RS::LIGHT_OMNI_SHADOW_CUBE) { + p_render_data->cube_shadows.push_back(i); + } else { + p_render_data->shadows.push_back(i); + } + } + + //cube shadows are rendered in their own way + for (uint32_t i = 0; i < p_render_data->cube_shadows.size(); i++) { + _render_shadow_pass(p_render_data->render_shadows[p_render_data->cube_shadows[i]].light, p_render_data->shadow_atlas, p_render_data->render_shadows[p_render_data->cube_shadows[i]].pass, p_render_data->render_shadows[p_render_data->cube_shadows[i]].instances, camera_plane, lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, true, true, true, p_render_data->render_info); + } + + if (p_render_data->directional_shadows.size()) { + //open the pass for directional shadows + light_storage->update_directional_shadow_atlas(); + RD::get_singleton()->draw_list_begin(light_storage->direction_shadow_get_fb(), RD::INITIAL_ACTION_DROP, RD::FINAL_ACTION_DISCARD, RD::INITIAL_ACTION_CLEAR, RD::FINAL_ACTION_CONTINUE); + RD::get_singleton()->draw_list_end(); + } + } + + bool render_shadows = p_render_data->directional_shadows.size() || p_render_data->shadows.size(); + + if (render_shadows) { + RENDER_TIMESTAMP("Render Shadows"); + } + + //prepare shadow rendering + if (render_shadows) { + _render_shadow_begin(); + + //render directional shadows + for (uint32_t i = 0; i < p_render_data->directional_shadows.size(); i++) { + _render_shadow_pass(p_render_data->render_shadows[p_render_data->directional_shadows[i]].light, p_render_data->shadow_atlas, p_render_data->render_shadows[p_render_data->directional_shadows[i]].pass, p_render_data->render_shadows[p_render_data->directional_shadows[i]].instances, camera_plane, lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, false, i == p_render_data->directional_shadows.size() - 1, false, p_render_data->render_info); + } + //render positional shadows + for (uint32_t i = 0; i < p_render_data->shadows.size(); i++) { + _render_shadow_pass(p_render_data->render_shadows[p_render_data->shadows[i]].light, p_render_data->shadow_atlas, p_render_data->render_shadows[p_render_data->shadows[i]].pass, p_render_data->render_shadows[p_render_data->shadows[i]].instances, camera_plane, lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, i == 0, i == p_render_data->shadows.size() - 1, true, p_render_data->render_info); + } + + _render_shadow_process(); + + _render_shadow_end(RD::BARRIER_MASK_NO_BARRIER); + } + + //full barrier here, we need raster, transfer and compute and it depends from the previous work + RD::get_singleton()->barrier(RD::BARRIER_MASK_ALL, RD::BARRIER_MASK_ALL); + + bool using_shadows = true; + + if (p_render_data->reflection_probe.is_valid()) { + if (!RSG::light_storage->reflection_probe_renders_shadows(light_storage->reflection_probe_instance_get_probe(p_render_data->reflection_probe))) { + using_shadows = false; + } + } else { + //do not render reflections when rendering a reflection probe + light_storage->update_reflection_probe_buffer(p_render_data, *p_render_data->reflection_probes, p_render_data->scene_data->cam_transform.affine_inverse(), p_render_data->environment); + } + + uint32_t directional_light_count = 0; + uint32_t positional_light_count = 0; + light_storage->update_light_buffers(p_render_data, *p_render_data->lights, p_render_data->scene_data->cam_transform, p_render_data->shadow_atlas, using_shadows, directional_light_count, positional_light_count, p_render_data->directional_light_soft_shadows); + texture_storage->update_decal_buffer(*p_render_data->decals, p_render_data->scene_data->cam_transform.affine_inverse()); + + p_render_data->directional_light_count = directional_light_count; +} + void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color &p_default_bg_color) { + RendererRD::LightStorage *light_storage = RendererRD::LightStorage::get_singleton(); + + Ref<RenderSceneBuffersRD> rb; Ref<RenderBufferDataForwardMobile> rb_data; if (p_render_data->render_buffers.is_valid()) { - rb_data = p_render_data->render_buffers->get_custom_data(RB_SCOPE_MOBILE); + rb = p_render_data->render_buffers; + rb_data = rb->get_custom_data(RB_SCOPE_MOBILE); } + RENDER_TIMESTAMP("Prepare 3D Scene"); + + _update_vrs(rb); + RENDER_TIMESTAMP("Setup 3D Scene"); - scene_state.ubo.directional_light_count = 0; - scene_state.ubo.opaque_prepass_threshold = 0.0; + /* TODO + // check if we need motion vectors + if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_MOTION_VECTORS) { + p_render_data->scene_data->calculate_motion_vectors = true; + } else if (render target has velocity override) { // TODO + p_render_data->scene_data->calculate_motion_vectors = true; + } else { + p_render_data->scene_data->calculate_motion_vectors = false; + } + */ + p_render_data->scene_data->calculate_motion_vectors = false; // for now, not yet supported... + + p_render_data->scene_data->directional_light_count = 0; + p_render_data->scene_data->opaque_prepass_threshold = 0.0; // We can only use our full subpass approach if we're: // - not reading from SCREEN_TEXTURE/DEPTH_TEXTURE @@ -520,9 +677,6 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color bool using_subpass_transparent = true; bool using_subpass_post_process = true; - bool using_ssr = false; // I don't think we support this in our mobile renderer so probably should phase it out - bool using_sss = false; // I don't think we support this in our mobile renderer so probably should phase it out - // fill our render lists early so we can find out if we use various features _fill_render_list(RENDER_LIST_OPAQUE, p_render_data, PASS_MODE_COLOR); render_list[RENDER_LIST_OPAQUE].sort_by_key(); @@ -547,7 +701,7 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color using_subpass_post_process = false; } - if (using_ssr || using_sss || scene_state.used_screen_texture || scene_state.used_depth_texture) { + if (scene_state.used_screen_texture || scene_state.used_depth_texture) { // can't use our last two subpasses using_subpass_transparent = false; using_subpass_post_process = false; @@ -564,13 +718,13 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color framebuffer = rb_data->get_color_fbs(RenderBufferDataForwardMobile::FB_CONFIG_TWO_SUBPASSES); } } else if (p_render_data->reflection_probe.is_valid()) { - uint32_t resolution = reflection_probe_instance_get_resolution(p_render_data->reflection_probe); + uint32_t resolution = light_storage->reflection_probe_instance_get_resolution(p_render_data->reflection_probe); screen_size.x = resolution; screen_size.y = resolution; - framebuffer = reflection_probe_instance_get_framebuffer(p_render_data->reflection_probe, p_render_data->reflection_probe_pass); + framebuffer = light_storage->reflection_probe_instance_get_framebuffer(p_render_data->reflection_probe, p_render_data->reflection_probe_pass); - if (RendererRD::LightStorage::get_singleton()->reflection_probe_is_interior(reflection_probe_instance_get_probe(p_render_data->reflection_probe))) { + if (light_storage->reflection_probe_is_interior(light_storage->reflection_probe_instance_get_probe(p_render_data->reflection_probe))) { p_render_data->environment = RID(); //no environment on interiors } @@ -581,13 +735,11 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color ERR_FAIL(); //bug? } - scene_state.ubo.viewport_size[0] = screen_size.x; - scene_state.ubo.viewport_size[1] = screen_size.y; - scene_state.ubo.emissive_exposure_normalization = -1.0; + p_render_data->scene_data->emissive_exposure_normalization = -1.0; RD::get_singleton()->draw_command_begin_label("Render Setup"); - _setup_lightmaps(p_render_data, *p_render_data->lightmaps, p_render_data->cam_transform); + _setup_lightmaps(p_render_data, *p_render_data->lightmaps, p_render_data->scene_data->cam_transform); _setup_environment(p_render_data, p_render_data->reflection_probe.is_valid(), screen_size, !p_render_data->reflection_probe.is_valid(), p_default_bg_color, false); _update_render_base_uniform_set(); //may have changed due to the above (light buffer enlarged, as an example) @@ -658,20 +810,20 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color if (draw_sky || draw_sky_fog_only || environment_get_reflection_source(p_render_data->environment) == RS::ENV_REFLECTION_SOURCE_SKY || environment_get_ambient_source(p_render_data->environment) == RS::ENV_AMBIENT_SOURCE_SKY) { RENDER_TIMESTAMP("Setup Sky"); RD::get_singleton()->draw_command_begin_label("Setup Sky"); - Projection projection = p_render_data->cam_projection; + Projection projection = p_render_data->scene_data->cam_projection; if (p_render_data->reflection_probe.is_valid()) { Projection correction; correction.set_depth_correction(true); - projection = correction * p_render_data->cam_projection; + projection = correction * p_render_data->scene_data->cam_projection; } - sky.setup(p_render_data->environment, p_render_data->render_buffers, *p_render_data->lights, p_render_data->camera_attributes, projection, p_render_data->cam_transform, screen_size, this); + sky.setup(p_render_data->environment, p_render_data->render_buffers, *p_render_data->lights, p_render_data->camera_attributes, projection, p_render_data->scene_data->cam_transform, screen_size, this); sky_energy_multiplier *= bg_energy_multiplier; RID sky_rid = environment_get_sky(p_render_data->environment); if (sky_rid.is_valid()) { - sky.update(p_render_data->environment, projection, p_render_data->cam_transform, time, sky_energy_multiplier); + sky.update(p_render_data->environment, projection, p_render_data->scene_data->cam_transform, time, sky_energy_multiplier); radiance_texture = sky.sky_get_radiance_texture_rd(sky_rid); } else { // do not try to draw sky if invalid @@ -694,17 +846,16 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color if (p_render_data->reflection_probe.is_valid()) { Projection correction; correction.set_depth_correction(true); - Projection projection = correction * p_render_data->cam_projection; - sky.update_res_buffers(p_render_data->environment, 1, &projection, p_render_data->cam_transform, time, sky_energy_multiplier); + Projection projection = correction * p_render_data->scene_data->cam_projection; + sky.update_res_buffers(p_render_data->environment, 1, &projection, p_render_data->scene_data->cam_transform, time, sky_energy_multiplier); } else { - sky.update_res_buffers(p_render_data->environment, p_render_data->view_count, p_render_data->view_projection, p_render_data->cam_transform, time, sky_energy_multiplier); + sky.update_res_buffers(p_render_data->environment, p_render_data->scene_data->view_count, p_render_data->scene_data->view_projection, p_render_data->scene_data->cam_transform, time, sky_energy_multiplier); } RD::get_singleton()->draw_command_end_label(); // Setup Sky resolution buffers } - RID nullrids[RendererSceneRender::MAX_RENDER_VIEWS]; - _pre_opaque_render(p_render_data, false, false, false, nullrids, RID()); + _pre_opaque_render(p_render_data); uint32_t spec_constant_base_flags = 0; @@ -719,7 +870,7 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color spec_constant_base_flags |= 1 << SPEC_CONSTANT_DISABLE_DIRECTIONAL_LIGHTS; } - if (!is_environment(p_render_data->environment) || environment_get_fog_enabled(p_render_data->environment)) { + if (!is_environment(p_render_data->environment) || !environment_get_fog_enabled(p_render_data->environment)) { spec_constant_base_flags |= 1 << SPEC_CONSTANT_DISABLE_FOG; } } @@ -734,7 +885,7 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color RD::get_singleton()->draw_command_begin_label("Render Opaque Subpass"); - scene_state.ubo.directional_light_count = p_render_data->directional_light_count; + p_render_data->scene_data->directional_light_count = p_render_data->directional_light_count; _setup_environment(p_render_data, p_render_data->reflection_probe.is_valid(), screen_size, !p_render_data->reflection_probe.is_valid(), p_default_bg_color, p_render_data->render_buffers.is_valid()); @@ -748,8 +899,8 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color RID rp_uniform_set = _setup_render_pass_uniform_set(RENDER_LIST_OPAQUE, p_render_data, radiance_texture, true); - bool can_continue_color = !using_subpass_transparent && !scene_state.used_screen_texture && !using_ssr && !using_sss; - bool can_continue_depth = !using_subpass_transparent && !scene_state.used_depth_texture && !using_ssr && !using_sss; + bool can_continue_color = !using_subpass_transparent && !scene_state.used_screen_texture; + bool can_continue_depth = !using_subpass_transparent && !scene_state.used_depth_texture; { // regular forward for now @@ -765,7 +916,7 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color } RD::FramebufferFormatID fb_format = RD::get_singleton()->framebuffer_get_format(framebuffer); - RenderListParameters render_list_params(render_list[RENDER_LIST_OPAQUE].elements.ptr(), render_list[RENDER_LIST_OPAQUE].element_info.ptr(), render_list[RENDER_LIST_OPAQUE].elements.size(), reverse_cull, PASS_MODE_COLOR, rp_uniform_set, spec_constant_base_flags, get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_WIREFRAME, Vector2(), p_render_data->lod_camera_plane, p_render_data->lod_distance_multiplier, p_render_data->screen_mesh_lod_threshold, p_render_data->view_count); + RenderListParameters render_list_params(render_list[RENDER_LIST_OPAQUE].elements.ptr(), render_list[RENDER_LIST_OPAQUE].element_info.ptr(), render_list[RENDER_LIST_OPAQUE].elements.size(), reverse_cull, PASS_MODE_COLOR, rp_uniform_set, spec_constant_base_flags, get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_WIREFRAME, Vector2(), p_render_data->scene_data->lod_camera_plane, p_render_data->scene_data->lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, p_render_data->scene_data->view_count); render_list_params.framebuffer_format = fb_format; if ((uint32_t)render_list_params.element_count > render_list_thread_threshold && false) { // secondary command buffers need more testing at this time @@ -793,10 +944,10 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color if (p_render_data->reflection_probe.is_valid()) { Projection correction; correction.set_depth_correction(true); - Projection projection = correction * p_render_data->cam_projection; - sky.draw(draw_list, p_render_data->environment, framebuffer, 1, &projection, p_render_data->cam_transform, time, sky_energy_multiplier); + Projection projection = correction * p_render_data->scene_data->cam_projection; + sky.draw(draw_list, p_render_data->environment, framebuffer, 1, &projection, p_render_data->scene_data->cam_transform, time, sky_energy_multiplier); } else { - sky.draw(draw_list, p_render_data->environment, framebuffer, p_render_data->view_count, p_render_data->view_projection, p_render_data->cam_transform, time, sky_energy_multiplier); + sky.draw(draw_list, p_render_data->environment, framebuffer, p_render_data->scene_data->view_count, p_render_data->scene_data->view_projection, p_render_data->scene_data->cam_transform, time, sky_energy_multiplier); } RD::get_singleton()->draw_command_end_label(); // Draw Sky Subpass @@ -832,7 +983,7 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color if (using_subpass_transparent) { RD::FramebufferFormatID fb_format = RD::get_singleton()->framebuffer_get_format(framebuffer); - RenderListParameters render_list_params(render_list[RENDER_LIST_ALPHA].elements.ptr(), render_list[RENDER_LIST_ALPHA].element_info.ptr(), render_list[RENDER_LIST_ALPHA].elements.size(), reverse_cull, PASS_MODE_COLOR_TRANSPARENT, rp_uniform_set, spec_constant_base_flags, get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_WIREFRAME, Vector2(), p_render_data->lod_camera_plane, p_render_data->lod_distance_multiplier, p_render_data->screen_mesh_lod_threshold, p_render_data->view_count); + RenderListParameters render_list_params(render_list[RENDER_LIST_ALPHA].elements.ptr(), render_list[RENDER_LIST_ALPHA].element_info.ptr(), render_list[RENDER_LIST_ALPHA].elements.size(), reverse_cull, PASS_MODE_COLOR_TRANSPARENT, rp_uniform_set, spec_constant_base_flags, get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_WIREFRAME, Vector2(), p_render_data->scene_data->lod_camera_plane, p_render_data->scene_data->lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, p_render_data->scene_data->view_count); render_list_params.framebuffer_format = fb_format; if ((uint32_t)render_list_params.element_count > render_list_thread_threshold && false) { // secondary command buffers need more testing at this time @@ -871,7 +1022,7 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color // _setup_environment(p_render_data, p_render_data->reflection_probe.is_valid(), screen_size, !p_render_data->reflection_probe.is_valid(), p_default_bg_color, false); RD::FramebufferFormatID fb_format = RD::get_singleton()->framebuffer_get_format(framebuffer); - RenderListParameters render_list_params(render_list[RENDER_LIST_ALPHA].elements.ptr(), render_list[RENDER_LIST_ALPHA].element_info.ptr(), render_list[RENDER_LIST_ALPHA].elements.size(), reverse_cull, PASS_MODE_COLOR, rp_uniform_set, spec_constant_base_flags, get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_WIREFRAME, Vector2(), p_render_data->lod_camera_plane, p_render_data->lod_distance_multiplier, p_render_data->screen_mesh_lod_threshold, p_render_data->view_count); + RenderListParameters render_list_params(render_list[RENDER_LIST_ALPHA].elements.ptr(), render_list[RENDER_LIST_ALPHA].element_info.ptr(), render_list[RENDER_LIST_ALPHA].elements.size(), reverse_cull, PASS_MODE_COLOR, rp_uniform_set, spec_constant_base_flags, get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_WIREFRAME, Vector2(), p_render_data->scene_data->lod_camera_plane, p_render_data->scene_data->lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, p_render_data->scene_data->view_count); render_list_params.framebuffer_format = fb_format; if ((uint32_t)render_list_params.element_count > render_list_thread_threshold && false) { // secondary command buffers need more testing at this time @@ -907,10 +1058,190 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color if (rb_data.is_valid()) { _disable_clear_request(p_render_data); } + + if (rb.is_valid()) { + _render_buffers_debug_draw(rb, p_render_data->shadow_atlas, p_render_data->occluder_debug_tex); + } } /* these are being called from RendererSceneRenderRD::_pre_opaque_render */ +void RenderForwardMobile::_render_shadow_pass(RID p_light, RID p_shadow_atlas, int p_pass, const PagedArray<RenderGeometryInstance *> &p_instances, const Plane &p_camera_plane, float p_lod_distance_multiplier, float p_screen_mesh_lod_threshold, bool p_open_pass, bool p_close_pass, bool p_clear_region, RenderingMethod::RenderInfo *p_render_info) { + RendererRD::LightStorage *light_storage = RendererRD::LightStorage::get_singleton(); + + ERR_FAIL_COND(!light_storage->owns_light_instance(p_light)); + + RID base = light_storage->light_instance_get_base_light(p_light); + + Rect2i atlas_rect; + uint32_t atlas_size = 1; + RID atlas_fb; + + bool using_dual_paraboloid = false; + bool using_dual_paraboloid_flip = false; + Vector2i dual_paraboloid_offset; + RID render_fb; + RID render_texture; + float zfar; + + bool use_pancake = false; + bool render_cubemap = false; + bool finalize_cubemap = false; + + bool flip_y = false; + + Projection light_projection; + Transform3D light_transform; + + if (light_storage->light_get_type(base) == RS::LIGHT_DIRECTIONAL) { + //set pssm stuff + uint64_t last_scene_shadow_pass = light_storage->light_instance_get_shadow_pass(p_light); + if (last_scene_shadow_pass != get_scene_pass()) { + light_storage->light_instance_set_directional_rect(p_light, light_storage->get_directional_shadow_rect()); + light_storage->directional_shadow_increase_current_light(); + light_storage->light_instance_set_shadow_pass(p_light, get_scene_pass()); + } + + use_pancake = light_storage->light_get_param(base, RS::LIGHT_PARAM_SHADOW_PANCAKE_SIZE) > 0; + light_projection = light_storage->light_instance_get_shadow_camera(p_light, p_pass); + light_transform = light_storage->light_instance_get_shadow_transform(p_light, p_pass); + + atlas_rect = light_storage->light_instance_get_directional_rect(p_light); + + if (light_storage->light_directional_get_shadow_mode(base) == RS::LIGHT_DIRECTIONAL_SHADOW_PARALLEL_4_SPLITS) { + atlas_rect.size.width /= 2; + atlas_rect.size.height /= 2; + + if (p_pass == 1) { + atlas_rect.position.x += atlas_rect.size.width; + } else if (p_pass == 2) { + atlas_rect.position.y += atlas_rect.size.height; + } else if (p_pass == 3) { + atlas_rect.position += atlas_rect.size; + } + } else if (light_storage->light_directional_get_shadow_mode(base) == RS::LIGHT_DIRECTIONAL_SHADOW_PARALLEL_2_SPLITS) { + atlas_rect.size.height /= 2; + + if (p_pass == 0) { + } else { + atlas_rect.position.y += atlas_rect.size.height; + } + } + + int directional_shadow_size = light_storage->directional_shadow_get_size(); + atlas_rect.position /= directional_shadow_size; + atlas_rect.size /= directional_shadow_size; + + light_storage->light_instance_set_directional_shadow_atlas_rect(p_light, p_pass, atlas_rect); + + zfar = RSG::light_storage->light_get_param(base, RS::LIGHT_PARAM_RANGE); + + render_fb = light_storage->direction_shadow_get_fb(); + render_texture = RID(); + flip_y = true; + + } else { + //set from shadow atlas + + ERR_FAIL_COND(!light_storage->owns_shadow_atlas(p_shadow_atlas)); + ERR_FAIL_COND(!light_storage->shadow_atlas_owns_light_instance(p_shadow_atlas, p_light)); + + RSG::light_storage->shadow_atlas_update(p_shadow_atlas); + + uint32_t key = light_storage->shadow_atlas_get_light_instance_key(p_shadow_atlas, p_light); + + uint32_t quadrant = (key >> RendererRD::LightStorage::QUADRANT_SHIFT) & 0x3; + uint32_t shadow = key & RendererRD::LightStorage::SHADOW_INDEX_MASK; + uint32_t subdivision = light_storage->shadow_atlas_get_quadrant_subdivision(p_shadow_atlas, quadrant); + + ERR_FAIL_INDEX((int)shadow, light_storage->shadow_atlas_get_quadrant_shadow_size(p_shadow_atlas, quadrant)); + + uint32_t shadow_atlas_size = light_storage->shadow_atlas_get_size(p_shadow_atlas); + uint32_t quadrant_size = shadow_atlas_size >> 1; + + atlas_rect.position.x = (quadrant & 1) * quadrant_size; + atlas_rect.position.y = (quadrant >> 1) * quadrant_size; + + uint32_t shadow_size = (quadrant_size / subdivision); + atlas_rect.position.x += (shadow % subdivision) * shadow_size; + atlas_rect.position.y += (shadow / subdivision) * shadow_size; + + atlas_rect.size.width = shadow_size; + atlas_rect.size.height = shadow_size; + + zfar = light_storage->light_get_param(base, RS::LIGHT_PARAM_RANGE); + + if (light_storage->light_get_type(base) == RS::LIGHT_OMNI) { + bool wrap = (shadow + 1) % subdivision == 0; + dual_paraboloid_offset = wrap ? Vector2i(1 - subdivision, 1) : Vector2i(1, 0); + + if (light_storage->light_omni_get_shadow_mode(base) == RS::LIGHT_OMNI_SHADOW_CUBE) { + render_texture = light_storage->get_cubemap(shadow_size / 2); + render_fb = light_storage->get_cubemap_fb(shadow_size / 2, p_pass); + + light_projection = light_storage->light_instance_get_shadow_camera(p_light, p_pass); + light_transform = light_storage->light_instance_get_shadow_transform(p_light, p_pass); + render_cubemap = true; + finalize_cubemap = p_pass == 5; + atlas_fb = light_storage->shadow_atlas_get_fb(p_shadow_atlas); + + atlas_size = shadow_atlas_size; + + if (p_pass == 0) { + _render_shadow_begin(); + } + + } else { + atlas_rect.position.x += 1; + atlas_rect.position.y += 1; + atlas_rect.size.x -= 2; + atlas_rect.size.y -= 2; + + atlas_rect.position += p_pass * atlas_rect.size * dual_paraboloid_offset; + + light_projection = light_storage->light_instance_get_shadow_camera(p_light, 0); + light_transform = light_storage->light_instance_get_shadow_transform(p_light, 0); + + using_dual_paraboloid = true; + using_dual_paraboloid_flip = p_pass == 1; + render_fb = light_storage->shadow_atlas_get_fb(p_shadow_atlas); + flip_y = true; + } + + } else if (light_storage->light_get_type(base) == RS::LIGHT_SPOT) { + light_projection = light_storage->light_instance_get_shadow_camera(p_light, 0); + light_transform = light_storage->light_instance_get_shadow_transform(p_light, 0); + + render_fb = light_storage->shadow_atlas_get_fb(p_shadow_atlas); + + flip_y = true; + } + } + + if (render_cubemap) { + //rendering to cubemap + _render_shadow_append(render_fb, p_instances, light_projection, light_transform, zfar, 0, 0, false, false, use_pancake, p_camera_plane, p_lod_distance_multiplier, p_screen_mesh_lod_threshold, Rect2(), false, true, true, true, p_render_info); + if (finalize_cubemap) { + _render_shadow_process(); + _render_shadow_end(); + //reblit + Rect2 atlas_rect_norm = atlas_rect; + atlas_rect_norm.position /= float(atlas_size); + atlas_rect_norm.size /= float(atlas_size); + copy_effects->copy_cubemap_to_dp(render_texture, atlas_fb, atlas_rect_norm, atlas_rect.size, light_projection.get_z_near(), light_projection.get_z_far(), false); + atlas_rect_norm.position += Vector2(dual_paraboloid_offset) * atlas_rect_norm.size; + copy_effects->copy_cubemap_to_dp(render_texture, atlas_fb, atlas_rect_norm, atlas_rect.size, light_projection.get_z_near(), light_projection.get_z_far(), true); + + //restore transform so it can be properly used + light_storage->light_instance_set_shadow_transform(p_light, Projection(), light_storage->light_instance_get_base_transform(p_light), zfar, 0, 0, 0); + } + + } else { + //render shadow + _render_shadow_append(render_fb, p_instances, light_projection, light_transform, zfar, 0, 0, using_dual_paraboloid, using_dual_paraboloid_flip, use_pancake, p_camera_plane, p_lod_distance_multiplier, p_screen_mesh_lod_threshold, atlas_rect, flip_y, p_clear_region, p_open_pass, p_close_pass, p_render_info); + } +} + void RenderForwardMobile::_render_shadow_begin() { scene_state.shadow_passes.clear(); RD::get_singleton()->draw_command_begin_label("Shadow Setup"); @@ -919,7 +1250,7 @@ void RenderForwardMobile::_render_shadow_begin() { render_list[RENDER_LIST_SECONDARY].clear(); } -void RenderForwardMobile::_render_shadow_append(RID p_framebuffer, const PagedArray<RenderGeometryInstance *> &p_instances, const Projection &p_projection, const Transform3D &p_transform, float p_zfar, float p_bias, float p_normal_bias, bool p_use_dp, bool p_use_dp_flip, bool p_use_pancake, const Plane &p_camera_plane, float p_lod_distance_multiplier, float p_screen_mesh_lod_threshold, const Rect2i &p_rect, bool p_flip_y, bool p_clear_region, bool p_begin, bool p_end, RendererScene::RenderInfo *p_render_info) { +void RenderForwardMobile::_render_shadow_append(RID p_framebuffer, const PagedArray<RenderGeometryInstance *> &p_instances, const Projection &p_projection, const Transform3D &p_transform, float p_zfar, float p_bias, float p_normal_bias, bool p_use_dp, bool p_use_dp_flip, bool p_use_pancake, const Plane &p_camera_plane, float p_lod_distance_multiplier, float p_screen_mesh_lod_threshold, const Rect2i &p_rect, bool p_flip_y, bool p_clear_region, bool p_begin, bool p_end, RenderingMethod::RenderInfo *p_render_info) { uint32_t shadow_pass_index = scene_state.shadow_passes.size(); SceneState::ShadowPass shadow_pass; @@ -928,26 +1259,29 @@ void RenderForwardMobile::_render_shadow_append(RID p_framebuffer, const PagedAr p_render_info->info[RS::VIEWPORT_RENDER_INFO_TYPE_SHADOW][RS::VIEWPORT_RENDER_INFO_DRAW_CALLS_IN_FRAME] = p_instances.size(); p_render_info->info[RS::VIEWPORT_RENDER_INFO_TYPE_SHADOW][RS::VIEWPORT_RENDER_INFO_OBJECTS_IN_FRAME] = p_instances.size(); } + + RenderSceneDataRD scene_data; + scene_data.cam_projection = p_projection; + scene_data.cam_transform = p_transform; + scene_data.view_projection[0] = p_projection; + scene_data.z_near = 0.0; + scene_data.z_far = p_zfar; + scene_data.lod_camera_plane = p_camera_plane; + scene_data.lod_distance_multiplier = p_lod_distance_multiplier; + scene_data.dual_paraboloid_side = p_use_dp_flip ? -1 : 1; + scene_data.opaque_prepass_threshold = 0.1; + RenderDataRD render_data; - render_data.cam_projection = p_projection; - render_data.cam_transform = p_transform; - render_data.view_projection[0] = p_projection; - render_data.z_near = 0.0; - render_data.z_far = p_zfar; + render_data.scene_data = &scene_data; render_data.instances = &p_instances; render_data.render_info = p_render_info; - render_data.lod_camera_plane = p_camera_plane; - render_data.lod_distance_multiplier = p_lod_distance_multiplier; - - scene_state.ubo.dual_paraboloid_side = p_use_dp_flip ? -1 : 1; - scene_state.ubo.opaque_prepass_threshold = 0.1; _setup_environment(&render_data, true, Vector2(1, 1), !p_flip_y, Color(), false, p_use_pancake, shadow_pass_index); if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_DISABLE_LOD) { - render_data.screen_mesh_lod_threshold = 0.0; + scene_data.screen_mesh_lod_threshold = 0.0; } else { - render_data.screen_mesh_lod_threshold = p_screen_mesh_lod_threshold; + scene_data.screen_mesh_lod_threshold = p_screen_mesh_lod_threshold; } PassMode pass_mode = p_use_dp ? PASS_MODE_SHADOW_DP : PASS_MODE_SHADOW; @@ -972,8 +1306,8 @@ void RenderForwardMobile::_render_shadow_append(RID p_framebuffer, const PagedAr shadow_pass.rp_uniform_set = RID(); //will be filled later when instance buffer is complete shadow_pass.camera_plane = p_camera_plane; - shadow_pass.screen_mesh_lod_threshold = render_data.screen_mesh_lod_threshold; - shadow_pass.lod_distance_multiplier = render_data.lod_distance_multiplier; + shadow_pass.screen_mesh_lod_threshold = scene_data.screen_mesh_lod_threshold; + shadow_pass.lod_distance_multiplier = scene_data.lod_distance_multiplier; shadow_pass.framebuffer = p_framebuffer; shadow_pass.initial_depth_action = p_begin ? (p_clear_region ? RD::INITIAL_ACTION_CLEAR_REGION : RD::INITIAL_ACTION_CLEAR) : (p_clear_region ? RD::INITIAL_ACTION_CLEAR_REGION_CONTINUE : RD::INITIAL_ACTION_CONTINUE); @@ -1020,15 +1354,17 @@ void RenderForwardMobile::_render_material(const Transform3D &p_cam_transform, c _update_render_base_uniform_set(); - scene_state.ubo.dual_paraboloid_side = 0; - scene_state.ubo.material_uv2_mode = false; - scene_state.ubo.opaque_prepass_threshold = 0.0f; - scene_state.ubo.emissive_exposure_normalization = p_exposure_normalization; + RenderSceneDataRD scene_data; + scene_data.cam_projection = p_cam_projection; + scene_data.cam_transform = p_cam_transform; + scene_data.view_projection[0] = p_cam_projection; + scene_data.dual_paraboloid_side = 0; + scene_data.material_uv2_mode = false; + scene_data.opaque_prepass_threshold = 0.0f; + scene_data.emissive_exposure_normalization = p_exposure_normalization; RenderDataRD render_data; - render_data.cam_projection = p_cam_projection; - render_data.cam_transform = p_cam_transform; - render_data.view_projection[0] = p_cam_projection; + render_data.scene_data = &scene_data; render_data.instances = &p_instances; _setup_environment(&render_data, true, Vector2(1, 1), false, Color()); @@ -1067,11 +1403,13 @@ void RenderForwardMobile::_render_uv2(const PagedArray<RenderGeometryInstance *> _update_render_base_uniform_set(); - scene_state.ubo.dual_paraboloid_side = 0; - scene_state.ubo.material_uv2_mode = true; - scene_state.ubo.emissive_exposure_normalization = -1.0; + RenderSceneDataRD scene_data; + scene_data.dual_paraboloid_side = 0; + scene_data.material_uv2_mode = true; + scene_data.emissive_exposure_normalization = -1.0; RenderDataRD render_data; + render_data.scene_data = &scene_data; render_data.instances = &p_instances; _setup_environment(&render_data, true, Vector2(1, 1), false, Color()); @@ -1129,7 +1467,7 @@ void RenderForwardMobile::_render_uv2(const PagedArray<RenderGeometryInstance *> } void RenderForwardMobile::_render_sdfgi(Ref<RenderSceneBuffersRD> p_render_buffers, const Vector3i &p_from, const Vector3i &p_size, const AABB &p_bounds, const PagedArray<RenderGeometryInstance *> &p_instances, const RID &p_albedo_texture, const RID &p_emission_texture, const RID &p_emission_aniso_texture, const RID &p_geom_facing_texture, float p_exposure_normalization) { - // we don't do GI in low end.. + // we don't do SDFGI in low end.. } void RenderForwardMobile::_render_particle_collider_heightfield(RID p_fb, const Transform3D &p_cam_transform, const Projection &p_cam_projection, const PagedArray<RenderGeometryInstance *> &p_instances) { @@ -1138,15 +1476,18 @@ void RenderForwardMobile::_render_particle_collider_heightfield(RID p_fb, const RD::get_singleton()->draw_command_begin_label("Render Collider Heightfield"); _update_render_base_uniform_set(); - scene_state.ubo.dual_paraboloid_side = 0; - scene_state.ubo.opaque_prepass_threshold = 0.0; + + RenderSceneDataRD scene_data; + scene_data.cam_projection = p_cam_projection; + scene_data.cam_transform = p_cam_transform; + scene_data.view_projection[0] = p_cam_projection; + scene_data.z_near = 0.0; + scene_data.z_far = p_cam_projection.get_z_far(); + scene_data.dual_paraboloid_side = 0; + scene_data.opaque_prepass_threshold = 0.0; RenderDataRD render_data; - render_data.cam_projection = p_cam_projection; - render_data.cam_transform = p_cam_transform; - render_data.view_projection[0] = p_cam_projection; - render_data.z_near = 0.0; - render_data.z_far = p_cam_projection.get_z_far(); + render_data.scene_data = &scene_data; render_data.instances = &p_instances; _setup_environment(&render_data, true, Vector2(1, 1), true, Color(), false, false); @@ -1169,7 +1510,7 @@ void RenderForwardMobile::_render_particle_collider_heightfield(RID p_fb, const RD::get_singleton()->draw_command_end_label(); } -void RenderForwardMobile::_base_uniforms_changed() { +void RenderForwardMobile::base_uniforms_changed() { if (!render_base_uniform_set.is_null() && RD::get_singleton()->uniform_set_is_valid(render_base_uniform_set)) { RD::get_singleton()->free(render_base_uniform_set); } @@ -1285,14 +1626,14 @@ void RenderForwardMobile::_update_render_base_uniform_set() { RD::Uniform u; u.binding = 5; u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER; - u.append_id(get_omni_light_buffer()); + u.append_id(RendererRD::LightStorage::get_singleton()->get_omni_light_buffer()); uniforms.push_back(u); } { RD::Uniform u; u.binding = 6; u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER; - u.append_id(get_spot_light_buffer()); + u.append_id(RendererRD::LightStorage::get_singleton()->get_spot_light_buffer()); uniforms.push_back(u); } @@ -1300,14 +1641,14 @@ void RenderForwardMobile::_update_render_base_uniform_set() { RD::Uniform u; u.binding = 7; u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER; - u.append_id(get_reflection_probe_buffer()); + u.append_id(RendererRD::LightStorage::get_singleton()->get_reflection_probe_buffer()); uniforms.push_back(u); } { RD::Uniform u; u.binding = 8; u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER; - u.append_id(get_directional_light_buffer()); + u.append_id(RendererRD::LightStorage::get_singleton()->get_directional_light_buffer()); uniforms.push_back(u); } { @@ -1344,7 +1685,7 @@ void RenderForwardMobile::_update_render_base_uniform_set() { RD::Uniform u; u.binding = 13; u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER; - u.append_id(get_decal_buffer()); + u.append_id(RendererRD::TextureStorage::get_singleton()->get_decal_buffer()); uniforms.push_back(u); } @@ -1385,9 +1726,9 @@ void RenderForwardMobile::_fill_render_list(RenderListType p_render_list, const } uint32_t lightmap_captures_used = 0; - Plane near_plane(-p_render_data->cam_transform.basis.get_column(Vector3::AXIS_Z), p_render_data->cam_transform.origin); - near_plane.d += p_render_data->cam_projection.get_z_near(); - float z_max = p_render_data->cam_projection.get_z_far() - p_render_data->cam_projection.get_z_near(); + Plane near_plane(-p_render_data->scene_data->cam_transform.basis.get_column(Vector3::AXIS_Z), p_render_data->scene_data->cam_transform.origin); + near_plane.d += p_render_data->scene_data->cam_projection.get_z_near(); + float z_max = p_render_data->scene_data->cam_projection.get_z_far() - p_render_data->scene_data->cam_projection.get_z_near(); RenderList *rl = &render_list[p_render_list]; @@ -1466,13 +1807,13 @@ void RenderForwardMobile::_fill_render_list(RenderListType p_render_list, const // LOD - if (p_render_data->screen_mesh_lod_threshold > 0.0 && mesh_storage->mesh_surface_has_lod(surf->surface)) { + if (p_render_data->scene_data->screen_mesh_lod_threshold > 0.0 && mesh_storage->mesh_surface_has_lod(surf->surface)) { //lod - Vector3 lod_support_min = inst->transformed_aabb.get_support(-p_render_data->lod_camera_plane.normal); - Vector3 lod_support_max = inst->transformed_aabb.get_support(p_render_data->lod_camera_plane.normal); + Vector3 lod_support_min = inst->transformed_aabb.get_support(-p_render_data->scene_data->lod_camera_plane.normal); + Vector3 lod_support_max = inst->transformed_aabb.get_support(p_render_data->scene_data->lod_camera_plane.normal); - float distance_min = p_render_data->lod_camera_plane.distance_to(lod_support_min); - float distance_max = p_render_data->lod_camera_plane.distance_to(lod_support_max); + float distance_min = p_render_data->scene_data->lod_camera_plane.distance_to(lod_support_min); + float distance_max = p_render_data->scene_data->lod_camera_plane.distance_to(lod_support_max); float distance = 0.0; @@ -1485,12 +1826,12 @@ void RenderForwardMobile::_fill_render_list(RenderListType p_render_list, const distance = -distance_max; } - if (p_render_data->cam_orthogonal) { + if (p_render_data->scene_data->cam_orthogonal) { distance = 1.0; } uint32_t indices; - surf->lod_index = mesh_storage->mesh_surface_get_lod(surf->surface, inst->lod_model_scale * inst->lod_bias, distance * p_render_data->lod_distance_multiplier, p_render_data->screen_mesh_lod_threshold, &indices); + surf->lod_index = mesh_storage->mesh_surface_get_lod(surf->surface, inst->lod_model_scale * inst->lod_bias, distance * p_render_data->scene_data->lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, &indices); if (p_render_data->render_info) { indices = _indices_to_primitives(surf->primitive, indices); if (p_render_list == RENDER_LIST_OPAQUE) { //opaque @@ -1562,184 +1903,20 @@ void RenderForwardMobile::_fill_render_list(RenderListType p_render_list, const } void RenderForwardMobile::_setup_environment(const RenderDataRD *p_render_data, bool p_no_fog, const Size2i &p_screen_size, bool p_flip_y, const Color &p_default_bg_color, bool p_opaque_render_buffers, bool p_pancake_shadows, int p_index) { - //!BAS! need to go through this and find out what we don't need anymore - - // This populates our UBO with main scene data that is pushed into set 1 - - //Projection projection = p_render_data->cam_projection; - //projection.flip_y(); // Vulkan and modern APIs use Y-Down - Projection correction; - correction.set_depth_correction(p_flip_y); - Projection projection = correction * p_render_data->cam_projection; - - //store camera into ubo - RendererRD::MaterialStorage::store_camera(projection, scene_state.ubo.projection_matrix); - RendererRD::MaterialStorage::store_camera(projection.inverse(), scene_state.ubo.inv_projection_matrix); - RendererRD::MaterialStorage::store_transform(p_render_data->cam_transform, scene_state.ubo.inv_view_matrix); - RendererRD::MaterialStorage::store_transform(p_render_data->cam_transform.affine_inverse(), scene_state.ubo.view_matrix); - - for (uint32_t v = 0; v < p_render_data->view_count; v++) { - projection = correction * p_render_data->view_projection[v]; - RendererRD::MaterialStorage::store_camera(projection, scene_state.ubo.projection_matrix_view[v]); - RendererRD::MaterialStorage::store_camera(projection.inverse(), scene_state.ubo.inv_projection_matrix_view[v]); - - scene_state.ubo.eye_offset[v][0] = p_render_data->view_eye_offset[v].x; - scene_state.ubo.eye_offset[v][1] = p_render_data->view_eye_offset[v].y; - scene_state.ubo.eye_offset[v][2] = p_render_data->view_eye_offset[v].z; - scene_state.ubo.eye_offset[v][3] = 0.0; - } - - scene_state.ubo.z_far = p_render_data->z_far; - scene_state.ubo.z_near = p_render_data->z_near; - - scene_state.ubo.pancake_shadows = p_pancake_shadows; - - RendererRD::MaterialStorage::store_soft_shadow_kernel(directional_penumbra_shadow_kernel_get(), scene_state.ubo.directional_penumbra_shadow_kernel); - RendererRD::MaterialStorage::store_soft_shadow_kernel(directional_soft_shadow_kernel_get(), scene_state.ubo.directional_soft_shadow_kernel); - RendererRD::MaterialStorage::store_soft_shadow_kernel(penumbra_shadow_kernel_get(), scene_state.ubo.penumbra_shadow_kernel); - RendererRD::MaterialStorage::store_soft_shadow_kernel(soft_shadow_kernel_get(), scene_state.ubo.soft_shadow_kernel); - - Size2 screen_pixel_size = Vector2(1.0, 1.0) / Size2(p_screen_size); - scene_state.ubo.screen_pixel_size[0] = screen_pixel_size.x; - scene_state.ubo.screen_pixel_size[1] = screen_pixel_size.y; - - if (p_render_data->shadow_atlas.is_valid()) { - Vector2 sas = shadow_atlas_get_size(p_render_data->shadow_atlas); - scene_state.ubo.shadow_atlas_pixel_size[0] = 1.0 / sas.x; - scene_state.ubo.shadow_atlas_pixel_size[1] = 1.0 / sas.y; - } - { - Vector2 dss = directional_shadow_get_size(); - scene_state.ubo.directional_shadow_pixel_size[0] = 1.0 / dss.x; - scene_state.ubo.directional_shadow_pixel_size[1] = 1.0 / dss.y; - } - - //time global variables - scene_state.ubo.time = time; - - if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_UNSHADED) { - scene_state.ubo.use_ambient_light = true; - scene_state.ubo.ambient_light_color_energy[0] = 1; - scene_state.ubo.ambient_light_color_energy[1] = 1; - scene_state.ubo.ambient_light_color_energy[2] = 1; - scene_state.ubo.ambient_light_color_energy[3] = 1.0; - scene_state.ubo.use_ambient_cubemap = false; - scene_state.ubo.use_reflection_cubemap = false; - scene_state.ubo.ssao_enabled = false; - - } else if (is_environment(p_render_data->environment)) { - RS::EnvironmentBG env_bg = environment_get_background(p_render_data->environment); - RS::EnvironmentAmbientSource ambient_src = environment_get_ambient_source(p_render_data->environment); - - float bg_energy_multiplier = environment_get_bg_energy_multiplier(p_render_data->environment); - - scene_state.ubo.ambient_light_color_energy[3] = bg_energy_multiplier; - - scene_state.ubo.ambient_color_sky_mix = environment_get_ambient_sky_contribution(p_render_data->environment); - - //ambient - if (ambient_src == RS::ENV_AMBIENT_SOURCE_BG && (env_bg == RS::ENV_BG_CLEAR_COLOR || env_bg == RS::ENV_BG_COLOR)) { - Color color = env_bg == RS::ENV_BG_CLEAR_COLOR ? p_default_bg_color : environment_get_bg_color(p_render_data->environment); - color = color.srgb_to_linear(); - - scene_state.ubo.ambient_light_color_energy[0] = color.r * bg_energy_multiplier; - scene_state.ubo.ambient_light_color_energy[1] = color.g * bg_energy_multiplier; - scene_state.ubo.ambient_light_color_energy[2] = color.b * bg_energy_multiplier; - scene_state.ubo.use_ambient_light = true; - scene_state.ubo.use_ambient_cubemap = false; - } else { - float energy = environment_get_ambient_light_energy(p_render_data->environment); - Color color = environment_get_ambient_light(p_render_data->environment); - color = color.srgb_to_linear(); - scene_state.ubo.ambient_light_color_energy[0] = color.r * energy; - scene_state.ubo.ambient_light_color_energy[1] = color.g * energy; - scene_state.ubo.ambient_light_color_energy[2] = color.b * energy; - - Basis sky_transform = environment_get_sky_orientation(p_render_data->environment); - sky_transform = sky_transform.inverse() * p_render_data->cam_transform.basis; - RendererRD::MaterialStorage::store_transform_3x3(sky_transform, scene_state.ubo.radiance_inverse_xform); - - scene_state.ubo.use_ambient_cubemap = (ambient_src == RS::ENV_AMBIENT_SOURCE_BG && env_bg == RS::ENV_BG_SKY) || ambient_src == RS::ENV_AMBIENT_SOURCE_SKY; - scene_state.ubo.use_ambient_light = scene_state.ubo.use_ambient_cubemap || ambient_src == RS::ENV_AMBIENT_SOURCE_COLOR; - } - - //specular - RS::EnvironmentReflectionSource ref_src = environment_get_reflection_source(p_render_data->environment); - if ((ref_src == RS::ENV_REFLECTION_SOURCE_BG && env_bg == RS::ENV_BG_SKY) || ref_src == RS::ENV_REFLECTION_SOURCE_SKY) { - scene_state.ubo.use_reflection_cubemap = true; - } else { - scene_state.ubo.use_reflection_cubemap = false; - } - - scene_state.ubo.ssao_enabled = p_opaque_render_buffers && environment_get_ssao_enabled(p_render_data->environment); - scene_state.ubo.ssao_ao_affect = environment_get_ssao_ao_channel_affect(p_render_data->environment); - scene_state.ubo.ssao_light_affect = environment_get_ssao_direct_light_affect(p_render_data->environment); - - scene_state.ubo.fog_enabled = environment_get_fog_enabled(p_render_data->environment); - scene_state.ubo.fog_density = environment_get_fog_density(p_render_data->environment); - scene_state.ubo.fog_height = environment_get_fog_height(p_render_data->environment); - scene_state.ubo.fog_height_density = environment_get_fog_height_density(p_render_data->environment); - scene_state.ubo.fog_aerial_perspective = environment_get_fog_aerial_perspective(p_render_data->environment); - - Color fog_color = environment_get_fog_light_color(p_render_data->environment).srgb_to_linear(); - float fog_energy = environment_get_fog_light_energy(p_render_data->environment); - - scene_state.ubo.fog_light_color[0] = fog_color.r * fog_energy; - scene_state.ubo.fog_light_color[1] = fog_color.g * fog_energy; - scene_state.ubo.fog_light_color[2] = fog_color.b * fog_energy; - - scene_state.ubo.fog_sun_scatter = environment_get_fog_sun_scatter(p_render_data->environment); - - } else { - if (p_render_data->reflection_probe.is_valid() && RendererRD::LightStorage::get_singleton()->reflection_probe_is_interior(reflection_probe_instance_get_probe(p_render_data->reflection_probe))) { - scene_state.ubo.use_ambient_light = false; - } else { - scene_state.ubo.use_ambient_light = true; - Color clear_color = p_default_bg_color; - clear_color = clear_color.srgb_to_linear(); - scene_state.ubo.ambient_light_color_energy[0] = clear_color.r; - scene_state.ubo.ambient_light_color_energy[1] = clear_color.g; - scene_state.ubo.ambient_light_color_energy[2] = clear_color.b; - scene_state.ubo.ambient_light_color_energy[3] = 1.0; - } - - scene_state.ubo.use_ambient_cubemap = false; - scene_state.ubo.use_reflection_cubemap = false; - scene_state.ubo.ssao_enabled = false; - } - - if (p_render_data->camera_attributes.is_valid()) { - scene_state.ubo.emissive_exposure_normalization = RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor(p_render_data->camera_attributes); - scene_state.ubo.IBL_exposure_normalization = 1.0; - if (is_environment(p_render_data->environment)) { - RID sky_rid = environment_get_sky(p_render_data->environment); - if (sky_rid.is_valid()) { - float current_exposure = RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor(p_render_data->camera_attributes) * environment_get_bg_intensity(p_render_data->environment) / _render_buffers_get_luminance_multiplier(); - scene_state.ubo.IBL_exposure_normalization = current_exposure / MAX(0.001, sky.sky_get_baked_exposure(sky_rid)); - } - } - } else if (scene_state.ubo.emissive_exposure_normalization > 0.0) { - // This branch is triggered when using render_material(). - // Emissive is set outside the function, so don't set it. - // IBL isn't used don't set it. - } else { - scene_state.ubo.emissive_exposure_normalization = 1.0; - scene_state.ubo.IBL_exposure_normalization = 1.0; - } - - scene_state.ubo.roughness_limiter_enabled = p_opaque_render_buffers && screen_space_roughness_limiter_is_active(); - scene_state.ubo.roughness_limiter_amount = screen_space_roughness_limiter_get_amount(); - scene_state.ubo.roughness_limiter_limit = screen_space_roughness_limiter_get_limit(); + Ref<RenderSceneBuffersRD> rd = p_render_data->render_buffers; + RID env = is_environment(p_render_data->environment) ? p_render_data->environment : RID(); + RID reflection_probe_instance = p_render_data->reflection_probe.is_valid() ? RendererRD::LightStorage::get_singleton()->reflection_probe_instance_get_probe(p_render_data->reflection_probe) : RID(); + // May do this earlier in RenderSceneRenderRD::render_scene if (p_index >= (int)scene_state.uniform_buffers.size()) { uint32_t from = scene_state.uniform_buffers.size(); scene_state.uniform_buffers.resize(p_index + 1); - render_pass_uniform_sets.resize(p_index + 1); for (uint32_t i = from; i < scene_state.uniform_buffers.size(); i++) { - scene_state.uniform_buffers[i] = RD::get_singleton()->uniform_buffer_create(sizeof(SceneState::UBO)); + scene_state.uniform_buffers[i] = p_render_data->scene_data->create_uniform_buffer(); } } - RD::get_singleton()->buffer_update(scene_state.uniform_buffers[p_index], 0, sizeof(SceneState::UBO), &scene_state.ubo, RD::BARRIER_MASK_RASTER); + + p_render_data->scene_data->update_ubo(scene_state.uniform_buffers[p_index], get_debug_draw_mode(), env, reflection_probe_instance, p_render_data->camera_attributes, p_flip_y, p_pancake_shadows, p_screen_size, p_default_bg_color, _render_buffers_get_luminance_multiplier(), p_opaque_render_buffers); } void RenderForwardMobile::_fill_element_info(RenderListType p_render_list, uint32_t p_offset, int32_t p_max_elements) { @@ -1809,57 +1986,6 @@ void RenderForwardMobile::_render_list_with_threads(RenderListParameters *p_para } } -void RenderForwardMobile::_fill_push_constant_instance_indices(GeometryInstanceForwardMobile::PushConstant *p_push_constant, uint32_t &spec_constants, const GeometryInstanceForwardMobile *p_instance) { - // first zero out our indices - - p_push_constant->omni_lights[0] = 0xFFFF; - p_push_constant->omni_lights[1] = 0xFFFF; - - p_push_constant->spot_lights[0] = 0xFFFF; - p_push_constant->spot_lights[1] = 0xFFFF; - - p_push_constant->decals[0] = 0xFFFF; - p_push_constant->decals[1] = 0xFFFF; - - p_push_constant->reflection_probes[0] = 0xFFFF; - p_push_constant->reflection_probes[1] = 0xFFFF; - - if (p_instance->omni_light_count == 0) { - spec_constants |= 1 << SPEC_CONSTANT_DISABLE_OMNI_LIGHTS; - } - if (p_instance->spot_light_count == 0) { - spec_constants |= 1 << SPEC_CONSTANT_DISABLE_SPOT_LIGHTS; - } - if (p_instance->reflection_probe_count == 0) { - spec_constants |= 1 << SPEC_CONSTANT_DISABLE_REFLECTION_PROBES; - } - if (p_instance->decals_count == 0) { - spec_constants |= 1 << SPEC_CONSTANT_DISABLE_DECALS; - } - - for (uint32_t i = 0; i < MAX_RDL_CULL; i++) { - uint32_t ofs = i < 4 ? 0 : 1; - uint32_t shift = (i & 0x3) << 3; - uint32_t mask = ~(0xFF << shift); - if (i < p_instance->omni_light_count) { - p_push_constant->omni_lights[ofs] &= mask; - p_push_constant->omni_lights[ofs] |= uint32_t(forward_id_allocators[FORWARD_ID_TYPE_OMNI_LIGHT].map[p_instance->omni_lights[i]]) << shift; - } - if (i < p_instance->spot_light_count) { - p_push_constant->spot_lights[ofs] &= mask; - p_push_constant->spot_lights[ofs] |= uint32_t(forward_id_allocators[FORWARD_ID_TYPE_SPOT_LIGHT].map[p_instance->spot_lights[i]]) << shift; - } - if (i < p_instance->decals_count) { - p_push_constant->decals[ofs] &= mask; - p_push_constant->decals[ofs] |= uint32_t(forward_id_allocators[FORWARD_ID_TYPE_DECAL].map[p_instance->decals[i]]) << shift; - } - if (i < p_instance->reflection_probe_count) { - p_push_constant->reflection_probes[ofs] &= mask; - p_push_constant->reflection_probes[ofs] |= uint32_t(forward_id_allocators[FORWARD_ID_TYPE_REFLECTION_PROBE].map[p_instance->reflection_probes[i]]) << shift; - } - } -} - template <RenderForwardMobile::PassMode p_pass_mode> void RenderForwardMobile::_render_list_template(RenderingDevice::DrawListID p_draw_list, RenderingDevice::FramebufferFormatID p_framebuffer_Format, RenderListParameters *p_params, uint32_t p_from_element, uint32_t p_to_element) { RendererRD::MeshStorage *mesh_storage = RendererRD::MeshStorage::get_singleton(); @@ -1901,6 +2027,14 @@ void RenderForwardMobile::_render_list_template(RenderingDevice::DrawListID p_dr RendererRD::MaterialStorage::store_transform(Transform3D(), push_constant.transform); } +#ifdef REAL_T_IS_DOUBLE + // Split the origin into two components, the float approximation and the missing precision + // In the shader we will combine these back together to restore the lost precision. + RendererRD::MaterialStorage::split_double(inst->transform.origin.x, &push_constant.transform[12], &push_constant.transform[3]); + RendererRD::MaterialStorage::split_double(inst->transform.origin.y, &push_constant.transform[13], &push_constant.transform[7]); + RendererRD::MaterialStorage::split_double(inst->transform.origin.z, &push_constant.transform[14], &push_constant.transform[11]); +#endif + push_constant.flags = inst->flags_cache; push_constant.gi_offset = inst->gi_offset_cache; push_constant.layer_mask = inst->layer_mask; @@ -1933,7 +2067,7 @@ void RenderForwardMobile::_render_list_template(RenderingDevice::DrawListID p_dr if (inst->use_soft_shadow) { base_spec_constants |= 1 << SPEC_CONSTANT_USING_SOFT_SHADOWS; } - _fill_push_constant_instance_indices(&push_constant, base_spec_constants, inst); + forward_id_storage_mobile->fill_push_constant_instance_indices(&push_constant, base_spec_constants, inst); #ifdef DEBUG_ENABLED if (unlikely(get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_LIGHTING)) { @@ -2125,17 +2259,17 @@ void RenderForwardMobile::GeometryInstanceForwardMobile::pair_light_instances(co spot_light_count = 0; for (uint32_t i = 0; i < p_light_instance_count; i++) { - RS::LightType type = RenderForwardMobile::get_singleton()->light_instance_get_type(p_light_instances[i]); + RS::LightType type = RendererRD::LightStorage::get_singleton()->light_instance_get_type(p_light_instances[i]); switch (type) { case RS::LIGHT_OMNI: { if (omni_light_count < (uint32_t)MAX_RDL_CULL) { - omni_lights[omni_light_count] = RenderForwardMobile::get_singleton()->light_instance_get_forward_id(p_light_instances[i]); + omni_lights[omni_light_count] = RendererRD::LightStorage::get_singleton()->light_instance_get_forward_id(p_light_instances[i]); omni_light_count++; } } break; case RS::LIGHT_SPOT: { if (spot_light_count < (uint32_t)MAX_RDL_CULL) { - spot_lights[spot_light_count] = RenderForwardMobile::get_singleton()->light_instance_get_forward_id(p_light_instances[i]); + spot_lights[spot_light_count] = RendererRD::LightStorage::get_singleton()->light_instance_get_forward_id(p_light_instances[i]); spot_light_count++; } } break; @@ -2148,14 +2282,14 @@ void RenderForwardMobile::GeometryInstanceForwardMobile::pair_light_instances(co void RenderForwardMobile::GeometryInstanceForwardMobile::pair_reflection_probe_instances(const RID *p_reflection_probe_instances, uint32_t p_reflection_probe_instance_count) { reflection_probe_count = p_reflection_probe_instance_count < (uint32_t)MAX_RDL_CULL ? p_reflection_probe_instance_count : (uint32_t)MAX_RDL_CULL; for (uint32_t i = 0; i < reflection_probe_count; i++) { - reflection_probes[i] = RenderForwardMobile::get_singleton()->reflection_probe_instance_get_forward_id(p_reflection_probe_instances[i]); + reflection_probes[i] = RendererRD::LightStorage::get_singleton()->reflection_probe_instance_get_forward_id(p_reflection_probe_instances[i]); } } void RenderForwardMobile::GeometryInstanceForwardMobile::pair_decal_instances(const RID *p_decal_instances, uint32_t p_decal_instance_count) { decals_count = p_decal_instance_count < (uint32_t)MAX_RDL_CULL ? p_decal_instance_count : (uint32_t)MAX_RDL_CULL; for (uint32_t i = 0; i < decals_count; i++) { - decals[i] = RenderForwardMobile::get_singleton()->decal_instance_get_forward_id(p_decal_instances[i]); + decals[i] = RendererRD::TextureStorage::get_singleton()->decal_instance_get_forward_id(p_decal_instances[i]); } } @@ -2523,10 +2657,6 @@ bool RenderForwardMobile::is_dynamic_gi_supported() const { return false; } -bool RenderForwardMobile::is_clustered_enabled() const { - return false; -} - bool RenderForwardMobile::is_volumetric_supported() const { return false; } @@ -2582,7 +2712,7 @@ void RenderForwardMobile::_update_shader_quality_settings() { scene_shader.set_default_specialization_constants(spec_constants); - _base_uniforms_changed(); //also need this + base_uniforms_changed(); //also need this } RenderForwardMobile::RenderForwardMobile() { @@ -2616,6 +2746,11 @@ RenderForwardMobile::RenderForwardMobile() { { defines += "\n#define MATERIAL_UNIFORM_SET " + itos(MATERIAL_UNIFORM_SET) + "\n"; } +#ifdef REAL_T_IS_DOUBLE + { + defines += "\n#define USE_DOUBLE_PRECISION \n"; + } +#endif scene_shader.init(defines); @@ -2626,7 +2761,7 @@ RenderForwardMobile::RenderForwardMobile() { } RenderForwardMobile::~RenderForwardMobile() { - directional_shadow_atlas_set_size(0); + RSG::light_storage->directional_shadow_atlas_set_size(0); //clear base uniform set if still valid for (uint32_t i = 0; i < render_pass_uniform_sets.size(); i++) { diff --git a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h index da1cd85fb3..415bd79ad6 100644 --- a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h +++ b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h @@ -44,19 +44,12 @@ namespace RendererSceneRenderImplementation { class RenderForwardMobile : public RendererSceneRenderRD { friend SceneShaderForwardMobile; - struct ForwardIDAllocator { - LocalVector<bool> allocations; - LocalVector<uint8_t> map; - }; - - ForwardIDAllocator forward_id_allocators[FORWARD_ID_MAX]; +protected: + struct GeometryInstanceSurfaceDataCache; - virtual ForwardID _allocate_forward_id(ForwardIDType p_type) override; - virtual void _free_forward_id(ForwardIDType p_type, ForwardID p_id) override; - virtual void _map_forward_id(ForwardIDType p_type, ForwardID p_id, uint32_t p_index) override; - virtual bool _uses_forward_ids() const override { return true; } +private: + static RenderForwardMobile *singleton; -protected: /* Scene Shader */ enum { @@ -157,8 +150,6 @@ protected: // PASS_MODE_SDF, }; - class GeometryInstanceForwardMobile; - struct GeometryInstanceSurfaceDataCache; struct RenderElementInfo; struct RenderListParameters { @@ -201,36 +192,27 @@ protected: } }; - virtual float _render_buffers_get_luminance_multiplier() override; - virtual RD::DataFormat _render_buffers_get_color_format() override; - virtual bool _render_buffers_can_be_storage() override; + /* Render shadows */ - RID _setup_render_pass_uniform_set(RenderListType p_render_list, const RenderDataRD *p_render_data, RID p_radiance_texture, bool p_use_directional_shadow_atlas = false, int p_index = 0); - virtual void _render_scene(RenderDataRD *p_render_data, const Color &p_default_bg_color) override; + void _render_shadow_pass(RID p_light, RID p_shadow_atlas, int p_pass, const PagedArray<RenderGeometryInstance *> &p_instances, const Plane &p_camera_plane = Plane(), float p_lod_distance_multiplier = 0, float p_screen_mesh_lod_threshold = 0.0, bool p_open_pass = true, bool p_close_pass = true, bool p_clear_region = true, RenderingMethod::RenderInfo *p_render_info = nullptr); + void _render_shadow_begin(); + void _render_shadow_append(RID p_framebuffer, const PagedArray<RenderGeometryInstance *> &p_instances, const Projection &p_projection, const Transform3D &p_transform, float p_zfar, float p_bias, float p_normal_bias, bool p_use_dp, bool p_use_dp_flip, bool p_use_pancake, const Plane &p_camera_plane = Plane(), float p_lod_distance_multiplier = 0.0, float p_screen_mesh_lod_threshold = 0.0, const Rect2i &p_rect = Rect2i(), bool p_flip_y = false, bool p_clear_region = true, bool p_begin = true, bool p_end = true, RenderingMethod::RenderInfo *p_render_info = nullptr); + void _render_shadow_process(); + void _render_shadow_end(uint32_t p_barrier = RD::BARRIER_MASK_ALL); - virtual void _render_shadow_begin() override; - virtual void _render_shadow_append(RID p_framebuffer, const PagedArray<RenderGeometryInstance *> &p_instances, const Projection &p_projection, const Transform3D &p_transform, float p_zfar, float p_bias, float p_normal_bias, bool p_use_dp, bool p_use_dp_flip, bool p_use_pancake, const Plane &p_camera_plane = Plane(), float p_lod_distance_multiplier = 0.0, float p_screen_mesh_lod_threshold = 0.0, const Rect2i &p_rect = Rect2i(), bool p_flip_y = false, bool p_clear_region = true, bool p_begin = true, bool p_end = true, RendererScene::RenderInfo *p_render_info = nullptr) override; - virtual void _render_shadow_process() override; - virtual void _render_shadow_end(uint32_t p_barrier = RD::BARRIER_MASK_ALL) override; + /* Render Scene */ - virtual void _render_material(const Transform3D &p_cam_transform, const Projection &p_cam_projection, bool p_cam_orthogonal, const PagedArray<RenderGeometryInstance *> &p_instances, RID p_framebuffer, const Rect2i &p_region, float p_exposure_normalization) override; - virtual void _render_uv2(const PagedArray<RenderGeometryInstance *> &p_instances, RID p_framebuffer, const Rect2i &p_region) override; - virtual void _render_sdfgi(Ref<RenderSceneBuffersRD> p_render_buffers, const Vector3i &p_from, const Vector3i &p_size, const AABB &p_bounds, const PagedArray<RenderGeometryInstance *> &p_instances, const RID &p_albedo_texture, const RID &p_emission_texture, const RID &p_emission_aniso_texture, const RID &p_geom_facing_texture, float p_exposure_normalization) override; - virtual void _render_particle_collider_heightfield(RID p_fb, const Transform3D &p_cam_transform, const Projection &p_cam_projection, const PagedArray<RenderGeometryInstance *> &p_instances) override; + RID _setup_render_pass_uniform_set(RenderListType p_render_list, const RenderDataRD *p_render_data, RID p_radiance_texture, bool p_use_directional_shadow_atlas = false, int p_index = 0); + void _pre_opaque_render(RenderDataRD *p_render_data); uint64_t lightmap_texture_array_version = 0xFFFFFFFF; - virtual void _base_uniforms_changed() override; void _update_render_base_uniform_set(); - virtual RID _render_buffers_get_normal_texture(Ref<RenderSceneBuffersRD> p_render_buffers) override; - virtual RID _render_buffers_get_velocity_texture(Ref<RenderSceneBuffersRD> p_render_buffers) override; void _fill_render_list(RenderListType p_render_list, const RenderDataRD *p_render_data, PassMode p_pass_mode, bool p_append = false); void _fill_element_info(RenderListType p_render_list, uint32_t p_offset = 0, int32_t p_max_elements = -1); // void _update_instance_data_buffer(RenderListType p_render_list); - static RenderForwardMobile *singleton; - void _setup_environment(const RenderDataRD *p_render_data, bool p_no_fog, const Size2i &p_screen_size, bool p_flip_y, const Color &p_default_bg_color, bool p_opaque_render_buffers = false, bool p_pancake_shadows = false, int p_index = 0); void _setup_lightmaps(const RenderDataRD *p_render_data, const PagedArray<RID> &p_lightmaps, const Transform3D &p_cam_transform); @@ -252,75 +234,6 @@ protected: /* Scene state */ struct SceneState { - // This struct is loaded into Set 1 - Binding 0, populated at start of rendering a frame, must match with shader code - struct UBO { - float projection_matrix[16]; - float inv_projection_matrix[16]; - float inv_view_matrix[16]; - float view_matrix[16]; - - float projection_matrix_view[RendererSceneRender::MAX_RENDER_VIEWS][16]; - float inv_projection_matrix_view[RendererSceneRender::MAX_RENDER_VIEWS][16]; - float eye_offset[RendererSceneRender::MAX_RENDER_VIEWS][4]; - - float viewport_size[2]; - float screen_pixel_size[2]; - - float directional_penumbra_shadow_kernel[128]; //32 vec4s - float directional_soft_shadow_kernel[128]; - float penumbra_shadow_kernel[128]; - float soft_shadow_kernel[128]; - - float ambient_light_color_energy[4]; - - float ambient_color_sky_mix; - uint32_t use_ambient_light; - uint32_t use_ambient_cubemap; - uint32_t use_reflection_cubemap; - - float radiance_inverse_xform[12]; - - float shadow_atlas_pixel_size[2]; - float directional_shadow_pixel_size[2]; - - uint32_t directional_light_count; - float dual_paraboloid_side; - float z_far; - float z_near; - - uint32_t ssao_enabled; - float ssao_light_affect; - float ssao_ao_affect; - uint32_t roughness_limiter_enabled; - - float roughness_limiter_amount; - float roughness_limiter_limit; - float opaque_prepass_threshold; - uint32_t roughness_limiter_pad; - - // Fog - uint32_t fog_enabled; - float fog_density; - float fog_height; - float fog_height_density; - - float fog_light_color[3]; - float fog_sun_scatter; - - float fog_aerial_perspective; - uint32_t material_uv2_mode; - - float time; - float reflection_multiplier; - - uint32_t pancake_shadows; - float emissive_exposure_normalization; // Needed to normalize emissive when using physical units. - float IBL_exposure_normalization; // Adjusts for baked exposure. - uint32_t pad3; - }; - - UBO ubo; - LocalVector<RID> uniform_buffers; // !BAS! We need to change lightmaps, we're not going to do this with a buffer but pushing the used lightmap in @@ -438,17 +351,38 @@ protected: RenderList render_list[RENDER_LIST_MAX]; +protected: + /* setup */ + virtual void _update_shader_quality_settings() override; + + virtual float _render_buffers_get_luminance_multiplier() override; + virtual RD::DataFormat _render_buffers_get_color_format() override; + virtual bool _render_buffers_can_be_storage() override; + + virtual RID _render_buffers_get_normal_texture(Ref<RenderSceneBuffersRD> p_render_buffers) override; + virtual RID _render_buffers_get_velocity_texture(Ref<RenderSceneBuffersRD> p_render_buffers) override; + + virtual void environment_set_ssao_quality(RS::EnvironmentSSAOQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) override{}; + virtual void environment_set_ssil_quality(RS::EnvironmentSSILQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) override{}; + virtual void environment_set_ssr_roughness_quality(RS::EnvironmentSSRRoughnessQuality p_quality) override{}; + + virtual void sub_surface_scattering_set_quality(RS::SubSurfaceScatteringQuality p_quality) override{}; + virtual void sub_surface_scattering_set_scale(float p_scale, float p_depth_scale) override{}; + /* Geometry instance */ - // check which ones of these apply, probably all except GI and SDFGI + class GeometryInstanceForwardMobile; + + // When changing any of these enums, remember to change the corresponding enums in the shader files as well. enum { - INSTANCE_DATA_FLAGS_NON_UNIFORM_SCALE = 1 << 5, - INSTANCE_DATA_FLAG_USE_GI_BUFFERS = 1 << 6, - INSTANCE_DATA_FLAG_USE_SDFGI = 1 << 7, - INSTANCE_DATA_FLAG_USE_LIGHTMAP_CAPTURE = 1 << 8, - INSTANCE_DATA_FLAG_USE_LIGHTMAP = 1 << 9, - INSTANCE_DATA_FLAG_USE_SH_LIGHTMAP = 1 << 10, - INSTANCE_DATA_FLAG_USE_VOXEL_GI = 1 << 11, + INSTANCE_DATA_FLAGS_NON_UNIFORM_SCALE = 1 << 4, + INSTANCE_DATA_FLAG_USE_GI_BUFFERS = 1 << 5, + INSTANCE_DATA_FLAG_USE_SDFGI = 1 << 6, + INSTANCE_DATA_FLAG_USE_LIGHTMAP_CAPTURE = 1 << 7, + INSTANCE_DATA_FLAG_USE_LIGHTMAP = 1 << 8, + INSTANCE_DATA_FLAG_USE_SH_LIGHTMAP = 1 << 9, + INSTANCE_DATA_FLAG_USE_VOXEL_GI = 1 << 10, + INSTANCE_DATA_FLAG_PARTICLES = 1 << 11, INSTANCE_DATA_FLAG_MULTIMESH = 1 << 12, INSTANCE_DATA_FLAG_MULTIMESH_FORMAT_2D = 1 << 13, INSTANCE_DATA_FLAG_MULTIMESH_HAS_COLOR = 1 << 14, @@ -552,13 +486,13 @@ protected: // culled light info uint32_t reflection_probe_count = 0; - ForwardID reflection_probes[MAX_RDL_CULL]; + RendererRD::ForwardID reflection_probes[MAX_RDL_CULL]; uint32_t omni_light_count = 0; - ForwardID omni_lights[MAX_RDL_CULL]; + RendererRD::ForwardID omni_lights[MAX_RDL_CULL]; uint32_t spot_light_count = 0; - ForwardID spot_lights[MAX_RDL_CULL]; + RendererRD::ForwardID spot_lights[MAX_RDL_CULL]; uint32_t decals_count = 0; - ForwardID decals[MAX_RDL_CULL]; + RendererRD::ForwardID decals[MAX_RDL_CULL]; GeometryInstanceSurfaceDataCache *surface_caches = nullptr; @@ -581,9 +515,41 @@ protected: virtual void set_softshadow_projector_pairing(bool p_softshadow, bool p_projector) override; }; - _FORCE_INLINE_ void _fill_push_constant_instance_indices(GeometryInstanceForwardMobile::PushConstant *p_push_constant, uint32_t &spec_constants, const GeometryInstanceForwardMobile *p_instance); + /* Rendering */ + + virtual void _render_scene(RenderDataRD *p_render_data, const Color &p_default_bg_color) override; + + virtual void _render_material(const Transform3D &p_cam_transform, const Projection &p_cam_projection, bool p_cam_orthogonal, const PagedArray<RenderGeometryInstance *> &p_instances, RID p_framebuffer, const Rect2i &p_region, float p_exposure_normalization) override; + virtual void _render_uv2(const PagedArray<RenderGeometryInstance *> &p_instances, RID p_framebuffer, const Rect2i &p_region) override; + virtual void _render_sdfgi(Ref<RenderSceneBuffersRD> p_render_buffers, const Vector3i &p_from, const Vector3i &p_size, const AABB &p_bounds, const PagedArray<RenderGeometryInstance *> &p_instances, const RID &p_albedo_texture, const RID &p_emission_texture, const RID &p_emission_aniso_texture, const RID &p_geom_facing_texture, float p_exposure_normalization) override; + virtual void _render_particle_collider_heightfield(RID p_fb, const Transform3D &p_cam_transform, const Projection &p_cam_projection, const PagedArray<RenderGeometryInstance *> &p_instances) override; + + /* Forward ID */ + + class ForwardIDStorageMobile : public RendererRD::ForwardIDStorage { + public: + struct ForwardIDAllocator { + LocalVector<bool> allocations; + LocalVector<uint8_t> map; + }; + + ForwardIDAllocator forward_id_allocators[RendererRD::FORWARD_ID_MAX]; + + public: + virtual RendererRD::ForwardID allocate_forward_id(RendererRD::ForwardIDType p_type) override; + virtual void free_forward_id(RendererRD::ForwardIDType p_type, RendererRD::ForwardID p_id) override; + virtual void map_forward_id(RendererRD::ForwardIDType p_type, RendererRD::ForwardID p_id, uint32_t p_index) override; + virtual bool uses_forward_ids() const override { return true; } + + void fill_push_constant_instance_indices(GeometryInstanceForwardMobile::PushConstant *p_push_constant, uint32_t &spec_constants, const GeometryInstanceForwardMobile *p_instance); + }; + + ForwardIDStorageMobile *forward_id_storage_mobile = nullptr; - void _update_shader_quality_settings() override; + virtual RendererRD::ForwardIDStorage *create_forward_id_storage() override { + forward_id_storage_mobile = memnew(ForwardIDStorageMobile); + return forward_id_storage_mobile; + } public: static RenderForwardMobile *get_singleton() { return singleton; } @@ -612,8 +578,9 @@ public: virtual bool free(RID p_rid) override; + virtual void base_uniforms_changed() override; + virtual bool is_dynamic_gi_supported() const override; - virtual bool is_clustered_enabled() const override; virtual bool is_volumetric_supported() const override; virtual uint32_t get_max_elements() const override; diff --git a/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp b/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp index 383ed9247d..691d431b82 100644 --- a/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp +++ b/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp @@ -521,10 +521,10 @@ void SceneShaderForwardMobile::init(const String p_defines) { //shader compiler ShaderCompiler::DefaultIdentifierActions actions; - actions.renames["MODEL_MATRIX"] = "model_matrix"; + actions.renames["MODEL_MATRIX"] = "read_model_matrix"; actions.renames["MODEL_NORMAL_MATRIX"] = "model_normal_matrix"; actions.renames["VIEW_MATRIX"] = "scene_data.view_matrix"; - actions.renames["INV_VIEW_MATRIX"] = "scene_data.inv_view_matrix"; + actions.renames["INV_VIEW_MATRIX"] = "inv_view_matrix"; actions.renames["PROJECTION_MATRIX"] = "projection_matrix"; actions.renames["INV_PROJECTION_MATRIX"] = "inv_projection_matrix"; actions.renames["MODELVIEW_MATRIX"] = "modelview"; @@ -657,6 +657,8 @@ void SceneShaderForwardMobile::init(const String p_defines) { actions.usage_defines["RADIANCE"] = "#define CUSTOM_RADIANCE_USED\n"; actions.usage_defines["IRRADIANCE"] = "#define CUSTOM_IRRADIANCE_USED\n"; + actions.usage_defines["MODEL_MATRIX"] = "#define MODEL_MATRIX_USED\n"; + actions.render_mode_defines["skip_vertex_transform"] = "#define SKIP_TRANSFORM_USED\n"; actions.render_mode_defines["world_vertex_coords"] = "#define VERTEX_WORLD_COORDS_USED\n"; actions.render_mode_defines["ensure_correct_normals"] = "#define ENSURE_CORRECT_NORMALS\n"; diff --git a/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.h b/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.h index 21270d7c62..f67665a02f 100644 --- a/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.h +++ b/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.h @@ -32,7 +32,7 @@ #define SCENE_SHADER_FORWARD_MOBILE_H #include "servers/rendering/renderer_rd/renderer_scene_render_rd.h" -#include "servers/rendering/renderer_rd/shaders/scene_forward_mobile.glsl.gen.h" +#include "servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile.glsl.gen.h" namespace RendererSceneRenderImplementation { diff --git a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp index ab3e3ebe51..bbb53f7b97 100644 --- a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp @@ -1362,9 +1362,12 @@ void RendererCanvasRenderRD::canvas_render_items(RID p_to_render_target, Item *p default_repeat = p_default_repeat; } - //fill the list until rendering is possible. - bool material_screen_texture_found = false; Item *ci = p_item_list; + + //fill the list until rendering is possible. + bool material_screen_texture_cached = false; + bool material_screen_texture_mipmaps_cached = false; + Rect2 back_buffer_rect; bool backbuffer_copy = false; bool backbuffer_gen_mipmaps = false; @@ -1393,10 +1396,12 @@ void RendererCanvasRenderRD::canvas_render_items(RID p_to_render_target, Item *p CanvasMaterialData *md = static_cast<CanvasMaterialData *>(material_storage->material_get_data(material, RendererRD::MaterialStorage::SHADER_TYPE_2D)); if (md && md->shader_data->valid) { if (md->shader_data->uses_screen_texture && canvas_group_owner == nullptr) { - if (!material_screen_texture_found) { + if (!material_screen_texture_cached) { backbuffer_copy = true; back_buffer_rect = Rect2(); backbuffer_gen_mipmaps = md->shader_data->uses_screen_texture_mipmaps; + } else if (!material_screen_texture_mipmaps_cached) { + backbuffer_gen_mipmaps = md->shader_data->uses_screen_texture_mipmaps; } } @@ -1486,7 +1491,15 @@ void RendererCanvasRenderRD::canvas_render_items(RID p_to_render_target, Item *p backbuffer_copy = false; backbuffer_gen_mipmaps = false; - material_screen_texture_found = true; //after a backbuffer copy, screen texture makes no further copies + material_screen_texture_cached = true; // After a backbuffer copy, screen texture makes no further copies. + material_screen_texture_mipmaps_cached = backbuffer_gen_mipmaps; + } + + if (backbuffer_gen_mipmaps) { + texture_storage->render_target_gen_back_buffer_mipmaps(p_to_render_target, back_buffer_rect); + + backbuffer_gen_mipmaps = false; + material_screen_texture_mipmaps_cached = true; } items[item_count++] = ci; @@ -2499,6 +2512,8 @@ RendererCanvasRenderRD::RendererCanvasRenderRD() { actions.renames["VERTEX_ID"] = "gl_VertexIndex"; actions.renames["LIGHT_POSITION"] = "light_position"; + actions.renames["LIGHT_DIRECTION"] = "light_direction"; + actions.renames["LIGHT_IS_DIRECTIONAL"] = "is_directional"; actions.renames["LIGHT_COLOR"] = "light_color"; actions.renames["LIGHT_ENERGY"] = "light_energy"; actions.renames["LIGHT"] = "light"; diff --git a/servers/rendering/renderer_rd/renderer_compositor_rd.cpp b/servers/rendering/renderer_rd/renderer_compositor_rd.cpp index e7abcf5674..a50742f91a 100644 --- a/servers/rendering/renderer_rd/renderer_compositor_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_compositor_rd.cpp @@ -170,6 +170,10 @@ void RendererCompositorRD::finalize() { } void RendererCompositorRD::set_boot_image(const Ref<Image> &p_image, const Color &p_color, bool p_scale, bool p_use_filter) { + if (p_image.is_null() || p_image->is_empty()) { + return; + } + RD::get_singleton()->prepare_screen_for_drawing(); RID texture = texture_storage->texture_allocate(); @@ -299,14 +303,19 @@ RendererCompositorRD::RendererCompositorRD() { fog = memnew(RendererRD::Fog); canvas = memnew(RendererCanvasRenderRD()); - back_end = (bool)(int)GLOBAL_GET("rendering/vulkan/rendering/back_end"); + String rendering_method = GLOBAL_GET("rendering/renderer/rendering_method"); uint64_t textures_per_stage = RD::get_singleton()->limit_get(RD::LIMIT_MAX_TEXTURES_PER_SHADER_STAGE); - if (back_end || textures_per_stage < 48) { + if (rendering_method == "mobile" || textures_per_stage < 48) { scene = memnew(RendererSceneRenderImplementation::RenderForwardMobile()); - } else { // back_end == false + if (rendering_method == "forward_plus") { + WARN_PRINT_ONCE("Platform supports less than 48 textures per stage which is less than required by the Clustered renderer. Defaulting to Mobile renderer."); + } + } else if (rendering_method == "forward_plus") { // default to our high end renderer scene = memnew(RendererSceneRenderImplementation::RenderForwardClustered()); + } else { + ERR_FAIL_MSG("Cannot instantiate RenderingDevice-based renderer with renderer type " + rendering_method); } scene->init(); diff --git a/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp b/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp index 78c83d1fb4..acc964b3f3 100644 --- a/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp @@ -195,32 +195,6 @@ void RendererSceneRenderRD::environment_set_sdfgi_frames_to_update_light(RS::Env gi.sdfgi_frames_to_update_light = p_update; } -void RendererSceneRenderRD::environment_set_ssr_roughness_quality(RS::EnvironmentSSRRoughnessQuality p_quality) { - ssr_roughness_quality = p_quality; -} - -RS::EnvironmentSSRRoughnessQuality RendererSceneRenderRD::environment_get_ssr_roughness_quality() const { - return ssr_roughness_quality; -} - -void RendererSceneRenderRD::environment_set_ssao_quality(RS::EnvironmentSSAOQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) { - ssao_quality = p_quality; - ssao_half_size = p_half_size; - ssao_adaptive_target = p_adaptive_target; - ssao_blur_passes = p_blur_passes; - ssao_fadeout_from = p_fadeout_from; - ssao_fadeout_to = p_fadeout_to; -} - -void RendererSceneRenderRD::environment_set_ssil_quality(RS::EnvironmentSSILQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) { - ssil_quality = p_quality; - ssil_half_size = p_half_size; - ssil_adaptive_target = p_adaptive_target; - ssil_blur_passes = p_blur_passes; - ssil_fadeout_from = p_fadeout_from; - ssil_fadeout_to = p_fadeout_to; -} - Ref<Image> RendererSceneRenderRD::environment_bake_panorama(RID p_env, bool p_bake_irradiance, const Size2i &p_size) { ERR_FAIL_COND_V(p_env.is_null(), Ref<Image>()); @@ -282,261 +256,9 @@ Ref<Image> RendererSceneRenderRD::environment_bake_panorama(RID p_env, bool p_ba panorama->fill(panorama_color); return panorama; } - - return Ref<Image>(); -} - -//////////////////////////////////////////////////////////// - -RID RendererSceneRenderRD::fog_volume_instance_create(RID p_fog_volume) { - return RendererRD::Fog::get_singleton()->fog_volume_instance_create(p_fog_volume); -} - -void RendererSceneRenderRD::fog_volume_instance_set_transform(RID p_fog_volume_instance, const Transform3D &p_transform) { - RendererRD::Fog::FogVolumeInstance *fvi = RendererRD::Fog::get_singleton()->get_fog_volume_instance(p_fog_volume_instance); - ERR_FAIL_COND(!fvi); - fvi->transform = p_transform; -} -void RendererSceneRenderRD::fog_volume_instance_set_active(RID p_fog_volume_instance, bool p_active) { - RendererRD::Fog::FogVolumeInstance *fvi = RendererRD::Fog::get_singleton()->get_fog_volume_instance(p_fog_volume_instance); - ERR_FAIL_COND(!fvi); - fvi->active = p_active; -} - -RID RendererSceneRenderRD::fog_volume_instance_get_volume(RID p_fog_volume_instance) const { - RendererRD::Fog::FogVolumeInstance *fvi = RendererRD::Fog::get_singleton()->get_fog_volume_instance(p_fog_volume_instance); - ERR_FAIL_COND_V(!fvi, RID()); - return fvi->volume; -} - -Vector3 RendererSceneRenderRD::fog_volume_instance_get_position(RID p_fog_volume_instance) const { - RendererRD::Fog::FogVolumeInstance *fvi = RendererRD::Fog::get_singleton()->get_fog_volume_instance(p_fog_volume_instance); - ERR_FAIL_COND_V(!fvi, Vector3()); - - return fvi->transform.get_origin(); -} - -//////////////////////////////////////////////////////////// - -RID RendererSceneRenderRD::reflection_atlas_create() { - ReflectionAtlas ra; - ra.count = GLOBAL_GET("rendering/reflections/reflection_atlas/reflection_count"); - ra.size = GLOBAL_GET("rendering/reflections/reflection_atlas/reflection_size"); - - if (is_clustered_enabled()) { - ra.cluster_builder = memnew(ClusterBuilderRD); - ra.cluster_builder->set_shared(&cluster_builder_shared); - ra.cluster_builder->setup(Size2i(ra.size, ra.size), max_cluster_elements, RID(), RID(), RID()); - } else { - ra.cluster_builder = nullptr; - } - - return reflection_atlas_owner.make_rid(ra); -} - -void RendererSceneRenderRD::reflection_atlas_set_size(RID p_ref_atlas, int p_reflection_size, int p_reflection_count) { - ReflectionAtlas *ra = reflection_atlas_owner.get_or_null(p_ref_atlas); - ERR_FAIL_COND(!ra); - - if (ra->size == p_reflection_size && ra->count == p_reflection_count) { - return; //no changes - } - - if (ra->cluster_builder) { - // only if we're using our cluster - ra->cluster_builder->setup(Size2i(ra->size, ra->size), max_cluster_elements, RID(), RID(), RID()); - } - - ra->size = p_reflection_size; - ra->count = p_reflection_count; - - if (ra->reflection.is_valid()) { - //clear and invalidate everything - RD::get_singleton()->free(ra->reflection); - ra->reflection = RID(); - RD::get_singleton()->free(ra->depth_buffer); - ra->depth_buffer = RID(); - for (int i = 0; i < ra->reflections.size(); i++) { - ra->reflections.write[i].data.clear_reflection_data(); - if (ra->reflections[i].owner.is_null()) { - continue; - } - reflection_probe_release_atlas_index(ra->reflections[i].owner); - //rp->atlasindex clear - } - - ra->reflections.clear(); - } -} - -int RendererSceneRenderRD::reflection_atlas_get_size(RID p_ref_atlas) const { - ReflectionAtlas *ra = reflection_atlas_owner.get_or_null(p_ref_atlas); - ERR_FAIL_COND_V(!ra, 0); - - return ra->size; -} - -//////////////////////// -RID RendererSceneRenderRD::reflection_probe_instance_create(RID p_probe) { - ReflectionProbeInstance rpi; - rpi.probe = p_probe; - rpi.forward_id = _allocate_forward_id(FORWARD_ID_TYPE_REFLECTION_PROBE); - - return reflection_probe_instance_owner.make_rid(rpi); -} - -void RendererSceneRenderRD::reflection_probe_instance_set_transform(RID p_instance, const Transform3D &p_transform) { - ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); - ERR_FAIL_COND(!rpi); - - rpi->transform = p_transform; - rpi->dirty = true; -} - -void RendererSceneRenderRD::reflection_probe_release_atlas_index(RID p_instance) { - ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); - ERR_FAIL_COND(!rpi); - - if (rpi->atlas.is_null()) { - return; //nothing to release - } - ReflectionAtlas *atlas = reflection_atlas_owner.get_or_null(rpi->atlas); - ERR_FAIL_COND(!atlas); - ERR_FAIL_INDEX(rpi->atlas_index, atlas->reflections.size()); - atlas->reflections.write[rpi->atlas_index].owner = RID(); - rpi->atlas_index = -1; - rpi->atlas = RID(); -} - -bool RendererSceneRenderRD::reflection_probe_instance_needs_redraw(RID p_instance) { - ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); - ERR_FAIL_COND_V(!rpi, false); - - if (rpi->rendering) { - return false; - } - - if (rpi->dirty) { - return true; - } - - if (RSG::light_storage->reflection_probe_get_update_mode(rpi->probe) == RS::REFLECTION_PROBE_UPDATE_ALWAYS) { - return true; - } - - return rpi->atlas_index == -1; -} - -bool RendererSceneRenderRD::reflection_probe_instance_has_reflection(RID p_instance) { - ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); - ERR_FAIL_COND_V(!rpi, false); - - return rpi->atlas.is_valid(); } -bool RendererSceneRenderRD::reflection_probe_instance_begin_render(RID p_instance, RID p_reflection_atlas) { - ReflectionAtlas *atlas = reflection_atlas_owner.get_or_null(p_reflection_atlas); - - ERR_FAIL_COND_V(!atlas, false); - - ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); - ERR_FAIL_COND_V(!rpi, false); - - RD::get_singleton()->draw_command_begin_label("Reflection probe render"); - - if (RSG::light_storage->reflection_probe_get_update_mode(rpi->probe) == RS::REFLECTION_PROBE_UPDATE_ALWAYS && atlas->reflection.is_valid() && atlas->size != 256) { - WARN_PRINT("ReflectionProbes set to UPDATE_ALWAYS must have an atlas size of 256. Please update the atlas size in the ProjectSettings."); - reflection_atlas_set_size(p_reflection_atlas, 256, atlas->count); - } - - if (RSG::light_storage->reflection_probe_get_update_mode(rpi->probe) == RS::REFLECTION_PROBE_UPDATE_ALWAYS && atlas->reflection.is_valid() && atlas->reflections[0].data.layers[0].mipmaps.size() != 8) { - // Invalidate reflection atlas, need to regenerate - RD::get_singleton()->free(atlas->reflection); - atlas->reflection = RID(); - - for (int i = 0; i < atlas->reflections.size(); i++) { - if (atlas->reflections[i].owner.is_null()) { - continue; - } - reflection_probe_release_atlas_index(atlas->reflections[i].owner); - } - - atlas->reflections.clear(); - } - - if (atlas->reflection.is_null()) { - int mipmaps = MIN(sky.roughness_layers, Image::get_image_required_mipmaps(atlas->size, atlas->size, Image::FORMAT_RGBAH) + 1); - mipmaps = RSG::light_storage->reflection_probe_get_update_mode(rpi->probe) == RS::REFLECTION_PROBE_UPDATE_ALWAYS ? 8 : mipmaps; // always use 8 mipmaps with real time filtering - { - //reflection atlas was unused, create: - RD::TextureFormat tf; - tf.array_layers = 6 * atlas->count; - tf.format = _render_buffers_get_color_format(); - tf.texture_type = RD::TEXTURE_TYPE_CUBE_ARRAY; - tf.mipmaps = mipmaps; - tf.width = atlas->size; - tf.height = atlas->size; - tf.usage_bits = RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT | RD::TEXTURE_USAGE_SAMPLING_BIT | (_render_buffers_can_be_storage() ? RD::TEXTURE_USAGE_STORAGE_BIT : 0); - - atlas->reflection = RD::get_singleton()->texture_create(tf, RD::TextureView()); - } - { - RD::TextureFormat tf; - tf.format = RD::get_singleton()->texture_is_format_supported_for_usage(RD::DATA_FORMAT_D32_SFLOAT, RD::TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) ? RD::DATA_FORMAT_D32_SFLOAT : RD::DATA_FORMAT_X8_D24_UNORM_PACK32; - tf.width = atlas->size; - tf.height = atlas->size; - tf.usage_bits = RD::TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | RD::TEXTURE_USAGE_SAMPLING_BIT; - atlas->depth_buffer = RD::get_singleton()->texture_create(tf, RD::TextureView()); - } - atlas->reflections.resize(atlas->count); - for (int i = 0; i < atlas->count; i++) { - atlas->reflections.write[i].data.update_reflection_data(atlas->size, mipmaps, false, atlas->reflection, i * 6, RSG::light_storage->reflection_probe_get_update_mode(rpi->probe) == RS::REFLECTION_PROBE_UPDATE_ALWAYS, sky.roughness_layers, _render_buffers_get_color_format()); - for (int j = 0; j < 6; j++) { - atlas->reflections.write[i].fbs[j] = reflection_probe_create_framebuffer(atlas->reflections.write[i].data.layers[0].mipmaps[0].views[j], atlas->depth_buffer); - } - } - - Vector<RID> fb; - fb.push_back(atlas->depth_buffer); - atlas->depth_fb = RD::get_singleton()->framebuffer_create(fb); - } - - if (rpi->atlas_index == -1) { - for (int i = 0; i < atlas->reflections.size(); i++) { - if (atlas->reflections[i].owner.is_null()) { - rpi->atlas_index = i; - break; - } - } - //find the one used last - if (rpi->atlas_index == -1) { - //everything is in use, find the one least used via LRU - uint64_t pass_min = 0; - - for (int i = 0; i < atlas->reflections.size(); i++) { - ReflectionProbeInstance *rpi2 = reflection_probe_instance_owner.get_or_null(atlas->reflections[i].owner); - if (rpi2->last_pass < pass_min) { - pass_min = rpi2->last_pass; - rpi->atlas_index = i; - } - } - } - } - - if (rpi->atlas_index != -1) { // should we fail if this is still -1 ? - atlas->reflections.write[rpi->atlas_index].owner = p_instance; - } - - rpi->atlas = p_reflection_atlas; - rpi->rendering = true; - rpi->dirty = false; - rpi->processing_layer = 1; - rpi->processing_side = 0; - - RD::get_singleton()->draw_command_end_label(); - - return true; -} +/* REFLECTION PROBE */ RID RendererSceneRenderRD::reflection_probe_create_framebuffer(RID p_color, RID p_depth) { Vector<RID> fb; @@ -545,667 +267,39 @@ RID RendererSceneRenderRD::reflection_probe_create_framebuffer(RID p_color, RID return RD::get_singleton()->framebuffer_create(fb); } -bool RendererSceneRenderRD::reflection_probe_instance_postprocess_step(RID p_instance) { - ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); - ERR_FAIL_COND_V(!rpi, false); - ERR_FAIL_COND_V(!rpi->rendering, false); - ERR_FAIL_COND_V(rpi->atlas.is_null(), false); - - ReflectionAtlas *atlas = reflection_atlas_owner.get_or_null(rpi->atlas); - if (!atlas || rpi->atlas_index == -1) { - //does not belong to an atlas anymore, cancel (was removed from atlas or atlas changed while rendering) - rpi->rendering = false; - return false; - } - - if (RSG::light_storage->reflection_probe_get_update_mode(rpi->probe) == RS::REFLECTION_PROBE_UPDATE_ALWAYS) { - // Using real time reflections, all roughness is done in one step - atlas->reflections.write[rpi->atlas_index].data.create_reflection_fast_filter(false); - rpi->rendering = false; - rpi->processing_side = 0; - rpi->processing_layer = 1; - return true; - } - - if (rpi->processing_layer > 1) { - atlas->reflections.write[rpi->atlas_index].data.create_reflection_importance_sample(false, 10, rpi->processing_layer, sky.sky_ggx_samples_quality); - rpi->processing_layer++; - if (rpi->processing_layer == atlas->reflections[rpi->atlas_index].data.layers[0].mipmaps.size()) { - rpi->rendering = false; - rpi->processing_side = 0; - rpi->processing_layer = 1; - return true; - } - return false; - - } else { - atlas->reflections.write[rpi->atlas_index].data.create_reflection_importance_sample(false, rpi->processing_side, rpi->processing_layer, sky.sky_ggx_samples_quality); - } - - rpi->processing_side++; - if (rpi->processing_side == 6) { - rpi->processing_side = 0; - rpi->processing_layer++; - } - - return false; -} - -uint32_t RendererSceneRenderRD::reflection_probe_instance_get_resolution(RID p_instance) { - ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); - ERR_FAIL_COND_V(!rpi, 0); - - ReflectionAtlas *atlas = reflection_atlas_owner.get_or_null(rpi->atlas); - ERR_FAIL_COND_V(!atlas, 0); - return atlas->size; -} - -RID RendererSceneRenderRD::reflection_probe_instance_get_framebuffer(RID p_instance, int p_index) { - ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); - ERR_FAIL_COND_V(!rpi, RID()); - ERR_FAIL_INDEX_V(p_index, 6, RID()); - - ReflectionAtlas *atlas = reflection_atlas_owner.get_or_null(rpi->atlas); - ERR_FAIL_COND_V(!atlas, RID()); - return atlas->reflections[rpi->atlas_index].fbs[p_index]; -} - -RID RendererSceneRenderRD::reflection_probe_instance_get_depth_framebuffer(RID p_instance, int p_index) { - ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); - ERR_FAIL_COND_V(!rpi, RID()); - ERR_FAIL_INDEX_V(p_index, 6, RID()); - - ReflectionAtlas *atlas = reflection_atlas_owner.get_or_null(rpi->atlas); - ERR_FAIL_COND_V(!atlas, RID()); - return atlas->depth_fb; -} - -/////////////////////////////////////////////////////////// - -RID RendererSceneRenderRD::shadow_atlas_create() { - return shadow_atlas_owner.make_rid(ShadowAtlas()); -} - -void RendererSceneRenderRD::_update_shadow_atlas(ShadowAtlas *shadow_atlas) { - if (shadow_atlas->size > 0 && shadow_atlas->depth.is_null()) { - RD::TextureFormat tf; - tf.format = shadow_atlas->use_16_bits ? RD::DATA_FORMAT_D16_UNORM : RD::DATA_FORMAT_D32_SFLOAT; - tf.width = shadow_atlas->size; - tf.height = shadow_atlas->size; - tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; - - shadow_atlas->depth = RD::get_singleton()->texture_create(tf, RD::TextureView()); - Vector<RID> fb_tex; - fb_tex.push_back(shadow_atlas->depth); - shadow_atlas->fb = RD::get_singleton()->framebuffer_create(fb_tex); - } -} - -void RendererSceneRenderRD::shadow_atlas_set_size(RID p_atlas, int p_size, bool p_16_bits) { - ShadowAtlas *shadow_atlas = shadow_atlas_owner.get_or_null(p_atlas); - ERR_FAIL_COND(!shadow_atlas); - ERR_FAIL_COND(p_size < 0); - p_size = next_power_of_2(p_size); - - if (p_size == shadow_atlas->size && p_16_bits == shadow_atlas->use_16_bits) { - return; - } - - // erasing atlas - if (shadow_atlas->depth.is_valid()) { - RD::get_singleton()->free(shadow_atlas->depth); - shadow_atlas->depth = RID(); - } - for (int i = 0; i < 4; i++) { - //clear subdivisions - shadow_atlas->quadrants[i].shadows.clear(); - shadow_atlas->quadrants[i].shadows.resize(1 << shadow_atlas->quadrants[i].subdivision); - } - - //erase shadow atlas reference from lights - for (const KeyValue<RID, uint32_t> &E : shadow_atlas->shadow_owners) { - LightInstance *li = light_instance_owner.get_or_null(E.key); - ERR_CONTINUE(!li); - li->shadow_atlases.erase(p_atlas); - } - - //clear owners - shadow_atlas->shadow_owners.clear(); - - shadow_atlas->size = p_size; - shadow_atlas->use_16_bits = p_16_bits; -} - -void RendererSceneRenderRD::shadow_atlas_set_quadrant_subdivision(RID p_atlas, int p_quadrant, int p_subdivision) { - ShadowAtlas *shadow_atlas = shadow_atlas_owner.get_or_null(p_atlas); - ERR_FAIL_COND(!shadow_atlas); - ERR_FAIL_INDEX(p_quadrant, 4); - ERR_FAIL_INDEX(p_subdivision, 16384); - - uint32_t subdiv = next_power_of_2(p_subdivision); - if (subdiv & 0xaaaaaaaa) { //sqrt(subdiv) must be integer - subdiv <<= 1; - } - - subdiv = int(Math::sqrt((float)subdiv)); - - //obtain the number that will be x*x - - if (shadow_atlas->quadrants[p_quadrant].subdivision == subdiv) { - return; - } - - //erase all data from quadrant - for (int i = 0; i < shadow_atlas->quadrants[p_quadrant].shadows.size(); i++) { - if (shadow_atlas->quadrants[p_quadrant].shadows[i].owner.is_valid()) { - shadow_atlas->shadow_owners.erase(shadow_atlas->quadrants[p_quadrant].shadows[i].owner); - LightInstance *li = light_instance_owner.get_or_null(shadow_atlas->quadrants[p_quadrant].shadows[i].owner); - ERR_CONTINUE(!li); - li->shadow_atlases.erase(p_atlas); - } - } - - shadow_atlas->quadrants[p_quadrant].shadows.clear(); - shadow_atlas->quadrants[p_quadrant].shadows.resize(subdiv * subdiv); - shadow_atlas->quadrants[p_quadrant].subdivision = subdiv; - - //cache the smallest subdiv (for faster allocation in light update) - - shadow_atlas->smallest_subdiv = 1 << 30; - - for (int i = 0; i < 4; i++) { - if (shadow_atlas->quadrants[i].subdivision) { - shadow_atlas->smallest_subdiv = MIN(shadow_atlas->smallest_subdiv, shadow_atlas->quadrants[i].subdivision); - } - } - - if (shadow_atlas->smallest_subdiv == 1 << 30) { - shadow_atlas->smallest_subdiv = 0; - } - - //resort the size orders, simple bublesort for 4 elements.. - - int swaps = 0; - do { - swaps = 0; - - for (int i = 0; i < 3; i++) { - if (shadow_atlas->quadrants[shadow_atlas->size_order[i]].subdivision < shadow_atlas->quadrants[shadow_atlas->size_order[i + 1]].subdivision) { - SWAP(shadow_atlas->size_order[i], shadow_atlas->size_order[i + 1]); - swaps++; - } - } - } while (swaps > 0); -} - -bool RendererSceneRenderRD::_shadow_atlas_find_shadow(ShadowAtlas *shadow_atlas, int *p_in_quadrants, int p_quadrant_count, int p_current_subdiv, uint64_t p_tick, int &r_quadrant, int &r_shadow) { - for (int i = p_quadrant_count - 1; i >= 0; i--) { - int qidx = p_in_quadrants[i]; - - if (shadow_atlas->quadrants[qidx].subdivision == (uint32_t)p_current_subdiv) { - return false; - } - - //look for an empty space - int sc = shadow_atlas->quadrants[qidx].shadows.size(); - const ShadowAtlas::Quadrant::Shadow *sarr = shadow_atlas->quadrants[qidx].shadows.ptr(); - - int found_free_idx = -1; //found a free one - int found_used_idx = -1; //found existing one, must steal it - uint64_t min_pass = 0; // pass of the existing one, try to use the least recently used one (LRU fashion) - - for (int j = 0; j < sc; j++) { - if (!sarr[j].owner.is_valid()) { - found_free_idx = j; - break; - } - - LightInstance *sli = light_instance_owner.get_or_null(sarr[j].owner); - ERR_CONTINUE(!sli); - - if (sli->last_scene_pass != scene_pass) { - //was just allocated, don't kill it so soon, wait a bit.. - if (p_tick - sarr[j].alloc_tick < shadow_atlas_realloc_tolerance_msec) { - continue; - } - - if (found_used_idx == -1 || sli->last_scene_pass < min_pass) { - found_used_idx = j; - min_pass = sli->last_scene_pass; - } - } - } - - if (found_free_idx == -1 && found_used_idx == -1) { - continue; //nothing found - } - - if (found_free_idx == -1 && found_used_idx != -1) { - found_free_idx = found_used_idx; - } - - r_quadrant = qidx; - r_shadow = found_free_idx; - - return true; - } - - return false; -} - -bool RendererSceneRenderRD::_shadow_atlas_find_omni_shadows(ShadowAtlas *shadow_atlas, int *p_in_quadrants, int p_quadrant_count, int p_current_subdiv, uint64_t p_tick, int &r_quadrant, int &r_shadow) { - for (int i = p_quadrant_count - 1; i >= 0; i--) { - int qidx = p_in_quadrants[i]; - - if (shadow_atlas->quadrants[qidx].subdivision == (uint32_t)p_current_subdiv) { - return false; - } - - //look for an empty space - int sc = shadow_atlas->quadrants[qidx].shadows.size(); - const ShadowAtlas::Quadrant::Shadow *sarr = shadow_atlas->quadrants[qidx].shadows.ptr(); - - int found_idx = -1; - uint64_t min_pass = 0; // sum of currently selected spots, try to get the least recently used pair - - for (int j = 0; j < sc - 1; j++) { - uint64_t pass = 0; - - if (sarr[j].owner.is_valid()) { - LightInstance *sli = light_instance_owner.get_or_null(sarr[j].owner); - ERR_CONTINUE(!sli); - - if (sli->last_scene_pass == scene_pass) { - continue; - } - - //was just allocated, don't kill it so soon, wait a bit.. - if (p_tick - sarr[j].alloc_tick < shadow_atlas_realloc_tolerance_msec) { - continue; - } - pass += sli->last_scene_pass; - } - - if (sarr[j + 1].owner.is_valid()) { - LightInstance *sli = light_instance_owner.get_or_null(sarr[j + 1].owner); - ERR_CONTINUE(!sli); - - if (sli->last_scene_pass == scene_pass) { - continue; - } - - //was just allocated, don't kill it so soon, wait a bit.. - if (p_tick - sarr[j + 1].alloc_tick < shadow_atlas_realloc_tolerance_msec) { - continue; - } - pass += sli->last_scene_pass; - } - - if (found_idx == -1 || pass < min_pass) { - found_idx = j; - min_pass = pass; - - // we found two empty spots, no need to check the rest - if (pass == 0) { - break; - } - } - } - - if (found_idx == -1) { - continue; //nothing found - } - - r_quadrant = qidx; - r_shadow = found_idx; - - return true; - } - - return false; -} - -bool RendererSceneRenderRD::shadow_atlas_update_light(RID p_atlas, RID p_light_instance, float p_coverage, uint64_t p_light_version) { - ShadowAtlas *shadow_atlas = shadow_atlas_owner.get_or_null(p_atlas); - ERR_FAIL_COND_V(!shadow_atlas, false); - - LightInstance *li = light_instance_owner.get_or_null(p_light_instance); - ERR_FAIL_COND_V(!li, false); - - if (shadow_atlas->size == 0 || shadow_atlas->smallest_subdiv == 0) { - return false; - } - - uint32_t quad_size = shadow_atlas->size >> 1; - int desired_fit = MIN(quad_size / shadow_atlas->smallest_subdiv, next_power_of_2(quad_size * p_coverage)); - - int valid_quadrants[4]; - int valid_quadrant_count = 0; - int best_size = -1; //best size found - int best_subdiv = -1; //subdiv for the best size - - //find the quadrants this fits into, and the best possible size it can fit into - for (int i = 0; i < 4; i++) { - int q = shadow_atlas->size_order[i]; - int sd = shadow_atlas->quadrants[q].subdivision; - if (sd == 0) { - continue; //unused - } - - int max_fit = quad_size / sd; - - if (best_size != -1 && max_fit > best_size) { - break; //too large - } - - valid_quadrants[valid_quadrant_count++] = q; - best_subdiv = sd; - - if (max_fit >= desired_fit) { - best_size = max_fit; - } - } - - ERR_FAIL_COND_V(valid_quadrant_count == 0, false); - - uint64_t tick = OS::get_singleton()->get_ticks_msec(); - - uint32_t old_key = ShadowAtlas::SHADOW_INVALID; - uint32_t old_quadrant = ShadowAtlas::SHADOW_INVALID; - uint32_t old_shadow = ShadowAtlas::SHADOW_INVALID; - int old_subdivision = -1; - - bool should_realloc = false; - bool should_redraw = false; - - if (shadow_atlas->shadow_owners.has(p_light_instance)) { - old_key = shadow_atlas->shadow_owners[p_light_instance]; - old_quadrant = (old_key >> ShadowAtlas::QUADRANT_SHIFT) & 0x3; - old_shadow = old_key & ShadowAtlas::SHADOW_INDEX_MASK; - - should_realloc = shadow_atlas->quadrants[old_quadrant].subdivision != (uint32_t)best_subdiv && (shadow_atlas->quadrants[old_quadrant].shadows[old_shadow].alloc_tick - tick > shadow_atlas_realloc_tolerance_msec); - should_redraw = shadow_atlas->quadrants[old_quadrant].shadows[old_shadow].version != p_light_version; - - if (!should_realloc) { - shadow_atlas->quadrants[old_quadrant].shadows.write[old_shadow].version = p_light_version; - //already existing, see if it should redraw or it's just OK - return should_redraw; - } - - old_subdivision = shadow_atlas->quadrants[old_quadrant].subdivision; - } - - bool is_omni = li->light_type == RS::LIGHT_OMNI; - bool found_shadow = false; - int new_quadrant = -1; - int new_shadow = -1; - - if (is_omni) { - found_shadow = _shadow_atlas_find_omni_shadows(shadow_atlas, valid_quadrants, valid_quadrant_count, old_subdivision, tick, new_quadrant, new_shadow); - } else { - found_shadow = _shadow_atlas_find_shadow(shadow_atlas, valid_quadrants, valid_quadrant_count, old_subdivision, tick, new_quadrant, new_shadow); - } - - if (found_shadow) { - if (old_quadrant != ShadowAtlas::SHADOW_INVALID) { - shadow_atlas->quadrants[old_quadrant].shadows.write[old_shadow].version = 0; - shadow_atlas->quadrants[old_quadrant].shadows.write[old_shadow].owner = RID(); - - if (old_key & ShadowAtlas::OMNI_LIGHT_FLAG) { - shadow_atlas->quadrants[old_quadrant].shadows.write[old_shadow + 1].version = 0; - shadow_atlas->quadrants[old_quadrant].shadows.write[old_shadow + 1].owner = RID(); - } - } - - uint32_t new_key = new_quadrant << ShadowAtlas::QUADRANT_SHIFT; - new_key |= new_shadow; - - ShadowAtlas::Quadrant::Shadow *sh = &shadow_atlas->quadrants[new_quadrant].shadows.write[new_shadow]; - _shadow_atlas_invalidate_shadow(sh, p_atlas, shadow_atlas, new_quadrant, new_shadow); - - sh->owner = p_light_instance; - sh->alloc_tick = tick; - sh->version = p_light_version; - - if (is_omni) { - new_key |= ShadowAtlas::OMNI_LIGHT_FLAG; - - int new_omni_shadow = new_shadow + 1; - ShadowAtlas::Quadrant::Shadow *extra_sh = &shadow_atlas->quadrants[new_quadrant].shadows.write[new_omni_shadow]; - _shadow_atlas_invalidate_shadow(extra_sh, p_atlas, shadow_atlas, new_quadrant, new_omni_shadow); - - extra_sh->owner = p_light_instance; - extra_sh->alloc_tick = tick; - extra_sh->version = p_light_version; - } - - li->shadow_atlases.insert(p_atlas); - - //update it in map - shadow_atlas->shadow_owners[p_light_instance] = new_key; - //make it dirty, as it should redraw anyway - return true; - } - - return should_redraw; -} - -void RendererSceneRenderRD::_shadow_atlas_invalidate_shadow(RendererSceneRenderRD::ShadowAtlas::Quadrant::Shadow *p_shadow, RID p_atlas, RendererSceneRenderRD::ShadowAtlas *p_shadow_atlas, uint32_t p_quadrant, uint32_t p_shadow_idx) { - if (p_shadow->owner.is_valid()) { - LightInstance *sli = light_instance_owner.get_or_null(p_shadow->owner); - uint32_t old_key = p_shadow_atlas->shadow_owners[p_shadow->owner]; - - if (old_key & ShadowAtlas::OMNI_LIGHT_FLAG) { - uint32_t s = old_key & ShadowAtlas::SHADOW_INDEX_MASK; - uint32_t omni_shadow_idx = p_shadow_idx + (s == (uint32_t)p_shadow_idx ? 1 : -1); - RendererSceneRenderRD::ShadowAtlas::Quadrant::Shadow *omni_shadow = &p_shadow_atlas->quadrants[p_quadrant].shadows.write[omni_shadow_idx]; - omni_shadow->version = 0; - omni_shadow->owner = RID(); - } - - p_shadow_atlas->shadow_owners.erase(p_shadow->owner); - p_shadow->version = 0; - p_shadow->owner = RID(); - sli->shadow_atlases.erase(p_atlas); - } -} - -void RendererSceneRenderRD::_update_directional_shadow_atlas() { - if (directional_shadow.depth.is_null() && directional_shadow.size > 0) { - RD::TextureFormat tf; - tf.format = directional_shadow.use_16_bits ? RD::DATA_FORMAT_D16_UNORM : RD::DATA_FORMAT_D32_SFLOAT; - tf.width = directional_shadow.size; - tf.height = directional_shadow.size; - tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; - - directional_shadow.depth = RD::get_singleton()->texture_create(tf, RD::TextureView()); - Vector<RID> fb_tex; - fb_tex.push_back(directional_shadow.depth); - directional_shadow.fb = RD::get_singleton()->framebuffer_create(fb_tex); - } -} -void RendererSceneRenderRD::directional_shadow_atlas_set_size(int p_size, bool p_16_bits) { - p_size = nearest_power_of_2_templated(p_size); - - if (directional_shadow.size == p_size && directional_shadow.use_16_bits == p_16_bits) { - return; - } - - directional_shadow.size = p_size; - directional_shadow.use_16_bits = p_16_bits; - - if (directional_shadow.depth.is_valid()) { - RD::get_singleton()->free(directional_shadow.depth); - directional_shadow.depth = RID(); - _base_uniforms_changed(); - } -} - -void RendererSceneRenderRD::set_directional_shadow_count(int p_count) { - directional_shadow.light_count = p_count; - directional_shadow.current_light = 0; -} - -static Rect2i _get_directional_shadow_rect(int p_size, int p_shadow_count, int p_shadow_index) { - int split_h = 1; - int split_v = 1; - - while (split_h * split_v < p_shadow_count) { - if (split_h == split_v) { - split_h <<= 1; - } else { - split_v <<= 1; - } - } - - Rect2i rect(0, 0, p_size, p_size); - rect.size.width /= split_h; - rect.size.height /= split_v; - - rect.position.x = rect.size.width * (p_shadow_index % split_h); - rect.position.y = rect.size.height * (p_shadow_index / split_h); - - return rect; -} - -int RendererSceneRenderRD::get_directional_light_shadow_size(RID p_light_intance) { - ERR_FAIL_COND_V(directional_shadow.light_count == 0, 0); - - Rect2i r = _get_directional_shadow_rect(directional_shadow.size, directional_shadow.light_count, 0); - - LightInstance *light_instance = light_instance_owner.get_or_null(p_light_intance); - ERR_FAIL_COND_V(!light_instance, 0); - - switch (RSG::light_storage->light_directional_get_shadow_mode(light_instance->light)) { - case RS::LIGHT_DIRECTIONAL_SHADOW_ORTHOGONAL: - break; //none - case RS::LIGHT_DIRECTIONAL_SHADOW_PARALLEL_2_SPLITS: - r.size.height /= 2; - break; - case RS::LIGHT_DIRECTIONAL_SHADOW_PARALLEL_4_SPLITS: - r.size /= 2; - break; - } - - return MAX(r.size.width, r.size.height); -} - -////////////////////////////////////////////////// - -RID RendererSceneRenderRD::light_instance_create(RID p_light) { - RID li = light_instance_owner.make_rid(LightInstance()); - - LightInstance *light_instance = light_instance_owner.get_or_null(li); - - light_instance->self = li; - light_instance->light = p_light; - light_instance->light_type = RSG::light_storage->light_get_type(p_light); - if (light_instance->light_type != RS::LIGHT_DIRECTIONAL) { - light_instance->forward_id = _allocate_forward_id(light_instance->light_type == RS::LIGHT_OMNI ? FORWARD_ID_TYPE_OMNI_LIGHT : FORWARD_ID_TYPE_SPOT_LIGHT); - } - - return li; -} - -void RendererSceneRenderRD::light_instance_set_transform(RID p_light_instance, const Transform3D &p_transform) { - LightInstance *light_instance = light_instance_owner.get_or_null(p_light_instance); - ERR_FAIL_COND(!light_instance); - - light_instance->transform = p_transform; -} - -void RendererSceneRenderRD::light_instance_set_aabb(RID p_light_instance, const AABB &p_aabb) { - LightInstance *light_instance = light_instance_owner.get_or_null(p_light_instance); - ERR_FAIL_COND(!light_instance); - - light_instance->aabb = p_aabb; -} - -void RendererSceneRenderRD::light_instance_set_shadow_transform(RID p_light_instance, const Projection &p_projection, const Transform3D &p_transform, float p_far, float p_split, int p_pass, float p_shadow_texel_size, float p_bias_scale, float p_range_begin, const Vector2 &p_uv_scale) { - LightInstance *light_instance = light_instance_owner.get_or_null(p_light_instance); - ERR_FAIL_COND(!light_instance); - - ERR_FAIL_INDEX(p_pass, 6); - - light_instance->shadow_transform[p_pass].camera = p_projection; - light_instance->shadow_transform[p_pass].transform = p_transform; - light_instance->shadow_transform[p_pass].farplane = p_far; - light_instance->shadow_transform[p_pass].split = p_split; - light_instance->shadow_transform[p_pass].bias_scale = p_bias_scale; - light_instance->shadow_transform[p_pass].range_begin = p_range_begin; - light_instance->shadow_transform[p_pass].shadow_texel_size = p_shadow_texel_size; - light_instance->shadow_transform[p_pass].uv_scale = p_uv_scale; -} - -void RendererSceneRenderRD::light_instance_mark_visible(RID p_light_instance) { - LightInstance *light_instance = light_instance_owner.get_or_null(p_light_instance); - ERR_FAIL_COND(!light_instance); +/* FOG VOLUME INSTANCE */ - light_instance->last_scene_pass = scene_pass; +RID RendererSceneRenderRD::fog_volume_instance_create(RID p_fog_volume) { + return RendererRD::Fog::get_singleton()->fog_volume_instance_create(p_fog_volume); } -RendererSceneRenderRD::ShadowCubemap *RendererSceneRenderRD::_get_shadow_cubemap(int p_size) { - if (!shadow_cubemaps.has(p_size)) { - ShadowCubemap sc; - { - RD::TextureFormat tf; - tf.format = RD::get_singleton()->texture_is_format_supported_for_usage(RD::DATA_FORMAT_D32_SFLOAT, RD::TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) ? RD::DATA_FORMAT_D32_SFLOAT : RD::DATA_FORMAT_X8_D24_UNORM_PACK32; - tf.width = p_size; - tf.height = p_size; - tf.texture_type = RD::TEXTURE_TYPE_CUBE; - tf.array_layers = 6; - tf.usage_bits = RD::TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | RD::TEXTURE_USAGE_SAMPLING_BIT; - sc.cubemap = RD::get_singleton()->texture_create(tf, RD::TextureView()); - } - - for (int i = 0; i < 6; i++) { - RID side_texture = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), sc.cubemap, i, 0); - Vector<RID> fbtex; - fbtex.push_back(side_texture); - sc.side_fb[i] = RD::get_singleton()->framebuffer_create(fbtex); - } - - shadow_cubemaps[p_size] = sc; - } - - return &shadow_cubemaps[p_size]; +void RendererSceneRenderRD::fog_volume_instance_set_transform(RID p_fog_volume_instance, const Transform3D &p_transform) { + RendererRD::Fog::get_singleton()->fog_volume_instance_set_transform(p_fog_volume_instance, p_transform); } -////////////////////////// - -RID RendererSceneRenderRD::decal_instance_create(RID p_decal) { - DecalInstance di; - di.decal = p_decal; - di.forward_id = _allocate_forward_id(FORWARD_ID_TYPE_DECAL); - return decal_instance_owner.make_rid(di); +void RendererSceneRenderRD::fog_volume_instance_set_active(RID p_fog_volume_instance, bool p_active) { + RendererRD::Fog::get_singleton()->fog_volume_instance_set_active(p_fog_volume_instance, p_active); } -void RendererSceneRenderRD::decal_instance_set_transform(RID p_decal, const Transform3D &p_transform) { - DecalInstance *di = decal_instance_owner.get_or_null(p_decal); - ERR_FAIL_COND(!di); - di->transform = p_transform; +RID RendererSceneRenderRD::fog_volume_instance_get_volume(RID p_fog_volume_instance) const { + return RendererRD::Fog::get_singleton()->fog_volume_instance_get_volume(p_fog_volume_instance); } -///////////////////////////////// - -RID RendererSceneRenderRD::lightmap_instance_create(RID p_lightmap) { - LightmapInstance li; - li.lightmap = p_lightmap; - return lightmap_instance_owner.make_rid(li); -} -void RendererSceneRenderRD::lightmap_instance_set_transform(RID p_lightmap, const Transform3D &p_transform) { - LightmapInstance *li = lightmap_instance_owner.get_or_null(p_lightmap); - ERR_FAIL_COND(!li); - li->transform = p_transform; +Vector3 RendererSceneRenderRD::fog_volume_instance_get_position(RID p_fog_volume_instance) const { + return RendererRD::Fog::get_singleton()->fog_volume_instance_get_position(p_fog_volume_instance); } -///////////////////////////////// +/* VOXEL GI */ RID RendererSceneRenderRD::voxel_gi_instance_create(RID p_base) { return gi.voxel_gi_instance_create(p_base); } void RendererSceneRenderRD::voxel_gi_instance_set_transform_to_data(RID p_probe, const Transform3D &p_xform) { + if (!is_dynamic_gi_supported()) { + return; + } + gi.voxel_gi_instance_set_transform_to_data(p_probe, p_xform); } @@ -1222,7 +316,7 @@ void RendererSceneRenderRD::voxel_gi_update(RID p_probe, bool p_update_light_ins return; } - gi.voxel_gi_update(p_probe, p_update_light_instances, p_light_instances, p_dynamic_objects, this); + gi.voxel_gi_update(p_probe, p_update_light_instances, p_light_instances, p_dynamic_objects); } void RendererSceneRenderRD::_debug_sdfgi_probes(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_framebuffer, const uint32_t p_view_count, const Projection *p_camera_with_transforms, bool p_will_continue_color, bool p_will_continue_depth) { @@ -1245,9 +339,6 @@ Ref<RenderSceneBuffers> RendererSceneRenderRD::render_buffers_create() { rb->set_can_be_storage(_render_buffers_can_be_storage()); rb->set_max_cluster_elements(max_cluster_elements); rb->set_base_data_format(_render_buffers_get_color_format()); - if (ss_effects) { - rb->set_sseffects(ss_effects); - } if (vrs) { rb->set_vrs(vrs); } @@ -1308,136 +399,6 @@ void RendererSceneRenderRD::_allocate_luminance_textures(Ref<RenderSceneBuffersR } } -void RendererSceneRenderRD::_process_sss(Ref<RenderSceneBuffersRD> p_render_buffers, const Projection &p_camera) { - ERR_FAIL_COND(p_render_buffers.is_null()); - - Size2i internal_size = p_render_buffers->get_internal_size(); - bool can_use_effects = internal_size.x >= 8 && internal_size.y >= 8; - - if (!can_use_effects) { - //just copy - return; - } - - p_render_buffers->allocate_blur_textures(); - - for (uint32_t v = 0; v < p_render_buffers->get_view_count(); v++) { - RID internal_texture = p_render_buffers->get_internal_texture(v); - RID depth_texture = p_render_buffers->get_depth_texture(v); - ss_effects->sub_surface_scattering(p_render_buffers, internal_texture, depth_texture, p_camera, internal_size, sss_scale, sss_depth_scale, sss_quality); - } -} - -void RendererSceneRenderRD::_process_ssr(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_dest_framebuffer, const RID *p_normal_slices, RID p_specular_buffer, const RID *p_metallic_slices, const Color &p_metallic_mask, RID p_environment, const Projection *p_projections, const Vector3 *p_eye_offsets, bool p_use_additive) { - ERR_FAIL_NULL(ss_effects); - ERR_FAIL_COND(p_render_buffers.is_null()); - - Size2i internal_size = p_render_buffers->get_internal_size(); - bool can_use_effects = internal_size.x >= 8 && internal_size.y >= 8; - uint32_t view_count = p_render_buffers->get_view_count(); - - if (!can_use_effects) { - //just copy - copy_effects->merge_specular(p_dest_framebuffer, p_specular_buffer, p_use_additive ? RID() : p_render_buffers->get_internal_texture(), RID(), view_count); - return; - } - - ERR_FAIL_COND(p_environment.is_null()); - ERR_FAIL_COND(!environment_get_ssr_enabled(p_environment)); - - Size2i half_size = Size2i(internal_size.x / 2, internal_size.y / 2); - if (p_render_buffers->ssr.output.is_null()) { - ss_effects->ssr_allocate_buffers(p_render_buffers->ssr, _render_buffers_get_color_format(), ssr_roughness_quality, half_size, view_count); - } - RID texture_slices[RendererSceneRender::MAX_RENDER_VIEWS]; - RID depth_slices[RendererSceneRender::MAX_RENDER_VIEWS]; - for (uint32_t v = 0; v < view_count; v++) { - texture_slices[v] = p_render_buffers->get_internal_texture(v); - depth_slices[v] = p_render_buffers->get_depth_texture(v); - } - ss_effects->screen_space_reflection(p_render_buffers->ssr, texture_slices, p_normal_slices, ssr_roughness_quality, p_metallic_slices, p_metallic_mask, depth_slices, half_size, environment_get_ssr_max_steps(p_environment), environment_get_ssr_fade_in(p_environment), environment_get_ssr_fade_out(p_environment), environment_get_ssr_depth_tolerance(p_environment), view_count, p_projections, p_eye_offsets); - copy_effects->merge_specular(p_dest_framebuffer, p_specular_buffer, p_use_additive ? RID() : p_render_buffers->get_internal_texture(), p_render_buffers->ssr.output, view_count); -} - -void RendererSceneRenderRD::_process_ssao(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, RID p_normal_buffer, const Projection &p_projection) { - ERR_FAIL_NULL(ss_effects); - ERR_FAIL_COND(p_render_buffers.is_null()); - ERR_FAIL_COND(p_environment.is_null()); - - RENDER_TIMESTAMP("Process SSAO"); - - RendererRD::SSEffects::SSAOSettings settings; - settings.radius = environment_get_ssao_radius(p_environment); - settings.intensity = environment_get_ssao_intensity(p_environment); - settings.power = environment_get_ssao_power(p_environment); - settings.detail = environment_get_ssao_detail(p_environment); - settings.horizon = environment_get_ssao_horizon(p_environment); - settings.sharpness = environment_get_ssao_sharpness(p_environment); - - settings.quality = ssao_quality; - settings.half_size = ssao_half_size; - settings.adaptive_target = ssao_adaptive_target; - settings.blur_passes = ssao_blur_passes; - settings.fadeout_from = ssao_fadeout_from; - settings.fadeout_to = ssao_fadeout_to; - settings.full_screen_size = p_render_buffers->get_internal_size(); - - ss_effects->ssao_allocate_buffers(p_render_buffers->ss_effects.ssao, settings, p_render_buffers->ss_effects.linear_depth); - ss_effects->generate_ssao(p_render_buffers->ss_effects.ssao, p_normal_buffer, p_projection, settings); -} - -void RendererSceneRenderRD::_process_ssil(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, RID p_normal_buffer, const Projection &p_projection, const Transform3D &p_transform) { - ERR_FAIL_NULL(ss_effects); - ERR_FAIL_COND(p_render_buffers.is_null()); - ERR_FAIL_COND(p_environment.is_null()); - - RENDER_TIMESTAMP("Process SSIL"); - - RendererRD::SSEffects::SSILSettings settings; - settings.radius = environment_get_ssil_radius(p_environment); - settings.intensity = environment_get_ssil_intensity(p_environment); - settings.sharpness = environment_get_ssil_sharpness(p_environment); - settings.normal_rejection = environment_get_ssil_normal_rejection(p_environment); - - settings.quality = ssil_quality; - settings.half_size = ssil_half_size; - settings.adaptive_target = ssil_adaptive_target; - settings.blur_passes = ssil_blur_passes; - settings.fadeout_from = ssil_fadeout_from; - settings.fadeout_to = ssil_fadeout_to; - settings.full_screen_size = p_render_buffers->get_internal_size(); - - Projection correction; - correction.set_depth_correction(true); - Projection projection = correction * p_projection; - Transform3D transform = p_transform; - transform.set_origin(Vector3(0.0, 0.0, 0.0)); - Projection last_frame_projection = p_render_buffers->ss_effects.last_frame_projection * Projection(p_render_buffers->ss_effects.last_frame_transform.affine_inverse()) * Projection(transform) * projection.inverse(); - - ss_effects->ssil_allocate_buffers(p_render_buffers->ss_effects.ssil, settings, p_render_buffers->ss_effects.linear_depth); - ss_effects->screen_space_indirect_lighting(p_render_buffers->ss_effects.ssil, p_normal_buffer, p_projection, last_frame_projection, settings); - p_render_buffers->ss_effects.last_frame_projection = projection; - p_render_buffers->ss_effects.last_frame_transform = transform; -} - -void RendererSceneRenderRD::_copy_framebuffer_to_ssil(Ref<RenderSceneBuffersRD> p_render_buffers) { - ERR_FAIL_COND(p_render_buffers.is_null()); - - if (p_render_buffers->ss_effects.ssil.last_frame.is_valid()) { - Size2i size = p_render_buffers->get_internal_size(); - RID texture = p_render_buffers->get_internal_texture(); - copy_effects->copy_to_rect(texture, p_render_buffers->ss_effects.ssil.last_frame, Rect2i(0, 0, size.x, size.y)); - - int width = size.x; - int height = size.y; - for (int i = 0; i < p_render_buffers->ss_effects.ssil.last_frame_slices.size() - 1; i++) { - width = MAX(1, width >> 1); - height = MAX(1, height >> 1); - copy_effects->make_mipmap(p_render_buffers->ss_effects.ssil.last_frame_slices[i], p_render_buffers->ss_effects.ssil.last_frame_slices[i + 1], Size2i(width, height)); - } - } -} - void RendererSceneRenderRD::_render_buffers_copy_screen_texture(const RenderDataRD *p_render_data) { Ref<RenderSceneBuffersRD> rb = p_render_data->render_buffers; ERR_FAIL_COND(rb.is_null()); @@ -1492,7 +453,7 @@ void RendererSceneRenderRD::_render_buffers_copy_depth_texture(const RenderDataR bool can_use_storage = _render_buffers_can_be_storage(); Size2i size = rb->get_internal_size(); - for (uint32_t v = 0; v < p_render_data->view_count; v++) { + for (uint32_t v = 0; v < p_render_data->scene_data->view_count; v++) { RID depth_texture = rb->get_depth_texture(v); RID depth_back_texture = rb->get_texture_slice(RB_SCOPE_BUFFERS, RB_TEX_BACK_DEPTH, v, 0); @@ -1544,9 +505,9 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende buffers.depth_texture = rb->get_depth_texture(i); // In stereo p_render_data->z_near and p_render_data->z_far can be offset for our combined frustrum - float z_near = p_render_data->view_projection[i].get_z_near(); - float z_far = p_render_data->view_projection[i].get_z_far(); - bokeh_dof->bokeh_dof_compute(buffers, p_render_data->camera_attributes, z_near, z_far, p_render_data->cam_orthogonal); + float z_near = p_render_data->scene_data->view_projection[i].get_z_near(); + float z_far = p_render_data->scene_data->view_projection[i].get_z_far(); + bokeh_dof->bokeh_dof_compute(buffers, p_render_data->camera_attributes, z_near, z_far, p_render_data->scene_data->cam_orthogonal); }; } else { // Set framebuffers. @@ -1567,9 +528,9 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende buffers.base_fb = FramebufferCacheRD::get_singleton()->get_cache(buffers.base_texture); // TODO move this into bokeh_dof_raster, we can do this internally // In stereo p_render_data->z_near and p_render_data->z_far can be offset for our combined frustrum - float z_near = p_render_data->view_projection[i].get_z_near(); - float z_far = p_render_data->view_projection[i].get_z_far(); - bokeh_dof->bokeh_dof_raster(buffers, p_render_data->camera_attributes, z_near, z_far, p_render_data->cam_orthogonal); + float z_near = p_render_data->scene_data->view_projection[i].get_z_near(); + float z_far = p_render_data->scene_data->view_projection[i].get_z_far(); + bokeh_dof->bokeh_dof_raster(buffers, p_render_data->camera_attributes, z_near, z_far, p_render_data->scene_data->cam_orthogonal); } } RD::get_singleton()->draw_command_end_label(); @@ -1853,7 +814,7 @@ void RendererSceneRenderRD::_render_buffers_debug_draw(Ref<RenderSceneBuffersRD> if (debug_draw == RS::VIEWPORT_DEBUG_DRAW_SHADOW_ATLAS) { if (p_shadow_atlas.is_valid()) { - RID shadow_atlas_texture = shadow_atlas_get_texture(p_shadow_atlas); + RID shadow_atlas_texture = RendererRD::LightStorage::get_singleton()->shadow_atlas_get_texture(p_shadow_atlas); if (shadow_atlas_texture.is_null()) { shadow_atlas_texture = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK); @@ -1865,8 +826,8 @@ void RendererSceneRenderRD::_render_buffers_debug_draw(Ref<RenderSceneBuffersRD> } if (debug_draw == RS::VIEWPORT_DEBUG_DRAW_DIRECTIONAL_SHADOW_ATLAS) { - if (directional_shadow_get_texture().is_valid()) { - RID shadow_atlas_texture = directional_shadow_get_texture(); + if (RendererRD::LightStorage::get_singleton()->directional_shadow_get_texture().is_valid()) { + RID shadow_atlas_texture = RendererRD::LightStorage::get_singleton()->directional_shadow_get_texture(); Size2 rtsize = texture_storage->render_target_get_size(render_target); copy_effects->copy_to_fb_rect(shadow_atlas_texture, texture_storage->render_target_get_rd_framebuffer(render_target), Rect2i(Vector2(), rtsize / 2), false, true); @@ -1891,28 +852,11 @@ void RendererSceneRenderRD::_render_buffers_debug_draw(Ref<RenderSceneBuffersRD> } } - if (debug_draw == RS::VIEWPORT_DEBUG_DRAW_SSAO && p_render_buffers->ss_effects.ssao.ao_final.is_valid()) { - Size2 rtsize = texture_storage->render_target_get_size(render_target); - copy_effects->copy_to_fb_rect(p_render_buffers->ss_effects.ssao.ao_final, texture_storage->render_target_get_rd_framebuffer(render_target), Rect2(Vector2(), rtsize), false, true); - } - - if (debug_draw == RS::VIEWPORT_DEBUG_DRAW_SSIL && p_render_buffers->ss_effects.ssil.ssil_final.is_valid()) { - Size2 rtsize = texture_storage->render_target_get_size(render_target); - copy_effects->copy_to_fb_rect(p_render_buffers->ss_effects.ssil.ssil_final, texture_storage->render_target_get_rd_framebuffer(render_target), Rect2(Vector2(), rtsize), false, false); - } - if (debug_draw == RS::VIEWPORT_DEBUG_DRAW_NORMAL_BUFFER && _render_buffers_get_normal_texture(p_render_buffers).is_valid()) { Size2 rtsize = texture_storage->render_target_get_size(render_target); copy_effects->copy_to_fb_rect(_render_buffers_get_normal_texture(p_render_buffers), texture_storage->render_target_get_rd_framebuffer(render_target), Rect2(Vector2(), rtsize), false, false); } - if (debug_draw == RS::VIEWPORT_DEBUG_DRAW_GI_BUFFER && p_render_buffers->has_texture(RB_SCOPE_GI, RB_TEX_AMBIENT)) { - Size2 rtsize = texture_storage->render_target_get_size(render_target); - RID ambient_texture = p_render_buffers->get_texture(RB_SCOPE_GI, RB_TEX_AMBIENT); - RID reflection_texture = p_render_buffers->get_texture(RB_SCOPE_GI, RB_TEX_REFLECTION); - copy_effects->copy_to_fb_rect(ambient_texture, texture_storage->render_target_get_rd_framebuffer(render_target), Rect2(Vector2(), rtsize), false, false, false, true, reflection_texture, p_render_buffers->get_view_count() > 1); - } - if (debug_draw == RS::VIEWPORT_DEBUG_DRAW_OCCLUDERS) { if (p_occlusion_buffer.is_valid()) { Size2 rtsize = texture_storage->render_target_get_size(render_target); @@ -1946,19 +890,6 @@ void RendererSceneRenderRD::gi_set_use_half_resolution(bool p_enable) { gi.half_resolution = p_enable; } -void RendererSceneRenderRD::sub_surface_scattering_set_quality(RS::SubSurfaceScatteringQuality p_quality) { - sss_quality = p_quality; -} - -RS::SubSurfaceScatteringQuality RendererSceneRenderRD::sub_surface_scattering_get_quality() const { - return sss_quality; -} - -void RendererSceneRenderRD::sub_surface_scattering_set_scale(float p_scale, float p_depth_scale) { - sss_scale = p_scale; - sss_depth_scale = p_depth_scale; -} - void RendererSceneRenderRD::positional_soft_shadow_filter_set_quality(RS::ShadowQuality p_quality) { ERR_FAIL_INDEX_MSG(p_quality, RS::SHADOW_QUALITY_MAX, "Shadow quality too high, please see RenderingServer's ShadowQuality enum"); @@ -2076,788 +1007,31 @@ bool RendererSceneRenderRD::is_using_radiance_cubemap_array() const { return sky.sky_use_cubemap_array; } -void RendererSceneRenderRD::_setup_reflections(RenderDataRD *p_render_data, const PagedArray<RID> &p_reflections, const Transform3D &p_camera_inverse_transform, RID p_environment) { - RendererRD::LightStorage *light_storage = RendererRD::LightStorage::get_singleton(); - cluster.reflection_count = 0; - - for (uint32_t i = 0; i < (uint32_t)p_reflections.size(); i++) { - if (cluster.reflection_count == cluster.max_reflections) { - break; - } - - ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_reflections[i]); - if (!rpi) { - continue; - } - - cluster.reflection_sort[cluster.reflection_count].instance = rpi; - cluster.reflection_sort[cluster.reflection_count].depth = -p_camera_inverse_transform.xform(rpi->transform.origin).z; - cluster.reflection_count++; - } - - if (cluster.reflection_count > 0) { - SortArray<Cluster::InstanceSort<ReflectionProbeInstance>> sort_array; - sort_array.sort(cluster.reflection_sort, cluster.reflection_count); - } - - bool using_forward_ids = _uses_forward_ids(); - for (uint32_t i = 0; i < cluster.reflection_count; i++) { - ReflectionProbeInstance *rpi = cluster.reflection_sort[i].instance; - - if (using_forward_ids) { - _map_forward_id(FORWARD_ID_TYPE_REFLECTION_PROBE, rpi->forward_id, i); - } - - RID base_probe = rpi->probe; - - Cluster::ReflectionData &reflection_ubo = cluster.reflections[i]; - - Vector3 extents = light_storage->reflection_probe_get_extents(base_probe); - - rpi->cull_mask = light_storage->reflection_probe_get_cull_mask(base_probe); - - reflection_ubo.box_extents[0] = extents.x; - reflection_ubo.box_extents[1] = extents.y; - reflection_ubo.box_extents[2] = extents.z; - reflection_ubo.index = rpi->atlas_index; - - Vector3 origin_offset = light_storage->reflection_probe_get_origin_offset(base_probe); - - reflection_ubo.box_offset[0] = origin_offset.x; - reflection_ubo.box_offset[1] = origin_offset.y; - reflection_ubo.box_offset[2] = origin_offset.z; - reflection_ubo.mask = light_storage->reflection_probe_get_cull_mask(base_probe); - - reflection_ubo.intensity = light_storage->reflection_probe_get_intensity(base_probe); - reflection_ubo.ambient_mode = light_storage->reflection_probe_get_ambient_mode(base_probe); - - reflection_ubo.exterior = !light_storage->reflection_probe_is_interior(base_probe); - reflection_ubo.box_project = light_storage->reflection_probe_is_box_projection(base_probe); - reflection_ubo.exposure_normalization = 1.0; - - if (p_render_data->camera_attributes.is_valid()) { - float exposure = RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor(p_render_data->camera_attributes); - reflection_ubo.exposure_normalization = exposure / light_storage->reflection_probe_get_baked_exposure(base_probe); - } - - Color ambient_linear = light_storage->reflection_probe_get_ambient_color(base_probe).srgb_to_linear(); - float interior_ambient_energy = light_storage->reflection_probe_get_ambient_color_energy(base_probe); - reflection_ubo.ambient[0] = ambient_linear.r * interior_ambient_energy; - reflection_ubo.ambient[1] = ambient_linear.g * interior_ambient_energy; - reflection_ubo.ambient[2] = ambient_linear.b * interior_ambient_energy; - - Transform3D transform = rpi->transform; - Transform3D proj = (p_camera_inverse_transform * transform).inverse(); - RendererRD::MaterialStorage::store_transform(proj, reflection_ubo.local_matrix); - - if (current_cluster_builder != nullptr) { - current_cluster_builder->add_box(ClusterBuilderRD::BOX_TYPE_REFLECTION_PROBE, transform, extents); - } - - rpi->last_pass = RSG::rasterizer->get_frame_number(); - } - - if (cluster.reflection_count) { - RD::get_singleton()->buffer_update(cluster.reflection_buffer, 0, cluster.reflection_count * sizeof(Cluster::ReflectionData), cluster.reflections, RD::BARRIER_MASK_RASTER | RD::BARRIER_MASK_COMPUTE); - } -} - -void RendererSceneRenderRD::_setup_lights(RenderDataRD *p_render_data, const PagedArray<RID> &p_lights, const Transform3D &p_camera_transform, RID p_shadow_atlas, bool p_using_shadows, uint32_t &r_directional_light_count, uint32_t &r_positional_light_count, bool &r_directional_light_soft_shadows) { - RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton(); - RendererRD::LightStorage *light_storage = RendererRD::LightStorage::get_singleton(); - - Transform3D inverse_transform = p_camera_transform.affine_inverse(); - - r_directional_light_count = 0; - r_positional_light_count = 0; - - Plane camera_plane(-p_camera_transform.basis.get_column(Vector3::AXIS_Z).normalized(), p_camera_transform.origin); - - cluster.omni_light_count = 0; - cluster.spot_light_count = 0; - - r_directional_light_soft_shadows = false; +void RendererSceneRenderRD::_update_vrs(Ref<RenderSceneBuffersRD> p_render_buffers) { + if (p_render_buffers.is_valid() && vrs) { + RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton(); - for (int i = 0; i < (int)p_lights.size(); i++) { - LightInstance *li = light_instance_owner.get_or_null(p_lights[i]); - if (!li) { - continue; - } - RID base = li->light; - - ERR_CONTINUE(base.is_null()); - - RS::LightType type = light_storage->light_get_type(base); - switch (type) { - case RS::LIGHT_DIRECTIONAL: { - if (r_directional_light_count >= cluster.max_directional_lights || light_storage->light_directional_get_sky_mode(base) == RS::LIGHT_DIRECTIONAL_SKY_MODE_SKY_ONLY) { - continue; - } - - Cluster::DirectionalLightData &light_data = cluster.directional_lights[r_directional_light_count]; - - Transform3D light_transform = li->transform; - - Vector3 direction = inverse_transform.basis.xform(light_transform.basis.xform(Vector3(0, 0, 1))).normalized(); - - light_data.direction[0] = direction.x; - light_data.direction[1] = direction.y; - light_data.direction[2] = direction.z; - - float sign = light_storage->light_is_negative(base) ? -1 : 1; - - light_data.energy = sign * light_storage->light_get_param(base, RS::LIGHT_PARAM_ENERGY); - - if (is_using_physical_light_units()) { - light_data.energy *= light_storage->light_get_param(base, RS::LIGHT_PARAM_INTENSITY); - } else { - light_data.energy *= Math_PI; - } - - if (p_render_data->camera_attributes.is_valid()) { - light_data.energy *= RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor(p_render_data->camera_attributes); - } - - Color linear_col = light_storage->light_get_color(base).srgb_to_linear(); - light_data.color[0] = linear_col.r; - light_data.color[1] = linear_col.g; - light_data.color[2] = linear_col.b; - - light_data.specular = light_storage->light_get_param(base, RS::LIGHT_PARAM_SPECULAR); - light_data.volumetric_fog_energy = light_storage->light_get_param(base, RS::LIGHT_PARAM_VOLUMETRIC_FOG_ENERGY); - light_data.mask = light_storage->light_get_cull_mask(base); - - float size = light_storage->light_get_param(base, RS::LIGHT_PARAM_SIZE); - - light_data.size = 1.0 - Math::cos(Math::deg_to_rad(size)); //angle to cosine offset - - if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_PSSM_SPLITS) { - WARN_PRINT_ONCE("The DirectionalLight3D PSSM splits debug draw mode is not reimplemented yet."); - } - - light_data.shadow_opacity = (p_using_shadows && light_storage->light_has_shadow(base)) - ? light_storage->light_get_param(base, RS::LIGHT_PARAM_SHADOW_OPACITY) - : 0.0; - - float angular_diameter = light_storage->light_get_param(base, RS::LIGHT_PARAM_SIZE); - if (angular_diameter > 0.0) { - // I know tan(0) is 0, but let's not risk it with numerical precision. - // technically this will keep expanding until reaching the sun, but all we care - // is expand until we reach the radius of the near plane (there can't be more occluders than that) - angular_diameter = Math::tan(Math::deg_to_rad(angular_diameter)); - if (light_storage->light_has_shadow(base) && light_storage->light_get_param(base, RS::LIGHT_PARAM_SHADOW_BLUR) > 0.0) { - // Only enable PCSS-like soft shadows if blurring is enabled. - // Otherwise, performance would decrease with no visual difference. - r_directional_light_soft_shadows = true; - } - } else { - angular_diameter = 0.0; - } - - if (light_data.shadow_opacity > 0.001) { - RS::LightDirectionalShadowMode smode = light_storage->light_directional_get_shadow_mode(base); - - int limit = smode == RS::LIGHT_DIRECTIONAL_SHADOW_ORTHOGONAL ? 0 : (smode == RS::LIGHT_DIRECTIONAL_SHADOW_PARALLEL_2_SPLITS ? 1 : 3); - light_data.blend_splits = (smode != RS::LIGHT_DIRECTIONAL_SHADOW_ORTHOGONAL) && light_storage->light_directional_get_blend_splits(base); - for (int j = 0; j < 4; j++) { - Rect2 atlas_rect = li->shadow_transform[j].atlas_rect; - Projection matrix = li->shadow_transform[j].camera; - float split = li->shadow_transform[MIN(limit, j)].split; - - Projection bias; - bias.set_light_bias(); - Projection rectm; - rectm.set_light_atlas_rect(atlas_rect); - - Transform3D modelview = (inverse_transform * li->shadow_transform[j].transform).inverse(); - - Projection shadow_mtx = rectm * bias * matrix * modelview; - light_data.shadow_split_offsets[j] = split; - float bias_scale = li->shadow_transform[j].bias_scale; - light_data.shadow_bias[j] = light_storage->light_get_param(base, RS::LIGHT_PARAM_SHADOW_BIAS) / 100.0 * bias_scale; - light_data.shadow_normal_bias[j] = light_storage->light_get_param(base, RS::LIGHT_PARAM_SHADOW_NORMAL_BIAS) * li->shadow_transform[j].shadow_texel_size; - light_data.shadow_transmittance_bias[j] = light_storage->light_get_transmittance_bias(base) * bias_scale; - light_data.shadow_z_range[j] = li->shadow_transform[j].farplane; - light_data.shadow_range_begin[j] = li->shadow_transform[j].range_begin; - RendererRD::MaterialStorage::store_camera(shadow_mtx, light_data.shadow_matrices[j]); - - Vector2 uv_scale = li->shadow_transform[j].uv_scale; - uv_scale *= atlas_rect.size; //adapt to atlas size - switch (j) { - case 0: { - light_data.uv_scale1[0] = uv_scale.x; - light_data.uv_scale1[1] = uv_scale.y; - } break; - case 1: { - light_data.uv_scale2[0] = uv_scale.x; - light_data.uv_scale2[1] = uv_scale.y; - } break; - case 2: { - light_data.uv_scale3[0] = uv_scale.x; - light_data.uv_scale3[1] = uv_scale.y; - } break; - case 3: { - light_data.uv_scale4[0] = uv_scale.x; - light_data.uv_scale4[1] = uv_scale.y; - } break; - } - } - - float fade_start = light_storage->light_get_param(base, RS::LIGHT_PARAM_SHADOW_FADE_START); - light_data.fade_from = -light_data.shadow_split_offsets[3] * MIN(fade_start, 0.999); //using 1.0 would break smoothstep - light_data.fade_to = -light_data.shadow_split_offsets[3]; - - light_data.soft_shadow_scale = light_storage->light_get_param(base, RS::LIGHT_PARAM_SHADOW_BLUR); - light_data.softshadow_angle = angular_diameter; - light_data.bake_mode = light_storage->light_get_bake_mode(base); - - if (angular_diameter <= 0.0) { - light_data.soft_shadow_scale *= directional_shadow_quality_radius_get(); // Only use quality radius for PCF - } - } - - r_directional_light_count++; - } break; - case RS::LIGHT_OMNI: { - if (cluster.omni_light_count >= cluster.max_lights) { - continue; - } - - const real_t distance = camera_plane.distance_to(li->transform.origin); - - if (light_storage->light_is_distance_fade_enabled(li->light)) { - const float fade_begin = light_storage->light_get_distance_fade_begin(li->light); - const float fade_length = light_storage->light_get_distance_fade_length(li->light); - - if (distance > fade_begin) { - if (distance > fade_begin + fade_length) { - // Out of range, don't draw this light to improve performance. - continue; - } - } - } - - cluster.omni_light_sort[cluster.omni_light_count].instance = li; - cluster.omni_light_sort[cluster.omni_light_count].depth = distance; - cluster.omni_light_count++; - } break; - case RS::LIGHT_SPOT: { - if (cluster.spot_light_count >= cluster.max_lights) { - continue; - } - - const real_t distance = camera_plane.distance_to(li->transform.origin); - - if (light_storage->light_is_distance_fade_enabled(li->light)) { - const float fade_begin = light_storage->light_get_distance_fade_begin(li->light); - const float fade_length = light_storage->light_get_distance_fade_length(li->light); - - if (distance > fade_begin) { - if (distance > fade_begin + fade_length) { - // Out of range, don't draw this light to improve performance. - continue; - } - } - } - - cluster.spot_light_sort[cluster.spot_light_count].instance = li; - cluster.spot_light_sort[cluster.spot_light_count].depth = distance; - cluster.spot_light_count++; - } break; - } - - li->last_pass = RSG::rasterizer->get_frame_number(); - } - - if (cluster.omni_light_count) { - SortArray<Cluster::InstanceSort<LightInstance>> sorter; - sorter.sort(cluster.omni_light_sort, cluster.omni_light_count); - } - - if (cluster.spot_light_count) { - SortArray<Cluster::InstanceSort<LightInstance>> sorter; - sorter.sort(cluster.spot_light_sort, cluster.spot_light_count); - } - - ShadowAtlas *shadow_atlas = nullptr; - - if (p_shadow_atlas.is_valid() && p_using_shadows) { - shadow_atlas = shadow_atlas_owner.get_or_null(p_shadow_atlas); - } - - bool using_forward_ids = _uses_forward_ids(); - - for (uint32_t i = 0; i < (cluster.omni_light_count + cluster.spot_light_count); i++) { - uint32_t index = (i < cluster.omni_light_count) ? i : i - (cluster.omni_light_count); - Cluster::LightData &light_data = (i < cluster.omni_light_count) ? cluster.omni_lights[index] : cluster.spot_lights[index]; - RS::LightType type = (i < cluster.omni_light_count) ? RS::LIGHT_OMNI : RS::LIGHT_SPOT; - LightInstance *li = (i < cluster.omni_light_count) ? cluster.omni_light_sort[index].instance : cluster.spot_light_sort[index].instance; - RID base = li->light; - - if (using_forward_ids) { - _map_forward_id(type == RS::LIGHT_OMNI ? FORWARD_ID_TYPE_OMNI_LIGHT : FORWARD_ID_TYPE_SPOT_LIGHT, li->forward_id, index); - } - - Transform3D light_transform = li->transform; - - float sign = light_storage->light_is_negative(base) ? -1 : 1; - Color linear_col = light_storage->light_get_color(base).srgb_to_linear(); - - light_data.attenuation = light_storage->light_get_param(base, RS::LIGHT_PARAM_ATTENUATION); - - // Reuse fade begin, fade length and distance for shadow LOD determination later. - float fade_begin = 0.0; - float fade_shadow = 0.0; - float fade_length = 0.0; - real_t distance = 0.0; - - float fade = 1.0; - float shadow_opacity_fade = 1.0; - if (light_storage->light_is_distance_fade_enabled(li->light)) { - fade_begin = light_storage->light_get_distance_fade_begin(li->light); - fade_shadow = light_storage->light_get_distance_fade_shadow(li->light); - fade_length = light_storage->light_get_distance_fade_length(li->light); - distance = camera_plane.distance_to(li->transform.origin); - - // Use `smoothstep()` to make opacity changes more gradual and less noticeable to the player. - if (distance > fade_begin) { - fade = Math::smoothstep(0.0f, 1.0f, 1.0f - float(distance - fade_begin) / fade_length); - } - - if (distance > fade_shadow) { - shadow_opacity_fade = Math::smoothstep(0.0f, 1.0f, 1.0f - float(distance - fade_shadow) / fade_length); - } - } - - float energy = sign * light_storage->light_get_param(base, RS::LIGHT_PARAM_ENERGY) * fade; - - if (is_using_physical_light_units()) { - energy *= light_storage->light_get_param(base, RS::LIGHT_PARAM_INTENSITY); - - // Convert from Luminous Power to Luminous Intensity - if (type == RS::LIGHT_OMNI) { - energy *= 1.0 / (Math_PI * 4.0); - } else { - // Spot Lights are not physically accurate, Luminous Intensity should change in relation to the cone angle. - // We make this assumption to keep them easy to control. - energy *= 1.0 / Math_PI; - } - } else { - energy *= Math_PI; - } - - if (p_render_data->camera_attributes.is_valid()) { - energy *= RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor(p_render_data->camera_attributes); - } - - light_data.color[0] = linear_col.r * energy; - light_data.color[1] = linear_col.g * energy; - light_data.color[2] = linear_col.b * energy; - light_data.specular_amount = light_storage->light_get_param(base, RS::LIGHT_PARAM_SPECULAR) * 2.0; - light_data.volumetric_fog_energy = light_storage->light_get_param(base, RS::LIGHT_PARAM_VOLUMETRIC_FOG_ENERGY); - light_data.bake_mode = light_storage->light_get_bake_mode(base); - - float radius = MAX(0.001, light_storage->light_get_param(base, RS::LIGHT_PARAM_RANGE)); - light_data.inv_radius = 1.0 / radius; - - Vector3 pos = inverse_transform.xform(light_transform.origin); - - light_data.position[0] = pos.x; - light_data.position[1] = pos.y; - light_data.position[2] = pos.z; - - Vector3 direction = inverse_transform.basis.xform(light_transform.basis.xform(Vector3(0, 0, -1))).normalized(); - - light_data.direction[0] = direction.x; - light_data.direction[1] = direction.y; - light_data.direction[2] = direction.z; - - float size = light_storage->light_get_param(base, RS::LIGHT_PARAM_SIZE); - - light_data.size = size; - - light_data.inv_spot_attenuation = 1.0f / light_storage->light_get_param(base, RS::LIGHT_PARAM_SPOT_ATTENUATION); - float spot_angle = light_storage->light_get_param(base, RS::LIGHT_PARAM_SPOT_ANGLE); - light_data.cos_spot_angle = Math::cos(Math::deg_to_rad(spot_angle)); - - light_data.mask = light_storage->light_get_cull_mask(base); - - light_data.atlas_rect[0] = 0; - light_data.atlas_rect[1] = 0; - light_data.atlas_rect[2] = 0; - light_data.atlas_rect[3] = 0; - - RID projector = light_storage->light_get_projector(base); - - if (projector.is_valid()) { - Rect2 rect = texture_storage->decal_atlas_get_texture_rect(projector); - - if (type == RS::LIGHT_SPOT) { - light_data.projector_rect[0] = rect.position.x; - light_data.projector_rect[1] = rect.position.y + rect.size.height; //flip because shadow is flipped - light_data.projector_rect[2] = rect.size.width; - light_data.projector_rect[3] = -rect.size.height; - } else { - light_data.projector_rect[0] = rect.position.x; - light_data.projector_rect[1] = rect.position.y; - light_data.projector_rect[2] = rect.size.width; - light_data.projector_rect[3] = rect.size.height * 0.5; //used by dp, so needs to be half - } - } else { - light_data.projector_rect[0] = 0; - light_data.projector_rect[1] = 0; - light_data.projector_rect[2] = 0; - light_data.projector_rect[3] = 0; - } - - const bool needs_shadow = - shadow_atlas && - shadow_atlas->shadow_owners.has(li->self) && - p_using_shadows && - light_storage->light_has_shadow(base); - - bool in_shadow_range = true; - if (needs_shadow && light_storage->light_is_distance_fade_enabled(li->light)) { - if (distance > light_storage->light_get_distance_fade_shadow(li->light) + light_storage->light_get_distance_fade_length(li->light)) { - // Out of range, don't draw shadows to improve performance. - in_shadow_range = false; - } - } - - if (needs_shadow && in_shadow_range) { - // fill in the shadow information - - light_data.shadow_opacity = light_storage->light_get_param(base, RS::LIGHT_PARAM_SHADOW_OPACITY) * shadow_opacity_fade; - - float shadow_texel_size = light_instance_get_shadow_texel_size(li->self, p_shadow_atlas); - light_data.shadow_normal_bias = light_storage->light_get_param(base, RS::LIGHT_PARAM_SHADOW_NORMAL_BIAS) * shadow_texel_size * 10.0; - - if (type == RS::LIGHT_SPOT) { - light_data.shadow_bias = light_storage->light_get_param(base, RS::LIGHT_PARAM_SHADOW_BIAS) / 100.0; - } else { //omni - light_data.shadow_bias = light_storage->light_get_param(base, RS::LIGHT_PARAM_SHADOW_BIAS); - } - - light_data.transmittance_bias = light_storage->light_get_transmittance_bias(base); - - Vector2i omni_offset; - Rect2 rect = light_instance_get_shadow_atlas_rect(li->self, p_shadow_atlas, omni_offset); - - light_data.atlas_rect[0] = rect.position.x; - light_data.atlas_rect[1] = rect.position.y; - light_data.atlas_rect[2] = rect.size.width; - light_data.atlas_rect[3] = rect.size.height; - - light_data.soft_shadow_scale = light_storage->light_get_param(base, RS::LIGHT_PARAM_SHADOW_BLUR); - - if (type == RS::LIGHT_OMNI) { - Transform3D proj = (inverse_transform * light_transform).inverse(); - - RendererRD::MaterialStorage::store_transform(proj, light_data.shadow_matrix); - - if (size > 0.0 && light_data.soft_shadow_scale > 0.0) { - // Only enable PCSS-like soft shadows if blurring is enabled. - // Otherwise, performance would decrease with no visual difference. - light_data.soft_shadow_size = size; - } else { - light_data.soft_shadow_size = 0.0; - light_data.soft_shadow_scale *= shadows_quality_radius_get(); // Only use quality radius for PCF - } - - light_data.direction[0] = omni_offset.x * float(rect.size.width); - light_data.direction[1] = omni_offset.y * float(rect.size.height); - } else if (type == RS::LIGHT_SPOT) { - Transform3D modelview = (inverse_transform * light_transform).inverse(); - Projection bias; - bias.set_light_bias(); - - Projection shadow_mtx = bias * li->shadow_transform[0].camera * modelview; - RendererRD::MaterialStorage::store_camera(shadow_mtx, light_data.shadow_matrix); - - if (size > 0.0 && light_data.soft_shadow_scale > 0.0) { - // Only enable PCSS-like soft shadows if blurring is enabled. - // Otherwise, performance would decrease with no visual difference. - Projection cm = li->shadow_transform[0].camera; - float half_np = cm.get_z_near() * Math::tan(Math::deg_to_rad(spot_angle)); - light_data.soft_shadow_size = (size * 0.5 / radius) / (half_np / cm.get_z_near()) * rect.size.width; - } else { - light_data.soft_shadow_size = 0.0; - light_data.soft_shadow_scale *= shadows_quality_radius_get(); // Only use quality radius for PCF - } - } - } else { - light_data.shadow_opacity = 0.0; - } - - li->cull_mask = light_storage->light_get_cull_mask(base); - - if (current_cluster_builder != nullptr) { - current_cluster_builder->add_light(type == RS::LIGHT_SPOT ? ClusterBuilderRD::LIGHT_TYPE_SPOT : ClusterBuilderRD::LIGHT_TYPE_OMNI, light_transform, radius, spot_angle); - } - - r_positional_light_count++; - } - - //update without barriers - if (cluster.omni_light_count) { - RD::get_singleton()->buffer_update(cluster.omni_light_buffer, 0, sizeof(Cluster::LightData) * cluster.omni_light_count, cluster.omni_lights, RD::BARRIER_MASK_RASTER | RD::BARRIER_MASK_COMPUTE); - } - - if (cluster.spot_light_count) { - RD::get_singleton()->buffer_update(cluster.spot_light_buffer, 0, sizeof(Cluster::LightData) * cluster.spot_light_count, cluster.spot_lights, RD::BARRIER_MASK_RASTER | RD::BARRIER_MASK_COMPUTE); - } - - if (r_directional_light_count) { - RD::get_singleton()->buffer_update(cluster.directional_light_buffer, 0, sizeof(Cluster::DirectionalLightData) * r_directional_light_count, cluster.directional_lights, RD::BARRIER_MASK_RASTER | RD::BARRIER_MASK_COMPUTE); - } -} - -void RendererSceneRenderRD::_setup_decals(const PagedArray<RID> &p_decals, const Transform3D &p_camera_inverse_xform) { - RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton(); - - Transform3D uv_xform; - uv_xform.basis.scale(Vector3(2.0, 1.0, 2.0)); - uv_xform.origin = Vector3(-1.0, 0.0, -1.0); - - uint32_t decal_count = p_decals.size(); - - cluster.decal_count = 0; - - for (uint32_t i = 0; i < decal_count; i++) { - if (cluster.decal_count == cluster.max_decals) { - break; - } - - DecalInstance *di = decal_instance_owner.get_or_null(p_decals[i]); - if (!di) { - continue; - } - RID decal = di->decal; - - Transform3D xform = di->transform; - - real_t distance = -p_camera_inverse_xform.xform(xform.origin).z; - - if (texture_storage->decal_is_distance_fade_enabled(decal)) { - float fade_begin = texture_storage->decal_get_distance_fade_begin(decal); - float fade_length = texture_storage->decal_get_distance_fade_length(decal); - - if (distance > fade_begin) { - if (distance > fade_begin + fade_length) { - continue; // do not use this decal, its invisible - } - } - } - - cluster.decal_sort[cluster.decal_count].instance = di; - cluster.decal_sort[cluster.decal_count].depth = distance; - cluster.decal_count++; - } - - if (cluster.decal_count > 0) { - SortArray<Cluster::InstanceSort<DecalInstance>> sort_array; - sort_array.sort(cluster.decal_sort, cluster.decal_count); - } - - bool using_forward_ids = _uses_forward_ids(); - for (uint32_t i = 0; i < cluster.decal_count; i++) { - DecalInstance *di = cluster.decal_sort[i].instance; - RID decal = di->decal; - - if (using_forward_ids) { - _map_forward_id(FORWARD_ID_TYPE_DECAL, di->forward_id, i); - } - - di->cull_mask = texture_storage->decal_get_cull_mask(decal); - - Transform3D xform = di->transform; - float fade = 1.0; - - if (texture_storage->decal_is_distance_fade_enabled(decal)) { - const real_t distance = -p_camera_inverse_xform.xform(xform.origin).z; - const float fade_begin = texture_storage->decal_get_distance_fade_begin(decal); - const float fade_length = texture_storage->decal_get_distance_fade_length(decal); - - if (distance > fade_begin) { - // Use `smoothstep()` to make opacity changes more gradual and less noticeable to the player. - fade = Math::smoothstep(0.0f, 1.0f, 1.0f - float(distance - fade_begin) / fade_length); - } - } - - Cluster::DecalData &dd = cluster.decals[i]; - - Vector3 decal_extents = texture_storage->decal_get_extents(decal); - - Transform3D scale_xform; - scale_xform.basis.scale(decal_extents); - Transform3D to_decal_xform = (p_camera_inverse_xform * di->transform * scale_xform * uv_xform).affine_inverse(); - RendererRD::MaterialStorage::store_transform(to_decal_xform, dd.xform); - - Vector3 normal = xform.basis.get_column(Vector3::AXIS_Y).normalized(); - normal = p_camera_inverse_xform.basis.xform(normal); //camera is normalized, so fine - - dd.normal[0] = normal.x; - dd.normal[1] = normal.y; - dd.normal[2] = normal.z; - dd.normal_fade = texture_storage->decal_get_normal_fade(decal); - - RID albedo_tex = texture_storage->decal_get_texture(decal, RS::DECAL_TEXTURE_ALBEDO); - RID emission_tex = texture_storage->decal_get_texture(decal, RS::DECAL_TEXTURE_EMISSION); - if (albedo_tex.is_valid()) { - Rect2 rect = texture_storage->decal_atlas_get_texture_rect(albedo_tex); - dd.albedo_rect[0] = rect.position.x; - dd.albedo_rect[1] = rect.position.y; - dd.albedo_rect[2] = rect.size.x; - dd.albedo_rect[3] = rect.size.y; - } else { - if (!emission_tex.is_valid()) { - continue; //no albedo, no emission, no decal. - } - dd.albedo_rect[0] = 0; - dd.albedo_rect[1] = 0; - dd.albedo_rect[2] = 0; - dd.albedo_rect[3] = 0; - } - - RID normal_tex = texture_storage->decal_get_texture(decal, RS::DECAL_TEXTURE_NORMAL); - - if (normal_tex.is_valid()) { - Rect2 rect = texture_storage->decal_atlas_get_texture_rect(normal_tex); - dd.normal_rect[0] = rect.position.x; - dd.normal_rect[1] = rect.position.y; - dd.normal_rect[2] = rect.size.x; - dd.normal_rect[3] = rect.size.y; - - Basis normal_xform = p_camera_inverse_xform.basis * xform.basis.orthonormalized(); - RendererRD::MaterialStorage::store_basis_3x4(normal_xform, dd.normal_xform); - } else { - dd.normal_rect[0] = 0; - dd.normal_rect[1] = 0; - dd.normal_rect[2] = 0; - dd.normal_rect[3] = 0; - } - - RID orm_tex = texture_storage->decal_get_texture(decal, RS::DECAL_TEXTURE_ORM); - if (orm_tex.is_valid()) { - Rect2 rect = texture_storage->decal_atlas_get_texture_rect(orm_tex); - dd.orm_rect[0] = rect.position.x; - dd.orm_rect[1] = rect.position.y; - dd.orm_rect[2] = rect.size.x; - dd.orm_rect[3] = rect.size.y; - } else { - dd.orm_rect[0] = 0; - dd.orm_rect[1] = 0; - dd.orm_rect[2] = 0; - dd.orm_rect[3] = 0; - } - - if (emission_tex.is_valid()) { - Rect2 rect = texture_storage->decal_atlas_get_texture_rect(emission_tex); - dd.emission_rect[0] = rect.position.x; - dd.emission_rect[1] = rect.position.y; - dd.emission_rect[2] = rect.size.x; - dd.emission_rect[3] = rect.size.y; - } else { - dd.emission_rect[0] = 0; - dd.emission_rect[1] = 0; - dd.emission_rect[2] = 0; - dd.emission_rect[3] = 0; - } - - Color modulate = texture_storage->decal_get_modulate(decal); - dd.modulate[0] = modulate.r; - dd.modulate[1] = modulate.g; - dd.modulate[2] = modulate.b; - dd.modulate[3] = modulate.a * fade; - dd.emission_energy = texture_storage->decal_get_emission_energy(decal) * fade; - dd.albedo_mix = texture_storage->decal_get_albedo_mix(decal); - dd.mask = texture_storage->decal_get_cull_mask(decal); - dd.upper_fade = texture_storage->decal_get_upper_fade(decal); - dd.lower_fade = texture_storage->decal_get_lower_fade(decal); - - if (current_cluster_builder != nullptr) { - current_cluster_builder->add_box(ClusterBuilderRD::BOX_TYPE_DECAL, xform, decal_extents); - } - } - - if (cluster.decal_count > 0) { - RD::get_singleton()->buffer_update(cluster.decal_buffer, 0, sizeof(Cluster::DecalData) * cluster.decal_count, cluster.decals, RD::BARRIER_MASK_RASTER | RD::BARRIER_MASK_COMPUTE); - } -} - -//////////////////////////////////////////////////////////////////////////////// -// FOG SHADER + RS::ViewportVRSMode vrs_mode = texture_storage->render_target_get_vrs_mode(p_render_buffers->get_render_target()); + if (vrs_mode != RS::VIEWPORT_VRS_DISABLED) { + RID vrs_texture = p_render_buffers->get_texture(RB_SCOPE_VRS, RB_TEXTURE); -void RendererSceneRenderRD::_update_volumetric_fog(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, const Projection &p_cam_projection, const Transform3D &p_cam_transform, const Transform3D &p_prev_cam_inv_transform, RID p_shadow_atlas, int p_directional_light_count, bool p_use_directional_shadows, int p_positional_light_count, int p_voxel_gi_count, const PagedArray<RID> &p_fog_volumes) { - ERR_FAIL_COND(!is_clustered_enabled()); // can't use volumetric fog without clustered - ERR_FAIL_COND(p_render_buffers.is_null()); + // We use get_cache_multipass instead of get_cache_multiview because the default behavior is for + // our vrs_texture to be used as the VRS attachment. In this particular case we're writing to it + // so it needs to be set as our color attachment - // These should be available for our clustered renderer, at some point _update_volumetric_fog should be called by the renderer implemetentation itself - ERR_FAIL_COND(!p_render_buffers->has_custom_data(RB_SCOPE_GI)); - Ref<RendererRD::GI::RenderBuffersGI> rbgi = p_render_buffers->get_custom_data(RB_SCOPE_GI); + Vector<RID> textures; + textures.push_back(vrs_texture); - Ref<RendererRD::GI::SDFGI> sdfgi; - if (p_render_buffers->has_custom_data(RB_SCOPE_SDFGI)) { - sdfgi = p_render_buffers->get_custom_data(RB_SCOPE_SDFGI); - } + Vector<RD::FramebufferPass> passes; + RD::FramebufferPass pass; + pass.color_attachments.push_back(0); + passes.push_back(pass); - Size2i size = p_render_buffers->get_internal_size(); - float ratio = float(size.x) / float((size.x + size.y) / 2); - uint32_t target_width = uint32_t(float(volumetric_fog_size) * ratio); - uint32_t target_height = uint32_t(float(volumetric_fog_size) / ratio); + RID vrs_fb = FramebufferCacheRD::get_singleton()->get_cache_multipass(textures, passes, p_render_buffers->get_view_count()); - if (p_render_buffers->has_custom_data(RB_SCOPE_FOG)) { - Ref<RendererRD::Fog::VolumetricFog> fog = p_render_buffers->get_custom_data(RB_SCOPE_FOG); - //validate - if (p_environment.is_null() || !environment_get_volumetric_fog_enabled(p_environment) || fog->width != target_width || fog->height != target_height || fog->depth != volumetric_fog_depth) { - p_render_buffers->set_custom_data(RB_SCOPE_FOG, Ref<RenderBufferCustomDataRD>()); + vrs->update_vrs_texture(vrs_fb, p_render_buffers->get_render_target()); } } - - if (p_environment.is_null() || !environment_get_volumetric_fog_enabled(p_environment)) { - //no reason to enable or update, bye - return; - } - - if (p_environment.is_valid() && environment_get_volumetric_fog_enabled(p_environment) && !p_render_buffers->has_custom_data(RB_SCOPE_FOG)) { - //required volumetric fog but not existing, create - Ref<RendererRD::Fog::VolumetricFog> fog; - - fog.instantiate(); - fog->init(Vector3i(target_width, target_height, volumetric_fog_depth), sky.sky_shader.default_shader_rd); - - p_render_buffers->set_custom_data(RB_SCOPE_FOG, fog); - } - - if (p_render_buffers->has_custom_data(RB_SCOPE_FOG)) { - Ref<RendererRD::Fog::VolumetricFog> fog = p_render_buffers->get_custom_data(RB_SCOPE_FOG); - - RendererRD::Fog::VolumetricFogSettings settings; - settings.rb_size = size; - settings.time = time; - settings.is_using_radiance_cubemap_array = is_using_radiance_cubemap_array(); - settings.max_cluster_elements = max_cluster_elements; - settings.volumetric_fog_filter_active = volumetric_fog_filter_active; - - settings.shadow_sampler = shadow_sampler; - ShadowAtlas *shadow_atlas = shadow_atlas_owner.get_or_null(p_shadow_atlas); - settings.shadow_atlas_depth = shadow_atlas ? shadow_atlas->depth : RID(); - settings.voxel_gi_buffer = rbgi->get_voxel_gi_buffer(); - settings.omni_light_buffer = get_omni_light_buffer(); - settings.spot_light_buffer = get_spot_light_buffer(); - settings.directional_shadow_depth = directional_shadow.depth; - settings.directional_light_buffer = get_directional_light_buffer(); - - settings.vfog = fog; - settings.cluster_builder = p_render_buffers->cluster_builder; - settings.rbgi = rbgi; - settings.sdfgi = sdfgi; - settings.env = p_environment; - settings.sky = &sky; - settings.gi = &gi; - - RendererRD::Fog::get_singleton()->volumetric_fog_update(settings, p_cam_projection, p_cam_transform, p_prev_cam_inv_transform, p_shadow_atlas, p_directional_light_count, p_use_directional_shadows, p_positional_light_count, p_voxel_gi_count, p_fog_volumes); - } } bool RendererSceneRenderRD::_needs_post_prepass_render(RenderDataRD *p_render_data, bool p_use_gi) { @@ -2888,211 +1062,73 @@ void RendererSceneRenderRD::_pre_resolve_render(RenderDataRD *p_render_data, boo } } -void RendererSceneRenderRD::_pre_opaque_render(RenderDataRD *p_render_data, bool p_use_ssao, bool p_use_ssil, bool p_use_gi, const RID *p_normal_roughness_slices, RID p_voxel_gi_buffer) { - // Render shadows while GI is rendering, due to how barriers are handled, this should happen at the same time +void RendererSceneRenderRD::render_scene(const Ref<RenderSceneBuffers> &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray<RenderGeometryInstance *> &p_instances, const PagedArray<RID> &p_lights, const PagedArray<RID> &p_reflection_probes, const PagedArray<RID> &p_voxel_gi_instances, const PagedArray<RID> &p_decals, const PagedArray<RID> &p_lightmaps, const PagedArray<RID> &p_fog_volumes, RID p_environment, RID p_camera_attributes, RID p_shadow_atlas, RID p_occluder_debug_tex, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, const RenderShadowData *p_render_shadows, int p_render_shadow_count, const RenderSDFGIData *p_render_sdfgi_regions, int p_render_sdfgi_region_count, const RenderSDFGIUpdateData *p_sdfgi_update_data, RenderingMethod::RenderInfo *r_render_info) { RendererRD::LightStorage *light_storage = RendererRD::LightStorage::get_singleton(); + RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton(); - if (p_render_data->render_buffers.is_valid() && p_use_gi && p_render_data->render_buffers->has_custom_data(RB_SCOPE_SDFGI)) { - Ref<RendererRD::GI::SDFGI> sdfgi = p_render_data->render_buffers->get_custom_data(RB_SCOPE_SDFGI); - sdfgi->store_probes(); + // getting this here now so we can direct call a bunch of things more easily + Ref<RenderSceneBuffersRD> rb; + if (p_render_buffers.is_valid()) { + rb = p_render_buffers; // cast it... + ERR_FAIL_COND(rb.is_null()); } - render_state.cube_shadows.clear(); - render_state.shadows.clear(); - render_state.directional_shadows.clear(); - - Plane camera_plane(-p_render_data->cam_transform.basis.get_column(Vector3::AXIS_Z), p_render_data->cam_transform.origin); - float lod_distance_multiplier = p_render_data->cam_projection.get_lod_multiplier(); + // setup scene data + RenderSceneDataRD scene_data; { - for (int i = 0; i < render_state.render_shadow_count; i++) { - LightInstance *li = light_instance_owner.get_or_null(render_state.render_shadows[i].light); - - if (light_storage->light_get_type(li->light) == RS::LIGHT_DIRECTIONAL) { - render_state.directional_shadows.push_back(i); - } else if (light_storage->light_get_type(li->light) == RS::LIGHT_OMNI && light_storage->light_omni_get_shadow_mode(li->light) == RS::LIGHT_OMNI_SHADOW_CUBE) { - render_state.cube_shadows.push_back(i); - } else { - render_state.shadows.push_back(i); - } - } - - //cube shadows are rendered in their own way - for (uint32_t i = 0; i < render_state.cube_shadows.size(); i++) { - _render_shadow_pass(render_state.render_shadows[render_state.cube_shadows[i]].light, p_render_data->shadow_atlas, render_state.render_shadows[render_state.cube_shadows[i]].pass, render_state.render_shadows[render_state.cube_shadows[i]].instances, camera_plane, lod_distance_multiplier, p_render_data->screen_mesh_lod_threshold, true, true, true, p_render_data->render_info); - } - - if (render_state.directional_shadows.size()) { - //open the pass for directional shadows - _update_directional_shadow_atlas(); - RD::get_singleton()->draw_list_begin(directional_shadow.fb, RD::INITIAL_ACTION_DROP, RD::FINAL_ACTION_DISCARD, RD::INITIAL_ACTION_CLEAR, RD::FINAL_ACTION_CONTINUE); - RD::get_singleton()->draw_list_end(); - } - } - - // Render GI - - bool render_shadows = render_state.directional_shadows.size() || render_state.shadows.size(); - bool render_gi = p_render_data->render_buffers.is_valid() && p_use_gi; - - if (render_shadows && render_gi) { - RENDER_TIMESTAMP("Render GI + Render Shadows (Parallel)"); - } else if (render_shadows) { - RENDER_TIMESTAMP("Render Shadows"); - } else if (render_gi) { - RENDER_TIMESTAMP("Render GI"); - } - - //prepare shadow rendering - if (render_shadows) { - _render_shadow_begin(); - - //render directional shadows - for (uint32_t i = 0; i < render_state.directional_shadows.size(); i++) { - _render_shadow_pass(render_state.render_shadows[render_state.directional_shadows[i]].light, p_render_data->shadow_atlas, render_state.render_shadows[render_state.directional_shadows[i]].pass, render_state.render_shadows[render_state.directional_shadows[i]].instances, camera_plane, lod_distance_multiplier, p_render_data->screen_mesh_lod_threshold, false, i == render_state.directional_shadows.size() - 1, false, p_render_data->render_info); - } - //render positional shadows - for (uint32_t i = 0; i < render_state.shadows.size(); i++) { - _render_shadow_pass(render_state.render_shadows[render_state.shadows[i]].light, p_render_data->shadow_atlas, render_state.render_shadows[render_state.shadows[i]].pass, render_state.render_shadows[render_state.shadows[i]].instances, camera_plane, lod_distance_multiplier, p_render_data->screen_mesh_lod_threshold, i == 0, i == render_state.shadows.size() - 1, true, p_render_data->render_info); - } - - _render_shadow_process(); - } - - //start GI - if (render_gi) { - gi.process_gi(p_render_data->render_buffers, p_normal_roughness_slices, p_voxel_gi_buffer, p_render_data->environment, p_render_data->view_count, p_render_data->view_projection, p_render_data->view_eye_offset, p_render_data->cam_transform, *p_render_data->voxel_gi_instances); - } - - //Do shadow rendering (in parallel with GI) - if (render_shadows) { - _render_shadow_end(RD::BARRIER_MASK_NO_BARRIER); - } - - if (render_gi) { - RD::get_singleton()->compute_list_end(RD::BARRIER_MASK_NO_BARRIER); //use a later barrier - } - - if (p_render_data->render_buffers.is_valid() && ss_effects) { - if (p_use_ssao || p_use_ssil) { - Ref<RenderSceneBuffersRD> rb = p_render_data->render_buffers; - ERR_FAIL_COND(rb.is_null()); - Size2i size = rb->get_internal_size(); - - bool invalidate_uniform_set = false; - if (rb->ss_effects.linear_depth.is_null()) { - RD::TextureFormat tf; - tf.format = RD::DATA_FORMAT_R16_SFLOAT; - tf.texture_type = RD::TEXTURE_TYPE_2D_ARRAY; - tf.width = (size.x + 1) / 2; - tf.height = (size.y + 1) / 2; - tf.mipmaps = 5; - tf.array_layers = 4; - tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT; - rb->ss_effects.linear_depth = RD::get_singleton()->texture_create(tf, RD::TextureView()); - RD::get_singleton()->set_resource_name(rb->ss_effects.linear_depth, "SS Effects Depth"); - for (uint32_t i = 0; i < tf.mipmaps; i++) { - RID slice = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), rb->ss_effects.linear_depth, 0, i, 1, RD::TEXTURE_SLICE_2D_ARRAY); - rb->ss_effects.linear_depth_slices.push_back(slice); - RD::get_singleton()->set_resource_name(slice, "SS Effects Depth Mip " + itos(i) + " "); - } - invalidate_uniform_set = true; - } + // Our first camera is used by default + scene_data.cam_transform = p_camera_data->main_transform; + scene_data.cam_projection = p_camera_data->main_projection; + scene_data.cam_orthogonal = p_camera_data->is_orthogonal; + scene_data.taa_jitter = p_camera_data->taa_jitter; - RID depth_texture = rb->get_depth_texture(); - ss_effects->downsample_depth(depth_texture, rb->ss_effects.linear_depth_slices, ssao_quality, ssil_quality, invalidate_uniform_set, ssao_half_size, ssil_half_size, size, p_render_data->cam_projection); + scene_data.view_count = p_camera_data->view_count; + for (uint32_t v = 0; v < p_camera_data->view_count; v++) { + scene_data.view_eye_offset[v] = p_camera_data->view_offset[v].origin; + scene_data.view_projection[v] = p_camera_data->view_projection[v]; } - if (p_use_ssao) { - // TODO make these proper stereo - _process_ssao(p_render_data->render_buffers, p_render_data->environment, p_normal_roughness_slices[0], p_render_data->cam_projection); - } + scene_data.prev_cam_transform = p_prev_camera_data->main_transform; + scene_data.prev_cam_projection = p_prev_camera_data->main_projection; + scene_data.prev_taa_jitter = p_prev_camera_data->taa_jitter; - if (p_use_ssil) { - // TODO make these proper stereo - _process_ssil(p_render_data->render_buffers, p_render_data->environment, p_normal_roughness_slices[0], p_render_data->cam_projection, p_render_data->cam_transform); + for (uint32_t v = 0; v < p_camera_data->view_count; v++) { + scene_data.prev_view_projection[v] = p_prev_camera_data->view_projection[v]; } - } - //full barrier here, we need raster, transfer and compute and it depends from the previous work - RD::get_singleton()->barrier(RD::BARRIER_MASK_ALL, RD::BARRIER_MASK_ALL); - - if (current_cluster_builder) { - current_cluster_builder->begin(p_render_data->cam_transform, p_render_data->cam_projection, !p_render_data->reflection_probe.is_valid()); - } + scene_data.z_near = p_camera_data->main_projection.get_z_near(); + scene_data.z_far = p_camera_data->main_projection.get_z_far(); - bool using_shadows = true; + // this should be the same for all cameras.. + scene_data.lod_distance_multiplier = p_camera_data->main_projection.get_lod_multiplier(); + scene_data.lod_camera_plane = Plane(-p_camera_data->main_transform.basis.get_column(Vector3::AXIS_Z), p_camera_data->main_transform.get_origin()); - if (p_render_data->reflection_probe.is_valid()) { - if (!RSG::light_storage->reflection_probe_renders_shadows(reflection_probe_instance_get_probe(p_render_data->reflection_probe))) { - using_shadows = false; + if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_DISABLE_LOD) { + scene_data.screen_mesh_lod_threshold = 0.0; + } else { + scene_data.screen_mesh_lod_threshold = p_screen_mesh_lod_threshold; } - } else { - //do not render reflections when rendering a reflection probe - _setup_reflections(p_render_data, *p_render_data->reflection_probes, p_render_data->cam_transform.affine_inverse(), p_render_data->environment); - } - - uint32_t directional_light_count = 0; - uint32_t positional_light_count = 0; - _setup_lights(p_render_data, *p_render_data->lights, p_render_data->cam_transform, p_render_data->shadow_atlas, using_shadows, directional_light_count, positional_light_count, p_render_data->directional_light_soft_shadows); - _setup_decals(*p_render_data->decals, p_render_data->cam_transform.affine_inverse()); - - p_render_data->directional_light_count = directional_light_count; - if (current_cluster_builder) { - current_cluster_builder->bake_cluster(); - } - - if (p_render_data->render_buffers.is_valid()) { - bool directional_shadows = false; - for (uint32_t i = 0; i < directional_light_count; i++) { - if (cluster.directional_lights[i].shadow_opacity > 0.001) { - directional_shadows = true; - break; - } + if (p_shadow_atlas.is_valid()) { + int shadow_atlas_size = light_storage->shadow_atlas_get_size(p_shadow_atlas); + scene_data.shadow_atlas_pixel_size.x = 1.0 / shadow_atlas_size; + scene_data.shadow_atlas_pixel_size.y = 1.0 / shadow_atlas_size; } - if (is_volumetric_supported()) { - _update_volumetric_fog(p_render_data->render_buffers, p_render_data->environment, p_render_data->cam_projection, p_render_data->cam_transform, p_render_data->prev_cam_transform.affine_inverse(), p_render_data->shadow_atlas, directional_light_count, directional_shadows, positional_light_count, render_state.voxel_gi_count, *p_render_data->fog_volumes); + { + int directional_shadow_size = light_storage->directional_shadow_get_size(); + scene_data.directional_shadow_pixel_size.x = 1.0 / directional_shadow_size; + scene_data.directional_shadow_pixel_size.y = 1.0 / directional_shadow_size; } - } -} - -void RendererSceneRenderRD::render_scene(const Ref<RenderSceneBuffers> &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray<RenderGeometryInstance *> &p_instances, const PagedArray<RID> &p_lights, const PagedArray<RID> &p_reflection_probes, const PagedArray<RID> &p_voxel_gi_instances, const PagedArray<RID> &p_decals, const PagedArray<RID> &p_lightmaps, const PagedArray<RID> &p_fog_volumes, RID p_environment, RID p_camera_attributes, RID p_shadow_atlas, RID p_occluder_debug_tex, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, const RenderShadowData *p_render_shadows, int p_render_shadow_count, const RenderSDFGIData *p_render_sdfgi_regions, int p_render_sdfgi_region_count, const RenderSDFGIUpdateData *p_sdfgi_update_data, RendererScene::RenderInfo *r_render_info) { - RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton(); - // getting this here now so we can direct call a bunch of things more easily - Ref<RenderSceneBuffersRD> rb; - if (p_render_buffers.is_valid()) { - rb = p_render_buffers; // cast it... - ERR_FAIL_COND(rb.is_null()); + scene_data.time = time; + scene_data.time_step = time_step; } //assign render data RenderDataRD render_data; { render_data.render_buffers = rb; - - // Our first camera is used by default - render_data.cam_transform = p_camera_data->main_transform; - render_data.cam_projection = p_camera_data->main_projection; - render_data.cam_orthogonal = p_camera_data->is_orthogonal; - render_data.taa_jitter = p_camera_data->taa_jitter; - - render_data.view_count = p_camera_data->view_count; - for (uint32_t v = 0; v < p_camera_data->view_count; v++) { - render_data.view_eye_offset[v] = p_camera_data->view_offset[v].origin; - render_data.view_projection[v] = p_camera_data->view_projection[v]; - } - - render_data.prev_cam_transform = p_prev_camera_data->main_transform; - render_data.prev_cam_projection = p_prev_camera_data->main_projection; - render_data.prev_taa_jitter = p_prev_camera_data->taa_jitter; - - for (uint32_t v = 0; v < p_camera_data->view_count; v++) { - render_data.prev_view_projection[v] = p_prev_camera_data->view_projection[v]; - } - - render_data.z_near = p_camera_data->main_projection.get_z_near(); - render_data.z_far = p_camera_data->main_projection.get_z_far(); + render_data.scene_data = &scene_data; render_data.instances = &p_instances; render_data.lights = &p_lights; @@ -3104,25 +1140,17 @@ void RendererSceneRenderRD::render_scene(const Ref<RenderSceneBuffers> &p_render render_data.environment = p_environment; render_data.camera_attributes = p_camera_attributes; render_data.shadow_atlas = p_shadow_atlas; + render_data.occluder_debug_tex = p_occluder_debug_tex; render_data.reflection_atlas = p_reflection_atlas; render_data.reflection_probe = p_reflection_probe; render_data.reflection_probe_pass = p_reflection_probe_pass; - // this should be the same for all cameras.. - render_data.lod_distance_multiplier = p_camera_data->main_projection.get_lod_multiplier(); - render_data.lod_camera_plane = Plane(-p_camera_data->main_transform.basis.get_column(Vector3::AXIS_Z), p_camera_data->main_transform.get_origin()); - - if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_DISABLE_LOD) { - render_data.screen_mesh_lod_threshold = 0.0; - } else { - render_data.screen_mesh_lod_threshold = p_screen_mesh_lod_threshold; - } + render_data.render_shadows = p_render_shadows; + render_data.render_shadow_count = p_render_shadow_count; + render_data.render_sdfgi_regions = p_render_sdfgi_regions; + render_data.render_sdfgi_region_count = p_render_sdfgi_region_count; + render_data.sdfgi_update_data = p_sdfgi_update_data; - render_state.render_shadows = p_render_shadows; - render_state.render_shadow_count = p_render_shadow_count; - render_state.render_sdfgi_regions = p_render_sdfgi_regions; - render_state.render_sdfgi_region_count = p_render_sdfgi_region_count; - render_state.sdfgi_update_data = p_sdfgi_update_data; render_data.render_info = r_render_info; } @@ -3134,22 +1162,6 @@ void RendererSceneRenderRD::render_scene(const Ref<RenderSceneBuffers> &p_render render_data.voxel_gi_instances = ∅ } - //sdfgi first - if (rb.is_valid() && rb->has_custom_data(RB_SCOPE_SDFGI)) { - Ref<RendererRD::GI::SDFGI> sdfgi = rb->get_custom_data(RB_SCOPE_SDFGI); - float exposure_normalization = 1.0; - - if (p_camera_attributes.is_valid()) { - exposure_normalization = RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor(p_camera_attributes); - } - for (int i = 0; i < render_state.render_sdfgi_region_count; i++) { - sdfgi->render_region(rb, render_state.render_sdfgi_regions[i].region, render_state.render_sdfgi_regions[i].instances, this, exposure_normalization); - } - if (render_state.sdfgi_update_data->update_static) { - sdfgi->render_static_lights(&render_data, rb, render_state.sdfgi_update_data->static_cascade_count, p_sdfgi_update_data->static_cascade_indices, render_state.sdfgi_update_data->static_positional_lights, this); - } - } - Color clear_color; if (p_render_buffers.is_valid()) { clear_color = texture_storage->render_target_get_clear_request_color(rb->get_render_target()); @@ -3157,297 +1169,8 @@ void RendererSceneRenderRD::render_scene(const Ref<RenderSceneBuffers> &p_render clear_color = RSG::texture_storage->get_default_clear_color(); } - //assign render indices to voxel_gi_instances - if (is_dynamic_gi_supported()) { - for (uint32_t i = 0; i < (uint32_t)p_voxel_gi_instances.size(); i++) { - gi.voxel_gi_instance_set_render_index(p_voxel_gi_instances[i], i); - } - } - - if (rb.is_valid()) { - // render_data.render_buffers == p_render_buffers so we can use our already retrieved rb - current_cluster_builder = rb->cluster_builder; - } else if (reflection_probe_instance_owner.owns(render_data.reflection_probe)) { - ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(render_data.reflection_probe); - ReflectionAtlas *ra = reflection_atlas_owner.get_or_null(rpi->atlas); - if (!ra) { - ERR_PRINT("reflection probe has no reflection atlas! Bug?"); - current_cluster_builder = nullptr; - } else { - current_cluster_builder = ra->cluster_builder; - } - if (p_camera_attributes.is_valid()) { - RendererRD::LightStorage::get_singleton()->reflection_probe_set_baked_exposure(rpi->probe, RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor(p_camera_attributes)); - } - } else { - ERR_PRINT("No render buffer nor reflection atlas, bug"); //should never happen, will crash - current_cluster_builder = nullptr; - } - - render_state.voxel_gi_count = 0; - - if (rb.is_valid() && is_dynamic_gi_supported()) { - if (rb->has_custom_data(RB_SCOPE_SDFGI)) { - Ref<RendererRD::GI::SDFGI> sdfgi = rb->get_custom_data(RB_SCOPE_SDFGI); - if (sdfgi.is_valid()) { - sdfgi->update_cascades(); - sdfgi->pre_process_gi(render_data.cam_transform, &render_data, this); - sdfgi->update_light(); - } - } - - gi.setup_voxel_gi_instances(&render_data, render_data.render_buffers, render_data.cam_transform, *render_data.voxel_gi_instances, render_state.voxel_gi_count, this); - } - - render_state.depth_prepass_used = false; //calls _pre_opaque_render between depth pre-pass and opaque pass - if (current_cluster_builder != nullptr) { - render_data.cluster_buffer = current_cluster_builder->get_cluster_buffer(); - render_data.cluster_size = current_cluster_builder->get_cluster_size(); - render_data.cluster_max_elements = current_cluster_builder->get_max_cluster_elements(); - } - - if (rb.is_valid() && vrs) { - RS::ViewportVRSMode vrs_mode = texture_storage->render_target_get_vrs_mode(rb->get_render_target()); - if (vrs_mode != RS::VIEWPORT_VRS_DISABLED) { - RID vrs_texture = rb->get_texture(RB_SCOPE_VRS, RB_TEXTURE); - - // We use get_cache_multipass instead of get_cache_multiview because the default behavior is for - // our vrs_texture to be used as the VRS attachment. In this particular case we're writing to it - // so it needs to be set as our color attachment - - Vector<RID> textures; - textures.push_back(vrs_texture); - - Vector<RD::FramebufferPass> passes; - RD::FramebufferPass pass; - pass.color_attachments.push_back(0); - passes.push_back(pass); - - RID vrs_fb = FramebufferCacheRD::get_singleton()->get_cache_multipass(textures, passes, rb->get_view_count()); - - vrs->update_vrs_texture(vrs_fb, rb->get_render_target()); - } - } - _render_scene(&render_data, clear_color); - - if (rb.is_valid()) { - _render_buffers_debug_draw(rb, p_shadow_atlas, p_occluder_debug_tex); - - if (debug_draw == RS::VIEWPORT_DEBUG_DRAW_SDFGI && rb->has_custom_data(RB_SCOPE_SDFGI)) { - Ref<RendererRD::GI::SDFGI> sdfgi = rb->get_custom_data(RB_SCOPE_SDFGI); - Vector<RID> view_rids; - - // SDFGI renders at internal resolution, need to check if our debug correctly supports outputting upscaled. - Size2i size = rb->get_internal_size(); - RID source_texture = rb->get_internal_texture(); - for (uint32_t v = 0; v < rb->get_view_count(); v++) { - view_rids.push_back(rb->get_internal_texture(v)); - } - - sdfgi->debug_draw(render_data.view_count, render_data.view_projection, render_data.cam_transform, size.x, size.y, rb->get_render_target(), source_texture, view_rids); - } - } -} - -void RendererSceneRenderRD::_debug_draw_cluster(Ref<RenderSceneBuffersRD> p_render_buffers) { - if (p_render_buffers.is_valid() && current_cluster_builder != nullptr) { - RS::ViewportDebugDraw dd = get_debug_draw_mode(); - - if (dd == RS::VIEWPORT_DEBUG_DRAW_CLUSTER_OMNI_LIGHTS || dd == RS::VIEWPORT_DEBUG_DRAW_CLUSTER_SPOT_LIGHTS || dd == RS::VIEWPORT_DEBUG_DRAW_CLUSTER_DECALS || dd == RS::VIEWPORT_DEBUG_DRAW_CLUSTER_REFLECTION_PROBES) { - ClusterBuilderRD::ElementType elem_type = ClusterBuilderRD::ELEMENT_TYPE_MAX; - switch (dd) { - case RS::VIEWPORT_DEBUG_DRAW_CLUSTER_OMNI_LIGHTS: - elem_type = ClusterBuilderRD::ELEMENT_TYPE_OMNI_LIGHT; - break; - case RS::VIEWPORT_DEBUG_DRAW_CLUSTER_SPOT_LIGHTS: - elem_type = ClusterBuilderRD::ELEMENT_TYPE_SPOT_LIGHT; - break; - case RS::VIEWPORT_DEBUG_DRAW_CLUSTER_DECALS: - elem_type = ClusterBuilderRD::ELEMENT_TYPE_DECAL; - break; - case RS::VIEWPORT_DEBUG_DRAW_CLUSTER_REFLECTION_PROBES: - elem_type = ClusterBuilderRD::ELEMENT_TYPE_REFLECTION_PROBE; - break; - default: { - } - } - current_cluster_builder->debug(elem_type); - } - } -} - -void RendererSceneRenderRD::_render_shadow_pass(RID p_light, RID p_shadow_atlas, int p_pass, const PagedArray<RenderGeometryInstance *> &p_instances, const Plane &p_camera_plane, float p_lod_distance_multiplier, float p_screen_mesh_lod_threshold, bool p_open_pass, bool p_close_pass, bool p_clear_region, RendererScene::RenderInfo *p_render_info) { - LightInstance *light_instance = light_instance_owner.get_or_null(p_light); - ERR_FAIL_COND(!light_instance); - - Rect2i atlas_rect; - uint32_t atlas_size; - RID atlas_fb; - - bool using_dual_paraboloid = false; - bool using_dual_paraboloid_flip = false; - Vector2i dual_paraboloid_offset; - RID render_fb; - RID render_texture; - float zfar; - - bool use_pancake = false; - bool render_cubemap = false; - bool finalize_cubemap = false; - - bool flip_y = false; - - Projection light_projection; - Transform3D light_transform; - - if (RSG::light_storage->light_get_type(light_instance->light) == RS::LIGHT_DIRECTIONAL) { - //set pssm stuff - if (light_instance->last_scene_shadow_pass != scene_pass) { - light_instance->directional_rect = _get_directional_shadow_rect(directional_shadow.size, directional_shadow.light_count, directional_shadow.current_light); - directional_shadow.current_light++; - light_instance->last_scene_shadow_pass = scene_pass; - } - - use_pancake = RSG::light_storage->light_get_param(light_instance->light, RS::LIGHT_PARAM_SHADOW_PANCAKE_SIZE) > 0; - light_projection = light_instance->shadow_transform[p_pass].camera; - light_transform = light_instance->shadow_transform[p_pass].transform; - - atlas_rect = light_instance->directional_rect; - - if (RSG::light_storage->light_directional_get_shadow_mode(light_instance->light) == RS::LIGHT_DIRECTIONAL_SHADOW_PARALLEL_4_SPLITS) { - atlas_rect.size.width /= 2; - atlas_rect.size.height /= 2; - - if (p_pass == 1) { - atlas_rect.position.x += atlas_rect.size.width; - } else if (p_pass == 2) { - atlas_rect.position.y += atlas_rect.size.height; - } else if (p_pass == 3) { - atlas_rect.position += atlas_rect.size; - } - } else if (RSG::light_storage->light_directional_get_shadow_mode(light_instance->light) == RS::LIGHT_DIRECTIONAL_SHADOW_PARALLEL_2_SPLITS) { - atlas_rect.size.height /= 2; - - if (p_pass == 0) { - } else { - atlas_rect.position.y += atlas_rect.size.height; - } - } - - light_instance->shadow_transform[p_pass].atlas_rect = atlas_rect; - - light_instance->shadow_transform[p_pass].atlas_rect.position /= directional_shadow.size; - light_instance->shadow_transform[p_pass].atlas_rect.size /= directional_shadow.size; - - zfar = RSG::light_storage->light_get_param(light_instance->light, RS::LIGHT_PARAM_RANGE); - - render_fb = directional_shadow.fb; - render_texture = RID(); - flip_y = true; - - } else { - //set from shadow atlas - - ShadowAtlas *shadow_atlas = shadow_atlas_owner.get_or_null(p_shadow_atlas); - ERR_FAIL_COND(!shadow_atlas); - ERR_FAIL_COND(!shadow_atlas->shadow_owners.has(p_light)); - - _update_shadow_atlas(shadow_atlas); - - uint32_t key = shadow_atlas->shadow_owners[p_light]; - - uint32_t quadrant = (key >> ShadowAtlas::QUADRANT_SHIFT) & 0x3; - uint32_t shadow = key & ShadowAtlas::SHADOW_INDEX_MASK; - - ERR_FAIL_INDEX((int)shadow, shadow_atlas->quadrants[quadrant].shadows.size()); - - uint32_t quadrant_size = shadow_atlas->size >> 1; - - atlas_rect.position.x = (quadrant & 1) * quadrant_size; - atlas_rect.position.y = (quadrant >> 1) * quadrant_size; - - uint32_t shadow_size = (quadrant_size / shadow_atlas->quadrants[quadrant].subdivision); - atlas_rect.position.x += (shadow % shadow_atlas->quadrants[quadrant].subdivision) * shadow_size; - atlas_rect.position.y += (shadow / shadow_atlas->quadrants[quadrant].subdivision) * shadow_size; - - atlas_rect.size.width = shadow_size; - atlas_rect.size.height = shadow_size; - - zfar = RSG::light_storage->light_get_param(light_instance->light, RS::LIGHT_PARAM_RANGE); - - if (RSG::light_storage->light_get_type(light_instance->light) == RS::LIGHT_OMNI) { - bool wrap = (shadow + 1) % shadow_atlas->quadrants[quadrant].subdivision == 0; - dual_paraboloid_offset = wrap ? Vector2i(1 - shadow_atlas->quadrants[quadrant].subdivision, 1) : Vector2i(1, 0); - - if (RSG::light_storage->light_omni_get_shadow_mode(light_instance->light) == RS::LIGHT_OMNI_SHADOW_CUBE) { - ShadowCubemap *cubemap = _get_shadow_cubemap(shadow_size / 2); - - render_fb = cubemap->side_fb[p_pass]; - render_texture = cubemap->cubemap; - - light_projection = light_instance->shadow_transform[p_pass].camera; - light_transform = light_instance->shadow_transform[p_pass].transform; - render_cubemap = true; - finalize_cubemap = p_pass == 5; - atlas_fb = shadow_atlas->fb; - - atlas_size = shadow_atlas->size; - - if (p_pass == 0) { - _render_shadow_begin(); - } - - } else { - atlas_rect.position.x += 1; - atlas_rect.position.y += 1; - atlas_rect.size.x -= 2; - atlas_rect.size.y -= 2; - - atlas_rect.position += p_pass * atlas_rect.size * dual_paraboloid_offset; - - light_projection = light_instance->shadow_transform[0].camera; - light_transform = light_instance->shadow_transform[0].transform; - - using_dual_paraboloid = true; - using_dual_paraboloid_flip = p_pass == 1; - render_fb = shadow_atlas->fb; - flip_y = true; - } - - } else if (RSG::light_storage->light_get_type(light_instance->light) == RS::LIGHT_SPOT) { - light_projection = light_instance->shadow_transform[0].camera; - light_transform = light_instance->shadow_transform[0].transform; - - render_fb = shadow_atlas->fb; - - flip_y = true; - } - } - - if (render_cubemap) { - //rendering to cubemap - _render_shadow_append(render_fb, p_instances, light_projection, light_transform, zfar, 0, 0, false, false, use_pancake, p_camera_plane, p_lod_distance_multiplier, p_screen_mesh_lod_threshold, Rect2(), false, true, true, true, p_render_info); - if (finalize_cubemap) { - _render_shadow_process(); - _render_shadow_end(); - //reblit - Rect2 atlas_rect_norm = atlas_rect; - atlas_rect_norm.position /= float(atlas_size); - atlas_rect_norm.size /= float(atlas_size); - copy_effects->copy_cubemap_to_dp(render_texture, atlas_fb, atlas_rect_norm, atlas_rect.size, light_projection.get_z_near(), light_projection.get_z_far(), false); - atlas_rect_norm.position += Vector2(dual_paraboloid_offset) * atlas_rect_norm.size; - copy_effects->copy_cubemap_to_dp(render_texture, atlas_fb, atlas_rect_norm, atlas_rect.size, light_projection.get_z_near(), light_projection.get_z_far(), true); - - //restore transform so it can be properly used - light_instance_set_shadow_transform(p_light, Projection(), light_instance->transform, zfar, 0, 0, 0); - } - - } else { - //render shadow - _render_shadow_append(render_fb, p_instances, light_projection, light_transform, zfar, 0, 0, using_dual_paraboloid, using_dual_paraboloid_flip, use_pancake, p_camera_plane, p_lod_distance_multiplier, p_screen_mesh_lod_threshold, atlas_rect, flip_y, p_clear_region, p_open_pass, p_close_pass, p_render_info); - } } void RendererSceneRenderRD::render_material(const Transform3D &p_cam_transform, const Projection &p_cam_projection, bool p_cam_orthogonal, const PagedArray<RenderGeometryInstance *> &p_instances, RID p_framebuffer, const Rect2i &p_region) { @@ -3478,58 +1201,11 @@ bool RendererSceneRenderRD::free(RID p_rid) { environment_free(p_rid); } else if (RSG::camera_attributes->owns_camera_attributes(p_rid)) { RSG::camera_attributes->camera_attributes_free(p_rid); - } else if (reflection_atlas_owner.owns(p_rid)) { - reflection_atlas_set_size(p_rid, 0, 0); - ReflectionAtlas *ra = reflection_atlas_owner.get_or_null(p_rid); - if (ra->cluster_builder) { - memdelete(ra->cluster_builder); - } - reflection_atlas_owner.free(p_rid); - } else if (reflection_probe_instance_owner.owns(p_rid)) { - ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_rid); - _free_forward_id(FORWARD_ID_TYPE_REFLECTION_PROBE, rpi->forward_id); - reflection_probe_release_atlas_index(p_rid); - reflection_probe_instance_owner.free(p_rid); - } else if (decal_instance_owner.owns(p_rid)) { - DecalInstance *di = decal_instance_owner.get_or_null(p_rid); - _free_forward_id(FORWARD_ID_TYPE_DECAL, di->forward_id); - decal_instance_owner.free(p_rid); - } else if (lightmap_instance_owner.owns(p_rid)) { - lightmap_instance_owner.free(p_rid); } else if (gi.voxel_gi_instance_owns(p_rid)) { gi.voxel_gi_instance_free(p_rid); } else if (sky.sky_owner.owns(p_rid)) { sky.update_dirty_skys(); sky.free_sky(p_rid); - } else if (light_instance_owner.owns(p_rid)) { - LightInstance *light_instance = light_instance_owner.get_or_null(p_rid); - - //remove from shadow atlases.. - for (const RID &E : light_instance->shadow_atlases) { - ShadowAtlas *shadow_atlas = shadow_atlas_owner.get_or_null(E); - ERR_CONTINUE(!shadow_atlas->shadow_owners.has(p_rid)); - uint32_t key = shadow_atlas->shadow_owners[p_rid]; - uint32_t q = (key >> ShadowAtlas::QUADRANT_SHIFT) & 0x3; - uint32_t s = key & ShadowAtlas::SHADOW_INDEX_MASK; - - shadow_atlas->quadrants[q].shadows.write[s].owner = RID(); - - if (key & ShadowAtlas::OMNI_LIGHT_FLAG) { - // Omni lights use two atlas spots, make sure to clear the other as well - shadow_atlas->quadrants[q].shadows.write[s + 1].owner = RID(); - } - - shadow_atlas->shadow_owners.erase(p_rid); - } - - if (light_instance->light_type != RS::LIGHT_DIRECTIONAL) { - _free_forward_id(light_instance->light_type == RS::LIGHT_OMNI ? FORWARD_ID_TYPE_OMNI_LIGHT : FORWARD_ID_TYPE_SPOT_LIGHT, light_instance->forward_id); - } - light_instance_owner.free(p_rid); - - } else if (shadow_atlas_owner.owns(p_rid)) { - shadow_atlas_set_size(p_rid, 0); - shadow_atlas_owner.free(p_rid); } else if (RendererRD::Fog::get_singleton()->owns_fog_volume_instance(p_rid)) { RendererRD::Fog::get_singleton()->fog_instance_free(p_rid); } else { @@ -3604,6 +1280,7 @@ TypedArray<Image> RendererSceneRenderRD::bake_render_uv2(RID p_base, const Typed //RID sampled_light; RenderGeometryInstance *gi = geometry_instance_create(p_base); + ERR_FAIL_NULL_V(gi, TypedArray<Image>()); uint32_t sc = RSG::mesh_storage->mesh_get_surface_count(p_base); Vector<RID> materials; @@ -3676,27 +1353,6 @@ void RendererSceneRenderRD::sdfgi_set_debug_probe_select(const Vector3 &p_positi RendererSceneRenderRD *RendererSceneRenderRD::singleton = nullptr; -RID RendererSceneRenderRD::get_reflection_probe_buffer() { - return cluster.reflection_buffer; -} -RID RendererSceneRenderRD::get_omni_light_buffer() { - return cluster.omni_light_buffer; -} - -RID RendererSceneRenderRD::get_spot_light_buffer() { - return cluster.spot_light_buffer; -} - -RID RendererSceneRenderRD::get_directional_light_buffer() { - return cluster.directional_light_buffer; -} -RID RendererSceneRenderRD::get_decal_buffer() { - return cluster.decal_buffer; -} -int RendererSceneRenderRD::get_max_directional_lights() const { - return cluster.max_directional_lights; -} - bool RendererSceneRenderRD::is_vrs_supported() const { return RD::get_singleton()->has_feature(RD::SUPPORTS_ATTACHMENT_VRS); } @@ -3706,11 +1362,6 @@ bool RendererSceneRenderRD::is_dynamic_gi_supported() const { return true; } -bool RendererSceneRenderRD::is_clustered_enabled() const { - // used by default. - return true; -} - bool RendererSceneRenderRD::is_volumetric_supported() const { // usable by default (unless low end = true) return true; @@ -3726,9 +1377,10 @@ RendererSceneRenderRD::RendererSceneRenderRD() { void RendererSceneRenderRD::init() { max_cluster_elements = get_max_elements(); + RendererRD::LightStorage::get_singleton()->set_max_cluster_elements(max_cluster_elements); - directional_shadow.size = GLOBAL_GET("rendering/lights_and_shadows/directional_shadow/size"); - directional_shadow.use_16_bits = GLOBAL_GET("rendering/lights_and_shadows/directional_shadow/16_bits"); + /* Forward ID */ + forward_id_storage = create_forward_id_storage(); /* SKY SHADER */ @@ -3741,68 +1393,25 @@ void RendererSceneRenderRD::init() { } { //decals - cluster.max_decals = max_cluster_elements; - uint32_t decal_buffer_size = cluster.max_decals * sizeof(Cluster::DecalData); - cluster.decals = memnew_arr(Cluster::DecalData, cluster.max_decals); - cluster.decal_sort = memnew_arr(Cluster::InstanceSort<DecalInstance>, cluster.max_decals); - cluster.decal_buffer = RD::get_singleton()->storage_buffer_create(decal_buffer_size); - } - - { //reflections - - cluster.max_reflections = max_cluster_elements; - cluster.reflections = memnew_arr(Cluster::ReflectionData, cluster.max_reflections); - cluster.reflection_sort = memnew_arr(Cluster::InstanceSort<ReflectionProbeInstance>, cluster.max_reflections); - cluster.reflection_buffer = RD::get_singleton()->storage_buffer_create(sizeof(Cluster::ReflectionData) * cluster.max_reflections); + RendererRD::TextureStorage::get_singleton()->set_max_decals(max_cluster_elements); } { //lights - cluster.max_lights = max_cluster_elements; - - uint32_t light_buffer_size = cluster.max_lights * sizeof(Cluster::LightData); - cluster.omni_lights = memnew_arr(Cluster::LightData, cluster.max_lights); - cluster.omni_light_buffer = RD::get_singleton()->storage_buffer_create(light_buffer_size); - cluster.omni_light_sort = memnew_arr(Cluster::InstanceSort<LightInstance>, cluster.max_lights); - cluster.spot_lights = memnew_arr(Cluster::LightData, cluster.max_lights); - cluster.spot_light_buffer = RD::get_singleton()->storage_buffer_create(light_buffer_size); - cluster.spot_light_sort = memnew_arr(Cluster::InstanceSort<LightInstance>, cluster.max_lights); - //defines += "\n#define MAX_LIGHT_DATA_STRUCTS " + itos(cluster.max_lights) + "\n"; - - cluster.max_directional_lights = MAX_DIRECTIONAL_LIGHTS; - uint32_t directional_light_buffer_size = cluster.max_directional_lights * sizeof(Cluster::DirectionalLightData); - cluster.directional_lights = memnew_arr(Cluster::DirectionalLightData, cluster.max_directional_lights); - cluster.directional_light_buffer = RD::get_singleton()->uniform_buffer_create(directional_light_buffer_size); } if (is_volumetric_supported()) { - RendererRD::Fog::get_singleton()->init_fog_shader(cluster.max_directional_lights, get_roughness_layers(), is_using_radiance_cubemap_array()); - } - - { - RD::SamplerState sampler; - sampler.mag_filter = RD::SAMPLER_FILTER_NEAREST; - sampler.min_filter = RD::SAMPLER_FILTER_NEAREST; - sampler.enable_compare = true; - sampler.compare_op = RD::COMPARE_OP_LESS; - shadow_sampler = RD::get_singleton()->sampler_create(sampler); + RendererRD::Fog::get_singleton()->init_fog_shader(RendererRD::LightStorage::get_singleton()->get_max_directional_lights(), get_roughness_layers(), is_using_radiance_cubemap_array()); } RSG::camera_attributes->camera_attributes_set_dof_blur_bokeh_shape(RS::DOFBokehShape(int(GLOBAL_GET("rendering/camera/depth_of_field/depth_of_field_bokeh_shape")))); RSG::camera_attributes->camera_attributes_set_dof_blur_quality(RS::DOFBlurQuality(int(GLOBAL_GET("rendering/camera/depth_of_field/depth_of_field_bokeh_quality"))), GLOBAL_GET("rendering/camera/depth_of_field/depth_of_field_use_jitter")); use_physical_light_units = GLOBAL_GET("rendering/lights_and_shadows/use_physical_light_units"); - environment_set_ssao_quality(RS::EnvironmentSSAOQuality(int(GLOBAL_GET("rendering/environment/ssao/quality"))), GLOBAL_GET("rendering/environment/ssao/half_size"), GLOBAL_GET("rendering/environment/ssao/adaptive_target"), GLOBAL_GET("rendering/environment/ssao/blur_passes"), GLOBAL_GET("rendering/environment/ssao/fadeout_from"), GLOBAL_GET("rendering/environment/ssao/fadeout_to")); screen_space_roughness_limiter = GLOBAL_GET("rendering/anti_aliasing/screen_space_roughness_limiter/enabled"); screen_space_roughness_limiter_amount = GLOBAL_GET("rendering/anti_aliasing/screen_space_roughness_limiter/amount"); screen_space_roughness_limiter_limit = GLOBAL_GET("rendering/anti_aliasing/screen_space_roughness_limiter/limit"); glow_bicubic_upscale = int(GLOBAL_GET("rendering/environment/glow/upscale_mode")) > 0; glow_high_quality = GLOBAL_GET("rendering/environment/glow/use_high_quality"); - ssr_roughness_quality = RS::EnvironmentSSRRoughnessQuality(int(GLOBAL_GET("rendering/environment/screen_space_reflection/roughness_quality"))); - sss_quality = RS::SubSurfaceScatteringQuality(int(GLOBAL_GET("rendering/environment/subsurface_scattering/subsurface_scattering_quality"))); - sss_scale = GLOBAL_GET("rendering/environment/subsurface_scattering/subsurface_scattering_scale"); - sss_depth_scale = GLOBAL_GET("rendering/environment/subsurface_scattering/subsurface_scattering_depth_scale"); - - environment_set_ssil_quality(RS::EnvironmentSSILQuality(int(GLOBAL_GET("rendering/environment/ssil/quality"))), GLOBAL_GET("rendering/environment/ssil/half_size"), GLOBAL_GET("rendering/environment/ssil/adaptive_target"), GLOBAL_GET("rendering/environment/ssil/blur_passes"), GLOBAL_GET("rendering/environment/ssil/fadeout_from"), GLOBAL_GET("rendering/environment/ssil/fadeout_to")); directional_penumbra_shadow_kernel = memnew_arr(float, 128); directional_soft_shadow_kernel = memnew_arr(float, 128); @@ -3826,11 +1435,14 @@ void RendererSceneRenderRD::init() { vrs = memnew(RendererRD::VRS); if (can_use_storage) { fsr = memnew(RendererRD::FSR); - ss_effects = memnew(RendererRD::SSEffects); } } RendererSceneRenderRD::~RendererSceneRenderRD() { + if (forward_id_storage) { + memdelete(forward_id_storage); + } + if (bokeh_dof) { memdelete(bokeh_dof); } @@ -3846,13 +1458,6 @@ RendererSceneRenderRD::~RendererSceneRenderRD() { if (fsr) { memdelete(fsr); } - if (ss_effects) { - memdelete(ss_effects); - } - - for (const KeyValue<int, ShadowCubemap> &E : shadow_cubemaps) { - RD::get_singleton()->free(E.value.cubemap); - } if (sky.sky_scene_state.uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(sky.sky_scene_state.uniform_set)) { RD::get_singleton()->free(sky.sky_scene_state.uniform_set); @@ -3871,25 +1476,6 @@ RendererSceneRenderRD::~RendererSceneRenderRD() { memdelete_arr(penumbra_shadow_kernel); memdelete_arr(soft_shadow_kernel); - { - RD::get_singleton()->free(cluster.directional_light_buffer); - RD::get_singleton()->free(cluster.omni_light_buffer); - RD::get_singleton()->free(cluster.spot_light_buffer); - RD::get_singleton()->free(cluster.reflection_buffer); - RD::get_singleton()->free(cluster.decal_buffer); - memdelete_arr(cluster.directional_lights); - memdelete_arr(cluster.omni_lights); - memdelete_arr(cluster.spot_lights); - memdelete_arr(cluster.omni_light_sort); - memdelete_arr(cluster.spot_light_sort); - memdelete_arr(cluster.reflections); - memdelete_arr(cluster.reflection_sort); - memdelete_arr(cluster.decals); - memdelete_arr(cluster.decal_sort); - } - - RD::get_singleton()->free(shadow_sampler); - - directional_shadow_atlas_set_size(0); + RSG::light_storage->directional_shadow_atlas_set_size(0); cull_argument.reset(); //avoid exit error } diff --git a/servers/rendering/renderer_rd/renderer_scene_render_rd.h b/servers/rendering/renderer_rd/renderer_scene_render_rd.h index 76d2bc68fe..2312603829 100644 --- a/servers/rendering/renderer_rd/renderer_scene_render_rd.h +++ b/servers/rendering/renderer_rd/renderer_scene_render_rd.h @@ -38,38 +38,24 @@ #include "servers/rendering/renderer_rd/effects/bokeh_dof.h" #include "servers/rendering/renderer_rd/effects/copy_effects.h" #include "servers/rendering/renderer_rd/effects/fsr.h" -#include "servers/rendering/renderer_rd/effects/ss_effects.h" #include "servers/rendering/renderer_rd/effects/tone_mapper.h" #include "servers/rendering/renderer_rd/effects/vrs.h" #include "servers/rendering/renderer_rd/environment/fog.h" #include "servers/rendering/renderer_rd/environment/gi.h" #include "servers/rendering/renderer_rd/environment/sky.h" #include "servers/rendering/renderer_rd/framebuffer_cache_rd.h" +#include "servers/rendering/renderer_rd/storage_rd/light_storage.h" #include "servers/rendering/renderer_rd/storage_rd/render_scene_buffers_rd.h" -#include "servers/rendering/renderer_scene.h" +#include "servers/rendering/renderer_rd/storage_rd/render_scene_data_rd.h" #include "servers/rendering/renderer_scene_render.h" #include "servers/rendering/rendering_device.h" +#include "servers/rendering/rendering_method.h" + +// For RenderDataRD, possibly inherited from RefCounted and add proper getters for our implementation classes struct RenderDataRD { Ref<RenderSceneBuffersRD> render_buffers; - - Transform3D cam_transform; - Projection cam_projection; - Vector2 taa_jitter; - bool cam_orthogonal = false; - - // For stereo rendering - uint32_t view_count = 1; - Vector3 view_eye_offset[RendererSceneRender::MAX_RENDER_VIEWS]; - Projection view_projection[RendererSceneRender::MAX_RENDER_VIEWS]; - - Transform3D prev_cam_transform; - Projection prev_cam_projection; - Vector2 prev_taa_jitter; - Projection prev_view_projection[RendererSceneRender::MAX_RENDER_VIEWS]; - - float z_near = 0.0; - float z_far = 0.0; + RenderSceneDataRD *scene_data; const PagedArray<RenderGeometryInstance *> *instances = nullptr; const PagedArray<RID> *lights = nullptr; @@ -81,14 +67,11 @@ struct RenderDataRD { RID environment; RID camera_attributes; RID shadow_atlas; + RID occluder_debug_tex; RID reflection_atlas; RID reflection_probe; int reflection_probe_pass = 0; - float lod_distance_multiplier = 0.0; - Plane lod_camera_plane; - float screen_mesh_lod_threshold = 0.0; - RID cluster_buffer; uint32_t cluster_size = 0; uint32_t cluster_max_elements = 0; @@ -96,7 +79,22 @@ struct RenderDataRD { uint32_t directional_light_count = 0; bool directional_light_soft_shadows = false; - RendererScene::RenderInfo *render_info = nullptr; + RenderingMethod::RenderInfo *render_info = nullptr; + + /* Shadow data */ + const RendererSceneRender::RenderShadowData *render_shadows = nullptr; + int render_shadow_count = 0; + + LocalVector<int> cube_shadows; + LocalVector<int> shadows; + LocalVector<int> directional_shadows; + + /* GI info */ + const RendererSceneRender::RenderSDFGIData *render_sdfgi_regions = nullptr; + int render_sdfgi_region_count = 0; + const RendererSceneRender::RenderSDFGIUpdateData *sdfgi_update_data = nullptr; + + uint32_t voxel_gi_count = 0; }; class RendererSceneRenderRD : public RendererSceneRender { @@ -104,6 +102,7 @@ class RendererSceneRenderRD : public RendererSceneRender { friend RendererRD::GI; protected: + RendererRD::ForwardIDStorage *forward_id_storage = nullptr; RendererRD::BokehDOF *bokeh_dof = nullptr; RendererRD::CopyEffects *copy_effects = nullptr; RendererRD::ToneMapper *tone_mapper = nullptr; @@ -112,18 +111,23 @@ protected: double time = 0.0; double time_step = 0.0; - virtual void setup_render_buffer_data(Ref<RenderSceneBuffersRD> p_render_buffers) = 0; + /* ENVIRONMENT */ - void _setup_lights(RenderDataRD *p_render_data, const PagedArray<RID> &p_lights, const Transform3D &p_camera_transform, RID p_shadow_atlas, bool p_using_shadows, uint32_t &r_directional_light_count, uint32_t &r_positional_light_count, bool &r_directional_light_soft_shadows); - void _setup_decals(const PagedArray<RID> &p_decals, const Transform3D &p_camera_inverse_xform); - void _setup_reflections(RenderDataRD *p_render_data, const PagedArray<RID> &p_reflections, const Transform3D &p_camera_inverse_transform, RID p_environment); + bool glow_bicubic_upscale = false; + bool glow_high_quality = false; - virtual void _render_scene(RenderDataRD *p_render_data, const Color &p_default_color) = 0; + bool use_physical_light_units = false; + + //////////////////////////////// + + virtual RendererRD::ForwardIDStorage *create_forward_id_storage() { return memnew(RendererRD::ForwardIDStorage); }; + + void _update_vrs(Ref<RenderSceneBuffersRD> p_render_buffers); - virtual void _render_shadow_begin() = 0; - virtual void _render_shadow_append(RID p_framebuffer, const PagedArray<RenderGeometryInstance *> &p_instances, const Projection &p_projection, const Transform3D &p_transform, float p_zfar, float p_bias, float p_normal_bias, bool p_use_dp, bool p_use_dp_flip, bool p_use_pancake, const Plane &p_camera_plane = Plane(), float p_lod_distance_multiplier = 0.0, float p_screen_mesh_lod_threshold = 0.0, const Rect2i &p_rect = Rect2i(), bool p_flip_y = false, bool p_clear_region = true, bool p_begin = true, bool p_end = true, RendererScene::RenderInfo *p_render_info = nullptr) = 0; - virtual void _render_shadow_process() = 0; - virtual void _render_shadow_end(uint32_t p_barrier = RD::BARRIER_MASK_ALL) = 0; + virtual void setup_render_buffer_data(Ref<RenderSceneBuffersRD> p_render_buffers) = 0; + + virtual void _render_scene(RenderDataRD *p_render_data, const Color &p_default_color) = 0; + virtual void _render_buffers_debug_draw(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_shadow_atlas, RID p_occlusion_buffer); virtual void _render_material(const Transform3D &p_cam_transform, const Projection &p_cam_projection, bool p_cam_orthogonal, const PagedArray<RenderGeometryInstance *> &p_instances, RID p_framebuffer, const Rect2i &p_region, float p_exposure_normalization) = 0; virtual void _render_uv2(const PagedArray<RenderGeometryInstance *> &p_instances, RID p_framebuffer, const Rect2i &p_region) = 0; @@ -131,25 +135,14 @@ protected: virtual void _render_particle_collider_heightfield(RID p_fb, const Transform3D &p_cam_transform, const Projection &p_cam_projection, const PagedArray<RenderGeometryInstance *> &p_instances) = 0; void _debug_sdfgi_probes(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_framebuffer, uint32_t p_view_count, const Projection *p_camera_with_transforms, bool p_will_continue_color, bool p_will_continue_depth); - void _debug_draw_cluster(Ref<RenderSceneBuffersRD> p_render_buffers); - virtual void _base_uniforms_changed() = 0; virtual RID _render_buffers_get_normal_texture(Ref<RenderSceneBuffersRD> p_render_buffers) = 0; virtual RID _render_buffers_get_velocity_texture(Ref<RenderSceneBuffersRD> p_render_buffers) = 0; - void _process_ssao(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, RID p_normal_buffer, const Projection &p_projection); - void _process_ssr(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_dest_framebuffer, const RID *p_normal_buffer_slices, RID p_specular_buffer, const RID *p_metallic_slices, const Color &p_metallic_mask, RID p_environment, const Projection *p_projections, const Vector3 *p_eye_offsets, bool p_use_additive); - void _process_sss(Ref<RenderSceneBuffersRD> p_render_buffers, const Projection &p_camera); - void _process_ssil(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, RID p_normal_buffer, const Projection &p_projection, const Transform3D &p_transform); - - void _copy_framebuffer_to_ssil(Ref<RenderSceneBuffersRD> p_render_buffers); - bool _needs_post_prepass_render(RenderDataRD *p_render_data, bool p_use_gi); void _post_prepass_render(RenderDataRD *p_render_data, bool p_use_gi); void _pre_resolve_render(RenderDataRD *p_render_data, bool p_use_gi); - void _pre_opaque_render(RenderDataRD *p_render_data, bool p_use_ssao, bool p_use_ssil, bool p_use_gi, const RID *p_normal_roughness_slices, RID p_voxel_gi_buffer); - void _render_buffers_copy_screen_texture(const RenderDataRD *p_render_data); void _render_buffers_copy_depth_texture(const RenderDataRD *p_render_data); void _render_buffers_post_process_and_tonemap(const RenderDataRD *p_render_data); @@ -160,26 +153,8 @@ protected: PagedArrayPool<RenderGeometryInstance *> cull_argument_pool; PagedArray<RenderGeometryInstance *> cull_argument; //need this to exist - RendererRD::SSEffects *ss_effects = nullptr; - RendererRD::GI gi; RendererRD::SkyRD sky; - - //used for mobile renderer mostly - - typedef int32_t ForwardID; - - enum ForwardIDType { - FORWARD_ID_TYPE_OMNI_LIGHT, - FORWARD_ID_TYPE_SPOT_LIGHT, - FORWARD_ID_TYPE_REFLECTION_PROBE, - FORWARD_ID_TYPE_DECAL, - FORWARD_ID_MAX, - }; - - virtual ForwardID _allocate_forward_id(ForwardIDType p_type) { return -1; } - virtual void _free_forward_id(ForwardIDType p_type, ForwardID p_id) {} - virtual void _map_forward_id(ForwardIDType p_type, ForwardID p_id, uint32_t p_index) {} - virtual bool _uses_forward_ids() const { return false; } + RendererRD::GI gi; virtual void _update_shader_quality_settings() {} @@ -187,125 +162,7 @@ private: RS::ViewportDebugDraw debug_draw = RS::VIEWPORT_DEBUG_DRAW_DISABLED; static RendererSceneRenderRD *singleton; - /* REFLECTION ATLAS */ - - struct ReflectionAtlas { - int count = 0; - int size = 0; - - RID reflection; - RID depth_buffer; - RID depth_fb; - - struct Reflection { - RID owner; - RendererRD::SkyRD::ReflectionData data; - RID fbs[6]; - }; - - Vector<Reflection> reflections; - - ClusterBuilderRD *cluster_builder = nullptr; - }; - - mutable RID_Owner<ReflectionAtlas> reflection_atlas_owner; - - /* REFLECTION PROBE INSTANCE */ - - struct ReflectionProbeInstance { - RID probe; - int atlas_index = -1; - RID atlas; - - bool dirty = true; - bool rendering = false; - int processing_layer = 1; - int processing_side = 0; - - uint32_t render_step = 0; - uint64_t last_pass = 0; - uint32_t cull_mask = 0; - - ForwardID forward_id = -1; - - Transform3D transform; - }; - - mutable RID_Owner<ReflectionProbeInstance> reflection_probe_instance_owner; - - /* DECAL INSTANCE */ - - struct DecalInstance { - RID decal; - Transform3D transform; - uint32_t cull_mask = 0; - ForwardID forward_id = -1; - }; - - mutable RID_Owner<DecalInstance> decal_instance_owner; - - /* LIGHTMAP INSTANCE */ - - struct LightmapInstance { - RID lightmap; - Transform3D transform; - }; - - mutable RID_Owner<LightmapInstance> lightmap_instance_owner; - - /* SHADOW ATLAS */ - - struct ShadowShrinkStage { - RID texture; - RID filter_texture; - uint32_t size = 0; - }; - - struct ShadowAtlas { - enum { - QUADRANT_SHIFT = 27, - OMNI_LIGHT_FLAG = 1 << 26, - SHADOW_INDEX_MASK = OMNI_LIGHT_FLAG - 1, - SHADOW_INVALID = 0xFFFFFFFF - }; - - struct Quadrant { - uint32_t subdivision = 0; - - struct Shadow { - RID owner; - uint64_t version = 0; - uint64_t fog_version = 0; // used for fog - uint64_t alloc_tick = 0; - - Shadow() {} - }; - - Vector<Shadow> shadows; - - Quadrant() {} - } quadrants[4]; - - int size_order[4] = { 0, 1, 2, 3 }; - uint32_t smallest_subdiv = 0; - - int size = 0; - bool use_16_bits = true; - - RID depth; - RID fb; //for copying - - HashMap<RID, uint32_t> shadow_owners; - }; - - RID_Owner<ShadowAtlas> shadow_atlas_owner; - - void _update_shadow_atlas(ShadowAtlas *shadow_atlas); - - void _shadow_atlas_invalidate_shadow(RendererSceneRenderRD::ShadowAtlas::Quadrant::Shadow *p_shadow, RID p_atlas, RendererSceneRenderRD::ShadowAtlas *p_shadow_atlas, uint32_t p_quadrant, uint32_t p_shadow_idx); - bool _shadow_atlas_find_shadow(ShadowAtlas *shadow_atlas, int *p_in_quadrants, int p_quadrant_count, int p_current_subdiv, uint64_t p_tick, int &r_quadrant, int &r_shadow); - bool _shadow_atlas_find_omni_shadows(ShadowAtlas *shadow_atlas, int *p_in_quadrants, int p_quadrant_count, int p_current_subdiv, uint64_t p_tick, int &r_quadrant, int &r_shadow); - + /* Shadow atlas */ RS::ShadowQuality shadows_quality = RS::SHADOW_QUALITY_MAX; //So it always updates when first set RS::ShadowQuality directional_shadow_quality = RS::SHADOW_QUALITY_MAX; float shadows_quality_radius = 1.0; @@ -322,346 +179,44 @@ private: RS::DecalFilter decals_filter = RS::DECAL_FILTER_LINEAR_MIPMAPS; RS::LightProjectorFilter light_projectors_filter = RS::LIGHT_PROJECTOR_FILTER_LINEAR_MIPMAPS; - /* DIRECTIONAL SHADOW */ - - struct DirectionalShadow { - RID depth; - RID fb; //when renderign direct - - int light_count = 0; - int size = 0; - bool use_16_bits = true; - int current_light = 0; - } directional_shadow; - - void _update_directional_shadow_atlas(); - - /* SHADOW CUBEMAPS */ - - struct ShadowCubemap { - RID cubemap; - RID side_fb[6]; - }; - - HashMap<int, ShadowCubemap> shadow_cubemaps; - ShadowCubemap *_get_shadow_cubemap(int p_size); - - void _create_shadow_cubemaps(); - - /* LIGHT INSTANCE */ - - struct LightInstance { - struct ShadowTransform { - Projection camera; - Transform3D transform; - float farplane; - float split; - float bias_scale; - float shadow_texel_size; - float range_begin; - Rect2 atlas_rect; - Vector2 uv_scale; - }; - - RS::LightType light_type = RS::LIGHT_DIRECTIONAL; - - ShadowTransform shadow_transform[6]; - - AABB aabb; - RID self; - RID light; - Transform3D transform; - - Vector3 light_vector; - Vector3 spot_vector; - float linear_att = 0.0; - - uint64_t shadow_pass = 0; - uint64_t last_scene_pass = 0; - uint64_t last_scene_shadow_pass = 0; - uint64_t last_pass = 0; - uint32_t cull_mask = 0; - uint32_t light_directional_index = 0; - - Rect2 directional_rect; - - HashSet<RID> shadow_atlases; //shadow atlases where this light is registered - - ForwardID forward_id = -1; - - LightInstance() {} - }; - - mutable RID_Owner<LightInstance> light_instance_owner; - - /* ENVIRONMENT */ - - RS::EnvironmentSSAOQuality ssao_quality = RS::ENV_SSAO_QUALITY_MEDIUM; - bool ssao_half_size = false; - float ssao_adaptive_target = 0.5; - int ssao_blur_passes = 2; - float ssao_fadeout_from = 50.0; - float ssao_fadeout_to = 300.0; - - RS::EnvironmentSSILQuality ssil_quality = RS::ENV_SSIL_QUALITY_MEDIUM; - bool ssil_half_size = false; - bool ssil_using_half_size = false; - float ssil_adaptive_target = 0.5; - int ssil_blur_passes = 4; - float ssil_fadeout_from = 50.0; - float ssil_fadeout_to = 300.0; - - bool glow_bicubic_upscale = false; - bool glow_high_quality = false; - RS::EnvironmentSSRRoughnessQuality ssr_roughness_quality = RS::ENV_SSR_ROUGHNESS_QUALITY_LOW; - - RS::SubSurfaceScatteringQuality sss_quality = RS::SUB_SURFACE_SCATTERING_QUALITY_MEDIUM; - float sss_scale = 0.05; - float sss_depth_scale = 0.01; - - bool use_physical_light_units = false; - - /* Cluster builder */ - - ClusterBuilderSharedDataRD cluster_builder_shared; - ClusterBuilderRD *current_cluster_builder = nullptr; - /* RENDER BUFFERS */ + // TODO move into effects/luminance.h/cpp void _allocate_luminance_textures(Ref<RenderSceneBuffersRD> rb); - void _render_buffers_debug_draw(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_shadow_atlas, RID p_occlusion_buffer); - /* GI */ bool screen_space_roughness_limiter = false; float screen_space_roughness_limiter_amount = 0.25; float screen_space_roughness_limiter_limit = 0.18; - /* Cluster */ - - struct Cluster { - /* Scene State UBO */ - - // !BAS! Most data here is not just used by our clustering logic but also by other lighting implementations. Maybe rename this struct to something more appropriate - - enum { - REFLECTION_AMBIENT_DISABLED = 0, - REFLECTION_AMBIENT_ENVIRONMENT = 1, - REFLECTION_AMBIENT_COLOR = 2, - }; - - struct ReflectionData { - float box_extents[3]; - float index; - float box_offset[3]; - uint32_t mask; - float ambient[3]; // ambient color, - float intensity; - uint32_t exterior; - uint32_t box_project; - uint32_t ambient_mode; - float exposure_normalization; - float local_matrix[16]; // up to here for spot and omni, rest is for directional - }; - - struct LightData { - float position[3]; - float inv_radius; - float direction[3]; // in omni, x and y are used for dual paraboloid offset - float size; - - float color[3]; - float attenuation; - - float inv_spot_attenuation; - float cos_spot_angle; - float specular_amount; - float shadow_opacity; - - float atlas_rect[4]; // in omni, used for atlas uv, in spot, used for projector uv - float shadow_matrix[16]; - float shadow_bias; - float shadow_normal_bias; - float transmittance_bias; - float soft_shadow_size; - float soft_shadow_scale; - uint32_t mask; - float volumetric_fog_energy; - uint32_t bake_mode; - float projector_rect[4]; - }; - - struct DirectionalLightData { - float direction[3]; - float energy; - float color[3]; - float size; - float specular; - uint32_t mask; - float softshadow_angle; - float soft_shadow_scale; - uint32_t blend_splits; - float shadow_opacity; - float fade_from; - float fade_to; - uint32_t pad[2]; - uint32_t bake_mode; - float volumetric_fog_energy; - float shadow_bias[4]; - float shadow_normal_bias[4]; - float shadow_transmittance_bias[4]; - float shadow_z_range[4]; - float shadow_range_begin[4]; - float shadow_split_offsets[4]; - float shadow_matrices[4][16]; - float uv_scale1[2]; - float uv_scale2[2]; - float uv_scale3[2]; - float uv_scale4[2]; - }; - - struct DecalData { - float xform[16]; - float inv_extents[3]; - float albedo_mix; - float albedo_rect[4]; - float normal_rect[4]; - float orm_rect[4]; - float emission_rect[4]; - float modulate[4]; - float emission_energy; - uint32_t mask; - float upper_fade; - float lower_fade; - float normal_xform[12]; - float normal[3]; - float normal_fade; - }; - - template <class T> - struct InstanceSort { - float depth; - T *instance = nullptr; - bool operator<(const InstanceSort &p_sort) const { - return depth < p_sort.depth; - } - }; - - ReflectionData *reflections = nullptr; - InstanceSort<ReflectionProbeInstance> *reflection_sort; - uint32_t max_reflections; - RID reflection_buffer; - uint32_t max_reflection_probes_per_instance; - uint32_t reflection_count = 0; - - DecalData *decals = nullptr; - InstanceSort<DecalInstance> *decal_sort; - uint32_t max_decals; - RID decal_buffer; - uint32_t decal_count; - - LightData *omni_lights = nullptr; - LightData *spot_lights = nullptr; - - InstanceSort<LightInstance> *omni_light_sort; - InstanceSort<LightInstance> *spot_light_sort; - uint32_t max_lights; - RID omni_light_buffer; - RID spot_light_buffer; - uint32_t omni_light_count = 0; - uint32_t spot_light_count = 0; - - DirectionalLightData *directional_lights = nullptr; - uint32_t max_directional_lights; - RID directional_light_buffer; - - } cluster; - - struct RenderState { - const RendererSceneRender::RenderShadowData *render_shadows = nullptr; - int render_shadow_count = 0; - const RendererSceneRender::RenderSDFGIData *render_sdfgi_regions = nullptr; - int render_sdfgi_region_count = 0; - const RendererSceneRender::RenderSDFGIUpdateData *sdfgi_update_data = nullptr; - - uint32_t voxel_gi_count = 0; - - LocalVector<int> cube_shadows; - LocalVector<int> shadows; - LocalVector<int> directional_shadows; - - bool depth_prepass_used; // this does not seem used anywhere... - } render_state; - - RID shadow_sampler; + /* Light data */ uint64_t scene_pass = 0; - uint64_t shadow_atlas_realloc_tolerance_msec = 500; - - /* !BAS! is this used anywhere? - struct SDFGICosineNeighbour { - uint32_t neighbour; - float weight; - }; - */ uint32_t max_cluster_elements = 512; - void _render_shadow_pass(RID p_light, RID p_shadow_atlas, int p_pass, const PagedArray<RenderGeometryInstance *> &p_instances, const Plane &p_camera_plane = Plane(), float p_lod_distance_multiplier = 0, float p_screen_mesh_lod_threshold = 0.0, bool p_open_pass = true, bool p_close_pass = true, bool p_clear_region = true, RendererScene::RenderInfo *p_render_info = nullptr); - /* Volumetric Fog */ uint32_t volumetric_fog_size = 128; uint32_t volumetric_fog_depth = 128; bool volumetric_fog_filter_active = true; - void _update_volumetric_fog(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, const Projection &p_cam_projection, const Transform3D &p_cam_transform, const Transform3D &p_prev_cam_inv_transform, RID p_shadow_atlas, int p_directional_light_count, bool p_use_directional_shadows, int p_positional_light_count, int p_voxel_gi_count, const PagedArray<RID> &p_fog_volumes); - public: static RendererSceneRenderRD *get_singleton() { return singleton; } - /* Cluster builder */ - ClusterBuilderSharedDataRD *get_cluster_builder_shared() { return &cluster_builder_shared; } + /* LIGHTING */ + + virtual void setup_added_reflection_probe(const Transform3D &p_transform, const Vector3 &p_half_extents){}; + virtual void setup_added_light(const RS::LightType p_type, const Transform3D &p_transform, float p_radius, float p_spot_aperture){}; + virtual void setup_added_decal(const Transform3D &p_transform, const Vector3 &p_half_extents){}; /* GI */ RendererRD::GI *get_gi() { return &gi; } - /* SHADOW ATLAS API */ - - virtual RID shadow_atlas_create() override; - virtual void shadow_atlas_set_size(RID p_atlas, int p_size, bool p_16_bits = true) override; - virtual void shadow_atlas_set_quadrant_subdivision(RID p_atlas, int p_quadrant, int p_subdivision) override; - virtual bool shadow_atlas_update_light(RID p_atlas, RID p_light_instance, float p_coverage, uint64_t p_light_version) override; - _FORCE_INLINE_ bool shadow_atlas_owns_light_instance(RID p_atlas, RID p_light_intance) { - ShadowAtlas *atlas = shadow_atlas_owner.get_or_null(p_atlas); - ERR_FAIL_COND_V(!atlas, false); - return atlas->shadow_owners.has(p_light_intance); - } - - _FORCE_INLINE_ RID shadow_atlas_get_texture(RID p_atlas) { - ShadowAtlas *atlas = shadow_atlas_owner.get_or_null(p_atlas); - ERR_FAIL_COND_V(!atlas, RID()); - return atlas->depth; - } + /* SKY */ - _FORCE_INLINE_ Size2i shadow_atlas_get_size(RID p_atlas) { - ShadowAtlas *atlas = shadow_atlas_owner.get_or_null(p_atlas); - ERR_FAIL_COND_V(!atlas, Size2i()); - return Size2(atlas->size, atlas->size); - } - - virtual void directional_shadow_atlas_set_size(int p_size, bool p_16_bits = true) override; - virtual int get_directional_light_shadow_size(RID p_light_intance) override; - virtual void set_directional_shadow_count(int p_count) override; - - _FORCE_INLINE_ RID directional_shadow_get_texture() { - return directional_shadow.depth; - } - - _FORCE_INLINE_ Size2i directional_shadow_get_size() { - return Size2i(directional_shadow.size, directional_shadow.size); - } + RendererRD::SkyRD *get_sky() { return &sky; } /* SDFGI UPDATE */ @@ -689,266 +244,32 @@ public: virtual void environment_set_volumetric_fog_volume_size(int p_size, int p_depth) override; virtual void environment_set_volumetric_fog_filter_active(bool p_enable) override; - virtual void environment_set_ssao_quality(RS::EnvironmentSSAOQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) override; - - virtual void environment_set_ssil_quality(RS::EnvironmentSSILQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) override; - virtual void environment_set_sdfgi_ray_count(RS::EnvironmentSDFGIRayCount p_ray_count) override; virtual void environment_set_sdfgi_frames_to_converge(RS::EnvironmentSDFGIFramesToConverge p_frames) override; virtual void environment_set_sdfgi_frames_to_update_light(RS::EnvironmentSDFGIFramesToUpdateLight p_update) override; - virtual void environment_set_ssr_roughness_quality(RS::EnvironmentSSRRoughnessQuality p_quality) override; - RS::EnvironmentSSRRoughnessQuality environment_get_ssr_roughness_quality() const; - virtual Ref<Image> environment_bake_panorama(RID p_env, bool p_bake_irradiance, const Size2i &p_size) override; _FORCE_INLINE_ bool is_using_physical_light_units() { return use_physical_light_units; } - /* LIGHT INSTANCE API */ - - virtual RID light_instance_create(RID p_light) override; - virtual void light_instance_set_transform(RID p_light_instance, const Transform3D &p_transform) override; - virtual void light_instance_set_aabb(RID p_light_instance, const AABB &p_aabb) override; - virtual void light_instance_set_shadow_transform(RID p_light_instance, const Projection &p_projection, const Transform3D &p_transform, float p_far, float p_split, int p_pass, float p_shadow_texel_size, float p_bias_scale = 1.0, float p_range_begin = 0, const Vector2 &p_uv_scale = Vector2()) override; - virtual void light_instance_mark_visible(RID p_light_instance) override; - - _FORCE_INLINE_ RID light_instance_get_base_light(RID p_light_instance) { - LightInstance *li = light_instance_owner.get_or_null(p_light_instance); - return li->light; - } - - _FORCE_INLINE_ Transform3D light_instance_get_base_transform(RID p_light_instance) { - LightInstance *li = light_instance_owner.get_or_null(p_light_instance); - return li->transform; - } - - _FORCE_INLINE_ Rect2 light_instance_get_shadow_atlas_rect(RID p_light_instance, RID p_shadow_atlas, Vector2i &r_omni_offset) { - ShadowAtlas *shadow_atlas = shadow_atlas_owner.get_or_null(p_shadow_atlas); - LightInstance *li = light_instance_owner.get_or_null(p_light_instance); - uint32_t key = shadow_atlas->shadow_owners[li->self]; - - uint32_t quadrant = (key >> ShadowAtlas::QUADRANT_SHIFT) & 0x3; - uint32_t shadow = key & ShadowAtlas::SHADOW_INDEX_MASK; - - ERR_FAIL_COND_V(shadow >= (uint32_t)shadow_atlas->quadrants[quadrant].shadows.size(), Rect2()); - - uint32_t atlas_size = shadow_atlas->size; - uint32_t quadrant_size = atlas_size >> 1; - - uint32_t x = (quadrant & 1) * quadrant_size; - uint32_t y = (quadrant >> 1) * quadrant_size; - - uint32_t shadow_size = (quadrant_size / shadow_atlas->quadrants[quadrant].subdivision); - x += (shadow % shadow_atlas->quadrants[quadrant].subdivision) * shadow_size; - y += (shadow / shadow_atlas->quadrants[quadrant].subdivision) * shadow_size; - - if (key & ShadowAtlas::OMNI_LIGHT_FLAG) { - if (((shadow + 1) % shadow_atlas->quadrants[quadrant].subdivision) == 0) { - r_omni_offset.x = 1 - int(shadow_atlas->quadrants[quadrant].subdivision); - r_omni_offset.y = 1; - } else { - r_omni_offset.x = 1; - r_omni_offset.y = 0; - } - } - - uint32_t width = shadow_size; - uint32_t height = shadow_size; - - return Rect2(x / float(shadow_atlas->size), y / float(shadow_atlas->size), width / float(shadow_atlas->size), height / float(shadow_atlas->size)); - } - - _FORCE_INLINE_ Projection light_instance_get_shadow_camera(RID p_light_instance, int p_index) { - LightInstance *li = light_instance_owner.get_or_null(p_light_instance); - return li->shadow_transform[p_index].camera; - } - - _FORCE_INLINE_ float light_instance_get_shadow_texel_size(RID p_light_instance, RID p_shadow_atlas) { -#ifdef DEBUG_ENABLED - LightInstance *li = light_instance_owner.get_or_null(p_light_instance); - ERR_FAIL_COND_V(!li->shadow_atlases.has(p_shadow_atlas), 0); -#endif - ShadowAtlas *shadow_atlas = shadow_atlas_owner.get_or_null(p_shadow_atlas); - ERR_FAIL_COND_V(!shadow_atlas, 0); -#ifdef DEBUG_ENABLED - ERR_FAIL_COND_V(!shadow_atlas->shadow_owners.has(p_light_instance), 0); -#endif - uint32_t key = shadow_atlas->shadow_owners[p_light_instance]; - - uint32_t quadrant = (key >> ShadowAtlas::QUADRANT_SHIFT) & 0x3; - - uint32_t quadrant_size = shadow_atlas->size >> 1; - - uint32_t shadow_size = (quadrant_size / shadow_atlas->quadrants[quadrant].subdivision); - - return float(1.0) / shadow_size; - } - - _FORCE_INLINE_ Transform3D - light_instance_get_shadow_transform(RID p_light_instance, int p_index) { - LightInstance *li = light_instance_owner.get_or_null(p_light_instance); - return li->shadow_transform[p_index].transform; - } - _FORCE_INLINE_ float light_instance_get_shadow_bias_scale(RID p_light_instance, int p_index) { - LightInstance *li = light_instance_owner.get_or_null(p_light_instance); - return li->shadow_transform[p_index].bias_scale; - } - _FORCE_INLINE_ float light_instance_get_shadow_range(RID p_light_instance, int p_index) { - LightInstance *li = light_instance_owner.get_or_null(p_light_instance); - return li->shadow_transform[p_index].farplane; - } - _FORCE_INLINE_ float light_instance_get_shadow_range_begin(RID p_light_instance, int p_index) { - LightInstance *li = light_instance_owner.get_or_null(p_light_instance); - return li->shadow_transform[p_index].range_begin; - } - - _FORCE_INLINE_ Vector2 light_instance_get_shadow_uv_scale(RID p_light_instance, int p_index) { - LightInstance *li = light_instance_owner.get_or_null(p_light_instance); - return li->shadow_transform[p_index].uv_scale; - } - - _FORCE_INLINE_ Rect2 light_instance_get_directional_shadow_atlas_rect(RID p_light_instance, int p_index) { - LightInstance *li = light_instance_owner.get_or_null(p_light_instance); - return li->shadow_transform[p_index].atlas_rect; - } - - _FORCE_INLINE_ float light_instance_get_directional_shadow_split(RID p_light_instance, int p_index) { - LightInstance *li = light_instance_owner.get_or_null(p_light_instance); - return li->shadow_transform[p_index].split; - } - - _FORCE_INLINE_ float light_instance_get_directional_shadow_texel_size(RID p_light_instance, int p_index) { - LightInstance *li = light_instance_owner.get_or_null(p_light_instance); - return li->shadow_transform[p_index].shadow_texel_size; - } - - _FORCE_INLINE_ void light_instance_set_render_pass(RID p_light_instance, uint64_t p_pass) { - LightInstance *li = light_instance_owner.get_or_null(p_light_instance); - li->last_pass = p_pass; - } - - _FORCE_INLINE_ uint64_t light_instance_get_render_pass(RID p_light_instance) { - LightInstance *li = light_instance_owner.get_or_null(p_light_instance); - return li->last_pass; - } + /* REFLECTION PROBE */ - _FORCE_INLINE_ ForwardID light_instance_get_forward_id(RID p_light_instance) { - LightInstance *li = light_instance_owner.get_or_null(p_light_instance); - return li->forward_id; - } - - _FORCE_INLINE_ RS::LightType light_instance_get_type(RID p_light_instance) { - LightInstance *li = light_instance_owner.get_or_null(p_light_instance); - return li->light_type; - } + virtual RID reflection_probe_create_framebuffer(RID p_color, RID p_depth); /* FOG VOLUMES */ + uint32_t get_volumetric_fog_size() const { return volumetric_fog_size; } + uint32_t get_volumetric_fog_depth() const { return volumetric_fog_depth; } + bool get_volumetric_fog_filter_active() const { return volumetric_fog_filter_active; } + virtual RID fog_volume_instance_create(RID p_fog_volume) override; virtual void fog_volume_instance_set_transform(RID p_fog_volume_instance, const Transform3D &p_transform) override; virtual void fog_volume_instance_set_active(RID p_fog_volume_instance, bool p_active) override; virtual RID fog_volume_instance_get_volume(RID p_fog_volume_instance) const override; virtual Vector3 fog_volume_instance_get_position(RID p_fog_volume_instance) const override; - virtual RID reflection_atlas_create() override; - virtual void reflection_atlas_set_size(RID p_ref_atlas, int p_reflection_size, int p_reflection_count) override; - virtual int reflection_atlas_get_size(RID p_ref_atlas) const override; - - _FORCE_INLINE_ RID reflection_atlas_get_texture(RID p_ref_atlas) { - ReflectionAtlas *atlas = reflection_atlas_owner.get_or_null(p_ref_atlas); - ERR_FAIL_COND_V(!atlas, RID()); - return atlas->reflection; - } - - virtual RID reflection_probe_instance_create(RID p_probe) override; - virtual void reflection_probe_instance_set_transform(RID p_instance, const Transform3D &p_transform) override; - virtual void reflection_probe_release_atlas_index(RID p_instance) override; - virtual bool reflection_probe_instance_needs_redraw(RID p_instance) override; - virtual bool reflection_probe_instance_has_reflection(RID p_instance) override; - virtual bool reflection_probe_instance_begin_render(RID p_instance, RID p_reflection_atlas) override; - virtual RID reflection_probe_create_framebuffer(RID p_color, RID p_depth); - virtual bool reflection_probe_instance_postprocess_step(RID p_instance) override; - - uint32_t reflection_probe_instance_get_resolution(RID p_instance); - RID reflection_probe_instance_get_framebuffer(RID p_instance, int p_index); - RID reflection_probe_instance_get_depth_framebuffer(RID p_instance, int p_index); - - _FORCE_INLINE_ RID reflection_probe_instance_get_probe(RID p_instance) { - ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); - ERR_FAIL_COND_V(!rpi, RID()); - - return rpi->probe; - } - - _FORCE_INLINE_ ForwardID reflection_probe_instance_get_forward_id(RID p_instance) { - ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); - ERR_FAIL_COND_V(!rpi, 0); - - return rpi->forward_id; - } - - _FORCE_INLINE_ void reflection_probe_instance_set_render_pass(RID p_instance, uint32_t p_render_pass) { - ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); - ERR_FAIL_COND(!rpi); - rpi->last_pass = p_render_pass; - } - - _FORCE_INLINE_ uint32_t reflection_probe_instance_get_render_pass(RID p_instance) { - ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); - ERR_FAIL_COND_V(!rpi, 0); - - return rpi->last_pass; - } - - _FORCE_INLINE_ Transform3D reflection_probe_instance_get_transform(RID p_instance) { - ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); - ERR_FAIL_COND_V(!rpi, Transform3D()); - - return rpi->transform; - } - - _FORCE_INLINE_ int reflection_probe_instance_get_atlas_index(RID p_instance) { - ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); - ERR_FAIL_COND_V(!rpi, -1); - - return rpi->atlas_index; - } - - virtual RID decal_instance_create(RID p_decal) override; - virtual void decal_instance_set_transform(RID p_decal, const Transform3D &p_transform) override; - - _FORCE_INLINE_ RID decal_instance_get_base(RID p_decal) const { - DecalInstance *decal = decal_instance_owner.get_or_null(p_decal); - return decal->decal; - } - - _FORCE_INLINE_ ForwardID decal_instance_get_forward_id(RID p_decal) const { - DecalInstance *decal = decal_instance_owner.get_or_null(p_decal); - return decal->forward_id; - } - - _FORCE_INLINE_ Transform3D decal_instance_get_transform(RID p_decal) const { - DecalInstance *decal = decal_instance_owner.get_or_null(p_decal); - return decal->transform; - } - - virtual RID lightmap_instance_create(RID p_lightmap) override; - virtual void lightmap_instance_set_transform(RID p_lightmap, const Transform3D &p_transform) override; - _FORCE_INLINE_ bool lightmap_instance_is_valid(RID p_lightmap_instance) { - return lightmap_instance_owner.get_or_null(p_lightmap_instance) != nullptr; - } - - _FORCE_INLINE_ RID lightmap_instance_get_lightmap(RID p_lightmap_instance) { - LightmapInstance *li = lightmap_instance_owner.get_or_null(p_lightmap_instance); - return li->lightmap; - } - _FORCE_INLINE_ Transform3D lightmap_instance_get_transform(RID p_lightmap_instance) { - LightmapInstance *li = lightmap_instance_owner.get_or_null(p_lightmap_instance); - return li->transform; - } - /* gi light probes */ virtual RID voxel_gi_instance_create(RID p_base) override; @@ -967,9 +288,10 @@ public: RID render_buffers_get_default_voxel_gi_buffer(); + virtual void base_uniforms_changed() = 0; virtual void update_uniform_sets(){}; - virtual void render_scene(const Ref<RenderSceneBuffers> &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray<RenderGeometryInstance *> &p_instances, const PagedArray<RID> &p_lights, const PagedArray<RID> &p_reflection_probes, const PagedArray<RID> &p_voxel_gi_instances, const PagedArray<RID> &p_decals, const PagedArray<RID> &p_lightmaps, const PagedArray<RID> &p_fog_volumes, RID p_environment, RID p_camera_attributes, RID p_shadow_atlas, RID p_occluder_debug_tex, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, const RenderShadowData *p_render_shadows, int p_render_shadow_count, const RenderSDFGIData *p_render_sdfgi_regions, int p_render_sdfgi_region_count, const RenderSDFGIUpdateData *p_sdfgi_update_data = nullptr, RendererScene::RenderInfo *r_render_info = nullptr) override; + virtual void render_scene(const Ref<RenderSceneBuffers> &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray<RenderGeometryInstance *> &p_instances, const PagedArray<RID> &p_lights, const PagedArray<RID> &p_reflection_probes, const PagedArray<RID> &p_voxel_gi_instances, const PagedArray<RID> &p_decals, const PagedArray<RID> &p_lightmaps, const PagedArray<RID> &p_fog_volumes, RID p_environment, RID p_camera_attributes, RID p_shadow_atlas, RID p_occluder_debug_tex, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, const RenderShadowData *p_render_shadows, int p_render_shadow_count, const RenderSDFGIData *p_render_sdfgi_regions, int p_render_sdfgi_region_count, const RenderSDFGIUpdateData *p_sdfgi_update_data = nullptr, RenderingMethod::RenderInfo *r_render_info = nullptr) override; virtual void render_material(const Transform3D &p_cam_transform, const Projection &p_cam_projection, bool p_cam_orthogonal, const PagedArray<RenderGeometryInstance *> &p_instances, RID p_framebuffer, const Rect2i &p_region) override; @@ -987,10 +309,6 @@ public: virtual float screen_space_roughness_limiter_get_amount() const; virtual float screen_space_roughness_limiter_get_limit() const; - virtual void sub_surface_scattering_set_quality(RS::SubSurfaceScatteringQuality p_quality) override; - RS::SubSurfaceScatteringQuality sub_surface_scattering_get_quality() const; - virtual void sub_surface_scattering_set_scale(float p_scale, float p_depth_scale) override; - virtual void positional_soft_shadow_filter_set_quality(RS::ShadowQuality p_quality) override; virtual void directional_soft_shadow_filter_set_quality(RS::ShadowQuality p_quality) override; @@ -1059,18 +377,10 @@ public: virtual void set_time(double p_time, double p_step) override; - RID get_reflection_probe_buffer(); - RID get_omni_light_buffer(); - RID get_spot_light_buffer(); - RID get_directional_light_buffer(); - RID get_decal_buffer(); - int get_max_directional_lights() const; - virtual void sdfgi_set_debug_probe_select(const Vector3 &p_position, const Vector3 &p_dir) override; virtual bool is_vrs_supported() const; virtual bool is_dynamic_gi_supported() const; - virtual bool is_clustered_enabled() const; virtual bool is_volumetric_supported() const; virtual uint32_t get_max_elements() const; diff --git a/servers/rendering/renderer_rd/shaders/SCsub b/servers/rendering/renderer_rd/shaders/SCsub index d352743908..5405985741 100644 --- a/servers/rendering/renderer_rd/shaders/SCsub +++ b/servers/rendering/renderer_rd/shaders/SCsub @@ -18,3 +18,5 @@ if "RD_GLSL" in env["BUILDERS"]: SConscript("effects/SCsub") SConscript("environment/SCsub") +SConscript("forward_clustered/SCsub") +SConscript("forward_mobile/SCsub") diff --git a/servers/rendering/renderer_rd/shaders/canvas.glsl b/servers/rendering/renderer_rd/shaders/canvas.glsl index 459d798a80..45dc63aa17 100644 --- a/servers/rendering/renderer_rd/shaders/canvas.glsl +++ b/servers/rendering/renderer_rd/shaders/canvas.glsl @@ -313,6 +313,14 @@ vec4 light_compute( vec2 uv, vec4 color, bool is_directional) { vec4 light = vec4(0.0); + vec3 light_direction = vec3(0.0); + + if (is_directional) { + light_direction = normalize(mix(vec3(light_position.xy, 0.0), vec3(0, 0, 1), light_position.z)); + light_position = vec3(0.0); + } else { + light_direction = normalize(light_position - light_vertex); + } #CODE : LIGHT @@ -595,9 +603,11 @@ void main() { color = vec4(0.0); //invisible by default due to using light mask } + vec4 original_color = color; + #ifdef MODE_LIGHT_ONLY color = vec4(0.0); -#else +#elif !defined(MODE_UNSHADED) color *= canvas_data.canvas_modulation; #endif @@ -636,6 +646,8 @@ void main() { ); } + light_color.rgb *= original_color.rgb; + light_blend_compute(light_base, light_color, color.rgb); } @@ -682,7 +694,6 @@ void main() { vec3 light_pos = vec3(light_array.data[light_base].position, light_array.data[light_base].height); vec3 pos = light_vertex; vec3 light_vec = normalize(light_pos - pos); - float cNdotL = max(0.0, dot(normal, light_vec)); light_color.rgb = light_normal_compute(light_vec, normal, base_color, light_color.rgb, specular_shininess, specular_shininess_used); } @@ -732,6 +743,8 @@ void main() { ); } + light_color.rgb *= original_color.rgb; + light_blend_compute(light_base, light_color, color.rgb); } #endif diff --git a/servers/rendering/renderer_rd/shaders/effects/SCsub b/servers/rendering/renderer_rd/shaders/effects/SCsub index 741da8fe69..f06a2d86e2 100644 --- a/servers/rendering/renderer_rd/shaders/effects/SCsub +++ b/servers/rendering/renderer_rd/shaders/effects/SCsub @@ -4,7 +4,7 @@ Import("env") if "RD_GLSL" in env["BUILDERS"]: # find all include files - gl_include_files = [str(f) for f in Glob("*_inc.glsl")] + gl_include_files = [str(f) for f in Glob("*_inc.glsl")] + [str(f) for f in Glob("../*_inc.glsl")] # find all shader code(all glsl files excluding our include files) glsl_files = [str(f) for f in Glob("*.glsl") if str(f) not in gl_include_files] diff --git a/servers/rendering/renderer_rd/shaders/effects/bokeh_dof.glsl b/servers/rendering/renderer_rd/shaders/effects/bokeh_dof.glsl index bdf84bb03a..fe770ac065 100644 --- a/servers/rendering/renderer_rd/shaders/effects/bokeh_dof.glsl +++ b/servers/rendering/renderer_rd/shaders/effects/bokeh_dof.glsl @@ -186,6 +186,7 @@ void main() { uv += pixel_size * 0.5; //half pixel to read centers vec4 color = texture(color_texture, uv); + float initial_blur = color.a; float accum = 1.0; float radius = params.blur_scale; @@ -193,8 +194,8 @@ void main() { vec2 suv = uv + vec2(cos(ang), sin(ang)) * pixel_size * radius; vec4 sample_color = texture(color_texture, suv); float sample_size = abs(sample_color.a); - if (sample_color.a > color.a) { - sample_size = clamp(sample_size, 0.0, abs(color.a) * 2.0); + if (sample_color.a > initial_blur) { + sample_size = clamp(sample_size, 0.0, abs(initial_blur) * 2.0); } float m = smoothstep(radius - 0.5, radius + 0.5, sample_size); diff --git a/servers/rendering/renderer_rd/shaders/effects/bokeh_dof_raster.glsl b/servers/rendering/renderer_rd/shaders/effects/bokeh_dof_raster.glsl index a2bdc2e90e..1b487835d2 100644 --- a/servers/rendering/renderer_rd/shaders/effects/bokeh_dof_raster.glsl +++ b/servers/rendering/renderer_rd/shaders/effects/bokeh_dof_raster.glsl @@ -221,12 +221,9 @@ void main() { vec4 sample_color = texture(source_color, uv_adj); sample_color.a = texture(source_weight, uv_adj).r; - float limit; - - if (sample_color.a < color.a) { - limit = abs(sample_color.a); - } else { - limit = abs(color.a); + float limit = abs(sample_color.a); + if (sample_color.a > color.a) { + limit = clamp(limit, 0.0, abs(color.a) * 2.0); } limit -= DEPTH_GAP; diff --git a/servers/rendering/renderer_rd/shaders/effects/screen_space_reflection.glsl b/servers/rendering/renderer_rd/shaders/effects/screen_space_reflection.glsl index 246ef81cb2..9f86643e52 100644 --- a/servers/rendering/renderer_rd/shaders/effects/screen_space_reflection.glsl +++ b/servers/rendering/renderer_rd/shaders/effects/screen_space_reflection.glsl @@ -30,12 +30,7 @@ layout(push_constant, std430) uniform Params { bool orthogonal; float filter_mipmap_levels; bool use_half_res; - uint metallic_mask; - uint view_index; - uint pad1; - uint pad2; - uint pad3; } params; @@ -167,7 +162,7 @@ void main() { if (depth > z_to) { // if depth was surpassed - if (depth <= max(z_to, z_from) + params.depth_tolerance && -depth < params.camera_z_far) { + if (depth <= max(z_to, z_from) + params.depth_tolerance && -depth < params.camera_z_far * 0.95) { // check the depth tolerance and far clip // check that normal is valid found = true; @@ -231,18 +226,20 @@ void main() { } } - // Isn't this going to be overwritten after our endif? - final_color = imageLoad(source_diffuse, ivec2((final_pos - 0.5) * pixel_size)); - imageStore(blur_radius_image, ssC, vec4(blur_radius / 255.0)); //stored in r8 #endif // MODE_ROUGH final_color = vec4(imageLoad(source_diffuse, ivec2(final_pos - 0.5)).rgb, fade * margin_blend); - //change blend by metallic - vec4 metallic_mask = unpackUnorm4x8(params.metallic_mask); - final_color.a *= dot(metallic_mask, texelFetch(source_metallic, ssC << 1, 0)); + // Schlick term. + float metallic = texelFetch(source_metallic, ssC << 1, 0).w; + float f0 = mix(0.04, 1.0, metallic); // Assume a "specular" amount of 0.5 + normal.y = -normal.y; + float m = clamp(1.0 - dot(normalize(normal), -view_dir), 0.0, 1.0); + float m2 = m * m; + m = m2 * m2 * m; // pow(m,5) + final_color.a *= f0 + (1.0 - f0) * m; // Fresnel Schlick term. imageStore(ssr_image, ssC, final_color); diff --git a/servers/rendering/renderer_rd/shaders/effects/tonemap.glsl b/servers/rendering/renderer_rd/shaders/effects/tonemap.glsl index e459756c6a..52aee8b648 100644 --- a/servers/rendering/renderer_rd/shaders/effects/tonemap.glsl +++ b/servers/rendering/renderer_rd/shaders/effects/tonemap.glsl @@ -360,15 +360,15 @@ vec3 do_fxaa(vec3 color, float exposure, vec2 uv_interp) { const float FXAA_SPAN_MAX = 8.0; #ifdef MULTIVIEW - vec3 rgbNW = textureLod(source_color, vec3(uv_interp + vec2(-1.0, -1.0) * params.pixel_size, ViewIndex), 0.0).xyz * exposure * params.luminance_multiplier; - vec3 rgbNE = textureLod(source_color, vec3(uv_interp + vec2(1.0, -1.0) * params.pixel_size, ViewIndex), 0.0).xyz * exposure * params.luminance_multiplier; - vec3 rgbSW = textureLod(source_color, vec3(uv_interp + vec2(-1.0, 1.0) * params.pixel_size, ViewIndex), 0.0).xyz * exposure * params.luminance_multiplier; - vec3 rgbSE = textureLod(source_color, vec3(uv_interp + vec2(1.0, 1.0) * params.pixel_size, ViewIndex), 0.0).xyz * exposure * params.luminance_multiplier; + vec3 rgbNW = textureLod(source_color, vec3(uv_interp + vec2(-0.5, -0.5) * params.pixel_size, ViewIndex), 0.0).xyz * exposure * params.luminance_multiplier; + vec3 rgbNE = textureLod(source_color, vec3(uv_interp + vec2(0.5, -0.5) * params.pixel_size, ViewIndex), 0.0).xyz * exposure * params.luminance_multiplier; + vec3 rgbSW = textureLod(source_color, vec3(uv_interp + vec2(-0.5, 0.5) * params.pixel_size, ViewIndex), 0.0).xyz * exposure * params.luminance_multiplier; + vec3 rgbSE = textureLod(source_color, vec3(uv_interp + vec2(0.5, 0.5) * params.pixel_size, ViewIndex), 0.0).xyz * exposure * params.luminance_multiplier; #else - vec3 rgbNW = textureLod(source_color, uv_interp + vec2(-1.0, -1.0) * params.pixel_size, 0.0).xyz * exposure * params.luminance_multiplier; - vec3 rgbNE = textureLod(source_color, uv_interp + vec2(1.0, -1.0) * params.pixel_size, 0.0).xyz * exposure * params.luminance_multiplier; - vec3 rgbSW = textureLod(source_color, uv_interp + vec2(-1.0, 1.0) * params.pixel_size, 0.0).xyz * exposure * params.luminance_multiplier; - vec3 rgbSE = textureLod(source_color, uv_interp + vec2(1.0, 1.0) * params.pixel_size, 0.0).xyz * exposure * params.luminance_multiplier; + vec3 rgbNW = textureLod(source_color, uv_interp + vec2(-0.5, -0.5) * params.pixel_size, 0.0).xyz * exposure * params.luminance_multiplier; + vec3 rgbNE = textureLod(source_color, uv_interp + vec2(0.5, -0.5) * params.pixel_size, 0.0).xyz * exposure * params.luminance_multiplier; + vec3 rgbSW = textureLod(source_color, uv_interp + vec2(-0.5, 0.5) * params.pixel_size, 0.0).xyz * exposure * params.luminance_multiplier; + vec3 rgbSE = textureLod(source_color, uv_interp + vec2(0.5, 0.5) * params.pixel_size, 0.0).xyz * exposure * params.luminance_multiplier; #endif vec3 rgbM = color; vec3 luma = vec3(0.299, 0.587, 0.114); @@ -462,12 +462,6 @@ void main() { } #endif - if (params.use_debanding) { - // For best results, debanding should be done before tonemapping. - // Otherwise, we're adding noise to an already-quantized image. - color.rgb += screen_space_dither(gl_FragCoord.xy); - } - color.rgb = apply_tonemapping(color.rgb, params.white); color.rgb = linear_to_srgb(color.rgb); // regular linear -> SRGB conversion @@ -498,5 +492,11 @@ void main() { color.rgb = apply_color_correction(color.rgb); } + if (params.use_debanding) { + // Debanding should be done at the end of tonemapping, but before writing to the LDR buffer. + // Otherwise, we're adding noise to an already-quantized image. + color.rgb += screen_space_dither(gl_FragCoord.xy); + } + frag_color = color; } diff --git a/servers/rendering/renderer_rd/shaders/environment/SCsub b/servers/rendering/renderer_rd/shaders/environment/SCsub index 741da8fe69..f06a2d86e2 100644 --- a/servers/rendering/renderer_rd/shaders/environment/SCsub +++ b/servers/rendering/renderer_rd/shaders/environment/SCsub @@ -4,7 +4,7 @@ Import("env") if "RD_GLSL" in env["BUILDERS"]: # find all include files - gl_include_files = [str(f) for f in Glob("*_inc.glsl")] + gl_include_files = [str(f) for f in Glob("*_inc.glsl")] + [str(f) for f in Glob("../*_inc.glsl")] # find all shader code(all glsl files excluding our include files) glsl_files = [str(f) for f in Glob("*.glsl") if str(f) not in gl_include_files] diff --git a/servers/rendering/renderer_rd/shaders/environment/sky.glsl b/servers/rendering/renderer_rd/shaders/environment/sky.glsl index 0eb0f5f8fd..d523461600 100644 --- a/servers/rendering/renderer_rd/shaders/environment/sky.glsl +++ b/servers/rendering/renderer_rd/shaders/environment/sky.glsl @@ -153,6 +153,15 @@ layout(set = 3, binding = 0) uniform texture3D volumetric_fog_texture; layout(location = 0) out vec4 frag_color; +#ifdef USE_DEBANDING +// https://www.iryoku.com/next-generation-post-processing-in-call-of-duty-advanced-warfare +vec3 interleaved_gradient_noise(vec2 pos) { + const vec3 magic = vec3(0.06711056f, 0.00583715f, 52.9829189f); + float res = fract(magic.z * fract(dot(pos, magic.xy))) * 2.0 - 1.0; + return vec3(res, -res, res) / 255.0; +} +#endif + vec4 volumetric_fog_process(vec2 screen_uv) { vec3 fog_pos = vec3(screen_uv, 1.0); @@ -252,4 +261,8 @@ void main() { // For mobile renderer we're multiplying by 0.5 as we're using a UNORM buffer. // For both mobile and clustered, we also bake in the exposure value for the environment and camera. frag_color.rgb = frag_color.rgb * params.luminance_multiplier; + +#ifdef USE_DEBANDING + frag_color.rgb += interleaved_gradient_noise(gl_FragCoord.xy); +#endif } diff --git a/servers/rendering/renderer_rd/shaders/forward_clustered/SCsub b/servers/rendering/renderer_rd/shaders/forward_clustered/SCsub new file mode 100644 index 0000000000..f06a2d86e2 --- /dev/null +++ b/servers/rendering/renderer_rd/shaders/forward_clustered/SCsub @@ -0,0 +1,17 @@ +#!/usr/bin/env python + +Import("env") + +if "RD_GLSL" in env["BUILDERS"]: + # find all include files + gl_include_files = [str(f) for f in Glob("*_inc.glsl")] + [str(f) for f in Glob("../*_inc.glsl")] + + # find all shader code(all glsl files excluding our include files) + glsl_files = [str(f) for f in Glob("*.glsl") if str(f) not in gl_include_files] + + # make sure we recompile shaders if include files change + env.Depends([f + ".gen.h" for f in glsl_files], gl_include_files + ["#glsl_builders.py"]) + + # compile shaders + for glsl_file in glsl_files: + env.RD_GLSL(glsl_file) diff --git a/servers/rendering/renderer_rd/shaders/scene_forward_clustered.glsl b/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl index 26b96b358f..1a8a1f3aa3 100644 --- a/servers/rendering/renderer_rd/shaders/scene_forward_clustered.glsl +++ b/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl @@ -129,12 +129,52 @@ invariant gl_Position; #GLOBALS -void vertex_shader(in uint instance_index, in bool is_multimesh, in SceneData scene_data, in mat4 model_matrix, out vec4 screen_pos) { +#ifdef USE_DOUBLE_PRECISION +// Helper functions for emulating double precision when adding floats. +vec3 quick_two_sum(vec3 a, vec3 b, out vec3 out_p) { + vec3 s = a + b; + out_p = b - (s - a); + return s; +} + +vec3 two_sum(vec3 a, vec3 b, out vec3 out_p) { + vec3 s = a + b; + vec3 v = s - a; + out_p = (a - (s - v)) + (b - v); + return s; +} + +vec3 double_add_vec3(vec3 base_a, vec3 prec_a, vec3 base_b, vec3 prec_b, out vec3 out_precision) { + vec3 s, t, se, te; + s = two_sum(base_a, base_b, se); + t = two_sum(prec_a, prec_b, te); + se += t; + s = quick_two_sum(s, se, se); + se += te; + s = quick_two_sum(s, se, out_precision); + return s; +} +#endif + +void vertex_shader(in uint instance_index, in bool is_multimesh, in uint multimesh_offset, in SceneData scene_data, in mat4 model_matrix, out vec4 screen_pos) { vec4 instance_custom = vec4(0.0); #if defined(COLOR_USED) color_interp = color_attrib; #endif + mat4 inv_view_matrix = scene_data.inv_view_matrix; + +#ifdef USE_DOUBLE_PRECISION + vec3 model_precision = vec3(model_matrix[0][3], model_matrix[1][3], model_matrix[2][3]); + model_matrix[0][3] = 0.0; + model_matrix[1][3] = 0.0; + model_matrix[2][3] = 0.0; + vec3 view_precision = vec3(inv_view_matrix[0][3], inv_view_matrix[1][3], inv_view_matrix[2][3]); + inv_view_matrix[0][3] = 0.0; + inv_view_matrix[1][3] = 0.0; + inv_view_matrix[2][3] = 0.0; +#endif + mat3 model_normal_matrix; if (bool(instances.data[instance_index].flags & INSTANCE_FLAGS_NON_UNIFORM_SCALE)) { model_normal_matrix = transpose(inverse(mat3(model_matrix))); @@ -142,11 +182,12 @@ void vertex_shader(in uint instance_index, in bool is_multimesh, in SceneData sc model_normal_matrix = mat3(model_matrix); } + mat4 matrix; + mat4 read_model_matrix = model_matrix; + if (is_multimesh) { //multimesh, instances are for it - mat4 matrix; - #ifdef USE_PARTICLE_TRAILS uint trail_size = (instances.data[instance_index].flags >> INSTANCE_FLAGS_PARTICLE_TRAIL_SHIFT) & INSTANCE_FLAGS_PARTICLE_TRAIL_MASK; uint stride = 3 + 1 + 1; //particles always uses this format @@ -208,7 +249,7 @@ void vertex_shader(in uint instance_index, in bool is_multimesh, in SceneData sc } } - uint offset = stride * gl_InstanceIndex; + uint offset = stride * (gl_InstanceIndex + multimesh_offset); if (bool(instances.data[instance_index].flags & INSTANCE_FLAGS_MULTIMESH_FORMAT_2D)) { matrix = mat4(transforms.data[offset + 0], transforms.data[offset + 1], vec4(0.0, 0.0, 1.0, 0.0), vec4(0.0, 0.0, 0.0, 1.0)); @@ -232,7 +273,14 @@ void vertex_shader(in uint instance_index, in bool is_multimesh, in SceneData sc #endif //transpose matrix = transpose(matrix); - model_matrix = model_matrix * matrix; +#if !defined(USE_DOUBLE_PRECISION) || defined(SKIP_TRANSFORM_USED) || defined(VERTEX_WORLD_COORDS_USED) || defined(MODEL_MATRIX_USED) + // Normally we can bake the multimesh transform into the model matrix, but when using double precision + // we avoid baking it in so we can emulate high precision. + read_model_matrix = model_matrix * matrix; +#if !defined(USE_DOUBLE_PRECISION) || defined(SKIP_TRANSFORM_USED) || defined(VERTEX_WORLD_COORDS_USED) + model_matrix = read_model_matrix; +#endif // !defined(USE_DOUBLE_PRECISION) || defined(SKIP_TRANSFORM_USED) || defined(VERTEX_WORLD_COORDS_USED) +#endif // !defined(USE_DOUBLE_PRECISION) || defined(SKIP_TRANSFORM_USED) || defined(VERTEX_WORLD_COORDS_USED) || defined(MODEL_MATRIX_USED) model_normal_matrix = model_normal_matrix * mat3(matrix); } @@ -297,7 +345,22 @@ void vertex_shader(in uint instance_index, in bool is_multimesh, in SceneData sc // using local coordinates (default) #if !defined(SKIP_TRANSFORM_USED) && !defined(VERTEX_WORLD_COORDS_USED) +#ifdef USE_DOUBLE_PRECISION + // We separate the basis from the origin because the basis is fine with single point precision. + // Then we combine the translations from the model matrix and the view matrix using emulated doubles. + // We add the result to the vertex and ignore the final lost precision. + vec3 model_origin = model_matrix[3].xyz; + if (is_multimesh) { + vertex = mat3(matrix) * vertex; + model_origin = double_add_vec3(model_origin, model_precision, matrix[3].xyz, vec3(0.0), model_precision); + } + vertex = mat3(model_matrix) * vertex; + vec3 temp_precision; // Will be ignored. + vertex += double_add_vec3(model_origin, model_precision, scene_data.inv_view_matrix[3].xyz, view_precision, temp_precision); + vertex = mat3(scene_data.view_matrix) * vertex; +#else vertex = (modelview * vec4(vertex, 1.0)).xyz; +#endif #ifdef NORMAL_USED normal = modelview_normal * normal; #endif @@ -326,10 +389,6 @@ void vertex_shader(in uint instance_index, in bool is_multimesh, in SceneData sc vertex_interp = vertex; -#ifdef MOTION_VECTORS - screen_pos = projection_matrix * vec4(vertex_interp, 1.0); -#endif - #ifdef NORMAL_USED normal_interp = normal; #endif @@ -367,6 +426,10 @@ void vertex_shader(in uint instance_index, in bool is_multimesh, in SceneData sc gl_Position = projection_matrix * vec4(vertex_interp, 1.0); #endif +#ifdef MOTION_VECTORS + screen_pos = gl_Position; +#endif + #ifdef MODE_RENDER_DEPTH if (scene_data.pancake_shadows) { if (gl_Position.z <= 0.00001) { @@ -397,13 +460,13 @@ void main() { mat4 model_matrix = instances.data[instance_index].transform; #if defined(MOTION_VECTORS) global_time = scene_data_block.prev_data.time; - vertex_shader(instance_index, is_multimesh, scene_data_block.prev_data, instances.data[instance_index].prev_transform, prev_screen_position); + vertex_shader(instance_index, is_multimesh, draw_call.multimesh_motion_vectors_previous_offset, scene_data_block.prev_data, instances.data[instance_index].prev_transform, prev_screen_position); global_time = scene_data_block.data.time; - vertex_shader(instance_index, is_multimesh, scene_data_block.data, model_matrix, screen_position); + vertex_shader(instance_index, is_multimesh, draw_call.multimesh_motion_vectors_current_offset, scene_data_block.data, model_matrix, screen_position); #else global_time = scene_data_block.data.time; vec4 screen_position; - vertex_shader(instance_index, is_multimesh, scene_data_block.data, model_matrix, screen_position); + vertex_shader(instance_index, is_multimesh, draw_call.multimesh_motion_vectors_current_offset, scene_data_block.data, model_matrix, screen_position); #endif } @@ -490,7 +553,6 @@ layout(location = 10) in flat uint instance_index_interp; //defines to keep compatibility with vertex -#define model_matrix instances.data[draw_call.instance_index].transform #ifdef USE_MULTIVIEW #define projection_matrix scene_data.projection_matrix_view[ViewIndex] #define inv_projection_matrix scene_data.inv_projection_matrix_view[ViewIndex] @@ -553,7 +615,7 @@ layout(location = 0) out vec4 frag_color; layout(location = 2) out vec2 motion_vector; #endif -#include "scene_forward_aa_inc.glsl" +#include "../scene_forward_aa_inc.glsl" #if !defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED) @@ -562,20 +624,20 @@ layout(location = 2) out vec2 motion_vector; #define SPECULAR_SCHLICK_GGX #endif -#include "scene_forward_lights_inc.glsl" +#include "../scene_forward_lights_inc.glsl" -#include "scene_forward_gi_inc.glsl" +#include "../scene_forward_gi_inc.glsl" #endif //!defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED) #ifndef MODE_RENDER_DEPTH vec4 volumetric_fog_process(vec2 screen_uv, float z) { - vec3 fog_pos = vec3(screen_uv, z * scene_data_block.data.volumetric_fog_inv_length); + vec3 fog_pos = vec3(screen_uv, z * implementation_data.volumetric_fog_inv_length); if (fog_pos.z < 0.0) { return vec4(0.0); } else if (fog_pos.z < 1.0) { - fog_pos.z = pow(fog_pos.z, scene_data_block.data.volumetric_fog_detail_spread); + fog_pos.z = pow(fog_pos.z, implementation_data.volumetric_fog_detail_spread); } return texture(sampler3D(volumetric_fog_texture, material_samplers[SAMPLER_LINEAR_CLAMP]), fog_pos); @@ -737,6 +799,17 @@ void fragment_shader(in SceneData scene_data) { vec2 alpha_texture_coordinate = vec2(0.0, 0.0); #endif // ALPHA_ANTIALIASING_EDGE_USED + mat4 inv_view_matrix = scene_data.inv_view_matrix; + mat4 read_model_matrix = instances.data[instance_index].transform; +#ifdef USE_DOUBLE_PRECISION + read_model_matrix[0][3] = 0.0; + read_model_matrix[1][3] = 0.0; + read_model_matrix[2][3] = 0.0; + inv_view_matrix[0][3] = 0.0; + inv_view_matrix[1][3] = 0.0; + inv_view_matrix[2][3] = 0.0; +#endif + { #CODE : FRAGMENT } @@ -821,7 +894,7 @@ void fragment_shader(in SceneData scene_data) { fog = fog_process(vertex); } - if (scene_data.volumetric_fog_enabled) { + if (implementation_data.volumetric_fog_enabled) { vec4 volumetric_fog = volumetric_fog_process(screen_uv, -vertex.z); if (scene_data.fog_enabled) { //must use the full blending equation here to blend fogs @@ -849,8 +922,8 @@ void fragment_shader(in SceneData scene_data) { #ifndef MODE_RENDER_DEPTH - uvec2 cluster_pos = uvec2(gl_FragCoord.xy) >> scene_data.cluster_shift; - uint cluster_offset = (scene_data.cluster_width * cluster_pos.y + cluster_pos.x) * (scene_data.max_cluster_element_count_div_32 + 32); + uvec2 cluster_pos = uvec2(gl_FragCoord.xy) >> implementation_data.cluster_shift; + uint cluster_offset = (implementation_data.cluster_width * cluster_pos.y + cluster_pos.x) * (implementation_data.max_cluster_element_count_div_32 + 32); uint cluster_z = uint(clamp((-vertex.z / scene_data.z_far) * 32.0, 0.0, 31.0)); @@ -860,14 +933,14 @@ void fragment_shader(in SceneData scene_data) { { // process decals - uint cluster_decal_offset = cluster_offset + scene_data.cluster_type_size * 2; + uint cluster_decal_offset = cluster_offset + implementation_data.cluster_type_size * 2; uint item_min; uint item_max; uint item_from; uint item_to; - cluster_get_item_range(cluster_decal_offset + scene_data.max_cluster_element_count_div_32 + cluster_z, item_min, item_max, item_from, item_to); + cluster_get_item_range(cluster_decal_offset + implementation_data.max_cluster_element_count_div_32 + cluster_z, item_min, item_max, item_from, item_to); #ifdef USE_SUBGROUPS item_from = subgroupBroadcastFirst(subgroupMin(item_from)); @@ -1256,7 +1329,7 @@ void fragment_shader(in SceneData scene_data) { vec2 coord; - if (scene_data.gi_upscale_for_msaa) { + if (implementation_data.gi_upscale_for_msaa) { vec2 base_coord = screen_uv; vec2 closest_coord = base_coord; #ifdef USE_MULTIVIEW @@ -1298,10 +1371,10 @@ void fragment_shader(in SceneData scene_data) { } #endif // !USE_LIGHTMAP - if (bool(scene_data.ss_effects_flags & SCREEN_SPACE_EFFECTS_FLAGS_USE_SSAO)) { + if (bool(implementation_data.ss_effects_flags & SCREEN_SPACE_EFFECTS_FLAGS_USE_SSAO)) { float ssao = texture(sampler2D(ao_buffer, material_samplers[SAMPLER_LINEAR_CLAMP]), screen_uv).r; ao = min(ao, ssao); - ao_light_affect = mix(ao_light_affect, max(ao_light_affect, scene_data.ssao_light_affect), scene_data.ssao_ao_affect); + ao_light_affect = mix(ao_light_affect, max(ao_light_affect, implementation_data.ssao_light_affect), implementation_data.ssao_ao_affect); } { // process reflections @@ -1309,14 +1382,14 @@ void fragment_shader(in SceneData scene_data) { vec4 reflection_accum = vec4(0.0, 0.0, 0.0, 0.0); vec4 ambient_accum = vec4(0.0, 0.0, 0.0, 0.0); - uint cluster_reflection_offset = cluster_offset + scene_data.cluster_type_size * 3; + uint cluster_reflection_offset = cluster_offset + implementation_data.cluster_type_size * 3; uint item_min; uint item_max; uint item_from; uint item_to; - cluster_get_item_range(cluster_reflection_offset + scene_data.max_cluster_element_count_div_32 + cluster_z, item_min, item_max, item_from, item_to); + cluster_get_item_range(cluster_reflection_offset + implementation_data.max_cluster_element_count_div_32 + cluster_z, item_min, item_max, item_from, item_to); #ifdef USE_SUBGROUPS item_from = subgroupBroadcastFirst(subgroupMin(item_from)); @@ -1380,7 +1453,7 @@ void fragment_shader(in SceneData scene_data) { // convert ao to direct light ao ao = mix(1.0, ao, ao_light_affect); - if (bool(scene_data.ss_effects_flags & SCREEN_SPACE_EFFECTS_FLAGS_USE_SSIL)) { + if (bool(implementation_data.ss_effects_flags & SCREEN_SPACE_EFFECTS_FLAGS_USE_SSIL)) { vec4 ssil = textureLod(sampler2D(ssil_buffer, material_samplers[SAMPLER_LINEAR_CLAMP]), screen_uv, 0.0); ambient_light *= 1.0 - ssil.a; ambient_light += ssil.rgb * albedo.rgb; @@ -1748,7 +1821,7 @@ void fragment_shader(in SceneData scene_data) { uint item_from; uint item_to; - cluster_get_item_range(cluster_omni_offset + scene_data.max_cluster_element_count_div_32 + cluster_z, item_min, item_max, item_from, item_to); + cluster_get_item_range(cluster_omni_offset + implementation_data.max_cluster_element_count_div_32 + cluster_z, item_min, item_max, item_from, item_to); #ifdef USE_SUBGROUPS item_from = subgroupBroadcastFirst(subgroupMin(item_from)); @@ -1812,14 +1885,14 @@ void fragment_shader(in SceneData scene_data) { { //spot lights - uint cluster_spot_offset = cluster_offset + scene_data.cluster_type_size; + uint cluster_spot_offset = cluster_offset + implementation_data.cluster_type_size; uint item_min; uint item_max; uint item_from; uint item_to; - cluster_get_item_range(cluster_spot_offset + scene_data.max_cluster_element_count_div_32 + cluster_z, item_min, item_max, item_from, item_to); + cluster_get_item_range(cluster_spot_offset + implementation_data.max_cluster_element_count_div_32 + cluster_z, item_min, item_max, item_from, item_to); #ifdef USE_SUBGROUPS item_from = subgroupBroadcastFirst(subgroupMin(item_from)); @@ -1909,8 +1982,8 @@ void fragment_shader(in SceneData scene_data) { #ifdef MODE_RENDER_SDF { - vec3 local_pos = (scene_data.sdf_to_bounds * vec4(vertex, 1.0)).xyz; - ivec3 grid_pos = scene_data.sdf_offset + ivec3(local_pos * vec3(scene_data.sdf_size)); + vec3 local_pos = (implementation_data.sdf_to_bounds * vec4(vertex, 1.0)).xyz; + ivec3 grid_pos = implementation_data.sdf_offset + ivec3(local_pos * vec3(implementation_data.sdf_size)); uint albedo16 = 0x1; //solid flag albedo16 |= clamp(uint(albedo.r * 31.0), 0, 31) << 11; diff --git a/servers/rendering/renderer_rd/shaders/scene_forward_clustered_inc.glsl b/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered_inc.glsl index 45484b8c47..0d36b98645 100644 --- a/servers/rendering/renderer_rd/shaders/scene_forward_clustered_inc.glsl +++ b/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered_inc.glsl @@ -17,8 +17,9 @@ #extension GL_EXT_multiview : enable #endif -#include "cluster_data_inc.glsl" -#include "decal_data_inc.glsl" +#include "../cluster_data_inc.glsl" +#include "../decal_data_inc.glsl" +#include "../scene_data_inc.glsl" #if !defined(MODE_RENDER_DEPTH) || defined(MODE_RENDER_MATERIAL) || defined(MODE_RENDER_SDF) || defined(MODE_RENDER_NORMAL_ROUGHNESS) || defined(MODE_RENDER_VOXEL_GI) || defined(TANGENT_USED) || defined(NORMAL_MAP_USED) || defined(LIGHT_ANISOTROPY_USED) #ifndef NORMAL_USED @@ -29,8 +30,8 @@ layout(push_constant, std430) uniform DrawCall { uint instance_index; uint uv_offset; - uint pad0; - uint pad1; + uint multimesh_motion_vectors_current_offset; + uint multimesh_motion_vectors_previous_offset; } draw_call; @@ -38,7 +39,7 @@ draw_call; /* Set 0: Base Pass (never changes) */ -#include "light_data_inc.glsl" +#include "../light_data_inc.glsl" #define SAMPLER_NEAREST_CLAMP 0 #define SAMPLER_LINEAR_CLAMP 1 @@ -61,13 +62,14 @@ layout(set = 0, binding = 3) uniform sampler decal_sampler; layout(set = 0, binding = 4) uniform sampler light_projector_sampler; -#define INSTANCE_FLAGS_NON_UNIFORM_SCALE (1 << 5) -#define INSTANCE_FLAGS_USE_GI_BUFFERS (1 << 6) -#define INSTANCE_FLAGS_USE_SDFGI (1 << 7) -#define INSTANCE_FLAGS_USE_LIGHTMAP_CAPTURE (1 << 8) -#define INSTANCE_FLAGS_USE_LIGHTMAP (1 << 9) -#define INSTANCE_FLAGS_USE_SH_LIGHTMAP (1 << 10) -#define INSTANCE_FLAGS_USE_VOXEL_GI (1 << 11) +#define INSTANCE_FLAGS_NON_UNIFORM_SCALE (1 << 4) +#define INSTANCE_FLAGS_USE_GI_BUFFERS (1 << 5) +#define INSTANCE_FLAGS_USE_SDFGI (1 << 6) +#define INSTANCE_FLAGS_USE_LIGHTMAP_CAPTURE (1 << 7) +#define INSTANCE_FLAGS_USE_LIGHTMAP (1 << 8) +#define INSTANCE_FLAGS_USE_SH_LIGHTMAP (1 << 9) +#define INSTANCE_FLAGS_USE_VOXEL_GI (1 << 10) +#define INSTANCE_FLAGS_PARTICLES (1 << 11) #define INSTANCE_FLAGS_MULTIMESH (1 << 12) #define INSTANCE_FLAGS_MULTIMESH_FORMAT_2D (1 << 13) #define INSTANCE_FLAGS_MULTIMESH_HAS_COLOR (1 << 14) @@ -175,62 +177,27 @@ sdfgi; /* Set 1: Render Pass (changes per render pass) */ -struct SceneData { - mat4 projection_matrix; - mat4 inv_projection_matrix; - mat4 inv_view_matrix; - mat4 view_matrix; - - // only used for multiview - mat4 projection_matrix_view[MAX_VIEWS]; - mat4 inv_projection_matrix_view[MAX_VIEWS]; - vec4 eye_offset[MAX_VIEWS]; - - vec2 viewport_size; - vec2 screen_pixel_size; +layout(set = 1, binding = 0, std140) uniform SceneDataBlock { + SceneData data; + SceneData prev_data; +} +scene_data_block; +struct ImplementationData { uint cluster_shift; uint cluster_width; uint cluster_type_size; uint max_cluster_element_count_div_32; - // Use vec4s because std140 doesn't play nice with vec2s, z and w are wasted. - vec4 directional_penumbra_shadow_kernel[32]; - vec4 directional_soft_shadow_kernel[32]; - vec4 penumbra_shadow_kernel[32]; - vec4 soft_shadow_kernel[32]; - - vec4 ambient_light_color_energy; - - float ambient_color_sky_mix; - bool use_ambient_light; - bool use_ambient_cubemap; - bool use_reflection_cubemap; - - mat3 radiance_inverse_xform; - - vec2 shadow_atlas_pixel_size; - vec2 directional_shadow_pixel_size; - - uint directional_light_count; - float dual_paraboloid_side; - float z_far; - float z_near; - uint ss_effects_flags; float ssao_light_affect; float ssao_ao_affect; - bool roughness_limiter_enabled; - - float roughness_limiter_amount; - float roughness_limiter_limit; - float opaque_prepass_threshold; - uint roughness_limiter_pad; + uint pad1; mat4 sdf_to_bounds; ivec3 sdf_offset; - bool material_uv2_mode; + uint pad2; ivec3 sdf_size; bool gi_upscale_for_msaa; @@ -239,31 +206,14 @@ struct SceneData { float volumetric_fog_inv_length; float volumetric_fog_detail_spread; uint volumetric_fog_pad; - - bool fog_enabled; - float fog_density; - float fog_height; - float fog_height_density; - - vec3 fog_light_color; - float fog_sun_scatter; - - float fog_aerial_perspective; - - float time; - float reflection_multiplier; // one normally, zero when rendering reflections - - bool pancake_shadows; - vec2 taa_jitter; - float emissive_exposure_normalization; - float IBL_exposure_normalization; }; -layout(set = 1, binding = 0, std140) uniform SceneDataBlock { - SceneData data; - SceneData prev_data; +layout(set = 1, binding = 1, std140) uniform ImplementationDataBlock { + ImplementationData data; } -scene_data_block; +implementation_data_block; + +#define implementation_data implementation_data_block.data struct InstanceData { mat4 transform; @@ -275,42 +225,42 @@ struct InstanceData { vec4 lightmap_uv_scale; }; -layout(set = 1, binding = 1, std430) buffer restrict readonly InstanceDataBuffer { +layout(set = 1, binding = 2, std430) buffer restrict readonly InstanceDataBuffer { InstanceData data[]; } instances; #ifdef USE_RADIANCE_CUBEMAP_ARRAY -layout(set = 1, binding = 2) uniform textureCubeArray radiance_cubemap; +layout(set = 1, binding = 3) uniform textureCubeArray radiance_cubemap; #else -layout(set = 1, binding = 2) uniform textureCube radiance_cubemap; +layout(set = 1, binding = 3) uniform textureCube radiance_cubemap; #endif -layout(set = 1, binding = 3) uniform textureCubeArray reflection_atlas; +layout(set = 1, binding = 4) uniform textureCubeArray reflection_atlas; -layout(set = 1, binding = 4) uniform texture2D shadow_atlas; +layout(set = 1, binding = 5) uniform texture2D shadow_atlas; -layout(set = 1, binding = 5) uniform texture2D directional_shadow_atlas; +layout(set = 1, binding = 6) uniform texture2D directional_shadow_atlas; -layout(set = 1, binding = 6) uniform texture2DArray lightmap_textures[MAX_LIGHTMAP_TEXTURES]; +layout(set = 1, binding = 7) uniform texture2DArray lightmap_textures[MAX_LIGHTMAP_TEXTURES]; -layout(set = 1, binding = 7) uniform texture3D voxel_gi_textures[MAX_VOXEL_GI_INSTANCES]; +layout(set = 1, binding = 8) uniform texture3D voxel_gi_textures[MAX_VOXEL_GI_INSTANCES]; -layout(set = 1, binding = 8, std430) buffer restrict readonly ClusterBuffer { +layout(set = 1, binding = 9, std430) buffer restrict readonly ClusterBuffer { uint data[]; } cluster_buffer; #ifdef MODE_RENDER_SDF -layout(r16ui, set = 1, binding = 9) uniform restrict writeonly uimage3D albedo_volume_grid; -layout(r32ui, set = 1, binding = 10) uniform restrict writeonly uimage3D emission_grid; -layout(r32ui, set = 1, binding = 11) uniform restrict writeonly uimage3D emission_aniso_grid; -layout(r32ui, set = 1, binding = 12) uniform restrict uimage3D geom_facing_grid; +layout(r16ui, set = 1, binding = 10) uniform restrict writeonly uimage3D albedo_volume_grid; +layout(r32ui, set = 1, binding = 11) uniform restrict writeonly uimage3D emission_grid; +layout(r32ui, set = 1, binding = 12) uniform restrict writeonly uimage3D emission_aniso_grid; +layout(r32ui, set = 1, binding = 13) uniform restrict uimage3D geom_facing_grid; //still need to be present for shaders that use it, so remap them to something #define depth_buffer shadow_atlas @@ -319,21 +269,21 @@ layout(r32ui, set = 1, binding = 12) uniform restrict uimage3D geom_facing_grid; #else -layout(set = 1, binding = 9) uniform texture2D depth_buffer; -layout(set = 1, binding = 10) uniform texture2D color_buffer; +layout(set = 1, binding = 10) uniform texture2D depth_buffer; +layout(set = 1, binding = 11) uniform texture2D color_buffer; #ifdef USE_MULTIVIEW -layout(set = 1, binding = 11) uniform texture2DArray normal_roughness_buffer; -layout(set = 1, binding = 13) uniform texture2DArray ambient_buffer; -layout(set = 1, binding = 14) uniform texture2DArray reflection_buffer; +layout(set = 1, binding = 12) uniform texture2DArray normal_roughness_buffer; +layout(set = 1, binding = 14) uniform texture2DArray ambient_buffer; +layout(set = 1, binding = 15) uniform texture2DArray reflection_buffer; #else // USE_MULTIVIEW -layout(set = 1, binding = 11) uniform texture2D normal_roughness_buffer; -layout(set = 1, binding = 13) uniform texture2D ambient_buffer; -layout(set = 1, binding = 14) uniform texture2D reflection_buffer; +layout(set = 1, binding = 12) uniform texture2D normal_roughness_buffer; +layout(set = 1, binding = 14) uniform texture2D ambient_buffer; +layout(set = 1, binding = 15) uniform texture2D reflection_buffer; #endif -layout(set = 1, binding = 12) uniform texture2D ao_buffer; -layout(set = 1, binding = 15) uniform texture2DArray sdfgi_lightprobe_texture; -layout(set = 1, binding = 16) uniform texture3D sdfgi_occlusion_cascades; +layout(set = 1, binding = 13) uniform texture2D ao_buffer; +layout(set = 1, binding = 16) uniform texture2DArray sdfgi_lightprobe_texture; +layout(set = 1, binding = 17) uniform texture3D sdfgi_occlusion_cascades; struct VoxelGIData { mat4 xform; // 64 - 64 @@ -350,14 +300,14 @@ struct VoxelGIData { float exposure_normalization; // 4 - 112 }; -layout(set = 1, binding = 17, std140) uniform VoxelGIs { +layout(set = 1, binding = 18, std140) uniform VoxelGIs { VoxelGIData data[MAX_VOXEL_GI_INSTANCES]; } voxel_gi_instances; -layout(set = 1, binding = 18) uniform texture3D volumetric_fog_texture; +layout(set = 1, binding = 19) uniform texture3D volumetric_fog_texture; -layout(set = 1, binding = 19) uniform texture2D ssil_buffer; +layout(set = 1, binding = 20) uniform texture2D ssil_buffer; #endif diff --git a/servers/rendering/renderer_rd/shaders/forward_mobile/SCsub b/servers/rendering/renderer_rd/shaders/forward_mobile/SCsub new file mode 100644 index 0000000000..f06a2d86e2 --- /dev/null +++ b/servers/rendering/renderer_rd/shaders/forward_mobile/SCsub @@ -0,0 +1,17 @@ +#!/usr/bin/env python + +Import("env") + +if "RD_GLSL" in env["BUILDERS"]: + # find all include files + gl_include_files = [str(f) for f in Glob("*_inc.glsl")] + [str(f) for f in Glob("../*_inc.glsl")] + + # find all shader code(all glsl files excluding our include files) + glsl_files = [str(f) for f in Glob("*.glsl") if str(f) not in gl_include_files] + + # make sure we recompile shaders if include files change + env.Depends([f + ".gen.h" for f in glsl_files], gl_include_files + ["#glsl_builders.py"]) + + # compile shaders + for glsl_file in glsl_files: + env.RD_GLSL(glsl_file) diff --git a/servers/rendering/renderer_rd/shaders/scene_forward_mobile.glsl b/servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile.glsl index 5a5ada7231..33fd4c35b1 100644 --- a/servers/rendering/renderer_rd/shaders/scene_forward_mobile.glsl +++ b/servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile.glsl @@ -101,7 +101,7 @@ layout(set = MATERIAL_UNIFORM_SET, binding = 0, std140) uniform MaterialUniforms #ifdef MODE_DUAL_PARABOLOID -layout(location = 8) out highp float dp_clip; +layout(location = 9) out highp float dp_clip; #endif @@ -123,6 +123,33 @@ invariant gl_Position; #define scene_data scene_data_block.data +#ifdef USE_DOUBLE_PRECISION +// Helper functions for emulating double precision when adding floats. +vec3 quick_two_sum(vec3 a, vec3 b, out vec3 out_p) { + vec3 s = a + b; + out_p = b - (s - a); + return s; +} + +vec3 two_sum(vec3 a, vec3 b, out vec3 out_p) { + vec3 s = a + b; + vec3 v = s - a; + out_p = (a - (s - v)) + (b - v); + return s; +} + +vec3 double_add_vec3(vec3 base_a, vec3 prec_a, vec3 base_b, vec3 prec_b, out vec3 out_precision) { + vec3 s, t, se, te; + s = two_sum(base_a, base_b, se); + t = two_sum(prec_a, prec_b, te); + se += t; + s = quick_two_sum(s, se, se); + se += te; + s = quick_two_sum(s, se, out_precision); + return s; +} +#endif + void main() { vec4 instance_custom = vec4(0.0); #if defined(COLOR_USED) @@ -132,6 +159,17 @@ void main() { bool is_multimesh = bool(draw_call.flags & INSTANCE_FLAGS_MULTIMESH); mat4 model_matrix = draw_call.transform; + mat4 inv_view_matrix = scene_data.inv_view_matrix; +#ifdef USE_DOUBLE_PRECISION + vec3 model_precision = vec3(model_matrix[0][3], model_matrix[1][3], model_matrix[2][3]); + model_matrix[0][3] = 0.0; + model_matrix[1][3] = 0.0; + model_matrix[2][3] = 0.0; + vec3 view_precision = vec3(inv_view_matrix[0][3], inv_view_matrix[1][3], inv_view_matrix[2][3]); + inv_view_matrix[0][3] = 0.0; + inv_view_matrix[1][3] = 0.0; + inv_view_matrix[2][3] = 0.0; +#endif mat3 model_normal_matrix; if (bool(draw_call.flags & INSTANCE_FLAGS_NON_UNIFORM_SCALE)) { @@ -140,11 +178,12 @@ void main() { model_normal_matrix = mat3(model_matrix); } + mat4 matrix; + mat4 read_model_matrix = model_matrix; + if (is_multimesh) { //multimesh, instances are for it - mat4 matrix; - #ifdef USE_PARTICLE_TRAILS uint trail_size = (draw_call.flags >> INSTANCE_FLAGS_PARTICLE_TRAIL_SHIFT) & INSTANCE_FLAGS_PARTICLE_TRAIL_MASK; uint stride = 3 + 1 + 1; //particles always uses this format @@ -230,7 +269,15 @@ void main() { #endif //transpose matrix = transpose(matrix); - model_matrix = model_matrix * matrix; + +#if !defined(USE_DOUBLE_PRECISION) || defined(SKIP_TRANSFORM_USED) || defined(VERTEX_WORLD_COORDS_USED) || defined(MODEL_MATRIX_USED) + // Normally we can bake the multimesh transform into the model matrix, but when using double precision + // we avoid baking it in so we can emulate high precision. + read_model_matrix = model_matrix * matrix; +#if !defined(USE_DOUBLE_PRECISION) || defined(SKIP_TRANSFORM_USED) || defined(VERTEX_WORLD_COORDS_USED) + model_matrix = read_model_matrix; +#endif // !defined(USE_DOUBLE_PRECISION) || defined(SKIP_TRANSFORM_USED) || defined(VERTEX_WORLD_COORDS_USED) +#endif // !defined(USE_DOUBLE_PRECISION) || defined(SKIP_TRANSFORM_USED) || defined(VERTEX_WORLD_COORDS_USED) || defined(MODEL_MATRIX_USED) model_normal_matrix = model_normal_matrix * mat3(matrix); } @@ -297,7 +344,22 @@ void main() { // using local coordinates (default) #if !defined(SKIP_TRANSFORM_USED) && !defined(VERTEX_WORLD_COORDS_USED) +#ifdef USE_DOUBLE_PRECISION + // We separate the basis from the origin because the basis is fine with single point precision. + // Then we combine the translations from the model matrix and the view matrix using emulated doubles. + // We add the result to the vertex and ignore the final lost precision. + vec3 model_origin = model_matrix[3].xyz; + if (is_multimesh) { + vertex = mat3(matrix) * vertex; + model_origin = double_add_vec3(model_origin, model_precision, matrix[3].xyz, vec3(0.0), model_precision); + } + vertex = mat3(model_matrix) * vertex; + vec3 temp_precision; + vertex += double_add_vec3(model_origin, model_precision, scene_data.inv_view_matrix[3].xyz, view_precision, temp_precision); + vertex = mat3(scene_data.view_matrix) * vertex; +#else vertex = (modelview * vec4(vertex, 1.0)).xyz; +#endif #ifdef NORMAL_USED normal = modelview_normal * normal; #endif @@ -450,7 +512,7 @@ layout(location = 6) mediump in vec3 binormal_interp; #ifdef MODE_DUAL_PARABOLOID -layout(location = 8) highp in float dp_clip; +layout(location = 9) highp in float dp_clip; #endif @@ -468,7 +530,6 @@ layout(location = 8) highp in float dp_clip; //defines to keep compatibility with vertex -#define model_matrix draw_call.transform #ifdef USE_MULTIVIEW #define projection_matrix scene_data.projection_matrix_view[ViewIndex] #define inv_projection_matrix scene_data.inv_projection_matrix_view[ViewIndex] @@ -519,7 +580,7 @@ layout(location = 0) out mediump vec4 frag_color; #endif // RENDER DEPTH -#include "scene_forward_aa_inc.glsl" +#include "../scene_forward_aa_inc.glsl" #if !defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED) @@ -528,7 +589,7 @@ layout(location = 0) out mediump vec4 frag_color; #define SPECULAR_SCHLICK_GGX #endif -#include "scene_forward_lights_inc.glsl" +#include "../scene_forward_lights_inc.glsl" #endif //!defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED) @@ -685,6 +746,17 @@ void main() { vec2 alpha_texture_coordinate = vec2(0.0, 0.0); #endif // ALPHA_ANTIALIASING_EDGE_USED + mat4 inv_view_matrix = scene_data.inv_view_matrix; + mat4 read_model_matrix = draw_call.transform; +#ifdef USE_DOUBLE_PRECISION + read_model_matrix[0][3] = 0.0; + read_model_matrix[1][3] = 0.0; + read_model_matrix[2][3] = 0.0; + inv_view_matrix[0][3] = 0.0; + inv_view_matrix[1][3] = 0.0; + inv_view_matrix[2][3] = 0.0; +#endif + { #CODE : FRAGMENT } diff --git a/servers/rendering/renderer_rd/shaders/scene_forward_mobile_inc.glsl b/servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile_inc.glsl index 3a9c52f5bc..631ff0575b 100644 --- a/servers/rendering/renderer_rd/shaders/scene_forward_mobile_inc.glsl +++ b/servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile_inc.glsl @@ -5,7 +5,8 @@ #extension GL_EXT_multiview : enable #endif -#include "decal_data_inc.glsl" +#include "../decal_data_inc.glsl" +#include "../scene_data_inc.glsl" #if !defined(MODE_RENDER_DEPTH) || defined(MODE_RENDER_MATERIAL) || defined(TANGENT_USED) || defined(NORMAL_MAP_USED) || defined(LIGHT_ANISOTROPY_USED) #ifndef NORMAL_USED @@ -32,7 +33,7 @@ draw_call; /* Set 0: Base Pass (never changes) */ -#include "light_data_inc.glsl" +#include "../light_data_inc.glsl" #define SAMPLER_NEAREST_CLAMP 0 #define SAMPLER_LINEAR_CLAMP 1 @@ -54,13 +55,14 @@ layout(set = 0, binding = 2) uniform sampler shadow_sampler; layout(set = 0, binding = 3) uniform sampler decal_sampler; layout(set = 0, binding = 4) uniform sampler light_projector_sampler; -#define INSTANCE_FLAGS_NON_UNIFORM_SCALE (1 << 5) -#define INSTANCE_FLAGS_USE_GI_BUFFERS (1 << 6) -#define INSTANCE_FLAGS_USE_SDFGI (1 << 7) -#define INSTANCE_FLAGS_USE_LIGHTMAP_CAPTURE (1 << 8) -#define INSTANCE_FLAGS_USE_LIGHTMAP (1 << 9) -#define INSTANCE_FLAGS_USE_SH_LIGHTMAP (1 << 10) -#define INSTANCE_FLAGS_USE_VOXEL_GI (1 << 11) +#define INSTANCE_FLAGS_NON_UNIFORM_SCALE (1 << 4) +#define INSTANCE_FLAGS_USE_GI_BUFFERS (1 << 5) +#define INSTANCE_FLAGS_USE_SDFGI (1 << 6) +#define INSTANCE_FLAGS_USE_LIGHTMAP_CAPTURE (1 << 7) +#define INSTANCE_FLAGS_USE_LIGHTMAP (1 << 8) +#define INSTANCE_FLAGS_USE_SH_LIGHTMAP (1 << 9) +#define INSTANCE_FLAGS_USE_VOXEL_GI (1 << 10) +#define INSTANCE_FLAGS_PARTICLES (1 << 11) #define INSTANCE_FLAGS_MULTIMESH (1 << 12) #define INSTANCE_FLAGS_MULTIMESH_FORMAT_2D (1 << 13) #define INSTANCE_FLAGS_MULTIMESH_HAS_COLOR (1 << 14) @@ -127,75 +129,9 @@ global_shader_uniforms; /* Set 1: Render Pass (changes per render pass) */ -struct SceneData { - highp mat4 projection_matrix; - highp mat4 inv_projection_matrix; - highp mat4 inv_view_matrix; - highp mat4 view_matrix; - - // only used for multiview - highp mat4 projection_matrix_view[MAX_VIEWS]; - highp mat4 inv_projection_matrix_view[MAX_VIEWS]; - highp vec4 eye_offset[MAX_VIEWS]; - - highp vec2 viewport_size; - highp vec2 screen_pixel_size; - - // Use vec4s because std140 doesn't play nice with vec2s, z and w are wasted. - highp vec4 directional_penumbra_shadow_kernel[32]; - highp vec4 directional_soft_shadow_kernel[32]; - highp vec4 penumbra_shadow_kernel[32]; - highp vec4 soft_shadow_kernel[32]; - - mediump vec4 ambient_light_color_energy; - - mediump float ambient_color_sky_mix; - bool use_ambient_light; - bool use_ambient_cubemap; - bool use_reflection_cubemap; - - mediump mat3 radiance_inverse_xform; - - highp vec2 shadow_atlas_pixel_size; - highp vec2 directional_shadow_pixel_size; - - uint directional_light_count; - mediump float dual_paraboloid_side; - highp float z_far; - highp float z_near; - - bool ssao_enabled; - mediump float ssao_light_affect; - mediump float ssao_ao_affect; - bool roughness_limiter_enabled; - - mediump float roughness_limiter_amount; - mediump float roughness_limiter_limit; - mediump float opaque_prepass_threshold; - uint roughness_limiter_pad; - - bool fog_enabled; - highp float fog_density; - highp float fog_height; - highp float fog_height_density; - - mediump vec3 fog_light_color; - mediump float fog_sun_scatter; - - mediump float fog_aerial_perspective; - bool material_uv2_mode; - - highp float time; - mediump float reflection_multiplier; // one normally, zero when rendering reflections - - bool pancake_shadows; - float emissive_exposure_normalization; - float IBL_exposure_normalization; - uint pad3; -}; - layout(set = 1, binding = 0, std140) uniform SceneDataBlock { SceneData data; + SceneData prev_data; } scene_data_block; diff --git a/servers/rendering/renderer_rd/shaders/particles.glsl b/servers/rendering/renderer_rd/shaders/particles.glsl index fb5759bc17..3a6dd579b9 100644 --- a/servers/rendering/renderer_rd/shaders/particles.glsl +++ b/servers/rendering/renderer_rd/shaders/particles.glsl @@ -475,7 +475,7 @@ void main() { float particle_size = FRAME.particle_size; -#ifdef USE_COLLISON_SCALE +#ifdef USE_COLLISION_SCALE particle_size *= dot(vec3(length(PARTICLE.xform[0].xyz), length(PARTICLE.xform[1].xyz), length(PARTICLE.xform[2].xyz)), vec3(0.33333333333)); diff --git a/servers/rendering/renderer_rd/shaders/scene_data_inc.glsl b/servers/rendering/renderer_rd/shaders/scene_data_inc.glsl new file mode 100644 index 0000000000..048257e9ef --- /dev/null +++ b/servers/rendering/renderer_rd/shaders/scene_data_inc.glsl @@ -0,0 +1,69 @@ +// Scene data stores all our 3D rendering globals for a frame such as our matrices +// where this information is independent of the different RD implementations. +// This enables us to use this UBO in our main scene render shaders but also in +// effects that need access to this data. + +struct SceneData { + highp mat4 projection_matrix; + highp mat4 inv_projection_matrix; + highp mat4 inv_view_matrix; + highp mat4 view_matrix; + + // only used for multiview + highp mat4 projection_matrix_view[MAX_VIEWS]; + highp mat4 inv_projection_matrix_view[MAX_VIEWS]; + highp vec4 eye_offset[MAX_VIEWS]; + + highp vec2 viewport_size; + highp vec2 screen_pixel_size; + + // Use vec4s because std140 doesn't play nice with vec2s, z and w are wasted. + highp vec4 directional_penumbra_shadow_kernel[32]; + highp vec4 directional_soft_shadow_kernel[32]; + highp vec4 penumbra_shadow_kernel[32]; + highp vec4 soft_shadow_kernel[32]; + + mediump mat3 radiance_inverse_xform; + + mediump vec4 ambient_light_color_energy; + + mediump float ambient_color_sky_mix; + bool use_ambient_light; + bool use_ambient_cubemap; + bool use_reflection_cubemap; + + highp vec2 shadow_atlas_pixel_size; + highp vec2 directional_shadow_pixel_size; + + uint directional_light_count; + mediump float dual_paraboloid_side; + highp float z_far; + highp float z_near; + + bool roughness_limiter_enabled; + mediump float roughness_limiter_amount; + mediump float roughness_limiter_limit; + mediump float opaque_prepass_threshold; + + bool fog_enabled; + highp float fog_density; + highp float fog_height; + highp float fog_height_density; + + mediump vec3 fog_light_color; + mediump float fog_sun_scatter; + + mediump float fog_aerial_perspective; + highp float time; + mediump float reflection_multiplier; // one normally, zero when rendering reflections + bool material_uv2_mode; + + vec2 taa_jitter; + float emissive_exposure_normalization; + float IBL_exposure_normalization; + + bool pancake_shadows; + uint pad1; + uint pad2; + uint pad3; +}; diff --git a/servers/rendering/renderer_rd/shaders/scene_forward_lights_inc.glsl b/servers/rendering/renderer_rd/shaders/scene_forward_lights_inc.glsl index 4e6e29b315..2fba1351f7 100644 --- a/servers/rendering/renderer_rd/shaders/scene_forward_lights_inc.glsl +++ b/servers/rendering/renderer_rd/shaders/scene_forward_lights_inc.glsl @@ -97,11 +97,12 @@ void light_compute(vec3 N, vec3 L, vec3 V, float A, vec3 light_color, float atte float diffuse_brdf_NL; // BRDF times N.L for calculating diffuse radiance #if defined(DIFFUSE_LAMBERT_WRAP) - // energy conserving lambert wrap shader - diffuse_brdf_NL = max(0.0, (NdotL + roughness) / ((1.0 + roughness) * (1.0 + roughness))); + // Energy conserving lambert wrap shader. + // https://web.archive.org/web/20210228210901/http://blog.stevemcauley.com/2011/12/03/energy-conserving-wrapped-diffuse/ + diffuse_brdf_NL = max(0.0, (NdotL + roughness) / ((1.0 + roughness) * (1.0 + roughness))) * (1.0 / M_PI); #elif defined(DIFFUSE_TOON) - diffuse_brdf_NL = smoothstep(-roughness, max(roughness, 0.01), NdotL); + diffuse_brdf_NL = smoothstep(-roughness, max(roughness, 0.01), NdotL) * (1.0 / M_PI); #elif defined(DIFFUSE_BURLEY) diff --git a/servers/rendering/renderer_rd/storage_rd/forward_id_storage.cpp b/servers/rendering/renderer_rd/storage_rd/forward_id_storage.cpp new file mode 100644 index 0000000000..c7f106eba0 --- /dev/null +++ b/servers/rendering/renderer_rd/storage_rd/forward_id_storage.cpp @@ -0,0 +1,43 @@ +/*************************************************************************/ +/* forward_id_storage.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* 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 "forward_id_storage.h" + +using namespace RendererRD; + +ForwardIDStorage *ForwardIDStorage::singleton = nullptr; + +ForwardIDStorage::ForwardIDStorage() { + singleton = this; +} + +ForwardIDStorage::~ForwardIDStorage() { + singleton = nullptr; +} diff --git a/servers/rendering/renderer_rd/storage_rd/forward_id_storage.h b/servers/rendering/renderer_rd/storage_rd/forward_id_storage.h new file mode 100644 index 0000000000..f6a74383d4 --- /dev/null +++ b/servers/rendering/renderer_rd/storage_rd/forward_id_storage.h @@ -0,0 +1,68 @@ +/*************************************************************************/ +/* forward_id_storage.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* 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 FORWARD_ID_STORAGE_H +#define FORWARD_ID_STORAGE_H + +#include "servers/rendering/storage/utilities.h" + +class RendererSceneRenderRD; + +namespace RendererRD { + +typedef int32_t ForwardID; + +enum ForwardIDType { + FORWARD_ID_TYPE_OMNI_LIGHT, + FORWARD_ID_TYPE_SPOT_LIGHT, + FORWARD_ID_TYPE_REFLECTION_PROBE, + FORWARD_ID_TYPE_DECAL, + FORWARD_ID_MAX, +}; + +class ForwardIDStorage { +private: + static ForwardIDStorage *singleton; + +public: + static ForwardIDStorage *get_singleton() { return singleton; } + + ForwardIDStorage(); + virtual ~ForwardIDStorage(); + + virtual RendererRD::ForwardID allocate_forward_id(RendererRD::ForwardIDType p_type) { return -1; } + virtual void free_forward_id(RendererRD::ForwardIDType p_type, RendererRD::ForwardID p_id) {} + virtual void map_forward_id(RendererRD::ForwardIDType p_type, RendererRD::ForwardID p_id, uint32_t p_index) {} + virtual bool uses_forward_ids() const { return false; } +}; + +} // namespace RendererRD + +#endif // FORWARD_ID_STORAGE_H diff --git a/servers/rendering/renderer_rd/storage_rd/light_storage.cpp b/servers/rendering/renderer_rd/storage_rd/light_storage.cpp index 81b0661481..c83473ef07 100644 --- a/servers/rendering/renderer_rd/storage_rd/light_storage.cpp +++ b/servers/rendering/renderer_rd/storage_rd/light_storage.cpp @@ -30,6 +30,7 @@ #include "light_storage.h" #include "core/config/project_settings.h" +#include "servers/rendering/renderer_rd/renderer_scene_render_rd.h" #include "texture_storage.h" using namespace RendererRD; @@ -45,6 +46,9 @@ LightStorage::LightStorage() { TextureStorage *texture_storage = TextureStorage::get_singleton(); + directional_shadow.size = GLOBAL_GET("rendering/lights_and_shadows/directional_shadow/size"); + directional_shadow.use_16_bits = GLOBAL_GET("rendering/lights_and_shadows/directional_shadow/16_bits"); + using_lightmap_array = true; // high end if (using_lightmap_array) { uint64_t textures_per_stage = RD::get_singleton()->limit_get(RD::LIMIT_MAX_TEXTURES_PER_SHADER_STAGE); @@ -56,7 +60,7 @@ LightStorage::LightStorage() { } for (int i = 0; i < lightmap_textures.size(); i++) { - lightmap_textures.write[i] = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_WHITE); + lightmap_textures.write[i] = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_WHITE); } } @@ -64,9 +68,46 @@ LightStorage::LightStorage() { } LightStorage::~LightStorage() { + free_reflection_data(); + free_light_data(); + + for (const KeyValue<int, ShadowCubemap> &E : shadow_cubemaps) { + RD::get_singleton()->free(E.value.cubemap); + } + singleton = nullptr; } +bool LightStorage::free(RID p_rid) { + if (owns_reflection_probe(p_rid)) { + reflection_probe_free(p_rid); + return true; + } else if (owns_reflection_atlas(p_rid)) { + reflection_atlas_free(p_rid); + return true; + } else if (owns_reflection_probe_instance(p_rid)) { + reflection_probe_instance_free(p_rid); + return true; + } else if (owns_light(p_rid)) { + light_free(p_rid); + return true; + } else if (owns_light_instance(p_rid)) { + light_instance_free(p_rid); + return true; + } else if (owns_lightmap(p_rid)) { + lightmap_free(p_rid); + return true; + } else if (owns_lightmap_instance(p_rid)) { + lightmap_instance_free(p_rid); + return true; + } else if (owns_shadow_atlas(p_rid)) { + shadow_atlas_free(p_rid); + return true; + } + + return false; +} + /* LIGHT */ void LightStorage::_light_initialize(RID p_light, RS::LightType p_type) { @@ -183,7 +224,7 @@ void LightStorage::light_set_shadow(RID p_light, bool p_enabled) { } void LightStorage::light_set_projector(RID p_light, RID p_texture) { - RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton(); + TextureStorage *texture_storage = TextureStorage::get_singleton(); Light *light = light_owner.get_or_null(p_light); ERR_FAIL_COND(!light); @@ -375,6 +416,595 @@ Dependency *LightStorage::light_get_dependency(RID p_light) const { return &light->dependency; } +/* LIGHT INSTANCE API */ + +RID LightStorage::light_instance_create(RID p_light) { + RID li = light_instance_owner.make_rid(LightInstance()); + + LightInstance *light_instance = light_instance_owner.get_or_null(li); + + light_instance->self = li; + light_instance->light = p_light; + light_instance->light_type = light_get_type(p_light); + if (light_instance->light_type != RS::LIGHT_DIRECTIONAL) { + light_instance->forward_id = ForwardIDStorage::get_singleton()->allocate_forward_id(light_instance->light_type == RS::LIGHT_OMNI ? FORWARD_ID_TYPE_OMNI_LIGHT : FORWARD_ID_TYPE_SPOT_LIGHT); + } + + return li; +} + +void LightStorage::light_instance_free(RID p_light) { + LightInstance *light_instance = light_instance_owner.get_or_null(p_light); + + //remove from shadow atlases.. + for (const RID &E : light_instance->shadow_atlases) { + ShadowAtlas *shadow_atlas = shadow_atlas_owner.get_or_null(E); + ERR_CONTINUE(!shadow_atlas->shadow_owners.has(p_light)); + uint32_t key = shadow_atlas->shadow_owners[p_light]; + uint32_t q = (key >> QUADRANT_SHIFT) & 0x3; + uint32_t s = key & SHADOW_INDEX_MASK; + + shadow_atlas->quadrants[q].shadows.write[s].owner = RID(); + + if (key & OMNI_LIGHT_FLAG) { + // Omni lights use two atlas spots, make sure to clear the other as well + shadow_atlas->quadrants[q].shadows.write[s + 1].owner = RID(); + } + + shadow_atlas->shadow_owners.erase(p_light); + } + + if (light_instance->light_type != RS::LIGHT_DIRECTIONAL) { + ForwardIDStorage::get_singleton()->free_forward_id(light_instance->light_type == RS::LIGHT_OMNI ? FORWARD_ID_TYPE_OMNI_LIGHT : FORWARD_ID_TYPE_SPOT_LIGHT, light_instance->forward_id); + } + light_instance_owner.free(p_light); +} + +void LightStorage::light_instance_set_transform(RID p_light_instance, const Transform3D &p_transform) { + LightInstance *light_instance = light_instance_owner.get_or_null(p_light_instance); + ERR_FAIL_COND(!light_instance); + + light_instance->transform = p_transform; +} + +void LightStorage::light_instance_set_aabb(RID p_light_instance, const AABB &p_aabb) { + LightInstance *light_instance = light_instance_owner.get_or_null(p_light_instance); + ERR_FAIL_COND(!light_instance); + + light_instance->aabb = p_aabb; +} + +void LightStorage::light_instance_set_shadow_transform(RID p_light_instance, const Projection &p_projection, const Transform3D &p_transform, float p_far, float p_split, int p_pass, float p_shadow_texel_size, float p_bias_scale, float p_range_begin, const Vector2 &p_uv_scale) { + LightInstance *light_instance = light_instance_owner.get_or_null(p_light_instance); + ERR_FAIL_COND(!light_instance); + + ERR_FAIL_INDEX(p_pass, 6); + + light_instance->shadow_transform[p_pass].camera = p_projection; + light_instance->shadow_transform[p_pass].transform = p_transform; + light_instance->shadow_transform[p_pass].farplane = p_far; + light_instance->shadow_transform[p_pass].split = p_split; + light_instance->shadow_transform[p_pass].bias_scale = p_bias_scale; + light_instance->shadow_transform[p_pass].range_begin = p_range_begin; + light_instance->shadow_transform[p_pass].shadow_texel_size = p_shadow_texel_size; + light_instance->shadow_transform[p_pass].uv_scale = p_uv_scale; +} + +void LightStorage::light_instance_mark_visible(RID p_light_instance) { + LightInstance *light_instance = light_instance_owner.get_or_null(p_light_instance); + ERR_FAIL_COND(!light_instance); + + light_instance->last_scene_pass = RendererSceneRenderRD::get_singleton()->get_scene_pass(); +} + +/* LIGHT DATA */ + +void LightStorage::free_light_data() { + if (directional_light_buffer.is_valid()) { + RD::get_singleton()->free(directional_light_buffer); + directional_light_buffer = RID(); + } + + if (omni_light_buffer.is_valid()) { + RD::get_singleton()->free(omni_light_buffer); + omni_light_buffer = RID(); + } + + if (spot_light_buffer.is_valid()) { + RD::get_singleton()->free(spot_light_buffer); + spot_light_buffer = RID(); + } + + if (directional_lights != nullptr) { + memdelete_arr(directional_lights); + directional_lights = nullptr; + } + + if (omni_lights != nullptr) { + memdelete_arr(omni_lights); + omni_lights = nullptr; + } + + if (spot_lights != nullptr) { + memdelete_arr(spot_lights); + spot_lights = nullptr; + } + + if (omni_light_sort != nullptr) { + memdelete_arr(omni_light_sort); + omni_light_sort = nullptr; + } + + if (spot_light_sort != nullptr) { + memdelete_arr(spot_light_sort); + spot_light_sort = nullptr; + } +} + +void LightStorage::set_max_lights(const uint32_t p_max_lights) { + max_lights = p_max_lights; + + uint32_t light_buffer_size = max_lights * sizeof(LightData); + omni_lights = memnew_arr(LightData, max_lights); + omni_light_buffer = RD::get_singleton()->storage_buffer_create(light_buffer_size); + omni_light_sort = memnew_arr(LightInstanceDepthSort, max_lights); + spot_lights = memnew_arr(LightData, max_lights); + spot_light_buffer = RD::get_singleton()->storage_buffer_create(light_buffer_size); + spot_light_sort = memnew_arr(LightInstanceDepthSort, max_lights); + //defines += "\n#define MAX_LIGHT_DATA_STRUCTS " + itos(max_lights) + "\n"; + + max_directional_lights = RendererSceneRender::MAX_DIRECTIONAL_LIGHTS; + uint32_t directional_light_buffer_size = max_directional_lights * sizeof(DirectionalLightData); + directional_lights = memnew_arr(DirectionalLightData, max_directional_lights); + directional_light_buffer = RD::get_singleton()->uniform_buffer_create(directional_light_buffer_size); +} + +void LightStorage::update_light_buffers(RenderDataRD *p_render_data, const PagedArray<RID> &p_lights, const Transform3D &p_camera_transform, RID p_shadow_atlas, bool p_using_shadows, uint32_t &r_directional_light_count, uint32_t &r_positional_light_count, bool &r_directional_light_soft_shadows) { + ForwardIDStorage *forward_id_storage = ForwardIDStorage::get_singleton(); + RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton(); + + Transform3D inverse_transform = p_camera_transform.affine_inverse(); + + r_directional_light_count = 0; + r_positional_light_count = 0; + + Plane camera_plane(-p_camera_transform.basis.get_column(Vector3::AXIS_Z).normalized(), p_camera_transform.origin); + + omni_light_count = 0; + spot_light_count = 0; + + r_directional_light_soft_shadows = false; + + for (int i = 0; i < (int)p_lights.size(); i++) { + LightInstance *light_instance = light_instance_owner.get_or_null(p_lights[i]); + if (!light_instance) { + continue; + } + Light *light = light_owner.get_or_null(light_instance->light); + + ERR_CONTINUE(light == nullptr); + + switch (light->type) { + case RS::LIGHT_DIRECTIONAL: { + if (r_directional_light_count >= max_directional_lights || light->directional_sky_mode == RS::LIGHT_DIRECTIONAL_SKY_MODE_SKY_ONLY) { + continue; + } + + DirectionalLightData &light_data = directional_lights[r_directional_light_count]; + + Transform3D light_transform = light_instance->transform; + + Vector3 direction = inverse_transform.basis.xform(light_transform.basis.xform(Vector3(0, 0, 1))).normalized(); + + light_data.direction[0] = direction.x; + light_data.direction[1] = direction.y; + light_data.direction[2] = direction.z; + + float sign = light->negative ? -1 : 1; + + light_data.energy = sign * light->param[RS::LIGHT_PARAM_ENERGY]; + + if (RendererSceneRenderRD::get_singleton()->is_using_physical_light_units()) { + light_data.energy *= light->param[RS::LIGHT_PARAM_INTENSITY]; + } else { + light_data.energy *= Math_PI; + } + + if (p_render_data->camera_attributes.is_valid()) { + light_data.energy *= RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor(p_render_data->camera_attributes); + } + + Color linear_col = light->color.srgb_to_linear(); + light_data.color[0] = linear_col.r; + light_data.color[1] = linear_col.g; + light_data.color[2] = linear_col.b; + + light_data.specular = light->param[RS::LIGHT_PARAM_SPECULAR]; + light_data.volumetric_fog_energy = light->param[RS::LIGHT_PARAM_VOLUMETRIC_FOG_ENERGY]; + light_data.mask = light->cull_mask; + + float size = light->param[RS::LIGHT_PARAM_SIZE]; + + light_data.size = 1.0 - Math::cos(Math::deg_to_rad(size)); //angle to cosine offset + + if (RendererSceneRenderRD::get_singleton()->get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_PSSM_SPLITS) { + WARN_PRINT_ONCE("The DirectionalLight3D PSSM splits debug draw mode is not reimplemented yet."); + } + + light_data.shadow_opacity = (p_using_shadows && light->shadow) + ? light->param[RS::LIGHT_PARAM_SHADOW_OPACITY] + : 0.0; + + float angular_diameter = light->param[RS::LIGHT_PARAM_SIZE]; + if (angular_diameter > 0.0) { + // I know tan(0) is 0, but let's not risk it with numerical precision. + // technically this will keep expanding until reaching the sun, but all we care + // is expand until we reach the radius of the near plane (there can't be more occluders than that) + angular_diameter = Math::tan(Math::deg_to_rad(angular_diameter)); + if (light->shadow && light->param[RS::LIGHT_PARAM_SHADOW_BLUR] > 0.0) { + // Only enable PCSS-like soft shadows if blurring is enabled. + // Otherwise, performance would decrease with no visual difference. + r_directional_light_soft_shadows = true; + } + } else { + angular_diameter = 0.0; + } + + if (light_data.shadow_opacity > 0.001) { + RS::LightDirectionalShadowMode smode = light->directional_shadow_mode; + + int limit = smode == RS::LIGHT_DIRECTIONAL_SHADOW_ORTHOGONAL ? 0 : (smode == RS::LIGHT_DIRECTIONAL_SHADOW_PARALLEL_2_SPLITS ? 1 : 3); + light_data.blend_splits = (smode != RS::LIGHT_DIRECTIONAL_SHADOW_ORTHOGONAL) && light->directional_blend_splits; + for (int j = 0; j < 4; j++) { + Rect2 atlas_rect = light_instance->shadow_transform[j].atlas_rect; + Projection matrix = light_instance->shadow_transform[j].camera; + float split = light_instance->shadow_transform[MIN(limit, j)].split; + + Projection bias; + bias.set_light_bias(); + Projection rectm; + rectm.set_light_atlas_rect(atlas_rect); + + Transform3D modelview = (inverse_transform * light_instance->shadow_transform[j].transform).inverse(); + + Projection shadow_mtx = rectm * bias * matrix * modelview; + light_data.shadow_split_offsets[j] = split; + float bias_scale = light_instance->shadow_transform[j].bias_scale; + light_data.shadow_bias[j] = light->param[RS::LIGHT_PARAM_SHADOW_BIAS] / 100.0 * bias_scale; + light_data.shadow_normal_bias[j] = light->param[RS::LIGHT_PARAM_SHADOW_NORMAL_BIAS] * light_instance->shadow_transform[j].shadow_texel_size; + light_data.shadow_transmittance_bias[j] = light->param[RS::LIGHT_PARAM_TRANSMITTANCE_BIAS] * bias_scale; + light_data.shadow_z_range[j] = light_instance->shadow_transform[j].farplane; + light_data.shadow_range_begin[j] = light_instance->shadow_transform[j].range_begin; + RendererRD::MaterialStorage::store_camera(shadow_mtx, light_data.shadow_matrices[j]); + + Vector2 uv_scale = light_instance->shadow_transform[j].uv_scale; + uv_scale *= atlas_rect.size; //adapt to atlas size + switch (j) { + case 0: { + light_data.uv_scale1[0] = uv_scale.x; + light_data.uv_scale1[1] = uv_scale.y; + } break; + case 1: { + light_data.uv_scale2[0] = uv_scale.x; + light_data.uv_scale2[1] = uv_scale.y; + } break; + case 2: { + light_data.uv_scale3[0] = uv_scale.x; + light_data.uv_scale3[1] = uv_scale.y; + } break; + case 3: { + light_data.uv_scale4[0] = uv_scale.x; + light_data.uv_scale4[1] = uv_scale.y; + } break; + } + } + + float fade_start = light->param[RS::LIGHT_PARAM_SHADOW_FADE_START]; + light_data.fade_from = -light_data.shadow_split_offsets[3] * MIN(fade_start, 0.999); //using 1.0 would break smoothstep + light_data.fade_to = -light_data.shadow_split_offsets[3]; + + light_data.soft_shadow_scale = light->param[RS::LIGHT_PARAM_SHADOW_BLUR]; + light_data.softshadow_angle = angular_diameter; + light_data.bake_mode = light->bake_mode; + + if (angular_diameter <= 0.0) { + light_data.soft_shadow_scale *= RendererSceneRenderRD::get_singleton()->directional_shadow_quality_radius_get(); // Only use quality radius for PCF + } + } + + r_directional_light_count++; + } break; + case RS::LIGHT_OMNI: { + if (omni_light_count >= max_lights) { + continue; + } + + Transform3D light_transform = light_instance->transform; + const real_t distance = camera_plane.distance_to(light_transform.origin); + + if (light->distance_fade) { + const float fade_begin = light->distance_fade_begin; + const float fade_length = light->distance_fade_length; + + if (distance > fade_begin) { + if (distance > fade_begin + fade_length) { + // Out of range, don't draw this light to improve performance. + continue; + } + } + } + + omni_light_sort[omni_light_count].light_instance = light_instance; + omni_light_sort[omni_light_count].light = light; + omni_light_sort[omni_light_count].depth = distance; + omni_light_count++; + } break; + case RS::LIGHT_SPOT: { + if (spot_light_count >= max_lights) { + continue; + } + + Transform3D light_transform = light_instance->transform; + const real_t distance = camera_plane.distance_to(light_transform.origin); + + if (light->distance_fade) { + const float fade_begin = light->distance_fade_begin; + const float fade_length = light->distance_fade_length; + + if (distance > fade_begin) { + if (distance > fade_begin + fade_length) { + // Out of range, don't draw this light to improve performance. + continue; + } + } + } + + spot_light_sort[spot_light_count].light_instance = light_instance; + spot_light_sort[spot_light_count].light = light; + spot_light_sort[spot_light_count].depth = distance; + spot_light_count++; + } break; + } + + light_instance->last_pass = RSG::rasterizer->get_frame_number(); + } + + if (omni_light_count) { + SortArray<LightInstanceDepthSort> sorter; + sorter.sort(omni_light_sort, omni_light_count); + } + + if (spot_light_count) { + SortArray<LightInstanceDepthSort> sorter; + sorter.sort(spot_light_sort, spot_light_count); + } + + bool using_forward_ids = forward_id_storage->uses_forward_ids(); + + for (uint32_t i = 0; i < (omni_light_count + spot_light_count); i++) { + uint32_t index = (i < omni_light_count) ? i : i - (omni_light_count); + LightData &light_data = (i < omni_light_count) ? omni_lights[index] : spot_lights[index]; + RS::LightType type = (i < omni_light_count) ? RS::LIGHT_OMNI : RS::LIGHT_SPOT; + LightInstance *light_instance = (i < omni_light_count) ? omni_light_sort[index].light_instance : spot_light_sort[index].light_instance; + Light *light = (i < omni_light_count) ? omni_light_sort[index].light : spot_light_sort[index].light; + + if (using_forward_ids) { + forward_id_storage->map_forward_id(type == RS::LIGHT_OMNI ? RendererRD::FORWARD_ID_TYPE_OMNI_LIGHT : RendererRD::FORWARD_ID_TYPE_SPOT_LIGHT, light_instance->forward_id, index); + } + + Transform3D light_transform = light_instance->transform; + + float sign = light->negative ? -1 : 1; + Color linear_col = light->color.srgb_to_linear(); + + light_data.attenuation = light->param[RS::LIGHT_PARAM_ATTENUATION]; + + // Reuse fade begin, fade length and distance for shadow LOD determination later. + float fade_begin = 0.0; + float fade_shadow = 0.0; + float fade_length = 0.0; + real_t distance = 0.0; + + float fade = 1.0; + float shadow_opacity_fade = 1.0; + if (light->distance_fade) { + fade_begin = light->distance_fade_begin; + fade_shadow = light->distance_fade_shadow; + fade_length = light->distance_fade_length; + distance = camera_plane.distance_to(light_transform.origin); + + // Use `smoothstep()` to make opacity changes more gradual and less noticeable to the player. + if (distance > fade_begin) { + fade = Math::smoothstep(0.0f, 1.0f, 1.0f - float(distance - fade_begin) / fade_length); + } + + if (distance > fade_shadow) { + shadow_opacity_fade = Math::smoothstep(0.0f, 1.0f, 1.0f - float(distance - fade_shadow) / fade_length); + } + } + + float energy = sign * light->param[RS::LIGHT_PARAM_ENERGY] * fade; + + if (RendererSceneRenderRD::get_singleton()->is_using_physical_light_units()) { + energy *= light->param[RS::LIGHT_PARAM_INTENSITY]; + + // Convert from Luminous Power to Luminous Intensity + if (type == RS::LIGHT_OMNI) { + energy *= 1.0 / (Math_PI * 4.0); + } else { + // Spot Lights are not physically accurate, Luminous Intensity should change in relation to the cone angle. + // We make this assumption to keep them easy to control. + energy *= 1.0 / Math_PI; + } + } else { + energy *= Math_PI; + } + + if (p_render_data->camera_attributes.is_valid()) { + energy *= RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor(p_render_data->camera_attributes); + } + + light_data.color[0] = linear_col.r * energy; + light_data.color[1] = linear_col.g * energy; + light_data.color[2] = linear_col.b * energy; + light_data.specular_amount = light->param[RS::LIGHT_PARAM_SPECULAR] * 2.0; + light_data.volumetric_fog_energy = light->param[RS::LIGHT_PARAM_VOLUMETRIC_FOG_ENERGY]; + light_data.bake_mode = light->bake_mode; + + float radius = MAX(0.001, light->param[RS::LIGHT_PARAM_RANGE]); + light_data.inv_radius = 1.0 / radius; + + Vector3 pos = inverse_transform.xform(light_transform.origin); + + light_data.position[0] = pos.x; + light_data.position[1] = pos.y; + light_data.position[2] = pos.z; + + Vector3 direction = inverse_transform.basis.xform(light_transform.basis.xform(Vector3(0, 0, -1))).normalized(); + + light_data.direction[0] = direction.x; + light_data.direction[1] = direction.y; + light_data.direction[2] = direction.z; + + float size = light->param[RS::LIGHT_PARAM_SIZE]; + + light_data.size = size; + + light_data.inv_spot_attenuation = 1.0f / light->param[RS::LIGHT_PARAM_SPOT_ATTENUATION]; + float spot_angle = light->param[RS::LIGHT_PARAM_SPOT_ANGLE]; + light_data.cos_spot_angle = Math::cos(Math::deg_to_rad(spot_angle)); + + light_data.mask = light->cull_mask; + + light_data.atlas_rect[0] = 0; + light_data.atlas_rect[1] = 0; + light_data.atlas_rect[2] = 0; + light_data.atlas_rect[3] = 0; + + RID projector = light->projector; + + if (projector.is_valid()) { + Rect2 rect = texture_storage->decal_atlas_get_texture_rect(projector); + + if (type == RS::LIGHT_SPOT) { + light_data.projector_rect[0] = rect.position.x; + light_data.projector_rect[1] = rect.position.y + rect.size.height; //flip because shadow is flipped + light_data.projector_rect[2] = rect.size.width; + light_data.projector_rect[3] = -rect.size.height; + } else { + light_data.projector_rect[0] = rect.position.x; + light_data.projector_rect[1] = rect.position.y; + light_data.projector_rect[2] = rect.size.width; + light_data.projector_rect[3] = rect.size.height * 0.5; //used by dp, so needs to be half + } + } else { + light_data.projector_rect[0] = 0; + light_data.projector_rect[1] = 0; + light_data.projector_rect[2] = 0; + light_data.projector_rect[3] = 0; + } + + const bool needs_shadow = + p_using_shadows && + owns_shadow_atlas(p_shadow_atlas) && + shadow_atlas_owns_light_instance(p_shadow_atlas, light_instance->self) && + light->shadow; + + bool in_shadow_range = true; + if (needs_shadow && light->distance_fade) { + if (distance > light->distance_fade_shadow + light->distance_fade_length) { + // Out of range, don't draw shadows to improve performance. + in_shadow_range = false; + } + } + + if (needs_shadow && in_shadow_range) { + // fill in the shadow information + + light_data.shadow_opacity = light->param[RS::LIGHT_PARAM_SHADOW_OPACITY] * shadow_opacity_fade; + + float shadow_texel_size = light_instance_get_shadow_texel_size(light_instance->self, p_shadow_atlas); + light_data.shadow_normal_bias = light->param[RS::LIGHT_PARAM_SHADOW_NORMAL_BIAS] * shadow_texel_size * 10.0; + + if (type == RS::LIGHT_SPOT) { + light_data.shadow_bias = light->param[RS::LIGHT_PARAM_SHADOW_BIAS] / 100.0; + } else { //omni + light_data.shadow_bias = light->param[RS::LIGHT_PARAM_SHADOW_BIAS]; + } + + light_data.transmittance_bias = light->param[RS::LIGHT_PARAM_TRANSMITTANCE_BIAS]; + + Vector2i omni_offset; + Rect2 rect = light_instance_get_shadow_atlas_rect(light_instance->self, p_shadow_atlas, omni_offset); + + light_data.atlas_rect[0] = rect.position.x; + light_data.atlas_rect[1] = rect.position.y; + light_data.atlas_rect[2] = rect.size.width; + light_data.atlas_rect[3] = rect.size.height; + + light_data.soft_shadow_scale = light->param[RS::LIGHT_PARAM_SHADOW_BLUR]; + + if (type == RS::LIGHT_OMNI) { + Transform3D proj = (inverse_transform * light_transform).inverse(); + + RendererRD::MaterialStorage::store_transform(proj, light_data.shadow_matrix); + + if (size > 0.0 && light_data.soft_shadow_scale > 0.0) { + // Only enable PCSS-like soft shadows if blurring is enabled. + // Otherwise, performance would decrease with no visual difference. + light_data.soft_shadow_size = size; + } else { + light_data.soft_shadow_size = 0.0; + light_data.soft_shadow_scale *= RendererSceneRenderRD::get_singleton()->shadows_quality_radius_get(); // Only use quality radius for PCF + } + + light_data.direction[0] = omni_offset.x * float(rect.size.width); + light_data.direction[1] = omni_offset.y * float(rect.size.height); + } else if (type == RS::LIGHT_SPOT) { + Transform3D modelview = (inverse_transform * light_transform).inverse(); + Projection bias; + bias.set_light_bias(); + + Projection cm = light_instance->shadow_transform[0].camera; + Projection shadow_mtx = bias * cm * modelview; + RendererRD::MaterialStorage::store_camera(shadow_mtx, light_data.shadow_matrix); + + if (size > 0.0 && light_data.soft_shadow_scale > 0.0) { + // Only enable PCSS-like soft shadows if blurring is enabled. + // Otherwise, performance would decrease with no visual difference. + float half_np = cm.get_z_near() * Math::tan(Math::deg_to_rad(spot_angle)); + light_data.soft_shadow_size = (size * 0.5 / radius) / (half_np / cm.get_z_near()) * rect.size.width; + } else { + light_data.soft_shadow_size = 0.0; + light_data.soft_shadow_scale *= RendererSceneRenderRD::get_singleton()->shadows_quality_radius_get(); // Only use quality radius for PCF + } + } + } else { + light_data.shadow_opacity = 0.0; + } + + light_instance->cull_mask = light->cull_mask; + + // hook for subclass to do further processing. + RendererSceneRenderRD::get_singleton()->setup_added_light(type, light_transform, radius, spot_angle); + + r_positional_light_count++; + } + + //update without barriers + if (omni_light_count) { + RD::get_singleton()->buffer_update(omni_light_buffer, 0, sizeof(LightData) * omni_light_count, omni_lights, RD::BARRIER_MASK_RASTER | RD::BARRIER_MASK_COMPUTE); + } + + if (spot_light_count) { + RD::get_singleton()->buffer_update(spot_light_buffer, 0, sizeof(LightData) * spot_light_count, spot_lights, RD::BARRIER_MASK_RASTER | RD::BARRIER_MASK_COMPUTE); + } + + if (r_directional_light_count) { + RD::get_singleton()->buffer_update(directional_light_buffer, 0, sizeof(DirectionalLightData) * r_directional_light_count, directional_lights, RD::BARRIER_MASK_RASTER | RD::BARRIER_MASK_COMPUTE); + } +} + /* REFLECTION PROBE */ RID LightStorage::reflection_probe_allocate() { @@ -631,6 +1261,443 @@ Dependency *LightStorage::reflection_probe_get_dependency(RID p_probe) const { return &reflection_probe->dependency; } +/* REFLECTION ATLAS */ + +RID LightStorage::reflection_atlas_create() { + ReflectionAtlas ra; + ra.count = GLOBAL_GET("rendering/reflections/reflection_atlas/reflection_count"); + ra.size = GLOBAL_GET("rendering/reflections/reflection_atlas/reflection_size"); + ra.cluster_builder = nullptr; + + return reflection_atlas_owner.make_rid(ra); +} + +void LightStorage::reflection_atlas_free(RID p_ref_atlas) { + reflection_atlas_set_size(p_ref_atlas, 0, 0); + ReflectionAtlas *ra = reflection_atlas_owner.get_or_null(p_ref_atlas); + if (ra->cluster_builder) { + memdelete(ra->cluster_builder); + } + reflection_atlas_owner.free(p_ref_atlas); +} + +void LightStorage::reflection_atlas_set_size(RID p_ref_atlas, int p_reflection_size, int p_reflection_count) { + ReflectionAtlas *ra = reflection_atlas_owner.get_or_null(p_ref_atlas); + ERR_FAIL_COND(!ra); + + if (ra->size == p_reflection_size && ra->count == p_reflection_count) { + return; //no changes + } + + if (ra->cluster_builder) { + // only if we're using our cluster + ra->cluster_builder->setup(Size2i(ra->size, ra->size), max_cluster_elements, RID(), RID(), RID()); + } + + ra->size = p_reflection_size; + ra->count = p_reflection_count; + + if (ra->reflection.is_valid()) { + //clear and invalidate everything + RD::get_singleton()->free(ra->reflection); + ra->reflection = RID(); + RD::get_singleton()->free(ra->depth_buffer); + ra->depth_buffer = RID(); + for (int i = 0; i < ra->reflections.size(); i++) { + ra->reflections.write[i].data.clear_reflection_data(); + if (ra->reflections[i].owner.is_null()) { + continue; + } + reflection_probe_release_atlas_index(ra->reflections[i].owner); + //rp->atlasindex clear + } + + ra->reflections.clear(); + } +} + +int LightStorage::reflection_atlas_get_size(RID p_ref_atlas) const { + ReflectionAtlas *ra = reflection_atlas_owner.get_or_null(p_ref_atlas); + ERR_FAIL_COND_V(!ra, 0); + + return ra->size; +} + +/* REFLECTION PROBE INSTANCE */ + +RID LightStorage::reflection_probe_instance_create(RID p_probe) { + ReflectionProbeInstance rpi; + rpi.probe = p_probe; + rpi.forward_id = ForwardIDStorage::get_singleton()->allocate_forward_id(FORWARD_ID_TYPE_REFLECTION_PROBE); + + return reflection_probe_instance_owner.make_rid(rpi); +} + +void LightStorage::reflection_probe_instance_free(RID p_instance) { + ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); + ForwardIDStorage::get_singleton()->free_forward_id(FORWARD_ID_TYPE_REFLECTION_PROBE, rpi->forward_id); + reflection_probe_release_atlas_index(p_instance); + reflection_probe_instance_owner.free(p_instance); +} + +void LightStorage::reflection_probe_instance_set_transform(RID p_instance, const Transform3D &p_transform) { + ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); + ERR_FAIL_COND(!rpi); + + rpi->transform = p_transform; + rpi->dirty = true; +} + +void LightStorage::reflection_probe_release_atlas_index(RID p_instance) { + ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); + ERR_FAIL_COND(!rpi); + + if (rpi->atlas.is_null()) { + return; //nothing to release + } + ReflectionAtlas *atlas = reflection_atlas_owner.get_or_null(rpi->atlas); + ERR_FAIL_COND(!atlas); + ERR_FAIL_INDEX(rpi->atlas_index, atlas->reflections.size()); + atlas->reflections.write[rpi->atlas_index].owner = RID(); + rpi->atlas_index = -1; + rpi->atlas = RID(); +} + +bool LightStorage::reflection_probe_instance_needs_redraw(RID p_instance) { + ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); + ERR_FAIL_COND_V(!rpi, false); + + if (rpi->rendering) { + return false; + } + + if (rpi->dirty) { + return true; + } + + if (LightStorage::get_singleton()->reflection_probe_get_update_mode(rpi->probe) == RS::REFLECTION_PROBE_UPDATE_ALWAYS) { + return true; + } + + return rpi->atlas_index == -1; +} + +bool LightStorage::reflection_probe_instance_has_reflection(RID p_instance) { + ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); + ERR_FAIL_COND_V(!rpi, false); + + return rpi->atlas.is_valid(); +} + +bool LightStorage::reflection_probe_instance_begin_render(RID p_instance, RID p_reflection_atlas) { + ReflectionAtlas *atlas = reflection_atlas_owner.get_or_null(p_reflection_atlas); + + ERR_FAIL_COND_V(!atlas, false); + + ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); + ERR_FAIL_COND_V(!rpi, false); + + RD::get_singleton()->draw_command_begin_label("Reflection probe render"); + + if (LightStorage::get_singleton()->reflection_probe_get_update_mode(rpi->probe) == RS::REFLECTION_PROBE_UPDATE_ALWAYS && atlas->reflection.is_valid() && atlas->size != 256) { + WARN_PRINT("ReflectionProbes set to UPDATE_ALWAYS must have an atlas size of 256. Please update the atlas size in the ProjectSettings."); + reflection_atlas_set_size(p_reflection_atlas, 256, atlas->count); + } + + if (LightStorage::get_singleton()->reflection_probe_get_update_mode(rpi->probe) == RS::REFLECTION_PROBE_UPDATE_ALWAYS && atlas->reflection.is_valid() && atlas->reflections[0].data.layers[0].mipmaps.size() != 8) { + // Invalidate reflection atlas, need to regenerate + RD::get_singleton()->free(atlas->reflection); + atlas->reflection = RID(); + + for (int i = 0; i < atlas->reflections.size(); i++) { + if (atlas->reflections[i].owner.is_null()) { + continue; + } + reflection_probe_release_atlas_index(atlas->reflections[i].owner); + } + + atlas->reflections.clear(); + } + + if (atlas->reflection.is_null()) { + int mipmaps = MIN(RendererSceneRenderRD::get_singleton()->get_sky()->roughness_layers, Image::get_image_required_mipmaps(atlas->size, atlas->size, Image::FORMAT_RGBAH) + 1); + mipmaps = LightStorage::get_singleton()->reflection_probe_get_update_mode(rpi->probe) == RS::REFLECTION_PROBE_UPDATE_ALWAYS ? 8 : mipmaps; // always use 8 mipmaps with real time filtering + { + //reflection atlas was unused, create: + RD::TextureFormat tf; + tf.array_layers = 6 * atlas->count; + tf.format = RendererSceneRenderRD::get_singleton()->_render_buffers_get_color_format(); + tf.texture_type = RD::TEXTURE_TYPE_CUBE_ARRAY; + tf.mipmaps = mipmaps; + tf.width = atlas->size; + tf.height = atlas->size; + tf.usage_bits = RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT | RD::TEXTURE_USAGE_SAMPLING_BIT | (RendererSceneRenderRD::get_singleton()->_render_buffers_can_be_storage() ? RD::TEXTURE_USAGE_STORAGE_BIT : 0); + + atlas->reflection = RD::get_singleton()->texture_create(tf, RD::TextureView()); + } + { + RD::TextureFormat tf; + tf.format = RD::get_singleton()->texture_is_format_supported_for_usage(RD::DATA_FORMAT_D32_SFLOAT, RD::TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) ? RD::DATA_FORMAT_D32_SFLOAT : RD::DATA_FORMAT_X8_D24_UNORM_PACK32; + tf.width = atlas->size; + tf.height = atlas->size; + tf.usage_bits = RD::TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | RD::TEXTURE_USAGE_SAMPLING_BIT; + atlas->depth_buffer = RD::get_singleton()->texture_create(tf, RD::TextureView()); + } + atlas->reflections.resize(atlas->count); + for (int i = 0; i < atlas->count; i++) { + atlas->reflections.write[i].data.update_reflection_data(atlas->size, mipmaps, false, atlas->reflection, i * 6, LightStorage::get_singleton()->reflection_probe_get_update_mode(rpi->probe) == RS::REFLECTION_PROBE_UPDATE_ALWAYS, RendererSceneRenderRD::get_singleton()->get_sky()->roughness_layers, RendererSceneRenderRD::get_singleton()->_render_buffers_get_color_format()); + for (int j = 0; j < 6; j++) { + atlas->reflections.write[i].fbs[j] = RendererSceneRenderRD::get_singleton()->reflection_probe_create_framebuffer(atlas->reflections.write[i].data.layers[0].mipmaps[0].views[j], atlas->depth_buffer); + } + } + + Vector<RID> fb; + fb.push_back(atlas->depth_buffer); + atlas->depth_fb = RD::get_singleton()->framebuffer_create(fb); + } + + if (rpi->atlas_index == -1) { + for (int i = 0; i < atlas->reflections.size(); i++) { + if (atlas->reflections[i].owner.is_null()) { + rpi->atlas_index = i; + break; + } + } + //find the one used last + if (rpi->atlas_index == -1) { + //everything is in use, find the one least used via LRU + uint64_t pass_min = 0; + + for (int i = 0; i < atlas->reflections.size(); i++) { + ReflectionProbeInstance *rpi2 = reflection_probe_instance_owner.get_or_null(atlas->reflections[i].owner); + if (rpi2->last_pass < pass_min) { + pass_min = rpi2->last_pass; + rpi->atlas_index = i; + } + } + } + } + + if (rpi->atlas_index != -1) { // should we fail if this is still -1 ? + atlas->reflections.write[rpi->atlas_index].owner = p_instance; + } + + rpi->atlas = p_reflection_atlas; + rpi->rendering = true; + rpi->dirty = false; + rpi->processing_layer = 1; + rpi->processing_side = 0; + + RD::get_singleton()->draw_command_end_label(); + + return true; +} + +bool LightStorage::reflection_probe_instance_postprocess_step(RID p_instance) { + ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); + ERR_FAIL_COND_V(!rpi, false); + ERR_FAIL_COND_V(!rpi->rendering, false); + ERR_FAIL_COND_V(rpi->atlas.is_null(), false); + + ReflectionAtlas *atlas = reflection_atlas_owner.get_or_null(rpi->atlas); + if (!atlas || rpi->atlas_index == -1) { + //does not belong to an atlas anymore, cancel (was removed from atlas or atlas changed while rendering) + rpi->rendering = false; + return false; + } + + if (LightStorage::get_singleton()->reflection_probe_get_update_mode(rpi->probe) == RS::REFLECTION_PROBE_UPDATE_ALWAYS) { + // Using real time reflections, all roughness is done in one step + atlas->reflections.write[rpi->atlas_index].data.create_reflection_fast_filter(false); + rpi->rendering = false; + rpi->processing_side = 0; + rpi->processing_layer = 1; + return true; + } + + if (rpi->processing_layer > 1) { + atlas->reflections.write[rpi->atlas_index].data.create_reflection_importance_sample(false, 10, rpi->processing_layer, RendererSceneRenderRD::get_singleton()->get_sky()->sky_ggx_samples_quality); + rpi->processing_layer++; + if (rpi->processing_layer == atlas->reflections[rpi->atlas_index].data.layers[0].mipmaps.size()) { + rpi->rendering = false; + rpi->processing_side = 0; + rpi->processing_layer = 1; + return true; + } + return false; + + } else { + atlas->reflections.write[rpi->atlas_index].data.create_reflection_importance_sample(false, rpi->processing_side, rpi->processing_layer, RendererSceneRenderRD::get_singleton()->get_sky()->sky_ggx_samples_quality); + } + + rpi->processing_side++; + if (rpi->processing_side == 6) { + rpi->processing_side = 0; + rpi->processing_layer++; + } + + return false; +} + +uint32_t LightStorage::reflection_probe_instance_get_resolution(RID p_instance) { + ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); + ERR_FAIL_COND_V(!rpi, 0); + + ReflectionAtlas *atlas = reflection_atlas_owner.get_or_null(rpi->atlas); + ERR_FAIL_COND_V(!atlas, 0); + return atlas->size; +} + +RID LightStorage::reflection_probe_instance_get_framebuffer(RID p_instance, int p_index) { + ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); + ERR_FAIL_COND_V(!rpi, RID()); + ERR_FAIL_INDEX_V(p_index, 6, RID()); + + ReflectionAtlas *atlas = reflection_atlas_owner.get_or_null(rpi->atlas); + ERR_FAIL_COND_V(!atlas, RID()); + return atlas->reflections[rpi->atlas_index].fbs[p_index]; +} + +RID LightStorage::reflection_probe_instance_get_depth_framebuffer(RID p_instance, int p_index) { + ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); + ERR_FAIL_COND_V(!rpi, RID()); + ERR_FAIL_INDEX_V(p_index, 6, RID()); + + ReflectionAtlas *atlas = reflection_atlas_owner.get_or_null(rpi->atlas); + ERR_FAIL_COND_V(!atlas, RID()); + return atlas->depth_fb; +} + +ClusterBuilderRD *LightStorage::reflection_probe_instance_get_cluster_builder(RID p_instance, ClusterBuilderSharedDataRD *p_cluster_builder_shared) { + ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); + ReflectionAtlas *ra = reflection_atlas_owner.get_or_null(rpi->atlas); + if (!ra) { + ERR_PRINT("reflection probe has no reflection atlas! Bug?"); + return nullptr; + } else { + if (ra->cluster_builder == nullptr) { + ra->cluster_builder = memnew(ClusterBuilderRD); + ra->cluster_builder->set_shared(p_cluster_builder_shared); + ra->cluster_builder->setup(Size2i(ra->size, ra->size), get_max_cluster_elements(), RID(), RID(), RID()); + } + return ra->cluster_builder; + } +} + +/* REFLECTION DATA */ + +void LightStorage::free_reflection_data() { + if (reflection_buffer.is_valid()) { + RD::get_singleton()->free(reflection_buffer); + reflection_buffer = RID(); + } + + if (reflections != nullptr) { + memdelete_arr(reflections); + reflections = nullptr; + } + + if (reflection_sort != nullptr) { + memdelete_arr(reflection_sort); + reflection_sort = nullptr; + } +} + +void LightStorage::set_max_reflection_probes(const uint32_t p_max_reflection_probes) { + max_reflections = p_max_reflection_probes; + reflections = memnew_arr(ReflectionData, max_reflections); + reflection_sort = memnew_arr(ReflectionProbeInstanceSort, max_reflections); + reflection_buffer = RD::get_singleton()->storage_buffer_create(sizeof(ReflectionData) * max_reflections); +} + +void LightStorage::update_reflection_probe_buffer(RenderDataRD *p_render_data, const PagedArray<RID> &p_reflections, const Transform3D &p_camera_inverse_transform, RID p_environment) { + ForwardIDStorage *forward_id_storage = ForwardIDStorage::get_singleton(); + + reflection_count = 0; + + for (uint32_t i = 0; i < (uint32_t)p_reflections.size(); i++) { + if (reflection_count == max_reflections) { + break; + } + + ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_reflections[i]); + if (!rpi) { + continue; + } + + Transform3D transform = rpi->transform; + + reflection_sort[reflection_count].probe_instance = rpi; + reflection_sort[reflection_count].depth = -p_camera_inverse_transform.xform(transform.origin).z; + reflection_count++; + } + + if (reflection_count > 0) { + SortArray<ReflectionProbeInstanceSort> sort_array; + sort_array.sort(reflection_sort, reflection_count); + } + + bool using_forward_ids = forward_id_storage->uses_forward_ids(); + for (uint32_t i = 0; i < reflection_count; i++) { + ReflectionProbeInstance *rpi = reflection_sort[i].probe_instance; + + if (using_forward_ids) { + forward_id_storage->map_forward_id(FORWARD_ID_TYPE_REFLECTION_PROBE, rpi->forward_id, i); + } + + ReflectionProbe *probe = reflection_probe_owner.get_or_null(rpi->probe); + + ReflectionData &reflection_ubo = reflections[i]; + + Vector3 extents = probe->extents; + + rpi->cull_mask = probe->cull_mask; + + reflection_ubo.box_extents[0] = extents.x; + reflection_ubo.box_extents[1] = extents.y; + reflection_ubo.box_extents[2] = extents.z; + reflection_ubo.index = rpi->atlas_index; + + Vector3 origin_offset = probe->origin_offset; + + reflection_ubo.box_offset[0] = origin_offset.x; + reflection_ubo.box_offset[1] = origin_offset.y; + reflection_ubo.box_offset[2] = origin_offset.z; + reflection_ubo.mask = probe->cull_mask; + + reflection_ubo.intensity = probe->intensity; + reflection_ubo.ambient_mode = probe->ambient_mode; + + reflection_ubo.exterior = !probe->interior; + reflection_ubo.box_project = probe->box_projection; + reflection_ubo.exposure_normalization = 1.0; + + if (p_render_data->camera_attributes.is_valid()) { + float exposure = RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor(p_render_data->camera_attributes); + reflection_ubo.exposure_normalization = exposure / probe->baked_exposure; + } + + Color ambient_linear = probe->ambient_color.srgb_to_linear(); + float interior_ambient_energy = probe->ambient_color_energy; + reflection_ubo.ambient[0] = ambient_linear.r * interior_ambient_energy; + reflection_ubo.ambient[1] = ambient_linear.g * interior_ambient_energy; + reflection_ubo.ambient[2] = ambient_linear.b * interior_ambient_energy; + + Transform3D transform = rpi->transform; + Transform3D proj = (p_camera_inverse_transform * transform).inverse(); + MaterialStorage::store_transform(proj, reflection_ubo.local_matrix); + + // hook for subclass to do further processing. + RendererSceneRenderRD::get_singleton()->setup_added_reflection_probe(transform, extents); + + rpi->last_pass = RSG::rasterizer->get_frame_number(); + } + + if (reflection_count) { + RD::get_singleton()->buffer_update(reflection_buffer, 0, reflection_count * sizeof(ReflectionData), reflections, RD::BARRIER_MASK_RASTER | RD::BARRIER_MASK_COMPUTE); + } +} + /* LIGHTMAP API */ RID LightStorage::lightmap_allocate() { @@ -649,7 +1716,7 @@ void LightStorage::lightmap_free(RID p_rid) { } void LightStorage::lightmap_set_textures(RID p_lightmap, RID p_light, bool p_uses_spherical_haromics) { - RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton(); + TextureStorage *texture_storage = TextureStorage::get_singleton(); Lightmap *lm = lightmap_owner.get_or_null(p_lightmap); ERR_FAIL_COND(!lm); @@ -658,17 +1725,17 @@ void LightStorage::lightmap_set_textures(RID p_lightmap, RID p_light, bool p_use //erase lightmap users if (lm->light_texture.is_valid()) { - RendererRD::TextureStorage::Texture *t = RendererRD::TextureStorage::get_singleton()->get_texture(lm->light_texture); + TextureStorage::Texture *t = texture_storage->get_singleton()->get_texture(lm->light_texture); if (t) { t->lightmap_users.erase(p_lightmap); } } - RendererRD::TextureStorage::Texture *t = RendererRD::TextureStorage::get_singleton()->get_texture(p_light); + TextureStorage::Texture *t = texture_storage->get_singleton()->get_texture(p_light); lm->light_texture = p_light; lm->uses_spherical_harmonics = p_uses_spherical_haromics; - RID default_2d_array = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_WHITE); + RID default_2d_array = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_WHITE); if (!t) { if (using_lightmap_array) { if (lm->array_index >= 0) { @@ -830,3 +1897,550 @@ AABB LightStorage::lightmap_get_aabb(RID p_lightmap) const { ERR_FAIL_COND_V(!lm, AABB()); return lm->bounds; } + +/* LIGHTMAP INSTANCE */ + +RID LightStorage::lightmap_instance_create(RID p_lightmap) { + LightmapInstance li; + li.lightmap = p_lightmap; + return lightmap_instance_owner.make_rid(li); +} + +void LightStorage::lightmap_instance_free(RID p_lightmap) { + lightmap_instance_owner.free(p_lightmap); +} + +void LightStorage::lightmap_instance_set_transform(RID p_lightmap, const Transform3D &p_transform) { + LightmapInstance *li = lightmap_instance_owner.get_or_null(p_lightmap); + ERR_FAIL_COND(!li); + li->transform = p_transform; +} + +/* SHADOW ATLAS API */ + +RID LightStorage::shadow_atlas_create() { + return shadow_atlas_owner.make_rid(ShadowAtlas()); +} + +void LightStorage::shadow_atlas_free(RID p_atlas) { + shadow_atlas_set_size(p_atlas, 0); + shadow_atlas_owner.free(p_atlas); +} + +void LightStorage::_update_shadow_atlas(ShadowAtlas *shadow_atlas) { + if (shadow_atlas->size > 0 && shadow_atlas->depth.is_null()) { + RD::TextureFormat tf; + tf.format = shadow_atlas->use_16_bits ? RD::DATA_FORMAT_D16_UNORM : RD::DATA_FORMAT_D32_SFLOAT; + tf.width = shadow_atlas->size; + tf.height = shadow_atlas->size; + tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; + + shadow_atlas->depth = RD::get_singleton()->texture_create(tf, RD::TextureView()); + Vector<RID> fb_tex; + fb_tex.push_back(shadow_atlas->depth); + shadow_atlas->fb = RD::get_singleton()->framebuffer_create(fb_tex); + } +} + +void LightStorage::shadow_atlas_set_size(RID p_atlas, int p_size, bool p_16_bits) { + ShadowAtlas *shadow_atlas = shadow_atlas_owner.get_or_null(p_atlas); + ERR_FAIL_COND(!shadow_atlas); + ERR_FAIL_COND(p_size < 0); + p_size = next_power_of_2(p_size); + + if (p_size == shadow_atlas->size && p_16_bits == shadow_atlas->use_16_bits) { + return; + } + + // erasing atlas + if (shadow_atlas->depth.is_valid()) { + RD::get_singleton()->free(shadow_atlas->depth); + shadow_atlas->depth = RID(); + } + for (int i = 0; i < 4; i++) { + //clear subdivisions + shadow_atlas->quadrants[i].shadows.clear(); + shadow_atlas->quadrants[i].shadows.resize(1 << shadow_atlas->quadrants[i].subdivision); + } + + //erase shadow atlas reference from lights + for (const KeyValue<RID, uint32_t> &E : shadow_atlas->shadow_owners) { + LightInstance *li = light_instance_owner.get_or_null(E.key); + ERR_CONTINUE(!li); + li->shadow_atlases.erase(p_atlas); + } + + //clear owners + shadow_atlas->shadow_owners.clear(); + + shadow_atlas->size = p_size; + shadow_atlas->use_16_bits = p_16_bits; +} + +void LightStorage::shadow_atlas_set_quadrant_subdivision(RID p_atlas, int p_quadrant, int p_subdivision) { + ShadowAtlas *shadow_atlas = shadow_atlas_owner.get_or_null(p_atlas); + ERR_FAIL_COND(!shadow_atlas); + ERR_FAIL_INDEX(p_quadrant, 4); + ERR_FAIL_INDEX(p_subdivision, 16384); + + uint32_t subdiv = next_power_of_2(p_subdivision); + if (subdiv & 0xaaaaaaaa) { //sqrt(subdiv) must be integer + subdiv <<= 1; + } + + subdiv = int(Math::sqrt((float)subdiv)); + + //obtain the number that will be x*x + + if (shadow_atlas->quadrants[p_quadrant].subdivision == subdiv) { + return; + } + + //erase all data from quadrant + for (int i = 0; i < shadow_atlas->quadrants[p_quadrant].shadows.size(); i++) { + if (shadow_atlas->quadrants[p_quadrant].shadows[i].owner.is_valid()) { + shadow_atlas->shadow_owners.erase(shadow_atlas->quadrants[p_quadrant].shadows[i].owner); + LightInstance *li = light_instance_owner.get_or_null(shadow_atlas->quadrants[p_quadrant].shadows[i].owner); + ERR_CONTINUE(!li); + li->shadow_atlases.erase(p_atlas); + } + } + + shadow_atlas->quadrants[p_quadrant].shadows.clear(); + shadow_atlas->quadrants[p_quadrant].shadows.resize(subdiv * subdiv); + shadow_atlas->quadrants[p_quadrant].subdivision = subdiv; + + //cache the smallest subdiv (for faster allocation in light update) + + shadow_atlas->smallest_subdiv = 1 << 30; + + for (int i = 0; i < 4; i++) { + if (shadow_atlas->quadrants[i].subdivision) { + shadow_atlas->smallest_subdiv = MIN(shadow_atlas->smallest_subdiv, shadow_atlas->quadrants[i].subdivision); + } + } + + if (shadow_atlas->smallest_subdiv == 1 << 30) { + shadow_atlas->smallest_subdiv = 0; + } + + //resort the size orders, simple bublesort for 4 elements.. + + int swaps = 0; + do { + swaps = 0; + + for (int i = 0; i < 3; i++) { + if (shadow_atlas->quadrants[shadow_atlas->size_order[i]].subdivision < shadow_atlas->quadrants[shadow_atlas->size_order[i + 1]].subdivision) { + SWAP(shadow_atlas->size_order[i], shadow_atlas->size_order[i + 1]); + swaps++; + } + } + } while (swaps > 0); +} + +bool LightStorage::_shadow_atlas_find_shadow(ShadowAtlas *shadow_atlas, int *p_in_quadrants, int p_quadrant_count, int p_current_subdiv, uint64_t p_tick, int &r_quadrant, int &r_shadow) { + for (int i = p_quadrant_count - 1; i >= 0; i--) { + int qidx = p_in_quadrants[i]; + + if (shadow_atlas->quadrants[qidx].subdivision == (uint32_t)p_current_subdiv) { + return false; + } + + //look for an empty space + int sc = shadow_atlas->quadrants[qidx].shadows.size(); + const ShadowAtlas::Quadrant::Shadow *sarr = shadow_atlas->quadrants[qidx].shadows.ptr(); + + int found_free_idx = -1; //found a free one + int found_used_idx = -1; //found existing one, must steal it + uint64_t min_pass = 0; // pass of the existing one, try to use the least recently used one (LRU fashion) + + for (int j = 0; j < sc; j++) { + if (!sarr[j].owner.is_valid()) { + found_free_idx = j; + break; + } + + LightInstance *sli = light_instance_owner.get_or_null(sarr[j].owner); + ERR_CONTINUE(!sli); + + if (sli->last_scene_pass != RendererSceneRenderRD::get_singleton()->get_scene_pass()) { + //was just allocated, don't kill it so soon, wait a bit.. + if (p_tick - sarr[j].alloc_tick < shadow_atlas_realloc_tolerance_msec) { + continue; + } + + if (found_used_idx == -1 || sli->last_scene_pass < min_pass) { + found_used_idx = j; + min_pass = sli->last_scene_pass; + } + } + } + + if (found_free_idx == -1 && found_used_idx == -1) { + continue; //nothing found + } + + if (found_free_idx == -1 && found_used_idx != -1) { + found_free_idx = found_used_idx; + } + + r_quadrant = qidx; + r_shadow = found_free_idx; + + return true; + } + + return false; +} + +bool LightStorage::_shadow_atlas_find_omni_shadows(ShadowAtlas *shadow_atlas, int *p_in_quadrants, int p_quadrant_count, int p_current_subdiv, uint64_t p_tick, int &r_quadrant, int &r_shadow) { + for (int i = p_quadrant_count - 1; i >= 0; i--) { + int qidx = p_in_quadrants[i]; + + if (shadow_atlas->quadrants[qidx].subdivision == (uint32_t)p_current_subdiv) { + return false; + } + + //look for an empty space + int sc = shadow_atlas->quadrants[qidx].shadows.size(); + const ShadowAtlas::Quadrant::Shadow *sarr = shadow_atlas->quadrants[qidx].shadows.ptr(); + + int found_idx = -1; + uint64_t min_pass = 0; // sum of currently selected spots, try to get the least recently used pair + + for (int j = 0; j < sc - 1; j++) { + uint64_t pass = 0; + + if (sarr[j].owner.is_valid()) { + LightInstance *sli = light_instance_owner.get_or_null(sarr[j].owner); + ERR_CONTINUE(!sli); + + if (sli->last_scene_pass == RendererSceneRenderRD::get_singleton()->get_scene_pass()) { + continue; + } + + //was just allocated, don't kill it so soon, wait a bit.. + if (p_tick - sarr[j].alloc_tick < shadow_atlas_realloc_tolerance_msec) { + continue; + } + pass += sli->last_scene_pass; + } + + if (sarr[j + 1].owner.is_valid()) { + LightInstance *sli = light_instance_owner.get_or_null(sarr[j + 1].owner); + ERR_CONTINUE(!sli); + + if (sli->last_scene_pass == RendererSceneRenderRD::get_singleton()->get_scene_pass()) { + continue; + } + + //was just allocated, don't kill it so soon, wait a bit.. + if (p_tick - sarr[j + 1].alloc_tick < shadow_atlas_realloc_tolerance_msec) { + continue; + } + pass += sli->last_scene_pass; + } + + if (found_idx == -1 || pass < min_pass) { + found_idx = j; + min_pass = pass; + + // we found two empty spots, no need to check the rest + if (pass == 0) { + break; + } + } + } + + if (found_idx == -1) { + continue; //nothing found + } + + r_quadrant = qidx; + r_shadow = found_idx; + + return true; + } + + return false; +} + +bool LightStorage::shadow_atlas_update_light(RID p_atlas, RID p_light_instance, float p_coverage, uint64_t p_light_version) { + ShadowAtlas *shadow_atlas = shadow_atlas_owner.get_or_null(p_atlas); + ERR_FAIL_COND_V(!shadow_atlas, false); + + LightInstance *li = light_instance_owner.get_or_null(p_light_instance); + ERR_FAIL_COND_V(!li, false); + + if (shadow_atlas->size == 0 || shadow_atlas->smallest_subdiv == 0) { + return false; + } + + uint32_t quad_size = shadow_atlas->size >> 1; + int desired_fit = MIN(quad_size / shadow_atlas->smallest_subdiv, next_power_of_2(quad_size * p_coverage)); + + int valid_quadrants[4]; + int valid_quadrant_count = 0; + int best_size = -1; //best size found + int best_subdiv = -1; //subdiv for the best size + + //find the quadrants this fits into, and the best possible size it can fit into + for (int i = 0; i < 4; i++) { + int q = shadow_atlas->size_order[i]; + int sd = shadow_atlas->quadrants[q].subdivision; + if (sd == 0) { + continue; //unused + } + + int max_fit = quad_size / sd; + + if (best_size != -1 && max_fit > best_size) { + break; //too large + } + + valid_quadrants[valid_quadrant_count++] = q; + best_subdiv = sd; + + if (max_fit >= desired_fit) { + best_size = max_fit; + } + } + + ERR_FAIL_COND_V(valid_quadrant_count == 0, false); + + uint64_t tick = OS::get_singleton()->get_ticks_msec(); + + uint32_t old_key = SHADOW_INVALID; + uint32_t old_quadrant = SHADOW_INVALID; + uint32_t old_shadow = SHADOW_INVALID; + int old_subdivision = -1; + + bool should_realloc = false; + bool should_redraw = false; + + if (shadow_atlas->shadow_owners.has(p_light_instance)) { + old_key = shadow_atlas->shadow_owners[p_light_instance]; + old_quadrant = (old_key >> QUADRANT_SHIFT) & 0x3; + old_shadow = old_key & SHADOW_INDEX_MASK; + + should_realloc = shadow_atlas->quadrants[old_quadrant].subdivision != (uint32_t)best_subdiv && (shadow_atlas->quadrants[old_quadrant].shadows[old_shadow].alloc_tick - tick > shadow_atlas_realloc_tolerance_msec); + should_redraw = shadow_atlas->quadrants[old_quadrant].shadows[old_shadow].version != p_light_version; + + if (!should_realloc) { + shadow_atlas->quadrants[old_quadrant].shadows.write[old_shadow].version = p_light_version; + //already existing, see if it should redraw or it's just OK + return should_redraw; + } + + old_subdivision = shadow_atlas->quadrants[old_quadrant].subdivision; + } + + bool is_omni = li->light_type == RS::LIGHT_OMNI; + bool found_shadow = false; + int new_quadrant = -1; + int new_shadow = -1; + + if (is_omni) { + found_shadow = _shadow_atlas_find_omni_shadows(shadow_atlas, valid_quadrants, valid_quadrant_count, old_subdivision, tick, new_quadrant, new_shadow); + } else { + found_shadow = _shadow_atlas_find_shadow(shadow_atlas, valid_quadrants, valid_quadrant_count, old_subdivision, tick, new_quadrant, new_shadow); + } + + if (found_shadow) { + if (old_quadrant != SHADOW_INVALID) { + shadow_atlas->quadrants[old_quadrant].shadows.write[old_shadow].version = 0; + shadow_atlas->quadrants[old_quadrant].shadows.write[old_shadow].owner = RID(); + + if (old_key & OMNI_LIGHT_FLAG) { + shadow_atlas->quadrants[old_quadrant].shadows.write[old_shadow + 1].version = 0; + shadow_atlas->quadrants[old_quadrant].shadows.write[old_shadow + 1].owner = RID(); + } + } + + uint32_t new_key = new_quadrant << QUADRANT_SHIFT; + new_key |= new_shadow; + + ShadowAtlas::Quadrant::Shadow *sh = &shadow_atlas->quadrants[new_quadrant].shadows.write[new_shadow]; + _shadow_atlas_invalidate_shadow(sh, p_atlas, shadow_atlas, new_quadrant, new_shadow); + + sh->owner = p_light_instance; + sh->alloc_tick = tick; + sh->version = p_light_version; + + if (is_omni) { + new_key |= OMNI_LIGHT_FLAG; + + int new_omni_shadow = new_shadow + 1; + ShadowAtlas::Quadrant::Shadow *extra_sh = &shadow_atlas->quadrants[new_quadrant].shadows.write[new_omni_shadow]; + _shadow_atlas_invalidate_shadow(extra_sh, p_atlas, shadow_atlas, new_quadrant, new_omni_shadow); + + extra_sh->owner = p_light_instance; + extra_sh->alloc_tick = tick; + extra_sh->version = p_light_version; + } + + li->shadow_atlases.insert(p_atlas); + + //update it in map + shadow_atlas->shadow_owners[p_light_instance] = new_key; + //make it dirty, as it should redraw anyway + return true; + } + + return should_redraw; +} + +void LightStorage::_shadow_atlas_invalidate_shadow(ShadowAtlas::Quadrant::Shadow *p_shadow, RID p_atlas, ShadowAtlas *p_shadow_atlas, uint32_t p_quadrant, uint32_t p_shadow_idx) { + if (p_shadow->owner.is_valid()) { + LightInstance *sli = light_instance_owner.get_or_null(p_shadow->owner); + uint32_t old_key = p_shadow_atlas->shadow_owners[p_shadow->owner]; + + if (old_key & OMNI_LIGHT_FLAG) { + uint32_t s = old_key & SHADOW_INDEX_MASK; + uint32_t omni_shadow_idx = p_shadow_idx + (s == (uint32_t)p_shadow_idx ? 1 : -1); + ShadowAtlas::Quadrant::Shadow *omni_shadow = &p_shadow_atlas->quadrants[p_quadrant].shadows.write[omni_shadow_idx]; + omni_shadow->version = 0; + omni_shadow->owner = RID(); + } + + p_shadow_atlas->shadow_owners.erase(p_shadow->owner); + p_shadow->version = 0; + p_shadow->owner = RID(); + sli->shadow_atlases.erase(p_atlas); + } +} + +void LightStorage::shadow_atlas_update(RID p_atlas) { + ShadowAtlas *shadow_atlas = shadow_atlas_owner.get_or_null(p_atlas); + ERR_FAIL_COND(!shadow_atlas); + + _update_shadow_atlas(shadow_atlas); +} + +/* DIRECTIONAL SHADOW */ + +void LightStorage::update_directional_shadow_atlas() { + if (directional_shadow.depth.is_null() && directional_shadow.size > 0) { + RD::TextureFormat tf; + tf.format = directional_shadow.use_16_bits ? RD::DATA_FORMAT_D16_UNORM : RD::DATA_FORMAT_D32_SFLOAT; + tf.width = directional_shadow.size; + tf.height = directional_shadow.size; + tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; + + directional_shadow.depth = RD::get_singleton()->texture_create(tf, RD::TextureView()); + Vector<RID> fb_tex; + fb_tex.push_back(directional_shadow.depth); + directional_shadow.fb = RD::get_singleton()->framebuffer_create(fb_tex); + } +} +void LightStorage::directional_shadow_atlas_set_size(int p_size, bool p_16_bits) { + p_size = nearest_power_of_2_templated(p_size); + + if (directional_shadow.size == p_size && directional_shadow.use_16_bits == p_16_bits) { + return; + } + + directional_shadow.size = p_size; + directional_shadow.use_16_bits = p_16_bits; + + if (directional_shadow.depth.is_valid()) { + RD::get_singleton()->free(directional_shadow.depth); + directional_shadow.depth = RID(); + RendererSceneRenderRD::get_singleton()->base_uniforms_changed(); + } +} + +void LightStorage::set_directional_shadow_count(int p_count) { + directional_shadow.light_count = p_count; + directional_shadow.current_light = 0; +} + +static Rect2i _get_directional_shadow_rect(int p_size, int p_shadow_count, int p_shadow_index) { + int split_h = 1; + int split_v = 1; + + while (split_h * split_v < p_shadow_count) { + if (split_h == split_v) { + split_h <<= 1; + } else { + split_v <<= 1; + } + } + + Rect2i rect(0, 0, p_size, p_size); + rect.size.width /= split_h; + rect.size.height /= split_v; + + rect.position.x = rect.size.width * (p_shadow_index % split_h); + rect.position.y = rect.size.height * (p_shadow_index / split_h); + + return rect; +} + +Rect2i LightStorage::get_directional_shadow_rect() { + return _get_directional_shadow_rect(directional_shadow.size, directional_shadow.light_count, directional_shadow.current_light); +} + +int LightStorage::get_directional_light_shadow_size(RID p_light_intance) { + ERR_FAIL_COND_V(directional_shadow.light_count == 0, 0); + + Rect2i r = _get_directional_shadow_rect(directional_shadow.size, directional_shadow.light_count, 0); + + LightInstance *light_instance = light_instance_owner.get_or_null(p_light_intance); + ERR_FAIL_COND_V(!light_instance, 0); + + switch (light_directional_get_shadow_mode(light_instance->light)) { + case RS::LIGHT_DIRECTIONAL_SHADOW_ORTHOGONAL: + break; //none + case RS::LIGHT_DIRECTIONAL_SHADOW_PARALLEL_2_SPLITS: + r.size.height /= 2; + break; + case RS::LIGHT_DIRECTIONAL_SHADOW_PARALLEL_4_SPLITS: + r.size /= 2; + break; + } + + return MAX(r.size.width, r.size.height); +} + +/* SHADOW CUBEMAPS */ + +LightStorage::ShadowCubemap *LightStorage::_get_shadow_cubemap(int p_size) { + if (!shadow_cubemaps.has(p_size)) { + ShadowCubemap sc; + { + RD::TextureFormat tf; + tf.format = RD::get_singleton()->texture_is_format_supported_for_usage(RD::DATA_FORMAT_D32_SFLOAT, RD::TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) ? RD::DATA_FORMAT_D32_SFLOAT : RD::DATA_FORMAT_X8_D24_UNORM_PACK32; + tf.width = p_size; + tf.height = p_size; + tf.texture_type = RD::TEXTURE_TYPE_CUBE; + tf.array_layers = 6; + tf.usage_bits = RD::TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | RD::TEXTURE_USAGE_SAMPLING_BIT; + sc.cubemap = RD::get_singleton()->texture_create(tf, RD::TextureView()); + } + + for (int i = 0; i < 6; i++) { + RID side_texture = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), sc.cubemap, i, 0); + Vector<RID> fbtex; + fbtex.push_back(side_texture); + sc.side_fb[i] = RD::get_singleton()->framebuffer_create(fbtex); + } + + shadow_cubemaps[p_size] = sc; + } + + return &shadow_cubemaps[p_size]; +} + +RID LightStorage::get_cubemap(int p_size) { + ShadowCubemap *cubemap = _get_shadow_cubemap(p_size); + + return cubemap->cubemap; +} + +RID LightStorage::get_cubemap_fb(int p_size, int p_pass) { + ShadowCubemap *cubemap = _get_shadow_cubemap(p_size); + + return cubemap->side_fb[p_pass]; +} diff --git a/servers/rendering/renderer_rd/storage_rd/light_storage.h b/servers/rendering/renderer_rd/storage_rd/light_storage.h index 82d609291c..79006ad982 100644 --- a/servers/rendering/renderer_rd/storage_rd/light_storage.h +++ b/servers/rendering/renderer_rd/storage_rd/light_storage.h @@ -32,16 +32,32 @@ #define LIGHT_STORAGE_RD_H #include "core/templates/local_vector.h" +#include "core/templates/paged_array.h" #include "core/templates/rid_owner.h" #include "core/templates/self_list.h" +#include "servers/rendering/renderer_rd/cluster_builder_rd.h" +#include "servers/rendering/renderer_rd/environment/sky.h" +#include "servers/rendering/renderer_rd/storage_rd/forward_id_storage.h" +#include "servers/rendering/renderer_rd/storage_rd/texture_storage.h" #include "servers/rendering/storage/light_storage.h" #include "servers/rendering/storage/utilities.h" +struct RenderDataRD; + namespace RendererRD { class LightStorage : public RendererLightStorage { +public: + enum ShadowAtlastQuadrant { + QUADRANT_SHIFT = 27, + OMNI_LIGHT_FLAG = 1 << 26, + SHADOW_INDEX_MASK = OMNI_LIGHT_FLAG - 1, + SHADOW_INVALID = 0xFFFFFFFF + }; + private: static LightStorage *singleton; + uint32_t max_cluster_elements = 512; /* LIGHT */ struct Light { @@ -70,6 +86,135 @@ private: mutable RID_Owner<Light, true> light_owner; + /* LIGHT INSTANCE */ + + struct LightInstance { + struct ShadowTransform { + Projection camera; + Transform3D transform; + float farplane; + float split; + float bias_scale; + float shadow_texel_size; + float range_begin; + Rect2 atlas_rect; + Vector2 uv_scale; + }; + + RS::LightType light_type = RS::LIGHT_DIRECTIONAL; + + ShadowTransform shadow_transform[6]; + + AABB aabb; + RID self; + RID light; + Transform3D transform; + + Vector3 light_vector; + Vector3 spot_vector; + float linear_att = 0.0; + + uint64_t shadow_pass = 0; + uint64_t last_scene_pass = 0; + uint64_t last_scene_shadow_pass = 0; + uint64_t last_pass = 0; + uint32_t cull_mask = 0; + uint32_t light_directional_index = 0; + + Rect2 directional_rect; + + HashSet<RID> shadow_atlases; //shadow atlases where this light is registered + + ForwardID forward_id = -1; + + LightInstance() {} + }; + + mutable RID_Owner<LightInstance> light_instance_owner; + + /* OMNI/SPOT LIGHT DATA */ + + struct LightData { + float position[3]; + float inv_radius; + float direction[3]; // in omni, x and y are used for dual paraboloid offset + float size; + + float color[3]; + float attenuation; + + float inv_spot_attenuation; + float cos_spot_angle; + float specular_amount; + float shadow_opacity; + + float atlas_rect[4]; // in omni, used for atlas uv, in spot, used for projector uv + float shadow_matrix[16]; + float shadow_bias; + float shadow_normal_bias; + float transmittance_bias; + float soft_shadow_size; + float soft_shadow_scale; + uint32_t mask; + float volumetric_fog_energy; + uint32_t bake_mode; + float projector_rect[4]; + }; + + struct LightInstanceDepthSort { + float depth; + LightInstance *light_instance; + Light *light; + bool operator<(const LightInstanceDepthSort &p_sort) const { + return depth < p_sort.depth; + } + }; + + uint32_t max_lights; + uint32_t omni_light_count = 0; + uint32_t spot_light_count = 0; + LightData *omni_lights = nullptr; + LightData *spot_lights = nullptr; + LightInstanceDepthSort *omni_light_sort = nullptr; + LightInstanceDepthSort *spot_light_sort = nullptr; + RID omni_light_buffer; + RID spot_light_buffer; + + /* DIRECTIONAL LIGHT DATA */ + + struct DirectionalLightData { + float direction[3]; + float energy; + float color[3]; + float size; + float specular; + uint32_t mask; + float softshadow_angle; + float soft_shadow_scale; + uint32_t blend_splits; + float shadow_opacity; + float fade_from; + float fade_to; + uint32_t pad[2]; + uint32_t bake_mode; + float volumetric_fog_energy; + float shadow_bias[4]; + float shadow_normal_bias[4]; + float shadow_transmittance_bias[4]; + float shadow_z_range[4]; + float shadow_range_begin[4]; + float shadow_split_offsets[4]; + float shadow_matrices[4][16]; + float uv_scale1[2]; + float uv_scale2[2]; + float uv_scale3[2]; + float uv_scale4[2]; + }; + + uint32_t max_directional_lights; + DirectionalLightData *directional_lights = nullptr; + RID directional_light_buffer; + /* REFLECTION PROBE */ struct ReflectionProbe { @@ -93,6 +238,89 @@ private: }; mutable RID_Owner<ReflectionProbe, true> reflection_probe_owner; + /* REFLECTION ATLAS */ + + struct ReflectionAtlas { + int count = 0; + int size = 0; + + RID reflection; + RID depth_buffer; + RID depth_fb; + + struct Reflection { + RID owner; + RendererRD::SkyRD::ReflectionData data; + RID fbs[6]; + }; + + Vector<Reflection> reflections; + + ClusterBuilderRD *cluster_builder = nullptr; // only used if cluster builder is supported by the renderer. + }; + + mutable RID_Owner<ReflectionAtlas> reflection_atlas_owner; + + /* REFLECTION PROBE INSTANCE */ + + struct ReflectionProbeInstance { + RID probe; + int atlas_index = -1; + RID atlas; + + bool dirty = true; + bool rendering = false; + int processing_layer = 1; + int processing_side = 0; + + uint32_t render_step = 0; + uint64_t last_pass = 0; + uint32_t cull_mask = 0; + + RendererRD::ForwardID forward_id = -1; + + Transform3D transform; + }; + + mutable RID_Owner<ReflectionProbeInstance> reflection_probe_instance_owner; + + /* REFLECTION DATA */ + + enum { + REFLECTION_AMBIENT_DISABLED = 0, + REFLECTION_AMBIENT_ENVIRONMENT = 1, + REFLECTION_AMBIENT_COLOR = 2, + }; + + struct ReflectionData { + float box_extents[3]; + float index; + float box_offset[3]; + uint32_t mask; + float ambient[3]; // ambient color, + float intensity; + uint32_t exterior; + uint32_t box_project; + uint32_t ambient_mode; + float exposure_normalization; + float local_matrix[16]; // up to here for spot and omni, rest is for directional + }; + + struct ReflectionProbeInstanceSort { + float depth; + ReflectionProbeInstance *probe_instance; + bool operator<(const ReflectionProbeInstanceSort &p_sort) const { + return depth < p_sort.depth; + } + }; + + uint32_t max_reflections; + uint32_t reflection_count = 0; + // uint32_t max_reflection_probes_per_instance = 0; // seems unused + ReflectionData *reflections = nullptr; + ReflectionProbeInstanceSort *reflection_sort = nullptr; + RID reflection_buffer; + /* LIGHTMAP */ struct Lightmap { @@ -123,12 +351,101 @@ private: mutable RID_Owner<Lightmap, true> lightmap_owner; + /* LIGHTMAP INSTANCE */ + + struct LightmapInstance { + RID lightmap; + Transform3D transform; + }; + + mutable RID_Owner<LightmapInstance> lightmap_instance_owner; + + /* SHADOW ATLAS */ + + uint64_t shadow_atlas_realloc_tolerance_msec = 500; + + struct ShadowShrinkStage { + RID texture; + RID filter_texture; + uint32_t size = 0; + }; + + struct ShadowAtlas { + struct Quadrant { + uint32_t subdivision = 0; + + struct Shadow { + RID owner; + uint64_t version = 0; + uint64_t fog_version = 0; // used for fog + uint64_t alloc_tick = 0; + + Shadow() {} + }; + + Vector<Shadow> shadows; + + Quadrant() {} + } quadrants[4]; + + int size_order[4] = { 0, 1, 2, 3 }; + uint32_t smallest_subdiv = 0; + + int size = 0; + bool use_16_bits = true; + + RID depth; + RID fb; //for copying + + HashMap<RID, uint32_t> shadow_owners; + }; + + RID_Owner<ShadowAtlas> shadow_atlas_owner; + + void _update_shadow_atlas(ShadowAtlas *shadow_atlas); + + void _shadow_atlas_invalidate_shadow(ShadowAtlas::Quadrant::Shadow *p_shadow, RID p_atlas, ShadowAtlas *p_shadow_atlas, uint32_t p_quadrant, uint32_t p_shadow_idx); + bool _shadow_atlas_find_shadow(ShadowAtlas *shadow_atlas, int *p_in_quadrants, int p_quadrant_count, int p_current_subdiv, uint64_t p_tick, int &r_quadrant, int &r_shadow); + bool _shadow_atlas_find_omni_shadows(ShadowAtlas *shadow_atlas, int *p_in_quadrants, int p_quadrant_count, int p_current_subdiv, uint64_t p_tick, int &r_quadrant, int &r_shadow); + + /* DIRECTIONAL SHADOW */ + + struct DirectionalShadow { + RID depth; + RID fb; //when renderign direct + + int light_count = 0; + int size = 0; + bool use_16_bits = true; + int current_light = 0; + } directional_shadow; + + /* SHADOW CUBEMAPS */ + + struct ShadowCubemap { + RID cubemap; + RID side_fb[6]; + }; + + HashMap<int, ShadowCubemap> shadow_cubemaps; + ShadowCubemap *_get_shadow_cubemap(int p_size); + public: static LightStorage *get_singleton(); LightStorage(); virtual ~LightStorage(); + bool free(RID p_rid); + + /* Settings */ + void set_max_cluster_elements(const uint32_t p_max_cluster_elements) { + max_cluster_elements = p_max_cluster_elements; + set_max_reflection_probes(p_max_cluster_elements); + set_max_lights(p_max_cluster_elements); + } + uint32_t get_max_cluster_elements() const { return max_cluster_elements; } + /* LIGHT */ bool owns_light(RID p_rid) { return light_owner.owns(p_rid); }; @@ -235,7 +552,7 @@ public: const Light *light = light_owner.get_or_null(p_light); ERR_FAIL_COND_V(!light, RS::LIGHT_DIRECTIONAL); - return light_owner.owns(light->projector); + return TextureStorage::get_singleton()->owns_texture(light->projector); } _FORCE_INLINE_ bool light_is_negative(RID p_light) const { @@ -258,6 +575,205 @@ public: Dependency *light_get_dependency(RID p_light) const; + /* LIGHT INSTANCE API */ + + bool owns_light_instance(RID p_rid) { return light_instance_owner.owns(p_rid); }; + + virtual RID light_instance_create(RID p_light) override; + virtual void light_instance_free(RID p_light) override; + virtual void light_instance_set_transform(RID p_light_instance, const Transform3D &p_transform) override; + virtual void light_instance_set_aabb(RID p_light_instance, const AABB &p_aabb) override; + virtual void light_instance_set_shadow_transform(RID p_light_instance, const Projection &p_projection, const Transform3D &p_transform, float p_far, float p_split, int p_pass, float p_shadow_texel_size, float p_bias_scale = 1.0, float p_range_begin = 0, const Vector2 &p_uv_scale = Vector2()) override; + virtual void light_instance_mark_visible(RID p_light_instance) override; + + _FORCE_INLINE_ RID light_instance_get_base_light(RID p_light_instance) { + LightInstance *li = light_instance_owner.get_or_null(p_light_instance); + return li->light; + } + + _FORCE_INLINE_ Transform3D light_instance_get_base_transform(RID p_light_instance) { + LightInstance *li = light_instance_owner.get_or_null(p_light_instance); + return li->transform; + } + + _FORCE_INLINE_ AABB light_instance_get_base_aabb(RID p_light_instance) { + LightInstance *li = light_instance_owner.get_or_null(p_light_instance); + return li->aabb; + } + + _FORCE_INLINE_ void light_instance_set_cull_mask(RID p_light_instance, uint32_t p_cull_mask) { + LightInstance *li = light_instance_owner.get_or_null(p_light_instance); + li->cull_mask = p_cull_mask; + } + + _FORCE_INLINE_ uint32_t light_instance_get_cull_mask(RID p_light_instance) { + LightInstance *li = light_instance_owner.get_or_null(p_light_instance); + return li->cull_mask; + } + + _FORCE_INLINE_ Rect2 light_instance_get_shadow_atlas_rect(RID p_light_instance, RID p_shadow_atlas, Vector2i &r_omni_offset) { + ShadowAtlas *shadow_atlas = shadow_atlas_owner.get_or_null(p_shadow_atlas); + LightInstance *li = light_instance_owner.get_or_null(p_light_instance); + uint32_t key = shadow_atlas->shadow_owners[li->self]; + + uint32_t quadrant = (key >> QUADRANT_SHIFT) & 0x3; + uint32_t shadow = key & SHADOW_INDEX_MASK; + + ERR_FAIL_COND_V(shadow >= (uint32_t)shadow_atlas->quadrants[quadrant].shadows.size(), Rect2()); + + uint32_t atlas_size = shadow_atlas->size; + uint32_t quadrant_size = atlas_size >> 1; + + uint32_t x = (quadrant & 1) * quadrant_size; + uint32_t y = (quadrant >> 1) * quadrant_size; + + uint32_t shadow_size = (quadrant_size / shadow_atlas->quadrants[quadrant].subdivision); + x += (shadow % shadow_atlas->quadrants[quadrant].subdivision) * shadow_size; + y += (shadow / shadow_atlas->quadrants[quadrant].subdivision) * shadow_size; + + if (key & OMNI_LIGHT_FLAG) { + if (((shadow + 1) % shadow_atlas->quadrants[quadrant].subdivision) == 0) { + r_omni_offset.x = 1 - int(shadow_atlas->quadrants[quadrant].subdivision); + r_omni_offset.y = 1; + } else { + r_omni_offset.x = 1; + r_omni_offset.y = 0; + } + } + + uint32_t width = shadow_size; + uint32_t height = shadow_size; + + return Rect2(x / float(shadow_atlas->size), y / float(shadow_atlas->size), width / float(shadow_atlas->size), height / float(shadow_atlas->size)); + } + + _FORCE_INLINE_ float light_instance_get_shadow_texel_size(RID p_light_instance, RID p_shadow_atlas) { +#ifdef DEBUG_ENABLED + LightInstance *li = light_instance_owner.get_or_null(p_light_instance); + ERR_FAIL_COND_V(!li->shadow_atlases.has(p_shadow_atlas), 0); +#endif + ShadowAtlas *shadow_atlas = shadow_atlas_owner.get_or_null(p_shadow_atlas); + ERR_FAIL_COND_V(!shadow_atlas, 0); +#ifdef DEBUG_ENABLED + ERR_FAIL_COND_V(!shadow_atlas->shadow_owners.has(p_light_instance), 0); +#endif + uint32_t key = shadow_atlas->shadow_owners[p_light_instance]; + + uint32_t quadrant = (key >> QUADRANT_SHIFT) & 0x3; + + uint32_t quadrant_size = shadow_atlas->size >> 1; + + uint32_t shadow_size = (quadrant_size / shadow_atlas->quadrants[quadrant].subdivision); + + return float(1.0) / shadow_size; + } + + _FORCE_INLINE_ Projection light_instance_get_shadow_camera(RID p_light_instance, int p_index) { + LightInstance *li = light_instance_owner.get_or_null(p_light_instance); + return li->shadow_transform[p_index].camera; + } + + _FORCE_INLINE_ Transform3D + light_instance_get_shadow_transform(RID p_light_instance, int p_index) { + LightInstance *li = light_instance_owner.get_or_null(p_light_instance); + return li->shadow_transform[p_index].transform; + } + _FORCE_INLINE_ float light_instance_get_shadow_bias_scale(RID p_light_instance, int p_index) { + LightInstance *li = light_instance_owner.get_or_null(p_light_instance); + return li->shadow_transform[p_index].bias_scale; + } + _FORCE_INLINE_ float light_instance_get_shadow_range(RID p_light_instance, int p_index) { + LightInstance *li = light_instance_owner.get_or_null(p_light_instance); + return li->shadow_transform[p_index].farplane; + } + _FORCE_INLINE_ float light_instance_get_shadow_range_begin(RID p_light_instance, int p_index) { + LightInstance *li = light_instance_owner.get_or_null(p_light_instance); + return li->shadow_transform[p_index].range_begin; + } + + _FORCE_INLINE_ Vector2 light_instance_get_shadow_uv_scale(RID p_light_instance, int p_index) { + LightInstance *li = light_instance_owner.get_or_null(p_light_instance); + return li->shadow_transform[p_index].uv_scale; + } + + _FORCE_INLINE_ void light_instance_set_directional_shadow_atlas_rect(RID p_light_instance, int p_index, const Rect2 p_atlas_rect) { + LightInstance *li = light_instance_owner.get_or_null(p_light_instance); + li->shadow_transform[p_index].atlas_rect = p_atlas_rect; + } + + _FORCE_INLINE_ Rect2 light_instance_get_directional_shadow_atlas_rect(RID p_light_instance, int p_index) { + LightInstance *li = light_instance_owner.get_or_null(p_light_instance); + return li->shadow_transform[p_index].atlas_rect; + } + + _FORCE_INLINE_ float light_instance_get_directional_shadow_split(RID p_light_instance, int p_index) { + LightInstance *li = light_instance_owner.get_or_null(p_light_instance); + return li->shadow_transform[p_index].split; + } + + _FORCE_INLINE_ float light_instance_get_directional_shadow_texel_size(RID p_light_instance, int p_index) { + LightInstance *li = light_instance_owner.get_or_null(p_light_instance); + return li->shadow_transform[p_index].shadow_texel_size; + } + + _FORCE_INLINE_ void light_instance_set_render_pass(RID p_light_instance, uint64_t p_pass) { + LightInstance *li = light_instance_owner.get_or_null(p_light_instance); + li->last_pass = p_pass; + } + + _FORCE_INLINE_ uint64_t light_instance_get_render_pass(RID p_light_instance) { + LightInstance *li = light_instance_owner.get_or_null(p_light_instance); + return li->last_pass; + } + + _FORCE_INLINE_ void light_instance_set_shadow_pass(RID p_light_instance, uint64_t p_pass) { + LightInstance *li = light_instance_owner.get_or_null(p_light_instance); + li->last_scene_shadow_pass = p_pass; + } + + _FORCE_INLINE_ uint64_t light_instance_get_shadow_pass(RID p_light_instance) { + LightInstance *li = light_instance_owner.get_or_null(p_light_instance); + return li->last_scene_shadow_pass; + } + + _FORCE_INLINE_ ForwardID light_instance_get_forward_id(RID p_light_instance) { + LightInstance *li = light_instance_owner.get_or_null(p_light_instance); + return li->forward_id; + } + + _FORCE_INLINE_ RS::LightType light_instance_get_type(RID p_light_instance) { + LightInstance *li = light_instance_owner.get_or_null(p_light_instance); + return li->light_type; + } + + _FORCE_INLINE_ void light_instance_set_directional_rect(RID p_light_instance, const Rect2 &p_directional_rect) { + LightInstance *li = light_instance_owner.get_or_null(p_light_instance); + li->directional_rect = p_directional_rect; + } + + _FORCE_INLINE_ Rect2 light_instance_get_directional_rect(RID p_light_instance) { + LightInstance *li = light_instance_owner.get_or_null(p_light_instance); + return li->directional_rect; + } + + /* LIGHT DATA */ + + void free_light_data(); + void set_max_lights(const uint32_t p_max_lights); + RID get_omni_light_buffer() { return omni_light_buffer; } + RID get_spot_light_buffer() { return spot_light_buffer; } + RID get_directional_light_buffer() { return directional_light_buffer; } + uint32_t get_max_directional_lights() { return max_directional_lights; } + bool has_directional_shadows(const uint32_t p_directional_light_count) { + for (uint32_t i = 0; i < p_directional_light_count; i++) { + if (directional_lights[i].shadow_opacity > 0.001) { + return true; + } + } + return false; + } + void update_light_buffers(RenderDataRD *p_render_data, const PagedArray<RID> &p_lights, const Transform3D &p_camera_transform, RID p_shadow_atlas, bool p_using_shadows, uint32_t &r_directional_light_count, uint32_t &r_positional_light_count, bool &r_directional_light_soft_shadows); + /* REFLECTION PROBE */ bool owns_reflection_probe(RID p_rid) { return reflection_probe_owner.owns(p_rid); }; @@ -304,6 +820,94 @@ public: Dependency *reflection_probe_get_dependency(RID p_probe) const; + /* REFLECTION ATLAS */ + + bool owns_reflection_atlas(RID p_rid) { return reflection_atlas_owner.owns(p_rid); } + + virtual RID reflection_atlas_create() override; + virtual void reflection_atlas_free(RID p_ref_atlas) override; + virtual void reflection_atlas_set_size(RID p_ref_atlas, int p_reflection_size, int p_reflection_count) override; + virtual int reflection_atlas_get_size(RID p_ref_atlas) const override; + + _FORCE_INLINE_ RID reflection_atlas_get_texture(RID p_ref_atlas) { + ReflectionAtlas *atlas = reflection_atlas_owner.get_or_null(p_ref_atlas); + ERR_FAIL_COND_V(!atlas, RID()); + return atlas->reflection; + } + + /* REFLECTION PROBE INSTANCE */ + + bool owns_reflection_probe_instance(RID p_rid) { return reflection_probe_instance_owner.owns(p_rid); } + + virtual RID reflection_probe_instance_create(RID p_probe) override; + virtual void reflection_probe_instance_free(RID p_instance) override; + virtual void reflection_probe_instance_set_transform(RID p_instance, const Transform3D &p_transform) override; + virtual void reflection_probe_release_atlas_index(RID p_instance) override; + virtual bool reflection_probe_instance_needs_redraw(RID p_instance) override; + virtual bool reflection_probe_instance_has_reflection(RID p_instance) override; + virtual bool reflection_probe_instance_begin_render(RID p_instance, RID p_reflection_atlas) override; + virtual bool reflection_probe_instance_postprocess_step(RID p_instance) override; + + uint32_t reflection_probe_instance_get_resolution(RID p_instance); + RID reflection_probe_instance_get_framebuffer(RID p_instance, int p_index); + RID reflection_probe_instance_get_depth_framebuffer(RID p_instance, int p_index); + + _FORCE_INLINE_ RID reflection_probe_instance_get_probe(RID p_instance) { + ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); + ERR_FAIL_COND_V(!rpi, RID()); + + return rpi->probe; + } + + _FORCE_INLINE_ RendererRD::ForwardID reflection_probe_instance_get_forward_id(RID p_instance) { + ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); + ERR_FAIL_COND_V(!rpi, 0); + + return rpi->forward_id; + } + + _FORCE_INLINE_ void reflection_probe_instance_set_cull_mask(RID p_instance, uint32_t p_render_pass) { + ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); + ERR_FAIL_COND(!rpi); + rpi->cull_mask = p_render_pass; + } + + _FORCE_INLINE_ void reflection_probe_instance_set_render_pass(RID p_instance, uint32_t p_render_pass) { + ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); + ERR_FAIL_COND(!rpi); + rpi->last_pass = p_render_pass; + } + + _FORCE_INLINE_ uint32_t reflection_probe_instance_get_render_pass(RID p_instance) { + ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); + ERR_FAIL_COND_V(!rpi, 0); + + return rpi->last_pass; + } + + _FORCE_INLINE_ Transform3D reflection_probe_instance_get_transform(RID p_instance) { + ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); + ERR_FAIL_COND_V(!rpi, Transform3D()); + + return rpi->transform; + } + + _FORCE_INLINE_ int reflection_probe_instance_get_atlas_index(RID p_instance) { + ReflectionProbeInstance *rpi = reflection_probe_instance_owner.get_or_null(p_instance); + ERR_FAIL_COND_V(!rpi, -1); + + return rpi->atlas_index; + } + + ClusterBuilderRD *reflection_probe_instance_get_cluster_builder(RID p_instance, ClusterBuilderSharedDataRD *p_cluster_builder_shared); + + /* REFLECTION DATA */ + + void free_reflection_data(); + void set_max_reflection_probes(const uint32_t p_max_reflection_probes); + RID get_reflection_probe_buffer() { return reflection_buffer; } + void update_reflection_probe_buffer(RenderDataRD *p_render_data, const PagedArray<RID> &p_reflections, const Transform3D &p_camera_inverse_transform, RID p_environment); + /* LIGHTMAP */ bool owns_lightmap(RID p_rid) { return lightmap_owner.owns(p_rid); }; @@ -365,6 +969,111 @@ public: ERR_FAIL_COND_V(!using_lightmap_array, lightmap_textures); //only for arrays return lightmap_textures; } + + /* LIGHTMAP INSTANCE */ + + bool owns_lightmap_instance(RID p_rid) { return lightmap_instance_owner.owns(p_rid); }; + + virtual RID lightmap_instance_create(RID p_lightmap) override; + virtual void lightmap_instance_free(RID p_lightmap) override; + virtual void lightmap_instance_set_transform(RID p_lightmap, const Transform3D &p_transform) override; + _FORCE_INLINE_ bool lightmap_instance_is_valid(RID p_lightmap_instance) { + return lightmap_instance_owner.get_or_null(p_lightmap_instance) != nullptr; + } + + _FORCE_INLINE_ RID lightmap_instance_get_lightmap(RID p_lightmap_instance) { + LightmapInstance *li = lightmap_instance_owner.get_or_null(p_lightmap_instance); + return li->lightmap; + } + _FORCE_INLINE_ Transform3D lightmap_instance_get_transform(RID p_lightmap_instance) { + LightmapInstance *li = lightmap_instance_owner.get_or_null(p_lightmap_instance); + return li->transform; + } + + /* SHADOW ATLAS API */ + + bool owns_shadow_atlas(RID p_rid) { return shadow_atlas_owner.owns(p_rid); }; + + virtual RID shadow_atlas_create() override; + virtual void shadow_atlas_free(RID p_atlas) override; + + virtual void shadow_atlas_set_size(RID p_atlas, int p_size, bool p_16_bits = true) override; + virtual void shadow_atlas_set_quadrant_subdivision(RID p_atlas, int p_quadrant, int p_subdivision) override; + virtual bool shadow_atlas_update_light(RID p_atlas, RID p_light_instance, float p_coverage, uint64_t p_light_version) override; + _FORCE_INLINE_ bool shadow_atlas_owns_light_instance(RID p_atlas, RID p_light_intance) { + ShadowAtlas *atlas = shadow_atlas_owner.get_or_null(p_atlas); + ERR_FAIL_COND_V(!atlas, false); + return atlas->shadow_owners.has(p_light_intance); + } + _FORCE_INLINE_ uint32_t shadow_atlas_get_light_instance_key(RID p_atlas, RID p_light_intance) { + ShadowAtlas *atlas = shadow_atlas_owner.get_or_null(p_atlas); + ERR_FAIL_COND_V(!atlas, -1); + return atlas->shadow_owners[p_light_intance]; + } + + _FORCE_INLINE_ RID shadow_atlas_get_texture(RID p_atlas) { + ShadowAtlas *atlas = shadow_atlas_owner.get_or_null(p_atlas); + ERR_FAIL_COND_V(!atlas, RID()); + return atlas->depth; + } + + _FORCE_INLINE_ int shadow_atlas_get_size(RID p_atlas) { + ShadowAtlas *atlas = shadow_atlas_owner.get_or_null(p_atlas); + ERR_FAIL_COND_V(!atlas, 0); + return atlas->size; + } + + _FORCE_INLINE_ int shadow_atlas_get_quadrant_shadow_size(RID p_atlas, uint32_t p_quadrant) { + ShadowAtlas *atlas = shadow_atlas_owner.get_or_null(p_atlas); + ERR_FAIL_COND_V(!atlas, 0); + ERR_FAIL_UNSIGNED_INDEX_V(p_quadrant, 4, 0); + return atlas->quadrants[p_quadrant].shadows.size(); + } + + _FORCE_INLINE_ uint32_t shadow_atlas_get_quadrant_subdivision(RID p_atlas, uint32_t p_quadrant) { + ShadowAtlas *atlas = shadow_atlas_owner.get_or_null(p_atlas); + ERR_FAIL_COND_V(!atlas, 0); + ERR_FAIL_UNSIGNED_INDEX_V(p_quadrant, 4, 0); + return atlas->quadrants[p_quadrant].subdivision; + } + + _FORCE_INLINE_ RID shadow_atlas_get_fb(RID p_atlas) { + ShadowAtlas *atlas = shadow_atlas_owner.get_or_null(p_atlas); + ERR_FAIL_COND_V(!atlas, RID()); + return atlas->fb; + } + + virtual void shadow_atlas_update(RID p_atlas) override; + + /* DIRECTIONAL SHADOW */ + + virtual void directional_shadow_atlas_set_size(int p_size, bool p_16_bits = true) override; + virtual int get_directional_light_shadow_size(RID p_light_intance) override; + virtual void set_directional_shadow_count(int p_count) override; + + Rect2i get_directional_shadow_rect(); + void update_directional_shadow_atlas(); + + _FORCE_INLINE_ RID directional_shadow_get_texture() { + return directional_shadow.depth; + } + + _FORCE_INLINE_ int directional_shadow_get_size() { + return directional_shadow.size; + } + + _FORCE_INLINE_ RID direction_shadow_get_fb() { + return directional_shadow.fb; + } + + _FORCE_INLINE_ void directional_shadow_increase_current_light() { + directional_shadow.current_light++; + } + + /* SHADOW CUBEMAPS */ + + RID get_cubemap(int p_size); + RID get_cubemap_fb(int p_size, int p_pass); }; } // namespace RendererRD diff --git a/servers/rendering/renderer_rd/storage_rd/material_storage.cpp b/servers/rendering/renderer_rd/storage_rd/material_storage.cpp index b36a028f04..36f1bc0316 100644 --- a/servers/rendering/renderer_rd/storage_rd/material_storage.cpp +++ b/servers/rendering/renderer_rd/storage_rd/material_storage.cpp @@ -1528,6 +1528,18 @@ MaterialStorage::~MaterialStorage() { singleton = nullptr; } +bool MaterialStorage::free(RID p_rid) { + if (owns_shader(p_rid)) { + shader_free(p_rid); + return true; + } else if (owns_material(p_rid)) { + material_free(p_rid); + return true; + } + + return false; +} + /* Samplers */ void MaterialStorage::sampler_rd_configure_custom(float p_mipmap_bias) { @@ -2526,7 +2538,7 @@ void MaterialStorage::_update_queued_materials() { material_update_list.remove(&material->update_element); if (uniforms_changed) { - //some implementations such as 3D renderer cache the matreial uniform set, so update is required + //some implementations such as 3D renderer cache the material uniform set, so update is required material->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MATERIAL); } } diff --git a/servers/rendering/renderer_rd/storage_rd/material_storage.h b/servers/rendering/renderer_rd/storage_rd/material_storage.h index db2e4cfa2a..d496eed17a 100644 --- a/servers/rendering/renderer_rd/storage_rd/material_storage.h +++ b/servers/rendering/renderer_rd/storage_rd/material_storage.h @@ -231,6 +231,8 @@ public: MaterialStorage(); virtual ~MaterialStorage(); + bool free(RID p_rid); + /* Helpers */ static _FORCE_INLINE_ void store_transform(const Transform3D &p_mtx, float *p_array) { @@ -311,6 +313,18 @@ public: } } + // http://andrewthall.org/papers/df64_qf128.pdf +#ifdef REAL_T_IS_DOUBLE + static _FORCE_INLINE_ void split_double(double a, float *ahi, float *alo) { + const double SPLITTER = (1 << 29) + 1; + double t = a * SPLITTER; + double thi = t - (t - a); + double tlo = a - thi; + *ahi = (float)thi; + *alo = (float)tlo; + } +#endif + /* Samplers */ _FORCE_INLINE_ RID sampler_rd_get_default(RS::CanvasItemTextureFilter p_filter, RS::CanvasItemTextureRepeat p_repeat) { diff --git a/servers/rendering/renderer_rd/storage_rd/mesh_storage.cpp b/servers/rendering/renderer_rd/storage_rd/mesh_storage.cpp index 49e3543ba5..1e74d31383 100644 --- a/servers/rendering/renderer_rd/storage_rd/mesh_storage.cpp +++ b/servers/rendering/renderer_rd/storage_rd/mesh_storage.cpp @@ -29,6 +29,7 @@ /*************************************************************************/ #include "mesh_storage.h" +#include "../../rendering_server_globals.h" using namespace RendererRD; @@ -196,6 +197,24 @@ MeshStorage::~MeshStorage() { singleton = nullptr; } +bool MeshStorage::free(RID p_rid) { + if (owns_mesh(p_rid)) { + mesh_free(p_rid); + return true; + } else if (owns_mesh_instance(p_rid)) { + mesh_instance_free(p_rid); + return true; + } else if (owns_multimesh(p_rid)) { + multimesh_free(p_rid); + return true; + } else if (owns_skeleton(p_rid)) { + skeleton_free(p_rid); + return true; + } + + return false; +} + /* MESH API */ RID MeshStorage::mesh_allocate() { @@ -1211,7 +1230,13 @@ void MeshStorage::multimesh_allocate_data(RID p_multimesh, int p_instances, RS:: if (multimesh->data_cache_dirty_regions) { memdelete_arr(multimesh->data_cache_dirty_regions); multimesh->data_cache_dirty_regions = nullptr; - multimesh->data_cache_used_dirty_regions = 0; + multimesh->data_cache_dirty_region_count = 0; + } + + if (multimesh->previous_data_cache_dirty_regions) { + memdelete_arr(multimesh->previous_data_cache_dirty_regions); + multimesh->previous_data_cache_dirty_regions = nullptr; + multimesh->previous_data_cache_dirty_region_count = 0; } multimesh->instances = p_instances; @@ -1228,14 +1253,67 @@ void MeshStorage::multimesh_allocate_data(RID p_multimesh, int p_instances, RS:: multimesh->aabb = AABB(); multimesh->aabb_dirty = false; multimesh->visible_instances = MIN(multimesh->visible_instances, multimesh->instances); + multimesh->motion_vectors_current_offset = 0; + multimesh->motion_vectors_previous_offset = 0; + multimesh->motion_vectors_last_change = -1; if (multimesh->instances) { - multimesh->buffer = RD::get_singleton()->storage_buffer_create(multimesh->instances * multimesh->stride_cache * 4); + uint32_t buffer_size = multimesh->instances * multimesh->stride_cache * sizeof(float); + if (multimesh->motion_vectors_enabled) { + buffer_size *= 2; + } + multimesh->buffer = RD::get_singleton()->storage_buffer_create(buffer_size); } multimesh->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MULTIMESH); } +bool MeshStorage::_multimesh_enable_motion_vectors(RID p_multimesh) { + MultiMesh *multimesh = multimesh_owner.get_or_null(p_multimesh); + ERR_FAIL_COND_V(!multimesh, false); + + if (multimesh->motion_vectors_enabled) { + return false; + } + + multimesh->motion_vectors_enabled = true; + + multimesh->motion_vectors_current_offset = 0; + multimesh->motion_vectors_previous_offset = 0; + multimesh->motion_vectors_last_change = -1; + + if (!multimesh->data_cache.is_empty()) { + multimesh->data_cache.append_array(multimesh->data_cache); + } + + if (multimesh->buffer_set) { + RD::get_singleton()->barrier(); + Vector<uint8_t> buffer_data = RD::get_singleton()->buffer_get_data(multimesh->buffer); + if (!multimesh->data_cache.is_empty()) { + memcpy(buffer_data.ptrw(), multimesh->data_cache.ptr(), buffer_data.size()); + } + + RD::get_singleton()->free(multimesh->buffer); + uint32_t buffer_size = multimesh->instances * multimesh->stride_cache * sizeof(float) * 2; + multimesh->buffer = RD::get_singleton()->storage_buffer_create(buffer_size); + RD::get_singleton()->buffer_update(multimesh->buffer, 0, buffer_data.size(), buffer_data.ptr(), RD::BARRIER_MASK_NO_BARRIER); + RD::get_singleton()->buffer_update(multimesh->buffer, buffer_data.size(), buffer_data.size(), buffer_data.ptr()); + multimesh->uniform_set_3d = RID(); // Cleared by dependency + return true; + } + return false; // Update the transforms uniform set cache +} + +void MeshStorage::_multimesh_get_motion_vectors_offsets(RID p_multimesh, uint32_t &r_current_offset, uint32_t &r_prev_offset) { + MultiMesh *multimesh = multimesh_owner.get_or_null(p_multimesh); + ERR_FAIL_COND(!multimesh); + r_current_offset = multimesh->motion_vectors_current_offset; + if (RSG::rasterizer->get_frame_number() - multimesh->motion_vectors_last_change >= 2) { + multimesh->motion_vectors_previous_offset = multimesh->motion_vectors_current_offset; + } + r_prev_offset = multimesh->motion_vectors_previous_offset; +} + int MeshStorage::multimesh_get_instance_count(RID p_multimesh) const { MultiMesh *multimesh = multimesh_owner.get_or_null(p_multimesh); ERR_FAIL_COND_V(!multimesh, 0); @@ -1261,7 +1339,7 @@ void MeshStorage::multimesh_set_mesh(RID p_multimesh, RID p_mesh) { //need to re-create AABB unfortunately, calling this has a penalty if (multimesh->buffer_set) { Vector<uint8_t> buffer = RD::get_singleton()->buffer_get_data(multimesh->buffer); - const uint8_t *r = buffer.ptr(); + const uint8_t *r = buffer.ptr() + multimesh->motion_vectors_current_offset * multimesh->stride_cache * sizeof(float); const float *data = reinterpret_cast<const float *>(r); _multimesh_re_create_aabb(multimesh, data, multimesh->instances); } @@ -1276,10 +1354,14 @@ void MeshStorage::_multimesh_make_local(MultiMesh *multimesh) const { if (multimesh->data_cache.size() > 0) { return; //already local } - ERR_FAIL_COND(multimesh->data_cache.size() > 0); + // this means that the user wants to load/save individual elements, // for this, the data must reside on CPU, so just copy it there. - multimesh->data_cache.resize(multimesh->instances * multimesh->stride_cache); + uint32_t buffer_size = multimesh->instances * multimesh->stride_cache; + if (multimesh->motion_vectors_enabled) { + buffer_size *= 2; + } + multimesh->data_cache.resize(buffer_size); { float *w = multimesh->data_cache.ptrw(); @@ -1290,15 +1372,48 @@ void MeshStorage::_multimesh_make_local(MultiMesh *multimesh) const { memcpy(w, r, buffer.size()); } } else { - memset(w, 0, (size_t)multimesh->instances * multimesh->stride_cache * sizeof(float)); + memset(w, 0, buffer_size * sizeof(float)); } } uint32_t data_cache_dirty_region_count = (multimesh->instances - 1) / MULTIMESH_DIRTY_REGION_SIZE + 1; multimesh->data_cache_dirty_regions = memnew_arr(bool, data_cache_dirty_region_count); - for (uint32_t i = 0; i < data_cache_dirty_region_count; i++) { - multimesh->data_cache_dirty_regions[i] = false; + memset(multimesh->data_cache_dirty_regions, 0, data_cache_dirty_region_count * sizeof(bool)); + multimesh->data_cache_dirty_region_count = 0; + + multimesh->previous_data_cache_dirty_regions = memnew_arr(bool, data_cache_dirty_region_count); + memset(multimesh->previous_data_cache_dirty_regions, 0, data_cache_dirty_region_count * sizeof(bool)); + multimesh->previous_data_cache_dirty_region_count = 0; +} + +void MeshStorage::_multimesh_update_motion_vectors_data_cache(MultiMesh *multimesh) { + ERR_FAIL_COND(multimesh->data_cache.is_empty()); + + if (!multimesh->motion_vectors_enabled) { + return; + } + + uint32_t frame = RSG::rasterizer->get_frame_number(); + if (multimesh->motion_vectors_last_change != frame) { + multimesh->motion_vectors_previous_offset = multimesh->motion_vectors_current_offset; + multimesh->motion_vectors_current_offset = multimesh->instances - multimesh->motion_vectors_current_offset; + multimesh->motion_vectors_last_change = frame; + + if (multimesh->previous_data_cache_dirty_region_count > 0) { + uint8_t *data = (uint8_t *)multimesh->data_cache.ptrw(); + uint32_t current_ofs = multimesh->motion_vectors_current_offset * multimesh->stride_cache * sizeof(float); + uint32_t previous_ofs = multimesh->motion_vectors_previous_offset * multimesh->stride_cache * sizeof(float); + uint32_t visible_instances = multimesh->visible_instances >= 0 ? multimesh->visible_instances : multimesh->instances; + uint32_t visible_region_count = visible_instances == 0 ? 0 : (visible_instances - 1) / MULTIMESH_DIRTY_REGION_SIZE + 1; + uint32_t region_size = multimesh->stride_cache * MULTIMESH_DIRTY_REGION_SIZE * sizeof(float); + uint32_t size = multimesh->stride_cache * (uint32_t)multimesh->instances * (uint32_t)sizeof(float); + for (uint32_t i = 0; i < visible_region_count; i++) { + if (multimesh->previous_data_cache_dirty_regions[i]) { + uint32_t offset = i * region_size; + memcpy(data + current_ofs + offset, data + previous_ofs + offset, MIN(region_size, size - offset)); + } + } + } } - multimesh->data_cache_used_dirty_regions = 0; } void MeshStorage::_multimesh_mark_dirty(MultiMesh *multimesh, int p_index, bool p_aabb) { @@ -1309,7 +1424,7 @@ void MeshStorage::_multimesh_mark_dirty(MultiMesh *multimesh, int p_index, bool #endif if (!multimesh->data_cache_dirty_regions[region_index]) { multimesh->data_cache_dirty_regions[region_index] = true; - multimesh->data_cache_used_dirty_regions++; + multimesh->data_cache_dirty_region_count++; } if (p_aabb) { @@ -1330,7 +1445,7 @@ void MeshStorage::_multimesh_mark_all_dirty(MultiMesh *multimesh, bool p_data, b for (uint32_t i = 0; i < data_cache_dirty_region_count; i++) { if (!multimesh->data_cache_dirty_regions[i]) { multimesh->data_cache_dirty_regions[i] = true; - multimesh->data_cache_used_dirty_regions++; + multimesh->data_cache_dirty_region_count++; } } } @@ -1395,11 +1510,12 @@ void MeshStorage::multimesh_instance_set_transform(RID p_multimesh, int p_index, ERR_FAIL_COND(multimesh->xform_format != RS::MULTIMESH_TRANSFORM_3D); _multimesh_make_local(multimesh); + _multimesh_update_motion_vectors_data_cache(multimesh); { float *w = multimesh->data_cache.ptrw(); - float *dataptr = w + p_index * multimesh->stride_cache; + float *dataptr = w + (multimesh->motion_vectors_current_offset + p_index) * multimesh->stride_cache; dataptr[0] = p_transform.basis.rows[0][0]; dataptr[1] = p_transform.basis.rows[0][1]; @@ -1425,11 +1541,12 @@ void MeshStorage::multimesh_instance_set_transform_2d(RID p_multimesh, int p_ind ERR_FAIL_COND(multimesh->xform_format != RS::MULTIMESH_TRANSFORM_2D); _multimesh_make_local(multimesh); + _multimesh_update_motion_vectors_data_cache(multimesh); { float *w = multimesh->data_cache.ptrw(); - float *dataptr = w + p_index * multimesh->stride_cache; + float *dataptr = w + (multimesh->motion_vectors_current_offset + p_index) * multimesh->stride_cache; dataptr[0] = p_transform.columns[0][0]; dataptr[1] = p_transform.columns[1][0]; @@ -1451,11 +1568,12 @@ void MeshStorage::multimesh_instance_set_color(RID p_multimesh, int p_index, con ERR_FAIL_COND(!multimesh->uses_colors); _multimesh_make_local(multimesh); + _multimesh_update_motion_vectors_data_cache(multimesh); { float *w = multimesh->data_cache.ptrw(); - float *dataptr = w + p_index * multimesh->stride_cache + multimesh->color_offset_cache; + float *dataptr = w + (multimesh->motion_vectors_current_offset + p_index) * multimesh->stride_cache + multimesh->color_offset_cache; dataptr[0] = p_color.r; dataptr[1] = p_color.g; @@ -1473,11 +1591,12 @@ void MeshStorage::multimesh_instance_set_custom_data(RID p_multimesh, int p_inde ERR_FAIL_COND(!multimesh->uses_custom_data); _multimesh_make_local(multimesh); + _multimesh_update_motion_vectors_data_cache(multimesh); { float *w = multimesh->data_cache.ptrw(); - float *dataptr = w + p_index * multimesh->stride_cache + multimesh->custom_data_offset_cache; + float *dataptr = w + (multimesh->motion_vectors_current_offset + p_index) * multimesh->stride_cache + multimesh->custom_data_offset_cache; dataptr[0] = p_color.r; dataptr[1] = p_color.g; @@ -1514,7 +1633,7 @@ Transform3D MeshStorage::multimesh_instance_get_transform(RID p_multimesh, int p { const float *r = multimesh->data_cache.ptr(); - const float *dataptr = r + p_index * multimesh->stride_cache; + const float *dataptr = r + (multimesh->motion_vectors_current_offset + p_index) * multimesh->stride_cache; t.basis.rows[0][0] = dataptr[0]; t.basis.rows[0][1] = dataptr[1]; @@ -1545,7 +1664,7 @@ Transform2D MeshStorage::multimesh_instance_get_transform_2d(RID p_multimesh, in { const float *r = multimesh->data_cache.ptr(); - const float *dataptr = r + p_index * multimesh->stride_cache; + const float *dataptr = r + (multimesh->motion_vectors_current_offset + p_index) * multimesh->stride_cache; t.columns[0][0] = dataptr[0]; t.columns[1][0] = dataptr[1]; @@ -1570,7 +1689,7 @@ Color MeshStorage::multimesh_instance_get_color(RID p_multimesh, int p_index) co { const float *r = multimesh->data_cache.ptr(); - const float *dataptr = r + p_index * multimesh->stride_cache + multimesh->color_offset_cache; + const float *dataptr = r + (multimesh->motion_vectors_current_offset + p_index) * multimesh->stride_cache + multimesh->color_offset_cache; c.r = dataptr[0]; c.g = dataptr[1]; @@ -1593,7 +1712,7 @@ Color MeshStorage::multimesh_instance_get_custom_data(RID p_multimesh, int p_ind { const float *r = multimesh->data_cache.ptr(); - const float *dataptr = r + p_index * multimesh->stride_cache + multimesh->custom_data_offset_cache; + const float *dataptr = r + (multimesh->motion_vectors_current_offset + p_index) * multimesh->stride_cache + multimesh->custom_data_offset_cache; c.r = dataptr[0]; c.g = dataptr[1]; @@ -1609,25 +1728,26 @@ void MeshStorage::multimesh_set_buffer(RID p_multimesh, const Vector<float> &p_b ERR_FAIL_COND(!multimesh); ERR_FAIL_COND(p_buffer.size() != (multimesh->instances * (int)multimesh->stride_cache)); + if (multimesh->motion_vectors_enabled) { + uint32_t frame = RSG::rasterizer->get_frame_number(); + + if (multimesh->motion_vectors_last_change != frame) { + multimesh->motion_vectors_previous_offset = multimesh->motion_vectors_current_offset; + multimesh->motion_vectors_current_offset = multimesh->instances - multimesh->motion_vectors_current_offset; + multimesh->motion_vectors_last_change = frame; + } + } + { const float *r = p_buffer.ptr(); - RD::get_singleton()->buffer_update(multimesh->buffer, 0, p_buffer.size() * sizeof(float), r); + RD::get_singleton()->buffer_update(multimesh->buffer, multimesh->motion_vectors_current_offset * multimesh->stride_cache * sizeof(float), p_buffer.size() * sizeof(float), r); multimesh->buffer_set = true; } if (multimesh->data_cache.size()) { - //if we have a data cache, just update it - multimesh->data_cache = p_buffer; - { - //clear dirty since nothing will be dirty anymore - uint32_t data_cache_dirty_region_count = (multimesh->instances - 1) / MULTIMESH_DIRTY_REGION_SIZE + 1; - for (uint32_t i = 0; i < data_cache_dirty_region_count; i++) { - multimesh->data_cache_dirty_regions[i] = false; - } - multimesh->data_cache_used_dirty_regions = 0; - } - - _multimesh_mark_all_dirty(multimesh, false, true); //update AABB + float *cache_data = multimesh->data_cache.ptrw(); + memcpy(cache_data + (multimesh->motion_vectors_current_offset * multimesh->stride_cache), p_buffer.ptr(), p_buffer.size() * sizeof(float)); + _multimesh_mark_all_dirty(multimesh, true, true); //update AABB } else if (multimesh->mesh.is_valid()) { //if we have a mesh set, we need to re-generate the AABB from the new data const float *data = p_buffer.ptr(); @@ -1642,20 +1762,19 @@ Vector<float> MeshStorage::multimesh_get_buffer(RID p_multimesh) const { ERR_FAIL_COND_V(!multimesh, Vector<float>()); if (multimesh->buffer.is_null()) { return Vector<float>(); - } else if (multimesh->data_cache.size()) { - return multimesh->data_cache; } else { - //get from memory - - Vector<uint8_t> buffer = RD::get_singleton()->buffer_get_data(multimesh->buffer); Vector<float> ret; ret.resize(multimesh->instances * multimesh->stride_cache); - { - float *w = ret.ptrw(); - const uint8_t *r = buffer.ptr(); - memcpy(w, r, buffer.size()); - } + float *w = ret.ptrw(); + if (multimesh->data_cache.size()) { + const uint8_t *r = (uint8_t *)multimesh->data_cache.ptr() + multimesh->motion_vectors_current_offset * multimesh->stride_cache * sizeof(float); + memcpy(w, r, ret.size() * sizeof(float)); + } else { + Vector<uint8_t> buffer = RD::get_singleton()->buffer_get_data(multimesh->buffer); + const uint8_t *r = buffer.ptr() + multimesh->motion_vectors_current_offset * multimesh->stride_cache * sizeof(float); + memcpy(w, r, ret.size() * sizeof(float)); + } return ret; } } @@ -1698,36 +1817,38 @@ void MeshStorage::_update_dirty_multimeshes() { MultiMesh *multimesh = multimesh_dirty_list; if (multimesh->data_cache.size()) { //may have been cleared, so only process if it exists - const float *data = multimesh->data_cache.ptr(); uint32_t visible_instances = multimesh->visible_instances >= 0 ? multimesh->visible_instances : multimesh->instances; + uint32_t buffer_offset = multimesh->motion_vectors_current_offset * multimesh->stride_cache; + const float *data = multimesh->data_cache.ptr() + buffer_offset; - if (multimesh->data_cache_used_dirty_regions) { + uint32_t total_dirty_regions = multimesh->data_cache_dirty_region_count + multimesh->previous_data_cache_dirty_region_count; + if (total_dirty_regions != 0) { uint32_t data_cache_dirty_region_count = (multimesh->instances - 1) / MULTIMESH_DIRTY_REGION_SIZE + 1; uint32_t visible_region_count = visible_instances == 0 ? 0 : (visible_instances - 1) / MULTIMESH_DIRTY_REGION_SIZE + 1; uint32_t region_size = multimesh->stride_cache * MULTIMESH_DIRTY_REGION_SIZE * sizeof(float); - - if (multimesh->data_cache_used_dirty_regions > 32 || multimesh->data_cache_used_dirty_regions > visible_region_count / 2) { + if (total_dirty_regions > 32 || total_dirty_regions > visible_region_count / 2) { //if there too many dirty regions, or represent the majority of regions, just copy all, else transfer cost piles up too much - RD::get_singleton()->buffer_update(multimesh->buffer, 0, MIN(visible_region_count * region_size, multimesh->instances * (uint32_t)multimesh->stride_cache * (uint32_t)sizeof(float)), data); + RD::get_singleton()->buffer_update(multimesh->buffer, buffer_offset * sizeof(float), MIN(visible_region_count * region_size, multimesh->instances * (uint32_t)multimesh->stride_cache * (uint32_t)sizeof(float)), data); } else { //not that many regions? update them all for (uint32_t i = 0; i < visible_region_count; i++) { - if (multimesh->data_cache_dirty_regions[i]) { + if (multimesh->data_cache_dirty_regions[i] || multimesh->previous_data_cache_dirty_regions[i]) { uint32_t offset = i * region_size; uint32_t size = multimesh->stride_cache * (uint32_t)multimesh->instances * (uint32_t)sizeof(float); uint32_t region_start_index = multimesh->stride_cache * MULTIMESH_DIRTY_REGION_SIZE * i; - RD::get_singleton()->buffer_update(multimesh->buffer, offset, MIN(region_size, size - offset), &data[region_start_index]); + RD::get_singleton()->buffer_update(multimesh->buffer, buffer_offset * sizeof(float) + offset, MIN(region_size, size - offset), &data[region_start_index], RD::BARRIER_MASK_NO_BARRIER); } } + RD::get_singleton()->barrier(RD::BARRIER_MASK_NO_BARRIER, RD::BARRIER_MASK_ALL); } - for (uint32_t i = 0; i < data_cache_dirty_region_count; i++) { - multimesh->data_cache_dirty_regions[i] = false; - } + memcpy(multimesh->previous_data_cache_dirty_regions, multimesh->data_cache_dirty_regions, data_cache_dirty_region_count * sizeof(bool)); + memset(multimesh->data_cache_dirty_regions, 0, data_cache_dirty_region_count * sizeof(bool)); - multimesh->data_cache_used_dirty_regions = 0; + multimesh->previous_data_cache_dirty_region_count = multimesh->data_cache_dirty_region_count; + multimesh->data_cache_dirty_region_count = 0; } if (multimesh->aabb_dirty) { @@ -1918,6 +2039,7 @@ Transform2D MeshStorage::skeleton_bone_get_transform_2d(RID p_skeleton, int p_bo void MeshStorage::skeleton_set_base_transform_2d(RID p_skeleton, const Transform2D &p_base_transform) { Skeleton *skeleton = skeleton_owner.get_or_null(p_skeleton); + ERR_FAIL_NULL(skeleton); ERR_FAIL_COND(!skeleton->use_2d); skeleton->base_transform_2d = p_base_transform; diff --git a/servers/rendering/renderer_rd/storage_rd/mesh_storage.h b/servers/rendering/renderer_rd/storage_rd/mesh_storage.h index 5c0d019c15..c8a33bd4d7 100644 --- a/servers/rendering/renderer_rd/storage_rd/mesh_storage.h +++ b/servers/rendering/renderer_rd/storage_rd/mesh_storage.h @@ -205,13 +205,19 @@ private: AABB aabb; bool aabb_dirty = false; bool buffer_set = false; + bool motion_vectors_enabled = false; + uint32_t motion_vectors_current_offset = 0; + uint32_t motion_vectors_previous_offset = 0; + uint64_t motion_vectors_last_change = -1; uint32_t stride_cache = 0; uint32_t color_offset_cache = 0; uint32_t custom_data_offset_cache = 0; Vector<float> data_cache; //used if individual setting is used bool *data_cache_dirty_regions = nullptr; - uint32_t data_cache_used_dirty_regions = 0; + uint32_t data_cache_dirty_region_count = 0; + bool *previous_data_cache_dirty_regions = nullptr; + uint32_t previous_data_cache_dirty_region_count = 0; RID buffer; //storage buffer RID uniform_set_3d; @@ -228,6 +234,7 @@ private: MultiMesh *multimesh_dirty_list = nullptr; _FORCE_INLINE_ void _multimesh_make_local(MultiMesh *multimesh) const; + _FORCE_INLINE_ void _multimesh_update_motion_vectors_data_cache(MultiMesh *multimesh); _FORCE_INLINE_ void _multimesh_mark_dirty(MultiMesh *multimesh, int p_index, bool p_aabb); _FORCE_INLINE_ void _multimesh_mark_all_dirty(MultiMesh *multimesh, bool p_data, bool p_aabb); _FORCE_INLINE_ void _multimesh_re_create_aabb(MultiMesh *multimesh, const float *p_data, int p_instances); @@ -301,6 +308,8 @@ public: MeshStorage(); virtual ~MeshStorage(); + bool free(RID p_rid); + RID get_default_rd_storage_buffer() const { return default_rd_storage_buffer; } /* MESH API */ @@ -579,6 +588,8 @@ public: virtual AABB multimesh_get_aabb(RID p_multimesh) const override; void _update_dirty_multimeshes(); + bool _multimesh_enable_motion_vectors(RID p_multimesh); + void _multimesh_get_motion_vectors_offsets(RID p_multimesh, uint32_t &r_current_offset, uint32_t &r_prev_offset); _FORCE_INLINE_ RS::MultimeshTransformFormat multimesh_get_transform_format(RID p_multimesh) const { MultiMesh *multimesh = multimesh_owner.get_or_null(p_multimesh); diff --git a/servers/rendering/renderer_rd/storage_rd/particles_storage.cpp b/servers/rendering/renderer_rd/storage_rd/particles_storage.cpp index 424d2d3c7a..18303ce870 100644 --- a/servers/rendering/renderer_rd/storage_rd/particles_storage.cpp +++ b/servers/rendering/renderer_rd/storage_rd/particles_storage.cpp @@ -102,7 +102,7 @@ ParticlesStorage::ParticlesStorage() { actions.render_mode_defines["disable_force"] = "#define DISABLE_FORCE\n"; actions.render_mode_defines["disable_velocity"] = "#define DISABLE_VELOCITY\n"; actions.render_mode_defines["keep_data"] = "#define ENABLE_KEEP_DATA\n"; - actions.render_mode_defines["collision_use_scale"] = "#define USE_COLLISON_SCALE\n"; + actions.render_mode_defines["collision_use_scale"] = "#define USE_COLLISION_SCALE\n"; actions.sampler_array_name = "material_samplers"; actions.base_texture_binding_index = 1; @@ -208,6 +208,21 @@ ParticlesStorage::~ParticlesStorage() { singleton = nullptr; } +bool ParticlesStorage::free(RID p_rid) { + if (owns_particles(p_rid)) { + particles_free(p_rid); + return true; + } else if (owns_particles_collision(p_rid)) { + particles_collision_free(p_rid); + return true; + } else if (owns_particles_collision_instance(p_rid)) { + particles_collision_instance_free(p_rid); + return true; + } + + return false; +} + /* PARTICLES */ RID ParticlesStorage::particles_allocate() { @@ -1874,8 +1889,6 @@ AABB ParticlesStorage::particles_collision_get_aabb(RID p_particles_collision) c return aabb; } } - - return AABB(); } Vector3 ParticlesStorage::particles_collision_get_extents(RID p_particles_collision) const { diff --git a/servers/rendering/renderer_rd/storage_rd/particles_storage.h b/servers/rendering/renderer_rd/storage_rd/particles_storage.h index af29f5022b..017844626f 100644 --- a/servers/rendering/renderer_rd/storage_rd/particles_storage.h +++ b/servers/rendering/renderer_rd/storage_rd/particles_storage.h @@ -405,6 +405,8 @@ public: ParticlesStorage(); virtual ~ParticlesStorage(); + bool free(RID p_rid); + /* PARTICLES */ bool owns_particles(RID p_rid) { return particles_owner.owns(p_rid); } diff --git a/servers/rendering/renderer_rd/storage_rd/render_scene_buffers_rd.cpp b/servers/rendering/renderer_rd/storage_rd/render_scene_buffers_rd.cpp index 576ec81124..1b2237b505 100644 --- a/servers/rendering/renderer_rd/storage_rd/render_scene_buffers_rd.cpp +++ b/servers/rendering/renderer_rd/storage_rd/render_scene_buffers_rd.cpp @@ -40,11 +40,6 @@ RenderSceneBuffersRD::~RenderSceneBuffersRD() { cleanup(); data_buffers.clear(); - - // need to investigate if we can remove these things. - if (cluster_builder) { - memdelete(cluster_builder); - } } void RenderSceneBuffersRD::_bind_methods() { @@ -121,16 +116,6 @@ void RenderSceneBuffersRD::cleanup() { RD::get_singleton()->free(luminance.current); luminance.current = RID(); } - - if (ss_effects.linear_depth.is_valid()) { - RD::get_singleton()->free(ss_effects.linear_depth); - ss_effects.linear_depth = RID(); - ss_effects.linear_depth_slices.clear(); - } - - sse->ssao_free(ss_effects.ssao); - sse->ssil_free(ss_effects.ssil); - sse->ssr_free(ssr); } void RenderSceneBuffersRD::configure(RID p_render_target, const Size2i p_internal_size, const Size2i p_target_size, float p_fsr_sharpness, float p_texture_mipmap_bias, RS::ViewportMSAA p_msaa_3d, RenderingServer::ViewportScreenSpaceAA p_screen_space_aa, bool p_use_taa, bool p_use_debanding, uint32_t p_view_count) { @@ -174,14 +159,6 @@ void RenderSceneBuffersRD::configure(RID p_render_target, const Size2i p_interna use_debanding = p_use_debanding; view_count = p_view_count; - /* may move this into our clustered renderer data object */ - if (can_be_storage) { - if (cluster_builder == nullptr) { - cluster_builder = memnew(ClusterBuilderRD); - } - cluster_builder->set_shared(RendererSceneRenderRD::get_singleton()->get_cluster_builder_shared()); - } - // cleanout any old buffers we had. cleanup(); @@ -228,11 +205,6 @@ void RenderSceneBuffersRD::configure(RID p_render_target, const Size2i p_interna for (KeyValue<StringName, Ref<RenderBufferCustomDataRD>> &E : data_buffers) { E.value->configure(this); } - - if (cluster_builder) { - RID sampler = RendererRD::MaterialStorage::get_singleton()->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED); - cluster_builder->setup(internal_size, max_cluster_elements, get_depth_texture(), sampler, get_internal_texture()); - } } void RenderSceneBuffersRD::set_fsr_sharpness(float p_fsr_sharpness) { @@ -535,7 +507,9 @@ void RenderSceneBuffersRD::ensure_velocity() { RD::TEXTURE_SAMPLES_8, }; - create_texture(RB_SCOPE_BUFFERS, RB_TEX_VELOCITY_MSAA, RD::DATA_FORMAT_R16G16_SFLOAT, msaa_usage_bits, ts[msaa_3d]); + RD::TextureSamples texture_samples = ts[msaa_3d]; + + create_texture(RB_SCOPE_BUFFERS, RB_TEX_VELOCITY_MSAA, RD::DATA_FORMAT_R16G16_SFLOAT, msaa_usage_bits, texture_samples); } create_texture(RB_SCOPE_BUFFERS, RB_TEX_VELOCITY, RD::DATA_FORMAT_R16G16_SFLOAT, usage_bits); diff --git a/servers/rendering/renderer_rd/storage_rd/render_scene_buffers_rd.h b/servers/rendering/renderer_rd/storage_rd/render_scene_buffers_rd.h index adaf075f80..169ee2e2b1 100644 --- a/servers/rendering/renderer_rd/storage_rd/render_scene_buffers_rd.h +++ b/servers/rendering/renderer_rd/storage_rd/render_scene_buffers_rd.h @@ -31,19 +31,14 @@ #ifndef RENDER_SCENE_BUFFERS_RD_H #define RENDER_SCENE_BUFFERS_RD_H +#include "../effects/vrs.h" +#include "../framebuffer_cache_rd.h" #include "core/templates/hash_map.h" -#include "servers/rendering/renderer_rd/effects/vrs.h" -#include "servers/rendering/renderer_rd/framebuffer_cache_rd.h" -#include "servers/rendering/renderer_rd/storage_rd/render_buffer_custom_data_rd.h" -#include "servers/rendering/renderer_scene.h" +#include "render_buffer_custom_data_rd.h" #include "servers/rendering/rendering_device.h" +#include "servers/rendering/rendering_method.h" #include "servers/rendering/storage/render_scene_buffers.h" -// These can be retired in due time -#include "servers/rendering/renderer_rd/cluster_builder_rd.h" -#include "servers/rendering/renderer_rd/effects/ss_effects.h" -#include "servers/rendering/renderer_rd/environment/fog.h" - #define RB_SCOPE_BUFFERS SNAME("render_buffers") #define RB_SCOPE_VRS SNAME("VRS") @@ -68,7 +63,6 @@ private: bool can_be_storage = true; uint32_t max_cluster_elements = 512; RD::DataFormat base_data_format = RD::DATA_FORMAT_R16G16B16A16_SFLOAT; - RendererRD::SSEffects *sse = nullptr; RendererRD::VRS *vrs = nullptr; uint64_t auto_exposure_version = 1; @@ -139,9 +133,9 @@ public: // info from our renderer void set_can_be_storage(const bool p_can_be_storage) { can_be_storage = p_can_be_storage; } void set_max_cluster_elements(const uint32_t p_max_elements) { max_cluster_elements = p_max_elements; } + uint32_t get_max_cluster_elements() { return max_cluster_elements; } void set_base_data_format(const RD::DataFormat p_base_data_format) { base_data_format = p_base_data_format; } RD::DataFormat get_base_data_format() const { return base_data_format; } - void set_sseffects(RendererRD::SSEffects *p_ss_effects) { sse = p_ss_effects; } void set_vrs(RendererRD::VRS *p_vrs) { vrs = p_vrs; } void cleanup(); @@ -215,8 +209,6 @@ public: //////////////////////////////////////////////////////////////////////////////////////////////////////////// // Everything after this needs to be re-evaluated, this is all old implementation - ClusterBuilderRD *cluster_builder = nullptr; - struct WeightBuffers { RID weight; RID fb; // FB with both texture and weight writing into one level lower @@ -233,24 +225,6 @@ public: Vector<RID> fb; RID current_fb; } luminance; - - struct SSEffects { - RID linear_depth; - Vector<RID> linear_depth_slices; - - RID downsample_uniform_set; - - Projection last_frame_projection; - Transform3D last_frame_transform; - - RendererRD::SSEffects::SSAORenderBuffers ssao; - RendererRD::SSEffects::SSILRenderBuffers ssil; - } ss_effects; - - RendererRD::SSEffects::SSRRenderBuffers ssr; - - RID get_ao_texture() const { return ss_effects.ssao.ao_final; } - RID get_ssil_texture() const { return ss_effects.ssil.ssil_final; } }; #endif // RENDER_SCENE_BUFFERS_RD_H diff --git a/servers/rendering/renderer_rd/storage_rd/render_scene_data_rd.cpp b/servers/rendering/renderer_rd/storage_rd/render_scene_data_rd.cpp new file mode 100644 index 0000000000..7dd790d1da --- /dev/null +++ b/servers/rendering/renderer_rd/storage_rd/render_scene_data_rd.cpp @@ -0,0 +1,252 @@ +/*************************************************************************/ +/* render_scene_data_rd.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* 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 "render_scene_data_rd.h" +#include "servers/rendering/renderer_rd/renderer_scene_render_rd.h" +#include "servers/rendering/renderer_rd/storage_rd/light_storage.h" +#include "servers/rendering/renderer_rd/storage_rd/texture_storage.h" +#include "servers/rendering/rendering_server_default.h" + +RID RenderSceneDataRD::create_uniform_buffer() { + return RD::get_singleton()->uniform_buffer_create(sizeof(UBODATA)); +} + +void RenderSceneDataRD::update_ubo(RID p_uniform_buffer, RS::ViewportDebugDraw p_debug_mode, RID p_env, RID p_reflection_probe_instance, RID p_camera_attributes, bool p_flip_y, bool p_pancake_shadows, const Size2i &p_screen_size, const Color &p_default_bg_color, float p_luminance_multiplier, bool p_opaque_render_buffers) { + RendererSceneRenderRD *render_scene_render = RendererSceneRenderRD::get_singleton(); + + UBODATA ubo_data; + memset(&ubo_data, 0, sizeof(UBODATA)); + + // just for easy access.. + UBO &ubo = ubo_data.ubo; + UBO &prev_ubo = ubo_data.prev_ubo; + + Projection correction; + correction.set_depth_correction(p_flip_y); + correction.add_jitter_offset(taa_jitter); + Projection projection = correction * cam_projection; + + //store camera into ubo + RendererRD::MaterialStorage::store_camera(projection, ubo.projection_matrix); + RendererRD::MaterialStorage::store_camera(projection.inverse(), ubo.inv_projection_matrix); + RendererRD::MaterialStorage::store_transform(cam_transform, ubo.inv_view_matrix); + RendererRD::MaterialStorage::store_transform(cam_transform.affine_inverse(), ubo.view_matrix); + +#ifdef REAL_T_IS_DOUBLE + RendererRD::MaterialStorage::split_double(-cam_transform.origin.x, &ubo.inv_view_matrix[12], &ubo.inv_view_matrix[3]); + RendererRD::MaterialStorage::split_double(-cam_transform.origin.y, &ubo.inv_view_matrix[13], &ubo.inv_view_matrix[7]); + RendererRD::MaterialStorage::split_double(-cam_transform.origin.z, &ubo.inv_view_matrix[14], &ubo.inv_view_matrix[11]); +#endif + + for (uint32_t v = 0; v < view_count; v++) { + projection = correction * view_projection[v]; + RendererRD::MaterialStorage::store_camera(projection, ubo.projection_matrix_view[v]); + RendererRD::MaterialStorage::store_camera(projection.inverse(), ubo.inv_projection_matrix_view[v]); + + ubo.eye_offset[v][0] = view_eye_offset[v].x; + ubo.eye_offset[v][1] = view_eye_offset[v].y; + ubo.eye_offset[v][2] = view_eye_offset[v].z; + ubo.eye_offset[v][3] = 0.0; + } + + ubo.taa_jitter[0] = taa_jitter.x; + ubo.taa_jitter[1] = taa_jitter.y; + + ubo.z_far = z_far; + ubo.z_near = z_near; + + ubo.pancake_shadows = p_pancake_shadows; + + RendererRD::MaterialStorage::store_soft_shadow_kernel(render_scene_render->directional_penumbra_shadow_kernel_get(), ubo.directional_penumbra_shadow_kernel); + RendererRD::MaterialStorage::store_soft_shadow_kernel(render_scene_render->directional_soft_shadow_kernel_get(), ubo.directional_soft_shadow_kernel); + RendererRD::MaterialStorage::store_soft_shadow_kernel(render_scene_render->penumbra_shadow_kernel_get(), ubo.penumbra_shadow_kernel); + RendererRD::MaterialStorage::store_soft_shadow_kernel(render_scene_render->soft_shadow_kernel_get(), ubo.soft_shadow_kernel); + + ubo.viewport_size[0] = p_screen_size.x; + ubo.viewport_size[1] = p_screen_size.y; + + Size2 screen_pixel_size = Vector2(1.0, 1.0) / Size2(p_screen_size); + ubo.screen_pixel_size[0] = screen_pixel_size.x; + ubo.screen_pixel_size[1] = screen_pixel_size.y; + + ubo.shadow_atlas_pixel_size[0] = shadow_atlas_pixel_size.x; + ubo.shadow_atlas_pixel_size[1] = shadow_atlas_pixel_size.y; + + ubo.directional_shadow_pixel_size[0] = directional_shadow_pixel_size.x; + ubo.directional_shadow_pixel_size[1] = directional_shadow_pixel_size.y; + + ubo.time = time; + + ubo.directional_light_count = directional_light_count; + ubo.dual_paraboloid_side = dual_paraboloid_side; + ubo.opaque_prepass_threshold = opaque_prepass_threshold; + ubo.material_uv2_mode = material_uv2_mode; + + ubo.fog_enabled = false; + + if (p_debug_mode == RS::VIEWPORT_DEBUG_DRAW_UNSHADED) { + ubo.use_ambient_light = true; + ubo.ambient_light_color_energy[0] = 1; + ubo.ambient_light_color_energy[1] = 1; + ubo.ambient_light_color_energy[2] = 1; + ubo.ambient_light_color_energy[3] = 1.0; + ubo.use_ambient_cubemap = false; + ubo.use_reflection_cubemap = false; + } else if (p_env.is_valid()) { + RS::EnvironmentBG env_bg = render_scene_render->environment_get_background(p_env); + RS::EnvironmentAmbientSource ambient_src = render_scene_render->environment_get_ambient_source(p_env); + + float bg_energy_multiplier = render_scene_render->environment_get_bg_energy_multiplier(p_env); + + ubo.ambient_light_color_energy[3] = bg_energy_multiplier; + + ubo.ambient_color_sky_mix = render_scene_render->environment_get_ambient_sky_contribution(p_env); + + //ambient + if (ambient_src == RS::ENV_AMBIENT_SOURCE_BG && (env_bg == RS::ENV_BG_CLEAR_COLOR || env_bg == RS::ENV_BG_COLOR)) { + Color color = env_bg == RS::ENV_BG_CLEAR_COLOR ? p_default_bg_color : render_scene_render->environment_get_bg_color(p_env); + color = color.srgb_to_linear(); + + ubo.ambient_light_color_energy[0] = color.r * bg_energy_multiplier; + ubo.ambient_light_color_energy[1] = color.g * bg_energy_multiplier; + ubo.ambient_light_color_energy[2] = color.b * bg_energy_multiplier; + ubo.use_ambient_light = true; + ubo.use_ambient_cubemap = false; + } else { + float energy = render_scene_render->environment_get_ambient_light_energy(p_env); + Color color = render_scene_render->environment_get_ambient_light(p_env); + color = color.srgb_to_linear(); + ubo.ambient_light_color_energy[0] = color.r * energy; + ubo.ambient_light_color_energy[1] = color.g * energy; + ubo.ambient_light_color_energy[2] = color.b * energy; + + Basis sky_transform = render_scene_render->environment_get_sky_orientation(p_env); + sky_transform = sky_transform.inverse() * cam_transform.basis; + RendererRD::MaterialStorage::store_transform_3x3(sky_transform, ubo.radiance_inverse_xform); + + ubo.use_ambient_cubemap = (ambient_src == RS::ENV_AMBIENT_SOURCE_BG && env_bg == RS::ENV_BG_SKY) || ambient_src == RS::ENV_AMBIENT_SOURCE_SKY; + ubo.use_ambient_light = ubo.use_ambient_cubemap || ambient_src == RS::ENV_AMBIENT_SOURCE_COLOR; + } + + //specular + RS::EnvironmentReflectionSource ref_src = render_scene_render->environment_get_reflection_source(p_env); + if ((ref_src == RS::ENV_REFLECTION_SOURCE_BG && env_bg == RS::ENV_BG_SKY) || ref_src == RS::ENV_REFLECTION_SOURCE_SKY) { + ubo.use_reflection_cubemap = true; + } else { + ubo.use_reflection_cubemap = false; + } + + ubo.fog_enabled = render_scene_render->environment_get_fog_enabled(p_env); + ubo.fog_density = render_scene_render->environment_get_fog_density(p_env); + ubo.fog_height = render_scene_render->environment_get_fog_height(p_env); + ubo.fog_height_density = render_scene_render->environment_get_fog_height_density(p_env); + ubo.fog_aerial_perspective = render_scene_render->environment_get_fog_aerial_perspective(p_env); + + Color fog_color = render_scene_render->environment_get_fog_light_color(p_env).srgb_to_linear(); + float fog_energy = render_scene_render->environment_get_fog_light_energy(p_env); + + ubo.fog_light_color[0] = fog_color.r * fog_energy; + ubo.fog_light_color[1] = fog_color.g * fog_energy; + ubo.fog_light_color[2] = fog_color.b * fog_energy; + + ubo.fog_sun_scatter = render_scene_render->environment_get_fog_sun_scatter(p_env); + } else { + if (p_reflection_probe_instance.is_valid() && RendererRD::LightStorage::get_singleton()->reflection_probe_is_interior(p_reflection_probe_instance)) { + ubo.use_ambient_light = false; + } else { + ubo.use_ambient_light = true; + Color clear_color = p_default_bg_color; + clear_color = clear_color.srgb_to_linear(); + ubo.ambient_light_color_energy[0] = clear_color.r; + ubo.ambient_light_color_energy[1] = clear_color.g; + ubo.ambient_light_color_energy[2] = clear_color.b; + ubo.ambient_light_color_energy[3] = 1.0; + } + + ubo.use_ambient_cubemap = false; + ubo.use_reflection_cubemap = false; + } + + if (p_camera_attributes.is_valid()) { + ubo.emissive_exposure_normalization = RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor(p_camera_attributes); + ubo.IBL_exposure_normalization = 1.0; + if (p_env.is_valid()) { + RID sky_rid = render_scene_render->environment_get_sky(p_env); + if (sky_rid.is_valid()) { + float current_exposure = RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor(p_camera_attributes) * render_scene_render->environment_get_bg_intensity(p_env) / p_luminance_multiplier; + ubo.IBL_exposure_normalization = current_exposure / MAX(0.001, render_scene_render->get_sky()->sky_get_baked_exposure(sky_rid)); + } + } + } else if (emissive_exposure_normalization > 0.0) { + // This branch is triggered when using render_material(). + // Emissive is set outside the function. + ubo.emissive_exposure_normalization = emissive_exposure_normalization; + // IBL isn't used don't set it. + } else { + ubo.emissive_exposure_normalization = 1.0; + ubo.IBL_exposure_normalization = 1.0; + } + + ubo.roughness_limiter_enabled = p_opaque_render_buffers && render_scene_render->screen_space_roughness_limiter_is_active(); + ubo.roughness_limiter_amount = render_scene_render->screen_space_roughness_limiter_get_amount(); + ubo.roughness_limiter_limit = render_scene_render->screen_space_roughness_limiter_get_limit(); + + if (calculate_motion_vectors) { + // Q : Should we make a complete copy or should we define a separate UBO with just the components we need? + memcpy(&prev_ubo, &ubo, sizeof(UBO)); + + Projection prev_correction; + prev_correction.set_depth_correction(true); + prev_correction.add_jitter_offset(prev_taa_jitter); + Projection prev_projection = prev_correction * prev_cam_projection; + + //store camera into ubo + RendererRD::MaterialStorage::store_camera(prev_projection, prev_ubo.projection_matrix); + RendererRD::MaterialStorage::store_camera(prev_projection.inverse(), prev_ubo.inv_projection_matrix); + RendererRD::MaterialStorage::store_transform(prev_cam_transform, prev_ubo.inv_view_matrix); + RendererRD::MaterialStorage::store_transform(prev_cam_transform.affine_inverse(), prev_ubo.view_matrix); + + for (uint32_t v = 0; v < view_count; v++) { + prev_projection = prev_correction * view_projection[v]; + RendererRD::MaterialStorage::store_camera(prev_projection, prev_ubo.projection_matrix_view[v]); + RendererRD::MaterialStorage::store_camera(prev_projection.inverse(), prev_ubo.inv_projection_matrix_view[v]); + } + prev_ubo.taa_jitter[0] = prev_taa_jitter.x; + prev_ubo.taa_jitter[1] = prev_taa_jitter.y; + prev_ubo.time -= time_step; + } + + uniform_buffer = p_uniform_buffer; + RD::get_singleton()->buffer_update(uniform_buffer, 0, sizeof(UBODATA), &ubo, RD::BARRIER_MASK_RASTER); +} + +RID RenderSceneDataRD::get_uniform_buffer() { + return uniform_buffer; +} diff --git a/servers/rendering/renderer_rd/storage_rd/render_scene_data_rd.h b/servers/rendering/renderer_rd/storage_rd/render_scene_data_rd.h new file mode 100644 index 0000000000..c2dc7d5f4c --- /dev/null +++ b/servers/rendering/renderer_rd/storage_rd/render_scene_data_rd.h @@ -0,0 +1,157 @@ +/*************************************************************************/ +/* render_scene_data_rd.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* 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 RENDER_SCENE_DATA_RD_H +#define RENDER_SCENE_DATA_RD_H + +#include "render_scene_buffers_rd.h" +#include "servers/rendering/renderer_scene_render.h" +#include "servers/rendering/rendering_device.h" + +// This is a container for data related to rendering a single frame of a viewport where we load this data into a UBO +// that can be used by the main scene shader but also by various effects. + +class RenderSceneDataRD { +public: + bool calculate_motion_vectors = false; + + Transform3D cam_transform; + Projection cam_projection; + Vector2 taa_jitter; + bool cam_orthogonal = false; + + // For stereo rendering + uint32_t view_count = 1; + Vector3 view_eye_offset[RendererSceneRender::MAX_RENDER_VIEWS]; + Projection view_projection[RendererSceneRender::MAX_RENDER_VIEWS]; + + Transform3D prev_cam_transform; + Projection prev_cam_projection; + Vector2 prev_taa_jitter; + Projection prev_view_projection[RendererSceneRender::MAX_RENDER_VIEWS]; + + float z_near = 0.0; + float z_far = 0.0; + + float lod_distance_multiplier = 0.0; + Plane lod_camera_plane; + float screen_mesh_lod_threshold = 0.0; + + uint32_t directional_light_count = 0; + float dual_paraboloid_side = 0.0; + float opaque_prepass_threshold = 0.0; + bool material_uv2_mode = false; + float emissive_exposure_normalization = 0.0; + + Size2 shadow_atlas_pixel_size; + Size2 directional_shadow_pixel_size; + + float time; + float time_step; + + RID create_uniform_buffer(); + void update_ubo(RID p_uniform_buffer, RS::ViewportDebugDraw p_debug_mode, RID p_env, RID p_reflection_probe_instance, RID p_camera_attributes, bool p_flip_y, bool p_pancake_shadows, const Size2i &p_screen_size, const Color &p_default_bg_color, float p_luminance_multiplier, bool p_opaque_render_buffers); + RID get_uniform_buffer(); + +private: + RID uniform_buffer; // loaded into this uniform buffer (supplied externally) + + // This struct is loaded into Set 1 - Binding 0, populated at start of rendering a frame, must match with shader code + struct UBO { + float projection_matrix[16]; + float inv_projection_matrix[16]; + float inv_view_matrix[16]; + float view_matrix[16]; + + float projection_matrix_view[RendererSceneRender::MAX_RENDER_VIEWS][16]; + float inv_projection_matrix_view[RendererSceneRender::MAX_RENDER_VIEWS][16]; + float eye_offset[RendererSceneRender::MAX_RENDER_VIEWS][4]; + + float viewport_size[2]; + float screen_pixel_size[2]; + + float directional_penumbra_shadow_kernel[128]; //32 vec4s + float directional_soft_shadow_kernel[128]; + float penumbra_shadow_kernel[128]; + float soft_shadow_kernel[128]; + + float radiance_inverse_xform[12]; + + float ambient_light_color_energy[4]; + + float ambient_color_sky_mix; + uint32_t use_ambient_light; + uint32_t use_ambient_cubemap; + uint32_t use_reflection_cubemap; + + float shadow_atlas_pixel_size[2]; + float directional_shadow_pixel_size[2]; + + uint32_t directional_light_count; + float dual_paraboloid_side; + float z_far; + float z_near; + + uint32_t roughness_limiter_enabled; + float roughness_limiter_amount; + float roughness_limiter_limit; + float opaque_prepass_threshold; + + // Fog + uint32_t fog_enabled; + float fog_density; + float fog_height; + float fog_height_density; + + float fog_light_color[3]; + float fog_sun_scatter; + + float fog_aerial_perspective; + float time; + float reflection_multiplier; + uint32_t material_uv2_mode; + + float taa_jitter[2]; + float emissive_exposure_normalization; // Needed to normalize emissive when using physical units. + float IBL_exposure_normalization; // Adjusts for baked exposure. + + uint32_t pancake_shadows; + uint32_t pad1; + uint32_t pad2; + uint32_t pad3; + }; + + struct UBODATA { + UBO ubo; + UBO prev_ubo; + }; +}; + +#endif // RENDER_SCENE_DATA_RD_H diff --git a/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp b/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp index b87b4d4a0f..14e41a0d6b 100644 --- a/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp +++ b/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp @@ -31,6 +31,7 @@ #include "texture_storage.h" #include "../effects/copy_effects.h" #include "material_storage.h" +#include "servers/rendering/renderer_rd/renderer_scene_render_rd.h" using namespace RendererRD; @@ -457,6 +458,8 @@ TextureStorage::TextureStorage() { TextureStorage::~TextureStorage() { rt_sdf.shader.version_free(rt_sdf.shader_version); + free_decal_data(); + if (decal_atlas.textures.size()) { ERR_PRINT("Decal Atlas: " + itos(decal_atlas.textures.size()) + " textures were not removed from the atlas."); } @@ -475,6 +478,27 @@ TextureStorage::~TextureStorage() { singleton = nullptr; } +bool TextureStorage::free(RID p_rid) { + if (owns_texture(p_rid)) { + texture_free(p_rid); + return true; + } else if (owns_canvas_texture(p_rid)) { + canvas_texture_free(p_rid); + return true; + } else if (owns_decal(p_rid)) { + decal_free(p_rid); + return true; + } else if (owns_decal_instance(p_rid)) { + decal_instance_free(p_rid); + return true; + } else if (owns_render_target(p_rid)) { + render_target_free(p_rid); + return true; + } + + return false; +} + bool TextureStorage::can_create_resources_async() const { return true; } @@ -673,6 +697,8 @@ void TextureStorage::texture_free(RID p_texture) { } void TextureStorage::texture_2d_initialize(RID p_texture, const Ref<Image> &p_image) { + ERR_FAIL_COND(p_image.is_null()); + TextureToRDFormat ret_format; Ref<Image> image = _validate_texture_format(p_image, ret_format); @@ -795,6 +821,8 @@ void TextureStorage::texture_2d_layered_initialize(RID p_texture, const Vector<R case RS::TEXTURE_LAYERED_CUBEMAP_ARRAY: { texture.rd_type = RD::TEXTURE_TYPE_CUBE_ARRAY; } break; + default: + ERR_FAIL(); // Shouldn't happen, silence warnings. } texture.rd_format = ret_format.format; @@ -1884,7 +1912,7 @@ Dependency *TextureStorage::decal_get_dependency(RID p_decal) { } void TextureStorage::update_decal_atlas() { - RendererRD::CopyEffects *copy_effects = RendererRD::CopyEffects::get_singleton(); + CopyEffects *copy_effects = CopyEffects::get_singleton(); ERR_FAIL_NULL(copy_effects); if (!decal_atlas.dirty) { @@ -2108,6 +2136,227 @@ void TextureStorage::texture_remove_from_decal_atlas(RID p_texture, bool p_panor } } +/* DECAL INSTANCE API */ + +RID TextureStorage::decal_instance_create(RID p_decal) { + DecalInstance di; + di.decal = p_decal; + di.forward_id = ForwardIDStorage::get_singleton()->allocate_forward_id(FORWARD_ID_TYPE_DECAL); + return decal_instance_owner.make_rid(di); +} + +void TextureStorage::decal_instance_free(RID p_decal_instance) { + DecalInstance *di = decal_instance_owner.get_or_null(p_decal_instance); + ForwardIDStorage::get_singleton()->free_forward_id(FORWARD_ID_TYPE_DECAL, di->forward_id); + decal_instance_owner.free(p_decal_instance); +} + +void TextureStorage::decal_instance_set_transform(RID p_decal_instance, const Transform3D &p_transform) { + DecalInstance *di = decal_instance_owner.get_or_null(p_decal_instance); + ERR_FAIL_COND(!di); + di->transform = p_transform; +} + +/* DECAL DATA API */ + +void TextureStorage::free_decal_data() { + if (decal_buffer.is_valid()) { + RD::get_singleton()->free(decal_buffer); + decal_buffer = RID(); + } + + if (decals != nullptr) { + memdelete_arr(decals); + decals = nullptr; + } + + if (decal_sort != nullptr) { + memdelete_arr(decal_sort); + decal_sort = nullptr; + } +} + +void TextureStorage::set_max_decals(const uint32_t p_max_decals) { + max_decals = p_max_decals; + uint32_t decal_buffer_size = max_decals * sizeof(DecalData); + decals = memnew_arr(DecalData, max_decals); + decal_sort = memnew_arr(DecalInstanceSort, max_decals); + decal_buffer = RD::get_singleton()->storage_buffer_create(decal_buffer_size); +} + +void TextureStorage::update_decal_buffer(const PagedArray<RID> &p_decals, const Transform3D &p_camera_inverse_xform) { + ForwardIDStorage *forward_id_storage = ForwardIDStorage::get_singleton(); + + Transform3D uv_xform; + uv_xform.basis.scale(Vector3(2.0, 1.0, 2.0)); + uv_xform.origin = Vector3(-1.0, 0.0, -1.0); + + uint32_t decals_size = p_decals.size(); + + decal_count = 0; + + for (uint32_t i = 0; i < decals_size; i++) { + if (decal_count == max_decals) { + break; + } + + DecalInstance *decal_instance = decal_instance_owner.get_or_null(p_decals[i]); + if (!decal_instance) { + continue; + } + Decal *decal = decal_owner.get_or_null(decal_instance->decal); + + Transform3D xform = decal_instance->transform; + + real_t distance = -p_camera_inverse_xform.xform(xform.origin).z; + + if (decal->distance_fade) { + float fade_begin = decal->distance_fade_begin; + float fade_length = decal->distance_fade_length; + + if (distance > fade_begin) { + if (distance > fade_begin + fade_length) { + continue; // do not use this decal, its invisible + } + } + } + + decal_sort[decal_count].decal_instance = decal_instance; + decal_sort[decal_count].decal = decal; + decal_sort[decal_count].depth = distance; + decal_count++; + } + + if (decal_count > 0) { + SortArray<DecalInstanceSort> sort_array; + sort_array.sort(decal_sort, decal_count); + } + + bool using_forward_ids = forward_id_storage->uses_forward_ids(); + for (uint32_t i = 0; i < decal_count; i++) { + DecalInstance *decal_instance = decal_sort[i].decal_instance; + Decal *decal = decal_sort[i].decal; + + if (using_forward_ids) { + forward_id_storage->map_forward_id(FORWARD_ID_TYPE_DECAL, decal_instance->forward_id, i); + } + + decal_instance->cull_mask = decal->cull_mask; + + Transform3D xform = decal_instance->transform; + float fade = 1.0; + + if (decal->distance_fade) { + const real_t distance = -p_camera_inverse_xform.xform(xform.origin).z; + const float fade_begin = decal->distance_fade_begin; + const float fade_length = decal->distance_fade_length; + + if (distance > fade_begin) { + // Use `smoothstep()` to make opacity changes more gradual and less noticeable to the player. + fade = Math::smoothstep(0.0f, 1.0f, 1.0f - float(distance - fade_begin) / fade_length); + } + } + + DecalData &dd = decals[i]; + + Vector3 decal_extents = decal->extents; + + Transform3D scale_xform; + scale_xform.basis.scale(decal_extents); + Transform3D to_decal_xform = (p_camera_inverse_xform * xform * scale_xform * uv_xform).affine_inverse(); + MaterialStorage::store_transform(to_decal_xform, dd.xform); + + Vector3 normal = xform.basis.get_column(Vector3::AXIS_Y).normalized(); + normal = p_camera_inverse_xform.basis.xform(normal); //camera is normalized, so fine + + dd.normal[0] = normal.x; + dd.normal[1] = normal.y; + dd.normal[2] = normal.z; + dd.normal_fade = decal->normal_fade; + + RID albedo_tex = decal->textures[RS::DECAL_TEXTURE_ALBEDO]; + RID emission_tex = decal->textures[RS::DECAL_TEXTURE_EMISSION]; + if (albedo_tex.is_valid()) { + Rect2 rect = decal_atlas_get_texture_rect(albedo_tex); + dd.albedo_rect[0] = rect.position.x; + dd.albedo_rect[1] = rect.position.y; + dd.albedo_rect[2] = rect.size.x; + dd.albedo_rect[3] = rect.size.y; + } else { + if (!emission_tex.is_valid()) { + continue; //no albedo, no emission, no decal. + } + dd.albedo_rect[0] = 0; + dd.albedo_rect[1] = 0; + dd.albedo_rect[2] = 0; + dd.albedo_rect[3] = 0; + } + + RID normal_tex = decal->textures[RS::DECAL_TEXTURE_NORMAL]; + + if (normal_tex.is_valid()) { + Rect2 rect = decal_atlas_get_texture_rect(normal_tex); + dd.normal_rect[0] = rect.position.x; + dd.normal_rect[1] = rect.position.y; + dd.normal_rect[2] = rect.size.x; + dd.normal_rect[3] = rect.size.y; + + Basis normal_xform = p_camera_inverse_xform.basis * xform.basis.orthonormalized(); + MaterialStorage::store_basis_3x4(normal_xform, dd.normal_xform); + } else { + dd.normal_rect[0] = 0; + dd.normal_rect[1] = 0; + dd.normal_rect[2] = 0; + dd.normal_rect[3] = 0; + } + + RID orm_tex = decal->textures[RS::DECAL_TEXTURE_ORM]; + if (orm_tex.is_valid()) { + Rect2 rect = decal_atlas_get_texture_rect(orm_tex); + dd.orm_rect[0] = rect.position.x; + dd.orm_rect[1] = rect.position.y; + dd.orm_rect[2] = rect.size.x; + dd.orm_rect[3] = rect.size.y; + } else { + dd.orm_rect[0] = 0; + dd.orm_rect[1] = 0; + dd.orm_rect[2] = 0; + dd.orm_rect[3] = 0; + } + + if (emission_tex.is_valid()) { + Rect2 rect = decal_atlas_get_texture_rect(emission_tex); + dd.emission_rect[0] = rect.position.x; + dd.emission_rect[1] = rect.position.y; + dd.emission_rect[2] = rect.size.x; + dd.emission_rect[3] = rect.size.y; + } else { + dd.emission_rect[0] = 0; + dd.emission_rect[1] = 0; + dd.emission_rect[2] = 0; + dd.emission_rect[3] = 0; + } + + Color modulate = decal->modulate; + dd.modulate[0] = modulate.r; + dd.modulate[1] = modulate.g; + dd.modulate[2] = modulate.b; + dd.modulate[3] = modulate.a * fade; + dd.emission_energy = decal->emission_energy * fade; + dd.albedo_mix = decal->albedo_mix; + dd.mask = decal->cull_mask; + dd.upper_fade = decal->upper_fade; + dd.lower_fade = decal->lower_fade; + + // hook for subclass to do further processing. + RendererSceneRenderRD::get_singleton()->setup_added_decal(xform, decal_extents); + } + + if (decal_count > 0) { + RD::get_singleton()->buffer_update(decal_buffer, 0, sizeof(DecalData) * decal_count, decals, RD::BARRIER_MASK_RASTER | RD::BARRIER_MASK_COMPUTE); + } +} + /* RENDER TARGET API */ void TextureStorage::_clear_render_target(RenderTarget *rt) { diff --git a/servers/rendering/renderer_rd/storage_rd/texture_storage.h b/servers/rendering/renderer_rd/storage_rd/texture_storage.h index a3acad30f3..327a21a1fc 100644 --- a/servers/rendering/renderer_rd/storage_rd/texture_storage.h +++ b/servers/rendering/renderer_rd/storage_rd/texture_storage.h @@ -31,8 +31,12 @@ #ifndef TEXTURE_STORAGE_RD_H #define TEXTURE_STORAGE_RD_H +#include "core/templates/local_vector.h" +#include "core/templates/paged_array.h" #include "core/templates/rid_owner.h" #include "servers/rendering/renderer_rd/shaders/canvas_sdf.glsl.gen.h" +#include "servers/rendering/renderer_rd/storage_rd/forward_id_storage.h" +#include "servers/rendering/rendering_server_default.h" #include "servers/rendering/storage/texture_storage.h" #include "servers/rendering/storage/utilities.h" @@ -245,7 +249,52 @@ private: }; mutable RID_Owner<Decal, true> decal_owner; - Decal *get_decal(RID p_rid) const { return decal_owner.get_or_null(p_rid); }; + + /* DECAL INSTANCE */ + + struct DecalInstance { + RID decal; + Transform3D transform; + uint32_t cull_mask = 0; + RendererRD::ForwardID forward_id = -1; + }; + + mutable RID_Owner<DecalInstance> decal_instance_owner; + + /* DECAL DATA (UBO) */ + + struct DecalData { + float xform[16]; + float inv_extents[3]; + float albedo_mix; + float albedo_rect[4]; + float normal_rect[4]; + float orm_rect[4]; + float emission_rect[4]; + float modulate[4]; + float emission_energy; + uint32_t mask; + float upper_fade; + float lower_fade; + float normal_xform[12]; + float normal[3]; + float normal_fade; + }; + + struct DecalInstanceSort { + float depth; + DecalInstance *decal_instance; + Decal *decal; + bool operator<(const DecalInstanceSort &p_sort) const { + return depth < p_sort.depth; + } + }; + + uint32_t max_decals = 0; + uint32_t decal_count = 0; + DecalData *decals = nullptr; + DecalInstanceSort *decal_sort = nullptr; + RID decal_buffer; /* RENDER TARGET API */ @@ -343,6 +392,8 @@ public: TextureStorage(); virtual ~TextureStorage(); + bool free(RID p_rid); + /* Canvas Texture API */ bool owns_canvas_texture(RID p_rid) { return canvas_texture_owner.owns(p_rid); }; @@ -545,6 +596,46 @@ public: virtual AABB decal_get_aabb(RID p_decal) const override; Dependency *decal_get_dependency(RID p_decal); + /* DECAL INSTANCE API */ + + bool owns_decal_instance(RID p_rid) const { return decal_instance_owner.owns(p_rid); } + + virtual RID decal_instance_create(RID p_decal) override; + virtual void decal_instance_free(RID p_decal_instance) override; + virtual void decal_instance_set_transform(RID p_decal_instance, const Transform3D &p_transform) override; + + _FORCE_INLINE_ RID decal_instance_get_base(RID p_decal_instance) const { + DecalInstance *di = decal_instance_owner.get_or_null(p_decal_instance); + return di->decal; + } + + _FORCE_INLINE_ RendererRD::ForwardID decal_instance_get_forward_id(RID p_decal_instance) const { + DecalInstance *di = decal_instance_owner.get_or_null(p_decal_instance); + return di->forward_id; + } + + _FORCE_INLINE_ Transform3D decal_instance_get_transform(RID p_decal_instance) const { + DecalInstance *di = decal_instance_owner.get_or_null(p_decal_instance); + return di->transform; + } + + _FORCE_INLINE_ ForwardID decal_instance_get_forward_id(RID p_decal_instance) { + DecalInstance *di = decal_instance_owner.get_or_null(p_decal_instance); + return di->forward_id; + } + + _FORCE_INLINE_ void decal_instance_set_cullmask(RID p_decal_instance, uint32_t p_cull_mask) const { + DecalInstance *di = decal_instance_owner.get_or_null(p_decal_instance); + di->cull_mask = p_cull_mask; + } + + /* DECAL DATA API */ + + void free_decal_data(); + void set_max_decals(const uint32_t p_max_decals); + RID get_decal_buffer() { return decal_buffer; } + void update_decal_buffer(const PagedArray<RID> &p_decals, const Transform3D &p_camera_inverse_xform); + /* RENDER TARGET API */ bool owns_render_target(RID p_rid) const { return render_target_owner.owns(p_rid); }; diff --git a/servers/rendering/renderer_rd/storage_rd/utilities.cpp b/servers/rendering/renderer_rd/storage_rd/utilities.cpp index b80bcd514f..e517186955 100644 --- a/servers/rendering/renderer_rd/storage_rd/utilities.cpp +++ b/servers/rendering/renderer_rd/storage_rd/utilities.cpp @@ -89,49 +89,28 @@ RS::InstanceType Utilities::get_base_type(RID p_rid) const { } bool Utilities::free(RID p_rid) { - if (RendererRD::TextureStorage::get_singleton()->owns_texture(p_rid)) { - RendererRD::TextureStorage::get_singleton()->texture_free(p_rid); - } else if (RendererRD::TextureStorage::get_singleton()->owns_canvas_texture(p_rid)) { - RendererRD::TextureStorage::get_singleton()->canvas_texture_free(p_rid); - } else if (RendererRD::MaterialStorage::get_singleton()->owns_shader(p_rid)) { - RendererRD::MaterialStorage::get_singleton()->shader_free(p_rid); - } else if (RendererRD::MaterialStorage::get_singleton()->owns_material(p_rid)) { - RendererRD::MaterialStorage::get_singleton()->material_free(p_rid); - } else if (RendererRD::MeshStorage::get_singleton()->owns_mesh(p_rid)) { - RendererRD::MeshStorage::get_singleton()->mesh_free(p_rid); - } else if (RendererRD::MeshStorage::get_singleton()->owns_mesh_instance(p_rid)) { - RendererRD::MeshStorage::get_singleton()->mesh_instance_free(p_rid); - } else if (RendererRD::MeshStorage::get_singleton()->owns_multimesh(p_rid)) { - RendererRD::MeshStorage::get_singleton()->multimesh_free(p_rid); - } else if (RendererRD::MeshStorage::get_singleton()->owns_skeleton(p_rid)) { - RendererRD::MeshStorage::get_singleton()->skeleton_free(p_rid); - } else if (RendererRD::LightStorage::get_singleton()->owns_reflection_probe(p_rid)) { - RendererRD::LightStorage::get_singleton()->reflection_probe_free(p_rid); - } else if (RendererRD::TextureStorage::get_singleton()->owns_decal(p_rid)) { - RendererRD::TextureStorage::get_singleton()->decal_free(p_rid); + if (RendererRD::LightStorage::get_singleton()->free(p_rid)) { + return true; + } else if (RendererRD::MaterialStorage::get_singleton()->free(p_rid)) { + return true; + } else if (RendererRD::MeshStorage::get_singleton()->free(p_rid)) { + return true; + } else if (RendererRD::ParticlesStorage::get_singleton()->free(p_rid)) { + return true; + } else if (RendererRD::TextureStorage::get_singleton()->free(p_rid)) { + return true; } else if (RendererRD::GI::get_singleton()->owns_voxel_gi(p_rid)) { RendererRD::GI::get_singleton()->voxel_gi_free(p_rid); - } else if (RendererRD::LightStorage::get_singleton()->owns_lightmap(p_rid)) { - RendererRD::LightStorage::get_singleton()->lightmap_free(p_rid); - } else if (RendererRD::LightStorage::get_singleton()->owns_light(p_rid)) { - RendererRD::LightStorage::get_singleton()->light_free(p_rid); - } else if (RendererRD::ParticlesStorage::get_singleton()->owns_particles(p_rid)) { - RendererRD::ParticlesStorage::get_singleton()->particles_free(p_rid); - } else if (RendererRD::ParticlesStorage::get_singleton()->owns_particles_collision(p_rid)) { - RendererRD::ParticlesStorage::get_singleton()->particles_collision_free(p_rid); + return true; + } else if (RendererRD::Fog::get_singleton()->owns_fog_volume(p_rid)) { + RendererRD::Fog::get_singleton()->fog_volume_free(p_rid); + return true; } else if (owns_visibility_notifier(p_rid)) { visibility_notifier_free(p_rid); - } else if (RendererRD::ParticlesStorage::get_singleton()->owns_particles_collision_instance(p_rid)) { - RendererRD::ParticlesStorage::get_singleton()->particles_collision_instance_free(p_rid); - } else if (RendererRD::Fog::get_singleton()->owns_fog_volume(p_rid)) { - RendererRD::Fog::get_singleton()->fog_free(p_rid); - } else if (RendererRD::TextureStorage::get_singleton()->owns_render_target(p_rid)) { - RendererRD::TextureStorage::get_singleton()->render_target_free(p_rid); + return true; } else { return false; } - - return true; } /* DEPENDENCIES */ @@ -170,8 +149,8 @@ void Utilities::base_update_dependency(RID p_base, DependencyTracker *p_instance Dependency *dependency = ParticlesStorage::get_singleton()->particles_collision_get_dependency(p_base); p_instance->update_dependency(dependency); } else if (Fog::get_singleton()->owns_fog_volume(p_base)) { - Fog::FogVolume *fv = Fog::get_singleton()->get_fog_volume(p_base); - p_instance->update_dependency(&fv->dependency); + Dependency *dependency = Fog::get_singleton()->fog_volume_get_dependency(p_base); + p_instance->update_dependency(dependency); } else if (owns_visibility_notifier(p_base)) { VisibilityNotifier *vn = get_visibility_notifier(p_base); p_instance->update_dependency(&vn->dependency); diff --git a/servers/rendering/renderer_scene_cull.cpp b/servers/rendering/renderer_scene_cull.cpp index 04dedc0646..66a64d4372 100644 --- a/servers/rendering/renderer_scene_cull.cpp +++ b/servers/rendering/renderer_scene_cull.cpp @@ -357,13 +357,14 @@ void RendererSceneCull::scenario_initialize(RID p_rid) { Scenario *scenario = scenario_owner.get_or_null(p_rid); scenario->self = p_rid; - scenario->reflection_probe_shadow_atlas = scene_render->shadow_atlas_create(); - scene_render->shadow_atlas_set_size(scenario->reflection_probe_shadow_atlas, 1024); //make enough shadows for close distance, don't bother with rest - scene_render->shadow_atlas_set_quadrant_subdivision(scenario->reflection_probe_shadow_atlas, 0, 4); - scene_render->shadow_atlas_set_quadrant_subdivision(scenario->reflection_probe_shadow_atlas, 1, 4); - scene_render->shadow_atlas_set_quadrant_subdivision(scenario->reflection_probe_shadow_atlas, 2, 4); - scene_render->shadow_atlas_set_quadrant_subdivision(scenario->reflection_probe_shadow_atlas, 3, 8); - scenario->reflection_atlas = scene_render->reflection_atlas_create(); + scenario->reflection_probe_shadow_atlas = RSG::light_storage->shadow_atlas_create(); + RSG::light_storage->shadow_atlas_set_size(scenario->reflection_probe_shadow_atlas, 1024); //make enough shadows for close distance, don't bother with rest + RSG::light_storage->shadow_atlas_set_quadrant_subdivision(scenario->reflection_probe_shadow_atlas, 0, 4); + RSG::light_storage->shadow_atlas_set_quadrant_subdivision(scenario->reflection_probe_shadow_atlas, 1, 4); + RSG::light_storage->shadow_atlas_set_quadrant_subdivision(scenario->reflection_probe_shadow_atlas, 2, 4); + RSG::light_storage->shadow_atlas_set_quadrant_subdivision(scenario->reflection_probe_shadow_atlas, 3, 8); + + scenario->reflection_atlas = RSG::light_storage->reflection_atlas_create(); scenario->instance_aabbs.set_page_pool(&instance_aabb_page_pool); scenario->instance_data.set_page_pool(&instance_data_page_pool); @@ -393,7 +394,7 @@ void RendererSceneCull::scenario_set_fallback_environment(RID p_scenario, RID p_ void RendererSceneCull::scenario_set_reflection_atlas_size(RID p_scenario, int p_reflection_size, int p_reflection_count) { Scenario *scenario = scenario_owner.get_or_null(p_scenario); ERR_FAIL_COND(!scenario); - scene_render->reflection_atlas_set_size(scenario->reflection_atlas, p_reflection_size, p_reflection_count); + RSG::light_storage->reflection_atlas_set_size(scenario->reflection_atlas, p_reflection_size, p_reflection_count); } bool RendererSceneCull::is_scenario(RID p_scenario) const { @@ -534,7 +535,7 @@ void RendererSceneCull::instance_set_base(RID p_instance, RID p_base) { scenario->directional_lights.erase(light->D); light->D = nullptr; } - scene_render->free(light->instance); + RSG::light_storage->light_instance_free(light->instance); } break; case RS::INSTANCE_PARTICLES_COLLISION: { InstanceParticlesCollisionData *collision = static_cast<InstanceParticlesCollisionData *>(instance->base_data); @@ -549,14 +550,14 @@ void RendererSceneCull::instance_set_base(RID p_instance, RID p_base) { } break; case RS::INSTANCE_REFLECTION_PROBE: { InstanceReflectionProbeData *reflection_probe = static_cast<InstanceReflectionProbeData *>(instance->base_data); - scene_render->free(reflection_probe->instance); + RSG::light_storage->reflection_probe_instance_free(reflection_probe->instance); if (reflection_probe->update_list.in_list()) { reflection_probe_render_list.remove(&reflection_probe->update_list); } } break; case RS::INSTANCE_DECAL: { InstanceDecalData *decal = static_cast<InstanceDecalData *>(instance->base_data); - scene_render->free(decal->instance); + RSG::texture_storage->decal_instance_free(decal->instance); } break; case RS::INSTANCE_LIGHTMAP: { @@ -565,7 +566,7 @@ void RendererSceneCull::instance_set_base(RID p_instance, RID p_base) { while (lightmap_data->users.begin()) { instance_geometry_set_lightmap((*lightmap_data->users.begin())->self, RID(), Rect2(), 0); } - scene_render->free(lightmap_data->instance); + RSG::light_storage->lightmap_instance_free(lightmap_data->instance); } break; case RS::INSTANCE_VOXEL_GI: { InstanceVoxelGIData *voxel_gi = static_cast<InstanceVoxelGIData *>(instance->base_data); @@ -626,7 +627,7 @@ void RendererSceneCull::instance_set_base(RID p_instance, RID p_base) { light->D = scenario->directional_lights.push_back(instance); } - light->instance = scene_render->light_instance_create(p_base); + light->instance = RSG::light_storage->light_instance_create(p_base); instance->base_data = light; } break; @@ -684,19 +685,19 @@ void RendererSceneCull::instance_set_base(RID p_instance, RID p_base) { reflection_probe->owner = instance; instance->base_data = reflection_probe; - reflection_probe->instance = scene_render->reflection_probe_instance_create(p_base); + reflection_probe->instance = RSG::light_storage->reflection_probe_instance_create(p_base); } break; case RS::INSTANCE_DECAL: { InstanceDecalData *decal = memnew(InstanceDecalData); decal->owner = instance; instance->base_data = decal; - decal->instance = scene_render->decal_instance_create(p_base); + decal->instance = RSG::texture_storage->decal_instance_create(p_base); } break; case RS::INSTANCE_LIGHTMAP: { InstanceLightmapData *lightmap_data = memnew(InstanceLightmapData); instance->base_data = lightmap_data; - lightmap_data->instance = scene_render->lightmap_instance_create(p_base); + lightmap_data->instance = RSG::light_storage->lightmap_instance_create(p_base); } break; case RS::INSTANCE_VOXEL_GI: { InstanceVoxelGIData *voxel_gi = memnew(InstanceVoxelGIData); @@ -758,7 +759,7 @@ void RendererSceneCull::instance_set_scenario(RID p_instance, RID p_scenario) { } break; case RS::INSTANCE_REFLECTION_PROBE: { InstanceReflectionProbeData *reflection_probe = static_cast<InstanceReflectionProbeData *>(instance->base_data); - scene_render->reflection_probe_release_atlas_index(reflection_probe->instance); + RSG::light_storage->reflection_probe_release_atlas_index(reflection_probe->instance); } break; case RS::INSTANCE_PARTICLES_COLLISION: { @@ -1502,8 +1503,8 @@ void RendererSceneCull::_update_instance(Instance *p_instance) { if (p_instance->base_type == RS::INSTANCE_LIGHT) { InstanceLightData *light = static_cast<InstanceLightData *>(p_instance->base_data); - scene_render->light_instance_set_transform(light->instance, p_instance->transform); - scene_render->light_instance_set_aabb(light->instance, p_instance->transform.xform(p_instance->aabb)); + RSG::light_storage->light_instance_set_transform(light->instance, p_instance->transform); + RSG::light_storage->light_instance_set_aabb(light->instance, p_instance->transform.xform(p_instance->aabb)); light->shadow_dirty = true; RS::LightBakeMode bake_mode = RSG::light_storage->light_get_bake_mode(p_instance->base); @@ -1526,7 +1527,7 @@ void RendererSceneCull::_update_instance(Instance *p_instance) { } else if (p_instance->base_type == RS::INSTANCE_REFLECTION_PROBE) { InstanceReflectionProbeData *reflection_probe = static_cast<InstanceReflectionProbeData *>(p_instance->base_data); - scene_render->reflection_probe_instance_set_transform(reflection_probe->instance, p_instance->transform); + RSG::light_storage->reflection_probe_instance_set_transform(reflection_probe->instance, p_instance->transform); if (p_instance->scenario && p_instance->array_index >= 0) { InstanceData &idata = p_instance->scenario->instance_data[p_instance->array_index]; @@ -1535,11 +1536,11 @@ void RendererSceneCull::_update_instance(Instance *p_instance) { } else if (p_instance->base_type == RS::INSTANCE_DECAL) { InstanceDecalData *decal = static_cast<InstanceDecalData *>(p_instance->base_data); - scene_render->decal_instance_set_transform(decal->instance, p_instance->transform); + RSG::texture_storage->decal_instance_set_transform(decal->instance, p_instance->transform); } else if (p_instance->base_type == RS::INSTANCE_LIGHTMAP) { InstanceLightmapData *lightmap = static_cast<InstanceLightmapData *>(p_instance->base_data); - scene_render->lightmap_instance_set_transform(lightmap->instance, p_instance->transform); + RSG::light_storage->lightmap_instance_set_transform(lightmap->instance, p_instance->transform); } else if (p_instance->base_type == RS::INSTANCE_VOXEL_GI) { InstanceVoxelGIData *voxel_gi = static_cast<InstanceVoxelGIData *>(p_instance->base_data); @@ -2050,7 +2051,7 @@ void RendererSceneCull::_light_instance_setup_directional_shadow(int p_shadow_in distances[splits] = max_distance; - real_t texture_size = scene_render->get_directional_light_shadow_size(light->instance); + real_t texture_size = RSG::light_storage->get_directional_light_shadow_size(light->instance); bool overlap = RSG::light_storage->light_directional_get_blend_splits(p_instance->base); @@ -2241,7 +2242,7 @@ bool RendererSceneCull::_light_instance_update_shadow(Instance *p_instance, cons case RS::LIGHT_OMNI: { RS::LightOmniShadowMode shadow_mode = RSG::light_storage->light_omni_get_shadow_mode(p_instance->base); - if (shadow_mode == RS::LIGHT_OMNI_SHADOW_DUAL_PARABOLOID || !scene_render->light_instances_can_render_shadow_cube()) { + if (shadow_mode == RS::LIGHT_OMNI_SHADOW_DUAL_PARABOLOID || !RSG::light_storage->light_instances_can_render_shadow_cube()) { if (max_shadows_used + 2 > MAX_UPDATE_SHADOWS) { return true; } @@ -2300,7 +2301,7 @@ bool RendererSceneCull::_light_instance_update_shadow(Instance *p_instance, cons RSG::mesh_storage->update_mesh_instances(); - scene_render->light_instance_set_shadow_transform(light->instance, Projection(), light_transform, radius, 0, i, 0); + RSG::light_storage->light_instance_set_shadow_transform(light->instance, Projection(), light_transform, radius, 0, i, 0); shadow_data.light = light->instance; shadow_data.pass = i; } @@ -2376,14 +2377,14 @@ bool RendererSceneCull::_light_instance_update_shadow(Instance *p_instance, cons } RSG::mesh_storage->update_mesh_instances(); - scene_render->light_instance_set_shadow_transform(light->instance, cm, xform, radius, 0, i, 0); + RSG::light_storage->light_instance_set_shadow_transform(light->instance, cm, xform, radius, 0, i, 0); shadow_data.light = light->instance; shadow_data.pass = i; } //restore the regular DP matrix - //scene_render->light_instance_set_shadow_transform(light->instance, Projection(), light_transform, radius, 0, 0, 0); + //RSG::light_storage->light_instance_set_shadow_transform(light->instance, Projection(), light_transform, radius, 0, 0, 0); } } break; @@ -2440,7 +2441,7 @@ bool RendererSceneCull::_light_instance_update_shadow(Instance *p_instance, cons RSG::mesh_storage->update_mesh_instances(); - scene_render->light_instance_set_shadow_transform(light->instance, cm, light_transform, radius, 0, 0, 0); + RSG::light_storage->light_instance_set_shadow_transform(light->instance, cm, light_transform, radius, 0, 0, 0); shadow_data.light = light->instance; shadow_data.pass = 0; @@ -2680,14 +2681,14 @@ void RendererSceneCull::_scene_cull(CullData &cull_data, InstanceCullResult &cul cull_result.lights.push_back(idata.instance); cull_result.light_instances.push_back(RID::from_uint64(idata.instance_data_rid)); if (cull_data.shadow_atlas.is_valid() && RSG::light_storage->light_has_shadow(idata.base_rid)) { - scene_render->light_instance_mark_visible(RID::from_uint64(idata.instance_data_rid)); //mark it visible for shadow allocation later + RSG::light_storage->light_instance_mark_visible(RID::from_uint64(idata.instance_data_rid)); //mark it visible for shadow allocation later } } else if (base_type == RS::INSTANCE_REFLECTION_PROBE) { if (cull_data.render_reflection_probe != idata.instance) { //avoid entering The Matrix - if ((idata.flags & InstanceData::FLAG_REFLECTION_PROBE_DIRTY) || scene_render->reflection_probe_instance_needs_redraw(RID::from_uint64(idata.instance_data_rid))) { + if ((idata.flags & InstanceData::FLAG_REFLECTION_PROBE_DIRTY) || RSG::light_storage->reflection_probe_instance_needs_redraw(RID::from_uint64(idata.instance_data_rid))) { InstanceReflectionProbeData *reflection_probe = static_cast<InstanceReflectionProbeData *>(idata.instance->base_data); cull_data.cull->lock.lock(); if (!reflection_probe->update_list.in_list()) { @@ -2699,7 +2700,7 @@ void RendererSceneCull::_scene_cull(CullData &cull_data, InstanceCullResult &cul idata.flags &= ~uint32_t(InstanceData::FLAG_REFLECTION_PROBE_DIRTY); } - if (scene_render->reflection_probe_instance_has_reflection(RID::from_uint64(idata.instance_data_rid))) { + if (RSG::light_storage->reflection_probe_instance_has_reflection(RID::from_uint64(idata.instance_data_rid))) { cull_result.reflections.push_back(RID::from_uint64(idata.instance_data_rid)); } } @@ -2910,7 +2911,7 @@ void RendererSceneCull::_scene_cull(CullData &cull_data, InstanceCullResult &cul } } -void RendererSceneCull::_render_scene(const RendererSceneRender::CameraData *p_camera_data, const Ref<RenderSceneBuffers> &p_render_buffers, RID p_environment, RID p_force_camera_attributes, uint32_t p_visible_layers, RID p_scenario, RID p_viewport, RID p_shadow_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, bool p_using_shadows, RendererScene::RenderInfo *r_render_info) { +void RendererSceneCull::_render_scene(const RendererSceneRender::CameraData *p_camera_data, const Ref<RenderSceneBuffers> &p_render_buffers, RID p_environment, RID p_force_camera_attributes, uint32_t p_visible_layers, RID p_scenario, RID p_viewport, RID p_shadow_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, bool p_using_shadows, RenderingMethod::RenderInfo *r_render_info) { Instance *render_reflection_probe = instance_owner.get_or_null(p_reflection_probe); //if null, not rendering to it Scenario *scenario = scenario_owner.get_or_null(p_scenario); @@ -2991,7 +2992,7 @@ void RendererSceneCull::_render_scene(const RendererSceneRender::CameraData *p_c } } - scene_render->set_directional_shadow_count(lights_with_shadow.size()); + RSG::light_storage->set_directional_shadow_count(lights_with_shadow.size()); for (int i = 0; i < lights_with_shadow.size(); i++) { _light_instance_setup_directional_shadow(i, lights_with_shadow[i], p_camera_data->main_transform, p_camera_data->main_projection, p_camera_data->is_orthogonal, p_camera_data->vaspect); @@ -3091,7 +3092,7 @@ void RendererSceneCull::_render_scene(const RendererSceneRender::CameraData *p_c for (uint32_t j = 0; j < cull.shadows[i].cascade_count; j++) { const Cull::Shadow::Cascade &c = cull.shadows[i].cascades[j]; // print_line("shadow " + itos(i) + " cascade " + itos(j) + " elements: " + itos(c.cull_result.size())); - scene_render->light_instance_set_shadow_transform(cull.shadows[i].light_instance, c.projection, c.transform, c.zfar, c.split, j, c.shadow_texel_size, c.bias_scale, c.range_begin, c.uv_scale); + RSG::light_storage->light_instance_set_shadow_transform(cull.shadows[i].light_instance, c.projection, c.transform, c.zfar, c.split, j, c.shadow_texel_size, c.bias_scale, c.range_begin, c.uv_scale); if (max_shadows_used == MAX_UPDATE_SHADOWS) { continue; } @@ -3187,7 +3188,7 @@ void RendererSceneCull::_render_scene(const RendererSceneRender::CameraData *p_c light->shadow_dirty = false; } - bool redraw = scene_render->shadow_atlas_update_light(p_shadow_atlas, light->instance, coverage, light->last_version); + bool redraw = RSG::light_storage->shadow_atlas_update_light(p_shadow_atlas, light->instance, coverage, light->last_version); if (redraw && max_shadows_used < MAX_UPDATE_SHADOWS) { //must redraw! @@ -3320,7 +3321,7 @@ bool RendererSceneCull::_render_reflection_probe_step(Instance *p_instance, int RenderingServerDefault::redraw_request(); //update, so it updates in editor if (p_step == 0) { - if (!scene_render->reflection_probe_instance_begin_render(reflection_probe->instance, scenario->reflection_atlas)) { + if (!RSG::light_storage->reflection_probe_instance_begin_render(reflection_probe->instance, scenario->reflection_atlas)) { return true; //all full } } @@ -3346,7 +3347,7 @@ bool RendererSceneCull::_render_reflection_probe_step(Instance *p_instance, int Vector3 extents = RSG::light_storage->reflection_probe_get_extents(p_instance->base); Vector3 origin_offset = RSG::light_storage->reflection_probe_get_origin_offset(p_instance->base); float max_distance = RSG::light_storage->reflection_probe_get_origin_max_distance(p_instance->base); - float size = scene_render->reflection_atlas_get_size(scenario->reflection_atlas); + float size = RSG::light_storage->reflection_atlas_get_size(scenario->reflection_atlas); float mesh_lod_threshold = RSG::light_storage->reflection_probe_get_mesh_lod_threshold(p_instance->base) / size; Vector3 edge = view_normals[p_step] * extents; @@ -3387,7 +3388,7 @@ bool RendererSceneCull::_render_reflection_probe_step(Instance *p_instance, int } else { //do roughness postprocess step until it believes it's done RENDER_TIMESTAMP("Post-Process ReflectionProbe, Step " + itos(p_step)); - return scene_render->reflection_probe_instance_postprocess_step(reflection_probe->instance); + return RSG::light_storage->reflection_probe_instance_postprocess_step(reflection_probe->instance); } return false; @@ -3967,8 +3968,8 @@ bool RendererSceneCull::free(RID p_rid) { scenario->instance_data.reset(); scenario->instance_visibility.reset(); - scene_render->free(scenario->reflection_probe_shadow_atlas); - scene_render->free(scenario->reflection_atlas); + RSG::light_storage->shadow_atlas_free(scenario->reflection_probe_shadow_atlas); + RSG::light_storage->reflection_atlas_free(scenario->reflection_atlas); scenario_owner.free(p_rid); RendererSceneOcclusionCull::get_singleton()->remove_scenario(p_rid); diff --git a/servers/rendering/renderer_scene_cull.h b/servers/rendering/renderer_scene_cull.h index c799553f87..d085b84a8c 100644 --- a/servers/rendering/renderer_scene_cull.h +++ b/servers/rendering/renderer_scene_cull.h @@ -39,13 +39,13 @@ #include "core/templates/pass_func.h" #include "core/templates/rid_owner.h" #include "core/templates/self_list.h" -#include "servers/rendering/renderer_scene.h" #include "servers/rendering/renderer_scene_occlusion_cull.h" #include "servers/rendering/renderer_scene_render.h" +#include "servers/rendering/rendering_method.h" #include "servers/rendering/storage/utilities.h" #include "servers/xr/xr_interface.h" -class RendererSceneCull : public RendererScene { +class RendererSceneCull : public RenderingMethod { public: RendererSceneRender *scene_render = nullptr; @@ -1058,7 +1058,7 @@ public: void _render_scene(const RendererSceneRender::CameraData *p_camera_data, const Ref<RenderSceneBuffers> &p_render_buffers, RID p_environment, RID p_force_camera_attributes, uint32_t p_visible_layers, RID p_scenario, RID p_viewport, RID p_shadow_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, bool p_using_shadows = true, RenderInfo *r_render_info = nullptr); void render_empty_scene(const Ref<RenderSceneBuffers> &p_render_buffers, RID p_scenario, RID p_shadow_atlas); - void render_camera(const Ref<RenderSceneBuffers> &p_render_buffers, RID p_camera, RID p_scenario, RID p_viewport, Size2 p_viewport_size, bool p_use_taa, float p_screen_mesh_lod_threshold, RID p_shadow_atlas, Ref<XRInterface> &p_xr_interface, RendererScene::RenderInfo *r_render_info = nullptr); + void render_camera(const Ref<RenderSceneBuffers> &p_render_buffers, RID p_camera, RID p_scenario, RID p_viewport, Size2 p_viewport_size, bool p_use_taa, float p_screen_mesh_lod_threshold, RID p_shadow_atlas, Ref<XRInterface> &p_xr_interface, RenderingMethod::RenderInfo *r_render_info = nullptr); void update_dirty_instances(); void render_particle_colliders(); @@ -1076,7 +1076,6 @@ public: #define PASSBASE scene_render - PASS2(directional_shadow_atlas_set_size, int, bool) PASS1(voxel_gi_set_quality, RS::VoxelGIQuality) /* SKY API */ @@ -1258,11 +1257,7 @@ public: PASS0R(Ref<RenderSceneBuffers>, render_buffers_create) PASS1(gi_set_use_half_resolution, bool) - /* Shadow Atlas */ - PASS0R(RID, shadow_atlas_create) - PASS3(shadow_atlas_set_size, RID, int, bool) - PASS3(shadow_atlas_set_quadrant_subdivision, RID, int, int) - + /* Misc */ PASS1(set_debug_draw_mode, RS::ViewportDebugDraw) PASS1(decals_set_filter, RS::DecalFilter) diff --git a/servers/rendering/renderer_scene_render.h b/servers/rendering/renderer_scene_render.h index 9aa4108412..a8df897077 100644 --- a/servers/rendering/renderer_scene_render.h +++ b/servers/rendering/renderer_scene_render.h @@ -34,7 +34,7 @@ #include "core/math/projection.h" #include "core/templates/paged_array.h" #include "servers/rendering/renderer_geometry_instance.h" -#include "servers/rendering/renderer_scene.h" +#include "servers/rendering/rendering_method.h" #include "servers/rendering/storage/environment_storage.h" #include "storage/render_scene_buffers.h" #include "storage/utilities.h" @@ -56,17 +56,6 @@ public: virtual void geometry_instance_free(RenderGeometryInstance *p_geometry_instance) = 0; virtual uint32_t geometry_instance_get_pair_mask() = 0; - /* SHADOW ATLAS API */ - - virtual RID shadow_atlas_create() = 0; - virtual void shadow_atlas_set_size(RID p_atlas, int p_size, bool p_16_bits = true) = 0; - virtual void shadow_atlas_set_quadrant_subdivision(RID p_atlas, int p_quadrant, int p_subdivision) = 0; - virtual bool shadow_atlas_update_light(RID p_atlas, RID p_light_intance, float p_coverage, uint64_t p_light_version) = 0; - - virtual void directional_shadow_atlas_set_size(int p_size, bool p_16_bits = true) = 0; - virtual int get_directional_light_shadow_size(RID p_light_intance) = 0; - virtual void set_directional_shadow_count(int p_count) = 0; - /* SDFGI UPDATE */ virtual void sdfgi_update(const Ref<RenderSceneBuffers> &p_render_buffers, RID p_environment, const Vector3 &p_world_position) = 0; @@ -240,39 +229,12 @@ public: virtual void positional_soft_shadow_filter_set_quality(RS::ShadowQuality p_quality) = 0; virtual void directional_soft_shadow_filter_set_quality(RS::ShadowQuality p_quality) = 0; - virtual RID light_instance_create(RID p_light) = 0; - virtual void light_instance_set_transform(RID p_light_instance, const Transform3D &p_transform) = 0; - virtual void light_instance_set_aabb(RID p_light_instance, const AABB &p_aabb) = 0; - virtual void light_instance_set_shadow_transform(RID p_light_instance, const Projection &p_projection, const Transform3D &p_transform, float p_far, float p_split, int p_pass, float p_shadow_texel_size, float p_bias_scale = 1.0, float p_range_begin = 0, const Vector2 &p_uv_scale = Vector2()) = 0; - virtual void light_instance_mark_visible(RID p_light_instance) = 0; - virtual bool light_instances_can_render_shadow_cube() const { - return true; - } - virtual RID fog_volume_instance_create(RID p_fog_volume) = 0; virtual void fog_volume_instance_set_transform(RID p_fog_volume_instance, const Transform3D &p_transform) = 0; virtual void fog_volume_instance_set_active(RID p_fog_volume_instance, bool p_active) = 0; virtual RID fog_volume_instance_get_volume(RID p_fog_volume_instance) const = 0; virtual Vector3 fog_volume_instance_get_position(RID p_fog_volume_instance) const = 0; - virtual RID reflection_atlas_create() = 0; - virtual void reflection_atlas_set_size(RID p_ref_atlas, int p_reflection_size, int p_reflection_count) = 0; - virtual int reflection_atlas_get_size(RID p_ref_atlas) const = 0; - - virtual RID reflection_probe_instance_create(RID p_probe) = 0; - virtual void reflection_probe_instance_set_transform(RID p_instance, const Transform3D &p_transform) = 0; - virtual void reflection_probe_release_atlas_index(RID p_instance) = 0; - virtual bool reflection_probe_instance_needs_redraw(RID p_instance) = 0; - virtual bool reflection_probe_instance_has_reflection(RID p_instance) = 0; - virtual bool reflection_probe_instance_begin_render(RID p_instance, RID p_reflection_atlas) = 0; - virtual bool reflection_probe_instance_postprocess_step(RID p_instance) = 0; - - virtual RID decal_instance_create(RID p_decal) = 0; - virtual void decal_instance_set_transform(RID p_decal, const Transform3D &p_transform) = 0; - - virtual RID lightmap_instance_create(RID p_lightmap) = 0; - virtual void lightmap_instance_set_transform(RID p_lightmap, const Transform3D &p_transform) = 0; - virtual RID voxel_gi_instance_create(RID p_voxel_gi) = 0; virtual void voxel_gi_instance_set_transform_to_data(RID p_probe, const Transform3D &p_xform) = 0; virtual bool voxel_gi_needs_update(RID p_probe) const = 0; @@ -320,7 +282,7 @@ public: void set_multiview_camera(uint32_t p_view_count, const Transform3D *p_transforms, const Projection *p_projections, bool p_is_orthogonal, bool p_vaspect); }; - virtual void render_scene(const Ref<RenderSceneBuffers> &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray<RenderGeometryInstance *> &p_instances, const PagedArray<RID> &p_lights, const PagedArray<RID> &p_reflection_probes, const PagedArray<RID> &p_voxel_gi_instances, const PagedArray<RID> &p_decals, const PagedArray<RID> &p_lightmaps, const PagedArray<RID> &p_fog_volumes, RID p_environment, RID p_camera_attributes, RID p_shadow_atlas, RID p_occluder_debug_tex, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, const RenderShadowData *p_render_shadows, int p_render_shadow_count, const RenderSDFGIData *p_render_sdfgi_regions, int p_render_sdfgi_region_count, const RenderSDFGIUpdateData *p_sdfgi_update_data = nullptr, RendererScene::RenderInfo *r_render_info = nullptr) = 0; + virtual void render_scene(const Ref<RenderSceneBuffers> &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray<RenderGeometryInstance *> &p_instances, const PagedArray<RID> &p_lights, const PagedArray<RID> &p_reflection_probes, const PagedArray<RID> &p_voxel_gi_instances, const PagedArray<RID> &p_decals, const PagedArray<RID> &p_lightmaps, const PagedArray<RID> &p_fog_volumes, RID p_environment, RID p_camera_attributes, RID p_shadow_atlas, RID p_occluder_debug_tex, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, const RenderShadowData *p_render_shadows, int p_render_shadow_count, const RenderSDFGIData *p_render_sdfgi_regions, int p_render_sdfgi_region_count, const RenderSDFGIUpdateData *p_sdfgi_update_data = nullptr, RenderingMethod::RenderInfo *r_render_info = nullptr) = 0; virtual void render_material(const Transform3D &p_cam_transform, const Projection &p_cam_projection, bool p_cam_orthogonal, const PagedArray<RenderGeometryInstance *> &p_instances, RID p_framebuffer, const Rect2i &p_region) = 0; virtual void render_particle_collider_heightfield(RID p_collider, const Transform3D &p_transform, const PagedArray<RenderGeometryInstance *> &p_instances) = 0; diff --git a/servers/rendering/renderer_viewport.cpp b/servers/rendering/renderer_viewport.cpp index d466f90e79..1db018b647 100644 --- a/servers/rendering/renderer_viewport.cpp +++ b/servers/rendering/renderer_viewport.cpp @@ -73,33 +73,36 @@ static Transform2D _canvas_get_transform(RendererViewport::Viewport *p_viewport, } Vector<RendererViewport::Viewport *> RendererViewport::_sort_active_viewports() { - // We need to sort the viewports in a "topological order", - // children first and parents last, we use the Kahn's algorithm to achieve that. + // We need to sort the viewports in a "topological order", children first and + // parents last. We also need to keep sibling viewports in the original order + // from top to bottom. Vector<Viewport *> result; List<Viewport *> nodes; - for (Viewport *viewport : active_viewports) { + for (int i = active_viewports.size() - 1; i >= 0; --i) { + Viewport *viewport = active_viewports[i]; if (viewport->parent.is_valid()) { continue; } nodes.push_back(viewport); + result.insert(0, viewport); } while (!nodes.is_empty()) { - Viewport *node = nodes[0]; + const Viewport *node = nodes[0]; nodes.pop_front(); - result.insert(0, node); - - for (Viewport *child : active_viewports) { + for (int i = active_viewports.size() - 1; i >= 0; --i) { + Viewport *child = active_viewports[i]; if (child->parent != node->self) { continue; } if (!nodes.find(child)) { nodes.push_back(child); + result.insert(0, child); } } } @@ -176,7 +179,7 @@ void RendererViewport::_configure_3d_render_buffers(Viewport *p_viewport) { // to compensate for the loss of sharpness. const float texture_mipmap_bias = log2f(MIN(scaling_3d_scale, 1.0)) + p_viewport->texture_mipmap_bias; - p_viewport->render_buffers->configure(p_viewport->render_target, Size2i(render_width, render_height), Size2(width, height), p_viewport->fsr_sharpness, texture_mipmap_bias, p_viewport->msaa_3d, p_viewport->screen_space_aa, p_viewport->use_taa, p_viewport->use_debanding, p_viewport->get_view_count()); + p_viewport->render_buffers->configure(p_viewport->render_target, Size2i(render_width, render_height), Size2(width, height), p_viewport->fsr_sharpness, texture_mipmap_bias, p_viewport->msaa_3d, p_viewport->screen_space_aa, p_viewport->use_taa, p_viewport->use_debanding, p_viewport->view_count); } } } @@ -217,7 +220,7 @@ void RendererViewport::_draw_viewport(Viewport *p_viewport) { timestamp_vp_map[rt_id] = p_viewport->self; } - if (OS::get_singleton()->get_current_rendering_driver_name() == "opengl3") { + if (OS::get_singleton()->get_current_rendering_method() == "gl_compatibility") { // This is currently needed for GLES to keep the current window being rendered to up to date DisplayServer::get_singleton()->gl_window_make_current(p_viewport->viewport_to_screen); } @@ -613,14 +616,7 @@ void RendererViewport::draw_viewports() { if (xr_interface.is_valid()) { // Override our size, make sure it matches our required size and is created as a stereo target Size2 xr_size = xr_interface->get_render_target_size(); - - // Would have been nice if we could call viewport_set_size here, - // but alas that takes our RID and we now have our pointer, - // also we only check if view_count changes in render_target_set_size so we need to call that for this to reliably change - vp->occlusion_buffer_dirty = vp->occlusion_buffer_dirty || (vp->size != xr_size); - vp->size = xr_size; - uint32_t view_count = xr_interface->get_view_count(); - RSG::texture_storage->render_target_set_size(vp->render_target, vp->size.x, vp->size.y, view_count); + _viewport_set_size(vp, xr_size.width, xr_size.height, xr_interface->get_view_count()); // Inform xr interface we're about to render its viewport, if this returns false we don't render visible = xr_interface->pre_draw_viewport(vp->render_target); @@ -682,13 +678,20 @@ void RendererViewport::draw_viewports() { // commit our eyes Vector<BlitToScreen> blits = xr_interface->post_draw_viewport(vp->render_target, vp->viewport_to_screen_rect); - if (vp->viewport_to_screen != DisplayServer::INVALID_WINDOW_ID && blits.size() > 0) { - if (!blit_to_screen_list.has(vp->viewport_to_screen)) { - blit_to_screen_list[vp->viewport_to_screen] = Vector<BlitToScreen>(); - } + if (vp->viewport_to_screen != DisplayServer::INVALID_WINDOW_ID) { + if (OS::get_singleton()->get_current_rendering_driver_name() == "opengl3") { + if (blits.size() > 0) { + RSG::rasterizer->blit_render_targets_to_screen(vp->viewport_to_screen, blits.ptr(), blits.size()); + } + RSG::rasterizer->end_frame(true); + } else if (blits.size() > 0) { + if (!blit_to_screen_list.has(vp->viewport_to_screen)) { + blit_to_screen_list[vp->viewport_to_screen] = Vector<BlitToScreen>(); + } - for (int b = 0; b < blits.size(); b++) { - blit_to_screen_list[vp->viewport_to_screen].push_back(blits[b]); + for (int b = 0; b < blits.size(); b++) { + blit_to_screen_list[vp->viewport_to_screen].push_back(blits[b]); + } } } } else { @@ -714,7 +717,14 @@ void RendererViewport::draw_viewports() { blit_to_screen_list[vp->viewport_to_screen] = Vector<BlitToScreen>(); } - blit_to_screen_list[vp->viewport_to_screen].push_back(blit); + if (OS::get_singleton()->get_current_rendering_driver_name() == "opengl3") { + Vector<BlitToScreen> blit_to_screen_vec; + blit_to_screen_vec.push_back(blit); + RSG::rasterizer->blit_render_targets_to_screen(vp->viewport_to_screen, blit_to_screen_vec.ptr(), 1); + RSG::rasterizer->end_frame(true); + } else { + blit_to_screen_list[vp->viewport_to_screen].push_back(blit); + } } } @@ -752,7 +762,7 @@ void RendererViewport::viewport_initialize(RID p_rid) { Viewport *viewport = viewport_owner.get_or_null(p_rid); viewport->self = p_rid; viewport->render_target = RSG::texture_storage->render_target_create(); - viewport->shadow_atlas = RSG::scene->shadow_atlas_create(); + viewport->shadow_atlas = RSG::light_storage->shadow_atlas_create(); viewport->viewport_render_direct_to_screen = false; viewport->fsr_enabled = !RSG::rasterizer->is_low_end() && !viewport->disable_3d; @@ -767,7 +777,13 @@ void RendererViewport::viewport_set_use_xr(RID p_viewport, bool p_use_xr) { } viewport->use_xr = p_use_xr; - _configure_3d_render_buffers(viewport); + + // Re-configure the 3D render buffers when disabling XR. They'll get + // re-configured when enabling XR in draw_viewports(). + if (!p_use_xr) { + viewport->view_count = 1; + _configure_3d_render_buffers(viewport); + } } void RendererViewport::viewport_set_scaling_3d_mode(RID p_viewport, RS::ViewportScaling3DMode p_mode) { @@ -813,34 +829,27 @@ void RendererViewport::viewport_set_scaling_3d_scale(RID p_viewport, float p_sca _configure_3d_render_buffers(viewport); } -uint32_t RendererViewport::Viewport::get_view_count() { - uint32_t view_count = 1; - - if (use_xr && XRServer::get_singleton() != nullptr) { - Ref<XRInterface> xr_interface; - - xr_interface = XRServer::get_singleton()->get_primary_interface(); - if (xr_interface.is_valid()) { - view_count = xr_interface->get_view_count(); - } - } - - return view_count; -} - void RendererViewport::viewport_set_size(RID p_viewport, int p_width, int p_height) { ERR_FAIL_COND(p_width < 0 && p_height < 0); Viewport *viewport = viewport_owner.get_or_null(p_viewport); ERR_FAIL_COND(!viewport); + ERR_FAIL_COND_MSG(viewport->use_xr, "Cannot set viewport size when using XR"); - viewport->size = Size2(p_width, p_height); + _viewport_set_size(viewport, p_width, p_height, 1); +} - uint32_t view_count = viewport->get_view_count(); - RSG::texture_storage->render_target_set_size(viewport->render_target, p_width, p_height, view_count); - _configure_3d_render_buffers(viewport); +void RendererViewport::_viewport_set_size(Viewport *p_viewport, int p_width, int p_height, uint32_t p_view_count) { + Size2i new_size(p_width, p_height); + if (p_viewport->size != new_size || p_viewport->view_count != p_view_count) { + p_viewport->size = new_size; + p_viewport->view_count = p_view_count; - viewport->occlusion_buffer_dirty = true; + RSG::texture_storage->render_target_set_size(p_viewport->render_target, p_width, p_height, p_view_count); + _configure_3d_render_buffers(p_viewport); + + p_viewport->occlusion_buffer_dirty = true; + } } void RendererViewport::viewport_set_active(RID p_viewport, bool p_active) { @@ -880,7 +889,7 @@ void RendererViewport::viewport_attach_to_screen(RID p_viewport, const Rect2 &p_ // If using OpenGL we can optimize this operation by rendering directly to system_fbo // instead of rendering to fbo and copying to system_fbo after if (RSG::rasterizer->is_low_end() && viewport->viewport_render_direct_to_screen) { - RSG::texture_storage->render_target_set_size(viewport->render_target, p_rect.size.x, p_rect.size.y, viewport->get_view_count()); + RSG::texture_storage->render_target_set_size(viewport->render_target, p_rect.size.x, p_rect.size.y, viewport->view_count); RSG::texture_storage->render_target_set_position(viewport->render_target, p_rect.position.x, p_rect.position.y); } @@ -890,7 +899,7 @@ void RendererViewport::viewport_attach_to_screen(RID p_viewport, const Rect2 &p_ // if render_direct_to_screen was used, reset size and position if (RSG::rasterizer->is_low_end() && viewport->viewport_render_direct_to_screen) { RSG::texture_storage->render_target_set_position(viewport->render_target, 0, 0); - RSG::texture_storage->render_target_set_size(viewport->render_target, viewport->size.x, viewport->size.y, viewport->get_view_count()); + RSG::texture_storage->render_target_set_size(viewport->render_target, viewport->size.x, viewport->size.y, viewport->view_count); } viewport->viewport_to_screen_rect = Rect2(); @@ -909,7 +918,7 @@ void RendererViewport::viewport_set_render_direct_to_screen(RID p_viewport, bool // if disabled, reset render_target size and position if (!p_enable) { RSG::texture_storage->render_target_set_position(viewport->render_target, 0, 0); - RSG::texture_storage->render_target_set_size(viewport->render_target, viewport->size.x, viewport->size.y, viewport->get_view_count()); + RSG::texture_storage->render_target_set_size(viewport->render_target, viewport->size.x, viewport->size.y, viewport->view_count); } RSG::texture_storage->render_target_set_direct_to_screen(viewport->render_target, p_enable); @@ -917,7 +926,7 @@ void RendererViewport::viewport_set_render_direct_to_screen(RID p_viewport, bool // if attached to screen already, setup screen size and position, this needs to happen after setting flag to avoid an unnecessary buffer allocation if (RSG::rasterizer->is_low_end() && viewport->viewport_to_screen_rect != Rect2() && p_enable) { - RSG::texture_storage->render_target_set_size(viewport->render_target, viewport->viewport_to_screen_rect.size.x, viewport->viewport_to_screen_rect.size.y, viewport->get_view_count()); + RSG::texture_storage->render_target_set_size(viewport->render_target, viewport->viewport_to_screen_rect.size.x, viewport->viewport_to_screen_rect.size.y, viewport->view_count); RSG::texture_storage->render_target_set_position(viewport->render_target, viewport->viewport_to_screen_rect.position.x, viewport->viewport_to_screen_rect.position.y); } } @@ -1069,14 +1078,14 @@ void RendererViewport::viewport_set_positional_shadow_atlas_size(RID p_viewport, viewport->shadow_atlas_size = p_size; viewport->shadow_atlas_16_bits = p_16_bits; - RSG::scene->shadow_atlas_set_size(viewport->shadow_atlas, viewport->shadow_atlas_size, viewport->shadow_atlas_16_bits); + RSG::light_storage->shadow_atlas_set_size(viewport->shadow_atlas, viewport->shadow_atlas_size, viewport->shadow_atlas_16_bits); } void RendererViewport::viewport_set_positional_shadow_atlas_quadrant_subdivision(RID p_viewport, int p_quadrant, int p_subdiv) { Viewport *viewport = viewport_owner.get_or_null(p_viewport); ERR_FAIL_COND(!viewport); - RSG::scene->shadow_atlas_set_quadrant_subdivision(viewport->shadow_atlas, p_quadrant, p_subdiv); + RSG::light_storage->shadow_atlas_set_quadrant_subdivision(viewport->shadow_atlas, p_quadrant, p_subdiv); } void RendererViewport::viewport_set_msaa_2d(RID p_viewport, RS::ViewportMSAA p_msaa) { @@ -1287,7 +1296,7 @@ bool RendererViewport::free(RID p_rid) { Viewport *viewport = viewport_owner.get_or_null(p_rid); RSG::texture_storage->render_target_free(viewport->render_target); - RSG::scene->free(viewport->shadow_atlas); + RSG::light_storage->shadow_atlas_free(viewport->shadow_atlas); if (viewport->render_buffers.is_valid()) { viewport->render_buffers.unref(); } diff --git a/servers/rendering/renderer_viewport.h b/servers/rendering/renderer_viewport.h index a123c70372..55058a30b8 100644 --- a/servers/rendering/renderer_viewport.h +++ b/servers/rendering/renderer_viewport.h @@ -34,8 +34,8 @@ #include "core/templates/local_vector.h" #include "core/templates/rid_owner.h" #include "core/templates/self_list.h" -#include "servers/rendering/renderer_scene.h" #include "servers/rendering/renderer_scene_render.h" +#include "servers/rendering/rendering_method.h" #include "servers/rendering_server.h" #include "servers/xr/xr_interface.h" #include "storage/render_scene_buffers.h" @@ -54,6 +54,7 @@ public: Size2i internal_size; Size2i size; + uint32_t view_count; RID camera; RID scenario; @@ -147,9 +148,10 @@ public: HashMap<RID, CanvasData> canvas_map; - RendererScene::RenderInfo render_info; + RenderingMethod::RenderInfo render_info; Viewport() { + view_count = 1; update_mode = RS::VIEWPORT_UPDATE_WHEN_VISIBLE; clear_mode = RS::VIEWPORT_CLEAR_ALWAYS; transparent_bg = false; @@ -176,8 +178,6 @@ public: time_gpu_begin = 0; time_gpu_end = 0; } - - uint32_t get_view_count(); }; HashMap<String, RID> timestamp_vp_map; @@ -196,6 +196,7 @@ public: private: Vector<Viewport *> _sort_active_viewports(); + void _viewport_set_size(Viewport *p_viewport, int p_width, int p_height, uint32_t p_view_count); void _configure_3d_render_buffers(Viewport *p_viewport); void _draw_3d(Viewport *p_viewport); void _draw_viewport(Viewport *p_viewport); diff --git a/servers/rendering/renderer_scene.cpp b/servers/rendering/rendering_method.cpp index b3fdd88626..16a4e35ad3 100644 --- a/servers/rendering/renderer_scene.cpp +++ b/servers/rendering/rendering_method.cpp @@ -1,5 +1,5 @@ /*************************************************************************/ -/* renderer_scene.cpp */ +/* rendering_method.cpp */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,10 +28,10 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "renderer_scene.h" +#include "rendering_method.h" -RendererScene::RendererScene() { +RenderingMethod::RenderingMethod() { } -RendererScene::~RendererScene() { +RenderingMethod::~RenderingMethod() { } diff --git a/servers/rendering/renderer_scene.h b/servers/rendering/rendering_method.h index 29c65fcffb..c4d9e25ecd 100644 --- a/servers/rendering/renderer_scene.h +++ b/servers/rendering/rendering_method.h @@ -1,5 +1,5 @@ /*************************************************************************/ -/* renderer_scene.h */ +/* rendering_method.h */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,14 +28,14 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifndef RENDERER_SCENE_H -#define RENDERER_SCENE_H +#ifndef RENDERING_METHOD_H +#define RENDERING_METHOD_H #include "servers/rendering/storage/render_scene_buffers.h" #include "servers/rendering_server.h" #include "servers/xr/xr_interface.h" -class RendererScene { +class RenderingMethod { public: virtual RID camera_allocate() = 0; virtual void camera_initialize(RID p_rid) = 0; @@ -106,8 +106,6 @@ public: virtual Variant instance_geometry_get_shader_parameter(RID p_instance, const StringName &p_parameter) const = 0; virtual Variant instance_geometry_get_shader_parameter_default_value(RID p_instance, const StringName &p_parameter) const = 0; - virtual void directional_shadow_atlas_set_size(int p_size, bool p_16_bits = true) = 0; - /* SKY API */ virtual RID sky_allocate() = 0; @@ -284,10 +282,6 @@ public: virtual void positional_soft_shadow_filter_set_quality(RS::ShadowQuality p_quality) = 0; virtual void directional_soft_shadow_filter_set_quality(RS::ShadowQuality p_quality) = 0; - virtual RID shadow_atlas_create() = 0; - virtual void shadow_atlas_set_size(RID p_atlas, int p_size, bool p_use_16_bits = true) = 0; - virtual void shadow_atlas_set_quadrant_subdivision(RID p_atlas, int p_quadrant, int p_subdivision) = 0; - /* Render Buffers */ virtual Ref<RenderSceneBuffers> render_buffers_create() = 0; @@ -318,8 +312,8 @@ public: virtual bool free(RID p_rid) = 0; - RendererScene(); - virtual ~RendererScene(); + RenderingMethod(); + virtual ~RenderingMethod(); }; -#endif // RENDERER_SCENE_H +#endif // RENDERING_METHOD_H diff --git a/servers/rendering/rendering_server_default.cpp b/servers/rendering/rendering_server_default.cpp index 1f686069bd..9103b0cf56 100644 --- a/servers/rendering/rendering_server_default.cpp +++ b/servers/rendering/rendering_server_default.cpp @@ -91,7 +91,10 @@ void RenderingServerDefault::_draw(bool p_swap_buffers, double frame_step) { RSG::viewport->draw_viewports(); RSG::canvas_render->update(); - RSG::rasterizer->end_frame(p_swap_buffers); + if (OS::get_singleton()->get_current_rendering_driver_name() != "opengl3") { + // Already called for gl_compatibility renderer. + RSG::rasterizer->end_frame(p_swap_buffers); + } XRServer *xr_server = XRServer::get_singleton(); if (xr_server != nullptr) { diff --git a/servers/rendering/rendering_server_default.h b/servers/rendering/rendering_server_default.h index dfe16431bd..fe212151e3 100644 --- a/servers/rendering/rendering_server_default.h +++ b/servers/rendering/rendering_server_default.h @@ -410,6 +410,13 @@ public: FUNC1RC(PackedInt32Array, lightmap_get_probe_capture_bsp_tree, RID) FUNC1(lightmap_set_probe_capture_update_speed, float) + /* Shadow Atlas */ + FUNC0R(RID, shadow_atlas_create) + FUNC3(shadow_atlas_set_size, RID, int, bool) + FUNC3(shadow_atlas_set_quadrant_subdivision, RID, int, int) + + FUNC2(directional_shadow_atlas_set_size, int, bool) + /* DECAL API */ #undef ServerName @@ -550,7 +557,7 @@ public: #undef server_name #undef ServerName //from now on, calls forwarded to this singleton -#define ServerName RendererScene +#define ServerName RenderingMethod #define server_name RSG::scene /* CAMERA API */ @@ -649,10 +656,9 @@ public: #undef server_name #undef ServerName //from now on, calls forwarded to this singleton -#define ServerName RendererScene +#define ServerName RenderingMethod #define server_name RSG::scene - FUNC2(directional_shadow_atlas_set_size, int, bool) FUNC1(voxel_gi_set_quality, VoxelGIQuality) /* SKY API */ @@ -739,7 +745,7 @@ public: #undef server_name #undef ServerName -#define ServerName RendererScene +#define ServerName RenderingMethod #define server_name RSG::scene FUNCRIDSPLIT(scenario) diff --git a/servers/rendering/rendering_server_globals.cpp b/servers/rendering/rendering_server_globals.cpp index ce7383a03f..ca24042ef9 100644 --- a/servers/rendering/rendering_server_globals.cpp +++ b/servers/rendering/rendering_server_globals.cpp @@ -46,4 +46,4 @@ RendererCompositor *RenderingServerGlobals::rasterizer = nullptr; RendererCanvasCull *RenderingServerGlobals::canvas = nullptr; RendererViewport *RenderingServerGlobals::viewport = nullptr; -RendererScene *RenderingServerGlobals::scene = nullptr; +RenderingMethod *RenderingServerGlobals::scene = nullptr; diff --git a/servers/rendering/rendering_server_globals.h b/servers/rendering/rendering_server_globals.h index 6c4ab5a26e..23f3810ce8 100644 --- a/servers/rendering/rendering_server_globals.h +++ b/servers/rendering/rendering_server_globals.h @@ -35,7 +35,7 @@ #include "servers/rendering/environment/renderer_gi.h" #include "servers/rendering/renderer_canvas_cull.h" #include "servers/rendering/renderer_canvas_render.h" -#include "servers/rendering/renderer_scene.h" +#include "servers/rendering/rendering_method.h" #include "servers/rendering/storage/camera_attributes_storage.h" #include "servers/rendering/storage/light_storage.h" #include "servers/rendering/storage/material_storage.h" @@ -46,7 +46,7 @@ class RendererCanvasCull; class RendererViewport; -class RendererScene; +class RenderingMethod; class RenderingServerGlobals { public: @@ -66,7 +66,7 @@ public: static RendererCanvasCull *canvas; static RendererViewport *viewport; - static RendererScene *scene; + static RenderingMethod *scene; }; #define RSG RenderingServerGlobals diff --git a/servers/rendering/shader_compiler.cpp b/servers/rendering/shader_compiler.cpp index ab5b8af794..1d83cc9de7 100644 --- a/servers/rendering/shader_compiler.cpp +++ b/servers/rendering/shader_compiler.cpp @@ -32,8 +32,8 @@ #include "core/config/project_settings.h" #include "core/os/os.h" +#include "servers/rendering/rendering_server_globals.h" #include "servers/rendering/shader_types.h" -#include "servers/rendering_server.h" #define SL ShaderLanguage @@ -1348,8 +1348,8 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene return code; } -ShaderLanguage::DataType ShaderCompiler::_get_variable_type(const StringName &p_type) { - RS::GlobalShaderParameterType gvt = RS::get_singleton()->global_shader_parameter_get_type(p_type); +ShaderLanguage::DataType ShaderCompiler::_get_global_shader_uniform_type(const StringName &p_name) { + RS::GlobalShaderParameterType gvt = RSG::material_storage->global_shader_parameter_get_type(p_name); return (ShaderLanguage::DataType)RS::global_shader_uniform_type_get_shader_datatype(gvt); } @@ -1358,7 +1358,7 @@ Error ShaderCompiler::compile(RS::ShaderMode p_mode, const String &p_code, Ident info.functions = ShaderTypes::get_singleton()->get_functions(p_mode); info.render_modes = ShaderTypes::get_singleton()->get_modes(p_mode); info.shader_types = ShaderTypes::get_singleton()->get_types(); - info.global_shader_uniform_type_func = _get_variable_type; + info.global_shader_uniform_type_func = _get_global_shader_uniform_type; Error err = parser.compile(p_code, info); diff --git a/servers/rendering/shader_compiler.h b/servers/rendering/shader_compiler.h index 1ad43daf5f..4cbe93afb2 100644 --- a/servers/rendering/shader_compiler.h +++ b/servers/rendering/shader_compiler.h @@ -122,7 +122,7 @@ private: DefaultIdentifierActions actions; - static ShaderLanguage::DataType _get_variable_type(const StringName &p_type); + static ShaderLanguage::DataType _get_global_shader_uniform_type(const StringName &p_name); public: Error compile(RS::ShaderMode p_mode, const String &p_code, IdentifierActions *p_actions, const String &p_path, GeneratedCode &r_gen_code); diff --git a/servers/rendering/shader_language.cpp b/servers/rendering/shader_language.cpp index e2519ba8d1..a92292209f 100644 --- a/servers/rendering/shader_language.cpp +++ b/servers/rendering/shader_language.cpp @@ -1069,7 +1069,7 @@ String ShaderLanguage::get_uniform_hint_name(ShaderNode::Uniform::Hint p_hint) { result = "hint_range"; } break; case ShaderNode::Uniform::HINT_SOURCE_COLOR: { - result = "hint_color"; + result = "source_color"; } break; case ShaderNode::Uniform::HINT_NORMAL: { result = "hint_normal"; @@ -1171,6 +1171,10 @@ void ShaderLanguage::clear() { last_type = IDENTIFIER_MAX; current_uniform_group_name = ""; current_uniform_subgroup_name = ""; + current_uniform_hint = ShaderNode::Uniform::HINT_NONE; + current_uniform_filter = FILTER_DEFAULT; + current_uniform_repeat = REPEAT_DEFAULT; + current_uniform_instance_index_defined = false; completion_type = COMPLETION_NONE; completion_block = nullptr; @@ -4392,8 +4396,6 @@ bool ShaderLanguage::_is_operator_assign(Operator p_op) const { default: return false; } - - return false; } bool ShaderLanguage::_validate_varying_assign(ShaderNode::Varying &p_varying, String *r_message) { @@ -5340,8 +5342,8 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons last_type = IDENTIFIER_MAX; _set_tkpos(pos); - DataType data_type; - IdentifierType ident_type; + DataType data_type = TYPE_MAX; + IdentifierType ident_type = IDENTIFIER_MAX; int array_size = 0; StringName struct_name; bool is_local = false; @@ -8617,6 +8619,7 @@ Error ShaderLanguage::_parse_shader(const HashMap<StringName, FunctionInfo> &p_f } custom_instance_index = tk.constant; + current_uniform_instance_index_defined = true; if (custom_instance_index >= MAX_INSTANCE_UNIFORM_INDICES) { _set_error(vformat(RTR("Allowed instance uniform indices must be within [0..%d] range."), MAX_INSTANCE_UNIFORM_INDICES - 1)); @@ -8682,6 +8685,7 @@ Error ShaderLanguage::_parse_shader(const HashMap<StringName, FunctionInfo> &p_f return ERR_PARSE_ERROR; } else { uniform.hint = new_hint; + current_uniform_hint = new_hint; } } @@ -8695,6 +8699,7 @@ Error ShaderLanguage::_parse_shader(const HashMap<StringName, FunctionInfo> &p_f return ERR_PARSE_ERROR; } else { uniform.filter = new_filter; + current_uniform_filter = new_filter; } } @@ -8708,6 +8713,7 @@ Error ShaderLanguage::_parse_shader(const HashMap<StringName, FunctionInfo> &p_f return ERR_PARSE_ERROR; } else { uniform.repeat = new_repeat; + current_uniform_repeat = new_repeat; } } @@ -8775,6 +8781,11 @@ Error ShaderLanguage::_parse_shader(const HashMap<StringName, FunctionInfo> &p_f keyword_completion_context = CF_GLOBAL_SPACE; #endif // DEBUG_ENABLED completion_type = COMPLETION_NONE; + + current_uniform_hint = ShaderNode::Uniform::HINT_NONE; + current_uniform_filter = FILTER_DEFAULT; + current_uniform_repeat = REPEAT_DEFAULT; + current_uniform_instance_index_defined = false; } else { // varying ShaderNode::Varying varying; varying.type = type; @@ -10311,28 +10322,33 @@ Error ShaderLanguage::complete(const String &p_code, const ShaderCompileInfo &p_ } break; case COMPLETION_HINT: { if (completion_base == DataType::TYPE_VEC3 || completion_base == DataType::TYPE_VEC4) { - ScriptLanguage::CodeCompletionOption option("source_color", ScriptLanguage::CODE_COMPLETION_KIND_PLAIN_TEXT); - r_options->push_back(option); + if (current_uniform_hint == ShaderNode::Uniform::HINT_NONE) { + ScriptLanguage::CodeCompletionOption option("source_color", ScriptLanguage::CODE_COMPLETION_KIND_PLAIN_TEXT); + r_options->push_back(option); + } } else if ((completion_base == DataType::TYPE_INT || completion_base == DataType::TYPE_FLOAT) && !completion_base_array) { - ScriptLanguage::CodeCompletionOption option("hint_range", ScriptLanguage::CODE_COMPLETION_KIND_PLAIN_TEXT); + if (current_uniform_hint == ShaderNode::Uniform::HINT_NONE) { + ScriptLanguage::CodeCompletionOption option("hint_range", ScriptLanguage::CODE_COMPLETION_KIND_PLAIN_TEXT); - if (completion_base == DataType::TYPE_INT) { - option.insert_text = "hint_range(0, 100, 1)"; - } else { - option.insert_text = "hint_range(0.0, 1.0, 0.1)"; - } + if (completion_base == DataType::TYPE_INT) { + option.insert_text = "hint_range(0, 100, 1)"; + } else { + option.insert_text = "hint_range(0.0, 1.0, 0.1)"; + } - r_options->push_back(option); + r_options->push_back(option); + } } else if ((int(completion_base) > int(TYPE_MAT4) && int(completion_base) < int(TYPE_STRUCT)) && !completion_base_array) { - static Vector<String> options; - - if (options.is_empty()) { + Vector<String> options; + if (current_uniform_filter == FILTER_DEFAULT) { options.push_back("filter_linear"); options.push_back("filter_linear_mipmap"); options.push_back("filter_linear_mipmap_anisotropic"); options.push_back("filter_nearest"); options.push_back("filter_nearest_mipmap"); options.push_back("filter_nearest_mipmap_anisotropic"); + } + if (current_uniform_hint == ShaderNode::Uniform::HINT_NONE) { options.push_back("hint_anisotropy"); options.push_back("hint_default_black"); options.push_back("hint_default_white"); @@ -10348,6 +10364,8 @@ Error ShaderLanguage::complete(const String &p_code, const ShaderCompileInfo &p_ options.push_back("hint_normal_roughness_texture"); options.push_back("hint_depth_texture"); options.push_back("source_color"); + } + if (current_uniform_repeat == REPEAT_DEFAULT) { options.push_back("repeat_enable"); options.push_back("repeat_disable"); } @@ -10357,7 +10375,7 @@ Error ShaderLanguage::complete(const String &p_code, const ShaderCompileInfo &p_ r_options->push_back(option); } } - if (!completion_base_array) { + if (!completion_base_array && !current_uniform_instance_index_defined) { ScriptLanguage::CodeCompletionOption option("instance_index", ScriptLanguage::CODE_COMPLETION_KIND_PLAIN_TEXT); option.insert_text = "instance_index(0)"; r_options->push_back(option); diff --git a/servers/rendering/shader_language.h b/servers/rendering/shader_language.h index 75b713d167..1e302f5805 100644 --- a/servers/rendering/shader_language.h +++ b/servers/rendering/shader_language.h @@ -483,7 +483,7 @@ public: int array_size = 0; union Value { - bool boolean; + bool boolean = false; float real; int32_t sint; uint32_t uint; @@ -1050,6 +1050,10 @@ private: }; CompletionType completion_type; + ShaderNode::Uniform::Hint current_uniform_hint = ShaderNode::Uniform::HINT_NONE; + TextureFilter current_uniform_filter = FILTER_DEFAULT; + TextureRepeat current_uniform_repeat = REPEAT_DEFAULT; + bool current_uniform_instance_index_defined = false; int completion_line = 0; BlockNode *completion_block = nullptr; DataType completion_base; diff --git a/servers/rendering/shader_preprocessor.cpp b/servers/rendering/shader_preprocessor.cpp index 3766477070..46e76fbe92 100644 --- a/servers/rendering/shader_preprocessor.cpp +++ b/servers/rendering/shader_preprocessor.cpp @@ -1176,7 +1176,7 @@ Error ShaderPreprocessor::preprocess(State *p_state, const String &p_code, Strin return OK; } -Error ShaderPreprocessor::preprocess(const String &p_code, const String &p_filename, String &r_result, String *r_error_text, List<FilePosition> *r_error_position, List<Region> *r_regions, HashSet<Ref<ShaderInclude>> *r_includes, List<ScriptLanguage::CodeCompletionOption> *r_completion_options, IncludeCompletionFunction p_include_completion_func) { +Error ShaderPreprocessor::preprocess(const String &p_code, const String &p_filename, String &r_result, String *r_error_text, List<FilePosition> *r_error_position, List<Region> *r_regions, HashSet<Ref<ShaderInclude>> *r_includes, List<ScriptLanguage::CodeCompletionOption> *r_completion_options, List<ScriptLanguage::CodeCompletionOption> *r_completion_defines, IncludeCompletionFunction p_include_completion_func) { State pp_state; if (!p_filename.is_empty()) { pp_state.current_filename = p_filename; @@ -1198,6 +1198,13 @@ Error ShaderPreprocessor::preprocess(const String &p_code, const String &p_filen *r_includes = pp_state.shader_includes; } + if (r_completion_defines) { + for (const KeyValue<String, Define *> &E : state->defines) { + ScriptLanguage::CodeCompletionOption option(E.key, ScriptLanguage::CODE_COMPLETION_KIND_CONSTANT); + r_completion_defines->push_back(option); + } + } + if (r_completion_options) { switch (pp_state.completion_type) { case COMPLETION_TYPE_DIRECTIVE: { @@ -1212,7 +1219,6 @@ Error ShaderPreprocessor::preprocess(const String &p_code, const String &p_filen } break; case COMPLETION_TYPE_PRAGMA: { List<String> options; - ShaderPreprocessor::get_pragma_list(&options); for (const String &E : options) { diff --git a/servers/rendering/shader_preprocessor.h b/servers/rendering/shader_preprocessor.h index b4e7c7199f..f1b2876891 100644 --- a/servers/rendering/shader_preprocessor.h +++ b/servers/rendering/shader_preprocessor.h @@ -218,7 +218,7 @@ private: public: typedef void (*IncludeCompletionFunction)(List<ScriptLanguage::CodeCompletionOption> *); - Error preprocess(const String &p_code, const String &p_filename, String &r_result, String *r_error_text = nullptr, List<FilePosition> *r_error_position = nullptr, List<Region> *r_regions = nullptr, HashSet<Ref<ShaderInclude>> *r_includes = nullptr, List<ScriptLanguage::CodeCompletionOption> *r_completion_options = nullptr, IncludeCompletionFunction p_include_completion_func = nullptr); + Error preprocess(const String &p_code, const String &p_filename, String &r_result, String *r_error_text = nullptr, List<FilePosition> *r_error_position = nullptr, List<Region> *r_regions = nullptr, HashSet<Ref<ShaderInclude>> *r_includes = nullptr, List<ScriptLanguage::CodeCompletionOption> *r_completion_options = nullptr, List<ScriptLanguage::CodeCompletionOption> *r_completion_defines = nullptr, IncludeCompletionFunction p_include_completion_func = nullptr); static void get_keyword_list(List<String> *r_keywords, bool p_include_shader_keywords, bool p_ignore_context_keywords = false); static void get_pragma_list(List<String> *r_pragmas); diff --git a/servers/rendering/shader_types.cpp b/servers/rendering/shader_types.cpp index 43c483a00d..5e1da7c15d 100644 --- a/servers/rendering/shader_types.cpp +++ b/servers/rendering/shader_types.cpp @@ -86,8 +86,8 @@ ShaderTypes::ShaderTypes() { shader_modes[RS::SHADER_SPATIAL].functions["vertex"].main_function = true; //builtins - shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["MODEL_MATRIX"] = ShaderLanguage::TYPE_MAT4; - shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["MODEL_NORMAL_MATRIX"] = ShaderLanguage::TYPE_MAT3; + shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["MODEL_MATRIX"] = constt(ShaderLanguage::TYPE_MAT4); + shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["MODEL_NORMAL_MATRIX"] = constt(ShaderLanguage::TYPE_MAT3); shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["VIEW_MATRIX"] = constt(ShaderLanguage::TYPE_MAT4); shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["INV_VIEW_MATRIX"] = constt(ShaderLanguage::TYPE_MAT4); shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["PROJECTION_MATRIX"] = ShaderLanguage::TYPE_MAT4; @@ -297,6 +297,9 @@ ShaderTypes::ShaderTypes() { shader_modes[RS::SHADER_CANVAS_ITEM].functions["light"].built_ins["SPECULAR_SHININESS"] = constt(ShaderLanguage::TYPE_VEC4); shader_modes[RS::SHADER_CANVAS_ITEM].functions["light"].built_ins["LIGHT_COLOR"] = constt(ShaderLanguage::TYPE_VEC4); shader_modes[RS::SHADER_CANVAS_ITEM].functions["light"].built_ins["LIGHT_POSITION"] = constt(ShaderLanguage::TYPE_VEC3); + shader_modes[RS::SHADER_CANVAS_ITEM].functions["light"].built_ins["LIGHT_DIRECTION"] = constt(ShaderLanguage::TYPE_VEC3); + shader_modes[RS::SHADER_CANVAS_ITEM].functions["light"].built_ins["LIGHT_ENERGY"] = constt(ShaderLanguage::TYPE_FLOAT); + shader_modes[RS::SHADER_CANVAS_ITEM].functions["light"].built_ins["LIGHT_IS_DIRECTIONAL"] = constt(ShaderLanguage::TYPE_BOOL); shader_modes[RS::SHADER_CANVAS_ITEM].functions["light"].built_ins["LIGHT_VERTEX"] = constt(ShaderLanguage::TYPE_VEC3); shader_modes[RS::SHADER_CANVAS_ITEM].functions["light"].built_ins["LIGHT"] = ShaderLanguage::TYPE_VEC4; shader_modes[RS::SHADER_CANVAS_ITEM].functions["light"].built_ins["SHADOW_MODULATE"] = ShaderLanguage::TYPE_VEC4; @@ -340,6 +343,11 @@ ShaderTypes::ShaderTypes() { shader_modes[RS::SHADER_PARTICLES].functions["start"].built_ins["INDEX"] = constt(ShaderLanguage::TYPE_UINT); shader_modes[RS::SHADER_PARTICLES].functions["start"].built_ins["EMISSION_TRANSFORM"] = constt(ShaderLanguage::TYPE_MAT4); shader_modes[RS::SHADER_PARTICLES].functions["start"].built_ins["RANDOM_SEED"] = constt(ShaderLanguage::TYPE_UINT); + shader_modes[RS::SHADER_PARTICLES].functions["start"].built_ins["FLAG_EMIT_POSITION"] = constt(ShaderLanguage::TYPE_UINT); + shader_modes[RS::SHADER_PARTICLES].functions["start"].built_ins["FLAG_EMIT_ROT_SCALE"] = constt(ShaderLanguage::TYPE_UINT); + shader_modes[RS::SHADER_PARTICLES].functions["start"].built_ins["FLAG_EMIT_VELOCITY"] = constt(ShaderLanguage::TYPE_UINT); + shader_modes[RS::SHADER_PARTICLES].functions["start"].built_ins["FLAG_EMIT_COLOR"] = constt(ShaderLanguage::TYPE_UINT); + shader_modes[RS::SHADER_PARTICLES].functions["start"].built_ins["FLAG_EMIT_CUSTOM"] = constt(ShaderLanguage::TYPE_UINT); shader_modes[RS::SHADER_PARTICLES].functions["start"].built_ins["RESTART_POSITION"] = constt(ShaderLanguage::TYPE_BOOL); shader_modes[RS::SHADER_PARTICLES].functions["start"].built_ins["RESTART_ROT_SCALE"] = constt(ShaderLanguage::TYPE_BOOL); shader_modes[RS::SHADER_PARTICLES].functions["start"].built_ins["RESTART_VELOCITY"] = constt(ShaderLanguage::TYPE_BOOL); @@ -385,6 +393,7 @@ ShaderTypes::ShaderTypes() { emit_vertex_func.arguments.push_back(ShaderLanguage::StageFunctionInfo::Argument("custom", ShaderLanguage::TYPE_VEC4)); emit_vertex_func.arguments.push_back(ShaderLanguage::StageFunctionInfo::Argument("flags", ShaderLanguage::TYPE_UINT)); emit_vertex_func.return_type = ShaderLanguage::TYPE_BOOL; //whether it could emit + shader_modes[RS::SHADER_PARTICLES].functions["start"].stage_functions["emit_subparticle"] = emit_vertex_func; shader_modes[RS::SHADER_PARTICLES].functions["process"].stage_functions["emit_subparticle"] = emit_vertex_func; } @@ -444,6 +453,7 @@ ShaderTypes::ShaderTypes() { shader_modes[RS::SHADER_SKY].modes.push_back({ PNAME("use_half_res_pass") }); shader_modes[RS::SHADER_SKY].modes.push_back({ PNAME("use_quarter_res_pass") }); shader_modes[RS::SHADER_SKY].modes.push_back({ PNAME("disable_fog") }); + shader_modes[RS::SHADER_SKY].modes.push_back({ PNAME("use_debanding") }); } /************ FOG **************************/ diff --git a/servers/rendering/storage/light_storage.h b/servers/rendering/storage/light_storage.h index b04bc671ee..df5b893cd5 100644 --- a/servers/rendering/storage/light_storage.h +++ b/servers/rendering/storage/light_storage.h @@ -84,6 +84,18 @@ public: virtual uint32_t light_get_max_sdfgi_cascade(RID p_light) = 0; virtual uint64_t light_get_version(RID p_light) const = 0; + /* LIGHT INSTANCE API */ + + virtual RID light_instance_create(RID p_light) = 0; + virtual void light_instance_free(RID p_light_instance) = 0; + virtual void light_instance_set_transform(RID p_light_instance, const Transform3D &p_transform) = 0; + virtual void light_instance_set_aabb(RID p_light_instance, const AABB &p_aabb) = 0; + virtual void light_instance_set_shadow_transform(RID p_light_instance, const Projection &p_projection, const Transform3D &p_transform, float p_far, float p_split, int p_pass, float p_shadow_texel_size, float p_bias_scale = 1.0, float p_range_begin = 0, const Vector2 &p_uv_scale = Vector2()) = 0; + virtual void light_instance_mark_visible(RID p_light_instance) = 0; + virtual bool light_instances_can_render_shadow_cube() const { + return true; + } + /* PROBE API */ virtual RID reflection_probe_allocate() = 0; @@ -114,6 +126,24 @@ public: virtual bool reflection_probe_renders_shadows(RID p_probe) const = 0; virtual float reflection_probe_get_mesh_lod_threshold(RID p_probe) const = 0; + /* REFLECTION ATLAS */ + + virtual RID reflection_atlas_create() = 0; + virtual void reflection_atlas_free(RID p_ref_atlas) = 0; + virtual void reflection_atlas_set_size(RID p_ref_atlas, int p_reflection_size, int p_reflection_count) = 0; + virtual int reflection_atlas_get_size(RID p_ref_atlas) const = 0; + + /* REFLECTION PROBE INSTANCE */ + + virtual RID reflection_probe_instance_create(RID p_probe) = 0; + virtual void reflection_probe_instance_free(RID p_instance) = 0; + virtual void reflection_probe_instance_set_transform(RID p_instance, const Transform3D &p_transform) = 0; + virtual void reflection_probe_release_atlas_index(RID p_instance) = 0; + virtual bool reflection_probe_instance_needs_redraw(RID p_instance) = 0; + virtual bool reflection_probe_instance_has_reflection(RID p_instance) = 0; + virtual bool reflection_probe_instance_begin_render(RID p_instance, RID p_reflection_atlas) = 0; + virtual bool reflection_probe_instance_postprocess_step(RID p_instance) = 0; + /* LIGHTMAP */ virtual RID lightmap_allocate() = 0; @@ -134,6 +164,27 @@ public: virtual bool lightmap_is_interior(RID p_lightmap) const = 0; virtual void lightmap_set_probe_capture_update_speed(float p_speed) = 0; virtual float lightmap_get_probe_capture_update_speed() const = 0; + + /* LIGHTMAP INSTANCE */ + + virtual RID lightmap_instance_create(RID p_lightmap) = 0; + virtual void lightmap_instance_free(RID p_lightmap) = 0; + virtual void lightmap_instance_set_transform(RID p_lightmap, const Transform3D &p_transform) = 0; + + /* SHADOW ATLAS */ + + virtual RID shadow_atlas_create() = 0; + virtual void shadow_atlas_free(RID p_atlas) = 0; + + virtual void shadow_atlas_set_size(RID p_atlas, int p_size, bool p_use_16_bits = true) = 0; + virtual void shadow_atlas_set_quadrant_subdivision(RID p_atlas, int p_quadrant, int p_subdivision) = 0; + virtual bool shadow_atlas_update_light(RID p_atlas, RID p_light_intance, float p_coverage, uint64_t p_light_version) = 0; + + virtual void shadow_atlas_update(RID p_atlas) = 0; + + virtual void directional_shadow_atlas_set_size(int p_size, bool p_16_bits = true) = 0; + virtual int get_directional_light_shadow_size(RID p_light_intance) = 0; + virtual void set_directional_shadow_count(int p_count) = 0; }; #endif // LIGHT_STORAGE_H diff --git a/servers/rendering/storage/texture_storage.h b/servers/rendering/storage/texture_storage.h index 08ff88d4a5..5024a76c09 100644 --- a/servers/rendering/storage/texture_storage.h +++ b/servers/rendering/storage/texture_storage.h @@ -120,6 +120,12 @@ public: virtual void texture_add_to_decal_atlas(RID p_texture, bool p_panorama_to_dp = false) = 0; virtual void texture_remove_from_decal_atlas(RID p_texture, bool p_panorama_to_dp = false) = 0; + /* DECAL INSTANCE */ + + virtual RID decal_instance_create(RID p_decal) = 0; + virtual void decal_instance_free(RID p_decal_instance) = 0; + virtual void decal_instance_set_transform(RID p_decal_instance, const Transform3D &p_transform) = 0; + /* RENDER TARGET */ virtual RID render_target_create() = 0; diff --git a/servers/rendering_server.cpp b/servers/rendering_server.cpp index aa3351c815..57378708ba 100644 --- a/servers/rendering_server.cpp +++ b/servers/rendering_server.cpp @@ -743,7 +743,7 @@ void RenderingServer::mesh_surface_make_offsets_from_format(uint32_t p_format, i r_attrib_element_size = 0; r_skin_element_size = 0; - uint32_t *size_accum; + uint32_t *size_accum = nullptr; for (int i = 0; i < RS::ARRAY_MAX; i++) { r_offsets[i] = 0; // Reset @@ -847,8 +847,12 @@ void RenderingServer::mesh_surface_make_offsets_from_format(uint32_t p_format, i } } - r_offsets[i] = (*size_accum); - (*size_accum) += elem_size; + if (size_accum != nullptr) { + r_offsets[i] = (*size_accum); + (*size_accum) += elem_size; + } else { + r_offsets[i] = 0; + } } } @@ -1114,7 +1118,8 @@ Array RenderingServer::_get_array_from_surface(uint32_t p_format, Vector<uint8_t for (int j = 0; j < p_vertex_len; j++) { const uint32_t v = *(const uint32_t *)&r[j * vertex_elem_size + offsets[i]]; - w[j] = Vector3((v & 0x3FF) / 1023.0, ((v >> 10) & 0x3FF) / 1023.0, ((v >> 20) & 0x3FF) / 1023.0) * Vector3(2, 2, 2) - Vector3(1, 1, 1); + + w[j] = Vector3::octahedron_decode(Vector2((v & 0xFFFF) / 65535.0, ((v >> 16) & 0xFFFF) / 65535.0)); } ret[i] = arr; @@ -1129,11 +1134,12 @@ Array RenderingServer::_get_array_from_surface(uint32_t p_format, Vector<uint8_t for (int j = 0; j < p_vertex_len; j++) { const uint32_t v = *(const uint32_t *)&r[j * vertex_elem_size + offsets[i]]; - - w[j * 4 + 0] = ((v & 0x3FF) / 1023.0) * 2.0 - 1.0; - w[j * 4 + 1] = (((v >> 10) & 0x3FF) / 1023.0) * 2.0 - 1.0; - w[j * 4 + 2] = (((v >> 20) & 0x3FF) / 1023.0) * 2.0 - 1.0; - w[j * 4 + 3] = ((v >> 30) / 3.0) * 2.0 - 1.0; + float tangent_sign; + Vector3 res = Vector3::octahedron_tangent_decode(Vector2((v & 0xFFFF) / 65535.0, ((v >> 16) & 0xFFFF) / 65535.0), &tangent_sign); + w[j * 4 + 0] = res.x; + w[j * 4 + 1] = res.y; + w[j * 4 + 2] = res.z; + w[j * 4 + 3] = tangent_sign; } ret[i] = arr; @@ -2861,18 +2867,12 @@ void RenderingServer::init() { GLOBAL_DEF("rendering/2d/shadow_atlas/size", 2048); - GLOBAL_DEF_RST_BASIC("rendering/vulkan/rendering/back_end", 0); - GLOBAL_DEF_RST_BASIC("rendering/vulkan/rendering/back_end.mobile", 1); - ProjectSettings::get_singleton()->set_custom_property_info("rendering/vulkan/rendering/back_end", - PropertyInfo(Variant::INT, - "rendering/vulkan/rendering/back_end", - PROPERTY_HINT_ENUM, "Forward Clustered (Supports Desktop Only),Forward Mobile (Supports Desktop and Mobile)")); // Already defined in RenderingDeviceVulkan::initialize which runs before this code. // We re-define them here just for doctool's sake. Make sure to keep default values in sync. - GLOBAL_DEF("rendering/vulkan/staging_buffer/block_size_kb", 256); - GLOBAL_DEF("rendering/vulkan/staging_buffer/max_size_mb", 128); - GLOBAL_DEF("rendering/vulkan/staging_buffer/texture_upload_region_size_px", 64); - GLOBAL_DEF("rendering/vulkan/descriptor_pools/max_descriptors_per_pool", 64); + GLOBAL_DEF("rendering/rendering_device/staging_buffer/block_size_kb", 256); + GLOBAL_DEF("rendering/rendering_device/staging_buffer/max_size_mb", 128); + GLOBAL_DEF("rendering/rendering_device/staging_buffer/texture_upload_region_size_px", 64); + GLOBAL_DEF("rendering/rendering_device/descriptor_pools/max_descriptors_per_pool", 64); GLOBAL_DEF("rendering/shader_compiler/shader_cache/enabled", true); GLOBAL_DEF("rendering/shader_compiler/shader_cache/compress", true); diff --git a/servers/rendering_server.h b/servers/rendering_server.h index 67ba407775..6885d80301 100644 --- a/servers/rendering_server.h +++ b/servers/rendering_server.h @@ -485,6 +485,12 @@ public: virtual void light_directional_set_blend_splits(RID p_light, bool p_enable) = 0; virtual void light_directional_set_sky_mode(RID p_light, LightDirectionalSkyMode p_mode) = 0; + // Shadow atlas + + virtual RID shadow_atlas_create() = 0; + virtual void shadow_atlas_set_size(RID p_atlas, int p_size, bool p_use_16_bits = true) = 0; + virtual void shadow_atlas_set_quadrant_subdivision(RID p_atlas, int p_quadrant, int p_subdivision) = 0; + virtual void directional_shadow_atlas_set_size(int p_size, bool p_16_bits = true) = 0; enum ShadowQuality { diff --git a/servers/text/text_server_extension.cpp b/servers/text/text_server_extension.cpp index ebd35b0f75..0e1069dcf4 100644 --- a/servers/text/text_server_extension.cpp +++ b/servers/text/text_server_extension.cpp @@ -31,288 +31,288 @@ #include "text_server_extension.h" void TextServerExtension::_bind_methods() { - GDVIRTUAL_BIND(has_feature, "feature"); - GDVIRTUAL_BIND(get_name); - GDVIRTUAL_BIND(get_features); + GDVIRTUAL_BIND(_has_feature, "feature"); + GDVIRTUAL_BIND(_get_name); + GDVIRTUAL_BIND(_get_features); - GDVIRTUAL_BIND(free_rid, "rid"); - GDVIRTUAL_BIND(has, "rid"); - GDVIRTUAL_BIND(load_support_data, "filename"); + GDVIRTUAL_BIND(_free_rid, "rid"); + GDVIRTUAL_BIND(_has, "rid"); + GDVIRTUAL_BIND(_load_support_data, "filename"); - GDVIRTUAL_BIND(get_support_data_filename); - GDVIRTUAL_BIND(get_support_data_info); - GDVIRTUAL_BIND(save_support_data, "filename"); + GDVIRTUAL_BIND(_get_support_data_filename); + GDVIRTUAL_BIND(_get_support_data_info); + GDVIRTUAL_BIND(_save_support_data, "filename"); - GDVIRTUAL_BIND(is_locale_right_to_left, "locale"); + GDVIRTUAL_BIND(_is_locale_right_to_left, "locale"); - GDVIRTUAL_BIND(name_to_tag, "name"); - GDVIRTUAL_BIND(tag_to_name, "tag"); + GDVIRTUAL_BIND(_name_to_tag, "name"); + GDVIRTUAL_BIND(_tag_to_name, "tag"); /* Font interface */ - GDVIRTUAL_BIND(create_font); + GDVIRTUAL_BIND(_create_font); - GDVIRTUAL_BIND(font_set_data, "font_rid", "data"); - GDVIRTUAL_BIND(font_set_data_ptr, "font_rid", "data_ptr", "data_size"); + GDVIRTUAL_BIND(_font_set_data, "font_rid", "data"); + GDVIRTUAL_BIND(_font_set_data_ptr, "font_rid", "data_ptr", "data_size"); - GDVIRTUAL_BIND(font_set_face_index, "font_rid", "face_index"); - GDVIRTUAL_BIND(font_get_face_index, "font_rid"); + GDVIRTUAL_BIND(_font_set_face_index, "font_rid", "face_index"); + GDVIRTUAL_BIND(_font_get_face_index, "font_rid"); - GDVIRTUAL_BIND(font_get_face_count, "font_rid"); + GDVIRTUAL_BIND(_font_get_face_count, "font_rid"); - GDVIRTUAL_BIND(font_set_style, "font_rid", "style"); - GDVIRTUAL_BIND(font_get_style, "font_rid"); + GDVIRTUAL_BIND(_font_set_style, "font_rid", "style"); + GDVIRTUAL_BIND(_font_get_style, "font_rid"); - GDVIRTUAL_BIND(font_set_name, "font_rid", "name"); - GDVIRTUAL_BIND(font_get_name, "font_rid"); + GDVIRTUAL_BIND(_font_set_name, "font_rid", "name"); + GDVIRTUAL_BIND(_font_get_name, "font_rid"); - GDVIRTUAL_BIND(font_set_style_name, "font_rid", "name_style"); - GDVIRTUAL_BIND(font_get_style_name, "font_rid"); + GDVIRTUAL_BIND(_font_set_style_name, "font_rid", "name_style"); + GDVIRTUAL_BIND(_font_get_style_name, "font_rid"); - GDVIRTUAL_BIND(font_set_antialiasing, "font_rid", "antialiasing"); - GDVIRTUAL_BIND(font_get_antialiasing, "font_rid"); + GDVIRTUAL_BIND(_font_set_antialiasing, "font_rid", "antialiasing"); + GDVIRTUAL_BIND(_font_get_antialiasing, "font_rid"); - GDVIRTUAL_BIND(font_set_generate_mipmaps, "font_rid", "generate_mipmaps"); - GDVIRTUAL_BIND(font_get_generate_mipmaps, "font_rid"); + GDVIRTUAL_BIND(_font_set_generate_mipmaps, "font_rid", "generate_mipmaps"); + GDVIRTUAL_BIND(_font_get_generate_mipmaps, "font_rid"); - GDVIRTUAL_BIND(font_set_multichannel_signed_distance_field, "font_rid", "msdf"); - GDVIRTUAL_BIND(font_is_multichannel_signed_distance_field, "font_rid"); + GDVIRTUAL_BIND(_font_set_multichannel_signed_distance_field, "font_rid", "msdf"); + GDVIRTUAL_BIND(_font_is_multichannel_signed_distance_field, "font_rid"); - GDVIRTUAL_BIND(font_set_msdf_pixel_range, "font_rid", "msdf_pixel_range"); - GDVIRTUAL_BIND(font_get_msdf_pixel_range, "font_rid"); + GDVIRTUAL_BIND(_font_set_msdf_pixel_range, "font_rid", "msdf_pixel_range"); + GDVIRTUAL_BIND(_font_get_msdf_pixel_range, "font_rid"); - GDVIRTUAL_BIND(font_set_msdf_size, "font_rid", "msdf_size"); - GDVIRTUAL_BIND(font_get_msdf_size, "font_rid"); + GDVIRTUAL_BIND(_font_set_msdf_size, "font_rid", "msdf_size"); + GDVIRTUAL_BIND(_font_get_msdf_size, "font_rid"); - GDVIRTUAL_BIND(font_set_fixed_size, "font_rid", "fixed_size"); - GDVIRTUAL_BIND(font_get_fixed_size, "font_rid"); + GDVIRTUAL_BIND(_font_set_fixed_size, "font_rid", "fixed_size"); + GDVIRTUAL_BIND(_font_get_fixed_size, "font_rid"); - GDVIRTUAL_BIND(font_set_force_autohinter, "font_rid", "force_autohinter"); - GDVIRTUAL_BIND(font_is_force_autohinter, "font_rid"); + GDVIRTUAL_BIND(_font_set_force_autohinter, "font_rid", "force_autohinter"); + GDVIRTUAL_BIND(_font_is_force_autohinter, "font_rid"); - GDVIRTUAL_BIND(font_set_hinting, "font_rid", "hinting"); - GDVIRTUAL_BIND(font_get_hinting, "font_rid"); + GDVIRTUAL_BIND(_font_set_hinting, "font_rid", "hinting"); + GDVIRTUAL_BIND(_font_get_hinting, "font_rid"); - GDVIRTUAL_BIND(font_set_subpixel_positioning, "font_rid", "subpixel_positioning"); - GDVIRTUAL_BIND(font_get_subpixel_positioning, "font_rid"); + GDVIRTUAL_BIND(_font_set_subpixel_positioning, "font_rid", "subpixel_positioning"); + GDVIRTUAL_BIND(_font_get_subpixel_positioning, "font_rid"); - GDVIRTUAL_BIND(font_set_embolden, "font_rid", "strength"); - GDVIRTUAL_BIND(font_get_embolden, "font_rid"); + GDVIRTUAL_BIND(_font_set_embolden, "font_rid", "strength"); + GDVIRTUAL_BIND(_font_get_embolden, "font_rid"); - GDVIRTUAL_BIND(font_set_transform, "font_rid", "transform"); - GDVIRTUAL_BIND(font_get_transform, "font_rid"); + GDVIRTUAL_BIND(_font_set_transform, "font_rid", "transform"); + GDVIRTUAL_BIND(_font_get_transform, "font_rid"); - GDVIRTUAL_BIND(font_set_variation_coordinates, "font_rid", "variation_coordinates"); - GDVIRTUAL_BIND(font_get_variation_coordinates, "font_rid"); + GDVIRTUAL_BIND(_font_set_variation_coordinates, "font_rid", "variation_coordinates"); + GDVIRTUAL_BIND(_font_get_variation_coordinates, "font_rid"); - GDVIRTUAL_BIND(font_set_oversampling, "font_rid", "oversampling"); - GDVIRTUAL_BIND(font_get_oversampling, "font_rid"); + GDVIRTUAL_BIND(_font_set_oversampling, "font_rid", "oversampling"); + GDVIRTUAL_BIND(_font_get_oversampling, "font_rid"); - GDVIRTUAL_BIND(font_get_size_cache_list, "font_rid"); - GDVIRTUAL_BIND(font_clear_size_cache, "font_rid"); - GDVIRTUAL_BIND(font_remove_size_cache, "font_rid", "size"); + GDVIRTUAL_BIND(_font_get_size_cache_list, "font_rid"); + GDVIRTUAL_BIND(_font_clear_size_cache, "font_rid"); + GDVIRTUAL_BIND(_font_remove_size_cache, "font_rid", "size"); - GDVIRTUAL_BIND(font_set_ascent, "font_rid", "size", "ascent"); - GDVIRTUAL_BIND(font_get_ascent, "font_rid", "size"); + GDVIRTUAL_BIND(_font_set_ascent, "font_rid", "size", "ascent"); + GDVIRTUAL_BIND(_font_get_ascent, "font_rid", "size"); - GDVIRTUAL_BIND(font_set_descent, "font_rid", "size", "descent"); - GDVIRTUAL_BIND(font_get_descent, "font_rid", "size"); + GDVIRTUAL_BIND(_font_set_descent, "font_rid", "size", "descent"); + GDVIRTUAL_BIND(_font_get_descent, "font_rid", "size"); - GDVIRTUAL_BIND(font_set_underline_position, "font_rid", "size", "underline_position"); - GDVIRTUAL_BIND(font_get_underline_position, "font_rid", "size"); + GDVIRTUAL_BIND(_font_set_underline_position, "font_rid", "size", "underline_position"); + GDVIRTUAL_BIND(_font_get_underline_position, "font_rid", "size"); - GDVIRTUAL_BIND(font_set_underline_thickness, "font_rid", "size", "underline_thickness"); - GDVIRTUAL_BIND(font_get_underline_thickness, "font_rid", "size"); + GDVIRTUAL_BIND(_font_set_underline_thickness, "font_rid", "size", "underline_thickness"); + GDVIRTUAL_BIND(_font_get_underline_thickness, "font_rid", "size"); - GDVIRTUAL_BIND(font_set_scale, "font_rid", "size", "scale"); - GDVIRTUAL_BIND(font_get_scale, "font_rid", "size"); + GDVIRTUAL_BIND(_font_set_scale, "font_rid", "size", "scale"); + GDVIRTUAL_BIND(_font_get_scale, "font_rid", "size"); - GDVIRTUAL_BIND(font_get_texture_count, "font_rid", "size"); - GDVIRTUAL_BIND(font_clear_textures, "font_rid", "size"); - GDVIRTUAL_BIND(font_remove_texture, "font_rid", "size", "texture_index"); + GDVIRTUAL_BIND(_font_get_texture_count, "font_rid", "size"); + GDVIRTUAL_BIND(_font_clear_textures, "font_rid", "size"); + GDVIRTUAL_BIND(_font_remove_texture, "font_rid", "size", "texture_index"); - GDVIRTUAL_BIND(font_set_texture_image, "font_rid", "size", "texture_index", "image"); - GDVIRTUAL_BIND(font_get_texture_image, "font_rid", "size", "texture_index"); + GDVIRTUAL_BIND(_font_set_texture_image, "font_rid", "size", "texture_index", "image"); + GDVIRTUAL_BIND(_font_get_texture_image, "font_rid", "size", "texture_index"); - GDVIRTUAL_BIND(font_set_texture_offsets, "font_rid", "size", "texture_index", "offset"); - GDVIRTUAL_BIND(font_get_texture_offsets, "font_rid", "size", "texture_index"); + GDVIRTUAL_BIND(_font_set_texture_offsets, "font_rid", "size", "texture_index", "offset"); + GDVIRTUAL_BIND(_font_get_texture_offsets, "font_rid", "size", "texture_index"); - GDVIRTUAL_BIND(font_get_glyph_list, "font_rid", "size"); - GDVIRTUAL_BIND(font_clear_glyphs, "font_rid", "size"); - GDVIRTUAL_BIND(font_remove_glyph, "font_rid", "size", "glyph"); + GDVIRTUAL_BIND(_font_get_glyph_list, "font_rid", "size"); + GDVIRTUAL_BIND(_font_clear_glyphs, "font_rid", "size"); + GDVIRTUAL_BIND(_font_remove_glyph, "font_rid", "size", "glyph"); - GDVIRTUAL_BIND(font_get_glyph_advance, "font_rid", "size", "glyph"); - GDVIRTUAL_BIND(font_set_glyph_advance, "font_rid", "size", "glyph", "advance"); + GDVIRTUAL_BIND(_font_get_glyph_advance, "font_rid", "size", "glyph"); + GDVIRTUAL_BIND(_font_set_glyph_advance, "font_rid", "size", "glyph", "advance"); - GDVIRTUAL_BIND(font_get_glyph_offset, "font_rid", "size", "glyph"); - GDVIRTUAL_BIND(font_set_glyph_offset, "font_rid", "size", "glyph", "offset"); + GDVIRTUAL_BIND(_font_get_glyph_offset, "font_rid", "size", "glyph"); + GDVIRTUAL_BIND(_font_set_glyph_offset, "font_rid", "size", "glyph", "offset"); - GDVIRTUAL_BIND(font_get_glyph_size, "font_rid", "size", "glyph"); - GDVIRTUAL_BIND(font_set_glyph_size, "font_rid", "size", "glyph", "gl_size"); + GDVIRTUAL_BIND(_font_get_glyph_size, "font_rid", "size", "glyph"); + GDVIRTUAL_BIND(_font_set_glyph_size, "font_rid", "size", "glyph", "gl_size"); - GDVIRTUAL_BIND(font_get_glyph_uv_rect, "font_rid", "size", "glyph"); - GDVIRTUAL_BIND(font_set_glyph_uv_rect, "font_rid", "size", "glyph", "uv_rect"); + GDVIRTUAL_BIND(_font_get_glyph_uv_rect, "font_rid", "size", "glyph"); + GDVIRTUAL_BIND(_font_set_glyph_uv_rect, "font_rid", "size", "glyph", "uv_rect"); - GDVIRTUAL_BIND(font_get_glyph_texture_idx, "font_rid", "size", "glyph"); - GDVIRTUAL_BIND(font_set_glyph_texture_idx, "font_rid", "size", "glyph", "texture_idx"); + GDVIRTUAL_BIND(_font_get_glyph_texture_idx, "font_rid", "size", "glyph"); + GDVIRTUAL_BIND(_font_set_glyph_texture_idx, "font_rid", "size", "glyph", "texture_idx"); - GDVIRTUAL_BIND(font_get_glyph_texture_rid, "font_rid", "size", "glyph"); - GDVIRTUAL_BIND(font_get_glyph_texture_size, "font_rid", "size", "glyph"); + GDVIRTUAL_BIND(_font_get_glyph_texture_rid, "font_rid", "size", "glyph"); + GDVIRTUAL_BIND(_font_get_glyph_texture_size, "font_rid", "size", "glyph"); - GDVIRTUAL_BIND(font_get_glyph_contours, "font_rid", "size", "index"); + GDVIRTUAL_BIND(_font_get_glyph_contours, "font_rid", "size", "index"); - GDVIRTUAL_BIND(font_get_kerning_list, "font_rid", "size"); - GDVIRTUAL_BIND(font_clear_kerning_map, "font_rid", "size"); - GDVIRTUAL_BIND(font_remove_kerning, "font_rid", "size", "glyph_pair"); + GDVIRTUAL_BIND(_font_get_kerning_list, "font_rid", "size"); + GDVIRTUAL_BIND(_font_clear_kerning_map, "font_rid", "size"); + GDVIRTUAL_BIND(_font_remove_kerning, "font_rid", "size", "glyph_pair"); - GDVIRTUAL_BIND(font_set_kerning, "font_rid", "size", "glyph_pair", "kerning"); - GDVIRTUAL_BIND(font_get_kerning, "font_rid", "size", "glyph_pair"); + GDVIRTUAL_BIND(_font_set_kerning, "font_rid", "size", "glyph_pair", "kerning"); + GDVIRTUAL_BIND(_font_get_kerning, "font_rid", "size", "glyph_pair"); - GDVIRTUAL_BIND(font_get_glyph_index, "font_rid", "size", "char", "variation_selector"); + GDVIRTUAL_BIND(_font_get_glyph_index, "font_rid", "size", "char", "variation_selector"); - GDVIRTUAL_BIND(font_has_char, "font_rid", "char"); - GDVIRTUAL_BIND(font_get_supported_chars, "font_rid"); + GDVIRTUAL_BIND(_font_has_char, "font_rid", "char"); + GDVIRTUAL_BIND(_font_get_supported_chars, "font_rid"); - GDVIRTUAL_BIND(font_render_range, "font_rid", "size", "start", "end"); - GDVIRTUAL_BIND(font_render_glyph, "font_rid", "size", "index"); + GDVIRTUAL_BIND(_font_render_range, "font_rid", "size", "start", "end"); + GDVIRTUAL_BIND(_font_render_glyph, "font_rid", "size", "index"); - GDVIRTUAL_BIND(font_draw_glyph, "font_rid", "canvas", "size", "pos", "index", "color"); - GDVIRTUAL_BIND(font_draw_glyph_outline, "font_rid", "canvas", "size", "outline_size", "pos", "index", "color"); + GDVIRTUAL_BIND(_font_draw_glyph, "font_rid", "canvas", "size", "pos", "index", "color"); + GDVIRTUAL_BIND(_font_draw_glyph_outline, "font_rid", "canvas", "size", "outline_size", "pos", "index", "color"); - GDVIRTUAL_BIND(font_is_language_supported, "font_rid", "language"); - GDVIRTUAL_BIND(font_set_language_support_override, "font_rid", "language", "supported"); - GDVIRTUAL_BIND(font_get_language_support_override, "font_rid", "language"); - GDVIRTUAL_BIND(font_remove_language_support_override, "font_rid", "language"); - GDVIRTUAL_BIND(font_get_language_support_overrides, "font_rid"); + GDVIRTUAL_BIND(_font_is_language_supported, "font_rid", "language"); + GDVIRTUAL_BIND(_font_set_language_support_override, "font_rid", "language", "supported"); + GDVIRTUAL_BIND(_font_get_language_support_override, "font_rid", "language"); + GDVIRTUAL_BIND(_font_remove_language_support_override, "font_rid", "language"); + GDVIRTUAL_BIND(_font_get_language_support_overrides, "font_rid"); - GDVIRTUAL_BIND(font_is_script_supported, "font_rid", "script"); - GDVIRTUAL_BIND(font_set_script_support_override, "font_rid", "script", "supported"); - GDVIRTUAL_BIND(font_get_script_support_override, "font_rid", "script"); - GDVIRTUAL_BIND(font_remove_script_support_override, "font_rid", "script"); - GDVIRTUAL_BIND(font_get_script_support_overrides, "font_rid"); + GDVIRTUAL_BIND(_font_is_script_supported, "font_rid", "script"); + GDVIRTUAL_BIND(_font_set_script_support_override, "font_rid", "script", "supported"); + GDVIRTUAL_BIND(_font_get_script_support_override, "font_rid", "script"); + GDVIRTUAL_BIND(_font_remove_script_support_override, "font_rid", "script"); + GDVIRTUAL_BIND(_font_get_script_support_overrides, "font_rid"); - GDVIRTUAL_BIND(font_set_opentype_feature_overrides, "font_rid", "overrides"); - GDVIRTUAL_BIND(font_get_opentype_feature_overrides, "font_rid"); + GDVIRTUAL_BIND(_font_set_opentype_feature_overrides, "font_rid", "overrides"); + GDVIRTUAL_BIND(_font_get_opentype_feature_overrides, "font_rid"); - GDVIRTUAL_BIND(font_supported_feature_list, "font_rid"); - GDVIRTUAL_BIND(font_supported_variation_list, "font_rid"); + GDVIRTUAL_BIND(_font_supported_feature_list, "font_rid"); + GDVIRTUAL_BIND(_font_supported_variation_list, "font_rid"); - GDVIRTUAL_BIND(font_get_global_oversampling); - GDVIRTUAL_BIND(font_set_global_oversampling, "oversampling"); + GDVIRTUAL_BIND(_font_get_global_oversampling); + GDVIRTUAL_BIND(_font_set_global_oversampling, "oversampling"); - GDVIRTUAL_BIND(get_hex_code_box_size, "size", "index"); - GDVIRTUAL_BIND(draw_hex_code_box, "canvas", "size", "pos", "index", "color"); + GDVIRTUAL_BIND(_get_hex_code_box_size, "size", "index"); + GDVIRTUAL_BIND(_draw_hex_code_box, "canvas", "size", "pos", "index", "color"); /* Shaped text buffer interface */ - GDVIRTUAL_BIND(create_shaped_text, "direction", "orientation"); + GDVIRTUAL_BIND(_create_shaped_text, "direction", "orientation"); - GDVIRTUAL_BIND(shaped_text_clear, "shaped"); + GDVIRTUAL_BIND(_shaped_text_clear, "shaped"); - GDVIRTUAL_BIND(shaped_text_set_direction, "shaped", "direction"); - GDVIRTUAL_BIND(shaped_text_get_direction, "shaped"); - GDVIRTUAL_BIND(shaped_text_get_inferred_direction, "shaped"); + GDVIRTUAL_BIND(_shaped_text_set_direction, "shaped", "direction"); + GDVIRTUAL_BIND(_shaped_text_get_direction, "shaped"); + GDVIRTUAL_BIND(_shaped_text_get_inferred_direction, "shaped"); - GDVIRTUAL_BIND(shaped_text_set_bidi_override, "shaped", "override"); + GDVIRTUAL_BIND(_shaped_text_set_bidi_override, "shaped", "override"); - GDVIRTUAL_BIND(shaped_text_set_custom_punctuation, "shaped", "punct"); - GDVIRTUAL_BIND(shaped_text_get_custom_punctuation, "shaped"); + GDVIRTUAL_BIND(_shaped_text_set_custom_punctuation, "shaped", "punct"); + GDVIRTUAL_BIND(_shaped_text_get_custom_punctuation, "shaped"); - GDVIRTUAL_BIND(shaped_text_set_orientation, "shaped", "orientation"); - GDVIRTUAL_BIND(shaped_text_get_orientation, "shaped"); + GDVIRTUAL_BIND(_shaped_text_set_orientation, "shaped", "orientation"); + GDVIRTUAL_BIND(_shaped_text_get_orientation, "shaped"); - GDVIRTUAL_BIND(shaped_text_set_preserve_invalid, "shaped", "enabled"); - GDVIRTUAL_BIND(shaped_text_get_preserve_invalid, "shaped"); + GDVIRTUAL_BIND(_shaped_text_set_preserve_invalid, "shaped", "enabled"); + GDVIRTUAL_BIND(_shaped_text_get_preserve_invalid, "shaped"); - GDVIRTUAL_BIND(shaped_text_set_preserve_control, "shaped", "enabled"); - GDVIRTUAL_BIND(shaped_text_get_preserve_control, "shaped"); + GDVIRTUAL_BIND(_shaped_text_set_preserve_control, "shaped", "enabled"); + GDVIRTUAL_BIND(_shaped_text_get_preserve_control, "shaped"); - GDVIRTUAL_BIND(shaped_text_set_spacing, "shaped", "spacing", "value"); - GDVIRTUAL_BIND(shaped_text_get_spacing, "shaped", "spacing"); + GDVIRTUAL_BIND(_shaped_text_set_spacing, "shaped", "spacing", "value"); + GDVIRTUAL_BIND(_shaped_text_get_spacing, "shaped", "spacing"); - GDVIRTUAL_BIND(shaped_text_add_string, "shaped", "text", "fonts", "size", "opentype_features", "language", "meta"); - GDVIRTUAL_BIND(shaped_text_add_object, "shaped", "key", "size", "inline_align", "length"); - GDVIRTUAL_BIND(shaped_text_resize_object, "shaped", "key", "size", "inline_align"); + GDVIRTUAL_BIND(_shaped_text_add_string, "shaped", "text", "fonts", "size", "opentype_features", "language", "meta"); + GDVIRTUAL_BIND(_shaped_text_add_object, "shaped", "key", "size", "inline_align", "length"); + GDVIRTUAL_BIND(_shaped_text_resize_object, "shaped", "key", "size", "inline_align"); - GDVIRTUAL_BIND(shaped_get_span_count, "shaped"); - GDVIRTUAL_BIND(shaped_get_span_meta, "shaped", "index"); - GDVIRTUAL_BIND(shaped_set_span_update_font, "shaped", "index", "fonts", "size", "opentype_features"); + GDVIRTUAL_BIND(_shaped_get_span_count, "shaped"); + GDVIRTUAL_BIND(_shaped_get_span_meta, "shaped", "index"); + GDVIRTUAL_BIND(_shaped_set_span_update_font, "shaped", "index", "fonts", "size", "opentype_features"); - GDVIRTUAL_BIND(shaped_text_substr, "shaped", "start", "length"); - GDVIRTUAL_BIND(shaped_text_get_parent, "shaped"); + GDVIRTUAL_BIND(_shaped_text_substr, "shaped", "start", "length"); + GDVIRTUAL_BIND(_shaped_text_get_parent, "shaped"); - GDVIRTUAL_BIND(shaped_text_fit_to_width, "shaped", "width", "jst_flags"); - GDVIRTUAL_BIND(shaped_text_tab_align, "shaped", "tab_stops"); + GDVIRTUAL_BIND(_shaped_text_fit_to_width, "shaped", "width", "jst_flags"); + GDVIRTUAL_BIND(_shaped_text_tab_align, "shaped", "tab_stops"); - GDVIRTUAL_BIND(shaped_text_shape, "shaped"); - GDVIRTUAL_BIND(shaped_text_update_breaks, "shaped"); - GDVIRTUAL_BIND(shaped_text_update_justification_ops, "shaped"); + GDVIRTUAL_BIND(_shaped_text_shape, "shaped"); + GDVIRTUAL_BIND(_shaped_text_update_breaks, "shaped"); + GDVIRTUAL_BIND(_shaped_text_update_justification_ops, "shaped"); - GDVIRTUAL_BIND(shaped_text_is_ready, "shaped"); + GDVIRTUAL_BIND(_shaped_text_is_ready, "shaped"); - GDVIRTUAL_BIND(shaped_text_get_glyphs, "shaped"); - GDVIRTUAL_BIND(shaped_text_sort_logical, "shaped"); - GDVIRTUAL_BIND(shaped_text_get_glyph_count, "shaped"); + GDVIRTUAL_BIND(_shaped_text_get_glyphs, "shaped"); + GDVIRTUAL_BIND(_shaped_text_sort_logical, "shaped"); + GDVIRTUAL_BIND(_shaped_text_get_glyph_count, "shaped"); - GDVIRTUAL_BIND(shaped_text_get_range, "shaped"); + GDVIRTUAL_BIND(_shaped_text_get_range, "shaped"); - GDVIRTUAL_BIND(shaped_text_get_line_breaks_adv, "shaped", "width", "start", "once", "break_flags"); - GDVIRTUAL_BIND(shaped_text_get_line_breaks, "shaped", "width", "start", "break_flags"); - GDVIRTUAL_BIND(shaped_text_get_word_breaks, "shaped", "grapheme_flags"); + GDVIRTUAL_BIND(_shaped_text_get_line_breaks_adv, "shaped", "width", "start", "once", "break_flags"); + GDVIRTUAL_BIND(_shaped_text_get_line_breaks, "shaped", "width", "start", "break_flags"); + GDVIRTUAL_BIND(_shaped_text_get_word_breaks, "shaped", "grapheme_flags"); - GDVIRTUAL_BIND(shaped_text_get_trim_pos, "shaped"); - GDVIRTUAL_BIND(shaped_text_get_ellipsis_pos, "shaped"); - GDVIRTUAL_BIND(shaped_text_get_ellipsis_glyph_count, "shaped"); - GDVIRTUAL_BIND(shaped_text_get_ellipsis_glyphs, "shaped"); + GDVIRTUAL_BIND(_shaped_text_get_trim_pos, "shaped"); + GDVIRTUAL_BIND(_shaped_text_get_ellipsis_pos, "shaped"); + GDVIRTUAL_BIND(_shaped_text_get_ellipsis_glyph_count, "shaped"); + GDVIRTUAL_BIND(_shaped_text_get_ellipsis_glyphs, "shaped"); - GDVIRTUAL_BIND(shaped_text_overrun_trim_to_width, "shaped", "width", "trim_flags"); + GDVIRTUAL_BIND(_shaped_text_overrun_trim_to_width, "shaped", "width", "trim_flags"); - GDVIRTUAL_BIND(shaped_text_get_objects, "shaped"); - GDVIRTUAL_BIND(shaped_text_get_object_rect, "shaped", "key"); + GDVIRTUAL_BIND(_shaped_text_get_objects, "shaped"); + GDVIRTUAL_BIND(_shaped_text_get_object_rect, "shaped", "key"); - GDVIRTUAL_BIND(shaped_text_get_size, "shaped"); - GDVIRTUAL_BIND(shaped_text_get_ascent, "shaped"); - GDVIRTUAL_BIND(shaped_text_get_descent, "shaped"); - GDVIRTUAL_BIND(shaped_text_get_width, "shaped"); - GDVIRTUAL_BIND(shaped_text_get_underline_position, "shaped"); - GDVIRTUAL_BIND(shaped_text_get_underline_thickness, "shaped"); + GDVIRTUAL_BIND(_shaped_text_get_size, "shaped"); + GDVIRTUAL_BIND(_shaped_text_get_ascent, "shaped"); + GDVIRTUAL_BIND(_shaped_text_get_descent, "shaped"); + GDVIRTUAL_BIND(_shaped_text_get_width, "shaped"); + GDVIRTUAL_BIND(_shaped_text_get_underline_position, "shaped"); + GDVIRTUAL_BIND(_shaped_text_get_underline_thickness, "shaped"); - GDVIRTUAL_BIND(shaped_text_get_dominant_direction_in_range, "shaped", "start", "end"); + GDVIRTUAL_BIND(_shaped_text_get_dominant_direction_in_range, "shaped", "start", "end"); - GDVIRTUAL_BIND(shaped_text_get_carets, "shaped", "position", "caret"); - GDVIRTUAL_BIND(shaped_text_get_selection, "shaped", "start", "end"); + GDVIRTUAL_BIND(_shaped_text_get_carets, "shaped", "position", "caret"); + GDVIRTUAL_BIND(_shaped_text_get_selection, "shaped", "start", "end"); - GDVIRTUAL_BIND(shaped_text_hit_test_grapheme, "shaped", "coord"); - GDVIRTUAL_BIND(shaped_text_hit_test_position, "shaped", "coord"); + GDVIRTUAL_BIND(_shaped_text_hit_test_grapheme, "shaped", "coord"); + GDVIRTUAL_BIND(_shaped_text_hit_test_position, "shaped", "coord"); - GDVIRTUAL_BIND(shaped_text_draw, "shaped", "canvas", "pos", "clip_l", "clip_r", "color"); - GDVIRTUAL_BIND(shaped_text_draw_outline, "shaped", "canvas", "pos", "clip_l", "clip_r", "outline_size", "color"); + GDVIRTUAL_BIND(_shaped_text_draw, "shaped", "canvas", "pos", "clip_l", "clip_r", "color"); + GDVIRTUAL_BIND(_shaped_text_draw_outline, "shaped", "canvas", "pos", "clip_l", "clip_r", "outline_size", "color"); - GDVIRTUAL_BIND(shaped_text_get_grapheme_bounds, "shaped", "pos"); - GDVIRTUAL_BIND(shaped_text_next_grapheme_pos, "shaped", "pos"); - GDVIRTUAL_BIND(shaped_text_prev_grapheme_pos, "shaped", "pos"); + GDVIRTUAL_BIND(_shaped_text_get_grapheme_bounds, "shaped", "pos"); + GDVIRTUAL_BIND(_shaped_text_next_grapheme_pos, "shaped", "pos"); + GDVIRTUAL_BIND(_shaped_text_prev_grapheme_pos, "shaped", "pos"); - GDVIRTUAL_BIND(format_number, "string", "language"); - GDVIRTUAL_BIND(parse_number, "string", "language"); - GDVIRTUAL_BIND(percent_sign, "language"); + GDVIRTUAL_BIND(_format_number, "string", "language"); + GDVIRTUAL_BIND(_parse_number, "string", "language"); + GDVIRTUAL_BIND(_percent_sign, "language"); - GDVIRTUAL_BIND(strip_diacritics, "string"); - GDVIRTUAL_BIND(is_valid_identifier, "string"); + GDVIRTUAL_BIND(_strip_diacritics, "string"); + GDVIRTUAL_BIND(_is_valid_identifier, "string"); - GDVIRTUAL_BIND(string_get_word_breaks, "string", "language"); + GDVIRTUAL_BIND(_string_get_word_breaks, "string", "language"); - GDVIRTUAL_BIND(is_confusable, "string", "dict"); - GDVIRTUAL_BIND(spoof_check, "string"); + GDVIRTUAL_BIND(_is_confusable, "string", "dict"); + GDVIRTUAL_BIND(_spoof_check, "string"); - GDVIRTUAL_BIND(string_to_upper, "string", "language"); - GDVIRTUAL_BIND(string_to_lower, "string", "language"); + GDVIRTUAL_BIND(_string_to_upper, "string", "language"); + GDVIRTUAL_BIND(_string_to_lower, "string", "language"); - GDVIRTUAL_BIND(parse_structured_text, "parser_type", "args", "text"); + GDVIRTUAL_BIND(_parse_structured_text, "parser_type", "args", "text"); } bool TextServerExtension::has_feature(Feature p_feature) const { bool ret; - if (GDVIRTUAL_CALL(has_feature, p_feature, ret)) { + if (GDVIRTUAL_CALL(_has_feature, p_feature, ret)) { return ret; } return false; @@ -320,7 +320,7 @@ bool TextServerExtension::has_feature(Feature p_feature) const { String TextServerExtension::get_name() const { String ret; - if (GDVIRTUAL_CALL(get_name, ret)) { + if (GDVIRTUAL_CALL(_get_name, ret)) { return ret; } return "Unknown"; @@ -328,19 +328,19 @@ String TextServerExtension::get_name() const { int64_t TextServerExtension::get_features() const { int64_t ret; - if (GDVIRTUAL_CALL(get_features, ret)) { + if (GDVIRTUAL_CALL(_get_features, ret)) { return ret; } return 0; } void TextServerExtension::free_rid(const RID &p_rid) { - GDVIRTUAL_CALL(free_rid, p_rid); + GDVIRTUAL_CALL(_free_rid, p_rid); } bool TextServerExtension::has(const RID &p_rid) { bool ret; - if (GDVIRTUAL_CALL(has, p_rid, ret)) { + if (GDVIRTUAL_CALL(_has, p_rid, ret)) { return ret; } return false; @@ -348,7 +348,7 @@ bool TextServerExtension::has(const RID &p_rid) { bool TextServerExtension::load_support_data(const String &p_filename) { bool ret; - if (GDVIRTUAL_CALL(load_support_data, p_filename, ret)) { + if (GDVIRTUAL_CALL(_load_support_data, p_filename, ret)) { return ret; } return false; @@ -356,7 +356,7 @@ bool TextServerExtension::load_support_data(const String &p_filename) { String TextServerExtension::get_support_data_filename() const { String ret; - if (GDVIRTUAL_CALL(get_support_data_filename, ret)) { + if (GDVIRTUAL_CALL(_get_support_data_filename, ret)) { return ret; } return String(); @@ -364,7 +364,7 @@ String TextServerExtension::get_support_data_filename() const { String TextServerExtension::get_support_data_info() const { String ret; - if (GDVIRTUAL_CALL(get_support_data_info, ret)) { + if (GDVIRTUAL_CALL(_get_support_data_info, ret)) { return ret; } return String(); @@ -372,7 +372,7 @@ String TextServerExtension::get_support_data_info() const { bool TextServerExtension::save_support_data(const String &p_filename) const { bool ret; - if (GDVIRTUAL_CALL(save_support_data, p_filename, ret)) { + if (GDVIRTUAL_CALL(_save_support_data, p_filename, ret)) { return ret; } return false; @@ -380,7 +380,7 @@ bool TextServerExtension::save_support_data(const String &p_filename) const { bool TextServerExtension::is_locale_right_to_left(const String &p_locale) const { bool ret; - if (GDVIRTUAL_CALL(is_locale_right_to_left, p_locale, ret)) { + if (GDVIRTUAL_CALL(_is_locale_right_to_left, p_locale, ret)) { return ret; } return false; @@ -388,7 +388,7 @@ bool TextServerExtension::is_locale_right_to_left(const String &p_locale) const int64_t TextServerExtension::name_to_tag(const String &p_name) const { int64_t ret; - if (GDVIRTUAL_CALL(name_to_tag, p_name, ret)) { + if (GDVIRTUAL_CALL(_name_to_tag, p_name, ret)) { return ret; } return 0; @@ -396,7 +396,7 @@ int64_t TextServerExtension::name_to_tag(const String &p_name) const { String TextServerExtension::tag_to_name(int64_t p_tag) const { String ret; - if (GDVIRTUAL_CALL(tag_to_name, p_tag, ret)) { + if (GDVIRTUAL_CALL(_tag_to_name, p_tag, ret)) { return ret; } return ""; @@ -408,27 +408,27 @@ String TextServerExtension::tag_to_name(int64_t p_tag) const { RID TextServerExtension::create_font() { RID ret; - if (GDVIRTUAL_CALL(create_font, ret)) { + if (GDVIRTUAL_CALL(_create_font, ret)) { return ret; } return RID(); } void TextServerExtension::font_set_data(const RID &p_font_rid, const PackedByteArray &p_data) { - GDVIRTUAL_CALL(font_set_data, p_font_rid, p_data); + GDVIRTUAL_CALL(_font_set_data, p_font_rid, p_data); } void TextServerExtension::font_set_data_ptr(const RID &p_font_rid, const uint8_t *p_data_ptr, int64_t p_data_size) { - GDVIRTUAL_CALL(font_set_data_ptr, p_font_rid, p_data_ptr, p_data_size); + GDVIRTUAL_CALL(_font_set_data_ptr, p_font_rid, p_data_ptr, p_data_size); } void TextServerExtension::font_set_face_index(const RID &p_font_rid, int64_t p_index) { - GDVIRTUAL_CALL(font_set_face_index, p_font_rid, p_index); + GDVIRTUAL_CALL(_font_set_face_index, p_font_rid, p_index); } int64_t TextServerExtension::font_get_face_index(const RID &p_font_rid) const { int64_t ret; - if (GDVIRTUAL_CALL(font_get_face_index, p_font_rid, ret)) { + if (GDVIRTUAL_CALL(_font_get_face_index, p_font_rid, ret)) { return ret; } return 0; @@ -436,199 +436,199 @@ int64_t TextServerExtension::font_get_face_index(const RID &p_font_rid) const { int64_t TextServerExtension::font_get_face_count(const RID &p_font_rid) const { int64_t ret; - if (GDVIRTUAL_CALL(font_get_face_count, p_font_rid, ret)) { + if (GDVIRTUAL_CALL(_font_get_face_count, p_font_rid, ret)) { return ret; } return 0; } void TextServerExtension::font_set_style(const RID &p_font_rid, BitField<TextServer::FontStyle> p_style) { - GDVIRTUAL_CALL(font_set_style, p_font_rid, p_style); + GDVIRTUAL_CALL(_font_set_style, p_font_rid, p_style); } BitField<TextServer::FontStyle> TextServerExtension::font_get_style(const RID &p_font_rid) const { BitField<TextServer::FontStyle> ret = 0; - if (GDVIRTUAL_CALL(font_get_style, p_font_rid, ret)) { + if (GDVIRTUAL_CALL(_font_get_style, p_font_rid, ret)) { return ret; } return 0; } void TextServerExtension::font_set_style_name(const RID &p_font_rid, const String &p_name) { - GDVIRTUAL_CALL(font_set_style_name, p_font_rid, p_name); + GDVIRTUAL_CALL(_font_set_style_name, p_font_rid, p_name); } String TextServerExtension::font_get_style_name(const RID &p_font_rid) const { String ret; - if (GDVIRTUAL_CALL(font_get_style_name, p_font_rid, ret)) { + if (GDVIRTUAL_CALL(_font_get_style_name, p_font_rid, ret)) { return ret; } return String(); } void TextServerExtension::font_set_name(const RID &p_font_rid, const String &p_name) { - GDVIRTUAL_CALL(font_set_name, p_font_rid, p_name); + GDVIRTUAL_CALL(_font_set_name, p_font_rid, p_name); } String TextServerExtension::font_get_name(const RID &p_font_rid) const { String ret; - if (GDVIRTUAL_CALL(font_get_name, p_font_rid, ret)) { + if (GDVIRTUAL_CALL(_font_get_name, p_font_rid, ret)) { return ret; } return String(); } -void TextServerExtension::font_set_antialiasing(RID p_font_rid, TextServer::FontAntialiasing p_antialiasing) { - GDVIRTUAL_CALL(font_set_antialiasing, p_font_rid, p_antialiasing); +void TextServerExtension::font_set_antialiasing(const RID &p_font_rid, TextServer::FontAntialiasing p_antialiasing) { + GDVIRTUAL_CALL(_font_set_antialiasing, p_font_rid, p_antialiasing); } -TextServer::FontAntialiasing TextServerExtension::font_get_antialiasing(RID p_font_rid) const { +TextServer::FontAntialiasing TextServerExtension::font_get_antialiasing(const RID &p_font_rid) const { TextServer::FontAntialiasing ret; - if (GDVIRTUAL_CALL(font_get_antialiasing, p_font_rid, ret)) { + if (GDVIRTUAL_CALL(_font_get_antialiasing, p_font_rid, ret)) { return ret; } return TextServer::FONT_ANTIALIASING_NONE; } void TextServerExtension::font_set_generate_mipmaps(const RID &p_font_rid, bool p_generate_mipmaps) { - GDVIRTUAL_CALL(font_set_generate_mipmaps, p_font_rid, p_generate_mipmaps); + GDVIRTUAL_CALL(_font_set_generate_mipmaps, p_font_rid, p_generate_mipmaps); } bool TextServerExtension::font_get_generate_mipmaps(const RID &p_font_rid) const { bool ret; - if (GDVIRTUAL_CALL(font_get_generate_mipmaps, p_font_rid, ret)) { + if (GDVIRTUAL_CALL(_font_get_generate_mipmaps, p_font_rid, ret)) { return ret; } return false; } void TextServerExtension::font_set_multichannel_signed_distance_field(const RID &p_font_rid, bool p_msdf) { - GDVIRTUAL_CALL(font_set_multichannel_signed_distance_field, p_font_rid, p_msdf); + GDVIRTUAL_CALL(_font_set_multichannel_signed_distance_field, p_font_rid, p_msdf); } bool TextServerExtension::font_is_multichannel_signed_distance_field(const RID &p_font_rid) const { bool ret; - if (GDVIRTUAL_CALL(font_is_multichannel_signed_distance_field, p_font_rid, ret)) { + if (GDVIRTUAL_CALL(_font_is_multichannel_signed_distance_field, p_font_rid, ret)) { return ret; } return false; } void TextServerExtension::font_set_msdf_pixel_range(const RID &p_font_rid, int64_t p_msdf_pixel_range) { - GDVIRTUAL_CALL(font_set_msdf_pixel_range, p_font_rid, p_msdf_pixel_range); + GDVIRTUAL_CALL(_font_set_msdf_pixel_range, p_font_rid, p_msdf_pixel_range); } int64_t TextServerExtension::font_get_msdf_pixel_range(const RID &p_font_rid) const { int64_t ret; - if (GDVIRTUAL_CALL(font_get_msdf_pixel_range, p_font_rid, ret)) { + if (GDVIRTUAL_CALL(_font_get_msdf_pixel_range, p_font_rid, ret)) { return ret; } return 0; } void TextServerExtension::font_set_msdf_size(const RID &p_font_rid, int64_t p_msdf_size) { - GDVIRTUAL_CALL(font_set_msdf_size, p_font_rid, p_msdf_size); + GDVIRTUAL_CALL(_font_set_msdf_size, p_font_rid, p_msdf_size); } int64_t TextServerExtension::font_get_msdf_size(const RID &p_font_rid) const { int64_t ret; - if (GDVIRTUAL_CALL(font_get_msdf_size, p_font_rid, ret)) { + if (GDVIRTUAL_CALL(_font_get_msdf_size, p_font_rid, ret)) { return ret; } return 0; } void TextServerExtension::font_set_fixed_size(const RID &p_font_rid, int64_t p_fixed_size) { - GDVIRTUAL_CALL(font_set_fixed_size, p_font_rid, p_fixed_size); + GDVIRTUAL_CALL(_font_set_fixed_size, p_font_rid, p_fixed_size); } int64_t TextServerExtension::font_get_fixed_size(const RID &p_font_rid) const { int64_t ret; - if (GDVIRTUAL_CALL(font_get_fixed_size, p_font_rid, ret)) { + if (GDVIRTUAL_CALL(_font_get_fixed_size, p_font_rid, ret)) { return ret; } return 0; } void TextServerExtension::font_set_force_autohinter(const RID &p_font_rid, bool p_force_autohinter) { - GDVIRTUAL_CALL(font_set_force_autohinter, p_font_rid, p_force_autohinter); + GDVIRTUAL_CALL(_font_set_force_autohinter, p_font_rid, p_force_autohinter); } bool TextServerExtension::font_is_force_autohinter(const RID &p_font_rid) const { bool ret; - if (GDVIRTUAL_CALL(font_is_force_autohinter, p_font_rid, ret)) { + if (GDVIRTUAL_CALL(_font_is_force_autohinter, p_font_rid, ret)) { return ret; } return false; } void TextServerExtension::font_set_hinting(const RID &p_font_rid, TextServer::Hinting p_hinting) { - GDVIRTUAL_CALL(font_set_hinting, p_font_rid, p_hinting); + GDVIRTUAL_CALL(_font_set_hinting, p_font_rid, p_hinting); } TextServer::Hinting TextServerExtension::font_get_hinting(const RID &p_font_rid) const { TextServer::Hinting ret; - if (GDVIRTUAL_CALL(font_get_hinting, p_font_rid, ret)) { + if (GDVIRTUAL_CALL(_font_get_hinting, p_font_rid, ret)) { return (TextServer::Hinting)ret; } return TextServer::Hinting::HINTING_NONE; } void TextServerExtension::font_set_subpixel_positioning(const RID &p_font_rid, TextServer::SubpixelPositioning p_subpixel) { - GDVIRTUAL_CALL(font_set_subpixel_positioning, p_font_rid, p_subpixel); + GDVIRTUAL_CALL(_font_set_subpixel_positioning, p_font_rid, p_subpixel); } TextServer::SubpixelPositioning TextServerExtension::font_get_subpixel_positioning(const RID &p_font_rid) const { TextServer::SubpixelPositioning ret; - if (GDVIRTUAL_CALL(font_get_subpixel_positioning, p_font_rid, ret)) { + if (GDVIRTUAL_CALL(_font_get_subpixel_positioning, p_font_rid, ret)) { return (TextServer::SubpixelPositioning)ret; } return TextServer::SubpixelPositioning::SUBPIXEL_POSITIONING_DISABLED; } void TextServerExtension::font_set_embolden(const RID &p_font_rid, double p_strength) { - GDVIRTUAL_CALL(font_set_embolden, p_font_rid, p_strength); + GDVIRTUAL_CALL(_font_set_embolden, p_font_rid, p_strength); } double TextServerExtension::font_get_embolden(const RID &p_font_rid) const { double ret; - if (GDVIRTUAL_CALL(font_get_embolden, p_font_rid, ret)) { + if (GDVIRTUAL_CALL(_font_get_embolden, p_font_rid, ret)) { return ret; } return 0.0; } void TextServerExtension::font_set_transform(const RID &p_font_rid, const Transform2D &p_transform) { - GDVIRTUAL_CALL(font_set_transform, p_font_rid, p_transform); + GDVIRTUAL_CALL(_font_set_transform, p_font_rid, p_transform); } Transform2D TextServerExtension::font_get_transform(const RID &p_font_rid) const { Transform2D ret; - if (GDVIRTUAL_CALL(font_get_transform, p_font_rid, ret)) { + if (GDVIRTUAL_CALL(_font_get_transform, p_font_rid, ret)) { return ret; } return Transform2D(); } void TextServerExtension::font_set_variation_coordinates(const RID &p_font_rid, const Dictionary &p_variation_coordinates) { - GDVIRTUAL_CALL(font_set_variation_coordinates, p_font_rid, p_variation_coordinates); + GDVIRTUAL_CALL(_font_set_variation_coordinates, p_font_rid, p_variation_coordinates); } Dictionary TextServerExtension::font_get_variation_coordinates(const RID &p_font_rid) const { Dictionary ret; - if (GDVIRTUAL_CALL(font_get_variation_coordinates, p_font_rid, ret)) { + if (GDVIRTUAL_CALL(_font_get_variation_coordinates, p_font_rid, ret)) { return ret; } return Dictionary(); } void TextServerExtension::font_set_oversampling(const RID &p_font_rid, double p_oversampling) { - GDVIRTUAL_CALL(font_set_oversampling, p_font_rid, p_oversampling); + GDVIRTUAL_CALL(_font_set_oversampling, p_font_rid, p_oversampling); } double TextServerExtension::font_get_oversampling(const RID &p_font_rid) const { double ret; - if (GDVIRTUAL_CALL(font_get_oversampling, p_font_rid, ret)) { + if (GDVIRTUAL_CALL(_font_get_oversampling, p_font_rid, ret)) { return ret; } return 0.0; @@ -636,75 +636,75 @@ double TextServerExtension::font_get_oversampling(const RID &p_font_rid) const { TypedArray<Vector2i> TextServerExtension::font_get_size_cache_list(const RID &p_font_rid) const { TypedArray<Vector2i> ret; - if (GDVIRTUAL_CALL(font_get_size_cache_list, p_font_rid, ret)) { + if (GDVIRTUAL_CALL(_font_get_size_cache_list, p_font_rid, ret)) { return ret; } return TypedArray<Vector2i>(); } void TextServerExtension::font_clear_size_cache(const RID &p_font_rid) { - GDVIRTUAL_CALL(font_clear_size_cache, p_font_rid); + GDVIRTUAL_CALL(_font_clear_size_cache, p_font_rid); } void TextServerExtension::font_remove_size_cache(const RID &p_font_rid, const Vector2i &p_size) { - GDVIRTUAL_CALL(font_remove_size_cache, p_font_rid, p_size); + GDVIRTUAL_CALL(_font_remove_size_cache, p_font_rid, p_size); } void TextServerExtension::font_set_ascent(const RID &p_font_rid, int64_t p_size, double p_ascent) { - GDVIRTUAL_CALL(font_set_ascent, p_font_rid, p_size, p_ascent); + GDVIRTUAL_CALL(_font_set_ascent, p_font_rid, p_size, p_ascent); } double TextServerExtension::font_get_ascent(const RID &p_font_rid, int64_t p_size) const { double ret; - if (GDVIRTUAL_CALL(font_get_ascent, p_font_rid, p_size, ret)) { + if (GDVIRTUAL_CALL(_font_get_ascent, p_font_rid, p_size, ret)) { return ret; } return 0.0; } void TextServerExtension::font_set_descent(const RID &p_font_rid, int64_t p_size, double p_descent) { - GDVIRTUAL_CALL(font_set_descent, p_font_rid, p_size, p_descent); + GDVIRTUAL_CALL(_font_set_descent, p_font_rid, p_size, p_descent); } double TextServerExtension::font_get_descent(const RID &p_font_rid, int64_t p_size) const { double ret; - if (GDVIRTUAL_CALL(font_get_descent, p_font_rid, p_size, ret)) { + if (GDVIRTUAL_CALL(_font_get_descent, p_font_rid, p_size, ret)) { return ret; } return 0.0; } void TextServerExtension::font_set_underline_position(const RID &p_font_rid, int64_t p_size, double p_underline_position) { - GDVIRTUAL_CALL(font_set_underline_position, p_font_rid, p_size, p_underline_position); + GDVIRTUAL_CALL(_font_set_underline_position, p_font_rid, p_size, p_underline_position); } double TextServerExtension::font_get_underline_position(const RID &p_font_rid, int64_t p_size) const { double ret; - if (GDVIRTUAL_CALL(font_get_underline_position, p_font_rid, p_size, ret)) { + if (GDVIRTUAL_CALL(_font_get_underline_position, p_font_rid, p_size, ret)) { return ret; } return 0.0; } void TextServerExtension::font_set_underline_thickness(const RID &p_font_rid, int64_t p_size, double p_underline_thickness) { - GDVIRTUAL_CALL(font_set_underline_thickness, p_font_rid, p_size, p_underline_thickness); + GDVIRTUAL_CALL(_font_set_underline_thickness, p_font_rid, p_size, p_underline_thickness); } double TextServerExtension::font_get_underline_thickness(const RID &p_font_rid, int64_t p_size) const { double ret; - if (GDVIRTUAL_CALL(font_get_underline_thickness, p_font_rid, p_size, ret)) { + if (GDVIRTUAL_CALL(_font_get_underline_thickness, p_font_rid, p_size, ret)) { return ret; } return 0.0; } void TextServerExtension::font_set_scale(const RID &p_font_rid, int64_t p_size, double p_scale) { - GDVIRTUAL_CALL(font_set_scale, p_font_rid, p_size, p_scale); + GDVIRTUAL_CALL(_font_set_scale, p_font_rid, p_size, p_scale); } double TextServerExtension::font_get_scale(const RID &p_font_rid, int64_t p_size) const { double ret; - if (GDVIRTUAL_CALL(font_get_scale, p_font_rid, p_size, ret)) { + if (GDVIRTUAL_CALL(_font_get_scale, p_font_rid, p_size, ret)) { return ret; } return 0.0; @@ -712,39 +712,39 @@ double TextServerExtension::font_get_scale(const RID &p_font_rid, int64_t p_size int64_t TextServerExtension::font_get_texture_count(const RID &p_font_rid, const Vector2i &p_size) const { int64_t ret; - if (GDVIRTUAL_CALL(font_get_texture_count, p_font_rid, p_size, ret)) { + if (GDVIRTUAL_CALL(_font_get_texture_count, p_font_rid, p_size, ret)) { return ret; } return 0; } void TextServerExtension::font_clear_textures(const RID &p_font_rid, const Vector2i &p_size) { - GDVIRTUAL_CALL(font_clear_textures, p_font_rid, p_size); + GDVIRTUAL_CALL(_font_clear_textures, p_font_rid, p_size); } void TextServerExtension::font_remove_texture(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index) { - GDVIRTUAL_CALL(font_remove_texture, p_font_rid, p_size, p_texture_index); + GDVIRTUAL_CALL(_font_remove_texture, p_font_rid, p_size, p_texture_index); } void TextServerExtension::font_set_texture_image(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index, const Ref<Image> &p_image) { - GDVIRTUAL_CALL(font_set_texture_image, p_font_rid, p_size, p_texture_index, p_image); + GDVIRTUAL_CALL(_font_set_texture_image, p_font_rid, p_size, p_texture_index, p_image); } Ref<Image> TextServerExtension::font_get_texture_image(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index) const { Ref<Image> ret; - if (GDVIRTUAL_CALL(font_get_texture_image, p_font_rid, p_size, p_texture_index, ret)) { + if (GDVIRTUAL_CALL(_font_get_texture_image, p_font_rid, p_size, p_texture_index, ret)) { return ret; } return Ref<Image>(); } void TextServerExtension::font_set_texture_offsets(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index, const PackedInt32Array &p_offset) { - GDVIRTUAL_CALL(font_set_texture_offsets, p_font_rid, p_size, p_texture_index, p_offset); + GDVIRTUAL_CALL(_font_set_texture_offsets, p_font_rid, p_size, p_texture_index, p_offset); } PackedInt32Array TextServerExtension::font_get_texture_offsets(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index) const { PackedInt32Array ret; - if (GDVIRTUAL_CALL(font_get_texture_offsets, p_font_rid, p_size, p_texture_index, ret)) { + if (GDVIRTUAL_CALL(_font_get_texture_offsets, p_font_rid, p_size, p_texture_index, ret)) { return ret; } return PackedInt32Array(); @@ -752,83 +752,83 @@ PackedInt32Array TextServerExtension::font_get_texture_offsets(const RID &p_font PackedInt32Array TextServerExtension::font_get_glyph_list(const RID &p_font_rid, const Vector2i &p_size) const { PackedInt32Array ret; - if (GDVIRTUAL_CALL(font_get_glyph_list, p_font_rid, p_size, ret)) { + if (GDVIRTUAL_CALL(_font_get_glyph_list, p_font_rid, p_size, ret)) { return ret; } return PackedInt32Array(); } void TextServerExtension::font_clear_glyphs(const RID &p_font_rid, const Vector2i &p_size) { - GDVIRTUAL_CALL(font_clear_glyphs, p_font_rid, p_size); + GDVIRTUAL_CALL(_font_clear_glyphs, p_font_rid, p_size); } void TextServerExtension::font_remove_glyph(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) { - GDVIRTUAL_CALL(font_remove_glyph, p_font_rid, p_size, p_glyph); + GDVIRTUAL_CALL(_font_remove_glyph, p_font_rid, p_size, p_glyph); } Vector2 TextServerExtension::font_get_glyph_advance(const RID &p_font_rid, int64_t p_size, int64_t p_glyph) const { Vector2 ret; - if (GDVIRTUAL_CALL(font_get_glyph_advance, p_font_rid, p_size, p_glyph, ret)) { + if (GDVIRTUAL_CALL(_font_get_glyph_advance, p_font_rid, p_size, p_glyph, ret)) { return ret; } return Vector2(); } void TextServerExtension::font_set_glyph_advance(const RID &p_font_rid, int64_t p_size, int64_t p_glyph, const Vector2 &p_advance) { - GDVIRTUAL_CALL(font_set_glyph_advance, p_font_rid, p_size, p_glyph, p_advance); + GDVIRTUAL_CALL(_font_set_glyph_advance, p_font_rid, p_size, p_glyph, p_advance); } Vector2 TextServerExtension::font_get_glyph_offset(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const { Vector2 ret; - if (GDVIRTUAL_CALL(font_get_glyph_offset, p_font_rid, p_size, p_glyph, ret)) { + if (GDVIRTUAL_CALL(_font_get_glyph_offset, p_font_rid, p_size, p_glyph, ret)) { return ret; } return Vector2(); } void TextServerExtension::font_set_glyph_offset(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, const Vector2 &p_offset) { - GDVIRTUAL_CALL(font_set_glyph_offset, p_font_rid, p_size, p_glyph, p_offset); + GDVIRTUAL_CALL(_font_set_glyph_offset, p_font_rid, p_size, p_glyph, p_offset); } Vector2 TextServerExtension::font_get_glyph_size(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const { Vector2 ret; - if (GDVIRTUAL_CALL(font_get_glyph_size, p_font_rid, p_size, p_glyph, ret)) { + if (GDVIRTUAL_CALL(_font_get_glyph_size, p_font_rid, p_size, p_glyph, ret)) { return ret; } return Vector2(); } void TextServerExtension::font_set_glyph_size(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, const Vector2 &p_gl_size) { - GDVIRTUAL_CALL(font_set_glyph_size, p_font_rid, p_size, p_glyph, p_gl_size); + GDVIRTUAL_CALL(_font_set_glyph_size, p_font_rid, p_size, p_glyph, p_gl_size); } Rect2 TextServerExtension::font_get_glyph_uv_rect(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const { Rect2 ret; - if (GDVIRTUAL_CALL(font_get_glyph_uv_rect, p_font_rid, p_size, p_glyph, ret)) { + if (GDVIRTUAL_CALL(_font_get_glyph_uv_rect, p_font_rid, p_size, p_glyph, ret)) { return ret; } return Rect2(); } void TextServerExtension::font_set_glyph_uv_rect(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, const Rect2 &p_uv_rect) { - GDVIRTUAL_CALL(font_set_glyph_uv_rect, p_font_rid, p_size, p_glyph, p_uv_rect); + GDVIRTUAL_CALL(_font_set_glyph_uv_rect, p_font_rid, p_size, p_glyph, p_uv_rect); } int64_t TextServerExtension::font_get_glyph_texture_idx(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const { int64_t ret; - if (GDVIRTUAL_CALL(font_get_glyph_texture_idx, p_font_rid, p_size, p_glyph, ret)) { + if (GDVIRTUAL_CALL(_font_get_glyph_texture_idx, p_font_rid, p_size, p_glyph, ret)) { return ret; } return 0; } void TextServerExtension::font_set_glyph_texture_idx(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, int64_t p_texture_idx) { - GDVIRTUAL_CALL(font_set_glyph_texture_idx, p_font_rid, p_size, p_glyph, p_texture_idx); + GDVIRTUAL_CALL(_font_set_glyph_texture_idx, p_font_rid, p_size, p_glyph, p_texture_idx); } RID TextServerExtension::font_get_glyph_texture_rid(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const { RID ret; - if (GDVIRTUAL_CALL(font_get_glyph_texture_rid, p_font_rid, p_size, p_glyph, ret)) { + if (GDVIRTUAL_CALL(_font_get_glyph_texture_rid, p_font_rid, p_size, p_glyph, ret)) { return ret; } return RID(); @@ -836,7 +836,7 @@ RID TextServerExtension::font_get_glyph_texture_rid(const RID &p_font_rid, const Size2 TextServerExtension::font_get_glyph_texture_size(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const { Size2 ret; - if (GDVIRTUAL_CALL(font_get_glyph_texture_size, p_font_rid, p_size, p_glyph, ret)) { + if (GDVIRTUAL_CALL(_font_get_glyph_texture_size, p_font_rid, p_size, p_glyph, ret)) { return ret; } return Size2(); @@ -844,7 +844,7 @@ Size2 TextServerExtension::font_get_glyph_texture_size(const RID &p_font_rid, co Dictionary TextServerExtension::font_get_glyph_contours(const RID &p_font_rid, int64_t p_size, int64_t p_index) const { Dictionary ret; - if (GDVIRTUAL_CALL(font_get_glyph_contours, p_font_rid, p_size, p_index, ret)) { + if (GDVIRTUAL_CALL(_font_get_glyph_contours, p_font_rid, p_size, p_index, ret)) { return ret; } return Dictionary(); @@ -852,27 +852,27 @@ Dictionary TextServerExtension::font_get_glyph_contours(const RID &p_font_rid, i TypedArray<Vector2i> TextServerExtension::font_get_kerning_list(const RID &p_font_rid, int64_t p_size) const { TypedArray<Vector2i> ret; - if (GDVIRTUAL_CALL(font_get_kerning_list, p_font_rid, p_size, ret)) { + if (GDVIRTUAL_CALL(_font_get_kerning_list, p_font_rid, p_size, ret)) { return ret; } return TypedArray<Vector2i>(); } void TextServerExtension::font_clear_kerning_map(const RID &p_font_rid, int64_t p_size) { - GDVIRTUAL_CALL(font_clear_kerning_map, p_font_rid, p_size); + GDVIRTUAL_CALL(_font_clear_kerning_map, p_font_rid, p_size); } void TextServerExtension::font_remove_kerning(const RID &p_font_rid, int64_t p_size, const Vector2i &p_glyph_pair) { - GDVIRTUAL_CALL(font_remove_kerning, p_font_rid, p_size, p_glyph_pair); + GDVIRTUAL_CALL(_font_remove_kerning, p_font_rid, p_size, p_glyph_pair); } void TextServerExtension::font_set_kerning(const RID &p_font_rid, int64_t p_size, const Vector2i &p_glyph_pair, const Vector2 &p_kerning) { - GDVIRTUAL_CALL(font_set_kerning, p_font_rid, p_size, p_glyph_pair, p_kerning); + GDVIRTUAL_CALL(_font_set_kerning, p_font_rid, p_size, p_glyph_pair, p_kerning); } Vector2 TextServerExtension::font_get_kerning(const RID &p_font_rid, int64_t p_size, const Vector2i &p_glyph_pair) const { Vector2 ret; - if (GDVIRTUAL_CALL(font_get_kerning, p_font_rid, p_size, p_glyph_pair, ret)) { + if (GDVIRTUAL_CALL(_font_get_kerning, p_font_rid, p_size, p_glyph_pair, ret)) { return ret; } return Vector2(); @@ -880,7 +880,7 @@ Vector2 TextServerExtension::font_get_kerning(const RID &p_font_rid, int64_t p_s int64_t TextServerExtension::font_get_glyph_index(const RID &p_font_rid, int64_t p_size, int64_t p_char, int64_t p_variation_selector) const { int64_t ret; - if (GDVIRTUAL_CALL(font_get_glyph_index, p_font_rid, p_size, p_char, p_variation_selector, ret)) { + if (GDVIRTUAL_CALL(_font_get_glyph_index, p_font_rid, p_size, p_char, p_variation_selector, ret)) { return ret; } return 0; @@ -888,7 +888,7 @@ int64_t TextServerExtension::font_get_glyph_index(const RID &p_font_rid, int64_t bool TextServerExtension::font_has_char(const RID &p_font_rid, int64_t p_char) const { bool ret; - if (GDVIRTUAL_CALL(font_has_char, p_font_rid, p_char, ret)) { + if (GDVIRTUAL_CALL(_font_has_char, p_font_rid, p_char, ret)) { return ret; } return false; @@ -896,55 +896,55 @@ bool TextServerExtension::font_has_char(const RID &p_font_rid, int64_t p_char) c String TextServerExtension::font_get_supported_chars(const RID &p_font_rid) const { String ret; - if (GDVIRTUAL_CALL(font_get_supported_chars, p_font_rid, ret)) { + if (GDVIRTUAL_CALL(_font_get_supported_chars, p_font_rid, ret)) { return ret; } return String(); } void TextServerExtension::font_render_range(const RID &p_font_rid, const Vector2i &p_size, int64_t p_start, int64_t p_end) { - GDVIRTUAL_CALL(font_render_range, p_font_rid, p_size, p_start, p_end); + GDVIRTUAL_CALL(_font_render_range, p_font_rid, p_size, p_start, p_end); } void TextServerExtension::font_render_glyph(const RID &p_font_rid, const Vector2i &p_size, int64_t p_index) { - GDVIRTUAL_CALL(font_render_glyph, p_font_rid, p_size, p_index); + GDVIRTUAL_CALL(_font_render_glyph, p_font_rid, p_size, p_index); } void TextServerExtension::font_draw_glyph(const RID &p_font_rid, const RID &p_canvas, int64_t p_size, const Vector2 &p_pos, int64_t p_index, const Color &p_color) const { - GDVIRTUAL_CALL(font_draw_glyph, p_font_rid, p_canvas, p_size, p_pos, p_index, p_color); + GDVIRTUAL_CALL(_font_draw_glyph, p_font_rid, p_canvas, p_size, p_pos, p_index, p_color); } void TextServerExtension::font_draw_glyph_outline(const RID &p_font_rid, const RID &p_canvas, int64_t p_size, int64_t p_outline_size, const Vector2 &p_pos, int64_t p_index, const Color &p_color) const { - GDVIRTUAL_CALL(font_draw_glyph_outline, p_font_rid, p_canvas, p_size, p_outline_size, p_pos, p_index, p_color); + GDVIRTUAL_CALL(_font_draw_glyph_outline, p_font_rid, p_canvas, p_size, p_outline_size, p_pos, p_index, p_color); } bool TextServerExtension::font_is_language_supported(const RID &p_font_rid, const String &p_language) const { bool ret; - if (GDVIRTUAL_CALL(font_is_language_supported, p_font_rid, p_language, ret)) { + if (GDVIRTUAL_CALL(_font_is_language_supported, p_font_rid, p_language, ret)) { return ret; } return false; } void TextServerExtension::font_set_language_support_override(const RID &p_font_rid, const String &p_language, bool p_supported) { - GDVIRTUAL_CALL(font_set_language_support_override, p_font_rid, p_language, p_supported); + GDVIRTUAL_CALL(_font_set_language_support_override, p_font_rid, p_language, p_supported); } bool TextServerExtension::font_get_language_support_override(const RID &p_font_rid, const String &p_language) { bool ret; - if (GDVIRTUAL_CALL(font_get_language_support_override, p_font_rid, p_language, ret)) { + if (GDVIRTUAL_CALL(_font_get_language_support_override, p_font_rid, p_language, ret)) { return ret; } return false; } void TextServerExtension::font_remove_language_support_override(const RID &p_font_rid, const String &p_language) { - GDVIRTUAL_CALL(font_remove_language_support_override, p_font_rid, p_language); + GDVIRTUAL_CALL(_font_remove_language_support_override, p_font_rid, p_language); } PackedStringArray TextServerExtension::font_get_language_support_overrides(const RID &p_font_rid) { PackedStringArray ret; - if (GDVIRTUAL_CALL(font_get_language_support_overrides, p_font_rid, ret)) { + if (GDVIRTUAL_CALL(_font_get_language_support_overrides, p_font_rid, ret)) { return ret; } return PackedStringArray(); @@ -952,43 +952,43 @@ PackedStringArray TextServerExtension::font_get_language_support_overrides(const bool TextServerExtension::font_is_script_supported(const RID &p_font_rid, const String &p_script) const { bool ret; - if (GDVIRTUAL_CALL(font_is_script_supported, p_font_rid, p_script, ret)) { + if (GDVIRTUAL_CALL(_font_is_script_supported, p_font_rid, p_script, ret)) { return ret; } return false; } void TextServerExtension::font_set_script_support_override(const RID &p_font_rid, const String &p_script, bool p_supported) { - GDVIRTUAL_CALL(font_set_script_support_override, p_font_rid, p_script, p_supported); + GDVIRTUAL_CALL(_font_set_script_support_override, p_font_rid, p_script, p_supported); } bool TextServerExtension::font_get_script_support_override(const RID &p_font_rid, const String &p_script) { bool ret; - if (GDVIRTUAL_CALL(font_get_script_support_override, p_font_rid, p_script, ret)) { + if (GDVIRTUAL_CALL(_font_get_script_support_override, p_font_rid, p_script, ret)) { return ret; } return false; } void TextServerExtension::font_remove_script_support_override(const RID &p_font_rid, const String &p_script) { - GDVIRTUAL_CALL(font_remove_script_support_override, p_font_rid, p_script); + GDVIRTUAL_CALL(_font_remove_script_support_override, p_font_rid, p_script); } PackedStringArray TextServerExtension::font_get_script_support_overrides(const RID &p_font_rid) { PackedStringArray ret; - if (GDVIRTUAL_CALL(font_get_script_support_overrides, p_font_rid, ret)) { + if (GDVIRTUAL_CALL(_font_get_script_support_overrides, p_font_rid, ret)) { return ret; } return PackedStringArray(); } void TextServerExtension::font_set_opentype_feature_overrides(const RID &p_font_rid, const Dictionary &p_overrides) { - GDVIRTUAL_CALL(font_set_opentype_feature_overrides, p_font_rid, p_overrides); + GDVIRTUAL_CALL(_font_set_opentype_feature_overrides, p_font_rid, p_overrides); } Dictionary TextServerExtension::font_get_opentype_feature_overrides(const RID &p_font_rid) const { Dictionary ret; - if (GDVIRTUAL_CALL(font_get_opentype_feature_overrides, p_font_rid, ret)) { + if (GDVIRTUAL_CALL(_font_get_opentype_feature_overrides, p_font_rid, ret)) { return ret; } return Dictionary(); @@ -996,7 +996,7 @@ Dictionary TextServerExtension::font_get_opentype_feature_overrides(const RID &p Dictionary TextServerExtension::font_supported_feature_list(const RID &p_font_rid) const { Dictionary ret; - if (GDVIRTUAL_CALL(font_supported_feature_list, p_font_rid, ret)) { + if (GDVIRTUAL_CALL(_font_supported_feature_list, p_font_rid, ret)) { return ret; } return Dictionary(); @@ -1004,7 +1004,7 @@ Dictionary TextServerExtension::font_supported_feature_list(const RID &p_font_ri Dictionary TextServerExtension::font_supported_variation_list(const RID &p_font_rid) const { Dictionary ret; - if (GDVIRTUAL_CALL(font_supported_variation_list, p_font_rid, ret)) { + if (GDVIRTUAL_CALL(_font_supported_variation_list, p_font_rid, ret)) { return ret; } return Dictionary(); @@ -1012,26 +1012,26 @@ Dictionary TextServerExtension::font_supported_variation_list(const RID &p_font_ double TextServerExtension::font_get_global_oversampling() const { double ret; - if (GDVIRTUAL_CALL(font_get_global_oversampling, ret)) { + if (GDVIRTUAL_CALL(_font_get_global_oversampling, ret)) { return ret; } return 0.0; } void TextServerExtension::font_set_global_oversampling(double p_oversampling) { - GDVIRTUAL_CALL(font_set_global_oversampling, p_oversampling); + GDVIRTUAL_CALL(_font_set_global_oversampling, p_oversampling); } Vector2 TextServerExtension::get_hex_code_box_size(int64_t p_size, int64_t p_index) const { Vector2 ret; - if (GDVIRTUAL_CALL(get_hex_code_box_size, p_size, p_index, ret)) { + if (GDVIRTUAL_CALL(_get_hex_code_box_size, p_size, p_index, ret)) { return ret; } return TextServer::get_hex_code_box_size(p_size, p_index); } void TextServerExtension::draw_hex_code_box(const RID &p_canvas, int64_t p_size, const Vector2 &p_pos, int64_t p_index, const Color &p_color) const { - if (!GDVIRTUAL_CALL(draw_hex_code_box, p_canvas, p_size, p_pos, p_index, p_color)) { + if (!GDVIRTUAL_CALL(_draw_hex_code_box, p_canvas, p_size, p_pos, p_index, p_color)) { TextServer::draw_hex_code_box(p_canvas, p_size, p_pos, p_index, p_color); } } @@ -1042,23 +1042,23 @@ void TextServerExtension::draw_hex_code_box(const RID &p_canvas, int64_t p_size, RID TextServerExtension::create_shaped_text(TextServer::Direction p_direction, TextServer::Orientation p_orientation) { RID ret; - if (GDVIRTUAL_CALL(create_shaped_text, p_direction, p_orientation, ret)) { + if (GDVIRTUAL_CALL(_create_shaped_text, p_direction, p_orientation, ret)) { return ret; } return RID(); } void TextServerExtension::shaped_text_clear(const RID &p_shaped) { - GDVIRTUAL_CALL(shaped_text_clear, p_shaped); + GDVIRTUAL_CALL(_shaped_text_clear, p_shaped); } void TextServerExtension::shaped_text_set_direction(const RID &p_shaped, TextServer::Direction p_direction) { - GDVIRTUAL_CALL(shaped_text_set_direction, p_shaped, p_direction); + GDVIRTUAL_CALL(_shaped_text_set_direction, p_shaped, p_direction); } TextServer::Direction TextServerExtension::shaped_text_get_direction(const RID &p_shaped) const { TextServer::Direction ret; - if (GDVIRTUAL_CALL(shaped_text_get_direction, p_shaped, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_get_direction, p_shaped, ret)) { return (TextServer::Direction)ret; } return TextServer::Direction::DIRECTION_AUTO; @@ -1066,71 +1066,71 @@ TextServer::Direction TextServerExtension::shaped_text_get_direction(const RID & TextServer::Direction TextServerExtension::shaped_text_get_inferred_direction(const RID &p_shaped) const { TextServer::Direction ret; - if (GDVIRTUAL_CALL(shaped_text_get_inferred_direction, p_shaped, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_get_inferred_direction, p_shaped, ret)) { return (TextServer::Direction)ret; } return TextServer::Direction::DIRECTION_LTR; } void TextServerExtension::shaped_text_set_orientation(const RID &p_shaped, TextServer::Orientation p_orientation) { - GDVIRTUAL_CALL(shaped_text_set_orientation, p_shaped, p_orientation); + GDVIRTUAL_CALL(_shaped_text_set_orientation, p_shaped, p_orientation); } TextServer::Orientation TextServerExtension::shaped_text_get_orientation(const RID &p_shaped) const { TextServer::Orientation ret; - if (GDVIRTUAL_CALL(shaped_text_get_orientation, p_shaped, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_get_orientation, p_shaped, ret)) { return (TextServer::Orientation)ret; } return TextServer::Orientation::ORIENTATION_HORIZONTAL; } void TextServerExtension::shaped_text_set_bidi_override(const RID &p_shaped, const Array &p_override) { - GDVIRTUAL_CALL(shaped_text_set_bidi_override, p_shaped, p_override); + GDVIRTUAL_CALL(_shaped_text_set_bidi_override, p_shaped, p_override); } void TextServerExtension::shaped_text_set_custom_punctuation(const RID &p_shaped, const String &p_punct) { - GDVIRTUAL_CALL(shaped_text_set_custom_punctuation, p_shaped, p_punct); + GDVIRTUAL_CALL(_shaped_text_set_custom_punctuation, p_shaped, p_punct); } String TextServerExtension::shaped_text_get_custom_punctuation(const RID &p_shaped) const { String ret; - if (GDVIRTUAL_CALL(shaped_text_get_custom_punctuation, p_shaped, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_get_custom_punctuation, p_shaped, ret)) { return ret; } return String(); } void TextServerExtension::shaped_text_set_preserve_invalid(const RID &p_shaped, bool p_enabled) { - GDVIRTUAL_CALL(shaped_text_set_preserve_invalid, p_shaped, p_enabled); + GDVIRTUAL_CALL(_shaped_text_set_preserve_invalid, p_shaped, p_enabled); } bool TextServerExtension::shaped_text_get_preserve_invalid(const RID &p_shaped) const { bool ret; - if (GDVIRTUAL_CALL(shaped_text_get_preserve_invalid, p_shaped, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_get_preserve_invalid, p_shaped, ret)) { return ret; } return false; } void TextServerExtension::shaped_text_set_preserve_control(const RID &p_shaped, bool p_enabled) { - GDVIRTUAL_CALL(shaped_text_set_preserve_control, p_shaped, p_enabled); + GDVIRTUAL_CALL(_shaped_text_set_preserve_control, p_shaped, p_enabled); } bool TextServerExtension::shaped_text_get_preserve_control(const RID &p_shaped) const { bool ret; - if (GDVIRTUAL_CALL(shaped_text_get_preserve_control, p_shaped, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_get_preserve_control, p_shaped, ret)) { return ret; } return false; } void TextServerExtension::shaped_text_set_spacing(const RID &p_shaped, TextServer::SpacingType p_spacing, int64_t p_value) { - GDVIRTUAL_CALL(shaped_text_set_spacing, p_shaped, p_spacing, p_value); + GDVIRTUAL_CALL(_shaped_text_set_spacing, p_shaped, p_spacing, p_value); } int64_t TextServerExtension::shaped_text_get_spacing(const RID &p_shaped, TextServer::SpacingType p_spacing) const { int64_t ret; - if (GDVIRTUAL_CALL(shaped_text_get_spacing, p_shaped, p_spacing, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_get_spacing, p_shaped, p_spacing, ret)) { return ret; } return 0; @@ -1138,7 +1138,7 @@ int64_t TextServerExtension::shaped_text_get_spacing(const RID &p_shaped, TextSe bool TextServerExtension::shaped_text_add_string(const RID &p_shaped, const String &p_text, const TypedArray<RID> &p_fonts, int64_t p_size, const Dictionary &p_opentype_features, const String &p_language, const Variant &p_meta) { bool ret; - if (GDVIRTUAL_CALL(shaped_text_add_string, p_shaped, p_text, p_fonts, p_size, p_opentype_features, p_language, p_meta, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_add_string, p_shaped, p_text, p_fonts, p_size, p_opentype_features, p_language, p_meta, ret)) { return ret; } return false; @@ -1146,7 +1146,7 @@ bool TextServerExtension::shaped_text_add_string(const RID &p_shaped, const Stri bool TextServerExtension::shaped_text_add_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align, int64_t p_length) { bool ret; - if (GDVIRTUAL_CALL(shaped_text_add_object, p_shaped, p_key, p_size, p_inline_align, p_length, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_add_object, p_shaped, p_key, p_size, p_inline_align, p_length, ret)) { return ret; } return false; @@ -1154,7 +1154,7 @@ bool TextServerExtension::shaped_text_add_object(const RID &p_shaped, const Vari bool TextServerExtension::shaped_text_resize_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align) { bool ret; - if (GDVIRTUAL_CALL(shaped_text_resize_object, p_shaped, p_key, p_size, p_inline_align, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_resize_object, p_shaped, p_key, p_size, p_inline_align, ret)) { return ret; } return false; @@ -1162,7 +1162,7 @@ bool TextServerExtension::shaped_text_resize_object(const RID &p_shaped, const V int64_t TextServerExtension::shaped_get_span_count(const RID &p_shaped) const { int64_t ret; - if (GDVIRTUAL_CALL(shaped_get_span_count, p_shaped, ret)) { + if (GDVIRTUAL_CALL(_shaped_get_span_count, p_shaped, ret)) { return ret; } return 0; @@ -1170,19 +1170,19 @@ int64_t TextServerExtension::shaped_get_span_count(const RID &p_shaped) const { Variant TextServerExtension::shaped_get_span_meta(const RID &p_shaped, int64_t p_index) const { Variant ret; - if (GDVIRTUAL_CALL(shaped_get_span_meta, p_shaped, p_index, ret)) { + if (GDVIRTUAL_CALL(_shaped_get_span_meta, p_shaped, p_index, ret)) { return ret; } return false; } void TextServerExtension::shaped_set_span_update_font(const RID &p_shaped, int64_t p_index, const TypedArray<RID> &p_fonts, int64_t p_size, const Dictionary &p_opentype_features) { - GDVIRTUAL_CALL(shaped_set_span_update_font, p_shaped, p_index, p_fonts, p_size, p_opentype_features); + GDVIRTUAL_CALL(_shaped_set_span_update_font, p_shaped, p_index, p_fonts, p_size, p_opentype_features); } RID TextServerExtension::shaped_text_substr(const RID &p_shaped, int64_t p_start, int64_t p_length) const { RID ret; - if (GDVIRTUAL_CALL(shaped_text_substr, p_shaped, p_start, p_length, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_substr, p_shaped, p_start, p_length, ret)) { return ret; } return RID(); @@ -1190,7 +1190,7 @@ RID TextServerExtension::shaped_text_substr(const RID &p_shaped, int64_t p_start RID TextServerExtension::shaped_text_get_parent(const RID &p_shaped) const { RID ret; - if (GDVIRTUAL_CALL(shaped_text_get_parent, p_shaped, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_get_parent, p_shaped, ret)) { return ret; } return RID(); @@ -1198,7 +1198,7 @@ RID TextServerExtension::shaped_text_get_parent(const RID &p_shaped) const { double TextServerExtension::shaped_text_fit_to_width(const RID &p_shaped, double p_width, BitField<TextServer::JustificationFlag> p_jst_flags) { double ret; - if (GDVIRTUAL_CALL(shaped_text_fit_to_width, p_shaped, p_width, p_jst_flags, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_fit_to_width, p_shaped, p_width, p_jst_flags, ret)) { return ret; } return 0.0; @@ -1206,7 +1206,7 @@ double TextServerExtension::shaped_text_fit_to_width(const RID &p_shaped, double double TextServerExtension::shaped_text_tab_align(const RID &p_shaped, const PackedFloat32Array &p_tab_stops) { double ret; - if (GDVIRTUAL_CALL(shaped_text_tab_align, p_shaped, p_tab_stops, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_tab_align, p_shaped, p_tab_stops, ret)) { return ret; } return 0.0; @@ -1214,7 +1214,7 @@ double TextServerExtension::shaped_text_tab_align(const RID &p_shaped, const Pac bool TextServerExtension::shaped_text_shape(const RID &p_shaped) { bool ret; - if (GDVIRTUAL_CALL(shaped_text_shape, p_shaped, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_shape, p_shaped, ret)) { return ret; } return false; @@ -1222,7 +1222,7 @@ bool TextServerExtension::shaped_text_shape(const RID &p_shaped) { bool TextServerExtension::shaped_text_update_breaks(const RID &p_shaped) { bool ret; - if (GDVIRTUAL_CALL(shaped_text_update_breaks, p_shaped, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_update_breaks, p_shaped, ret)) { return ret; } return false; @@ -1230,7 +1230,7 @@ bool TextServerExtension::shaped_text_update_breaks(const RID &p_shaped) { bool TextServerExtension::shaped_text_update_justification_ops(const RID &p_shaped) { bool ret; - if (GDVIRTUAL_CALL(shaped_text_update_justification_ops, p_shaped, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_update_justification_ops, p_shaped, ret)) { return ret; } return false; @@ -1238,7 +1238,7 @@ bool TextServerExtension::shaped_text_update_justification_ops(const RID &p_shap bool TextServerExtension::shaped_text_is_ready(const RID &p_shaped) const { bool ret; - if (GDVIRTUAL_CALL(shaped_text_is_ready, p_shaped, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_is_ready, p_shaped, ret)) { return ret; } return false; @@ -1246,7 +1246,7 @@ bool TextServerExtension::shaped_text_is_ready(const RID &p_shaped) const { const Glyph *TextServerExtension::shaped_text_get_glyphs(const RID &p_shaped) const { GDNativeConstPtr<const Glyph> ret; - if (GDVIRTUAL_CALL(shaped_text_get_glyphs, p_shaped, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_get_glyphs, p_shaped, ret)) { return ret; } return nullptr; @@ -1254,7 +1254,7 @@ const Glyph *TextServerExtension::shaped_text_get_glyphs(const RID &p_shaped) co const Glyph *TextServerExtension::shaped_text_sort_logical(const RID &p_shaped) { GDNativeConstPtr<const Glyph> ret; - if (GDVIRTUAL_CALL(shaped_text_sort_logical, p_shaped, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_sort_logical, p_shaped, ret)) { return ret; } return nullptr; @@ -1262,7 +1262,7 @@ const Glyph *TextServerExtension::shaped_text_sort_logical(const RID &p_shaped) int64_t TextServerExtension::shaped_text_get_glyph_count(const RID &p_shaped) const { int64_t ret; - if (GDVIRTUAL_CALL(shaped_text_get_glyph_count, p_shaped, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_get_glyph_count, p_shaped, ret)) { return ret; } return 0; @@ -1270,7 +1270,7 @@ int64_t TextServerExtension::shaped_text_get_glyph_count(const RID &p_shaped) co Vector2i TextServerExtension::shaped_text_get_range(const RID &p_shaped) const { Vector2i ret; - if (GDVIRTUAL_CALL(shaped_text_get_range, p_shaped, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_get_range, p_shaped, ret)) { return ret; } return Vector2i(); @@ -1278,7 +1278,7 @@ Vector2i TextServerExtension::shaped_text_get_range(const RID &p_shaped) const { PackedInt32Array TextServerExtension::shaped_text_get_line_breaks_adv(const RID &p_shaped, const PackedFloat32Array &p_width, int64_t p_start, bool p_once, BitField<TextServer::LineBreakFlag> p_break_flags) const { PackedInt32Array ret; - if (GDVIRTUAL_CALL(shaped_text_get_line_breaks_adv, p_shaped, p_width, p_start, p_once, p_break_flags, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_get_line_breaks_adv, p_shaped, p_width, p_start, p_once, p_break_flags, ret)) { return ret; } return TextServer::shaped_text_get_line_breaks_adv(p_shaped, p_width, p_start, p_once, p_break_flags); @@ -1286,7 +1286,7 @@ PackedInt32Array TextServerExtension::shaped_text_get_line_breaks_adv(const RID PackedInt32Array TextServerExtension::shaped_text_get_line_breaks(const RID &p_shaped, double p_width, int64_t p_start, BitField<TextServer::LineBreakFlag> p_break_flags) const { PackedInt32Array ret; - if (GDVIRTUAL_CALL(shaped_text_get_line_breaks, p_shaped, p_width, p_start, p_break_flags, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_get_line_breaks, p_shaped, p_width, p_start, p_break_flags, ret)) { return ret; } return TextServer::shaped_text_get_line_breaks(p_shaped, p_width, p_start, p_break_flags); @@ -1294,7 +1294,7 @@ PackedInt32Array TextServerExtension::shaped_text_get_line_breaks(const RID &p_s PackedInt32Array TextServerExtension::shaped_text_get_word_breaks(const RID &p_shaped, BitField<TextServer::GraphemeFlag> p_grapheme_flags) const { PackedInt32Array ret; - if (GDVIRTUAL_CALL(shaped_text_get_word_breaks, p_shaped, p_grapheme_flags, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_get_word_breaks, p_shaped, p_grapheme_flags, ret)) { return ret; } return TextServer::shaped_text_get_word_breaks(p_shaped, p_grapheme_flags); @@ -1302,7 +1302,7 @@ PackedInt32Array TextServerExtension::shaped_text_get_word_breaks(const RID &p_s int64_t TextServerExtension::shaped_text_get_trim_pos(const RID &p_shaped) const { int64_t ret; - if (GDVIRTUAL_CALL(shaped_text_get_trim_pos, p_shaped, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_get_trim_pos, p_shaped, ret)) { return ret; } return -1; @@ -1310,7 +1310,7 @@ int64_t TextServerExtension::shaped_text_get_trim_pos(const RID &p_shaped) const int64_t TextServerExtension::shaped_text_get_ellipsis_pos(const RID &p_shaped) const { int64_t ret; - if (GDVIRTUAL_CALL(shaped_text_get_ellipsis_pos, p_shaped, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_get_ellipsis_pos, p_shaped, ret)) { return ret; } return -1; @@ -1318,7 +1318,7 @@ int64_t TextServerExtension::shaped_text_get_ellipsis_pos(const RID &p_shaped) c const Glyph *TextServerExtension::shaped_text_get_ellipsis_glyphs(const RID &p_shaped) const { GDNativeConstPtr<const Glyph> ret; - if (GDVIRTUAL_CALL(shaped_text_get_ellipsis_glyphs, p_shaped, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_get_ellipsis_glyphs, p_shaped, ret)) { return ret; } return nullptr; @@ -1326,19 +1326,19 @@ const Glyph *TextServerExtension::shaped_text_get_ellipsis_glyphs(const RID &p_s int64_t TextServerExtension::shaped_text_get_ellipsis_glyph_count(const RID &p_shaped) const { int64_t ret; - if (GDVIRTUAL_CALL(shaped_text_get_ellipsis_glyph_count, p_shaped, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_get_ellipsis_glyph_count, p_shaped, ret)) { return ret; } return -1; } void TextServerExtension::shaped_text_overrun_trim_to_width(const RID &p_shaped_line, double p_width, BitField<TextServer::TextOverrunFlag> p_trim_flags) { - GDVIRTUAL_CALL(shaped_text_overrun_trim_to_width, p_shaped_line, p_width, p_trim_flags); + GDVIRTUAL_CALL(_shaped_text_overrun_trim_to_width, p_shaped_line, p_width, p_trim_flags); } Array TextServerExtension::shaped_text_get_objects(const RID &p_shaped) const { Array ret; - if (GDVIRTUAL_CALL(shaped_text_get_objects, p_shaped, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_get_objects, p_shaped, ret)) { return ret; } return Array(); @@ -1346,7 +1346,7 @@ Array TextServerExtension::shaped_text_get_objects(const RID &p_shaped) const { Rect2 TextServerExtension::shaped_text_get_object_rect(const RID &p_shaped, const Variant &p_key) const { Rect2 ret; - if (GDVIRTUAL_CALL(shaped_text_get_object_rect, p_shaped, p_key, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_get_object_rect, p_shaped, p_key, ret)) { return ret; } return Rect2(); @@ -1354,7 +1354,7 @@ Rect2 TextServerExtension::shaped_text_get_object_rect(const RID &p_shaped, cons Size2 TextServerExtension::shaped_text_get_size(const RID &p_shaped) const { Size2 ret; - if (GDVIRTUAL_CALL(shaped_text_get_size, p_shaped, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_get_size, p_shaped, ret)) { return ret; } return Size2(); @@ -1362,7 +1362,7 @@ Size2 TextServerExtension::shaped_text_get_size(const RID &p_shaped) const { double TextServerExtension::shaped_text_get_ascent(const RID &p_shaped) const { double ret; - if (GDVIRTUAL_CALL(shaped_text_get_ascent, p_shaped, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_get_ascent, p_shaped, ret)) { return ret; } return 0.0; @@ -1370,7 +1370,7 @@ double TextServerExtension::shaped_text_get_ascent(const RID &p_shaped) const { double TextServerExtension::shaped_text_get_descent(const RID &p_shaped) const { double ret; - if (GDVIRTUAL_CALL(shaped_text_get_descent, p_shaped, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_get_descent, p_shaped, ret)) { return ret; } return 0.0; @@ -1378,7 +1378,7 @@ double TextServerExtension::shaped_text_get_descent(const RID &p_shaped) const { double TextServerExtension::shaped_text_get_width(const RID &p_shaped) const { double ret; - if (GDVIRTUAL_CALL(shaped_text_get_width, p_shaped, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_get_width, p_shaped, ret)) { return ret; } return 0.0; @@ -1386,7 +1386,7 @@ double TextServerExtension::shaped_text_get_width(const RID &p_shaped) const { double TextServerExtension::shaped_text_get_underline_position(const RID &p_shaped) const { double ret; - if (GDVIRTUAL_CALL(shaped_text_get_underline_position, p_shaped, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_get_underline_position, p_shaped, ret)) { return ret; } return 0.0; @@ -1394,7 +1394,7 @@ double TextServerExtension::shaped_text_get_underline_position(const RID &p_shap double TextServerExtension::shaped_text_get_underline_thickness(const RID &p_shaped) const { double ret; - if (GDVIRTUAL_CALL(shaped_text_get_underline_thickness, p_shaped, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_get_underline_thickness, p_shaped, ret)) { return ret; } return 0.0; @@ -1402,7 +1402,7 @@ double TextServerExtension::shaped_text_get_underline_thickness(const RID &p_sha TextServer::Direction TextServerExtension::shaped_text_get_dominant_direction_in_range(const RID &p_shaped, int64_t p_start, int64_t p_end) const { int64_t ret; - if (GDVIRTUAL_CALL(shaped_text_get_dominant_direction_in_range, p_shaped, p_start, p_end, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_get_dominant_direction_in_range, p_shaped, p_start, p_end, ret)) { return (TextServer::Direction)ret; } return TextServer::shaped_text_get_dominant_direction_in_range(p_shaped, p_start, p_end); @@ -1410,7 +1410,7 @@ TextServer::Direction TextServerExtension::shaped_text_get_dominant_direction_in CaretInfo TextServerExtension::shaped_text_get_carets(const RID &p_shaped, int64_t p_position) const { CaretInfo ret; - if (GDVIRTUAL_CALL(shaped_text_get_carets, p_shaped, p_position, &ret)) { + if (GDVIRTUAL_CALL(_shaped_text_get_carets, p_shaped, p_position, &ret)) { return ret; } return TextServer::shaped_text_get_carets(p_shaped, p_position); @@ -1418,7 +1418,7 @@ CaretInfo TextServerExtension::shaped_text_get_carets(const RID &p_shaped, int64 Vector<Vector2> TextServerExtension::shaped_text_get_selection(const RID &p_shaped, int64_t p_start, int64_t p_end) const { Vector<Vector2> ret; - if (GDVIRTUAL_CALL(shaped_text_get_selection, p_shaped, p_start, p_end, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_get_selection, p_shaped, p_start, p_end, ret)) { return ret; } return TextServer::shaped_text_get_selection(p_shaped, p_start, p_end); @@ -1426,7 +1426,7 @@ Vector<Vector2> TextServerExtension::shaped_text_get_selection(const RID &p_shap int64_t TextServerExtension::shaped_text_hit_test_grapheme(const RID &p_shaped, double p_coords) const { int64_t ret; - if (GDVIRTUAL_CALL(shaped_text_hit_test_grapheme, p_shaped, p_coords, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_hit_test_grapheme, p_shaped, p_coords, ret)) { return ret; } return TextServer::shaped_text_hit_test_grapheme(p_shaped, p_coords); @@ -1434,21 +1434,21 @@ int64_t TextServerExtension::shaped_text_hit_test_grapheme(const RID &p_shaped, int64_t TextServerExtension::shaped_text_hit_test_position(const RID &p_shaped, double p_coords) const { int64_t ret; - if (GDVIRTUAL_CALL(shaped_text_hit_test_position, p_shaped, p_coords, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_hit_test_position, p_shaped, p_coords, ret)) { return ret; } return TextServer::shaped_text_hit_test_position(p_shaped, p_coords); } void TextServerExtension::shaped_text_draw(const RID &p_shaped, const RID &p_canvas, const Vector2 &p_pos, double p_clip_l, double p_clip_r, const Color &p_color) const { - if (GDVIRTUAL_CALL(shaped_text_draw, p_shaped, p_canvas, p_pos, p_clip_l, p_clip_r, p_color)) { + if (GDVIRTUAL_CALL(_shaped_text_draw, p_shaped, p_canvas, p_pos, p_clip_l, p_clip_r, p_color)) { return; } TextServer::shaped_text_draw(p_shaped, p_canvas, p_pos, p_clip_l, p_clip_r, p_color); } void TextServerExtension::shaped_text_draw_outline(const RID &p_shaped, const RID &p_canvas, const Vector2 &p_pos, double p_clip_l, double p_clip_r, int64_t p_outline_size, const Color &p_color) const { - if (GDVIRTUAL_CALL(shaped_text_draw_outline, p_shaped, p_canvas, p_pos, p_clip_l, p_clip_r, p_outline_size, p_color)) { + if (GDVIRTUAL_CALL(_shaped_text_draw_outline, p_shaped, p_canvas, p_pos, p_clip_l, p_clip_r, p_outline_size, p_color)) { return; } TextServer::shaped_text_draw_outline(p_shaped, p_canvas, p_pos, p_clip_l, p_clip_r, p_outline_size, p_color); @@ -1456,7 +1456,7 @@ void TextServerExtension::shaped_text_draw_outline(const RID &p_shaped, const RI Vector2 TextServerExtension::shaped_text_get_grapheme_bounds(const RID &p_shaped, int64_t p_pos) const { Vector2 ret; - if (GDVIRTUAL_CALL(shaped_text_get_grapheme_bounds, p_shaped, p_pos, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_get_grapheme_bounds, p_shaped, p_pos, ret)) { return ret; } return TextServer::shaped_text_get_grapheme_bounds(p_shaped, p_pos); @@ -1464,7 +1464,7 @@ Vector2 TextServerExtension::shaped_text_get_grapheme_bounds(const RID &p_shaped int64_t TextServerExtension::shaped_text_next_grapheme_pos(const RID &p_shaped, int64_t p_pos) const { int64_t ret; - if (GDVIRTUAL_CALL(shaped_text_next_grapheme_pos, p_shaped, p_pos, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_next_grapheme_pos, p_shaped, p_pos, ret)) { return ret; } return TextServer::shaped_text_next_grapheme_pos(p_shaped, p_pos); @@ -1472,7 +1472,7 @@ int64_t TextServerExtension::shaped_text_next_grapheme_pos(const RID &p_shaped, int64_t TextServerExtension::shaped_text_prev_grapheme_pos(const RID &p_shaped, int64_t p_pos) const { int64_t ret; - if (GDVIRTUAL_CALL(shaped_text_prev_grapheme_pos, p_shaped, p_pos, ret)) { + if (GDVIRTUAL_CALL(_shaped_text_prev_grapheme_pos, p_shaped, p_pos, ret)) { return ret; } return TextServer::shaped_text_prev_grapheme_pos(p_shaped, p_pos); @@ -1480,7 +1480,7 @@ int64_t TextServerExtension::shaped_text_prev_grapheme_pos(const RID &p_shaped, String TextServerExtension::format_number(const String &p_string, const String &p_language) const { String ret; - if (GDVIRTUAL_CALL(format_number, p_string, p_language, ret)) { + if (GDVIRTUAL_CALL(_format_number, p_string, p_language, ret)) { return ret; } return p_string; @@ -1488,7 +1488,7 @@ String TextServerExtension::format_number(const String &p_string, const String & String TextServerExtension::parse_number(const String &p_string, const String &p_language) const { String ret; - if (GDVIRTUAL_CALL(parse_number, p_string, p_language, ret)) { + if (GDVIRTUAL_CALL(_parse_number, p_string, p_language, ret)) { return ret; } return p_string; @@ -1496,7 +1496,7 @@ String TextServerExtension::parse_number(const String &p_string, const String &p String TextServerExtension::percent_sign(const String &p_language) const { String ret; - if (GDVIRTUAL_CALL(percent_sign, p_language, ret)) { + if (GDVIRTUAL_CALL(_percent_sign, p_language, ret)) { return ret; } return "%"; @@ -1504,7 +1504,7 @@ String TextServerExtension::percent_sign(const String &p_language) const { bool TextServerExtension::is_valid_identifier(const String &p_string) const { bool ret; - if (GDVIRTUAL_CALL(is_valid_identifier, p_string, ret)) { + if (GDVIRTUAL_CALL(_is_valid_identifier, p_string, ret)) { return ret; } return TextServer::is_valid_identifier(p_string); @@ -1512,7 +1512,7 @@ bool TextServerExtension::is_valid_identifier(const String &p_string) const { String TextServerExtension::strip_diacritics(const String &p_string) const { String ret; - if (GDVIRTUAL_CALL(strip_diacritics, p_string, ret)) { + if (GDVIRTUAL_CALL(_strip_diacritics, p_string, ret)) { return ret; } return TextServer::strip_diacritics(p_string); @@ -1520,7 +1520,7 @@ String TextServerExtension::strip_diacritics(const String &p_string) const { String TextServerExtension::string_to_upper(const String &p_string, const String &p_language) const { String ret; - if (GDVIRTUAL_CALL(string_to_upper, p_string, p_language, ret)) { + if (GDVIRTUAL_CALL(_string_to_upper, p_string, p_language, ret)) { return ret; } return p_string; @@ -1528,7 +1528,7 @@ String TextServerExtension::string_to_upper(const String &p_string, const String String TextServerExtension::string_to_lower(const String &p_string, const String &p_language) const { String ret; - if (GDVIRTUAL_CALL(string_to_lower, p_string, p_language, ret)) { + if (GDVIRTUAL_CALL(_string_to_lower, p_string, p_language, ret)) { return ret; } return p_string; @@ -1536,7 +1536,7 @@ String TextServerExtension::string_to_lower(const String &p_string, const String TypedArray<Vector2i> TextServerExtension::parse_structured_text(StructuredTextParser p_parser_type, const Array &p_args, const String &p_text) const { TypedArray<Vector2i> ret; - if (GDVIRTUAL_CALL(parse_structured_text, p_parser_type, p_args, p_text, ret)) { + if (GDVIRTUAL_CALL(_parse_structured_text, p_parser_type, p_args, p_text, ret)) { return ret; } return TypedArray<Vector2i>(); @@ -1544,15 +1544,15 @@ TypedArray<Vector2i> TextServerExtension::parse_structured_text(StructuredTextPa PackedInt32Array TextServerExtension::string_get_word_breaks(const String &p_string, const String &p_language) const { PackedInt32Array ret; - if (GDVIRTUAL_CALL(string_get_word_breaks, p_string, p_language, ret)) { + if (GDVIRTUAL_CALL(_string_get_word_breaks, p_string, p_language, ret)) { return ret; } return PackedInt32Array(); } -int TextServerExtension::is_confusable(const String &p_string, const PackedStringArray &p_dict) const { - int ret; - if (GDVIRTUAL_CALL(is_confusable, p_string, p_dict, ret)) { +int64_t TextServerExtension::is_confusable(const String &p_string, const PackedStringArray &p_dict) const { + int64_t ret; + if (GDVIRTUAL_CALL(_is_confusable, p_string, p_dict, ret)) { return ret; } return TextServer::is_confusable(p_string, p_dict); @@ -1560,7 +1560,7 @@ int TextServerExtension::is_confusable(const String &p_string, const PackedStrin bool TextServerExtension::spoof_check(const String &p_string) const { bool ret; - if (GDVIRTUAL_CALL(spoof_check, p_string, ret)) { + if (GDVIRTUAL_CALL(_spoof_check, p_string, ret)) { return ret; } return TextServer::spoof_check(p_string); diff --git a/servers/text/text_server_extension.h b/servers/text/text_server_extension.h index 700d08f7d7..992b708045 100644 --- a/servers/text/text_server_extension.h +++ b/servers/text/text_server_extension.h @@ -50,401 +50,402 @@ public: virtual bool has_feature(Feature p_feature) const override; virtual String get_name() const override; virtual int64_t get_features() const override; - GDVIRTUAL1RC(bool, has_feature, Feature); - GDVIRTUAL0RC(String, get_name); - GDVIRTUAL0RC(int64_t, get_features); + GDVIRTUAL1RC(bool, _has_feature, Feature); + GDVIRTUAL0RC(String, _get_name); + GDVIRTUAL0RC(int64_t, _get_features); virtual void free_rid(const RID &p_rid) override; virtual bool has(const RID &p_rid) override; virtual bool load_support_data(const String &p_filename) override; - GDVIRTUAL1(free_rid, RID); - GDVIRTUAL1R(bool, has, RID); - GDVIRTUAL1R(bool, load_support_data, const String &); + GDVIRTUAL1(_free_rid, RID); + GDVIRTUAL1R(bool, _has, RID); + GDVIRTUAL1R(bool, _load_support_data, const String &); virtual String get_support_data_filename() const override; virtual String get_support_data_info() const override; virtual bool save_support_data(const String &p_filename) const override; - GDVIRTUAL0RC(String, get_support_data_filename); - GDVIRTUAL0RC(String, get_support_data_info); - GDVIRTUAL1RC(bool, save_support_data, const String &); + GDVIRTUAL0RC(String, _get_support_data_filename); + GDVIRTUAL0RC(String, _get_support_data_info); + GDVIRTUAL1RC(bool, _save_support_data, const String &); virtual bool is_locale_right_to_left(const String &p_locale) const override; - GDVIRTUAL1RC(bool, is_locale_right_to_left, const String &); + GDVIRTUAL1RC(bool, _is_locale_right_to_left, const String &); virtual int64_t name_to_tag(const String &p_name) const override; virtual String tag_to_name(int64_t p_tag) const override; - GDVIRTUAL1RC(int64_t, name_to_tag, const String &); - GDVIRTUAL1RC(String, tag_to_name, int64_t); + GDVIRTUAL1RC(int64_t, _name_to_tag, const String &); + GDVIRTUAL1RC(String, _tag_to_name, int64_t); /* Font interface */ + virtual RID create_font() override; - GDVIRTUAL0R(RID, create_font); + GDVIRTUAL0R(RID, _create_font); virtual void font_set_data(const RID &p_font_rid, const PackedByteArray &p_data) override; virtual void font_set_data_ptr(const RID &p_font_rid, const uint8_t *p_data_ptr, int64_t p_data_size) override; - GDVIRTUAL2(font_set_data, RID, const PackedByteArray &); - GDVIRTUAL3(font_set_data_ptr, RID, GDNativeConstPtr<const uint8_t>, int64_t); + GDVIRTUAL2(_font_set_data, RID, const PackedByteArray &); + GDVIRTUAL3(_font_set_data_ptr, RID, GDNativeConstPtr<const uint8_t>, int64_t); virtual void font_set_face_index(const RID &p_font_rid, int64_t p_index) override; virtual int64_t font_get_face_index(const RID &p_font_rid) const override; - GDVIRTUAL2(font_set_face_index, RID, int64_t); - GDVIRTUAL1RC(int64_t, font_get_face_index, RID); + GDVIRTUAL2(_font_set_face_index, RID, int64_t); + GDVIRTUAL1RC(int64_t, _font_get_face_index, RID); virtual int64_t font_get_face_count(const RID &p_font_rid) const override; - GDVIRTUAL1RC(int64_t, font_get_face_count, RID); + GDVIRTUAL1RC(int64_t, _font_get_face_count, RID); virtual void font_set_style(const RID &p_font_rid, BitField<FontStyle> p_style) override; virtual BitField<FontStyle> font_get_style(const RID &p_font_rid) const override; - GDVIRTUAL2(font_set_style, RID, BitField<FontStyle>); - GDVIRTUAL1RC(BitField<FontStyle>, font_get_style, RID); + GDVIRTUAL2(_font_set_style, RID, BitField<FontStyle>); + GDVIRTUAL1RC(BitField<FontStyle>, _font_get_style, RID); virtual void font_set_name(const RID &p_font_rid, const String &p_name) override; virtual String font_get_name(const RID &p_font_rid) const override; - GDVIRTUAL2(font_set_name, RID, const String &); - GDVIRTUAL1RC(String, font_get_name, RID); + GDVIRTUAL2(_font_set_name, RID, const String &); + GDVIRTUAL1RC(String, _font_get_name, RID); virtual void font_set_style_name(const RID &p_font_rid, const String &p_name) override; virtual String font_get_style_name(const RID &p_font_rid) const override; - GDVIRTUAL2(font_set_style_name, RID, const String &); - GDVIRTUAL1RC(String, font_get_style_name, RID); + GDVIRTUAL2(_font_set_style_name, RID, const String &); + GDVIRTUAL1RC(String, _font_get_style_name, RID); - virtual void font_set_antialiasing(RID p_font_rid, TextServer::FontAntialiasing p_antialiasing) override; - virtual TextServer::FontAntialiasing font_get_antialiasing(RID p_font_rid) const override; - GDVIRTUAL2(font_set_antialiasing, RID, TextServer::FontAntialiasing); - GDVIRTUAL1RC(TextServer::FontAntialiasing, font_get_antialiasing, RID); + virtual void font_set_antialiasing(const RID &p_font_rid, TextServer::FontAntialiasing p_antialiasing) override; + virtual TextServer::FontAntialiasing font_get_antialiasing(const RID &p_font_rid) const override; + GDVIRTUAL2(_font_set_antialiasing, RID, TextServer::FontAntialiasing); + GDVIRTUAL1RC(TextServer::FontAntialiasing, _font_get_antialiasing, RID); virtual void font_set_generate_mipmaps(const RID &p_font_rid, bool p_generate_mipmaps) override; virtual bool font_get_generate_mipmaps(const RID &p_font_rid) const override; - GDVIRTUAL2(font_set_generate_mipmaps, RID, bool); - GDVIRTUAL1RC(bool, font_get_generate_mipmaps, RID); + GDVIRTUAL2(_font_set_generate_mipmaps, RID, bool); + GDVIRTUAL1RC(bool, _font_get_generate_mipmaps, RID); virtual void font_set_multichannel_signed_distance_field(const RID &p_font_rid, bool p_msdf) override; virtual bool font_is_multichannel_signed_distance_field(const RID &p_font_rid) const override; - GDVIRTUAL2(font_set_multichannel_signed_distance_field, RID, bool); - GDVIRTUAL1RC(bool, font_is_multichannel_signed_distance_field, RID); + GDVIRTUAL2(_font_set_multichannel_signed_distance_field, RID, bool); + GDVIRTUAL1RC(bool, _font_is_multichannel_signed_distance_field, RID); virtual void font_set_msdf_pixel_range(const RID &p_font_rid, int64_t p_msdf_pixel_range) override; virtual int64_t font_get_msdf_pixel_range(const RID &p_font_rid) const override; - GDVIRTUAL2(font_set_msdf_pixel_range, RID, int64_t); - GDVIRTUAL1RC(int64_t, font_get_msdf_pixel_range, RID); + GDVIRTUAL2(_font_set_msdf_pixel_range, RID, int64_t); + GDVIRTUAL1RC(int64_t, _font_get_msdf_pixel_range, RID); virtual void font_set_msdf_size(const RID &p_font_rid, int64_t p_msdf_size) override; virtual int64_t font_get_msdf_size(const RID &p_font_rid) const override; - GDVIRTUAL2(font_set_msdf_size, RID, int64_t); - GDVIRTUAL1RC(int64_t, font_get_msdf_size, RID); + GDVIRTUAL2(_font_set_msdf_size, RID, int64_t); + GDVIRTUAL1RC(int64_t, _font_get_msdf_size, RID); virtual void font_set_fixed_size(const RID &p_font_rid, int64_t p_fixed_size) override; virtual int64_t font_get_fixed_size(const RID &p_font_rid) const override; - GDVIRTUAL2(font_set_fixed_size, RID, int64_t); - GDVIRTUAL1RC(int64_t, font_get_fixed_size, RID); + GDVIRTUAL2(_font_set_fixed_size, RID, int64_t); + GDVIRTUAL1RC(int64_t, _font_get_fixed_size, RID); virtual void font_set_subpixel_positioning(const RID &p_font_rid, SubpixelPositioning p_subpixel) override; virtual SubpixelPositioning font_get_subpixel_positioning(const RID &p_font_rid) const override; - GDVIRTUAL2(font_set_subpixel_positioning, RID, SubpixelPositioning); - GDVIRTUAL1RC(SubpixelPositioning, font_get_subpixel_positioning, RID); + GDVIRTUAL2(_font_set_subpixel_positioning, RID, SubpixelPositioning); + GDVIRTUAL1RC(SubpixelPositioning, _font_get_subpixel_positioning, RID); virtual void font_set_embolden(const RID &p_font_rid, double p_strength) override; virtual double font_get_embolden(const RID &p_font_rid) const override; - GDVIRTUAL2(font_set_embolden, RID, double); - GDVIRTUAL1RC(double, font_get_embolden, RID); + GDVIRTUAL2(_font_set_embolden, RID, double); + GDVIRTUAL1RC(double, _font_get_embolden, RID); virtual void font_set_transform(const RID &p_font_rid, const Transform2D &p_transform) override; virtual Transform2D font_get_transform(const RID &p_font_rid) const override; - GDVIRTUAL2(font_set_transform, RID, Transform2D); - GDVIRTUAL1RC(Transform2D, font_get_transform, RID); + GDVIRTUAL2(_font_set_transform, RID, Transform2D); + GDVIRTUAL1RC(Transform2D, _font_get_transform, RID); virtual void font_set_force_autohinter(const RID &p_font_rid, bool p_force_autohinter) override; virtual bool font_is_force_autohinter(const RID &p_font_rid) const override; - GDVIRTUAL2(font_set_force_autohinter, RID, bool); - GDVIRTUAL1RC(bool, font_is_force_autohinter, RID); + GDVIRTUAL2(_font_set_force_autohinter, RID, bool); + GDVIRTUAL1RC(bool, _font_is_force_autohinter, RID); virtual void font_set_hinting(const RID &p_font_rid, Hinting p_hinting) override; virtual Hinting font_get_hinting(const RID &p_font_rid) const override; - GDVIRTUAL2(font_set_hinting, RID, Hinting); - GDVIRTUAL1RC(Hinting, font_get_hinting, RID); + GDVIRTUAL2(_font_set_hinting, RID, Hinting); + GDVIRTUAL1RC(Hinting, _font_get_hinting, RID); virtual void font_set_variation_coordinates(const RID &p_font_rid, const Dictionary &p_variation_coordinates) override; virtual Dictionary font_get_variation_coordinates(const RID &p_font_rid) const override; - GDVIRTUAL2(font_set_variation_coordinates, RID, Dictionary); - GDVIRTUAL1RC(Dictionary, font_get_variation_coordinates, RID); + GDVIRTUAL2(_font_set_variation_coordinates, RID, Dictionary); + GDVIRTUAL1RC(Dictionary, _font_get_variation_coordinates, RID); virtual void font_set_oversampling(const RID &p_font_rid, double p_oversampling) override; virtual double font_get_oversampling(const RID &p_font_rid) const override; - GDVIRTUAL2(font_set_oversampling, RID, double); - GDVIRTUAL1RC(double, font_get_oversampling, RID); + GDVIRTUAL2(_font_set_oversampling, RID, double); + GDVIRTUAL1RC(double, _font_get_oversampling, RID); virtual TypedArray<Vector2i> font_get_size_cache_list(const RID &p_font_rid) const override; virtual void font_clear_size_cache(const RID &p_font_rid) override; virtual void font_remove_size_cache(const RID &p_font_rid, const Vector2i &p_size) override; - GDVIRTUAL1RC(TypedArray<Vector2i>, font_get_size_cache_list, RID); - GDVIRTUAL1(font_clear_size_cache, RID); - GDVIRTUAL2(font_remove_size_cache, RID, const Vector2i &); + GDVIRTUAL1RC(TypedArray<Vector2i>, _font_get_size_cache_list, RID); + GDVIRTUAL1(_font_clear_size_cache, RID); + GDVIRTUAL2(_font_remove_size_cache, RID, const Vector2i &); virtual void font_set_ascent(const RID &p_font_rid, int64_t p_size, double p_ascent) override; virtual double font_get_ascent(const RID &p_font_rid, int64_t p_size) const override; - GDVIRTUAL3(font_set_ascent, RID, int64_t, double); - GDVIRTUAL2RC(double, font_get_ascent, RID, int64_t); + GDVIRTUAL3(_font_set_ascent, RID, int64_t, double); + GDVIRTUAL2RC(double, _font_get_ascent, RID, int64_t); virtual void font_set_descent(const RID &p_font_rid, int64_t p_size, double p_descent) override; virtual double font_get_descent(const RID &p_font_rid, int64_t p_size) const override; - GDVIRTUAL3(font_set_descent, RID, int64_t, double); - GDVIRTUAL2RC(double, font_get_descent, RID, int64_t); + GDVIRTUAL3(_font_set_descent, RID, int64_t, double); + GDVIRTUAL2RC(double, _font_get_descent, RID, int64_t); virtual void font_set_underline_position(const RID &p_font_rid, int64_t p_size, double p_underline_position) override; virtual double font_get_underline_position(const RID &p_font_rid, int64_t p_size) const override; - GDVIRTUAL3(font_set_underline_position, RID, int64_t, double); - GDVIRTUAL2RC(double, font_get_underline_position, RID, int64_t); + GDVIRTUAL3(_font_set_underline_position, RID, int64_t, double); + GDVIRTUAL2RC(double, _font_get_underline_position, RID, int64_t); virtual void font_set_underline_thickness(const RID &p_font_rid, int64_t p_size, double p_underline_thickness) override; virtual double font_get_underline_thickness(const RID &p_font_rid, int64_t p_size) const override; - GDVIRTUAL3(font_set_underline_thickness, RID, int64_t, double); - GDVIRTUAL2RC(double, font_get_underline_thickness, RID, int64_t); + GDVIRTUAL3(_font_set_underline_thickness, RID, int64_t, double); + GDVIRTUAL2RC(double, _font_get_underline_thickness, RID, int64_t); virtual void font_set_scale(const RID &p_font_rid, int64_t p_size, double p_scale) override; virtual double font_get_scale(const RID &p_font_rid, int64_t p_size) const override; - GDVIRTUAL3(font_set_scale, RID, int64_t, double); - GDVIRTUAL2RC(double, font_get_scale, RID, int64_t); + GDVIRTUAL3(_font_set_scale, RID, int64_t, double); + GDVIRTUAL2RC(double, _font_get_scale, RID, int64_t); virtual int64_t font_get_texture_count(const RID &p_font_rid, const Vector2i &p_size) const override; virtual void font_clear_textures(const RID &p_font_rid, const Vector2i &p_size) override; virtual void font_remove_texture(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index) override; - GDVIRTUAL2RC(int64_t, font_get_texture_count, RID, const Vector2i &); - GDVIRTUAL2(font_clear_textures, RID, const Vector2i &); - GDVIRTUAL3(font_remove_texture, RID, const Vector2i &, int64_t); + GDVIRTUAL2RC(int64_t, _font_get_texture_count, RID, const Vector2i &); + GDVIRTUAL2(_font_clear_textures, RID, const Vector2i &); + GDVIRTUAL3(_font_remove_texture, RID, const Vector2i &, int64_t); virtual void font_set_texture_image(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index, const Ref<Image> &p_image) override; virtual Ref<Image> font_get_texture_image(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index) const override; - GDVIRTUAL4(font_set_texture_image, RID, const Vector2i &, int64_t, const Ref<Image> &); - GDVIRTUAL3RC(Ref<Image>, font_get_texture_image, RID, const Vector2i &, int64_t); + GDVIRTUAL4(_font_set_texture_image, RID, const Vector2i &, int64_t, const Ref<Image> &); + GDVIRTUAL3RC(Ref<Image>, _font_get_texture_image, RID, const Vector2i &, int64_t); virtual void font_set_texture_offsets(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index, const PackedInt32Array &p_offset) override; virtual PackedInt32Array font_get_texture_offsets(const RID &p_font_rid, const Vector2i &p_size, int64_t p_texture_index) const override; - GDVIRTUAL4(font_set_texture_offsets, RID, const Vector2i &, int64_t, const PackedInt32Array &); - GDVIRTUAL3RC(PackedInt32Array, font_get_texture_offsets, RID, const Vector2i &, int64_t); + GDVIRTUAL4(_font_set_texture_offsets, RID, const Vector2i &, int64_t, const PackedInt32Array &); + GDVIRTUAL3RC(PackedInt32Array, _font_get_texture_offsets, RID, const Vector2i &, int64_t); virtual PackedInt32Array font_get_glyph_list(const RID &p_font_rid, const Vector2i &p_size) const override; virtual void font_clear_glyphs(const RID &p_font_rid, const Vector2i &p_size) override; virtual void font_remove_glyph(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) override; - GDVIRTUAL2RC(PackedInt32Array, font_get_glyph_list, RID, const Vector2i &); - GDVIRTUAL2(font_clear_glyphs, RID, const Vector2i &); - GDVIRTUAL3(font_remove_glyph, RID, const Vector2i &, int64_t); + GDVIRTUAL2RC(PackedInt32Array, _font_get_glyph_list, RID, const Vector2i &); + GDVIRTUAL2(_font_clear_glyphs, RID, const Vector2i &); + GDVIRTUAL3(_font_remove_glyph, RID, const Vector2i &, int64_t); virtual Vector2 font_get_glyph_advance(const RID &p_font_rid, int64_t p_size, int64_t p_glyph) const override; virtual void font_set_glyph_advance(const RID &p_font_rid, int64_t p_size, int64_t p_glyph, const Vector2 &p_advance) override; - GDVIRTUAL3RC(Vector2, font_get_glyph_advance, RID, int64_t, int64_t); - GDVIRTUAL4(font_set_glyph_advance, RID, int64_t, int64_t, const Vector2 &); + GDVIRTUAL3RC(Vector2, _font_get_glyph_advance, RID, int64_t, int64_t); + GDVIRTUAL4(_font_set_glyph_advance, RID, int64_t, int64_t, const Vector2 &); virtual Vector2 font_get_glyph_offset(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const override; virtual void font_set_glyph_offset(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, const Vector2 &p_offset) override; - GDVIRTUAL3RC(Vector2, font_get_glyph_offset, RID, const Vector2i &, int64_t); - GDVIRTUAL4(font_set_glyph_offset, RID, const Vector2i &, int64_t, const Vector2 &); + GDVIRTUAL3RC(Vector2, _font_get_glyph_offset, RID, const Vector2i &, int64_t); + GDVIRTUAL4(_font_set_glyph_offset, RID, const Vector2i &, int64_t, const Vector2 &); virtual Vector2 font_get_glyph_size(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const override; virtual void font_set_glyph_size(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, const Vector2 &p_gl_size) override; - GDVIRTUAL3RC(Vector2, font_get_glyph_size, RID, const Vector2i &, int64_t); - GDVIRTUAL4(font_set_glyph_size, RID, const Vector2i &, int64_t, const Vector2 &); + GDVIRTUAL3RC(Vector2, _font_get_glyph_size, RID, const Vector2i &, int64_t); + GDVIRTUAL4(_font_set_glyph_size, RID, const Vector2i &, int64_t, const Vector2 &); virtual Rect2 font_get_glyph_uv_rect(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const override; virtual void font_set_glyph_uv_rect(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, const Rect2 &p_uv_rect) override; - GDVIRTUAL3RC(Rect2, font_get_glyph_uv_rect, RID, const Vector2i &, int64_t); - GDVIRTUAL4(font_set_glyph_uv_rect, RID, const Vector2i &, int64_t, const Rect2 &); + GDVIRTUAL3RC(Rect2, _font_get_glyph_uv_rect, RID, const Vector2i &, int64_t); + GDVIRTUAL4(_font_set_glyph_uv_rect, RID, const Vector2i &, int64_t, const Rect2 &); virtual int64_t font_get_glyph_texture_idx(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const override; virtual void font_set_glyph_texture_idx(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph, int64_t p_texture_idx) override; - GDVIRTUAL3RC(int64_t, font_get_glyph_texture_idx, RID, const Vector2i &, int64_t); - GDVIRTUAL4(font_set_glyph_texture_idx, RID, const Vector2i &, int64_t, int64_t); + GDVIRTUAL3RC(int64_t, _font_get_glyph_texture_idx, RID, const Vector2i &, int64_t); + GDVIRTUAL4(_font_set_glyph_texture_idx, RID, const Vector2i &, int64_t, int64_t); virtual RID font_get_glyph_texture_rid(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const override; - GDVIRTUAL3RC(RID, font_get_glyph_texture_rid, RID, const Vector2i &, int64_t); + GDVIRTUAL3RC(RID, _font_get_glyph_texture_rid, RID, const Vector2i &, int64_t); virtual Size2 font_get_glyph_texture_size(const RID &p_font_rid, const Vector2i &p_size, int64_t p_glyph) const override; - GDVIRTUAL3RC(Size2, font_get_glyph_texture_size, RID, const Vector2i &, int64_t); + GDVIRTUAL3RC(Size2, _font_get_glyph_texture_size, RID, const Vector2i &, int64_t); virtual Dictionary font_get_glyph_contours(const RID &p_font, int64_t p_size, int64_t p_index) const override; - GDVIRTUAL3RC(Dictionary, font_get_glyph_contours, RID, int64_t, int64_t); + GDVIRTUAL3RC(Dictionary, _font_get_glyph_contours, RID, int64_t, int64_t); virtual TypedArray<Vector2i> font_get_kerning_list(const RID &p_font_rid, int64_t p_size) const override; virtual void font_clear_kerning_map(const RID &p_font_rid, int64_t p_size) override; virtual void font_remove_kerning(const RID &p_font_rid, int64_t p_size, const Vector2i &p_glyph_pair) override; - GDVIRTUAL2RC(TypedArray<Vector2i>, font_get_kerning_list, RID, int64_t); - GDVIRTUAL2(font_clear_kerning_map, RID, int64_t); - GDVIRTUAL3(font_remove_kerning, RID, int64_t, const Vector2i &); + GDVIRTUAL2RC(TypedArray<Vector2i>, _font_get_kerning_list, RID, int64_t); + GDVIRTUAL2(_font_clear_kerning_map, RID, int64_t); + GDVIRTUAL3(_font_remove_kerning, RID, int64_t, const Vector2i &); virtual void font_set_kerning(const RID &p_font_rid, int64_t p_size, const Vector2i &p_glyph_pair, const Vector2 &p_kerning) override; virtual Vector2 font_get_kerning(const RID &p_font_rid, int64_t p_size, const Vector2i &p_glyph_pair) const override; - GDVIRTUAL4(font_set_kerning, RID, int64_t, const Vector2i &, const Vector2 &); - GDVIRTUAL3RC(Vector2, font_get_kerning, RID, int64_t, const Vector2i &); + GDVIRTUAL4(_font_set_kerning, RID, int64_t, const Vector2i &, const Vector2 &); + GDVIRTUAL3RC(Vector2, _font_get_kerning, RID, int64_t, const Vector2i &); virtual int64_t font_get_glyph_index(const RID &p_font_rid, int64_t p_size, int64_t p_char, int64_t p_variation_selector = 0) const override; - GDVIRTUAL4RC(int64_t, font_get_glyph_index, RID, int64_t, int64_t, int64_t); + GDVIRTUAL4RC(int64_t, _font_get_glyph_index, RID, int64_t, int64_t, int64_t); virtual bool font_has_char(const RID &p_font_rid, int64_t p_char) const override; virtual String font_get_supported_chars(const RID &p_font_rid) const override; - GDVIRTUAL2RC(bool, font_has_char, RID, int64_t); - GDVIRTUAL1RC(String, font_get_supported_chars, RID); + GDVIRTUAL2RC(bool, _font_has_char, RID, int64_t); + GDVIRTUAL1RC(String, _font_get_supported_chars, RID); virtual void font_render_range(const RID &p_font, const Vector2i &p_size, int64_t p_start, int64_t p_end) override; virtual void font_render_glyph(const RID &p_font_rid, const Vector2i &p_size, int64_t p_index) override; - GDVIRTUAL4(font_render_range, RID, const Vector2i &, int64_t, int64_t); - GDVIRTUAL3(font_render_glyph, RID, const Vector2i &, int64_t); + GDVIRTUAL4(_font_render_range, RID, const Vector2i &, int64_t, int64_t); + GDVIRTUAL3(_font_render_glyph, RID, const Vector2i &, int64_t); virtual void font_draw_glyph(const RID &p_font, const RID &p_canvas, int64_t p_size, const Vector2 &p_pos, int64_t p_index, const Color &p_color = Color(1, 1, 1)) const override; virtual void font_draw_glyph_outline(const RID &p_font, const RID &p_canvas, int64_t p_size, int64_t p_outline_size, const Vector2 &p_pos, int64_t p_index, const Color &p_color = Color(1, 1, 1)) const override; - GDVIRTUAL6C(font_draw_glyph, RID, RID, int64_t, const Vector2 &, int64_t, const Color &); - GDVIRTUAL7C(font_draw_glyph_outline, RID, RID, int64_t, int64_t, const Vector2 &, int64_t, const Color &); + GDVIRTUAL6C(_font_draw_glyph, RID, RID, int64_t, const Vector2 &, int64_t, const Color &); + GDVIRTUAL7C(_font_draw_glyph_outline, RID, RID, int64_t, int64_t, const Vector2 &, int64_t, const Color &); virtual bool font_is_language_supported(const RID &p_font_rid, const String &p_language) const override; virtual void font_set_language_support_override(const RID &p_font_rid, const String &p_language, bool p_supported) override; virtual bool font_get_language_support_override(const RID &p_font_rid, const String &p_language) override; virtual void font_remove_language_support_override(const RID &p_font_rid, const String &p_language) override; virtual PackedStringArray font_get_language_support_overrides(const RID &p_font_rid) override; - GDVIRTUAL2RC(bool, font_is_language_supported, RID, const String &); - GDVIRTUAL3(font_set_language_support_override, RID, const String &, bool); - GDVIRTUAL2R(bool, font_get_language_support_override, RID, const String &); - GDVIRTUAL2(font_remove_language_support_override, RID, const String &); - GDVIRTUAL1R(PackedStringArray, font_get_language_support_overrides, RID); + GDVIRTUAL2RC(bool, _font_is_language_supported, RID, const String &); + GDVIRTUAL3(_font_set_language_support_override, RID, const String &, bool); + GDVIRTUAL2R(bool, _font_get_language_support_override, RID, const String &); + GDVIRTUAL2(_font_remove_language_support_override, RID, const String &); + GDVIRTUAL1R(PackedStringArray, _font_get_language_support_overrides, RID); virtual bool font_is_script_supported(const RID &p_font_rid, const String &p_script) const override; virtual void font_set_script_support_override(const RID &p_font_rid, const String &p_script, bool p_supported) override; virtual bool font_get_script_support_override(const RID &p_font_rid, const String &p_script) override; virtual void font_remove_script_support_override(const RID &p_font_rid, const String &p_script) override; virtual PackedStringArray font_get_script_support_overrides(const RID &p_font_rid) override; - GDVIRTUAL2RC(bool, font_is_script_supported, RID, const String &); - GDVIRTUAL3(font_set_script_support_override, RID, const String &, bool); - GDVIRTUAL2R(bool, font_get_script_support_override, RID, const String &); - GDVIRTUAL2(font_remove_script_support_override, RID, const String &); - GDVIRTUAL1R(PackedStringArray, font_get_script_support_overrides, RID); + GDVIRTUAL2RC(bool, _font_is_script_supported, RID, const String &); + GDVIRTUAL3(_font_set_script_support_override, RID, const String &, bool); + GDVIRTUAL2R(bool, _font_get_script_support_override, RID, const String &); + GDVIRTUAL2(_font_remove_script_support_override, RID, const String &); + GDVIRTUAL1R(PackedStringArray, _font_get_script_support_overrides, RID); virtual void font_set_opentype_feature_overrides(const RID &p_font_rid, const Dictionary &p_overrides) override; virtual Dictionary font_get_opentype_feature_overrides(const RID &p_font_rid) const override; - GDVIRTUAL2(font_set_opentype_feature_overrides, RID, const Dictionary &); - GDVIRTUAL1RC(Dictionary, font_get_opentype_feature_overrides, RID); + GDVIRTUAL2(_font_set_opentype_feature_overrides, RID, const Dictionary &); + GDVIRTUAL1RC(Dictionary, _font_get_opentype_feature_overrides, RID); virtual Dictionary font_supported_feature_list(const RID &p_font_rid) const override; virtual Dictionary font_supported_variation_list(const RID &p_font_rid) const override; - GDVIRTUAL1RC(Dictionary, font_supported_feature_list, RID); - GDVIRTUAL1RC(Dictionary, font_supported_variation_list, RID); + GDVIRTUAL1RC(Dictionary, _font_supported_feature_list, RID); + GDVIRTUAL1RC(Dictionary, _font_supported_variation_list, RID); virtual double font_get_global_oversampling() const override; virtual void font_set_global_oversampling(double p_oversampling) override; - GDVIRTUAL0RC(double, font_get_global_oversampling); - GDVIRTUAL1(font_set_global_oversampling, double); + GDVIRTUAL0RC(double, _font_get_global_oversampling); + GDVIRTUAL1(_font_set_global_oversampling, double); virtual Vector2 get_hex_code_box_size(int64_t p_size, int64_t p_index) const override; virtual void draw_hex_code_box(const RID &p_canvas, int64_t p_size, const Vector2 &p_pos, int64_t p_index, const Color &p_color) const override; - GDVIRTUAL2RC(Vector2, get_hex_code_box_size, int64_t, int64_t); - GDVIRTUAL5C(draw_hex_code_box, RID, int64_t, const Vector2 &, int64_t, const Color &); + GDVIRTUAL2RC(Vector2, _get_hex_code_box_size, int64_t, int64_t); + GDVIRTUAL5C(_draw_hex_code_box, RID, int64_t, const Vector2 &, int64_t, const Color &); /* Shaped text buffer interface */ virtual RID create_shaped_text(Direction p_direction = DIRECTION_AUTO, Orientation p_orientation = ORIENTATION_HORIZONTAL) override; - GDVIRTUAL2R(RID, create_shaped_text, Direction, Orientation); + GDVIRTUAL2R(RID, _create_shaped_text, Direction, Orientation); virtual void shaped_text_clear(const RID &p_shaped) override; - GDVIRTUAL1(shaped_text_clear, RID); + GDVIRTUAL1(_shaped_text_clear, RID); virtual void shaped_text_set_direction(const RID &p_shaped, Direction p_direction = DIRECTION_AUTO) override; virtual Direction shaped_text_get_direction(const RID &p_shaped) const override; virtual Direction shaped_text_get_inferred_direction(const RID &p_shaped) const override; - GDVIRTUAL2(shaped_text_set_direction, RID, Direction); - GDVIRTUAL1RC(Direction, shaped_text_get_direction, RID); - GDVIRTUAL1RC(Direction, shaped_text_get_inferred_direction, RID); + GDVIRTUAL2(_shaped_text_set_direction, RID, Direction); + GDVIRTUAL1RC(Direction, _shaped_text_get_direction, RID); + GDVIRTUAL1RC(Direction, _shaped_text_get_inferred_direction, RID); virtual void shaped_text_set_bidi_override(const RID &p_shaped, const Array &p_override) override; - GDVIRTUAL2(shaped_text_set_bidi_override, RID, const Array &); + GDVIRTUAL2(_shaped_text_set_bidi_override, RID, const Array &); virtual void shaped_text_set_custom_punctuation(const RID &p_shaped, const String &p_punct) override; virtual String shaped_text_get_custom_punctuation(const RID &p_shaped) const override; - GDVIRTUAL2(shaped_text_set_custom_punctuation, RID, String); - GDVIRTUAL1RC(String, shaped_text_get_custom_punctuation, RID); + GDVIRTUAL2(_shaped_text_set_custom_punctuation, RID, String); + GDVIRTUAL1RC(String, _shaped_text_get_custom_punctuation, RID); virtual void shaped_text_set_orientation(const RID &p_shaped, Orientation p_orientation = ORIENTATION_HORIZONTAL) override; virtual Orientation shaped_text_get_orientation(const RID &p_shaped) const override; - GDVIRTUAL2(shaped_text_set_orientation, RID, Orientation); - GDVIRTUAL1RC(Orientation, shaped_text_get_orientation, RID); + GDVIRTUAL2(_shaped_text_set_orientation, RID, Orientation); + GDVIRTUAL1RC(Orientation, _shaped_text_get_orientation, RID); virtual void shaped_text_set_preserve_invalid(const RID &p_shaped, bool p_enabled) override; virtual bool shaped_text_get_preserve_invalid(const RID &p_shaped) const override; - GDVIRTUAL2(shaped_text_set_preserve_invalid, RID, bool); - GDVIRTUAL1RC(bool, shaped_text_get_preserve_invalid, RID); + GDVIRTUAL2(_shaped_text_set_preserve_invalid, RID, bool); + GDVIRTUAL1RC(bool, _shaped_text_get_preserve_invalid, RID); virtual void shaped_text_set_preserve_control(const RID &p_shaped, bool p_enabled) override; virtual bool shaped_text_get_preserve_control(const RID &p_shaped) const override; - GDVIRTUAL2(shaped_text_set_preserve_control, RID, bool); - GDVIRTUAL1RC(bool, shaped_text_get_preserve_control, RID); + GDVIRTUAL2(_shaped_text_set_preserve_control, RID, bool); + GDVIRTUAL1RC(bool, _shaped_text_get_preserve_control, RID); virtual void shaped_text_set_spacing(const RID &p_shaped, SpacingType p_spacing, int64_t p_value) override; virtual int64_t shaped_text_get_spacing(const RID &p_shaped, SpacingType p_spacing) const override; - GDVIRTUAL3(shaped_text_set_spacing, RID, SpacingType, int64_t); - GDVIRTUAL2RC(int64_t, shaped_text_get_spacing, RID, SpacingType); + GDVIRTUAL3(_shaped_text_set_spacing, RID, SpacingType, int64_t); + GDVIRTUAL2RC(int64_t, _shaped_text_get_spacing, RID, SpacingType); virtual bool shaped_text_add_string(const RID &p_shaped, const String &p_text, const TypedArray<RID> &p_fonts, int64_t p_size, const Dictionary &p_opentype_features = Dictionary(), const String &p_language = "", const Variant &p_meta = Variant()) override; virtual bool shaped_text_add_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER, int64_t p_length = 1) override; virtual bool shaped_text_resize_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER) override; - GDVIRTUAL7R(bool, shaped_text_add_string, RID, const String &, const TypedArray<RID> &, int64_t, const Dictionary &, const String &, const Variant &); - GDVIRTUAL5R(bool, shaped_text_add_object, RID, const Variant &, const Size2 &, InlineAlignment, int64_t); - GDVIRTUAL4R(bool, shaped_text_resize_object, RID, const Variant &, const Size2 &, InlineAlignment); + GDVIRTUAL7R(bool, _shaped_text_add_string, RID, const String &, const TypedArray<RID> &, int64_t, const Dictionary &, const String &, const Variant &); + GDVIRTUAL5R(bool, _shaped_text_add_object, RID, const Variant &, const Size2 &, InlineAlignment, int64_t); + GDVIRTUAL4R(bool, _shaped_text_resize_object, RID, const Variant &, const Size2 &, InlineAlignment); virtual int64_t shaped_get_span_count(const RID &p_shaped) const override; virtual Variant shaped_get_span_meta(const RID &p_shaped, int64_t p_index) const override; virtual void shaped_set_span_update_font(const RID &p_shaped, int64_t p_index, const TypedArray<RID> &p_fonts, int64_t p_size, const Dictionary &p_opentype_features = Dictionary()) override; - GDVIRTUAL1RC(int64_t, shaped_get_span_count, RID); - GDVIRTUAL2RC(Variant, shaped_get_span_meta, RID, int64_t); - GDVIRTUAL5(shaped_set_span_update_font, RID, int64_t, const TypedArray<RID> &, int64_t, const Dictionary &); + GDVIRTUAL1RC(int64_t, _shaped_get_span_count, RID); + GDVIRTUAL2RC(Variant, _shaped_get_span_meta, RID, int64_t); + GDVIRTUAL5(_shaped_set_span_update_font, RID, int64_t, const TypedArray<RID> &, int64_t, const Dictionary &); virtual RID shaped_text_substr(const RID &p_shaped, int64_t p_start, int64_t p_length) const override; virtual RID shaped_text_get_parent(const RID &p_shaped) const override; - GDVIRTUAL3RC(RID, shaped_text_substr, RID, int64_t, int64_t); - GDVIRTUAL1RC(RID, shaped_text_get_parent, RID); + GDVIRTUAL3RC(RID, _shaped_text_substr, RID, int64_t, int64_t); + GDVIRTUAL1RC(RID, _shaped_text_get_parent, RID); virtual double shaped_text_fit_to_width(const RID &p_shaped, double p_width, BitField<TextServer::JustificationFlag> p_jst_flags = JUSTIFICATION_WORD_BOUND | JUSTIFICATION_KASHIDA) override; virtual double shaped_text_tab_align(const RID &p_shaped, const PackedFloat32Array &p_tab_stops) override; - GDVIRTUAL3R(double, shaped_text_fit_to_width, RID, double, BitField<TextServer::JustificationFlag>); - GDVIRTUAL2R(double, shaped_text_tab_align, RID, const PackedFloat32Array &); + GDVIRTUAL3R(double, _shaped_text_fit_to_width, RID, double, BitField<TextServer::JustificationFlag>); + GDVIRTUAL2R(double, _shaped_text_tab_align, RID, const PackedFloat32Array &); virtual bool shaped_text_shape(const RID &p_shaped) override; virtual bool shaped_text_update_breaks(const RID &p_shaped) override; virtual bool shaped_text_update_justification_ops(const RID &p_shaped) override; - GDVIRTUAL1R(bool, shaped_text_shape, RID); - GDVIRTUAL1R(bool, shaped_text_update_breaks, RID); - GDVIRTUAL1R(bool, shaped_text_update_justification_ops, RID); + GDVIRTUAL1R(bool, _shaped_text_shape, RID); + GDVIRTUAL1R(bool, _shaped_text_update_breaks, RID); + GDVIRTUAL1R(bool, _shaped_text_update_justification_ops, RID); virtual bool shaped_text_is_ready(const RID &p_shaped) const override; - GDVIRTUAL1RC(bool, shaped_text_is_ready, RID); + GDVIRTUAL1RC(bool, _shaped_text_is_ready, RID); virtual const Glyph *shaped_text_get_glyphs(const RID &p_shaped) const override; virtual const Glyph *shaped_text_sort_logical(const RID &p_shaped) override; virtual int64_t shaped_text_get_glyph_count(const RID &p_shaped) const override; - GDVIRTUAL1RC(GDNativeConstPtr<const Glyph>, shaped_text_get_glyphs, RID); - GDVIRTUAL1R(GDNativeConstPtr<const Glyph>, shaped_text_sort_logical, RID); - GDVIRTUAL1RC(int64_t, shaped_text_get_glyph_count, RID); + GDVIRTUAL1RC(GDNativeConstPtr<const Glyph>, _shaped_text_get_glyphs, RID); + GDVIRTUAL1R(GDNativeConstPtr<const Glyph>, _shaped_text_sort_logical, RID); + GDVIRTUAL1RC(int64_t, _shaped_text_get_glyph_count, RID); virtual Vector2i shaped_text_get_range(const RID &p_shaped) const override; - GDVIRTUAL1RC(Vector2i, shaped_text_get_range, RID); + GDVIRTUAL1RC(Vector2i, _shaped_text_get_range, RID); virtual PackedInt32Array shaped_text_get_line_breaks_adv(const RID &p_shaped, const PackedFloat32Array &p_width, int64_t p_start = 0, bool p_once = true, BitField<TextServer::LineBreakFlag> p_break_flags = BREAK_MANDATORY | BREAK_WORD_BOUND) const override; virtual PackedInt32Array shaped_text_get_line_breaks(const RID &p_shaped, double p_width, int64_t p_start = 0, BitField<TextServer::LineBreakFlag> p_break_flags = BREAK_MANDATORY | BREAK_WORD_BOUND) const override; virtual PackedInt32Array shaped_text_get_word_breaks(const RID &p_shaped, BitField<TextServer::GraphemeFlag> p_grapheme_flags = GRAPHEME_IS_SPACE | GRAPHEME_IS_PUNCTUATION) const override; - GDVIRTUAL5RC(PackedInt32Array, shaped_text_get_line_breaks_adv, RID, const PackedFloat32Array &, int64_t, bool, BitField<TextServer::LineBreakFlag>); - GDVIRTUAL4RC(PackedInt32Array, shaped_text_get_line_breaks, RID, double, int64_t, BitField<TextServer::LineBreakFlag>); - GDVIRTUAL2RC(PackedInt32Array, shaped_text_get_word_breaks, RID, BitField<TextServer::GraphemeFlag>); + GDVIRTUAL5RC(PackedInt32Array, _shaped_text_get_line_breaks_adv, RID, const PackedFloat32Array &, int64_t, bool, BitField<TextServer::LineBreakFlag>); + GDVIRTUAL4RC(PackedInt32Array, _shaped_text_get_line_breaks, RID, double, int64_t, BitField<TextServer::LineBreakFlag>); + GDVIRTUAL2RC(PackedInt32Array, _shaped_text_get_word_breaks, RID, BitField<TextServer::GraphemeFlag>); virtual int64_t shaped_text_get_trim_pos(const RID &p_shaped) const override; virtual int64_t shaped_text_get_ellipsis_pos(const RID &p_shaped) const override; virtual const Glyph *shaped_text_get_ellipsis_glyphs(const RID &p_shaped) const override; virtual int64_t shaped_text_get_ellipsis_glyph_count(const RID &p_shaped) const override; - GDVIRTUAL1RC(int64_t, shaped_text_get_trim_pos, RID); - GDVIRTUAL1RC(int64_t, shaped_text_get_ellipsis_pos, RID); - GDVIRTUAL1RC(GDNativeConstPtr<const Glyph>, shaped_text_get_ellipsis_glyphs, RID); - GDVIRTUAL1RC(int64_t, shaped_text_get_ellipsis_glyph_count, RID); + GDVIRTUAL1RC(int64_t, _shaped_text_get_trim_pos, RID); + GDVIRTUAL1RC(int64_t, _shaped_text_get_ellipsis_pos, RID); + GDVIRTUAL1RC(GDNativeConstPtr<const Glyph>, _shaped_text_get_ellipsis_glyphs, RID); + GDVIRTUAL1RC(int64_t, _shaped_text_get_ellipsis_glyph_count, RID); virtual void shaped_text_overrun_trim_to_width(const RID &p_shaped, double p_width, BitField<TextServer::TextOverrunFlag> p_trim_flags) override; - GDVIRTUAL3(shaped_text_overrun_trim_to_width, RID, double, BitField<TextServer::TextOverrunFlag>); + GDVIRTUAL3(_shaped_text_overrun_trim_to_width, RID, double, BitField<TextServer::TextOverrunFlag>); virtual Array shaped_text_get_objects(const RID &p_shaped) const override; virtual Rect2 shaped_text_get_object_rect(const RID &p_shaped, const Variant &p_key) const override; - GDVIRTUAL1RC(Array, shaped_text_get_objects, RID); - GDVIRTUAL2RC(Rect2, shaped_text_get_object_rect, RID, const Variant &); + GDVIRTUAL1RC(Array, _shaped_text_get_objects, RID); + GDVIRTUAL2RC(Rect2, _shaped_text_get_object_rect, RID, const Variant &); virtual Size2 shaped_text_get_size(const RID &p_shaped) const override; virtual double shaped_text_get_ascent(const RID &p_shaped) const override; @@ -452,66 +453,66 @@ public: virtual double shaped_text_get_width(const RID &p_shaped) const override; virtual double shaped_text_get_underline_position(const RID &p_shaped) const override; virtual double shaped_text_get_underline_thickness(const RID &p_shaped) const override; - GDVIRTUAL1RC(Size2, shaped_text_get_size, RID); - GDVIRTUAL1RC(double, shaped_text_get_ascent, RID); - GDVIRTUAL1RC(double, shaped_text_get_descent, RID); - GDVIRTUAL1RC(double, shaped_text_get_width, RID); - GDVIRTUAL1RC(double, shaped_text_get_underline_position, RID); - GDVIRTUAL1RC(double, shaped_text_get_underline_thickness, RID); + GDVIRTUAL1RC(Size2, _shaped_text_get_size, RID); + GDVIRTUAL1RC(double, _shaped_text_get_ascent, RID); + GDVIRTUAL1RC(double, _shaped_text_get_descent, RID); + GDVIRTUAL1RC(double, _shaped_text_get_width, RID); + GDVIRTUAL1RC(double, _shaped_text_get_underline_position, RID); + GDVIRTUAL1RC(double, _shaped_text_get_underline_thickness, RID); virtual Direction shaped_text_get_dominant_direction_in_range(const RID &p_shaped, int64_t p_start, int64_t p_end) const override; - GDVIRTUAL3RC(int64_t, shaped_text_get_dominant_direction_in_range, RID, int64_t, int64_t); + GDVIRTUAL3RC(int64_t, _shaped_text_get_dominant_direction_in_range, RID, int64_t, int64_t); virtual CaretInfo shaped_text_get_carets(const RID &p_shaped, int64_t p_position) const override; virtual Vector<Vector2> shaped_text_get_selection(const RID &p_shaped, int64_t p_start, int64_t p_end) const override; - GDVIRTUAL3C(shaped_text_get_carets, RID, int64_t, GDNativePtr<CaretInfo>); - GDVIRTUAL3RC(Vector<Vector2>, shaped_text_get_selection, RID, int64_t, int64_t); + GDVIRTUAL3C(_shaped_text_get_carets, RID, int64_t, GDNativePtr<CaretInfo>); + GDVIRTUAL3RC(Vector<Vector2>, _shaped_text_get_selection, RID, int64_t, int64_t); virtual int64_t shaped_text_hit_test_grapheme(const RID &p_shaped, double p_coords) const override; virtual int64_t shaped_text_hit_test_position(const RID &p_shaped, double p_coords) const override; - GDVIRTUAL2RC(int64_t, shaped_text_hit_test_grapheme, RID, double); - GDVIRTUAL2RC(int64_t, shaped_text_hit_test_position, RID, double); + GDVIRTUAL2RC(int64_t, _shaped_text_hit_test_grapheme, RID, double); + GDVIRTUAL2RC(int64_t, _shaped_text_hit_test_position, RID, double); virtual void shaped_text_draw(const RID &p_shaped, const RID &p_canvas, const Vector2 &p_pos, double p_clip_l = -1.0, double p_clip_r = -1.0, const Color &p_color = Color(1, 1, 1)) const override; virtual void shaped_text_draw_outline(const RID &p_shaped, const RID &p_canvas, const Vector2 &p_pos, double p_clip_l = -1.0, double p_clip_r = -1.0, int64_t p_outline_size = 1, const Color &p_color = Color(1, 1, 1)) const override; - GDVIRTUAL6C(shaped_text_draw, RID, RID, const Vector2 &, double, double, const Color &); - GDVIRTUAL7C(shaped_text_draw_outline, RID, RID, const Vector2 &, double, double, int64_t, const Color &); + GDVIRTUAL6C(_shaped_text_draw, RID, RID, const Vector2 &, double, double, const Color &); + GDVIRTUAL7C(_shaped_text_draw_outline, RID, RID, const Vector2 &, double, double, int64_t, const Color &); virtual Vector2 shaped_text_get_grapheme_bounds(const RID &p_shaped, int64_t p_pos) const override; virtual int64_t shaped_text_next_grapheme_pos(const RID &p_shaped, int64_t p_pos) const override; virtual int64_t shaped_text_prev_grapheme_pos(const RID &p_shaped, int64_t p_pos) const override; - GDVIRTUAL2RC(Vector2, shaped_text_get_grapheme_bounds, RID, int64_t); - GDVIRTUAL2RC(int64_t, shaped_text_next_grapheme_pos, RID, int64_t); - GDVIRTUAL2RC(int64_t, shaped_text_prev_grapheme_pos, RID, int64_t); + GDVIRTUAL2RC(Vector2, _shaped_text_get_grapheme_bounds, RID, int64_t); + GDVIRTUAL2RC(int64_t, _shaped_text_next_grapheme_pos, RID, int64_t); + GDVIRTUAL2RC(int64_t, _shaped_text_prev_grapheme_pos, RID, int64_t); virtual String format_number(const String &p_string, const String &p_language = "") const override; virtual String parse_number(const String &p_string, const String &p_language = "") const override; virtual String percent_sign(const String &p_language = "") const override; - GDVIRTUAL2RC(String, format_number, const String &, const String &); - GDVIRTUAL2RC(String, parse_number, const String &, const String &); - GDVIRTUAL1RC(String, percent_sign, const String &); + GDVIRTUAL2RC(String, _format_number, const String &, const String &); + GDVIRTUAL2RC(String, _parse_number, const String &, const String &); + GDVIRTUAL1RC(String, _percent_sign, const String &); virtual String strip_diacritics(const String &p_string) const override; - GDVIRTUAL1RC(String, strip_diacritics, const String &); + GDVIRTUAL1RC(String, _strip_diacritics, const String &); virtual PackedInt32Array string_get_word_breaks(const String &p_string, const String &p_language = "") const override; - GDVIRTUAL2RC(PackedInt32Array, string_get_word_breaks, const String &, const String &); + GDVIRTUAL2RC(PackedInt32Array, _string_get_word_breaks, const String &, const String &); virtual bool is_valid_identifier(const String &p_string) const override; - GDVIRTUAL1RC(bool, is_valid_identifier, const String &); + GDVIRTUAL1RC(bool, _is_valid_identifier, const String &); virtual String string_to_upper(const String &p_string, const String &p_language = "") const override; virtual String string_to_lower(const String &p_string, const String &p_language = "") const override; - GDVIRTUAL2RC(String, string_to_upper, const String &, const String &); - GDVIRTUAL2RC(String, string_to_lower, const String &, const String &); + GDVIRTUAL2RC(String, _string_to_upper, const String &, const String &); + GDVIRTUAL2RC(String, _string_to_lower, const String &, const String &); TypedArray<Vector2i> parse_structured_text(StructuredTextParser p_parser_type, const Array &p_args, const String &p_text) const; - GDVIRTUAL3RC(TypedArray<Vector2i>, parse_structured_text, StructuredTextParser, const Array &, const String &); + GDVIRTUAL3RC(TypedArray<Vector2i>, _parse_structured_text, StructuredTextParser, const Array &, const String &); - virtual int is_confusable(const String &p_string, const PackedStringArray &p_dict) const override; + virtual int64_t is_confusable(const String &p_string, const PackedStringArray &p_dict) const override; virtual bool spoof_check(const String &p_string) const override; - GDVIRTUAL2RC(int, is_confusable, const String &, const PackedStringArray &); - GDVIRTUAL1RC(bool, spoof_check, const String &); + GDVIRTUAL2RC(int64_t, _is_confusable, const String &, const PackedStringArray &); + GDVIRTUAL1RC(bool, _spoof_check, const String &); TextServerExtension(); ~TextServerExtension(); diff --git a/servers/text_server.cpp b/servers/text_server.cpp index 660247839c..588c837a40 100644 --- a/servers/text_server.cpp +++ b/servers/text_server.cpp @@ -468,6 +468,7 @@ void TextServer::_bind_methods() { BIND_ENUM_CONSTANT(FONT_LCD_SUBPIXEL_LAYOUT_HBGR); BIND_ENUM_CONSTANT(FONT_LCD_SUBPIXEL_LAYOUT_VRGB); BIND_ENUM_CONSTANT(FONT_LCD_SUBPIXEL_LAYOUT_VBGR); + BIND_ENUM_CONSTANT(FONT_LCD_SUBPIXEL_LAYOUT_MAX); /* Direction */ BIND_ENUM_CONSTANT(DIRECTION_AUTO); diff --git a/servers/text_server.h b/servers/text_server.h index b62d418fc8..a4e6080fd0 100644 --- a/servers/text_server.h +++ b/servers/text_server.h @@ -230,6 +230,7 @@ public: virtual String tag_to_name(int64_t p_tag) const { return ""; }; /* Font interface */ + virtual RID create_font() = 0; virtual void font_set_data(const RID &p_font_rid, const PackedByteArray &p_data) = 0; @@ -249,8 +250,8 @@ public: virtual void font_set_style_name(const RID &p_font_rid, const String &p_name) = 0; virtual String font_get_style_name(const RID &p_font_rid) const = 0; - virtual void font_set_antialiasing(RID p_font_rid, FontAntialiasing p_antialiasing) = 0; - virtual FontAntialiasing font_get_antialiasing(RID p_font_rid) const = 0; + virtual void font_set_antialiasing(const RID &p_font_rid, FontAntialiasing p_antialiasing) = 0; + virtual FontAntialiasing font_get_antialiasing(const RID &p_font_rid) const = 0; virtual void font_set_generate_mipmaps(const RID &p_font_rid, bool p_generate_mipmaps) = 0; virtual bool font_get_generate_mipmaps(const RID &p_font_rid) const = 0; @@ -485,7 +486,7 @@ public: // String functions. virtual PackedInt32Array string_get_word_breaks(const String &p_string, const String &p_language = "") const = 0; - virtual int is_confusable(const String &p_string, const PackedStringArray &p_dict) const { return -1; }; + virtual int64_t is_confusable(const String &p_string, const PackedStringArray &p_dict) const { return -1; }; virtual bool spoof_check(const String &p_string) const { return false; }; virtual String strip_diacritics(const String &p_string) const; diff --git a/servers/xr/xr_interface.cpp b/servers/xr/xr_interface.cpp index 4b9ea40223..430a5bfd16 100644 --- a/servers/xr/xr_interface.cpp +++ b/servers/xr/xr_interface.cpp @@ -68,6 +68,11 @@ void XRInterface::_bind_methods() { ClassDB::bind_method(D_METHOD("set_anchor_detection_is_enabled", "enable"), &XRInterface::set_anchor_detection_is_enabled); ClassDB::bind_method(D_METHOD("get_camera_feed_id"), &XRInterface::get_camera_feed_id); + ClassDB::bind_method(D_METHOD("is_passthrough_supported"), &XRInterface::is_passthrough_supported); + ClassDB::bind_method(D_METHOD("is_passthrough_enabled"), &XRInterface::is_passthrough_enabled); + ClassDB::bind_method(D_METHOD("start_passthrough"), &XRInterface::start_passthrough); + ClassDB::bind_method(D_METHOD("stop_passthrough"), &XRInterface::stop_passthrough); + ADD_GROUP("AR", "ar_"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "ar_is_anchor_detection_enabled"), "set_anchor_detection_is_enabled", "get_anchor_detection_is_enabled"); diff --git a/servers/xr/xr_interface.h b/servers/xr/xr_interface.h index f11458f1cc..17ff5f8add 100644 --- a/servers/xr/xr_interface.h +++ b/servers/xr/xr_interface.h @@ -130,6 +130,13 @@ public: virtual Vector<BlitToScreen> post_draw_viewport(RID p_render_target, const Rect2 &p_screen_rect) = 0; /* inform XR interface we finished our viewport draw process */ virtual void end_frame(){}; + /** passthrough **/ + + virtual bool is_passthrough_supported() { return false; } + virtual bool is_passthrough_enabled() { return false; } + virtual bool start_passthrough() { return false; } + virtual void stop_passthrough() {} + virtual void notification(int p_what){}; XRInterface(); diff --git a/tests/core/input/test_input_event_key.h b/tests/core/input/test_input_event_key.h index 4c9cd2002c..ef0a656b18 100644 --- a/tests/core/input/test_input_event_key.h +++ b/tests/core/input/test_input_event_key.h @@ -118,7 +118,7 @@ TEST_CASE("[InputEventKey] Key correctly converts itself to text") { InputEventKey none_key2; - // Key is None without modifers with a physical key. + // Key is None without modifiers with a physical key. none_key2.set_keycode(Key::NONE); none_key2.set_physical_keycode(Key::ENTER); diff --git a/tests/core/io/test_xml_parser.h b/tests/core/io/test_xml_parser.h index 87592b56ce..35e86d8203 100644 --- a/tests/core/io/test_xml_parser.h +++ b/tests/core/io/test_xml_parser.h @@ -66,6 +66,170 @@ TEST_CASE("[XMLParser] End-to-end") { parser.close(); } + +TEST_CASE("[XMLParser] Comments") { + XMLParser parser; + + SUBCASE("Missing end of comment") { + const String input = "<first></first><!-- foo"; + REQUIRE_EQ(parser.open_buffer(input.to_utf8_buffer()), OK); + REQUIRE_EQ(parser.read(), OK); + REQUIRE_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_ELEMENT); + REQUIRE_EQ(parser.read(), OK); + REQUIRE_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_ELEMENT_END); + REQUIRE_EQ(parser.read(), OK); + CHECK_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_COMMENT); + CHECK_EQ(parser.get_node_name(), " foo"); + } + SUBCASE("Bad start of comment") { + const String input = "<first></first><!-"; + REQUIRE_EQ(parser.open_buffer(input.to_utf8_buffer()), OK); + REQUIRE_EQ(parser.read(), OK); + REQUIRE_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_ELEMENT); + REQUIRE_EQ(parser.read(), OK); + REQUIRE_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_ELEMENT_END); + REQUIRE_EQ(parser.read(), OK); + CHECK_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_COMMENT); + CHECK_EQ(parser.get_node_name(), "-"); + } + SUBCASE("Unblanced angle brackets in comment") { + const String input = "<!-- example << --><next-tag></next-tag>"; + REQUIRE_EQ(parser.open_buffer(input.to_utf8_buffer()), OK); + REQUIRE_EQ(parser.read(), OK); + CHECK_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_COMMENT); + CHECK_EQ(parser.get_node_name(), " example << "); + } + SUBCASE("Doctype") { + const String input = "<!DOCTYPE greeting [<!ELEMENT greeting (#PCDATA)>]>"; + REQUIRE_EQ(parser.open_buffer(input.to_utf8_buffer()), OK); + REQUIRE_EQ(parser.read(), OK); + CHECK_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_COMMENT); + CHECK_EQ(parser.get_node_name(), "DOCTYPE greeting [<!ELEMENT greeting (#PCDATA)>]"); + } +} + +TEST_CASE("[XMLParser] Premature endings") { + SUBCASE("Simple cases") { + String input; + String expected_name; + XMLParser::NodeType expected_type; + + SUBCASE("Incomplete Unknown") { + input = "<first></first><?xml"; + expected_type = XMLParser::NodeType::NODE_UNKNOWN; + expected_name = "?xml"; + } + SUBCASE("Incomplete CDStart") { + input = "<first></first><![CD"; + expected_type = XMLParser::NodeType::NODE_CDATA; + expected_name = ""; + } + SUBCASE("Incomplete CData") { + input = "<first></first><![CDATA[example"; + expected_type = XMLParser::NodeType::NODE_CDATA; + expected_name = "example"; + } + SUBCASE("Incomplete CDEnd") { + input = "<first></first><![CDATA[example]]"; + expected_type = XMLParser::NodeType::NODE_CDATA; + expected_name = "example]]"; + } + SUBCASE("Incomplete start-tag name") { + input = "<first></first><second"; + expected_type = XMLParser::NodeType::NODE_ELEMENT; + expected_name = "second"; + } + + XMLParser parser; + REQUIRE_EQ(parser.open_buffer(input.to_utf8_buffer()), OK); + REQUIRE_EQ(parser.read(), OK); + REQUIRE_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_ELEMENT); + REQUIRE_EQ(parser.read(), OK); + REQUIRE_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_ELEMENT_END); + REQUIRE_EQ(parser.read(), OK); + CHECK_EQ(parser.get_node_type(), expected_type); + CHECK_EQ(parser.get_node_name(), expected_name); + } + + SUBCASE("With attributes and texts") { + XMLParser parser; + + SUBCASE("Incomplete start-tag attribute name") { + const String input = "<first></first><second attr1=\"foo\" attr2"; + REQUIRE_EQ(parser.open_buffer(input.to_utf8_buffer()), OK); + REQUIRE_EQ(parser.read(), OK); + REQUIRE_EQ(parser.read(), OK); + REQUIRE_EQ(parser.read(), OK); + CHECK_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_ELEMENT); + CHECK_EQ(parser.get_node_name(), "second"); + CHECK_EQ(parser.get_attribute_count(), 1); + CHECK_EQ(parser.get_attribute_name(0), "attr1"); + CHECK_EQ(parser.get_attribute_value(0), "foo"); + } + + SUBCASE("Incomplete start-tag attribute unquoted value") { + const String input = "<first></first><second attr1=\"foo\" attr2=bar"; + REQUIRE_EQ(parser.open_buffer(input.to_utf8_buffer()), OK); + REQUIRE_EQ(parser.read(), OK); + REQUIRE_EQ(parser.read(), OK); + REQUIRE_EQ(parser.read(), OK); + CHECK_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_ELEMENT); + CHECK_EQ(parser.get_node_name(), "second"); + CHECK_EQ(parser.get_attribute_count(), 1); + CHECK_EQ(parser.get_attribute_name(0), "attr1"); + CHECK_EQ(parser.get_attribute_value(0), "foo"); + } + + SUBCASE("Incomplete start-tag attribute quoted value") { + const String input = "<first></first><second attr1=\"foo\" attr2=\"bar"; + REQUIRE_EQ(parser.open_buffer(input.to_utf8_buffer()), OK); + REQUIRE_EQ(parser.read(), OK); + REQUIRE_EQ(parser.read(), OK); + REQUIRE_EQ(parser.read(), OK); + CHECK_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_ELEMENT); + CHECK_EQ(parser.get_node_name(), "second"); + CHECK_EQ(parser.get_attribute_count(), 2); + CHECK_EQ(parser.get_attribute_name(0), "attr1"); + CHECK_EQ(parser.get_attribute_value(0), "foo"); + CHECK_EQ(parser.get_attribute_name(1), "attr2"); + CHECK_EQ(parser.get_attribute_value(1), "bar"); + } + + SUBCASE("Incomplete end-tag name") { + const String input = "<first></fir"; + REQUIRE_EQ(parser.open_buffer(input.to_utf8_buffer()), OK); + REQUIRE_EQ(parser.read(), OK); + REQUIRE_EQ(parser.read(), OK); + CHECK_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_ELEMENT_END); + CHECK_EQ(parser.get_node_name(), "fir"); + } + + SUBCASE("Trailing text") { + const String input = "<first></first>example"; + REQUIRE_EQ(parser.open_buffer(input.to_utf8_buffer()), OK); + REQUIRE_EQ(parser.read(), OK); + REQUIRE_EQ(parser.read(), OK); + REQUIRE_EQ(parser.read(), OK); + CHECK_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_TEXT); + CHECK_EQ(parser.get_node_data(), "example"); + } + } +} + +TEST_CASE("[XMLParser] CDATA") { + const String input = "<a><![CDATA[my cdata content goes here]]></a>"; + XMLParser parser; + REQUIRE_EQ(parser.open_buffer(input.to_utf8_buffer()), OK); + REQUIRE_EQ(parser.read(), OK); + CHECK_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_ELEMENT); + CHECK_EQ(parser.get_node_name(), "a"); + REQUIRE_EQ(parser.read(), OK); + CHECK_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_CDATA); + CHECK_EQ(parser.get_node_name(), "my cdata content goes here"); + REQUIRE_EQ(parser.read(), OK); + CHECK_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_ELEMENT_END); + CHECK_EQ(parser.get_node_name(), "a"); +} } // namespace TestXMLParser #endif // TEST_XML_PARSER_H diff --git a/tests/core/math/test_basis.h b/tests/core/math/test_basis.h index ae8ca4acde..b6493c5726 100644 --- a/tests/core/math/test_basis.h +++ b/tests/core/math/test_basis.h @@ -47,7 +47,7 @@ enum RotOrder { EulerZYX }; -Vector3 deg2rad(const Vector3 &p_rotation) { +Vector3 deg_to_rad(const Vector3 &p_rotation) { return p_rotation / 180.0 * Math_PI; } @@ -155,7 +155,7 @@ void test_rotation(Vector3 deg_original_euler, RotOrder rot_order) { // are correct. // Euler to rotation - const Vector3 original_euler = deg2rad(deg_original_euler); + const Vector3 original_euler = deg_to_rad(deg_original_euler); const Basis to_rotation = EulerToBasis(rot_order, original_euler); // Euler from rotation @@ -281,6 +281,59 @@ TEST_CASE("[Stress][Basis] Euler conversions") { } } } + +TEST_CASE("[Basis] Set axis angle") { + Vector3 axis; + real_t angle; + real_t pi = (real_t)Math_PI; + + // Testing the singularity when the angle is 0°. + Basis identity(1, 0, 0, 0, 1, 0, 0, 0, 1); + identity.get_axis_angle(axis, angle); + CHECK(angle == 0); + + // Testing the singularity when the angle is 180°. + Basis singularityPi(-1, 0, 0, 0, 1, 0, 0, 0, -1); + singularityPi.get_axis_angle(axis, angle); + CHECK(Math::is_equal_approx(angle, pi)); + + // Testing reversing the an axis (of an 30° angle). + float cos30deg = Math::cos(Math::deg_to_rad((real_t)30.0)); + Basis z_positive(cos30deg, -0.5, 0, 0.5, cos30deg, 0, 0, 0, 1); + Basis z_negative(cos30deg, 0.5, 0, -0.5, cos30deg, 0, 0, 0, 1); + + z_positive.get_axis_angle(axis, angle); + CHECK(Math::is_equal_approx(angle, Math::deg_to_rad((real_t)30.0))); + CHECK(axis == Vector3(0, 0, 1)); + + z_negative.get_axis_angle(axis, angle); + CHECK(Math::is_equal_approx(angle, Math::deg_to_rad((real_t)30.0))); + CHECK(axis == Vector3(0, 0, -1)); + + // Testing a rotation of 90° on x-y-z. + Basis x90deg(1, 0, 0, 0, 0, -1, 0, 1, 0); + x90deg.get_axis_angle(axis, angle); + CHECK(Math::is_equal_approx(angle, pi / (real_t)2)); + CHECK(axis == Vector3(1, 0, 0)); + + Basis y90deg(0, 0, 1, 0, 1, 0, -1, 0, 0); + y90deg.get_axis_angle(axis, angle); + CHECK(axis == Vector3(0, 1, 0)); + + Basis z90deg(0, -1, 0, 1, 0, 0, 0, 0, 1); + z90deg.get_axis_angle(axis, angle); + CHECK(axis == Vector3(0, 0, 1)); + + // Regression test: checks that the method returns a small angle (not 0). + Basis tiny(1, 0, 0, 0, 0.9999995, -0.001, 0, 001, 0.9999995); // The min angle possible with float is 0.001rad. + tiny.get_axis_angle(axis, angle); + CHECK(Math::is_equal_approx(angle, (real_t)0.001, (real_t)0.0001)); + + // Regression test: checks that the method returns an angle which is a number (not NaN) + Basis bugNan(1.00000024, 0, 0.000100001693, 0, 1, 0, -0.000100009143, 0, 1.00000024); + bugNan.get_axis_angle(axis, angle); + CHECK(!Math::is_nan(angle)); +} } // namespace TestBasis #endif // TEST_BASIS_H diff --git a/tests/core/math/test_quaternion.h b/tests/core/math/test_quaternion.h index 1b80ffba0b..63d30759bb 100644 --- a/tests/core/math/test_quaternion.h +++ b/tests/core/math/test_quaternion.h @@ -160,7 +160,7 @@ TEST_CASE("[Quaternion] Construct Euler YXZ dynamic axes") { double pitch = Math::deg_to_rad(30.0); double roll = Math::deg_to_rad(10.0); - // Generate YXZ comparision data (Z-then-X-then-Y) using single-axis Euler + // Generate YXZ comparison data (Z-then-X-then-Y) using single-axis Euler // constructor and quaternion product, both tested separately. Vector3 euler_y(0.0, yaw, 0.0); Quaternion q_y(euler_y); diff --git a/tests/core/math/test_vector2.h b/tests/core/math/test_vector2.h index 9b7800164a..0d7f1163e4 100644 --- a/tests/core/math/test_vector2.h +++ b/tests/core/math/test_vector2.h @@ -37,6 +37,14 @@ namespace TestVector2 { +TEST_CASE("[Vector2] Constructor methods") { + const Vector2 vector_empty = Vector2(); + const Vector2 vector_zero = Vector2(0.0, 0.0); + CHECK_MESSAGE( + vector_empty == vector_zero, + "Vector2 Constructor with no inputs should return a zero Vector2."); +} + TEST_CASE("[Vector2] Angle methods") { const Vector2 vector_x = Vector2(1, 0); const Vector2 vector_y = Vector2(0, 1); @@ -102,6 +110,9 @@ TEST_CASE("[Vector2] Interpolation methods") { Vector2(1, 1).slerp(Vector2(), 0.5) == Vector2(0.5, 0.5), "Vector2 slerp with one input as zero should behave like a regular lerp."); CHECK_MESSAGE( + Vector2(4, 6).slerp(Vector2(8, 10), 0.5).is_equal_approx(Vector2(5.9076470794008017626, 8.07918879020090480697)), + "Vector2 slerp should work as expected."); + CHECK_MESSAGE( Math::is_equal_approx(vector1.slerp(vector2, 0.5).length(), (real_t)4.31959610746631919), "Vector2 slerp with different length input should return a vector with an interpolated length."); CHECK_MESSAGE( @@ -171,6 +182,15 @@ TEST_CASE("[Vector2] Normalization methods") { CHECK_MESSAGE( Vector2(1, 1).normalized().is_equal_approx(Vector2(Math_SQRT12, Math_SQRT12)), "Vector2 normalized should work as expected."); + + Vector2 vector = Vector2(3.2, -5.4); + vector.normalize(); + CHECK_MESSAGE( + vector == Vector2(3.2, -5.4).normalized(), + "Vector2 normalize should convert same way as Vector2 normalized."); + CHECK_MESSAGE( + vector.is_equal_approx(Vector2(0.509802390301732898898, -0.860291533634174266891)), + "Vector2 normalize should work as expected."); } TEST_CASE("[Vector2] Operators") { @@ -276,12 +296,14 @@ TEST_CASE("[Vector2] Other methods") { CHECK_MESSAGE( Math::is_equal_approx(vector.aspect(), (real_t)1.2 / (real_t)3.4), "Vector2 aspect should work as expected."); + CHECK_MESSAGE( vector.direction_to(Vector2()).is_equal_approx(-vector.normalized()), "Vector2 direction_to should work as expected."); CHECK_MESSAGE( Vector2(1, 1).direction_to(Vector2(2, 2)).is_equal_approx(Vector2(Math_SQRT12, Math_SQRT12)), "Vector2 direction_to should work as expected."); + CHECK_MESSAGE( vector.posmod(2).is_equal_approx(Vector2(1.2, 1.4)), "Vector2 posmod should work as expected."); @@ -294,10 +316,21 @@ TEST_CASE("[Vector2] Other methods") { CHECK_MESSAGE( (-vector).posmodv(Vector2(2, 3)).is_equal_approx(Vector2(0.8, 2.6)), "Vector2 posmodv should work as expected."); + + CHECK_MESSAGE( + vector.rotated(Math_TAU).is_equal_approx(Vector2(1.2, 3.4)), + "Vector2 rotated should work as expected."); CHECK_MESSAGE( vector.rotated(Math_TAU / 4).is_equal_approx(Vector2(-3.4, 1.2)), "Vector2 rotated should work as expected."); CHECK_MESSAGE( + vector.rotated(Math_TAU / 3).is_equal_approx(Vector2(-3.544486372867091398996, -0.660769515458673623883)), + "Vector2 rotated should work as expected."); + CHECK_MESSAGE( + vector.rotated(Math_TAU / 2).is_equal_approx(vector.rotated(Math_TAU / -2)), + "Vector2 rotated should work as expected."); + + CHECK_MESSAGE( vector.snapped(Vector2(1, 1)) == Vector2(1, 3), "Vector2 snapped to integers should be the same as rounding."); CHECK_MESSAGE( @@ -306,23 +339,57 @@ TEST_CASE("[Vector2] Other methods") { CHECK_MESSAGE( vector.snapped(Vector2(0.25, 0.25)) == Vector2(1.25, 3.5), "Vector2 snapped to 0.25 should give exact results."); + + CHECK_MESSAGE( + Vector2(1.2, 2.5).is_equal_approx(vector.min(Vector2(3.0, 2.5))), + "Vector2 min should return expected value."); + + CHECK_MESSAGE( + Vector2(5.3, 3.4).is_equal_approx(vector.max(Vector2(5.3, 2.0))), + "Vector2 max should return expected value."); } TEST_CASE("[Vector2] Plane methods") { const Vector2 vector = Vector2(1.2, 3.4); const Vector2 vector_y = Vector2(0, 1); + const Vector2 vector_normal = Vector2(0.95879811270838721622267, 0.2840883296913739899919); + const Vector2 vector_non_normal = Vector2(5.4, 1.6); CHECK_MESSAGE( vector.bounce(vector_y) == Vector2(1.2, -3.4), "Vector2 bounce on a plane with normal of the Y axis should."); CHECK_MESSAGE( + vector.bounce(vector_normal).is_equal_approx(Vector2(-2.85851197982345523329, 2.197477931904161412358)), + "Vector2 bounce with normal should return expected value."); + CHECK_MESSAGE( vector.reflect(vector_y) == Vector2(-1.2, 3.4), "Vector2 reflect on a plane with normal of the Y axis should."); CHECK_MESSAGE( + vector.reflect(vector_normal).is_equal_approx(Vector2(2.85851197982345523329, -2.197477931904161412358)), + "Vector2 reflect with normal should return expected value."); + CHECK_MESSAGE( vector.project(vector_y) == Vector2(0, 3.4), - "Vector2 projected on the X axis should only give the Y component."); + "Vector2 projected on the Y axis should only give the Y component."); + CHECK_MESSAGE( + vector.project(vector_normal).is_equal_approx(Vector2(2.0292559899117276166, 0.60126103404791929382)), + "Vector2 projected on a normal should return expected value."); CHECK_MESSAGE( vector.slide(vector_y) == Vector2(1.2, 0), "Vector2 slide on a plane with normal of the Y axis should set the Y to zero."); + CHECK_MESSAGE( + vector.slide(vector_normal).is_equal_approx(Vector2(-0.8292559899117276166456, 2.798738965952080706179)), + "Vector2 slide with normal should return expected value."); + // There's probably a better way to test these ones? + ERR_PRINT_OFF; + CHECK_MESSAGE( + vector.bounce(vector_non_normal).is_equal_approx(Vector2()), + "Vector2 bounce should return empty Vector2 with non-normalised input."); + CHECK_MESSAGE( + vector.reflect(vector_non_normal).is_equal_approx(Vector2()), + "Vector2 reflect should return empty Vector2 with non-normalised input."); + CHECK_MESSAGE( + vector.slide(vector_non_normal).is_equal_approx(Vector2()), + "Vector2 slide should return empty Vector2 with non-normalised input."); + ERR_PRINT_ON; } TEST_CASE("[Vector2] Rounding methods") { @@ -367,12 +434,20 @@ TEST_CASE("[Vector2] Rounding methods") { TEST_CASE("[Vector2] Linear algebra methods") { const Vector2 vector_x = Vector2(1, 0); const Vector2 vector_y = Vector2(0, 1); + const Vector2 a = Vector2(3.5, 8.5); + const Vector2 b = Vector2(5.2, 4.6); CHECK_MESSAGE( vector_x.cross(vector_y) == 1, "Vector2 cross product of X and Y should give 1."); CHECK_MESSAGE( vector_y.cross(vector_x) == -1, "Vector2 cross product of Y and X should give negative 1."); + CHECK_MESSAGE( + Math::is_equal_approx(a.cross(b), (real_t)-28.1), + "Vector2 cross should return expected value."); + CHECK_MESSAGE( + Math::is_equal_approx(Vector2(-a.x, a.y).cross(Vector2(b.x, -b.y)), (real_t)-28.1), + "Vector2 cross should return expected value."); CHECK_MESSAGE( vector_x.dot(vector_y) == 0.0, @@ -383,6 +458,12 @@ TEST_CASE("[Vector2] Linear algebra methods") { CHECK_MESSAGE( (vector_x * 10).dot(vector_x * 10) == 100.0, "Vector2 dot product of same direction vectors should behave as expected."); + CHECK_MESSAGE( + Math::is_equal_approx(a.dot(b), (real_t)57.3), + "Vector2 dot should return expected value."); + CHECK_MESSAGE( + Math::is_equal_approx(Vector2(-a.x, a.y).dot(Vector2(b.x, -b.y)), (real_t)-57.3), + "Vector2 dot should return expected value."); } } // namespace TestVector2 diff --git a/tests/core/math/test_vector2i.h b/tests/core/math/test_vector2i.h index 841bb793a4..49b0632e3c 100644 --- a/tests/core/math/test_vector2i.h +++ b/tests/core/math/test_vector2i.h @@ -37,6 +37,14 @@ namespace TestVector2i { +TEST_CASE("[Vector2i] Constructor methods") { + const Vector2i vector_empty = Vector2i(); + const Vector2i vector_zero = Vector2i(0, 0); + CHECK_MESSAGE( + vector_empty == vector_zero, + "Vector2i Constructor with no inputs should return a zero Vector2i."); +} + TEST_CASE("[Vector2i] Axis methods") { Vector2i vector = Vector2i(2, 3); CHECK_MESSAGE( @@ -121,6 +129,14 @@ TEST_CASE("[Vector2i] Other methods") { CHECK_MESSAGE( Math::is_equal_approx(vector.aspect(), (real_t)1.0 / (real_t)3.0), "Vector2i aspect should work as expected."); + + CHECK_MESSAGE( + Vector2i(1, 2) == vector.min(Vector2i(3, 2)), + "Vector2i min should return expected value."); + + CHECK_MESSAGE( + Vector2i(5, 3) == vector.max(Vector2i(5, 2)), + "Vector2i max should return expected value."); } TEST_CASE("[Vector2i] Abs and sign methods") { diff --git a/tests/core/math/test_vector3.h b/tests/core/math/test_vector3.h index 6f99fada2b..be271bad1f 100644 --- a/tests/core/math/test_vector3.h +++ b/tests/core/math/test_vector3.h @@ -39,6 +39,14 @@ namespace TestVector3 { +TEST_CASE("[Vector3] Constructor methods") { + const Vector3 vector_empty = Vector3(); + const Vector3 vector_zero = Vector3(0.0, 0.0, 0.0); + CHECK_MESSAGE( + vector_empty == vector_zero, + "Vector3 Constructor with no inputs should return a zero Vector3."); +} + TEST_CASE("[Vector3] Angle methods") { const Vector3 vector_x = Vector3(1, 0, 0); const Vector3 vector_y = Vector3(0, 1, 0); @@ -76,16 +84,12 @@ TEST_CASE("[Vector3] Axis methods") { vector.min_axis_index() == Vector3::Axis::AXIS_X, "Vector3 min_axis_index should work as expected."); CHECK_MESSAGE( - vector.get_axis(vector.max_axis_index()) == (real_t)5.6, - "Vector3 get_axis should work as expected."); + vector[vector.max_axis_index()] == (real_t)5.6, + "Vector3 array operator should work as expected."); CHECK_MESSAGE( vector[vector.min_axis_index()] == (real_t)1.2, "Vector3 array operator should work as expected."); - vector.set_axis(Vector3::Axis::AXIS_Y, 4.7); - CHECK_MESSAGE( - vector.get_axis(Vector3::Axis::AXIS_Y) == (real_t)4.7, - "Vector3 set_axis should work as expected."); vector[Vector3::Axis::AXIS_Y] = 3.7; CHECK_MESSAGE( vector[Vector3::Axis::AXIS_Y] == (real_t)3.7, @@ -123,6 +127,9 @@ TEST_CASE("[Vector3] Interpolation methods") { Vector3(1, 1, 1).slerp(Vector3(), 0.5) == Vector3(0.5, 0.5, 0.5), "Vector3 slerp with one input as zero should behave like a regular lerp."); CHECK_MESSAGE( + Vector3(4, 6, 2).slerp(Vector3(8, 10, 3), 0.5).is_equal_approx(Vector3(5.90194219811429941053, 8.06758688849378394534, 2.558307894718317120038)), + "Vector3 slerp should work as expected."); + CHECK_MESSAGE( Math::is_equal_approx(vector1.slerp(vector2, 0.5).length(), (real_t)6.25831088708303172), "Vector3 slerp with different length input should return a vector with an interpolated length."); CHECK_MESSAGE( @@ -195,6 +202,15 @@ TEST_CASE("[Vector3] Normalization methods") { CHECK_MESSAGE( Vector3(1, 1, 1).normalized().is_equal_approx(Vector3(Math_SQRT13, Math_SQRT13, Math_SQRT13)), "Vector3 normalized should work as expected."); + + Vector3 vector = Vector3(3.2, -5.4, 6); + vector.normalize(); + CHECK_MESSAGE( + vector == Vector3(3.2, -5.4, 6).normalized(), + "Vector3 normalize should convert same way as Vector3 normalized."); + CHECK_MESSAGE( + vector.is_equal_approx(Vector3(0.368522751763902980457, -0.621882143601586279522, 0.6909801595573180883585)), + "Vector3 normalize should work as expected."); } TEST_CASE("[Vector3] Operators") { @@ -318,10 +334,21 @@ TEST_CASE("[Vector3] Other methods") { CHECK_MESSAGE( (-vector).posmodv(Vector3(2, 3, 4)).is_equal_approx(Vector3(0.8, 2.6, 2.4)), "Vector3 posmodv should work as expected."); + + CHECK_MESSAGE( + vector.rotated(Vector3(0, 1, 0), Math_TAU).is_equal_approx(vector), + "Vector3 rotated should work as expected."); CHECK_MESSAGE( vector.rotated(Vector3(0, 1, 0), Math_TAU / 4).is_equal_approx(Vector3(5.6, 3.4, -1.2)), "Vector3 rotated should work as expected."); CHECK_MESSAGE( + vector.rotated(Vector3(1, 0, 0), Math_TAU / 3).is_equal_approx(Vector3(1.2, -6.54974226119285642, 0.1444863728670914)), + "Vector3 rotated should work as expected."); + CHECK_MESSAGE( + vector.rotated(Vector3(0, 0, 1), Math_TAU / 2).is_equal_approx(vector.rotated(Vector3(0, 0, 1), Math_TAU / -2)), + "Vector3 rotated should work as expected."); + + CHECK_MESSAGE( vector.snapped(Vector3(1, 1, 1)) == Vector3(1, 3, 6), "Vector3 snapped to integers should be the same as rounding."); CHECK_MESSAGE( @@ -332,18 +359,44 @@ TEST_CASE("[Vector3] Other methods") { TEST_CASE("[Vector3] Plane methods") { const Vector3 vector = Vector3(1.2, 3.4, 5.6); const Vector3 vector_y = Vector3(0, 1, 0); + const Vector3 vector_normal = Vector3(0.88763458893247992491, 0.26300284116517923701, 0.37806658417494515320); + const Vector3 vector_non_normal = Vector3(5.4, 1.6, 2.3); CHECK_MESSAGE( vector.bounce(vector_y) == Vector3(1.2, -3.4, 5.6), "Vector3 bounce on a plane with normal of the Y axis should."); CHECK_MESSAGE( + vector.bounce(vector_normal).is_equal_approx(Vector3(-6.0369629829775736287, 1.25571467171034855444, 2.517589840583626047)), + "Vector3 bounce with normal should return expected value."); + CHECK_MESSAGE( vector.reflect(vector_y) == Vector3(-1.2, 3.4, -5.6), "Vector3 reflect on a plane with normal of the Y axis should."); CHECK_MESSAGE( + vector.reflect(vector_normal).is_equal_approx(Vector3(6.0369629829775736287, -1.25571467171034855444, -2.517589840583626047)), + "Vector3 reflect with normal should return expected value."); + CHECK_MESSAGE( vector.project(vector_y) == Vector3(0, 3.4, 0), - "Vector3 projected on the X axis should only give the Y component."); + "Vector3 projected on the Y axis should only give the Y component."); + CHECK_MESSAGE( + vector.project(vector_normal).is_equal_approx(Vector3(3.61848149148878681437, 1.0721426641448257227776, 1.54120507970818697649)), + "Vector3 projected on a normal should return expected value."); CHECK_MESSAGE( vector.slide(vector_y) == Vector3(1.2, 0, 5.6), "Vector3 slide on a plane with normal of the Y axis should set the Y to zero."); + CHECK_MESSAGE( + vector.slide(vector_normal).is_equal_approx(Vector3(-2.41848149148878681437, 2.32785733585517427722237, 4.0587949202918130235)), + "Vector3 slide with normal should return expected value."); + // There's probably a better way to test these ones? + ERR_PRINT_OFF; + CHECK_MESSAGE( + vector.bounce(vector_non_normal).is_equal_approx(Vector3()), + "Vector3 bounce should return empty Vector3 with non-normalised input."); + CHECK_MESSAGE( + vector.reflect(vector_non_normal).is_equal_approx(Vector3()), + "Vector3 reflect should return empty Vector3 with non-normalised input."); + CHECK_MESSAGE( + vector.slide(vector_non_normal).is_equal_approx(Vector3()), + "Vector3 slide should return empty Vector3 with non-normalised input."); + ERR_PRINT_ON; } TEST_CASE("[Vector3] Rounding methods") { @@ -389,6 +442,8 @@ TEST_CASE("[Vector3] Linear algebra methods") { const Vector3 vector_x = Vector3(1, 0, 0); const Vector3 vector_y = Vector3(0, 1, 0); const Vector3 vector_z = Vector3(0, 0, 1); + const Vector3 a = Vector3(3.5, 8.5, 2.3); + const Vector3 b = Vector3(5.2, 4.6, 7.8); CHECK_MESSAGE( vector_x.cross(vector_y) == vector_z, "Vector3 cross product of X and Y should give Z."); @@ -401,6 +456,12 @@ TEST_CASE("[Vector3] Linear algebra methods") { CHECK_MESSAGE( vector_z.cross(vector_x) == vector_y, "Vector3 cross product of Z and X should give Y."); + CHECK_MESSAGE( + a.cross(b).is_equal_approx(Vector3(55.72, -15.34, -28.1)), + "Vector3 cross should return expected value."); + CHECK_MESSAGE( + Vector3(-a.x, a.y, -a.z).cross(Vector3(b.x, -b.y, b.z)).is_equal_approx(Vector3(55.72, 15.34, -28.1)), + "Vector2 cross should return expected value."); CHECK_MESSAGE( vector_x.dot(vector_y) == 0.0, @@ -411,6 +472,12 @@ TEST_CASE("[Vector3] Linear algebra methods") { CHECK_MESSAGE( (vector_x * 10).dot(vector_x * 10) == 100.0, "Vector3 dot product of same direction vectors should behave as expected."); + CHECK_MESSAGE( + Math::is_equal_approx(a.dot(b), (real_t)75.24), + "Vector3 dot should return expected value."); + CHECK_MESSAGE( + Math::is_equal_approx(Vector3(-a.x, a.y, -a.z).dot(Vector3(b.x, -b.y, b.z)), (real_t)-75.24), + "Vector3 dot should return expected value."); } } // namespace TestVector3 diff --git a/tests/core/math/test_vector3i.h b/tests/core/math/test_vector3i.h index b1c6944eba..2050b222d0 100644 --- a/tests/core/math/test_vector3i.h +++ b/tests/core/math/test_vector3i.h @@ -36,6 +36,14 @@ namespace TestVector3i { +TEST_CASE("[Vector3i] Constructor methods") { + const Vector3i vector_empty = Vector3i(); + const Vector3i vector_zero = Vector3i(0, 0, 0); + CHECK_MESSAGE( + vector_empty == vector_zero, + "Vector3i Constructor with no inputs should return a zero Vector3i."); +} + TEST_CASE("[Vector3i] Axis methods") { Vector3i vector = Vector3i(1, 2, 3); CHECK_MESSAGE( @@ -45,16 +53,12 @@ TEST_CASE("[Vector3i] Axis methods") { vector.min_axis_index() == Vector3i::Axis::AXIS_X, "Vector3i min_axis_index should work as expected."); CHECK_MESSAGE( - vector.get_axis(vector.max_axis_index()) == 3, - "Vector3i get_axis should work as expected."); + vector[vector.max_axis_index()] == 3, + "Vector3i array operator should work as expected."); CHECK_MESSAGE( vector[vector.min_axis_index()] == 1, "Vector3i array operator should work as expected."); - vector.set_axis(Vector3i::Axis::AXIS_Y, 4); - CHECK_MESSAGE( - vector.get_axis(Vector3i::Axis::AXIS_Y) == 4, - "Vector3i set_axis should work as expected."); vector[Vector3i::Axis::AXIS_Y] = 5; CHECK_MESSAGE( vector[Vector3i::Axis::AXIS_Y] == 5, diff --git a/tests/core/math/test_vector4.h b/tests/core/math/test_vector4.h index ccf991401b..3f50f16635 100644 --- a/tests/core/math/test_vector4.h +++ b/tests/core/math/test_vector4.h @@ -38,6 +38,14 @@ namespace TestVector4 { +TEST_CASE("[Vector4] Constructor methods") { + const Vector4 vector_empty = Vector4(); + const Vector4 vector_zero = Vector4(0.0, 0.0, 0.0, 0.0); + CHECK_MESSAGE( + vector_empty == vector_zero, + "Vector4 Constructor with no inputs should return a zero Vector4."); +} + TEST_CASE("[Vector4] Axis methods") { Vector4 vector = Vector4(1.2, 3.4, 5.6, -0.9); CHECK_MESSAGE( @@ -47,16 +55,12 @@ TEST_CASE("[Vector4] Axis methods") { vector.min_axis_index() == Vector4::Axis::AXIS_W, "Vector4 min_axis_index should work as expected."); CHECK_MESSAGE( - vector.get_axis(vector.max_axis_index()) == (real_t)5.6, - "Vector4 get_axis should work as expected."); + vector[vector.max_axis_index()] == (real_t)5.6, + "Vector4 array operator should work as expected."); CHECK_MESSAGE( vector[vector.min_axis_index()] == (real_t)-0.9, "Vector4 array operator should work as expected."); - vector.set_axis(Vector4::Axis::AXIS_Y, 4.7); - CHECK_MESSAGE( - vector.get_axis(Vector4::Axis::AXIS_Y) == (real_t)4.7, - "Vector4 set_axis should work as expected."); vector[Vector4::Axis::AXIS_Y] = 3.7; CHECK_MESSAGE( vector[Vector4::Axis::AXIS_Y] == (real_t)3.7, diff --git a/tests/core/math/test_vector4i.h b/tests/core/math/test_vector4i.h index ac63001b24..309162c3f7 100644 --- a/tests/core/math/test_vector4i.h +++ b/tests/core/math/test_vector4i.h @@ -36,6 +36,14 @@ namespace TestVector4i { +TEST_CASE("[Vector4i] Constructor methods") { + const Vector4i vector_empty = Vector4i(); + const Vector4i vector_zero = Vector4i(0, 0, 0, 0); + CHECK_MESSAGE( + vector_empty == vector_zero, + "Vector4i Constructor with no inputs should return a zero Vector4i."); +} + TEST_CASE("[Vector4i] Axis methods") { Vector4i vector = Vector4i(1, 2, 3, 4); CHECK_MESSAGE( @@ -45,16 +53,12 @@ TEST_CASE("[Vector4i] Axis methods") { vector.min_axis_index() == Vector4i::Axis::AXIS_X, "Vector4i min_axis_index should work as expected."); CHECK_MESSAGE( - vector.get_axis(vector.max_axis_index()) == 4, - "Vector4i get_axis should work as expected."); + vector[vector.max_axis_index()] == 4, + "Vector4i array operator should work as expected."); CHECK_MESSAGE( vector[vector.min_axis_index()] == 1, "Vector4i array operator should work as expected."); - vector.set_axis(Vector4i::Axis::AXIS_Y, 5); - CHECK_MESSAGE( - vector.get_axis(Vector4i::Axis::AXIS_Y) == 5, - "Vector4i set_axis should work as expected."); vector[Vector4i::Axis::AXIS_Y] = 5; CHECK_MESSAGE( vector[Vector4i::Axis::AXIS_Y] == 5, diff --git a/tests/core/object/test_class_db.h b/tests/core/object/test_class_db.h index 208923edb9..b0375c63b9 100644 --- a/tests/core/object/test_class_db.h +++ b/tests/core/object/test_class_db.h @@ -666,6 +666,10 @@ void add_exposed_classes(Context &r_context) { } else { exposed_class.methods.push_back(method); } + + if (method.is_virtual) { + TEST_COND(String(method.name)[0] != '_', "Virtual method ", String(method.name), " does not start with underscore."); + } } // Add signals diff --git a/tests/core/string/test_string.h b/tests/core/string/test_string.h index d97da05c04..969f5fc096 100644 --- a/tests/core/string/test_string.h +++ b/tests/core/string/test_string.h @@ -740,6 +740,14 @@ TEST_CASE("[String] sprintf") { REQUIRE(error == false); CHECK(output == String("fish 99.990000 frog")); + // Real (infinity) left-padded + format = "fish %11f frog"; + args.clear(); + args.push_back(INFINITY); + output = format.sprintf(args, &error); + REQUIRE(error == false); + CHECK(output == String("fish inf frog")); + // Real right-padded. format = "fish %-11f frog"; args.clear(); @@ -840,6 +848,14 @@ TEST_CASE("[String] sprintf") { REQUIRE(error == false); CHECK(output == String("fish ( 19.990000, 1.000000, -2.050000) frog")); + // Vector left-padded with inf/nan + format = "fish %11v frog"; + args.clear(); + args.push_back(Variant(Vector2(INFINITY, NAN))); + output = format.sprintf(args, &error); + REQUIRE(error == false); + CHECK(output == String("fish ( inf, nan) frog")); + // Vector right-padded. format = "fish %-11v frog"; args.clear(); diff --git a/tests/core/templates/test_command_queue.h b/tests/core/templates/test_command_queue.h index 0d016f5d06..db1e436ed9 100644 --- a/tests/core/templates/test_command_queue.h +++ b/tests/core/templates/test_command_queue.h @@ -38,8 +38,6 @@ #include "core/templates/command_queue_mt.h" #include "tests/test_macros.h" -#if !defined(NO_THREADS) - namespace TestCommandQueue { class ThreadWork { @@ -426,6 +424,4 @@ TEST_CASE("[Stress][CommandQueue] Stress test command queue") { } } // namespace TestCommandQueue -#endif // !defined(NO_THREADS) - #endif // TEST_COMMAND_QUEUE_H diff --git a/tests/scene/test_audio_stream_wav.h b/tests/scene/test_audio_stream_wav.h index cf369c115b..4ba431dfc2 100644 --- a/tests/scene/test_audio_stream_wav.h +++ b/tests/scene/test_audio_stream_wav.h @@ -138,7 +138,7 @@ void run_test(String file_name, AudioStreamWAV::Format data_format, bool stereo, CHECK(stream->get_data() == test_data); SUBCASE("Stream length is computed properly") { - CHECK(Math::is_equal_approx(stream->get_length(), wav_count / wav_rate)); + CHECK(Math::is_equal_approx(stream->get_length(), double(wav_count / wav_rate))); } SUBCASE("Stream can be saved as .wav") { diff --git a/tests/scene/test_bit_map.h b/tests/scene/test_bit_map.h index 53afdc38f7..635449181e 100644 --- a/tests/scene/test_bit_map.h +++ b/tests/scene/test_bit_map.h @@ -183,7 +183,7 @@ TEST_CASE("[BitMap] Get true bit count") { CHECK(bit_map.get_true_bit_count() == 0); bit_map.create(dim); - CHECK_MESSAGE(bit_map.get_true_bit_count() == 0, "Unitialized bit map should have no true bits"); + CHECK_MESSAGE(bit_map.get_true_bit_count() == 0, "Uninitialized bit map should have no true bits"); bit_map.set_bit_rect(Rect2i{ 0, 0, 256, 256 }, true); CHECK(bit_map.get_true_bit_count() == 65536); bit_map.set_bitv(Point2i{ 0, 0 }, false); @@ -196,7 +196,7 @@ TEST_CASE("[BitMap] Get size") { const Size2i dim{ 256, 256 }; BitMap bit_map{}; - CHECK_MESSAGE(bit_map.get_size() == Size2i(0, 0), "Unitialized bit map should have a size of 0x0"); + CHECK_MESSAGE(bit_map.get_size() == Size2i(0, 0), "Uninitialized bit map should have a size of 0x0"); bit_map.create(dim); CHECK(bit_map.get_size() == Size2i(256, 256)); @@ -390,7 +390,7 @@ TEST_CASE("[BitMap] Convert to image") { bit_map.create(dim); img = bit_map.convert_to_image(); CHECK_MESSAGE(img->get_size() == dim, "Image should have the same dimensions as the BitMap"); - CHECK_MESSAGE(img->get_pixel(0, 0).is_equal_approx(Color(0, 0, 0)), "BitMap is intialized to all 0's, so Image should be all black"); + CHECK_MESSAGE(img->get_pixel(0, 0).is_equal_approx(Color(0, 0, 0)), "BitMap is initialized to all 0's, so Image should be all black"); reset_bit_map(bit_map); bit_map.set_bit_rect(Rect2i(0, 0, 128, 128), true); diff --git a/thirdparty/README.md b/thirdparty/README.md index ffc8137819..ac97d9c2a2 100644 --- a/thirdparty/README.md +++ b/thirdparty/README.md @@ -214,7 +214,7 @@ Files extracted from upstream source: ## harfbuzz - Upstream: https://github.com/harfbuzz/harfbuzz -- Version: 5.1.0 (f1f2be776bcd994fa9262622e1a7098a066e5cf7, 2022) +- Version: 5.2.0 (4a1d891c6317d2c83e5f3c2607ec5f5ccedffcde, 2022) - License: MIT Files extracted from upstream source: @@ -276,7 +276,7 @@ Files extracted from upstream source: ## libpng - Upstream: http://libpng.org/pub/png/libpng.html -- Version: 1.6.37 (a40189cf881e9f0db80511c382292a5604c3c3d1, 2019) +- Version: 1.6.38 (0a158f3506502dfa23edfc42790dfaed82efba17, 2022) - License: libpng/zlib Files extracted from upstream source: @@ -378,8 +378,8 @@ Files extracted from upstream repository: - `minimp3_ex.h` - `LICENSE` -Some changes have been made in order to fix Windows on ARM build errors. -They are marked with `// -- GODOT start --` and `// -- GODOT end --` +Some changes have been made in order to fix Windows on ARM build errors, and +to solve some MSVC warnings. See the patches in the `patches` directory. ## miniupnpc @@ -535,7 +535,7 @@ Patch files are provided in `oidn/patches/`. ## openxr - Upstream: https://github.com/KhronosGroup/OpenXR-SDK -- Version: 1.0.23 (885a90f8934d84121344ba8e4aa5159d5b496e08, 2022) +- Version: 1.0.25 (c16a18c99740ea5dd251e3af117e0e5aea4ceaa9, 2022) - License: Apache 2.0 Files extracted from upstream source: diff --git a/thirdparty/harfbuzz/src/OT/Layout/Common/Coverage.hh b/thirdparty/harfbuzz/src/OT/Layout/Common/Coverage.hh index e52a617c86..eef89a2879 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/Common/Coverage.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/Common/Coverage.hh @@ -206,7 +206,7 @@ struct Coverage template <typename IterableOut, hb_requires (hb_is_sink_of (IterableOut, hb_codepoint_t))> - void intersect_set (const hb_set_t &glyphs, IterableOut &intersect_glyphs) const + void intersect_set (const hb_set_t &glyphs, IterableOut&& intersect_glyphs) const { switch (u.format) { diff --git a/thirdparty/harfbuzz/src/OT/Layout/Common/CoverageFormat1.hh b/thirdparty/harfbuzz/src/OT/Layout/Common/CoverageFormat1.hh index 886babd2d1..82fd48dc50 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/Common/CoverageFormat1.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/Common/CoverageFormat1.hh @@ -88,7 +88,7 @@ struct CoverageFormat1_3 template <typename IterableOut, hb_requires (hb_is_sink_of (IterableOut, hb_codepoint_t))> - void intersect_set (const hb_set_t &glyphs, IterableOut &intersect_glyphs) const + void intersect_set (const hb_set_t &glyphs, IterableOut&& intersect_glyphs) const { unsigned count = glyphArray.len; for (unsigned i = 0; i < count; i++) diff --git a/thirdparty/harfbuzz/src/OT/Layout/Common/CoverageFormat2.hh b/thirdparty/harfbuzz/src/OT/Layout/Common/CoverageFormat2.hh index 4ddb2a73e4..974d094633 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/Common/CoverageFormat2.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/Common/CoverageFormat2.hh @@ -140,7 +140,7 @@ struct CoverageFormat2_4 template <typename IterableOut, hb_requires (hb_is_sink_of (IterableOut, hb_codepoint_t))> - void intersect_set (const hb_set_t &glyphs, IterableOut &intersect_glyphs) const + void intersect_set (const hb_set_t &glyphs, IterableOut&& intersect_glyphs) const { for (const auto& range : rangeRecord) { diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/Anchor.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/Anchor.hh index bfe6b36afd..49e76e7750 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/Anchor.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/Anchor.hh @@ -58,8 +58,7 @@ struct Anchor return_trace (bool (reinterpret_cast<Anchor *> (u.format1.copy (c->serializer)))); } return_trace (bool (reinterpret_cast<Anchor *> (u.format2.copy (c->serializer)))); - case 3: return_trace (bool (reinterpret_cast<Anchor *> (u.format3.copy (c->serializer, - c->plan->layout_variation_idx_map)))); + case 3: return_trace (u.format3.subset (c)); default:return_trace (false); } } diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/AnchorFormat3.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/AnchorFormat3.hh index d77b4699be..2e30ab33c3 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/AnchorFormat3.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/AnchorFormat3.hh @@ -41,24 +41,54 @@ struct AnchorFormat3 *y += (this+yDeviceTable).get_y_delta (font, c->var_store, c->var_store_cache); } - AnchorFormat3* copy (hb_serialize_context_t *c, - const hb_map_t *layout_variation_idx_map) const + bool subset (hb_subset_context_t *c) const { - TRACE_SERIALIZE (this); - if (!layout_variation_idx_map) return_trace (nullptr); + TRACE_SUBSET (this); + auto *out = c->serializer->start_embed (*this); + if (unlikely (!out)) return_trace (false); + if (unlikely (!c->serializer->embed (format))) return_trace (false); + if (unlikely (!c->serializer->embed (xCoordinate))) return_trace (false); + if (unlikely (!c->serializer->embed (yCoordinate))) return_trace (false); - auto *out = c->embed<AnchorFormat3> (this); - if (unlikely (!out)) return_trace (nullptr); + unsigned x_varidx = xDeviceTable ? (this+xDeviceTable).get_variation_index () : HB_OT_LAYOUT_NO_VARIATIONS_INDEX; + if (c->plan->layout_variation_idx_delta_map->has (x_varidx)) + { + int delta = hb_second (c->plan->layout_variation_idx_delta_map->get (x_varidx)); + if (delta != 0) + { + if (!c->serializer->check_assign (out->xCoordinate, xCoordinate + delta, + HB_SERIALIZE_ERROR_INT_OVERFLOW)) + return_trace (false); + } + } - out->xDeviceTable.serialize_copy (c, xDeviceTable, this, 0, hb_serialize_context_t::Head, layout_variation_idx_map); - out->yDeviceTable.serialize_copy (c, yDeviceTable, this, 0, hb_serialize_context_t::Head, layout_variation_idx_map); + unsigned y_varidx = yDeviceTable ? (this+yDeviceTable).get_variation_index () : HB_OT_LAYOUT_NO_VARIATIONS_INDEX; + if (c->plan->layout_variation_idx_delta_map->has (y_varidx)) + { + int delta = hb_second (c->plan->layout_variation_idx_delta_map->get (y_varidx)); + if (delta != 0) + { + if (!c->serializer->check_assign (out->yCoordinate, yCoordinate + delta, + HB_SERIALIZE_ERROR_INT_OVERFLOW)) + return_trace (false); + } + } + + if (c->plan->all_axes_pinned) + return_trace (c->serializer->check_assign (out->format, 1, HB_SERIALIZE_ERROR_INT_OVERFLOW)); + + if (!c->serializer->embed (xDeviceTable)) return_trace (false); + if (!c->serializer->embed (yDeviceTable)) return_trace (false); + + out->xDeviceTable.serialize_copy (c->serializer, xDeviceTable, this, 0, hb_serialize_context_t::Head, c->plan->layout_variation_idx_delta_map); + out->yDeviceTable.serialize_copy (c->serializer, yDeviceTable, this, 0, hb_serialize_context_t::Head, c->plan->layout_variation_idx_delta_map); return_trace (out); } void collect_variation_indices (hb_collect_variation_indices_context_t *c) const { - (this+xDeviceTable).collect_variation_indices (c->layout_variation_indices); - (this+yDeviceTable).collect_variation_indices (c->layout_variation_indices); + (this+xDeviceTable).collect_variation_indices (c); + (this+yDeviceTable).collect_variation_indices (c); } }; diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/Common.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/Common.hh index e16c06729d..408197454f 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/Common.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/Common.hh @@ -22,7 +22,8 @@ template<typename Iterator, typename SrcLookup> static void SinglePos_serialize (hb_serialize_context_t *c, const SrcLookup *src, Iterator it, - const hb_map_t *layout_variation_idx_map); + const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map, + bool all_axes_pinned); } diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/MarkRecord.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/MarkRecord.hh index 7a514453ae..a7d489d2a5 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/MarkRecord.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/MarkRecord.hh @@ -9,7 +9,7 @@ struct MarkRecord { friend struct MarkArray; - protected: + public: HBUINT16 klass; /* Class defined for this mark */ Offset16To<Anchor> markAnchor; /* Offset to Anchor table--from diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPosFormat1.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPosFormat1.hh index 3cb207281d..ddf7313f94 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPosFormat1.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPosFormat1.hh @@ -127,6 +127,12 @@ struct PairPosFormat1_3 out->valueFormat[1] = newFormats.second; } + if (c->plan->all_axes_pinned) + { + out->valueFormat[0] = out->valueFormat[0].drop_device_table_flags (); + out->valueFormat[1] = out->valueFormat[1].drop_device_table_flags (); + } + hb_sorted_vector_t<hb_codepoint_t> new_coverage; + hb_zip (this+coverage, pairSet) diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPosFormat2.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPosFormat2.hh index a80fe0c226..83b093b988 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPosFormat2.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPosFormat2.hh @@ -274,13 +274,19 @@ struct PairPosFormat2_4 out->valueFormat1 = newFormats.first; out->valueFormat2 = newFormats.second; + if (c->plan->all_axes_pinned) + { + out->valueFormat1 = out->valueFormat1.drop_device_table_flags (); + out->valueFormat2 = out->valueFormat2.drop_device_table_flags (); + } + for (unsigned class1_idx : + hb_range ((unsigned) class1Count) | hb_filter (klass1_map)) { for (unsigned class2_idx : + hb_range ((unsigned) class2Count) | hb_filter (klass2_map)) { unsigned idx = (class1_idx * (unsigned) class2Count + class2_idx) * (len1 + len2); - valueFormat1.copy_values (c->serializer, newFormats.first, this, &values[idx], c->plan->layout_variation_idx_map); - valueFormat2.copy_values (c->serializer, newFormats.second, this, &values[idx + len1], c->plan->layout_variation_idx_map); + valueFormat1.copy_values (c->serializer, out->valueFormat1, this, &values[idx], c->plan->layout_variation_idx_delta_map); + valueFormat2.copy_values (c->serializer, out->valueFormat2, this, &values[idx + len1], c->plan->layout_variation_idx_delta_map); } } diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairSet.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairSet.hh index 4578fbd1d6..aa48d933c3 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairSet.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairSet.hh @@ -163,7 +163,7 @@ struct PairSet newFormats, len1, &glyph_map, - c->plan->layout_variation_idx_map + c->plan->layout_variation_idx_delta_map }; const PairValueRecord *record = &firstPairValueRecord; diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairValueRecord.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairValueRecord.hh index bd95abde16..3222477764 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairValueRecord.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairValueRecord.hh @@ -34,7 +34,7 @@ struct PairValueRecord const ValueFormat *newFormats; unsigned len1; /* valueFormats[0].get_len() */ const hb_map_t *glyph_map; - const hb_map_t *layout_variation_idx_map; + const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map; }; bool subset (hb_subset_context_t *c, @@ -50,12 +50,12 @@ struct PairValueRecord closure->valueFormats[0].copy_values (s, closure->newFormats[0], closure->base, &values[0], - closure->layout_variation_idx_map); + closure->layout_variation_idx_delta_map); closure->valueFormats[1].copy_values (s, closure->newFormats[1], closure->base, &values[closure->len1], - closure->layout_variation_idx_map); + closure->layout_variation_idx_delta_map); return_trace (true); } diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePos.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePos.hh index 702f578b3c..6dce3e6343 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePos.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePos.hh @@ -38,12 +38,16 @@ struct SinglePos void serialize (hb_serialize_context_t *c, const SrcLookup* src, Iterator glyph_val_iter_pairs, - const hb_map_t *layout_variation_idx_map) + const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map, + bool all_axes_pinned) { if (unlikely (!c->extend_min (u.format))) return; unsigned format = 2; ValueFormat new_format = src->get_value_format (); + if (all_axes_pinned) + new_format = new_format.drop_device_table_flags (); + if (glyph_val_iter_pairs) format = get_format (glyph_val_iter_pairs); @@ -53,13 +57,13 @@ struct SinglePos src, glyph_val_iter_pairs, new_format, - layout_variation_idx_map); + layout_variation_idx_delta_map); return; case 2: u.format2.serialize (c, src, glyph_val_iter_pairs, new_format, - layout_variation_idx_map); + layout_variation_idx_delta_map); return; default:return; } @@ -84,8 +88,9 @@ static void SinglePos_serialize (hb_serialize_context_t *c, const SrcLookup *src, Iterator it, - const hb_map_t *layout_variation_idx_map) -{ c->start_embed<SinglePos> ()->serialize (c, src, it, layout_variation_idx_map); } + const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map, + bool all_axes_pinned) +{ c->start_embed<SinglePos> ()->serialize (c, src, it, layout_variation_idx_delta_map, all_axes_pinned); } } diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePosFormat1.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePosFormat1.hh index 7cbdf6dc6c..5a9dd58a63 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePosFormat1.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePosFormat1.hh @@ -87,7 +87,7 @@ struct SinglePosFormat1 const SrcLookup *src, Iterator it, ValueFormat newFormat, - const hb_map_t *layout_variation_idx_map) + const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map) { if (unlikely (!c->extend_min (this))) return; if (unlikely (!c->check_assign (valueFormat, @@ -96,7 +96,7 @@ struct SinglePosFormat1 for (const hb_array_t<const Value>& _ : + it | hb_map (hb_second)) { - src->get_value_format ().copy_values (c, newFormat, src, &_, layout_variation_idx_map); + src->get_value_format ().copy_values (c, newFormat, src, &_, layout_variation_idx_delta_map); // Only serialize the first entry in the iterator, the rest are assumed to // be the same. break; @@ -126,7 +126,7 @@ struct SinglePosFormat1 ; bool ret = bool (it); - SinglePos_serialize (c->serializer, this, it, c->plan->layout_variation_idx_map); + SinglePos_serialize (c->serializer, this, it, c->plan->layout_variation_idx_delta_map, c->plan->all_axes_pinned); return_trace (ret); } }; diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePosFormat2.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePosFormat2.hh index 518fa9dcb0..8a6e8a42a6 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePosFormat2.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePosFormat2.hh @@ -99,7 +99,7 @@ struct SinglePosFormat2 const SrcLookup *src, Iterator it, ValueFormat newFormat, - const hb_map_t *layout_variation_idx_map) + const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map) { auto out = c->extend_min (this); if (unlikely (!out)) return; @@ -109,7 +109,7 @@ struct SinglePosFormat2 + it | hb_map (hb_second) | hb_apply ([&] (hb_array_t<const Value> _) - { src->get_value_format ().copy_values (c, newFormat, src, &_, layout_variation_idx_map); }) + { src->get_value_format ().copy_values (c, newFormat, src, &_, layout_variation_idx_delta_map); }) ; auto glyphs = @@ -141,7 +141,7 @@ struct SinglePosFormat2 ; bool ret = bool (it); - SinglePos_serialize (c->serializer, this, it, c->plan->layout_variation_idx_map); + SinglePos_serialize (c->serializer, this, it, c->plan->layout_variation_idx_delta_map, c->plan->all_axes_pinned); return_trace (ret); } }; diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/ValueFormat.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/ValueFormat.hh index b29f287bce..26a40f01a3 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/ValueFormat.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/ValueFormat.hh @@ -59,6 +59,24 @@ struct ValueFormat : HBUINT16 unsigned int get_len () const { return hb_popcount ((unsigned int) *this); } unsigned int get_size () const { return get_len () * Value::static_size; } + hb_vector_t<unsigned> get_device_table_indices () const { + unsigned i = 0; + hb_vector_t<unsigned> result; + unsigned format = *this; + + if (format & xPlacement) i++; + if (format & yPlacement) i++; + if (format & xAdvance) i++; + if (format & yAdvance) i++; + + if (format & xPlaDevice) result.push (i++); + if (format & yPlaDevice) result.push (i++); + if (format & xAdvDevice) result.push (i++); + if (format & yAdvDevice) result.push (i++); + + return result; + } + bool apply_value (hb_ot_apply_context_t *c, const void *base, const Value *values, @@ -145,30 +163,50 @@ struct ValueFormat : HBUINT16 unsigned int new_format, const void *base, const Value *values, - const hb_map_t *layout_variation_idx_map) const + const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map) const { unsigned int format = *this; if (!format) return; - if (format & xPlacement) copy_value (c, new_format, xPlacement, *values++); - if (format & yPlacement) copy_value (c, new_format, yPlacement, *values++); - if (format & xAdvance) copy_value (c, new_format, xAdvance, *values++); - if (format & yAdvance) copy_value (c, new_format, yAdvance, *values++); + HBINT16 *x_placement = nullptr, *y_placement = nullptr, *x_adv = nullptr, *y_adv = nullptr; + if (format & xPlacement) x_placement = copy_value (c, new_format, xPlacement, *values++); + if (format & yPlacement) y_placement = copy_value (c, new_format, yPlacement, *values++); + if (format & xAdvance) x_adv = copy_value (c, new_format, xAdvance, *values++); + if (format & yAdvance) y_adv = copy_value (c, new_format, yAdvance, *values++); - if (format & xPlaDevice) copy_device (c, base, values++, layout_variation_idx_map); - if (format & yPlaDevice) copy_device (c, base, values++, layout_variation_idx_map); - if (format & xAdvDevice) copy_device (c, base, values++, layout_variation_idx_map); - if (format & yAdvDevice) copy_device (c, base, values++, layout_variation_idx_map); + if (format & xPlaDevice) + { + add_delta_to_value (x_placement, base, values, layout_variation_idx_delta_map); + copy_device (c, base, values++, layout_variation_idx_delta_map, new_format, xPlaDevice); + } + + if (format & yPlaDevice) + { + add_delta_to_value (y_placement, base, values, layout_variation_idx_delta_map); + copy_device (c, base, values++, layout_variation_idx_delta_map, new_format, yPlaDevice); + } + + if (format & xAdvDevice) + { + add_delta_to_value (x_adv, base, values, layout_variation_idx_delta_map); + copy_device (c, base, values++, layout_variation_idx_delta_map, new_format, xAdvDevice); + } + + if (format & yAdvDevice) + { + add_delta_to_value (y_adv, base, values, layout_variation_idx_delta_map); + copy_device (c, base, values++, layout_variation_idx_delta_map, new_format, yAdvDevice); + } } - void copy_value (hb_serialize_context_t *c, - unsigned int new_format, - Flags flag, - Value value) const + HBINT16* copy_value (hb_serialize_context_t *c, + unsigned int new_format, + Flags flag, + Value value) const { // Filter by new format. - if (!(new_format & flag)) return; - c->copy (value); + if (!(new_format & flag)) return nullptr; + return reinterpret_cast<HBINT16 *> (c->copy (value)); } void collect_variation_indices (hb_collect_variation_indices_context_t *c, @@ -183,31 +221,40 @@ struct ValueFormat : HBUINT16 if (format & yAdvance) i++; if (format & xPlaDevice) { - (base + get_device (&(values[i]))).collect_variation_indices (c->layout_variation_indices); + (base + get_device (&(values[i]))).collect_variation_indices (c); i++; } if (format & ValueFormat::yPlaDevice) { - (base + get_device (&(values[i]))).collect_variation_indices (c->layout_variation_indices); + (base + get_device (&(values[i]))).collect_variation_indices (c); i++; } if (format & ValueFormat::xAdvDevice) { - (base + get_device (&(values[i]))).collect_variation_indices (c->layout_variation_indices); + (base + get_device (&(values[i]))).collect_variation_indices (c); i++; } if (format & ValueFormat::yAdvDevice) { - (base + get_device (&(values[i]))).collect_variation_indices (c->layout_variation_indices); + (base + get_device (&(values[i]))).collect_variation_indices (c); i++; } } + unsigned drop_device_table_flags () const + { + unsigned format = *this; + for (unsigned flag = xPlaDevice; flag <= yAdvDevice; flag = flag << 1) + format = format & ~flag; + + return format; + } + private: bool sanitize_value_devices (hb_sanitize_context_t *c, const void *base, const Value *values) const { @@ -236,9 +283,27 @@ struct ValueFormat : HBUINT16 return *static_cast<const Offset16To<Device> *> (value); } + void add_delta_to_value (HBINT16 *value, + const void *base, + const Value *src_value, + const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map) const + { + if (!value) return; + unsigned varidx = (base + get_device (src_value)).get_variation_index (); + hb_pair_t<unsigned, int> *varidx_delta; + if (!layout_variation_idx_delta_map->has (varidx, &varidx_delta)) return; + + *value += hb_second (*varidx_delta); + } + bool copy_device (hb_serialize_context_t *c, const void *base, - const Value *src_value, const hb_map_t *layout_variation_idx_map) const + const Value *src_value, + const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map, + unsigned int new_format, Flags flag) const { + // Filter by new format. + if (!(new_format & flag)) return true; + Value *dst_value = c->copy (*src_value); if (!dst_value) return false; @@ -246,7 +311,7 @@ struct ValueFormat : HBUINT16 *dst_value = 0; c->push (); - if ((base + get_device (src_value)).copy (c, layout_variation_idx_map)) + if ((base + get_device (src_value)).copy (c, layout_variation_idx_delta_map)) { c->add_link (*dst_value, c->pop_pack ()); return true; diff --git a/thirdparty/harfbuzz/src/OT/Layout/GSUB/MultipleSubst.hh b/thirdparty/harfbuzz/src/OT/Layout/GSUB/MultipleSubst.hh index 98f2f5fe7a..852ca3eac5 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GSUB/MultipleSubst.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GSUB/MultipleSubst.hh @@ -35,19 +35,17 @@ struct MultipleSubst } } - /* TODO This function is unused and not updated to 24bit GIDs. Should be done by using - * iterators. While at it perhaps using iterator of arrays of hb_codepoint_t instead. */ + template<typename Iterator, + hb_requires (hb_is_sorted_iterator (Iterator))> bool serialize (hb_serialize_context_t *c, - hb_sorted_array_t<const HBGlyphID16> glyphs, - hb_array_t<const unsigned int> substitute_len_list, - hb_array_t<const HBGlyphID16> substitute_glyphs_list) + Iterator it) { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (u.format))) return_trace (false); unsigned int format = 1; u.format = format; switch (u.format) { - case 1: return_trace (u.format1.serialize (c, glyphs, substitute_len_list, substitute_glyphs_list)); + case 1: return_trace (u.format1.serialize (c, it)); default:return_trace (false); } } diff --git a/thirdparty/harfbuzz/src/OT/Layout/GSUB/MultipleSubstFormat1.hh b/thirdparty/harfbuzz/src/OT/Layout/GSUB/MultipleSubstFormat1.hh index 89a04ec3b1..3b4bd11694 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GSUB/MultipleSubstFormat1.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GSUB/MultipleSubstFormat1.hh @@ -71,22 +71,31 @@ struct MultipleSubstFormat1_2 return_trace ((this+sequence[index]).apply (c)); } + template<typename Iterator, + hb_requires (hb_is_sorted_iterator (Iterator))> bool serialize (hb_serialize_context_t *c, - hb_sorted_array_t<const HBGlyphID16> glyphs, - hb_array_t<const unsigned int> substitute_len_list, - hb_array_t<const HBGlyphID16> substitute_glyphs_list) + Iterator it) { TRACE_SERIALIZE (this); + auto sequences = + + it + | hb_map (hb_second) + ; + auto glyphs = + + it + | hb_map_retains_sorting (hb_first) + ; if (unlikely (!c->extend_min (this))) return_trace (false); - if (unlikely (!sequence.serialize (c, glyphs.length))) return_trace (false); - for (unsigned int i = 0; i < glyphs.length; i++) + + if (unlikely (!sequence.serialize (c, sequences.length))) return_trace (false); + + for (auto& pair : hb_zip (sequences, sequence)) { - unsigned int substitute_len = substitute_len_list[i]; - if (unlikely (!sequence[i] - .serialize_serialize (c, substitute_glyphs_list.sub_array (0, substitute_len)))) + if (unlikely (!pair.second + .serialize_serialize (c, pair.first))) return_trace (false); - substitute_glyphs_list += substitute_len; } + return_trace (coverage.serialize_serialize (c, glyphs)); } diff --git a/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat1.hh b/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat1.hh index 4b17243d81..13665d7ba1 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat1.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat1.hh @@ -42,6 +42,11 @@ struct SingleSubstFormat1_3 hb_codepoint_t d = deltaGlyphID; hb_codepoint_t mask = get_mask (); + /* Help fuzzer avoid this function as much. */ + unsigned pop = (this+coverage).get_population (); + if (pop >= mask) + return; + hb_set_t intersection; (this+coverage).intersect_set (c->parent_active_glyphs (), intersection); @@ -52,7 +57,7 @@ struct SingleSubstFormat1_3 hb_codepoint_t max_before = intersection.get_max (); hb_codepoint_t min_after = (min_before + d) & mask; hb_codepoint_t max_after = (max_before + d) & mask; - if ((this+coverage).get_population () >= max_before - min_before && + if (pop >= max_before - min_before && ((min_before <= min_after && min_after <= max_before) || (min_before <= max_after && max_after <= max_before))) return; diff --git a/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat2.hh b/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat2.hh index fb1e90d03e..5416299754 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat2.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat2.hh @@ -41,7 +41,6 @@ struct SingleSubstFormat2_4 | hb_map (hb_second) | hb_sink (c->output) ; - } void closure_lookups (hb_closure_lookups_context_t *c) const {} diff --git a/thirdparty/harfbuzz/src/OT/Layout/GSUB/SubstLookup.hh b/thirdparty/harfbuzz/src/OT/Layout/GSUB/SubstLookup.hh index 320685b868..d49dcc0e0f 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GSUB/SubstLookup.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GSUB/SubstLookup.hh @@ -119,19 +119,16 @@ struct SubstLookup : Lookup return_trace (false); } - bool serialize_multiple (hb_serialize_context_t *c, - uint32_t lookup_props, - hb_sorted_array_t<const HBGlyphID16> glyphs, - hb_array_t<const unsigned int> substitute_len_list, - hb_array_t<const HBGlyphID16> substitute_glyphs_list) + template<typename Iterator, + hb_requires (hb_is_sorted_iterator (Iterator))> + bool serialize (hb_serialize_context_t *c, + uint32_t lookup_props, + Iterator it) { TRACE_SERIALIZE (this); if (unlikely (!Lookup::serialize (c, SubTable::Multiple, lookup_props, 1))) return_trace (false); if (c->push<SubTable> ()->u.multiple. - serialize (c, - glyphs, - substitute_len_list, - substitute_glyphs_list)) + serialize (c, it)) { c->add_link (get_subtables<SubTable> ()[0], c->pop_pack ()); return_trace (true); diff --git a/thirdparty/harfbuzz/src/OT/glyf/CompositeGlyph.hh b/thirdparty/harfbuzz/src/OT/glyf/CompositeGlyph.hh index 98c2ee4e73..fc8e309bc9 100644 --- a/thirdparty/harfbuzz/src/OT/glyf/CompositeGlyph.hh +++ b/thirdparty/harfbuzz/src/OT/glyf/CompositeGlyph.hh @@ -105,6 +105,67 @@ struct CompositeGlyphRecord } } + unsigned compile_with_deltas (const contour_point_t &p_delta, + char *out) const + { + const HBINT8 *p = &StructAfter<const HBINT8> (flags); +#ifndef HB_NO_BEYOND_64K + if (flags & GID_IS_24BIT) + p += HBGlyphID24::static_size; + else +#endif + p += HBGlyphID16::static_size; + + unsigned len = get_size (); + unsigned len_before_val = (const char *)p - (const char *)this; + if (flags & ARG_1_AND_2_ARE_WORDS) + { + // no overflow, copy and update value with deltas + memcpy (out, this, len); + + const HBINT16 *px = reinterpret_cast<const HBINT16 *> (p); + HBINT16 *o = reinterpret_cast<HBINT16 *> (out + len_before_val); + o[0] = px[0] + roundf (p_delta.x); + o[1] = px[1] + roundf (p_delta.y); + } + else + { + int new_x = p[0] + roundf (p_delta.x); + int new_y = p[1] + roundf (p_delta.y); + if (new_x <= 127 && new_x >= -128 && + new_y <= 127 && new_y >= -128) + { + memcpy (out, this, len); + HBINT8 *o = reinterpret_cast<HBINT8 *> (out + len_before_val); + o[0] = new_x; + o[1] = new_y; + } + else + { + // int8 overflows after deltas applied + memcpy (out, this, len_before_val); + + //update flags + CompositeGlyphRecord *o = reinterpret_cast<CompositeGlyphRecord *> (out); + o->flags = flags | ARG_1_AND_2_ARE_WORDS; + out += len_before_val; + + HBINT16 new_value; + new_value = new_x; + memcpy (out, &new_value, HBINT16::static_size); + out += HBINT16::static_size; + + new_value = new_y; + memcpy (out, &new_value, HBINT16::static_size); + out += HBINT16::static_size; + + memcpy (out, p+2, len - len_before_val - 2); + len += 2; + } + } + return len; + } + protected: bool scaled_offsets () const { return (flags & (SCALED_COMPONENT_OFFSET | UNSCALED_COMPONENT_OFFSET)) == SCALED_COMPONENT_OFFSET; } @@ -288,6 +349,63 @@ struct CompositeGlyph return; glyph_chain.set_overlaps_flag (); } + + bool compile_bytes_with_deltas (const hb_bytes_t &source_bytes, + const contour_point_vector_t &deltas, + hb_bytes_t &dest_bytes /* OUT */) + { + if (source_bytes.length <= GlyphHeader::static_size || + header.numberOfContours != -1) + { + dest_bytes = hb_bytes_t (); + return true; + } + + unsigned source_len = source_bytes.length - GlyphHeader::static_size; + + /* try to allocate more memories than source glyph bytes + * in case that there might be an overflow for int8 value + * and we would need to use int16 instead */ + char *o = (char *) hb_calloc (source_len + source_len/2, sizeof (char)); + if (unlikely (!o)) return false; + + const CompositeGlyphRecord *c = reinterpret_cast<const CompositeGlyphRecord *> (source_bytes.arrayZ + GlyphHeader::static_size); + auto it = composite_iter_t (hb_bytes_t ((const char *)c, source_len), c); + + char *p = o; + unsigned i = 0, source_comp_len = 0; + for (const auto &component : it) + { + /* last 4 points in deltas are phantom points and should not be included */ + if (i >= deltas.length - 4) return false; + + unsigned comp_len = component.get_size (); + if (component.is_anchored ()) + { + memcpy (p, &component, comp_len); + p += comp_len; + } + else + { + unsigned new_len = component.compile_with_deltas (deltas[i], p); + p += new_len; + } + i++; + source_comp_len += comp_len; + } + + //copy instructions if any + if (source_len > source_comp_len) + { + unsigned instr_len = source_len - source_comp_len; + memcpy (p, (const char *)c + source_comp_len, instr_len); + p += instr_len; + } + + unsigned len = p - o; + dest_bytes = hb_bytes_t (o, len); + return true; + } }; diff --git a/thirdparty/harfbuzz/src/OT/glyf/Glyph.hh b/thirdparty/harfbuzz/src/OT/glyf/Glyph.hh index 3efe538f37..afcb5dc834 100644 --- a/thirdparty/harfbuzz/src/OT/glyf/Glyph.hh +++ b/thirdparty/harfbuzz/src/OT/glyf/Glyph.hh @@ -72,12 +72,117 @@ struct Glyph } } + void update_mtx (const hb_subset_plan_t *plan, + int xMin, int yMax, + const contour_point_vector_t &all_points) const + { + hb_codepoint_t new_gid = 0; + if (!plan->new_gid_for_old_gid (gid, &new_gid)) + return; + + unsigned len = all_points.length; + float leftSideX = all_points[len - 4].x; + float rightSideX = all_points[len - 3].x; + float topSideY = all_points[len - 2].y; + float bottomSideY = all_points[len - 1].y; + + int hori_aw = roundf (rightSideX - leftSideX); + if (hori_aw < 0) hori_aw = 0; + int lsb = roundf (xMin - leftSideX); + plan->hmtx_map->set (new_gid, hb_pair (hori_aw, lsb)); + + int vert_aw = roundf (topSideY - bottomSideY); + if (vert_aw < 0) vert_aw = 0; + int tsb = roundf (topSideY - yMax); + plan->vmtx_map->set (new_gid, hb_pair (vert_aw, tsb)); + } + + bool compile_header_bytes (const hb_subset_plan_t *plan, + const contour_point_vector_t &all_points, + hb_bytes_t &dest_bytes /* OUT */) const + { + GlyphHeader *glyph_header = nullptr; + if (all_points.length > 4) + { + glyph_header = (GlyphHeader *) hb_calloc (1, GlyphHeader::static_size); + if (unlikely (!glyph_header)) return false; + } + + int xMin, xMax; + xMin = xMax = roundf (all_points[0].x); + + int yMin, yMax; + yMin = yMax = roundf (all_points[0].y); + + for (unsigned i = 1; i < all_points.length - 4; i++) + { + float rounded_x = roundf (all_points[i].x); + float rounded_y = roundf (all_points[i].y); + xMin = hb_min (xMin, rounded_x); + xMax = hb_max (xMax, rounded_x); + yMin = hb_min (yMin, rounded_y); + yMax = hb_max (yMax, rounded_y); + } + + update_mtx (plan, xMin, yMax, all_points); + + /*for empty glyphs: all_points only include phantom points. + *just update metrics and then return */ + if (all_points.length == 4) + return true; + + glyph_header->numberOfContours = header->numberOfContours; + glyph_header->xMin = xMin; + glyph_header->yMin = yMin; + glyph_header->xMax = xMax; + glyph_header->yMax = yMax; + + dest_bytes = hb_bytes_t ((const char *)glyph_header, GlyphHeader::static_size); + return true; + } + + bool compile_bytes_with_deltas (const hb_subset_plan_t *plan, + hb_font_t *font, + const glyf_accelerator_t &glyf, + hb_bytes_t &dest_start, /* IN/OUT */ + hb_bytes_t &dest_end /* OUT */) const + { + contour_point_vector_t all_points, deltas; + get_points (font, glyf, all_points, &deltas, false); + + switch (type) { + case COMPOSITE: + if (!CompositeGlyph (*header, bytes).compile_bytes_with_deltas (dest_start, + deltas, + dest_end)) + return false; + break; + case SIMPLE: + if (!SimpleGlyph (*header, bytes).compile_bytes_with_deltas (all_points, + plan->flags & HB_SUBSET_FLAGS_NO_HINTING, + dest_end)) + return false; + break; + default: + /* set empty bytes for empty glyph + * do not use source glyph's pointers */ + dest_start = hb_bytes_t (); + dest_end = hb_bytes_t (); + break; + } + + return compile_header_bytes (plan, all_points, dest_start); + } + + /* Note: Recursively calls itself. * all_points includes phantom points */ template <typename accelerator_t> bool get_points (hb_font_t *font, const accelerator_t &glyf_accelerator, contour_point_vector_t &all_points /* OUT */, + contour_point_vector_t *deltas = nullptr, /* OUT */ + bool use_my_metrics = true, bool phantom_only = false, unsigned int depth = 0) const { @@ -130,10 +235,28 @@ struct Glyph phantoms[PHANTOM_BOTTOM].y = v_orig - (int) v_adv; } + if (deltas != nullptr && depth == 0 && type == COMPOSITE) + { + if (unlikely (!deltas->resize (points.length))) return false; + for (unsigned i = 0 ; i < points.length; i++) + deltas->arrayZ[i] = points.arrayZ[i]; + } + #ifndef HB_NO_VAR glyf_accelerator.gvar->apply_deltas_to_points (gid, font, points.as_array ()); #endif + // mainly used by CompositeGlyph calculating new X/Y offset value so no need to extend it + // with child glyphs' points + if (deltas != nullptr && depth == 0 && type == COMPOSITE) + { + for (unsigned i = 0 ; i < points.length; i++) + { + deltas->arrayZ[i].x = points.arrayZ[i].x - deltas->arrayZ[i].x; + deltas->arrayZ[i].y = points.arrayZ[i].y - deltas->arrayZ[i].y; + } + } + switch (type) { case SIMPLE: if (!inplace) @@ -148,11 +271,11 @@ struct Glyph comp_points.reset (); if (unlikely (!glyf_accelerator.glyph_for_gid (item.get_gid ()) .get_points (font, glyf_accelerator, comp_points, - phantom_only, depth + 1))) + deltas, use_my_metrics, phantom_only, depth + 1))) return false; /* Copy phantom points from component if USE_MY_METRICS flag set */ - if (item.is_use_my_metrics ()) + if (use_my_metrics && item.is_use_my_metrics ()) for (unsigned int i = 0; i < PHANTOM_COUNT; i++) phantoms[i] = comp_points[comp_points.length - PHANTOM_COUNT + i]; diff --git a/thirdparty/harfbuzz/src/OT/glyf/SimpleGlyph.hh b/thirdparty/harfbuzz/src/OT/glyf/SimpleGlyph.hh index 6df978cf13..b99665d6a0 100644 --- a/thirdparty/harfbuzz/src/OT/glyf/SimpleGlyph.hh +++ b/thirdparty/harfbuzz/src/OT/glyf/SimpleGlyph.hh @@ -206,6 +206,132 @@ struct SimpleGlyph && read_points (p, points_, end, &contour_point_t::y, FLAG_Y_SHORT, FLAG_Y_SAME); } + + static void encode_coord (int value, + uint8_t &flag, + const simple_glyph_flag_t short_flag, + const simple_glyph_flag_t same_flag, + hb_vector_t<uint8_t> &coords /* OUT */) + { + if (value == 0) + { + flag |= same_flag; + } + else if (value >= -255 && value <= 255) + { + flag |= short_flag; + if (value > 0) flag |= same_flag; + else value = -value; + + coords.push ((uint8_t)value); + } + else + { + int16_t val = value; + coords.push (val >> 8); + coords.push (val & 0xff); + } + } + + static void encode_flag (uint8_t &flag, + uint8_t &repeat, + uint8_t &lastflag, + hb_vector_t<uint8_t> &flags /* OUT */) + { + if (flag == lastflag && repeat != 255) + { + repeat = repeat + 1; + if (repeat == 1) + { + flags.push(flag); + } + else + { + unsigned len = flags.length; + flags[len-2] = flag | FLAG_REPEAT; + flags[len-1] = repeat; + } + } + else + { + repeat = 0; + flags.push (flag); + } + lastflag = flag; + } + + bool compile_bytes_with_deltas (const contour_point_vector_t &all_points, + bool no_hinting, + hb_bytes_t &dest_bytes /* OUT */) + { + if (header.numberOfContours == 0 || all_points.length <= 4) + { + dest_bytes = hb_bytes_t (); + return true; + } + //convert absolute values to relative values + unsigned num_points = all_points.length - 4; + hb_vector_t<hb_pair_t<int, int>> deltas; + deltas.resize (num_points); + + for (unsigned i = 0; i < num_points; i++) + { + deltas[i].first = i == 0 ? roundf (all_points[i].x) : roundf (all_points[i].x) - roundf (all_points[i-1].x); + deltas[i].second = i == 0 ? roundf (all_points[i].y) : roundf (all_points[i].y) - roundf (all_points[i-1].y); + } + + hb_vector_t<uint8_t> flags, x_coords, y_coords; + flags.alloc (num_points); + x_coords.alloc (2*num_points); + y_coords.alloc (2*num_points); + + uint8_t lastflag = 0, repeat = 0; + + for (unsigned i = 0; i < num_points; i++) + { + uint8_t flag = all_points[i].flag; + flag &= FLAG_ON_CURVE + FLAG_OVERLAP_SIMPLE; + + encode_coord (deltas[i].first, flag, FLAG_X_SHORT, FLAG_X_SAME, x_coords); + encode_coord (deltas[i].second, flag, FLAG_Y_SHORT, FLAG_Y_SAME, y_coords); + if (i == 0) lastflag = flag + 1; //make lastflag != flag for the first point + encode_flag (flag, repeat, lastflag, flags); + } + + unsigned len_before_instrs = 2 * header.numberOfContours + 2; + unsigned len_instrs = instructions_length (); + unsigned total_len = len_before_instrs + flags.length + x_coords.length + y_coords.length; + + if (!no_hinting) + total_len += len_instrs; + + char *p = (char *) hb_calloc (total_len, sizeof (char)); + if (unlikely (!p)) return false; + + const char *src = bytes.arrayZ + GlyphHeader::static_size; + char *cur = p; + memcpy (p, src, len_before_instrs); + + cur += len_before_instrs; + src += len_before_instrs; + + if (!no_hinting) + { + memcpy (cur, src, len_instrs); + cur += len_instrs; + } + + memcpy (cur, flags.arrayZ, flags.length); + cur += flags.length; + + memcpy (cur, x_coords.arrayZ, x_coords.length); + cur += x_coords.length; + + memcpy (cur, y_coords.arrayZ, y_coords.length); + + dest_bytes = hb_bytes_t (p, total_len); + return true; + } }; diff --git a/thirdparty/harfbuzz/src/OT/glyf/SubsetGlyph.hh b/thirdparty/harfbuzz/src/OT/glyf/SubsetGlyph.hh index 7ae8fe3078..7ddefc5a91 100644 --- a/thirdparty/harfbuzz/src/OT/glyf/SubsetGlyph.hh +++ b/thirdparty/harfbuzz/src/OT/glyf/SubsetGlyph.hh @@ -6,6 +6,9 @@ namespace OT { + +struct glyf_accelerator_t; + namespace glyf_impl { @@ -55,6 +58,17 @@ struct SubsetGlyph return_trace (true); } + bool compile_bytes_with_deltas (const hb_subset_plan_t *plan, + hb_font_t *font, + const glyf_accelerator_t &glyf) + { return source_glyph.compile_bytes_with_deltas (plan, font, glyf, dest_start, dest_end); } + + void free_compiled_bytes () + { + dest_start.fini (); + dest_end.fini (); + } + void drop_hints_bytes () { source_glyph.drop_hints_bytes (dest_start, dest_end); } diff --git a/thirdparty/harfbuzz/src/OT/glyf/glyf-helpers.hh b/thirdparty/harfbuzz/src/OT/glyf/glyf-helpers.hh index f51f7a81fc..181c33d06d 100644 --- a/thirdparty/harfbuzz/src/OT/glyf/glyf-helpers.hh +++ b/thirdparty/harfbuzz/src/OT/glyf/glyf-helpers.hh @@ -16,7 +16,7 @@ template<typename IteratorIn, typename IteratorOut, hb_requires (hb_is_source_of (IteratorIn, unsigned int)), hb_requires (hb_is_sink_of (IteratorOut, unsigned))> static void -_write_loca (IteratorIn it, bool short_offsets, IteratorOut dest) +_write_loca (IteratorIn&& it, bool short_offsets, IteratorOut&& dest) { unsigned right_shift = short_offsets ? 1 : 0; unsigned int offset = 0; diff --git a/thirdparty/harfbuzz/src/OT/glyf/glyf.hh b/thirdparty/harfbuzz/src/OT/glyf/glyf.hh index bcaf44fc1e..be2cb1d0dc 100644 --- a/thirdparty/harfbuzz/src/OT/glyf/glyf.hh +++ b/thirdparty/harfbuzz/src/OT/glyf/glyf.hh @@ -24,7 +24,6 @@ namespace OT { */ #define HB_OT_TAG_glyf HB_TAG('g','l','y','f') - struct glyf { friend struct glyf_accelerator_t; @@ -75,6 +74,9 @@ struct glyf hb_vector_t<glyf_impl::SubsetGlyph> glyphs; _populate_subset_glyphs (c->plan, &glyphs); + if (!c->plan->pinned_at_default) + _compile_subset_glyphs_with_deltas (c->plan, &glyphs); + auto padded_offsets = + hb_iter (glyphs) | hb_map (&glyf_impl::SubsetGlyph::padded_size) @@ -93,6 +95,8 @@ struct glyf } + if (!c->plan->pinned_at_default) + _free_compiled_subset_glyphs (&glyphs); if (unlikely (c->serializer->in_error ())) return_trace (false); return_trace (c->serializer->check_success (glyf_impl::_add_loca_and_head (c->plan, padded_offsets, @@ -102,6 +106,16 @@ struct glyf void _populate_subset_glyphs (const hb_subset_plan_t *plan, hb_vector_t<glyf_impl::SubsetGlyph> *glyphs /* OUT */) const; + + void + _compile_subset_glyphs_with_deltas (const hb_subset_plan_t *plan, + hb_vector_t<glyf_impl::SubsetGlyph> *glyphs /* OUT */) const; + + void _free_compiled_subset_glyphs (hb_vector_t<glyf_impl::SubsetGlyph> *glyphs) const + { + for (auto _ : *glyphs) + _.free_compiled_bytes (); + } protected: UnsizedArrayOf<HBUINT8> @@ -166,7 +180,7 @@ struct glyf_accelerator_t contour_point_vector_t all_points; bool phantom_only = !consumer.is_consuming_contour_points (); - if (unlikely (!glyph_for_gid (gid).get_points (font, *this, all_points, phantom_only))) + if (unlikely (!glyph_for_gid (gid).get_points (font, *this, all_points, nullptr, true, phantom_only))) return false; if (consumer.is_consuming_contour_points ()) @@ -389,6 +403,30 @@ glyf::_populate_subset_glyphs (const hb_subset_plan_t *plan, ; } +inline void +glyf::_compile_subset_glyphs_with_deltas (const hb_subset_plan_t *plan, + hb_vector_t<glyf_impl::SubsetGlyph> *glyphs /* OUT */) const +{ + OT::glyf_accelerator_t glyf (plan->source); + hb_font_t *font = hb_font_create (plan->source); + + hb_vector_t<hb_variation_t> vars; + vars.alloc (plan->user_axes_location->get_population ()); + + for (auto _ : *plan->user_axes_location) + { + hb_variation_t var; + var.tag = _.first; + var.value = _.second; + vars.push (var); + } + + hb_font_set_variations (font, vars.arrayZ, plan->user_axes_location->get_population ()); + for (auto& subset_glyph : *glyphs) + const_cast<glyf_impl::SubsetGlyph &> (subset_glyph).compile_bytes_with_deltas (plan, font, glyf); + + hb_font_destroy (font); +} } /* namespace OT */ diff --git a/thirdparty/harfbuzz/src/graph/classdef-graph.hh b/thirdparty/harfbuzz/src/graph/classdef-graph.hh new file mode 100644 index 0000000000..0bda76ac2f --- /dev/null +++ b/thirdparty/harfbuzz/src/graph/classdef-graph.hh @@ -0,0 +1,216 @@ +/* + * Copyright © 2022 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Garret Rieger + */ + +#include "graph.hh" +#include "../hb-ot-layout-common.hh" + +#ifndef GRAPH_CLASSDEF_GRAPH_HH +#define GRAPH_CLASSDEF_GRAPH_HH + +namespace graph { + +struct ClassDefFormat1 : public OT::ClassDefFormat1_3<SmallTypes> +{ + bool sanitize (graph_t::vertex_t& vertex) const + { + int64_t vertex_len = vertex.obj.tail - vertex.obj.head; + constexpr unsigned min_size = OT::ClassDefFormat1_3<SmallTypes>::min_size; + if (vertex_len < min_size) return false; + return vertex_len >= min_size + classValue.get_size () - classValue.len.get_size (); + } +}; + +struct ClassDefFormat2 : public OT::ClassDefFormat2_4<SmallTypes> +{ + bool sanitize (graph_t::vertex_t& vertex) const + { + int64_t vertex_len = vertex.obj.tail - vertex.obj.head; + constexpr unsigned min_size = OT::ClassDefFormat2_4<SmallTypes>::min_size; + if (vertex_len < min_size) return false; + return vertex_len >= min_size + rangeRecord.get_size () - rangeRecord.len.get_size (); + } +}; + +struct ClassDef : public OT::ClassDef +{ + template<typename It> + static bool add_class_def (gsubgpos_graph_context_t& c, + unsigned parent_id, + unsigned link_position, + It glyph_and_class, + unsigned max_size) + { + unsigned class_def_prime_id = c.graph.new_node (nullptr, nullptr); + auto& class_def_prime_vertex = c.graph.vertices_[class_def_prime_id]; + if (!make_class_def (c, glyph_and_class, class_def_prime_id, max_size)) + return false; + + auto* class_def_link = c.graph.vertices_[parent_id].obj.real_links.push (); + class_def_link->width = SmallTypes::size; + class_def_link->objidx = class_def_prime_id; + class_def_link->position = link_position; + class_def_prime_vertex.parents.push (parent_id); + + return true; + } + + template<typename It> + static bool make_class_def (gsubgpos_graph_context_t& c, + It glyph_and_class, + unsigned dest_obj, + unsigned max_size) + { + char* buffer = (char*) hb_calloc (1, max_size); + hb_serialize_context_t serializer (buffer, max_size); + OT::ClassDef_serialize (&serializer, glyph_and_class); + serializer.end_serialize (); + if (serializer.in_error ()) + { + hb_free (buffer); + return false; + } + + hb_bytes_t class_def_copy = serializer.copy_bytes (); + c.add_buffer ((char *) class_def_copy.arrayZ); // Give ownership to the context, it will cleanup the buffer. + + auto& obj = c.graph.vertices_[dest_obj].obj; + obj.head = (char *) class_def_copy.arrayZ; + obj.tail = obj.head + class_def_copy.length; + + hb_free (buffer); + return true; + } + + bool sanitize (graph_t::vertex_t& vertex) const + { + int64_t vertex_len = vertex.obj.tail - vertex.obj.head; + if (vertex_len < OT::ClassDef::min_size) return false; + switch (u.format) + { + case 1: return ((ClassDefFormat1*)this)->sanitize (vertex); + case 2: return ((ClassDefFormat2*)this)->sanitize (vertex); +#ifndef HB_NO_BORING_EXPANSION + // Not currently supported + case 3: + case 4: +#endif + default: return false; + } + } +}; + + +struct class_def_size_estimator_t +{ + template<typename It> + class_def_size_estimator_t (It glyph_and_class) + : gids_consecutive (true), num_ranges_per_class (), glyphs_per_class () + { + unsigned last_gid = (unsigned) -1; + for (auto p : + glyph_and_class) + { + unsigned gid = p.first; + unsigned klass = p.second; + + if (last_gid != (unsigned) -1 && gid != last_gid + 1) + gids_consecutive = false; + last_gid = gid; + + hb_set_t* glyphs; + if (glyphs_per_class.has (klass, &glyphs) && glyphs) { + glyphs->add (gid); + continue; + } + + hb_set_t new_glyphs; + new_glyphs.add (gid); + glyphs_per_class.set (klass, std::move (new_glyphs)); + } + + if (in_error ()) return; + + for (unsigned klass : glyphs_per_class.keys ()) + { + if (!klass) continue; // class 0 doesn't get encoded. + + const hb_set_t& glyphs = glyphs_per_class.get (klass); + hb_codepoint_t start = HB_SET_VALUE_INVALID; + hb_codepoint_t end = HB_SET_VALUE_INVALID; + + unsigned count = 0; + while (glyphs.next_range (&start, &end)) + count++; + + num_ranges_per_class.set (klass, count); + } + } + + // Incremental increase in the Coverage and ClassDef table size + // (worst case) if all glyphs associated with 'klass' were added. + unsigned incremental_coverage_size (unsigned klass) const + { + // Coverage takes 2 bytes per glyph worst case, + return 2 * glyphs_per_class.get (klass).get_population (); + } + + // Incremental increase in the Coverage and ClassDef table size + // (worst case) if all glyphs associated with 'klass' were added. + unsigned incremental_class_def_size (unsigned klass) const + { + // ClassDef takes 6 bytes per range + unsigned class_def_2_size = 6 * num_ranges_per_class.get (klass); + if (gids_consecutive) + { + // ClassDef1 takes 2 bytes per glyph, but only can be used + // when gids are consecutive. + return hb_min (2 * glyphs_per_class.get (klass).get_population (), class_def_2_size); + } + + return class_def_2_size; + } + + bool in_error () + { + if (num_ranges_per_class.in_error ()) return true; + if (glyphs_per_class.in_error ()) return true; + + for (const hb_set_t& s : glyphs_per_class.values ()) + { + if (s.in_error ()) return true; + } + return false; + } + + private: + bool gids_consecutive; + hb_hashmap_t<unsigned, unsigned> num_ranges_per_class; + hb_hashmap_t<unsigned, hb_set_t> glyphs_per_class; +}; + + +} + +#endif // GRAPH_CLASSDEF_GRAPH_HH diff --git a/thirdparty/harfbuzz/src/graph/coverage-graph.hh b/thirdparty/harfbuzz/src/graph/coverage-graph.hh index 1d9fd0eb5b..3c1022f090 100644 --- a/thirdparty/harfbuzz/src/graph/coverage-graph.hh +++ b/thirdparty/harfbuzz/src/graph/coverage-graph.hh @@ -56,6 +56,78 @@ struct CoverageFormat2 : public OT::Layout::Common::CoverageFormat2_4<SmallTypes struct Coverage : public OT::Layout::Common::Coverage { + static Coverage* clone_coverage (gsubgpos_graph_context_t& c, + unsigned coverage_id, + unsigned new_parent_id, + unsigned link_position, + unsigned start, unsigned end) + + { + unsigned coverage_size = c.graph.vertices_[coverage_id].table_size (); + auto& coverage_v = c.graph.vertices_[coverage_id]; + Coverage* coverage_table = (Coverage*) coverage_v.obj.head; + if (!coverage_table || !coverage_table->sanitize (coverage_v)) + return nullptr; + + auto new_coverage = + + hb_zip (coverage_table->iter (), hb_range ()) + | hb_filter ([&] (hb_pair_t<unsigned, unsigned> p) { + return p.second >= start && p.second < end; + }) + | hb_map_retains_sorting (hb_first) + ; + + return add_coverage (c, new_parent_id, link_position, new_coverage, coverage_size); + } + + template<typename It> + static Coverage* add_coverage (gsubgpos_graph_context_t& c, + unsigned parent_id, + unsigned link_position, + It glyphs, + unsigned max_size) + { + unsigned coverage_prime_id = c.graph.new_node (nullptr, nullptr); + auto& coverage_prime_vertex = c.graph.vertices_[coverage_prime_id]; + if (!make_coverage (c, glyphs, coverage_prime_id, max_size)) + return nullptr; + + auto* coverage_link = c.graph.vertices_[parent_id].obj.real_links.push (); + coverage_link->width = SmallTypes::size; + coverage_link->objidx = coverage_prime_id; + coverage_link->position = link_position; + coverage_prime_vertex.parents.push (parent_id); + + return (Coverage*) coverage_prime_vertex.obj.head; + } + + template<typename It> + static bool make_coverage (gsubgpos_graph_context_t& c, + It glyphs, + unsigned dest_obj, + unsigned max_size) + { + char* buffer = (char*) hb_calloc (1, max_size); + hb_serialize_context_t serializer (buffer, max_size); + OT::Layout::Common::Coverage_serialize (&serializer, glyphs); + serializer.end_serialize (); + if (serializer.in_error ()) + { + hb_free (buffer); + return false; + } + + hb_bytes_t coverage_copy = serializer.copy_bytes (); + c.add_buffer ((char *) coverage_copy.arrayZ); // Give ownership to the context, it will cleanup the buffer. + + auto& obj = c.graph.vertices_[dest_obj].obj; + obj.head = (char *) coverage_copy.arrayZ; + obj.tail = obj.head + coverage_copy.length; + + hb_free (buffer); + return true; + } + bool sanitize (graph_t::vertex_t& vertex) const { int64_t vertex_len = vertex.obj.tail - vertex.obj.head; diff --git a/thirdparty/harfbuzz/src/graph/graph.hh b/thirdparty/harfbuzz/src/graph/graph.hh index b3aef558a2..64878a84a4 100644 --- a/thirdparty/harfbuzz/src/graph/graph.hh +++ b/thirdparty/harfbuzz/src/graph/graph.hh @@ -49,6 +49,51 @@ struct graph_t unsigned end = 0; unsigned priority = 0; + void normalize () + { + obj.real_links.qsort (); + for (auto& l : obj.real_links) + { + for (unsigned i = 0; i < l.width; i++) + { + obj.head[l.position + i] = 0; + } + } + } + + bool equals (const vertex_t& other, + const graph_t& graph, + const graph_t& other_graph, + unsigned depth) const + { + if (!(as_bytes () == other.as_bytes ())) + { + DEBUG_MSG (SUBSET_REPACK, nullptr, + "vertex [%lu] bytes != [%lu] bytes, depth = %u", + table_size (), + other.table_size (), + depth); + + auto a = as_bytes (); + auto b = other.as_bytes (); + while (a || b) + { + DEBUG_MSG (SUBSET_REPACK, nullptr, + " 0x%x %s 0x%x", *a, (*a == *b) ? "==" : "!=", *b); + a++; + b++; + } + return false; + } + + return links_equal (obj.real_links, other.obj.real_links, graph, other_graph, depth); + } + + hb_bytes_t as_bytes () const + { + return hb_bytes_t (obj.head, table_size ()); + } + friend void swap (vertex_t& a, vertex_t& b) { hb_swap (a.obj, b.obj); @@ -60,6 +105,18 @@ struct graph_t hb_swap (a.priority, b.priority); } + hb_hashmap_t<unsigned, unsigned> + position_to_index_map () const + { + hb_hashmap_t<unsigned, unsigned> result; + + for (const auto& l : obj.real_links) { + result.set (l.position, l.objidx); + } + + return result; + } + bool is_shared () const { return parents.length > 1; @@ -84,7 +141,7 @@ struct graph_t { for (unsigned i = 0; i < obj.real_links.length; i++) { - auto& link = obj.real_links[i]; + auto& link = obj.real_links.arrayZ[i]; if (link.objidx != child_index) continue; @@ -155,6 +212,57 @@ struct graph_t return -table_size; } + + private: + bool links_equal (const hb_vector_t<hb_serialize_context_t::object_t::link_t>& this_links, + const hb_vector_t<hb_serialize_context_t::object_t::link_t>& other_links, + const graph_t& graph, + const graph_t& other_graph, + unsigned depth) const + { + auto a = this_links.iter (); + auto b = other_links.iter (); + + while (a && b) + { + const auto& link_a = *a; + const auto& link_b = *b; + + if (link_a.width != link_b.width || + link_a.is_signed != link_b.is_signed || + link_a.whence != link_b.whence || + link_a.position != link_b.position || + link_a.bias != link_b.bias) + return false; + + if (!graph.vertices_[link_a.objidx].equals ( + other_graph.vertices_[link_b.objidx], graph, other_graph, depth + 1)) + return false; + + a++; + b++; + } + + if (bool (a) != bool (b)) + return false; + + return true; + } + }; + + template <typename T> + struct vertex_and_table_t + { + vertex_and_table_t () : index (0), vertex (nullptr), table (nullptr) + {} + + unsigned index; + vertex_t* vertex; + T* table; + + operator bool () { + return table && vertex; + } }; /* @@ -169,7 +277,8 @@ struct graph_t : parents_invalid (true), distance_invalid (true), positions_invalid (true), - successful (true) + successful (true), + buffers () { num_roots_for_space_.push (1); bool removed_nil = false; @@ -201,6 +310,20 @@ struct graph_t ~graph_t () { vertices_.fini (); + for (char* b : buffers) + hb_free (b); + } + + bool operator== (const graph_t& other) const + { + return root ().equals (other.root (), *this, other, 0); + } + + // Sorts links of all objects in a consistent manner and zeroes all offsets. + void normalize () + { + for (auto& v : vertices_.writer ()) + v.normalize (); } bool in_error () const @@ -228,6 +351,27 @@ struct graph_t return vertices_[i].obj; } + void add_buffer (char* buffer) + { + buffers.push (buffer); + } + + /* + * Adds a 16 bit link from parent_id to child_id + */ + template<typename T> + void add_link (T* offset, + unsigned parent_id, + unsigned child_id) + { + auto& v = vertices_[parent_id]; + auto* link = v.obj.real_links.push (); + link->width = 2; + link->objidx = child_id; + link->position = (char*) offset - (char*) v.obj.head; + vertices_[child_id].parents.push (parent_id); + } + /* * Generates a new topological sorting of graph ordered by the shortest * distance to each node if positions are marked as invalid. @@ -345,13 +489,43 @@ struct graph_t } } - unsigned index_for_offset(unsigned node_idx, const void* offset) const + template <typename T, typename ...Ts> + vertex_and_table_t<T> as_table (unsigned parent, const void* offset, Ts... ds) + { + return as_table_from_index<T> (index_for_offset (parent, offset), std::forward<Ts>(ds)...); + } + + template <typename T, typename ...Ts> + vertex_and_table_t<T> as_table_from_index (unsigned index, Ts... ds) + { + if (index >= vertices_.length) + return vertex_and_table_t<T> (); + + vertex_and_table_t<T> r; + r.vertex = &vertices_[index]; + r.table = (T*) r.vertex->obj.head; + r.index = index; + if (!r.table) + return vertex_and_table_t<T> (); + + if (!r.table->sanitize (*(r.vertex), std::forward<Ts>(ds)...)) + return vertex_and_table_t<T> (); + + return r; + } + + // Finds the object id of the object pointed to by the offset at 'offset' + // within object[node_idx]. + unsigned index_for_offset (unsigned node_idx, const void* offset) const { const auto& node = object (node_idx); if (offset < node.head || offset >= node.tail) return -1; - for (const auto& link : node.real_links) + unsigned length = node.real_links.length; + for (unsigned i = 0; i < length; i++) { + // Use direct access for increased performance, this is a hot method. + const auto& link = node.real_links.arrayZ[i]; if (offset != node.head + link.position) continue; return link.objidx; @@ -360,6 +534,24 @@ struct graph_t return -1; } + // Finds the object id of the object pointed to by the offset at 'offset' + // within object[node_idx]. Ensures that the returned object is safe to mutate. + // That is, if the original child object is shared by parents other than node_idx + // it will be duplicated and the duplicate will be returned instead. + unsigned mutable_index_for_offset (unsigned node_idx, const void* offset) + { + unsigned child_idx = index_for_offset (node_idx, offset); + auto& child = vertices_[child_idx]; + for (unsigned p : child.parents) + { + if (p != node_idx) { + return duplicate (node_idx, child_idx); + } + } + + return child_idx; + } + /* * Assign unique space numbers to each connected subgraph of 24 bit and/or 32 bit offset(s). @@ -1039,6 +1231,7 @@ struct graph_t bool positions_invalid; bool successful; hb_vector_t<unsigned> num_roots_for_space_; + hb_vector_t<char*> buffers; }; } diff --git a/thirdparty/harfbuzz/src/graph/gsubgpos-context.cc b/thirdparty/harfbuzz/src/graph/gsubgpos-context.cc index e0ff6ff85f..b2044426d4 100644 --- a/thirdparty/harfbuzz/src/graph/gsubgpos-context.cc +++ b/thirdparty/harfbuzz/src/graph/gsubgpos-context.cc @@ -33,8 +33,7 @@ gsubgpos_graph_context_t::gsubgpos_graph_context_t (hb_tag_t table_tag_, : table_tag (table_tag_), graph (graph_), lookup_list_index (0), - lookups (), - buffers () + lookups () { if (table_tag_ != HB_OT_TAG_GPOS && table_tag_ != HB_OT_TAG_GSUB) @@ -53,7 +52,7 @@ unsigned gsubgpos_graph_context_t::create_node (unsigned size) if (!buffer) return -1; - buffers.push (buffer); + add_buffer (buffer); return graph.new_node (buffer, buffer + size); } diff --git a/thirdparty/harfbuzz/src/graph/gsubgpos-context.hh b/thirdparty/harfbuzz/src/graph/gsubgpos-context.hh index 49b24198ff..9fe9662e64 100644 --- a/thirdparty/harfbuzz/src/graph/gsubgpos-context.hh +++ b/thirdparty/harfbuzz/src/graph/gsubgpos-context.hh @@ -40,22 +40,16 @@ struct gsubgpos_graph_context_t graph_t& graph; unsigned lookup_list_index; hb_hashmap_t<unsigned, graph::Lookup*> lookups; - hb_vector_t<char*> buffers; + HB_INTERNAL gsubgpos_graph_context_t (hb_tag_t table_tag_, graph_t& graph_); - ~gsubgpos_graph_context_t () - { - for (char* b : buffers) - hb_free (b); - } - HB_INTERNAL unsigned create_node (unsigned size); void add_buffer (char* buffer) { - buffers.push (buffer); + graph.add_buffer (buffer); } private: diff --git a/thirdparty/harfbuzz/src/graph/gsubgpos-graph.hh b/thirdparty/harfbuzz/src/graph/gsubgpos-graph.hh index afa1152c44..a93e7d1c73 100644 --- a/thirdparty/harfbuzz/src/graph/gsubgpos-graph.hh +++ b/thirdparty/harfbuzz/src/graph/gsubgpos-graph.hh @@ -29,6 +29,7 @@ #include "../OT/Layout/GSUB/ExtensionSubst.hh" #include "gsubgpos-context.hh" #include "pairpos-graph.hh" +#include "markbasepos-graph.hh" #ifndef GRAPH_GSUBGPOS_GRAPH_HH #define GRAPH_GSUBGPOS_GRAPH_HH @@ -121,10 +122,12 @@ struct Lookup : public OT::Lookup if (c.table_tag != HB_OT_TAG_GPOS) return true; - if (!is_ext && type != OT::Layout::GPOS_impl::PosLookupSubTable::Type::Pair) + if (!is_ext && + type != OT::Layout::GPOS_impl::PosLookupSubTable::Type::Pair && + type != OT::Layout::GPOS_impl::PosLookupSubTable::Type::MarkBase) return true; - hb_vector_t<unsigned> all_new_subtables; + hb_vector_t<hb_pair_t<unsigned, hb_vector_t<unsigned>>> all_new_subtables; for (unsigned i = 0; i < subTable.len; i++) { unsigned subtable_index = c.graph.index_for_offset (this_index, &subTable[i]); @@ -133,39 +136,66 @@ struct Lookup : public OT::Lookup ExtensionFormat1<OT::Layout::GSUB_impl::ExtensionSubst>* extension = (ExtensionFormat1<OT::Layout::GSUB_impl::ExtensionSubst>*) c.graph.object (ext_subtable_index).head; - if (!extension->sanitize (c.graph.vertices_[ext_subtable_index])) + if (!extension || !extension->sanitize (c.graph.vertices_[ext_subtable_index])) continue; subtable_index = extension->get_subtable_index (c.graph, ext_subtable_index); type = extension->get_lookup_type (); - if (type != OT::Layout::GPOS_impl::PosLookupSubTable::Type::Pair) + if (type != OT::Layout::GPOS_impl::PosLookupSubTable::Type::Pair + && type != OT::Layout::GPOS_impl::PosLookupSubTable::Type::MarkBase) continue; } - PairPos* pairPos = (PairPos*) c.graph.object (subtable_index).head; - if (!pairPos->sanitize (c.graph.vertices_[subtable_index])) continue; - - hb_vector_t<unsigned> new_sub_tables = pairPos->split_subtables (c, subtable_index); + hb_vector_t<unsigned> new_sub_tables; + switch (type) + { + case 2: + new_sub_tables = split_subtable<PairPos> (c, subtable_index); break; + case 4: + new_sub_tables = split_subtable<MarkBasePos> (c, subtable_index); break; + default: + break; + } if (new_sub_tables.in_error ()) return false; - + new_sub_tables.iter() | hb_sink (all_new_subtables); + if (!new_sub_tables) continue; + hb_pair_t<unsigned, hb_vector_t<unsigned>>* entry = all_new_subtables.push (); + entry->first = i; + entry->second = std::move (new_sub_tables); } - if (all_new_subtables) + if (all_new_subtables) { add_sub_tables (c, this_index, type, all_new_subtables); + } return true; } + template<typename T> + hb_vector_t<unsigned> split_subtable (gsubgpos_graph_context_t& c, + unsigned objidx) + { + T* sub_table = (T*) c.graph.object (objidx).head; + if (!sub_table || !sub_table->sanitize (c.graph.vertices_[objidx])) + return hb_vector_t<unsigned> (); + + return sub_table->split_subtables (c, objidx); + } + void add_sub_tables (gsubgpos_graph_context_t& c, unsigned this_index, unsigned type, - hb_vector_t<unsigned>& subtable_indices) + hb_vector_t<hb_pair_t<unsigned, hb_vector_t<unsigned>>>& subtable_ids) { bool is_ext = is_extension (c.table_tag); auto& v = c.graph.vertices_[this_index]; + fix_existing_subtable_links (c, this_index, subtable_ids); + + unsigned new_subtable_count = 0; + for (const auto& p : subtable_ids) + new_subtable_count += p.second.length; size_t new_size = v.table_size () - + subtable_indices.length * OT::Offset16::static_size; + + new_subtable_count * OT::Offset16::static_size; char* buffer = (char*) hb_calloc (1, new_size); c.add_buffer (buffer); memcpy (buffer, v.obj.head, v.table_size()); @@ -175,30 +205,61 @@ struct Lookup : public OT::Lookup Lookup* new_lookup = (Lookup*) buffer; - new_lookup->subTable.len = subTable.len + subtable_indices.length; - unsigned offset_index = subTable.len; - for (unsigned subtable_id : subtable_indices) + unsigned shift = 0; + new_lookup->subTable.len = subTable.len + new_subtable_count; + for (const auto& p : subtable_ids) { - if (is_ext) + unsigned offset_index = p.first + shift + 1; + shift += p.second.length; + + for (unsigned subtable_id : p.second) { - unsigned ext_id = create_extension_subtable (c, subtable_id, type); - c.graph.vertices_[subtable_id].parents.push (ext_id); - subtable_id = ext_id; + if (is_ext) + { + unsigned ext_id = create_extension_subtable (c, subtable_id, type); + c.graph.vertices_[subtable_id].parents.push (ext_id); + subtable_id = ext_id; + } + + auto* link = v.obj.real_links.push (); + link->width = 2; + link->objidx = subtable_id; + link->position = (char*) &new_lookup->subTable[offset_index++] - + (char*) new_lookup; + c.graph.vertices_[subtable_id].parents.push (this_index); } - - auto* link = v.obj.real_links.push (); - link->width = 2; - link->objidx = subtable_id; - link->position = (char*) &new_lookup->subTable[offset_index++] - - (char*) new_lookup; - c.graph.vertices_[subtable_id].parents.push (this_index); } + // Repacker sort order depends on link order, which we've messed up so resort it. + v.obj.real_links.qsort (); + // The head location of the lookup has changed, invalidating the lookups map entry // in the context. Update the map. c.lookups.set (this_index, new_lookup); } + void fix_existing_subtable_links (gsubgpos_graph_context_t& c, + unsigned this_index, + hb_vector_t<hb_pair_t<unsigned, hb_vector_t<unsigned>>>& subtable_ids) + { + auto& v = c.graph.vertices_[this_index]; + Lookup* lookup = (Lookup*) v.obj.head; + + unsigned shift = 0; + for (const auto& p : subtable_ids) + { + unsigned insert_index = p.first + shift; + unsigned pos_offset = p.second.length * OT::Offset16::static_size; + unsigned insert_offset = (char*) &lookup->subTable[insert_index] - (char*) lookup; + shift += p.second.length; + + for (auto& l : v.obj.all_links_writer ()) + { + if (l.position > insert_offset) l.position += pos_offset; + } + } + } + unsigned create_extension_subtable (gsubgpos_graph_context_t& c, unsigned subtable_index, unsigned type) @@ -281,7 +342,7 @@ struct GSTAR : public OT::GSUBGPOS const auto& r = graph.root (); GSTAR* gstar = (GSTAR*) r.obj.head; - if (!gstar->sanitize (r)) + if (!gstar || !gstar->sanitize (r)) return nullptr; return gstar; @@ -327,17 +388,16 @@ struct GSTAR : public OT::GSUBGPOS hb_hashmap_t<unsigned, Lookup*>& lookups /* OUT */) { unsigned lookup_list_idx = get_lookup_list_index (graph); - const LookupList<Types>* lookupList = (const LookupList<Types>*) graph.object (lookup_list_idx).head; - if (!lookupList->sanitize (graph.vertices_[lookup_list_idx])) + if (!lookupList || !lookupList->sanitize (graph.vertices_[lookup_list_idx])) return; for (unsigned i = 0; i < lookupList->len; i++) { unsigned lookup_idx = graph.index_for_offset (lookup_list_idx, &(lookupList->arrayZ[i])); Lookup* lookup = (Lookup*) graph.object (lookup_idx).head; - if (!lookup->sanitize (graph.vertices_[lookup_idx])) continue; + if (!lookup || !lookup->sanitize (graph.vertices_[lookup_idx])) continue; lookups.set (lookup_idx, lookup); } } diff --git a/thirdparty/harfbuzz/src/graph/markbasepos-graph.hh b/thirdparty/harfbuzz/src/graph/markbasepos-graph.hh new file mode 100644 index 0000000000..56fa812406 --- /dev/null +++ b/thirdparty/harfbuzz/src/graph/markbasepos-graph.hh @@ -0,0 +1,507 @@ +/* + * Copyright © 2022 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Garret Rieger + */ + +#ifndef GRAPH_MARKBASEPOS_GRAPH_HH +#define GRAPH_MARKBASEPOS_GRAPH_HH + +#include "split-helpers.hh" +#include "coverage-graph.hh" +#include "../OT/Layout/GPOS/MarkBasePos.hh" +#include "../OT/Layout/GPOS/PosLookupSubTable.hh" + +namespace graph { + +struct AnchorMatrix : public OT::Layout::GPOS_impl::AnchorMatrix +{ + bool sanitize (graph_t::vertex_t& vertex, unsigned class_count) const + { + int64_t vertex_len = vertex.obj.tail - vertex.obj.head; + if (vertex_len < AnchorMatrix::min_size) return false; + + return vertex_len >= AnchorMatrix::min_size + + OT::Offset16::static_size * class_count * this->rows; + } + + bool shrink (gsubgpos_graph_context_t& c, + unsigned this_index, + unsigned old_class_count, + unsigned new_class_count) + { + if (new_class_count >= old_class_count) return false; + auto& o = c.graph.vertices_[this_index].obj; + unsigned base_count = rows; + o.tail = o.head + + AnchorMatrix::min_size + + OT::Offset16::static_size * base_count * new_class_count; + + // Reposition links into the new indexing scheme. + for (auto& link : o.real_links.writer ()) + { + unsigned index = (link.position - 2) / 2; + unsigned base = index / old_class_count; + unsigned klass = index % old_class_count; + if (klass >= new_class_count) + // should have already been removed + return false; + + unsigned new_index = base * new_class_count + klass; + + link.position = (char*) &(this->matrixZ[new_index]) - (char*) this; + } + + return true; + } + + unsigned clone (gsubgpos_graph_context_t& c, + unsigned this_index, + unsigned start, + unsigned end, + unsigned class_count) + { + unsigned base_count = rows; + unsigned new_class_count = end - start; + unsigned size = AnchorMatrix::min_size + + OT::Offset16::static_size * new_class_count * rows; + unsigned prime_id = c.create_node (size); + if (prime_id == (unsigned) -1) return -1; + AnchorMatrix* prime = (AnchorMatrix*) c.graph.object (prime_id).head; + prime->rows = base_count; + + auto& o = c.graph.vertices_[this_index].obj; + int num_links = o.real_links.length; + for (int i = 0; i < num_links; i++) + { + const auto& link = o.real_links[i]; + unsigned old_index = (link.position - 2) / OT::Offset16::static_size; + unsigned klass = old_index % class_count; + if (klass < start || klass >= end) continue; + + unsigned base = old_index / class_count; + unsigned new_klass = klass - start; + unsigned new_index = base * new_class_count + new_klass; + + + unsigned child_idx = link.objidx; + c.graph.add_link (&(prime->matrixZ[new_index]), + prime_id, + child_idx); + + auto& child = c.graph.vertices_[child_idx]; + child.remove_parent (this_index); + + o.real_links.remove (i); + num_links--; + i--; + } + + return prime_id; + } +}; + +struct MarkArray : public OT::Layout::GPOS_impl::MarkArray +{ + bool sanitize (graph_t::vertex_t& vertex) const + { + int64_t vertex_len = vertex.obj.tail - vertex.obj.head; + unsigned min_size = MarkArray::min_size; + if (vertex_len < min_size) return false; + + return vertex_len >= get_size (); + } + + bool shrink (gsubgpos_graph_context_t& c, + const hb_hashmap_t<unsigned, unsigned>& mark_array_links, + unsigned this_index, + unsigned new_class_count) + { + auto& o = c.graph.vertices_[this_index].obj; + for (const auto& link : o.real_links) + c.graph.vertices_[link.objidx].remove_parent (this_index); + o.real_links.reset (); + + unsigned new_index = 0; + for (const auto& record : this->iter ()) + { + unsigned klass = record.klass; + if (klass >= new_class_count) continue; + + (*this)[new_index].klass = klass; + unsigned position = (char*) &record.markAnchor - (char*) this; + unsigned* objidx; + if (!mark_array_links.has (position, &objidx)) + { + new_index++; + continue; + } + + c.graph.add_link (&(*this)[new_index].markAnchor, this_index, *objidx); + new_index++; + } + + this->len = new_index; + o.tail = o.head + MarkArray::min_size + + OT::Layout::GPOS_impl::MarkRecord::static_size * new_index; + return true; + } + + unsigned clone (gsubgpos_graph_context_t& c, + unsigned this_index, + const hb_hashmap_t<unsigned, unsigned>& pos_to_index, + hb_set_t& marks, + unsigned start_class) + { + unsigned size = MarkArray::min_size + + OT::Layout::GPOS_impl::MarkRecord::static_size * + marks.get_population (); + unsigned prime_id = c.create_node (size); + if (prime_id == (unsigned) -1) return -1; + MarkArray* prime = (MarkArray*) c.graph.object (prime_id).head; + prime->len = marks.get_population (); + + + unsigned i = 0; + for (hb_codepoint_t mark : marks) + { + (*prime)[i].klass = (*this)[mark].klass - start_class; + unsigned offset_pos = (char*) &((*this)[mark].markAnchor) - (char*) this; + unsigned* anchor_index; + if (pos_to_index.has (offset_pos, &anchor_index)) + c.graph.move_child (this_index, + &((*this)[mark].markAnchor), + prime_id, + &((*prime)[i].markAnchor)); + + i++; + } + + return prime_id; + } +}; + +struct MarkBasePosFormat1 : public OT::Layout::GPOS_impl::MarkBasePosFormat1_2<SmallTypes> +{ + bool sanitize (graph_t::vertex_t& vertex) const + { + int64_t vertex_len = vertex.obj.tail - vertex.obj.head; + return vertex_len >= MarkBasePosFormat1::static_size; + } + + hb_vector_t<unsigned> split_subtables (gsubgpos_graph_context_t& c, unsigned this_index) + { + hb_set_t visited; + + const unsigned base_coverage_id = c.graph.index_for_offset (this_index, &baseCoverage); + const unsigned base_size = + OT::Layout::GPOS_impl::PairPosFormat1_3<SmallTypes>::min_size + + MarkArray::min_size + + AnchorMatrix::min_size + + c.graph.vertices_[base_coverage_id].table_size (); + + hb_vector_t<class_info_t> class_to_info = get_class_info (c, this_index); + + unsigned class_count = classCount; + auto base_array = c.graph.as_table<AnchorMatrix> (this_index, + &baseArray, + class_count); + if (!base_array) return hb_vector_t<unsigned> (); + unsigned base_count = base_array.table->rows; + + unsigned partial_coverage_size = 4; + unsigned accumulated = base_size; + hb_vector_t<unsigned> split_points; + + for (unsigned klass = 0; klass < class_count; klass++) + { + class_info_t& info = class_to_info[klass]; + partial_coverage_size += OT::HBUINT16::static_size * info.marks.get_population (); + unsigned accumulated_delta = + OT::Layout::GPOS_impl::MarkRecord::static_size * info.marks.get_population () + + OT::Offset16::static_size * base_count; + + for (unsigned objidx : info.child_indices) + accumulated_delta += c.graph.find_subgraph_size (objidx, visited); + + accumulated += accumulated_delta; + unsigned total = accumulated + partial_coverage_size; + + if (total >= (1 << 16)) + { + split_points.push (klass); + accumulated = base_size + accumulated_delta; + partial_coverage_size = 4 + OT::HBUINT16::static_size * info.marks.get_population (); + visited.clear (); // node sharing isn't allowed between splits. + } + } + + + const unsigned mark_array_id = c.graph.index_for_offset (this_index, &markArray); + split_context_t split_context { + c, + this, + this_index, + std::move (class_to_info), + c.graph.vertices_[mark_array_id].position_to_index_map (), + }; + + return actuate_subtable_split<split_context_t> (split_context, split_points); + } + + private: + + struct class_info_t { + hb_set_t marks; + hb_vector_t<unsigned> child_indices; + }; + + struct split_context_t { + gsubgpos_graph_context_t& c; + MarkBasePosFormat1* thiz; + unsigned this_index; + hb_vector_t<class_info_t> class_to_info; + hb_hashmap_t<unsigned, unsigned> mark_array_links; + + hb_set_t marks_for (unsigned start, unsigned end) + { + hb_set_t marks; + for (unsigned klass = start; klass < end; klass++) + { + + class_to_info[klass].marks.iter () + | hb_sink (marks) + ; + } + return marks; + } + + unsigned original_count () + { + return thiz->classCount; + } + + unsigned clone_range (unsigned start, unsigned end) + { + return thiz->clone_range (*this, this->this_index, start, end); + } + + bool shrink (unsigned count) + { + return thiz->shrink (*this, this->this_index, count); + } + }; + + hb_vector_t<class_info_t> get_class_info (gsubgpos_graph_context_t& c, + unsigned this_index) + { + hb_vector_t<class_info_t> class_to_info; + + unsigned class_count= classCount; + class_to_info.resize (class_count); + + auto mark_array = c.graph.as_table<MarkArray> (this_index, &markArray); + if (!mark_array) return hb_vector_t<class_info_t> (); + unsigned mark_count = mark_array.table->len; + for (unsigned mark = 0; mark < mark_count; mark++) + { + unsigned klass = (*mark_array.table)[mark].get_class (); + class_to_info[klass].marks.add (mark); + } + + for (const auto& link : mark_array.vertex->obj.real_links) + { + unsigned mark = (link.position - 2) / + OT::Layout::GPOS_impl::MarkRecord::static_size; + unsigned klass = (*mark_array.table)[mark].get_class (); + class_to_info[klass].child_indices.push (link.objidx); + } + + unsigned base_array_id = + c.graph.index_for_offset (this_index, &baseArray); + auto& base_array_v = c.graph.vertices_[base_array_id]; + + for (const auto& link : base_array_v.obj.real_links) + { + unsigned index = (link.position - 2) / OT::Offset16::static_size; + unsigned klass = index % class_count; + class_to_info[klass].child_indices.push (link.objidx); + } + + return class_to_info; + } + + bool shrink (split_context_t& sc, + unsigned this_index, + unsigned count) + { + DEBUG_MSG (SUBSET_REPACK, nullptr, + " Shrinking MarkBasePosFormat1 (%u) to [0, %u).", + this_index, + count); + + unsigned old_count = classCount; + if (count >= old_count) + return true; + + classCount = count; + + auto mark_coverage = sc.c.graph.as_table<Coverage> (this_index, + &markCoverage); + if (!mark_coverage) return false; + hb_set_t marks = sc.marks_for (0, count); + auto new_coverage = + + hb_zip (hb_range (), mark_coverage.table->iter ()) + | hb_filter (marks, hb_first) + | hb_map_retains_sorting (hb_second) + ; + if (!Coverage::make_coverage (sc.c, + new_coverage, + mark_coverage.index, + 4 + 2 * marks.get_population ())) + return false; + + + auto base_array = sc.c.graph.as_table<AnchorMatrix> (this_index, + &baseArray, + old_count); + if (!base_array || !base_array.table->shrink (sc.c, + base_array.index, + old_count, + count)) + return false; + + auto mark_array = sc.c.graph.as_table<MarkArray> (this_index, + &markArray); + if (!mark_array || !mark_array.table->shrink (sc.c, + sc.mark_array_links, + mark_array.index, + count)) + return false; + + return true; + } + + // Create a new MarkBasePos that has all of the data for classes from [start, end). + unsigned clone_range (split_context_t& sc, + unsigned this_index, + unsigned start, unsigned end) const + { + DEBUG_MSG (SUBSET_REPACK, nullptr, + " Cloning MarkBasePosFormat1 (%u) range [%u, %u).", this_index, start, end); + + graph_t& graph = sc.c.graph; + unsigned prime_size = OT::Layout::GPOS_impl::MarkBasePosFormat1_2<SmallTypes>::static_size; + + unsigned prime_id = sc.c.create_node (prime_size); + if (prime_id == (unsigned) -1) return -1; + + MarkBasePosFormat1* prime = (MarkBasePosFormat1*) graph.object (prime_id).head; + prime->format = this->format; + unsigned new_class_count = end - start; + prime->classCount = new_class_count; + + unsigned base_coverage_id = + graph.index_for_offset (sc.this_index, &baseCoverage); + graph.add_link (&(prime->baseCoverage), prime_id, base_coverage_id); + graph.duplicate (prime_id, base_coverage_id); + + auto mark_coverage = sc.c.graph.as_table<Coverage> (this_index, + &markCoverage); + if (!mark_coverage) return false; + hb_set_t marks = sc.marks_for (start, end); + auto new_coverage = + + hb_zip (hb_range (), mark_coverage.table->iter ()) + | hb_filter (marks, hb_first) + | hb_map_retains_sorting (hb_second) + ; + if (!Coverage::add_coverage (sc.c, + prime_id, + 2, + + new_coverage, + marks.get_population () * 2 + 4)) + return -1; + + auto mark_array = + graph.as_table <MarkArray> (sc.this_index, &markArray); + if (!mark_array) return -1; + unsigned new_mark_array = + mark_array.table->clone (sc.c, + mark_array.index, + sc.mark_array_links, + marks, + start); + graph.add_link (&(prime->markArray), prime_id, new_mark_array); + + unsigned class_count = classCount; + auto base_array = + graph.as_table<AnchorMatrix> (sc.this_index, &baseArray, class_count); + if (!base_array) return -1; + unsigned new_base_array = + base_array.table->clone (sc.c, + base_array.index, + start, end, this->classCount); + graph.add_link (&(prime->baseArray), prime_id, new_base_array); + + return prime_id; + } +}; + + +struct MarkBasePos : public OT::Layout::GPOS_impl::MarkBasePos +{ + hb_vector_t<unsigned> split_subtables (gsubgpos_graph_context_t& c, + unsigned this_index) + { + switch (u.format) { + case 1: + return ((MarkBasePosFormat1*)(&u.format1))->split_subtables (c, this_index); +#ifndef HB_NO_BORING_EXPANSION + case 2: HB_FALLTHROUGH; + // Don't split 24bit PairPos's. +#endif + default: + return hb_vector_t<unsigned> (); + } + } + + bool sanitize (graph_t::vertex_t& vertex) const + { + int64_t vertex_len = vertex.obj.tail - vertex.obj.head; + if (vertex_len < u.format.get_size ()) return false; + + switch (u.format) { + case 1: + return ((MarkBasePosFormat1*)(&u.format1))->sanitize (vertex); +#ifndef HB_NO_BORING_EXPANSION + case 2: HB_FALLTHROUGH; +#endif + default: + // We don't handle format 3 and 4 here. + return false; + } + } +}; + + +} + +#endif // GRAPH_MARKBASEPOS_GRAPH_HH diff --git a/thirdparty/harfbuzz/src/graph/pairpos-graph.hh b/thirdparty/harfbuzz/src/graph/pairpos-graph.hh index 3ca4fc701c..976b872329 100644 --- a/thirdparty/harfbuzz/src/graph/pairpos-graph.hh +++ b/thirdparty/harfbuzz/src/graph/pairpos-graph.hh @@ -27,7 +27,9 @@ #ifndef GRAPH_PAIRPOS_GRAPH_HH #define GRAPH_PAIRPOS_GRAPH_HH +#include "split-helpers.hh" #include "coverage-graph.hh" +#include "classdef-graph.hh" #include "../OT/Layout/GPOS/PairPos.hh" #include "../OT/Layout/GPOS/PosLookupSubTable.hh" @@ -51,68 +53,62 @@ struct PairPosFormat1 : public OT::Layout::GPOS_impl::PairPosFormat1_3<SmallType const unsigned coverage_id = c.graph.index_for_offset (this_index, &coverage); const unsigned coverage_size = c.graph.vertices_[coverage_id].table_size (); - const unsigned base_size = OT::Layout::GPOS_impl::PairPosFormat1_3<SmallTypes>::min_size - + coverage_size; + const unsigned base_size = OT::Layout::GPOS_impl::PairPosFormat1_3<SmallTypes>::min_size; + unsigned partial_coverage_size = 4; unsigned accumulated = base_size; hb_vector_t<unsigned> split_points; for (unsigned i = 0; i < pairSet.len; i++) { unsigned pair_set_index = pair_set_graph_index (c, this_index, i); - accumulated += c.graph.find_subgraph_size (pair_set_index, visited); - accumulated += SmallTypes::size; // for PairSet offset. + unsigned accumulated_delta = + c.graph.find_subgraph_size (pair_set_index, visited) + + SmallTypes::size; // for PairSet offset. + partial_coverage_size += OT::HBUINT16::static_size; - // TODO(garretrieger): don't count the size of the largest pairset against the limit, since - // it will be packed last in the order and does not contribute to - // the 64kb limit. + accumulated += accumulated_delta; + unsigned total = accumulated + hb_min (partial_coverage_size, coverage_size); - if (accumulated > (1 << 16)) + if (total >= (1 << 16)) { split_points.push (i); - accumulated = base_size; - visited.clear (); // Pretend node sharing isn't allowed between splits. + accumulated = base_size + accumulated_delta; + partial_coverage_size = 6; + visited.clear (); // node sharing isn't allowed between splits. } } - return do_split (c, this_index, split_points); + split_context_t split_context { + c, + this, + this_index, + }; + + return actuate_subtable_split<split_context_t> (split_context, split_points); } private: - // Split this PairPos into two or more PairPos's. split_points defines - // the indices (first index to include in the new table) to split at. - // Returns the object id's of the newly created PairPos subtables. - hb_vector_t<unsigned> do_split (gsubgpos_graph_context_t& c, - unsigned this_index, - const hb_vector_t<unsigned> split_points) - { - hb_vector_t<unsigned> new_objects; - if (!split_points) - return new_objects; + struct split_context_t { + gsubgpos_graph_context_t& c; + PairPosFormat1* thiz; + unsigned this_index; - for (unsigned i = 0; i < split_points.length; i++) + unsigned original_count () { - unsigned start = split_points[i]; - unsigned end = (i < split_points.length - 1) ? split_points[i + 1] : pairSet.len; - unsigned id = clone_range (c, this_index, start, end); - - if (id == (unsigned) -1) - { - new_objects.reset (); - new_objects.allocated = -1; // mark error - return new_objects; - } - new_objects.push (id); + return thiz->pairSet.len; } - if (!shrink (c, this_index, split_points[0])) + unsigned clone_range (unsigned start, unsigned end) { - new_objects.reset (); - new_objects.allocated = -1; // mark error + return thiz->clone_range (this->c, this->this_index, start, end); } - return new_objects; - } + bool shrink (unsigned count) + { + return thiz->shrink (this->c, this->this_index, count); + } + }; bool shrink (gsubgpos_graph_context_t& c, unsigned this_index, @@ -129,11 +125,12 @@ struct PairPosFormat1 : public OT::Layout::GPOS_impl::PairPosFormat1_3<SmallType pairSet.len = count; c.graph.vertices_[this_index].obj.tail -= (old_count - count) * SmallTypes::size; - unsigned coverage_id = c.graph.index_for_offset (this_index, &coverage); + unsigned coverage_id = c.graph.mutable_index_for_offset (this_index, &coverage); unsigned coverage_size = c.graph.vertices_[coverage_id].table_size (); auto& coverage_v = c.graph.vertices_[coverage_id]; + Coverage* coverage_table = (Coverage*) coverage_v.obj.head; - if (!coverage_table->sanitize (coverage_v)) + if (!coverage_table || !coverage_table->sanitize (coverage_v)) return false; auto new_coverage = @@ -144,7 +141,7 @@ struct PairPosFormat1 : public OT::Layout::GPOS_impl::PairPosFormat1_3<SmallType | hb_map_retains_sorting (hb_first) ; - return make_coverage (c, new_coverage, coverage_id, coverage_size); + return Coverage::make_coverage (c, new_coverage, coverage_id, coverage_size); } // Create a new PairPos including PairSet's from start (inclusive) to end (exclusive). @@ -178,79 +175,431 @@ struct PairPosFormat1 : public OT::Layout::GPOS_impl::PairPosFormat1_3<SmallType } unsigned coverage_id = c.graph.index_for_offset (this_index, &coverage); - unsigned coverage_size = c.graph.vertices_[coverage_id].table_size (); - auto& coverage_v = c.graph.vertices_[coverage_id]; - Coverage* coverage_table = (Coverage*) coverage_v.obj.head; - if (!coverage_table->sanitize (coverage_v)) - return false; + if (!Coverage::clone_coverage (c, + coverage_id, + pair_pos_prime_id, + 2, + start, end)) + return -1; - auto new_coverage = - + hb_zip (coverage_table->iter (), hb_range ()) - | hb_filter ([&] (hb_pair_t<unsigned, unsigned> p) { - return p.second >= start && p.second < end; + return pair_pos_prime_id; + } + + + + unsigned pair_set_graph_index (gsubgpos_graph_context_t& c, unsigned this_index, unsigned i) const + { + return c.graph.index_for_offset (this_index, &pairSet[i]); + } +}; + +struct PairPosFormat2 : public OT::Layout::GPOS_impl::PairPosFormat2_4<SmallTypes> +{ + bool sanitize (graph_t::vertex_t& vertex) const + { + size_t vertex_len = vertex.table_size (); + unsigned min_size = OT::Layout::GPOS_impl::PairPosFormat2_4<SmallTypes>::min_size; + if (vertex_len < min_size) return false; + + const unsigned class1_count = class1Count; + return vertex_len >= + min_size + class1_count * get_class1_record_size (); + } + + hb_vector_t<unsigned> split_subtables (gsubgpos_graph_context_t& c, unsigned this_index) + { + const unsigned base_size = OT::Layout::GPOS_impl::PairPosFormat2_4<SmallTypes>::min_size; + const unsigned class_def_2_size = size_of (c, this_index, &classDef2); + const Coverage* coverage = get_coverage (c, this_index); + const ClassDef* class_def_1 = get_class_def_1 (c, this_index); + auto gid_and_class = + + coverage->iter () + | hb_map_retains_sorting ([&] (hb_codepoint_t gid) { + return hb_pair_t<hb_codepoint_t, hb_codepoint_t> (gid, class_def_1->get_class (gid)); }) - | hb_map_retains_sorting (hb_first) ; + class_def_size_estimator_t estimator (gid_and_class); + + const unsigned class1_count = class1Count; + const unsigned class2_count = class2Count; + const unsigned class1_record_size = get_class1_record_size (); - unsigned coverage_prime_id = c.graph.new_node (nullptr, nullptr); - auto& coverage_prime_vertex = c.graph.vertices_[coverage_prime_id]; - if (!make_coverage (c, new_coverage, coverage_prime_id, coverage_size)) + const unsigned value_1_len = valueFormat1.get_len (); + const unsigned value_2_len = valueFormat2.get_len (); + const unsigned total_value_len = value_1_len + value_2_len; + + unsigned accumulated = base_size; + unsigned coverage_size = 4; + unsigned class_def_1_size = 4; + unsigned max_coverage_size = coverage_size; + unsigned max_class_def_1_size = class_def_1_size; + + hb_vector_t<unsigned> split_points; + + hb_hashmap_t<unsigned, unsigned> device_tables = get_all_device_tables (c, this_index); + hb_vector_t<unsigned> format1_device_table_indices = valueFormat1.get_device_table_indices (); + hb_vector_t<unsigned> format2_device_table_indices = valueFormat2.get_device_table_indices (); + bool has_device_tables = bool(format1_device_table_indices) || bool(format2_device_table_indices); + + hb_set_t visited; + for (unsigned i = 0; i < class1_count; i++) + { + unsigned accumulated_delta = class1_record_size; + coverage_size += estimator.incremental_coverage_size (i); + class_def_1_size += estimator.incremental_class_def_size (i); + max_coverage_size = hb_max (max_coverage_size, coverage_size); + max_class_def_1_size = hb_max (max_class_def_1_size, class_def_1_size); + + if (has_device_tables) { + for (unsigned j = 0; j < class2_count; j++) + { + unsigned value1_index = total_value_len * (class2_count * i + j); + unsigned value2_index = value1_index + value_1_len; + accumulated_delta += size_of_value_record_children (c, + device_tables, + format1_device_table_indices, + value1_index, + visited); + accumulated_delta += size_of_value_record_children (c, + device_tables, + format2_device_table_indices, + value2_index, + visited); + } + } + + accumulated += accumulated_delta; + unsigned total = accumulated + + coverage_size + class_def_1_size + class_def_2_size + // The largest object will pack last and can exceed the size limit. + - hb_max (hb_max (coverage_size, class_def_1_size), class_def_2_size); + if (total >= (1 << 16)) + { + split_points.push (i); + // split does not include i, so add the size for i when we reset the size counters. + accumulated = base_size + accumulated_delta; + coverage_size = 4 + estimator.incremental_coverage_size (i); + class_def_1_size = 4 + estimator.incremental_class_def_size (i); + visited.clear (); // node sharing isn't allowed between splits. + } + } + + split_context_t split_context { + c, + this, + this_index, + class1_record_size, + total_value_len, + value_1_len, + value_2_len, + max_coverage_size, + max_class_def_1_size, + device_tables, + format1_device_table_indices, + format2_device_table_indices + }; + + return actuate_subtable_split<split_context_t> (split_context, split_points); + } + private: + + struct split_context_t + { + gsubgpos_graph_context_t& c; + PairPosFormat2* thiz; + unsigned this_index; + unsigned class1_record_size; + unsigned value_record_len; + unsigned value1_record_len; + unsigned value2_record_len; + unsigned max_coverage_size; + unsigned max_class_def_size; + + const hb_hashmap_t<unsigned, unsigned>& device_tables; + const hb_vector_t<unsigned>& format1_device_table_indices; + const hb_vector_t<unsigned>& format2_device_table_indices; + + unsigned original_count () + { + return thiz->class1Count; + } + + unsigned clone_range (unsigned start, unsigned end) + { + return thiz->clone_range (*this, start, end); + } + + bool shrink (unsigned count) + { + return thiz->shrink (*this, count); + } + }; + + size_t get_class1_record_size () const + { + const size_t class2_count = class2Count; + return + class2_count * (valueFormat1.get_size () + valueFormat2.get_size ()); + } + + unsigned clone_range (split_context_t& split_context, + unsigned start, unsigned end) const + { + DEBUG_MSG (SUBSET_REPACK, nullptr, + " Cloning PairPosFormat2 (%u) range [%u, %u).", split_context.this_index, start, end); + + graph_t& graph = split_context.c.graph; + + unsigned num_records = end - start; + unsigned prime_size = OT::Layout::GPOS_impl::PairPosFormat2_4<SmallTypes>::min_size + + num_records * split_context.class1_record_size; + + unsigned pair_pos_prime_id = split_context.c.create_node (prime_size); + if (pair_pos_prime_id == (unsigned) -1) return -1; + + PairPosFormat2* pair_pos_prime = + (PairPosFormat2*) graph.object (pair_pos_prime_id).head; + pair_pos_prime->format = this->format; + pair_pos_prime->valueFormat1 = this->valueFormat1; + pair_pos_prime->valueFormat2 = this->valueFormat2; + pair_pos_prime->class1Count = num_records; + pair_pos_prime->class2Count = this->class2Count; + clone_class1_records (split_context, + pair_pos_prime_id, + start, + end); + + unsigned coverage_id = + graph.index_for_offset (split_context.this_index, &coverage); + unsigned class_def_1_id = + graph.index_for_offset (split_context.this_index, &classDef1); + auto& coverage_v = graph.vertices_[coverage_id]; + auto& class_def_1_v = graph.vertices_[class_def_1_id]; + Coverage* coverage_table = (Coverage*) coverage_v.obj.head; + ClassDef* class_def_1_table = (ClassDef*) class_def_1_v.obj.head; + if (!coverage_table + || !coverage_table->sanitize (coverage_v) + || !class_def_1_table + || !class_def_1_table->sanitize (class_def_1_v)) return -1; - auto* coverage_link = c.graph.vertices_[pair_pos_prime_id].obj.real_links.push (); - coverage_link->width = SmallTypes::size; - coverage_link->objidx = coverage_prime_id; - coverage_link->position = 2; - coverage_prime_vertex.parents.push (pair_pos_prime_id); + auto klass_map = + + coverage_table->iter () + | hb_map_retains_sorting ([&] (hb_codepoint_t gid) { + return hb_pair_t<hb_codepoint_t, hb_codepoint_t> (gid, class_def_1_table->get_class (gid)); + }) + | hb_filter ([&] (hb_codepoint_t klass) { + return klass >= start && klass < end; + }, hb_second) + | hb_map_retains_sorting ([&] (hb_pair_t<hb_codepoint_t, hb_codepoint_t> gid_and_class) { + // Classes must be from 0...N so subtract start + return hb_pair_t<hb_codepoint_t, hb_codepoint_t> (gid_and_class.first, gid_and_class.second - start); + }) + ; + + if (!Coverage::add_coverage (split_context.c, + pair_pos_prime_id, + 2, + + klass_map | hb_map_retains_sorting (hb_first), + split_context.max_coverage_size)) + return -1; + + // classDef1 + if (!ClassDef::add_class_def (split_context.c, + pair_pos_prime_id, + 8, + + klass_map, + split_context.max_class_def_size)) + return -1; + + // classDef2 + unsigned class_def_2_id = + graph.index_for_offset (split_context.this_index, &classDef2); + auto* class_def_link = graph.vertices_[pair_pos_prime_id].obj.real_links.push (); + class_def_link->width = SmallTypes::size; + class_def_link->objidx = class_def_2_id; + class_def_link->position = 10; + graph.vertices_[class_def_2_id].parents.push (pair_pos_prime_id); + graph.duplicate (pair_pos_prime_id, class_def_2_id); return pair_pos_prime_id; } - template<typename It> - bool make_coverage (gsubgpos_graph_context_t& c, - It glyphs, - unsigned dest_obj, - unsigned max_size) const + void clone_class1_records (split_context_t& split_context, + unsigned pair_pos_prime_id, + unsigned start, unsigned end) const { - char* buffer = (char*) hb_calloc (1, max_size); - hb_serialize_context_t serializer (buffer, max_size); - Coverage_serialize (&serializer, glyphs); - serializer.end_serialize (); - if (serializer.in_error ()) + PairPosFormat2* pair_pos_prime = + (PairPosFormat2*) split_context.c.graph.object (pair_pos_prime_id).head; + + char* start_addr = ((char*)&values[0]) + start * split_context.class1_record_size; + unsigned num_records = end - start; + memcpy (&pair_pos_prime->values[0], + start_addr, + num_records * split_context.class1_record_size); + + if (!split_context.format1_device_table_indices + && !split_context.format2_device_table_indices) + // No device tables to move over. + return; + + unsigned class2_count = class2Count; + for (unsigned i = start; i < end; i++) { - hb_free (buffer); - return false; + for (unsigned j = 0; j < class2_count; j++) + { + unsigned value1_index = split_context.value_record_len * (class2_count * i + j); + unsigned value2_index = value1_index + split_context.value1_record_len; + + unsigned new_value1_index = split_context.value_record_len * (class2_count * (i - start) + j); + unsigned new_value2_index = new_value1_index + split_context.value1_record_len; + + transfer_device_tables (split_context, + pair_pos_prime_id, + split_context.format1_device_table_indices, + value1_index, + new_value1_index); + + transfer_device_tables (split_context, + pair_pos_prime_id, + split_context.format2_device_table_indices, + value2_index, + new_value2_index); + } } + } - hb_bytes_t coverage_copy = serializer.copy_bytes (); - c.add_buffer ((char *) coverage_copy.arrayZ); // Give ownership to the context, it will cleanup the buffer. + void transfer_device_tables (split_context_t& split_context, + unsigned pair_pos_prime_id, + const hb_vector_t<unsigned>& device_table_indices, + unsigned old_value_record_index, + unsigned new_value_record_index) const + { + PairPosFormat2* pair_pos_prime = + (PairPosFormat2*) split_context.c.graph.object (pair_pos_prime_id).head; - auto& obj = c.graph.vertices_[dest_obj].obj; - obj.head = (char *) coverage_copy.arrayZ; - obj.tail = obj.head + coverage_copy.length; + for (unsigned i : device_table_indices) + { + OT::Offset16* record = (OT::Offset16*) &values[old_value_record_index + i]; + unsigned record_position = ((char*) record) - ((char*) this); + if (!split_context.device_tables.has (record_position)) continue; + + split_context.c.graph.move_child ( + split_context.this_index, + record, + pair_pos_prime_id, + (OT::Offset16*) &pair_pos_prime->values[new_value_record_index + i]); + } + } - hb_free (buffer); - return true; + bool shrink (split_context_t& split_context, + unsigned count) + { + DEBUG_MSG (SUBSET_REPACK, nullptr, + " Shrinking PairPosFormat2 (%u) to [0, %u).", + split_context.this_index, + count); + unsigned old_count = class1Count; + if (count >= old_count) + return true; + + graph_t& graph = split_context.c.graph; + class1Count = count; + graph.vertices_[split_context.this_index].obj.tail -= + (old_count - count) * split_context.class1_record_size; + + unsigned coverage_id = + graph.mutable_index_for_offset (split_context.this_index, &coverage); + unsigned class_def_1_id = + graph.mutable_index_for_offset (split_context.this_index, &classDef1); + auto& coverage_v = graph.vertices_[coverage_id]; + auto& class_def_1_v = graph.vertices_[class_def_1_id]; + Coverage* coverage_table = (Coverage*) coverage_v.obj.head; + ClassDef* class_def_1_table = (ClassDef*) class_def_1_v.obj.head; + if (!coverage_table + || !coverage_table->sanitize (coverage_v) + || !class_def_1_table + || !class_def_1_table->sanitize (class_def_1_v)) + return false; + + auto klass_map = + + coverage_table->iter () + | hb_map_retains_sorting ([&] (hb_codepoint_t gid) { + return hb_pair_t<hb_codepoint_t, hb_codepoint_t> (gid, class_def_1_table->get_class (gid)); + }) + | hb_filter ([&] (hb_codepoint_t klass) { + return klass < count; + }, hb_second) + ; + + if (!Coverage::make_coverage (split_context.c, + + klass_map | hb_map_retains_sorting (hb_first), + coverage_id, + coverage_v.table_size ())) + return false; + + return ClassDef::make_class_def (split_context.c, + + klass_map, + class_def_1_id, + class_def_1_v.table_size ()); } - unsigned pair_set_graph_index (gsubgpos_graph_context_t& c, unsigned this_index, unsigned i) const + hb_hashmap_t<unsigned, unsigned> + get_all_device_tables (gsubgpos_graph_context_t& c, + unsigned this_index) const { - return c.graph.index_for_offset (this_index, &pairSet[i]); + const auto& v = c.graph.vertices_[this_index]; + return v.position_to_index_map (); } -}; -struct PairPosFormat2 : public OT::Layout::GPOS_impl::PairPosFormat2_4<SmallTypes> -{ - bool sanitize (graph_t::vertex_t& vertex) const + const Coverage* get_coverage (gsubgpos_graph_context_t& c, + unsigned this_index) const { - // TODO(garretrieger): implement me! - return true; + unsigned coverage_id = c.graph.index_for_offset (this_index, &coverage); + auto& coverage_v = c.graph.vertices_[coverage_id]; + + Coverage* coverage_table = (Coverage*) coverage_v.obj.head; + if (!coverage_table || !coverage_table->sanitize (coverage_v)) + return &Null(Coverage); + return coverage_table; } - hb_vector_t<unsigned> split_subtables (gsubgpos_graph_context_t& c, unsigned this_index) + const ClassDef* get_class_def_1 (gsubgpos_graph_context_t& c, + unsigned this_index) const + { + unsigned class_def_1_id = c.graph.index_for_offset (this_index, &classDef1); + auto& class_def_1_v = c.graph.vertices_[class_def_1_id]; + + ClassDef* class_def_1_table = (ClassDef*) class_def_1_v.obj.head; + if (!class_def_1_table || !class_def_1_table->sanitize (class_def_1_v)) + return &Null(ClassDef); + return class_def_1_table; + } + + unsigned size_of_value_record_children (gsubgpos_graph_context_t& c, + const hb_hashmap_t<unsigned, unsigned>& device_tables, + const hb_vector_t<unsigned> device_table_indices, + unsigned value_record_index, + hb_set_t& visited) + { + unsigned size = 0; + for (unsigned i : device_table_indices) + { + OT::Layout::GPOS_impl::Value* record = &values[value_record_index + i]; + unsigned record_position = ((char*) record) - ((char*) this); + unsigned* obj_idx; + if (!device_tables.has (record_position, &obj_idx)) continue; + size += c.graph.find_subgraph_size (*obj_idx, visited); + } + return size; + } + + unsigned size_of (gsubgpos_graph_context_t& c, + unsigned this_index, + const void* offset) const { - // TODO(garretrieger): implement me! - return hb_vector_t<unsigned> (); + const unsigned id = c.graph.index_for_offset (this_index, offset); + return c.graph.vertices_[id].table_size (); } }; diff --git a/thirdparty/harfbuzz/src/graph/split-helpers.hh b/thirdparty/harfbuzz/src/graph/split-helpers.hh new file mode 100644 index 0000000000..61fd7c2d2f --- /dev/null +++ b/thirdparty/harfbuzz/src/graph/split-helpers.hh @@ -0,0 +1,69 @@ +/* + * Copyright © 2022 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Garret Rieger + */ + +#ifndef GRAPH_SPLIT_HELPERS_HH +#define GRAPH_SPLIT_HELPERS_HH + +namespace graph { + +template<typename Context> +HB_INTERNAL +hb_vector_t<unsigned> actuate_subtable_split (Context& split_context, + const hb_vector_t<unsigned>& split_points) +{ + hb_vector_t<unsigned> new_objects; + if (!split_points) + return new_objects; + + for (unsigned i = 0; i < split_points.length; i++) + { + unsigned start = split_points[i]; + unsigned end = (i < split_points.length - 1) + ? split_points[i + 1] + : split_context.original_count (); + unsigned id = split_context.clone_range (start, end); + + if (id == (unsigned) -1) + { + new_objects.reset (); + new_objects.allocated = -1; // mark error + return new_objects; + } + new_objects.push (id); + } + + if (!split_context.shrink (split_points[0])) + { + new_objects.reset (); + new_objects.allocated = -1; // mark error + } + + return new_objects; +} + +} + +#endif // GRAPH_SPLIT_HELPERS_HH diff --git a/thirdparty/harfbuzz/src/graph/test-classdef-graph.cc b/thirdparty/harfbuzz/src/graph/test-classdef-graph.cc new file mode 100644 index 0000000000..55854ff5c2 --- /dev/null +++ b/thirdparty/harfbuzz/src/graph/test-classdef-graph.cc @@ -0,0 +1,119 @@ +/* + * Copyright © 2022 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Garret Rieger + */ + +#include "gsubgpos-context.hh" +#include "classdef-graph.hh" + +typedef hb_pair_t<hb_codepoint_t, hb_codepoint_t> gid_and_class_t; +typedef hb_vector_t<gid_and_class_t> gid_and_class_list_t; + + +static bool incremental_size_is (const gid_and_class_list_t& list, unsigned klass, + unsigned cov_expected, unsigned class_def_expected) +{ + graph::class_def_size_estimator_t estimator (list.iter ()); + + unsigned result = estimator.incremental_coverage_size (klass); + if (result != cov_expected) + { + printf ("FAIL: coverage expected size %u but was %u\n", cov_expected, result); + return false; + } + + result = estimator.incremental_class_def_size (klass); + if (result != class_def_expected) + { + printf ("FAIL: class def expected size %u but was %u\n", class_def_expected, result); + return false; + } + + return true; +} + +static void test_class_and_coverage_size_estimates () +{ + gid_and_class_list_t empty = { + }; + assert (incremental_size_is (empty, 0, 0, 0)); + assert (incremental_size_is (empty, 1, 0, 0)); + + gid_and_class_list_t class_zero = { + {5, 0}, + }; + assert (incremental_size_is (class_zero, 0, 2, 0)); + + gid_and_class_list_t consecutive = { + {4, 0}, + {5, 0}, + {6, 1}, + {7, 1}, + {8, 2}, + {9, 2}, + {10, 2}, + {11, 2}, + }; + assert (incremental_size_is (consecutive, 0, 4, 0)); + assert (incremental_size_is (consecutive, 1, 4, 4)); + assert (incremental_size_is (consecutive, 2, 8, 6)); + + gid_and_class_list_t non_consecutive = { + {4, 0}, + {5, 0}, + + {6, 1}, + {7, 1}, + + {9, 2}, + {10, 2}, + {11, 2}, + {12, 2}, + }; + assert (incremental_size_is (non_consecutive, 0, 4, 0)); + assert (incremental_size_is (non_consecutive, 1, 4, 6)); + assert (incremental_size_is (non_consecutive, 2, 8, 6)); + + gid_and_class_list_t multiple_ranges = { + {4, 0}, + {5, 0}, + + {6, 1}, + {7, 1}, + + {9, 1}, + + {11, 1}, + {12, 1}, + {13, 1}, + }; + assert (incremental_size_is (multiple_ranges, 0, 4, 0)); + assert (incremental_size_is (multiple_ranges, 1, 2 * 6, 3 * 6)); +} + +int +main (int argc, char **argv) +{ + test_class_and_coverage_size_estimates (); +} diff --git a/thirdparty/harfbuzz/src/hb-array.hh b/thirdparty/harfbuzz/src/hb-array.hh index 826a901819..5884007c19 100644 --- a/thirdparty/harfbuzz/src/hb-array.hh +++ b/thirdparty/harfbuzz/src/hb-array.hh @@ -342,7 +342,7 @@ struct hb_sorted_array_t : unsigned int i; return bfind (x, &i) ? &this->arrayZ[i] : not_found; } - template <typename T, typename ...Ts> + template <typename T> const Type *bsearch (const T &x, const Type *not_found = nullptr) const { unsigned int i; @@ -389,7 +389,7 @@ struct hb_sorted_array_t : this->length, sizeof (Type), _hb_cmp_method<T, Type, Ts...>, - ds...); + std::forward<Ts> (ds)...); } }; template <typename T> inline hb_sorted_array_t<T> diff --git a/thirdparty/harfbuzz/src/hb-atomic.hh b/thirdparty/harfbuzz/src/hb-atomic.hh index d6dfb0f57a..14c6fb3264 100644 --- a/thirdparty/harfbuzz/src/hb-atomic.hh +++ b/thirdparty/harfbuzz/src/hb-atomic.hh @@ -159,10 +159,13 @@ struct hb_atomic_int_t hb_atomic_int_t () = default; constexpr hb_atomic_int_t (int v) : v (v) {} + hb_atomic_int_t& operator = (int v_) { set_relaxed (v_); return *this; } + operator int () const { return get_relaxed (); } + void set_relaxed (int v_) { hb_atomic_int_impl_set_relaxed (&v, v_); } - void set (int v_) { hb_atomic_int_impl_set (&v, v_); } + void set_release (int v_) { hb_atomic_int_impl_set (&v, v_); } int get_relaxed () const { return hb_atomic_int_impl_get_relaxed (&v); } - int get () const { return hb_atomic_int_impl_get (&v); } + int get_acquire () const { return hb_atomic_int_impl_get (&v); } int inc () { return hb_atomic_int_impl_add (&v, 1); } int dec () { return hb_atomic_int_impl_add (&v, -1); } @@ -180,11 +183,11 @@ struct hb_atomic_ptr_t void init (T* v_ = nullptr) { set_relaxed (v_); } void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); } T *get_relaxed () const { return (T *) hb_atomic_ptr_impl_get_relaxed (&v); } - T *get () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); } + T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); } bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); } - T * operator -> () const { return get (); } - template <typename C> operator C * () const { return get (); } + T * operator -> () const { return get_acquire (); } + template <typename C> operator C * () const { return get_acquire (); } T *v = nullptr; }; diff --git a/thirdparty/harfbuzz/src/hb-bit-set.hh b/thirdparty/harfbuzz/src/hb-bit-set.hh index 4765af67ce..a63887efda 100644 --- a/thirdparty/harfbuzz/src/hb-bit-set.hh +++ b/thirdparty/harfbuzz/src/hb-bit-set.hh @@ -56,7 +56,7 @@ struct hb_bit_set_t { successful = true; population = 0; - last_page_lookup.set_relaxed (0); + last_page_lookup = 0; page_map.init (); pages.init (); } @@ -614,7 +614,7 @@ struct hb_bit_set_t const auto* page_map_array = page_map.arrayZ; unsigned int major = get_major (*codepoint); - unsigned int i = last_page_lookup.get_relaxed (); + unsigned int i = last_page_lookup; if (unlikely (i >= page_map.length || page_map_array[i].major != major)) { @@ -632,7 +632,7 @@ struct hb_bit_set_t if (pages_array[current.index].next (codepoint)) { *codepoint += current.major * page_t::PAGE_BITS; - last_page_lookup.set_relaxed (i); + last_page_lookup = i; return true; } i++; @@ -645,11 +645,11 @@ struct hb_bit_set_t if (m != INVALID) { *codepoint = current.major * page_t::PAGE_BITS + m; - last_page_lookup.set_relaxed (i); + last_page_lookup = i; return true; } } - last_page_lookup.set_relaxed (0); + last_page_lookup = 0; *codepoint = INVALID; return false; } @@ -732,7 +732,7 @@ struct hb_bit_set_t { const auto* page_map_array = page_map.arrayZ; unsigned int major = get_major (codepoint); - unsigned int i = last_page_lookup.get_relaxed (); + unsigned int i = last_page_lookup; if (unlikely (i >= page_map.length || page_map_array[i].major != major)) { page_map.bfind (major, &i, HB_NOT_FOUND_STORE_CLOSEST); @@ -773,7 +773,7 @@ struct hb_bit_set_t { const auto* page_map_array = page_map.arrayZ; unsigned int major = get_major (codepoint); - unsigned int i = last_page_lookup.get_relaxed (); + unsigned int i = last_page_lookup; if (unlikely (i >= page_map.length || page_map_array[i].major != major)) { page_map.bfind(major, &i, HB_NOT_FOUND_STORE_CLOSEST); @@ -900,7 +900,7 @@ struct hb_bit_set_t /* The extra page_map length is necessary; can't just rely on vector here, * since the next check would be tricked because a null page also has * major==0, which we can't distinguish from an actualy major==0 page... */ - unsigned i = last_page_lookup.get_relaxed (); + unsigned i = last_page_lookup; if (likely (i < page_map.length)) { auto &cached_page = page_map.arrayZ[i]; @@ -924,7 +924,7 @@ struct hb_bit_set_t page_map[i] = map; } - last_page_lookup.set_relaxed (i); + last_page_lookup = i; return &pages[page_map[i].index]; } const page_t *page_for (hb_codepoint_t g) const @@ -934,7 +934,7 @@ struct hb_bit_set_t /* The extra page_map length is necessary; can't just rely on vector here, * since the next check would be tricked because a null page also has * major==0, which we can't distinguish from an actualy major==0 page... */ - unsigned i = last_page_lookup.get_relaxed (); + unsigned i = last_page_lookup; if (likely (i < page_map.length)) { auto &cached_page = page_map.arrayZ[i]; @@ -946,7 +946,7 @@ struct hb_bit_set_t if (!page_map.bfind (key, &i)) return nullptr; - last_page_lookup.set_relaxed (i); + last_page_lookup = i; return &pages[page_map[i].index]; } page_t &page_at (unsigned int i) { return pages[page_map[i].index]; } diff --git a/thirdparty/harfbuzz/src/hb-buffer-deserialize-json.hh b/thirdparty/harfbuzz/src/hb-buffer-deserialize-json.hh index 44c802a00c..87095855d6 100644 --- a/thirdparty/harfbuzz/src/hb-buffer-deserialize-json.hh +++ b/thirdparty/harfbuzz/src/hb-buffer-deserialize-json.hh @@ -32,7 +32,7 @@ #include "hb.hh" -#line 33 "hb-buffer-deserialize-json.hh" +#line 36 "hb-buffer-deserialize-json.hh" static const unsigned char _deserialize_json_trans_keys[] = { 0u, 0u, 9u, 123u, 9u, 34u, 97u, 117u, 120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, @@ -557,12 +557,12 @@ _hb_buffer_deserialize_json (hb_buffer_t *buffer, hb_glyph_info_t info = {0}; hb_glyph_position_t pos = {0}; -#line 554 "hb-buffer-deserialize-json.hh" +#line 561 "hb-buffer-deserialize-json.hh" { cs = deserialize_json_start; } -#line 557 "hb-buffer-deserialize-json.hh" +#line 566 "hb-buffer-deserialize-json.hh" { int _slen; int _trans; @@ -774,7 +774,7 @@ _resume: *end_ptr = p; } break; -#line 735 "hb-buffer-deserialize-json.hh" +#line 778 "hb-buffer-deserialize-json.hh" } _again: diff --git a/thirdparty/harfbuzz/src/hb-buffer-deserialize-text.hh b/thirdparty/harfbuzz/src/hb-buffer-deserialize-text.hh index 8fbcdcc18c..9062610de2 100644 --- a/thirdparty/harfbuzz/src/hb-buffer-deserialize-text.hh +++ b/thirdparty/harfbuzz/src/hb-buffer-deserialize-text.hh @@ -32,7 +32,7 @@ #include "hb.hh" -#line 33 "hb-buffer-deserialize-text.hh" +#line 36 "hb-buffer-deserialize-text.hh" static const unsigned char _deserialize_text_trans_keys[] = { 0u, 0u, 9u, 91u, 85u, 85u, 43u, 43u, 48u, 102u, 9u, 85u, 48u, 57u, 45u, 57u, 48u, 57u, 48u, 57u, 48u, 57u, 45u, 57u, 48u, 57u, 44u, 44u, 45u, 57u, 48u, 57u, @@ -509,12 +509,12 @@ _hb_buffer_deserialize_text (hb_buffer_t *buffer, hb_glyph_info_t info = {0}; hb_glyph_position_t pos = {0}; -#line 506 "hb-buffer-deserialize-text.hh" +#line 513 "hb-buffer-deserialize-text.hh" { cs = deserialize_text_start; } -#line 509 "hb-buffer-deserialize-text.hh" +#line 518 "hb-buffer-deserialize-text.hh" { int _slen; int _trans; @@ -894,7 +894,7 @@ _resume: *end_ptr = p; } break; -#line 826 "hb-buffer-deserialize-text.hh" +#line 898 "hb-buffer-deserialize-text.hh" } _again: @@ -1043,7 +1043,7 @@ _again: *end_ptr = p; } break; -#line 953 "hb-buffer-deserialize-text.hh" +#line 1047 "hb-buffer-deserialize-text.hh" } } diff --git a/thirdparty/harfbuzz/src/hb-buffer.h b/thirdparty/harfbuzz/src/hb-buffer.h index c6af759fb9..8c17489835 100644 --- a/thirdparty/harfbuzz/src/hb-buffer.h +++ b/thirdparty/harfbuzz/src/hb-buffer.h @@ -145,7 +145,7 @@ typedef struct hb_glyph_info_t { * @HB_GLYPH_FLAG_SAFE_TO_INSERT_TATWEEL: In scripts that use elongation (Arabic, Mongolian, Syriac, etc.), this flag signifies that it is safe to insert a U+0640 TATWEEL - character *before* this cluster for elongation. + character before this cluster for elongation. This flag does not determine the script-specific elongation places, but only when it is safe to do the elongation without diff --git a/thirdparty/harfbuzz/src/hb-cache.hh b/thirdparty/harfbuzz/src/hb-cache.hh index d6b229ed65..897f313fbd 100644 --- a/thirdparty/harfbuzz/src/hb-cache.hh +++ b/thirdparty/harfbuzz/src/hb-cache.hh @@ -32,12 +32,21 @@ /* Implements a lockfree cache for int->int functions. */ -template <unsigned int key_bits=16, unsigned int value_bits=8 + 32 - key_bits, unsigned int cache_bits=8> +template <unsigned int key_bits=16, + unsigned int value_bits=8 + 32 - key_bits, + unsigned int cache_bits=8, + bool thread_safe=true> struct hb_cache_t { + using item_t = typename std::conditional<thread_safe, + hb_atomic_int_t, + typename std::conditional<key_bits + value_bits - cache_bits <= 16, + short, + int>::type + >::type; + static_assert ((key_bits >= cache_bits), ""); - static_assert ((key_bits + value_bits - cache_bits <= 8 * sizeof (hb_atomic_int_t)), ""); - static_assert (sizeof (hb_atomic_int_t) == sizeof (unsigned int), ""); + static_assert ((key_bits + value_bits - cache_bits <= 8 * sizeof (item_t)), ""); void init () { clear (); } void fini () {} @@ -45,14 +54,14 @@ struct hb_cache_t void clear () { for (unsigned i = 0; i < ARRAY_LENGTH (values); i++) - values[i].set_relaxed (-1); + values[i] = -1; } bool get (unsigned int key, unsigned int *value) const { unsigned int k = key & ((1u<<cache_bits)-1); - unsigned int v = values[k].get_relaxed (); - if ((key_bits + value_bits - cache_bits == 8 * sizeof (hb_atomic_int_t) && v == (unsigned int) -1) || + unsigned int v = values[k]; + if ((key_bits + value_bits - cache_bits == 8 * sizeof (item_t) && v == (unsigned int) -1) || (v >> value_bits) != (key >> cache_bits)) return false; *value = v & ((1u<<value_bits)-1); @@ -65,16 +74,13 @@ struct hb_cache_t return false; /* Overflows */ unsigned int k = key & ((1u<<cache_bits)-1); unsigned int v = ((key>>cache_bits)<<value_bits) | value; - values[k].set_relaxed (v); + values[k] = v; return true; } private: - hb_atomic_int_t values[1u<<cache_bits]; + item_t values[1u<<cache_bits]; }; -typedef hb_cache_t<21, 16, 8> hb_cmap_cache_t; -typedef hb_cache_t<16, 24, 8> hb_advance_cache_t; - #endif /* HB_CACHE_HH */ diff --git a/thirdparty/harfbuzz/src/hb-common.cc b/thirdparty/harfbuzz/src/hb-common.cc index e6512872e8..bbb6cd552b 100644 --- a/thirdparty/harfbuzz/src/hb-common.cc +++ b/thirdparty/harfbuzz/src/hb-common.cc @@ -99,7 +99,7 @@ _hb_options_init () } /* This is idempotent and threadsafe. */ - _hb_options.set_relaxed (u.i); + _hb_options = u.i; } diff --git a/thirdparty/harfbuzz/src/hb-common.h b/thirdparty/harfbuzz/src/hb-common.h index 7c7ad87c7c..e92feb9898 100644 --- a/thirdparty/harfbuzz/src/hb-common.h +++ b/thirdparty/harfbuzz/src/hb-common.h @@ -495,6 +495,8 @@ hb_language_matches (hb_language_t language, * @HB_SCRIPT_TOTO: `Toto`, Since: 3.0.0 * @HB_SCRIPT_VITHKUQI: `Vith`, Since: 3.0.0 * @HB_SCRIPT_MATH: `Zmth`, Since: 3.4.0 + * @HB_SCRIPT_KAWI: `Kawi`, Since: 5.2.0 + * @HB_SCRIPT_NAG_MUNDARI: `Nagm`, Since: 5.2.0 * @HB_SCRIPT_INVALID: No script set * * Data type for scripts. Each #hb_script_t's value is an #hb_tag_t corresponding @@ -716,6 +718,12 @@ typedef enum */ HB_SCRIPT_MATH = HB_TAG ('Z','m','t','h'), + /* + * Since 5.2.0 + */ + HB_SCRIPT_KAWI = HB_TAG ('K','a','w','i'), /*15.0*/ + HB_SCRIPT_NAG_MUNDARI = HB_TAG ('N','a','g','m'), /*15.0*/ + /* No script set. */ HB_SCRIPT_INVALID = HB_TAG_NONE, diff --git a/thirdparty/harfbuzz/src/hb-config.hh b/thirdparty/harfbuzz/src/hb-config.hh index db8ec0e908..5567ddaec3 100644 --- a/thirdparty/harfbuzz/src/hb-config.hh +++ b/thirdparty/harfbuzz/src/hb-config.hh @@ -35,6 +35,9 @@ #include "config.h" #endif +#ifndef HB_BORING_EXPANSION +#define HB_NO_BORING_EXPANSION +#endif #ifdef HB_TINY #define HB_LEAN diff --git a/thirdparty/harfbuzz/src/hb-debug.hh b/thirdparty/harfbuzz/src/hb-debug.hh index 905a46a087..cbe13e5214 100644 --- a/thirdparty/harfbuzz/src/hb-debug.hh +++ b/thirdparty/harfbuzz/src/hb-debug.hh @@ -67,12 +67,12 @@ hb_options () #endif /* Make a local copy, so we can access bitfield threadsafely. */ hb_options_union_t u; - u.i = _hb_options.get_relaxed (); + u.i = _hb_options; if (unlikely (!u.i)) { _hb_options_init (); - u.i = _hb_options.get_relaxed (); + u.i = _hb_options; } return u.opts; diff --git a/thirdparty/harfbuzz/src/hb-face.cc b/thirdparty/harfbuzz/src/hb-face.cc index 61adbdd503..2160d6a010 100644 --- a/thirdparty/harfbuzz/src/hb-face.cc +++ b/thirdparty/harfbuzz/src/hb-face.cc @@ -132,7 +132,7 @@ hb_face_create_for_tables (hb_reference_table_func_t reference_table_func, face->user_data = user_data; face->destroy = destroy; - face->num_glyphs.set_relaxed (-1); + face->num_glyphs = -1; face->data.init0 (face); face->table.init0 (face); @@ -479,7 +479,7 @@ hb_face_set_upem (hb_face_t *face, if (hb_object_is_immutable (face)) return; - face->upem.set_relaxed (upem); + face->upem = upem; } /** @@ -514,7 +514,7 @@ hb_face_set_glyph_count (hb_face_t *face, if (hb_object_is_immutable (face)) return; - face->num_glyphs.set_relaxed (glyph_count); + face->num_glyphs = glyph_count; } /** diff --git a/thirdparty/harfbuzz/src/hb-face.hh b/thirdparty/harfbuzz/src/hb-face.hh index 765f272858..12e10d01e0 100644 --- a/thirdparty/harfbuzz/src/hb-face.hh +++ b/thirdparty/harfbuzz/src/hb-face.hh @@ -83,7 +83,7 @@ struct hb_face_t unsigned int get_upem () const { - unsigned int ret = upem.get_relaxed (); + unsigned int ret = upem; if (unlikely (!ret)) { return load_upem (); @@ -93,7 +93,7 @@ struct hb_face_t unsigned int get_num_glyphs () const { - unsigned int ret = num_glyphs.get_relaxed (); + unsigned int ret = num_glyphs; if (unlikely (ret == UINT_MAX)) return load_num_glyphs (); return ret; diff --git a/thirdparty/harfbuzz/src/hb-ft.cc b/thirdparty/harfbuzz/src/hb-ft.cc index ef073475cb..bcc1dd080f 100644 --- a/thirdparty/harfbuzz/src/hb-ft.cc +++ b/thirdparty/harfbuzz/src/hb-ft.cc @@ -80,16 +80,19 @@ */ +using hb_ft_advance_cache_t = hb_cache_t<16, 24, 8, false>; + struct hb_ft_font_t { int load_flags; bool symbol; /* Whether selected cmap is symbol cmap. */ bool unref; /* Whether to destroy ft_face when done. */ + bool transform; /* Whether to apply FT_Face's transform. */ mutable hb_mutex_t lock; FT_Face ft_face; mutable unsigned cached_serial; - mutable hb_advance_cache_t advance_cache; + mutable hb_ft_advance_cache_t advance_cache; }; static hb_ft_font_t * @@ -136,6 +139,8 @@ _hb_ft_font_destroy (void *data) /* hb_font changed, update FT_Face. */ static void _hb_ft_hb_font_changed (hb_font_t *font, FT_Face ft_face) { + hb_ft_font_t *ft_font = (hb_ft_font_t *) font->user_data; + float x_mult = 1.f, y_mult = 1.f; if (font->x_scale < 0) x_mult = -x_mult; @@ -173,6 +178,7 @@ static void _hb_ft_hb_font_changed (hb_font_t *font, FT_Face ft_face) FT_Matrix matrix = { (int) roundf (x_mult * (1<<16)), 0, 0, (int) roundf (y_mult * (1<<16))}; FT_Set_Transform (ft_face, &matrix, nullptr); + ft_font->transform = true; } #if defined(HAVE_FT_GET_VAR_BLEND_COORDINATES) && !defined(HB_NO_VAR) @@ -428,13 +434,19 @@ hb_ft_get_glyph_h_advances (hb_font_t* font, void* font_data, hb_lock_t lock (ft_font->lock); FT_Face ft_face = ft_font->ft_face; int load_flags = ft_font->load_flags; + float x_mult; #ifdef HAVE_FT_GET_TRANSFORM - FT_Matrix matrix; - FT_Get_Transform (ft_face, &matrix, nullptr); - float mult = matrix.xx / 65536.f; -#else - float mult = font->x_scale < 0 ? -1 : +1; + if (ft_font->transform) + { + FT_Matrix matrix; + FT_Get_Transform (ft_face, &matrix, nullptr); + x_mult = sqrtf ((float)matrix.xx * matrix.xx + (float)matrix.xy * matrix.xy) / 65536.f; + } + else #endif + { + x_mult = font->x_scale < 0 ? -1 : +1; + } for (unsigned int i = 0; i < count; i++) { @@ -450,7 +462,7 @@ hb_ft_get_glyph_h_advances (hb_font_t* font, void* font_data, ft_font->advance_cache.set (glyph, v); } - *first_advance = (int) (v * mult + (1<<9)) >> 10; + *first_advance = (int) (v * x_mult + (1<<9)) >> 10; first_glyph = &StructAtOffsetUnaligned<hb_codepoint_t> (first_glyph, glyph_stride); first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride); } @@ -466,13 +478,19 @@ hb_ft_get_glyph_v_advance (hb_font_t *font, const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data; hb_lock_t lock (ft_font->lock); FT_Fixed v; + float y_mult; #ifdef HAVE_FT_GET_TRANSFORM - FT_Matrix matrix; - FT_Get_Transform (ft_font->ft_face, &matrix, nullptr); - float y_mult = matrix.yy / 65536.f; -#else - float y_mult = font->y_scale < 0 ? -1 : +1; + if (ft_font->transform) + { + FT_Matrix matrix; + FT_Get_Transform (ft_font->ft_face, &matrix, nullptr); + y_mult = sqrtf ((float)matrix.yx * matrix.yx + (float)matrix.yy * matrix.yy) / 65536.f; + } + else #endif + { + y_mult = font->y_scale < 0 ? -1 : +1; + } if (unlikely (FT_Get_Advance (ft_font->ft_face, glyph, ft_font->load_flags | FT_LOAD_VERTICAL_LAYOUT, &v))) return 0; @@ -498,15 +516,21 @@ hb_ft_get_glyph_v_origin (hb_font_t *font, const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data; hb_lock_t lock (ft_font->lock); FT_Face ft_face = ft_font->ft_face; + float x_mult, y_mult; #ifdef HAVE_FT_GET_TRANSFORM - FT_Matrix matrix; - FT_Get_Transform (ft_face, &matrix, nullptr); - float x_mult = matrix.xx / 65536.f; - float y_mult = matrix.yy / 65536.f; -#else - float x_mult = font->x_scale < 0 ? -1 : +1; - float y_mult = font->y_scale < 0 ? -1 : +1; + if (ft_font->transform) + { + FT_Matrix matrix; + FT_Get_Transform (ft_face, &matrix, nullptr); + x_mult = sqrtf ((float)matrix.xx * matrix.xx + (float)matrix.xy * matrix.xy) / 65536.f; + y_mult = sqrtf ((float)matrix.yx * matrix.yx + (float)matrix.yy * matrix.yy) / 65536.f; + } + else #endif + { + x_mult = font->x_scale < 0 ? -1 : +1; + y_mult = font->y_scale < 0 ? -1 : +1; + } if (unlikely (FT_Load_Glyph (ft_face, glyph, ft_font->load_flags))) return false; @@ -553,15 +577,21 @@ hb_ft_get_glyph_extents (hb_font_t *font, const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data; hb_lock_t lock (ft_font->lock); FT_Face ft_face = ft_font->ft_face; + float x_mult, y_mult; #ifdef HAVE_FT_GET_TRANSFORM - FT_Matrix matrix; - FT_Get_Transform (ft_face, &matrix, nullptr); - float x_mult = matrix.xx / 65536.f; - float y_mult = matrix.yy / 65536.f; -#else - float x_mult = font->x_scale < 0 ? -1 : +1; - float y_mult = font->y_scale < 0 ? -1 : +1; + if (ft_font->transform) + { + FT_Matrix matrix; + FT_Get_Transform (ft_face, &matrix, nullptr); + x_mult = sqrtf ((float)matrix.xx * matrix.xx + (float)matrix.xy * matrix.xy) / 65536.f; + y_mult = sqrtf ((float)matrix.yx * matrix.yx + (float)matrix.yy * matrix.yy) / 65536.f; + } + else #endif + { + x_mult = font->x_scale < 0 ? -1 : +1; + y_mult = font->y_scale < 0 ? -1 : +1; + } if (unlikely (FT_Load_Glyph (ft_face, glyph, ft_font->load_flags))) return false; @@ -663,13 +693,19 @@ hb_ft_get_font_h_extents (hb_font_t *font HB_UNUSED, const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data; hb_lock_t lock (ft_font->lock); FT_Face ft_face = ft_font->ft_face; + float y_mult; #ifdef HAVE_FT_GET_TRANSFORM - FT_Matrix matrix; - FT_Get_Transform (ft_face, &matrix, nullptr); - float y_mult = matrix.yy / 65536.f; -#else - float y_mult = font->y_scale < 0 ? -1 : +1; + if (ft_font->transform) + { + FT_Matrix matrix; + FT_Get_Transform (ft_face, &matrix, nullptr); + y_mult = sqrtf ((float)matrix.yx * matrix.yx + (float)matrix.yy * matrix.yy) / 65536.f; + } + else #endif + { + y_mult = font->y_scale < 0 ? -1 : +1; + } if (ft_face->units_per_EM != 0) { @@ -1233,13 +1269,14 @@ hb_ft_font_set_funcs (hb_font_t *font) if (FT_Select_Charmap (ft_face, FT_ENCODING_MS_SYMBOL)) FT_Select_Charmap (ft_face, FT_ENCODING_UNICODE); - _hb_ft_hb_font_changed (font, ft_face); ft_face->generic.data = blob; ft_face->generic.finalizer = (FT_Generic_Finalizer) _release_blob; _hb_ft_font_set_funcs (font, ft_face, true); hb_ft_font_set_load_flags (font, FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING); + + _hb_ft_hb_font_changed (font, ft_face); } diff --git a/thirdparty/harfbuzz/src/hb-machinery.hh b/thirdparty/harfbuzz/src/hb-machinery.hh index ff2a99f5ed..2571f22e15 100644 --- a/thirdparty/harfbuzz/src/hb-machinery.hh +++ b/thirdparty/harfbuzz/src/hb-machinery.hh @@ -176,12 +176,12 @@ struct hb_lazy_loader_t : hb_data_wrapper_t<Data, WheresData> void init0 () {} /* Init, when memory is already set to 0. No-op for us. */ void init () { instance.set_relaxed (nullptr); } - void fini () { do_destroy (instance.get ()); init (); } + void fini () { do_destroy (instance.get_acquire ()); init (); } void free_instance () { retry: - Stored *p = instance.get (); + Stored *p = instance.get_acquire (); if (unlikely (p && !cmpexch (p, nullptr))) goto retry; do_destroy (p); @@ -203,7 +203,7 @@ struct hb_lazy_loader_t : hb_data_wrapper_t<Data, WheresData> Stored * get_stored () const { retry: - Stored *p = this->instance.get (); + Stored *p = this->instance.get_acquire (); if (unlikely (!p)) { if (unlikely (this->is_inert ())) diff --git a/thirdparty/harfbuzz/src/hb-object.hh b/thirdparty/harfbuzz/src/hb-object.hh index f6c7a56991..9876c2923c 100644 --- a/thirdparty/harfbuzz/src/hb-object.hh +++ b/thirdparty/harfbuzz/src/hb-object.hh @@ -144,14 +144,14 @@ struct hb_reference_count_t { mutable hb_atomic_int_t ref_count; - void init (int v = 1) { ref_count.set_relaxed (v); } - int get_relaxed () const { return ref_count.get_relaxed (); } + void init (int v = 1) { ref_count = v; } + int get_relaxed () const { return ref_count; } int inc () const { return ref_count.inc (); } int dec () const { return ref_count.dec (); } - void fini () { ref_count.set_relaxed (-0x0000DEAD); } + void fini () { ref_count = -0x0000DEAD; } - bool is_inert () const { return !ref_count.get_relaxed (); } - bool is_valid () const { return ref_count.get_relaxed () > 0; } + bool is_inert () const { return !ref_count; } + bool is_valid () const { return ref_count > 0; } }; @@ -214,15 +214,15 @@ static inline void hb_object_trace (const Type *obj, const char *function) obj ? obj->header.ref_count.get_relaxed () : 0); } -template <typename Type> -static inline Type *hb_object_create () +template <typename Type, typename ...Ts> +static inline Type *hb_object_create (Ts... ds) { Type *obj = (Type *) hb_calloc (1, sizeof (Type)); if (unlikely (!obj)) return obj; - new (obj) Type; + new (obj) Type (std::forward<Ts> (ds)...); hb_object_init (obj); hb_object_trace (obj, HB_FUNC); @@ -233,7 +233,7 @@ template <typename Type> static inline void hb_object_init (Type *obj) { obj->header.ref_count.init (); - obj->header.writable.set_relaxed (true); + obj->header.writable = true; obj->header.user_data.init (); } template <typename Type> @@ -244,12 +244,12 @@ static inline bool hb_object_is_valid (const Type *obj) template <typename Type> static inline bool hb_object_is_immutable (const Type *obj) { - return !obj->header.writable.get_relaxed (); + return !obj->header.writable; } template <typename Type> static inline void hb_object_make_immutable (const Type *obj) { - obj->header.writable.set_relaxed (false); + obj->header.writable = false; } template <typename Type> static inline Type *hb_object_reference (Type *obj) @@ -273,7 +273,8 @@ static inline bool hb_object_destroy (Type *obj) hb_object_fini (obj); - obj->~Type (); + if (!std::is_trivially_destructible<Type>::value) + obj->~Type (); return true; } @@ -281,7 +282,7 @@ template <typename Type> static inline void hb_object_fini (Type *obj) { obj->header.ref_count.fini (); /* Do this before user_data */ - hb_user_data_array_t *user_data = obj->header.user_data.get (); + hb_user_data_array_t *user_data = obj->header.user_data.get_acquire (); if (user_data) { user_data->fini (); @@ -301,7 +302,7 @@ static inline bool hb_object_set_user_data (Type *obj, assert (hb_object_is_valid (obj)); retry: - hb_user_data_array_t *user_data = obj->header.user_data.get (); + hb_user_data_array_t *user_data = obj->header.user_data.get_acquire (); if (unlikely (!user_data)) { user_data = (hb_user_data_array_t *) hb_calloc (sizeof (hb_user_data_array_t), 1); @@ -326,7 +327,7 @@ static inline void *hb_object_get_user_data (Type *obj, if (unlikely (!obj || obj->header.is_inert ())) return nullptr; assert (hb_object_is_valid (obj)); - hb_user_data_array_t *user_data = obj->header.user_data.get (); + hb_user_data_array_t *user_data = obj->header.user_data.get_acquire (); if (!user_data) return nullptr; return user_data->get (key); diff --git a/thirdparty/harfbuzz/src/hb-ot-cff1-table.hh b/thirdparty/harfbuzz/src/hb-ot-cff1-table.hh index 4aa337f78b..17b0296616 100644 --- a/thirdparty/harfbuzz/src/hb-ot-cff1-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-cff1-table.hh @@ -1379,7 +1379,7 @@ struct cff1 if (unlikely (!len)) return false; retry: - hb_sorted_vector_t<gname_t> *names = glyph_names.get (); + hb_sorted_vector_t<gname_t> *names = glyph_names.get_acquire (); if (unlikely (!names)) { names = (hb_sorted_vector_t<gname_t> *) hb_calloc (sizeof (hb_sorted_vector_t<gname_t>), 1); diff --git a/thirdparty/harfbuzz/src/hb-ot-font.cc b/thirdparty/harfbuzz/src/hb-ot-font.cc index 3f13b9994a..c90a65665c 100644 --- a/thirdparty/harfbuzz/src/hb-ot-font.cc +++ b/thirdparty/harfbuzz/src/hb-ot-font.cc @@ -59,13 +59,15 @@ * never need to call these functions directly. **/ +using hb_ot_font_advance_cache_t = hb_cache_t<24, 16, 8, true>; + struct hb_ot_font_t { const hb_ot_face_t *ot_face; /* h_advance caching */ mutable hb_atomic_int_t cached_coords_serial; - mutable hb_atomic_ptr_t<hb_advance_cache_t> advance_cache; + mutable hb_atomic_ptr_t<hb_ot_font_advance_cache_t> advance_cache; }; static hb_ot_font_t * @@ -161,14 +163,14 @@ hb_ot_get_glyph_h_advances (hb_font_t* font, void* font_data, bool use_cache = false; #endif - hb_advance_cache_t *cache = nullptr; + hb_ot_font_advance_cache_t *cache = nullptr; if (use_cache) { retry: - cache = ot_font->advance_cache.get (); + cache = ot_font->advance_cache.get_acquire (); if (unlikely (!cache)) { - cache = (hb_advance_cache_t *) hb_malloc (sizeof (hb_advance_cache_t)); + cache = (hb_ot_font_advance_cache_t *) hb_malloc (sizeof (hb_ot_font_advance_cache_t)); if (unlikely (!cache)) { use_cache = false; @@ -181,7 +183,7 @@ hb_ot_get_glyph_h_advances (hb_font_t* font, void* font_data, hb_free (cache); goto retry; } - ot_font->cached_coords_serial.set (font->serial_coords); + ot_font->cached_coords_serial.set_release (font->serial_coords); } } out: @@ -197,10 +199,10 @@ hb_ot_get_glyph_h_advances (hb_font_t* font, void* font_data, } else { /* Use cache. */ - if (ot_font->cached_coords_serial.get () != (int) font->serial_coords) + if (ot_font->cached_coords_serial.get_acquire () != (int) font->serial_coords) { ot_font->advance_cache->init (); - ot_font->cached_coords_serial.set (font->serial_coords); + ot_font->cached_coords_serial.set_release (font->serial_coords); } for (unsigned int i = 0; i < count; i++) diff --git a/thirdparty/harfbuzz/src/hb-ot-hmtx-table.hh b/thirdparty/harfbuzz/src/hb-ot-hmtx-table.hh index 50e4b54fde..96a394ba42 100644 --- a/thirdparty/harfbuzz/src/hb-ot-hmtx-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-hmtx-table.hh @@ -73,6 +73,8 @@ struct hmtxvmtx return_trace (true); } + const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>>* get_mtx_map (const hb_subset_plan_t *plan) const + { return T::is_horizontal ? plan->hmtx_map : plan->vmtx_map; } bool subset_update_header (hb_subset_plan_t *plan, unsigned int num_hmetrics) const @@ -130,14 +132,15 @@ struct hmtxvmtx accelerator_t _mtx (c->plan->source); unsigned num_long_metrics; + const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *mtx_map = get_mtx_map (c->plan); { /* Determine num_long_metrics to encode. */ auto& plan = c->plan; + num_long_metrics = plan->num_output_glyphs (); - hb_codepoint_t old_gid = 0; - unsigned int last_advance = plan->old_gid_for_new_gid (num_long_metrics - 1, &old_gid) ? _mtx.get_advance_without_var_unscaled (old_gid) : 0; + unsigned int last_advance = get_new_gid_advance_unscaled (plan, mtx_map, num_long_metrics - 1, _mtx); while (num_long_metrics > 1 && - last_advance == (plan->old_gid_for_new_gid (num_long_metrics - 2, &old_gid) ? _mtx.get_advance_without_var_unscaled (old_gid) : 0)) + last_advance == get_new_gid_advance_unscaled (plan, mtx_map, num_long_metrics - 2, _mtx)) { num_long_metrics--; } @@ -145,14 +148,18 @@ struct hmtxvmtx auto it = + hb_range (c->plan->num_output_glyphs ()) - | hb_map ([c, &_mtx] (unsigned _) + | hb_map ([c, &_mtx, mtx_map] (unsigned _) { - hb_codepoint_t old_gid; - if (!c->plan->old_gid_for_new_gid (_, &old_gid)) - return hb_pair (0u, 0); - int lsb = 0; - (void) _mtx.get_leading_bearing_without_var_unscaled (old_gid, &lsb); - return hb_pair (_mtx.get_advance_without_var_unscaled (old_gid), +lsb); + if (!mtx_map->has (_)) + { + hb_codepoint_t old_gid; + if (!c->plan->old_gid_for_new_gid (_, &old_gid)) + return hb_pair (0u, 0); + int lsb = 0; + (void) _mtx.get_leading_bearing_without_var_unscaled (old_gid, &lsb); + return hb_pair (_mtx.get_advance_without_var_unscaled (old_gid), +lsb); + } + return mtx_map->get (_); }) ; @@ -330,6 +337,24 @@ struct hmtxvmtx hb_blob_ptr_t<V> var_table; }; + /* get advance: when no variations, call get_advance_without_var_unscaled. + * when there're variations, get advance value from mtx_map in subset_plan*/ + unsigned get_new_gid_advance_unscaled (const hb_subset_plan_t *plan, + const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *mtx_map, + unsigned new_gid, + const accelerator_t &_mtx) const + { + if (mtx_map->is_empty () || + (new_gid == 0 && !mtx_map->has (new_gid))) + { + hb_codepoint_t old_gid = 0; + return plan->old_gid_for_new_gid (new_gid, &old_gid) ? + _mtx.get_advance_without_var_unscaled (old_gid) : 0; + } + else + { return mtx_map->get (new_gid).first; } + } + protected: UnsizedArrayOf<LongMetric> longMetricZ; /* Paired advance width and leading diff --git a/thirdparty/harfbuzz/src/hb-ot-layout-common.hh b/thirdparty/harfbuzz/src/hb-ot-layout-common.hh index 0532039aad..05916a252c 100644 --- a/thirdparty/harfbuzz/src/hb-ot-layout-common.hh +++ b/thirdparty/harfbuzz/src/hb-ot-layout-common.hh @@ -84,10 +84,10 @@ using OT::Layout::MediumTypes; namespace OT { template<typename Iterator> -static inline void ClassDef_serialize (hb_serialize_context_t *c, +static inline bool ClassDef_serialize (hb_serialize_context_t *c, Iterator it); -static void ClassDef_remap_and_serialize ( +static bool ClassDef_remap_and_serialize ( hb_serialize_context_t *c, const hb_set_t &klasses, bool use_class_zero, @@ -186,6 +186,7 @@ struct hb_subset_layout_context_t : unsigned lookup_index_count; }; +struct VariationStore; struct hb_collect_variation_indices_context_t : hb_dispatch_context_t<hb_collect_variation_indices_context_t> { @@ -194,15 +195,27 @@ struct hb_collect_variation_indices_context_t : static return_t default_return_value () { return hb_empty_t (); } hb_set_t *layout_variation_indices; + hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *varidx_delta_map; + hb_font_t *font; + const VariationStore *var_store; const hb_set_t *glyph_set; const hb_map_t *gpos_lookups; + float *store_cache; hb_collect_variation_indices_context_t (hb_set_t *layout_variation_indices_, + hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *varidx_delta_map_, + hb_font_t *font_, + const VariationStore *var_store_, const hb_set_t *glyph_set_, - const hb_map_t *gpos_lookups_) : + const hb_map_t *gpos_lookups_, + float *store_cache_) : layout_variation_indices (layout_variation_indices_), + varidx_delta_map (varidx_delta_map_), + font (font_), + var_store (var_store_), glyph_set (glyph_set_), - gpos_lookups (gpos_lookups_) {} + gpos_lookups (gpos_lookups_), + store_cache (store_cache_) {} }; template<typename OutputArray> @@ -1380,17 +1393,14 @@ struct LookupOffsetList : List16OfOffsetTo<TLookup, OffsetType> */ -static void ClassDef_remap_and_serialize (hb_serialize_context_t *c, +static bool ClassDef_remap_and_serialize (hb_serialize_context_t *c, const hb_set_t &klasses, bool use_class_zero, hb_sorted_vector_t<hb_pair_t<hb_codepoint_t, hb_codepoint_t>> &glyph_and_klass, /* IN/OUT */ hb_map_t *klass_map /*IN/OUT*/) { if (!klass_map) - { - ClassDef_serialize (c, glyph_and_klass.iter ()); - return; - } + return ClassDef_serialize (c, glyph_and_klass.iter ()); /* any glyph not assigned a class value falls into Class zero (0), * if any glyph assigned to class 0, remapping must start with 0->0*/ @@ -1413,7 +1423,7 @@ static void ClassDef_remap_and_serialize (hb_serialize_context_t *c, } c->propagate_error (glyph_and_klass, klasses); - ClassDef_serialize (c, glyph_and_klass.iter ()); + return ClassDef_serialize (c, glyph_and_klass.iter ()); } /* @@ -1495,11 +1505,12 @@ struct ClassDefFormat1_3 ? hb_len (hb_iter (glyph_map.keys()) | hb_filter (glyph_filter)) : glyph_map.get_population (); use_class_zero = use_class_zero && glyph_count <= glyph_and_klass.length; - ClassDef_remap_and_serialize (c->serializer, - orig_klasses, - use_class_zero, - glyph_and_klass, - klass_map); + if (!ClassDef_remap_and_serialize (c->serializer, + orig_klasses, + use_class_zero, + glyph_and_klass, + klass_map)) + return_trace (false); return_trace (keep_empty_table || (bool) glyph_and_klass); } @@ -1736,11 +1747,12 @@ struct ClassDefFormat2_4 ? hb_len (hb_iter (glyphset) | hb_filter (glyph_filter)) : glyph_map.get_population (); use_class_zero = use_class_zero && glyph_count <= glyph_and_klass.length; - ClassDef_remap_and_serialize (c->serializer, - orig_klasses, - use_class_zero, - glyph_and_klass, - klass_map); + if (!ClassDef_remap_and_serialize (c->serializer, + orig_klasses, + use_class_zero, + glyph_and_klass, + klass_map)) + return_trace (false); return_trace (keep_empty_table || (bool) glyph_and_klass); } @@ -2124,9 +2136,9 @@ struct ClassDef }; template<typename Iterator> -static inline void ClassDef_serialize (hb_serialize_context_t *c, +static inline bool ClassDef_serialize (hb_serialize_context_t *c, Iterator it) -{ c->start_embed<ClassDef> ()->serialize (c, it); } +{ return (c->start_embed<ClassDef> ()->serialize (c, it)); } /* @@ -2280,16 +2292,16 @@ struct VarData unsigned int count = regionIndices.len; bool is_long = longWords (); unsigned word_count = wordCount (); - unsigned int scount = is_long ? count - word_count : word_count; + unsigned int scount = is_long ? count : word_count; unsigned int lcount = is_long ? word_count : 0; const HBUINT8 *bytes = get_delta_bytes (); - const HBUINT8 *row = bytes + inner * (scount + count); + const HBUINT8 *row = bytes + inner * get_row_size (); float delta = 0.; unsigned int i = 0; - const HBINT16 *lcursor = reinterpret_cast<const HBINT16 *> (row); + const HBINT32 *lcursor = reinterpret_cast<const HBINT32 *> (row); for (; i < lcount; i++) { float scalar = regions.evaluate (regionIndices.arrayZ[i], coords, coord_count, cache); @@ -2563,7 +2575,7 @@ struct VariationStore bool serialize (hb_serialize_context_t *c, const VariationStore *src, - const hb_array_t <hb_inc_bimap_t> &inner_maps) + const hb_array_t <const hb_inc_bimap_t> &inner_maps) { TRACE_SERIALIZE (this); #ifdef HB_NO_VAR @@ -2618,7 +2630,7 @@ struct VariationStore return_trace (true); } - bool subset (hb_subset_context_t *c) const + bool subset (hb_subset_context_t *c, const hb_array_t<const hb_inc_bimap_t> &inner_maps) const { TRACE_SUBSET (this); #ifdef HB_NO_VAR @@ -2628,22 +2640,7 @@ struct VariationStore VariationStore *varstore_prime = c->serializer->start_embed<VariationStore> (); if (unlikely (!varstore_prime)) return_trace (false); - const hb_set_t *variation_indices = c->plan->layout_variation_indices; - if (variation_indices->is_empty ()) return_trace (false); - - hb_vector_t<hb_inc_bimap_t> inner_maps; - inner_maps.resize ((unsigned) dataSets.len); - - for (unsigned idx : c->plan->layout_variation_indices->iter ()) - { - uint16_t major = idx >> 16; - uint16_t minor = idx & 0xFFFF; - - if (major >= inner_maps.length) - return_trace (false); - inner_maps[major].add (minor); - } - varstore_prime->serialize (c->serializer, this, inner_maps.as_array ()); + varstore_prime->serialize (c->serializer, this, inner_maps); return_trace ( !c->serializer->in_error() @@ -3169,28 +3166,36 @@ struct VariationDevice VariationStore::cache_t *store_cache = nullptr) const { return font->em_scalef_y (get_delta (font, store, store_cache)); } - VariationDevice* copy (hb_serialize_context_t *c, const hb_map_t *layout_variation_idx_map) const + VariationDevice* copy (hb_serialize_context_t *c, + const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map) const { TRACE_SERIALIZE (this); + if (!layout_variation_idx_delta_map) return_trace (nullptr); auto snap = c->snapshot (); auto *out = c->embed (this); if (unlikely (!out)) return_trace (nullptr); - if (!layout_variation_idx_map || layout_variation_idx_map->is_empty ()) return_trace (out); /* TODO Just get() and bail if NO_VARIATION. Needs to setup the map to return that. */ - if (!layout_variation_idx_map->has (varIdx)) + if (!layout_variation_idx_delta_map->has (varIdx)) { c->revert (snap); return_trace (nullptr); } - unsigned new_idx = layout_variation_idx_map->get (varIdx); + unsigned new_idx = hb_first (layout_variation_idx_delta_map->get (varIdx)); out->varIdx = new_idx; return_trace (out); } - void record_variation_index (hb_set_t *layout_variation_indices) const + void collect_variation_index (hb_collect_variation_indices_context_t *c) const { - layout_variation_indices->add (varIdx); + c->layout_variation_indices->add (varIdx); + int delta = 0; + if (c->font && c->var_store) + delta = roundf (get_delta (c->font, *c->var_store, c->store_cache)); + + /* set new varidx to HB_OT_LAYOUT_NO_VARIATIONS_INDEX here, will remap + * varidx later*/ + c->varidx_delta_map->set (varIdx, hb_pair_t<unsigned, int> (HB_OT_LAYOUT_NO_VARIATIONS_INDEX, delta)); } bool sanitize (hb_sanitize_context_t *c) const @@ -3283,7 +3288,8 @@ struct Device } } - Device* copy (hb_serialize_context_t *c, const hb_map_t *layout_variation_idx_map=nullptr) const + Device* copy (hb_serialize_context_t *c, + const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map=nullptr) const { TRACE_SERIALIZE (this); switch (u.b.format) { @@ -3295,14 +3301,14 @@ struct Device #endif #ifndef HB_NO_VAR case 0x8000: - return_trace (reinterpret_cast<Device *> (u.variation.copy (c, layout_variation_idx_map))); + return_trace (reinterpret_cast<Device *> (u.variation.copy (c, layout_variation_idx_delta_map))); #endif default: return_trace (nullptr); } } - void collect_variation_indices (hb_set_t *layout_variation_indices) const + void collect_variation_indices (hb_collect_variation_indices_context_t *c) const { switch (u.b.format) { #ifndef HB_NO_HINTING @@ -3313,7 +3319,7 @@ struct Device #endif #ifndef HB_NO_VAR case 0x8000: - u.variation.record_variation_index (layout_variation_indices); + u.variation.collect_variation_index (c); return; #endif default: @@ -3321,6 +3327,18 @@ struct Device } } + unsigned get_variation_index () const + { + switch (u.b.format) { +#ifndef HB_NO_VAR + case 0x8000: + return u.variation.varIdx; +#endif + default: + return HB_OT_LAYOUT_NO_VARIATIONS_INDEX; + } + } + protected: union { DeviceHeader b; diff --git a/thirdparty/harfbuzz/src/hb-ot-layout-gdef-table.hh b/thirdparty/harfbuzz/src/hb-ot-layout-gdef-table.hh index 5bc26d9182..22925fdfa9 100644 --- a/thirdparty/harfbuzz/src/hb-ot-layout-gdef-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-layout-gdef-table.hh @@ -200,15 +200,34 @@ struct CaretValueFormat3 bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - auto *out = c->serializer->embed (this); + auto *out = c->serializer->start_embed (*this); if (unlikely (!out)) return_trace (false); + if (!c->serializer->embed (caretValueFormat)) return_trace (false); + if (!c->serializer->embed (coordinate)) return_trace (false); + + unsigned varidx = (this+deviceTable).get_variation_index (); + if (c->plan->layout_variation_idx_delta_map->has (varidx)) + { + int delta = hb_second (c->plan->layout_variation_idx_delta_map->get (varidx)); + if (delta != 0) + { + if (!c->serializer->check_assign (out->coordinate, coordinate + delta, HB_SERIALIZE_ERROR_INT_OVERFLOW)) + return_trace (false); + } + } + + if (c->plan->all_axes_pinned) + return_trace (c->serializer->check_assign (out->caretValueFormat, 1, HB_SERIALIZE_ERROR_INT_OVERFLOW)); + + if (!c->serializer->embed (deviceTable)) + return_trace (false); return_trace (out->deviceTable.serialize_copy (c->serializer, deviceTable, this, c->serializer->to_bias (out), - hb_serialize_context_t::Head, c->plan->layout_variation_idx_map)); + hb_serialize_context_t::Head, c->plan->layout_variation_idx_delta_map)); } - void collect_variation_indices (hb_set_t *layout_variation_indices) const - { (this+deviceTable).collect_variation_indices (layout_variation_indices); } + void collect_variation_indices (hb_collect_variation_indices_context_t *c) const + { (this+deviceTable).collect_variation_indices (c); } bool sanitize (hb_sanitize_context_t *c) const { @@ -255,14 +274,14 @@ struct CaretValue } } - void collect_variation_indices (hb_set_t *layout_variation_indices) const + void collect_variation_indices (hb_collect_variation_indices_context_t *c) const { switch (u.format) { case 1: case 2: return; case 3: - u.format3.collect_variation_indices (layout_variation_indices); + u.format3.collect_variation_indices (c); return; default: return; } @@ -329,7 +348,7 @@ struct LigGlyph void collect_variation_indices (hb_collect_variation_indices_context_t *c) const { for (const Offset16To<CaretValue>& offset : carets.iter ()) - (this+offset).collect_variation_indices (c->layout_variation_indices); + (this+offset).collect_variation_indices (c); } bool sanitize (hb_sanitize_context_t *c) const @@ -586,7 +605,10 @@ struct GDEFVersion1_2 bool subset_varstore = false; if (version.to_int () >= 0x00010003u) { - subset_varstore = out->varStore.serialize_subset (c, varStore, this); + if (c->plan->all_axes_pinned) + out->varStore = 0; + else + subset_varstore = out->varStore.serialize_subset (c, varStore, this, c->plan->gdef_varstore_inner_maps.as_array ()); } if (subset_varstore) @@ -846,7 +868,7 @@ struct GDEF { get_lig_caret_list ().collect_variation_indices (c); } void remap_layout_variation_indices (const hb_set_t *layout_variation_indices, - hb_map_t *layout_variation_idx_map /* OUT */) const + hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map /* OUT */) const { if (!has_var_store ()) return; if (layout_variation_indices->is_empty ()) return; @@ -864,7 +886,11 @@ struct GDEF } unsigned new_idx = (new_major << 16) + new_minor; - layout_variation_idx_map->set (idx, new_idx); + if (!layout_variation_idx_delta_map->has (idx)) + continue; + int delta = hb_second (layout_variation_idx_delta_map->get (idx)); + + layout_variation_idx_delta_map->set (idx, hb_pair_t<unsigned, int> (new_idx, delta)); ++new_minor; last_major = major; } diff --git a/thirdparty/harfbuzz/src/hb-ot-layout-gsubgpos.hh b/thirdparty/harfbuzz/src/hb-ot-layout-gsubgpos.hh index c77ec12fbe..c15a42b0f1 100644 --- a/thirdparty/harfbuzz/src/hb-ot-layout-gsubgpos.hh +++ b/thirdparty/harfbuzz/src/hb-ot-layout-gsubgpos.hh @@ -4261,6 +4261,7 @@ struct GSUBGPOS } void prune_langsys (const hb_map_t *duplicate_feature_map, + const hb_set_t *layout_scripts, hb_hashmap_t<unsigned, hb::unique_ptr<hb_set_t>> *script_langsys_map, hb_set_t *new_feature_indexes /* OUT */) const { @@ -4269,6 +4270,8 @@ struct GSUBGPOS unsigned count = get_script_count (); for (unsigned script_index = 0; script_index < count; script_index++) { + const Tag& tag = get_script_tag (script_index); + if (!layout_scripts->has (tag)) continue; const Script& s = get_script (script_index); s.prune_langsys (&c, script_index); } diff --git a/thirdparty/harfbuzz/src/hb-ot-layout.cc b/thirdparty/harfbuzz/src/hb-ot-layout.cc index f9c0daa486..44e57987b7 100644 --- a/thirdparty/harfbuzz/src/hb-ot-layout.cc +++ b/thirdparty/harfbuzz/src/hb-ot-layout.cc @@ -601,9 +601,13 @@ hb_ot_layout_table_select_script (hb_face_t *face, * @feature_tags: (out) (array length=feature_count): Array of feature tags found in the table * * Fetches a list of all feature tags in the given face's GSUB or GPOS table. + * Note that there might be duplicate feature tags, belonging to different + * script/language-system pairs of the table. * * Return value: Total number of feature tags. * + * Since: 0.6.0 + * **/ unsigned int hb_ot_layout_table_get_feature_tags (hb_face_t *face, @@ -629,6 +633,9 @@ hb_ot_layout_table_get_feature_tags (hb_face_t *face, * or GPOS table. * * Return value: `true` if the feature is found, `false` otherwise + * + * Since: 0.6.0 + * **/ bool hb_ot_layout_table_find_feature (hb_face_t *face, @@ -668,6 +675,8 @@ hb_ot_layout_table_find_feature (hb_face_t *face, * * Return value: Total number of language tags. * + * Since: 0.6.0 + * **/ unsigned int hb_ot_layout_script_get_language_tags (hb_face_t *face, @@ -778,6 +787,8 @@ hb_ot_layout_script_select_language (hb_face_t *face, * * Return value: `true` if the feature is found, `false` otherwise * + * Since: 0.6.0 + * **/ hb_bool_t hb_ot_layout_language_get_required_feature_index (hb_face_t *face, @@ -846,6 +857,9 @@ hb_ot_layout_language_get_required_feature (hb_face_t *face, * returned will begin at the offset provided. * * Return value: Total number of features. + * + * Since: 0.6.0 + * **/ unsigned int hb_ot_layout_language_get_feature_indexes (hb_face_t *face, @@ -879,6 +893,9 @@ hb_ot_layout_language_get_feature_indexes (hb_face_t *face, * returned will begin at the offset provided. * * Return value: Total number of feature tags. + * + * Since: 0.6.0 + * **/ unsigned int hb_ot_layout_language_get_feature_tags (hb_face_t *face, @@ -919,6 +936,8 @@ hb_ot_layout_language_get_feature_tags (hb_face_t *face, * * Return value: `true` if the feature is found, `false` otherwise * + * Since: 0.6.0 + * **/ hb_bool_t hb_ot_layout_language_find_feature (hb_face_t *face, @@ -1167,9 +1186,12 @@ script_collect_features (hb_collect_features_context_t *c, * hb_ot_layout_collect_features: * @face: #hb_face_t to work upon * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS - * @scripts: The array of scripts to collect features for - * @languages: The array of languages to collect features for - * @features: The array of features to collect + * @scripts: (nullable) (array zero-terminated=1): The array of scripts to collect features for, + * terminated by %HB_TAG_NONE + * @languages: (nullable) (array zero-terminated=1): The array of languages to collect features for, + * terminated by %HB_TAG_NONE + * @features: (nullable) (array zero-terminated=1): The array of features to collect, + * terminated by %HB_TAG_NONE * @feature_indexes: (out): The array of feature indexes found for the query * * Fetches a list of all feature indexes in the specified face's GSUB table @@ -1216,9 +1238,12 @@ hb_ot_layout_collect_features (hb_face_t *face, * hb_ot_layout_collect_lookups: * @face: #hb_face_t to work upon * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS - * @scripts: The array of scripts to collect lookups for - * @languages: The array of languages to collect lookups for - * @features: The array of features to collect lookups for + * @scripts: (nullable) (array zero-terminated=1): The array of scripts to collect lookups for, + * terminated by %HB_TAG_NONE + * @languages: (nullable) (array zero-terminated=1): The array of languages to collect lookups for, + * terminated by %HB_TAG_NONE + * @features: (nullable) (array zero-terminated=1): The array of features to collect lookups for, + * terminated by %HB_TAG_NONE * @lookup_indexes: (out): The array of lookup indexes found for the query * * Fetches a list of all feature-lookup indexes in the specified face's GSUB @@ -1316,6 +1341,8 @@ hb_ot_layout_lookup_collect_glyphs (hb_face_t *face, * * Return value: `true` if feature variations were found, `false` otherwise. * + * Since: 1.4.0 + * **/ hb_bool_t hb_ot_layout_table_find_feature_variations (hb_face_t *face, @@ -1347,6 +1374,8 @@ hb_ot_layout_table_find_feature_variations (hb_face_t *face, * * Return value: Total number of lookups. * + * Since: 1.4.0 + * **/ unsigned int hb_ot_layout_feature_with_variations_get_lookups (hb_face_t *face, @@ -1379,6 +1408,8 @@ hb_ot_layout_feature_with_variations_get_lookups (hb_face_t *face, * * Return value: `true` if data found, `false` otherwise * + * Since: 0.6.0 + * **/ hb_bool_t hb_ot_layout_has_substitution (hb_face_t *face) @@ -2297,11 +2328,6 @@ struct hb_get_glyph_alternates_dispatch_t : static return_t default_return_value () { return 0; } bool stop_sublookup_iteration (return_t r) const { return r; } - hb_face_t *face; - - hb_get_glyph_alternates_dispatch_t (hb_face_t *face) : - face (face) {} - private: template <typename T, typename ...Ts> auto _dispatch (const T &obj, hb_priority<1>, Ts&&... ds) HB_AUTO_RETURN @@ -2340,7 +2366,7 @@ hb_ot_layout_lookup_get_glyph_alternates (hb_face_t *face, unsigned *alternate_count /* IN/OUT. May be NULL. */, hb_codepoint_t *alternate_glyphs /* OUT. May be NULL. */) { - hb_get_glyph_alternates_dispatch_t c (face); + hb_get_glyph_alternates_dispatch_t c; const OT::SubstLookup &lookup = face->table.GSUB->table->get_lookup (lookup_index); auto ret = lookup.dispatch (&c, glyph, start_offset, alternate_count, alternate_glyphs); if (!ret && alternate_count) *alternate_count = 0; diff --git a/thirdparty/harfbuzz/src/hb-ot-os2-table.hh b/thirdparty/harfbuzz/src/hb-ot-os2-table.hh index 3473afef54..c6e8fad6fc 100644 --- a/thirdparty/harfbuzz/src/hb-ot-os2-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-os2-table.hh @@ -166,6 +166,47 @@ struct OS2 } } + float map_wdth_to_widthclass(float width) const + { + if (width < 50) return 1.0f; + if (width > 200) return 9.0f; + + float ratio = (width - 50) / 12.5f; + int a = (int) floorf (ratio); + int b = (int) ceilf (ratio); + + /* follow this maping: + * https://docs.microsoft.com/en-us/typography/opentype/spec/os2#uswidthclass + */ + if (b <= 6) // 50-125 + { + if (a == b) return a + 1.0f; + } + else if (b == 7) // no mapping for 137.5 + { + a = 6; + b = 8; + } + else if (b == 8) + { + if (a == b) return 8.0f; // 150 + a = 6; + } + else + { + if (a == b && a == 12) return 9.0f; //200 + b = 12; + a = 8; + } + + float va = 50 + a * 12.5f; + float vb = 50 + b * 12.5f; + + float ret = a + (width - va) / (vb - va); + if (a <= 6) ret += 1.0f; + return ret; + } + bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); @@ -183,6 +224,26 @@ struct OS2 _update_unicode_ranges (c->plan->unicodes, os2_prime->ulUnicodeRange); + if (c->plan->user_axes_location->has (HB_TAG ('w','g','h','t')) && + !c->plan->pinned_at_default) + { + float weight_class = c->plan->user_axes_location->get (HB_TAG ('w','g','h','t')); + if (!c->serializer->check_assign (os2_prime->usWeightClass, + roundf (hb_clamp (weight_class, 1.0f, 1000.0f)), + HB_SERIALIZE_ERROR_INT_OVERFLOW)) + return_trace (false); + } + + if (c->plan->user_axes_location->has (HB_TAG ('w','d','t','h')) && + !c->plan->pinned_at_default) + { + float width = c->plan->user_axes_location->get (HB_TAG ('w','d','t','h')); + if (!c->serializer->check_assign (os2_prime->usWidthClass, + roundf (map_wdth_to_widthclass (width)), + HB_SERIALIZE_ERROR_INT_OVERFLOW)) + return_trace (false); + } + return_trace (true); } diff --git a/thirdparty/harfbuzz/src/hb-ot-post-table.hh b/thirdparty/harfbuzz/src/hb-ot-post-table.hh index a4c0c4aa17..80d02ffba7 100644 --- a/thirdparty/harfbuzz/src/hb-ot-post-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-post-table.hh @@ -102,6 +102,14 @@ struct post if (!serialize (c->serializer, glyph_names)) return_trace (false); + if (c->plan->user_axes_location->has (HB_TAG ('s','l','n','t')) && + !c->plan->pinned_at_default) + { + float italic_angle = c->plan->user_axes_location->get (HB_TAG ('s','l','n','t')); + italic_angle = hb_max (-90.f, hb_min (italic_angle, 90.f)); + post_prime->italicAngle.set_float (italic_angle); + } + if (glyph_names && version.major == 2) return_trace (v2X.subset (c)); @@ -133,7 +141,7 @@ struct post } ~accelerator_t () { - hb_free (gids_sorted_by_name.get ()); + hb_free (gids_sorted_by_name.get_acquire ()); table.destroy (); } @@ -160,7 +168,7 @@ struct post if (unlikely (!len)) return false; retry: - uint16_t *gids = gids_sorted_by_name.get (); + uint16_t *gids = gids_sorted_by_name.get_acquire (); if (unlikely (!gids)) { diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-arabic-joining-list.hh b/thirdparty/harfbuzz/src/hb-ot-shaper-arabic-joining-list.hh index a5ce3a6c93..c7b57820af 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-arabic-joining-list.hh +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-arabic-joining-list.hh @@ -6,10 +6,10 @@ * * on files with these headers: * - * # ArabicShaping-14.0.0.txt - * # Date: 2021-05-21, 01:54:00 GMT [KW, RP] - * # Scripts-14.0.0.txt - * # Date: 2021-07-10, 00:35:31 GMT + * # ArabicShaping-15.0.0.txt + * # Date: 2022-02-14, 18:50:00 GMT [KW, RP] + * # Scripts-15.0.0.txt + * # Date: 2022-04-26, 23:15:02 GMT */ #ifndef HB_OT_SHAPER_ARABIC_JOINING_LIST_HH diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-arabic-table.hh b/thirdparty/harfbuzz/src/hb-ot-shaper-arabic-table.hh index fd3d8645d1..d7670f2f95 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-arabic-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-arabic-table.hh @@ -6,10 +6,10 @@ * * on files with these headers: * - * # ArabicShaping-14.0.0.txt - * # Date: 2021-05-21, 01:54:00 GMT [KW, RP] - * # Blocks-14.0.0.txt - * # Date: 2021-01-22, 23:29:00 GMT [KW] + * # ArabicShaping-15.0.0.txt + * # Date: 2022-02-14, 18:50:00 GMT [KW, RP] + * # Blocks-15.0.0.txt + * # Date: 2022-01-28, 20:58:00 GMT [KW] * UnicodeData.txt does not have a header. */ diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-indic-machine.hh b/thirdparty/harfbuzz/src/hb-ot-shaper-indic-machine.hh index d3a7cce3de..d52b13f616 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-indic-machine.hh +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-indic-machine.hh @@ -53,7 +53,7 @@ enum indic_syllable_type_t { }; -#line 54 "hb-ot-shaper-indic-machine.hh" +#line 57 "hb-ot-shaper-indic-machine.hh" #define indic_syllable_machine_ex_A 9u #define indic_syllable_machine_ex_C 1u #define indic_syllable_machine_ex_CM 16u @@ -75,7 +75,7 @@ enum indic_syllable_type_t { #define indic_syllable_machine_ex_ZWNJ 5u -#line 74 "hb-ot-shaper-indic-machine.hh" +#line 79 "hb-ot-shaper-indic-machine.hh" static const unsigned char _indic_syllable_machine_trans_keys[] = { 8u, 8u, 4u, 8u, 5u, 7u, 5u, 8u, 4u, 8u, 4u, 12u, 4u, 8u, 8u, 8u, 5u, 7u, 5u, 8u, 4u, 8u, 4u, 12u, 4u, 12u, 4u, 12u, 8u, 8u, 5u, 7u, @@ -422,7 +422,7 @@ find_syllables_indic (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 415 "hb-ot-shaper-indic-machine.hh" +#line 426 "hb-ot-shaper-indic-machine.hh" { cs = indic_syllable_machine_start; ts = 0; @@ -438,7 +438,7 @@ find_syllables_indic (hb_buffer_t *buffer) unsigned int syllable_serial = 1; -#line 427 "hb-ot-shaper-indic-machine.hh" +#line 442 "hb-ot-shaper-indic-machine.hh" { int _slen; int _trans; @@ -452,7 +452,7 @@ _resume: #line 1 "NONE" {ts = p;} break; -#line 439 "hb-ot-shaper-indic-machine.hh" +#line 456 "hb-ot-shaper-indic-machine.hh" } _keys = _indic_syllable_machine_trans_keys + (cs<<1); @@ -555,7 +555,7 @@ _eof_trans: #line 113 "hb-ot-shaper-indic-machine.rl" {act = 6;} break; -#line 521 "hb-ot-shaper-indic-machine.hh" +#line 559 "hb-ot-shaper-indic-machine.hh" } _again: @@ -564,7 +564,7 @@ _again: #line 1 "NONE" {ts = 0;} break; -#line 528 "hb-ot-shaper-indic-machine.hh" +#line 568 "hb-ot-shaper-indic-machine.hh" } if ( ++p != pe ) diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-indic-table.cc b/thirdparty/harfbuzz/src/hb-ot-shaper-indic-table.cc index 8994f3ca59..bf6a2757bb 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-indic-table.cc +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-indic-table.cc @@ -6,12 +6,12 @@ * * on files with these headers: * - * # IndicSyllabicCategory-14.0.0.txt - * # Date: 2021-05-22, 01:01:00 GMT [KW, RP] - * # IndicPositionalCategory-14.0.0.txt - * # Date: 2021-05-22, 01:01:00 GMT [KW, RP] - * # Blocks-14.0.0.txt - * # Date: 2021-01-22, 23:29:00 GMT [KW] + * # IndicSyllabicCategory-15.0.0.txt + * # Date: 2022-05-26, 02:18:00 GMT [KW, RP] + * # IndicPositionalCategory-15.0.0.txt + * # Date: 2022-05-26, 02:18:00 GMT [KW, RP] + * # Blocks-15.0.0.txt + * # Date: 2022-01-28, 20:58:00 GMT [KW] */ #include "hb.hh" @@ -92,7 +92,7 @@ static_assert (OT_VPst == M_Cat(VPst), ""); #define _OT_R OT_Ra /* 14 chars; Ra */ #define _OT_Rf OT_Repha /* 1 chars; Repha */ #define _OT_Rt OT_Robatic /* 3 chars; Robatic */ -#define _OT_SM OT_SM /* 55 chars; SM */ +#define _OT_SM OT_SM /* 56 chars; SM */ #define _OT_S OT_Symbol /* 22 chars; Symbol */ #define _OT_V OT_V /* 172 chars; V */ #define _OT_VA OT_VAbv /* 18 chars; VAbv */ @@ -117,7 +117,7 @@ static_assert (OT_VPst == M_Cat(VPst), ""); #define _POS_R POS_POST_C /* 13 chars; POST_C */ #define _POS_L POS_PRE_C /* 5 chars; PRE_C */ #define _POS_LM POS_PRE_M /* 14 chars; PRE_M */ -#define _POS_SM POS_SMVD /* 129 chars; SMVD */ +#define _POS_SM POS_SMVD /* 130 chars; SMVD */ #pragma GCC diagnostic pop @@ -301,7 +301,7 @@ static const uint16_t indic_table[] = { /* 0CD8 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(C,C), _(C,C), _(X,X), /* 0CE0 */ _(V,C), _(V,C), _(M,BS), _(M,BS), _(X,X), _(X,X), _(GB,C), _(GB,C), /* 0CE8 */ _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), - /* 0CF0 */ _(X,X), _(CS,C), _(CS,C), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), + /* 0CF0 */ _(X,X), _(CS,C), _(CS,C),_(SM,SM), _(X,X), _(X,X), _(X,X), _(X,X), /* 0CF8 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), /* Malayalam */ diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-indic.cc b/thirdparty/harfbuzz/src/hb-ot-shaper-indic.cc index 6eb400ab16..55509c1101 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-indic.cc +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-indic.cc @@ -276,7 +276,7 @@ struct indic_shape_plan_t { bool load_virama_glyph (hb_font_t *font, hb_codepoint_t *pglyph) const { - hb_codepoint_t glyph = virama_glyph.get_relaxed (); + hb_codepoint_t glyph = virama_glyph; if (unlikely (glyph == (hb_codepoint_t) -1)) { if (!config->virama || !font->get_nominal_glyph (config->virama, &glyph)) @@ -286,7 +286,7 @@ struct indic_shape_plan_t /* Our get_nominal_glyph() function needs a font, so we can't get the virama glyph * during shape planning... Instead, overwrite it here. */ - virama_glyph.set_relaxed ((int) glyph); + virama_glyph = (int) glyph; } *pglyph = glyph; @@ -330,7 +330,7 @@ data_create_indic (const hb_ot_shape_plan_t *plan) #ifndef HB_NO_UNISCRIBE_BUG_COMPATIBLE indic_plan->uniscribe_bug_compatible = hb_options ().uniscribe_bug_compatible; #endif - indic_plan->virama_glyph.set_relaxed (-1); + indic_plan->virama_glyph = -1; /* Use zero-context would_substitute() matching for new-spec of the main * Indic scripts, and scripts with one spec only, but not for old-specs. @@ -992,7 +992,7 @@ final_reordering_syllable_indic (const hb_ot_shape_plan_t *plan, * class of I_Cat(H) is desired but has been lost. */ /* We don't call load_virama_glyph(), since we know it's already * loaded. */ - hb_codepoint_t virama_glyph = indic_plan->virama_glyph.get_relaxed (); + hb_codepoint_t virama_glyph = indic_plan->virama_glyph; if (virama_glyph) { for (unsigned int i = start; i < end; i++) diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-khmer-machine.hh b/thirdparty/harfbuzz/src/hb-ot-shaper-khmer-machine.hh index 2c40663bdd..e18bd75ef1 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-khmer-machine.hh +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-khmer-machine.hh @@ -48,7 +48,7 @@ enum khmer_syllable_type_t { }; -#line 49 "hb-ot-shaper-khmer-machine.hh" +#line 52 "hb-ot-shaper-khmer-machine.hh" #define khmer_syllable_machine_ex_C 1u #define khmer_syllable_machine_ex_DOTTEDCIRCLE 11u #define khmer_syllable_machine_ex_H 4u @@ -66,7 +66,7 @@ enum khmer_syllable_type_t { #define khmer_syllable_machine_ex_ZWNJ 5u -#line 65 "hb-ot-shaper-khmer-machine.hh" +#line 70 "hb-ot-shaper-khmer-machine.hh" static const unsigned char _khmer_syllable_machine_trans_keys[] = { 5u, 26u, 5u, 26u, 1u, 15u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 1u, 15u, 5u, 26u, 5u, 26u, @@ -294,7 +294,7 @@ find_syllables_khmer (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 287 "hb-ot-shaper-khmer-machine.hh" +#line 298 "hb-ot-shaper-khmer-machine.hh" { cs = khmer_syllable_machine_start; ts = 0; @@ -310,7 +310,7 @@ find_syllables_khmer (hb_buffer_t *buffer) unsigned int syllable_serial = 1; -#line 299 "hb-ot-shaper-khmer-machine.hh" +#line 314 "hb-ot-shaper-khmer-machine.hh" { int _slen; int _trans; @@ -324,7 +324,7 @@ _resume: #line 1 "NONE" {ts = p;} break; -#line 311 "hb-ot-shaper-khmer-machine.hh" +#line 328 "hb-ot-shaper-khmer-machine.hh" } _keys = _khmer_syllable_machine_trans_keys + (cs<<1); @@ -394,7 +394,7 @@ _eof_trans: #line 98 "hb-ot-shaper-khmer-machine.rl" {act = 3;} break; -#line 368 "hb-ot-shaper-khmer-machine.hh" +#line 398 "hb-ot-shaper-khmer-machine.hh" } _again: @@ -403,7 +403,7 @@ _again: #line 1 "NONE" {ts = 0;} break; -#line 375 "hb-ot-shaper-khmer-machine.hh" +#line 407 "hb-ot-shaper-khmer-machine.hh" } if ( ++p != pe ) diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-myanmar-machine.hh b/thirdparty/harfbuzz/src/hb-ot-shaper-myanmar-machine.hh index 464cf796d4..b109708937 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-myanmar-machine.hh +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-myanmar-machine.hh @@ -50,7 +50,7 @@ enum myanmar_syllable_type_t { }; -#line 51 "hb-ot-shaper-myanmar-machine.hh" +#line 54 "hb-ot-shaper-myanmar-machine.hh" #define myanmar_syllable_machine_ex_A 9u #define myanmar_syllable_machine_ex_As 32u #define myanmar_syllable_machine_ex_C 1u @@ -77,7 +77,7 @@ enum myanmar_syllable_type_t { #define myanmar_syllable_machine_ex_ZWNJ 5u -#line 76 "hb-ot-shaper-myanmar-machine.hh" +#line 81 "hb-ot-shaper-myanmar-machine.hh" static const unsigned char _myanmar_syllable_machine_trans_keys[] = { 1u, 41u, 3u, 41u, 5u, 39u, 5u, 8u, 3u, 41u, 3u, 39u, 3u, 39u, 5u, 39u, 5u, 39u, 3u, 39u, 3u, 39u, 3u, 41u, 5u, 39u, 1u, 15u, 3u, 39u, 3u, 39u, @@ -443,7 +443,7 @@ find_syllables_myanmar (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 436 "hb-ot-shaper-myanmar-machine.hh" +#line 447 "hb-ot-shaper-myanmar-machine.hh" { cs = myanmar_syllable_machine_start; ts = 0; @@ -459,7 +459,7 @@ find_syllables_myanmar (hb_buffer_t *buffer) unsigned int syllable_serial = 1; -#line 448 "hb-ot-shaper-myanmar-machine.hh" +#line 463 "hb-ot-shaper-myanmar-machine.hh" { int _slen; int _trans; @@ -473,7 +473,7 @@ _resume: #line 1 "NONE" {ts = p;} break; -#line 460 "hb-ot-shaper-myanmar-machine.hh" +#line 477 "hb-ot-shaper-myanmar-machine.hh" } _keys = _myanmar_syllable_machine_trans_keys + (cs<<1); @@ -519,7 +519,7 @@ _eof_trans: #line 113 "hb-ot-shaper-myanmar-machine.rl" {te = p;p--;{ found_syllable (myanmar_non_myanmar_cluster); }} break; -#line 498 "hb-ot-shaper-myanmar-machine.hh" +#line 523 "hb-ot-shaper-myanmar-machine.hh" } _again: @@ -528,7 +528,7 @@ _again: #line 1 "NONE" {ts = 0;} break; -#line 505 "hb-ot-shaper-myanmar-machine.hh" +#line 532 "hb-ot-shaper-myanmar-machine.hh" } if ( ++p != pe ) diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-use-machine.hh b/thirdparty/harfbuzz/src/hb-ot-shaper-use-machine.hh index 5b3ec05616..41e8a34f3b 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-use-machine.hh +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-use-machine.hh @@ -53,7 +53,7 @@ enum use_syllable_type_t { }; -#line 54 "hb-ot-shaper-use-machine.hh" +#line 57 "hb-ot-shaper-use-machine.hh" #define use_syllable_machine_ex_B 1u #define use_syllable_machine_ex_CGJ 6u #define use_syllable_machine_ex_CMAbv 31u @@ -97,523 +97,669 @@ enum use_syllable_type_t { #define use_syllable_machine_ex_ZWNJ 14u -#line 96 "hb-ot-shaper-use-machine.hh" +#line 101 "hb-ot-shaper-use-machine.hh" static const unsigned char _use_syllable_machine_trans_keys[] = { - 0u, 53u, 11u, 53u, 11u, 53u, 1u, 53u, 23u, 48u, 24u, 47u, 25u, 47u, 26u, 47u, - 45u, 46u, 46u, 46u, 24u, 48u, 24u, 48u, 24u, 48u, 1u, 1u, 24u, 48u, 22u, 53u, - 23u, 53u, 23u, 53u, 23u, 53u, 12u, 53u, 23u, 53u, 12u, 53u, 12u, 53u, 12u, 53u, - 11u, 53u, 1u, 1u, 1u, 48u, 11u, 53u, 41u, 42u, 42u, 42u, 11u, 53u, 11u, 53u, - 1u, 53u, 23u, 48u, 24u, 47u, 25u, 47u, 26u, 47u, 45u, 46u, 46u, 46u, 24u, 48u, - 24u, 48u, 24u, 48u, 1u, 1u, 24u, 48u, 22u, 53u, 23u, 53u, 23u, 53u, 23u, 53u, - 12u, 53u, 23u, 53u, 12u, 53u, 12u, 53u, 12u, 53u, 11u, 53u, 1u, 1u, 1u, 48u, - 13u, 13u, 4u, 4u, 11u, 53u, 11u, 53u, 1u, 53u, 23u, 48u, 24u, 47u, 25u, 47u, - 26u, 47u, 45u, 46u, 46u, 46u, 24u, 48u, 24u, 48u, 24u, 48u, 1u, 1u, 24u, 48u, - 22u, 53u, 23u, 53u, 23u, 53u, 23u, 53u, 12u, 53u, 23u, 53u, 12u, 53u, 12u, 53u, - 12u, 53u, 11u, 53u, 1u, 1u, 1u, 48u, 11u, 53u, 11u, 53u, 1u, 53u, 23u, 48u, - 24u, 47u, 25u, 47u, 26u, 47u, 45u, 46u, 46u, 46u, 24u, 48u, 24u, 48u, 24u, 48u, - 1u, 1u, 24u, 48u, 22u, 53u, 23u, 53u, 23u, 53u, 23u, 53u, 12u, 53u, 23u, 53u, - 12u, 53u, 12u, 53u, 12u, 53u, 11u, 53u, 1u, 1u, 1u, 48u, 4u, 4u, 13u, 13u, - 1u, 53u, 11u, 53u, 41u, 42u, 42u, 42u, 1u, 5u, 50u, 52u, 49u, 52u, 49u, 51u, - 0 + 0u, 53u, 11u, 53u, 11u, 53u, 1u, 53u, 14u, 48u, 14u, 47u, 14u, 47u, 14u, 47u, + 14u, 46u, 14u, 46u, 14u, 14u, 14u, 48u, 14u, 48u, 14u, 48u, 1u, 14u, 14u, 48u, + 14u, 53u, 14u, 53u, 14u, 53u, 14u, 53u, 12u, 53u, 14u, 53u, 12u, 53u, 12u, 53u, + 12u, 53u, 11u, 53u, 1u, 14u, 1u, 48u, 11u, 53u, 14u, 42u, 14u, 42u, 11u, 53u, + 11u, 53u, 1u, 53u, 14u, 48u, 14u, 47u, 14u, 47u, 14u, 47u, 14u, 46u, 14u, 46u, + 14u, 14u, 14u, 48u, 14u, 48u, 14u, 48u, 1u, 14u, 14u, 48u, 14u, 53u, 14u, 53u, + 14u, 53u, 14u, 53u, 12u, 53u, 14u, 53u, 12u, 53u, 12u, 53u, 12u, 53u, 11u, 53u, + 1u, 14u, 1u, 14u, 1u, 48u, 13u, 14u, 4u, 14u, 11u, 53u, 11u, 53u, 1u, 53u, + 14u, 48u, 14u, 47u, 14u, 47u, 14u, 47u, 14u, 46u, 14u, 46u, 14u, 14u, 14u, 48u, + 14u, 48u, 14u, 48u, 1u, 14u, 14u, 48u, 14u, 53u, 14u, 53u, 14u, 53u, 14u, 53u, + 12u, 53u, 14u, 53u, 12u, 53u, 12u, 53u, 12u, 53u, 11u, 53u, 1u, 14u, 1u, 14u, + 1u, 48u, 11u, 53u, 11u, 53u, 1u, 53u, 14u, 48u, 14u, 47u, 14u, 47u, 14u, 47u, + 14u, 46u, 14u, 46u, 14u, 14u, 14u, 48u, 14u, 48u, 14u, 48u, 1u, 14u, 14u, 48u, + 14u, 53u, 14u, 53u, 14u, 53u, 14u, 53u, 12u, 53u, 14u, 53u, 12u, 53u, 12u, 53u, + 12u, 53u, 11u, 53u, 1u, 14u, 1u, 48u, 4u, 14u, 13u, 14u, 1u, 53u, 11u, 53u, + 14u, 42u, 14u, 42u, 1u, 5u, 14u, 52u, 14u, 52u, 14u, 51u, 0 }; static const char _use_syllable_machine_key_spans[] = { - 54, 43, 43, 53, 26, 24, 23, 22, - 2, 1, 25, 25, 25, 1, 25, 32, - 31, 31, 31, 42, 31, 42, 42, 42, - 43, 1, 48, 43, 2, 1, 43, 43, - 53, 26, 24, 23, 22, 2, 1, 25, - 25, 25, 1, 25, 32, 31, 31, 31, - 42, 31, 42, 42, 42, 43, 1, 48, - 1, 1, 43, 43, 53, 26, 24, 23, - 22, 2, 1, 25, 25, 25, 1, 25, - 32, 31, 31, 31, 42, 31, 42, 42, - 42, 43, 1, 48, 43, 43, 53, 26, - 24, 23, 22, 2, 1, 25, 25, 25, - 1, 25, 32, 31, 31, 31, 42, 31, - 42, 42, 42, 43, 1, 48, 1, 1, - 53, 43, 2, 1, 5, 3, 4, 3 + 54, 43, 43, 53, 35, 34, 34, 34, + 33, 33, 1, 35, 35, 35, 14, 35, + 40, 40, 40, 40, 42, 40, 42, 42, + 42, 43, 14, 48, 43, 29, 29, 43, + 43, 53, 35, 34, 34, 34, 33, 33, + 1, 35, 35, 35, 14, 35, 40, 40, + 40, 40, 42, 40, 42, 42, 42, 43, + 14, 14, 48, 2, 11, 43, 43, 53, + 35, 34, 34, 34, 33, 33, 1, 35, + 35, 35, 14, 35, 40, 40, 40, 40, + 42, 40, 42, 42, 42, 43, 14, 14, + 48, 43, 43, 53, 35, 34, 34, 34, + 33, 33, 1, 35, 35, 35, 14, 35, + 40, 40, 40, 40, 42, 40, 42, 42, + 42, 43, 14, 48, 11, 2, 53, 43, + 29, 29, 5, 39, 39, 38 }; static const short _use_syllable_machine_index_offsets[] = { - 0, 55, 99, 143, 197, 224, 249, 273, - 296, 299, 301, 327, 353, 379, 381, 407, - 440, 472, 504, 536, 579, 611, 654, 697, - 740, 784, 786, 835, 879, 882, 884, 928, - 972, 1026, 1053, 1078, 1102, 1125, 1128, 1130, - 1156, 1182, 1208, 1210, 1236, 1269, 1301, 1333, - 1365, 1408, 1440, 1483, 1526, 1569, 1613, 1615, - 1664, 1666, 1668, 1712, 1756, 1810, 1837, 1862, - 1886, 1909, 1912, 1914, 1940, 1966, 1992, 1994, - 2020, 2053, 2085, 2117, 2149, 2192, 2224, 2267, - 2310, 2353, 2397, 2399, 2448, 2492, 2536, 2590, - 2617, 2642, 2666, 2689, 2692, 2694, 2720, 2746, - 2772, 2774, 2800, 2833, 2865, 2897, 2929, 2972, - 3004, 3047, 3090, 3133, 3177, 3179, 3228, 3230, - 3232, 3286, 3330, 3333, 3335, 3341, 3345, 3350 + 0, 55, 99, 143, 197, 233, 268, 303, + 338, 372, 406, 408, 444, 480, 516, 531, + 567, 608, 649, 690, 731, 774, 815, 858, + 901, 944, 988, 1003, 1052, 1096, 1126, 1156, + 1200, 1244, 1298, 1334, 1369, 1404, 1439, 1473, + 1507, 1509, 1545, 1581, 1617, 1632, 1668, 1709, + 1750, 1791, 1832, 1875, 1916, 1959, 2002, 2045, + 2089, 2104, 2119, 2168, 2171, 2183, 2227, 2271, + 2325, 2361, 2396, 2431, 2466, 2500, 2534, 2536, + 2572, 2608, 2644, 2659, 2695, 2736, 2777, 2818, + 2859, 2902, 2943, 2986, 3029, 3072, 3116, 3131, + 3146, 3195, 3239, 3283, 3337, 3373, 3408, 3443, + 3478, 3512, 3546, 3548, 3584, 3620, 3656, 3671, + 3707, 3748, 3789, 3830, 3871, 3914, 3955, 3998, + 4041, 4084, 4128, 4143, 4192, 4204, 4207, 4261, + 4305, 4335, 4365, 4371, 4411, 4451 }; static const unsigned char _use_syllable_machine_indicies[] = { 0, 1, 2, 2, 3, 4, 2, 2, - 2, 2, 2, 5, 6, 7, 2, 2, - 2, 2, 8, 2, 2, 2, 9, 10, + 2, 2, 2, 5, 6, 7, 8, 2, + 2, 2, 9, 2, 2, 2, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 2, 24, 25, 26, + 2, 27, 28, 29, 30, 31, 32, 33, + 30, 34, 2, 35, 2, 36, 2, 38, + 39, 37, 40, 37, 37, 37, 37, 37, + 37, 37, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, + 37, 55, 56, 57, 37, 58, 59, 37, + 60, 61, 62, 63, 60, 37, 37, 37, + 37, 64, 37, 38, 39, 37, 40, 37, + 37, 37, 37, 37, 37, 37, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 51, + 51, 52, 53, 54, 37, 55, 56, 57, + 37, 37, 37, 37, 60, 61, 62, 63, + 60, 37, 37, 37, 37, 64, 37, 38, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 40, 37, 37, 37, + 37, 37, 37, 37, 37, 42, 43, 44, + 45, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 55, 56, 57, 37, 37, + 37, 37, 37, 61, 62, 63, 65, 37, + 37, 37, 37, 42, 37, 40, 37, 37, + 37, 37, 37, 37, 37, 37, 42, 43, + 44, 45, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 55, 56, 57, 37, + 37, 37, 37, 37, 61, 62, 63, 65, + 37, 40, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 43, 44, 45, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 61, 62, 63, 37, 40, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 44, + 45, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 61, 62, 63, 37, 40, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 45, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 61, 62, + 63, 37, 40, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 61, 62, 37, 40, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 62, 37, 40, 37, + 40, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 43, 44, 45, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 55, + 56, 57, 37, 37, 37, 37, 37, 61, + 62, 63, 65, 37, 40, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 43, 44, + 45, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 56, 57, 37, 37, + 37, 37, 37, 61, 62, 63, 65, 37, + 40, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 43, 44, 45, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 57, 37, 37, 37, 37, 37, 61, + 62, 63, 65, 37, 66, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 40, 37, 40, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 43, 44, 45, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 61, 62, 63, 65, 37, 40, + 37, 37, 37, 37, 37, 37, 37, 41, + 42, 43, 44, 45, 37, 37, 37, 37, + 37, 37, 52, 53, 54, 37, 55, 56, + 57, 37, 37, 37, 37, 37, 61, 62, + 63, 65, 37, 37, 37, 37, 42, 37, + 40, 37, 37, 37, 37, 37, 37, 37, + 37, 42, 43, 44, 45, 37, 37, 37, + 37, 37, 37, 52, 53, 54, 37, 55, + 56, 57, 37, 37, 37, 37, 37, 61, + 62, 63, 65, 37, 37, 37, 37, 42, + 37, 40, 37, 37, 37, 37, 37, 37, + 37, 37, 42, 43, 44, 45, 37, 37, + 37, 37, 37, 37, 37, 53, 54, 37, + 55, 56, 57, 37, 37, 37, 37, 37, + 61, 62, 63, 65, 37, 37, 37, 37, + 42, 37, 40, 37, 37, 37, 37, 37, + 37, 37, 37, 42, 43, 44, 45, 37, + 37, 37, 37, 37, 37, 37, 37, 54, + 37, 55, 56, 57, 37, 37, 37, 37, + 37, 61, 62, 63, 65, 37, 37, 37, + 37, 42, 37, 67, 37, 40, 37, 37, + 37, 37, 37, 37, 37, 41, 42, 43, + 44, 45, 37, 47, 48, 37, 37, 37, + 52, 53, 54, 37, 55, 56, 57, 37, + 37, 37, 37, 37, 61, 62, 63, 65, + 37, 37, 37, 37, 42, 37, 40, 37, + 37, 37, 37, 37, 37, 37, 37, 42, + 43, 44, 45, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 55, 56, 57, + 37, 37, 37, 37, 37, 61, 62, 63, + 65, 37, 37, 37, 37, 42, 37, 67, + 37, 40, 37, 37, 37, 37, 37, 37, + 37, 41, 42, 43, 44, 45, 37, 37, + 48, 37, 37, 37, 52, 53, 54, 37, + 55, 56, 57, 37, 37, 37, 37, 37, + 61, 62, 63, 65, 37, 37, 37, 37, + 42, 37, 67, 37, 40, 37, 37, 37, + 37, 37, 37, 37, 41, 42, 43, 44, + 45, 37, 37, 37, 37, 37, 37, 52, + 53, 54, 37, 55, 56, 57, 37, 37, + 37, 37, 37, 61, 62, 63, 65, 37, + 37, 37, 37, 42, 37, 67, 37, 40, + 37, 37, 37, 37, 37, 37, 37, 41, + 42, 43, 44, 45, 46, 47, 48, 37, + 37, 37, 52, 53, 54, 37, 55, 56, + 57, 37, 37, 37, 37, 37, 61, 62, + 63, 65, 37, 37, 37, 37, 42, 37, + 38, 39, 37, 40, 37, 37, 37, 37, + 37, 37, 37, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 37, 51, 52, 53, + 54, 37, 55, 56, 57, 37, 37, 37, + 37, 60, 61, 62, 63, 60, 37, 37, + 37, 37, 64, 37, 38, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 40, 37, 38, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 40, 37, 37, 37, 37, 37, 37, 37, + 37, 42, 43, 44, 45, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 55, + 56, 57, 37, 37, 37, 37, 37, 61, + 62, 63, 65, 37, 38, 39, 37, 40, + 37, 37, 37, 37, 37, 37, 37, 41, + 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 37, 55, 56, + 57, 37, 37, 37, 37, 60, 61, 62, + 63, 60, 37, 37, 37, 37, 64, 37, + 40, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 58, 59, 37, 40, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 59, 37, 69, 70, 68, 71, + 68, 68, 68, 68, 68, 68, 68, 72, + 73, 74, 75, 76, 77, 78, 79, 80, + 1, 81, 82, 83, 84, 68, 85, 86, + 87, 68, 68, 68, 68, 88, 89, 90, + 91, 92, 68, 68, 68, 68, 93, 68, + 69, 70, 68, 71, 68, 68, 68, 68, + 68, 68, 68, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 81, 82, 83, + 84, 68, 85, 86, 87, 68, 68, 68, + 68, 88, 89, 90, 91, 92, 68, 68, + 68, 68, 93, 68, 69, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 71, 68, 68, 68, 68, 68, 68, + 68, 68, 73, 74, 75, 76, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 85, 86, 87, 68, 68, 68, 68, 68, + 89, 90, 91, 94, 68, 68, 68, 68, + 73, 68, 71, 68, 68, 68, 68, 68, + 68, 68, 68, 73, 74, 75, 76, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 85, 86, 87, 68, 68, 68, 68, + 68, 89, 90, 91, 94, 68, 71, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 74, 75, 76, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 89, 90, 91, + 68, 71, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 75, 76, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 89, 90, 91, 68, 71, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 76, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 89, 90, 91, 68, 71, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 89, 90, + 68, 71, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 90, 68, 71, 68, 71, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 74, + 75, 76, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 85, 86, 87, 68, + 68, 68, 68, 68, 89, 90, 91, 94, + 68, 71, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 74, 75, 76, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 86, 87, 68, 68, 68, 68, 68, + 89, 90, 91, 94, 68, 71, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 74, + 75, 76, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 87, 68, + 68, 68, 68, 68, 89, 90, 91, 94, + 68, 96, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 97, 95, + 71, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 74, 75, 76, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 89, + 90, 91, 94, 68, 71, 68, 68, 68, + 68, 68, 68, 68, 72, 73, 74, 75, + 76, 68, 68, 68, 68, 68, 68, 82, + 83, 84, 68, 85, 86, 87, 68, 68, + 68, 68, 68, 89, 90, 91, 94, 68, + 68, 68, 68, 73, 68, 71, 68, 68, + 68, 68, 68, 68, 68, 68, 73, 74, + 75, 76, 68, 68, 68, 68, 68, 68, + 82, 83, 84, 68, 85, 86, 87, 68, + 68, 68, 68, 68, 89, 90, 91, 94, + 68, 68, 68, 68, 73, 68, 71, 68, + 68, 68, 68, 68, 68, 68, 68, 73, + 74, 75, 76, 68, 68, 68, 68, 68, + 68, 68, 83, 84, 68, 85, 86, 87, + 68, 68, 68, 68, 68, 89, 90, 91, + 94, 68, 68, 68, 68, 73, 68, 71, + 68, 68, 68, 68, 68, 68, 68, 68, + 73, 74, 75, 76, 68, 68, 68, 68, + 68, 68, 68, 68, 84, 68, 85, 86, + 87, 68, 68, 68, 68, 68, 89, 90, + 91, 94, 68, 68, 68, 68, 73, 68, + 98, 68, 71, 68, 68, 68, 68, 68, + 68, 68, 72, 73, 74, 75, 76, 68, + 78, 79, 68, 68, 68, 82, 83, 84, + 68, 85, 86, 87, 68, 68, 68, 68, + 68, 89, 90, 91, 94, 68, 68, 68, + 68, 73, 68, 71, 68, 68, 68, 68, + 68, 68, 68, 68, 73, 74, 75, 76, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 85, 86, 87, 68, 68, 68, + 68, 68, 89, 90, 91, 94, 68, 68, + 68, 68, 73, 68, 98, 68, 71, 68, + 68, 68, 68, 68, 68, 68, 72, 73, + 74, 75, 76, 68, 68, 79, 68, 68, + 68, 82, 83, 84, 68, 85, 86, 87, + 68, 68, 68, 68, 68, 89, 90, 91, + 94, 68, 68, 68, 68, 73, 68, 98, + 68, 71, 68, 68, 68, 68, 68, 68, + 68, 72, 73, 74, 75, 76, 68, 68, + 68, 68, 68, 68, 82, 83, 84, 68, + 85, 86, 87, 68, 68, 68, 68, 68, + 89, 90, 91, 94, 68, 68, 68, 68, + 73, 68, 98, 68, 71, 68, 68, 68, + 68, 68, 68, 68, 72, 73, 74, 75, + 76, 77, 78, 79, 68, 68, 68, 82, + 83, 84, 68, 85, 86, 87, 68, 68, + 68, 68, 68, 89, 90, 91, 94, 68, + 68, 68, 68, 73, 68, 69, 70, 68, + 71, 68, 68, 68, 68, 68, 68, 68, + 72, 73, 74, 75, 76, 77, 78, 79, + 80, 68, 81, 82, 83, 84, 68, 85, + 86, 87, 68, 68, 68, 68, 88, 89, + 90, 91, 92, 68, 68, 68, 68, 93, + 68, 69, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 100, 99, + 69, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 97, 95, 69, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 71, 68, 68, 68, + 68, 68, 68, 68, 68, 73, 74, 75, + 76, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 85, 86, 87, 68, 68, + 68, 68, 68, 89, 90, 91, 94, 68, + 102, 103, 101, 3, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 105, 104, 106, + 107, 68, 71, 68, 68, 68, 68, 68, + 68, 68, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, + 68, 122, 123, 124, 68, 58, 59, 68, + 125, 126, 127, 128, 129, 68, 68, 68, + 68, 130, 68, 106, 107, 68, 71, 68, + 68, 68, 68, 68, 68, 68, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 118, + 118, 119, 120, 121, 68, 122, 123, 124, + 68, 68, 68, 68, 125, 126, 127, 128, + 129, 68, 68, 68, 68, 130, 68, 106, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 71, 68, 68, 68, + 68, 68, 68, 68, 68, 109, 110, 111, + 112, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 122, 123, 124, 68, 68, + 68, 68, 68, 126, 127, 128, 131, 68, + 68, 68, 68, 109, 68, 71, 68, 68, + 68, 68, 68, 68, 68, 68, 109, 110, + 111, 112, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 122, 123, 124, 68, + 68, 68, 68, 68, 126, 127, 128, 131, + 68, 71, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 110, 111, 112, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 126, 127, 128, 68, 71, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 111, + 112, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 126, 127, 128, 68, 71, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 112, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 126, 127, + 128, 68, 71, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 126, 127, 68, 71, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 127, 68, 71, 68, + 71, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 110, 111, 112, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 122, + 123, 124, 68, 68, 68, 68, 68, 126, + 127, 128, 131, 68, 71, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 110, 111, + 112, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 123, 124, 68, 68, + 68, 68, 68, 126, 127, 128, 131, 68, + 71, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 110, 111, 112, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 124, 68, 68, 68, 68, 68, 126, + 127, 128, 131, 68, 132, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, + 95, 97, 95, 71, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 110, 111, 112, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 126, 127, 128, 131, 68, 71, + 68, 68, 68, 68, 68, 68, 68, 108, + 109, 110, 111, 112, 68, 68, 68, 68, + 68, 68, 119, 120, 121, 68, 122, 123, + 124, 68, 68, 68, 68, 68, 126, 127, + 128, 131, 68, 68, 68, 68, 109, 68, + 71, 68, 68, 68, 68, 68, 68, 68, + 68, 109, 110, 111, 112, 68, 68, 68, + 68, 68, 68, 119, 120, 121, 68, 122, + 123, 124, 68, 68, 68, 68, 68, 126, + 127, 128, 131, 68, 68, 68, 68, 109, + 68, 71, 68, 68, 68, 68, 68, 68, + 68, 68, 109, 110, 111, 112, 68, 68, + 68, 68, 68, 68, 68, 120, 121, 68, + 122, 123, 124, 68, 68, 68, 68, 68, + 126, 127, 128, 131, 68, 68, 68, 68, + 109, 68, 71, 68, 68, 68, 68, 68, + 68, 68, 68, 109, 110, 111, 112, 68, + 68, 68, 68, 68, 68, 68, 68, 121, + 68, 122, 123, 124, 68, 68, 68, 68, + 68, 126, 127, 128, 131, 68, 68, 68, + 68, 109, 68, 133, 68, 71, 68, 68, + 68, 68, 68, 68, 68, 108, 109, 110, + 111, 112, 68, 114, 115, 68, 68, 68, + 119, 120, 121, 68, 122, 123, 124, 68, + 68, 68, 68, 68, 126, 127, 128, 131, + 68, 68, 68, 68, 109, 68, 71, 68, + 68, 68, 68, 68, 68, 68, 68, 109, + 110, 111, 112, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 122, 123, 124, + 68, 68, 68, 68, 68, 126, 127, 128, + 131, 68, 68, 68, 68, 109, 68, 133, + 68, 71, 68, 68, 68, 68, 68, 68, + 68, 108, 109, 110, 111, 112, 68, 68, + 115, 68, 68, 68, 119, 120, 121, 68, + 122, 123, 124, 68, 68, 68, 68, 68, + 126, 127, 128, 131, 68, 68, 68, 68, + 109, 68, 133, 68, 71, 68, 68, 68, + 68, 68, 68, 68, 108, 109, 110, 111, + 112, 68, 68, 68, 68, 68, 68, 119, + 120, 121, 68, 122, 123, 124, 68, 68, + 68, 68, 68, 126, 127, 128, 131, 68, + 68, 68, 68, 109, 68, 133, 68, 71, + 68, 68, 68, 68, 68, 68, 68, 108, + 109, 110, 111, 112, 113, 114, 115, 68, + 68, 68, 119, 120, 121, 68, 122, 123, + 124, 68, 68, 68, 68, 68, 126, 127, + 128, 131, 68, 68, 68, 68, 109, 68, + 106, 107, 68, 71, 68, 68, 68, 68, + 68, 68, 68, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 68, 118, 119, 120, + 121, 68, 122, 123, 124, 68, 68, 68, + 68, 125, 126, 127, 128, 129, 68, 68, + 68, 68, 130, 68, 106, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 100, 99, 106, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, + 97, 95, 106, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 71, + 68, 68, 68, 68, 68, 68, 68, 68, + 109, 110, 111, 112, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 122, 123, + 124, 68, 68, 68, 68, 68, 126, 127, + 128, 131, 68, 106, 107, 68, 71, 68, + 68, 68, 68, 68, 68, 68, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 68, 122, 123, 124, + 68, 68, 68, 68, 125, 126, 127, 128, + 129, 68, 68, 68, 68, 130, 68, 5, + 6, 134, 8, 134, 134, 134, 134, 134, + 134, 134, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 20, 20, 21, 22, 23, + 134, 24, 25, 26, 134, 134, 134, 134, + 30, 31, 32, 33, 30, 134, 134, 134, + 134, 36, 134, 5, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 8, 134, 134, 134, 134, 134, 134, 134, + 134, 11, 12, 13, 14, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 24, + 25, 26, 134, 134, 134, 134, 134, 31, + 32, 33, 135, 134, 134, 134, 134, 11, + 134, 8, 134, 134, 134, 134, 134, 134, + 134, 134, 11, 12, 13, 14, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 24, 25, 26, 134, 134, 134, 134, 134, + 31, 32, 33, 135, 134, 8, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 12, + 13, 14, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 31, 32, 33, 134, + 8, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 13, 14, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 31, + 32, 33, 134, 8, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 14, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 31, 32, 33, 134, 8, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 31, 32, 134, + 8, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 32, 134, 8, 134, 8, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 12, 13, + 14, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 24, 25, 26, 134, 134, + 134, 134, 134, 31, 32, 33, 135, 134, + 8, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 12, 13, 14, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 25, 26, 134, 134, 134, 134, 134, 31, + 32, 33, 135, 134, 8, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 12, 13, + 14, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 26, 134, 134, + 134, 134, 134, 31, 32, 33, 135, 134, + 136, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 8, 134, 8, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 12, 13, 14, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 31, 32, + 33, 135, 134, 8, 134, 134, 134, 134, + 134, 134, 134, 10, 11, 12, 13, 14, + 134, 134, 134, 134, 134, 134, 21, 22, + 23, 134, 24, 25, 26, 134, 134, 134, + 134, 134, 31, 32, 33, 135, 134, 134, + 134, 134, 11, 134, 8, 134, 134, 134, + 134, 134, 134, 134, 134, 11, 12, 13, + 14, 134, 134, 134, 134, 134, 134, 21, + 22, 23, 134, 24, 25, 26, 134, 134, + 134, 134, 134, 31, 32, 33, 135, 134, + 134, 134, 134, 11, 134, 8, 134, 134, + 134, 134, 134, 134, 134, 134, 11, 12, + 13, 14, 134, 134, 134, 134, 134, 134, + 134, 22, 23, 134, 24, 25, 26, 134, + 134, 134, 134, 134, 31, 32, 33, 135, + 134, 134, 134, 134, 11, 134, 8, 134, + 134, 134, 134, 134, 134, 134, 134, 11, + 12, 13, 14, 134, 134, 134, 134, 134, + 134, 134, 134, 23, 134, 24, 25, 26, + 134, 134, 134, 134, 134, 31, 32, 33, + 135, 134, 134, 134, 134, 11, 134, 137, + 134, 8, 134, 134, 134, 134, 134, 134, + 134, 10, 11, 12, 13, 14, 134, 16, + 17, 134, 134, 134, 21, 22, 23, 134, + 24, 25, 26, 134, 134, 134, 134, 134, + 31, 32, 33, 135, 134, 134, 134, 134, + 11, 134, 8, 134, 134, 134, 134, 134, + 134, 134, 134, 11, 12, 13, 14, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 24, 25, 26, 134, 134, 134, 134, + 134, 31, 32, 33, 135, 134, 134, 134, + 134, 11, 134, 137, 134, 8, 134, 134, + 134, 134, 134, 134, 134, 10, 11, 12, + 13, 14, 134, 134, 17, 134, 134, 134, + 21, 22, 23, 134, 24, 25, 26, 134, + 134, 134, 134, 134, 31, 32, 33, 135, + 134, 134, 134, 134, 11, 134, 137, 134, + 8, 134, 134, 134, 134, 134, 134, 134, + 10, 11, 12, 13, 14, 134, 134, 134, + 134, 134, 134, 21, 22, 23, 134, 24, + 25, 26, 134, 134, 134, 134, 134, 31, + 32, 33, 135, 134, 134, 134, 134, 11, + 134, 137, 134, 8, 134, 134, 134, 134, + 134, 134, 134, 10, 11, 12, 13, 14, + 15, 16, 17, 134, 134, 134, 21, 22, + 23, 134, 24, 25, 26, 134, 134, 134, + 134, 134, 31, 32, 33, 135, 134, 134, + 134, 134, 11, 134, 5, 6, 134, 8, + 134, 134, 134, 134, 134, 134, 134, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 2, 23, 24, 25, - 2, 26, 27, 28, 29, 30, 31, 32, - 29, 33, 2, 34, 2, 35, 2, 37, - 38, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, - 36, 53, 54, 55, 36, 56, 57, 36, - 58, 59, 60, 61, 58, 36, 36, 36, - 36, 62, 36, 37, 38, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 49, - 49, 50, 51, 52, 36, 53, 54, 55, - 36, 36, 36, 36, 58, 59, 60, 61, - 58, 36, 36, 36, 36, 62, 36, 37, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 40, 41, 42, - 43, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 53, 54, 55, 36, 36, - 36, 36, 36, 59, 60, 61, 63, 36, - 36, 36, 36, 40, 36, 40, 41, 42, - 43, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 53, 54, 55, 36, 36, - 36, 36, 36, 59, 60, 61, 63, 36, - 41, 42, 43, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 59, 60, 61, - 36, 42, 43, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 59, 60, 61, - 36, 43, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 59, 60, 61, 36, - 59, 60, 36, 60, 36, 41, 42, 43, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 53, 54, 55, 36, 36, 36, - 36, 36, 59, 60, 61, 63, 36, 41, - 42, 43, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 54, 55, 36, - 36, 36, 36, 36, 59, 60, 61, 63, - 36, 41, 42, 43, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 55, 36, 36, 36, 36, 36, 59, 60, - 61, 63, 36, 64, 36, 41, 42, 43, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 59, 60, 61, 63, 36, 39, - 40, 41, 42, 43, 36, 36, 36, 36, - 36, 36, 50, 51, 52, 36, 53, 54, - 55, 36, 36, 36, 36, 36, 59, 60, - 61, 63, 36, 36, 36, 36, 40, 36, - 40, 41, 42, 43, 36, 36, 36, 36, - 36, 36, 50, 51, 52, 36, 53, 54, - 55, 36, 36, 36, 36, 36, 59, 60, - 61, 63, 36, 36, 36, 36, 40, 36, - 40, 41, 42, 43, 36, 36, 36, 36, - 36, 36, 36, 51, 52, 36, 53, 54, - 55, 36, 36, 36, 36, 36, 59, 60, - 61, 63, 36, 36, 36, 36, 40, 36, - 40, 41, 42, 43, 36, 36, 36, 36, - 36, 36, 36, 36, 52, 36, 53, 54, - 55, 36, 36, 36, 36, 36, 59, 60, - 61, 63, 36, 36, 36, 36, 40, 36, - 65, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 39, 40, 41, 42, 43, 36, - 45, 46, 36, 36, 36, 50, 51, 52, - 36, 53, 54, 55, 36, 36, 36, 36, - 36, 59, 60, 61, 63, 36, 36, 36, - 36, 40, 36, 40, 41, 42, 43, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 53, 54, 55, 36, 36, 36, 36, - 36, 59, 60, 61, 63, 36, 36, 36, - 36, 40, 36, 65, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 39, 40, 41, - 42, 43, 36, 36, 46, 36, 36, 36, - 50, 51, 52, 36, 53, 54, 55, 36, - 36, 36, 36, 36, 59, 60, 61, 63, - 36, 36, 36, 36, 40, 36, 65, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 39, 40, 41, 42, 43, 36, 36, 36, - 36, 36, 36, 50, 51, 52, 36, 53, - 54, 55, 36, 36, 36, 36, 36, 59, - 60, 61, 63, 36, 36, 36, 36, 40, - 36, 65, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 39, 40, 41, 42, 43, - 44, 45, 46, 36, 36, 36, 50, 51, - 52, 36, 53, 54, 55, 36, 36, 36, - 36, 36, 59, 60, 61, 63, 36, 36, - 36, 36, 40, 36, 37, 38, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 39, - 40, 41, 42, 43, 44, 45, 46, 47, - 36, 49, 50, 51, 52, 36, 53, 54, - 55, 36, 36, 36, 36, 58, 59, 60, - 61, 58, 36, 36, 36, 36, 62, 36, - 37, 36, 37, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 40, 41, 42, 43, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 53, 54, - 55, 36, 36, 36, 36, 36, 59, 60, - 61, 63, 36, 37, 38, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 36, 53, 54, 55, - 36, 36, 36, 36, 58, 59, 60, 61, - 58, 36, 36, 36, 36, 62, 36, 56, - 57, 36, 57, 36, 67, 68, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 69, - 70, 71, 72, 73, 74, 75, 76, 77, - 1, 78, 79, 80, 81, 66, 82, 83, - 84, 66, 66, 66, 66, 85, 86, 87, - 88, 89, 66, 66, 66, 66, 90, 66, - 67, 68, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 78, 79, 80, - 81, 66, 82, 83, 84, 66, 66, 66, - 66, 85, 86, 87, 88, 89, 66, 66, - 66, 66, 90, 66, 67, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 70, 71, 72, 73, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 82, 83, 84, 66, 66, 66, 66, 66, - 86, 87, 88, 91, 66, 66, 66, 66, - 70, 66, 70, 71, 72, 73, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 82, 83, 84, 66, 66, 66, 66, 66, - 86, 87, 88, 91, 66, 71, 72, 73, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 86, 87, 88, 66, 72, 73, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 86, 87, 88, 66, 73, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 86, 87, 88, 66, 86, 87, 66, - 87, 66, 71, 72, 73, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 82, - 83, 84, 66, 66, 66, 66, 66, 86, - 87, 88, 91, 66, 71, 72, 73, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 83, 84, 66, 66, 66, 66, - 66, 86, 87, 88, 91, 66, 71, 72, - 73, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 84, 66, 66, - 66, 66, 66, 86, 87, 88, 91, 66, - 93, 92, 71, 72, 73, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 86, - 87, 88, 91, 66, 69, 70, 71, 72, - 73, 66, 66, 66, 66, 66, 66, 79, - 80, 81, 66, 82, 83, 84, 66, 66, - 66, 66, 66, 86, 87, 88, 91, 66, - 66, 66, 66, 70, 66, 70, 71, 72, - 73, 66, 66, 66, 66, 66, 66, 79, - 80, 81, 66, 82, 83, 84, 66, 66, - 66, 66, 66, 86, 87, 88, 91, 66, - 66, 66, 66, 70, 66, 70, 71, 72, - 73, 66, 66, 66, 66, 66, 66, 66, - 80, 81, 66, 82, 83, 84, 66, 66, - 66, 66, 66, 86, 87, 88, 91, 66, - 66, 66, 66, 70, 66, 70, 71, 72, - 73, 66, 66, 66, 66, 66, 66, 66, - 66, 81, 66, 82, 83, 84, 66, 66, - 66, 66, 66, 86, 87, 88, 91, 66, - 66, 66, 66, 70, 66, 94, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 69, - 70, 71, 72, 73, 66, 75, 76, 66, - 66, 66, 79, 80, 81, 66, 82, 83, - 84, 66, 66, 66, 66, 66, 86, 87, - 88, 91, 66, 66, 66, 66, 70, 66, - 70, 71, 72, 73, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 82, 83, - 84, 66, 66, 66, 66, 66, 86, 87, - 88, 91, 66, 66, 66, 66, 70, 66, - 94, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 69, 70, 71, 72, 73, 66, - 66, 76, 66, 66, 66, 79, 80, 81, - 66, 82, 83, 84, 66, 66, 66, 66, - 66, 86, 87, 88, 91, 66, 66, 66, - 66, 70, 66, 94, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 69, 70, 71, - 72, 73, 66, 66, 66, 66, 66, 66, - 79, 80, 81, 66, 82, 83, 84, 66, - 66, 66, 66, 66, 86, 87, 88, 91, - 66, 66, 66, 66, 70, 66, 94, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 69, 70, 71, 72, 73, 74, 75, 76, - 66, 66, 66, 79, 80, 81, 66, 82, - 83, 84, 66, 66, 66, 66, 66, 86, - 87, 88, 91, 66, 66, 66, 66, 70, - 66, 67, 68, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 66, 78, 79, - 80, 81, 66, 82, 83, 84, 66, 66, - 66, 66, 85, 86, 87, 88, 89, 66, - 66, 66, 66, 90, 66, 67, 95, 67, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 70, 71, 72, - 73, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 82, 83, 84, 66, 66, - 66, 66, 66, 86, 87, 88, 91, 66, - 97, 96, 3, 98, 99, 100, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 101, - 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 66, 115, 116, - 117, 66, 56, 57, 66, 118, 119, 120, - 88, 121, 66, 66, 66, 66, 122, 66, - 99, 100, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 111, 111, 112, 113, - 114, 66, 115, 116, 117, 66, 66, 66, - 66, 118, 119, 120, 88, 121, 66, 66, - 66, 66, 122, 66, 99, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 102, 103, 104, 105, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 115, 116, 117, 66, 66, 66, 66, 66, - 119, 120, 88, 123, 66, 66, 66, 66, - 102, 66, 102, 103, 104, 105, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 115, 116, 117, 66, 66, 66, 66, 66, - 119, 120, 88, 123, 66, 103, 104, 105, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 119, 120, 88, 66, 104, 105, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 119, 120, 88, 66, 105, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 119, 120, 88, 66, 119, 120, 66, - 120, 66, 103, 104, 105, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 115, - 116, 117, 66, 66, 66, 66, 66, 119, - 120, 88, 123, 66, 103, 104, 105, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 116, 117, 66, 66, 66, 66, - 66, 119, 120, 88, 123, 66, 103, 104, - 105, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 117, 66, 66, - 66, 66, 66, 119, 120, 88, 123, 66, - 124, 92, 103, 104, 105, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 119, - 120, 88, 123, 66, 101, 102, 103, 104, - 105, 66, 66, 66, 66, 66, 66, 112, - 113, 114, 66, 115, 116, 117, 66, 66, - 66, 66, 66, 119, 120, 88, 123, 66, - 66, 66, 66, 102, 66, 102, 103, 104, - 105, 66, 66, 66, 66, 66, 66, 112, - 113, 114, 66, 115, 116, 117, 66, 66, - 66, 66, 66, 119, 120, 88, 123, 66, - 66, 66, 66, 102, 66, 102, 103, 104, - 105, 66, 66, 66, 66, 66, 66, 66, - 113, 114, 66, 115, 116, 117, 66, 66, - 66, 66, 66, 119, 120, 88, 123, 66, - 66, 66, 66, 102, 66, 102, 103, 104, - 105, 66, 66, 66, 66, 66, 66, 66, - 66, 114, 66, 115, 116, 117, 66, 66, - 66, 66, 66, 119, 120, 88, 123, 66, - 66, 66, 66, 102, 66, 125, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 101, - 102, 103, 104, 105, 66, 107, 108, 66, - 66, 66, 112, 113, 114, 66, 115, 116, - 117, 66, 66, 66, 66, 66, 119, 120, - 88, 123, 66, 66, 66, 66, 102, 66, - 102, 103, 104, 105, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 115, 116, - 117, 66, 66, 66, 66, 66, 119, 120, - 88, 123, 66, 66, 66, 66, 102, 66, - 125, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 101, 102, 103, 104, 105, 66, - 66, 108, 66, 66, 66, 112, 113, 114, - 66, 115, 116, 117, 66, 66, 66, 66, - 66, 119, 120, 88, 123, 66, 66, 66, - 66, 102, 66, 125, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 101, 102, 103, - 104, 105, 66, 66, 66, 66, 66, 66, - 112, 113, 114, 66, 115, 116, 117, 66, - 66, 66, 66, 66, 119, 120, 88, 123, - 66, 66, 66, 66, 102, 66, 125, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 101, 102, 103, 104, 105, 106, 107, 108, - 66, 66, 66, 112, 113, 114, 66, 115, - 116, 117, 66, 66, 66, 66, 66, 119, - 120, 88, 123, 66, 66, 66, 66, 102, - 66, 99, 100, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 66, 111, 112, - 113, 114, 66, 115, 116, 117, 66, 66, - 66, 66, 118, 119, 120, 88, 121, 66, - 66, 66, 66, 122, 66, 99, 95, 99, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 102, 103, 104, - 105, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 115, 116, 117, 66, 66, - 66, 66, 66, 119, 120, 88, 123, 66, - 99, 100, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, - 114, 66, 115, 116, 117, 66, 66, 66, - 66, 118, 119, 120, 88, 121, 66, 66, - 66, 66, 122, 66, 5, 6, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 9, + 134, 20, 21, 22, 23, 134, 24, 25, + 26, 134, 134, 134, 134, 30, 31, 32, + 33, 30, 134, 134, 134, 134, 36, 134, + 5, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 8, 134, 5, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 8, 134, 134, 134, + 134, 134, 134, 134, 134, 11, 12, 13, + 14, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 24, 25, 26, 134, 134, + 134, 134, 134, 31, 32, 33, 135, 134, + 138, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 8, 134, 7, 8, 134, 1, + 134, 134, 134, 1, 134, 134, 134, 134, + 134, 5, 6, 7, 8, 134, 134, 134, + 134, 134, 134, 134, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 134, 24, 25, 26, 134, 27, + 28, 134, 30, 31, 32, 33, 30, 134, + 134, 134, 134, 36, 134, 5, 6, 134, + 8, 134, 134, 134, 134, 134, 134, 134, 10, 11, 12, 13, 14, 15, 16, 17, - 19, 19, 20, 21, 22, 126, 23, 24, - 25, 126, 126, 126, 126, 29, 30, 31, - 32, 29, 126, 126, 126, 126, 35, 126, - 5, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 10, 11, - 12, 13, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 23, 24, 25, 126, - 126, 126, 126, 126, 30, 31, 32, 127, - 126, 126, 126, 126, 10, 126, 10, 11, - 12, 13, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 23, 24, 25, 126, - 126, 126, 126, 126, 30, 31, 32, 127, - 126, 11, 12, 13, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 30, 31, - 32, 126, 12, 13, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 30, 31, - 32, 126, 13, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 30, 31, 32, - 126, 30, 31, 126, 31, 126, 11, 12, - 13, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 23, 24, 25, 126, 126, - 126, 126, 126, 30, 31, 32, 127, 126, - 11, 12, 13, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 24, 25, - 126, 126, 126, 126, 126, 30, 31, 32, - 127, 126, 11, 12, 13, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 25, 126, 126, 126, 126, 126, 30, - 31, 32, 127, 126, 128, 126, 11, 12, - 13, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 30, 31, 32, 127, 126, - 9, 10, 11, 12, 13, 126, 126, 126, - 126, 126, 126, 20, 21, 22, 126, 23, - 24, 25, 126, 126, 126, 126, 126, 30, - 31, 32, 127, 126, 126, 126, 126, 10, - 126, 10, 11, 12, 13, 126, 126, 126, - 126, 126, 126, 20, 21, 22, 126, 23, - 24, 25, 126, 126, 126, 126, 126, 30, - 31, 32, 127, 126, 126, 126, 126, 10, - 126, 10, 11, 12, 13, 126, 126, 126, - 126, 126, 126, 126, 21, 22, 126, 23, - 24, 25, 126, 126, 126, 126, 126, 30, - 31, 32, 127, 126, 126, 126, 126, 10, - 126, 10, 11, 12, 13, 126, 126, 126, - 126, 126, 126, 126, 126, 22, 126, 23, - 24, 25, 126, 126, 126, 126, 126, 30, - 31, 32, 127, 126, 126, 126, 126, 10, - 126, 129, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 9, 10, 11, 12, 13, - 126, 15, 16, 126, 126, 126, 20, 21, - 22, 126, 23, 24, 25, 126, 126, 126, - 126, 126, 30, 31, 32, 127, 126, 126, - 126, 126, 10, 126, 10, 11, 12, 13, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 23, 24, 25, 126, 126, 126, - 126, 126, 30, 31, 32, 127, 126, 126, - 126, 126, 10, 126, 129, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 9, 10, - 11, 12, 13, 126, 126, 16, 126, 126, - 126, 20, 21, 22, 126, 23, 24, 25, - 126, 126, 126, 126, 126, 30, 31, 32, - 127, 126, 126, 126, 126, 10, 126, 129, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 9, 10, 11, 12, 13, 126, 126, - 126, 126, 126, 126, 20, 21, 22, 126, - 23, 24, 25, 126, 126, 126, 126, 126, - 30, 31, 32, 127, 126, 126, 126, 126, - 10, 126, 129, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 9, 10, 11, 12, - 13, 14, 15, 16, 126, 126, 126, 20, - 21, 22, 126, 23, 24, 25, 126, 126, - 126, 126, 126, 30, 31, 32, 127, 126, - 126, 126, 126, 10, 126, 5, 6, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 9, 10, 11, 12, 13, 14, 15, 16, - 17, 126, 19, 20, 21, 22, 126, 23, - 24, 25, 126, 126, 126, 126, 29, 30, - 31, 32, 29, 126, 126, 126, 126, 35, - 126, 5, 126, 5, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 10, 11, 12, 13, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 23, - 24, 25, 126, 126, 126, 126, 126, 30, - 31, 32, 127, 126, 130, 126, 7, 126, - 1, 126, 126, 126, 1, 126, 126, 126, - 126, 126, 5, 6, 7, 126, 126, 126, - 126, 126, 126, 126, 126, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 126, 23, 24, 25, 126, - 26, 27, 126, 29, 30, 31, 32, 29, - 126, 126, 126, 126, 35, 126, 5, 6, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 126, - 23, 24, 25, 126, 126, 126, 126, 29, - 30, 31, 32, 29, 126, 126, 126, 126, - 35, 126, 26, 27, 126, 27, 126, 1, - 131, 131, 131, 1, 131, 133, 132, 33, - 132, 33, 133, 132, 133, 132, 33, 132, - 34, 132, 0 + 18, 19, 20, 21, 22, 23, 134, 24, + 25, 26, 134, 134, 134, 134, 30, 31, + 32, 33, 30, 134, 134, 134, 134, 36, + 134, 8, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 27, 28, 134, 8, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 28, 134, 1, 139, 139, + 139, 1, 139, 141, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 142, + 140, 34, 140, 141, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 34, 142, + 140, 142, 140, 141, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 34, 140, + 35, 140, 0 }; static const char _use_syllable_machine_trans_targs[] = { - 1, 30, 0, 56, 58, 85, 86, 110, - 112, 98, 87, 88, 89, 90, 102, 104, - 105, 106, 113, 107, 99, 100, 101, 93, - 94, 95, 114, 115, 116, 108, 91, 92, - 0, 117, 119, 109, 0, 2, 3, 15, - 4, 5, 6, 7, 19, 21, 22, 23, - 27, 24, 16, 17, 18, 10, 11, 12, - 28, 29, 25, 8, 9, 0, 26, 13, - 14, 20, 0, 31, 32, 44, 33, 34, - 35, 36, 48, 50, 51, 52, 53, 45, - 46, 47, 39, 40, 41, 54, 37, 38, - 0, 54, 55, 42, 0, 43, 49, 0, - 0, 57, 0, 59, 60, 72, 61, 62, - 63, 64, 76, 78, 79, 80, 84, 81, - 73, 74, 75, 67, 68, 69, 82, 65, - 66, 82, 83, 70, 71, 77, 0, 96, - 97, 103, 111, 0, 0, 118 + 1, 31, 0, 59, 61, 90, 91, 116, + 0, 118, 104, 92, 93, 94, 95, 108, + 110, 111, 112, 119, 113, 105, 106, 107, + 99, 100, 101, 120, 121, 122, 114, 96, + 97, 98, 123, 125, 115, 0, 2, 3, + 0, 16, 4, 5, 6, 7, 20, 22, + 23, 24, 28, 25, 17, 18, 19, 11, + 12, 13, 29, 30, 26, 8, 9, 10, + 27, 14, 15, 21, 0, 32, 33, 0, + 46, 34, 35, 36, 37, 50, 52, 53, + 54, 55, 47, 48, 49, 41, 42, 43, + 56, 38, 39, 40, 57, 58, 44, 0, + 45, 0, 51, 0, 0, 0, 60, 0, + 0, 0, 62, 63, 76, 64, 65, 66, + 67, 80, 82, 83, 84, 89, 85, 77, + 78, 79, 71, 72, 73, 86, 68, 69, + 70, 87, 88, 74, 75, 81, 0, 102, + 103, 109, 117, 0, 0, 0, 124 }; static const char _use_syllable_machine_trans_actions[] = { 0, 0, 3, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 0, 0, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 6, 0, 0, - 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 8, 0, 0, - 9, 10, 0, 0, 11, 0, 0, 12, - 13, 0, 14, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, + 0, 10, 0, 11, 12, 13, 0, 14, + 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 8, 0, - 0, 10, 0, 0, 0, 0, 15, 0, - 0, 0, 0, 16, 17, 0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 17, 0, + 0, 0, 0, 18, 19, 20, 0 }; static const char _use_syllable_machine_to_state_actions[] = { @@ -631,7 +777,8 @@ static const char _use_syllable_machine_to_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 }; static const char _use_syllable_machine_from_state_actions[] = { @@ -649,25 +796,27 @@ static const char _use_syllable_machine_from_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 }; static const short _use_syllable_machine_eof_trans[] = { - 0, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 93, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 96, 67, - 97, 99, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 93, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 96, 67, 67, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 132, 133, 133, 133 + 0, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 96, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 100, 96, 69, 102, 105, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 96, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 100, 96, + 69, 69, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 140, 141, 141, 141 }; static const int use_syllable_machine_start = 0; @@ -780,7 +929,7 @@ find_syllables_use (hb_buffer_t *buffer) unsigned int act HB_UNUSED; int cs; -#line 773 "hb-ot-shaper-use-machine.hh" +#line 933 "hb-ot-shaper-use-machine.hh" { cs = use_syllable_machine_start; ts = 0; @@ -793,7 +942,7 @@ find_syllables_use (hb_buffer_t *buffer) unsigned int syllable_serial = 1; -#line 782 "hb-ot-shaper-use-machine.hh" +#line 946 "hb-ot-shaper-use-machine.hh" { int _slen; int _trans; @@ -807,7 +956,7 @@ _resume: #line 1 "NONE" {ts = p;} break; -#line 794 "hb-ot-shaper-use-machine.hh" +#line 960 "hb-ot-shaper-use-machine.hh" } _keys = _use_syllable_machine_trans_keys + (cs<<1); @@ -825,14 +974,34 @@ _eof_trans: goto _again; switch ( _use_syllable_machine_trans_actions[_trans] ) { - case 9: + case 12: +#line 170 "hb-ot-shaper-use-machine.rl" + {te = p+1;{ found_syllable (use_virama_terminated_cluster); }} + break; + case 10: +#line 171 "hb-ot-shaper-use-machine.rl" + {te = p+1;{ found_syllable (use_sakot_terminated_cluster); }} + break; + case 8: #line 172 "hb-ot-shaper-use-machine.rl" {te = p+1;{ found_syllable (use_standard_cluster); }} break; + case 16: +#line 173 "hb-ot-shaper-use-machine.rl" + {te = p+1;{ found_syllable (use_number_joiner_terminated_cluster); }} + break; + case 14: +#line 174 "hb-ot-shaper-use-machine.rl" + {te = p+1;{ found_syllable (use_numeral_cluster); }} + break; case 6: #line 175 "hb-ot-shaper-use-machine.rl" {te = p+1;{ found_syllable (use_symbol_cluster); }} break; + case 20: +#line 176 "hb-ot-shaper-use-machine.rl" + {te = p+1;{ found_syllable (use_hieroglyph_cluster); }} + break; case 4: #line 177 "hb-ot-shaper-use-machine.rl" {te = p+1;{ found_syllable (use_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }} @@ -842,6 +1011,10 @@ _eof_trans: {te = p+1;{ found_syllable (use_non_cluster); }} break; case 11: +#line 170 "hb-ot-shaper-use-machine.rl" + {te = p;p--;{ found_syllable (use_virama_terminated_cluster); }} + break; + case 9: #line 171 "hb-ot-shaper-use-machine.rl" {te = p;p--;{ found_syllable (use_sakot_terminated_cluster); }} break; @@ -849,7 +1022,7 @@ _eof_trans: #line 172 "hb-ot-shaper-use-machine.rl" {te = p;p--;{ found_syllable (use_standard_cluster); }} break; - case 14: + case 15: #line 173 "hb-ot-shaper-use-machine.rl" {te = p;p--;{ found_syllable (use_number_joiner_terminated_cluster); }} break; @@ -861,43 +1034,19 @@ _eof_trans: #line 175 "hb-ot-shaper-use-machine.rl" {te = p;p--;{ found_syllable (use_symbol_cluster); }} break; - case 17: + case 19: #line 176 "hb-ot-shaper-use-machine.rl" {te = p;p--;{ found_syllable (use_hieroglyph_cluster); }} break; - case 15: + case 17: #line 177 "hb-ot-shaper-use-machine.rl" {te = p;p--;{ found_syllable (use_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }} break; - case 16: + case 18: #line 178 "hb-ot-shaper-use-machine.rl" {te = p;p--;{ found_syllable (use_non_cluster); }} break; - case 12: -#line 1 "NONE" - { switch( act ) { - case 1: - {{p = ((te))-1;} found_syllable (use_virama_terminated_cluster); } - break; - case 2: - {{p = ((te))-1;} found_syllable (use_sakot_terminated_cluster); } - break; - } - } - break; - case 8: -#line 1 "NONE" - {te = p+1;} -#line 170 "hb-ot-shaper-use-machine.rl" - {act = 1;} - break; - case 10: -#line 1 "NONE" - {te = p+1;} -#line 171 "hb-ot-shaper-use-machine.rl" - {act = 2;} - break; -#line 866 "hb-ot-shaper-use-machine.hh" +#line 1050 "hb-ot-shaper-use-machine.hh" } _again: @@ -906,7 +1055,7 @@ _again: #line 1 "NONE" {ts = 0;} break; -#line 873 "hb-ot-shaper-use-machine.hh" +#line 1059 "hb-ot-shaper-use-machine.hh" } if ( ++p != pe ) diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-use-table.hh b/thirdparty/harfbuzz/src/hb-ot-shaper-use-table.hh index e45ea30e60..6395d689ae 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-use-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-use-table.hh @@ -6,18 +6,18 @@ * * on files with these headers: * - * # IndicSyllabicCategory-14.0.0.txt - * # Date: 2021-05-22, 01:01:00 GMT [KW, RP] - * # IndicPositionalCategory-14.0.0.txt - * # Date: 2021-05-22, 01:01:00 GMT [KW, RP] - * # ArabicShaping-14.0.0.txt - * # Date: 2021-05-21, 01:54:00 GMT [KW, RP] - * # DerivedCoreProperties-14.0.0.txt - * # Date: 2021-08-12, 23:12:53 GMT - * # Blocks-14.0.0.txt - * # Date: 2021-01-22, 23:29:00 GMT [KW] - * # Scripts-14.0.0.txt - * # Date: 2021-07-10, 00:35:31 GMT + * # IndicSyllabicCategory-15.0.0.txt + * # Date: 2022-05-26, 02:18:00 GMT [KW, RP] + * # IndicPositionalCategory-15.0.0.txt + * # Date: 2022-05-26, 02:18:00 GMT [KW, RP] + * # ArabicShaping-15.0.0.txt + * # Date: 2022-02-14, 18:50:00 GMT [KW, RP] + * # DerivedCoreProperties-15.0.0.txt + * # Date: 2022-08-05, 22:17:05 GMT + * # Blocks-15.0.0.txt + * # Date: 2022-01-28, 20:58:00 GMT [KW] + * # Scripts-15.0.0.txt + * # Date: 2022-04-26, 23:15:02 GMT * # Override values For Indic_Syllabic_Category * # Not derivable * # Initial version based on Unicode 7.0 by Andrew Glass 2014-03-17 @@ -90,7 +90,7 @@ #pragma GCC diagnostic pop static const uint8_t -hb_use_u8[3083] = +hb_use_u8[3115] = { 16, 50, 51, 51, 51, 52, 51, 83, 118, 131, 51, 57, 58, 179, 195, 61, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, @@ -114,22 +114,22 @@ hb_use_u8[3083] = 47, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 48, 49, 2, 2, 2, 2, 2, 2, 2, 2, 50, 51, 2, 52, 2, 2, 53, 2, 2, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 2, 64, 65, 2, 66, 67, 68, 69, - 2, 70, 2, 71, 72, 73, 74, 2, 2, 75, 76, 77, 78, 2, 79, 2, - 2, 80, 80, 80, 80, 80, 80, 80, 80, 81, 2, 2, 2, 2, 2, 2, + 2, 70, 2, 71, 72, 73, 74, 2, 2, 75, 76, 77, 78, 2, 79, 80, + 2, 81, 81, 81, 81, 81, 81, 81, 81, 82, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 82, 83, 2, 2, 2, 2, 2, 2, 2, 84, - 85, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 80, 80, 80, 86, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 83, 84, 2, 2, 2, 2, 2, 2, 2, 85, + 86, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 81, 81, 81, 87, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 87, 88, 2, 2, 2, 2, 2, - 2, 2, 2, 89, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 88, 89, 2, 2, 2, 2, 2, + 2, 2, 2, 90, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 90, 2, 2, 91, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 92, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 93, 93, 94, 95, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 2, 2, 2, 91, 2, 2, 92, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 93, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 94, 94, 95, 96, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 2, 2, 2, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 4, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0, @@ -147,7 +147,7 @@ hb_use_u8[3083] = 7, 0, 0, 0, 2, 2, 2, 2, 2, 39, 40, 41, 0, 0, 0, 0, 0, 10, 13, 28, 2, 2, 2, 2, 28, 2, 28, 2, 2, 2, 2, 2, 2, 7, 2, 28, 2, 2, 0, 15, 16, 17, 18, 19, 25, 20, 33, 22, - 0, 0, 0, 0, 0, 28, 9, 39, 42, 10, 27, 28, 2, 2, 2, 7, + 0, 0, 0, 0, 0, 28, 39, 39, 42, 10, 27, 28, 2, 2, 2, 7, 28, 7, 2, 28, 2, 2, 0, 15, 43, 0, 0, 25, 20, 0, 0, 2, 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 44, 28, 2, 2, 7, 0, 2, 7, 2, 2, 0, 28, 7, 7, 2, 0, 28, 7, 0, 2, 7, 0, @@ -191,75 +191,77 @@ hb_use_u8[3083] = 43, 100, 12, 0, 0, 0, 0, 0, 0, 2, 2, 59, 16, 46, 21, 111, 100, 100, 100, 112, 113, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 28, 2, 9, 44, 114, 114, 114, 9, 114, 114, 13, 114, 114, 114, 24, 0, 38, - 0, 0, 0, 115, 116, 9, 3, 0, 0, 0, 0, 0, 0, 0, 117, 0, - 0, 0, 0, 0, 0, 0, 4, 118, 119, 40, 40, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 119, 119, 120, 119, 119, 119, 119, 119, 119, 119, - 119, 0, 0, 121, 0, 0, 0, 0, 0, 0, 5, 121, 0, 0, 0, 0, + 0, 0, 0, 115, 49, 9, 3, 0, 0, 0, 0, 0, 0, 0, 116, 0, + 0, 0, 0, 0, 0, 0, 4, 117, 118, 40, 40, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 118, 118, 119, 118, 118, 118, 118, 118, 118, 118, + 118, 0, 0, 120, 0, 0, 0, 0, 0, 0, 5, 120, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 2, 2, 2, 2, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, - 122, 2, 51, 2, 106, 2, 8, 2, 2, 2, 63, 17, 14, 0, 0, 29, + 121, 2, 51, 2, 106, 2, 8, 2, 2, 2, 63, 17, 14, 0, 0, 29, 0, 2, 2, 0, 0, 0, 0, 0, 0, 27, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 123, 21, 21, 21, 21, 21, 21, 21, 124, 0, 0, 0, 0, + 2, 2, 2, 122, 21, 21, 21, 21, 21, 21, 21, 123, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 0, 0, 0, 0, 0, - 50, 2, 2, 2, 20, 20, 125, 114, 0, 2, 2, 2, 126, 18, 57, 18, - 111, 100, 127, 0, 0, 0, 0, 0, 0, 9, 128, 2, 2, 2, 2, 2, - 2, 2, 129, 21, 20, 18, 46, 130, 131, 132, 0, 0, 0, 0, 0, 0, + 50, 2, 2, 2, 20, 20, 124, 114, 0, 2, 2, 2, 125, 18, 57, 18, + 111, 100, 126, 0, 0, 0, 0, 0, 0, 9, 127, 2, 2, 2, 2, 2, + 2, 2, 128, 21, 20, 18, 46, 129, 130, 131, 0, 0, 0, 0, 0, 0, 0, 2, 2, 50, 28, 2, 2, 2, 2, 2, 2, 2, 2, 8, 20, 57, - 97, 74, 133, 134, 135, 0, 0, 0, 0, 2, 136, 2, 2, 2, 2, 137, - 0, 28, 2, 40, 3, 0, 77, 13, 2, 51, 20, 138, 50, 51, 2, 2, - 103, 8, 7, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 139, 19, - 23, 0, 0, 140, 141, 0, 0, 0, 0, 2, 63, 43, 21, 78, 45, 142, + 97, 74, 132, 133, 134, 0, 0, 0, 0, 2, 135, 2, 2, 2, 2, 136, + 0, 28, 2, 40, 3, 0, 77, 13, 2, 51, 20, 137, 50, 51, 2, 2, + 103, 8, 7, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 138, 19, + 23, 0, 0, 139, 140, 0, 0, 0, 0, 2, 63, 43, 21, 78, 45, 141, 0, 79, 79, 79, 79, 79, 79, 79, 79, 0, 0, 0, 0, 0, 0, 0, - 4, 119, 119, 119, 119, 120, 0, 0, 0, 2, 2, 2, 2, 2, 7, 2, + 4, 118, 118, 118, 118, 119, 0, 0, 0, 2, 2, 2, 2, 2, 7, 2, 2, 2, 7, 2, 28, 2, 2, 2, 2, 2, 28, 2, 2, 2, 28, 7, - 0, 126, 18, 25, 29, 0, 0, 143, 144, 2, 2, 28, 2, 28, 2, 2, - 2, 2, 2, 2, 0, 12, 35, 0, 145, 2, 2, 11, 35, 0, 28, 2, + 0, 125, 18, 25, 29, 0, 0, 142, 143, 2, 2, 28, 2, 28, 2, 2, + 2, 2, 2, 2, 0, 12, 35, 0, 144, 2, 2, 11, 35, 0, 28, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 2, 2, 7, 2, 2, 9, 39, 0, 0, 0, 0, 2, 2, 2, 2, 2, 25, 36, - 0, 2, 2, 2, 114, 114, 114, 114, 114, 146, 2, 7, 0, 0, 0, 0, + 0, 2, 2, 2, 114, 114, 114, 114, 114, 145, 2, 7, 0, 0, 0, 0, 0, 2, 12, 12, 0, 0, 0, 0, 0, 7, 2, 2, 7, 2, 2, 2, - 2, 28, 2, 7, 0, 28, 2, 0, 0, 147, 148, 149, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 20, 20, 18, 18, 18, 20, 20, 132, 0, 0, 0, - 0, 0, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 2, 2, 2, 2, - 2, 51, 50, 51, 0, 0, 0, 0, 151, 9, 72, 2, 2, 2, 2, 2, + 2, 28, 2, 7, 0, 28, 2, 0, 0, 146, 147, 148, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 20, 20, 18, 18, 18, 20, 20, 131, 0, 0, 0, + 0, 0, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 2, 2, 2, 2, + 2, 51, 50, 51, 0, 0, 0, 0, 150, 9, 72, 2, 2, 2, 2, 2, 2, 16, 17, 19, 14, 22, 35, 0, 0, 0, 29, 0, 0, 0, 0, 0, - 0, 9, 47, 2, 2, 2, 2, 2, 2, 2, 2, 2, 126, 18, 20, 152, - 20, 19, 153, 154, 2, 2, 2, 2, 2, 0, 0, 63, 155, 0, 0, 0, + 0, 9, 47, 2, 2, 2, 2, 2, 2, 2, 2, 2, 125, 18, 20, 151, + 20, 19, 152, 153, 2, 2, 2, 2, 2, 0, 0, 63, 154, 0, 0, 0, 0, 2, 11, 0, 0, 0, 0, 0, 0, 2, 63, 23, 18, 18, 18, 20, - 20, 106, 156, 0, 0, 157, 158, 29, 159, 28, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 21, 17, 20, 20, 160, 42, 0, 0, 0, - 44, 2, 2, 2, 7, 7, 2, 2, 28, 2, 2, 2, 2, 2, 2, 2, - 28, 2, 2, 2, 2, 2, 2, 2, 8, 16, 17, 19, 20, 161, 29, 0, - 0, 9, 9, 28, 2, 2, 2, 7, 28, 7, 2, 28, 2, 2, 56, 15, - 21, 14, 21, 45, 30, 31, 30, 32, 0, 0, 0, 0, 33, 0, 0, 0, - 2, 2, 21, 0, 9, 9, 9, 44, 0, 9, 9, 44, 0, 0, 0, 0, - 0, 2, 2, 63, 23, 18, 18, 18, 20, 21, 124, 13, 15, 0, 0, 0, - 0, 2, 2, 2, 2, 2, 0, 0, 162, 163, 0, 0, 0, 0, 0, 0, - 0, 16, 17, 18, 18, 64, 97, 23, 159, 9, 164, 7, 0, 0, 0, 0, - 0, 2, 2, 2, 2, 2, 2, 2, 63, 23, 18, 18, 0, 46, 46, 9, - 165, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 18, - 0, 21, 17, 18, 18, 19, 14, 80, 165, 36, 0, 0, 0, 0, 0, 0, - 0, 2, 2, 2, 2, 2, 8, 166, 23, 18, 20, 20, 164, 7, 0, 0, - 0, 2, 2, 2, 2, 2, 7, 41, 134, 21, 20, 18, 74, 19, 20, 0, - 0, 2, 2, 2, 7, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 16, - 17, 18, 19, 20, 103, 165, 35, 0, 0, 2, 2, 2, 7, 28, 0, 2, - 2, 2, 2, 28, 7, 2, 2, 2, 2, 21, 21, 16, 30, 31, 10, 167, - 168, 169, 170, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 2, - 2, 63, 23, 18, 18, 0, 20, 21, 27, 106, 0, 31, 0, 0, 0, 0, - 0, 50, 18, 20, 20, 20, 138, 2, 2, 2, 171, 172, 9, 13, 173, 70, - 174, 0, 0, 1, 145, 0, 0, 0, 0, 50, 18, 20, 14, 17, 18, 2, - 2, 2, 2, 156, 156, 156, 175, 175, 175, 175, 175, 175, 13, 176, 0, 28, - 0, 20, 18, 18, 29, 20, 20, 9, 165, 0, 59, 59, 59, 59, 59, 59, - 59, 64, 19, 80, 44, 0, 0, 0, 0, 2, 2, 2, 7, 2, 28, 2, - 2, 50, 20, 20, 29, 0, 36, 20, 25, 9, 158, 177, 173, 0, 0, 0, - 0, 2, 2, 2, 28, 7, 2, 2, 2, 2, 2, 2, 2, 2, 21, 21, - 45, 20, 33, 80, 66, 0, 0, 0, 0, 2, 178, 64, 45, 0, 0, 0, + 20, 106, 155, 0, 0, 156, 157, 29, 158, 28, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 21, 17, 20, 20, 159, 42, 0, 0, 0, + 47, 125, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 7, 7, 2, 2, + 28, 2, 2, 2, 2, 2, 2, 2, 28, 2, 2, 2, 2, 2, 2, 2, + 8, 16, 17, 19, 20, 160, 29, 0, 0, 9, 9, 28, 2, 2, 2, 7, + 28, 7, 2, 28, 2, 2, 56, 15, 21, 14, 21, 45, 30, 31, 30, 32, + 0, 0, 0, 0, 33, 0, 0, 0, 2, 2, 21, 0, 9, 9, 9, 44, + 0, 9, 9, 44, 0, 0, 0, 0, 0, 2, 2, 63, 23, 18, 18, 18, + 20, 21, 123, 13, 15, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, + 161, 162, 0, 0, 0, 0, 0, 0, 0, 16, 17, 18, 18, 64, 97, 23, + 158, 9, 163, 7, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, + 63, 23, 18, 18, 0, 46, 46, 9, 164, 35, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 2, 18, 0, 21, 17, 18, 18, 19, 14, 80, + 164, 36, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 8, 165, + 23, 18, 20, 20, 163, 7, 0, 0, 0, 2, 2, 2, 2, 2, 7, 41, + 133, 21, 20, 18, 74, 19, 20, 0, 0, 2, 2, 2, 7, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 2, 16, 17, 18, 19, 20, 103, 164, 35, 0, + 0, 2, 2, 2, 7, 28, 0, 2, 2, 2, 2, 28, 7, 2, 2, 2, + 2, 21, 21, 16, 30, 31, 10, 166, 167, 168, 169, 0, 0, 0, 0, 0, + 0, 2, 2, 2, 2, 0, 2, 2, 2, 63, 23, 18, 18, 0, 20, 21, + 27, 106, 0, 31, 0, 0, 0, 0, 0, 50, 18, 20, 20, 20, 137, 2, + 2, 2, 170, 171, 9, 13, 172, 70, 173, 0, 0, 1, 144, 0, 0, 0, + 0, 50, 18, 20, 14, 17, 18, 2, 2, 2, 2, 155, 155, 155, 174, 174, + 174, 174, 174, 174, 13, 175, 0, 28, 0, 20, 18, 18, 29, 20, 20, 9, + 164, 0, 59, 59, 59, 59, 59, 59, 59, 64, 19, 80, 44, 0, 0, 0, + 0, 2, 2, 2, 7, 2, 28, 2, 2, 50, 20, 20, 29, 0, 36, 20, + 25, 9, 157, 176, 172, 0, 0, 0, 0, 2, 2, 2, 28, 7, 2, 2, + 2, 2, 2, 2, 2, 2, 21, 21, 45, 20, 33, 80, 66, 0, 0, 0, + 0, 2, 177, 64, 45, 0, 0, 0, 0, 9, 178, 2, 2, 2, 2, 2, + 2, 2, 2, 21, 20, 18, 29, 0, 46, 14, 140, 0, 0, 0, 0, 0, 0, 179, 179, 179, 106, 7, 0, 0, 0, 9, 9, 9, 44, 0, 0, 0, 0, 2, 2, 2, 2, 2, 7, 0, 56, 180, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 38, 114, 24, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 56, - 35, 0, 4, 119, 119, 119, 120, 0, 0, 9, 9, 9, 47, 2, 2, 2, + 35, 0, 4, 118, 118, 118, 119, 0, 0, 9, 9, 9, 47, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 44, 2, 2, 2, 2, 2, 2, 9, 9, 2, 2, 42, 42, 42, 90, 0, 0, O, O, O, GB, B, B, GB, O, O, WJ,FMPst,FMPst, O, CGJ, B, @@ -268,7 +270,7 @@ hb_use_u8[3083] = VPst,VMBlw, O, O, VAbv, GB,VMAbv,VMPst,VMPst, O, B, VBlw, O, O, VPre, VPre, O, VPre, H, O, VPst,FMAbv, O,CMBlw, O, VAbv, O, VAbv, H, O,VMBlw,VMAbv, CMAbv, GB, GB, O, MBlw,CMAbv,CMAbv, VPst, VAbv,VMAbv, O, VPst, O, VPre, VPre,VMAbv, - B, O, CS, CS, O, B, VAbv, VAbv, B, R, O, HVM, O, O, FBlw, O, + B, O, CS, CS,VMPst, B, VAbv, VAbv, B, R, O, HVM, O, O, FBlw, O, CMAbv, O,CMBlw, VAbv, VBlw, B, SUB, SUB, SUB, O, SUB, SUB, O, FBlw, O, B, VPst, VBlw, VPre,VMAbv,VMBlw,VMPst, IS, VAbv, MPst, MPre, MBlw, MBlw, B, MBlw, MBlw, VPst, VMPst,VMPst, B, MBlw, VPst, VPre, VAbv, VAbv,VMPst,VMPst,VMBlw, B,VMPst, VBlw, VPst, CGJ, @@ -276,18 +278,18 @@ hb_use_u8[3083] = CGJ, WJ, CGJ, GB,CMAbv,CMAbv, B, GB, B, VAbv, SUB, FPst, FPst,VMBlw, FPst, FPst, FBlw,VMAbv,FMBlw, VAbv, VPre, B, MPre, MBlw, SUB, FAbv, FAbv, MAbv, SUB, Sk, VPst, VAbv, VMAbv,VMAbv, FAbv,CMAbv, VPst, H, B, O,SMAbv,SMBlw,SMAbv,SMAbv,SMAbv, VPst, IS, VBlw, - FAbv,VMPre,VMPre,FMAbv,CMBlw,VMBlw,VMBlw,VMAbv, CS, CS,VMPst, O,FMAbv, ZWNJ, CGJ, WJ, - WJ, WJ, O,FMPst, O, O, H, MPst, VPst, H,VMAbv, VAbv,VMBlw, B, VBlw, FPst, - VPst, FAbv,VMPst, B,CMAbv, VAbv, MBlw, MPst, MBlw, H, O, VBlw, MPst, MPre, MAbv, MBlw, - O, B, FAbv, FAbv, FPst, VBlw, B, B, VPre, O,VMPst, IS, O,VMPst, VBlw, VPst, - VMBlw,VMBlw,VMAbv, O, IS,VMBlw, B,VMPst,VMAbv,VMPst, CS, CS, B, N, N, O, - HN, VPre, VBlw, VAbv, IS,CMAbv, O, VPst, B, R, R, O,FMBlw,CMBlw, VAbv, VPre, - VMAbv,VMAbv, H, VAbv,CMBlw,FMAbv, B, CS, CS, H,CMBlw,VMPst, H,VMPst, VAbv,VMAbv, - VPst, IS, R, MPst, R, MPst,CMBlw, B,FMBlw, VBlw,VMAbv, R, MBlw, MBlw, GB, FBlw, - FBlw,CMAbv, IS, VBlw, IS, GB, VAbv, H, H, O, VBlw, + FAbv,VMPre,VMPre,FMAbv,CMBlw,VMBlw,VMBlw,VMAbv, CS, O,FMAbv, ZWNJ, CGJ, WJ, WJ, WJ, + O,FMPst, O, O, H, MPst, VPst, H,VMAbv, VAbv,VMBlw, B, VBlw, FPst, VPst, FAbv, + VMPst, B,CMAbv, VAbv, MBlw, MPst, MBlw, H, O, VBlw, MPst, MPre, MAbv, MBlw, O, B, + FAbv, FAbv, FPst, VBlw, B, B, VPre, O,VMPst, IS, O,VMPst, VBlw, VPst,VMBlw,VMBlw, + VMAbv, O, IS,VMBlw, B,VMPst,VMAbv,VMPst, CS, CS, B, N, N, O, HN, VPre, + VBlw, VAbv, IS,CMAbv, O, VPst, B, R, R, O,FMBlw,CMBlw, VAbv, VPre,VMAbv,VMAbv, + H, VAbv,CMBlw,FMAbv, B, CS, CS, H,CMBlw,VMPst, H,VMPst, VAbv,VMAbv, VPst, IS, + R, MPst, R, MPst,CMBlw, B,FMBlw, VBlw,VMAbv, R, MBlw, MBlw, GB, FBlw, FBlw,CMAbv, + IS, VBlw, IS, GB, VAbv, R,VMPst, H, H, O, VBlw, }; static const uint16_t -hb_use_u16[768] = +hb_use_u16[776] = { 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 3, 4, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, @@ -319,24 +321,25 @@ hb_use_u16[768] = 9, 9,173,170, 0, 0, 0, 0, 0, 0, 0, 9,174,175, 0, 9, 176, 0, 0,177,178, 0, 0, 0,179, 9, 9,180,181,182,183,184, 185, 9, 9,186,187, 0, 0, 0,188, 9,189,190,191, 9, 9,192, - 185, 9, 9,193,194,105,195,102, 9, 33,196,197, 0, 0, 0, 0, - 198,199, 94, 9, 9,200,201, 2,202, 20, 21,203,204,205,206,207, - 9, 9, 9,208,209,210,211, 0,195, 9, 9,212,213, 2, 0, 0, - 9, 9,214,215,216,217, 0, 0, 9, 9, 9,218,219, 2, 0, 0, - 9, 9,220,221, 2, 0, 0, 0, 9,222,223,103,224, 0, 0, 0, - 9, 9,225,226, 0, 0, 0, 0,227,228, 9,229,230, 2, 0, 0, - 0, 0,231, 9, 9,232,233, 0,234, 9, 9,235,236,237, 9, 9, - 238,239, 0, 0, 0, 0, 0, 0, 21, 9,214,240, 7, 9, 70, 18, - 9,241, 73,242, 0, 0, 0, 0,243, 9, 9,244,245, 2,246, 9, - 247,248, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,249, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 98,250, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 9, 9, 9,251, 0, 0, 0, 0, - 9, 9, 9, 9,252,253,254,254,255,256, 0, 0, 0, 0,257, 0, - 9, 9, 9, 9, 9,258, 0, 0, 9, 9, 9, 9, 9, 9,105, 70, - 94,259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,260, - 9, 9, 70,261,262, 0, 0, 0, 0, 9,263, 0, 9, 9,264, 2, - 9, 9, 9, 9,265, 2, 0, 0,129,129,129,129,129,129,129,129, - 160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,129, + 185, 9, 9,193,194,105,195,102, 9, 33,196,197,198, 0, 0, 0, + 199,200, 94, 9, 9,201,202, 2,203, 20, 21,204,205,206,207,208, + 9, 9, 9,209,210,211,212, 0,195, 9, 9,213,214, 2, 0, 0, + 9, 9,215,216,217,218, 0, 0, 9, 9, 9,219,220, 2, 0, 0, + 9, 9,221,222, 2, 0, 0, 0, 9,223,224,103,225, 0, 0, 0, + 9, 9,226,227, 0, 0, 0, 0,228,229, 9,230,231, 2, 0, 0, + 0, 0,232, 9, 9,233,234, 0,235, 9, 9,236,237,238, 9, 9, + 239,240, 0, 0, 0, 0, 0, 0, 21, 9,215,241, 7, 9, 70, 18, + 9,242, 73,243, 0, 0, 0, 0,244, 9, 9,245,246, 2,247, 9, + 248,249, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,250, + 251, 48, 9,252,253, 2, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 98,254, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 9, 9, 9,255, 0, 0, 0, 0, 9, 9, 9, 9,256,257,258,258, + 259,260, 0, 0, 0, 0,261, 0, 9, 9, 9, 9, 9,262, 0, 0, + 9, 9, 9, 9, 9, 9,105, 70, 94,263, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,264, 9, 9, 70,265,266, 0, 0, 0, + 0, 9,267, 0, 9, 9,268, 2, 9, 9, 9, 9,269, 2, 0, 0, + 129,129,129,129,129,129,129,129,160,160,160,160,160,160,160,160, + 160,160,160,160,160,160,160,129, }; static inline unsigned @@ -347,7 +350,7 @@ hb_use_b4 (const uint8_t* a, unsigned i) static inline uint_fast8_t hb_use_get_category (unsigned u) { - return u<921600u?hb_use_u8[2721+(((hb_use_u8[593+(((hb_use_u16[((hb_use_u8[113+(((hb_use_b4(hb_use_u8,u>>1>>3>>3>>5))<<5)+((u>>1>>3>>3)&31u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:O; + return u<921600u?hb_use_u8[2753+(((hb_use_u8[593+(((hb_use_u16[((hb_use_u8[113+(((hb_use_b4(hb_use_u8,u>>1>>3>>3>>5))<<5)+((u>>1>>3>>3)&31u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:O; } #undef B @@ -393,26 +396,5 @@ hb_use_get_category (unsigned u) #undef VMPre -#ifdef HB_USE_TABLE_MAIN -int main (int argc, char **argv) -{ - if (argc != 2) - { - for (unsigned u = 0; u < 0x10FFFFu; u++) - printf ("U+%04X %d\n", u, hb_use_get_category (u)); - return 0; - } - - hb_codepoint_t u; - sscanf (argv[1], "%x", &u); - - printf ("%d\n", hb_use_get_category (u)); - - return 0; -} - -#endif - - #endif /* HB_OT_SHAPER_USE_TABLE_HH */ /* == End of generated table == */ diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-vowel-constraints.cc b/thirdparty/harfbuzz/src/hb-ot-shaper-vowel-constraints.cc index be4ac813b1..cb4db4a8b2 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-vowel-constraints.cc +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-vowel-constraints.cc @@ -10,8 +10,8 @@ * # Date: 2015-03-12, 21:17:00 GMT [AG] * # Date: 2019-11-08, 23:22:00 GMT [AG] * - * # Scripts-14.0.0.txt - * # Date: 2021-07-10, 00:35:31 GMT + * # Scripts-15.0.0.txt + * # Date: 2022-04-26, 23:15:02 GMT */ #include "hb.hh" diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper.hh b/thirdparty/harfbuzz/src/hb-ot-shaper.hh index e160987f83..b2d1acb39b 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper.hh +++ b/thirdparty/harfbuzz/src/hb-ot-shaper.hh @@ -380,6 +380,10 @@ hb_ot_shaper_categorize (const hb_ot_shape_planner_t *planner) case HB_SCRIPT_TOTO: case HB_SCRIPT_VITHKUQI: + /* Unicode-15.0 additions */ + case HB_SCRIPT_KAWI: + case HB_SCRIPT_NAG_MUNDARI: + /* If the designer designed the font for the 'DFLT' script, * (or we ended up arbitrarily pick 'latn'), use the default shaper. * Otherwise, use the specific shaper. diff --git a/thirdparty/harfbuzz/src/hb-ot-tag.cc b/thirdparty/harfbuzz/src/hb-ot-tag.cc index ceb3bf6df5..1b18270cca 100644 --- a/thirdparty/harfbuzz/src/hb-ot-tag.cc +++ b/thirdparty/harfbuzz/src/hb-ot-tag.cc @@ -307,12 +307,12 @@ hb_ot_tags_from_language (const char *lang_str, hb_tag_t lang_tag = hb_tag_from_string (lang_str, first_len); static hb_atomic_int_t last_tag_idx; /* Poor man's cache. */ - unsigned tag_idx = last_tag_idx.get_relaxed (); + unsigned tag_idx = last_tag_idx; if (likely (tag_idx < ot_languages_len && ot_languages[tag_idx].language == lang_tag) || hb_sorted_array (ot_languages, ot_languages_len).bfind (lang_tag, &tag_idx)) { - last_tag_idx.set_relaxed (tag_idx); + last_tag_idx = tag_idx; unsigned int i; while (tag_idx != 0 && ot_languages[tag_idx].language == ot_languages[tag_idx - 1].language) diff --git a/thirdparty/harfbuzz/src/hb-ot-var-avar-table.hh b/thirdparty/harfbuzz/src/hb-ot-var-avar-table.hh index 5946aef635..f60bc4a3ce 100644 --- a/thirdparty/harfbuzz/src/hb-ot-var-avar-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-var-avar-table.hh @@ -206,11 +206,10 @@ struct avar v = hb_clamp (v, -(1<<14), +(1<<14)); out.push (v); } - - OT::VariationStore::destroy_cache (var_store_cache); - for (unsigned i = 0; i < coords_length; i++) coords[i] = out[i]; + + OT::VariationStore::destroy_cache (var_store_cache); #endif } diff --git a/thirdparty/harfbuzz/src/hb-ot-var-mvar-table.hh b/thirdparty/harfbuzz/src/hb-ot-var-mvar-table.hh index 208db46741..420366fbb3 100644 --- a/thirdparty/harfbuzz/src/hb-ot-var-mvar-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-var-mvar-table.hh @@ -43,7 +43,7 @@ struct VariationValueRecord public: Tag valueTag; /* Four-byte tag identifying a font-wide measure. */ - HBUINT32 varIdx; /* Outer/inner index into VariationStore item. */ + VarIdx varIdx; /* Outer/inner index into VariationStore item. */ public: DEFINE_SIZE_STATIC (8); diff --git a/thirdparty/harfbuzz/src/hb-repacker.hh b/thirdparty/harfbuzz/src/hb-repacker.hh index 61b142238e..40a5326118 100644 --- a/thirdparty/harfbuzz/src/hb-repacker.hh +++ b/thirdparty/harfbuzz/src/hb-repacker.hh @@ -276,33 +276,17 @@ bool _process_overflows (const hb_vector_t<graph::overflow_record_t>& overflows, return resolution_attempted; } -/* - * Attempts to modify the topological sorting of the provided object graph to - * eliminate offset overflows in the links between objects of the graph. If a - * non-overflowing ordering is found the updated graph is serialized it into the - * provided serialization context. - * - * If necessary the structure of the graph may be modified in ways that do not - * affect the functionality of the graph. For example shared objects may be - * duplicated. - * - * For a detailed writeup describing how the algorithm operates see: - * docs/repacker.md - */ -template<typename T> -inline hb_blob_t* -hb_resolve_overflows (const T& packed, - hb_tag_t table_tag, - unsigned max_rounds = 20, - bool recalculate_extensions = false) { - graph_t sorted_graph (packed); +inline bool +hb_resolve_graph_overflows (hb_tag_t table_tag, + unsigned max_rounds , + bool recalculate_extensions, + graph_t& sorted_graph /* IN/OUT */) +{ sorted_graph.sort_shortest_distance (); bool will_overflow = graph::will_overflow (sorted_graph); if (!will_overflow) - { - return graph::serialize (sorted_graph); - } + return true; graph::gsubgpos_graph_context_t ext_context (table_tag, sorted_graph); if ((table_tag == HB_OT_TAG_GPOS @@ -314,13 +298,13 @@ hb_resolve_overflows (const T& packed, DEBUG_MSG (SUBSET_REPACK, nullptr, "Splitting subtables if needed."); if (!_presplit_subtables_if_needed (ext_context)) { DEBUG_MSG (SUBSET_REPACK, nullptr, "Subtable splitting failed."); - return nullptr; + return false; } DEBUG_MSG (SUBSET_REPACK, nullptr, "Promoting lookups to extensions if needed."); if (!_promote_extensions_if_needed (ext_context)) { DEBUG_MSG (SUBSET_REPACK, nullptr, "Extensions promotion failed."); - return nullptr; + return false; } } @@ -360,15 +344,41 @@ hb_resolve_overflows (const T& packed, if (sorted_graph.in_error ()) { DEBUG_MSG (SUBSET_REPACK, nullptr, "Sorted graph in error state."); - return nullptr; + return false; } if (graph::will_overflow (sorted_graph)) { DEBUG_MSG (SUBSET_REPACK, nullptr, "Offset overflow resolution failed."); - return nullptr; + return false; } + return true; +} + +/* + * Attempts to modify the topological sorting of the provided object graph to + * eliminate offset overflows in the links between objects of the graph. If a + * non-overflowing ordering is found the updated graph is serialized it into the + * provided serialization context. + * + * If necessary the structure of the graph may be modified in ways that do not + * affect the functionality of the graph. For example shared objects may be + * duplicated. + * + * For a detailed writeup describing how the algorithm operates see: + * docs/repacker.md + */ +template<typename T> +inline hb_blob_t* +hb_resolve_overflows (const T& packed, + hb_tag_t table_tag, + unsigned max_rounds = 20, + bool recalculate_extensions = false) { + graph_t sorted_graph (packed); + if (!hb_resolve_graph_overflows (table_tag, max_rounds, recalculate_extensions, sorted_graph)) + return nullptr; + return graph::serialize (sorted_graph); } diff --git a/thirdparty/harfbuzz/src/hb-serialize.hh b/thirdparty/harfbuzz/src/hb-serialize.hh index cecdcdeb74..f47cde5eb5 100644 --- a/thirdparty/harfbuzz/src/hb-serialize.hh +++ b/thirdparty/harfbuzz/src/hb-serialize.hh @@ -139,6 +139,14 @@ struct hb_serialize_context_t objidx = o.objidx; } #endif + + HB_INTERNAL static int cmp (const void* a, const void* b) + { + int cmp = ((const link_t*)a)->position - ((const link_t*)b)->position; + if (cmp) return cmp; + + return ((const link_t*)a)->objidx - ((const link_t*)b)->objidx; + } }; char *head; @@ -315,7 +323,7 @@ struct hb_serialize_context_t { object_t *obj = current; if (unlikely (!obj)) return; - if (unlikely (in_error())) return; + if (unlikely (in_error() && !only_overflow ())) return; current = current->next; revert (obj->head, obj->tail); diff --git a/thirdparty/harfbuzz/src/hb-static.cc b/thirdparty/harfbuzz/src/hb-static.cc index af95615c16..5d4c7cda1b 100644 --- a/thirdparty/harfbuzz/src/hb-static.cc +++ b/thirdparty/harfbuzz/src/hb-static.cc @@ -94,7 +94,7 @@ hb_face_t::load_num_glyphs () const ret = hb_max (ret, load_num_glyphs_from_maxp (this)); - num_glyphs.set_relaxed (ret); + num_glyphs = ret; return ret; } @@ -102,7 +102,7 @@ unsigned int hb_face_t::load_upem () const { unsigned int ret = table.head->get_upem (); - upem.set_relaxed (ret); + upem = ret; return ret; } diff --git a/thirdparty/harfbuzz/src/hb-subset-input.cc b/thirdparty/harfbuzz/src/hb-subset-input.cc index 7d19496275..14ae210d49 100644 --- a/thirdparty/harfbuzz/src/hb-subset-input.cc +++ b/thirdparty/harfbuzz/src/hb-subset-input.cc @@ -391,7 +391,7 @@ hb_subset_input_get_user_data (const hb_subset_input_t *input, * * Return value: `true` if success, `false` otherwise * - * Since: REPLACEME + * Since: EXPERIMENTAL **/ hb_bool_t hb_subset_input_pin_axis_to_default (hb_subset_input_t *input, @@ -415,7 +415,7 @@ hb_subset_input_pin_axis_to_default (hb_subset_input_t *input, * * Return value: `true` if success, `false` otherwise * - * Since: REPLACEME + * Since: EXPERIMENTAL **/ hb_bool_t hb_subset_input_pin_axis_location (hb_subset_input_t *input, diff --git a/thirdparty/harfbuzz/src/hb-subset-plan.cc b/thirdparty/harfbuzz/src/hb-subset-plan.cc index 7ff66333a8..079ab8bf99 100644 --- a/thirdparty/harfbuzz/src/hb-subset-plan.cc +++ b/thirdparty/harfbuzz/src/hb-subset-plan.cc @@ -89,8 +89,6 @@ _remap_indexes (const hb_set_t *indexes, } #ifndef HB_NO_SUBSET_LAYOUT -typedef void (*layout_collect_func_t) (hb_face_t *face, hb_tag_t table_tag, const hb_tag_t *scripts, const hb_tag_t *languages, const hb_tag_t *features, hb_set_t *lookup_indexes /* OUT */); - /* * Removes all tags from 'tags' that are not in filter. Additionally eliminates any duplicates. @@ -130,8 +128,8 @@ static bool _filter_tag_list(hb_vector_t<hb_tag_t>* tags, /* IN/OUT */ template <typename T> static void _collect_layout_indices (hb_subset_plan_t *plan, const T& table, - layout_collect_func_t layout_collect_func, - hb_set_t *indices /* OUT */) + hb_set_t *lookup_indices, /* OUT */ + hb_set_t *feature_indices /* OUT */) { unsigned num_features = table.get_feature_count (); hb_vector_t<hb_tag_t> features; @@ -149,12 +147,23 @@ static void _collect_layout_indices (hb_subset_plan_t *plan, || !plan->check_success (!scripts.in_error ()) || !scripts) return; - layout_collect_func (plan->source, - T::tableTag, - retain_all_scripts ? nullptr : scripts.arrayZ, - nullptr, - retain_all_features ? nullptr : features.arrayZ, - indices); + hb_ot_layout_collect_features (plan->source, + T::tableTag, + retain_all_scripts ? nullptr : scripts.arrayZ, + nullptr, + retain_all_features ? nullptr : features.arrayZ, + feature_indices); + + for (unsigned feature_index : *feature_indices) + { + //TODO: replace HB_OT_LAYOUT_NO_VARIATIONS_INDEX with variation_index for + //instancing + const OT::Feature &f = table.get_feature_variation (feature_index, HB_OT_LAYOUT_NO_VARIATIONS_INDEX); + f.add_lookup_indexes_to (lookup_indices); + } + + //TODO: update for instancing: only collect lookups from feature_indexes that have no variations + table.feature_variation_collect_lookups (feature_indices, lookup_indices); } @@ -232,11 +241,11 @@ _closure_glyphs_lookups_features (hb_subset_plan_t *plan, { hb_blob_ptr_t<T> table = plan->source_table<T> (); hb_tag_t table_tag = table->tableTag; - hb_set_t lookup_indices; + hb_set_t lookup_indices, feature_indices; _collect_layout_indices<T> (plan, *table, - hb_ot_layout_collect_lookups, - &lookup_indices); + &lookup_indices, + &feature_indices); if (table_tag == HB_OT_TAG_GSUB) hb_ot_layout_lookups_substitute_closure (plan->source, @@ -247,19 +256,13 @@ _closure_glyphs_lookups_features (hb_subset_plan_t *plan, &lookup_indices); _remap_indexes (&lookup_indices, lookups); - // Collect and prune features - hb_set_t feature_indices; - _collect_layout_indices<T> (plan, - *table, - hb_ot_layout_collect_features, - &feature_indices); - + // prune features table->prune_features (lookups, &feature_indices); hb_map_t duplicate_feature_map; _GSUBGPOS_find_duplicate_features (*table, lookups, &feature_indices, &duplicate_feature_map); feature_indices.clear (); - table->prune_langsys (&duplicate_feature_map, langsys_map, &feature_indices); + table->prune_langsys (&duplicate_feature_map, plan->layout_scripts, langsys_map, &feature_indices); _remap_indexes (&feature_indices, features); table.destroy (); @@ -269,11 +272,46 @@ _closure_glyphs_lookups_features (hb_subset_plan_t *plan, #ifndef HB_NO_VAR static inline void -_collect_layout_variation_indices (hb_subset_plan_t* plan, - const hb_set_t *glyphset, - const hb_map_t *gpos_lookups, - hb_set_t *layout_variation_indices, - hb_map_t *layout_variation_idx_map) +_generate_varstore_inner_maps (const hb_set_t& varidx_set, + unsigned subtable_count, + hb_vector_t<hb_inc_bimap_t> &inner_maps /* OUT */) +{ + if (varidx_set.is_empty () || subtable_count == 0) return; + + inner_maps.resize (subtable_count); + for (unsigned idx : varidx_set) + { + uint16_t major = idx >> 16; + uint16_t minor = idx & 0xFFFF; + + if (major >= subtable_count) + continue; + inner_maps[major].add (minor); + } +} + +static inline hb_font_t* +_get_hb_font_with_variations (const hb_subset_plan_t *plan) +{ + hb_font_t *font = hb_font_create (plan->source); + + hb_vector_t<hb_variation_t> vars; + vars.alloc (plan->user_axes_location->get_population ()); + + for (auto _ : *plan->user_axes_location) + { + hb_variation_t var; + var.tag = _.first; + var.value = _.second; + vars.push (var); + } + + hb_font_set_variations (font, vars.arrayZ, plan->user_axes_location->get_population ()); + return font; +} + +static inline void +_collect_layout_variation_indices (hb_subset_plan_t* plan) { hb_blob_ptr_t<OT::GDEF> gdef = plan->source_table<OT::GDEF> (); hb_blob_ptr_t<GPOS> gpos = plan->source_table<GPOS> (); @@ -284,13 +322,40 @@ _collect_layout_variation_indices (hb_subset_plan_t* plan, gpos.destroy (); return; } - OT::hb_collect_variation_indices_context_t c (layout_variation_indices, glyphset, gpos_lookups); + + const OT::VariationStore *var_store = nullptr; + hb_set_t varidx_set; + hb_font_t *font = nullptr; + float *store_cache = nullptr; + bool collect_delta = plan->pinned_at_default ? false : true; + if (collect_delta) + { + font = _get_hb_font_with_variations (plan); + if (gdef->has_var_store ()) + { + var_store = &(gdef->get_var_store ()); + store_cache = var_store->create_cache (); + } + } + + OT::hb_collect_variation_indices_context_t c (&varidx_set, + plan->layout_variation_idx_delta_map, + font, var_store, + plan->_glyphset_gsub, + plan->gpos_lookups, + store_cache); gdef->collect_variation_indices (&c); if (hb_ot_layout_has_positioning (plan->source)) gpos->collect_variation_indices (&c); - gdef->remap_layout_variation_indices (layout_variation_indices, layout_variation_idx_map); + hb_font_destroy (font); + var_store->destroy_cache (store_cache); + + gdef->remap_layout_variation_indices (&varidx_set, plan->layout_variation_idx_delta_map); + + unsigned subtable_count = gdef->has_var_store () ? gdef->get_var_store ().get_sub_table_count () : 0; + _generate_varstore_inner_maps (varidx_set, subtable_count, plan->gdef_varstore_inner_maps); gdef.destroy (); gpos.destroy (); @@ -506,11 +571,7 @@ _populate_gids_to_retain (hb_subset_plan_t* plan, #ifndef HB_NO_VAR if (close_over_gdef) - _collect_layout_variation_indices (plan, - plan->_glyphset_gsub, - plan->gpos_lookups, - plan->layout_variation_indices, - plan->layout_variation_idx_map); + _collect_layout_variation_indices (plan); #endif } @@ -585,12 +646,9 @@ _nameid_closure (hb_face_t *face, #ifndef HB_NO_VAR static void -_normalize_axes_location (hb_face_t *face, - const hb_hashmap_t<hb_tag_t, float> *user_axes_location, - hb_hashmap_t<hb_tag_t, int> *normalized_axes_location, /* OUT */ - bool &all_axes_pinned) +_normalize_axes_location (hb_face_t *face, hb_subset_plan_t *plan) { - if (user_axes_location->is_empty ()) + if (plan->user_axes_location->is_empty ()) return; hb_array_t<const OT::AxisRecord> axes = face->table.fvar->get_axes (); @@ -605,25 +663,27 @@ _normalize_axes_location (hb_face_t *face, for (const auto& axis : axes) { hb_tag_t axis_tag = axis.get_axis_tag (); - if (!user_axes_location->has (axis_tag)) + if (!plan->user_axes_location->has (axis_tag)) { axis_not_pinned = true; } else { - int normalized_v = axis.normalize_axis_value (user_axes_location->get (axis_tag)); + int normalized_v = axis.normalize_axis_value (plan->user_axes_location->get (axis_tag)); if (has_avar && axis_count < face->table.avar->get_axis_count ()) { normalized_v = seg_maps->map (normalized_v); } - normalized_axes_location->set (axis_tag, normalized_v); + plan->axes_location->set (axis_tag, normalized_v); + if (normalized_v != 0) + plan->pinned_at_default = false; } if (has_avar) seg_maps = &StructAfter<OT::SegmentMaps> (*seg_maps); - + axis_count++; } - all_axes_pinned = !axis_not_pinned; + plan->all_axes_pinned = !axis_not_pinned; } #endif /** @@ -683,8 +743,8 @@ hb_subset_plan_create_or_fail (hb_face_t *face, plan->gpos_features = hb_map_create (); plan->colrv1_layers = hb_map_create (); plan->colr_palettes = hb_map_create (); - plan->layout_variation_indices = hb_set_create (); - plan->layout_variation_idx_map = hb_map_create (); + plan->check_success (plan->layout_variation_idx_delta_map = hb_hashmap_create<unsigned, hb_pair_t<unsigned, int>> ()); + plan->gdef_varstore_inner_maps.init (); plan->check_success (plan->sanitized_table_cache = hb_hashmap_create<hb_tag_t, hb::unique_ptr<hb_blob_t>> ()); plan->check_success (plan->axes_location = hb_hashmap_create<hb_tag_t, int> ()); @@ -692,12 +752,20 @@ hb_subset_plan_create_or_fail (hb_face_t *face, if (plan->user_axes_location && input->axes_location) *plan->user_axes_location = *input->axes_location; plan->all_axes_pinned = false; + plan->pinned_at_default = true; + + plan->check_success (plan->vmtx_map = hb_hashmap_create<unsigned, hb_pair_t<unsigned, int>> ()); + plan->check_success (plan->hmtx_map = hb_hashmap_create<unsigned, hb_pair_t<unsigned, int>> ()); if (unlikely (plan->in_error ())) { hb_subset_plan_destroy (plan); return nullptr; } +#ifndef HB_NO_VAR + _normalize_axes_location (face, plan); +#endif + _populate_unicodes_to_retain (input->sets.unicodes, input->sets.glyphs, plan); _populate_gids_to_retain (plan, @@ -725,13 +793,6 @@ hb_subset_plan_create_or_fail (hb_face_t *face, plan->glyph_map->get(plan->unicode_to_new_gid_list.arrayZ[i].second); } -#ifndef HB_NO_VAR - _normalize_axes_location (face, - input->axes_location, - plan->axes_location, - plan->all_axes_pinned); -#endif - _nameid_closure (face, plan->name_ids, plan->all_axes_pinned, plan->user_axes_location); if (unlikely (plan->in_error ())) { hb_subset_plan_destroy (plan); @@ -754,44 +815,6 @@ hb_subset_plan_destroy (hb_subset_plan_t *plan) { if (!hb_object_destroy (plan)) return; - hb_set_destroy (plan->unicodes); - hb_set_destroy (plan->name_ids); - hb_set_destroy (plan->name_languages); - hb_set_destroy (plan->layout_features); - hb_set_destroy (plan->layout_scripts); - hb_set_destroy (plan->glyphs_requested); - hb_set_destroy (plan->drop_tables); - hb_set_destroy (plan->no_subset_tables); - hb_face_destroy (plan->source); - hb_face_destroy (plan->dest); - hb_map_destroy (plan->codepoint_to_glyph); - hb_map_destroy (plan->glyph_map); - hb_map_destroy (plan->reverse_glyph_map); - hb_map_destroy (plan->glyph_map_gsub); - hb_set_destroy (plan->_glyphset); - hb_set_destroy (plan->_glyphset_gsub); - hb_set_destroy (plan->_glyphset_mathed); - hb_set_destroy (plan->_glyphset_colred); - hb_map_destroy (plan->gsub_lookups); - hb_map_destroy (plan->gpos_lookups); - hb_map_destroy (plan->gsub_features); - hb_map_destroy (plan->gpos_features); - hb_map_destroy (plan->colrv1_layers); - hb_map_destroy (plan->colr_palettes); - hb_set_destroy (plan->layout_variation_indices); - hb_map_destroy (plan->layout_variation_idx_map); - - hb_hashmap_destroy (plan->gsub_langsys); - hb_hashmap_destroy (plan->gpos_langsys); - hb_hashmap_destroy (plan->axes_location); - hb_hashmap_destroy (plan->sanitized_table_cache); - - if (plan->user_axes_location) - { - hb_object_destroy (plan->user_axes_location); - hb_free (plan->user_axes_location); - } - hb_free (plan); } diff --git a/thirdparty/harfbuzz/src/hb-subset-plan.hh b/thirdparty/harfbuzz/src/hb-subset-plan.hh index 8912ae70d5..98a45e5f6d 100644 --- a/thirdparty/harfbuzz/src/hb-subset-plan.hh +++ b/thirdparty/harfbuzz/src/hb-subset-plan.hh @@ -33,10 +33,56 @@ #include "hb-subset-input.hh" #include "hb-map.hh" +#include "hb-bimap.hh" #include "hb-set.hh" struct hb_subset_plan_t { + hb_subset_plan_t () + {} + + ~hb_subset_plan_t() + { + hb_set_destroy (unicodes); + hb_set_destroy (name_ids); + hb_set_destroy (name_languages); + hb_set_destroy (layout_features); + hb_set_destroy (layout_scripts); + hb_set_destroy (glyphs_requested); + hb_set_destroy (drop_tables); + hb_set_destroy (no_subset_tables); + hb_face_destroy (source); + hb_face_destroy (dest); + hb_map_destroy (codepoint_to_glyph); + hb_map_destroy (glyph_map); + hb_map_destroy (reverse_glyph_map); + hb_map_destroy (glyph_map_gsub); + hb_set_destroy (_glyphset); + hb_set_destroy (_glyphset_gsub); + hb_set_destroy (_glyphset_mathed); + hb_set_destroy (_glyphset_colred); + hb_map_destroy (gsub_lookups); + hb_map_destroy (gpos_lookups); + hb_map_destroy (gsub_features); + hb_map_destroy (gpos_features); + hb_map_destroy (colrv1_layers); + hb_map_destroy (colr_palettes); + + hb_hashmap_destroy (gsub_langsys); + hb_hashmap_destroy (gpos_langsys); + hb_hashmap_destroy (axes_location); + hb_hashmap_destroy (sanitized_table_cache); + hb_hashmap_destroy (hmtx_map); + hb_hashmap_destroy (vmtx_map); + hb_hashmap_destroy (layout_variation_idx_delta_map); + + if (user_axes_location) + { + hb_object_destroy (user_axes_location); + hb_free (user_axes_location); + } + } + hb_object_header_t header; bool successful; @@ -101,10 +147,11 @@ struct hb_subset_plan_t hb_map_t *colrv1_layers; hb_map_t *colr_palettes; - //The set of layout item variation store delta set indices to be retained - hb_set_t *layout_variation_indices; - //Old -> New layout item variation store delta set index mapping - hb_map_t *layout_variation_idx_map; + //Old layout item variation index -> (New varidx, delta) mapping + hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map; + + //gdef varstore retained varidx mapping + hb_vector_t<hb_inc_bimap_t> gdef_varstore_inner_maps; hb_hashmap_t<hb_tag_t, hb::unique_ptr<hb_blob_t>>* sanitized_table_cache; //normalized axes location map @@ -112,6 +159,12 @@ struct hb_subset_plan_t //user specified axes location map hb_hashmap_t<hb_tag_t, float> *user_axes_location; bool all_axes_pinned; + bool pinned_at_default; + + //hmtx metrics map: new gid->(advance, lsb) + hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *hmtx_map; + //vmtx metrics map: new gid->(advance, lsb) + hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *vmtx_map; public: diff --git a/thirdparty/harfbuzz/src/hb-subset.cc b/thirdparty/harfbuzz/src/hb-subset.cc index f62e7e895b..1a0bcbd1fe 100644 --- a/thirdparty/harfbuzz/src/hb-subset.cc +++ b/thirdparty/harfbuzz/src/hb-subset.cc @@ -406,6 +406,27 @@ _passthrough (hb_subset_plan_t *plan, hb_tag_t tag) } static bool +_dependencies_satisfied (hb_subset_plan_t *plan, hb_tag_t tag, + hb_set_t &visited_set, hb_set_t &revisit_set) +{ + switch (tag) + { + case HB_OT_TAG_hmtx: + case HB_OT_TAG_vmtx: + if (!plan->pinned_at_default && + !visited_set.has (HB_OT_TAG_glyf)) + { + revisit_set.add (tag); + return false; + } + return true; + + default: + return true; + } +} + +static bool _subset_table (hb_subset_plan_t *plan, hb_vector_t<char> &buf, hb_tag_t tag) @@ -514,7 +535,7 @@ hb_subset_plan_execute_or_fail (hb_subset_plan_t *plan) return nullptr; } - hb_set_t tags_set; + hb_set_t tags_set, revisit_set; bool success = true; hb_tag_t table_tags[32]; unsigned offset = 0, num_tables = ARRAY_LENGTH (table_tags); @@ -527,10 +548,27 @@ hb_subset_plan_execute_or_fail (hb_subset_plan_t *plan) { hb_tag_t tag = table_tags[i]; if (_should_drop_table (plan, tag) && !tags_set.has (tag)) continue; + if (!_dependencies_satisfied (plan, tag, tags_set, revisit_set)) continue; tags_set.add (tag); success = _subset_table (plan, buf, tag); if (unlikely (!success)) goto end; } + + /*delayed subsetting for some tables since they might have dependency on other tables in some cases: + e.g: during instantiating glyf tables, hmetrics/vmetrics are updated and saved in subset plan, + hmtx/vmtx subsetting need to use these updated metrics values*/ + while (!revisit_set.is_empty ()) + { + hb_set_t revisit_temp; + for (hb_tag_t tag : revisit_set) + { + if (!_dependencies_satisfied (plan, tag, tags_set, revisit_temp)) continue; + tags_set.add (tag); + success = _subset_table (plan, buf, tag); + if (unlikely (!success)) goto end; + } + revisit_set = revisit_temp; + } offset += num_tables; } diff --git a/thirdparty/harfbuzz/src/hb-ucd-table.hh b/thirdparty/harfbuzz/src/hb-ucd-table.hh index 14734c91ea..a372a4afce 100644 --- a/thirdparty/harfbuzz/src/hb-ucd-table.hh +++ b/thirdparty/harfbuzz/src/hb-ucd-table.hh @@ -4,7 +4,7 @@ * * ./gen-ucd-table.py ucd.nounihan.grouped.xml * - * on file with this description: Unicode 14.0.0 + * on file with this description: Unicode 15.0.0 */ #ifndef HB_UCD_TABLE_HH @@ -13,7 +13,7 @@ #include "hb.hh" static const hb_script_t -_hb_ucd_sc_map[163] = +_hb_ucd_sc_map[165] = { HB_SCRIPT_COMMON, HB_SCRIPT_INHERITED, HB_SCRIPT_UNKNOWN, HB_SCRIPT_ARABIC, @@ -96,7 +96,8 @@ _hb_ucd_sc_map[163] = HB_SCRIPT_YEZIDI, HB_SCRIPT_CYPRO_MINOAN, HB_SCRIPT_OLD_UYGHUR, HB_SCRIPT_TANGSA, HB_SCRIPT_TOTO, HB_SCRIPT_VITHKUQI, - HB_SCRIPT_MATH, + HB_SCRIPT_MATH, HB_SCRIPT_KAWI, + HB_SCRIPT_NAG_MUNDARI, }; static const uint16_t _hb_ucd_dm1_p0_map[825] = @@ -1068,7 +1069,7 @@ _hb_ucd_dm2_u64_map[388] = #ifndef HB_OPTIMIZE_SIZE static const uint8_t -_hb_ucd_u8[17936] = +_hb_ucd_u8[18260] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 7, 7, 7, 7, 11, 12, 13, 13, 13, 14, @@ -1076,7 +1077,7 @@ _hb_ucd_u8[17936] = 25, 26, 22, 22, 22, 27, 28, 29, 22, 30, 31, 32, 33, 34, 35, 36, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 37, 7, 38, 39, 7, 40, 7, 7, 7, 41, 22, 42, - 7, 7, 43, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 7, 7, 43, 7, 44, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, @@ -1098,12 +1099,12 @@ _hb_ucd_u8[17936] = 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 44, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 45, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 45, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 46, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 47, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 34, 35, 36, 37, 38, 39, 34, 34, 34, 40, 41, 42, 43, @@ -1122,35 +1123,36 @@ _hb_ucd_u8[17936] = 118,119,120,121,122,123,124,125,126,127,128,129, 34, 34,130,131, 132,133,134,135,136,137,138,139,140,141,142,122,143,144,145,146, 147,148,149,150,151,152,153,122,154,155,122,156,157,158,159,122, - 160,161,162,163,164,165,122,122,166,167,168,169,122,170,122,171, - 34, 34, 34, 34, 34, 34, 34,172,173, 34,174,122,122,122,122,122, - 122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,175, - 34, 34, 34, 34, 34, 34, 34, 34,176,122,122,122,122,122,122,122, + 160,161,162,163,164,165,166,122,167,168,169,170,122,171,172,173, + 34, 34, 34, 34, 34, 34, 34,174,175, 34,176,122,122,122,122,122, + 122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,177, + 34, 34, 34, 34, 34, 34, 34, 34,178,122,122,122,122,122,122,122, 122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122, - 122,122,122,122,122,122,122,122, 34, 34, 34, 34,177,122,122,122, - 34, 34, 34, 34,178,179,180,181,122,122,122,122,182,183,184,185, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,186, - 34, 34, 34, 34, 34, 34, 34, 34, 34,187,188,122,122,122,122,122, - 122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,189, - 34, 34,190, 34, 34,191,122,122,122,122,122,122,122,122,122,122, - 122,122,122,122,122,122,122,122,192,193,122,122,122,122,122,122, - 122,122,122,122,122,122,122,122,122,122,122,122,122,122,194,195, - 69,196,197,198,199,200,201,122,202,203,204,205,206,207,208,209, - 69, 69, 69, 69,210,211,122,122,122,122,122,122,122,122,212,122, - 213,122,214,122,122,215,122,122,122,122,122,122,122,122,122,216, - 34,217,218,122,122,122,122,122,219,220,221,122,222,223,122,122, - 224,225,226,227,228,122, 69,229, 69, 69, 69, 69, 69,230,231,232, - 233,234, 69, 69,235,236, 69,237,122,122,122,122,122,122,122,122, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,238, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,239, 34, - 240, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,241, 34, 34, - 34, 34, 34, 34, 34, 34, 34,242,122,122,122,122,122,122,122,122, - 34, 34, 34, 34,243,122,122,122,122,122,122,122,122,122,122,122, - 34, 34, 34, 34, 34, 34,244,122,122,122,122,122,122,122,122,122, - 245,122,246,247,122,122,122,122,122,122,122,122,122,122,122,122, - 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,248, - 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,249, + 122,122,122,122,122,122,122,122, 34, 34, 34, 34,179,122,122,122, + 34, 34, 34, 34,180,181,182,183,122,122,122,122,184,185,186,187, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,188, + 34, 34, 34, 34, 34, 34, 34, 34, 34,189,190,122,122,122,122,122, + 122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,191, + 34, 34,192, 34, 34,193,122,122,122,122,122,122,122,122,122,122, + 122,122,122,122,122,122,122,122,194,195,122,122,122,122,122,122, + 122,122,122,122,122,122,122,122,122,122,122,122,122,122,196,197, + 69,198,199,200,201,202,203,122,204,205,206,207,208,209,210,211, + 69, 69, 69, 69,212,213,122,122,122,122,122,122,122,122,214,122, + 215,216,217,122,122,218,122,122,122,219,122,122,122,122,122,220, + 34,221,222,122,122,122,122,122,223,224,225,122,226,227,122,122, + 228,229,230,231,232,122, 69,233, 69, 69, 69, 69, 69,234,235,236, + 237,238, 69, 69,239,240, 69,241,122,122,122,122,122,122,122,122, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,242, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,243, 34, + 244, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,245, 34, 34, + 34, 34, 34, 34, 34, 34, 34,246,122,122,122,122,122,122,122,122, + 34, 34, 34, 34,247,122,122,122,122,122,122,122,122,122,122,122, + 34, 34, 34, 34, 34, 34,248, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34,249,122,122,122,122,122,122,122,122, + 250,122,251,252,122,122,122,122,122,122,122,122,122,122,122,122, + 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,253, + 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,254, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 2, 4, 5, 6, 2, 7, 7, 7, 7, 7, 2, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, @@ -1213,7 +1215,7 @@ _hb_ucd_u8[17936] = 44, 44, 57, 80, 36, 61, 62, 44, 44, 44, 44, 93, 27, 27, 27, 91, 70, 86, 72, 36, 36, 36, 61, 36, 36, 36, 62, 36, 36, 44, 71, 87, 86, 86, 90, 85, 90, 86, 43, 44, 44, 44, 89, 90, 44, 44, 62, 61, - 62, 61, 44, 44, 44, 44, 44, 44, 43, 86, 36, 36, 36, 36, 61, 36, + 62, 94, 44, 44, 44, 44, 44, 44, 43, 86, 36, 36, 36, 36, 61, 36, 36, 36, 36, 36, 36, 70, 71, 86, 87, 43, 80, 86, 90, 86, 87, 77, 44, 44, 36, 94, 27, 27, 27, 95, 27, 27, 27, 27, 91, 36, 36, 36, 57, 86, 62, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, 36, 36, 36, @@ -1223,7 +1225,7 @@ _hb_ucd_u8[17936] = 36, 36, 36, 75, 43, 43, 43, 60, 7, 7, 7, 7, 7, 2, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 62, 61, 61, 36, 36, 61, 36, 36, 36, 36, 62, 62, 36, 36, 36, 36, 70, 36, 43, 43, 43, 43, 71, 44, - 36, 36, 61, 81, 43, 43, 43, 44, 7, 7, 7, 7, 7, 44, 36, 36, + 36, 36, 61, 81, 43, 43, 43, 80, 7, 7, 7, 7, 7, 44, 36, 36, 77, 67, 2, 2, 2, 2, 2, 2, 2, 97, 97, 67, 43, 67, 67, 67, 7, 7, 7, 7, 7, 27, 27, 27, 27, 27, 50, 50, 50, 4, 4, 86, 36, 36, 36, 36, 62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, @@ -1390,18 +1392,19 @@ _hb_ucd_u8[17936] = 44, 44, 44, 44,179, 27, 27, 27, 11, 47, 44, 44, 44, 44, 44, 44, 16,110, 44, 44, 44, 27, 27, 27, 36, 36, 43, 43, 44, 44, 44, 44, 27, 27, 27, 27, 27, 27, 27,100, 36, 36, 36, 36, 36, 57,184, 44, - 36, 44, 44, 44, 44, 44, 44, 44, 27, 27, 27, 95, 44, 44, 44, 44, - 180, 27, 30, 2, 2, 44, 44, 44, 36, 43, 43, 2, 2, 44, 44, 44, - 36, 36,183, 27, 27, 27, 44, 44, 87, 98, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 43, 60, 2, 2, 2, 44, - 27, 27, 27, 7, 7, 7, 7, 7, 71, 70, 71, 44, 44, 44, 44, 57, - 86, 87, 43, 85, 87, 60,185, 2, 2, 80, 44, 44, 44, 44, 79, 44, - 43, 71, 36, 36, 36, 36, 36, 36, 36, 36, 36, 70, 43, 43, 87, 43, - 43, 43, 80, 7, 7, 7, 7, 7, 2, 2, 94, 98, 44, 44, 44, 44, - 36, 70, 2, 61, 44, 44, 44, 44, 36, 94, 86, 43, 43, 43, 43, 85, - 98, 36, 63, 2, 59, 43, 60, 87, 7, 7, 7, 7, 7, 63, 63, 2, - 179, 27, 27, 27, 27, 27, 27, 27, 27, 27,100, 44, 44, 44, 44, 44, - 36, 36, 36, 36, 36, 36, 86, 87, 43, 86, 85, 43, 2, 2, 2, 80, + 36, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 57, 43, + 27, 27, 27, 95, 44, 44, 44, 44,180, 27, 30, 2, 2, 44, 44, 44, + 36, 43, 43, 2, 2, 44, 44, 44, 36, 36,183, 27, 27, 27, 44, 44, + 87, 98, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43, 43, + 43, 43, 43, 60, 2, 2, 2, 44, 27, 27, 27, 7, 7, 7, 7, 7, + 71, 70, 71, 44, 44, 44, 44, 57, 86, 87, 43, 85, 87, 60,185, 2, + 2, 80, 44, 44, 44, 44, 79, 44, 43, 71, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 70, 43, 43, 87, 43, 43, 43, 80, 7, 7, 7, 7, 7, + 2, 2, 94, 98, 44, 44, 44, 44, 36, 70, 2, 61, 44, 44, 44, 44, + 36, 94, 86, 43, 43, 43, 43, 85, 98, 36, 63, 2, 59, 43, 60, 87, + 7, 7, 7, 7, 7, 63, 63, 2,179, 27, 27, 27, 27, 27, 27, 27, + 27, 27,100, 44, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36, 86, 87, + 43, 86, 85, 43, 2, 2, 2, 71, 70, 44, 44, 44, 44, 44, 44, 44, 36, 36, 36, 61, 61, 36, 36, 62, 36, 36, 36, 36, 36, 36, 36, 62, 36, 36, 36, 36, 63, 44, 44, 44, 36, 36, 36, 36, 36, 36, 36, 70, 86, 87, 43, 43, 43, 80, 44, 44, 43, 86, 62, 36, 36, 36, 61, 62, @@ -1423,17 +1426,20 @@ _hb_ucd_u8[17936] = 70, 43, 43, 43, 43, 71, 36, 36, 36, 70, 43, 43, 85, 70, 43, 60, 2, 2, 2, 59, 44, 44, 44, 44, 70, 43, 43, 85, 87, 43, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 85, 43, 2, 72, 2, - 2, 64, 44, 44, 44, 44, 44, 44, 43, 43, 43, 80, 43, 43, 43, 87, - 63, 2, 2, 44, 44, 44, 44, 44, 2, 36, 36, 36, 36, 36, 36, 36, - 44, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 89, 43, 43, 43, - 85, 43, 87, 80, 44, 44, 44, 44, 36, 36, 36, 61, 36, 62, 36, 36, - 70, 43, 43, 80, 44, 80, 43, 57, 43, 43, 43, 70, 44, 44, 44, 44, - 36, 36, 36, 62, 61, 36, 36, 36, 36, 36, 36, 36, 36, 86, 86, 90, - 43, 89, 87, 87, 61, 44, 44, 44, 36, 70, 85,107, 64, 44, 44, 44, + 2, 64, 44, 44, 44, 44, 44, 44, 2, 2, 2, 2, 2, 44, 44, 44, + 43, 43, 43, 80, 43, 43, 43, 87, 63, 2, 2, 44, 44, 44, 44, 44, + 2, 36, 36, 36, 36, 36, 36, 36, 44, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 89, 43, 43, 43, 85, 43, 87, 80, 44, 44, 44, 44, + 36, 36, 36, 61, 36, 62, 36, 36, 70, 43, 43, 80, 44, 80, 43, 57, + 43, 43, 43, 70, 44, 44, 44, 44, 36, 36, 36, 62, 61, 36, 36, 36, + 36, 36, 36, 36, 36, 86, 86, 90, 43, 89, 87, 87, 61, 44, 44, 44, + 36, 70, 85,107, 64, 44, 44, 44, 43, 94, 36, 36, 36, 36, 36, 36, + 36, 36, 86, 43, 43, 80, 44, 86, 85, 60, 2, 2, 2, 2, 2, 2, 27, 27, 91, 67, 67, 67, 56, 20,168, 67, 67, 67, 67, 67, 67, 67, 67, 44, 44, 44, 44, 44, 44, 93,105,105,105,105,105,105,105,181, 2, 2, 64, 44, 44, 44, 44, 44, 63, 64, 44, 44, 44, 44, 44, 44, - 65, 65, 65, 65,132, 44, 44, 44, 43, 43, 60, 44, 44, 44, 44, 44, + 65, 65, 65, 65, 65, 65, 65, 65, 71, 36, 36, 70, 43, 43, 43, 43, + 43, 43, 43, 44, 44, 44, 44, 44, 43, 43, 60, 44, 44, 44, 44, 44, 43, 43, 43, 60, 2, 2, 67, 67, 40, 40, 97, 44, 44, 44, 44, 44, 7, 7, 7, 7, 7,179, 27, 27, 27, 62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 44, 62, 36, 27, 27, 27, 30, 2, 64, 44, 44, @@ -1441,7 +1447,8 @@ _hb_ucd_u8[17936] = 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 44, 44, 44, 57, 43, 74, 40, 40, 40, 40, 40, 40, 40, 88, 80, 44, 44, 44, 44, 44, 86, 44, 44, 44, 44, 44, 44, 44, 40, 40, 52, 40, 40, 40, 52, 81, - 36, 61, 44, 44, 44, 44, 44, 44, 44, 44, 36, 36, 44, 44, 44, 44, + 36, 61, 44, 44, 44, 44, 44, 44, 44, 61, 44, 44, 44, 44, 44, 44, + 36, 61, 62, 44, 44, 44, 44, 44, 44, 44, 36, 36, 44, 44, 44, 44, 36, 36, 36, 36, 36, 44, 50, 60, 65, 65, 44, 44, 44, 44, 44, 44, 43, 43, 43, 43, 43, 43, 43, 44, 43, 43, 43, 80, 44, 44, 44, 44, 67, 67, 67, 92, 55, 67, 67, 67, 67, 67,186, 87, 43, 67,186, 86, @@ -1466,10 +1473,12 @@ _hb_ucd_u8[17936] = 43, 43, 43, 43, 43, 43, 76, 67, 67, 67, 50, 67, 67, 67, 67, 67, 67, 67, 76, 21, 2, 2, 44, 44, 44, 44, 44, 44, 44, 57, 43, 43, 16, 16, 16, 16, 16, 39, 16, 16, 16, 16, 16, 16, 16, 16, 16,110, - 43, 43, 43, 80, 43, 43, 43, 43, 43, 43, 43, 43, 80, 57, 43, 43, - 43, 57, 80, 43, 43, 80, 44, 44, 43, 43, 43, 74, 40, 40, 40, 44, - 7, 7, 7, 7, 7, 44, 44, 77, 36, 36, 36, 36, 36, 36, 36, 80, - 36, 36, 36, 36, 36, 36, 43, 43, 7, 7, 7, 7, 7, 44, 44, 96, + 44, 44,150, 16, 16,110, 44, 44, 43, 43, 43, 80, 43, 43, 43, 43, + 43, 43, 43, 43, 80, 57, 43, 43, 43, 57, 80, 43, 43, 80, 44, 44, + 40, 40, 40, 40, 40, 40, 40, 44, 44, 44, 44, 44, 44, 44, 44, 57, + 43, 43, 43, 74, 40, 40, 40, 44, 7, 7, 7, 7, 7, 44, 44, 77, + 36, 36, 36, 36, 36, 36, 36, 80, 36, 36, 36, 36, 36, 36, 43, 43, + 7, 7, 7, 7, 7, 44, 44, 96, 36, 36, 36, 36, 36, 83, 43, 43, 36, 36, 36, 61, 36, 36, 62, 61, 36, 36, 61,179, 27, 27, 27, 27, 16, 16, 43, 43, 43, 74, 44, 44, 27, 27, 27, 27, 27, 27,163, 27, 188, 27,100, 44, 44, 44, 44, 44, 27, 27, 27, 27, 27, 27, 27,163, @@ -1482,138 +1491,141 @@ _hb_ucd_u8[17936] = 27, 27, 27, 27, 27, 27, 91, 67, 67, 67, 67, 67, 67, 67, 67, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 92, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 92, 44, 44, 44, 67, 44, 44, 44, 44, 44, 44, 44, - 67, 67, 67, 67, 67, 25, 41, 41, 67, 67, 67, 67, 44, 44, 55, 67, - 67, 67, 67, 67, 44, 44, 44, 44, 67, 67, 92, 44, 67, 67, 92, 44, + 67, 67, 67, 67, 67, 25, 41, 41, 67, 67, 67, 67, 44, 44, 67, 67, + 67, 67, 67, 92, 44, 55, 67, 67, 67, 67, 67, 67, 44, 44, 44, 44, + 67, 67, 67, 67, 67, 67, 67, 55, 67, 67, 67, 44, 44, 44, 44, 67, 67, 92, 67, 67, 67, 67, 67, 67, 79, 44, 44, 44, 44, 44, 44, 44, - 65, 65, 65, 65, 65, 65, 65, 65,171,171,171,171,171,171,171, 44, - 171,171,171,171,171,171,171, 0, 0, 0, 29, 21, 21, 21, 23, 21, - 22, 18, 21, 25, 21, 17, 13, 13, 25, 25, 25, 21, 21, 9, 9, 9, - 9, 22, 21, 18, 24, 16, 24, 5, 5, 5, 5, 22, 25, 18, 25, 0, - 23, 23, 26, 21, 24, 26, 7, 20, 25, 1, 26, 24, 26, 25, 15, 15, - 24, 15, 7, 19, 15, 21, 9, 25, 9, 5, 5, 25, 5, 9, 5, 7, - 7, 7, 9, 8, 8, 5, 7, 5, 6, 6, 24, 24, 6, 24, 12, 12, - 2, 2, 6, 5, 9, 21, 9, 2, 2, 9, 25, 9, 26, 12, 11, 11, - 2, 6, 5, 21, 17, 2, 2, 26, 26, 23, 2, 12, 17, 12, 21, 12, - 12, 21, 7, 2, 2, 7, 7, 21, 21, 2, 1, 1, 21, 23, 26, 26, - 1, 21, 6, 7, 7, 12, 12, 7, 21, 7, 12, 1, 12, 6, 6, 12, - 12, 26, 7, 26, 26, 7, 2, 1, 12, 2, 6, 2, 24, 7, 7, 6, - 1, 12, 12, 10, 10, 10, 10, 12, 21, 6, 2, 10, 10, 2, 15, 26, - 26, 2, 2, 21, 7, 10, 15, 7, 2, 23, 21, 26, 10, 7, 21, 15, - 15, 2, 17, 7, 29, 7, 7, 22, 18, 2, 14, 14, 14, 7, 10, 21, - 17, 21, 11, 12, 5, 2, 5, 6, 8, 8, 8, 24, 5, 24, 2, 24, - 9, 24, 24, 2, 29, 29, 29, 1, 17, 17, 20, 19, 22, 20, 27, 28, - 1, 29, 21, 20, 19, 21, 21, 16, 16, 21, 25, 22, 18, 21, 21, 29, - 1, 2, 15, 6, 18, 6, 23, 2, 12, 11, 9, 26, 26, 9, 26, 5, - 5, 26, 14, 9, 5, 14, 14, 15, 25, 26, 26, 22, 18, 26, 18, 25, - 18, 22, 5, 12, 2, 5, 22, 21, 21, 22, 18, 17, 26, 6, 7, 14, - 17, 22, 18, 18, 26, 14, 17, 6, 14, 6, 12, 24, 24, 6, 26, 15, - 6, 21, 11, 21, 24, 9, 6, 9, 23, 26, 6, 10, 4, 4, 3, 3, - 7, 25, 17, 16, 16, 22, 16, 16, 25, 17, 25, 2, 25, 24, 2, 15, - 12, 15, 14, 2, 21, 14, 7, 15, 12, 17, 21, 1, 26, 10, 10, 1, - 23, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 10, 11, 12, - 13, 0, 14, 0, 0, 0, 0, 0, 15, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, - 0, 21, 22, 23, 0, 0, 0, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 34, 0, 35, 0, 0, 0, 0, 0, 0, + 171,171,171,171,171,171,171, 44,171,171,171,171,171,171,171, 0, + 0, 0, 29, 21, 21, 21, 23, 21, 22, 18, 21, 25, 21, 17, 13, 13, + 25, 25, 25, 21, 21, 9, 9, 9, 9, 22, 21, 18, 24, 16, 24, 5, + 5, 5, 5, 22, 25, 18, 25, 0, 23, 23, 26, 21, 24, 26, 7, 20, + 25, 1, 26, 24, 26, 25, 15, 15, 24, 15, 7, 19, 15, 21, 9, 25, + 9, 5, 5, 25, 5, 9, 5, 7, 7, 7, 9, 8, 8, 5, 7, 5, + 6, 6, 24, 24, 6, 24, 12, 12, 2, 2, 6, 5, 9, 21, 9, 2, + 2, 9, 25, 9, 26, 12, 11, 11, 2, 6, 5, 21, 17, 2, 2, 26, + 26, 23, 2, 12, 17, 12, 21, 12, 12, 21, 7, 2, 2, 7, 7, 21, + 21, 2, 1, 1, 21, 23, 26, 26, 1, 21, 6, 7, 7, 12, 12, 7, + 21, 7, 12, 1, 12, 6, 6, 12, 12, 26, 7, 26, 26, 7, 2, 1, + 12, 2, 6, 2, 24, 7, 7, 6, 1, 12, 12, 10, 10, 10, 10, 12, + 21, 6, 2, 10, 10, 2, 15, 26, 26, 2, 2, 21, 7, 10, 15, 7, + 2, 23, 21, 26, 10, 7, 21, 15, 15, 2, 17, 7, 29, 7, 7, 22, + 18, 2, 14, 14, 14, 7, 10, 21, 17, 21, 11, 12, 5, 2, 5, 6, + 8, 8, 8, 24, 5, 24, 2, 24, 9, 24, 24, 2, 29, 29, 29, 1, + 17, 17, 20, 19, 22, 20, 27, 28, 1, 29, 21, 20, 19, 21, 21, 16, + 16, 21, 25, 22, 18, 21, 21, 29, 1, 2, 15, 6, 18, 6, 23, 2, + 12, 11, 9, 26, 26, 9, 26, 5, 5, 26, 14, 9, 5, 14, 14, 15, + 25, 26, 26, 22, 18, 26, 18, 25, 18, 22, 5, 12, 2, 5, 22, 21, + 21, 22, 18, 17, 26, 6, 7, 14, 17, 22, 18, 18, 26, 14, 17, 6, + 14, 6, 12, 24, 24, 6, 26, 15, 6, 21, 11, 21, 24, 9, 6, 9, + 23, 26, 6, 10, 4, 4, 3, 3, 7, 25, 17, 16, 16, 22, 16, 16, + 25, 17, 25, 2, 25, 24, 2, 15, 12, 15, 14, 2, 21, 14, 7, 15, + 12, 17, 21, 1, 26, 10, 10, 1, 23, 15, 0, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 0, 10, 11, 12, 13, 0, 14, 0, 0, 0, 0, 0, + 15, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, - 0, 0, 39, 40, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, - 0, 0, 0, 0, 6, 7, 8, 0, 9, 0, 10, 11, 0, 0, 12, 13, - 14, 15, 16, 0, 0, 0, 0, 17, 18, 19, 20, 0, 21, 0, 22, 23, - 0, 24, 25, 0, 0, 24, 26, 27, 0, 24, 26, 0, 0, 24, 26, 0, - 0, 24, 26, 0, 0, 0, 26, 0, 0, 24, 28, 0, 0, 24, 26, 0, - 0, 29, 26, 0, 0, 0, 30, 0, 0, 31, 32, 0, 0, 33, 34, 0, - 35, 36, 0, 37, 38, 0, 39, 0, 0, 40, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 43, 44, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 46, 0, 0, - 0, 47, 0, 0, 0, 0, 0, 0, 48, 0, 0, 49, 0, 50, 51, 0, - 0, 52, 53, 54, 0, 55, 0, 56, 0, 57, 0, 0, 0, 0, 58, 59, - 0, 0, 0, 0, 0, 0, 60, 61, 0, 0, 0, 0, 0, 0, 62, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, - 0, 0, 0, 65, 0, 0, 0, 66, 0, 67, 0, 0, 68, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 70, 0, 0, 71, - 0, 0, 0, 0, 0, 0, 0, 0, 72, 73, 0, 0, 0, 0, 53, 74, - 0, 75, 76, 0, 0, 77, 78, 0, 0, 0, 0, 0, 0, 79, 80, 81, - 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 20, 0, 21, 22, 23, 0, 0, 0, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 85, - 0, 0, 0, 86, 0, 0, 0, 0, 87, 88, 0, 0, 0, 0, 0, 89, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, + 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 0, - 0, 0, 92, 0, 93, 0, 0, 0, 0, 0, 72, 94, 0, 95, 0, 0, - 96, 97, 0, 77, 0, 0, 98, 0, 0, 99, 0, 0, 0, 0, 0,100, - 0,101, 26,102, 0, 0, 0, 0, 0, 0,103, 0, 0, 0,104, 0, - 0, 0, 0, 0, 0, 65,105, 0, 0, 65, 0, 0, 0,106, 0, 0, - 0,107, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 0, 0, 0, - 0,108,109, 0, 0, 0, 0, 78, 0, 44,110, 0,111, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, - 0, 0,112, 0,113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114, - 0,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0,116, 0, 0, 0, 0,117, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 38, 39, 0, 0, 0, 0, 0, 0, 40, 41, 42, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,118,119,120, 0, 0, 0, 0,121, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,122,123, 0, 0, 0, 0, 0, 0, - 0,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124, 0,125, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 0, - 0, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 4, 4, 8, 9, 10, - 1, 11, 12, 13, 14, 15, 16, 17, 18, 1, 1, 1, 0, 0, 0, 0, - 19, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 1, - 23, 4, 21, 24, 25, 26, 27, 28, 29, 30, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 1, 31, 0, 0, 0, 32, 33, 34, 35, 1, 36, - 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 38, 1, 39, - 14, 39, 40, 41, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, - 0, 0, 0, 0, 43, 36, 44, 45, 21, 45, 46, 0, 0, 0, 0, 0, - 0, 0, 19, 1, 21, 0, 0, 47, 0, 0, 0, 0, 0, 38, 48, 1, - 1, 49, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, - 0, 0, 0, 0, 0, 0, 52, 1, 0, 0, 38, 14, 4, 1, 1, 1, - 53, 21, 43, 52, 54, 21, 35, 1, 0, 0, 0, 0, 0, 0, 0, 55, - 0, 0, 0, 56, 57, 58, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 56, 0, 60, 0, 0, - 0, 0, 0, 0, 0, 0, 61, 62, 0, 0, 63, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 65, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 67, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 69, 70, 0, - 0, 0, 0, 0, 71, 72, 73, 74, 75, 76, 0, 0, 0, 0, 0, 0, - 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 79, 0, - 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, - 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, - 0, 0, 0, 0, 63, 0, 0, 81, 0, 0, 82, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 19, 84, 0, - 62, 0, 0, 0, 0, 49, 1, 85, 0, 0, 0, 0, 1, 52, 15, 86, - 36, 10, 21, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, - 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 19, 10, 1, 0, 0, 0, - 0, 0, 88, 0, 0, 0, 0, 0, 0, 89, 0, 0, 88, 0, 0, 0, - 0, 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 87, 9, 12, 4, - 90, 8, 91, 47, 0, 58, 50, 0, 21, 1, 21, 92, 93, 1, 1, 1, - 1, 1, 1, 1, 1, 94, 95, 96, 0, 0, 0, 0, 97, 1, 98, 58, - 81, 99,100, 4, 58, 0, 0, 0, 0, 0, 0, 19, 50, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 61, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 0,101,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,103, 0, - 0, 0, 0, 19, 0, 1, 1, 50, 0, 0, 0, 0, 0, 0, 0, 38, - 0, 0, 0, 0, 50, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 62, 0, 0, 0, 0, 1, 1, 1, 1, 50, 0, 0, 0, - 0, 0,104, 68, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, - 0, 0, 0, 0, 78, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,105,106, 58, 38, 81, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0,107, - 1, 14, 4, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, - 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 87, 0, - 0, 0, 0,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,109, 61, - 0,110, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 19, 58, 0, 0, 0, 0, 0,111, 14, 52, 84, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 6, 7, 8, 0, + 9, 0, 10, 11, 0, 0, 12, 13, 14, 15, 16, 0, 0, 0, 0, 17, + 18, 19, 20, 0, 21, 0, 22, 23, 0, 24, 25, 0, 0, 24, 26, 27, + 0, 24, 26, 0, 0, 24, 26, 0, 0, 24, 26, 0, 0, 0, 26, 0, + 0, 24, 28, 0, 0, 24, 26, 0, 0, 29, 26, 0, 0, 0, 30, 0, + 0, 31, 32, 0, 0, 33, 34, 0, 35, 36, 0, 37, 38, 0, 39, 0, + 0, 40, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 0, 0, 0, 0, 45, 0, + 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, + 48, 0, 0, 49, 0, 50, 51, 0, 0, 52, 53, 54, 0, 55, 0, 56, + 0, 57, 0, 0, 0, 0, 58, 59, 0, 0, 0, 0, 0, 0, 60, 61, + 0, 0, 0, 0, 0, 0, 62, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 65, 0, 0, 0, 66, + 0, 67, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 69, 70, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, + 72, 73, 0, 0, 0, 0, 53, 74, 0, 75, 76, 0, 0, 77, 78, 0, + 0, 0, 0, 0, 0, 79, 80, 81, 0, 0, 0, 0, 0, 0, 0, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, + 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, + 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 86, 0, 0, 0, 0, + 87, 88, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 91, 0, 92, 0, 0, 93, 0, 94, 0, 0, 0, + 0, 0, 72, 95, 0, 96, 0, 0, 97, 98, 0, 77, 0, 0, 99, 0, + 0,100, 0, 0, 0, 0, 0,101, 0,102, 26,103, 0, 0, 0, 0, + 0, 0,104, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 65,106, 0, + 0, 65, 0, 0, 0,107, 0, 0, 0,108, 0, 0, 0, 0, 0, 0, + 0, 96, 0, 0, 0, 0, 0, 0, 0,109,110, 0, 0, 0, 0, 78, + 0, 44,111, 0,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 65, 0, 0, 0, 0, 0, 0, 0, 0,113, 0,114, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,115, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,116, 0,117, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, + 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,121,122, 0, 0, + 0, 0,123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 124,125, 0, 0,126, 0, 0, 0, 0,117, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,127, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,129, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,130, 0, 0, 0,131, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 3, 4, + 5, 6, 7, 4, 4, 8, 9, 10, 1, 11, 12, 13, 14, 15, 16, 17, + 18, 1, 1, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 20, 21, 22, 1, 23, 4, 21, 24, 25, 26, 27, 28, + 29, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 31, 0, + 0, 0, 32, 33, 34, 35, 1, 36, 0, 0, 0, 0, 37, 0, 0, 0, + 0, 0, 0, 0, 0, 38, 1, 39, 14, 39, 40, 41, 0, 0, 0, 0, + 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 43, 36, 44, 45, + 21, 45, 46, 0, 0, 0, 0, 0, 0, 0, 19, 1, 21, 0, 0, 47, + 0, 0, 0, 0, 0, 38, 48, 1, 1, 49, 49, 50, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 52, 1, + 0, 0, 38, 14, 4, 1, 1, 1, 53, 21, 43, 52, 54, 21, 35, 1, + 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 56, 57, 58, 0, 0, + 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, + 0, 0, 0, 56, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 61, 62, + 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, + 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, + 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, + 0, 0, 0, 0, 0, 69, 70, 0, 0, 0, 0, 0, 71, 72, 73, 74, + 75, 76, 0, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 78, 79, 0, 0, 0, 0, 47, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 80, 0, 0, + 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 63, 0, 0, 81, + 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, + 0, 0, 0, 0, 0, 19, 84, 0, 62, 0, 0, 0, 0, 49, 1, 85, + 0, 0, 0, 0, 1, 52, 15, 86, 36, 10, 21, 87, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 55, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 10, 1, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, + 0, 89, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, + 0, 0, 0, 0, 87, 9, 12, 4, 90, 8, 91, 47, 0, 58, 50, 0, + 21, 1, 21, 92, 93, 1, 1, 1, 1, 1, 1, 1, 1, 94, 95, 96, + 0, 0, 0, 0, 97, 1, 98, 58, 81, 99,100, 4, 58, 0, 0, 0, + 0, 0, 0, 19, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,101,102, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,103, 0, 0, 0, 0, 19, 0, 1, 1, 50, + 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 50, 0, 0, 0, + 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, + 1, 1, 1, 1, 50, 0, 0, 0, 0, 0,104, 68, 0, 0, 0, 0, + 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, + 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,105,106, 58, 38, + 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, + 0, 0, 0, 0, 0, 0, 0,107, 1, 14, 4, 12, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 47, 84, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 38, 87, 0, 0, 0, 0,108, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,109, 61, 0,110, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 19, 58, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 51, 0,111, 14, 52, 84, 0, 0, 0, 112, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 61, 0, 0, 0, 0, 0, 0,113, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 62, 0, 0, 62, 0, 89, 0, 0, 0, 0, 0, @@ -1624,89 +1636,90 @@ _hb_ucd_u8[17936] = 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 78, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 89, 80, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 8, 91, 0, 0, - 0, 0, 0, 0, 1, 87, 0, 0, 0, 0, 0, 0,116, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0,117, 0,118,119,120,121, 0,104, 4, - 122, 49, 23, 0, 0, 0, 0, 0, 0, 0, 38, 50, 0, 0, 0, 0, - 38, 58, 0, 0, 0, 0, 0, 0, 1, 87, 1, 1, 1, 1, 39, 1, - 48,105, 87, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 4,122, 0, 0, - 0, 1,123, 0, 0, 0, 0, 0, 0, 0, 0, 0,230,230,230,230, - 230,232,220,220,220,220,232,216,220,220,220,220,220,202,202,220, - 220,220,220,202,202,220,220,220, 1, 1, 1, 1, 1,220,220,220, - 220,230,230,230,230,240,230,220,220,220,230,230,230,220,220, 0, - 230,230,230,220,220,220,220,230,232,220,220,230,233,234,234,233, - 234,234,233,230, 0, 0, 0,230, 0,220,230,230,230,230,220,230, - 230,230,222,220,230,230,220,220,230,222,228,230, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 0, 23, 0, 24, 25, 0, - 230,220, 0, 18, 30, 31, 32, 0, 0, 0, 0, 27, 28, 29, 30, 31, - 32, 33, 34,230,230,220,220,230,220,230,230,220, 35, 0, 0, 0, - 0, 0,230,230,230, 0, 0,230,230, 0,220,230,230,220, 0, 0, - 0, 36, 0, 0,230,220,230,230,220,220,230,220,220,230,220,230, - 220,230,230, 0, 0,220, 0, 0,230,230, 0,230, 0,230,230,230, - 230,230, 0, 0, 0,220,220,220,230,220,220,220,230,230, 0,220, - 27, 28, 29,230, 7, 0, 0, 0, 0, 9, 0, 0, 0,230,220,230, - 230, 0, 0, 0, 0, 0,230, 0, 0, 84, 91, 0, 0, 0, 0, 9, - 9, 0, 0, 0, 0, 0, 9, 0,103,103, 9, 0,107,107,107,107, - 118,118, 9, 0,122,122,122,122,220,220, 0, 0, 0,220, 0,220, - 0,216, 0, 0, 0,129,130, 0,132, 0, 0, 0, 0, 0,130,130, - 130,130, 0, 0,130, 0,230,230, 9, 0,230,230, 0, 0,220, 0, - 0, 0, 0, 7, 0, 9, 9, 0, 9, 9, 0, 0, 0,230, 0, 0, - 0,228, 0, 0, 0,222,230,220,220, 0, 0, 0,230, 0, 0,220, - 230,220, 0,220,230,230,230, 0, 0, 0, 9, 9, 0, 0, 7, 0, - 230, 0, 1, 1, 1, 0, 0, 0,230,234,214,220,202,230,230,230, - 230,230,232,228,228,220,218,230,233,220,230,220,230,230, 1, 1, - 1, 1, 1,230, 0, 1, 1,230,220,230, 1, 1, 0, 0,218,228, - 232,222,224,224, 0, 8, 8, 0, 0, 0, 0,220,230, 0,230,230, - 220, 0, 0,230, 0, 0, 26, 0, 0,220, 0,230,230, 1,220, 0, - 0,230,220, 0, 0, 0,220,220, 0, 0,230,220, 0, 9, 7, 0, - 0, 7, 9, 0, 0, 0, 9, 7, 6, 6, 0, 0, 0, 0, 1, 0, - 0,216,216, 1, 1, 1, 0, 0, 0,226,216,216,216,216,216, 0, - 220,220,220, 0,230,230, 7, 0, 16, 17, 17, 17, 17, 17, 17, 33, - 17, 17, 17, 19, 17, 17, 17, 17, 20,101, 17,113,129,169, 17, 27, - 28, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 0, 0, 0, 0, 0, 61, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8, 91, 0, 0, 0, 0, 0, 0, 1, 87, 0, 0, + 0, 0, 0, 0,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,117, + 0,118,119,120,121, 0,104, 4,122, 49, 23, 0, 0, 0, 0, 0, + 0, 0, 38, 50, 0, 0, 0, 0, 38, 58, 0, 0, 0, 0, 0, 0, + 1, 87, 1, 1, 1, 1, 39, 1, 48,105, 87, 0, 0, 0, 0, 0, + 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,123, 0, 0, 0, 0, + 0, 0, 0, 0, 4,122, 0, 0, 0, 1,124, 0, 0, 0, 0, 0, + 0, 0, 0, 0,230,230,230,230,230,232,220,220,220,220,232,216, + 220,220,220,220,220,202,202,220,220,220,220,202,202,220,220,220, + 1, 1, 1, 1, 1,220,220,220,220,230,230,230,230,240,230,220, + 220,220,230,230,230,220,220, 0,230,230,230,220,220,220,220,230, + 232,220,220,230,233,234,234,233,234,234,233,230, 0, 0, 0,230, + 0,220,230,230,230,230,220,230,230,230,222,220,230,230,220,220, + 230,222,228,230, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, + 21, 22, 0, 23, 0, 24, 25, 0,230,220, 0, 18, 30, 31, 32, 0, + 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34,230,230,220,220,230, + 220,230,230,220, 35, 0, 0, 0, 0, 0,230,230,230, 0, 0,230, + 230, 0,220,230,230,220, 0, 0, 0, 36, 0, 0,230,220,230,230, + 220,220,230,220,220,230,220,230,220,230,230, 0, 0,220, 0, 0, + 230,230, 0,230, 0,230,230,230,230,230, 0, 0, 0,220,220,220, + 230,220,220,220,230,230, 0,220, 27, 28, 29,230, 7, 0, 0, 0, + 0, 9, 0, 0, 0,230,220,230,230, 0, 0, 0, 0, 0,230, 0, + 0, 84, 91, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 9, 0, + 103,103, 9, 0,107,107,107,107,118,118, 9, 0,122,122,122,122, + 220,220, 0, 0, 0,220, 0,220, 0,216, 0, 0, 0,129,130, 0, + 132, 0, 0, 0, 0, 0,130,130,130,130, 0, 0,130, 0,230,230, + 9, 0,230,230, 0, 0,220, 0, 0, 0, 0, 7, 0, 9, 9, 0, + 9, 9, 0, 0, 0,230, 0, 0, 0,228, 0, 0, 0,222,230,220, + 220, 0, 0, 0,230, 0, 0,220,230,220, 0,220,230,230,230, 0, + 0, 0, 9, 9, 0, 0, 7, 0,230, 0, 1, 1, 1, 0, 0, 0, + 230,234,214,220,202,230,230,230,230,230,232,228,228,220,218,230, + 233,220,230,220,230,230, 1, 1, 1, 1, 1,230, 0, 1, 1,230, + 220,230, 1, 1, 0, 0,218,228,232,222,224,224, 0, 8, 8, 0, + 0, 0, 0,220,230, 0,230,230,220, 0, 0,230, 0, 0, 26, 0, + 0,220, 0,230,230, 1,220, 0, 0,230,220, 0, 0, 0,220,220, + 0, 0,230,220, 0, 9, 7, 0, 0, 7, 9, 0, 0, 0, 9, 7, + 6, 6, 0, 0, 0, 0, 1, 0, 0,216,216, 1, 1, 1, 0, 0, + 0,226,216,216,216,216,216, 0,220,220,220, 0,232,232,220,230, + 230,230, 7, 0, 16, 17, 17, 17, 17, 17, 17, 33, 17, 17, 17, 19, + 17, 17, 17, 17, 20,101, 17,113,129,169, 17, 27, 28, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17,237, 0, 1, 2, 2, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 0, 0, 0, 0, 6, 7, 8, 9, 0, 0, 0, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 20, 0, 0, 21, 22, 0, 0, 0, 0, 23, 24, 25, 26, - 0, 27, 0, 28, 29, 30, 31, 32, 0, 0, 0, 0, 0, 0, 0, 33, - 34, 35, 36, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 38, 39, 0, 0, 0, 0, 1, 2, 40, 41, 0, 1, 2, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 5, 0, 0, 0, 6, 0, - 0, 0, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 8, 9, - 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, - 0, 0, 11, 12, 0, 13, 0, 14, 15, 16, 0, 0, 0, 0, 0, 1, - 17, 18, 0, 19, 7, 1, 0, 0, 0, 20, 20, 7, 20, 20, 20, 20, - 20, 20, 20, 8, 21, 0, 22, 0, 7, 23, 24, 0, 20, 20, 25, 0, - 0, 0, 26, 27, 1, 7, 20, 20, 20, 20, 20, 1, 28, 29, 30, 31, - 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, - 0, 0, 20, 20, 20, 1, 0, 0, 8, 21, 32, 4, 0, 10, 0, 33, - 7, 20, 20, 20, 0, 0, 0, 0, 8, 34, 34, 35, 36, 34, 37, 0, - 38, 1, 20, 20, 0, 0, 39, 0, 1, 1, 0, 8, 21, 1, 20, 0, - 0, 0, 1, 0, 0, 40, 1, 1, 0, 0, 8, 21, 0, 1, 0, 1, - 0, 1, 0, 0, 0, 0, 26, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 21, 7, 20, 41, 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, 0, 42, - 43, 44, 0, 45, 0, 8, 21, 0, 0, 0, 0, 0, 0, 0, 0, 46, - 7, 1, 10, 1, 0, 0, 0, 1, 20, 20, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 26, 34, 9, 0, 0, 20, 20, 1, 20, 20, 0, - 0, 0, 0, 0, 0, 0, 26, 21, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3, 47, 48, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 9, 10, 11, 11, 11, 11, 12, 13, 13, 13, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 13, 22, 13, 13, 13, 13, 23, 24, 24, - 25, 26, 13, 13, 13, 27, 28, 29, 13, 30, 31, 32, 33, 34, 35, 36, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17,237, 0, 1, 2, 2, 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 6, 7, 8, 9, 0, 0, 0, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, + 0, 0, 21, 22, 0, 0, 0, 0, 23, 24, 25, 26, 0, 27, 0, 28, + 29, 30, 31, 32, 0, 0, 0, 0, 0, 0, 0, 33, 34, 35, 36, 0, + 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 39, + 0, 0, 0, 0, 1, 2, 40, 41, 0, 1, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 3, 4, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 0, 0, + 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 8, 9, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 11, 12, + 0, 13, 0, 14, 15, 16, 0, 0, 0, 0, 0, 1, 17, 18, 0, 19, + 7, 1, 0, 0, 0, 20, 20, 7, 20, 20, 20, 20, 20, 20, 20, 8, + 21, 0, 22, 0, 7, 23, 24, 0, 20, 20, 25, 0, 0, 0, 26, 27, + 1, 7, 20, 20, 20, 20, 20, 1, 28, 29, 30, 31, 0, 0, 20, 0, + 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 20, 20, + 20, 1, 0, 0, 8, 21, 32, 4, 0, 10, 0, 33, 7, 20, 20, 20, + 0, 0, 0, 0, 8, 34, 34, 35, 36, 34, 37, 0, 38, 1, 20, 20, + 0, 0, 39, 0, 1, 1, 0, 8, 21, 1, 20, 0, 0, 0, 1, 0, + 0, 40, 1, 1, 0, 0, 8, 21, 0, 1, 0, 1, 0, 1, 0, 0, + 0, 0, 26, 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, 7, 20, 41, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, 0, 42, 43, 44, 0, 45, + 0, 8, 21, 0, 0, 0, 0, 0, 0, 0, 0, 46, 7, 1, 10, 1, + 0, 0, 0, 1, 20, 20, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 26, 34, 9, 0, 0, 20, 20, 1, 20, 20, 0, 0, 0, 0, 0, + 0, 0, 26, 21, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 47, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, + 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 9, 10, 11, 11, 11, 11, 12, 13, 13, 13, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 13, 22, 13, 13, 13, 13, 23, 24, 24, 25, 26, 13, 13, + 13, 27, 28, 29, 13, 30, 31, 32, 33, 34, 35, 36, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 37, 7, 38, 39, 7, 40, 7, 7, 7, 41, 13, 42, - 7, 7, 43, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 37, 7, 38, 39, 7, 40, 7, 7, 7, 41, 13, 42, 7, 7, 43, 7, + 44, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, @@ -1727,411 +1740,419 @@ _hb_ucd_u8[17936] = 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 44, 0, 0, 1, 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 37, 37, 37, 37, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 2, 2, - 53, 54, 55, 56, 57, 58, 59, 59, 59, 59, 60, 59, 59, 59, 59, 59, - 59, 59, 61, 61, 59, 59, 59, 59, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 59, 70, 70, 70, 70, 70, 70, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 45, 0, 0, 1, + 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 32, 33, 34, 35, 36, 37, 37, 37, 37, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 2, 2, 53, 54, 55, 56, + 57, 58, 59, 59, 59, 59, 60, 59, 59, 59, 59, 59, 59, 59, 61, 61, + 59, 59, 59, 59, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 59, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 79, 70, 70, - 70, 70, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81, 82, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 79, 70, 70, 70, 70, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 81, 82, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 95, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 70, 70, 97, 98, 99,100,101,101,102,103,104,105, - 106,107,108,109,110,111, 96,112,113,114,115,116,117,118,119,119, - 120,121,122,123,124,125,126,127,128,129,130,131,132, 96,133,134, - 135,136,137,138,139,140,141,142,143, 96,144,145, 96,146,147,148, - 149, 96,150,151,152,153,154,155, 96, 96,156,157,158,159, 96,160, - 96,161,162,162,162,162,162,162,162,163,164,162,165, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96,166,167,167,167,167,167,167,167,167,168, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,169,169,169,169,170, 96, - 96, 96,171,171,171,171,172,173,174,175, 96, 96, 96, 96,176,177, - 178,179,180,180,180,180,180,180,180,180,180,180,180,180,180,180, - 180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180, - 180,181,180,180,180,180,180,180,182,182,182,183,184, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96,185,186,187,188,189,189,190, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,191,192, 96, 96, 96, 96, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 95, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 193,194, 59,195,196,197,198,199,200, 96,201,202,203, 59, 59,204, - 59,205,206,206,206,206,206,207, 96, 96, 96, 96, 96, 96, 96, 96, - 208, 96,209, 96,210, 96, 96,211, 96, 96, 96, 96, 96, 96, 96, 96, - 96,212,213,214,215, 96, 96, 96, 96, 96,216,217,218, 96,219,220, - 96, 96,221,222, 59,223,224, 96, 59, 59, 59, 59, 59, 59, 59,225, - 226,227,228,229, 59, 59,230,231, 59,232, 96, 96, 96, 96, 96, 96, - 96, 96, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,233, + 70, 70, 97, 98, 99,100,101,101,102,103,104,105,106,107,108,109, + 110,111, 96,112,113,114,115,116,117,118,119,119,120,121,122,123, + 124,125,126,127,128,129,130,131,132, 96,133,134,135,136,137,138, + 139,140,141,142,143, 96,144,145, 96,146,147,148,149, 96,150,151, + 152,153,154,155,156, 96,157,158,159,160, 96,161,162,163,164,164, + 164,164,164,164,164,165,166,164,167, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,168,169,169, + 169,169,169,169,169,169,170, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96,171,171,171,171,172, 96, 96, 96,173,173, + 173,173,174,175,176,177, 96, 96, 96, 96,178,179,180,181,182,182, + 182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182, + 182,182,182,182,182,182,182,182,182,182,182,182,182,183,182,182, + 182,182,182,182,184,184,184,185,186, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,187,188,189, + 190,191,191,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96,193,194, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,195,196, 59,197, + 198,199,200,201,202, 96,203,204,205, 59, 59,206, 59,207,208,208, + 208,208,208,209, 96, 96, 96, 96, 96, 96, 96, 96,210, 96,211,212, + 213, 96, 96,214, 96, 96, 96,215, 96, 96, 96, 96, 96,216,217,218, + 219, 96, 96, 96, 96, 96,220,221,222, 96,223,224, 96, 96,225,226, + 59,227,228, 96, 59, 59, 59, 59, 59, 59, 59,229,230,231,232,233, + 59, 59,234,235, 59,236, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,237, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,238, 70,239, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 234, 70,235, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,236, - 70, 70, 70, 70, 70, 70, 70, 70, 70,237, 96, 96, 96, 96, 96, 96, - 96, 96, 70, 70, 70, 70,238, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 70, 70, 70, 70, 70, 70,239, 96, 96, 96, 96, 96, 96, 96, - 96, 96,240, 96,241,242, 0, 1, 2, 2, 0, 1, 2, 2, 2, 3, - 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, - 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, - 19, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 0, - 0, 0, 0, 0, 26, 26, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, - 1, 1, 9, 9, 9, 9, 0, 9, 9, 9, 2, 2, 9, 9, 9, 9, - 0, 9, 2, 2, 2, 2, 9, 0, 9, 0, 9, 9, 9, 2, 9, 2, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 9, 9, 9, - 9, 9, 9, 9, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, - 1, 6, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 2, 2, 4, - 4, 4, 2, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 2, 2, 2, 2, 2, 2, 2, 2, 14, 14, 14, 2, 2, 2, - 2, 14, 14, 14, 14, 14, 14, 2, 2, 2, 3, 3, 3, 3, 3, 0, - 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 0, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, 2, 37, 37, 37, 37, 2, 2, 37, - 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 2, 2, 2, 2, - 2, 2, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 2, 2, 64, - 64, 64, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 2, 2, 90, 90, 90, 90, 90, 90, 90, 2, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 95, 95, 2, 2, 95, 2, 37, 37, 37, 2, 2, 2, - 2, 2, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 2, 2, 2, 2, - 2, 2, 3, 3, 0, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 0, 0, - 7, 7, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 2, - 2, 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 2, 5, 2, 2, 2, - 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, - 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 5, 5, - 2, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 2, 2, 11, 11, 11, 2, 11, 11, 11, 11, 11, 11, 2, 2, 2, - 2, 11, 11, 2, 2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 2, 11, 11, 11, 11, 11, 11, 11, 2, 11, 11, 2, 11, - 11, 2, 11, 11, 2, 2, 11, 2, 11, 11, 11, 2, 2, 11, 11, 11, - 2, 2, 2, 11, 2, 2, 2, 2, 2, 2, 2, 11, 11, 11, 11, 2, - 11, 2, 2, 2, 2, 2, 2, 2, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 2, 2, 10, 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 2, 10, 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 2, 10, - 10, 10, 10, 10, 2, 2, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, - 2, 2, 10, 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 2, 2, - 10, 10, 10, 10, 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, - 10, 10, 2, 21, 21, 21, 2, 21, 21, 21, 21, 21, 21, 21, 21, 2, - 2, 21, 21, 2, 2, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 2, 21, 21, 21, 21, 21, 21, 21, 2, 21, 21, 2, 21, - 21, 21, 21, 21, 2, 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 21, - 2, 2, 2, 2, 2, 2, 2, 21, 21, 21, 2, 2, 2, 2, 21, 21, - 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 2, 2, 22, 22, 2, 22, - 22, 22, 22, 22, 22, 2, 2, 2, 22, 22, 22, 2, 22, 22, 22, 22, - 2, 2, 2, 22, 22, 2, 22, 2, 22, 22, 2, 2, 2, 22, 22, 2, - 2, 2, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 2, 2, 2, 2, - 22, 22, 22, 2, 2, 2, 2, 2, 2, 22, 2, 2, 2, 2, 2, 2, - 22, 22, 22, 22, 22, 2, 2, 2, 2, 2, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 2, 23, 23, 23, 2, 23, 23, 23, 23, - 23, 23, 23, 23, 2, 2, 23, 23, 23, 23, 23, 2, 23, 23, 23, 23, - 2, 2, 2, 2, 2, 2, 2, 23, 23, 2, 23, 23, 23, 2, 2, 23, - 2, 2, 23, 23, 23, 23, 2, 2, 23, 23, 2, 2, 2, 2, 2, 2, - 2, 23, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, - 16, 16, 16, 2, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, - 16, 16, 16, 16, 2, 2, 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, - 2, 2, 2, 2, 2, 2, 2, 16, 16, 2, 16, 16, 16, 16, 2, 2, - 16, 16, 2, 16, 16, 2, 2, 2, 2, 2, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 2, 20, 20, 20, 2, 20, 20, 20, 20, - 20, 20, 2, 2, 2, 2, 20, 20, 20, 20, 20, 20, 20, 20, 2, 2, - 20, 20, 2, 36, 36, 36, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 2, 2, 36, 36, 36, 36, - 36, 36, 36, 36, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 36, - 2, 2, 2, 2, 36, 2, 2, 2, 2, 36, 36, 36, 36, 36, 36, 2, - 36, 2, 2, 2, 2, 2, 2, 2, 36, 36, 2, 2, 36, 36, 36, 2, - 2, 2, 2, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 2, 2, 2, 2, 0, 24, 24, 24, 24, 2, 2, - 2, 2, 2, 18, 18, 2, 18, 2, 18, 18, 18, 18, 18, 2, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 2, 18, - 2, 18, 18, 18, 18, 18, 18, 18, 2, 2, 18, 18, 18, 18, 18, 2, - 18, 2, 18, 18, 2, 2, 18, 18, 18, 18, 25, 25, 25, 25, 25, 25, - 25, 25, 2, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 2, - 2, 2, 25, 25, 25, 25, 25, 2, 25, 25, 25, 25, 25, 25, 25, 0, - 0, 0, 0, 25, 25, 2, 2, 2, 2, 2, 33, 33, 33, 33, 33, 33, - 33, 33, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 2, 8, 2, 2, 2, 2, 2, 8, 2, 2, 8, 8, 8, 0, 8, 8, - 8, 8, 12, 12, 12, 12, 12, 12, 12, 12, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 2, 30, 30, 30, 30, 2, 2, 30, 30, 30, 30, 30, 30, - 30, 2, 30, 30, 30, 2, 2, 30, 30, 30, 30, 30, 30, 30, 30, 2, - 2, 2, 30, 30, 2, 2, 2, 2, 2, 2, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 2, 2, 28, 28, 28, 28, 28, 28, - 28, 28, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 2, - 2, 2, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, - 35, 35, 35, 2, 2, 2, 2, 2, 2, 2, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 45, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, - 0, 2, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 2, 2, - 2, 2, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 2, - 46, 46, 46, 2, 46, 46, 2, 2, 2, 2, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 2, 2, 31, 31, 2, 2, 2, 2, - 2, 2, 32, 32, 0, 0, 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 2, 2, 2, 2, 2, 2, 32, 2, 2, 2, 2, 2, - 2, 2, 32, 32, 32, 2, 2, 2, 2, 2, 28, 28, 28, 28, 28, 28, - 2, 2, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 2, 48, 48, 48, 48, 2, 2, 2, 2, 48, 2, 2, 2, 48, 48, - 48, 48, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 2, 2, 52, 52, 52, 52, 52, 2, 2, 2, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 2, 2, 2, 2, 58, 58, 2, 2, 2, 2, - 2, 2, 58, 58, 58, 2, 2, 2, 58, 58, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 2, 2, 54, 54, 91, 91, 91, 91, 91, 91, - 91, 91, 91, 91, 91, 91, 91, 91, 91, 2, 91, 91, 91, 91, 91, 2, - 2, 91, 91, 91, 2, 2, 2, 2, 2, 2, 91, 91, 91, 91, 91, 91, - 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 2, 2, 2, 62, 62, 62, 62, 62, 62, - 62, 2, 76, 76, 76, 76, 76, 76, 76, 76, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 93, 93, 93, 2, 2, 2, 2, 2, 2, 2, 2, 93, 93, - 93, 93, 70, 70, 70, 70, 70, 70, 70, 70, 2, 2, 2, 70, 70, 70, - 70, 70, 70, 70, 2, 2, 2, 70, 70, 70, 73, 73, 73, 73, 73, 73, - 73, 73, 6, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2, 8, - 8, 8, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, - 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 1, 1, 0, 2, 2, 2, 2, 2, 19, 19, 19, 19, 19, 19, - 9, 9, 9, 9, 9, 6, 19, 19, 19, 19, 19, 19, 19, 19, 19, 9, - 9, 9, 9, 9, 19, 19, 19, 19, 9, 9, 9, 9, 9, 19, 19, 19, - 19, 19, 6, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 9, 9, 9, 9, 9, 9, 9, 2, 2, 2, 9, 2, 9, 2, 9, - 2, 9, 9, 9, 9, 9, 9, 2, 9, 9, 9, 9, 9, 9, 2, 2, - 9, 9, 9, 9, 9, 9, 2, 9, 9, 9, 2, 2, 9, 9, 9, 2, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 0, 0, 0, 0, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 19, 2, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, - 0, 2, 19, 19, 19, 19, 19, 2, 2, 2, 0, 2, 2, 2, 2, 2, - 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, - 9, 0, 0, 0, 19, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 19, 0, 19, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, - 2, 2, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 2, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 56, 56, 56, 56, 56, 56, - 56, 56, 55, 55, 55, 55, 2, 2, 2, 2, 2, 55, 55, 55, 55, 55, - 55, 55, 61, 61, 61, 61, 61, 61, 61, 61, 2, 2, 2, 2, 2, 2, - 2, 61, 61, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, - 2, 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 13, 13, 13, 13, 13, 13, - 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 13, - 0, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1, 1, 1, 1, - 12, 12, 13, 13, 13, 13, 0, 0, 0, 0, 2, 15, 15, 15, 15, 15, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,240, 70, 70, 70, 70, + 70, 70, 70, 70, 70,241, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, + 70, 70,242, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, + 70, 70, 70, 70,243, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70,244, 96, 96, 96, 96, 96, 96, 96, 96,245, 96, + 246,247, 0, 1, 2, 2, 0, 1, 2, 2, 2, 3, 4, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 0, 19, 0, + 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 0, 0, 0, 0, 0, + 26, 26, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, + 9, 9, 0, 9, 9, 9, 2, 2, 9, 9, 9, 9, 0, 9, 2, 2, + 2, 2, 9, 0, 9, 0, 9, 9, 9, 2, 9, 2, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 2, 9, 9, 9, 9, 9, 9, 9, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 1, 6, 2, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 2, 4, 4, 4, 2, 2, 4, 4, 4, 2, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 2, 2, + 2, 2, 2, 2, 2, 2, 14, 14, 14, 2, 2, 2, 2, 14, 14, 14, + 14, 14, 14, 2, 2, 2, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, + 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 0, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 3, + 3, 3, 3, 3, 3, 3, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 2, 37, 37, 37, 37, 2, 2, 37, 37, 37, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 2, 2, 2, 2, 2, 2, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 2, 2, 64, 64, 64, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 2, 2, 90, 90, + 90, 90, 90, 90, 90, 2, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 2, 2, 95, 2, 37, 37, 37, 2, 2, 2, 2, 2, 3, 3, + 3, 3, 3, 3, 3, 2, 3, 3, 2, 2, 2, 2, 2, 2, 3, 3, + 0, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, + 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 5, 5, + 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5, 5, 2, + 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, + 5, 5, 5, 5, 5, 5, 5, 2, 5, 2, 2, 2, 5, 5, 5, 5, + 2, 2, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 2, 2, 2, + 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 5, 5, 2, 5, 5, 5, + 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 11, + 11, 11, 2, 11, 11, 11, 11, 11, 11, 2, 2, 2, 2, 11, 11, 2, + 2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 2, + 11, 11, 11, 11, 11, 11, 11, 2, 11, 11, 2, 11, 11, 2, 11, 11, + 2, 2, 11, 2, 11, 11, 11, 2, 2, 11, 11, 11, 2, 2, 2, 11, + 2, 2, 2, 2, 2, 2, 2, 11, 11, 11, 11, 2, 11, 2, 2, 2, + 2, 2, 2, 2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 2, 2, 10, + 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, + 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, + 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 2, 10, 10, 10, 10, 10, + 2, 2, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, 2, 2, 10, 2, + 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 2, 2, 10, 10, 10, 10, + 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 10, 2, 21, + 21, 21, 2, 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, 21, 21, 2, + 2, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, + 21, 21, 21, 21, 21, 21, 21, 2, 21, 21, 2, 21, 21, 21, 21, 21, + 2, 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 21, 2, 2, 2, 2, + 2, 2, 2, 21, 21, 21, 2, 2, 2, 2, 21, 21, 2, 21, 21, 21, + 21, 21, 2, 2, 21, 21, 2, 2, 22, 22, 2, 22, 22, 22, 22, 22, + 22, 2, 2, 2, 22, 22, 22, 2, 22, 22, 22, 22, 2, 2, 2, 22, + 22, 2, 22, 2, 22, 22, 2, 2, 2, 22, 22, 2, 2, 2, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 2, 2, 2, 2, 22, 22, 22, 2, + 2, 2, 2, 2, 2, 22, 2, 2, 2, 2, 2, 2, 22, 22, 22, 22, + 22, 2, 2, 2, 2, 2, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 2, 23, 23, 23, 2, 23, 23, 23, 23, 23, 23, 23, 23, + 2, 2, 23, 23, 23, 23, 23, 2, 23, 23, 23, 23, 2, 2, 2, 2, + 2, 2, 2, 23, 23, 2, 23, 23, 23, 2, 2, 23, 2, 2, 23, 23, + 23, 23, 2, 2, 23, 23, 2, 2, 2, 2, 2, 2, 2, 23, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 16, 2, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, 16, + 2, 2, 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, 2, 2, 2, 2, + 2, 2, 2, 16, 16, 2, 16, 16, 16, 16, 2, 2, 16, 16, 2, 16, + 16, 16, 2, 2, 2, 2, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 2, 20, 20, 20, 2, 20, 20, 20, 20, 20, 20, 2, 2, + 2, 2, 20, 20, 20, 20, 20, 20, 20, 20, 2, 2, 20, 20, 2, 36, + 36, 36, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 2, 2, 2, 36, 36, 36, 36, 36, 36, 36, 36, + 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 36, 2, 2, 2, 2, + 36, 2, 2, 2, 2, 36, 36, 36, 36, 36, 36, 2, 36, 2, 2, 2, + 2, 2, 2, 2, 36, 36, 2, 2, 36, 36, 36, 2, 2, 2, 2, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 2, 2, 2, 2, 0, 24, 24, 24, 24, 2, 2, 2, 2, 2, 18, + 18, 2, 18, 2, 18, 18, 18, 18, 18, 2, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 2, 18, 2, 18, 18, 18, + 18, 18, 18, 18, 2, 2, 18, 18, 18, 18, 18, 2, 18, 2, 18, 18, + 18, 18, 18, 18, 18, 2, 18, 18, 2, 2, 18, 18, 18, 18, 25, 25, + 25, 25, 25, 25, 25, 25, 2, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 2, 2, 2, 25, 25, 25, 25, 25, 2, 25, 25, 25, 25, + 25, 25, 25, 0, 0, 0, 0, 25, 25, 2, 2, 2, 2, 2, 33, 33, + 33, 33, 33, 33, 33, 33, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 2, 8, 2, 2, 2, 2, 2, 8, 2, 2, 8, 8, + 8, 0, 8, 8, 8, 8, 12, 12, 12, 12, 12, 12, 12, 12, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 2, 30, 30, 30, 30, 2, 2, 30, 30, + 30, 30, 30, 30, 30, 2, 30, 30, 30, 2, 2, 30, 30, 30, 30, 30, + 30, 30, 30, 2, 2, 2, 30, 30, 2, 2, 2, 2, 2, 2, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 2, 2, 28, 28, + 28, 28, 28, 28, 28, 28, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 2, 2, 2, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 0, 0, 0, 35, 35, 35, 2, 2, 2, 2, 2, 2, 2, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 45, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 0, 0, 2, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 2, 2, 2, 2, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 2, 46, 46, 46, 2, 46, 46, 2, 2, 2, 2, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 2, 2, 31, 31, + 2, 2, 2, 2, 2, 2, 32, 32, 0, 0, 32, 0, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 2, 2, 2, 2, 2, 2, 32, 2, + 2, 2, 2, 2, 2, 2, 32, 32, 32, 2, 2, 2, 2, 2, 28, 28, + 28, 28, 28, 28, 2, 2, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 2, 48, 48, 48, 48, 2, 2, 2, 2, 48, 2, + 2, 2, 48, 48, 48, 48, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 2, 2, 52, 52, 52, 52, 52, 2, 2, 2, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 2, 2, 2, 2, 58, 58, + 2, 2, 2, 2, 2, 2, 58, 58, 58, 2, 2, 2, 58, 58, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 2, 2, 54, 54, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 2, 91, 91, + 91, 91, 91, 2, 2, 91, 91, 91, 2, 2, 2, 2, 2, 2, 91, 91, + 91, 91, 91, 91, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 2, 2, 2, 62, 62, + 62, 62, 62, 62, 62, 2, 76, 76, 76, 76, 76, 76, 76, 76, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 2, 2, 2, 2, 2, 2, + 2, 2, 93, 93, 93, 93, 70, 70, 70, 70, 70, 70, 70, 70, 2, 2, + 2, 70, 70, 70, 70, 70, 70, 70, 2, 2, 2, 70, 70, 70, 73, 73, + 73, 73, 73, 73, 73, 73, 6, 2, 2, 2, 2, 2, 2, 2, 8, 8, + 8, 2, 2, 8, 8, 8, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 1, 0, 2, 2, 2, 2, 2, 19, 19, + 19, 19, 19, 19, 9, 9, 9, 9, 9, 6, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 9, 9, 9, 9, 9, 19, 19, 19, 19, 9, 9, 9, 9, + 9, 19, 19, 19, 19, 19, 6, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 9, 9, 9, 9, 9, 9, 9, 2, 2, 2, 9, + 2, 9, 2, 9, 2, 9, 9, 9, 9, 9, 9, 2, 9, 9, 9, 9, + 9, 9, 2, 2, 9, 9, 9, 9, 9, 9, 2, 9, 9, 9, 2, 2, + 9, 9, 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 0, 0, + 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 19, + 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, + 0, 0, 0, 0, 0, 2, 19, 19, 19, 19, 19, 2, 2, 2, 0, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 0, 0, + 0, 0, 0, 0, 9, 0, 0, 0, 19, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 19, 0, 0, 0, 2, 2, 2, 2, 0, 0, + 0, 2, 2, 2, 2, 2, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, + 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 56, 56, + 56, 56, 56, 56, 56, 56, 55, 55, 55, 55, 2, 2, 2, 2, 2, 55, + 55, 55, 55, 55, 55, 55, 61, 61, 61, 61, 61, 61, 61, 61, 2, 2, + 2, 2, 2, 2, 2, 61, 61, 2, 2, 2, 2, 2, 2, 2, 0, 0, + 0, 0, 0, 0, 2, 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 13, 13, + 13, 13, 13, 13, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, + 0, 0, 0, 13, 0, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 1, 1, 1, 1, 12, 12, 13, 13, 13, 13, 0, 0, 0, 0, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 2, 2, 1, 1, 0, 0, 15, 15, 15, 0, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 17, - 17, 17, 2, 2, 2, 2, 2, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 2, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 2, 12, 12, 12, 12, 12, 12, 12, 0, 17, 17, 17, 17, 17, 17, - 17, 0, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 2, - 2, 2, 39, 39, 39, 39, 39, 39, 39, 2, 86, 86, 86, 86, 86, 86, - 86, 86, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 2, 2, - 2, 2, 79, 79, 79, 79, 79, 79, 79, 79, 0, 0, 19, 19, 19, 19, - 19, 19, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 2, 2, 2, - 2, 2, 19, 19, 2, 19, 2, 19, 19, 19, 19, 19, 2, 2, 2, 2, - 2, 2, 2, 2, 19, 19, 19, 19, 19, 19, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 60, 60, 60, 2, 2, 2, 0, 0, 2, 2, 2, 2, - 2, 2, 65, 65, 65, 65, 65, 65, 65, 65, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 75, 75, 75, 75, 2, 2, 2, 2, 2, 2, 2, 2, - 75, 75, 75, 75, 2, 2, 2, 2, 2, 2, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 69, 69, 0, 69, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 74, 12, 12, 12, 12, 12, 2, 2, 2, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 2, 0, 84, 84, 2, 2, 2, 2, - 84, 84, 33, 33, 33, 33, 33, 33, 33, 2, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 2, 68, 68, 68, 68, 68, 68, - 2, 2, 68, 68, 2, 2, 68, 68, 68, 68, 92, 92, 92, 92, 92, 92, - 92, 92, 92, 92, 92, 2, 2, 2, 2, 2, 2, 2, 2, 92, 92, 92, - 92, 92, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 2, 2, 30, 30, 30, 30, 30, 30, 2, 19, 19, 19, 0, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 9, 19, 19, 19, 19, 0, 0, 2, 2, - 2, 2, 87, 87, 87, 87, 87, 87, 2, 2, 87, 87, 2, 2, 2, 2, - 2, 2, 12, 12, 12, 12, 2, 2, 2, 2, 2, 2, 2, 12, 12, 12, - 12, 12, 13, 13, 2, 2, 2, 2, 2, 2, 19, 19, 19, 19, 19, 19, - 19, 2, 2, 2, 2, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 2, 14, 14, 14, 14, 14, 2, - 14, 2, 14, 14, 2, 14, 14, 2, 14, 14, 3, 3, 3, 2, 2, 2, - 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 0, 0, 2, 2, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, - 2, 3, 1, 1, 1, 1, 1, 1, 6, 6, 0, 0, 0, 2, 0, 0, - 0, 0, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 2, - 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 2, 2, 12, 12, 12, 12, - 12, 12, 2, 2, 12, 12, 12, 2, 2, 2, 2, 0, 0, 0, 0, 0, - 2, 2, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 2, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 2, 49, 49, 49, 2, 49, 49, - 2, 49, 49, 49, 49, 49, 49, 49, 2, 2, 49, 49, 49, 2, 2, 2, - 2, 2, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, - 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 9, 2, 2, 2, 2, 2, - 2, 2, 0, 0, 0, 0, 0, 1, 2, 2, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 2, 2, 2, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, - 0, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 42, 42, 42, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 2, 2, 2, 2, 2,118,118,118,118,118,118, - 118,118,118,118,118, 2, 2, 2, 2, 2, 53, 53, 53, 53, 53, 53, - 53, 53, 53, 53, 53, 53, 53, 53, 2, 53, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 2, 2, 2, 2, 59, 59, 59, 59, 59, 59, - 2, 2, 40, 40, 40, 40, 40, 40, 40, 40, 51, 51, 51, 51, 51, 51, - 51, 51, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, - 2, 2, 50, 50, 2, 2, 2, 2, 2, 2,135,135,135,135,135,135, - 135,135,135,135,135,135, 2, 2, 2, 2,106,106,106,106,106,106, - 106,106,104,104,104,104,104,104,104,104,104,104,104,104, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2,104,161,161,161,161,161,161, - 161,161,161,161,161, 2,161,161,161,161,161,161,161, 2,161,161, - 2,161,161,161, 2,161,161,161,161,161,161,161, 2,161,161, 2, - 2, 2,110,110,110,110,110,110,110,110,110,110,110,110,110,110, - 110, 2,110,110,110,110,110,110, 2, 2, 19, 19, 19, 19, 19, 19, - 2, 19, 19, 2, 19, 19, 19, 19, 19, 19, 47, 47, 47, 47, 47, 47, - 2, 2, 47, 2, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 2, 47, 47, 2, 2, 2, 47, 2, - 2, 47, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 2, 81,120,120,120,120,120,120,120,120,116,116,116,116,116,116, - 116,116,116,116,116,116,116,116,116, 2, 2, 2, 2, 2, 2, 2, - 2,116,128,128,128,128,128,128,128,128,128,128,128, 2,128,128, - 2, 2, 2, 2, 2,128,128,128,128,128, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 2, 2, 2, 66, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 2, 2, 2, 2, 2, 72, 98, 98, 98, 98, 98, 98, - 98, 98, 97, 97, 97, 97, 97, 97, 97, 97, 2, 2, 2, 2, 97, 97, - 97, 97, 2, 2, 97, 97, 97, 97, 97, 97, 57, 57, 57, 57, 2, 57, - 57, 2, 2, 2, 2, 2, 57, 57, 57, 57, 57, 57, 57, 57, 2, 57, - 57, 57, 2, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 2, 2, 57, 57, 57, 2, 2, 2, - 2, 57, 57, 2, 2, 2, 2, 2, 2, 2, 88, 88, 88, 88, 88, 88, - 88, 88,117,117,117,117,117,117,117,117,112,112,112,112,112,112, - 112,112,112,112,112,112,112,112,112, 2, 2, 2, 2,112,112,112, - 112,112, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 2, 2, 2, 78, 78, 78, 78, 78, 78, 78, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 2, 2, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 2, 2, 2, 2, 2,122,122,122,122,122,122, - 122,122,122,122, 2, 2, 2, 2, 2, 2, 2,122,122,122,122, 2, - 2, 2, 2,122,122,122,122,122,122,122, 89, 89, 89, 89, 89, 89, - 89, 89, 89, 2, 2, 2, 2, 2, 2, 2,130,130,130,130,130,130, - 130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2,130,130,130,130, - 130,130,144,144,144,144,144,144,144,144,144,144, 2, 2, 2, 2, - 2, 2,156,156,156,156,156,156,156,156,156,156, 2,156,156,156, - 2, 2,156,156, 2, 2, 2, 2, 2, 2,147,147,147,147,147,147, - 147,147,148,148,148,148,148,148,148,148,148,148, 2, 2, 2, 2, - 2, 2,158,158,158,158,158,158,158,158,158,158, 2, 2, 2, 2, - 2, 2,153,153,153,153,153,153,153,153,153,153,153,153, 2, 2, - 2, 2,149,149,149,149,149,149,149,149,149,149,149,149,149,149, - 149, 2, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, - 2, 2, 2, 2, 94, 94, 94, 94, 94, 94, 2, 2, 2, 2, 2, 2, - 2, 94, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 85, 2, 2,101,101,101,101,101,101, - 101,101,101, 2, 2, 2, 2, 2, 2, 2,101,101, 2, 2, 2, 2, - 2, 2, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 2, - 96, 96,111,111,111,111,111,111,111,111,111,111,111,111,111,111, - 111, 2,100,100,100,100,100,100,100,100, 2, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 2, 2, 2,108,108,108,108,108,108, - 108,108,108,108, 2,108,108,108,108,108,108,108,108,108,108,108, - 108, 2,129,129,129,129,129,129,129, 2,129, 2,129,129,129,129, - 2,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, - 2,129,129,129, 2, 2, 2, 2, 2, 2,109,109,109,109,109,109, - 109,109,109,109,109, 2, 2, 2, 2, 2,109,109, 2, 2, 2, 2, - 2, 2,107,107,107,107, 2,107,107,107,107,107,107,107,107, 2, - 2,107,107, 2, 2,107,107,107,107,107,107,107,107,107,107,107, - 107,107,107, 2,107,107,107,107,107,107,107, 2,107,107, 2,107, - 107,107,107,107, 2, 1,107,107,107,107,107, 2, 2,107,107,107, - 2, 2,107, 2, 2, 2, 2, 2, 2,107, 2, 2, 2, 2, 2,107, - 107,107,107,107,107,107, 2, 2,107,107,107,107,107,107,107, 2, - 2, 2,137,137,137,137,137,137,137,137,137,137,137,137, 2,137, - 137,137,137,137, 2, 2, 2, 2, 2, 2,124,124,124,124,124,124, - 124,124,124,124, 2, 2, 2, 2, 2, 2,123,123,123,123,123,123, - 123,123,123,123,123,123,123,123, 2, 2,114,114,114,114,114,114, - 114,114,114,114,114,114,114, 2, 2, 2,114,114, 2, 2, 2, 2, - 2, 2, 32, 32, 32, 32, 32, 2, 2, 2,102,102,102,102,102,102, - 102,102,102,102, 2, 2, 2, 2, 2, 2,126,126,126,126,126,126, - 126,126,126,126,126, 2, 2,126,126,126,126,126,126,126, 2, 2, - 2, 2,126,126,126,126,126,126,126, 2,142,142,142,142,142,142, - 142,142,142,142,142,142, 2, 2, 2, 2,125,125,125,125,125,125, - 125,125,125,125,125, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2,125,154,154,154,154,154,154,154, 2, 2,154, 2, 2,154,154, - 154,154,154,154,154,154, 2,154,154, 2,154,154,154,154,154,154, - 154,154,154,154,154,154,154,154, 2,154,154, 2, 2,154,154,154, - 154,154,154,154, 2, 2, 2, 2, 2, 2,150,150,150,150,150,150, - 150,150, 2, 2,150,150,150,150,150,150,150,150,150,150,150, 2, - 2, 2,141,141,141,141,141,141,141,141,140,140,140,140,140,140, - 140,140,140,140,140, 2, 2, 2, 2, 2,121,121,121,121,121,121, - 121,121,121, 2, 2, 2, 2, 2, 2, 2,133,133,133,133,133,133, - 133,133,133, 2,133,133,133,133,133,133,133,133,133,133,133,133, - 133, 2,133,133,133,133,133,133, 2, 2,133,133,133,133,133, 2, - 2, 2,134,134,134,134,134,134,134,134, 2, 2,134,134,134,134, - 134,134, 2,134,134,134,134,134,134,134,134,134,134,134,134,134, - 134, 2,138,138,138,138,138,138,138, 2,138,138, 2,138,138,138, - 138,138,138,138,138,138,138,138,138,138, 2, 2,138, 2,138,138, - 2,138,138,138, 2, 2, 2, 2, 2, 2,143,143,143,143,143,143, - 2,143,143, 2,143,143,143,143,143,143,143,143,143,143,143,143, - 143,143,143,143,143,143,143,143,143, 2,143,143, 2,143,143,143, - 143,143,143, 2, 2, 2, 2, 2, 2, 2,143,143, 2, 2, 2, 2, - 2, 2,145,145,145,145,145,145,145,145,145, 2, 2, 2, 2, 2, - 2, 2, 86, 2, 2, 2, 2, 2, 2, 2, 22, 22, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 22, 63, 63, 63, 63, 63, 63, - 63, 63, 63, 63, 2, 2, 2, 2, 2, 2, 63, 63, 63, 63, 63, 63, - 63, 2, 63, 63, 63, 63, 63, 2, 2, 2, 63, 63, 63, 63, 2, 2, - 2, 2,157,157,157,157,157,157,157,157,157,157,157, 2, 2, 2, - 2, 2, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 2, 80, 2, 2, 2, 2, 2, 2, 2,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127, 2, 79, 2, 2, 2, 2, 2, - 2, 2,115,115,115,115,115,115,115,115,115,115,115,115,115,115, - 115, 2,115,115, 2, 2, 2, 2,115,115,159,159,159,159,159,159, - 159,159,159,159,159,159,159,159,159, 2,159,159, 2, 2, 2, 2, - 2, 2,103,103,103,103,103,103,103,103,103,103,103,103,103,103, - 2, 2,119,119,119,119,119,119,119,119,119,119,119,119,119,119, - 2, 2,119,119, 2,119,119,119,119,119, 2, 2, 2, 2, 2,119, - 119,119,146,146,146,146,146,146,146,146,146,146,146, 2, 2, 2, - 2, 2, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 2, 2, 2, - 2, 99, 2, 2, 2, 2, 2, 2, 2, 99,136,139, 13, 13,155, 2, - 2, 2,136,136,136,136,136,136,136,136,155,155,155,155,155,155, - 155,155,155,155,155,155,155,155, 2, 2,136, 2, 2, 2, 2, 2, - 2, 2, 17, 17, 17, 17, 2, 17, 17, 17, 17, 17, 17, 17, 2, 17, - 17, 2, 17, 15, 15, 15, 15, 15, 15, 15, 17, 17, 17, 2, 2, 2, - 2, 2, 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 17, 17, - 17, 17,139,139,139,139,139,139,139,139,139,139,139,139, 2, 2, - 2, 2,105,105,105,105,105,105,105,105,105,105,105, 2, 2, 2, - 2, 2,105,105,105,105,105, 2, 2, 2,105, 2, 2, 2, 2, 2, - 2, 2,105,105, 2, 2,105,105,105,105, 1, 1, 1, 1, 1, 1, - 2, 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, - 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, - 0, 0, 2, 2, 0, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 2, - 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 2, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,131,131,131,131,131,131, - 131,131,131,131,131,131, 2, 2, 2, 2, 2, 2, 2,131,131,131, - 131,131, 2,131,131,131,131,131,131,131, 56, 56, 56, 56, 56, 56, - 56, 2, 56, 2, 2, 56, 56, 56, 56, 56, 56, 56, 2, 56, 56, 2, - 56, 56, 56, 56, 56, 2, 2, 2, 2, 2,151,151,151,151,151,151, - 151,151,151,151,151,151,151, 2, 2, 2,151,151,151,151,151,151, - 2, 2,151,151, 2, 2, 2, 2,151,151,160,160,160,160,160,160, - 160,160,160,160,160,160,160,160,160, 2,152,152,152,152,152,152, - 152,152,152,152, 2, 2, 2, 2, 2,152, 30, 30, 30, 30, 2, 30, - 30, 2,113,113,113,113,113,113,113,113,113,113,113,113,113, 2, - 2,113,113,113,113,113,113,113,113, 2,132,132,132,132,132,132, - 132,132,132,132,132,132, 2, 2, 2, 2,132,132, 2, 2, 2, 2, - 132,132, 3, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 2, 3, 2, - 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, - 3, 3, 2, 3, 2, 3, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, - 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 2, 3, 2, 3, 2, 3, - 2, 3, 2, 3, 3, 3, 3, 2, 3, 2, 3, 3, 2, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 3, 3, 3, 2, 3, - 3, 3, 2, 2, 2, 2, 2, 2, 0, 0, 15, 0, 0, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 13, 2, 2, 2, 2, 2, - 2, 2, 13, 13, 13, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, - 2, 2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 9, 10, - 9, 11, 12, 13, 9, 9, 9, 14, 9, 9, 15, 9, 9, 9, 9, 9, + 15, 15, 15, 15, 15, 2, 2, 1, 1, 0, 0, 15, 15, 15, 0, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 0, 0, 17, 17, 17, 2, 2, 2, 2, 2, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 2, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 2, 12, 12, 12, 12, 12, 12, 12, 0, 17, 17, + 17, 17, 17, 17, 17, 0, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 2, 2, 2, 39, 39, 39, 39, 39, 39, 39, 2, 86, 86, + 86, 86, 86, 86, 86, 86, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 2, 2, 2, 2, 79, 79, 79, 79, 79, 79, 79, 79, 0, 0, + 19, 19, 19, 19, 19, 19, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, + 19, 2, 2, 2, 2, 2, 19, 19, 2, 19, 2, 19, 19, 19, 19, 19, + 2, 2, 2, 2, 2, 2, 2, 2, 19, 19, 19, 19, 19, 19, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 2, 2, 2, 0, 0, + 2, 2, 2, 2, 2, 2, 65, 65, 65, 65, 65, 65, 65, 65, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 2, 2, 2, 2, + 2, 2, 2, 2, 75, 75, 75, 75, 2, 2, 2, 2, 2, 2, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 0, 69, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 74, 12, 12, 12, 12, 12, 2, 2, 2, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 2, 0, 84, 84, + 2, 2, 2, 2, 84, 84, 33, 33, 33, 33, 33, 33, 33, 2, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 2, 68, 68, + 68, 68, 68, 68, 2, 2, 68, 68, 2, 2, 68, 68, 68, 68, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 2, 2, 2, 2, 2, 2, 2, + 2, 92, 92, 92, 92, 92, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 2, 2, 30, 30, 30, 30, 30, 30, 2, 19, 19, + 19, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 9, 19, 19, 19, 19, + 0, 0, 2, 2, 2, 2, 87, 87, 87, 87, 87, 87, 2, 2, 87, 87, + 2, 2, 2, 2, 2, 2, 12, 12, 12, 12, 2, 2, 2, 2, 2, 2, + 2, 12, 12, 12, 12, 12, 13, 13, 2, 2, 2, 2, 2, 2, 19, 19, + 19, 19, 19, 19, 19, 2, 2, 2, 2, 4, 4, 4, 4, 4, 2, 2, + 2, 2, 2, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 2, 14, 14, + 14, 14, 14, 2, 14, 2, 14, 14, 2, 14, 14, 2, 14, 14, 3, 3, + 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 0, 0, 2, 2, 3, 3, 3, 3, 3, 3, 2, 2, + 2, 2, 2, 2, 2, 3, 1, 1, 1, 1, 1, 1, 6, 6, 0, 0, + 0, 2, 0, 0, 0, 0, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, + 3, 3, 3, 2, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 2, 2, + 12, 12, 12, 12, 12, 12, 2, 2, 12, 12, 12, 2, 2, 2, 2, 0, + 0, 0, 0, 0, 2, 2, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 2, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 2, 49, 49, + 49, 2, 49, 49, 2, 49, 49, 49, 49, 49, 49, 49, 2, 2, 49, 49, + 49, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, + 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 9, 2, + 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 1, 2, 2, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 2, 2, 2, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 2, 2, 2, 2, 2, 2, 2, 1, 0, + 0, 0, 0, 0, 0, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 2, 2, 2, 2, 2, 2, 2, 2, 2, 42, 42, 42, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 2, 2, 2, 2, 2,118,118, + 118,118,118,118,118,118,118,118,118, 2, 2, 2, 2, 2, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 2, 53, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 2, 2, 2, 2, 59, 59, + 59, 59, 59, 59, 2, 2, 40, 40, 40, 40, 40, 40, 40, 40, 51, 51, + 51, 51, 51, 51, 51, 51, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 2, 2, 50, 50, 2, 2, 2, 2, 2, 2,135,135, + 135,135,135,135,135,135,135,135,135,135, 2, 2, 2, 2,106,106, + 106,106,106,106,106,106,104,104,104,104,104,104,104,104,104,104, + 104,104, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,104,161,161, + 161,161,161,161,161,161,161,161,161, 2,161,161,161,161,161,161, + 161, 2,161,161, 2,161,161,161, 2,161,161,161,161,161,161,161, + 2,161,161, 2, 2, 2,110,110,110,110,110,110,110,110,110,110, + 110,110,110,110,110, 2,110,110,110,110,110,110, 2, 2, 19, 19, + 19, 19, 19, 19, 2, 19, 19, 2, 19, 19, 19, 19, 19, 19, 47, 47, + 47, 47, 47, 47, 2, 2, 47, 2, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 2, 47, 47, 2, + 2, 2, 47, 2, 2, 47, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 2, 81,120,120,120,120,120,120,120,120,116,116, + 116,116,116,116,116,116,116,116,116,116,116,116,116, 2, 2, 2, + 2, 2, 2, 2, 2,116,128,128,128,128,128,128,128,128,128,128, + 128, 2,128,128, 2, 2, 2, 2, 2,128,128,128,128,128, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 2, 2, 2, 66, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 2, 2, 2, 2, 2, 72, 98, 98, + 98, 98, 98, 98, 98, 98, 97, 97, 97, 97, 97, 97, 97, 97, 2, 2, + 2, 2, 97, 97, 97, 97, 2, 2, 97, 97, 97, 97, 97, 97, 57, 57, + 57, 57, 2, 57, 57, 2, 2, 2, 2, 2, 57, 57, 57, 57, 57, 57, + 57, 57, 2, 57, 57, 57, 2, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 2, 2, 57, 57, + 57, 2, 2, 2, 2, 57, 57, 2, 2, 2, 2, 2, 2, 2, 88, 88, + 88, 88, 88, 88, 88, 88,117,117,117,117,117,117,117,117,112,112, + 112,112,112,112,112,112,112,112,112,112,112,112,112, 2, 2, 2, + 2,112,112,112,112,112, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 2, 2, 2, 78, 78, 78, 78, 78, 78, 78, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 2, 2, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 2, 2, 2, 2, 2,122,122, + 122,122,122,122,122,122,122,122, 2, 2, 2, 2, 2, 2, 2,122, + 122,122,122, 2, 2, 2, 2,122,122,122,122,122,122,122, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 2, 2, 2, 2, 2, 2, 2,130,130, + 130,130,130,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, + 130,130,130,130,130,130,144,144,144,144,144,144,144,144,144,144, + 2, 2, 2, 2, 2, 2,156,156,156,156,156,156,156,156,156,156, + 2,156,156,156, 2, 2,156,156, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 3, 3, 3,147,147,147,147,147,147,147,147,148,148, + 148,148,148,148,148,148,148,148, 2, 2, 2, 2, 2, 2,158,158, + 158,158,158,158,158,158,158,158, 2, 2, 2, 2, 2, 2,153,153, + 153,153,153,153,153,153,153,153,153,153, 2, 2, 2, 2,149,149, + 149,149,149,149,149,149,149,149,149,149,149,149,149, 2, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 2, 2, 2, 2, + 94, 94, 94, 94, 94, 94, 2, 2, 2, 2, 2, 2, 2, 94, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 85, 2, 2,101,101,101,101,101,101,101,101,101, 2, + 2, 2, 2, 2, 2, 2,101,101, 2, 2, 2, 2, 2, 2, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 2, 96, 96,111,111, + 111,111,111,111,111,111,111,111,111,111,111,111,111, 2,100,100, + 100,100,100,100,100,100, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 2, 2, 2,108,108,108,108,108,108,108,108,108,108, + 2,108,108,108,108,108,108,108, 2, 2, 2, 2, 2, 2,129,129, + 129,129,129,129,129, 2,129, 2,129,129,129,129, 2,129,129,129, + 129,129,129,129,129,129,129,129,129,129,129,129, 2,129,129,129, + 2, 2, 2, 2, 2, 2,109,109,109,109,109,109,109,109,109,109, + 109, 2, 2, 2, 2, 2,109,109, 2, 2, 2, 2, 2, 2,107,107, + 107,107, 2,107,107,107,107,107,107,107,107, 2, 2,107,107, 2, + 2,107,107,107,107,107,107,107,107,107,107,107,107,107,107, 2, + 107,107,107,107,107,107,107, 2,107,107, 2,107,107,107,107,107, + 2, 1,107,107,107,107,107, 2, 2,107,107,107, 2, 2,107, 2, + 2, 2, 2, 2, 2,107, 2, 2, 2, 2, 2,107,107,107,107,107, + 107,107, 2, 2,107,107,107,107,107,107,107, 2, 2, 2,137,137, + 137,137,137,137,137,137,137,137,137,137, 2,137,137,137,137,137, + 2, 2, 2, 2, 2, 2,124,124,124,124,124,124,124,124,124,124, + 2, 2, 2, 2, 2, 2,123,123,123,123,123,123,123,123,123,123, + 123,123,123,123, 2, 2,114,114,114,114,114,114,114,114,114,114, + 114,114,114, 2, 2, 2,114,114, 2, 2, 2, 2, 2, 2, 32, 32, + 32, 32, 32, 2, 2, 2,102,102,102,102,102,102,102,102,102,102, + 2, 2, 2, 2, 2, 2,126,126,126,126,126,126,126,126,126,126, + 126, 2, 2,126,126,126,126,126,126,126, 2, 2, 2, 2,126,126, + 126,126,126,126,126, 2,142,142,142,142,142,142,142,142,142,142, + 142,142, 2, 2, 2, 2,125,125,125,125,125,125,125,125,125,125, + 125, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,125,154,154, + 154,154,154,154,154, 2, 2,154, 2, 2,154,154,154,154,154,154, + 154,154, 2,154,154, 2,154,154,154,154,154,154,154,154,154,154, + 154,154,154,154, 2,154,154, 2, 2,154,154,154,154,154,154,154, + 2, 2, 2, 2, 2, 2,150,150,150,150,150,150,150,150, 2, 2, + 150,150,150,150,150,150,150,150,150,150,150, 2, 2, 2,141,141, + 141,141,141,141,141,141,140,140,140,140,140,140,140,140,140,140, + 140, 2, 2, 2, 2, 2,121,121,121,121,121,121,121,121,121, 2, + 2, 2, 2, 2, 2, 2, 7, 7, 2, 2, 2, 2, 2, 2,133,133, + 133,133,133,133,133,133,133, 2,133,133,133,133,133,133,133,133, + 133,133,133,133,133, 2,133,133,133,133,133,133, 2, 2,133,133, + 133,133,133, 2, 2, 2,134,134,134,134,134,134,134,134, 2, 2, + 134,134,134,134,134,134, 2,134,134,134,134,134,134,134,134,134, + 134,134,134,134,134, 2,138,138,138,138,138,138,138, 2,138,138, + 2,138,138,138,138,138,138,138,138,138,138,138,138,138, 2, 2, + 138, 2,138,138, 2,138,138,138, 2, 2, 2, 2, 2, 2,143,143, + 143,143,143,143, 2,143,143, 2,143,143,143,143,143,143,143,143, + 143,143,143,143,143,143,143,143,143,143,143,143,143, 2,143,143, + 2,143,143,143,143,143,143, 2, 2, 2, 2, 2, 2, 2,143,143, + 2, 2, 2, 2, 2, 2,145,145,145,145,145,145,145,145,145, 2, + 2, 2, 2, 2, 2, 2,163,163,163,163,163,163,163,163,163, 2, + 163,163,163,163,163,163,163,163,163, 2, 2, 2,163,163,163,163, + 2, 2, 2, 2, 2, 2, 86, 2, 2, 2, 2, 2, 2, 2, 22, 22, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 22, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 2, 2, 2, 2, 2, 2, 63, 63, + 63, 63, 63, 63, 63, 2, 63, 63, 63, 63, 63, 2, 2, 2, 63, 63, + 63, 63, 2, 2, 2, 2,157,157,157,157,157,157,157,157,157,157, + 157, 2, 2, 2, 2, 2, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 2, 2,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127, 2, 79, 2, 2, 2, 2, 2, 2, 2,115,115, + 115,115,115,115,115,115,115,115,115,115,115,115,115, 2,115,115, + 2, 2, 2, 2,115,115,159,159,159,159,159,159,159,159,159,159, + 159,159,159,159,159, 2,159,159, 2, 2, 2, 2, 2, 2,103,103, + 103,103,103,103,103,103,103,103,103,103,103,103, 2, 2,119,119, + 119,119,119,119,119,119,119,119,119,119,119,119, 2, 2,119,119, + 2,119,119,119,119,119, 2, 2, 2, 2, 2,119,119,119,146,146, + 146,146,146,146,146,146,146,146,146, 2, 2, 2, 2, 2, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 2, 2, 2, 2, 99, 2, 2, + 2, 2, 2, 2, 2, 99,136,139, 13, 13,155, 2, 2, 2,136,136, + 136,136,136,136,136,136,155,155,155,155,155,155,155,155,155,155, + 155,155,155,155, 2, 2,136, 2, 2, 2, 2, 2, 2, 2, 17, 17, + 17, 17, 2, 17, 17, 17, 17, 17, 17, 17, 2, 17, 17, 2, 17, 15, + 15, 15, 15, 15, 15, 15, 17, 17, 17, 2, 2, 2, 2, 2, 2, 2, + 15, 2, 2, 2, 2, 2, 15, 15, 15, 2, 2, 17, 2, 2, 2, 2, + 2, 2, 17, 17, 17, 17,139,139,139,139,139,139,139,139,139,139, + 139,139, 2, 2, 2, 2,105,105,105,105,105,105,105,105,105,105, + 105, 2, 2, 2, 2, 2,105,105,105,105,105, 2, 2, 2,105, 2, + 2, 2, 2, 2, 2, 2,105,105, 2, 2,105,105,105,105, 1, 1, + 1, 1, 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 0, 0, 2, 2, 0, 2, 2, 0, 0, 2, 2, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,131,131, + 131,131,131,131,131,131,131,131,131,131, 2, 2, 2, 2, 2, 2, + 2,131,131,131,131,131, 2,131,131,131,131,131,131,131, 2, 2, + 2, 2, 2, 19, 19, 19, 56, 56, 56, 56, 56, 56, 56, 2, 56, 2, + 2, 56, 56, 56, 56, 56, 56, 56, 2, 56, 56, 2, 56, 56, 56, 56, + 56, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 6,151,151,151,151,151,151,151,151,151,151, + 151,151,151, 2, 2, 2,151,151,151,151,151,151, 2, 2,151,151, + 2, 2, 2, 2,151,151,160,160,160,160,160,160,160,160,160,160, + 160,160,160,160,160, 2,152,152,152,152,152,152,152,152,152,152, + 2, 2, 2, 2, 2,152,164,164,164,164,164,164,164,164,164,164, + 2, 2, 2, 2, 2, 2, 30, 30, 30, 30, 2, 30, 30, 2,113,113, + 113,113,113,113,113,113,113,113,113,113,113, 2, 2,113,113,113, + 113,113,113,113,113, 2,132,132,132,132,132,132,132,132,132,132, + 132,132, 2, 2, 2, 2,132,132, 2, 2, 2, 2,132,132, 3, 3, + 3, 3, 2, 3, 3, 3, 2, 3, 3, 2, 3, 2, 2, 3, 2, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 2, 3, + 2, 3, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 3, 2, 3, + 2, 3, 2, 3, 3, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, + 3, 3, 3, 2, 3, 2, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 2, 2, 2, 2, 2, 3, 3, 3, 2, 3, 3, 3, 2, 2, + 2, 2, 2, 2, 0, 0, 15, 0, 0, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 13, 2, + 2, 2, 2, 2, 2, 2, 13, 13, 13, 2, 2, 2, 2, 2, 2, 0, + 2, 2, 2, 2, 2, 2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 9, 9, 9, 10, 9, 11, 12, 13, 9, 9, 9, 14, 9, 9, 15, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 16, 17, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 19, 20, 9, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 16, 17, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 19, + 20, 9, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 22, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 22, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -2140,60 +2161,61 @@ _hb_ucd_u8[17936] = 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 23, 24, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 0, 0, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 23, 0, 0, 24, 25, 26, 27, 28, 29, 30, 0, 0, - 31, 32, 0, 33, 0, 34, 0, 35, 0, 0, 0, 0, 36, 37, 38, 39, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 43, 44, 0, 45, 0, 0, 0, 0, 0, 0, 46, 47, 0, 0, - 0, 0, 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 50, 51, 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, - 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, - 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 23, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 0, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 24, 25, 26, 27, 28, + 29, 30, 0, 0, 31, 32, 0, 33, 0, 34, 0, 35, 0, 0, 0, 0, + 36, 37, 38, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 41, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 58, 59, 60, 61, 62, 63, 64, 65, 0, 0, 0, 0, - 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 43, 44, 0, 45, 0, 0, 0, 0, 0, 0, + 46, 47, 0, 0, 0, 0, 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 50, 51, 0, 0, 0, 52, 0, 0, + 53, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, + 55, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, + 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 58, 59, 60, 61, 62, 63, 64, 65, + 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 67, 68, 0, 69, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102, - 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,104, 0, 0, 0, 0, 0, 0,105,106, 0,107, 0, 0, 0, - 108, 0,109, 0,110, 0,111,112,113, 0,114, 0, 0, 0,115, 0, - 0, 0,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,117, 0, 0, + 0, 0, 0, 0, 67, 68, 0, 69, 70, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99,100,101,102,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,104, 0, 0, 0, 0, 0, 0,105,106, 0, + 107, 0, 0, 0,108, 0,109, 0,110, 0,111,112,113, 0,114, 0, + 0, 0,115, 0, 0, 0,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,118,119,120,121, 0,122,123,124,125,126, 0,127, + 0,117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,118,119,120,121, 0,122,123,124, + 125,126, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,128,129,130,131,132,133,134,135,136,137,138,139, + 140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155, + 156,157, 0, 0, 0,158,159,160,161, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,162,163, 0, + 0, 0, 0, 0, 0, 0,164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, - 144,145,146,147,148,149,150,151,152,153,154,155,156,157, 0, 0, - 0,158,159,160,161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,162,163, 0, 0, 0, 0, 0, - 0, 0,164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,165, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,166, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,166, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,167, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,169,170, 0, 0, 0, 0,171, + 172, 0, 0, 0,173,174,175,176,177,178,179,180,181,182,183,184, + 185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200, + 201,202,203,204,205,206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0,169,170, 0, 0, 0, 0,171,172, 0, 0, 0, - 173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188, - 189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204, - 205,206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, + 1, 2, 3, 4, }; static const uint16_t -_hb_ucd_u16[9200] = +_hb_ucd_u16[9320] = { 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 7, 8, 9, 10, 11, 12, 13, 13, 13, 14, 15, 13, 13, 16, 17, 18, 19, 20, 21, 22, 13, 23, @@ -2267,509 +2289,517 @@ _hb_ucd_u16[9200] = 48, 48, 48, 468, 48, 469, 48, 470, 48, 471, 472, 140, 140, 140, 140, 140, 48, 48, 48, 48, 196, 140, 140, 140, 9, 9, 9, 473, 11, 11, 11, 474, 48, 48, 475, 192, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 271, 476, - 48, 48, 477, 478, 140, 140, 140, 140, 48, 464, 479, 48, 62, 480, 140, 48, - 481, 140, 140, 48, 482, 140, 48, 314, 483, 48, 48, 484, 485, 457, 486, 487, - 222, 48, 48, 488, 489, 48, 196, 192, 490, 48, 491, 492, 493, 48, 48, 494, - 222, 48, 48, 495, 496, 497, 498, 499, 48, 97, 500, 501, 140, 140, 140, 140, - 502, 503, 504, 48, 48, 505, 506, 192, 507, 83, 84, 508, 509, 510, 511, 512, - 48, 48, 48, 513, 514, 515, 478, 140, 48, 48, 48, 516, 517, 192, 140, 140, - 48, 48, 518, 519, 520, 521, 140, 140, 48, 48, 48, 522, 523, 192, 524, 140, - 48, 48, 525, 526, 192, 140, 140, 140, 48, 173, 527, 528, 314, 140, 140, 140, - 48, 48, 500, 529, 140, 140, 140, 140, 140, 140, 9, 9, 11, 11, 148, 530, - 531, 532, 48, 533, 534, 192, 140, 140, 140, 140, 535, 48, 48, 536, 537, 140, - 538, 48, 48, 539, 540, 541, 48, 48, 542, 543, 544, 48, 48, 48, 48, 196, - 84, 48, 518, 545, 546, 148, 175, 547, 48, 548, 549, 550, 140, 140, 140, 140, - 551, 48, 48, 552, 553, 192, 554, 48, 555, 556, 192, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 48, 557, 140, 140, 140, 100, 271, 558, 559, 560, - 48, 207, 140, 140, 140, 140, 140, 140, 272, 272, 272, 272, 272, 272, 561, 562, - 48, 48, 48, 48, 388, 140, 140, 140, 140, 48, 48, 48, 48, 48, 48, 563, - 48, 48, 200, 564, 140, 140, 140, 140, 48, 48, 48, 48, 314, 140, 140, 140, - 48, 48, 48, 196, 48, 200, 370, 48, 48, 48, 48, 200, 192, 48, 204, 565, - 48, 48, 48, 566, 567, 568, 569, 570, 48, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 9, 9, 11, 11, 271, 571, 140, 140, 140, 140, 140, 140, - 48, 48, 48, 48, 572, 573, 574, 574, 575, 576, 140, 140, 140, 140, 577, 578, + 48, 48, 477, 478, 140, 140, 140, 479, 48, 464, 480, 48, 62, 481, 140, 48, + 482, 140, 140, 48, 483, 140, 48, 314, 484, 48, 48, 485, 486, 457, 487, 488, + 222, 48, 48, 489, 490, 48, 196, 192, 491, 48, 492, 493, 494, 48, 48, 495, + 222, 48, 48, 496, 497, 498, 499, 500, 48, 97, 501, 502, 503, 140, 140, 140, + 504, 505, 506, 48, 48, 507, 508, 192, 509, 83, 84, 510, 511, 512, 513, 514, + 48, 48, 48, 515, 516, 517, 478, 140, 48, 48, 48, 518, 519, 192, 140, 140, + 48, 48, 520, 521, 522, 523, 140, 140, 48, 48, 48, 524, 525, 192, 526, 140, + 48, 48, 527, 528, 192, 140, 140, 140, 48, 173, 529, 530, 314, 140, 140, 140, + 48, 48, 501, 531, 140, 140, 140, 140, 140, 140, 9, 9, 11, 11, 148, 532, + 533, 534, 48, 535, 536, 192, 140, 140, 140, 140, 537, 48, 48, 538, 539, 140, + 540, 48, 48, 541, 542, 543, 48, 48, 544, 545, 546, 48, 48, 48, 48, 196, + 547, 140, 140, 140, 140, 140, 140, 140, 84, 48, 520, 548, 549, 148, 175, 550, + 48, 551, 552, 553, 140, 140, 140, 140, 554, 48, 48, 555, 556, 192, 557, 48, + 558, 559, 192, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 48, 560, + 561, 115, 48, 562, 563, 192, 140, 140, 140, 140, 140, 100, 271, 564, 565, 566, + 48, 207, 140, 140, 140, 140, 140, 140, 272, 272, 272, 272, 272, 272, 567, 568, + 48, 48, 48, 48, 388, 140, 140, 140, 140, 48, 48, 48, 48, 48, 48, 569, + 48, 48, 48, 570, 571, 572, 140, 140, 48, 48, 48, 48, 314, 140, 140, 140, + 48, 48, 48, 196, 48, 200, 370, 48, 48, 48, 48, 200, 192, 48, 204, 573, + 48, 48, 48, 574, 575, 576, 577, 578, 48, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 9, 9, 11, 11, 271, 579, 140, 140, 140, 140, 140, 140, + 48, 48, 48, 48, 580, 581, 582, 582, 583, 584, 140, 140, 140, 140, 585, 586, 48, 48, 48, 48, 48, 48, 48, 440, 48, 48, 48, 48, 48, 199, 140, 140, - 196, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 579, - 48, 48, 580, 140, 140, 580, 581, 48, 48, 48, 48, 48, 48, 48, 48, 206, - 48, 48, 48, 48, 48, 48, 71, 151, 196, 582, 583, 140, 140, 140, 140, 140, - 32, 32, 584, 32, 585, 209, 209, 209, 209, 209, 209, 209, 323, 140, 140, 140, - 209, 209, 209, 209, 209, 209, 209, 324, 209, 209, 586, 209, 209, 209, 587, 588, - 589, 209, 590, 209, 209, 209, 288, 140, 209, 209, 209, 209, 591, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 271, 592, 209, 209, 209, 209, 209, 287, 271, 461, - 9, 593, 11, 594, 595, 596, 241, 9, 597, 598, 599, 600, 601, 9, 593, 11, - 602, 603, 11, 604, 605, 606, 607, 9, 608, 11, 9, 593, 11, 594, 595, 11, - 241, 9, 597, 607, 9, 608, 11, 9, 593, 11, 609, 9, 610, 611, 612, 613, - 11, 614, 9, 615, 616, 617, 618, 11, 619, 9, 620, 11, 621, 622, 622, 622, - 32, 32, 32, 623, 32, 32, 624, 625, 626, 627, 45, 140, 140, 140, 140, 140, - 628, 629, 140, 140, 140, 140, 140, 140, 630, 631, 632, 140, 140, 140, 140, 140, - 48, 48, 151, 633, 634, 140, 140, 140, 140, 48, 635, 140, 48, 48, 636, 637, - 140, 140, 140, 140, 140, 140, 638, 200, 48, 48, 48, 48, 639, 585, 140, 140, - 9, 9, 597, 11, 640, 370, 140, 140, 140, 140, 140, 140, 140, 140, 140, 498, - 271, 271, 641, 642, 140, 140, 140, 140, 498, 271, 643, 644, 140, 140, 140, 140, - 645, 48, 646, 647, 648, 649, 650, 651, 652, 206, 653, 206, 140, 140, 140, 654, - 209, 209, 325, 209, 209, 209, 209, 209, 209, 323, 334, 655, 655, 655, 209, 324, - 656, 209, 209, 209, 209, 209, 209, 209, 209, 209, 657, 140, 140, 140, 658, 209, - 659, 209, 209, 325, 660, 661, 324, 140, 209, 209, 209, 209, 209, 209, 209, 662, - 209, 209, 209, 209, 209, 663, 426, 426, 209, 209, 209, 209, 209, 209, 209, 323, - 209, 209, 209, 209, 209, 660, 325, 427, 325, 209, 209, 209, 664, 176, 209, 209, - 664, 209, 657, 661, 140, 140, 140, 140, 209, 209, 209, 209, 209, 323, 657, 665, - 287, 209, 426, 288, 324, 176, 664, 287, 209, 666, 209, 209, 288, 140, 140, 192, - 48, 48, 48, 48, 48, 48, 140, 140, 48, 48, 48, 196, 48, 48, 48, 48, + 196, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 587, + 48, 48, 588, 589, 140, 590, 591, 48, 48, 48, 48, 48, 48, 48, 48, 206, + 48, 48, 48, 48, 48, 48, 71, 151, 196, 592, 593, 140, 140, 140, 140, 140, + 32, 32, 594, 32, 595, 209, 209, 209, 209, 209, 209, 209, 323, 140, 140, 140, + 209, 209, 209, 209, 209, 209, 209, 324, 209, 209, 596, 209, 209, 209, 597, 598, + 599, 209, 600, 209, 209, 209, 288, 140, 209, 209, 209, 209, 601, 140, 140, 140, + 140, 140, 140, 140, 271, 602, 271, 602, 209, 209, 209, 209, 209, 287, 271, 461, + 9, 603, 11, 604, 605, 606, 241, 9, 607, 608, 609, 610, 611, 9, 603, 11, + 612, 613, 11, 614, 615, 616, 617, 9, 618, 11, 9, 603, 11, 604, 605, 11, + 241, 9, 607, 617, 9, 618, 11, 9, 603, 11, 619, 9, 620, 621, 622, 623, + 11, 624, 9, 625, 626, 627, 628, 11, 629, 9, 630, 11, 631, 632, 632, 632, + 32, 32, 32, 633, 32, 32, 634, 635, 636, 637, 45, 140, 140, 140, 140, 140, + 638, 639, 640, 140, 140, 140, 140, 140, 641, 642, 643, 27, 27, 27, 644, 140, + 645, 140, 140, 140, 140, 140, 140, 140, 48, 48, 151, 646, 647, 140, 140, 140, + 140, 48, 648, 140, 48, 48, 649, 650, 140, 140, 140, 140, 140, 48, 651, 192, + 140, 140, 140, 140, 140, 140, 652, 200, 48, 48, 48, 48, 653, 595, 140, 140, + 9, 9, 607, 11, 654, 370, 140, 140, 140, 140, 140, 140, 140, 140, 140, 499, + 271, 271, 655, 656, 140, 140, 140, 140, 499, 271, 657, 658, 140, 140, 140, 140, + 659, 48, 660, 661, 662, 663, 664, 665, 666, 206, 667, 206, 140, 140, 140, 668, + 209, 209, 325, 209, 209, 209, 209, 209, 209, 323, 334, 669, 669, 669, 209, 324, + 670, 209, 209, 209, 209, 209, 209, 209, 209, 209, 671, 140, 140, 140, 672, 209, + 673, 209, 209, 325, 674, 675, 324, 140, 209, 209, 209, 209, 209, 209, 209, 676, + 209, 209, 209, 209, 209, 677, 426, 426, 209, 209, 209, 209, 209, 209, 209, 678, + 209, 209, 209, 209, 209, 176, 325, 427, 325, 209, 209, 209, 679, 176, 209, 209, + 679, 209, 671, 675, 140, 140, 140, 140, 209, 209, 209, 209, 209, 323, 671, 426, + 674, 209, 209, 680, 681, 325, 674, 674, 209, 682, 209, 209, 288, 140, 140, 192, + 48, 48, 48, 48, 48, 48, 140, 140, 48, 48, 48, 207, 48, 48, 48, 48, 48, 204, 48, 48, 48, 48, 48, 48, 48, 48, 478, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 100, 140, 48, 204, 140, 140, 140, 140, 140, 140, - 48, 48, 48, 48, 71, 140, 140, 140, 667, 140, 668, 668, 668, 668, 668, 668, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 140, - 391, 391, 391, 391, 391, 391, 391, 669, 391, 391, 391, 391, 391, 391, 391, 670, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 1, 2, 2, 3, - 0, 0, 0, 0, 0, 4, 0, 4, 2, 2, 5, 2, 2, 2, 5, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 6, 0, 0, 0, 0, 7, 8, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 11, - 12, 13, 14, 14, 15, 14, 14, 14, 14, 14, 14, 14, 16, 17, 14, 14, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 20, 21, 21, 21, 22, 20, 21, 21, 21, 21, - 21, 23, 24, 25, 25, 25, 25, 25, 25, 26, 25, 25, 25, 27, 28, 26, - 29, 30, 31, 32, 31, 31, 31, 31, 33, 34, 35, 31, 31, 31, 36, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 29, 31, 31, 31, 31, - 37, 38, 37, 37, 37, 37, 37, 37, 37, 39, 31, 31, 31, 31, 31, 31, - 40, 40, 40, 40, 40, 40, 41, 26, 42, 42, 42, 42, 42, 42, 42, 43, - 44, 44, 44, 44, 44, 45, 44, 46, 47, 47, 47, 48, 37, 49, 31, 31, - 31, 50, 51, 31, 31, 31, 31, 31, 31, 31, 31, 31, 52, 31, 31, 31, - 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 54, 53, 55, 53, 53, 53, - 56, 57, 58, 59, 59, 60, 61, 62, 57, 63, 64, 65, 66, 59, 59, 67, - 68, 69, 70, 71, 71, 72, 73, 74, 69, 75, 76, 77, 78, 71, 79, 26, - 80, 81, 82, 83, 83, 84, 85, 86, 81, 87, 88, 26, 89, 83, 90, 91, - 92, 93, 94, 95, 95, 96, 97, 98, 93, 99, 100, 101, 102, 95, 95, 26, - 103, 104, 105, 106, 107, 104, 108, 109, 104, 105, 110, 26, 111, 108, 108, 112, - 113, 114, 115, 113, 113, 115, 113, 116, 114, 117, 118, 119, 120, 113, 121, 113, - 122, 123, 124, 122, 122, 124, 125, 126, 123, 127, 128, 128, 129, 122, 130, 26, - 131, 132, 133, 131, 131, 131, 131, 131, 132, 133, 134, 131, 135, 131, 131, 131, - 136, 137, 138, 139, 137, 137, 140, 141, 138, 142, 143, 137, 144, 137, 145, 26, - 146, 147, 147, 147, 147, 147, 147, 148, 147, 147, 147, 149, 26, 26, 26, 26, - 150, 151, 152, 152, 153, 152, 152, 154, 155, 154, 152, 156, 26, 26, 26, 26, - 157, 157, 157, 157, 157, 157, 157, 157, 157, 158, 157, 157, 157, 159, 158, 157, - 157, 157, 157, 158, 157, 157, 157, 160, 157, 160, 161, 162, 26, 26, 26, 26, - 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, - 163, 163, 163, 163, 164, 164, 164, 164, 165, 166, 164, 164, 164, 164, 164, 167, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 170, 171, 170, 169, 169, 169, 169, - 169, 170, 169, 169, 169, 169, 170, 171, 170, 169, 171, 169, 169, 169, 169, 169, - 169, 169, 170, 169, 169, 169, 169, 169, 169, 169, 169, 172, 169, 169, 169, 173, - 169, 169, 169, 174, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 176, 176, - 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, - 178, 178, 178, 179, 180, 180, 180, 180, 180, 180, 180, 180, 180, 181, 180, 182, - 183, 183, 184, 185, 186, 186, 187, 26, 188, 188, 189, 26, 190, 191, 192, 26, - 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 194, 193, 195, 193, 195, - 196, 197, 197, 198, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 199, - 197, 197, 197, 197, 197, 200, 177, 177, 177, 177, 177, 177, 177, 177, 201, 26, - 202, 202, 202, 203, 202, 204, 202, 204, 205, 202, 206, 206, 206, 207, 208, 26, - 209, 209, 209, 209, 209, 210, 209, 209, 209, 211, 209, 212, 193, 193, 193, 193, - 213, 213, 213, 214, 215, 215, 215, 215, 215, 215, 215, 216, 215, 215, 215, 217, - 215, 218, 215, 218, 215, 219, 9, 9, 9, 220, 26, 26, 26, 26, 26, 26, - 221, 221, 221, 221, 221, 221, 221, 221, 221, 222, 221, 221, 221, 221, 221, 223, - 224, 224, 224, 224, 224, 224, 224, 224, 225, 225, 225, 225, 225, 225, 226, 227, - 228, 228, 228, 228, 228, 228, 228, 229, 228, 230, 231, 231, 231, 231, 231, 231, - 18, 232, 164, 164, 164, 164, 164, 233, 224, 26, 234, 9, 235, 236, 237, 238, - 2, 2, 2, 2, 239, 240, 2, 2, 2, 2, 2, 241, 242, 243, 2, 244, - 2, 2, 2, 2, 2, 2, 2, 245, 9, 9, 9, 9, 9, 9, 9, 9, - 14, 14, 246, 246, 14, 14, 14, 14, 246, 246, 14, 247, 14, 14, 14, 246, - 14, 14, 14, 14, 14, 14, 248, 14, 248, 14, 249, 250, 14, 14, 251, 252, - 0, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 0, 255, 256, - 0, 257, 2, 258, 0, 0, 0, 0, 259, 26, 9, 9, 9, 9, 260, 26, - 0, 0, 0, 0, 261, 262, 4, 0, 0, 263, 0, 0, 2, 2, 2, 2, - 2, 264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 71, 48, 48, 48, 48, 48, 48, 140, 140, 140, 140, 140, + 683, 140, 570, 570, 570, 570, 570, 570, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 140, 391, 391, 391, 391, 391, 391, 391, 684, + 391, 391, 391, 391, 391, 391, 391, 685, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 2, 3, 1, 2, 2, 3, 0, 0, 0, 0, 0, 4, 0, 4, + 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, + 0, 0, 0, 0, 7, 8, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 10, 11, 12, 13, 14, 14, 15, 14, 14, 14, + 14, 14, 14, 14, 16, 17, 14, 14, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 19, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 20, 21, + 21, 21, 22, 20, 21, 21, 21, 21, 21, 23, 24, 25, 25, 25, 25, 25, + 25, 26, 25, 25, 25, 27, 28, 26, 29, 30, 31, 32, 31, 31, 31, 31, + 33, 34, 35, 31, 31, 31, 36, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 29, 31, 31, 31, 31, 37, 38, 37, 37, 37, 37, 37, 37, + 37, 39, 31, 31, 31, 31, 31, 31, 40, 40, 40, 40, 40, 40, 41, 26, + 42, 42, 42, 42, 42, 42, 42, 43, 44, 44, 44, 44, 44, 45, 44, 46, + 47, 47, 47, 48, 37, 49, 31, 31, 31, 50, 51, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 52, 31, 31, 31, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 54, 53, 55, 53, 53, 53, 56, 57, 58, 59, 59, 60, 61, 62, + 57, 63, 64, 65, 66, 59, 59, 67, 68, 69, 70, 71, 71, 72, 73, 74, + 69, 75, 76, 77, 78, 71, 79, 26, 80, 81, 82, 83, 83, 84, 85, 86, + 81, 87, 88, 26, 89, 83, 90, 91, 92, 93, 94, 95, 95, 96, 97, 98, + 93, 99, 100, 101, 102, 95, 95, 26, 103, 104, 105, 106, 107, 104, 108, 109, + 104, 105, 110, 26, 111, 108, 108, 112, 113, 114, 115, 113, 113, 115, 113, 116, + 114, 117, 118, 119, 120, 113, 121, 113, 122, 123, 124, 122, 122, 124, 125, 126, + 123, 127, 128, 128, 129, 122, 130, 26, 131, 132, 133, 131, 131, 131, 131, 131, + 132, 133, 134, 131, 135, 131, 131, 131, 136, 137, 138, 139, 137, 137, 140, 141, + 138, 142, 143, 137, 144, 137, 145, 26, 146, 147, 147, 147, 147, 147, 147, 148, + 147, 147, 147, 149, 26, 26, 26, 26, 150, 151, 152, 152, 153, 152, 152, 154, + 155, 156, 152, 157, 26, 26, 26, 26, 158, 158, 158, 158, 158, 158, 158, 158, + 158, 159, 158, 158, 158, 160, 159, 158, 158, 158, 158, 159, 158, 158, 158, 161, + 158, 161, 162, 163, 26, 26, 26, 26, 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 165, 165, 165, 165, + 166, 167, 165, 165, 165, 165, 165, 168, 169, 169, 169, 169, 169, 169, 169, 169, + 169, 169, 169, 169, 169, 169, 169, 169, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 171, 172, 171, 170, 170, 170, 170, 170, 171, 170, 170, 170, 170, 171, 172, + 171, 170, 172, 170, 170, 170, 170, 170, 170, 170, 171, 170, 170, 170, 170, 170, + 170, 170, 170, 173, 170, 170, 170, 174, 170, 170, 170, 175, 176, 176, 176, 176, + 176, 176, 176, 176, 176, 176, 177, 177, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 179, 179, 179, 180, 181, 181, 181, 181, + 181, 181, 181, 181, 181, 182, 181, 183, 184, 184, 185, 186, 187, 187, 188, 26, + 189, 189, 190, 26, 191, 192, 193, 26, 194, 194, 194, 194, 194, 194, 194, 194, + 194, 194, 194, 195, 194, 196, 194, 196, 197, 198, 198, 199, 198, 198, 198, 198, + 198, 198, 198, 198, 198, 198, 198, 200, 198, 198, 198, 198, 198, 201, 178, 178, + 178, 178, 178, 178, 178, 178, 202, 26, 203, 203, 203, 204, 203, 205, 203, 205, + 206, 203, 207, 207, 207, 208, 209, 26, 210, 210, 210, 210, 210, 211, 210, 210, + 210, 212, 210, 213, 194, 194, 194, 194, 214, 214, 214, 215, 216, 216, 216, 216, + 216, 216, 216, 217, 216, 216, 216, 218, 216, 219, 216, 219, 216, 220, 9, 9, + 9, 221, 26, 26, 26, 26, 26, 26, 222, 222, 222, 222, 222, 222, 222, 222, + 222, 223, 222, 222, 222, 222, 222, 224, 225, 225, 225, 225, 225, 225, 225, 225, + 226, 226, 226, 226, 226, 226, 227, 228, 229, 229, 229, 229, 229, 229, 229, 230, + 229, 231, 232, 232, 232, 232, 232, 232, 18, 233, 165, 165, 165, 165, 165, 234, + 225, 26, 235, 9, 236, 237, 238, 239, 2, 2, 2, 2, 240, 241, 2, 2, + 2, 2, 2, 242, 243, 244, 2, 245, 2, 2, 2, 2, 2, 2, 2, 246, + 9, 9, 9, 9, 9, 9, 9, 9, 14, 14, 247, 247, 14, 14, 14, 14, + 247, 247, 14, 248, 14, 14, 14, 247, 14, 14, 14, 14, 14, 14, 249, 14, + 249, 14, 250, 251, 14, 14, 252, 253, 0, 254, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 255, 0, 256, 257, 0, 258, 2, 259, 0, 0, 0, 0, + 260, 26, 9, 9, 9, 9, 261, 26, 0, 0, 0, 0, 262, 263, 4, 0, + 0, 264, 0, 0, 2, 2, 2, 2, 2, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 257, 26, 26, 26, 0, 265, 26, 26, 0, 0, 0, 0, - 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 267, 0, - 0, 0, 268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 2, 2, 2, 2, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 270, 271, - 164, 164, 164, 164, 165, 166, 272, 272, 272, 272, 272, 272, 272, 273, 274, 273, - 169, 169, 171, 26, 171, 171, 171, 171, 171, 171, 171, 171, 18, 18, 18, 18, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, 26, 26, 26, 26, - 276, 276, 276, 277, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 278, 26, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 279, 26, 26, 26, 0, 280, - 281, 0, 0, 0, 282, 283, 0, 284, 285, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 287, 288, 289, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 291, - 292, 293, 293, 293, 293, 293, 294, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 295, 0, 0, 293, 293, 293, 293, 0, 0, 0, 0, 280, 26, 290, 290, - 168, 168, 168, 295, 0, 0, 0, 0, 0, 0, 0, 0, 168, 168, 168, 296, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 290, 290, 290, 290, 290, 297, - 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 0, 0, 0, 0, 0, - 276, 276, 276, 276, 276, 276, 276, 276, 0, 0, 0, 0, 0, 0, 0, 0, - 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, - 298, 299, 298, 298, 298, 298, 298, 298, 300, 26, 301, 301, 301, 301, 301, 301, - 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, - 302, 302, 302, 302, 302, 303, 26, 26, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 26, - 0, 0, 0, 0, 305, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 306, 2, 2, 2, 2, 2, 2, 2, 307, 308, 309, 26, 26, 310, 2, - 311, 311, 311, 311, 311, 312, 0, 313, 314, 314, 314, 314, 314, 314, 314, 26, - 315, 315, 315, 315, 315, 315, 315, 315, 316, 317, 315, 318, 53, 53, 53, 53, - 319, 319, 319, 319, 319, 320, 321, 321, 321, 321, 322, 323, 168, 168, 168, 324, - 325, 325, 325, 325, 325, 325, 325, 325, 325, 326, 325, 327, 163, 163, 163, 328, - 329, 329, 329, 329, 329, 329, 330, 26, 329, 331, 329, 332, 163, 163, 163, 163, - 333, 333, 333, 333, 333, 333, 333, 333, 334, 26, 26, 335, 336, 336, 337, 26, - 338, 338, 338, 26, 171, 171, 2, 2, 2, 2, 2, 339, 340, 341, 175, 175, - 175, 175, 175, 175, 175, 175, 175, 175, 336, 336, 336, 336, 336, 342, 336, 343, - 168, 168, 168, 168, 344, 26, 168, 168, 295, 345, 168, 168, 168, 168, 168, 344, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 258, 26, 26, 26, + 0, 266, 26, 26, 0, 0, 0, 0, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 267, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 268, 0, 0, 0, 269, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 2, 2, 2, 2, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 271, 272, 165, 165, 165, 165, 166, 167, 273, 273, + 273, 273, 273, 273, 273, 274, 275, 274, 170, 170, 172, 26, 172, 172, 172, 172, + 172, 172, 172, 172, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 276, 26, 26, 26, 26, 277, 277, 277, 278, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 279, 26, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 280, 26, 26, 26, 0, 281, 282, 0, 0, 0, 283, 284, 0, 285, + 286, 287, 287, 287, 287, 287, 287, 287, 287, 287, 288, 289, 290, 291, 291, 291, + 291, 291, 291, 291, 291, 291, 291, 292, 293, 294, 294, 294, 294, 294, 295, 169, + 169, 169, 169, 169, 169, 169, 169, 169, 169, 296, 0, 0, 294, 294, 294, 294, + 0, 0, 0, 0, 281, 26, 291, 291, 169, 169, 169, 296, 0, 0, 0, 0, + 0, 0, 0, 0, 169, 169, 169, 297, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 291, 291, 291, 291, 291, 298, 291, 291, 291, 291, 291, 291, 291, 291, + 291, 291, 291, 0, 0, 0, 0, 0, 277, 277, 277, 277, 277, 277, 277, 277, + 0, 0, 0, 0, 0, 0, 0, 0, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 300, 299, 299, 299, 299, 299, 299, + 301, 26, 302, 302, 302, 302, 302, 302, 303, 303, 303, 303, 303, 303, 303, 303, + 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 304, 26, 26, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 305, 305, 305, 305, + 305, 305, 305, 305, 305, 305, 305, 26, 0, 0, 0, 0, 306, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 307, 2, 2, 2, 2, 2, 2, + 2, 308, 309, 310, 26, 26, 311, 2, 312, 312, 312, 312, 312, 313, 0, 314, + 315, 315, 315, 315, 315, 315, 315, 26, 316, 316, 316, 316, 316, 316, 316, 316, + 317, 318, 316, 319, 53, 53, 53, 53, 320, 320, 320, 320, 320, 321, 322, 322, + 322, 322, 323, 324, 169, 169, 169, 325, 326, 326, 326, 326, 326, 326, 326, 326, + 326, 327, 326, 328, 164, 164, 164, 329, 330, 330, 330, 330, 330, 330, 331, 26, + 330, 332, 330, 333, 164, 164, 164, 164, 334, 334, 334, 334, 334, 334, 334, 334, + 335, 26, 26, 336, 337, 337, 338, 26, 339, 339, 339, 26, 172, 172, 2, 2, + 2, 2, 2, 340, 341, 342, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, + 337, 337, 337, 337, 337, 343, 337, 344, 169, 169, 169, 169, 345, 26, 169, 169, + 296, 346, 169, 169, 169, 169, 169, 345, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 280, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 347, 26, 26, 26, 26, 348, 26, 349, 350, 25, 25, 351, 352, + 353, 25, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 354, 26, 355, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 356, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 357, 31, 31, 31, 31, 31, + 31, 358, 26, 26, 26, 26, 31, 31, 9, 9, 0, 314, 9, 359, 0, 0, + 0, 0, 360, 0, 258, 281, 361, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 362, 363, 0, 0, 0, 1, 2, 2, 3, + 1, 2, 2, 3, 364, 291, 290, 291, 291, 291, 291, 365, 169, 169, 169, 296, + 366, 366, 366, 367, 258, 258, 26, 368, 369, 370, 369, 369, 371, 369, 369, 372, + 369, 373, 369, 373, 26, 26, 26, 26, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 374, 375, 0, 0, 0, 0, 0, 376, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 253, 0, 377, 378, 26, 26, 26, + 26, 26, 0, 0, 0, 0, 0, 379, 380, 380, 380, 381, 382, 382, 382, 382, + 382, 382, 383, 26, 384, 0, 0, 281, 385, 385, 385, 385, 386, 387, 388, 388, + 388, 389, 390, 390, 390, 390, 390, 391, 392, 392, 392, 393, 394, 394, 394, 394, + 395, 394, 396, 26, 26, 26, 26, 26, 397, 397, 397, 397, 397, 397, 397, 397, + 397, 397, 398, 398, 398, 398, 398, 398, 399, 399, 399, 400, 399, 401, 402, 402, + 402, 402, 403, 402, 402, 402, 402, 403, 404, 404, 404, 404, 404, 26, 405, 405, + 405, 405, 405, 405, 406, 407, 408, 409, 408, 409, 410, 408, 411, 408, 411, 412, + 26, 26, 26, 26, 26, 26, 26, 26, 413, 413, 413, 413, 413, 413, 413, 413, + 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 414, 26, + 413, 413, 415, 26, 413, 26, 26, 26, 416, 2, 2, 2, 2, 2, 417, 308, + 26, 26, 26, 26, 26, 26, 26, 26, 418, 419, 420, 420, 420, 420, 421, 422, + 423, 423, 424, 423, 425, 425, 425, 425, 426, 426, 426, 427, 428, 426, 26, 26, + 26, 26, 26, 26, 429, 429, 430, 431, 432, 432, 432, 433, 434, 434, 434, 435, + 26, 26, 26, 26, 26, 26, 26, 26, 436, 436, 436, 436, 437, 437, 437, 438, + 437, 437, 439, 437, 437, 437, 437, 437, 440, 441, 442, 443, 444, 444, 445, 446, + 444, 447, 444, 447, 448, 448, 448, 448, 449, 449, 449, 449, 26, 26, 26, 26, + 450, 450, 450, 450, 451, 452, 451, 26, 453, 453, 453, 453, 453, 453, 454, 455, + 456, 456, 457, 456, 458, 458, 459, 458, 460, 460, 461, 462, 26, 463, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 464, 464, 464, 464, 464, 464, 464, 464, + 464, 465, 26, 26, 26, 26, 26, 26, 466, 466, 466, 466, 466, 466, 467, 26, + 466, 466, 466, 466, 466, 466, 467, 468, 469, 469, 469, 469, 469, 26, 469, 470, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 31, 31, 31, 50, 471, 471, 471, 471, 471, 472, 473, 26, + 26, 26, 26, 26, 26, 26, 26, 474, 475, 475, 475, 475, 475, 26, 476, 476, + 476, 476, 476, 477, 26, 26, 478, 478, 478, 479, 26, 26, 26, 26, 480, 480, + 480, 481, 26, 26, 482, 482, 483, 26, 484, 484, 484, 484, 484, 484, 484, 484, + 484, 485, 486, 484, 484, 484, 485, 487, 488, 488, 488, 488, 488, 488, 488, 488, + 489, 490, 491, 491, 491, 492, 491, 493, 494, 494, 494, 494, 494, 494, 495, 494, + 494, 26, 496, 496, 496, 496, 497, 26, 498, 498, 498, 498, 498, 498, 498, 498, + 498, 498, 498, 498, 499, 137, 500, 26, 501, 501, 502, 501, 501, 501, 501, 501, + 503, 26, 26, 26, 26, 26, 26, 26, 504, 505, 506, 507, 506, 508, 509, 509, + 509, 509, 509, 509, 509, 510, 509, 511, 512, 513, 514, 515, 515, 516, 517, 518, + 513, 519, 520, 521, 522, 523, 523, 26, 524, 524, 524, 524, 524, 524, 524, 524, + 524, 524, 524, 525, 526, 26, 26, 26, 527, 527, 527, 527, 527, 527, 527, 527, + 527, 26, 527, 528, 26, 26, 26, 26, 529, 529, 529, 529, 529, 529, 530, 529, + 529, 529, 529, 530, 26, 26, 26, 26, 531, 531, 531, 531, 531, 531, 531, 531, + 532, 26, 531, 533, 198, 534, 26, 26, 535, 535, 535, 535, 535, 535, 535, 536, + 535, 536, 26, 26, 26, 26, 26, 26, 537, 537, 537, 538, 537, 539, 537, 537, + 540, 26, 26, 26, 26, 26, 26, 26, 541, 541, 541, 541, 541, 541, 541, 542, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 543, 543, 543, 543, + 543, 543, 543, 543, 543, 543, 544, 545, 546, 547, 548, 549, 549, 549, 550, 551, + 546, 26, 549, 552, 26, 26, 26, 26, 26, 26, 26, 26, 553, 554, 553, 553, + 553, 553, 553, 554, 555, 26, 26, 26, 556, 556, 556, 556, 556, 556, 556, 556, + 556, 26, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 558, 26, 178, 178, + 559, 559, 559, 559, 559, 559, 559, 560, 53, 561, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 562, 563, 562, 562, 562, 562, 564, 562, + 565, 26, 562, 562, 562, 566, 567, 567, 567, 567, 568, 567, 567, 569, 570, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 571, 572, 573, 573, 573, 573, 571, 574, + 573, 26, 573, 575, 576, 577, 578, 578, 578, 579, 580, 581, 578, 582, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 583, 583, 583, 584, 585, 585, 586, 585, 585, 585, 585, 587, + 585, 585, 585, 588, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 589, 26, + 108, 108, 108, 108, 108, 108, 590, 591, 592, 592, 592, 592, 592, 592, 592, 592, + 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 593, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 592, 592, 592, 592, 592, 592, 592, 592, + 592, 592, 592, 592, 592, 594, 595, 26, 592, 592, 592, 592, 592, 592, 592, 592, + 596, 26, 26, 26, 26, 26, 26, 26, 26, 26, 597, 597, 597, 597, 597, 597, + 597, 597, 597, 597, 597, 597, 598, 26, 599, 599, 599, 599, 599, 599, 599, 599, + 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, + 599, 599, 600, 26, 26, 26, 26, 26, 601, 601, 601, 601, 601, 601, 601, 601, + 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, + 602, 26, 26, 26, 26, 26, 26, 26, 305, 305, 305, 305, 305, 305, 305, 305, + 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 603, + 604, 604, 604, 605, 604, 606, 607, 607, 607, 607, 607, 607, 607, 607, 607, 608, + 607, 609, 610, 610, 610, 611, 611, 26, 612, 612, 612, 612, 612, 612, 612, 612, + 613, 26, 612, 614, 614, 612, 612, 615, 612, 612, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 279, 276, 276, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 346, 26, 26, 26, 26, - 347, 26, 348, 349, 25, 25, 350, 351, 352, 25, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 353, 26, 354, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 355, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 356, 31, 31, 31, 31, 31, 31, 357, 26, 26, 26, 26, 31, 31, - 9, 9, 0, 313, 9, 358, 0, 0, 0, 0, 359, 0, 257, 280, 360, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 361, - 362, 0, 0, 0, 1, 2, 2, 3, 1, 2, 2, 3, 363, 290, 289, 290, - 290, 290, 290, 364, 168, 168, 168, 295, 365, 365, 365, 366, 257, 257, 26, 367, - 368, 369, 368, 368, 370, 368, 368, 371, 368, 372, 368, 372, 26, 26, 26, 26, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 373, - 374, 0, 0, 0, 0, 0, 375, 0, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 252, 0, 376, 377, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 378, - 379, 379, 379, 380, 381, 381, 381, 381, 381, 381, 382, 26, 383, 0, 0, 280, - 384, 384, 384, 384, 385, 386, 387, 387, 387, 388, 389, 389, 389, 389, 389, 390, - 391, 391, 391, 392, 393, 393, 393, 393, 394, 393, 395, 26, 26, 26, 26, 26, - 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 397, 397, 397, 397, 397, 397, - 398, 398, 398, 399, 398, 400, 401, 401, 401, 401, 402, 401, 401, 401, 401, 402, - 403, 403, 403, 403, 403, 26, 404, 404, 404, 404, 404, 404, 405, 406, 407, 408, - 407, 408, 409, 407, 410, 407, 410, 411, 26, 26, 26, 26, 26, 26, 26, 26, - 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, - 412, 412, 412, 412, 412, 412, 413, 26, 412, 412, 414, 26, 412, 26, 26, 26, - 415, 2, 2, 2, 2, 2, 416, 307, 26, 26, 26, 26, 26, 26, 26, 26, - 417, 418, 419, 419, 419, 419, 420, 421, 422, 422, 423, 422, 424, 424, 424, 424, - 425, 425, 425, 426, 427, 425, 26, 26, 26, 26, 26, 26, 428, 428, 429, 430, - 431, 431, 431, 432, 433, 433, 433, 434, 26, 26, 26, 26, 26, 26, 26, 26, - 435, 435, 435, 435, 436, 436, 436, 437, 436, 436, 438, 436, 436, 436, 436, 436, - 439, 440, 441, 442, 443, 443, 444, 445, 443, 446, 443, 446, 447, 447, 447, 447, - 448, 448, 448, 448, 26, 26, 26, 26, 449, 449, 449, 449, 450, 451, 450, 26, - 452, 452, 452, 452, 452, 452, 453, 454, 455, 455, 456, 455, 457, 457, 458, 457, - 459, 459, 460, 461, 26, 462, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 463, 463, 463, 463, 463, 463, 463, 463, 463, 464, 26, 26, 26, 26, 26, 26, - 465, 465, 465, 465, 465, 465, 466, 26, 465, 465, 465, 465, 465, 465, 466, 467, - 468, 468, 468, 468, 468, 26, 468, 469, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 31, 31, 31, 50, - 470, 470, 470, 470, 470, 471, 472, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 473, 473, 473, 473, 473, 26, 474, 474, 474, 474, 474, 475, 26, 26, 476, 476, - 476, 477, 26, 26, 26, 26, 478, 478, 478, 479, 26, 26, 480, 480, 481, 26, - 482, 482, 482, 482, 482, 482, 482, 482, 482, 483, 484, 482, 482, 482, 483, 485, - 486, 486, 486, 486, 486, 486, 486, 486, 487, 488, 489, 489, 489, 490, 489, 491, - 492, 492, 492, 492, 492, 492, 493, 492, 492, 26, 494, 494, 494, 494, 495, 26, - 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 497, 137, 498, 26, - 499, 499, 500, 499, 499, 499, 499, 501, 26, 26, 26, 26, 26, 26, 26, 26, - 502, 503, 504, 505, 504, 506, 507, 507, 507, 507, 507, 507, 507, 508, 507, 509, - 510, 511, 512, 513, 513, 514, 515, 516, 511, 517, 518, 519, 520, 521, 521, 26, - 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 523, 524, 26, 26, 26, - 525, 525, 525, 525, 525, 525, 525, 525, 525, 26, 525, 526, 26, 26, 26, 26, - 527, 527, 527, 527, 527, 527, 528, 527, 527, 527, 527, 528, 26, 26, 26, 26, - 529, 529, 529, 529, 529, 529, 529, 529, 530, 26, 529, 531, 197, 532, 26, 26, - 533, 533, 533, 533, 533, 533, 533, 534, 533, 534, 26, 26, 26, 26, 26, 26, - 535, 535, 535, 536, 535, 537, 535, 535, 538, 26, 26, 26, 26, 26, 26, 26, - 539, 539, 539, 539, 539, 539, 539, 540, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 542, 543, - 544, 545, 546, 547, 547, 547, 548, 549, 544, 26, 547, 550, 26, 26, 26, 26, - 26, 26, 26, 26, 551, 552, 551, 551, 551, 551, 551, 552, 553, 26, 26, 26, - 554, 554, 554, 554, 554, 554, 554, 554, 554, 26, 555, 555, 555, 555, 555, 555, - 555, 555, 555, 555, 556, 26, 177, 177, 557, 557, 557, 557, 557, 557, 557, 558, - 559, 560, 559, 559, 559, 559, 561, 559, 562, 26, 559, 559, 559, 563, 564, 564, - 564, 564, 565, 564, 564, 566, 567, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 568, 569, 570, 570, 570, 570, 568, 571, 570, 26, 570, 572, 573, 574, 575, 575, - 575, 576, 577, 578, 575, 579, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 580, 580, 580, 581, - 26, 26, 26, 26, 26, 26, 582, 26, 108, 108, 108, 108, 108, 108, 583, 584, - 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, - 585, 585, 585, 586, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 587, 588, 26, - 585, 585, 585, 585, 585, 585, 585, 585, 589, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 591, 26, - 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, - 592, 592, 592, 592, 592, 593, 592, 594, 26, 26, 26, 26, 26, 26, 26, 26, - 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, - 595, 595, 595, 595, 595, 595, 595, 595, 596, 26, 26, 26, 26, 26, 26, 26, - 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, - 304, 304, 304, 304, 304, 304, 304, 597, 598, 598, 598, 599, 598, 600, 601, 601, - 601, 601, 601, 601, 601, 601, 601, 602, 601, 603, 604, 604, 604, 605, 605, 26, - 606, 606, 606, 606, 606, 606, 606, 606, 607, 26, 606, 608, 608, 606, 606, 609, - 606, 606, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 610, 610, 610, 610, 610, 610, 610, 610, - 610, 610, 610, 611, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 612, 612, 612, 612, 612, 612, 612, 612, 612, 613, 612, 612, 612, 612, 612, 612, - 612, 614, 612, 612, 26, 26, 26, 26, 26, 26, 26, 26, 615, 26, 346, 26, - 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, - 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 26, - 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, - 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 618, 26, 26, 26, 26, 26, - 616, 619, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 620, 621, - 622, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 623, 26, 26, 26, 26, 26, 624, 26, 625, 26, 626, 626, - 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, - 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 627, - 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 629, 628, 630, - 628, 631, 628, 632, 280, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 9, 9, 9, 9, 9, 633, 9, 9, 220, 26, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 280, 26, 26, 26, 26, 26, 26, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, 26, - 0, 0, 0, 0, 257, 362, 0, 0, 0, 0, 0, 0, 634, 635, 0, 636, - 637, 638, 0, 0, 0, 639, 0, 0, 0, 0, 0, 0, 0, 265, 26, 26, - 14, 14, 14, 14, 14, 14, 14, 14, 246, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 280, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 26, 0, 0, 0, 259, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 0, 0, 0, 0, 0, - 0, 0, 0, 254, 640, 641, 0, 642, 643, 0, 0, 0, 0, 0, 0, 0, - 268, 644, 254, 254, 0, 0, 0, 645, 646, 647, 648, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 267, 0, 0, 0, 0, 0, 0, - 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, - 649, 650, 26, 651, 652, 649, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 2, 2, 2, 347, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 653, 269, 269, 654, 655, 656, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 657, 657, 657, 657, 657, 658, 657, 659, 657, 660, 26, 26, 26, 26, 26, 26, - 26, 26, 661, 661, 661, 662, 26, 26, 663, 663, 663, 663, 663, 663, 663, 664, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 171, 665, 169, 171, - 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, - 666, 666, 666, 666, 666, 666, 666, 666, 667, 666, 668, 26, 26, 26, 26, 26, - 669, 669, 669, 669, 669, 669, 669, 669, 669, 670, 669, 671, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 362, 0, - 0, 0, 0, 0, 0, 0, 376, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 362, 0, 0, 0, 0, 0, 0, 275, 26, 26, 26, 26, 26, 26, 26, 26, - 672, 31, 31, 31, 673, 674, 675, 676, 677, 678, 673, 679, 673, 675, 675, 680, - 31, 681, 31, 682, 683, 681, 31, 682, 26, 26, 26, 26, 26, 26, 51, 26, - 0, 0, 0, 0, 0, 280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 280, 26, 0, 257, 362, 0, 362, 0, 362, 0, 0, 0, 275, 26, - 0, 0, 0, 0, 0, 275, 26, 26, 26, 26, 26, 26, 684, 0, 0, 0, - 685, 26, 0, 0, 0, 0, 0, 280, 0, 259, 313, 26, 275, 26, 26, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 686, 0, 376, 0, 376, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 280, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, 0, 280, 259, 26, - 0, 280, 0, 0, 0, 0, 0, 0, 0, 26, 0, 313, 0, 0, 0, 0, - 0, 26, 0, 0, 0, 275, 313, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 280, 26, 0, 275, 376, 376, - 257, 26, 0, 0, 0, 376, 0, 265, 275, 26, 0, 313, 0, 26, 257, 26, - 0, 0, 359, 0, 0, 0, 0, 0, 0, 265, 26, 26, 26, 26, 0, 313, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 26, 26, 26, 26, - 276, 276, 276, 276, 276, 276, 276, 687, 276, 276, 276, 276, 276, 276, 276, 276, - 276, 276, 276, 279, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, - 276, 276, 276, 276, 346, 26, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 687, 26, 26, 26, - 276, 276, 276, 279, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 688, 26, 26, 26, 26, 26, 26, - 689, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 617, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 618, 618, 618, 618, 618, 618, 618, 618, + 618, 619, 618, 618, 618, 618, 618, 618, 618, 620, 618, 618, 26, 26, 26, 26, + 26, 26, 26, 26, 621, 26, 347, 26, 622, 622, 622, 622, 622, 622, 622, 622, + 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, + 622, 622, 622, 622, 622, 622, 622, 26, 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 624, 26, 26, 26, 26, 26, 622, 625, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 626, 627, 628, 287, 287, 287, 287, 287, 287, 287, + 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, + 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 629, 26, 630, 26, + 26, 26, 631, 26, 632, 26, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, + 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, + 633, 633, 633, 633, 633, 633, 633, 634, 635, 635, 635, 635, 635, 635, 635, 635, + 635, 635, 635, 635, 635, 636, 635, 637, 635, 638, 635, 639, 281, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 9, 9, 9, 9, 9, 640, 9, 9, + 221, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 281, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 276, 26, 0, 0, 0, 0, 258, 363, 0, 0, + 0, 0, 0, 0, 641, 642, 0, 643, 644, 645, 0, 0, 0, 646, 0, 0, + 0, 0, 0, 0, 0, 266, 26, 26, 14, 14, 14, 14, 14, 14, 14, 14, + 247, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 0, 0, 281, 26, 0, 0, 281, 26, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 258, 26, 0, 0, 0, 260, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 647, 648, 0, 649, + 650, 0, 0, 0, 0, 0, 0, 0, 269, 651, 255, 255, 0, 0, 0, 652, + 653, 654, 655, 0, 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 268, 0, 0, 0, 0, 0, 0, 656, 656, 656, 656, 656, 656, 656, 656, + 656, 656, 656, 656, 656, 656, 656, 656, 656, 657, 26, 658, 659, 656, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 348, 660, 308, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 661, 270, 270, 662, 663, 664, 18, 18, + 18, 18, 18, 18, 18, 665, 26, 26, 26, 666, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 667, 667, 667, 667, 667, 668, 667, 669, + 667, 670, 26, 26, 26, 26, 26, 26, 26, 26, 671, 671, 671, 672, 26, 26, + 673, 673, 673, 673, 673, 673, 673, 674, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 675, 675, 675, 675, 675, 676, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 172, 677, 170, 172, 678, 678, 678, 678, 678, 678, 678, 678, + 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, + 679, 678, 680, 26, 26, 26, 26, 26, 681, 681, 681, 681, 681, 681, 681, 681, + 681, 682, 681, 683, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 363, 0, 0, 0, 0, 0, 0, 0, 377, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 363, 0, 0, 0, 0, 0, 0, 276, + 26, 26, 26, 26, 26, 26, 26, 26, 684, 31, 31, 31, 685, 686, 687, 688, + 689, 690, 685, 691, 685, 687, 687, 692, 31, 693, 31, 694, 695, 693, 31, 694, + 26, 26, 26, 26, 26, 26, 51, 26, 0, 0, 0, 0, 0, 281, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281, 26, 0, 258, 363, 0, + 363, 0, 363, 0, 0, 0, 276, 26, 0, 0, 0, 0, 0, 276, 26, 26, + 26, 26, 26, 26, 696, 0, 0, 0, 697, 26, 0, 0, 0, 0, 0, 281, + 0, 260, 314, 26, 276, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 698, 0, 377, 0, 377, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 258, 699, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 314, 0, 281, 260, 26, 0, 281, 0, 0, 0, 0, 0, 0, + 0, 26, 0, 314, 0, 0, 0, 0, 0, 26, 0, 0, 0, 276, 314, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 281, 26, 0, 276, 0, 377, 0, 260, 0, 0, 0, 0, 0, 269, + 276, 696, 0, 281, 0, 260, 0, 260, 0, 0, 360, 0, 0, 0, 0, 0, + 0, 266, 26, 26, 26, 26, 0, 314, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 26, 26, 26, 26, 277, 277, 277, 277, 277, 277, 277, 347, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 280, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 347, 26, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 700, 26, 26, 26, 277, 277, 277, 280, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 701, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 702, 26, 26, 26, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 939, 940, 941, 942, 946, 948, 0, 962, + 969, 970, 971, 976,1001,1002,1003,1008, 0,1033,1040,1041,1042,1043,1047, 0, + 0,1080,1081,1082,1086,1110, 0, 0,1124,1125,1126,1127,1131,1133, 0,1147, + 1154,1155,1156,1161,1187,1188,1189,1193, 0,1219,1226,1227,1228,1229,1233, 0, + 0,1267,1268,1269,1273,1298, 0,1303, 943,1128, 944,1129, 954,1139, 958,1143, + 959,1144, 960,1145, 961,1146, 964,1149, 0, 0, 973,1158, 974,1159, 975,1160, + 983,1168, 978,1163, 988,1173, 990,1175, 991,1176, 993,1178, 994,1179, 0, 0, + 1004,1190,1005,1191,1006,1192,1014,1199,1007, 0, 0, 0,1016,1201,1020,1206, + 0,1022,1208,1025,1211,1023,1209, 0, 0, 0, 0,1032,1218,1037,1223,1035, + 1221, 0, 0, 0,1044,1230,1045,1231,1049,1235, 0, 0,1058,1244,1064,1250, + 1060,1246,1066,1252,1067,1253,1072,1258,1069,1255,1077,1264,1074,1261, 0, 0, + 1083,1270,1084,1271,1085,1272,1088,1275,1089,1276,1096,1283,1103,1290,1111,1299, + 1115,1118,1307,1120,1309,1121,1310, 0,1053,1239, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,1093,1280, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 949,1134,1010,1195,1050,1236,1090,1277,1341,1368,1340, + 1367,1342,1369,1339,1366, 0,1320,1347,1418,1419,1323,1350, 0, 0, 992,1177, + 1018,1204,1055,1241,1416,1417,1415,1424,1202, 0, 0, 0, 987,1172, 0, 0, + 1031,1217,1321,1348,1322,1349,1338,1365, 950,1135, 951,1136, 979,1164, 980,1165, + 1011,1196,1012,1197,1051,1237,1052,1238,1061,1247,1062,1248,1091,1278,1092,1279, + 1071,1257,1076,1263, 0, 0, 997,1182, 0, 0, 0, 0, 0, 0, 945,1130, + 982,1167,1337,1364,1335,1362,1046,1232,1422,1423,1113,1301, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 10,1425, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,1314,1427, 5, + 1434,1438,1443, 0,1450, 0,1455,1461,1514, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1446,1458,1468,1476,1480,1486,1517, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1489,1503,1494,1500,1508, 0, 0, 0, 0,1520,1521, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1526,1528, 0,1525, 0, 0, 0,1522, + 0, 0, 0, 0,1536,1532,1539, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1556, 0, 0, 0, 0, 0, 0,1548,1550, 0,1547, 0, 0, 0,1567, + 0, 0, 0, 0,1558,1554,1561, 0, 0, 0, 0, 0, 0, 0,1568,1569, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1529,1551, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1523,1545,1524,1546, 0, 0,1527,1549, + 0, 0,1570,1571,1530,1552,1531,1553, 0, 0,1533,1555,1535,1557,1537,1559, + 0, 0,1572,1573,1544,1566,1538,1560,1540,1562,1541,1563,1542,1564, 0, 0, + 1543,1565, 0, 0, 0, 0, 0, 0, 0, 0,1606,1607,1609,1608,1610, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1613, 0,1611, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1612, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1620, 0, 0, 0, 0, 0, 0, 0,1623, 0, 0,1624, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1614,1615,1616,1617,1618,1619,1621,1622, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1628,1629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1625,1626, 0,1627, 0, 0, 0,1634, 0, 0,1635, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1630,1631,1632, 0, 0,1633, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1639, 0, 0,1638,1640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1636,1637, 0, 0, 0, 0, 0, 0,1641, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1642,1644,1643, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1645, 0, 0, 0, 0, 0, 0, 0,1646, 0, 0, 0, 0, 0, 0,1648, + 1649, 0,1647,1650, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1651,1653,1652, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1654, 0,1655,1657,1656, 0, 0, 0, 0,1659, 0, 0, 0, 0, + 0, 0, 0, 0, 0,1660, 0, 0, 0, 0,1661, 0, 0, 0, 0,1662, + 0, 0, 0, 0,1663, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1658, 0, 0, 0, 0, 0, 0, 0, 0, 0,1664, 0,1665,1673, 0, + 1674, 0, 0, 0, 0, 0, 0, 0, 0,1666, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1668, 0, 0, 0, 0, + 0, 0, 0, 0, 0,1669, 0, 0, 0, 0,1670, 0, 0, 0, 0,1671, + 0, 0, 0, 0,1672, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1667, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1675, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1676, 0, + 1677, 0,1678, 0,1679, 0,1680, 0, 0, 0,1681, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1682, 0,1683, 0, 0,1684,1685, 0,1686, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 953,1138, 955,1140, 956,1141, 957,1142, + 1324,1351, 963,1148, 965,1150, 968,1153, 966,1151, 967,1152,1378,1380,1379,1381, + 984,1169, 985,1170,1420,1421, 986,1171, 989,1174, 995,1180, 998,1183, 996,1181, + 999,1184,1000,1185,1015,1200,1329,1356,1017,1203,1019,1205,1021,1207,1024,1210, + 1687,1688,1027,1213,1026,1212,1028,1214,1029,1215,1030,1216,1034,1220,1036,1222, + 1039,1225,1038,1224,1334,1361,1336,1363,1382,1384,1383,1385,1056,1242,1057,1243, + 1059,1245,1063,1249,1689,1690,1065,1251,1068,1254,1070,1256,1386,1387,1388,1389, + 1691,1692,1073,1259,1075,1262,1079,1266,1078,1265,1095,1282,1098,1285,1097,1284, + 1390,1391,1392,1393,1099,1286,1100,1287,1101,1288,1102,1289,1105,1292,1104,1291, + 1106,1294,1107,1295,1108,1296,1114,1302,1119,1308,1122,1311,1123,1312,1186,1260, + 1293,1305, 0,1394, 0, 0, 0, 0, 952,1137, 947,1132,1317,1344,1316,1343, + 1319,1346,1318,1345,1693,1695,1371,1375,1370,1374,1373,1377,1372,1376,1694,1696, + 981,1166, 977,1162, 972,1157,1326,1353,1325,1352,1328,1355,1327,1354,1697,1698, + 1009,1194,1013,1198,1054,1240,1048,1234,1331,1358,1330,1357,1333,1360,1332,1359, + 1699,1700,1396,1401,1395,1400,1398,1403,1397,1402,1399,1404,1094,1281,1087,1274, + 1406,1411,1405,1410,1408,1413,1407,1412,1409,1414,1109,1297,1117,1306,1116,1304, + 1112,1300, 0, 0, 0, 0, 0, 0,1471,1472,1701,1705,1702,1706,1703,1707, + 1430,1431,1715,1719,1716,1720,1717,1721,1477,1478,1729,1731,1730,1732, 0, 0, + 1435,1436,1733,1735,1734,1736, 0, 0,1481,1482,1737,1741,1738,1742,1739,1743, + 1439,1440,1751,1755,1752,1756,1753,1757,1490,1491,1765,1768,1766,1769,1767,1770, + 1447,1448,1771,1774,1772,1775,1773,1776,1495,1496,1777,1779,1778,1780, 0, 0, + 1451,1452,1781,1783,1782,1784, 0, 0,1504,1505,1785,1788,1786,1789,1787,1790, + 0,1459, 0,1791, 0,1792, 0,1793,1509,1510,1794,1798,1795,1799,1796,1800, + 1462,1463,1808,1812,1809,1813,1810,1814,1467, 21,1475, 22,1479, 23,1485, 24, + 1493, 27,1499, 28,1507, 29, 0, 0,1704,1708,1709,1710,1711,1712,1713,1714, + 1718,1722,1723,1724,1725,1726,1727,1728,1740,1744,1745,1746,1747,1748,1749,1750, + 1754,1758,1759,1760,1761,1762,1763,1764,1797,1801,1802,1803,1804,1805,1806,1807, + 1811,1815,1816,1817,1818,1819,1820,1821,1470,1469,1822,1474,1465, 0,1473,1825, + 1429,1428,1426, 12,1432, 0, 26, 0, 0,1315,1823,1484,1466, 0,1483,1829, + 1433, 13,1437, 14,1441,1826,1827,1828,1488,1487,1513, 19, 0, 0,1492,1515, + 1445,1444,1442, 15, 0,1831,1832,1833,1502,1501,1516, 25,1497,1498,1506,1518, + 1457,1456,1454, 17,1453,1313, 11, 3, 0, 0,1824,1512,1519, 0,1511,1830, + 1449, 16,1460, 18,1464, 4, 0, 0, 30, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, + 0, 0, 2, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1834,1835, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1836, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,1837,1839,1838, 0, 0, 0, 0,1840, 0, 0, 0, + 0,1841, 0, 0,1842, 0, 0, 0, 0, 0, 0, 0,1843, 0,1844, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1845, 0, 0,1846, 0, 0,1847, + 0,1848, 0, 0, 0, 0, 0, 0, 937, 0,1850, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,1849, 936, 938,1851,1852, 0, 0,1853,1854, 0, 0, + 1855,1856, 0, 0, 0, 0, 0, 0,1857,1858, 0, 0,1861,1862, 0, 0, + 1863,1864, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1867,1868,1869,1870,1859,1860,1865,1866, 0, 0, 0, 0, + 0, 0,1871,1872,1873,1874, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 32, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1877, 0,1878, 0,1879, 0,1880, 0,1881, 0,1882, 0, + 1883, 0,1884, 0,1885, 0,1886, 0,1887, 0,1888, 0, 0,1889, 0,1890, + 0,1891, 0, 0, 0, 0, 0, 0,1892,1893, 0,1894,1895, 0,1896,1897, + 0,1898,1899, 0,1900,1901, 0, 0, 0, 0, 0, 0,1876, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1902, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1904, 0,1905, 0,1906, 0,1907, 0,1908, 0,1909, 0, + 1910, 0,1911, 0,1912, 0,1913, 0,1914, 0,1915, 0, 0,1916, 0,1917, + 0,1918, 0, 0, 0, 0, 0, 0,1919,1920, 0,1921,1922, 0,1923,1924, + 0,1925,1926, 0,1927,1928, 0, 0, 0, 0, 0, 0,1903, 0, 0,1929, + 1930,1931,1932, 0, 0, 0,1933, 0, 710, 385, 724, 715, 455, 103, 186, 825, + 825, 242, 751, 205, 241, 336, 524, 601, 663, 676, 688, 738, 411, 434, 474, 500, + 649, 746, 799, 108, 180, 416, 482, 662, 810, 275, 462, 658, 692, 344, 618, 679, + 293, 388, 440, 492, 740, 116, 146, 168, 368, 414, 481, 527, 606, 660, 665, 722, + 781, 803, 809, 538, 553, 588, 642, 758, 811, 701, 233, 299, 573, 612, 487, 540, + 714, 779, 232, 267, 412, 445, 457, 585, 594, 766, 167, 613, 149, 148, 560, 589, + 648, 768, 708, 345, 411, 704, 105, 259, 313, 496, 518, 174, 542, 120, 307, 101, + 430, 372, 584, 183, 228, 529, 650, 697, 424, 732, 428, 349, 632, 355, 517, 110, + 135, 147, 403, 580, 624, 700, 750, 170, 193, 245, 297, 374, 463, 543, 763, 801, + 812, 815, 162, 384, 420, 730, 287, 330, 337, 366, 459, 476, 509, 558, 591, 610, + 726, 652, 734, 759, 154, 163, 198, 473, 683, 697, 292, 311, 353, 423, 572, 494, + 113, 217, 259, 280, 314, 499, 506, 603, 608, 752, 778, 782, 788, 117, 557, 748, + 774, 320, 109, 126, 260, 265, 373, 411, 479, 523, 655, 737, 823, 380, 765, 161, + 395, 398, 438, 451, 502, 516, 537, 583, 791, 136, 340, 769, 122, 273, 446, 727, + 305, 322, 400, 496, 771, 155, 190, 269, 377, 391, 406, 432, 501, 519, 599, 684, + 687, 749, 776, 175, 452, 191, 480, 510, 659, 772, 805, 813, 397, 444, 619, 566, + 568, 575, 491, 471, 707, 111, 636, 156, 153, 288, 346, 578, 256, 435, 383, 729, + 680, 767, 694, 295, 128, 210, 0, 0, 227, 0, 379, 0, 0, 150, 493, 525, + 544, 551, 552, 556, 783, 576, 604, 0, 661, 0, 703, 0, 0, 735, 743, 0, + 0, 0, 793, 794, 795, 808, 741, 773, 118, 127, 130, 166, 169, 177, 207, 213, + 215, 226, 229, 268, 270, 317, 327, 329, 335, 369, 375, 381, 404, 441, 448, 458, + 477, 484, 503, 539, 545, 547, 546, 548, 549, 550, 554, 555, 561, 564, 569, 591, + 593, 595, 598, 607, 620, 625, 625, 651, 690, 695, 705, 706, 716, 717, 733, 735, + 777, 786, 790, 315, 869, 623, 0, 0, 102, 145, 134, 115, 129, 138, 165, 171, + 207, 202, 206, 212, 227, 231, 240, 243, 250, 254, 294, 296, 303, 308, 319, 325, + 321, 329, 326, 335, 341, 357, 360, 362, 370, 379, 388, 389, 393, 421, 424, 438, + 456, 454, 458, 465, 477, 535, 485, 490, 493, 507, 512, 514, 521, 522, 525, 526, + 528, 533, 532, 541, 565, 569, 574, 586, 591, 597, 607, 637, 647, 674, 691, 693, + 695, 698, 703, 699, 705, 704, 702, 706, 709, 717, 728, 736, 747, 754, 770, 777, + 783, 784, 786, 787, 790, 802, 825, 848, 847, 857, 55, 65, 66, 883, 892, 916, + 822, 824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,1586, 0,1605, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1602,1603,1934,1935,1574,1575,1576,1577,1579,1580,1581,1583,1584, 0, + 1585,1587,1588,1589,1591, 0,1592, 0,1593,1594, 0,1595,1596, 0,1598,1599, + 1600,1601,1604,1582,1578,1590,1597, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1936, 0,1937, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1938, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1939,1940, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1941,1942, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1944,1943, 0,1945, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1946,1947, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1948, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1949,1950,1951,1952,1953,1954,1955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 939, 940, 941, 942, 946, 948, 0, 962, 969, 970, 971, 976,1001,1002,1003,1008, - 0,1033,1040,1041,1042,1043,1047, 0, 0,1080,1081,1082,1086,1110, 0, 0, - 1124,1125,1126,1127,1131,1133, 0,1147,1154,1155,1156,1161,1187,1188,1189,1193, - 0,1219,1226,1227,1228,1229,1233, 0, 0,1267,1268,1269,1273,1298, 0,1303, - 943,1128, 944,1129, 954,1139, 958,1143, 959,1144, 960,1145, 961,1146, 964,1149, - 0, 0, 973,1158, 974,1159, 975,1160, 983,1168, 978,1163, 988,1173, 990,1175, - 991,1176, 993,1178, 994,1179, 0, 0,1004,1190,1005,1191,1006,1192,1014,1199, - 1007, 0, 0, 0,1016,1201,1020,1206, 0,1022,1208,1025,1211,1023,1209, 0, - 0, 0, 0,1032,1218,1037,1223,1035,1221, 0, 0, 0,1044,1230,1045,1231, - 1049,1235, 0, 0,1058,1244,1064,1250,1060,1246,1066,1252,1067,1253,1072,1258, - 1069,1255,1077,1264,1074,1261, 0, 0,1083,1270,1084,1271,1085,1272,1088,1275, - 1089,1276,1096,1283,1103,1290,1111,1299,1115,1118,1307,1120,1309,1121,1310, 0, - 1053,1239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1093, - 1280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 949,1134,1010, - 1195,1050,1236,1090,1277,1341,1368,1340,1367,1342,1369,1339,1366, 0,1320,1347, - 1418,1419,1323,1350, 0, 0, 992,1177,1018,1204,1055,1241,1416,1417,1415,1424, - 1202, 0, 0, 0, 987,1172, 0, 0,1031,1217,1321,1348,1322,1349,1338,1365, - 950,1135, 951,1136, 979,1164, 980,1165,1011,1196,1012,1197,1051,1237,1052,1238, - 1061,1247,1062,1248,1091,1278,1092,1279,1071,1257,1076,1263, 0, 0, 997,1182, - 0, 0, 0, 0, 0, 0, 945,1130, 982,1167,1337,1364,1335,1362,1046,1232, - 1422,1423,1113,1301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 9, 0, 10,1425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0,1314,1427, 5,1434,1438,1443, 0,1450, 0,1455,1461, - 1514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1446,1458,1468,1476,1480,1486, - 1517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1489,1503,1494,1500,1508, 0, - 0, 0, 0,1520,1521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1526,1528, 0,1525, 0, 0, 0,1522, 0, 0, 0, 0,1536,1532,1539, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1534, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1556, 0, 0, 0, 0, 0, 0, - 1548,1550, 0,1547, 0, 0, 0,1567, 0, 0, 0, 0,1558,1554,1561, 0, - 0, 0, 0, 0, 0, 0,1568,1569, 0, 0, 0, 0, 0, 0, 0, 0, - 0,1529,1551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1523,1545,1524,1546, 0, 0,1527,1549, 0, 0,1570,1571,1530,1552,1531,1553, - 0, 0,1533,1555,1535,1557,1537,1559, 0, 0,1572,1573,1544,1566,1538,1560, - 1540,1562,1541,1563,1542,1564, 0, 0,1543,1565, 0, 0, 0, 0, 0, 0, - 0, 0,1606,1607,1609,1608,1610, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1613, 0,1611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,1612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1620, 0, 0, 0, 0, 0, 0, - 0,1623, 0, 0,1624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,1614,1615,1616,1617,1618,1619,1621,1622, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1628,1629, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1625,1626, 0,1627, - 0, 0, 0,1634, 0, 0,1635, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1630,1631,1632, 0, 0,1633, 0, - 0, 0, 0, 0, 0, 0, 0, 0,1639, 0, 0,1638,1640, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1636,1637, 0, 0, - 0, 0, 0, 0,1641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1642,1644,1643, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,1645, 0, 0, 0, 0, 0, 0, 0, - 1646, 0, 0, 0, 0, 0, 0,1648,1649, 0,1647,1650, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1651,1653,1652, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1654, 0,1655,1657,1656, 0, - 0, 0, 0,1659, 0, 0, 0, 0, 0, 0, 0, 0, 0,1660, 0, 0, - 0, 0,1661, 0, 0, 0, 0,1662, 0, 0, 0, 0,1663, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1658, 0, 0, 0, 0, 0, 0, - 0, 0, 0,1664, 0,1665,1673, 0,1674, 0, 0, 0, 0, 0, 0, 0, - 0,1666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,1668, 0, 0, 0, 0, 0, 0, 0, 0, 0,1669, 0, 0, - 0, 0,1670, 0, 0, 0, 0,1671, 0, 0, 0, 0,1672, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1667, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,1675, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,1676, 0,1677, 0,1678, 0,1679, 0,1680, 0, - 0, 0,1681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1682, 0,1683, 0, 0, - 1684,1685, 0,1686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 953,1138, 955,1140, 956,1141, 957,1142,1324,1351, 963,1148, 965,1150, 968,1153, - 966,1151, 967,1152,1378,1380,1379,1381, 984,1169, 985,1170,1420,1421, 986,1171, - 989,1174, 995,1180, 998,1183, 996,1181, 999,1184,1000,1185,1015,1200,1329,1356, - 1017,1203,1019,1205,1021,1207,1024,1210,1687,1688,1027,1213,1026,1212,1028,1214, - 1029,1215,1030,1216,1034,1220,1036,1222,1039,1225,1038,1224,1334,1361,1336,1363, - 1382,1384,1383,1385,1056,1242,1057,1243,1059,1245,1063,1249,1689,1690,1065,1251, - 1068,1254,1070,1256,1386,1387,1388,1389,1691,1692,1073,1259,1075,1262,1079,1266, - 1078,1265,1095,1282,1098,1285,1097,1284,1390,1391,1392,1393,1099,1286,1100,1287, - 1101,1288,1102,1289,1105,1292,1104,1291,1106,1294,1107,1295,1108,1296,1114,1302, - 1119,1308,1122,1311,1123,1312,1186,1260,1293,1305, 0,1394, 0, 0, 0, 0, - 952,1137, 947,1132,1317,1344,1316,1343,1319,1346,1318,1345,1693,1695,1371,1375, - 1370,1374,1373,1377,1372,1376,1694,1696, 981,1166, 977,1162, 972,1157,1326,1353, - 1325,1352,1328,1355,1327,1354,1697,1698,1009,1194,1013,1198,1054,1240,1048,1234, - 1331,1358,1330,1357,1333,1360,1332,1359,1699,1700,1396,1401,1395,1400,1398,1403, - 1397,1402,1399,1404,1094,1281,1087,1274,1406,1411,1405,1410,1408,1413,1407,1412, - 1409,1414,1109,1297,1117,1306,1116,1304,1112,1300, 0, 0, 0, 0, 0, 0, - 1471,1472,1701,1705,1702,1706,1703,1707,1430,1431,1715,1719,1716,1720,1717,1721, - 1477,1478,1729,1731,1730,1732, 0, 0,1435,1436,1733,1735,1734,1736, 0, 0, - 1481,1482,1737,1741,1738,1742,1739,1743,1439,1440,1751,1755,1752,1756,1753,1757, - 1490,1491,1765,1768,1766,1769,1767,1770,1447,1448,1771,1774,1772,1775,1773,1776, - 1495,1496,1777,1779,1778,1780, 0, 0,1451,1452,1781,1783,1782,1784, 0, 0, - 1504,1505,1785,1788,1786,1789,1787,1790, 0,1459, 0,1791, 0,1792, 0,1793, - 1509,1510,1794,1798,1795,1799,1796,1800,1462,1463,1808,1812,1809,1813,1810,1814, - 1467, 21,1475, 22,1479, 23,1485, 24,1493, 27,1499, 28,1507, 29, 0, 0, - 1704,1708,1709,1710,1711,1712,1713,1714,1718,1722,1723,1724,1725,1726,1727,1728, - 1740,1744,1745,1746,1747,1748,1749,1750,1754,1758,1759,1760,1761,1762,1763,1764, - 1797,1801,1802,1803,1804,1805,1806,1807,1811,1815,1816,1817,1818,1819,1820,1821, - 1470,1469,1822,1474,1465, 0,1473,1825,1429,1428,1426, 12,1432, 0, 26, 0, - 0,1315,1823,1484,1466, 0,1483,1829,1433, 13,1437, 14,1441,1826,1827,1828, - 1488,1487,1513, 19, 0, 0,1492,1515,1445,1444,1442, 15, 0,1831,1832,1833, - 1502,1501,1516, 25,1497,1498,1506,1518,1457,1456,1454, 17,1453,1313, 11, 3, - 0, 0,1824,1512,1519, 0,1511,1830,1449, 16,1460, 18,1464, 4, 0, 0, - 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 2, 6, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1834,1835, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1836, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1837,1839,1838, - 0, 0, 0, 0,1840, 0, 0, 0, 0,1841, 0, 0,1842, 0, 0, 0, - 0, 0, 0, 0,1843, 0,1844, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,1845, 0, 0,1846, 0, 0,1847, 0,1848, 0, 0, 0, 0, 0, 0, - 937, 0,1850, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1849, 936, 938, - 1851,1852, 0, 0,1853,1854, 0, 0,1855,1856, 0, 0, 0, 0, 0, 0, - 1857,1858, 0, 0,1861,1862, 0, 0,1863,1864, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1867,1868,1869,1870, - 1859,1860,1865,1866, 0, 0, 0, 0, 0, 0,1871,1872,1873,1874, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1875, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1877, 0,1878, 0, - 1879, 0,1880, 0,1881, 0,1882, 0,1883, 0,1884, 0,1885, 0,1886, 0, - 1887, 0,1888, 0, 0,1889, 0,1890, 0,1891, 0, 0, 0, 0, 0, 0, - 1892,1893, 0,1894,1895, 0,1896,1897, 0,1898,1899, 0,1900,1901, 0, 0, - 0, 0, 0, 0,1876, 0, 0, 0, 0, 0, 0, 0, 0, 0,1902, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1904, 0,1905, 0, - 1906, 0,1907, 0,1908, 0,1909, 0,1910, 0,1911, 0,1912, 0,1913, 0, - 1914, 0,1915, 0, 0,1916, 0,1917, 0,1918, 0, 0, 0, 0, 0, 0, - 1919,1920, 0,1921,1922, 0,1923,1924, 0,1925,1926, 0,1927,1928, 0, 0, - 0, 0, 0, 0,1903, 0, 0,1929,1930,1931,1932, 0, 0, 0,1933, 0, - 710, 385, 724, 715, 455, 103, 186, 825, 825, 242, 751, 205, 241, 336, 524, 601, - 663, 676, 688, 738, 411, 434, 474, 500, 649, 746, 799, 108, 180, 416, 482, 662, - 810, 275, 462, 658, 692, 344, 618, 679, 293, 388, 440, 492, 740, 116, 146, 168, - 368, 414, 481, 527, 606, 660, 665, 722, 781, 803, 809, 538, 553, 588, 642, 758, - 811, 701, 233, 299, 573, 612, 487, 540, 714, 779, 232, 267, 412, 445, 457, 585, - 594, 766, 167, 613, 149, 148, 560, 589, 648, 768, 708, 345, 411, 704, 105, 259, - 313, 496, 518, 174, 542, 120, 307, 101, 430, 372, 584, 183, 228, 529, 650, 697, - 424, 732, 428, 349, 632, 355, 517, 110, 135, 147, 403, 580, 624, 700, 750, 170, - 193, 245, 297, 374, 463, 543, 763, 801, 812, 815, 162, 384, 420, 730, 287, 330, - 337, 366, 459, 476, 509, 558, 591, 610, 726, 652, 734, 759, 154, 163, 198, 473, - 683, 697, 292, 311, 353, 423, 572, 494, 113, 217, 259, 280, 314, 499, 506, 603, - 608, 752, 778, 782, 788, 117, 557, 748, 774, 320, 109, 126, 260, 265, 373, 411, - 479, 523, 655, 737, 823, 380, 765, 161, 395, 398, 438, 451, 502, 516, 537, 583, - 791, 136, 340, 769, 122, 273, 446, 727, 305, 322, 400, 496, 771, 155, 190, 269, - 377, 391, 406, 432, 501, 519, 599, 684, 687, 749, 776, 175, 452, 191, 480, 510, - 659, 772, 805, 813, 397, 444, 619, 566, 568, 575, 491, 471, 707, 111, 636, 156, - 153, 288, 346, 578, 256, 435, 383, 729, 680, 767, 694, 295, 128, 210, 0, 0, - 227, 0, 379, 0, 0, 150, 493, 525, 544, 551, 552, 556, 783, 576, 604, 0, - 661, 0, 703, 0, 0, 735, 743, 0, 0, 0, 793, 794, 795, 808, 741, 773, - 118, 127, 130, 166, 169, 177, 207, 213, 215, 226, 229, 268, 270, 317, 327, 329, - 335, 369, 375, 381, 404, 441, 448, 458, 477, 484, 503, 539, 545, 547, 546, 548, - 549, 550, 554, 555, 561, 564, 569, 591, 593, 595, 598, 607, 620, 625, 625, 651, - 690, 695, 705, 706, 716, 717, 733, 735, 777, 786, 790, 315, 869, 623, 0, 0, - 102, 145, 134, 115, 129, 138, 165, 171, 207, 202, 206, 212, 227, 231, 240, 243, - 250, 254, 294, 296, 303, 308, 319, 325, 321, 329, 326, 335, 341, 357, 360, 362, - 370, 379, 388, 389, 393, 421, 424, 438, 456, 454, 458, 465, 477, 535, 485, 490, - 493, 507, 512, 514, 521, 522, 525, 526, 528, 533, 532, 541, 565, 569, 574, 586, - 591, 597, 607, 637, 647, 674, 691, 693, 695, 698, 703, 699, 705, 704, 702, 706, - 709, 717, 728, 736, 747, 754, 770, 777, 783, 784, 786, 787, 790, 802, 825, 848, - 847, 857, 55, 65, 66, 883, 892, 916, 822, 824, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1586, 0,1605, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1602,1603,1934,1935,1574,1575, - 1576,1577,1579,1580,1581,1583,1584, 0,1585,1587,1588,1589,1591, 0,1592, 0, - 1593,1594, 0,1595,1596, 0,1598,1599,1600,1601,1604,1582,1578,1590,1597, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1936, 0,1937, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1938, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1939,1940, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1941,1942, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1944,1943, 0,1945, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1946,1947, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,1948, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1949,1950, - 1951,1952,1953,1954,1955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1956,1957,1958,1960,1959, - 1961, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 106, 104, 107, 826, 114, 118, 119, 121, 123, 124, 127, 125, 34, 830, 130, 131, - 132, 137, 827, 35, 133, 139, 829, 142, 143, 112, 144, 145, 924, 151, 152, 37, - 157, 158, 159, 160, 38, 165, 166, 169, 171, 172, 173, 174, 176, 177, 178, 179, - 181, 182, 182, 182, 833, 468, 184, 185, 834, 187, 188, 189, 196, 192, 194, 195, - 197, 199, 200, 201, 203, 204, 204, 206, 208, 209, 211, 218, 213, 219, 214, 216, - 153, 234, 221, 222, 223, 220, 225, 224, 230, 835, 235, 236, 237, 238, 239, 244, - 836, 837, 247, 248, 249, 246, 251, 39, 40, 253, 255, 255, 838, 257, 258, 259, - 261, 839, 262, 263, 301, 264, 41, 266, 270, 272, 271, 841, 274, 842, 277, 276, - 278, 281, 282, 42, 283, 284, 285, 286, 43, 843, 44, 289, 290, 291, 293, 934, - 298, 845, 845, 621, 300, 300, 45, 852, 894, 302, 304, 46, 306, 309, 310, 312, - 316, 48, 47, 317, 846, 318, 323, 324, 325, 324, 328, 329, 333, 331, 332, 334, - 335, 336, 338, 339, 342, 343, 347, 351, 849, 350, 348, 352, 354, 359, 850, 361, - 358, 356, 49, 363, 365, 367, 364, 50, 369, 371, 851, 376, 386, 378, 53, 381, - 52, 51, 140, 141, 387, 382, 614, 78, 388, 389, 390, 394, 392, 856, 54, 399, - 396, 402, 404, 858, 405, 401, 407, 55, 408, 409, 410, 413, 859, 415, 56, 417, - 860, 418, 57, 419, 422, 424, 425, 861, 840, 862, 426, 863, 429, 431, 427, 433, - 437, 441, 438, 439, 442, 443, 864, 436, 449, 450, 58, 454, 453, 865, 447, 460, - 866, 867, 461, 466, 465, 464, 59, 467, 470, 469, 472, 828, 475, 868, 478, 870, - 483, 485, 486, 871, 488, 489, 872, 873, 495, 497, 60, 498, 61, 61, 504, 505, - 507, 508, 511, 62, 513, 874, 515, 875, 518, 844, 520, 876, 877, 878, 63, 64, - 528, 880, 879, 881, 882, 530, 531, 531, 533, 66, 534, 67, 68, 884, 536, 538, - 541, 69, 885, 549, 886, 887, 556, 559, 70, 561, 562, 563, 888, 889, 889, 567, - 71, 890, 570, 571, 72, 891, 577, 73, 581, 579, 582, 893, 587, 74, 590, 592, - 596, 75, 895, 896, 76, 897, 600, 898, 602, 605, 607, 899, 900, 609, 901, 611, - 853, 77, 615, 616, 79, 617, 252, 902, 903, 854, 855, 621, 622, 731, 80, 627, - 626, 628, 164, 629, 630, 631, 633, 904, 632, 634, 639, 640, 635, 641, 646, 651, - 638, 643, 644, 645, 905, 907, 906, 81, 653, 654, 656, 911, 657, 908, 82, 83, - 909, 910, 84, 664, 665, 666, 667, 669, 668, 671, 670, 674, 672, 673, 675, 85, - 677, 678, 86, 681, 682, 912, 685, 686, 87, 689, 36, 913, 914, 88, 89, 696, - 702, 709, 711, 915, 712, 713, 718, 719, 917, 831, 721, 720, 723, 832, 725, 728, - 918, 919, 739, 742, 744, 920, 745, 753, 756, 757, 755, 760, 761, 921, 762, 90, - 764, 922, 91, 775, 279, 780, 923, 925, 92, 93, 785, 926, 94, 927, 787, 787, - 789, 928, 792, 95, 796, 797, 798, 800, 96, 929, 802, 804, 806, 97, 98, 807, - 930, 99, 931, 932, 933, 814, 100, 816, 817, 818, 819, 820, 821, 935, 0, 0, + 0, 0, 0,1956,1957,1958,1960,1959,1961, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 106, 104, 107, 826, 114, 118, 119, 121, + 123, 124, 127, 125, 34, 830, 130, 131, 132, 137, 827, 35, 133, 139, 829, 142, + 143, 112, 144, 145, 924, 151, 152, 37, 157, 158, 159, 160, 38, 165, 166, 169, + 171, 172, 173, 174, 176, 177, 178, 179, 181, 182, 182, 182, 833, 468, 184, 185, + 834, 187, 188, 189, 196, 192, 194, 195, 197, 199, 200, 201, 203, 204, 204, 206, + 208, 209, 211, 218, 213, 219, 214, 216, 153, 234, 221, 222, 223, 220, 225, 224, + 230, 835, 235, 236, 237, 238, 239, 244, 836, 837, 247, 248, 249, 246, 251, 39, + 40, 253, 255, 255, 838, 257, 258, 259, 261, 839, 262, 263, 301, 264, 41, 266, + 270, 272, 271, 841, 274, 842, 277, 276, 278, 281, 282, 42, 283, 284, 285, 286, + 43, 843, 44, 289, 290, 291, 293, 934, 298, 845, 845, 621, 300, 300, 45, 852, + 894, 302, 304, 46, 306, 309, 310, 312, 316, 48, 47, 317, 846, 318, 323, 324, + 325, 324, 328, 329, 333, 331, 332, 334, 335, 336, 338, 339, 342, 343, 347, 351, + 849, 350, 348, 352, 354, 359, 850, 361, 358, 356, 49, 363, 365, 367, 364, 50, + 369, 371, 851, 376, 386, 378, 53, 381, 52, 51, 140, 141, 387, 382, 614, 78, + 388, 389, 390, 394, 392, 856, 54, 399, 396, 402, 404, 858, 405, 401, 407, 55, + 408, 409, 410, 413, 859, 415, 56, 417, 860, 418, 57, 419, 422, 424, 425, 861, + 840, 862, 426, 863, 429, 431, 427, 433, 437, 441, 438, 439, 442, 443, 864, 436, + 449, 450, 58, 454, 453, 865, 447, 460, 866, 867, 461, 466, 465, 464, 59, 467, + 470, 469, 472, 828, 475, 868, 478, 870, 483, 485, 486, 871, 488, 489, 872, 873, + 495, 497, 60, 498, 61, 61, 504, 505, 507, 508, 511, 62, 513, 874, 515, 875, + 518, 844, 520, 876, 877, 878, 63, 64, 528, 880, 879, 881, 882, 530, 531, 531, + 533, 66, 534, 67, 68, 884, 536, 538, 541, 69, 885, 549, 886, 887, 556, 559, + 70, 561, 562, 563, 888, 889, 889, 567, 71, 890, 570, 571, 72, 891, 577, 73, + 581, 579, 582, 893, 587, 74, 590, 592, 596, 75, 895, 896, 76, 897, 600, 898, + 602, 605, 607, 899, 900, 609, 901, 611, 853, 77, 615, 616, 79, 617, 252, 902, + 903, 854, 855, 621, 622, 731, 80, 627, 626, 628, 164, 629, 630, 631, 633, 904, + 632, 634, 639, 640, 635, 641, 646, 651, 638, 643, 644, 645, 905, 907, 906, 81, + 653, 654, 656, 911, 657, 908, 82, 83, 909, 910, 84, 664, 665, 666, 667, 669, + 668, 671, 670, 674, 672, 673, 675, 85, 677, 678, 86, 681, 682, 912, 685, 686, + 87, 689, 36, 913, 914, 88, 89, 696, 702, 709, 711, 915, 712, 713, 718, 719, + 917, 831, 721, 720, 723, 832, 725, 728, 918, 919, 739, 742, 744, 920, 745, 753, + 756, 757, 755, 760, 761, 921, 762, 90, 764, 922, 91, 775, 279, 780, 923, 925, + 92, 93, 785, 926, 94, 927, 787, 787, 789, 928, 792, 95, 796, 797, 798, 800, + 96, 929, 802, 804, 806, 97, 98, 807, 930, 99, 931, 932, 933, 814, 100, 816, + 817, 818, 819, 820, 821, 935, 0, 0, }; static const int16_t _hb_ucd_i16[196] = @@ -2792,12 +2822,12 @@ _hb_ucd_i16[196] = static inline uint_fast8_t _hb_ucd_gc (unsigned u) { - return u<1114110u?_hb_ucd_u8[6664+(((_hb_ucd_u8[1296+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2; + return u<1114110u?_hb_ucd_u8[6800+(((_hb_ucd_u8[1312+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2; } static inline uint_fast8_t _hb_ucd_ccc (unsigned u) { - return u<125259u?_hb_ucd_u8[8984+(((_hb_ucd_u8[7960+(((_hb_ucd_u8[7288+(((_hb_ucd_u8[7042+(u>>2>>3>>4)])<<4)+((u>>2>>3)&15u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u))]:0; + return u<125259u?_hb_ucd_u8[9184+(((_hb_ucd_u8[8128+(((_hb_ucd_u8[7424+(((_hb_ucd_u8[7178+(u>>2>>3>>4)])<<4)+((u>>2>>3)&15u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u))]:0; } static inline unsigned _hb_ucd_b4 (const uint8_t* a, unsigned i) @@ -2807,24 +2837,24 @@ _hb_ucd_b4 (const uint8_t* a, unsigned i) static inline int_fast16_t _hb_ucd_bmg (unsigned u) { - return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9728+(((_hb_ucd_u8[9608+(((_hb_ucd_b4(9480+_hb_ucd_u8,u>>2>>3>>3))<<3)+((u>>2>>3)&7u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u)]:0; + return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9932+(((_hb_ucd_u8[9812+(((_hb_ucd_b4(9684+_hb_ucd_u8,u>>2>>3>>3))<<3)+((u>>2>>3)&7u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u)]:0; } static inline uint_fast8_t _hb_ucd_sc (unsigned u) { - return u<918000u?_hb_ucd_u8[11234+(((_hb_ucd_u16[2000+(((_hb_ucd_u8[10514+(((_hb_ucd_u8[10064+(u>>3>>4>>4)])<<4)+((u>>3>>4)&15u))])<<4)+((u>>3)&15u))])<<3)+((u)&7u))]:2; + return u<918000u?_hb_ucd_u8[11454+(((_hb_ucd_u16[2040+(((_hb_ucd_u8[10718+(((_hb_ucd_u8[10268+(u>>3>>4>>4)])<<4)+((u>>3>>4)&15u))])<<4)+((u>>3)&15u))])<<3)+((u)&7u))]:2; } static inline uint_fast16_t _hb_ucd_dm (unsigned u) { - return u<195102u?_hb_ucd_u16[5888+(((_hb_ucd_u8[17136+(((_hb_ucd_u8[16754+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0; + return u<195102u?_hb_ucd_u16[6008+(((_hb_ucd_u8[17460+(((_hb_ucd_u8[17078+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0; } #elif !defined(HB_NO_UCD_UNASSIGNED) static const uint8_t -_hb_ucd_u8[17564] = +_hb_ucd_u8[17868] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 7, 7, 7, 7, 11, 12, 13, 13, 13, 14, @@ -2832,7 +2862,7 @@ _hb_ucd_u8[17564] = 25, 26, 22, 22, 22, 27, 28, 29, 22, 30, 31, 32, 33, 34, 35, 36, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 37, 7, 38, 39, 7, 40, 7, 7, 7, 41, 22, 42, - 7, 7, 43, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 7, 7, 43, 7, 44, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, @@ -2854,12 +2884,12 @@ _hb_ucd_u8[17564] = 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 44, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 45, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 45, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 46, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 47, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 34, 35, 36, 37, 38, 39, 34, 34, 34, 40, 41, 42, 43, @@ -2878,35 +2908,36 @@ _hb_ucd_u8[17564] = 118,119,120,121,122,123,124,125,126,127,128,129, 34, 34,130,131, 132,133,134,135,136,137,138,139,140,141,142,122,143,144,145,146, 147,148,149,150,151,152,153,122,154,155,122,156,157,158,159,122, - 160,161,162,163,164,165,122,122,166,167,168,169,122,170,122,171, - 34, 34, 34, 34, 34, 34, 34,172,173, 34,174,122,122,122,122,122, - 122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,175, - 34, 34, 34, 34, 34, 34, 34, 34,176,122,122,122,122,122,122,122, + 160,161,162,163,164,165,166,122,167,168,169,170,122,171,172,173, + 34, 34, 34, 34, 34, 34, 34,174,175, 34,176,122,122,122,122,122, + 122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,177, + 34, 34, 34, 34, 34, 34, 34, 34,178,122,122,122,122,122,122,122, 122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122, - 122,122,122,122,122,122,122,122, 34, 34, 34, 34,177,122,122,122, - 34, 34, 34, 34,178,179,180,181,122,122,122,122,182,183,184,185, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,186, - 34, 34, 34, 34, 34, 34, 34, 34, 34,187,188,122,122,122,122,122, - 122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,189, - 34, 34,190, 34, 34,191,122,122,122,122,122,122,122,122,122,122, - 122,122,122,122,122,122,122,122,192,193,122,122,122,122,122,122, - 122,122,122,122,122,122,122,122,122,122,122,122,122,122,194,195, - 69,196,197,198,199,200,201,122,202,203,204,205,206,207,208,209, - 69, 69, 69, 69,210,211,122,122,122,122,122,122,122,122,212,122, - 213,122,214,122,122,215,122,122,122,122,122,122,122,122,122,216, - 34,217,218,122,122,122,122,122,219,220,221,122,222,223,122,122, - 224,225,226,227,228,122, 69,229, 69, 69, 69, 69, 69,230,231,232, - 233,234, 69, 69,235,236, 69,237,122,122,122,122,122,122,122,122, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,238, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,239, 34, - 240, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,241, 34, 34, - 34, 34, 34, 34, 34, 34, 34,242,122,122,122,122,122,122,122,122, - 34, 34, 34, 34,243,122,122,122,122,122,122,122,122,122,122,122, - 34, 34, 34, 34, 34, 34,244,122,122,122,122,122,122,122,122,122, - 245,122,246,247,122,122,122,122,122,122,122,122,122,122,122,122, - 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,248, - 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,249, + 122,122,122,122,122,122,122,122, 34, 34, 34, 34,179,122,122,122, + 34, 34, 34, 34,180,181,182,183,122,122,122,122,184,185,186,187, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,188, + 34, 34, 34, 34, 34, 34, 34, 34, 34,189,190,122,122,122,122,122, + 122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,191, + 34, 34,192, 34, 34,193,122,122,122,122,122,122,122,122,122,122, + 122,122,122,122,122,122,122,122,194,195,122,122,122,122,122,122, + 122,122,122,122,122,122,122,122,122,122,122,122,122,122,196,197, + 69,198,199,200,201,202,203,122,204,205,206,207,208,209,210,211, + 69, 69, 69, 69,212,213,122,122,122,122,122,122,122,122,214,122, + 215,216,217,122,122,218,122,122,122,219,122,122,122,122,122,220, + 34,221,222,122,122,122,122,122,223,224,225,122,226,227,122,122, + 228,229,230,231,232,122, 69,233, 69, 69, 69, 69, 69,234,235,236, + 237,238, 69, 69,239,240, 69,241,122,122,122,122,122,122,122,122, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,242, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,243, 34, + 244, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,245, 34, 34, + 34, 34, 34, 34, 34, 34, 34,246,122,122,122,122,122,122,122,122, + 34, 34, 34, 34,247,122,122,122,122,122,122,122,122,122,122,122, + 34, 34, 34, 34, 34, 34,248, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34,249,122,122,122,122,122,122,122,122, + 250,122,251,252,122,122,122,122,122,122,122,122,122,122,122,122, + 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,253, + 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,254, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 2, 4, 5, 6, 2, 7, 7, 7, 7, 7, 2, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, @@ -2969,7 +3000,7 @@ _hb_ucd_u8[17564] = 44, 44, 57, 80, 36, 61, 62, 44, 44, 44, 44, 93, 27, 27, 27, 91, 70, 86, 72, 36, 36, 36, 61, 36, 36, 36, 62, 36, 36, 44, 71, 87, 86, 86, 90, 85, 90, 86, 43, 44, 44, 44, 89, 90, 44, 44, 62, 61, - 62, 61, 44, 44, 44, 44, 44, 44, 43, 86, 36, 36, 36, 36, 61, 36, + 62, 94, 44, 44, 44, 44, 44, 44, 43, 86, 36, 36, 36, 36, 61, 36, 36, 36, 36, 36, 36, 70, 71, 86, 87, 43, 80, 86, 90, 86, 87, 77, 44, 44, 36, 94, 27, 27, 27, 95, 27, 27, 27, 27, 91, 36, 36, 36, 57, 86, 62, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, 36, 36, 36, @@ -2979,7 +3010,7 @@ _hb_ucd_u8[17564] = 36, 36, 36, 75, 43, 43, 43, 60, 7, 7, 7, 7, 7, 2, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 62, 61, 61, 36, 36, 61, 36, 36, 36, 36, 62, 62, 36, 36, 36, 36, 70, 36, 43, 43, 43, 43, 71, 44, - 36, 36, 61, 81, 43, 43, 43, 44, 7, 7, 7, 7, 7, 44, 36, 36, + 36, 36, 61, 81, 43, 43, 43, 80, 7, 7, 7, 7, 7, 44, 36, 36, 77, 67, 2, 2, 2, 2, 2, 2, 2, 97, 97, 67, 43, 67, 67, 67, 7, 7, 7, 7, 7, 27, 27, 27, 27, 27, 50, 50, 50, 4, 4, 86, 36, 36, 36, 36, 62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, @@ -3146,18 +3177,19 @@ _hb_ucd_u8[17564] = 44, 44, 44, 44,179, 27, 27, 27, 11, 47, 44, 44, 44, 44, 44, 44, 16,110, 44, 44, 44, 27, 27, 27, 36, 36, 43, 43, 44, 44, 44, 44, 27, 27, 27, 27, 27, 27, 27,100, 36, 36, 36, 36, 36, 57,184, 44, - 36, 44, 44, 44, 44, 44, 44, 44, 27, 27, 27, 95, 44, 44, 44, 44, - 180, 27, 30, 2, 2, 44, 44, 44, 36, 43, 43, 2, 2, 44, 44, 44, - 36, 36,183, 27, 27, 27, 44, 44, 87, 98, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 43, 60, 2, 2, 2, 44, - 27, 27, 27, 7, 7, 7, 7, 7, 71, 70, 71, 44, 44, 44, 44, 57, - 86, 87, 43, 85, 87, 60,185, 2, 2, 80, 44, 44, 44, 44, 79, 44, - 43, 71, 36, 36, 36, 36, 36, 36, 36, 36, 36, 70, 43, 43, 87, 43, - 43, 43, 80, 7, 7, 7, 7, 7, 2, 2, 94, 98, 44, 44, 44, 44, - 36, 70, 2, 61, 44, 44, 44, 44, 36, 94, 86, 43, 43, 43, 43, 85, - 98, 36, 63, 2, 59, 43, 60, 87, 7, 7, 7, 7, 7, 63, 63, 2, - 179, 27, 27, 27, 27, 27, 27, 27, 27, 27,100, 44, 44, 44, 44, 44, - 36, 36, 36, 36, 36, 36, 86, 87, 43, 86, 85, 43, 2, 2, 2, 80, + 36, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 57, 43, + 27, 27, 27, 95, 44, 44, 44, 44,180, 27, 30, 2, 2, 44, 44, 44, + 36, 43, 43, 2, 2, 44, 44, 44, 36, 36,183, 27, 27, 27, 44, 44, + 87, 98, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43, 43, + 43, 43, 43, 60, 2, 2, 2, 44, 27, 27, 27, 7, 7, 7, 7, 7, + 71, 70, 71, 44, 44, 44, 44, 57, 86, 87, 43, 85, 87, 60,185, 2, + 2, 80, 44, 44, 44, 44, 79, 44, 43, 71, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 70, 43, 43, 87, 43, 43, 43, 80, 7, 7, 7, 7, 7, + 2, 2, 94, 98, 44, 44, 44, 44, 36, 70, 2, 61, 44, 44, 44, 44, + 36, 94, 86, 43, 43, 43, 43, 85, 98, 36, 63, 2, 59, 43, 60, 87, + 7, 7, 7, 7, 7, 63, 63, 2,179, 27, 27, 27, 27, 27, 27, 27, + 27, 27,100, 44, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36, 86, 87, + 43, 86, 85, 43, 2, 2, 2, 71, 70, 44, 44, 44, 44, 44, 44, 44, 36, 36, 36, 61, 61, 36, 36, 62, 36, 36, 36, 36, 36, 36, 36, 62, 36, 36, 36, 36, 63, 44, 44, 44, 36, 36, 36, 36, 36, 36, 36, 70, 86, 87, 43, 43, 43, 80, 44, 44, 43, 86, 62, 36, 36, 36, 61, 62, @@ -3179,17 +3211,20 @@ _hb_ucd_u8[17564] = 70, 43, 43, 43, 43, 71, 36, 36, 36, 70, 43, 43, 85, 70, 43, 60, 2, 2, 2, 59, 44, 44, 44, 44, 70, 43, 43, 85, 87, 43, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 85, 43, 2, 72, 2, - 2, 64, 44, 44, 44, 44, 44, 44, 43, 43, 43, 80, 43, 43, 43, 87, - 63, 2, 2, 44, 44, 44, 44, 44, 2, 36, 36, 36, 36, 36, 36, 36, - 44, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 89, 43, 43, 43, - 85, 43, 87, 80, 44, 44, 44, 44, 36, 36, 36, 61, 36, 62, 36, 36, - 70, 43, 43, 80, 44, 80, 43, 57, 43, 43, 43, 70, 44, 44, 44, 44, - 36, 36, 36, 62, 61, 36, 36, 36, 36, 36, 36, 36, 36, 86, 86, 90, - 43, 89, 87, 87, 61, 44, 44, 44, 36, 70, 85,107, 64, 44, 44, 44, + 2, 64, 44, 44, 44, 44, 44, 44, 2, 2, 2, 2, 2, 44, 44, 44, + 43, 43, 43, 80, 43, 43, 43, 87, 63, 2, 2, 44, 44, 44, 44, 44, + 2, 36, 36, 36, 36, 36, 36, 36, 44, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 89, 43, 43, 43, 85, 43, 87, 80, 44, 44, 44, 44, + 36, 36, 36, 61, 36, 62, 36, 36, 70, 43, 43, 80, 44, 80, 43, 57, + 43, 43, 43, 70, 44, 44, 44, 44, 36, 36, 36, 62, 61, 36, 36, 36, + 36, 36, 36, 36, 36, 86, 86, 90, 43, 89, 87, 87, 61, 44, 44, 44, + 36, 70, 85,107, 64, 44, 44, 44, 43, 94, 36, 36, 36, 36, 36, 36, + 36, 36, 86, 43, 43, 80, 44, 86, 85, 60, 2, 2, 2, 2, 2, 2, 27, 27, 91, 67, 67, 67, 56, 20,168, 67, 67, 67, 67, 67, 67, 67, 67, 44, 44, 44, 44, 44, 44, 93,105,105,105,105,105,105,105,181, 2, 2, 64, 44, 44, 44, 44, 44, 63, 64, 44, 44, 44, 44, 44, 44, - 65, 65, 65, 65,132, 44, 44, 44, 43, 43, 60, 44, 44, 44, 44, 44, + 65, 65, 65, 65, 65, 65, 65, 65, 71, 36, 36, 70, 43, 43, 43, 43, + 43, 43, 43, 44, 44, 44, 44, 44, 43, 43, 60, 44, 44, 44, 44, 44, 43, 43, 43, 60, 2, 2, 67, 67, 40, 40, 97, 44, 44, 44, 44, 44, 7, 7, 7, 7, 7,179, 27, 27, 27, 62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 44, 62, 36, 27, 27, 27, 30, 2, 64, 44, 44, @@ -3197,7 +3232,8 @@ _hb_ucd_u8[17564] = 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 44, 44, 44, 57, 43, 74, 40, 40, 40, 40, 40, 40, 40, 88, 80, 44, 44, 44, 44, 44, 86, 44, 44, 44, 44, 44, 44, 44, 40, 40, 52, 40, 40, 40, 52, 81, - 36, 61, 44, 44, 44, 44, 44, 44, 44, 44, 36, 36, 44, 44, 44, 44, + 36, 61, 44, 44, 44, 44, 44, 44, 44, 61, 44, 44, 44, 44, 44, 44, + 36, 61, 62, 44, 44, 44, 44, 44, 44, 44, 36, 36, 44, 44, 44, 44, 36, 36, 36, 36, 36, 44, 50, 60, 65, 65, 44, 44, 44, 44, 44, 44, 43, 43, 43, 43, 43, 43, 43, 44, 43, 43, 43, 80, 44, 44, 44, 44, 67, 67, 67, 92, 55, 67, 67, 67, 67, 67,186, 87, 43, 67,186, 86, @@ -3222,10 +3258,12 @@ _hb_ucd_u8[17564] = 43, 43, 43, 43, 43, 43, 76, 67, 67, 67, 50, 67, 67, 67, 67, 67, 67, 67, 76, 21, 2, 2, 44, 44, 44, 44, 44, 44, 44, 57, 43, 43, 16, 16, 16, 16, 16, 39, 16, 16, 16, 16, 16, 16, 16, 16, 16,110, - 43, 43, 43, 80, 43, 43, 43, 43, 43, 43, 43, 43, 80, 57, 43, 43, - 43, 57, 80, 43, 43, 80, 44, 44, 43, 43, 43, 74, 40, 40, 40, 44, - 7, 7, 7, 7, 7, 44, 44, 77, 36, 36, 36, 36, 36, 36, 36, 80, - 36, 36, 36, 36, 36, 36, 43, 43, 7, 7, 7, 7, 7, 44, 44, 96, + 44, 44,150, 16, 16,110, 44, 44, 43, 43, 43, 80, 43, 43, 43, 43, + 43, 43, 43, 43, 80, 57, 43, 43, 43, 57, 80, 43, 43, 80, 44, 44, + 40, 40, 40, 40, 40, 40, 40, 44, 44, 44, 44, 44, 44, 44, 44, 57, + 43, 43, 43, 74, 40, 40, 40, 44, 7, 7, 7, 7, 7, 44, 44, 77, + 36, 36, 36, 36, 36, 36, 36, 80, 36, 36, 36, 36, 36, 36, 43, 43, + 7, 7, 7, 7, 7, 44, 44, 96, 36, 36, 36, 36, 36, 83, 43, 43, 36, 36, 36, 61, 36, 36, 62, 61, 36, 36, 61,179, 27, 27, 27, 27, 16, 16, 43, 43, 43, 74, 44, 44, 27, 27, 27, 27, 27, 27,163, 27, 188, 27,100, 44, 44, 44, 44, 44, 27, 27, 27, 27, 27, 27, 27,163, @@ -3238,206 +3276,210 @@ _hb_ucd_u8[17564] = 27, 27, 27, 27, 27, 27, 91, 67, 67, 67, 67, 67, 67, 67, 67, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 92, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 92, 44, 44, 44, 67, 44, 44, 44, 44, 44, 44, 44, - 67, 67, 67, 67, 67, 25, 41, 41, 67, 67, 67, 67, 44, 44, 55, 67, - 67, 67, 67, 67, 44, 44, 44, 44, 67, 67, 92, 44, 67, 67, 92, 44, + 67, 67, 67, 67, 67, 25, 41, 41, 67, 67, 67, 67, 44, 44, 67, 67, + 67, 67, 67, 92, 44, 55, 67, 67, 67, 67, 67, 67, 44, 44, 44, 44, + 67, 67, 67, 67, 67, 67, 67, 55, 67, 67, 67, 44, 44, 44, 44, 67, 67, 92, 67, 67, 67, 67, 67, 67, 79, 44, 44, 44, 44, 44, 44, 44, - 65, 65, 65, 65, 65, 65, 65, 65,171,171,171,171,171,171,171, 44, - 171,171,171,171,171,171,171, 0, 0, 0, 29, 21, 21, 21, 23, 21, - 22, 18, 21, 25, 21, 17, 13, 13, 25, 25, 25, 21, 21, 9, 9, 9, - 9, 22, 21, 18, 24, 16, 24, 5, 5, 5, 5, 22, 25, 18, 25, 0, - 23, 23, 26, 21, 24, 26, 7, 20, 25, 1, 26, 24, 26, 25, 15, 15, - 24, 15, 7, 19, 15, 21, 9, 25, 9, 5, 5, 25, 5, 9, 5, 7, - 7, 7, 9, 8, 8, 5, 7, 5, 6, 6, 24, 24, 6, 24, 12, 12, - 2, 2, 6, 5, 9, 21, 9, 2, 2, 9, 25, 9, 26, 12, 11, 11, - 2, 6, 5, 21, 17, 2, 2, 26, 26, 23, 2, 12, 17, 12, 21, 12, - 12, 21, 7, 2, 2, 7, 7, 21, 21, 2, 1, 1, 21, 23, 26, 26, - 1, 21, 6, 7, 7, 12, 12, 7, 21, 7, 12, 1, 12, 6, 6, 12, - 12, 26, 7, 26, 26, 7, 2, 1, 12, 2, 6, 2, 24, 7, 7, 6, - 1, 12, 12, 10, 10, 10, 10, 12, 21, 6, 2, 10, 10, 2, 15, 26, - 26, 2, 2, 21, 7, 10, 15, 7, 2, 23, 21, 26, 10, 7, 21, 15, - 15, 2, 17, 7, 29, 7, 7, 22, 18, 2, 14, 14, 14, 7, 10, 21, - 17, 21, 11, 12, 5, 2, 5, 6, 8, 8, 8, 24, 5, 24, 2, 24, - 9, 24, 24, 2, 29, 29, 29, 1, 17, 17, 20, 19, 22, 20, 27, 28, - 1, 29, 21, 20, 19, 21, 21, 16, 16, 21, 25, 22, 18, 21, 21, 29, - 1, 2, 15, 6, 18, 6, 23, 2, 12, 11, 9, 26, 26, 9, 26, 5, - 5, 26, 14, 9, 5, 14, 14, 15, 25, 26, 26, 22, 18, 26, 18, 25, - 18, 22, 5, 12, 2, 5, 22, 21, 21, 22, 18, 17, 26, 6, 7, 14, - 17, 22, 18, 18, 26, 14, 17, 6, 14, 6, 12, 24, 24, 6, 26, 15, - 6, 21, 11, 21, 24, 9, 6, 9, 23, 26, 6, 10, 4, 4, 3, 3, - 7, 25, 17, 16, 16, 22, 16, 16, 25, 17, 25, 2, 25, 24, 2, 15, - 12, 15, 14, 2, 21, 14, 7, 15, 12, 17, 21, 1, 26, 10, 10, 1, - 23, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 10, 11, 12, - 13, 0, 14, 0, 0, 0, 0, 0, 15, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 171,171,171,171,171,171,171, 44,171,171,171,171,171,171,171, 0, + 0, 0, 29, 21, 21, 21, 23, 21, 22, 18, 21, 25, 21, 17, 13, 13, + 25, 25, 25, 21, 21, 9, 9, 9, 9, 22, 21, 18, 24, 16, 24, 5, + 5, 5, 5, 22, 25, 18, 25, 0, 23, 23, 26, 21, 24, 26, 7, 20, + 25, 1, 26, 24, 26, 25, 15, 15, 24, 15, 7, 19, 15, 21, 9, 25, + 9, 5, 5, 25, 5, 9, 5, 7, 7, 7, 9, 8, 8, 5, 7, 5, + 6, 6, 24, 24, 6, 24, 12, 12, 2, 2, 6, 5, 9, 21, 9, 2, + 2, 9, 25, 9, 26, 12, 11, 11, 2, 6, 5, 21, 17, 2, 2, 26, + 26, 23, 2, 12, 17, 12, 21, 12, 12, 21, 7, 2, 2, 7, 7, 21, + 21, 2, 1, 1, 21, 23, 26, 26, 1, 21, 6, 7, 7, 12, 12, 7, + 21, 7, 12, 1, 12, 6, 6, 12, 12, 26, 7, 26, 26, 7, 2, 1, + 12, 2, 6, 2, 24, 7, 7, 6, 1, 12, 12, 10, 10, 10, 10, 12, + 21, 6, 2, 10, 10, 2, 15, 26, 26, 2, 2, 21, 7, 10, 15, 7, + 2, 23, 21, 26, 10, 7, 21, 15, 15, 2, 17, 7, 29, 7, 7, 22, + 18, 2, 14, 14, 14, 7, 10, 21, 17, 21, 11, 12, 5, 2, 5, 6, + 8, 8, 8, 24, 5, 24, 2, 24, 9, 24, 24, 2, 29, 29, 29, 1, + 17, 17, 20, 19, 22, 20, 27, 28, 1, 29, 21, 20, 19, 21, 21, 16, + 16, 21, 25, 22, 18, 21, 21, 29, 1, 2, 15, 6, 18, 6, 23, 2, + 12, 11, 9, 26, 26, 9, 26, 5, 5, 26, 14, 9, 5, 14, 14, 15, + 25, 26, 26, 22, 18, 26, 18, 25, 18, 22, 5, 12, 2, 5, 22, 21, + 21, 22, 18, 17, 26, 6, 7, 14, 17, 22, 18, 18, 26, 14, 17, 6, + 14, 6, 12, 24, 24, 6, 26, 15, 6, 21, 11, 21, 24, 9, 6, 9, + 23, 26, 6, 10, 4, 4, 3, 3, 7, 25, 17, 16, 16, 22, 16, 16, + 25, 17, 25, 2, 25, 24, 2, 15, 12, 15, 14, 2, 21, 14, 7, 15, + 12, 17, 21, 1, 26, 10, 10, 1, 23, 15, 0, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 0, 10, 11, 12, 13, 0, 14, 0, 0, 0, 0, 0, + 15, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, - 0, 21, 22, 23, 0, 0, 0, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 34, 0, 35, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 20, 0, 21, 22, 23, 0, 0, 0, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, + 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, - 0, 0, 39, 40, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 3, 0, 0, 0, 4, 5, - 6, 7, 0, 8, 9, 10, 0, 11, 12, 13, 14, 15, 16, 17, 16, 18, - 16, 19, 16, 19, 16, 19, 0, 19, 16, 20, 16, 19, 21, 19, 0, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 0, 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 34, 0, 0, 35, - 0, 0, 36, 0, 37, 0, 0, 0, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 0, 0, 47, 0, 0, 0, 48, 0, 0, 0, 49, 0, 0, 0, 0, - 0, 0, 0, 50, 0, 51, 0, 52, 53, 0, 54, 0, 0, 0, 0, 0, - 0, 55, 56, 57, 0, 0, 0, 0, 58, 0, 0, 59, 60, 61, 62, 63, - 0, 0, 64, 65, 0, 0, 0, 66, 0, 0, 0, 0, 67, 0, 0, 0, - 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, - 0, 0, 0, 70, 0, 71, 0, 0, 72, 0, 0, 73, 0, 0, 0, 0, - 0, 0, 0, 0, 74, 0, 0, 0, 0, 0, 75, 0, 0, 76, 77, 0, - 0, 78, 79, 0, 80, 62, 0, 81, 82, 0, 0, 83, 84, 85, 0, 0, - 0, 86, 0, 87, 0, 0, 51, 88, 51, 0, 89, 0, 90, 0, 0, 0, - 79, 0, 0, 0, 91, 92, 0, 93, 94, 95, 96, 0, 0, 0, 0, 0, - 51, 0, 0, 0, 0, 97, 98, 0, 0, 0, 0, 99,100, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0,101, 0, 0,102, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0,103,104, 0, 0,105, 0, 0, 0, 0, 0, 0, - 106, 0, 0, 0,100, 0, 0, 0, 0, 0,107,108, 0, 0, 0, 0, - 0, 0, 0,109, 0,110, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, - 5, 6, 7, 0, 8, 0, 0, 0, 0, 9, 10, 11, 12, 0, 0, 0, - 0, 13, 0, 0, 14, 15, 0, 16, 0, 17, 18, 0, 0, 19, 0, 20, - 21, 0, 0, 0, 0, 0, 22, 23, 0, 24, 25, 0, 0, 26, 0, 0, - 0, 27, 0, 0, 28, 29, 30, 31, 0, 0, 0, 32, 33, 34, 0, 0, - 33, 0, 0, 35, 33, 0, 0, 0, 33, 36, 0, 0, 0, 0, 0, 37, - 38, 0, 0, 0, 0, 0, 0, 39, 40, 0, 0, 0, 0, 0, 0, 41, - 42, 0, 0, 0, 0, 43, 0, 44, 0, 0, 0, 45, 46, 0, 0, 0, - 47, 0, 0, 0, 0, 0, 0, 48, 49, 0, 0, 0, 0, 50, 0, 0, - 0, 51, 0, 52, 0, 53, 0, 0, 0, 0, 54, 0, 0, 0, 0, 55, - 0, 56, 0, 0, 0, 0, 57, 58, 0, 0, 0, 59, 60, 0, 0, 0, - 0, 0, 0, 61, 52, 0, 62, 63, 0, 0, 64, 0, 0, 0, 65, 66, - 0, 0, 0, 67, 0, 68, 69, 70, 71, 72, 1, 73, 0, 74, 75, 76, - 0, 0, 77, 78, 0, 0, 0, 79, 0, 0, 1, 1, 0, 0, 80, 0, - 0, 81, 0, 0, 0, 0, 77, 82, 0, 83, 0, 0, 0, 0, 0, 78, - 84, 0, 85, 0, 52, 0, 1, 78, 0, 0, 86, 0, 0, 87, 0, 0, - 0, 0, 0, 88, 57, 0, 0, 0, 0, 0, 0, 89, 90, 0, 0, 84, - 0, 0, 33, 0, 0, 91, 0, 0, 0, 0, 92, 0, 0, 0, 0, 49, - 0, 0, 93, 0, 0, 0, 0, 94, 95, 0, 0, 96, 0, 0, 97, 0, - 0, 0, 98, 0, 0, 0, 99, 0,100, 93, 0, 0,101, 0, 0, 0, - 84, 0, 0,102, 0, 0, 0,103,104, 0, 0,105,106, 0, 0, 0, - 0, 0, 0,107, 0, 0,108, 0, 0, 0, 0,109, 33, 0,110,111, - 112, 35, 0, 0,113, 0, 0, 0,114, 0, 0, 0, 0, 0, 0,115, - 0, 0,116, 0, 0, 0, 0,117, 88, 0, 0, 0, 0, 0, 57, 0, - 0, 0, 0, 52,118, 0, 0, 0, 0,119, 0, 0,120, 0, 0, 0, - 0,118, 0, 0, 0, 0, 0,121, 0, 0, 0,122, 0, 0, 0,123, - 0,124, 0, 0, 0, 0,125,126,127, 0,128, 0,129, 0, 0, 0, - 130,131,132, 0, 0, 0, 35, 0, 0, 0,133, 0, 0,134, 0, 0, - 135, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 3, 4, - 5, 6, 7, 4, 4, 8, 9, 10, 1, 11, 12, 13, 14, 15, 16, 17, - 18, 1, 1, 1, 19, 1, 0, 0, 20, 21, 22, 1, 23, 4, 21, 24, - 25, 26, 27, 28, 29, 30, 0, 0, 1, 1, 31, 0, 0, 0, 32, 33, - 34, 35, 1, 36, 37, 0, 0, 0, 0, 38, 1, 39, 14, 39, 40, 41, - 42, 0, 0, 0, 43, 36, 44, 45, 21, 45, 46, 0, 0, 0, 19, 1, - 21, 0, 0, 47, 0, 38, 48, 1, 1, 49, 49, 50, 0, 0, 51, 0, - 0, 0, 52, 1, 0, 0, 38, 14, 4, 1, 1, 1, 53, 21, 43, 52, - 54, 21, 35, 1, 0, 0, 0, 55, 0, 0, 0, 56, 57, 58, 0, 0, - 0, 0, 0, 59, 0, 60, 0, 0, 0, 0, 61, 62, 0, 0, 63, 0, - 0, 0, 64, 0, 0, 0, 65, 0, 0, 0, 66, 0, 0, 0, 67, 0, - 0, 0, 68, 0, 0, 69, 70, 0, 71, 72, 73, 74, 75, 76, 0, 0, - 0, 77, 0, 0, 0, 78, 79, 0, 0, 0, 0, 47, 0, 0, 0, 49, - 0, 80, 0, 0, 0, 62, 0, 0, 63, 0, 0, 81, 0, 0, 82, 0, - 0, 0, 83, 0, 0, 19, 84, 0, 62, 0, 0, 0, 0, 49, 1, 85, - 1, 52, 15, 86, 36, 10, 21, 87, 0, 55, 0, 0, 0, 0, 19, 10, - 1, 0, 0, 0, 0, 0, 88, 0, 0, 89, 0, 0, 88, 0, 0, 0, - 0, 78, 0, 0, 87, 9, 12, 4, 90, 8, 91, 47, 0, 58, 50, 0, - 21, 1, 21, 92, 93, 1, 1, 1, 1, 94, 95, 96, 97, 1, 98, 58, - 81, 99,100, 4, 58, 0, 0, 0, 0, 0, 0, 19, 50, 0, 0, 0, - 0, 0, 0, 61, 0, 0,101,102, 0, 0,103, 0, 0, 1, 1, 50, - 0, 0, 0, 38, 0, 63, 0, 0, 0, 0, 0, 62, 0, 0,104, 68, - 61, 0, 0, 0, 78, 0, 0, 0,105,106, 58, 38, 81, 0, 0, 0, - 0, 0, 0,107, 1, 14, 4, 12, 84, 0, 0, 0, 0, 38, 87, 0, - 0, 0, 0,108, 0, 0,109, 61, 0,110, 0, 0, 0, 1, 0, 0, - 0, 0, 19, 58, 0,111, 14, 52,112, 41, 0, 0, 62, 0, 0, 61, - 0, 0,113, 0, 87, 0, 0, 0, 61, 62, 0, 0, 62, 0, 89, 0, - 0,113, 0, 0, 0, 0,114, 0, 0, 0, 78, 55, 0, 38, 1, 58, - 1, 58, 0, 0, 63, 89, 0, 0,115, 0, 0, 0, 55, 0, 0, 0, - 0,115, 0, 0, 0, 0, 61, 0, 0, 0, 0, 79, 0, 61, 0, 0, - 0, 0, 56, 0, 89, 80, 0, 0, 8, 91, 0, 0, 1, 87, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 38, 39, 0, 0, 0, 0, 0, 0, 40, 41, 42, 0, 43, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, + 0, 0, 3, 0, 0, 0, 4, 5, 6, 7, 0, 8, 9, 10, 0, 11, + 12, 13, 14, 15, 16, 17, 16, 18, 16, 19, 16, 19, 16, 19, 0, 19, + 16, 20, 16, 19, 21, 19, 0, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, + 0, 0, 0, 0, 34, 0, 0, 35, 0, 0, 36, 0, 37, 0, 0, 0, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 0, 0, 47, 0, 0, 0, 48, + 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 50, 0, 51, 0, 52, + 53, 0, 54, 0, 0, 0, 0, 0, 0, 55, 56, 57, 0, 0, 0, 0, + 58, 0, 0, 59, 60, 61, 62, 63, 0, 0, 64, 65, 0, 0, 0, 66, + 0, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 0, + 72, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, + 0, 0, 75, 76, 0, 77, 78, 0, 0, 79, 80, 0, 81, 62, 0, 82, + 83, 0, 0, 84, 85, 86, 0, 0, 0, 87, 0, 88, 0, 0, 51, 89, + 51, 0, 90, 0, 91, 0, 0, 0, 80, 0, 0, 0, 92, 93, 0, 94, + 95, 96, 97, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 98, 99, 0, + 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0,101,102, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,103, 0, 0,104, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,105,106, 0, 0,107, 0, 0, 0, 0, 0, 0, + 108, 0,109, 0,102, 0, 0, 0, 0, 0,110,111, 0, 0, 0, 0, + 0, 0, 0,112, 0, 0, 0, 0, 0, 0, 0,113, 0,114, 0, 0, + 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 0, 8, 0, 0, 0, + 0, 9, 10, 11, 12, 0, 0, 0, 0, 13, 0, 0, 14, 15, 0, 16, + 0, 17, 18, 0, 0, 19, 0, 20, 21, 0, 0, 0, 0, 0, 22, 23, + 0, 24, 25, 0, 0, 26, 0, 0, 0, 27, 0, 0, 28, 29, 30, 31, + 0, 0, 0, 32, 33, 34, 0, 0, 33, 0, 0, 35, 33, 0, 0, 0, + 33, 36, 0, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 39, + 40, 0, 0, 0, 0, 0, 0, 41, 42, 0, 0, 0, 0, 43, 0, 44, + 0, 0, 0, 45, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 48, + 49, 0, 0, 0, 0, 50, 0, 0, 0, 51, 0, 52, 0, 53, 0, 0, + 0, 0, 54, 0, 0, 0, 0, 55, 0, 56, 0, 0, 0, 0, 57, 58, + 0, 0, 0, 59, 60, 0, 0, 0, 0, 0, 0, 61, 52, 0, 62, 63, + 0, 0, 64, 0, 0, 0, 65, 66, 0, 0, 0, 67, 0, 68, 69, 70, + 71, 72, 1, 73, 0, 74, 75, 76, 0, 0, 77, 78, 0, 0, 0, 79, + 0, 0, 1, 1, 0, 0, 80, 0, 0, 81, 0, 0, 0, 0, 77, 82, + 0, 83, 0, 0, 0, 0, 0, 78, 84, 0, 85, 0, 52, 0, 1, 78, + 0, 0, 86, 0, 0, 87, 0, 0, 0, 0, 0, 88, 57, 0, 0, 0, + 0, 0, 0, 89, 90, 0, 0, 84, 0, 0, 33, 0, 0, 91, 0, 0, + 0, 0, 92, 0, 0, 0, 0, 49, 0, 0, 93, 0, 0, 0, 0, 94, + 95, 0, 0, 96, 0, 0, 97, 0, 0, 0, 98, 0, 0, 0, 99, 0, + 0, 0, 0,100,101, 93, 0, 0,102, 0, 0, 0, 84, 0, 0,103, + 0, 0, 0,104,105, 0, 0,106,107, 0, 0, 0, 0, 0, 0,108, + 0, 0,109, 0, 0, 0, 0,110, 33, 0,111,112,113, 35, 0, 0, + 114, 0, 0, 0,115, 0, 0, 0, 0, 0, 0,116, 0, 0,117, 0, + 0, 0, 0,118, 88, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 52, + 119, 0, 0, 0, 0,120, 0, 0,121, 0, 0, 0, 0,119, 0, 0, + 122, 0, 0, 0, 0, 0, 0,123, 0, 0, 0,124, 0, 0, 0,125, + 0,126, 0, 0, 0, 0,127,128,129, 0,130, 0,131, 0, 0, 0, + 132,133,134, 0, 77, 0, 0, 0, 0, 0, 35, 0, 0, 0,135, 0, + 0, 0,136, 0, 0,137, 0, 0,138, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 4, 4, 8, 9, 10, + 1, 11, 12, 13, 14, 15, 16, 17, 18, 1, 1, 1, 19, 1, 0, 0, + 20, 21, 22, 1, 23, 4, 21, 24, 25, 26, 27, 28, 29, 30, 0, 0, + 1, 1, 31, 0, 0, 0, 32, 33, 34, 35, 1, 36, 37, 0, 0, 0, + 0, 38, 1, 39, 14, 39, 40, 41, 42, 0, 0, 0, 43, 36, 44, 45, + 21, 45, 46, 0, 0, 0, 19, 1, 21, 0, 0, 47, 0, 38, 48, 1, + 1, 49, 49, 50, 0, 0, 51, 0, 0, 0, 52, 1, 0, 0, 38, 14, + 4, 1, 1, 1, 53, 21, 43, 52, 54, 21, 35, 1, 0, 0, 0, 55, + 0, 0, 0, 56, 57, 58, 0, 0, 0, 0, 0, 59, 0, 60, 0, 0, + 0, 0, 61, 62, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 65, 0, + 0, 0, 66, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 69, 70, 0, + 71, 72, 73, 74, 75, 76, 0, 0, 0, 77, 0, 0, 0, 78, 79, 0, + 0, 0, 0, 47, 0, 0, 0, 49, 0, 80, 0, 0, 0, 62, 0, 0, + 63, 0, 0, 81, 0, 0, 82, 0, 0, 0, 83, 0, 0, 19, 84, 0, + 62, 0, 0, 0, 0, 49, 1, 85, 1, 52, 15, 86, 36, 10, 21, 87, + 0, 55, 0, 0, 0, 0, 19, 10, 1, 0, 0, 0, 0, 0, 88, 0, + 0, 89, 0, 0, 88, 0, 0, 0, 0, 78, 0, 0, 87, 9, 12, 4, + 90, 8, 91, 47, 0, 58, 50, 0, 21, 1, 21, 92, 93, 1, 1, 1, + 1, 94, 95, 96, 97, 1, 98, 58, 81, 99,100, 4, 58, 0, 0, 0, + 0, 0, 0, 19, 50, 0, 0, 0, 0, 0, 0, 61, 0, 0,101,102, + 0, 0,103, 0, 0, 1, 1, 50, 0, 0, 0, 38, 0, 63, 0, 0, + 0, 0, 0, 62, 0, 0,104, 68, 61, 0, 0, 0, 78, 0, 0, 0, + 105,106, 58, 38, 81, 0, 0, 0, 0, 0, 0,107, 1, 14, 4, 12, + 84, 0, 0, 0, 0, 38, 87, 0, 0, 0, 0,108, 0, 0,109, 61, + 0,110, 0, 0, 0, 1, 0, 0, 0, 0, 19, 58, 0, 0, 0, 51, + 0,111, 14, 52,112, 41, 0, 0, 62, 0, 0, 61, 0, 0,113, 0, + 87, 0, 0, 0, 61, 62, 0, 0, 62, 0, 89, 0, 0,113, 0, 0, + 0, 0,114, 0, 0, 0, 78, 55, 0, 38, 1, 58, 1, 58, 0, 0, + 63, 89, 0, 0,115, 0, 0, 0, 55, 0, 0, 0, 0,115, 0, 0, + 0, 0, 61, 0, 0, 0, 0, 79, 0, 61, 0, 0, 0, 0, 56, 0, + 89, 80, 0, 0, 79, 0, 0, 0, 8, 91, 0, 0, 1, 87, 0, 0, 116, 0, 0, 0, 0, 0, 0,117, 0,118,119,120,121, 0,104, 4, 122, 49, 23, 0, 0, 0, 38, 50, 38, 58, 0, 0, 1, 87, 1, 1, - 1, 1, 39, 1, 48,105, 87, 0, 0, 0, 0, 1, 4,122, 0, 0, - 0, 1,123, 0, 0, 0, 0, 0,230,230,230,230,230,232,220,220, - 220,220,232,216,220,220,220,220,220,202,202,220,220,220,220,202, - 202,220,220,220, 1, 1, 1, 1, 1,220,220,220,220,230,230,230, - 230,240,230,220,220,220,230,230,230,220,220, 0,230,230,230,220, - 220,220,220,230,232,220,220,230,233,234,234,233,234,234,233,230, - 0, 0, 0,230, 0,220,230,230,230,230,220,230,230,230,222,220, - 230,230,220,220,230,222,228,230, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 19, 20, 21, 22, 0, 23, 0, 24, 25, 0,230,220, 0, 18, - 30, 31, 32, 0, 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34,230, - 230,220,220,230,220,230,230,220, 35, 0, 0, 0, 0, 0,230,230, - 230, 0, 0,230,230, 0,220,230,230,220, 0, 0, 0, 36, 0, 0, - 230,220,230,230,220,220,230,220,220,230,220,230,220,230,230, 0, - 0,220, 0, 0,230,230, 0,230, 0,230,230,230,230,230, 0, 0, - 0,220,220,220,230,220,220,220,230,230, 0,220, 27, 28, 29,230, - 7, 0, 0, 0, 0, 9, 0, 0, 0,230,220,230,230, 0, 0, 0, - 0, 0,230, 0, 0, 84, 91, 0, 0, 0, 0, 9, 9, 0, 0, 0, - 0, 0, 9, 0,103,103, 9, 0,107,107,107,107,118,118, 9, 0, - 122,122,122,122,220,220, 0, 0, 0,220, 0,220, 0,216, 0, 0, - 0,129,130, 0,132, 0, 0, 0, 0, 0,130,130,130,130, 0, 0, - 130, 0,230,230, 9, 0,230,230, 0, 0,220, 0, 0, 0, 0, 7, - 0, 9, 9, 0, 9, 9, 0, 0, 0,230, 0, 0, 0,228, 0, 0, - 0,222,230,220,220, 0, 0, 0,230, 0, 0,220,230,220, 0,220, - 230,230,230, 0, 0, 0, 9, 9, 0, 0, 7, 0,230, 0, 1, 1, - 1, 0, 0, 0,230,234,214,220,202,230,230,230,230,230,232,228, - 228,220,218,230,233,220,230,220,230,230, 1, 1, 1, 1, 1,230, - 0, 1, 1,230,220,230, 1, 1, 0, 0,218,228,232,222,224,224, - 0, 8, 8, 0, 0, 0, 0,220,230, 0,230,230,220, 0, 0,230, - 0, 0, 26, 0, 0,220, 0,230,230, 1,220, 0, 0,230,220, 0, - 0, 0,220,220, 0, 0,230,220, 0, 9, 7, 0, 0, 7, 9, 0, - 0, 0, 9, 7, 6, 6, 0, 0, 0, 0, 1, 0, 0,216,216, 1, - 1, 1, 0, 0, 0,226,216,216,216,216,216, 0,220,220,220, 0, - 230,230, 7, 0, 16, 17, 17, 17, 17, 17, 17, 33, 17, 17, 17, 19, - 17, 17, 17, 17, 20,101, 17,113,129,169, 17, 27, 28, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 1, 1, 39, 1, 48,105, 87, 0, 0, 0, 0, 1, 0, 0, 0,123, + 4,122, 0, 0, 0, 1,124, 0, 0, 0, 0, 0,230,230,230,230, + 230,232,220,220,220,220,232,216,220,220,220,220,220,202,202,220, + 220,220,220,202,202,220,220,220, 1, 1, 1, 1, 1,220,220,220, + 220,230,230,230,230,240,230,220,220,220,230,230,230,220,220, 0, + 230,230,230,220,220,220,220,230,232,220,220,230,233,234,234,233, + 234,234,233,230, 0, 0, 0,230, 0,220,230,230,230,230,220,230, + 230,230,222,220,230,230,220,220,230,222,228,230, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 0, 23, 0, 24, 25, 0, + 230,220, 0, 18, 30, 31, 32, 0, 0, 0, 0, 27, 28, 29, 30, 31, + 32, 33, 34,230,230,220,220,230,220,230,230,220, 35, 0, 0, 0, + 0, 0,230,230,230, 0, 0,230,230, 0,220,230,230,220, 0, 0, + 0, 36, 0, 0,230,220,230,230,220,220,230,220,220,230,220,230, + 220,230,230, 0, 0,220, 0, 0,230,230, 0,230, 0,230,230,230, + 230,230, 0, 0, 0,220,220,220,230,220,220,220,230,230, 0,220, + 27, 28, 29,230, 7, 0, 0, 0, 0, 9, 0, 0, 0,230,220,230, + 230, 0, 0, 0, 0, 0,230, 0, 0, 84, 91, 0, 0, 0, 0, 9, + 9, 0, 0, 0, 0, 0, 9, 0,103,103, 9, 0,107,107,107,107, + 118,118, 9, 0,122,122,122,122,220,220, 0, 0, 0,220, 0,220, + 0,216, 0, 0, 0,129,130, 0,132, 0, 0, 0, 0, 0,130,130, + 130,130, 0, 0,130, 0,230,230, 9, 0,230,230, 0, 0,220, 0, + 0, 0, 0, 7, 0, 9, 9, 0, 9, 9, 0, 0, 0,230, 0, 0, + 0,228, 0, 0, 0,222,230,220,220, 0, 0, 0,230, 0, 0,220, + 230,220, 0,220,230,230,230, 0, 0, 0, 9, 9, 0, 0, 7, 0, + 230, 0, 1, 1, 1, 0, 0, 0,230,234,214,220,202,230,230,230, + 230,230,232,228,228,220,218,230,233,220,230,220,230,230, 1, 1, + 1, 1, 1,230, 0, 1, 1,230,220,230, 1, 1, 0, 0,218,228, + 232,222,224,224, 0, 8, 8, 0, 0, 0, 0,220,230, 0,230,230, + 220, 0, 0,230, 0, 0, 26, 0, 0,220, 0,230,230, 1,220, 0, + 0,230,220, 0, 0, 0,220,220, 0, 0,230,220, 0, 9, 7, 0, + 0, 7, 9, 0, 0, 0, 9, 7, 6, 6, 0, 0, 0, 0, 1, 0, + 0,216,216, 1, 1, 1, 0, 0, 0,226,216,216,216,216,216, 0, + 220,220,220, 0,232,232,220,230,230,230, 7, 0, 16, 17, 17, 17, + 17, 17, 17, 33, 17, 17, 17, 19, 17, 17, 17, 17, 20,101, 17,113, + 129,169, 17, 27, 28, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17,237, 0, 1, 2, 2, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 0, 6, 7, 8, 9, 0, 0, 0, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, - 0, 0, 21, 22, 0, 0, 0, 0, 23, 24, 25, 26, 0, 27, 0, 28, - 29, 30, 31, 32, 0, 0, 0, 0, 0, 0, 0, 33, 34, 35, 36, 0, - 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 39, - 0, 0, 0, 0, 1, 2, 40, 41, 0, 1, 2, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, - 0, 0, 3, 4, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 0, 0, - 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 8, 9, 0, 0, 0, 0, - 0, 0, 10, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 11, 12, - 0, 13, 0, 14, 15, 16, 0, 0, 0, 0, 0, 1, 17, 18, 0, 19, - 7, 1, 0, 0, 0, 20, 20, 7, 20, 20, 20, 20, 20, 20, 20, 8, - 21, 0, 22, 0, 7, 23, 24, 0, 20, 20, 25, 0, 0, 0, 26, 27, - 1, 7, 20, 20, 20, 20, 20, 1, 28, 29, 30, 31, 0, 0, 20, 0, - 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 20, 20, - 20, 1, 0, 0, 8, 21, 32, 4, 0, 10, 0, 33, 7, 20, 20, 20, - 0, 0, 0, 0, 8, 34, 34, 35, 36, 34, 37, 0, 38, 1, 20, 20, - 0, 0, 39, 0, 1, 1, 0, 8, 21, 1, 20, 0, 0, 0, 1, 0, - 0, 40, 1, 1, 0, 0, 8, 21, 0, 1, 0, 1, 0, 1, 0, 0, - 0, 0, 26, 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, 7, 20, 41, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, 0, 42, 43, 44, 0, 45, - 0, 8, 21, 0, 0, 0, 0, 0, 0, 0, 0, 46, 7, 1, 10, 1, - 0, 0, 0, 1, 20, 20, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 26, 34, 9, 0, 0, 20, 20, 1, 20, 20, 0, 0, 0, 0, 0, - 0, 0, 26, 21, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 47, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, - 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 9, 10, 11, 11, 11, 11, 12, 13, 13, 13, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 13, 22, 13, 13, 13, 13, 23, 24, 24, 25, 26, 13, 13, - 13, 27, 28, 29, 13, 30, 31, 32, 33, 34, 35, 36, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 37, 7, 38, 39, 7, 40, 7, 7, 7, 41, 13, 42, 7, 7, 43, 13, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,237, 0, 1, 2, 2, + 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 6, 7, 8, + 9, 0, 0, 0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 21, 22, 0, 0, 0, 0, + 23, 24, 25, 26, 0, 27, 0, 28, 29, 30, 31, 32, 0, 0, 0, 0, + 0, 0, 0, 33, 34, 35, 36, 0, 0, 0, 0, 0, 37, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 38, 39, 0, 0, 0, 0, 1, 2, 40, 41, + 0, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 5, 0, + 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, + 0, 0, 8, 9, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 10, + 0, 0, 0, 0, 0, 0, 11, 12, 0, 13, 0, 14, 15, 16, 0, 0, + 0, 0, 0, 1, 17, 18, 0, 19, 7, 1, 0, 0, 0, 20, 20, 7, + 20, 20, 20, 20, 20, 20, 20, 8, 21, 0, 22, 0, 7, 23, 24, 0, + 20, 20, 25, 0, 0, 0, 26, 27, 1, 7, 20, 20, 20, 20, 20, 1, + 28, 29, 30, 31, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 20, 20, 20, 1, 0, 0, 8, 21, 32, 4, + 0, 10, 0, 33, 7, 20, 20, 20, 0, 0, 0, 0, 8, 34, 34, 35, + 36, 34, 37, 0, 38, 1, 20, 20, 0, 0, 39, 0, 1, 1, 0, 8, + 21, 1, 20, 0, 0, 0, 1, 0, 0, 40, 1, 1, 0, 0, 8, 21, + 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 26, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 21, 7, 20, 41, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 21, 0, 42, 43, 44, 0, 45, 0, 8, 21, 0, 0, 0, 0, 0, + 0, 0, 0, 46, 7, 1, 10, 1, 0, 0, 0, 1, 20, 20, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 34, 9, 0, 0, 20, 20, + 1, 20, 20, 0, 0, 0, 0, 0, 0, 0, 26, 21, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 47, 48, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 11, 11, 11, 12, 13, + 13, 13, 13, 14, 15, 16, 17, 18, 19, 20, 21, 13, 22, 13, 13, 13, + 13, 23, 24, 24, 25, 26, 13, 13, 13, 27, 28, 29, 13, 30, 31, 32, + 33, 34, 35, 36, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 37, 7, 38, 39, 7, 40, 7, 7, + 7, 41, 13, 42, 7, 7, 43, 7, 44, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, @@ -3459,130 +3501,131 @@ _hb_ucd_u8[17564] = 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 44, 0, 0, 1, - 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 32, 33, 34, 35, 36, 37, 37, 37, 37, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 2, 2, 53, 54, 55, 56, - 57, 58, 59, 59, 59, 59, 60, 59, 59, 59, 59, 59, 59, 59, 61, 61, - 59, 59, 59, 59, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 59, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 13, 13, 13, 13, 45, 0, 0, 1, 2, 2, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 37, 37, + 37, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 2, 2, 53, 54, 55, 56, 57, 58, 59, 59, 59, 59, 60, 59, + 59, 59, 59, 59, 59, 59, 61, 61, 59, 59, 59, 59, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 59, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 79, 70, 70, 70, 70, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 81, 82, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 79, 70, 70, 70, 70, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81, + 82, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 95, 96, 96, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 95, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, 97, 98, 99,100,101,101, + 102,103,104,105,106,107,108,109,110,111, 96,112,113,114,115,116, + 117,118,119,119,120,121,122,123,124,125,126,127,128,129,130,131, + 132, 96,133,134,135,136,137,138,139,140,141,142,143, 96,144,145, + 96,146,147,148,149, 96,150,151,152,153,154,155,156, 96,157,158, + 159,160, 96,161,162,163,164,164,164,164,164,164,164,165,166,164, + 167, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96,168,169,169,169,169,169,169,169,169,170, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,171,171, + 171,171,172, 96, 96, 96,173,173,173,173,174,175,176,177, 96, 96, + 96, 96,178,179,180,181,182,182,182,182,182,182,182,182,182,182, + 182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182, + 182,182,182,182,182,183,182,182,182,182,182,182,184,184,184,185, + 186, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96,187,188,189,190,191,191,192, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,193,194, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 70, 70, 97, 98, 99,100,101,101,102,103,104,105,106,107,108,109, - 110,111, 96,112,113,114,115,116,117,118,119,119,120,121,122,123, - 124,125,126,127,128,129,130,131,132, 96,133,134,135,136,137,138, - 139,140,141,142,143, 96,144,145, 96,146,147,148,149, 96,150,151, - 152,153,154,155, 96, 96,156,157,158,159, 96,160, 96,161,162,162, - 162,162,162,162,162,163,164,162,165, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,166,167,167, - 167,167,167,167,167,167,168, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96,169,169,169,169,170, 96, 96, 96,171,171, - 171,171,172,173,174,175, 96, 96, 96, 96,176,177,178,179,180,180, - 180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180, - 180,180,180,180,180,180,180,180,180,180,180,180,180,181,180,180, - 180,180,180,180,182,182,182,183,184, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,185,186,187, - 188,189,189,190, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96,191,192, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,193,194, 59,195, - 196,197,198,199,200, 96,201,202,203, 59, 59,204, 59,205,206,206, - 206,206,206,207, 96, 96, 96, 96, 96, 96, 96, 96,208, 96,209, 96, - 210, 96, 96,211, 96, 96, 96, 96, 96, 96, 96, 96, 96,212,213,214, - 215, 96, 96, 96, 96, 96,216,217,218, 96,219,220, 96, 96,221,222, - 59,223,224, 96, 59, 59, 59, 59, 59, 59, 59,225,226,227,228,229, - 59, 59,230,231, 59,232, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,233, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,234, 70,235, 70, + 96, 96, 96, 96,195,196, 59,197,198,199,200,201,202, 96,203,204, + 205, 59, 59,206, 59,207,208,208,208,208,208,209, 96, 96, 96, 96, + 96, 96, 96, 96,210, 96,211,212,213, 96, 96,214, 96, 96, 96,215, + 96, 96, 96, 96, 96,216,217,218,219, 96, 96, 96, 96, 96,220,221, + 222, 96,223,224, 96, 96,225,226, 59,227,228, 96, 59, 59, 59, 59, + 59, 59, 59,229,230,231,232,233, 59, 59,234,235, 59,236, 96, 96, + 96, 96, 96, 96, 96, 96, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70,237, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70,238, 70,239, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,236, 70, 70, 70, 70, - 70, 70, 70, 70, 70,237, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, - 70, 70,238, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, - 70, 70, 70, 70,239, 96, 96, 96, 96, 96, 96, 96, 96, 96,240, 96, - 241,242, 0, 1, 2, 2, 0, 1, 2, 2, 2, 3, 4, 5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, 0, 0, 0, 0, - 19, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 0, 19, 0, - 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 0, 0, 0, 0, 0, - 26, 26, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, - 9, 9, 0, 9, 9, 9, 2, 2, 9, 9, 9, 9, 0, 9, 2, 2, - 2, 2, 9, 0, 9, 0, 9, 9, 9, 2, 9, 2, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 2, 9, 9, 9, 9, 9, 9, 9, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 1, 6, 2, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 2, 4, 4, 4, 2, 2, 4, 4, 4, 2, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 2, 2, - 2, 2, 2, 2, 2, 2, 14, 14, 14, 2, 2, 2, 2, 14, 14, 14, - 14, 14, 14, 2, 2, 2, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, - 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 0, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 3, - 3, 3, 3, 3, 3, 3, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 2, 37, 37, 37, 37, 2, 2, 37, 37, 37, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 2, 2, 2, 2, 2, 2, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 2, 2, 64, 64, 64, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 2, 2, 90, 90, - 90, 90, 90, 90, 90, 2, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 2, 2, 95, 2, 37, 37, 37, 2, 2, 2, 2, 2, 3, 3, - 3, 3, 3, 3, 3, 2, 3, 3, 2, 2, 2, 2, 2, 2, 3, 3, - 0, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, - 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 5, 5, - 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5, 5, 2, - 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, - 5, 5, 5, 5, 5, 5, 5, 2, 5, 2, 2, 2, 5, 5, 5, 5, - 2, 2, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 2, 2, 2, - 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 5, 5, 2, 5, 5, 5, - 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 11, - 11, 11, 2, 11, 11, 11, 11, 11, 11, 2, 2, 2, 2, 11, 11, 2, - 2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 2, - 11, 11, 11, 11, 11, 11, 11, 2, 11, 11, 2, 11, 11, 2, 11, 11, - 2, 2, 11, 2, 11, 11, 11, 2, 2, 11, 11, 11, 2, 2, 2, 11, - 2, 2, 2, 2, 2, 2, 2, 11, 11, 11, 11, 2, 11, 2, 2, 2, - 2, 2, 2, 2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 2, 2, 10, - 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, - 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, - 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 2, 10, 10, 10, 10, 10, - 2, 2, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, 2, 2, 10, 2, - 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 2, 2, 10, 10, 10, 10, - 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 10, 2, 21, - 21, 21, 2, 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, 21, 21, 2, - 2, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, - 21, 21, 21, 21, 21, 21, 21, 2, 21, 21, 2, 21, 21, 21, 21, 21, - 2, 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 21, 2, 2, 2, 2, - 2, 2, 2, 21, 21, 21, 2, 2, 2, 2, 21, 21, 2, 21, 21, 21, - 21, 21, 2, 2, 21, 21, 2, 2, 22, 22, 2, 22, 22, 22, 22, 22, - 22, 2, 2, 2, 22, 22, 22, 2, 22, 22, 22, 22, 2, 2, 2, 22, - 22, 2, 22, 2, 22, 22, 2, 2, 2, 22, 22, 2, 2, 2, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 2, 2, 2, 2, 22, 22, 22, 2, - 2, 2, 2, 2, 2, 22, 2, 2, 2, 2, 2, 2, 22, 22, 22, 22, - 22, 2, 2, 2, 2, 2, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 2, 23, 23, 23, 2, 23, 23, 23, 23, 23, 23, 23, 23, - 2, 2, 23, 23, 23, 23, 23, 2, 23, 23, 23, 23, 2, 2, 2, 2, - 2, 2, 2, 23, 23, 2, 23, 23, 23, 2, 2, 23, 2, 2, 23, 23, - 23, 23, 2, 2, 23, 23, 2, 2, 2, 2, 2, 2, 2, 23, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 16, 2, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, 16, - 2, 2, 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, 2, 2, 2, 2, - 2, 2, 2, 16, 16, 2, 16, 16, 16, 16, 2, 2, 16, 16, 2, 16, - 16, 2, 2, 2, 2, 2, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 2, 20, 20, 20, 2, 20, 20, 20, 20, 20, 20, 2, 2, - 2, 2, 20, 20, 20, 20, 20, 20, 20, 20, 2, 2, 20, 20, 2, 36, - 36, 36, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 2, 2, 2, 36, 36, 36, 36, 36, 36, 36, 36, - 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 36, 2, 2, 2, 2, - 36, 2, 2, 2, 2, 36, 36, 36, 36, 36, 36, 2, 36, 2, 2, 2, - 2, 2, 2, 2, 36, 36, 2, 2, 36, 36, 36, 2, 2, 2, 2, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 2, 2, 2, 2, 0, 24, 24, 24, 24, 2, 2, 2, 2, 2, 18, - 18, 2, 18, 2, 18, 18, 18, 18, 18, 2, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 2, 18, 2, 18, 18, 18, - 18, 18, 18, 18, 2, 2, 18, 18, 18, 18, 18, 2, 18, 2, 18, 18, + 70, 70, 70,240, 70, 70, 70, 70, 70, 70, 70, 70, 70,241, 96, 96, + 96, 96, 96, 96, 96, 96, 70, 70, 70, 70,242, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 70, 70, 70, 70, 70, 70,243, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,244, 96, 96, + 96, 96, 96, 96, 96, 96,245, 96,246,247, 0, 1, 2, 2, 0, 1, + 2, 2, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 19, 19, + 19, 19, 19, 19, 19, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, 19, + 19, 19, 19, 0, 0, 0, 0, 0, 26, 26, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 0, 9, 9, 9, 2, 2, + 9, 9, 9, 9, 0, 9, 2, 2, 2, 2, 9, 0, 9, 0, 9, 9, + 9, 2, 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 2, 9, 9, 9, 9, 9, 9, 9, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 1, 1, 6, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4, + 4, 2, 2, 4, 4, 4, 2, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 2, 2, 2, 2, 2, 2, 2, 2, 14, 14, + 14, 2, 2, 2, 2, 14, 14, 14, 14, 14, 14, 2, 2, 2, 3, 3, + 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 0, 0, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 2, 37, 37, 37, + 37, 2, 2, 37, 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 2, 2, 2, 2, 2, 2, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 2, 2, 64, 64, 64, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 2, 2, 90, 90, 90, 90, 90, 90, 90, 2, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 2, 2, 95, 2, 37, 37, + 37, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, + 2, 2, 2, 2, 2, 2, 3, 3, 0, 3, 3, 3, 3, 3, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, 1, 7, 7, 7, 7, 7, + 7, 7, 0, 0, 7, 7, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, + 5, 5, 5, 2, 2, 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 2, + 5, 2, 2, 2, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 5, 2, + 2, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, + 2, 2, 5, 5, 2, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 2, 2, 11, 11, 11, 2, 11, 11, 11, 11, 11, + 11, 2, 2, 2, 2, 11, 11, 2, 2, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 2, 11, 11, 11, 11, 11, 11, 11, 2, + 11, 11, 2, 11, 11, 2, 11, 11, 2, 2, 11, 2, 11, 11, 11, 2, + 2, 11, 11, 11, 2, 2, 2, 11, 2, 2, 2, 2, 2, 2, 2, 11, + 11, 11, 11, 2, 11, 2, 2, 2, 2, 2, 2, 2, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 2, 2, 10, 10, 10, 2, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 2, 10, 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, 2, + 10, 10, 2, 10, 10, 10, 10, 10, 2, 2, 10, 10, 10, 10, 10, 10, + 2, 10, 10, 10, 2, 2, 10, 2, 2, 2, 2, 2, 2, 2, 10, 10, + 10, 10, 2, 2, 10, 10, 10, 10, 2, 2, 2, 2, 2, 2, 2, 10, + 10, 10, 10, 10, 10, 10, 2, 21, 21, 21, 2, 21, 21, 21, 21, 21, + 21, 21, 21, 2, 2, 21, 21, 2, 2, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 2, 21, 21, 21, 21, 21, 21, 21, 2, + 21, 21, 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 21, 21, 21, 2, + 2, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 21, 21, 21, 2, 2, + 2, 2, 21, 21, 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 2, 2, + 22, 22, 2, 22, 22, 22, 22, 22, 22, 2, 2, 2, 22, 22, 22, 2, + 22, 22, 22, 22, 2, 2, 2, 22, 22, 2, 22, 2, 22, 22, 2, 2, + 2, 22, 22, 2, 2, 2, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 2, 2, 2, 2, 22, 22, 22, 2, 2, 2, 2, 2, 2, 22, 2, 2, + 2, 2, 2, 2, 22, 22, 22, 22, 22, 2, 2, 2, 2, 2, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 2, 23, 23, 23, 2, + 23, 23, 23, 23, 23, 23, 23, 23, 2, 2, 23, 23, 23, 23, 23, 2, + 23, 23, 23, 23, 2, 2, 2, 2, 2, 2, 2, 23, 23, 2, 23, 23, + 23, 2, 2, 23, 2, 2, 23, 23, 23, 23, 2, 2, 23, 23, 2, 2, + 2, 2, 2, 2, 2, 23, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 2, 16, 16, 16, 2, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 2, 16, 16, 16, 16, 16, 2, 2, 16, 16, 16, 16, 16, 2, + 16, 16, 16, 16, 2, 2, 2, 2, 2, 2, 2, 16, 16, 2, 16, 16, + 16, 16, 2, 2, 16, 16, 2, 16, 16, 16, 2, 2, 2, 2, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 2, 20, 20, 20, 2, + 20, 20, 20, 20, 20, 20, 2, 2, 2, 2, 20, 20, 20, 20, 20, 20, + 20, 20, 2, 2, 20, 20, 2, 36, 36, 36, 2, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 2, 2, + 36, 36, 36, 36, 36, 36, 36, 36, 2, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 2, 36, 2, 2, 2, 2, 36, 2, 2, 2, 2, 36, 36, 36, + 36, 36, 36, 2, 36, 2, 2, 2, 2, 2, 2, 2, 36, 36, 2, 2, + 36, 36, 36, 2, 2, 2, 2, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 2, 2, 2, 2, 0, 24, 24, + 24, 24, 2, 2, 2, 2, 2, 18, 18, 2, 18, 2, 18, 18, 18, 18, + 18, 2, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 2, 18, 2, 18, 18, 18, 18, 18, 18, 18, 2, 2, 18, 18, + 18, 18, 18, 2, 18, 2, 18, 18, 18, 18, 18, 18, 18, 2, 18, 18, 2, 2, 18, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 2, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 2, 2, 2, 25, 25, 25, 25, 25, 2, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 25, @@ -3741,49 +3784,50 @@ _hb_ucd_u8[17564] = 130, 2, 2, 2, 2, 2, 2, 2,130,130,130,130,130,130,144,144, 144,144,144,144,144,144,144,144, 2, 2, 2, 2, 2, 2,156,156, 156,156,156,156,156,156,156,156, 2,156,156,156, 2, 2,156,156, - 2, 2, 2, 2, 2, 2,147,147,147,147,147,147,147,147,148,148, - 148,148,148,148,148,148,148,148, 2, 2, 2, 2, 2, 2,158,158, - 158,158,158,158,158,158,158,158, 2, 2, 2, 2, 2, 2,153,153, - 153,153,153,153,153,153,153,153,153,153, 2, 2, 2, 2,149,149, - 149,149,149,149,149,149,149,149,149,149,149,149,149, 2, 94, 94, - 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 2, 2, 2, 2, - 94, 94, 94, 94, 94, 94, 2, 2, 2, 2, 2, 2, 2, 94, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 85, 2, 2,101,101,101,101,101,101,101,101,101, 2, - 2, 2, 2, 2, 2, 2,101,101, 2, 2, 2, 2, 2, 2, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 2, 96, 96,111,111, - 111,111,111,111,111,111,111,111,111,111,111,111,111, 2,100,100, - 100,100,100,100,100,100, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 2, 2, 2,108,108,108,108,108,108,108,108,108,108, - 2,108,108,108,108,108,108,108,108,108,108,108,108, 2,129,129, - 129,129,129,129,129, 2,129, 2,129,129,129,129, 2,129,129,129, - 129,129,129,129,129,129,129,129,129,129,129,129, 2,129,129,129, - 2, 2, 2, 2, 2, 2,109,109,109,109,109,109,109,109,109,109, - 109, 2, 2, 2, 2, 2,109,109, 2, 2, 2, 2, 2, 2,107,107, - 107,107, 2,107,107,107,107,107,107,107,107, 2, 2,107,107, 2, - 2,107,107,107,107,107,107,107,107,107,107,107,107,107,107, 2, - 107,107,107,107,107,107,107, 2,107,107, 2,107,107,107,107,107, - 2, 1,107,107,107,107,107, 2, 2,107,107,107, 2, 2,107, 2, - 2, 2, 2, 2, 2,107, 2, 2, 2, 2, 2,107,107,107,107,107, - 107,107, 2, 2,107,107,107,107,107,107,107, 2, 2, 2,137,137, - 137,137,137,137,137,137,137,137,137,137, 2,137,137,137,137,137, - 2, 2, 2, 2, 2, 2,124,124,124,124,124,124,124,124,124,124, - 2, 2, 2, 2, 2, 2,123,123,123,123,123,123,123,123,123,123, - 123,123,123,123, 2, 2,114,114,114,114,114,114,114,114,114,114, - 114,114,114, 2, 2, 2,114,114, 2, 2, 2, 2, 2, 2, 32, 32, - 32, 32, 32, 2, 2, 2,102,102,102,102,102,102,102,102,102,102, - 2, 2, 2, 2, 2, 2,126,126,126,126,126,126,126,126,126,126, - 126, 2, 2,126,126,126,126,126,126,126, 2, 2, 2, 2,126,126, - 126,126,126,126,126, 2,142,142,142,142,142,142,142,142,142,142, - 142,142, 2, 2, 2, 2,125,125,125,125,125,125,125,125,125,125, - 125, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,125,154,154, - 154,154,154,154,154, 2, 2,154, 2, 2,154,154,154,154,154,154, - 154,154, 2,154,154, 2,154,154,154,154,154,154,154,154,154,154, - 154,154,154,154, 2,154,154, 2, 2,154,154,154,154,154,154,154, - 2, 2, 2, 2, 2, 2,150,150,150,150,150,150,150,150, 2, 2, - 150,150,150,150,150,150,150,150,150,150,150, 2, 2, 2,141,141, - 141,141,141,141,141,141,140,140,140,140,140,140,140,140,140,140, - 140, 2, 2, 2, 2, 2,121,121,121,121,121,121,121,121,121, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3,147,147, + 147,147,147,147,147,147,148,148,148,148,148,148,148,148,148,148, + 2, 2, 2, 2, 2, 2,158,158,158,158,158,158,158,158,158,158, + 2, 2, 2, 2, 2, 2,153,153,153,153,153,153,153,153,153,153, + 153,153, 2, 2, 2, 2,149,149,149,149,149,149,149,149,149,149, + 149,149,149,149,149, 2, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 2, 2, 2, 2, 94, 94, 94, 94, 94, 94, 2, 2, + 2, 2, 2, 2, 2, 94, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 85, 2, 2,101,101, + 101,101,101,101,101,101,101, 2, 2, 2, 2, 2, 2, 2,101,101, + 2, 2, 2, 2, 2, 2, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 2, 96, 96,111,111,111,111,111,111,111,111,111,111, + 111,111,111,111,111, 2,100,100,100,100,100,100,100,100, 2, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 2, 2,108,108, + 108,108,108,108,108,108,108,108, 2,108,108,108,108,108,108,108, + 2, 2, 2, 2, 2, 2,129,129,129,129,129,129,129, 2,129, 2, + 129,129,129,129, 2,129,129,129,129,129,129,129,129,129,129,129, + 129,129,129,129, 2,129,129,129, 2, 2, 2, 2, 2, 2,109,109, + 109,109,109,109,109,109,109,109,109, 2, 2, 2, 2, 2,109,109, + 2, 2, 2, 2, 2, 2,107,107,107,107, 2,107,107,107,107,107, + 107,107,107, 2, 2,107,107, 2, 2,107,107,107,107,107,107,107, + 107,107,107,107,107,107,107, 2,107,107,107,107,107,107,107, 2, + 107,107, 2,107,107,107,107,107, 2, 1,107,107,107,107,107, 2, + 2,107,107,107, 2, 2,107, 2, 2, 2, 2, 2, 2,107, 2, 2, + 2, 2, 2,107,107,107,107,107,107,107, 2, 2,107,107,107,107, + 107,107,107, 2, 2, 2,137,137,137,137,137,137,137,137,137,137, + 137,137, 2,137,137,137,137,137, 2, 2, 2, 2, 2, 2,124,124, + 124,124,124,124,124,124,124,124, 2, 2, 2, 2, 2, 2,123,123, + 123,123,123,123,123,123,123,123,123,123,123,123, 2, 2,114,114, + 114,114,114,114,114,114,114,114,114,114,114, 2, 2, 2,114,114, + 2, 2, 2, 2, 2, 2, 32, 32, 32, 32, 32, 2, 2, 2,102,102, + 102,102,102,102,102,102,102,102, 2, 2, 2, 2, 2, 2,126,126, + 126,126,126,126,126,126,126,126,126, 2, 2,126,126,126,126,126, + 126,126, 2, 2, 2, 2,126,126,126,126,126,126,126, 2,142,142, + 142,142,142,142,142,142,142,142,142,142, 2, 2, 2, 2,125,125, + 125,125,125,125,125,125,125,125,125, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2,125,154,154,154,154,154,154,154, 2, 2,154, + 2, 2,154,154,154,154,154,154,154,154, 2,154,154, 2,154,154, + 154,154,154,154,154,154,154,154,154,154,154,154, 2,154,154, 2, + 2,154,154,154,154,154,154,154, 2, 2, 2, 2, 2, 2,150,150, + 150,150,150,150,150,150, 2, 2,150,150,150,150,150,150,150,150, + 150,150,150, 2, 2, 2,141,141,141,141,141,141,141,141,140,140, + 140,140,140,140,140,140,140,140,140, 2, 2, 2, 2, 2,121,121, + 121,121,121,121,121,121,121, 2, 2, 2, 2, 2, 2, 2, 7, 7, 2, 2, 2, 2, 2, 2,133,133,133,133,133,133,133,133,133, 2, 133,133,133,133,133,133,133,133,133,133,133,133,133, 2,133,133, 133,133,133,133, 2, 2,133,133,133,133,133, 2, 2, 2,134,134, @@ -3795,29 +3839,31 @@ _hb_ucd_u8[17564] = 143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143, 143,143,143,143,143, 2,143,143, 2,143,143,143,143,143,143, 2, 2, 2, 2, 2, 2, 2,143,143, 2, 2, 2, 2, 2, 2,145,145, - 145,145,145,145,145,145,145, 2, 2, 2, 2, 2, 2, 2, 86, 2, + 145,145,145,145,145,145,145, 2, 2, 2, 2, 2, 2, 2,163,163, + 163,163,163,163,163,163,163, 2,163,163,163,163,163,163,163,163, + 163, 2, 2, 2,163,163,163,163, 2, 2, 2, 2, 2, 2, 86, 2, 2, 2, 2, 2, 2, 2, 22, 22, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 22, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 2, 2, 2, 2, 2, 2, 63, 63, 63, 63, 63, 63, 63, 2, 63, 63, 63, 63, 63, 2, 2, 2, 63, 63, 63, 63, 2, 2, 2, 2,157,157, 157,157,157,157,157,157,157,157,157, 2, 2, 2, 2, 2, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 2, 80, 2, - 2, 2, 2, 2, 2, 2,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127, 2, 79, 2, 2, 2, 2, 2, 2, 2,115,115, - 115,115,115,115,115,115,115,115,115,115,115,115,115, 2,115,115, - 2, 2, 2, 2,115,115,159,159,159,159,159,159,159,159,159,159, - 159,159,159,159,159, 2,159,159, 2, 2, 2, 2, 2, 2,103,103, - 103,103,103,103,103,103,103,103,103,103,103,103, 2, 2,119,119, - 119,119,119,119,119,119,119,119,119,119,119,119, 2, 2,119,119, - 2,119,119,119,119,119, 2, 2, 2, 2, 2,119,119,119,146,146, - 146,146,146,146,146,146,146,146,146, 2, 2, 2, 2, 2, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, 99, 2, 2, 2, 2, 99, 2, 2, - 2, 2, 2, 2, 2, 99,136,139, 13, 13,155, 2, 2, 2,136,136, - 136,136,136,136,136,136,155,155,155,155,155,155,155,155,155,155, - 155,155,155,155, 2, 2,136, 2, 2, 2, 2, 2, 2, 2, 17, 17, - 17, 17, 2, 17, 17, 17, 17, 17, 17, 17, 2, 17, 17, 2, 17, 15, - 15, 15, 15, 15, 15, 15, 17, 17, 17, 2, 2, 2, 2, 2, 15, 15, - 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 17, 17, 17, 17,139,139, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 2, 2,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127, 2, 79, 2, + 2, 2, 2, 2, 2, 2,115,115,115,115,115,115,115,115,115,115, + 115,115,115,115,115, 2,115,115, 2, 2, 2, 2,115,115,159,159, + 159,159,159,159,159,159,159,159,159,159,159,159,159, 2,159,159, + 2, 2, 2, 2, 2, 2,103,103,103,103,103,103,103,103,103,103, + 103,103,103,103, 2, 2,119,119,119,119,119,119,119,119,119,119, + 119,119,119,119, 2, 2,119,119, 2,119,119,119,119,119, 2, 2, + 2, 2, 2,119,119,119,146,146,146,146,146,146,146,146,146,146, + 146, 2, 2, 2, 2, 2, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 2, 2, 2, 2, 99, 2, 2, 2, 2, 2, 2, 2, 99,136,139, + 13, 13,155, 2, 2, 2,136,136,136,136,136,136,136,136,155,155, + 155,155,155,155,155,155,155,155,155,155,155,155, 2, 2,136, 2, + 2, 2, 2, 2, 2, 2, 17, 17, 17, 17, 2, 17, 17, 17, 17, 17, + 17, 17, 2, 17, 17, 2, 17, 15, 15, 15, 15, 15, 15, 15, 17, 17, + 17, 2, 2, 2, 2, 2, 2, 2, 15, 2, 2, 2, 2, 2, 15, 15, + 15, 2, 2, 17, 2, 2, 2, 2, 2, 2, 17, 17, 17, 17,139,139, 139,139,139,139,139,139,139,139,139,139, 2, 2, 2, 2,105,105, 105,105,105,105,105,105,105,105,105, 2, 2, 2, 2, 2,105,105, 105,105,105, 2, 2, 2,105, 2, 2, 2, 2, 2, 2, 2,105,105, @@ -3831,24 +3877,27 @@ _hb_ucd_u8[17564] = 0, 0, 0, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,131,131,131,131,131,131,131,131,131,131, 131,131, 2, 2, 2, 2, 2, 2, 2,131,131,131,131,131, 2,131, - 131,131,131,131,131,131, 56, 56, 56, 56, 56, 56, 56, 2, 56, 2, - 2, 56, 56, 56, 56, 56, 56, 56, 2, 56, 56, 2, 56, 56, 56, 56, - 56, 2, 2, 2, 2, 2,151,151,151,151,151,151,151,151,151,151, - 151,151,151, 2, 2, 2,151,151,151,151,151,151, 2, 2,151,151, - 2, 2, 2, 2,151,151,160,160,160,160,160,160,160,160,160,160, - 160,160,160,160,160, 2,152,152,152,152,152,152,152,152,152,152, - 2, 2, 2, 2, 2,152, 30, 30, 30, 30, 2, 30, 30, 2,113,113, - 113,113,113,113,113,113,113,113,113,113,113, 2, 2,113,113,113, - 113,113,113,113,113, 2,132,132,132,132,132,132,132,132,132,132, - 132,132, 2, 2, 2, 2,132,132, 2, 2, 2, 2,132,132, 3, 3, - 3, 3, 2, 3, 3, 3, 2, 3, 3, 2, 3, 2, 2, 3, 2, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 2, 3, - 2, 3, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 3, 2, 3, - 2, 3, 2, 3, 3, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, - 3, 3, 3, 2, 3, 2, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 2, 2, 2, 2, 2, 3, 3, 3, 2, 3, 3, 3, 2, 2, - 2, 2, 2, 2, 0, 0, 15, 0, 0, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 0, 0, 0, 13, 2, 2, 2, 2, 2, 2, 2, 13, 13, + 131,131,131,131,131,131, 2, 2, 2, 2, 2, 19, 19, 19, 56, 56, + 56, 56, 56, 56, 56, 2, 56, 2, 2, 56, 56, 56, 56, 56, 56, 56, + 2, 56, 56, 2, 56, 56, 56, 56, 56, 2, 2, 2, 2, 2, 6, 6, + 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6,151,151, + 151,151,151,151,151,151,151,151,151,151,151, 2, 2, 2,151,151, + 151,151,151,151, 2, 2,151,151, 2, 2, 2, 2,151,151,160,160, + 160,160,160,160,160,160,160,160,160,160,160,160,160, 2,152,152, + 152,152,152,152,152,152,152,152, 2, 2, 2, 2, 2,152,164,164, + 164,164,164,164,164,164,164,164, 2, 2, 2, 2, 2, 2, 30, 30, + 30, 30, 2, 30, 30, 2,113,113,113,113,113,113,113,113,113,113, + 113,113,113, 2, 2,113,113,113,113,113,113,113,113, 2,132,132, + 132,132,132,132,132,132,132,132,132,132, 2, 2, 2, 2,132,132, + 2, 2, 2, 2,132,132, 3, 3, 3, 3, 2, 3, 3, 3, 2, 3, + 3, 2, 3, 2, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 2, 3, 3, 3, 3, 2, 3, 2, 3, 2, 2, 2, 2, 2, 2, + 3, 2, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 2, 3, + 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 2, 3, 2, 3, 3, + 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 3, + 3, 3, 2, 3, 3, 3, 2, 2, 2, 2, 2, 2, 0, 0, 15, 0, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, + 2, 0, 0, 0, 0, 0, 13, 2, 2, 2, 2, 2, 2, 2, 13, 13, 13, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 9, 10, 9, 11, 12, 13, 9, 9, 9, 14, 9, 9, 15, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -3926,7 +3975,7 @@ _hb_ucd_u8[17564] = 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, }; static const uint16_t -_hb_ucd_u16[9200] = +_hb_ucd_u16[9320] = { 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 7, 8, 9, 10, 11, 12, 13, 13, 13, 14, 15, 13, 13, 16, 17, 18, 19, 20, 21, 22, 13, 23, @@ -4000,509 +4049,517 @@ _hb_ucd_u16[9200] = 48, 48, 48, 468, 48, 469, 48, 470, 48, 471, 472, 140, 140, 140, 140, 140, 48, 48, 48, 48, 196, 140, 140, 140, 9, 9, 9, 473, 11, 11, 11, 474, 48, 48, 475, 192, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 271, 476, - 48, 48, 477, 478, 140, 140, 140, 140, 48, 464, 479, 48, 62, 480, 140, 48, - 481, 140, 140, 48, 482, 140, 48, 314, 483, 48, 48, 484, 485, 457, 486, 487, - 222, 48, 48, 488, 489, 48, 196, 192, 490, 48, 491, 492, 493, 48, 48, 494, - 222, 48, 48, 495, 496, 497, 498, 499, 48, 97, 500, 501, 140, 140, 140, 140, - 502, 503, 504, 48, 48, 505, 506, 192, 507, 83, 84, 508, 509, 510, 511, 512, - 48, 48, 48, 513, 514, 515, 478, 140, 48, 48, 48, 516, 517, 192, 140, 140, - 48, 48, 518, 519, 520, 521, 140, 140, 48, 48, 48, 522, 523, 192, 524, 140, - 48, 48, 525, 526, 192, 140, 140, 140, 48, 173, 527, 528, 314, 140, 140, 140, - 48, 48, 500, 529, 140, 140, 140, 140, 140, 140, 9, 9, 11, 11, 148, 530, - 531, 532, 48, 533, 534, 192, 140, 140, 140, 140, 535, 48, 48, 536, 537, 140, - 538, 48, 48, 539, 540, 541, 48, 48, 542, 543, 544, 48, 48, 48, 48, 196, - 84, 48, 518, 545, 546, 148, 175, 547, 48, 548, 549, 550, 140, 140, 140, 140, - 551, 48, 48, 552, 553, 192, 554, 48, 555, 556, 192, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 48, 557, 140, 140, 140, 100, 271, 558, 559, 560, - 48, 207, 140, 140, 140, 140, 140, 140, 272, 272, 272, 272, 272, 272, 561, 562, - 48, 48, 48, 48, 388, 140, 140, 140, 140, 48, 48, 48, 48, 48, 48, 563, - 48, 48, 200, 564, 140, 140, 140, 140, 48, 48, 48, 48, 314, 140, 140, 140, - 48, 48, 48, 196, 48, 200, 370, 48, 48, 48, 48, 200, 192, 48, 204, 565, - 48, 48, 48, 566, 567, 568, 569, 570, 48, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 9, 9, 11, 11, 271, 571, 140, 140, 140, 140, 140, 140, - 48, 48, 48, 48, 572, 573, 574, 574, 575, 576, 140, 140, 140, 140, 577, 578, + 48, 48, 477, 478, 140, 140, 140, 479, 48, 464, 480, 48, 62, 481, 140, 48, + 482, 140, 140, 48, 483, 140, 48, 314, 484, 48, 48, 485, 486, 457, 487, 488, + 222, 48, 48, 489, 490, 48, 196, 192, 491, 48, 492, 493, 494, 48, 48, 495, + 222, 48, 48, 496, 497, 498, 499, 500, 48, 97, 501, 502, 503, 140, 140, 140, + 504, 505, 506, 48, 48, 507, 508, 192, 509, 83, 84, 510, 511, 512, 513, 514, + 48, 48, 48, 515, 516, 517, 478, 140, 48, 48, 48, 518, 519, 192, 140, 140, + 48, 48, 520, 521, 522, 523, 140, 140, 48, 48, 48, 524, 525, 192, 526, 140, + 48, 48, 527, 528, 192, 140, 140, 140, 48, 173, 529, 530, 314, 140, 140, 140, + 48, 48, 501, 531, 140, 140, 140, 140, 140, 140, 9, 9, 11, 11, 148, 532, + 533, 534, 48, 535, 536, 192, 140, 140, 140, 140, 537, 48, 48, 538, 539, 140, + 540, 48, 48, 541, 542, 543, 48, 48, 544, 545, 546, 48, 48, 48, 48, 196, + 547, 140, 140, 140, 140, 140, 140, 140, 84, 48, 520, 548, 549, 148, 175, 550, + 48, 551, 552, 553, 140, 140, 140, 140, 554, 48, 48, 555, 556, 192, 557, 48, + 558, 559, 192, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 48, 560, + 561, 115, 48, 562, 563, 192, 140, 140, 140, 140, 140, 100, 271, 564, 565, 566, + 48, 207, 140, 140, 140, 140, 140, 140, 272, 272, 272, 272, 272, 272, 567, 568, + 48, 48, 48, 48, 388, 140, 140, 140, 140, 48, 48, 48, 48, 48, 48, 569, + 48, 48, 48, 570, 571, 572, 140, 140, 48, 48, 48, 48, 314, 140, 140, 140, + 48, 48, 48, 196, 48, 200, 370, 48, 48, 48, 48, 200, 192, 48, 204, 573, + 48, 48, 48, 574, 575, 576, 577, 578, 48, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 9, 9, 11, 11, 271, 579, 140, 140, 140, 140, 140, 140, + 48, 48, 48, 48, 580, 581, 582, 582, 583, 584, 140, 140, 140, 140, 585, 586, 48, 48, 48, 48, 48, 48, 48, 440, 48, 48, 48, 48, 48, 199, 140, 140, - 196, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 579, - 48, 48, 580, 140, 140, 580, 581, 48, 48, 48, 48, 48, 48, 48, 48, 206, - 48, 48, 48, 48, 48, 48, 71, 151, 196, 582, 583, 140, 140, 140, 140, 140, - 32, 32, 584, 32, 585, 209, 209, 209, 209, 209, 209, 209, 323, 140, 140, 140, - 209, 209, 209, 209, 209, 209, 209, 324, 209, 209, 586, 209, 209, 209, 587, 588, - 589, 209, 590, 209, 209, 209, 288, 140, 209, 209, 209, 209, 591, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 271, 592, 209, 209, 209, 209, 209, 287, 271, 461, - 9, 593, 11, 594, 595, 596, 241, 9, 597, 598, 599, 600, 601, 9, 593, 11, - 602, 603, 11, 604, 605, 606, 607, 9, 608, 11, 9, 593, 11, 594, 595, 11, - 241, 9, 597, 607, 9, 608, 11, 9, 593, 11, 609, 9, 610, 611, 612, 613, - 11, 614, 9, 615, 616, 617, 618, 11, 619, 9, 620, 11, 621, 622, 622, 622, - 32, 32, 32, 623, 32, 32, 624, 625, 626, 627, 45, 140, 140, 140, 140, 140, - 628, 629, 140, 140, 140, 140, 140, 140, 630, 631, 632, 140, 140, 140, 140, 140, - 48, 48, 151, 633, 634, 140, 140, 140, 140, 48, 635, 140, 48, 48, 636, 637, - 140, 140, 140, 140, 140, 140, 638, 200, 48, 48, 48, 48, 639, 585, 140, 140, - 9, 9, 597, 11, 640, 370, 140, 140, 140, 140, 140, 140, 140, 140, 140, 498, - 271, 271, 641, 642, 140, 140, 140, 140, 498, 271, 643, 644, 140, 140, 140, 140, - 645, 48, 646, 647, 648, 649, 650, 651, 652, 206, 653, 206, 140, 140, 140, 654, - 209, 209, 325, 209, 209, 209, 209, 209, 209, 323, 334, 655, 655, 655, 209, 324, - 656, 209, 209, 209, 209, 209, 209, 209, 209, 209, 657, 140, 140, 140, 658, 209, - 659, 209, 209, 325, 660, 661, 324, 140, 209, 209, 209, 209, 209, 209, 209, 662, - 209, 209, 209, 209, 209, 663, 426, 426, 209, 209, 209, 209, 209, 209, 209, 323, - 209, 209, 209, 209, 209, 660, 325, 427, 325, 209, 209, 209, 664, 176, 209, 209, - 664, 209, 657, 661, 140, 140, 140, 140, 209, 209, 209, 209, 209, 323, 657, 665, - 287, 209, 426, 288, 324, 176, 664, 287, 209, 666, 209, 209, 288, 140, 140, 192, - 48, 48, 48, 48, 48, 48, 140, 140, 48, 48, 48, 196, 48, 48, 48, 48, + 196, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 587, + 48, 48, 588, 589, 140, 590, 591, 48, 48, 48, 48, 48, 48, 48, 48, 206, + 48, 48, 48, 48, 48, 48, 71, 151, 196, 592, 593, 140, 140, 140, 140, 140, + 32, 32, 594, 32, 595, 209, 209, 209, 209, 209, 209, 209, 323, 140, 140, 140, + 209, 209, 209, 209, 209, 209, 209, 324, 209, 209, 596, 209, 209, 209, 597, 598, + 599, 209, 600, 209, 209, 209, 288, 140, 209, 209, 209, 209, 601, 140, 140, 140, + 140, 140, 140, 140, 271, 602, 271, 602, 209, 209, 209, 209, 209, 287, 271, 461, + 9, 603, 11, 604, 605, 606, 241, 9, 607, 608, 609, 610, 611, 9, 603, 11, + 612, 613, 11, 614, 615, 616, 617, 9, 618, 11, 9, 603, 11, 604, 605, 11, + 241, 9, 607, 617, 9, 618, 11, 9, 603, 11, 619, 9, 620, 621, 622, 623, + 11, 624, 9, 625, 626, 627, 628, 11, 629, 9, 630, 11, 631, 632, 632, 632, + 32, 32, 32, 633, 32, 32, 634, 635, 636, 637, 45, 140, 140, 140, 140, 140, + 638, 639, 640, 140, 140, 140, 140, 140, 641, 642, 643, 27, 27, 27, 644, 140, + 645, 140, 140, 140, 140, 140, 140, 140, 48, 48, 151, 646, 647, 140, 140, 140, + 140, 48, 648, 140, 48, 48, 649, 650, 140, 140, 140, 140, 140, 48, 651, 192, + 140, 140, 140, 140, 140, 140, 652, 200, 48, 48, 48, 48, 653, 595, 140, 140, + 9, 9, 607, 11, 654, 370, 140, 140, 140, 140, 140, 140, 140, 140, 140, 499, + 271, 271, 655, 656, 140, 140, 140, 140, 499, 271, 657, 658, 140, 140, 140, 140, + 659, 48, 660, 661, 662, 663, 664, 665, 666, 206, 667, 206, 140, 140, 140, 668, + 209, 209, 325, 209, 209, 209, 209, 209, 209, 323, 334, 669, 669, 669, 209, 324, + 670, 209, 209, 209, 209, 209, 209, 209, 209, 209, 671, 140, 140, 140, 672, 209, + 673, 209, 209, 325, 674, 675, 324, 140, 209, 209, 209, 209, 209, 209, 209, 676, + 209, 209, 209, 209, 209, 677, 426, 426, 209, 209, 209, 209, 209, 209, 209, 678, + 209, 209, 209, 209, 209, 176, 325, 427, 325, 209, 209, 209, 679, 176, 209, 209, + 679, 209, 671, 675, 140, 140, 140, 140, 209, 209, 209, 209, 209, 323, 671, 426, + 674, 209, 209, 680, 681, 325, 674, 674, 209, 682, 209, 209, 288, 140, 140, 192, + 48, 48, 48, 48, 48, 48, 140, 140, 48, 48, 48, 207, 48, 48, 48, 48, 48, 204, 48, 48, 48, 48, 48, 48, 48, 48, 478, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 100, 140, 48, 204, 140, 140, 140, 140, 140, 140, - 48, 48, 48, 48, 71, 140, 140, 140, 667, 140, 668, 668, 668, 668, 668, 668, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 140, - 391, 391, 391, 391, 391, 391, 391, 669, 391, 391, 391, 391, 391, 391, 391, 670, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 1, 2, 2, 3, - 0, 0, 0, 0, 0, 4, 0, 4, 2, 2, 5, 2, 2, 2, 5, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 6, 0, 0, 0, 0, 7, 8, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 11, - 12, 13, 14, 14, 15, 14, 14, 14, 14, 14, 14, 14, 16, 17, 14, 14, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 20, 21, 21, 21, 22, 20, 21, 21, 21, 21, - 21, 23, 24, 25, 25, 25, 25, 25, 25, 26, 25, 25, 25, 27, 28, 26, - 29, 30, 31, 32, 31, 31, 31, 31, 33, 34, 35, 31, 31, 31, 36, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 29, 31, 31, 31, 31, - 37, 38, 37, 37, 37, 37, 37, 37, 37, 39, 31, 31, 31, 31, 31, 31, - 40, 40, 40, 40, 40, 40, 41, 26, 42, 42, 42, 42, 42, 42, 42, 43, - 44, 44, 44, 44, 44, 45, 44, 46, 47, 47, 47, 48, 37, 49, 31, 31, - 31, 50, 51, 31, 31, 31, 31, 31, 31, 31, 31, 31, 52, 31, 31, 31, - 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 54, 53, 55, 53, 53, 53, - 56, 57, 58, 59, 59, 60, 61, 62, 57, 63, 64, 65, 66, 59, 59, 67, - 68, 69, 70, 71, 71, 72, 73, 74, 69, 75, 76, 77, 78, 71, 79, 26, - 80, 81, 82, 83, 83, 84, 85, 86, 81, 87, 88, 26, 89, 83, 90, 91, - 92, 93, 94, 95, 95, 96, 97, 98, 93, 99, 100, 101, 102, 95, 95, 26, - 103, 104, 105, 106, 107, 104, 108, 109, 104, 105, 110, 26, 111, 108, 108, 112, - 113, 114, 115, 113, 113, 115, 113, 116, 114, 117, 118, 119, 120, 113, 121, 113, - 122, 123, 124, 122, 122, 124, 125, 126, 123, 127, 128, 128, 129, 122, 130, 26, - 131, 132, 133, 131, 131, 131, 131, 131, 132, 133, 134, 131, 135, 131, 131, 131, - 136, 137, 138, 139, 137, 137, 140, 141, 138, 142, 143, 137, 144, 137, 145, 26, - 146, 147, 147, 147, 147, 147, 147, 148, 147, 147, 147, 149, 26, 26, 26, 26, - 150, 151, 152, 152, 153, 152, 152, 154, 155, 154, 152, 156, 26, 26, 26, 26, - 157, 157, 157, 157, 157, 157, 157, 157, 157, 158, 157, 157, 157, 159, 158, 157, - 157, 157, 157, 158, 157, 157, 157, 160, 157, 160, 161, 162, 26, 26, 26, 26, - 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, - 163, 163, 163, 163, 164, 164, 164, 164, 165, 166, 164, 164, 164, 164, 164, 167, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 170, 171, 170, 169, 169, 169, 169, - 169, 170, 169, 169, 169, 169, 170, 171, 170, 169, 171, 169, 169, 169, 169, 169, - 169, 169, 170, 169, 169, 169, 169, 169, 169, 169, 169, 172, 169, 169, 169, 173, - 169, 169, 169, 174, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 176, 176, - 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, - 178, 178, 178, 179, 180, 180, 180, 180, 180, 180, 180, 180, 180, 181, 180, 182, - 183, 183, 184, 185, 186, 186, 187, 26, 188, 188, 189, 26, 190, 191, 192, 26, - 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 194, 193, 195, 193, 195, - 196, 197, 197, 198, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 199, - 197, 197, 197, 197, 197, 200, 177, 177, 177, 177, 177, 177, 177, 177, 201, 26, - 202, 202, 202, 203, 202, 204, 202, 204, 205, 202, 206, 206, 206, 207, 208, 26, - 209, 209, 209, 209, 209, 210, 209, 209, 209, 211, 209, 212, 193, 193, 193, 193, - 213, 213, 213, 214, 215, 215, 215, 215, 215, 215, 215, 216, 215, 215, 215, 217, - 215, 218, 215, 218, 215, 219, 9, 9, 9, 220, 26, 26, 26, 26, 26, 26, - 221, 221, 221, 221, 221, 221, 221, 221, 221, 222, 221, 221, 221, 221, 221, 223, - 224, 224, 224, 224, 224, 224, 224, 224, 225, 225, 225, 225, 225, 225, 226, 227, - 228, 228, 228, 228, 228, 228, 228, 229, 228, 230, 231, 231, 231, 231, 231, 231, - 18, 232, 164, 164, 164, 164, 164, 233, 224, 26, 234, 9, 235, 236, 237, 238, - 2, 2, 2, 2, 239, 240, 2, 2, 2, 2, 2, 241, 242, 243, 2, 244, - 2, 2, 2, 2, 2, 2, 2, 245, 9, 9, 9, 9, 9, 9, 9, 9, - 14, 14, 246, 246, 14, 14, 14, 14, 246, 246, 14, 247, 14, 14, 14, 246, - 14, 14, 14, 14, 14, 14, 248, 14, 248, 14, 249, 250, 14, 14, 251, 252, - 0, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 0, 255, 256, - 0, 257, 2, 258, 0, 0, 0, 0, 259, 26, 9, 9, 9, 9, 260, 26, - 0, 0, 0, 0, 261, 262, 4, 0, 0, 263, 0, 0, 2, 2, 2, 2, - 2, 264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 71, 48, 48, 48, 48, 48, 48, 140, 140, 140, 140, 140, + 683, 140, 570, 570, 570, 570, 570, 570, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 140, 391, 391, 391, 391, 391, 391, 391, 684, + 391, 391, 391, 391, 391, 391, 391, 685, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 2, 3, 1, 2, 2, 3, 0, 0, 0, 0, 0, 4, 0, 4, + 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, + 0, 0, 0, 0, 7, 8, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 10, 11, 12, 13, 14, 14, 15, 14, 14, 14, + 14, 14, 14, 14, 16, 17, 14, 14, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 19, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 20, 21, + 21, 21, 22, 20, 21, 21, 21, 21, 21, 23, 24, 25, 25, 25, 25, 25, + 25, 26, 25, 25, 25, 27, 28, 26, 29, 30, 31, 32, 31, 31, 31, 31, + 33, 34, 35, 31, 31, 31, 36, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 29, 31, 31, 31, 31, 37, 38, 37, 37, 37, 37, 37, 37, + 37, 39, 31, 31, 31, 31, 31, 31, 40, 40, 40, 40, 40, 40, 41, 26, + 42, 42, 42, 42, 42, 42, 42, 43, 44, 44, 44, 44, 44, 45, 44, 46, + 47, 47, 47, 48, 37, 49, 31, 31, 31, 50, 51, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 52, 31, 31, 31, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 54, 53, 55, 53, 53, 53, 56, 57, 58, 59, 59, 60, 61, 62, + 57, 63, 64, 65, 66, 59, 59, 67, 68, 69, 70, 71, 71, 72, 73, 74, + 69, 75, 76, 77, 78, 71, 79, 26, 80, 81, 82, 83, 83, 84, 85, 86, + 81, 87, 88, 26, 89, 83, 90, 91, 92, 93, 94, 95, 95, 96, 97, 98, + 93, 99, 100, 101, 102, 95, 95, 26, 103, 104, 105, 106, 107, 104, 108, 109, + 104, 105, 110, 26, 111, 108, 108, 112, 113, 114, 115, 113, 113, 115, 113, 116, + 114, 117, 118, 119, 120, 113, 121, 113, 122, 123, 124, 122, 122, 124, 125, 126, + 123, 127, 128, 128, 129, 122, 130, 26, 131, 132, 133, 131, 131, 131, 131, 131, + 132, 133, 134, 131, 135, 131, 131, 131, 136, 137, 138, 139, 137, 137, 140, 141, + 138, 142, 143, 137, 144, 137, 145, 26, 146, 147, 147, 147, 147, 147, 147, 148, + 147, 147, 147, 149, 26, 26, 26, 26, 150, 151, 152, 152, 153, 152, 152, 154, + 155, 156, 152, 157, 26, 26, 26, 26, 158, 158, 158, 158, 158, 158, 158, 158, + 158, 159, 158, 158, 158, 160, 159, 158, 158, 158, 158, 159, 158, 158, 158, 161, + 158, 161, 162, 163, 26, 26, 26, 26, 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 165, 165, 165, 165, + 166, 167, 165, 165, 165, 165, 165, 168, 169, 169, 169, 169, 169, 169, 169, 169, + 169, 169, 169, 169, 169, 169, 169, 169, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 171, 172, 171, 170, 170, 170, 170, 170, 171, 170, 170, 170, 170, 171, 172, + 171, 170, 172, 170, 170, 170, 170, 170, 170, 170, 171, 170, 170, 170, 170, 170, + 170, 170, 170, 173, 170, 170, 170, 174, 170, 170, 170, 175, 176, 176, 176, 176, + 176, 176, 176, 176, 176, 176, 177, 177, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 179, 179, 179, 180, 181, 181, 181, 181, + 181, 181, 181, 181, 181, 182, 181, 183, 184, 184, 185, 186, 187, 187, 188, 26, + 189, 189, 190, 26, 191, 192, 193, 26, 194, 194, 194, 194, 194, 194, 194, 194, + 194, 194, 194, 195, 194, 196, 194, 196, 197, 198, 198, 199, 198, 198, 198, 198, + 198, 198, 198, 198, 198, 198, 198, 200, 198, 198, 198, 198, 198, 201, 178, 178, + 178, 178, 178, 178, 178, 178, 202, 26, 203, 203, 203, 204, 203, 205, 203, 205, + 206, 203, 207, 207, 207, 208, 209, 26, 210, 210, 210, 210, 210, 211, 210, 210, + 210, 212, 210, 213, 194, 194, 194, 194, 214, 214, 214, 215, 216, 216, 216, 216, + 216, 216, 216, 217, 216, 216, 216, 218, 216, 219, 216, 219, 216, 220, 9, 9, + 9, 221, 26, 26, 26, 26, 26, 26, 222, 222, 222, 222, 222, 222, 222, 222, + 222, 223, 222, 222, 222, 222, 222, 224, 225, 225, 225, 225, 225, 225, 225, 225, + 226, 226, 226, 226, 226, 226, 227, 228, 229, 229, 229, 229, 229, 229, 229, 230, + 229, 231, 232, 232, 232, 232, 232, 232, 18, 233, 165, 165, 165, 165, 165, 234, + 225, 26, 235, 9, 236, 237, 238, 239, 2, 2, 2, 2, 240, 241, 2, 2, + 2, 2, 2, 242, 243, 244, 2, 245, 2, 2, 2, 2, 2, 2, 2, 246, + 9, 9, 9, 9, 9, 9, 9, 9, 14, 14, 247, 247, 14, 14, 14, 14, + 247, 247, 14, 248, 14, 14, 14, 247, 14, 14, 14, 14, 14, 14, 249, 14, + 249, 14, 250, 251, 14, 14, 252, 253, 0, 254, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 255, 0, 256, 257, 0, 258, 2, 259, 0, 0, 0, 0, + 260, 26, 9, 9, 9, 9, 261, 26, 0, 0, 0, 0, 262, 263, 4, 0, + 0, 264, 0, 0, 2, 2, 2, 2, 2, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 257, 26, 26, 26, 0, 265, 26, 26, 0, 0, 0, 0, - 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 267, 0, - 0, 0, 268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 2, 2, 2, 2, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 270, 271, - 164, 164, 164, 164, 165, 166, 272, 272, 272, 272, 272, 272, 272, 273, 274, 273, - 169, 169, 171, 26, 171, 171, 171, 171, 171, 171, 171, 171, 18, 18, 18, 18, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, 26, 26, 26, 26, - 276, 276, 276, 277, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 278, 26, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 279, 26, 26, 26, 0, 280, - 281, 0, 0, 0, 282, 283, 0, 284, 285, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 287, 288, 289, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 291, - 292, 293, 293, 293, 293, 293, 294, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 295, 0, 0, 293, 293, 293, 293, 0, 0, 0, 0, 280, 26, 290, 290, - 168, 168, 168, 295, 0, 0, 0, 0, 0, 0, 0, 0, 168, 168, 168, 296, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 290, 290, 290, 290, 290, 297, - 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 0, 0, 0, 0, 0, - 276, 276, 276, 276, 276, 276, 276, 276, 0, 0, 0, 0, 0, 0, 0, 0, - 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, - 298, 299, 298, 298, 298, 298, 298, 298, 300, 26, 301, 301, 301, 301, 301, 301, - 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, - 302, 302, 302, 302, 302, 303, 26, 26, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 26, - 0, 0, 0, 0, 305, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 306, 2, 2, 2, 2, 2, 2, 2, 307, 308, 309, 26, 26, 310, 2, - 311, 311, 311, 311, 311, 312, 0, 313, 314, 314, 314, 314, 314, 314, 314, 26, - 315, 315, 315, 315, 315, 315, 315, 315, 316, 317, 315, 318, 53, 53, 53, 53, - 319, 319, 319, 319, 319, 320, 321, 321, 321, 321, 322, 323, 168, 168, 168, 324, - 325, 325, 325, 325, 325, 325, 325, 325, 325, 326, 325, 327, 163, 163, 163, 328, - 329, 329, 329, 329, 329, 329, 330, 26, 329, 331, 329, 332, 163, 163, 163, 163, - 333, 333, 333, 333, 333, 333, 333, 333, 334, 26, 26, 335, 336, 336, 337, 26, - 338, 338, 338, 26, 171, 171, 2, 2, 2, 2, 2, 339, 340, 341, 175, 175, - 175, 175, 175, 175, 175, 175, 175, 175, 336, 336, 336, 336, 336, 342, 336, 343, - 168, 168, 168, 168, 344, 26, 168, 168, 295, 345, 168, 168, 168, 168, 168, 344, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 258, 26, 26, 26, + 0, 266, 26, 26, 0, 0, 0, 0, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 267, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 268, 0, 0, 0, 269, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 2, 2, 2, 2, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 271, 272, 165, 165, 165, 165, 166, 167, 273, 273, + 273, 273, 273, 273, 273, 274, 275, 274, 170, 170, 172, 26, 172, 172, 172, 172, + 172, 172, 172, 172, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 276, 26, 26, 26, 26, 277, 277, 277, 278, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 279, 26, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 280, 26, 26, 26, 0, 281, 282, 0, 0, 0, 283, 284, 0, 285, + 286, 287, 287, 287, 287, 287, 287, 287, 287, 287, 288, 289, 290, 291, 291, 291, + 291, 291, 291, 291, 291, 291, 291, 292, 293, 294, 294, 294, 294, 294, 295, 169, + 169, 169, 169, 169, 169, 169, 169, 169, 169, 296, 0, 0, 294, 294, 294, 294, + 0, 0, 0, 0, 281, 26, 291, 291, 169, 169, 169, 296, 0, 0, 0, 0, + 0, 0, 0, 0, 169, 169, 169, 297, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 291, 291, 291, 291, 291, 298, 291, 291, 291, 291, 291, 291, 291, 291, + 291, 291, 291, 0, 0, 0, 0, 0, 277, 277, 277, 277, 277, 277, 277, 277, + 0, 0, 0, 0, 0, 0, 0, 0, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 300, 299, 299, 299, 299, 299, 299, + 301, 26, 302, 302, 302, 302, 302, 302, 303, 303, 303, 303, 303, 303, 303, 303, + 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 304, 26, 26, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 305, 305, 305, 305, + 305, 305, 305, 305, 305, 305, 305, 26, 0, 0, 0, 0, 306, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 307, 2, 2, 2, 2, 2, 2, + 2, 308, 309, 310, 26, 26, 311, 2, 312, 312, 312, 312, 312, 313, 0, 314, + 315, 315, 315, 315, 315, 315, 315, 26, 316, 316, 316, 316, 316, 316, 316, 316, + 317, 318, 316, 319, 53, 53, 53, 53, 320, 320, 320, 320, 320, 321, 322, 322, + 322, 322, 323, 324, 169, 169, 169, 325, 326, 326, 326, 326, 326, 326, 326, 326, + 326, 327, 326, 328, 164, 164, 164, 329, 330, 330, 330, 330, 330, 330, 331, 26, + 330, 332, 330, 333, 164, 164, 164, 164, 334, 334, 334, 334, 334, 334, 334, 334, + 335, 26, 26, 336, 337, 337, 338, 26, 339, 339, 339, 26, 172, 172, 2, 2, + 2, 2, 2, 340, 341, 342, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, + 337, 337, 337, 337, 337, 343, 337, 344, 169, 169, 169, 169, 345, 26, 169, 169, + 296, 346, 169, 169, 169, 169, 169, 345, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 280, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 347, 26, 26, 26, 26, 348, 26, 349, 350, 25, 25, 351, 352, + 353, 25, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 354, 26, 355, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 356, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 357, 31, 31, 31, 31, 31, + 31, 358, 26, 26, 26, 26, 31, 31, 9, 9, 0, 314, 9, 359, 0, 0, + 0, 0, 360, 0, 258, 281, 361, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 362, 363, 0, 0, 0, 1, 2, 2, 3, + 1, 2, 2, 3, 364, 291, 290, 291, 291, 291, 291, 365, 169, 169, 169, 296, + 366, 366, 366, 367, 258, 258, 26, 368, 369, 370, 369, 369, 371, 369, 369, 372, + 369, 373, 369, 373, 26, 26, 26, 26, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 374, 375, 0, 0, 0, 0, 0, 376, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 253, 0, 377, 378, 26, 26, 26, + 26, 26, 0, 0, 0, 0, 0, 379, 380, 380, 380, 381, 382, 382, 382, 382, + 382, 382, 383, 26, 384, 0, 0, 281, 385, 385, 385, 385, 386, 387, 388, 388, + 388, 389, 390, 390, 390, 390, 390, 391, 392, 392, 392, 393, 394, 394, 394, 394, + 395, 394, 396, 26, 26, 26, 26, 26, 397, 397, 397, 397, 397, 397, 397, 397, + 397, 397, 398, 398, 398, 398, 398, 398, 399, 399, 399, 400, 399, 401, 402, 402, + 402, 402, 403, 402, 402, 402, 402, 403, 404, 404, 404, 404, 404, 26, 405, 405, + 405, 405, 405, 405, 406, 407, 408, 409, 408, 409, 410, 408, 411, 408, 411, 412, + 26, 26, 26, 26, 26, 26, 26, 26, 413, 413, 413, 413, 413, 413, 413, 413, + 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 414, 26, + 413, 413, 415, 26, 413, 26, 26, 26, 416, 2, 2, 2, 2, 2, 417, 308, + 26, 26, 26, 26, 26, 26, 26, 26, 418, 419, 420, 420, 420, 420, 421, 422, + 423, 423, 424, 423, 425, 425, 425, 425, 426, 426, 426, 427, 428, 426, 26, 26, + 26, 26, 26, 26, 429, 429, 430, 431, 432, 432, 432, 433, 434, 434, 434, 435, + 26, 26, 26, 26, 26, 26, 26, 26, 436, 436, 436, 436, 437, 437, 437, 438, + 437, 437, 439, 437, 437, 437, 437, 437, 440, 441, 442, 443, 444, 444, 445, 446, + 444, 447, 444, 447, 448, 448, 448, 448, 449, 449, 449, 449, 26, 26, 26, 26, + 450, 450, 450, 450, 451, 452, 451, 26, 453, 453, 453, 453, 453, 453, 454, 455, + 456, 456, 457, 456, 458, 458, 459, 458, 460, 460, 461, 462, 26, 463, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 464, 464, 464, 464, 464, 464, 464, 464, + 464, 465, 26, 26, 26, 26, 26, 26, 466, 466, 466, 466, 466, 466, 467, 26, + 466, 466, 466, 466, 466, 466, 467, 468, 469, 469, 469, 469, 469, 26, 469, 470, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 31, 31, 31, 50, 471, 471, 471, 471, 471, 472, 473, 26, + 26, 26, 26, 26, 26, 26, 26, 474, 475, 475, 475, 475, 475, 26, 476, 476, + 476, 476, 476, 477, 26, 26, 478, 478, 478, 479, 26, 26, 26, 26, 480, 480, + 480, 481, 26, 26, 482, 482, 483, 26, 484, 484, 484, 484, 484, 484, 484, 484, + 484, 485, 486, 484, 484, 484, 485, 487, 488, 488, 488, 488, 488, 488, 488, 488, + 489, 490, 491, 491, 491, 492, 491, 493, 494, 494, 494, 494, 494, 494, 495, 494, + 494, 26, 496, 496, 496, 496, 497, 26, 498, 498, 498, 498, 498, 498, 498, 498, + 498, 498, 498, 498, 499, 137, 500, 26, 501, 501, 502, 501, 501, 501, 501, 501, + 503, 26, 26, 26, 26, 26, 26, 26, 504, 505, 506, 507, 506, 508, 509, 509, + 509, 509, 509, 509, 509, 510, 509, 511, 512, 513, 514, 515, 515, 516, 517, 518, + 513, 519, 520, 521, 522, 523, 523, 26, 524, 524, 524, 524, 524, 524, 524, 524, + 524, 524, 524, 525, 526, 26, 26, 26, 527, 527, 527, 527, 527, 527, 527, 527, + 527, 26, 527, 528, 26, 26, 26, 26, 529, 529, 529, 529, 529, 529, 530, 529, + 529, 529, 529, 530, 26, 26, 26, 26, 531, 531, 531, 531, 531, 531, 531, 531, + 532, 26, 531, 533, 198, 534, 26, 26, 535, 535, 535, 535, 535, 535, 535, 536, + 535, 536, 26, 26, 26, 26, 26, 26, 537, 537, 537, 538, 537, 539, 537, 537, + 540, 26, 26, 26, 26, 26, 26, 26, 541, 541, 541, 541, 541, 541, 541, 542, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 543, 543, 543, 543, + 543, 543, 543, 543, 543, 543, 544, 545, 546, 547, 548, 549, 549, 549, 550, 551, + 546, 26, 549, 552, 26, 26, 26, 26, 26, 26, 26, 26, 553, 554, 553, 553, + 553, 553, 553, 554, 555, 26, 26, 26, 556, 556, 556, 556, 556, 556, 556, 556, + 556, 26, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 558, 26, 178, 178, + 559, 559, 559, 559, 559, 559, 559, 560, 53, 561, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 562, 563, 562, 562, 562, 562, 564, 562, + 565, 26, 562, 562, 562, 566, 567, 567, 567, 567, 568, 567, 567, 569, 570, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 571, 572, 573, 573, 573, 573, 571, 574, + 573, 26, 573, 575, 576, 577, 578, 578, 578, 579, 580, 581, 578, 582, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 583, 583, 583, 584, 585, 585, 586, 585, 585, 585, 585, 587, + 585, 585, 585, 588, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 589, 26, + 108, 108, 108, 108, 108, 108, 590, 591, 592, 592, 592, 592, 592, 592, 592, 592, + 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 593, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 592, 592, 592, 592, 592, 592, 592, 592, + 592, 592, 592, 592, 592, 594, 595, 26, 592, 592, 592, 592, 592, 592, 592, 592, + 596, 26, 26, 26, 26, 26, 26, 26, 26, 26, 597, 597, 597, 597, 597, 597, + 597, 597, 597, 597, 597, 597, 598, 26, 599, 599, 599, 599, 599, 599, 599, 599, + 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, + 599, 599, 600, 26, 26, 26, 26, 26, 601, 601, 601, 601, 601, 601, 601, 601, + 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, + 602, 26, 26, 26, 26, 26, 26, 26, 305, 305, 305, 305, 305, 305, 305, 305, + 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 603, + 604, 604, 604, 605, 604, 606, 607, 607, 607, 607, 607, 607, 607, 607, 607, 608, + 607, 609, 610, 610, 610, 611, 611, 26, 612, 612, 612, 612, 612, 612, 612, 612, + 613, 26, 612, 614, 614, 612, 612, 615, 612, 612, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 617, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 618, 618, 618, 618, 618, 618, 618, 618, + 618, 619, 618, 618, 618, 618, 618, 618, 618, 620, 618, 618, 26, 26, 26, 26, + 26, 26, 26, 26, 621, 26, 347, 26, 622, 622, 622, 622, 622, 622, 622, 622, + 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, + 622, 622, 622, 622, 622, 622, 622, 26, 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 624, 26, 26, 26, 26, 26, 622, 625, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 279, 276, 276, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 346, 26, 26, 26, 26, - 347, 26, 348, 349, 25, 25, 350, 351, 352, 25, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 353, 26, 354, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 355, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 356, 31, 31, 31, 31, 31, 31, 357, 26, 26, 26, 26, 31, 31, - 9, 9, 0, 313, 9, 358, 0, 0, 0, 0, 359, 0, 257, 280, 360, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 361, - 362, 0, 0, 0, 1, 2, 2, 3, 1, 2, 2, 3, 363, 290, 289, 290, - 290, 290, 290, 364, 168, 168, 168, 295, 365, 365, 365, 366, 257, 257, 26, 367, - 368, 369, 368, 368, 370, 368, 368, 371, 368, 372, 368, 372, 26, 26, 26, 26, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 373, - 374, 0, 0, 0, 0, 0, 375, 0, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 252, 0, 376, 377, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 378, - 379, 379, 379, 380, 381, 381, 381, 381, 381, 381, 382, 26, 383, 0, 0, 280, - 384, 384, 384, 384, 385, 386, 387, 387, 387, 388, 389, 389, 389, 389, 389, 390, - 391, 391, 391, 392, 393, 393, 393, 393, 394, 393, 395, 26, 26, 26, 26, 26, - 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 397, 397, 397, 397, 397, 397, - 398, 398, 398, 399, 398, 400, 401, 401, 401, 401, 402, 401, 401, 401, 401, 402, - 403, 403, 403, 403, 403, 26, 404, 404, 404, 404, 404, 404, 405, 406, 407, 408, - 407, 408, 409, 407, 410, 407, 410, 411, 26, 26, 26, 26, 26, 26, 26, 26, - 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, - 412, 412, 412, 412, 412, 412, 413, 26, 412, 412, 414, 26, 412, 26, 26, 26, - 415, 2, 2, 2, 2, 2, 416, 307, 26, 26, 26, 26, 26, 26, 26, 26, - 417, 418, 419, 419, 419, 419, 420, 421, 422, 422, 423, 422, 424, 424, 424, 424, - 425, 425, 425, 426, 427, 425, 26, 26, 26, 26, 26, 26, 428, 428, 429, 430, - 431, 431, 431, 432, 433, 433, 433, 434, 26, 26, 26, 26, 26, 26, 26, 26, - 435, 435, 435, 435, 436, 436, 436, 437, 436, 436, 438, 436, 436, 436, 436, 436, - 439, 440, 441, 442, 443, 443, 444, 445, 443, 446, 443, 446, 447, 447, 447, 447, - 448, 448, 448, 448, 26, 26, 26, 26, 449, 449, 449, 449, 450, 451, 450, 26, - 452, 452, 452, 452, 452, 452, 453, 454, 455, 455, 456, 455, 457, 457, 458, 457, - 459, 459, 460, 461, 26, 462, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 463, 463, 463, 463, 463, 463, 463, 463, 463, 464, 26, 26, 26, 26, 26, 26, - 465, 465, 465, 465, 465, 465, 466, 26, 465, 465, 465, 465, 465, 465, 466, 467, - 468, 468, 468, 468, 468, 26, 468, 469, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 31, 31, 31, 50, - 470, 470, 470, 470, 470, 471, 472, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 473, 473, 473, 473, 473, 26, 474, 474, 474, 474, 474, 475, 26, 26, 476, 476, - 476, 477, 26, 26, 26, 26, 478, 478, 478, 479, 26, 26, 480, 480, 481, 26, - 482, 482, 482, 482, 482, 482, 482, 482, 482, 483, 484, 482, 482, 482, 483, 485, - 486, 486, 486, 486, 486, 486, 486, 486, 487, 488, 489, 489, 489, 490, 489, 491, - 492, 492, 492, 492, 492, 492, 493, 492, 492, 26, 494, 494, 494, 494, 495, 26, - 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 497, 137, 498, 26, - 499, 499, 500, 499, 499, 499, 499, 501, 26, 26, 26, 26, 26, 26, 26, 26, - 502, 503, 504, 505, 504, 506, 507, 507, 507, 507, 507, 507, 507, 508, 507, 509, - 510, 511, 512, 513, 513, 514, 515, 516, 511, 517, 518, 519, 520, 521, 521, 26, - 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 523, 524, 26, 26, 26, - 525, 525, 525, 525, 525, 525, 525, 525, 525, 26, 525, 526, 26, 26, 26, 26, - 527, 527, 527, 527, 527, 527, 528, 527, 527, 527, 527, 528, 26, 26, 26, 26, - 529, 529, 529, 529, 529, 529, 529, 529, 530, 26, 529, 531, 197, 532, 26, 26, - 533, 533, 533, 533, 533, 533, 533, 534, 533, 534, 26, 26, 26, 26, 26, 26, - 535, 535, 535, 536, 535, 537, 535, 535, 538, 26, 26, 26, 26, 26, 26, 26, - 539, 539, 539, 539, 539, 539, 539, 540, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 542, 543, - 544, 545, 546, 547, 547, 547, 548, 549, 544, 26, 547, 550, 26, 26, 26, 26, - 26, 26, 26, 26, 551, 552, 551, 551, 551, 551, 551, 552, 553, 26, 26, 26, - 554, 554, 554, 554, 554, 554, 554, 554, 554, 26, 555, 555, 555, 555, 555, 555, - 555, 555, 555, 555, 556, 26, 177, 177, 557, 557, 557, 557, 557, 557, 557, 558, - 559, 560, 559, 559, 559, 559, 561, 559, 562, 26, 559, 559, 559, 563, 564, 564, - 564, 564, 565, 564, 564, 566, 567, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 568, 569, 570, 570, 570, 570, 568, 571, 570, 26, 570, 572, 573, 574, 575, 575, - 575, 576, 577, 578, 575, 579, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 580, 580, 580, 581, - 26, 26, 26, 26, 26, 26, 582, 26, 108, 108, 108, 108, 108, 108, 583, 584, - 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, - 585, 585, 585, 586, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 587, 588, 26, - 585, 585, 585, 585, 585, 585, 585, 585, 589, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 591, 26, - 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, - 592, 592, 592, 592, 592, 593, 592, 594, 26, 26, 26, 26, 26, 26, 26, 26, - 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, - 595, 595, 595, 595, 595, 595, 595, 595, 596, 26, 26, 26, 26, 26, 26, 26, - 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, - 304, 304, 304, 304, 304, 304, 304, 597, 598, 598, 598, 599, 598, 600, 601, 601, - 601, 601, 601, 601, 601, 601, 601, 602, 601, 603, 604, 604, 604, 605, 605, 26, - 606, 606, 606, 606, 606, 606, 606, 606, 607, 26, 606, 608, 608, 606, 606, 609, - 606, 606, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 610, 610, 610, 610, 610, 610, 610, 610, - 610, 610, 610, 611, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 612, 612, 612, 612, 612, 612, 612, 612, 612, 613, 612, 612, 612, 612, 612, 612, - 612, 614, 612, 612, 26, 26, 26, 26, 26, 26, 26, 26, 615, 26, 346, 26, - 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, - 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 26, - 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, - 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 618, 26, 26, 26, 26, 26, - 616, 619, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 620, 621, - 622, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 623, 26, 26, 26, 26, 26, 624, 26, 625, 26, 626, 626, - 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, - 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 627, - 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 629, 628, 630, - 628, 631, 628, 632, 280, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 9, 9, 9, 9, 9, 633, 9, 9, 220, 26, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 280, 26, 26, 26, 26, 26, 26, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, 26, - 0, 0, 0, 0, 257, 362, 0, 0, 0, 0, 0, 0, 634, 635, 0, 636, - 637, 638, 0, 0, 0, 639, 0, 0, 0, 0, 0, 0, 0, 265, 26, 26, - 14, 14, 14, 14, 14, 14, 14, 14, 246, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 280, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 26, 0, 0, 0, 259, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 0, 0, 0, 0, 0, - 0, 0, 0, 254, 640, 641, 0, 642, 643, 0, 0, 0, 0, 0, 0, 0, - 268, 644, 254, 254, 0, 0, 0, 645, 646, 647, 648, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 267, 0, 0, 0, 0, 0, 0, - 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, - 649, 650, 26, 651, 652, 649, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 2, 2, 2, 347, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 653, 269, 269, 654, 655, 656, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 657, 657, 657, 657, 657, 658, 657, 659, 657, 660, 26, 26, 26, 26, 26, 26, - 26, 26, 661, 661, 661, 662, 26, 26, 663, 663, 663, 663, 663, 663, 663, 664, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 171, 665, 169, 171, - 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, - 666, 666, 666, 666, 666, 666, 666, 666, 667, 666, 668, 26, 26, 26, 26, 26, - 669, 669, 669, 669, 669, 669, 669, 669, 669, 670, 669, 671, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 362, 0, - 0, 0, 0, 0, 0, 0, 376, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 362, 0, 0, 0, 0, 0, 0, 275, 26, 26, 26, 26, 26, 26, 26, 26, - 672, 31, 31, 31, 673, 674, 675, 676, 677, 678, 673, 679, 673, 675, 675, 680, - 31, 681, 31, 682, 683, 681, 31, 682, 26, 26, 26, 26, 26, 26, 51, 26, - 0, 0, 0, 0, 0, 280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 280, 26, 0, 257, 362, 0, 362, 0, 362, 0, 0, 0, 275, 26, - 0, 0, 0, 0, 0, 275, 26, 26, 26, 26, 26, 26, 684, 0, 0, 0, - 685, 26, 0, 0, 0, 0, 0, 280, 0, 259, 313, 26, 275, 26, 26, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 686, 0, 376, 0, 376, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 280, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, 0, 280, 259, 26, - 0, 280, 0, 0, 0, 0, 0, 0, 0, 26, 0, 313, 0, 0, 0, 0, - 0, 26, 0, 0, 0, 275, 313, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 280, 26, 0, 275, 376, 376, - 257, 26, 0, 0, 0, 376, 0, 265, 275, 26, 0, 313, 0, 26, 257, 26, - 0, 0, 359, 0, 0, 0, 0, 0, 0, 265, 26, 26, 26, 26, 0, 313, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 26, 26, 26, 26, - 276, 276, 276, 276, 276, 276, 276, 687, 276, 276, 276, 276, 276, 276, 276, 276, - 276, 276, 276, 279, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, - 276, 276, 276, 276, 346, 26, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 687, 26, 26, 26, - 276, 276, 276, 279, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 688, 26, 26, 26, 26, 26, 26, - 689, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 26, 26, 26, 26, 26, 26, 626, 627, 628, 287, 287, 287, 287, 287, 287, 287, + 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, + 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 629, 26, 630, 26, + 26, 26, 631, 26, 632, 26, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, + 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, + 633, 633, 633, 633, 633, 633, 633, 634, 635, 635, 635, 635, 635, 635, 635, 635, + 635, 635, 635, 635, 635, 636, 635, 637, 635, 638, 635, 639, 281, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 9, 9, 9, 9, 9, 640, 9, 9, + 221, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 281, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 276, 26, 0, 0, 0, 0, 258, 363, 0, 0, + 0, 0, 0, 0, 641, 642, 0, 643, 644, 645, 0, 0, 0, 646, 0, 0, + 0, 0, 0, 0, 0, 266, 26, 26, 14, 14, 14, 14, 14, 14, 14, 14, + 247, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 0, 0, 281, 26, 0, 0, 281, 26, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 258, 26, 0, 0, 0, 260, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 647, 648, 0, 649, + 650, 0, 0, 0, 0, 0, 0, 0, 269, 651, 255, 255, 0, 0, 0, 652, + 653, 654, 655, 0, 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 268, 0, 0, 0, 0, 0, 0, 656, 656, 656, 656, 656, 656, 656, 656, + 656, 656, 656, 656, 656, 656, 656, 656, 656, 657, 26, 658, 659, 656, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 348, 660, 308, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 661, 270, 270, 662, 663, 664, 18, 18, + 18, 18, 18, 18, 18, 665, 26, 26, 26, 666, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 667, 667, 667, 667, 667, 668, 667, 669, + 667, 670, 26, 26, 26, 26, 26, 26, 26, 26, 671, 671, 671, 672, 26, 26, + 673, 673, 673, 673, 673, 673, 673, 674, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 675, 675, 675, 675, 675, 676, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 172, 677, 170, 172, 678, 678, 678, 678, 678, 678, 678, 678, + 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, + 679, 678, 680, 26, 26, 26, 26, 26, 681, 681, 681, 681, 681, 681, 681, 681, + 681, 682, 681, 683, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 363, 0, 0, 0, 0, 0, 0, 0, 377, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 363, 0, 0, 0, 0, 0, 0, 276, + 26, 26, 26, 26, 26, 26, 26, 26, 684, 31, 31, 31, 685, 686, 687, 688, + 689, 690, 685, 691, 685, 687, 687, 692, 31, 693, 31, 694, 695, 693, 31, 694, + 26, 26, 26, 26, 26, 26, 51, 26, 0, 0, 0, 0, 0, 281, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281, 26, 0, 258, 363, 0, + 363, 0, 363, 0, 0, 0, 276, 26, 0, 0, 0, 0, 0, 276, 26, 26, + 26, 26, 26, 26, 696, 0, 0, 0, 697, 26, 0, 0, 0, 0, 0, 281, + 0, 260, 314, 26, 276, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 698, 0, 377, 0, 377, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 258, 699, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 314, 0, 281, 260, 26, 0, 281, 0, 0, 0, 0, 0, 0, + 0, 26, 0, 314, 0, 0, 0, 0, 0, 26, 0, 0, 0, 276, 314, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 281, 26, 0, 276, 0, 377, 0, 260, 0, 0, 0, 0, 0, 269, + 276, 696, 0, 281, 0, 260, 0, 260, 0, 0, 360, 0, 0, 0, 0, 0, + 0, 266, 26, 26, 26, 26, 0, 314, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 26, 26, 26, 26, 277, 277, 277, 277, 277, 277, 277, 347, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 280, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 347, 26, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 700, 26, 26, 26, 277, 277, 277, 280, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 701, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 702, 26, 26, 26, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 939, 940, 941, 942, 946, 948, 0, 962, + 969, 970, 971, 976,1001,1002,1003,1008, 0,1033,1040,1041,1042,1043,1047, 0, + 0,1080,1081,1082,1086,1110, 0, 0,1124,1125,1126,1127,1131,1133, 0,1147, + 1154,1155,1156,1161,1187,1188,1189,1193, 0,1219,1226,1227,1228,1229,1233, 0, + 0,1267,1268,1269,1273,1298, 0,1303, 943,1128, 944,1129, 954,1139, 958,1143, + 959,1144, 960,1145, 961,1146, 964,1149, 0, 0, 973,1158, 974,1159, 975,1160, + 983,1168, 978,1163, 988,1173, 990,1175, 991,1176, 993,1178, 994,1179, 0, 0, + 1004,1190,1005,1191,1006,1192,1014,1199,1007, 0, 0, 0,1016,1201,1020,1206, + 0,1022,1208,1025,1211,1023,1209, 0, 0, 0, 0,1032,1218,1037,1223,1035, + 1221, 0, 0, 0,1044,1230,1045,1231,1049,1235, 0, 0,1058,1244,1064,1250, + 1060,1246,1066,1252,1067,1253,1072,1258,1069,1255,1077,1264,1074,1261, 0, 0, + 1083,1270,1084,1271,1085,1272,1088,1275,1089,1276,1096,1283,1103,1290,1111,1299, + 1115,1118,1307,1120,1309,1121,1310, 0,1053,1239, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,1093,1280, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 949,1134,1010,1195,1050,1236,1090,1277,1341,1368,1340, + 1367,1342,1369,1339,1366, 0,1320,1347,1418,1419,1323,1350, 0, 0, 992,1177, + 1018,1204,1055,1241,1416,1417,1415,1424,1202, 0, 0, 0, 987,1172, 0, 0, + 1031,1217,1321,1348,1322,1349,1338,1365, 950,1135, 951,1136, 979,1164, 980,1165, + 1011,1196,1012,1197,1051,1237,1052,1238,1061,1247,1062,1248,1091,1278,1092,1279, + 1071,1257,1076,1263, 0, 0, 997,1182, 0, 0, 0, 0, 0, 0, 945,1130, + 982,1167,1337,1364,1335,1362,1046,1232,1422,1423,1113,1301, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 10,1425, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,1314,1427, 5, + 1434,1438,1443, 0,1450, 0,1455,1461,1514, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1446,1458,1468,1476,1480,1486,1517, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1489,1503,1494,1500,1508, 0, 0, 0, 0,1520,1521, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1526,1528, 0,1525, 0, 0, 0,1522, + 0, 0, 0, 0,1536,1532,1539, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1556, 0, 0, 0, 0, 0, 0,1548,1550, 0,1547, 0, 0, 0,1567, + 0, 0, 0, 0,1558,1554,1561, 0, 0, 0, 0, 0, 0, 0,1568,1569, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1529,1551, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1523,1545,1524,1546, 0, 0,1527,1549, + 0, 0,1570,1571,1530,1552,1531,1553, 0, 0,1533,1555,1535,1557,1537,1559, + 0, 0,1572,1573,1544,1566,1538,1560,1540,1562,1541,1563,1542,1564, 0, 0, + 1543,1565, 0, 0, 0, 0, 0, 0, 0, 0,1606,1607,1609,1608,1610, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1613, 0,1611, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1612, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1620, 0, 0, 0, 0, 0, 0, 0,1623, 0, 0,1624, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1614,1615,1616,1617,1618,1619,1621,1622, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1628,1629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1625,1626, 0,1627, 0, 0, 0,1634, 0, 0,1635, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1630,1631,1632, 0, 0,1633, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1639, 0, 0,1638,1640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1636,1637, 0, 0, 0, 0, 0, 0,1641, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1642,1644,1643, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1645, 0, 0, 0, 0, 0, 0, 0,1646, 0, 0, 0, 0, 0, 0,1648, + 1649, 0,1647,1650, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1651,1653,1652, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1654, 0,1655,1657,1656, 0, 0, 0, 0,1659, 0, 0, 0, 0, + 0, 0, 0, 0, 0,1660, 0, 0, 0, 0,1661, 0, 0, 0, 0,1662, + 0, 0, 0, 0,1663, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1658, 0, 0, 0, 0, 0, 0, 0, 0, 0,1664, 0,1665,1673, 0, + 1674, 0, 0, 0, 0, 0, 0, 0, 0,1666, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1668, 0, 0, 0, 0, + 0, 0, 0, 0, 0,1669, 0, 0, 0, 0,1670, 0, 0, 0, 0,1671, + 0, 0, 0, 0,1672, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1667, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1675, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1676, 0, + 1677, 0,1678, 0,1679, 0,1680, 0, 0, 0,1681, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1682, 0,1683, 0, 0,1684,1685, 0,1686, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 953,1138, 955,1140, 956,1141, 957,1142, + 1324,1351, 963,1148, 965,1150, 968,1153, 966,1151, 967,1152,1378,1380,1379,1381, + 984,1169, 985,1170,1420,1421, 986,1171, 989,1174, 995,1180, 998,1183, 996,1181, + 999,1184,1000,1185,1015,1200,1329,1356,1017,1203,1019,1205,1021,1207,1024,1210, + 1687,1688,1027,1213,1026,1212,1028,1214,1029,1215,1030,1216,1034,1220,1036,1222, + 1039,1225,1038,1224,1334,1361,1336,1363,1382,1384,1383,1385,1056,1242,1057,1243, + 1059,1245,1063,1249,1689,1690,1065,1251,1068,1254,1070,1256,1386,1387,1388,1389, + 1691,1692,1073,1259,1075,1262,1079,1266,1078,1265,1095,1282,1098,1285,1097,1284, + 1390,1391,1392,1393,1099,1286,1100,1287,1101,1288,1102,1289,1105,1292,1104,1291, + 1106,1294,1107,1295,1108,1296,1114,1302,1119,1308,1122,1311,1123,1312,1186,1260, + 1293,1305, 0,1394, 0, 0, 0, 0, 952,1137, 947,1132,1317,1344,1316,1343, + 1319,1346,1318,1345,1693,1695,1371,1375,1370,1374,1373,1377,1372,1376,1694,1696, + 981,1166, 977,1162, 972,1157,1326,1353,1325,1352,1328,1355,1327,1354,1697,1698, + 1009,1194,1013,1198,1054,1240,1048,1234,1331,1358,1330,1357,1333,1360,1332,1359, + 1699,1700,1396,1401,1395,1400,1398,1403,1397,1402,1399,1404,1094,1281,1087,1274, + 1406,1411,1405,1410,1408,1413,1407,1412,1409,1414,1109,1297,1117,1306,1116,1304, + 1112,1300, 0, 0, 0, 0, 0, 0,1471,1472,1701,1705,1702,1706,1703,1707, + 1430,1431,1715,1719,1716,1720,1717,1721,1477,1478,1729,1731,1730,1732, 0, 0, + 1435,1436,1733,1735,1734,1736, 0, 0,1481,1482,1737,1741,1738,1742,1739,1743, + 1439,1440,1751,1755,1752,1756,1753,1757,1490,1491,1765,1768,1766,1769,1767,1770, + 1447,1448,1771,1774,1772,1775,1773,1776,1495,1496,1777,1779,1778,1780, 0, 0, + 1451,1452,1781,1783,1782,1784, 0, 0,1504,1505,1785,1788,1786,1789,1787,1790, + 0,1459, 0,1791, 0,1792, 0,1793,1509,1510,1794,1798,1795,1799,1796,1800, + 1462,1463,1808,1812,1809,1813,1810,1814,1467, 21,1475, 22,1479, 23,1485, 24, + 1493, 27,1499, 28,1507, 29, 0, 0,1704,1708,1709,1710,1711,1712,1713,1714, + 1718,1722,1723,1724,1725,1726,1727,1728,1740,1744,1745,1746,1747,1748,1749,1750, + 1754,1758,1759,1760,1761,1762,1763,1764,1797,1801,1802,1803,1804,1805,1806,1807, + 1811,1815,1816,1817,1818,1819,1820,1821,1470,1469,1822,1474,1465, 0,1473,1825, + 1429,1428,1426, 12,1432, 0, 26, 0, 0,1315,1823,1484,1466, 0,1483,1829, + 1433, 13,1437, 14,1441,1826,1827,1828,1488,1487,1513, 19, 0, 0,1492,1515, + 1445,1444,1442, 15, 0,1831,1832,1833,1502,1501,1516, 25,1497,1498,1506,1518, + 1457,1456,1454, 17,1453,1313, 11, 3, 0, 0,1824,1512,1519, 0,1511,1830, + 1449, 16,1460, 18,1464, 4, 0, 0, 30, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, + 0, 0, 2, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1834,1835, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1836, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,1837,1839,1838, 0, 0, 0, 0,1840, 0, 0, 0, + 0,1841, 0, 0,1842, 0, 0, 0, 0, 0, 0, 0,1843, 0,1844, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1845, 0, 0,1846, 0, 0,1847, + 0,1848, 0, 0, 0, 0, 0, 0, 937, 0,1850, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,1849, 936, 938,1851,1852, 0, 0,1853,1854, 0, 0, + 1855,1856, 0, 0, 0, 0, 0, 0,1857,1858, 0, 0,1861,1862, 0, 0, + 1863,1864, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1867,1868,1869,1870,1859,1860,1865,1866, 0, 0, 0, 0, + 0, 0,1871,1872,1873,1874, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 32, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1877, 0,1878, 0,1879, 0,1880, 0,1881, 0,1882, 0, + 1883, 0,1884, 0,1885, 0,1886, 0,1887, 0,1888, 0, 0,1889, 0,1890, + 0,1891, 0, 0, 0, 0, 0, 0,1892,1893, 0,1894,1895, 0,1896,1897, + 0,1898,1899, 0,1900,1901, 0, 0, 0, 0, 0, 0,1876, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1902, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1904, 0,1905, 0,1906, 0,1907, 0,1908, 0,1909, 0, + 1910, 0,1911, 0,1912, 0,1913, 0,1914, 0,1915, 0, 0,1916, 0,1917, + 0,1918, 0, 0, 0, 0, 0, 0,1919,1920, 0,1921,1922, 0,1923,1924, + 0,1925,1926, 0,1927,1928, 0, 0, 0, 0, 0, 0,1903, 0, 0,1929, + 1930,1931,1932, 0, 0, 0,1933, 0, 710, 385, 724, 715, 455, 103, 186, 825, + 825, 242, 751, 205, 241, 336, 524, 601, 663, 676, 688, 738, 411, 434, 474, 500, + 649, 746, 799, 108, 180, 416, 482, 662, 810, 275, 462, 658, 692, 344, 618, 679, + 293, 388, 440, 492, 740, 116, 146, 168, 368, 414, 481, 527, 606, 660, 665, 722, + 781, 803, 809, 538, 553, 588, 642, 758, 811, 701, 233, 299, 573, 612, 487, 540, + 714, 779, 232, 267, 412, 445, 457, 585, 594, 766, 167, 613, 149, 148, 560, 589, + 648, 768, 708, 345, 411, 704, 105, 259, 313, 496, 518, 174, 542, 120, 307, 101, + 430, 372, 584, 183, 228, 529, 650, 697, 424, 732, 428, 349, 632, 355, 517, 110, + 135, 147, 403, 580, 624, 700, 750, 170, 193, 245, 297, 374, 463, 543, 763, 801, + 812, 815, 162, 384, 420, 730, 287, 330, 337, 366, 459, 476, 509, 558, 591, 610, + 726, 652, 734, 759, 154, 163, 198, 473, 683, 697, 292, 311, 353, 423, 572, 494, + 113, 217, 259, 280, 314, 499, 506, 603, 608, 752, 778, 782, 788, 117, 557, 748, + 774, 320, 109, 126, 260, 265, 373, 411, 479, 523, 655, 737, 823, 380, 765, 161, + 395, 398, 438, 451, 502, 516, 537, 583, 791, 136, 340, 769, 122, 273, 446, 727, + 305, 322, 400, 496, 771, 155, 190, 269, 377, 391, 406, 432, 501, 519, 599, 684, + 687, 749, 776, 175, 452, 191, 480, 510, 659, 772, 805, 813, 397, 444, 619, 566, + 568, 575, 491, 471, 707, 111, 636, 156, 153, 288, 346, 578, 256, 435, 383, 729, + 680, 767, 694, 295, 128, 210, 0, 0, 227, 0, 379, 0, 0, 150, 493, 525, + 544, 551, 552, 556, 783, 576, 604, 0, 661, 0, 703, 0, 0, 735, 743, 0, + 0, 0, 793, 794, 795, 808, 741, 773, 118, 127, 130, 166, 169, 177, 207, 213, + 215, 226, 229, 268, 270, 317, 327, 329, 335, 369, 375, 381, 404, 441, 448, 458, + 477, 484, 503, 539, 545, 547, 546, 548, 549, 550, 554, 555, 561, 564, 569, 591, + 593, 595, 598, 607, 620, 625, 625, 651, 690, 695, 705, 706, 716, 717, 733, 735, + 777, 786, 790, 315, 869, 623, 0, 0, 102, 145, 134, 115, 129, 138, 165, 171, + 207, 202, 206, 212, 227, 231, 240, 243, 250, 254, 294, 296, 303, 308, 319, 325, + 321, 329, 326, 335, 341, 357, 360, 362, 370, 379, 388, 389, 393, 421, 424, 438, + 456, 454, 458, 465, 477, 535, 485, 490, 493, 507, 512, 514, 521, 522, 525, 526, + 528, 533, 532, 541, 565, 569, 574, 586, 591, 597, 607, 637, 647, 674, 691, 693, + 695, 698, 703, 699, 705, 704, 702, 706, 709, 717, 728, 736, 747, 754, 770, 777, + 783, 784, 786, 787, 790, 802, 825, 848, 847, 857, 55, 65, 66, 883, 892, 916, + 822, 824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,1586, 0,1605, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1602,1603,1934,1935,1574,1575,1576,1577,1579,1580,1581,1583,1584, 0, + 1585,1587,1588,1589,1591, 0,1592, 0,1593,1594, 0,1595,1596, 0,1598,1599, + 1600,1601,1604,1582,1578,1590,1597, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1936, 0,1937, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1938, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1939,1940, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1941,1942, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1944,1943, 0,1945, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1946,1947, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1948, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1949,1950,1951,1952,1953,1954,1955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 939, 940, 941, 942, 946, 948, 0, 962, 969, 970, 971, 976,1001,1002,1003,1008, - 0,1033,1040,1041,1042,1043,1047, 0, 0,1080,1081,1082,1086,1110, 0, 0, - 1124,1125,1126,1127,1131,1133, 0,1147,1154,1155,1156,1161,1187,1188,1189,1193, - 0,1219,1226,1227,1228,1229,1233, 0, 0,1267,1268,1269,1273,1298, 0,1303, - 943,1128, 944,1129, 954,1139, 958,1143, 959,1144, 960,1145, 961,1146, 964,1149, - 0, 0, 973,1158, 974,1159, 975,1160, 983,1168, 978,1163, 988,1173, 990,1175, - 991,1176, 993,1178, 994,1179, 0, 0,1004,1190,1005,1191,1006,1192,1014,1199, - 1007, 0, 0, 0,1016,1201,1020,1206, 0,1022,1208,1025,1211,1023,1209, 0, - 0, 0, 0,1032,1218,1037,1223,1035,1221, 0, 0, 0,1044,1230,1045,1231, - 1049,1235, 0, 0,1058,1244,1064,1250,1060,1246,1066,1252,1067,1253,1072,1258, - 1069,1255,1077,1264,1074,1261, 0, 0,1083,1270,1084,1271,1085,1272,1088,1275, - 1089,1276,1096,1283,1103,1290,1111,1299,1115,1118,1307,1120,1309,1121,1310, 0, - 1053,1239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1093, - 1280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 949,1134,1010, - 1195,1050,1236,1090,1277,1341,1368,1340,1367,1342,1369,1339,1366, 0,1320,1347, - 1418,1419,1323,1350, 0, 0, 992,1177,1018,1204,1055,1241,1416,1417,1415,1424, - 1202, 0, 0, 0, 987,1172, 0, 0,1031,1217,1321,1348,1322,1349,1338,1365, - 950,1135, 951,1136, 979,1164, 980,1165,1011,1196,1012,1197,1051,1237,1052,1238, - 1061,1247,1062,1248,1091,1278,1092,1279,1071,1257,1076,1263, 0, 0, 997,1182, - 0, 0, 0, 0, 0, 0, 945,1130, 982,1167,1337,1364,1335,1362,1046,1232, - 1422,1423,1113,1301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 9, 0, 10,1425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0,1314,1427, 5,1434,1438,1443, 0,1450, 0,1455,1461, - 1514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1446,1458,1468,1476,1480,1486, - 1517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1489,1503,1494,1500,1508, 0, - 0, 0, 0,1520,1521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1526,1528, 0,1525, 0, 0, 0,1522, 0, 0, 0, 0,1536,1532,1539, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1534, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1556, 0, 0, 0, 0, 0, 0, - 1548,1550, 0,1547, 0, 0, 0,1567, 0, 0, 0, 0,1558,1554,1561, 0, - 0, 0, 0, 0, 0, 0,1568,1569, 0, 0, 0, 0, 0, 0, 0, 0, - 0,1529,1551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1523,1545,1524,1546, 0, 0,1527,1549, 0, 0,1570,1571,1530,1552,1531,1553, - 0, 0,1533,1555,1535,1557,1537,1559, 0, 0,1572,1573,1544,1566,1538,1560, - 1540,1562,1541,1563,1542,1564, 0, 0,1543,1565, 0, 0, 0, 0, 0, 0, - 0, 0,1606,1607,1609,1608,1610, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1613, 0,1611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,1612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1620, 0, 0, 0, 0, 0, 0, - 0,1623, 0, 0,1624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,1614,1615,1616,1617,1618,1619,1621,1622, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1628,1629, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1625,1626, 0,1627, - 0, 0, 0,1634, 0, 0,1635, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1630,1631,1632, 0, 0,1633, 0, - 0, 0, 0, 0, 0, 0, 0, 0,1639, 0, 0,1638,1640, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1636,1637, 0, 0, - 0, 0, 0, 0,1641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1642,1644,1643, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,1645, 0, 0, 0, 0, 0, 0, 0, - 1646, 0, 0, 0, 0, 0, 0,1648,1649, 0,1647,1650, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1651,1653,1652, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1654, 0,1655,1657,1656, 0, - 0, 0, 0,1659, 0, 0, 0, 0, 0, 0, 0, 0, 0,1660, 0, 0, - 0, 0,1661, 0, 0, 0, 0,1662, 0, 0, 0, 0,1663, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1658, 0, 0, 0, 0, 0, 0, - 0, 0, 0,1664, 0,1665,1673, 0,1674, 0, 0, 0, 0, 0, 0, 0, - 0,1666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,1668, 0, 0, 0, 0, 0, 0, 0, 0, 0,1669, 0, 0, - 0, 0,1670, 0, 0, 0, 0,1671, 0, 0, 0, 0,1672, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1667, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,1675, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,1676, 0,1677, 0,1678, 0,1679, 0,1680, 0, - 0, 0,1681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1682, 0,1683, 0, 0, - 1684,1685, 0,1686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 953,1138, 955,1140, 956,1141, 957,1142,1324,1351, 963,1148, 965,1150, 968,1153, - 966,1151, 967,1152,1378,1380,1379,1381, 984,1169, 985,1170,1420,1421, 986,1171, - 989,1174, 995,1180, 998,1183, 996,1181, 999,1184,1000,1185,1015,1200,1329,1356, - 1017,1203,1019,1205,1021,1207,1024,1210,1687,1688,1027,1213,1026,1212,1028,1214, - 1029,1215,1030,1216,1034,1220,1036,1222,1039,1225,1038,1224,1334,1361,1336,1363, - 1382,1384,1383,1385,1056,1242,1057,1243,1059,1245,1063,1249,1689,1690,1065,1251, - 1068,1254,1070,1256,1386,1387,1388,1389,1691,1692,1073,1259,1075,1262,1079,1266, - 1078,1265,1095,1282,1098,1285,1097,1284,1390,1391,1392,1393,1099,1286,1100,1287, - 1101,1288,1102,1289,1105,1292,1104,1291,1106,1294,1107,1295,1108,1296,1114,1302, - 1119,1308,1122,1311,1123,1312,1186,1260,1293,1305, 0,1394, 0, 0, 0, 0, - 952,1137, 947,1132,1317,1344,1316,1343,1319,1346,1318,1345,1693,1695,1371,1375, - 1370,1374,1373,1377,1372,1376,1694,1696, 981,1166, 977,1162, 972,1157,1326,1353, - 1325,1352,1328,1355,1327,1354,1697,1698,1009,1194,1013,1198,1054,1240,1048,1234, - 1331,1358,1330,1357,1333,1360,1332,1359,1699,1700,1396,1401,1395,1400,1398,1403, - 1397,1402,1399,1404,1094,1281,1087,1274,1406,1411,1405,1410,1408,1413,1407,1412, - 1409,1414,1109,1297,1117,1306,1116,1304,1112,1300, 0, 0, 0, 0, 0, 0, - 1471,1472,1701,1705,1702,1706,1703,1707,1430,1431,1715,1719,1716,1720,1717,1721, - 1477,1478,1729,1731,1730,1732, 0, 0,1435,1436,1733,1735,1734,1736, 0, 0, - 1481,1482,1737,1741,1738,1742,1739,1743,1439,1440,1751,1755,1752,1756,1753,1757, - 1490,1491,1765,1768,1766,1769,1767,1770,1447,1448,1771,1774,1772,1775,1773,1776, - 1495,1496,1777,1779,1778,1780, 0, 0,1451,1452,1781,1783,1782,1784, 0, 0, - 1504,1505,1785,1788,1786,1789,1787,1790, 0,1459, 0,1791, 0,1792, 0,1793, - 1509,1510,1794,1798,1795,1799,1796,1800,1462,1463,1808,1812,1809,1813,1810,1814, - 1467, 21,1475, 22,1479, 23,1485, 24,1493, 27,1499, 28,1507, 29, 0, 0, - 1704,1708,1709,1710,1711,1712,1713,1714,1718,1722,1723,1724,1725,1726,1727,1728, - 1740,1744,1745,1746,1747,1748,1749,1750,1754,1758,1759,1760,1761,1762,1763,1764, - 1797,1801,1802,1803,1804,1805,1806,1807,1811,1815,1816,1817,1818,1819,1820,1821, - 1470,1469,1822,1474,1465, 0,1473,1825,1429,1428,1426, 12,1432, 0, 26, 0, - 0,1315,1823,1484,1466, 0,1483,1829,1433, 13,1437, 14,1441,1826,1827,1828, - 1488,1487,1513, 19, 0, 0,1492,1515,1445,1444,1442, 15, 0,1831,1832,1833, - 1502,1501,1516, 25,1497,1498,1506,1518,1457,1456,1454, 17,1453,1313, 11, 3, - 0, 0,1824,1512,1519, 0,1511,1830,1449, 16,1460, 18,1464, 4, 0, 0, - 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 2, 6, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1834,1835, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1836, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1837,1839,1838, - 0, 0, 0, 0,1840, 0, 0, 0, 0,1841, 0, 0,1842, 0, 0, 0, - 0, 0, 0, 0,1843, 0,1844, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,1845, 0, 0,1846, 0, 0,1847, 0,1848, 0, 0, 0, 0, 0, 0, - 937, 0,1850, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1849, 936, 938, - 1851,1852, 0, 0,1853,1854, 0, 0,1855,1856, 0, 0, 0, 0, 0, 0, - 1857,1858, 0, 0,1861,1862, 0, 0,1863,1864, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1867,1868,1869,1870, - 1859,1860,1865,1866, 0, 0, 0, 0, 0, 0,1871,1872,1873,1874, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1875, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1877, 0,1878, 0, - 1879, 0,1880, 0,1881, 0,1882, 0,1883, 0,1884, 0,1885, 0,1886, 0, - 1887, 0,1888, 0, 0,1889, 0,1890, 0,1891, 0, 0, 0, 0, 0, 0, - 1892,1893, 0,1894,1895, 0,1896,1897, 0,1898,1899, 0,1900,1901, 0, 0, - 0, 0, 0, 0,1876, 0, 0, 0, 0, 0, 0, 0, 0, 0,1902, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1904, 0,1905, 0, - 1906, 0,1907, 0,1908, 0,1909, 0,1910, 0,1911, 0,1912, 0,1913, 0, - 1914, 0,1915, 0, 0,1916, 0,1917, 0,1918, 0, 0, 0, 0, 0, 0, - 1919,1920, 0,1921,1922, 0,1923,1924, 0,1925,1926, 0,1927,1928, 0, 0, - 0, 0, 0, 0,1903, 0, 0,1929,1930,1931,1932, 0, 0, 0,1933, 0, - 710, 385, 724, 715, 455, 103, 186, 825, 825, 242, 751, 205, 241, 336, 524, 601, - 663, 676, 688, 738, 411, 434, 474, 500, 649, 746, 799, 108, 180, 416, 482, 662, - 810, 275, 462, 658, 692, 344, 618, 679, 293, 388, 440, 492, 740, 116, 146, 168, - 368, 414, 481, 527, 606, 660, 665, 722, 781, 803, 809, 538, 553, 588, 642, 758, - 811, 701, 233, 299, 573, 612, 487, 540, 714, 779, 232, 267, 412, 445, 457, 585, - 594, 766, 167, 613, 149, 148, 560, 589, 648, 768, 708, 345, 411, 704, 105, 259, - 313, 496, 518, 174, 542, 120, 307, 101, 430, 372, 584, 183, 228, 529, 650, 697, - 424, 732, 428, 349, 632, 355, 517, 110, 135, 147, 403, 580, 624, 700, 750, 170, - 193, 245, 297, 374, 463, 543, 763, 801, 812, 815, 162, 384, 420, 730, 287, 330, - 337, 366, 459, 476, 509, 558, 591, 610, 726, 652, 734, 759, 154, 163, 198, 473, - 683, 697, 292, 311, 353, 423, 572, 494, 113, 217, 259, 280, 314, 499, 506, 603, - 608, 752, 778, 782, 788, 117, 557, 748, 774, 320, 109, 126, 260, 265, 373, 411, - 479, 523, 655, 737, 823, 380, 765, 161, 395, 398, 438, 451, 502, 516, 537, 583, - 791, 136, 340, 769, 122, 273, 446, 727, 305, 322, 400, 496, 771, 155, 190, 269, - 377, 391, 406, 432, 501, 519, 599, 684, 687, 749, 776, 175, 452, 191, 480, 510, - 659, 772, 805, 813, 397, 444, 619, 566, 568, 575, 491, 471, 707, 111, 636, 156, - 153, 288, 346, 578, 256, 435, 383, 729, 680, 767, 694, 295, 128, 210, 0, 0, - 227, 0, 379, 0, 0, 150, 493, 525, 544, 551, 552, 556, 783, 576, 604, 0, - 661, 0, 703, 0, 0, 735, 743, 0, 0, 0, 793, 794, 795, 808, 741, 773, - 118, 127, 130, 166, 169, 177, 207, 213, 215, 226, 229, 268, 270, 317, 327, 329, - 335, 369, 375, 381, 404, 441, 448, 458, 477, 484, 503, 539, 545, 547, 546, 548, - 549, 550, 554, 555, 561, 564, 569, 591, 593, 595, 598, 607, 620, 625, 625, 651, - 690, 695, 705, 706, 716, 717, 733, 735, 777, 786, 790, 315, 869, 623, 0, 0, - 102, 145, 134, 115, 129, 138, 165, 171, 207, 202, 206, 212, 227, 231, 240, 243, - 250, 254, 294, 296, 303, 308, 319, 325, 321, 329, 326, 335, 341, 357, 360, 362, - 370, 379, 388, 389, 393, 421, 424, 438, 456, 454, 458, 465, 477, 535, 485, 490, - 493, 507, 512, 514, 521, 522, 525, 526, 528, 533, 532, 541, 565, 569, 574, 586, - 591, 597, 607, 637, 647, 674, 691, 693, 695, 698, 703, 699, 705, 704, 702, 706, - 709, 717, 728, 736, 747, 754, 770, 777, 783, 784, 786, 787, 790, 802, 825, 848, - 847, 857, 55, 65, 66, 883, 892, 916, 822, 824, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1586, 0,1605, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1602,1603,1934,1935,1574,1575, - 1576,1577,1579,1580,1581,1583,1584, 0,1585,1587,1588,1589,1591, 0,1592, 0, - 1593,1594, 0,1595,1596, 0,1598,1599,1600,1601,1604,1582,1578,1590,1597, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1936, 0,1937, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1938, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1939,1940, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1941,1942, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1944,1943, 0,1945, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1946,1947, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,1948, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1949,1950, - 1951,1952,1953,1954,1955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1956,1957,1958,1960,1959, - 1961, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 106, 104, 107, 826, 114, 118, 119, 121, 123, 124, 127, 125, 34, 830, 130, 131, - 132, 137, 827, 35, 133, 139, 829, 142, 143, 112, 144, 145, 924, 151, 152, 37, - 157, 158, 159, 160, 38, 165, 166, 169, 171, 172, 173, 174, 176, 177, 178, 179, - 181, 182, 182, 182, 833, 468, 184, 185, 834, 187, 188, 189, 196, 192, 194, 195, - 197, 199, 200, 201, 203, 204, 204, 206, 208, 209, 211, 218, 213, 219, 214, 216, - 153, 234, 221, 222, 223, 220, 225, 224, 230, 835, 235, 236, 237, 238, 239, 244, - 836, 837, 247, 248, 249, 246, 251, 39, 40, 253, 255, 255, 838, 257, 258, 259, - 261, 839, 262, 263, 301, 264, 41, 266, 270, 272, 271, 841, 274, 842, 277, 276, - 278, 281, 282, 42, 283, 284, 285, 286, 43, 843, 44, 289, 290, 291, 293, 934, - 298, 845, 845, 621, 300, 300, 45, 852, 894, 302, 304, 46, 306, 309, 310, 312, - 316, 48, 47, 317, 846, 318, 323, 324, 325, 324, 328, 329, 333, 331, 332, 334, - 335, 336, 338, 339, 342, 343, 347, 351, 849, 350, 348, 352, 354, 359, 850, 361, - 358, 356, 49, 363, 365, 367, 364, 50, 369, 371, 851, 376, 386, 378, 53, 381, - 52, 51, 140, 141, 387, 382, 614, 78, 388, 389, 390, 394, 392, 856, 54, 399, - 396, 402, 404, 858, 405, 401, 407, 55, 408, 409, 410, 413, 859, 415, 56, 417, - 860, 418, 57, 419, 422, 424, 425, 861, 840, 862, 426, 863, 429, 431, 427, 433, - 437, 441, 438, 439, 442, 443, 864, 436, 449, 450, 58, 454, 453, 865, 447, 460, - 866, 867, 461, 466, 465, 464, 59, 467, 470, 469, 472, 828, 475, 868, 478, 870, - 483, 485, 486, 871, 488, 489, 872, 873, 495, 497, 60, 498, 61, 61, 504, 505, - 507, 508, 511, 62, 513, 874, 515, 875, 518, 844, 520, 876, 877, 878, 63, 64, - 528, 880, 879, 881, 882, 530, 531, 531, 533, 66, 534, 67, 68, 884, 536, 538, - 541, 69, 885, 549, 886, 887, 556, 559, 70, 561, 562, 563, 888, 889, 889, 567, - 71, 890, 570, 571, 72, 891, 577, 73, 581, 579, 582, 893, 587, 74, 590, 592, - 596, 75, 895, 896, 76, 897, 600, 898, 602, 605, 607, 899, 900, 609, 901, 611, - 853, 77, 615, 616, 79, 617, 252, 902, 903, 854, 855, 621, 622, 731, 80, 627, - 626, 628, 164, 629, 630, 631, 633, 904, 632, 634, 639, 640, 635, 641, 646, 651, - 638, 643, 644, 645, 905, 907, 906, 81, 653, 654, 656, 911, 657, 908, 82, 83, - 909, 910, 84, 664, 665, 666, 667, 669, 668, 671, 670, 674, 672, 673, 675, 85, - 677, 678, 86, 681, 682, 912, 685, 686, 87, 689, 36, 913, 914, 88, 89, 696, - 702, 709, 711, 915, 712, 713, 718, 719, 917, 831, 721, 720, 723, 832, 725, 728, - 918, 919, 739, 742, 744, 920, 745, 753, 756, 757, 755, 760, 761, 921, 762, 90, - 764, 922, 91, 775, 279, 780, 923, 925, 92, 93, 785, 926, 94, 927, 787, 787, - 789, 928, 792, 95, 796, 797, 798, 800, 96, 929, 802, 804, 806, 97, 98, 807, - 930, 99, 931, 932, 933, 814, 100, 816, 817, 818, 819, 820, 821, 935, 0, 0, + 0, 0, 0,1956,1957,1958,1960,1959,1961, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 106, 104, 107, 826, 114, 118, 119, 121, + 123, 124, 127, 125, 34, 830, 130, 131, 132, 137, 827, 35, 133, 139, 829, 142, + 143, 112, 144, 145, 924, 151, 152, 37, 157, 158, 159, 160, 38, 165, 166, 169, + 171, 172, 173, 174, 176, 177, 178, 179, 181, 182, 182, 182, 833, 468, 184, 185, + 834, 187, 188, 189, 196, 192, 194, 195, 197, 199, 200, 201, 203, 204, 204, 206, + 208, 209, 211, 218, 213, 219, 214, 216, 153, 234, 221, 222, 223, 220, 225, 224, + 230, 835, 235, 236, 237, 238, 239, 244, 836, 837, 247, 248, 249, 246, 251, 39, + 40, 253, 255, 255, 838, 257, 258, 259, 261, 839, 262, 263, 301, 264, 41, 266, + 270, 272, 271, 841, 274, 842, 277, 276, 278, 281, 282, 42, 283, 284, 285, 286, + 43, 843, 44, 289, 290, 291, 293, 934, 298, 845, 845, 621, 300, 300, 45, 852, + 894, 302, 304, 46, 306, 309, 310, 312, 316, 48, 47, 317, 846, 318, 323, 324, + 325, 324, 328, 329, 333, 331, 332, 334, 335, 336, 338, 339, 342, 343, 347, 351, + 849, 350, 348, 352, 354, 359, 850, 361, 358, 356, 49, 363, 365, 367, 364, 50, + 369, 371, 851, 376, 386, 378, 53, 381, 52, 51, 140, 141, 387, 382, 614, 78, + 388, 389, 390, 394, 392, 856, 54, 399, 396, 402, 404, 858, 405, 401, 407, 55, + 408, 409, 410, 413, 859, 415, 56, 417, 860, 418, 57, 419, 422, 424, 425, 861, + 840, 862, 426, 863, 429, 431, 427, 433, 437, 441, 438, 439, 442, 443, 864, 436, + 449, 450, 58, 454, 453, 865, 447, 460, 866, 867, 461, 466, 465, 464, 59, 467, + 470, 469, 472, 828, 475, 868, 478, 870, 483, 485, 486, 871, 488, 489, 872, 873, + 495, 497, 60, 498, 61, 61, 504, 505, 507, 508, 511, 62, 513, 874, 515, 875, + 518, 844, 520, 876, 877, 878, 63, 64, 528, 880, 879, 881, 882, 530, 531, 531, + 533, 66, 534, 67, 68, 884, 536, 538, 541, 69, 885, 549, 886, 887, 556, 559, + 70, 561, 562, 563, 888, 889, 889, 567, 71, 890, 570, 571, 72, 891, 577, 73, + 581, 579, 582, 893, 587, 74, 590, 592, 596, 75, 895, 896, 76, 897, 600, 898, + 602, 605, 607, 899, 900, 609, 901, 611, 853, 77, 615, 616, 79, 617, 252, 902, + 903, 854, 855, 621, 622, 731, 80, 627, 626, 628, 164, 629, 630, 631, 633, 904, + 632, 634, 639, 640, 635, 641, 646, 651, 638, 643, 644, 645, 905, 907, 906, 81, + 653, 654, 656, 911, 657, 908, 82, 83, 909, 910, 84, 664, 665, 666, 667, 669, + 668, 671, 670, 674, 672, 673, 675, 85, 677, 678, 86, 681, 682, 912, 685, 686, + 87, 689, 36, 913, 914, 88, 89, 696, 702, 709, 711, 915, 712, 713, 718, 719, + 917, 831, 721, 720, 723, 832, 725, 728, 918, 919, 739, 742, 744, 920, 745, 753, + 756, 757, 755, 760, 761, 921, 762, 90, 764, 922, 91, 775, 279, 780, 923, 925, + 92, 93, 785, 926, 94, 927, 787, 787, 789, 928, 792, 95, 796, 797, 798, 800, + 96, 929, 802, 804, 806, 97, 98, 807, 930, 99, 931, 932, 933, 814, 100, 816, + 817, 818, 819, 820, 821, 935, 0, 0, }; static const int16_t _hb_ucd_i16[196] = @@ -4525,12 +4582,12 @@ _hb_ucd_i16[196] = static inline uint_fast8_t _hb_ucd_gc (unsigned u) { - return u<1114110u?_hb_ucd_u8[6664+(((_hb_ucd_u8[1296+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2; + return u<1114110u?_hb_ucd_u8[6800+(((_hb_ucd_u8[1312+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2; } static inline uint_fast8_t _hb_ucd_ccc (unsigned u) { - return u<125259u?_hb_ucd_u8[8612+(((_hb_ucd_u8[8068+(((_hb_ucd_u8[7624+(((_hb_ucd_u8[7288+(((_hb_ucd_u8[7042+(u>>2>>2>>2>>3)])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0; + return u<125259u?_hb_ucd_u8[8792+(((_hb_ucd_u8[8236+(((_hb_ucd_u8[7776+(((_hb_ucd_u8[7424+(((_hb_ucd_u8[7178+(u>>2>>2>>2>>3)])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0; } static inline unsigned _hb_ucd_b4 (const uint8_t* a, unsigned i) @@ -4540,24 +4597,24 @@ _hb_ucd_b4 (const uint8_t* a, unsigned i) static inline int_fast16_t _hb_ucd_bmg (unsigned u) { - return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9356+(((_hb_ucd_u8[9236+(((_hb_ucd_b4(9108+_hb_ucd_u8,u>>2>>3>>3))<<3)+((u>>2>>3)&7u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u)]:0; + return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9540+(((_hb_ucd_u8[9420+(((_hb_ucd_b4(9292+_hb_ucd_u8,u>>2>>3>>3))<<3)+((u>>2>>3)&7u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u)]:0; } static inline uint_fast8_t _hb_ucd_sc (unsigned u) { - return u<918000u?_hb_ucd_u8[10862+(((_hb_ucd_u16[2000+(((_hb_ucd_u8[10142+(((_hb_ucd_u8[9692+(u>>3>>4>>4)])<<4)+((u>>3>>4)&15u))])<<4)+((u>>3)&15u))])<<3)+((u)&7u))]:2; + return u<918000u?_hb_ucd_u8[11062+(((_hb_ucd_u16[2040+(((_hb_ucd_u8[10326+(((_hb_ucd_u8[9876+(u>>3>>4>>4)])<<4)+((u>>3>>4)&15u))])<<4)+((u>>3)&15u))])<<3)+((u)&7u))]:2; } static inline uint_fast16_t _hb_ucd_dm (unsigned u) { - return u<195102u?_hb_ucd_u16[5888+(((_hb_ucd_u8[16764+(((_hb_ucd_u8[16382+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0; + return u<195102u?_hb_ucd_u16[6008+(((_hb_ucd_u8[17068+(((_hb_ucd_u8[16686+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0; } #else static const uint8_t -_hb_ucd_u8[13246] = +_hb_ucd_u8[13370] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 7, 7, 7, 7, 7, 11, 12, 12, 12, 13, @@ -4565,7 +4622,7 @@ _hb_ucd_u8[13246] = 7, 24, 21, 21, 21, 25, 26, 27, 21, 28, 29, 30, 31, 32, 33, 34, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 35, 21, 36, - 7, 7, 37, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 7, 7, 7, 7, 35, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, @@ -4587,7 +4644,7 @@ _hb_ucd_u8[13246] = 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 38, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 37, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, @@ -4610,28 +4667,27 @@ _hb_ucd_u8[13246] = 34, 34,109,110,111,112,113,114,115,116,117,118, 34, 34, 34,119, 120,121,122,123,124,125,126,127, 34,128,129,111,130,131,132,133, 134,135,136,137,138,139,140,111,141,142,111,143,144,145,146,111, - 147,148,149,150,151,152,111,111,153,154,155,156,111,157,111,158, - 34, 34, 34, 34, 34, 34, 34, 34,159, 34, 34,111,111,111,111,111, - 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,160, - 34, 34, 34, 34, 34, 34, 34, 34,161,111,111,111,111,111,111,111, + 147,148,149,150,151,152,153,111,154,155,156,157,111,158,159,160, + 34, 34, 34, 34, 34, 34, 34, 34,161, 34, 34,111,111,111,111,111, + 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,162, + 34, 34, 34, 34, 34, 34, 34, 34,163,111,111,111,111,111,111,111, 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, 111,111,111,111,111,111,111,111, 34, 34, 34, 34, 34,111,111,111, - 34, 34, 34, 34,162,163,164, 34,111,111,111,111,165,166,167,168, + 34, 34, 34, 34,164,165,166, 34,111,111,111,111,167,168,169,170, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,111,111,111,111,111, 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,119, 34, 34, 34, 34, 34, 34,111,111,111,111,111,111,111,111,111,111, - 111,111,111,111,111,111,111,111, 34,169,111,111,111,111,111,111, - 111,111,111,111,111,111,111,111,111,111,111,111,111,111,170, 67, - 67, 67,171,172,173,130, 65,111,174,175,176,177,178,179,180,181, - 67, 67, 67, 67,182,183,111,111,111,111,111,111,111,111,184,111, - 185,111,186,111,111,187,111,111,111,111,111,111,111,111,111, 34, - 34,188,189,111,111,111,111,111,130,190,191,111, 34,192,111,111, - 67, 67,193, 67, 67,111, 67,194, 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67,195,111,111,111,111,111,111,111,111, + 111,111,111,111,111,111,111,111, 34,171,111,111,111,111,111,111, + 111,111,111,111,111,111,111,111,111,111,111,111,111,111,172, 67, + 67, 67,173,174,175,130, 65,111,176,177,178,179,180,181,182,183, + 67, 67, 67, 67,184,185,111,111,111,111,111,111,111,111,186,111, + 187,188,189,111,111,190,111,111,111,191,111,111,111,111,111, 34, + 34,192,193,111,111,111,111,111,130,194,195,111, 34,196,111,111, + 67, 67,197, 67, 67,111, 67,198, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67,199,111,111,111,111,111,111,111,111, 34, 34, 34, 34, 34, 34, 34, 34,111,111,111,111,111,111,111,111, 34, 34, 34, 34, 34,111,111,111,111,111,111,111,111,111,111,111, - 34, 34, 34, 34, 34, 34, 34,111,111,111,111,111,111,111,111,111, - 196,111,185,185,111,111,111,111,111,111,111,111,111,111,111,111, + 200,111,188,188,111,111,111,111,111,111,111,111,111,111,111,111, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 2, 4, 5, 6, 2, 7, 7, 7, 7, 7, 2, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, @@ -4687,7 +4743,7 @@ _hb_ucd_u8[13246] = 36, 36, 36, 36, 36, 36, 65, 43, 77, 78, 78, 43, 43, 43, 43, 43, 43, 43, 43, 43, 36, 36, 36, 36, 7, 7, 7, 85, 27, 27, 27, 84, 64, 78, 66, 36, 36, 36, 36, 36, 78, 78, 78, 77, 78, 78, 43, 43, - 43, 43, 77, 78, 78, 78, 81, 36, 86, 36, 36, 36, 36, 36, 36, 36, + 43, 43, 77, 78, 78, 78, 81, 36, 86, 82, 78, 78, 78, 78, 78, 78, 43, 78, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 64, 65, 78, 79, 43, 43, 78, 78, 78, 79, 71, 61, 61, 36, 82, 27, 27, 27, 87, 27, 27, 27, 27, 84, 36, 36, 36, 36, 36, 36, 36, 36, 43, 43, 77, @@ -4827,7 +4883,7 @@ _hb_ucd_u8[13246] = 36, 64, 2, 36, 36, 36, 36, 36, 36, 82, 78, 43, 43, 43, 43, 77, 81, 36, 58, 2, 56, 43, 57, 79, 7, 7, 7, 7, 7, 58, 58, 2, 90, 27, 27, 27, 27, 27, 27, 27, 36, 36, 36, 36, 36, 36, 78, 79, - 43, 78, 77, 43, 2, 2, 2, 43, 36, 36, 36, 36, 36, 36, 36, 64, + 43, 78, 77, 43, 2, 2, 2, 65, 36, 36, 36, 36, 36, 36, 36, 64, 77, 78, 78, 78, 78, 78, 78, 78, 36, 36, 36, 82, 78, 78, 81, 36, 36, 78, 78, 43, 43, 43, 43, 43, 36, 36, 82, 78, 43, 43, 43, 43, 78, 43, 77, 65, 36, 58, 2, 2, 7, 7, 7, 7, 7, 2, 2, 65, @@ -4848,8 +4904,10 @@ _hb_ucd_u8[13246] = 43, 43, 43, 43, 77, 43, 43, 43, 77, 43, 79, 43, 43, 43, 43, 43, 43, 43, 43, 64, 43, 43, 43, 43, 36, 36, 36, 36, 36, 78, 78, 78, 43, 77, 79, 79, 36, 36, 36, 36, 36, 64, 77, 97, 2, 2, 2, 2, - 27, 27, 84, 61, 61, 61, 53, 20,150, 61, 61, 61, 61, 61, 61, 61, - 61, 61, 61, 61, 61, 61, 61, 21, 43, 43, 57, 2, 2, 2, 2, 2, + 43, 82, 36, 36, 36, 36, 36, 36, 36, 36, 78, 43, 43, 43, 43, 78, + 77, 57, 2, 2, 2, 2, 2, 2, 27, 27, 84, 61, 61, 61, 53, 20, + 150, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 21, + 65, 36, 36, 64, 43, 43, 43, 43, 43, 43, 57, 2, 2, 2, 2, 2, 43, 43, 43, 57, 2, 2, 61, 61, 40, 40, 89, 61, 61, 61, 61, 61, 7, 7, 7, 7, 7,167, 27, 27, 27, 87, 36, 36, 36, 36, 36, 36, 27, 27, 27, 30, 2, 2, 2, 2, 82, 78, 78, 78, 78, 78, 78, 78, @@ -4872,462 +4930,469 @@ _hb_ucd_u8[13246] = 16, 16, 16, 16, 16, 39, 16, 16, 43, 43, 43, 68, 40, 40, 40, 40, 7, 7, 7, 7, 7, 7, 7, 71, 36, 36, 36, 36, 36, 36, 36, 43, 36, 36, 36, 36, 36, 36, 43, 43, 7, 7, 7, 7, 7, 7, 7,170, - 16, 16, 43, 43, 43, 68, 40, 40, 27, 27, 27, 27, 27, 27,145, 27, - 171, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,145, - 27, 27, 27, 27, 27, 27, 84, 61, 61, 61, 61, 61, 61, 25, 41, 41, - 0, 0, 29, 21, 21, 21, 23, 21, 22, 18, 21, 25, 21, 17, 13, 13, - 25, 25, 25, 21, 21, 9, 9, 9, 9, 22, 21, 18, 24, 16, 24, 5, - 5, 5, 5, 22, 25, 18, 25, 0, 23, 23, 26, 21, 24, 26, 7, 20, - 25, 1, 26, 24, 26, 25, 15, 15, 24, 15, 7, 19, 15, 21, 9, 25, - 9, 5, 5, 25, 5, 9, 5, 7, 7, 7, 9, 8, 8, 5, 7, 5, - 6, 6, 24, 24, 6, 24, 12, 12, 6, 5, 9, 21, 25, 9, 26, 12, - 11, 11, 9, 6, 5, 21, 17, 17, 17, 26, 26, 23, 23, 12, 17, 12, - 21, 12, 12, 21, 7, 21, 1, 1, 21, 23, 26, 26, 1, 21, 6, 7, - 7, 12, 12, 7, 21, 7, 12, 1, 12, 6, 6, 12, 12, 26, 7, 26, - 26, 7, 21, 1, 24, 7, 7, 6, 1, 12, 12, 10, 10, 10, 10, 12, - 21, 6, 10, 7, 7, 10, 23, 7, 15, 26, 13, 21, 13, 7, 15, 7, - 12, 23, 21, 26, 21, 15, 17, 7, 29, 7, 7, 22, 18, 18, 14, 14, - 14, 7, 10, 21, 17, 21, 11, 12, 5, 6, 8, 8, 8, 24, 5, 24, - 9, 24, 29, 29, 29, 1, 20, 19, 22, 20, 27, 28, 1, 29, 21, 20, - 19, 21, 21, 16, 16, 21, 25, 22, 18, 21, 21, 29, 15, 6, 18, 6, - 12, 11, 9, 26, 26, 9, 26, 5, 5, 26, 14, 9, 5, 14, 14, 15, - 25, 26, 26, 22, 18, 26, 18, 25, 18, 22, 5, 12, 22, 21, 21, 22, - 18, 17, 26, 6, 7, 14, 17, 22, 26, 14, 17, 6, 14, 6, 12, 24, - 24, 6, 26, 15, 6, 21, 11, 21, 24, 9, 6, 9, 23, 26, 6, 10, - 4, 4, 3, 3, 7, 25, 17, 16, 16, 22, 16, 16, 25, 17, 7, 1, - 25, 24, 26, 1, 2, 2, 12, 15, 21, 14, 7, 15, 12, 17, 13, 15, - 26, 10, 10, 1, 13, 23, 23, 15, 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 0, 10, 11, 12, 13, 0, 14, 0, 0, 0, 0, 0, 15, 0, - 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 36, 36, 36, 36, 36, 75, 43, 43, 16, 16, 43, 43, 43, 68, 40, 40, + 27, 27, 27, 27, 27, 27,145, 27,171, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27,145, 27, 27, 27, 27, 27, 27, 84, 61, + 61, 61, 61, 61, 61, 25, 41, 41, 0, 0, 29, 21, 21, 21, 23, 21, + 22, 18, 21, 25, 21, 17, 13, 13, 25, 25, 25, 21, 21, 9, 9, 9, + 9, 22, 21, 18, 24, 16, 24, 5, 5, 5, 5, 22, 25, 18, 25, 0, + 23, 23, 26, 21, 24, 26, 7, 20, 25, 1, 26, 24, 26, 25, 15, 15, + 24, 15, 7, 19, 15, 21, 9, 25, 9, 5, 5, 25, 5, 9, 5, 7, + 7, 7, 9, 8, 8, 5, 7, 5, 6, 6, 24, 24, 6, 24, 12, 12, + 6, 5, 9, 21, 25, 9, 26, 12, 11, 11, 9, 6, 5, 21, 17, 17, + 17, 26, 26, 23, 23, 12, 17, 12, 21, 12, 12, 21, 7, 21, 1, 1, + 21, 23, 26, 26, 1, 21, 6, 7, 7, 12, 12, 7, 21, 7, 12, 1, + 12, 6, 6, 12, 12, 26, 7, 26, 26, 7, 21, 1, 24, 7, 7, 6, + 1, 12, 12, 10, 10, 10, 10, 12, 21, 6, 10, 7, 7, 10, 23, 7, + 15, 26, 13, 21, 13, 7, 15, 7, 12, 23, 21, 26, 21, 15, 17, 7, + 29, 7, 7, 22, 18, 18, 14, 14, 14, 7, 10, 21, 17, 21, 11, 12, + 5, 6, 8, 8, 8, 24, 5, 24, 9, 24, 29, 29, 29, 1, 20, 19, + 22, 20, 27, 28, 1, 29, 21, 20, 19, 21, 21, 16, 16, 21, 25, 22, + 18, 21, 21, 29, 15, 6, 18, 6, 12, 11, 9, 26, 26, 9, 26, 5, + 5, 26, 14, 9, 5, 14, 14, 15, 25, 26, 26, 22, 18, 26, 18, 25, + 18, 22, 5, 12, 22, 21, 21, 22, 18, 17, 26, 6, 7, 14, 17, 22, + 26, 14, 17, 6, 14, 6, 12, 24, 24, 6, 26, 15, 6, 21, 11, 21, + 24, 9, 6, 9, 23, 26, 6, 10, 4, 4, 3, 3, 7, 25, 17, 16, + 16, 22, 16, 16, 25, 17, 7, 1, 25, 24, 26, 1, 2, 2, 12, 15, + 21, 14, 7, 15, 12, 17, 13, 15, 26, 10, 10, 1, 13, 23, 23, 15, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 10, 11, 12, 13, 0, + 14, 0, 0, 0, 0, 0, 15, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 20, 0, 21, 22, 23, 0, 0, 0, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 21, + 22, 23, 0, 0, 0, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 35, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 37, 38, 0, 0, 0, 0, 0, 0, 39, 40, 0, 0, 41, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, - 3, 0, 0, 0, 4, 5, 6, 7, 0, 8, 9, 10, 0, 11, 12, 13, - 14, 15, 16, 17, 16, 18, 16, 19, 16, 19, 16, 19, 0, 19, 16, 20, - 16, 19, 21, 19, 0, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 0, - 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, - 0, 0, 34, 0, 0, 35, 0, 0, 36, 0, 37, 0, 0, 0, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 0, 0, 47, 0, 0, 0, 48, 0, 0, - 0, 49, 0, 0, 0, 0, 0, 0, 0, 50, 0, 51, 0, 52, 53, 0, - 54, 0, 0, 0, 0, 0, 0, 55, 56, 57, 0, 0, 0, 0, 58, 0, - 0, 59, 60, 61, 62, 63, 0, 0, 64, 65, 0, 0, 0, 66, 0, 0, - 0, 0, 67, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 0, 72, 0, - 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 0, 0, - 75, 0, 0, 76, 77, 0, 0, 78, 79, 0, 80, 62, 0, 81, 82, 0, - 0, 83, 84, 85, 0, 0, 0, 86, 0, 87, 0, 0, 51, 88, 51, 0, - 89, 0, 90, 0, 0, 0, 79, 0, 0, 0, 91, 92, 0, 93, 94, 95, - 96, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 97, 98, 0, 0, 0, - 0, 99,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,101, 0, 0, - 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,103,104, 0, 0,105, - 0, 0, 0, 0, 0, 0,106, 0, 0, 0,100, 0, 0, 0, 0, 0, - 107,108, 0, 0, 0, 0, 0, 0, 0,109, 0,110, 0, 0, 0, 0, - 0, 0, 1, 2, 3, 4, 5, 6, 7, 0, 8, 0, 0, 0, 0, 9, - 10, 11, 12, 0, 0, 0, 0, 13, 0, 0, 14, 15, 0, 16, 0, 17, - 18, 0, 0, 19, 0, 20, 21, 0, 0, 0, 0, 0, 22, 23, 0, 24, - 25, 0, 0, 26, 0, 0, 0, 27, 0, 0, 28, 29, 30, 31, 0, 0, - 0, 32, 33, 34, 0, 0, 33, 0, 0, 35, 33, 0, 0, 0, 33, 36, - 0, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 39, 40, 0, - 0, 0, 0, 0, 0, 41, 42, 0, 0, 0, 0, 43, 0, 44, 0, 0, - 0, 45, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 48, 49, 0, - 0, 0, 0, 50, 0, 0, 0, 51, 0, 52, 0, 53, 0, 0, 0, 0, - 54, 0, 0, 0, 0, 55, 0, 56, 0, 0, 0, 0, 57, 58, 0, 0, - 0, 59, 60, 0, 0, 0, 0, 0, 0, 61, 52, 0, 62, 63, 0, 0, - 64, 0, 0, 0, 65, 66, 0, 0, 0, 67, 0, 68, 69, 70, 71, 72, - 1, 73, 0, 74, 75, 76, 0, 0, 77, 78, 0, 0, 0, 79, 0, 0, - 1, 1, 0, 0, 80, 0, 0, 81, 0, 0, 0, 0, 77, 82, 0, 83, - 0, 0, 0, 0, 0, 78, 84, 0, 85, 0, 52, 0, 1, 78, 0, 0, - 86, 0, 0, 87, 0, 0, 0, 0, 0, 88, 57, 0, 0, 0, 0, 0, - 0, 89, 90, 0, 0, 84, 0, 0, 33, 0, 0, 91, 0, 0, 0, 0, - 92, 0, 0, 0, 0, 49, 0, 0, 93, 0, 0, 0, 0, 94, 95, 0, - 0, 96, 0, 0, 97, 0, 0, 0, 98, 0, 0, 0, 99, 0,100, 93, - 0, 0,101, 0, 0, 0, 84, 0, 0,102, 0, 0, 0,103,104, 0, - 0,105,106, 0, 0, 0, 0, 0, 0,107, 0, 0,108, 0, 0, 0, - 0,109, 33, 0,110,111,112, 35, 0, 0,113, 0, 0, 0,114, 0, - 0, 0, 0, 0, 0,115, 0, 0,116, 0, 0, 0, 0,117, 88, 0, - 0, 0, 0, 0, 57, 0, 0, 0, 0, 52,118, 0, 0, 0, 0,119, - 0, 0,120, 0, 0, 0, 0,118, 0, 0, 0, 0, 0,121, 0, 0, - 0,122, 0, 0, 0,123, 0,124, 0, 0, 0, 0,125,126,127, 0, - 128, 0,129, 0, 0, 0,130,131,132, 0, 0, 0, 35, 0, 0, 0, - 133, 0, 0,134, 0, 0,135, 0, 0, 0, 0, 0, 0, 0, 1, 1, - 1, 1, 1, 2, 3, 4, 5, 6, 7, 4, 4, 8, 9, 10, 1, 11, - 12, 13, 14, 15, 16, 17, 18, 1, 1, 1, 19, 1, 0, 0, 20, 21, - 22, 1, 23, 4, 21, 24, 25, 26, 27, 28, 29, 30, 0, 0, 1, 1, - 31, 0, 0, 0, 32, 33, 34, 35, 1, 36, 37, 0, 0, 0, 0, 38, - 1, 39, 14, 39, 40, 41, 42, 0, 0, 0, 43, 36, 44, 45, 21, 45, - 46, 0, 0, 0, 19, 1, 21, 0, 0, 47, 0, 38, 48, 1, 1, 49, - 49, 50, 0, 0, 51, 0, 0, 0, 52, 1, 0, 0, 38, 14, 4, 1, - 1, 1, 53, 21, 43, 52, 54, 21, 35, 1, 0, 0, 0, 55, 0, 0, - 0, 56, 57, 58, 0, 0, 0, 0, 0, 59, 0, 60, 0, 0, 0, 0, - 61, 62, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 65, 0, 0, 0, - 66, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 69, 70, 0, 71, 72, - 73, 74, 75, 76, 0, 0, 0, 77, 0, 0, 0, 78, 79, 0, 0, 0, - 0, 47, 0, 0, 0, 49, 0, 80, 0, 0, 0, 62, 0, 0, 63, 0, - 0, 81, 0, 0, 82, 0, 0, 0, 83, 0, 0, 19, 84, 0, 62, 0, - 0, 0, 0, 49, 1, 85, 1, 52, 15, 86, 36, 10, 21, 87, 0, 55, - 0, 0, 0, 0, 19, 10, 1, 0, 0, 0, 0, 0, 88, 0, 0, 89, - 0, 0, 88, 0, 0, 0, 0, 78, 0, 0, 87, 9, 12, 4, 90, 8, - 91, 47, 0, 58, 50, 0, 21, 1, 21, 92, 93, 1, 1, 1, 1, 94, - 95, 96, 97, 1, 98, 58, 81, 99,100, 4, 58, 0, 0, 0, 0, 0, - 0, 19, 50, 0, 0, 0, 0, 0, 0, 61, 0, 0,101,102, 0, 0, - 103, 0, 0, 1, 1, 50, 0, 0, 0, 38, 0, 63, 0, 0, 0, 0, - 0, 62, 0, 0,104, 68, 61, 0, 0, 0, 78, 0, 0, 0,105,106, - 58, 38, 81, 0, 0, 0, 0, 0, 0,107, 1, 14, 4, 12, 84, 0, - 0, 0, 0, 38, 87, 0, 0, 0, 0,108, 0, 0,109, 61, 0,110, - 0, 0, 0, 1, 0, 0, 0, 0, 19, 58, 0,111, 14, 52,112, 41, - 0, 0, 62, 0, 0, 61, 0, 0,113, 0, 87, 0, 0, 0, 61, 62, - 0, 0, 62, 0, 89, 0, 0,113, 0, 0, 0, 0,114, 0, 0, 0, - 78, 55, 0, 38, 1, 58, 1, 58, 0, 0, 63, 89, 0, 0,115, 0, - 0, 0, 55, 0, 0, 0, 0,115, 0, 0, 0, 0, 61, 0, 0, 0, - 0, 79, 0, 61, 0, 0, 0, 0, 56, 0, 89, 80, 0, 0, 8, 91, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 38, 39, 0, 0, 0, 0, 0, 0, + 40, 41, 42, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 2, 0, 0, 0, 0, 3, 0, 0, 0, 4, 5, 6, 7, + 0, 8, 9, 10, 0, 11, 12, 13, 14, 15, 16, 17, 16, 18, 16, 19, + 16, 19, 16, 19, 0, 19, 16, 20, 16, 19, 21, 19, 0, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 34, 0, 0, 35, 0, 0, + 36, 0, 37, 0, 0, 0, 38, 39, 40, 41, 42, 43, 44, 45, 46, 0, + 0, 47, 0, 0, 0, 48, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, + 0, 50, 0, 51, 0, 52, 53, 0, 54, 0, 0, 0, 0, 0, 0, 55, + 56, 57, 0, 0, 0, 0, 58, 0, 0, 59, 60, 61, 62, 63, 0, 0, + 64, 65, 0, 0, 0, 66, 0, 0, 0, 0, 67, 0, 0, 0, 68, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, + 0, 70, 0, 71, 0, 0, 72, 0, 0, 73, 0, 0, 0, 0, 0, 0, + 0, 0, 74, 0, 0, 0, 0, 0, 75, 76, 0, 77, 78, 0, 0, 79, + 80, 0, 81, 62, 0, 82, 83, 0, 0, 84, 85, 86, 0, 0, 0, 87, + 0, 88, 0, 0, 51, 89, 51, 0, 90, 0, 91, 0, 0, 0, 80, 0, + 0, 0, 92, 93, 0, 94, 95, 96, 97, 0, 0, 0, 0, 0, 51, 0, + 0, 0, 0, 98, 99, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, + 0,101,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,103, 0, 0, + 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,105,106, 0, 0,107, + 0, 0, 0, 0, 0, 0,108, 0,109, 0,102, 0, 0, 0, 0, 0, + 110,111, 0, 0, 0, 0, 0, 0, 0,112, 0, 0, 0, 0, 0, 0, + 0,113, 0,114, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, + 7, 0, 8, 0, 0, 0, 0, 9, 10, 11, 12, 0, 0, 0, 0, 13, + 0, 0, 14, 15, 0, 16, 0, 17, 18, 0, 0, 19, 0, 20, 21, 0, + 0, 0, 0, 0, 22, 23, 0, 24, 25, 0, 0, 26, 0, 0, 0, 27, + 0, 0, 28, 29, 30, 31, 0, 0, 0, 32, 33, 34, 0, 0, 33, 0, + 0, 35, 33, 0, 0, 0, 33, 36, 0, 0, 0, 0, 0, 37, 38, 0, + 0, 0, 0, 0, 0, 39, 40, 0, 0, 0, 0, 0, 0, 41, 42, 0, + 0, 0, 0, 43, 0, 44, 0, 0, 0, 45, 46, 0, 0, 0, 47, 0, + 0, 0, 0, 0, 0, 48, 49, 0, 0, 0, 0, 50, 0, 0, 0, 51, + 0, 52, 0, 53, 0, 0, 0, 0, 54, 0, 0, 0, 0, 55, 0, 56, + 0, 0, 0, 0, 57, 58, 0, 0, 0, 59, 60, 0, 0, 0, 0, 0, + 0, 61, 52, 0, 62, 63, 0, 0, 64, 0, 0, 0, 65, 66, 0, 0, + 0, 67, 0, 68, 69, 70, 71, 72, 1, 73, 0, 74, 75, 76, 0, 0, + 77, 78, 0, 0, 0, 79, 0, 0, 1, 1, 0, 0, 80, 0, 0, 81, + 0, 0, 0, 0, 77, 82, 0, 83, 0, 0, 0, 0, 0, 78, 84, 0, + 85, 0, 52, 0, 1, 78, 0, 0, 86, 0, 0, 87, 0, 0, 0, 0, + 0, 88, 57, 0, 0, 0, 0, 0, 0, 89, 90, 0, 0, 84, 0, 0, + 33, 0, 0, 91, 0, 0, 0, 0, 92, 0, 0, 0, 0, 49, 0, 0, + 93, 0, 0, 0, 0, 94, 95, 0, 0, 96, 0, 0, 97, 0, 0, 0, + 98, 0, 0, 0, 99, 0, 0, 0, 0,100,101, 93, 0, 0,102, 0, + 0, 0, 84, 0, 0,103, 0, 0, 0,104,105, 0, 0,106,107, 0, + 0, 0, 0, 0, 0,108, 0, 0,109, 0, 0, 0, 0,110, 33, 0, + 111,112,113, 35, 0, 0,114, 0, 0, 0,115, 0, 0, 0, 0, 0, + 0,116, 0, 0,117, 0, 0, 0, 0,118, 88, 0, 0, 0, 0, 0, + 57, 0, 0, 0, 0, 52,119, 0, 0, 0, 0,120, 0, 0,121, 0, + 0, 0, 0,119, 0, 0,122, 0, 0, 0, 0, 0, 0,123, 0, 0, + 0,124, 0, 0, 0,125, 0,126, 0, 0, 0, 0,127,128,129, 0, + 130, 0,131, 0, 0, 0,132,133,134, 0, 77, 0, 0, 0, 0, 0, + 35, 0, 0, 0,135, 0, 0, 0,136, 0, 0,137, 0, 0,138, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, + 7, 4, 4, 8, 9, 10, 1, 11, 12, 13, 14, 15, 16, 17, 18, 1, + 1, 1, 19, 1, 0, 0, 20, 21, 22, 1, 23, 4, 21, 24, 25, 26, + 27, 28, 29, 30, 0, 0, 1, 1, 31, 0, 0, 0, 32, 33, 34, 35, + 1, 36, 37, 0, 0, 0, 0, 38, 1, 39, 14, 39, 40, 41, 42, 0, + 0, 0, 43, 36, 44, 45, 21, 45, 46, 0, 0, 0, 19, 1, 21, 0, + 0, 47, 0, 38, 48, 1, 1, 49, 49, 50, 0, 0, 51, 0, 0, 0, + 52, 1, 0, 0, 38, 14, 4, 1, 1, 1, 53, 21, 43, 52, 54, 21, + 35, 1, 0, 0, 0, 55, 0, 0, 0, 56, 57, 58, 0, 0, 0, 0, + 0, 59, 0, 60, 0, 0, 0, 0, 61, 62, 0, 0, 63, 0, 0, 0, + 64, 0, 0, 0, 65, 0, 0, 0, 66, 0, 0, 0, 67, 0, 0, 0, + 68, 0, 0, 69, 70, 0, 71, 72, 73, 74, 75, 76, 0, 0, 0, 77, + 0, 0, 0, 78, 79, 0, 0, 0, 0, 47, 0, 0, 0, 49, 0, 80, + 0, 0, 0, 62, 0, 0, 63, 0, 0, 81, 0, 0, 82, 0, 0, 0, + 83, 0, 0, 19, 84, 0, 62, 0, 0, 0, 0, 49, 1, 85, 1, 52, + 15, 86, 36, 10, 21, 87, 0, 55, 0, 0, 0, 0, 19, 10, 1, 0, + 0, 0, 0, 0, 88, 0, 0, 89, 0, 0, 88, 0, 0, 0, 0, 78, + 0, 0, 87, 9, 12, 4, 90, 8, 91, 47, 0, 58, 50, 0, 21, 1, + 21, 92, 93, 1, 1, 1, 1, 94, 95, 96, 97, 1, 98, 58, 81, 99, + 100, 4, 58, 0, 0, 0, 0, 0, 0, 19, 50, 0, 0, 0, 0, 0, + 0, 61, 0, 0,101,102, 0, 0,103, 0, 0, 1, 1, 50, 0, 0, + 0, 38, 0, 63, 0, 0, 0, 0, 0, 62, 0, 0,104, 68, 61, 0, + 0, 0, 78, 0, 0, 0,105,106, 58, 38, 81, 0, 0, 0, 0, 0, + 0,107, 1, 14, 4, 12, 84, 0, 0, 0, 0, 38, 87, 0, 0, 0, + 0,108, 0, 0,109, 61, 0,110, 0, 0, 0, 1, 0, 0, 0, 0, + 19, 58, 0, 0, 0, 51, 0,111, 14, 52,112, 41, 0, 0, 62, 0, + 0, 61, 0, 0,113, 0, 87, 0, 0, 0, 61, 62, 0, 0, 62, 0, + 89, 0, 0,113, 0, 0, 0, 0,114, 0, 0, 0, 78, 55, 0, 38, + 1, 58, 1, 58, 0, 0, 63, 89, 0, 0,115, 0, 0, 0, 55, 0, + 0, 0, 0,115, 0, 0, 0, 0, 61, 0, 0, 0, 0, 79, 0, 61, + 0, 0, 0, 0, 56, 0, 89, 80, 0, 0, 79, 0, 0, 0, 8, 91, 0, 0, 1, 87, 0, 0,116, 0, 0, 0, 0, 0, 0,117, 0,118, 119,120,121, 0,104, 4,122, 49, 23, 0, 0, 0, 38, 50, 38, 58, 0, 0, 1, 87, 1, 1, 1, 1, 39, 1, 48,105, 87, 0, 0, 0, - 0, 1, 4,122, 0, 0, 0, 1,123, 0, 0, 0, 0, 0,230,230, - 230,230,230,232,220,220,220,220,232,216,220,220,220,220,220,202, - 202,220,220,220,220,202,202,220,220,220, 1, 1, 1, 1, 1,220, - 220,220,220,230,230,230,230,240,230,220,220,220,230,230,230,220, - 220, 0,230,230,230,220,220,220,220,230,232,220,220,230,233,234, - 234,233,234,234,233,230, 0, 0, 0,230, 0,220,230,230,230,230, - 220,230,230,230,222,220,230,230,220,220,230,222,228,230, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 0, 23, 0, 24, - 25, 0,230,220, 0, 18, 30, 31, 32, 0, 0, 0, 0, 27, 28, 29, - 30, 31, 32, 33, 34,230,230,220,220,230,220,230,230,220, 35, 0, - 0, 0, 0, 0,230,230,230, 0, 0,230,230, 0,220,230,230,220, - 0, 0, 0, 36, 0, 0,230,220,230,230,220,220,230,220,220,230, - 220,230,220,230,230, 0, 0,220, 0, 0,230,230, 0,230, 0,230, - 230,230,230,230, 0, 0, 0,220,220,220,230,220,220,220,230,230, - 0,220, 27, 28, 29,230, 7, 0, 0, 0, 0, 9, 0, 0, 0,230, - 220,230,230, 0, 0, 0, 0, 0,230, 0, 0, 84, 91, 0, 0, 0, - 0, 9, 9, 0, 0, 0, 0, 0, 9, 0,103,103, 9, 0,107,107, - 107,107,118,118, 9, 0,122,122,122,122,220,220, 0, 0, 0,220, - 0,220, 0,216, 0, 0, 0,129,130, 0,132, 0, 0, 0, 0, 0, - 130,130,130,130, 0, 0,130, 0,230,230, 9, 0,230,230, 0, 0, - 220, 0, 0, 0, 0, 7, 0, 9, 9, 0, 9, 9, 0, 0, 0,230, - 0, 0, 0,228, 0, 0, 0,222,230,220,220, 0, 0, 0,230, 0, - 0,220,230,220, 0,220,230,230,230, 0, 0, 0, 9, 9, 0, 0, - 7, 0,230, 0, 1, 1, 1, 0, 0, 0,230,234,214,220,202,230, - 230,230,230,230,232,228,228,220,218,230,233,220,230,220,230,230, - 1, 1, 1, 1, 1,230, 0, 1, 1,230,220,230, 1, 1, 0, 0, - 218,228,232,222,224,224, 0, 8, 8, 0, 0, 0, 0,220,230, 0, - 230,230,220, 0, 0,230, 0, 0, 26, 0, 0,220, 0,230,230, 1, - 220, 0, 0,230,220, 0, 0, 0,220,220, 0, 0,230,220, 0, 9, - 7, 0, 0, 7, 9, 0, 0, 0, 9, 7, 6, 6, 0, 0, 0, 0, - 1, 0, 0,216,216, 1, 1, 1, 0, 0, 0,226,216,216,216,216, - 216, 0,220,220,220, 0,230,230, 7, 0, 16, 17, 17, 33, 17, 49, - 17, 17, 84, 97,135,145, 26, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 0, 1, 0, 0, 0,123, 4,122, 0, 0, 0, 1,124, 0, 0, 0, + 0, 0,230,230,230,230,230,232,220,220,220,220,232,216,220,220, + 220,220,220,202,202,220,220,220,220,202,202,220,220,220, 1, 1, + 1, 1, 1,220,220,220,220,230,230,230,230,240,230,220,220,220, + 230,230,230,220,220, 0,230,230,230,220,220,220,220,230,232,220, + 220,230,233,234,234,233,234,234,233,230, 0, 0, 0,230, 0,220, + 230,230,230,230,220,230,230,230,222,220,230,230,220,220,230,222, + 228,230, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, + 0, 23, 0, 24, 25, 0,230,220, 0, 18, 30, 31, 32, 0, 0, 0, + 0, 27, 28, 29, 30, 31, 32, 33, 34,230,230,220,220,230,220,230, + 230,220, 35, 0, 0, 0, 0, 0,230,230,230, 0, 0,230,230, 0, + 220,230,230,220, 0, 0, 0, 36, 0, 0,230,220,230,230,220,220, + 230,220,220,230,220,230,220,230,230, 0, 0,220, 0, 0,230,230, + 0,230, 0,230,230,230,230,230, 0, 0, 0,220,220,220,230,220, + 220,220,230,230, 0,220, 27, 28, 29,230, 7, 0, 0, 0, 0, 9, + 0, 0, 0,230,220,230,230, 0, 0, 0, 0, 0,230, 0, 0, 84, + 91, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 9, 0,103,103, + 9, 0,107,107,107,107,118,118, 9, 0,122,122,122,122,220,220, + 0, 0, 0,220, 0,220, 0,216, 0, 0, 0,129,130, 0,132, 0, + 0, 0, 0, 0,130,130,130,130, 0, 0,130, 0,230,230, 9, 0, + 230,230, 0, 0,220, 0, 0, 0, 0, 7, 0, 9, 9, 0, 9, 9, + 0, 0, 0,230, 0, 0, 0,228, 0, 0, 0,222,230,220,220, 0, + 0, 0,230, 0, 0,220,230,220, 0,220,230,230,230, 0, 0, 0, + 9, 9, 0, 0, 7, 0,230, 0, 1, 1, 1, 0, 0, 0,230,234, + 214,220,202,230,230,230,230,230,232,228,228,220,218,230,233,220, + 230,220,230,230, 1, 1, 1, 1, 1,230, 0, 1, 1,230,220,230, + 1, 1, 0, 0,218,228,232,222,224,224, 0, 8, 8, 0, 0, 0, + 0,220,230, 0,230,230,220, 0, 0,230, 0, 0, 26, 0, 0,220, + 0,230,230, 1,220, 0, 0,230,220, 0, 0, 0,220,220, 0, 0, + 230,220, 0, 9, 7, 0, 0, 7, 9, 0, 0, 0, 9, 7, 6, 6, + 0, 0, 0, 0, 1, 0, 0,216,216, 1, 1, 1, 0, 0, 0,226, + 216,216,216,216,216, 0,220,220,220, 0,232,232,220,230,230,230, + 7, 0, 16, 17, 17, 33, 17, 49, 17, 17, 84, 97,135,145, 26, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17,177, 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 5, 3, 3, 3, + 3, 3, 6, 7, 8, 3, 3, 3, 3, 3, 9, 10, 11, 12, 13, 3, + 3, 3, 3, 3, 3, 3, 3, 14, 3, 15, 3, 3, 3, 3, 3, 3, + 16, 17, 18, 19, 20, 21, 3, 3, 3, 22, 23, 24, 3, 3, 3, 3, + 3, 3, 25, 3, 3, 3, 3, 3, 3, 3, 3, 26, 3, 3, 27, 28, + 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 4, 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 0, 0, 0, 0, + 0, 9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, 13, 0, + 0, 14, 15, 16, 6, 0, 17, 18, 19, 19, 19, 20, 21, 22, 23, 24, + 19, 25, 0, 26, 27, 19, 19, 28, 29, 30, 0, 31, 0, 0, 0, 8, + 0, 0, 0, 0, 0, 0, 0, 19, 28, 0, 32, 33, 9, 34, 35, 19, + 0, 0, 36, 37, 38, 39, 40, 19, 0, 41, 42, 43, 44, 31, 0, 1, + 45, 42, 0, 0, 0, 0, 0, 32, 14, 14, 0, 0, 0, 0, 14, 0, + 0, 46, 47, 47, 47, 47, 48, 49, 47, 47, 47, 47, 50, 51, 52, 53, + 43, 21, 0, 0, 0, 0, 0, 0, 0, 54, 6, 55, 0, 14, 19, 1, + 0, 0, 0, 0, 56, 57, 0, 0, 0, 0, 0, 19, 58, 31, 0, 0, + 0, 0, 0, 0, 0, 59, 14, 0, 0, 0, 0, 1, 0, 2, 0, 0, + 0, 3, 0, 0, 0, 60, 61, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 2, 3, 0, 4, 5, 0, 0, 6, 0, 0, 0, 7, + 0, 0, 0, 1, 1, 0, 0, 8, 9, 0, 8, 9, 0, 0, 0, 0, + 8, 9, 10, 11, 12, 0, 0, 0, 13, 0, 0, 0, 0, 14, 15, 16, + 17, 0, 0, 0, 1, 0, 0, 18, 19, 0, 0, 0, 20, 0, 0, 0, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 8, 21, 9, + 0, 0, 22, 0, 0, 0, 0, 1, 0, 23, 24, 25, 0, 0, 26, 0, + 0, 0, 8, 21, 27, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 28, + 29, 30, 0, 31, 32, 20, 1, 1, 0, 0, 0, 8, 21, 9, 1, 4, + 5, 0, 0, 0, 33, 9, 0, 1, 1, 1, 0, 8, 21, 21, 21, 21, + 34, 1, 35, 21, 21, 21, 9, 36, 0, 0, 37, 38, 1, 0, 39, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 8, 21, 9, 1, 0, 0, 0, + 40, 0, 8, 21, 21, 21, 21, 21, 21, 21, 21, 9, 0, 1, 1, 1, + 1, 8, 21, 21, 21, 9, 0, 0, 0, 41, 0, 42, 43, 0, 0, 0, + 1, 44, 0, 0, 0, 45, 8, 9, 1, 0, 0, 0, 8, 21, 21, 21, + 9, 0, 1, 0, 1, 1, 8, 21, 21, 9, 0, 4, 5, 8, 9, 1, + 0, 0, 0, 1, 2, 3, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 13, 14, 3, 3, 3, 3, 3, 3, 3, 15, 3, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17,177, 0, 1, 2, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, - 3, 3, 3, 3, 5, 3, 3, 3, 3, 3, 6, 7, 8, 3, 3, 3, - 3, 3, 9, 10, 11, 12, 13, 3, 3, 3, 3, 3, 3, 3, 3, 14, - 3, 15, 3, 3, 3, 3, 3, 3, 16, 17, 18, 19, 20, 21, 3, 3, - 3, 22, 23, 24, 3, 3, 3, 3, 3, 3, 25, 3, 3, 3, 3, 3, - 3, 3, 3, 26, 3, 3, 27, 28, 0, 1, 0, 0, 0, 0, 0, 1, - 0, 2, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 4, - 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 8, 9, 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, 0, 0, 0, - 0, 0, 0, 10, 11, 12, 13, 0, 0, 14, 15, 16, 6, 0, 17, 18, - 19, 19, 19, 20, 21, 22, 23, 24, 19, 25, 0, 26, 27, 19, 19, 28, - 29, 30, 0, 31, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 19, - 28, 0, 32, 33, 9, 34, 35, 19, 0, 0, 36, 37, 38, 39, 40, 19, - 0, 41, 42, 43, 44, 31, 0, 1, 45, 42, 0, 0, 0, 0, 0, 32, - 14, 14, 0, 0, 0, 0, 14, 0, 0, 46, 47, 47, 47, 47, 48, 49, - 47, 47, 47, 47, 50, 51, 52, 53, 43, 21, 0, 0, 0, 0, 0, 0, - 0, 54, 6, 55, 0, 14, 19, 1, 0, 0, 0, 0, 56, 57, 0, 0, - 0, 0, 0, 19, 58, 31, 0, 0, 0, 0, 0, 0, 0, 59, 14, 0, - 0, 0, 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, 0, 60, 61, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 3, 0, 4, - 5, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 1, 1, 0, 0, 8, - 9, 0, 8, 9, 0, 0, 0, 0, 8, 9, 10, 11, 12, 0, 0, 0, - 13, 0, 0, 0, 0, 14, 15, 16, 17, 0, 0, 0, 1, 0, 0, 18, - 19, 0, 0, 0, 20, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, - 1, 1, 1, 1, 0, 8, 21, 9, 0, 0, 22, 0, 0, 0, 0, 1, - 0, 23, 24, 25, 0, 0, 26, 0, 0, 0, 8, 21, 27, 0, 1, 0, - 0, 1, 1, 1, 1, 0, 1, 28, 29, 30, 0, 31, 32, 20, 1, 1, - 0, 0, 0, 8, 21, 9, 1, 4, 5, 0, 0, 0, 33, 9, 0, 1, - 1, 1, 0, 8, 21, 21, 21, 21, 34, 1, 35, 21, 21, 21, 9, 36, - 0, 0, 37, 38, 1, 0, 39, 0, 0, 0, 1, 0, 1, 0, 0, 0, - 0, 8, 21, 9, 1, 0, 0, 0, 40, 0, 8, 21, 21, 21, 21, 21, - 21, 21, 21, 9, 0, 1, 1, 1, 1, 8, 21, 21, 21, 9, 0, 0, - 0, 41, 0, 42, 43, 0, 0, 0, 1, 44, 0, 0, 0, 45, 8, 9, - 1, 0, 0, 0, 8, 21, 21, 21, 9, 0, 1, 0, 1, 1, 8, 21, - 21, 9, 0, 4, 5, 8, 9, 1, 0, 0, 0, 1, 2, 3, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 3, 3, 3, 3, 3, 3, - 3, 15, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 0, 0, 1, 2, 3, - 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 17, 17, - 18, 17, 19, 20, 21, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 24, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 25, 25, 26, 27, - 28, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 52, 53, 31, - 31, 31, 31, 54, 55, 55, 56, 31, 31, 31, 31, 31, 31, 31, 57, 58, + 17, 17, 18, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 17, 17, 18, 17, 19, 20, 21, 22, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 25, 25, 26, 27, 28, 29, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 59, 60, 31, 61, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 63, 64, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 65, 66, 67, 31, 31, 31, 31, 68, 31, 31, 31, 31, 31, - 31, 31, 31, 69, 70, 71, 17, 17, 72, 73, 31, 74, 75, 76, 31, 77, - 78, 31, 79, 80, 17, 81, 17, 17, 17, 17, 31, 31, 23, 23, 23, 23, - 23, 23, 31, 31, 31, 31, 31, 31, 23, 82, 31, 31, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 83, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 84, 0, 0, 1, - 0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, - 4, 4, 4, 4, 4, 4, 5, 6, 7, 8, 9, 10, 11, 11, 12, 11, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 19, 27, - 28, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, - 37, 37, 38, 38, 39, 40, 41, 41, 42, 42, 42, 43, 44, 44, 45, 46, - 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 49, 50, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 51, - 60, 61, 62, 63, 64, 65, 66, 7, 67, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 7, 4, 4, 4, 4, 77, 77, 77, 77, 78, 79, 80, 81, - 82, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 85, 85, - 0, 0, 0, 0, 86, 87, 88, 88, 89, 90, 48, 91, 0, 0, 92, 92, - 92, 92, 92, 93, 94, 95, 96, 97, 98, 47, 99,100,101,102, 0,103, - 104,105, 0, 0, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, - 92, 92, 92, 0,106,106,106,106,106,106,106,106,106,106,106,107, - 108,108,108,108,108, 11,109,110,111, 4,112, 4,113,114,115,116, - 117,118,119,120,121,122,123,124,125,126, 50,127, 47, 47, 47, 47, - 47, 47, 47, 47,128,128,128,128,128,128,128,128,128,128,128,128, - 92, 92, 92, 92, 92, 92, 92, 92,129,130, 19, 19, 19, 19, 19, 19, - 131, 19, 19, 19,132,133, 19,134,135,136,137,101,138,138,138,138, - 0, 77,139,140,128,128,141,142,143,144,145,146,147,148,149,150, - 151,152,153,153,154,154,154,154,154,154, 4, 4,155,156,157,158, - 159,160,161,162,163,164,165,166,167,168,169,169,170,170,171,171, - 172,172,128,128, 19, 19,173,173,174,175,176,177,178,178,179,180, - 181,182,183,184,185,185,186,187,188,189,128,128,190,190,191,191, - 128,128,192,192,193,194,195,195,196,196,128,128,197,197,198,198, - 199,199,200,200,201,202,203,204,128,128,128,128,205,206,207,207, - 208,209,210,210,128,128,211,211,128,128,212, 34,213,213,213,213, - 213,213,213,213,213,213,213,213,213,213,128,128,128,128,128,128, - 128,128,214,214,215,215,215,215,215,215,215,215,215,215,128,128, - 128,128,128,128,216,216,216,216,216,216,216,216,216,216,128,128, - 128,128,128,128,110,110,110,110,110,110,110,110,110,217,218,219, - 220,220,220,220,221,221,221,221,222,222,222,223,224,224,224,224, - 224,224,224,224,224,224,224,224,225,225,225,225,225,225,225,225, - 224,224,128,128,128,128,128,128,128,128,104,104,226,227,227,227, - 228,229,230,230,230,230,230,230,128,128,128,128,231,231,232, 0, - 128,128,128,128,128,128,128,128, 7,233, 0, 0, 0, 0, 0, 0, - 0,234,235, 0, 77, 77, 0, 0, 0, 0,128,128,236,236,236,236, - 236,236,236,236,236,236,236,236,128,128,128,128,128,128,128,128, - 4, 4,128,128, 86, 86,128,128,237,237,128,128,128,128,238,239, - 128,128,128,128,128,128,128,128,128,128, 48, 48,240,240,240,240, - 241,241,128,128, 0, 0, 0, 0, 0, 0,128,128, 19, 19, 19, 19, - 128,128,128,128,242, 0,128,128, 0, 0, 0, 0, 92, 92,128,128, - 128,128,128,128, 92, 92, 92, 92, 92, 92,128,128, 0, 0,128,128, - 7, 7, 7, 7, 0, 0, 0, 0, 1, 2, 1, 2, 0, 0, 3, 3, - 4, 5, 4, 5, 4, 4, 4, 4, 4, 4, 4, 6, 0, 0, 7, 0, - 8, 8, 8, 8, 8, 8, 8, 9, 10, 11, 11, 11, 11, 11, 12, 11, - 13, 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 15, 16, 16, 16, 16, - 16, 17, 18, 18, 18, 18, 18, 18, 19, 20, 21, 21, 22, 23, 21, 24, - 21, 21, 21, 21, 21, 25, 21, 21, 26, 26, 26, 26, 26, 21, 21, 21, - 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 26, 21, - 21, 21, 31, 21, 32, 32, 32, 32, 32, 33, 34, 32, 35, 35, 35, 35, - 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, - 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, - 44, 44, 44, 45, 44, 44, 44, 44, 46, 46, 46, 46, 47, 47, 47, 47, - 47, 48, 47, 47, 49, 49, 49, 49, 49, 49, 50, 50, 50, 50, 50, 51, - 52, 52, 52, 52, 53, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 54, - 55, 55, 55, 55, 56, 56, 57, 57, 57, 57, 58, 57, 59, 59, 60, 61, - 62, 62, 63, 63, 64, 64, 64, 64, 65, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 55, 67, 67, 67, 67, 67, 68, 68, 68, 69, 69, 69, 69, - 69, 69, 64, 64, 70, 70, 71, 71, 71, 71, 71, 71, 71, 71, 71, 8, - 72, 72, 72, 72, 73, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 75, - 75, 76, 76, 76, 13, 50, 50, 50, 73, 77, 78, 79, 4, 4, 80, 4, - 4, 81, 82, 83, 4, 4, 4, 84, 11, 11, 11, 11, 85, 0, 0, 0, - 0, 0, 0, 86, 0, 4, 0, 0, 0, 8, 8, 8, 0, 0, 87, 88, - 89, 0, 4, 4, 6, 0, 0, 0, 90, 90, 90, 90, 91, 91, 91, 91, - 91, 91, 4, 4, 92, 92, 92, 92, 50, 50, 50, 93, 93, 93, 93, 93, - 53, 53, 13, 13, 94, 94, 94, 94, 94, 94, 94, 0, 95, 0, 96, 97, - 98, 99, 99, 99, 99,100,101,102,102,102,102,103,104,104,104,105, - 52, 0,104,104, 0, 0, 0,102, 52, 52, 0, 0, 0, 0, 52,106, - 0,102,102,107,102,102,102,102,102,108, 0, 0,109,109,109,109, - 109,110,110,110,111,111,111,111, 13, 13,112,112,112,112,112,112, - 0, 0,113, 4,114, 4, 4, 4,115,115,115, 0,116,116,116,116, - 117,117,117,117,117,117, 32, 32,118,118,119,120,120,120, 52, 52, - 121,121,121,121,122,121, 49, 49,123,123,123,123,123,123, 49, 49, - 124,124,124,124,124,124,125,125, 53, 53, 53, 4, 4,126,127, 54, - 125,125,125,125,128,128,128,128, 4,129, 18, 18, 18, 21, 21, 21, - 21, 21, 21,130, 8, 0,131, 0, 0, 0, 0, 21, 21, 21, 21,132, - 0, 0, 1, 2, 1, 2,133,101,102,134, 52, 52,135,135,135,135, - 11, 0, 11, 11, 11, 0, 0,136,137,137,138,138,138,138,139, 0, - 140,140,140,141,141,142,142,142,143,143,144,144,144,144,144,144, - 145,145,145,145,145,146,146,146,147,147,147,148,148,148,148,148, - 149,149,149,150,150,150,150,151,151,151,151,151,152,152,152,152, - 153,153,153,153,154,154,155,155,156,156,156,156,156,156,157,157, - 158,158,159,159,159,159,159,159,160,160,161,161,161,161,161,161, - 162,162,162,162,162,162,163,163,164,164,164,164,165,165,165,165, - 166,166,166,166,167,167,168,168,169,169,169,169,170,170,170,170, - 171,171,171,171,172,172,172,172,173,173,173,173,174,174,174,175, - 175,175,175,176,176,176,176,177,177,177,178,178,179,179,179,179, - 180,180,180,180,180,181,181,181,182,182,182,182,182,183,183,183, - 184,184,184,184,184,184,185, 43,186,186,186,186,187,187,187,188, - 188,188,188,188,189,189,189,190,189,189,189,189,191,191,191,191, - 192,192,192,192,193,193,193,193,194,194,194,194,194,194, 66, 66, - 195,195,195,195,196,196,196,196,197,197,197,197,198,198,198,198, - 199,199,199,199,200,200,200,200,201,201,201,201,201,202,202,202, - 202,202,202, 55,203,203,203,203,204,204,204,204,204,204,204,205, - 205,205,205,205,206,206,206,206,206,206,207,207,207,207,207,207, - 208,208,208,208,110,110,110,110,209,209,209,209,210,210,210,210, - 211,211,211,211,212,212,212,212,213,213,213,214,214,214,214,214, - 214,215,215,215,216,216,216,216,217,217,217,217,218,218,218,218, - 218,218,219, 94,220,220,220,220,221,221,221,221,222, 99, 99, 99, - 99, 99, 99, 99, 99, 99,102,102,102, 99,223,224,224,224,224,224, - 225,225,225,225,225,225, 0, 0, 8, 0, 0, 0, 0, 0,226,227, - 228, 0,229, 0,230,230,230,230,231,231,231,231,232,232,232,232, - 233,233,233,233,234,234,234,234,235,235,235,235,236, 0, 0, 0, - 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 3, 0, 0, 0, 4, 0, - 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 5, 0, 2, 5, 6, 0, - 7, 7, 7, 7, 8, 9, 8, 10, 8, 11, 8, 8, 8, 8, 8, 8, - 12, 13, 13, 13, 14, 14, 14, 14, 14, 15, 14, 14, 16, 17, 17, 17, - 17, 17, 17, 17, 18, 19, 19, 19, 19, 19, 19, 19, 20, 21, 20, 22, - 20, 20, 23, 23, 20, 20, 20, 20, 22, 20, 24, 7, 7, 25, 20, 20, - 26, 20, 20, 20, 20, 20, 20, 21, 27, 27, 27, 27, 28, 28, 28, 28, - 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 32, 20, 20, 20, - 33, 33, 33, 33, 34, 35, 33, 33, 33, 36, 33, 33, 37, 37, 37, 37, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 52, 53, 31, 31, 31, 31, 54, 55, 55, 56, 31, + 31, 31, 31, 31, 31, 31, 57, 58, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 59, 60, 31, 61, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 63, 64, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 65, 66, 67, 31, 31, + 31, 31, 68, 31, 31, 31, 31, 31, 31, 31, 31, 69, 70, 71, 17, 17, + 72, 73, 31, 74, 75, 76, 77, 78, 79, 31, 80, 81, 17, 82, 17, 17, + 17, 17, 31, 31, 23, 23, 23, 23, 23, 23, 31, 31, 31, 31, 31, 31, + 23, 83, 31, 31, 23, 23, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 84, 0, 0, 1, 0, 1, 2, 3, 0, 1, 2, 3, + 4, 5, 6, 7, 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 5, 6, + 7, 8, 9, 10, 11, 11, 12, 11, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 19, 27, 28, 29, 30, 30, 31, 31, 32, 32, + 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 40, 41, 41, + 42, 42, 42, 43, 44, 44, 45, 46, 47, 47, 47, 47, 48, 48, 48, 48, + 48, 48, 49, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 53, + 54, 55, 56, 56, 57, 58, 59, 51, 60, 61, 62, 63, 64, 65, 66, 7, + 67, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 7, 4, 4, 4, 4, + 77, 77, 77, 77, 78, 79, 80, 81, 82, 83, 84, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 85, 85, 85, 85, 0, 0, 0, 0, 86, 87, 88, 88, + 89, 90, 48, 91, 0, 0, 92, 92, 92, 92, 92, 93, 94, 95, 96, 97, + 98, 47, 99,100,101,102, 0,103,104,105, 0, 0, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0,106,106,106,106, + 106,106,106,106,106,106,106,107,108,108,108,108,108, 11,109,110, + 111, 4,112, 4,113,114,115,116,117,118,119,120,121,122,123,124, + 125,126, 50,127, 47, 47, 47, 47, 47, 47, 47, 47,128,128,128,128, + 128,128,128,128,128,128,128,128, 92, 92, 92, 92, 92, 92, 92, 92, + 129,130, 19, 19, 19, 19, 19, 19,131, 19, 19, 19,132,133, 19,134, + 135,136,137,101,138,138,138,138, 0, 77,139,140,128,128,141,142, + 143,144,145,146,147,148,149,150,151,152,153,153,154,154,154,154, + 154,154, 4, 4,155,156,157,158,159,160,161,162,163,164,165,166, + 167,168,169,169,170,170,171,171,172,172,128,128, 19, 19,173,174, + 175,176,177,178,179,179,180,181,182,183,184,185,186,186,187,188, + 189,190,128,128,191,191,192,192,128,128,193,193,194,195,196,196, + 197,197,128,128,198,198,199,199,200,200,201,201,202,203,204,205, + 28, 28,128,128,206,207,208,208,209,210,211,211,128,128,212,212, + 213,213,214, 34,215,215,215,215,215,215,215,215,215,215,215,215, + 215,215,128,128,128,128,128,128,128,128,216,216,217,217,217,217, + 217,217,217,217,217,217,128,128,128,128,128,128,218,218,218,218, + 218,218,218,218,218,218,128,128,128,128,128,128,110,110,110,110, + 110,110,110,110,110,219,220,221,222,222,222,222,223,223,223,223, + 224,224,224,225,226,226,226,226,226,226,226,226,226,226,226,226, + 227,227,227,227,227,227,227,227,226,226,128,128,128,128,128,128, + 128,128,104,104,228,229,229,229,230,231,232,232,232,232,232,232, + 128,128,128,128,233,233,234, 0,128,128,128,128,128,128,128,128, + 7,235, 0, 0, 0, 0, 0, 0, 0,236,237, 0, 77, 77, 0, 0, + 0, 0,128,128,238,238,238,238,238,238,238,238,238,238,238,238, + 128,128,128,128,128,128,128,128, 4, 4,128,128,239, 11, 11, 11, + 240,240,128,128,128,128,241,242,128,128,128,128,128,128,243,243, + 128,128,128,128,128,128,128,128,128,128, 48, 48,244,244,244,244, + 245,245,128,128, 0, 0, 0, 0, 0, 0,128,128, 19, 19, 19, 19, + 128,128,128,128,246, 0,128,128, 0, 0, 0, 0, 92, 92,128,128, + 128,128,128,128, 0, 0,128,128, 7, 7, 7, 7, 0, 0, 0, 0, + 1, 2, 1, 2, 0, 0, 3, 3, 4, 5, 4, 5, 4, 4, 4, 4, + 4, 4, 4, 6, 0, 0, 7, 0, 8, 8, 8, 8, 8, 8, 8, 9, + 10, 11, 11, 11, 11, 11, 12, 11, 13, 13, 13, 13, 14, 13, 13, 13, + 13, 13, 13, 15, 16, 16, 16, 16, 16, 17, 18, 18, 18, 18, 18, 18, + 19, 20, 21, 21, 22, 23, 21, 24, 21, 21, 21, 21, 21, 25, 21, 21, + 26, 26, 26, 26, 26, 21, 21, 21, 27, 27, 27, 27, 28, 28, 28, 28, + 29, 29, 29, 29, 30, 30, 26, 21, 21, 21, 31, 21, 32, 32, 32, 32, + 32, 33, 34, 32, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 41, - 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, - 46, 46, 46, 46, 46, 46, 46, 47, 48, 48, 48, 48, 49, 49, 49, 49, - 49, 50, 51, 49, 52, 52, 52, 52, 53, 53, 53, 53, 53, 53, 54, 53, - 55, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, - 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 61, 62, 63, 63, 63, 63, - 64, 64, 64, 64, 64, 65, 0, 0, 66, 66, 66, 66, 67, 67, 67, 67, - 68, 68, 68, 68, 69, 70, 71, 71, 71, 71, 71, 71, 72, 72, 72, 72, - 73, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 75, 76, 76, 76, 76, - 77, 77, 77, 77, 78, 78, 78, 78, 79, 79, 79, 79, 80, 80, 80, 80, - 81, 81, 81, 81, 82, 7, 7, 7, 83, 7, 84, 85, 0, 84, 86, 0, - 2, 87, 88, 2, 2, 2, 2, 89, 90, 87, 91, 2, 2, 2, 92, 2, - 2, 2, 2, 93, 0, 0, 0, 86, 1, 0, 0, 94, 0, 95, 96, 0, - 4, 0, 0, 0, 0, 0, 0, 4, 97, 97, 97, 97, 98, 98, 98, 98, - 13, 13, 13, 13, 99, 99, 99, 99,100,100,100,100, 0,101, 0, 0, - 102,100,103,104, 0, 0,100, 0,105,106,106,106,106,106,106,106, - 106,106,107,105,108,109,109,109,109,109,109,109,109,109,110,108, - 111,111,111,111,112, 55, 55, 55, 55, 55, 55,113,109,109,109,110, - 109,109, 0, 0,114,114,114,114,115,115,115,115,116,116,116,116, - 117,117,117,117, 96, 2, 2, 2, 2, 2, 94, 2,118,118,118,118, - 119,119,119,119,120,120,120,120,121,121,121,121,121,121,121,122, - 123,123,123,123,124,124,124,124,124,124,124,125,126,126,126,126, - 127,127,127,127,128,128,128,128, 2, 2, 3, 2, 2,129,130, 0, - 131,131,131,131,132, 17, 17, 18, 20, 20, 20,133, 7, 7, 7,134, - 20, 20, 20, 23, 0,135,109,109,109,109,109,136,137,137,137,137, - 0, 0, 0,138,139,139,139,139,140,140,140,140, 84, 0, 0, 0, - 141,141,141,141,142,142,142,142,143,143,143,143,144,144,144,144, - 145,145,145,145,146,146,146,146,147,147,147,147,148,148,148,148, - 149,149,149,149,150,150,150,150,151,151,151,151,152,152,152,152, - 153,153,153,153,154,154,154,154,155,155,155,155,156,156,156,156, - 157,157,157,157,158,158,158,158,159,159,159,159,160,160,160,160, - 161,161,161,161,162,162,162,162,163,163,163,163,164,164,164,164, - 165,165,165,165,166,166,166,166,167,167,167,167,168,168,168,168, + 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 45, 44, 44, 44, 44, + 46, 46, 46, 46, 47, 47, 47, 47, 47, 48, 47, 47, 49, 49, 49, 49, + 49, 49, 50, 50, 50, 50, 50, 51, 52, 52, 52, 52, 53, 53, 53, 53, + 53, 53, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 56, 56, 57, 57, + 57, 57, 58, 57, 59, 59, 60, 61, 62, 62, 63, 63, 64, 64, 64, 64, + 65, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 55, 67, 67, 67, 67, + 67, 68, 68, 68, 69, 69, 69, 69, 69, 69, 64, 64, 70, 70, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 8, 72, 72, 72, 72, 73, 73, 73, 73, + 74, 74, 74, 74, 75, 75, 75, 75, 75, 76, 76, 76, 13, 50, 50, 50, + 73, 77, 78, 79, 4, 4, 80, 4, 4, 81, 82, 83, 4, 4, 4, 84, + 11, 11, 11, 11, 85, 0, 0, 0, 0, 0, 0, 86, 0, 4, 0, 0, + 0, 8, 8, 8, 0, 0, 87, 88, 89, 0, 4, 4, 6, 0, 0, 0, + 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 4, 4, 92, 92, 92, 92, + 50, 50, 50, 93, 93, 93, 93, 93, 53, 53, 13, 13, 94, 94, 94, 94, + 94, 94, 94, 0, 95, 0, 96, 97, 98, 99, 99, 99, 99,100,101,102, + 102,102,102,103,104,104,104,105, 52, 0,104,104, 0, 0, 0,102, + 52, 52, 0, 0, 0, 0, 52,106, 0,102,102,107,102,102,102,102, + 102,108, 0, 0,109,109,109,109,109,110,110,110,111,111,111,111, + 13, 13,112,112,112,112,112,112, 0, 0,113, 4,114, 4, 4, 4, + 115,115,115, 0,116,116,116,116,117,117,117,117,117,117, 32, 32, + 118,118,119,120,120,120, 52, 52,121,121,121,121,122,121, 49, 49, + 123,123,123,123,123,123, 49, 49,124,124,124,124,124,124,125,125, + 53, 53, 53, 4, 4,126,127, 54,125,125,125,125,128,128,128,128, + 4,129, 18, 18, 18, 21, 21, 21, 21, 21, 21,130, 8, 0,131, 0, + 0, 0, 0, 21, 21, 21, 21,132, 0, 0, 1, 2, 1, 2,133,101, + 102,134, 52, 52,135,135,135,135, 11, 0, 11, 11, 11, 0, 0,136, + 137,137,138,138,138,138,139, 0,140,140,140,141,141,142,142,142, + 143,143,144,144,144,144,144,144,145,145,145,145,145,146,146,146, + 147,147,147,148,148,148,148,148,149,149,149,150,150,150,150,151, + 151,151,151,151,152,152,152,152,153,153,153,153,154,154,155,155, + 156,156,156,156,156,156,157,157,158,158,159,159,159,159,159,159, + 160,160,161,161,161,161,161,161,162,162,162,162,162,162,163,163, + 164,164,164,164,165,165,165,165,166,166,166,166,167,167,168,168, 169,169,169,169,170,170,170,170,171,171,171,171,172,172,172,172, - 173,173,173,173,174,174,174,174,175,175,175,175,176,176,176,176, - 177,177,177,177,178,178,178,178,179,179,179,179,180,180,180,180, - 181,181,181,181,182,182,182,182,183,183,183,183,184,184,184,184, - 185,185,185,185,186, 45, 45, 45,187,187,187,187,188,188,188,188, - 189,189,189,189,190,190,190,190,190,190,191,190,192,192,192,192, - 193,193,193,193,194,194,194,194,195,195,195,195,196,196,196,196, + 173,173,173,173,173,173,173,174,175,175,175,176,176,176,176,177, + 177,177,177,178,178,178,179,179,180,180,180,180,181,181,181,181, + 181,182,182,182,183,183,183,183,183,184,184,184,185,185,185,185, + 185,185,186, 43,187,187,187,187,188,188,188,189,189,189,189,189, + 190,190,190,191,190,190,190,190,192,192,192,192,193,193,193,193, + 194,194,194,194,195,195,195,195,195,195, 66, 66,196,196,196,196, 197,197,197,197,198,198,198,198,199,199,199,199,200,200,200,200, - 201,201,201,201,202,202,202,202,203,203,203,203,204,204,204,204, - 205,205,205,205,206,206,206,206,207,207,207,207,208,208,208,208, - 209,209,209,209,210,210,210,210,211,211,211,211,212,212,212,212, - 213,213,213,213,214,214,214,214,215,215,215,215,216,216,216,216, - 217,217,217,217,218,218,218,218,219,219,219,219,220,221,221,221, - 222,222,222,222,221,221,221,221,223,106,106,106,106,109,109,109, - 224,224,224,224,225,225,225,225, 0,226, 86, 0, 0, 0,226, 7, - 82,138, 7, 0, 0, 0,227, 86,228,228,228,228,229,229,229,229, - 230,230,230,230,231,231,231,231,232,232,232,232,233,233,233,233, - 234, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 0, 0, 0, 19, 0, 19, 0, 0, 0, 0, 0, 26, 26, - 1, 1, 1, 1, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 0, 9, - 9, 0, 9, 0, 9, 9, 55, 55, 55, 55, 55, 55, 6, 6, 6, 6, - 6, 1, 1, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 14, 14, 14, - 14, 14, 14, 14, 3, 3, 3, 3, 3, 0, 3, 3, 0, 3, 3, 3, - 3, 3, 3, 0, 3, 3, 3, 1, 1, 1, 3, 3, 1, 3, 3, 3, - 37, 37, 37, 37, 38, 38, 38, 38, 64, 64, 64, 64, 90, 90, 90, 90, - 95, 95, 95, 95, 3, 3, 0, 3, 7, 7, 7, 7, 7, 1, 1, 1, - 1, 7, 7, 7, 0, 0, 7, 7, 5, 5, 5, 5, 11, 11, 11, 11, - 10, 10, 10, 10, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, - 16, 16, 16, 16, 20, 20, 20, 20, 36, 36, 36, 36, 24, 24, 24, 24, - 24, 24, 24, 0, 18, 18, 18, 18, 25, 25, 25, 25, 25, 0, 0, 0, - 0, 25, 25, 25, 33, 33, 33, 33, 8, 8, 8, 8, 8, 8, 8, 0, - 12, 12, 12, 12, 30, 30, 30, 30, 29, 29, 29, 29, 28, 28, 28, 28, - 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 35, 35, - 45, 45, 45, 45, 44, 44, 44, 44, 44, 0, 0, 0, 43, 43, 43, 43, - 46, 46, 46, 46, 31, 31, 31, 31, 32, 32, 0, 0, 32, 0, 32, 32, - 32, 32, 32, 32, 48, 48, 48, 48, 52, 52, 52, 52, 58, 58, 58, 58, - 54, 54, 54, 54, 91, 91, 91, 91, 62, 62, 62, 62, 76, 76, 76, 76, - 93, 93, 93, 93, 70, 70, 70, 70, 73, 73, 73, 73, 1, 1, 1, 0, - 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, - 19, 19, 9, 9, 9, 9, 9, 6, 19, 9, 9, 9, 9, 9, 19, 19, - 9, 9, 9, 19, 6, 19, 19, 19, 19, 19, 19, 9, 0, 0, 0, 19, - 0, 0, 9, 0, 0, 0, 19, 19, 27, 27, 27, 27, 56, 56, 56, 56, - 61, 61, 61, 61, 13, 13, 13, 13, 0, 13, 0, 13, 0, 13, 13, 13, - 13, 13, 1, 1, 1, 1, 12, 12, 0, 15, 15, 15, 15, 15, 15, 15, - 15, 1, 1, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, - 26, 26, 26, 26, 26, 12, 12, 12, 12, 12, 12, 0, 39, 39, 39, 39, - 86, 86, 86, 86, 77, 77, 77, 77, 79, 79, 79, 79, 60, 60, 60, 60, - 65, 65, 65, 65, 75, 75, 75, 75, 69, 69, 69, 69, 69, 69, 0, 69, - 74, 74, 74, 74, 84, 84, 84, 84, 84, 84, 84, 0, 68, 68, 68, 68, - 92, 92, 92, 92, 87, 87, 87, 87, 19, 9, 19, 19, 19, 19, 0, 0, - 2, 2, 2, 2, 19, 19, 19, 4, 3, 3, 0, 0, 1, 1, 6, 6, - 0, 0, 17, 17, 17, 17, 0, 0, 49, 49, 49, 49, 0, 1, 1, 1, - 71, 71, 71, 71, 67, 67, 67, 67, 42, 42, 42, 42, 41, 41, 41, 41, - 118,118,118,118, 53, 53, 53, 53, 59, 59, 59, 59, 40, 40, 40, 40, - 51, 51, 51, 51, 50, 50, 50, 50,135,135,135,135,106,106,106,106, - 104,104,104,104,161,161,161,161,110,110,110,110, 47, 47, 47, 47, - 81, 81, 81, 81,120,120,120,120,116,116,116,116,128,128,128,128, - 66, 66, 66, 66, 72, 72, 72, 72, 98, 98, 98, 98, 97, 97, 97, 97, - 57, 57, 57, 57, 88, 88, 88, 88,117,117,117,117,112,112,112,112, - 78, 78, 78, 78, 83, 83, 83, 83, 82, 82, 82, 82,122,122,122,122, - 89, 89, 89, 89,130,130,130,130,144,144,144,144,156,156,156,156, - 147,147,147,147,148,148,148,148,158,158,158,158,153,153,153,153, - 149,149,149,149, 94, 94, 94, 94, 85, 85, 85, 85,101,101,101,101, - 96, 96, 96, 96,111,111,111,111,100,100,100,100,100, 36, 36, 36, - 108,108,108,108,129,129,129,129,109,109,109,109,107,107,107,107, - 107,107,107, 1,137,137,137,137,124,124,124,124,123,123,123,123, - 114,114,114,114,102,102,102,102,126,126,126,126,142,142,142,142, - 125,125,125,125,154,154,154,154,150,150,150,150,141,141,141,141, - 140,140,140,140,121,121,121,121,133,133,133,133,134,134,134,134, - 138,138,138,138,143,143,143,143,145,145,145,145, 63, 63, 63, 63, + 201,201,201,201,202,202,202,202,202,203,203,203,203,203,203, 55, + 204,204,204,204,205,205,205,205,205,205,205,206,206,206,206,206, + 207,207,207,207,207,207,208,208,208,208,208,208,209,209,209,209, + 210,210,210,210,110,110,110,110,211,211,211,211,212,212,212,212, + 213,213,213,213,214,214,214,214,215,215,215,216,216,216,216,216, + 216,217,217,217,218,218,218,218,219,219,219,219,220,220,220,220, + 220,220,221, 94,222,222,222,222,223,223,223,223,224, 99, 99, 99, + 99, 99, 99, 99, 99, 99,102,225, 99,226,102,227,227,227,227,227, + 228,228,228,228,228,228, 0, 0, 8, 0, 0, 0, 0, 0,229,230, + 231, 0,232, 0,233,233,233,233, 91, 91, 91, 13,234,234,234,234, + 235,235,235,235,236,236,236,236,237,237,237,237,238,238,238,238, + 239,239,239,239,240, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, + 2, 2, 3, 0, 0, 0, 4, 0, 2, 2, 2, 2, 2, 3, 2, 2, + 2, 2, 5, 0, 2, 5, 6, 0, 7, 7, 7, 7, 8, 9, 8, 10, + 8, 11, 8, 8, 8, 8, 8, 8, 12, 13, 13, 13, 14, 14, 14, 14, + 14, 15, 14, 14, 16, 17, 17, 17, 17, 17, 17, 17, 18, 19, 19, 19, + 19, 19, 19, 19, 20, 21, 20, 22, 20, 20, 23, 23, 20, 20, 20, 20, + 22, 20, 24, 7, 7, 25, 20, 20, 26, 20, 20, 20, 20, 20, 20, 21, + 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, + 31, 31, 31, 31, 32, 20, 20, 20, 33, 33, 33, 33, 34, 35, 33, 33, + 33, 36, 33, 33, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, + 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, + 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 46, 46, 46, 47, + 48, 48, 48, 48, 49, 49, 49, 49, 49, 50, 51, 49, 52, 52, 52, 52, + 53, 53, 53, 53, 53, 53, 54, 53, 55, 55, 55, 55, 56, 56, 56, 56, + 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, + 60, 60, 61, 62, 63, 63, 63, 63, 64, 64, 64, 64, 64, 65, 0, 0, + 66, 66, 66, 66, 67, 67, 67, 67, 68, 68, 68, 68, 69, 70, 71, 71, + 71, 71, 71, 71, 72, 72, 72, 72, 73, 73, 73, 73, 74, 74, 74, 74, + 75, 75, 75, 75, 76, 76, 76, 76, 77, 77, 77, 77, 78, 78, 78, 78, + 79, 79, 79, 79, 80, 80, 80, 80, 81, 81, 81, 81, 82, 7, 7, 7, + 83, 7, 84, 85, 0, 84, 86, 0, 2, 87, 88, 2, 2, 2, 2, 89, + 90, 87, 91, 2, 2, 2, 92, 2, 2, 2, 2, 93, 0, 0, 0, 86, + 1, 0, 0, 94, 0, 95, 96, 0, 4, 0, 0, 0, 0, 0, 0, 4, + 97, 97, 97, 97, 98, 98, 98, 98, 13, 13, 13, 13, 99, 99, 99, 99, + 100,100,100,100, 0,101, 0, 0,102,100,103,104, 0, 0,100, 0, + 105,106,106,106,106,106,106,106,106,106,107,105,108,109,109,109, + 109,109,109,109,109,109,110,108,111,111,111,111,112, 55, 55, 55, + 55, 55, 55,113,109,109,109,110,109,109, 0, 0,114,114,114,114, + 115,115,115,115,116,116,116,116,117,117,117,117, 96, 2, 2, 2, + 2, 2, 94, 2,118,118,118,118,119,119,119,119,120,120,120,120, + 121,121,121,121,121,121,121,122,123,123,123,123,124,124,124,124, + 124,124,124,125,126,126,126,126,127,127,127,127,128,128,128,128, + 2, 2, 3, 2, 2,129,130, 0,131,131,131,131,132, 17, 17, 18, + 20, 20, 20,133, 7, 7, 7,134, 20, 20, 20, 23, 0,135,109,109, + 109,109,109,136,137,137,137,137, 0, 0, 0,138,139,139,139,139, + 140,140,140,140, 84, 0, 0, 0,141,141,141,141,142,142,142,142, + 143,143,143,143,144,144,144,144,145,145,145,145,146,146,146,146, + 147,147,147,147,148,148,148,148,149,149,149,149,150,150,150,150, + 151,151,151,151,152,152,152,152,153,153,153,153,154,154,154,154, + 155,155,155,155,156,156,156,156,157,157,157,157,158,158,158,158, + 159,159,159,159,160,160,160,160,161,161,161,161,162,162,162,162, + 163,163,163,163,164,164,164,164,165,165,165,165,166,166,166,166, + 167,167,167,167,168,168,168,168,169,169,169,169,170,170,170,170, + 171,171,171,171,172,172,172,172,173,173,173,173,174,174,174,174, + 174,174,174,175,176,176,176,176,177,177,177,177,178,178,178,178, + 179,179,179,179,180,180,180,180,181,181,181,181,182,182,182,182, + 183,183,183,183,184,184,184,184,185,185,185,185,186,186,186,186, + 187, 45, 45, 45,188,188,188,188,189,189,189,189,190,190,190,190, + 191,191,191,191,191,191,192,191,193,193,193,193,194,194,194,194, + 195,195,195,195,196,196,196,196,197,197,197,197,198,198,198,198, + 199,199,199,199,200,200,200,200,201,201,201,201,202,202,202,202, + 203,203,203,203,204,204,204,204,205,205,205,205,206,206,206,206, + 207,207,207,207,208,208,208,208,209,209,209,209,210,210,210,210, + 211,211,211,211,212,212,212,212,213,213,213,213,214,214,214,214, + 215,215,215,215,216,216,216,216,217,217,217,217,218,218,218,218, + 219,219,219,219,220,220,220,220,221,221,221,221,222,223,223,223, + 224,224,224,224,223,223,223,223,225,106,106,106,226,106,106,106, + 106,227,109,109,228,228,228,228,229,229,229,229, 0,230, 86, 0, + 0, 0,230, 7, 82,138, 7, 0, 0, 0,231, 86,232,232,232,232, + 233,233,233,233,234,234,234,234,235,235,235,235,236,236,236,236, + 237,237,237,237,238,238,238,238,239, 0, 0, 0, 0, 0, 0, 0, + 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, 19, 0, + 19, 0, 0, 0, 0, 0, 26, 26, 1, 1, 1, 1, 9, 9, 9, 9, + 0, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 0, 9, 9, 55, 55, + 55, 55, 55, 55, 6, 6, 6, 6, 6, 1, 1, 6, 6, 4, 4, 4, + 4, 4, 4, 4, 4, 14, 14, 14, 14, 14, 14, 14, 3, 3, 3, 3, + 3, 0, 3, 3, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 1, + 1, 1, 3, 3, 1, 3, 3, 3, 37, 37, 37, 37, 38, 38, 38, 38, + 64, 64, 64, 64, 90, 90, 90, 90, 95, 95, 95, 95, 3, 3, 0, 3, + 7, 7, 7, 7, 7, 1, 1, 1, 1, 7, 7, 7, 0, 0, 7, 7, + 5, 5, 5, 5, 11, 11, 11, 11, 10, 10, 10, 10, 21, 21, 21, 21, + 22, 22, 22, 22, 23, 23, 23, 23, 16, 16, 16, 16, 20, 20, 20, 20, + 36, 36, 36, 36, 24, 24, 24, 24, 24, 24, 24, 0, 18, 18, 18, 18, + 25, 25, 25, 25, 25, 0, 0, 0, 0, 25, 25, 25, 33, 33, 33, 33, + 8, 8, 8, 8, 8, 8, 8, 0, 12, 12, 12, 12, 30, 30, 30, 30, + 29, 29, 29, 29, 28, 28, 28, 28, 34, 34, 34, 34, 35, 35, 35, 35, + 35, 35, 35, 0, 0, 0, 35, 35, 45, 45, 45, 45, 44, 44, 44, 44, + 44, 0, 0, 0, 43, 43, 43, 43, 46, 46, 46, 46, 31, 31, 31, 31, + 32, 32, 0, 0, 32, 0, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, + 52, 52, 52, 52, 58, 58, 58, 58, 54, 54, 54, 54, 91, 91, 91, 91, + 62, 62, 62, 62, 76, 76, 76, 76, 93, 93, 93, 93, 70, 70, 70, 70, + 73, 73, 73, 73, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, + 0, 1, 0, 0, 1, 1, 0, 0, 19, 19, 9, 9, 9, 9, 9, 6, + 19, 9, 9, 9, 9, 9, 19, 19, 9, 9, 9, 19, 6, 19, 19, 19, + 19, 19, 19, 9, 0, 0, 0, 19, 0, 0, 9, 0, 0, 0, 19, 19, + 27, 27, 27, 27, 56, 56, 56, 56, 61, 61, 61, 61, 13, 13, 13, 13, + 0, 13, 0, 13, 0, 13, 13, 13, 13, 13, 1, 1, 1, 1, 12, 12, + 0, 15, 15, 15, 15, 15, 15, 15, 15, 1, 1, 0, 0, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 0, 26, 26, 26, 26, 26, 12, 12, 12, + 12, 12, 12, 0, 39, 39, 39, 39, 86, 86, 86, 86, 77, 77, 77, 77, + 79, 79, 79, 79, 60, 60, 60, 60, 65, 65, 65, 65, 75, 75, 75, 75, + 69, 69, 69, 69, 69, 69, 0, 69, 74, 74, 74, 74, 84, 84, 84, 84, + 84, 84, 84, 0, 68, 68, 68, 68, 92, 92, 92, 92, 87, 87, 87, 87, + 19, 9, 19, 19, 19, 19, 0, 0, 2, 2, 2, 2, 19, 19, 19, 4, + 3, 3, 0, 0, 1, 1, 6, 6, 0, 0, 17, 17, 17, 17, 0, 0, + 49, 49, 49, 49, 0, 1, 1, 1, 71, 71, 71, 71, 67, 67, 67, 67, + 42, 42, 42, 42, 41, 41, 41, 41,118,118,118,118, 53, 53, 53, 53, + 59, 59, 59, 59, 40, 40, 40, 40, 51, 51, 51, 51, 50, 50, 50, 50, + 135,135,135,135,106,106,106,106,104,104,104,104,161,161,161,161, + 110,110,110,110, 47, 47, 47, 47, 81, 81, 81, 81,120,120,120,120, + 116,116,116,116,128,128,128,128, 66, 66, 66, 66, 72, 72, 72, 72, + 98, 98, 98, 98, 97, 97, 97, 97, 57, 57, 57, 57, 88, 88, 88, 88, + 117,117,117,117,112,112,112,112, 78, 78, 78, 78, 83, 83, 83, 83, + 82, 82, 82, 82,122,122,122,122, 89, 89, 89, 89,130,130,130,130, + 144,144,144,144,156,156,156,156,156, 3, 3, 3,147,147,147,147, + 148,148,148,148,158,158,158,158,153,153,153,153,149,149,149,149, + 94, 94, 94, 94, 85, 85, 85, 85,101,101,101,101, 96, 96, 96, 96, + 111,111,111,111,100,100,100,100,100, 36, 36, 36,108,108,108,108, + 129,129,129,129,109,109,109,109,107,107,107,107,107,107,107, 1, + 137,137,137,137,124,124,124,124,123,123,123,123,114,114,114,114, + 102,102,102,102,126,126,126,126,142,142,142,142,125,125,125,125, + 154,154,154,154,150,150,150,150,141,141,141,141,140,140,140,140, + 121,121,121,121,133,133,133,133,134,134,134,134,138,138,138,138, + 143,143,143,143,145,145,145,145,163,163,163,163, 63, 63, 63, 63, 157,157,157,157, 80, 80, 80, 80,127,127,127,127,115,115,115,115, 159,159,159,159,103,103,103,103,119,119,119,119,146,146,146,146, 99, 99, 99, 99,136,139, 13, 13,155,155,155,155,136,136,136,136, - 17, 15, 15, 15,139,139,139,139,105,105,105,105, 0, 0, 0, 1, - 0, 0, 1, 1,131,131,131,131,151,151,151,151,160,160,160,160, - 152,152,152,152,113,113,113,113,132,132,132,132, 15, 0, 0, 0, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 9, 10, 9, 11, - 12, 13, 9, 9, 9, 14, 9, 9, 15, 9, 9, 9, 9, 9, 9, 9, + 17, 15, 15, 15, 17, 17, 15, 15, 15, 17, 17, 17,139,139,139,139, + 105,105,105,105, 0, 0, 0, 1, 0, 0, 1, 1,131,131,131,131, + 151,151,151,151,160,160,160,160,152,152,152,152,164,164,164,164, + 113,113,113,113,132,132,132,132, 15, 0, 0, 0, 0, 1, 2, 3, + 4, 5, 6, 7, 8, 9, 9, 9, 9, 10, 9, 11, 12, 13, 9, 9, + 9, 14, 9, 9, 15, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 16, 17, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 18, 19, 20, 9, 21, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 16, 17, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 18, 19, 20, 9, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 22, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 22, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -5336,60 +5401,60 @@ _hb_ucd_u8[13246] = 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 23, 24, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 0, 0, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 23, 0, 0, 24, 25, 26, 27, 28, 29, 30, 0, 0, 31, 32, - 0, 33, 0, 34, 0, 35, 0, 0, 0, 0, 36, 37, 38, 39, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 23, 24, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 0, 0, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, + 0, 24, 25, 26, 27, 28, 29, 30, 0, 0, 31, 32, 0, 33, 0, 34, + 0, 35, 0, 0, 0, 0, 36, 37, 38, 39, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 41, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 43, 44, 0, 45, 0, 0, 0, 0, 0, 0, 46, 47, 0, 0, 0, 0, - 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 50, 51, 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, 0, 0, - 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, - 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 0, 45, + 0, 0, 0, 0, 0, 0, 46, 47, 0, 0, 0, 0, 0, 48, 0, 49, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 51, + 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 54, 0, + 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 56, 0, + 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 59, + 60, 61, 62, 63, 64, 65, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 58, 59, 60, 61, 62, 63, 64, 65, 0, 0, 0, 0, 0, 0, - 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, - 0, 69, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 69, 70, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99,100,101,102,103, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 0, 0, 0, + 0, 0, 0,105,106, 0,107, 0, 0, 0,108, 0,109, 0,110, 0, + 111,112,113, 0,114, 0, 0, 0,115, 0, 0, 0,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 104, 0, 0, 0, 0, 0, 0,105,106, 0,107, 0, 0, 0,108, 0, - 109, 0,110, 0,111,112,113, 0,114, 0, 0, 0,115, 0, 0, 0, - 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,117, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,117, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118,119, + 120,121, 0,122,123,124,125,126, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,118,119,120,121, 0,122,123,124,125,126, 0,127, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,129,130,131,132,133, + 134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149, + 150,151,152,153,154,155,156,157, 0, 0, 0,158,159,160,161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,129, - 130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145, - 146,147,148,149,150,151,152,153,154,155,156,157, 0, 0, 0,158, - 159,160,161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0,162,163, 0, 0, 0, 0, 0, 0, 0, - 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,162,163, 0, 0, 0, 0, 0, 0, 0,164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,166, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,167, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,169,170, 0, 0, 0, 0,171,172, 0, 0, 0,173,174, - 175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, - 191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,169, + 170, 0, 0, 0, 0,171,172, 0, 0, 0,173,174,175,176,177,178, + 179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194, + 195,196,197,198,199,200,201,202,203,204,205,206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, + 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, }; static const uint16_t -_hb_ucd_u16[4888] = +_hb_ucd_u16[4920] = { 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 7, 8, 9, 10, 11, 12, 13, 13, 13, 14, 15, 13, 13, 16, 17, 18, 19, 20, 21, 22, 13, 23, @@ -5456,39 +5521,41 @@ _hb_ucd_u16[4888] = 359, 47, 47, 360, 145, 66, 47, 361, 47, 362, 145, 145, 363, 47, 364, 66, 47, 47, 47, 365, 47, 366, 47, 366, 47, 365, 144, 145, 145, 145, 145, 145, 9, 9, 9, 9, 11, 11, 11, 367, 47, 47, 368, 160, 160, 160, 160, 160, - 145, 145, 145, 145, 145, 145, 145, 145, 47, 47, 369, 47, 47, 47, 47, 47, + 145, 145, 145, 145, 145, 145, 145, 145, 47, 47, 369, 47, 47, 47, 47, 143, 47, 362, 370, 47, 60, 371, 66, 47, 372, 66, 66, 47, 373, 145, 47, 47, 374, 47, 47, 360, 375, 376, 377, 378, 180, 47, 47, 379, 380, 47, 47, 160, 97, 47, 381, 382, 383, 47, 47, 384, 180, 47, 47, 385, 386, 387, 388, 145, - 47, 47, 389, 390, 32, 32, 32, 32, 47, 47, 365, 47, 47, 391, 172, 160, + 47, 47, 389, 390, 359, 32, 32, 32, 47, 47, 365, 47, 47, 391, 172, 160, 92, 47, 47, 113, 392, 393, 394, 32, 47, 47, 47, 395, 396, 397, 47, 47, 47, 47, 47, 398, 399, 160, 160, 160, 47, 47, 400, 401, 402, 403, 32, 32, 47, 47, 47, 404, 405, 160, 66, 66, 47, 47, 406, 407, 160, 160, 160, 160, 47, 143, 408, 409, 47, 47, 47, 47, 47, 47, 389, 410, 66, 66, 66, 66, 9, 9, 9, 9, 11, 11, 128, 411, 47, 47, 47, 412, 413, 160, 160, 160, 47, 47, 47, 47, 47, 414, 415, 416, 417, 47, 47, 418, 419, 420, 47, 47, - 421, 422, 66, 47, 47, 47, 47, 47, 47, 47, 400, 423, 424, 128, 145, 425, - 47, 156, 426, 427, 32, 32, 32, 32, 47, 47, 47, 359, 428, 160, 47, 47, - 429, 430, 160, 160, 160, 160, 160, 160, 47, 47, 47, 47, 47, 47, 47, 431, - 47, 47, 47, 47, 145, 432, 433, 434, 219, 219, 219, 219, 219, 219, 219, 66, - 47, 47, 47, 47, 47, 47, 47, 424, 47, 47, 47, 208, 208, 208, 208, 208, - 47, 47, 47, 47, 47, 47, 305, 47, 47, 47, 47, 47, 160, 47, 47, 435, - 47, 47, 47, 436, 437, 438, 439, 47, 9, 9, 9, 9, 9, 9, 11, 11, - 145, 440, 66, 66, 66, 66, 66, 66, 47, 47, 47, 47, 391, 441, 416, 416, - 442, 443, 27, 27, 27, 27, 444, 416, 47, 445, 208, 208, 208, 208, 208, 208, - 32, 32, 32, 32, 32, 146, 146, 146, 146, 146, 146, 146, 146, 146, 446, 447, - 448, 146, 449, 146, 146, 146, 146, 146, 146, 146, 146, 146, 450, 146, 146, 146, - 9, 451, 11, 452, 453, 11, 196, 9, 454, 455, 9, 456, 11, 9, 451, 11, - 452, 453, 11, 196, 9, 454, 455, 9, 456, 11, 9, 451, 11, 452, 453, 11, - 196, 9, 454, 455, 9, 456, 11, 9, 451, 11, 196, 9, 457, 458, 459, 460, - 11, 461, 9, 462, 463, 464, 465, 11, 466, 9, 467, 11, 468, 160, 160, 160, - 32, 32, 32, 469, 32, 32, 470, 471, 472, 473, 32, 32, 32, 32, 32, 32, - 474, 11, 11, 11, 11, 11, 11, 11, 32, 32, 32, 32, 32, 32, 32, 32, - 47, 47, 47, 475, 476, 146, 146, 146, 47, 47, 477, 32, 47, 47, 478, 479, - 47, 47, 47, 47, 355, 32, 32, 32, 9, 9, 454, 11, 480, 305, 66, 66, - 145, 145, 481, 482, 145, 145, 145, 145, 145, 145, 483, 145, 145, 145, 145, 145, - 47, 47, 47, 47, 47, 47, 47, 226, 484, 146, 146, 146, 146, 146, 146, 146, - 146, 146, 146, 146, 146, 146, 146, 485, 146, 146, 146, 146, 146, 146, 146, 160, + 421, 422, 66, 47, 47, 47, 47, 47, 66, 66, 66, 66, 66, 66, 66, 66, + 47, 47, 400, 423, 424, 128, 145, 425, 47, 156, 426, 427, 32, 32, 32, 32, + 47, 47, 47, 359, 428, 160, 47, 47, 429, 430, 160, 160, 160, 160, 160, 160, + 47, 47, 47, 47, 47, 47, 47, 431, 432, 47, 47, 433, 434, 160, 160, 160, + 47, 47, 47, 47, 145, 435, 436, 437, 219, 219, 219, 219, 219, 219, 219, 66, + 47, 47, 47, 47, 47, 47, 47, 424, 47, 47, 47, 208, 438, 32, 32, 32, + 47, 47, 47, 47, 47, 47, 305, 47, 47, 47, 47, 47, 160, 47, 47, 439, + 47, 47, 47, 440, 441, 442, 443, 47, 9, 9, 9, 9, 9, 9, 11, 11, + 145, 444, 66, 66, 66, 66, 66, 66, 47, 47, 47, 47, 391, 445, 416, 416, + 446, 447, 27, 27, 27, 27, 448, 416, 47, 449, 208, 208, 208, 208, 208, 208, + 32, 32, 32, 32, 32, 146, 146, 146, 146, 146, 146, 146, 146, 146, 450, 451, + 452, 146, 453, 146, 146, 146, 146, 146, 146, 146, 146, 146, 454, 146, 146, 146, + 9, 455, 11, 456, 457, 11, 196, 9, 458, 459, 9, 460, 11, 9, 455, 11, + 456, 457, 11, 196, 9, 458, 459, 9, 460, 11, 9, 455, 11, 456, 457, 11, + 196, 9, 458, 459, 9, 460, 11, 9, 455, 11, 196, 9, 461, 462, 463, 464, + 11, 465, 9, 466, 467, 468, 469, 11, 470, 9, 471, 11, 472, 160, 160, 160, + 32, 32, 32, 473, 32, 32, 474, 475, 476, 477, 32, 32, 32, 32, 32, 32, + 478, 11, 11, 11, 11, 11, 11, 11, 32, 32, 32, 27, 27, 27, 27, 27, + 32, 32, 32, 32, 32, 32, 32, 32, 47, 47, 47, 479, 480, 146, 146, 146, + 47, 47, 481, 32, 47, 47, 482, 483, 47, 47, 47, 47, 47, 47, 484, 160, + 47, 47, 47, 47, 355, 32, 32, 32, 9, 9, 458, 11, 485, 305, 66, 66, + 145, 145, 486, 487, 145, 145, 145, 145, 145, 145, 488, 145, 145, 145, 145, 145, + 47, 47, 47, 47, 47, 47, 47, 226, 489, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 490, 146, 146, 146, 146, 146, 146, 146, 160, 208, 208, 208, 208, 208, 208, 208, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 939, 940, 941, 942, 946, 948, 0, 962, 969, 970, 971, 976,1001,1002,1003,1008, 0,1033,1040,1041,1042,1043,1047, 0, @@ -5712,12 +5779,12 @@ _hb_ucd_i16[92] = static inline uint_fast8_t _hb_ucd_gc (unsigned u) { - return u<1114112u?_hb_ucd_u8[5056+(((_hb_ucd_u8[1168+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2; + return u<1114112u?_hb_ucd_u8[5080+(((_hb_ucd_u8[1152+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2; } static inline uint_fast8_t _hb_ucd_ccc (unsigned u) { - return u<125259u?_hb_ucd_u8[6970+(((_hb_ucd_u8[6426+(((_hb_ucd_u8[5982+(((_hb_ucd_u8[5646+(((_hb_ucd_u8[5400+(u>>2>>2>>2>>3)])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0; + return u<125259u?_hb_ucd_u8[7038+(((_hb_ucd_u8[6482+(((_hb_ucd_u8[6022+(((_hb_ucd_u8[5670+(((_hb_ucd_u8[5424+(u>>2>>2>>2>>3)])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0; } static inline unsigned _hb_ucd_b4 (const uint8_t* a, unsigned i) @@ -5727,17 +5794,17 @@ _hb_ucd_b4 (const uint8_t* a, unsigned i) static inline int_fast16_t _hb_ucd_bmg (unsigned u) { - return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[7858+(((_hb_ucd_u8[7626+(((_hb_ucd_u8[7530+(((_hb_ucd_b4(7466+_hb_ucd_u8,u>>1>>2>>3>>3))<<3)+((u>>1>>2>>3)&7u))])<<3)+((u>>1>>2)&7u))])<<2)+((u>>1)&3u))])<<1)+((u)&1u)]:0; + return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[7930+(((_hb_ucd_u8[7698+(((_hb_ucd_u8[7602+(((_hb_ucd_b4(7538+_hb_ucd_u8,u>>1>>2>>3>>3))<<3)+((u>>1>>2>>3)&7u))])<<3)+((u>>1>>2)&7u))])<<2)+((u>>1)&3u))])<<1)+((u)&1u)]:0; } static inline uint_fast8_t _hb_ucd_sc (unsigned u) { - return u<918016u?_hb_ucd_u8[11124+(((_hb_ucd_u8[10176+(((_hb_ucd_u8[9204+(((_hb_ucd_u8[8524+(((_hb_ucd_u8[8220+(((_hb_ucd_u8[8106+(u>>2>>2>>2>>3>>4)])<<4)+((u>>2>>2>>2>>3)&15u))])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:2; + return u<918016u?_hb_ucd_u8[11228+(((_hb_ucd_u8[10264+(((_hb_ucd_u8[9276+(((_hb_ucd_u8[8596+(((_hb_ucd_u8[8292+(((_hb_ucd_u8[8178+(u>>2>>2>>2>>3>>4)])<<4)+((u>>2>>2>>2>>3)&15u))])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:2; } static inline uint_fast16_t _hb_ucd_dm (unsigned u) { - return u<195102u?_hb_ucd_u16[1576+(((_hb_ucd_u8[12446+(((_hb_ucd_u8[12064+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0; + return u<195102u?_hb_ucd_u16[1608+(((_hb_ucd_u8[12570+(((_hb_ucd_u8[12188+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0; } #endif diff --git a/thirdparty/harfbuzz/src/hb-unicode-emoji-table.hh b/thirdparty/harfbuzz/src/hb-unicode-emoji-table.hh index 036c71a424..13b1c4b1d4 100644 --- a/thirdparty/harfbuzz/src/hb-unicode-emoji-table.hh +++ b/thirdparty/harfbuzz/src/hb-unicode-emoji-table.hh @@ -6,16 +6,16 @@ * * on file with this header: * - * # emoji-data-14.0.0.txt - * # Date: 2021-08-26, 17:22:22 GMT - * # © 2021 Unicode®, Inc. + * # emoji-data.txt + * # Date: 2022-08-02, 00:26:10 GMT + * # © 2022 Unicode®, Inc. * # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. - * # For terms of use, see http://www.unicode.org/terms_of_use.html + * # For terms of use, see https://www.unicode.org/terms_of_use.html * # * # Emoji Data for UTS #51 - * # Used with Emoji Version 14.0 and subsequent minor revisions (if any) + * # Used with Emoji Version 15.0 and subsequent minor revisions (if any) * # - * # For documentation and usage, see http://www.unicode.org/reports/tr51 + * # For documentation and usage, see https://www.unicode.org/reports/tr51 */ #ifndef HB_UNICODE_EMOJI_TABLE_HH diff --git a/thirdparty/harfbuzz/src/hb-version.h b/thirdparty/harfbuzz/src/hb-version.h index a1586a58b6..fa7403cae7 100644 --- a/thirdparty/harfbuzz/src/hb-version.h +++ b/thirdparty/harfbuzz/src/hb-version.h @@ -47,7 +47,7 @@ HB_BEGIN_DECLS * * The minor component of the library version available at compile-time. */ -#define HB_VERSION_MINOR 1 +#define HB_VERSION_MINOR 2 /** * HB_VERSION_MICRO: * @@ -60,7 +60,7 @@ HB_BEGIN_DECLS * * A string literal containing the library version available at compile-time. */ -#define HB_VERSION_STRING "5.1.0" +#define HB_VERSION_STRING "5.2.0" /** * HB_VERSION_ATLEAST: diff --git a/thirdparty/libpng/LICENSE b/thirdparty/libpng/LICENSE index e0c5b531cf..c8ad24eecf 100644 --- a/thirdparty/libpng/LICENSE +++ b/thirdparty/libpng/LICENSE @@ -4,8 +4,8 @@ COPYRIGHT NOTICE, DISCLAIMER, and LICENSE PNG Reference Library License version 2 --------------------------------------- - * Copyright (c) 1995-2019 The PNG Reference Library Authors. - * Copyright (c) 2018-2019 Cosmin Truta. + * Copyright (c) 1995-2022 The PNG Reference Library Authors. + * Copyright (c) 2018-2022 Cosmin Truta. * Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson. * Copyright (c) 1996-1997 Andreas Dilger. * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. diff --git a/thirdparty/libpng/arm/arm_init.c b/thirdparty/libpng/arm/arm_init.c index a34ecdbef7..ab22525b38 100644 --- a/thirdparty/libpng/arm/arm_init.c +++ b/thirdparty/libpng/arm/arm_init.c @@ -1,7 +1,7 @@ /* arm_init.c - NEON optimised filter functions * - * Copyright (c) 2018 Cosmin Truta + * Copyright (c) 2018-2022 Cosmin Truta * Copyright (c) 2014,2016 Glenn Randers-Pehrson * Written by Mans Rullgard, 2011. * @@ -10,9 +10,7 @@ * and license in png.h */ -/* Below, after checking __linux__, various non-C90 POSIX 1003.1 functions are - * called. - */ +/* This module requires POSIX 1003.1 functions. */ #define _POSIX_SOURCE 1 #include "../pngpriv.h" @@ -33,21 +31,23 @@ * has partial support is contrib/arm-neon/linux.c - a generic Linux * implementation which reads /proc/cpufino. */ +#include <signal.h> /* for sig_atomic_t */ + #ifndef PNG_ARM_NEON_FILE -# ifdef __linux__ -# define PNG_ARM_NEON_FILE "contrib/arm-neon/linux.c" +# if defined(__aarch64__) || defined(_M_ARM64) + /* ARM Neon is expected to be unconditionally available on ARM64. */ +# error "PNG_ARM_NEON_CHECK_SUPPORTED must not be defined on this platform" +# elif defined(__linux__) +# define PNG_ARM_NEON_FILE "contrib/arm-neon/linux.c" +# else +# error "No support for run-time ARM Neon checking; use compile-time options" # endif #endif -#ifdef PNG_ARM_NEON_FILE - -#include <signal.h> /* for sig_atomic_t */ static int png_have_neon(png_structp png_ptr); -#include PNG_ARM_NEON_FILE - -#else /* PNG_ARM_NEON_FILE */ -# error "PNG_ARM_NEON_FILE undefined: no support for run-time ARM NEON checks" -#endif /* PNG_ARM_NEON_FILE */ +#ifdef PNG_ARM_NEON_FILE +# include PNG_ARM_NEON_FILE +#endif #endif /* PNG_ARM_NEON_CHECK_SUPPORTED */ #ifndef PNG_ALIGNED_MEMORY_SUPPORTED diff --git a/thirdparty/libpng/arm/filter_neon_intrinsics.c b/thirdparty/libpng/arm/filter_neon_intrinsics.c index 553c0be21c..4466d48b20 100644 --- a/thirdparty/libpng/arm/filter_neon_intrinsics.c +++ b/thirdparty/libpng/arm/filter_neon_intrinsics.c @@ -18,7 +18,7 @@ /* This code requires -mfpu=neon on the command line: */ #if PNG_ARM_NEON_IMPLEMENTATION == 1 /* intrinsics code from pngpriv.h */ -#if defined(_MSC_VER) && defined(_M_ARM64) +#if defined(_MSC_VER) && !defined(__clang__) && defined(_M_ARM64) # include <arm64_neon.h> #else # include <arm_neon.h> diff --git a/thirdparty/libpng/arm/palette_neon_intrinsics.c b/thirdparty/libpng/arm/palette_neon_intrinsics.c index b4d1fd2abf..92c7d6f9f6 100644 --- a/thirdparty/libpng/arm/palette_neon_intrinsics.c +++ b/thirdparty/libpng/arm/palette_neon_intrinsics.c @@ -14,7 +14,7 @@ #if PNG_ARM_NEON_IMPLEMENTATION == 1 -#if defined(_MSC_VER) && defined(_M_ARM64) +#if defined(_MSC_VER) && !defined(__clang__) && defined(_M_ARM64) # include <arm64_neon.h> #else # include <arm_neon.h> @@ -30,8 +30,6 @@ png_riffle_palette_neon(png_structrp png_ptr) int num_trans = png_ptr->num_trans; int i; - png_debug(1, "in png_riffle_palette_neon"); - /* Initially black, opaque. */ uint8x16x4_t w = {{ vdupq_n_u8(0x00), @@ -40,6 +38,8 @@ png_riffle_palette_neon(png_structrp png_ptr) vdupq_n_u8(0xff), }}; + png_debug(1, "in png_riffle_palette_neon"); + /* First, riffle the RGB colours into an RGBA8 palette. * The alpha component is set to opaque for now. */ @@ -65,11 +65,12 @@ png_do_expand_palette_rgba8_neon(png_structrp png_ptr, png_row_infop row_info, png_uint_32 row_width = row_info->width; const png_uint_32 *riffled_palette = (const png_uint_32 *)png_ptr->riffled_palette; - const png_int_32 pixels_per_chunk = 4; - int i; + const png_uint_32 pixels_per_chunk = 4; + png_uint_32 i; png_debug(1, "in png_do_expand_palette_rgba8_neon"); + PNG_UNUSED(row) if (row_width < pixels_per_chunk) return 0; @@ -109,10 +110,11 @@ png_do_expand_palette_rgb8_neon(png_structrp png_ptr, png_row_infop row_info, png_uint_32 row_width = row_info->width; png_const_bytep palette = (png_const_bytep)png_ptr->palette; const png_uint_32 pixels_per_chunk = 8; - int i; + png_uint_32 i; png_debug(1, "in png_do_expand_palette_rgb8_neon"); + PNG_UNUSED(row) if (row_width <= pixels_per_chunk) return 0; diff --git a/thirdparty/libpng/png.c b/thirdparty/libpng/png.c index 757c755f97..fc09564262 100644 --- a/thirdparty/libpng/png.c +++ b/thirdparty/libpng/png.c @@ -1,7 +1,7 @@ /* png.c - location for general purpose libpng functions * - * Copyright (c) 2018-2019 Cosmin Truta + * Copyright (c) 2018-2022 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson * Copyright (c) 1996-1997 Andreas Dilger * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -14,7 +14,7 @@ #include "pngpriv.h" /* Generate a compiler error if there is an old png.h in the search path. */ -typedef png_libpng_version_1_6_37 Your_png_h_is_not_version_1_6_37; +typedef png_libpng_version_1_6_38 Your_png_h_is_not_version_1_6_38; #ifdef __GNUC__ /* The version tests may need to be added to, but the problem warning has @@ -720,7 +720,7 @@ png_init_io(png_structrp png_ptr, png_FILE_p fp) * * Where UNSIGNED_MAX is the appropriate maximum unsigned value, so when the * negative integral value is added the result will be an unsigned value - * correspnding to the 2's complement representation. + * corresponding to the 2's complement representation. */ void PNGAPI png_save_int_32(png_bytep buf, png_int_32 i) @@ -815,8 +815,8 @@ png_get_copyright(png_const_structrp png_ptr) return PNG_STRING_COPYRIGHT #else return PNG_STRING_NEWLINE \ - "libpng version 1.6.37" PNG_STRING_NEWLINE \ - "Copyright (c) 2018-2019 Cosmin Truta" PNG_STRING_NEWLINE \ + "libpng version 1.6.38" PNG_STRING_NEWLINE \ + "Copyright (c) 2018-2022 Cosmin Truta" PNG_STRING_NEWLINE \ "Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson" \ PNG_STRING_NEWLINE \ "Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \ @@ -1843,12 +1843,12 @@ png_icc_profile_error(png_const_structrp png_ptr, png_colorspacerp colorspace, # ifdef PNG_WARNINGS_SUPPORTED else { - char number[PNG_NUMBER_BUFFER_SIZE]; /* +24 = 114*/ + char number[PNG_NUMBER_BUFFER_SIZE]; /* +24 = 114 */ pos = png_safecat(message, (sizeof message), pos, png_format_number(number, number+(sizeof number), PNG_NUMBER_FORMAT_x, value)); - pos = png_safecat(message, (sizeof message), pos, "h: "); /*+2 = 116*/ + pos = png_safecat(message, (sizeof message), pos, "h: "); /* +2 = 116 */ } # endif /* The 'reason' is an arbitrary message, allow +79 maximum 195 */ diff --git a/thirdparty/libpng/png.h b/thirdparty/libpng/png.h index b12174ba35..5fb494fb1a 100644 --- a/thirdparty/libpng/png.h +++ b/thirdparty/libpng/png.h @@ -1,9 +1,9 @@ /* png.h - header file for PNG reference library * - * libpng version 1.6.37 - April 14, 2019 + * libpng version 1.6.38 - September 14, 2022 * - * Copyright (c) 2018-2019 Cosmin Truta + * Copyright (c) 2018-2022 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson * Copyright (c) 1996-1997 Andreas Dilger * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -15,7 +15,7 @@ * libpng versions 0.89, June 1996, through 0.96, May 1997: Andreas Dilger * libpng versions 0.97, January 1998, through 1.6.35, July 2018: * Glenn Randers-Pehrson - * libpng versions 1.6.36, December 2018, through 1.6.37, April 2019: + * libpng versions 1.6.36, December 2018, through 1.6.38, September 2022: * Cosmin Truta * See also "Contributing Authors", below. */ @@ -27,8 +27,8 @@ * PNG Reference Library License version 2 * --------------------------------------- * - * * Copyright (c) 1995-2019 The PNG Reference Library Authors. - * * Copyright (c) 2018-2019 Cosmin Truta. + * * Copyright (c) 1995-2022 The PNG Reference Library Authors. + * * Copyright (c) 2018-2022 Cosmin Truta. * * Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson. * * Copyright (c) 1996-1997 Andreas Dilger. * * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -239,7 +239,7 @@ * ... * 1.5.30 15 10530 15.so.15.30[.0] * ... - * 1.6.37 16 10637 16.so.16.37[.0] + * 1.6.38 16 10638 16.so.16.38[.0] * * Henceforth the source version will match the shared-library major and * minor numbers; the shared-library major version number will be used for @@ -278,8 +278,8 @@ */ /* Version information for png.h - this should match the version in png.c */ -#define PNG_LIBPNG_VER_STRING "1.6.37" -#define PNG_HEADER_VERSION_STRING " libpng version 1.6.37 - April 14, 2019\n" +#define PNG_LIBPNG_VER_STRING "1.6.38" +#define PNG_HEADER_VERSION_STRING " libpng version 1.6.38 - September 14, 2022\n" #define PNG_LIBPNG_VER_SONUM 16 #define PNG_LIBPNG_VER_DLLNUM 16 @@ -287,7 +287,7 @@ /* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */ #define PNG_LIBPNG_VER_MAJOR 1 #define PNG_LIBPNG_VER_MINOR 6 -#define PNG_LIBPNG_VER_RELEASE 37 +#define PNG_LIBPNG_VER_RELEASE 38 /* This should be zero for a public release, or non-zero for a * development version. [Deprecated] @@ -318,7 +318,7 @@ * From version 1.0.1 it is: * XXYYZZ, where XX=major, YY=minor, ZZ=release */ -#define PNG_LIBPNG_VER 10637 /* 1.6.37 */ +#define PNG_LIBPNG_VER 10638 /* 1.6.38 */ /* Library configuration: these options cannot be changed after * the library has been built. @@ -330,10 +330,6 @@ # include "pnglibconf.h" #endif -#define PNG_APNG_SUPPORTED -#define PNG_READ_APNG_SUPPORTED -#define PNG_WRITE_APNG_SUPPORTED - #ifndef PNG_VERSION_INFO_ONLY /* Machine specific configuration. */ # include "pngconf.h" @@ -429,21 +425,10 @@ extern "C" { * See pngconf.h for base types that vary by machine/system */ -#ifdef PNG_APNG_SUPPORTED -/* dispose_op flags from inside fcTL */ -#define PNG_DISPOSE_OP_NONE 0x00U -#define PNG_DISPOSE_OP_BACKGROUND 0x01U -#define PNG_DISPOSE_OP_PREVIOUS 0x02U - -/* blend_op flags from inside fcTL */ -#define PNG_BLEND_OP_SOURCE 0x00U -#define PNG_BLEND_OP_OVER 0x01U -#endif /* PNG_APNG_SUPPORTED */ - /* This triggers a compiler error in png.c, if png.c and png.h * do not agree upon the version number. */ -typedef char* png_libpng_version_1_6_37; +typedef char* png_libpng_version_1_6_38; /* Basic control structions. Read libpng-manual.txt or libpng.3 for more info. * @@ -761,10 +746,6 @@ typedef png_unknown_chunk * * png_unknown_chunkpp; #define PNG_INFO_sCAL 0x4000U /* ESR, 1.0.6 */ #define PNG_INFO_IDAT 0x8000U /* ESR, 1.0.6 */ #define PNG_INFO_eXIf 0x10000U /* GR-P, 1.6.31 */ -#ifdef PNG_APNG_SUPPORTED -#define PNG_INFO_acTL 0x20000U -#define PNG_INFO_fcTL 0x40000U -#endif /* This is used for the transformation routines, as some of them * change these values for the row. It also should enable using @@ -802,10 +783,6 @@ typedef PNG_CALLBACK(void, *png_write_status_ptr, (png_structp, png_uint_32, #ifdef PNG_PROGRESSIVE_READ_SUPPORTED typedef PNG_CALLBACK(void, *png_progressive_info_ptr, (png_structp, png_infop)); typedef PNG_CALLBACK(void, *png_progressive_end_ptr, (png_structp, png_infop)); -#ifdef PNG_APNG_SUPPORTED -typedef PNG_CALLBACK(void, *png_progressive_frame_ptr, (png_structp, - png_uint_32)); -#endif /* The following callback receives png_uint_32 row_number, int pass for the * png_bytep data of the row. When transforming an interlaced image the @@ -1469,7 +1446,7 @@ PNG_EXPORT(66, void, png_set_crc_action, (png_structrp png_ptr, int crit_action, * mainly useful for testing, as the defaults should work with most users. * Those users who are tight on memory or want faster performance at the * expense of compression can modify them. See the compression library - * header file (zlib.h) for an explination of the compression functions. + * header file (zlib.h) for an explanation of the compression functions. */ /* Set the filtering method(s) used by libpng. Currently, the only valid @@ -1524,7 +1501,7 @@ PNG_FIXED_EXPORT(209, void, png_set_filter_heuristics_fixed, * 0 - 9, corresponding directly to the zlib compression levels 0 - 9 * (0 - no compression, 9 - "maximal" compression). Note that tests have * shown that zlib compression levels 3-6 usually perform as well as level 9 - * for PNG images, and do considerably fewer caclulations. In the future, + * for PNG images, and do considerably fewer calculations. In the future, * these values may not correspond directly to the zlib compression levels. */ #ifdef PNG_WRITE_CUSTOMIZE_COMPRESSION_SUPPORTED @@ -3249,74 +3226,6 @@ PNG_EXPORT(244, int, png_set_option, (png_structrp png_ptr, int option, /******************************************************************************* * END OF HARDWARE AND SOFTWARE OPTIONS ******************************************************************************/ -#ifdef PNG_APNG_SUPPORTED -PNG_EXPORT(250, png_uint_32, png_get_acTL, (png_structp png_ptr, - png_infop info_ptr, png_uint_32 *num_frames, png_uint_32 *num_plays)); - -PNG_EXPORT(251, png_uint_32, png_set_acTL, (png_structp png_ptr, - png_infop info_ptr, png_uint_32 num_frames, png_uint_32 num_plays)); - -PNG_EXPORT(252, png_uint_32, png_get_num_frames, (png_structp png_ptr, - png_infop info_ptr)); - -PNG_EXPORT(253, png_uint_32, png_get_num_plays, (png_structp png_ptr, - png_infop info_ptr)); - -PNG_EXPORT(254, png_uint_32, png_get_next_frame_fcTL, - (png_structp png_ptr, png_infop info_ptr, png_uint_32 *width, - png_uint_32 *height, png_uint_32 *x_offset, png_uint_32 *y_offset, - png_uint_16 *delay_num, png_uint_16 *delay_den, png_byte *dispose_op, - png_byte *blend_op)); - -PNG_EXPORT(255, png_uint_32, png_set_next_frame_fcTL, - (png_structp png_ptr, png_infop info_ptr, png_uint_32 width, - png_uint_32 height, png_uint_32 x_offset, png_uint_32 y_offset, - png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op, - png_byte blend_op)); - -PNG_EXPORT(256, png_uint_32, png_get_next_frame_width, - (png_structp png_ptr, png_infop info_ptr)); -PNG_EXPORT(257, png_uint_32, png_get_next_frame_height, - (png_structp png_ptr, png_infop info_ptr)); -PNG_EXPORT(258, png_uint_32, png_get_next_frame_x_offset, - (png_structp png_ptr, png_infop info_ptr)); -PNG_EXPORT(259, png_uint_32, png_get_next_frame_y_offset, - (png_structp png_ptr, png_infop info_ptr)); -PNG_EXPORT(260, png_uint_16, png_get_next_frame_delay_num, - (png_structp png_ptr, png_infop info_ptr)); -PNG_EXPORT(261, png_uint_16, png_get_next_frame_delay_den, - (png_structp png_ptr, png_infop info_ptr)); -PNG_EXPORT(262, png_byte, png_get_next_frame_dispose_op, - (png_structp png_ptr, png_infop info_ptr)); -PNG_EXPORT(263, png_byte, png_get_next_frame_blend_op, - (png_structp png_ptr, png_infop info_ptr)); -PNG_EXPORT(264, png_byte, png_get_first_frame_is_hidden, - (png_structp png_ptr, png_infop info_ptr)); -PNG_EXPORT(265, png_uint_32, png_set_first_frame_is_hidden, - (png_structp png_ptr, png_infop info_ptr, png_byte is_hidden)); - -#ifdef PNG_READ_APNG_SUPPORTED -PNG_EXPORT(266, void, png_read_frame_head, (png_structp png_ptr, - png_infop info_ptr)); -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED -PNG_EXPORT(267, void, png_set_progressive_frame_fn, (png_structp png_ptr, - png_progressive_frame_ptr frame_info_fn, - png_progressive_frame_ptr frame_end_fn)); -#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ -#endif /* PNG_READ_APNG_SUPPORTED */ - -#ifdef PNG_WRITE_APNG_SUPPORTED -PNG_EXPORT(268, void, png_write_frame_head, (png_structp png_ptr, - png_infop info_ptr, png_bytepp row_pointers, - png_uint_32 width, png_uint_32 height, - png_uint_32 x_offset, png_uint_32 y_offset, - png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op, - png_byte blend_op)); - -PNG_EXPORT(269, void, png_write_frame_tail, (png_structp png_ptr, - png_infop info_ptr)); -#endif /* PNG_WRITE_APNG_SUPPORTED */ -#endif /* PNG_APNG_SUPPORTED */ /* Maintainer: Put new public prototypes here ^, in libpng.3, in project * defs, and in scripts/symbols.def. @@ -3326,11 +3235,7 @@ PNG_EXPORT(269, void, png_write_frame_tail, (png_structp png_ptr, * one to use is one more than this.) */ #ifdef PNG_EXPORT_LAST_ORDINAL -#ifdef PNG_APNG_SUPPORTED - PNG_EXPORT_LAST_ORDINAL(269); -#else PNG_EXPORT_LAST_ORDINAL(249); -#endif /* PNG_APNG_SUPPORTED */ #endif #ifdef __cplusplus diff --git a/thirdparty/libpng/pngconf.h b/thirdparty/libpng/pngconf.h index 927a769dbe..89d28f83a0 100644 --- a/thirdparty/libpng/pngconf.h +++ b/thirdparty/libpng/pngconf.h @@ -1,9 +1,9 @@ /* pngconf.h - machine-configurable file for libpng * - * libpng version 1.6.37 + * libpng version 1.6.38 * - * Copyright (c) 2018-2019 Cosmin Truta + * Copyright (c) 2018-2022 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2016,2018 Glenn Randers-Pehrson * Copyright (c) 1996-1997 Andreas Dilger * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -180,8 +180,8 @@ * compiler-specific macros to the values required to change the calling * conventions of the various functions. */ -#if defined(_Windows) || defined(_WINDOWS) || defined(WIN32) ||\ - defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +#if defined(_WIN32) || defined(__WIN32__) || defined(__NT__) || \ + defined(__CYGWIN__) /* Windows system (DOS doesn't support DLLs). Includes builds under Cygwin or * MinGW on any architecture currently supported by Windows. Also includes * Watcom builds but these need special treatment because they are not diff --git a/thirdparty/libpng/pngget.c b/thirdparty/libpng/pngget.c index 9ed101aedc..e44933c0d2 100644 --- a/thirdparty/libpng/pngget.c +++ b/thirdparty/libpng/pngget.c @@ -1151,7 +1151,7 @@ png_get_unknown_chunks(png_const_structrp png_ptr, png_inforp info_ptr, #ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED png_byte PNGAPI -png_get_rgb_to_gray_status (png_const_structrp png_ptr) +png_get_rgb_to_gray_status(png_const_structrp png_ptr) { return (png_byte)(png_ptr ? png_ptr->rgb_to_gray_status : 0); } @@ -1192,27 +1192,27 @@ png_get_compression_buffer_size(png_const_structrp png_ptr) /* These functions were added to libpng 1.2.6 and were enabled * by default in libpng-1.4.0 */ png_uint_32 PNGAPI -png_get_user_width_max (png_const_structrp png_ptr) +png_get_user_width_max(png_const_structrp png_ptr) { return (png_ptr ? png_ptr->user_width_max : 0); } png_uint_32 PNGAPI -png_get_user_height_max (png_const_structrp png_ptr) +png_get_user_height_max(png_const_structrp png_ptr) { return (png_ptr ? png_ptr->user_height_max : 0); } /* This function was added to libpng 1.4.0 */ png_uint_32 PNGAPI -png_get_chunk_cache_max (png_const_structrp png_ptr) +png_get_chunk_cache_max(png_const_structrp png_ptr) { return (png_ptr ? png_ptr->user_chunk_cache_max : 0); } /* This function was added to libpng 1.4.1 */ png_alloc_size_t PNGAPI -png_get_chunk_malloc_max (png_const_structrp png_ptr) +png_get_chunk_malloc_max(png_const_structrp png_ptr) { return (png_ptr ? png_ptr->user_chunk_malloc_max : 0); } @@ -1221,13 +1221,13 @@ png_get_chunk_malloc_max (png_const_structrp png_ptr) /* These functions were added to libpng 1.4.0 */ #ifdef PNG_IO_STATE_SUPPORTED png_uint_32 PNGAPI -png_get_io_state (png_const_structrp png_ptr) +png_get_io_state(png_const_structrp png_ptr) { return png_ptr->io_state; } png_uint_32 PNGAPI -png_get_io_chunk_type (png_const_structrp png_ptr) +png_get_io_chunk_type(png_const_structrp png_ptr) { return png_ptr->chunk_name; } @@ -1246,166 +1246,4 @@ png_get_palette_max(png_const_structp png_ptr, png_const_infop info_ptr) # endif #endif -#ifdef PNG_APNG_SUPPORTED -png_uint_32 PNGAPI -png_get_acTL(png_structp png_ptr, png_infop info_ptr, - png_uint_32 *num_frames, png_uint_32 *num_plays) -{ - png_debug1(1, "in %s retrieval function", "acTL"); - - if (png_ptr != NULL && info_ptr != NULL && - (info_ptr->valid & PNG_INFO_acTL) && - num_frames != NULL && num_plays != NULL) - { - *num_frames = info_ptr->num_frames; - *num_plays = info_ptr->num_plays; - return (1); - } - - return (0); -} - -png_uint_32 PNGAPI -png_get_num_frames(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_get_num_frames()"); - - if (png_ptr != NULL && info_ptr != NULL) - return (info_ptr->num_frames); - return (0); -} - -png_uint_32 PNGAPI -png_get_num_plays(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_get_num_plays()"); - - if (png_ptr != NULL && info_ptr != NULL) - return (info_ptr->num_plays); - return (0); -} - -png_uint_32 PNGAPI -png_get_next_frame_fcTL(png_structp png_ptr, png_infop info_ptr, - png_uint_32 *width, png_uint_32 *height, - png_uint_32 *x_offset, png_uint_32 *y_offset, - png_uint_16 *delay_num, png_uint_16 *delay_den, - png_byte *dispose_op, png_byte *blend_op) -{ - png_debug1(1, "in %s retrieval function", "fcTL"); - - if (png_ptr != NULL && info_ptr != NULL && - (info_ptr->valid & PNG_INFO_fcTL) && - width != NULL && height != NULL && - x_offset != NULL && y_offset != NULL && - delay_num != NULL && delay_den != NULL && - dispose_op != NULL && blend_op != NULL) - { - *width = info_ptr->next_frame_width; - *height = info_ptr->next_frame_height; - *x_offset = info_ptr->next_frame_x_offset; - *y_offset = info_ptr->next_frame_y_offset; - *delay_num = info_ptr->next_frame_delay_num; - *delay_den = info_ptr->next_frame_delay_den; - *dispose_op = info_ptr->next_frame_dispose_op; - *blend_op = info_ptr->next_frame_blend_op; - return (1); - } - - return (0); -} - -png_uint_32 PNGAPI -png_get_next_frame_width(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_get_next_frame_width()"); - - if (png_ptr != NULL && info_ptr != NULL) - return (info_ptr->next_frame_width); - return (0); -} - -png_uint_32 PNGAPI -png_get_next_frame_height(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_get_next_frame_height()"); - - if (png_ptr != NULL && info_ptr != NULL) - return (info_ptr->next_frame_height); - return (0); -} - -png_uint_32 PNGAPI -png_get_next_frame_x_offset(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_get_next_frame_x_offset()"); - - if (png_ptr != NULL && info_ptr != NULL) - return (info_ptr->next_frame_x_offset); - return (0); -} - -png_uint_32 PNGAPI -png_get_next_frame_y_offset(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_get_next_frame_y_offset()"); - - if (png_ptr != NULL && info_ptr != NULL) - return (info_ptr->next_frame_y_offset); - return (0); -} - -png_uint_16 PNGAPI -png_get_next_frame_delay_num(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_get_next_frame_delay_num()"); - - if (png_ptr != NULL && info_ptr != NULL) - return (info_ptr->next_frame_delay_num); - return (0); -} - -png_uint_16 PNGAPI -png_get_next_frame_delay_den(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_get_next_frame_delay_den()"); - - if (png_ptr != NULL && info_ptr != NULL) - return (info_ptr->next_frame_delay_den); - return (0); -} - -png_byte PNGAPI -png_get_next_frame_dispose_op(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_get_next_frame_dispose_op()"); - - if (png_ptr != NULL && info_ptr != NULL) - return (info_ptr->next_frame_dispose_op); - return (0); -} - -png_byte PNGAPI -png_get_next_frame_blend_op(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_get_next_frame_blend_op()"); - - if (png_ptr != NULL && info_ptr != NULL) - return (info_ptr->next_frame_blend_op); - return (0); -} - -png_byte PNGAPI -png_get_first_frame_is_hidden(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_first_frame_is_hidden()"); - - if (png_ptr != NULL) - return (png_byte)(png_ptr->apng_flags & PNG_FIRST_FRAME_HIDDEN); - - PNG_UNUSED(info_ptr) - - return 0; -} -#endif /* PNG_APNG_SUPPORTED */ #endif /* READ || WRITE */ diff --git a/thirdparty/libpng/pnginfo.h b/thirdparty/libpng/pnginfo.h index ac7b269132..1f98dedc42 100644 --- a/thirdparty/libpng/pnginfo.h +++ b/thirdparty/libpng/pnginfo.h @@ -263,18 +263,5 @@ defined(PNG_READ_BACKGROUND_SUPPORTED) png_bytepp row_pointers; /* the image bits */ #endif -#ifdef PNG_APNG_SUPPORTED - png_uint_32 num_frames; /* including default image */ - png_uint_32 num_plays; - png_uint_32 next_frame_width; - png_uint_32 next_frame_height; - png_uint_32 next_frame_x_offset; - png_uint_32 next_frame_y_offset; - png_uint_16 next_frame_delay_num; - png_uint_16 next_frame_delay_den; - png_byte next_frame_dispose_op; - png_byte next_frame_blend_op; -#endif - }; #endif /* PNGINFO_H */ diff --git a/thirdparty/libpng/pnglibconf.h b/thirdparty/libpng/pnglibconf.h index e1e27e957e..89d5b4c8ad 100644 --- a/thirdparty/libpng/pnglibconf.h +++ b/thirdparty/libpng/pnglibconf.h @@ -1,8 +1,8 @@ /* pnglibconf.h - library build configuration */ -/* libpng version 1.6.37 */ +/* libpng version 1.6.38 */ -/* Copyright (c) 2018-2019 Cosmin Truta */ +/* Copyright (c) 2018-2022 Cosmin Truta */ /* Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson */ /* This code is released under the libpng license. */ diff --git a/thirdparty/libpng/pngpread.c b/thirdparty/libpng/pngpread.c index 2eaeca08f7..e283627b77 100644 --- a/thirdparty/libpng/pngpread.c +++ b/thirdparty/libpng/pngpread.c @@ -195,106 +195,6 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) chunk_name = png_ptr->chunk_name; -#ifdef PNG_READ_APNG_SUPPORTED - if (png_ptr->num_frames_read > 0 && - png_ptr->num_frames_read < info_ptr->num_frames) - { - if (chunk_name == png_IDAT) - { - /* Discard trailing IDATs for the first frame */ - if (png_ptr->mode & PNG_HAVE_fcTL || png_ptr->num_frames_read > 1) - png_error(png_ptr, "out of place IDAT"); - - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - - png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; - return; - } - else if (chunk_name == png_fdAT) - { - if (png_ptr->buffer_size < 4) - { - png_push_save_buffer(png_ptr); - return; - } - - png_ensure_sequence_number(png_ptr, 4); - - if (!(png_ptr->mode & PNG_HAVE_fcTL)) - { - /* Discard trailing fdATs for frames other than the first */ - if (png_ptr->num_frames_read < 2) - png_error(png_ptr, "out of place fdAT"); - - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - - png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; - return; - } - - else - { - /* frame data follows */ - png_ptr->idat_size = png_ptr->push_length - 4; - png_ptr->mode |= PNG_HAVE_IDAT; - png_ptr->process_mode = PNG_READ_IDAT_MODE; - - return; - } - } - - else if (chunk_name == png_fcTL) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - - png_read_reset(png_ptr); - png_ptr->mode &= ~PNG_HAVE_fcTL; - - png_handle_fcTL(png_ptr, info_ptr, png_ptr->push_length); - - if (!(png_ptr->mode & PNG_HAVE_fcTL)) - png_error(png_ptr, "missing required fcTL chunk"); - - png_read_reinit(png_ptr, info_ptr); - png_progressive_read_reset(png_ptr); - - if (png_ptr->frame_info_fn != NULL) - (*(png_ptr->frame_info_fn))(png_ptr, png_ptr->num_frames_read); - - png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; - - return; - } - - else - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - png_warning(png_ptr, "Skipped (ignored) a chunk " - "between APNG chunks"); - png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; - return; - } - - return; - } -#endif /* PNG_READ_APNG_SUPPORTED */ - if (chunk_name == png_IDAT) { if ((png_ptr->mode & PNG_AFTER_IDAT) != 0) @@ -361,9 +261,6 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) else if (chunk_name == png_IDAT) { -#ifdef PNG_READ_APNG_SUPPORTED - png_have_info(png_ptr, info_ptr); -#endif png_ptr->idat_size = png_ptr->push_length; png_ptr->process_mode = PNG_READ_IDAT_MODE; png_push_have_info(png_ptr, info_ptr); @@ -509,30 +406,6 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) png_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length); } #endif -#ifdef PNG_READ_APNG_SUPPORTED - else if (chunk_name == png_acTL) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - - png_handle_acTL(png_ptr, info_ptr, png_ptr->push_length); - } - - else if (chunk_name == png_fcTL) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - - png_handle_fcTL(png_ptr, info_ptr, png_ptr->push_length); - } - -#endif /* PNG_READ_APNG_SUPPORTED */ else { @@ -666,11 +539,7 @@ png_push_read_IDAT(png_structrp png_ptr) png_byte chunk_tag[4]; /* TODO: this code can be commoned up with the same code in push_read */ -#ifdef PNG_READ_APNG_SUPPORTED - PNG_PUSH_SAVE_BUFFER_IF_LT(12) -#else PNG_PUSH_SAVE_BUFFER_IF_LT(8) -#endif png_push_fill_buffer(png_ptr, chunk_length, 4); png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length); png_reset_crc(png_ptr); @@ -678,64 +547,17 @@ png_push_read_IDAT(png_structrp png_ptr) png_ptr->chunk_name = PNG_CHUNK_FROM_STRING(chunk_tag); png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; -#ifdef PNG_READ_APNG_SUPPORTED - if (png_ptr->chunk_name != png_fdAT && png_ptr->num_frames_read > 0) - { - if (png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED) - { - png_ptr->process_mode = PNG_READ_CHUNK_MODE; - if (png_ptr->frame_end_fn != NULL) - (*(png_ptr->frame_end_fn))(png_ptr, png_ptr->num_frames_read); - png_ptr->num_frames_read++; - return; - } - else - { - if (png_ptr->chunk_name == png_IEND) - png_error(png_ptr, "Not enough image data"); - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - png_warning(png_ptr, "Skipping (ignoring) a chunk between " - "APNG chunks"); - png_crc_finish(png_ptr, png_ptr->push_length); - png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; - return; - } - } - else -#endif -#ifdef PNG_READ_APNG_SUPPORTED - if (png_ptr->chunk_name != png_IDAT && png_ptr->num_frames_read == 0) -#else if (png_ptr->chunk_name != png_IDAT) -#endif { png_ptr->process_mode = PNG_READ_CHUNK_MODE; if ((png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED) == 0) png_error(png_ptr, "Not enough compressed data"); -#ifdef PNG_READ_APNG_SUPPORTED - if (png_ptr->frame_end_fn != NULL) - (*(png_ptr->frame_end_fn))(png_ptr, png_ptr->num_frames_read); - png_ptr->num_frames_read++; -#endif - return; } png_ptr->idat_size = png_ptr->push_length; - -#ifdef PNG_READ_APNG_SUPPORTED - if (png_ptr->num_frames_read > 0) - { - png_ensure_sequence_number(png_ptr, 4); - png_ptr->idat_size -= 4; - } -#endif } if (png_ptr->idat_size != 0 && png_ptr->save_buffer_size != 0) @@ -809,15 +631,6 @@ png_process_IDAT_data(png_structrp png_ptr, png_bytep buffer, if (!(buffer_length > 0) || buffer == NULL) png_error(png_ptr, "No IDAT data (internal error)"); -#ifdef PNG_READ_APNG_SUPPORTED - /* If the app is not APNG-aware, decode only the first frame */ - if (!(png_ptr->apng_flags & PNG_APNG_APP) && png_ptr->num_frames_read > 0) - { - png_ptr->flags |= PNG_FLAG_ZSTREAM_ENDED; - return; - } -#endif - /* This routine must process all the data it has been given * before returning, calling the row callback as required to * handle the uncompressed results. @@ -1272,18 +1085,6 @@ png_set_progressive_read_fn(png_structrp png_ptr, png_voidp progressive_ptr, png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer); } -#ifdef PNG_READ_APNG_SUPPORTED -void PNGAPI -png_set_progressive_frame_fn(png_structp png_ptr, - png_progressive_frame_ptr frame_info_fn, - png_progressive_frame_ptr frame_end_fn) -{ - png_ptr->frame_info_fn = frame_info_fn; - png_ptr->frame_end_fn = frame_end_fn; - png_ptr->apng_flags |= PNG_APNG_APP; -} -#endif - png_voidp PNGAPI png_get_progressive_ptr(png_const_structrp png_ptr) { diff --git a/thirdparty/libpng/pngpriv.h b/thirdparty/libpng/pngpriv.h index 57e1bf989b..2e426cf47d 100644 --- a/thirdparty/libpng/pngpriv.h +++ b/thirdparty/libpng/pngpriv.h @@ -1,7 +1,7 @@ /* pngpriv.h - private declarations for use inside libpng * - * Copyright (c) 2018-2019 Cosmin Truta + * Copyright (c) 2018-2022 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson * Copyright (c) 1996-1997 Andreas Dilger * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -174,7 +174,7 @@ # else /* !defined __ARM_NEON__ */ /* The 'intrinsics' code simply won't compile without this -mfpu=neon: */ -# if !defined(__aarch64__) +# if !defined(__aarch64__) && !defined(_M_ARM64) /* The assembler code currently does not work on ARM64 */ # define PNG_ARM_NEON_IMPLEMENTATION 2 # endif /* __aarch64__ */ @@ -185,6 +185,8 @@ /* Use the intrinsics code by default. */ # define PNG_ARM_NEON_IMPLEMENTATION 1 # endif +#else /* PNG_ARM_NEON_OPT == 0 */ +# define PNG_ARM_NEON_IMPLEMENTATION 0 #endif /* PNG_ARM_NEON_OPT > 0 */ #ifndef PNG_MIPS_MSA_OPT @@ -263,11 +265,15 @@ # ifndef PNG_MIPS_MSA_IMPLEMENTATION # define PNG_MIPS_MSA_IMPLEMENTATION 1 # endif +#else +# define PNG_MIPS_MSA_IMPLEMENTATION 0 #endif /* PNG_MIPS_MSA_OPT > 0 */ #if PNG_POWERPC_VSX_OPT > 0 # define PNG_FILTER_OPTIMIZATIONS png_init_filter_functions_vsx # define PNG_POWERPC_VSX_IMPLEMENTATION 1 +#else +# define PNG_POWERPC_VSX_IMPLEMENTATION 0 #endif @@ -492,16 +498,7 @@ static_cast<type>(static_cast<const void*>(value)) #else # define png_voidcast(type, value) (value) -# ifdef _WIN64 -# ifdef __GNUC__ - typedef unsigned long long png_ptruint; -# else - typedef unsigned __int64 png_ptruint; -# endif -# else - typedef unsigned long png_ptruint; -# endif -# define png_constcast(type, value) ((type)(png_ptruint)(const void*)(value)) +# define png_constcast(type, value) ((type)(void*)(const void*)(value)) # define png_aligncast(type, value) ((void*)(value)) # define png_aligncastconst(type, value) ((const void*)(value)) #endif /* __cplusplus */ @@ -543,9 +540,8 @@ # include <alloc.h> #endif -#if defined(WIN32) || defined(_Windows) || defined(_WINDOWS) || \ - defined(_WIN32) || defined(__WIN32__) -# include <windows.h> /* defines _WINDOWS_ macro */ +#if defined(_WIN32) || defined(__WIN32__) || defined(__NT__) +# include <windows.h> #endif #endif /* PNG_VERSION_INFO_ONLY */ @@ -554,24 +550,20 @@ * functions that are passed far data must be model-independent. */ -/* Memory model/platform independent fns */ +/* Platform-independent functions */ #ifndef PNG_ABORT -# ifdef _WINDOWS_ -# define PNG_ABORT() ExitProcess(0) -# else -# define PNG_ABORT() abort() -# endif +# define PNG_ABORT() abort() #endif /* These macros may need to be architecture dependent. */ -#define PNG_ALIGN_NONE 0 /* do not use data alignment */ -#define PNG_ALIGN_ALWAYS 1 /* assume unaligned accesses are OK */ +#define PNG_ALIGN_NONE 0 /* do not use data alignment */ +#define PNG_ALIGN_ALWAYS 1 /* assume unaligned accesses are OK */ #ifdef offsetof -# define PNG_ALIGN_OFFSET 2 /* use offsetof to determine alignment */ +# define PNG_ALIGN_OFFSET 2 /* use offsetof to determine alignment */ #else # define PNG_ALIGN_OFFSET -1 /* prevent the use of this */ #endif -#define PNG_ALIGN_SIZE 3 /* use sizeof to determine alignment */ +#define PNG_ALIGN_SIZE 3 /* use sizeof to determine alignment */ #ifndef PNG_ALIGN_TYPE /* Default to using aligned access optimizations and requiring alignment to a @@ -585,26 +577,25 @@ /* This is used because in some compiler implementations non-aligned * structure members are supported, so the offsetof approach below fails. * Set PNG_ALIGN_SIZE=0 for compiler combinations where unaligned access - * is good for performance. Do not do this unless you have tested the result - * and understand it. + * is good for performance. Do not do this unless you have tested the + * result and understand it. */ -# define png_alignof(type) (sizeof (type)) +# define png_alignof(type) (sizeof(type)) #else # if PNG_ALIGN_TYPE == PNG_ALIGN_OFFSET -# define png_alignof(type) offsetof(struct{char c; type t;}, t) +# define png_alignof(type) offsetof(struct{char c; type t;}, t) # else -# if PNG_ALIGN_TYPE == PNG_ALIGN_ALWAYS -# define png_alignof(type) (1) -# endif - /* Else leave png_alignof undefined to prevent use thereof */ +# if PNG_ALIGN_TYPE == PNG_ALIGN_ALWAYS +# define png_alignof(type) 1 +# endif + /* Else leave png_alignof undefined to prevent use thereof */ # endif #endif -/* This implicitly assumes alignment is always to a power of 2. */ +/* This implicitly assumes alignment is always a multiple of 2. */ #ifdef png_alignof -# define png_isaligned(ptr, type)\ - (((type)((const char*)ptr-(const char*)0) & \ - (type)(png_alignof(type)-1)) == 0) +# define png_isaligned(ptr, type) \ + (((type)(size_t)((const void*)(ptr)) & (type)(png_alignof(type)-1)) == 0) #else # define png_isaligned(ptr, type) 0 #endif @@ -637,10 +628,6 @@ #define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000U /* Have another chunk after IDAT */ /* 0x4000U (unused) */ #define PNG_IS_READ_STRUCT 0x8000U /* Else is a write struct */ -#ifdef PNG_APNG_SUPPORTED -#define PNG_HAVE_acTL 0x10000U -#define PNG_HAVE_fcTL 0x20000U -#endif /* Flags for the transformations the PNG library does on the image data */ #define PNG_BGR 0x0001U @@ -877,16 +864,6 @@ #define png_tRNS PNG_U32(116, 82, 78, 83) #define png_zTXt PNG_U32(122, 84, 88, 116) -#ifdef PNG_APNG_SUPPORTED -#define png_acTL PNG_U32( 97, 99, 84, 76) -#define png_fcTL PNG_U32(102, 99, 84, 76) -#define png_fdAT PNG_U32(102, 100, 65, 84) - -/* For png_struct.apng_flags: */ -#define PNG_FIRST_FRAME_HIDDEN 0x0001U -#define PNG_APNG_APP 0x0002U -#endif - /* The following will work on (signed char*) strings, whereas the get_uint_32 * macro will fail on top-bit-set values because of the sign extension. */ @@ -1658,47 +1635,6 @@ PNG_INTERNAL_FUNCTION(void,png_colorspace_sync,(png_const_structrp png_ptr, */ #endif -#ifdef PNG_APNG_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_ensure_fcTL_is_valid,(png_structp png_ptr, - png_uint_32 width, png_uint_32 height, - png_uint_32 x_offset, png_uint_32 y_offset, - png_uint_16 delay_num, png_uint_16 delay_den, - png_byte dispose_op, png_byte blend_op), PNG_EMPTY); - -#ifdef PNG_READ_APNG_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_handle_acTL,(png_structp png_ptr, png_infop info_ptr, - png_uint_32 length),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_handle_fcTL,(png_structp png_ptr, png_infop info_ptr, - png_uint_32 length),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_handle_fdAT,(png_structp png_ptr, png_infop info_ptr, - png_uint_32 length),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_have_info,(png_structp png_ptr, png_infop info_ptr),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_ensure_sequence_number,(png_structp png_ptr, - png_uint_32 length),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_read_reset,(png_structp png_ptr),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_read_reinit,(png_structp png_ptr, - png_infop info_ptr),PNG_EMPTY); -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_progressive_read_reset,(png_structp png_ptr),PNG_EMPTY); -#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ -#endif /* PNG_READ_APNG_SUPPORTED */ - -#ifdef PNG_WRITE_APNG_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_write_acTL,(png_structp png_ptr, - png_uint_32 num_frames, png_uint_32 num_plays),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_write_fcTL,(png_structp png_ptr, - png_uint_32 width, png_uint_32 height, - png_uint_32 x_offset, png_uint_32 y_offset, - png_uint_16 delay_num, png_uint_16 delay_den, - png_byte dispose_op, png_byte blend_op),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_write_fdAT,(png_structp png_ptr, - png_const_bytep data, png_size_t length),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_write_reset,(png_structp png_ptr),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_write_reinit,(png_structp png_ptr, - png_infop info_ptr, png_uint_32 width, png_uint_32 height),PNG_EMPTY); -#endif /* PNG_WRITE_APNG_SUPPORTED */ -#endif /* PNG_APNG_SUPPORTED */ - /* Added at libpng version 1.4.0 */ #ifdef PNG_COLORSPACE_SUPPORTED /* These internal functions are for maintaining the colorspace structure within diff --git a/thirdparty/libpng/pngread.c b/thirdparty/libpng/pngread.c index fa44d5a8e4..5ab9224038 100644 --- a/thirdparty/libpng/pngread.c +++ b/thirdparty/libpng/pngread.c @@ -161,9 +161,6 @@ png_read_info(png_structrp png_ptr, png_inforp info_ptr) else if (chunk_name == png_IDAT) { -#ifdef PNG_READ_APNG_SUPPORTED - png_have_info(png_ptr, info_ptr); -#endif png_ptr->idat_size = length; break; } @@ -258,17 +255,6 @@ png_read_info(png_structrp png_ptr, png_inforp info_ptr) png_handle_iTXt(png_ptr, info_ptr, length); #endif -#ifdef PNG_READ_APNG_SUPPORTED - else if (chunk_name == png_acTL) - png_handle_acTL(png_ptr, info_ptr, length); - - else if (chunk_name == png_fcTL) - png_handle_fcTL(png_ptr, info_ptr, length); - - else if (chunk_name == png_fdAT) - png_handle_fdAT(png_ptr, info_ptr, length); -#endif - else png_handle_unknown(png_ptr, info_ptr, length, PNG_HANDLE_CHUNK_AS_DEFAULT); @@ -276,72 +262,6 @@ png_read_info(png_structrp png_ptr, png_inforp info_ptr) } #endif /* SEQUENTIAL_READ */ -#ifdef PNG_READ_APNG_SUPPORTED -void PNGAPI -png_read_frame_head(png_structp png_ptr, png_infop info_ptr) -{ - png_byte have_chunk_after_DAT; /* after IDAT or after fdAT */ - - png_debug(0, "Reading frame head"); - - if (!(png_ptr->mode & PNG_HAVE_acTL)) - png_error(png_ptr, "attempt to png_read_frame_head() but " - "no acTL present"); - - /* do nothing for the main IDAT */ - if (png_ptr->num_frames_read == 0) - return; - - png_read_reset(png_ptr); - png_ptr->flags &= ~PNG_FLAG_ROW_INIT; - png_ptr->mode &= ~PNG_HAVE_fcTL; - - have_chunk_after_DAT = 0; - for (;;) - { - png_uint_32 length = png_read_chunk_header(png_ptr); - - if (png_ptr->chunk_name == png_IDAT) - { - /* discard trailing IDATs for the first frame */ - if (have_chunk_after_DAT || png_ptr->num_frames_read > 1) - png_error(png_ptr, "png_read_frame_head(): out of place IDAT"); - png_crc_finish(png_ptr, length); - } - - else if (png_ptr->chunk_name == png_fcTL) - { - png_handle_fcTL(png_ptr, info_ptr, length); - have_chunk_after_DAT = 1; - } - - else if (png_ptr->chunk_name == png_fdAT) - { - png_ensure_sequence_number(png_ptr, length); - - /* discard trailing fdATs for frames other than the first */ - if (!have_chunk_after_DAT && png_ptr->num_frames_read > 1) - png_crc_finish(png_ptr, length - 4); - else if(png_ptr->mode & PNG_HAVE_fcTL) - { - png_ptr->idat_size = length - 4; - png_ptr->mode |= PNG_HAVE_IDAT; - - break; - } - else - png_error(png_ptr, "png_read_frame_head(): out of place fdAT"); - } - else - { - png_warning(png_ptr, "Skipped (ignored) a chunk " - "between APNG chunks"); - png_crc_finish(png_ptr, length); - } - } -} -#endif /* PNG_READ_APNG_SUPPORTED */ - /* Optional call to update the users info_ptr structure */ void PNGAPI png_read_update_info(png_structrp png_ptr, png_inforp info_ptr) @@ -3532,7 +3452,6 @@ png_image_read_background(png_voidp argument) for (pass = 0; pass < passes; ++pass) { - png_bytep row = png_voidcast(png_bytep, display->first_row); unsigned int startx, stepx, stepy; png_uint_32 y; @@ -3637,8 +3556,6 @@ png_image_read_background(png_voidp argument) inrow += 2; /* gray and alpha channel */ } - - row += display->row_bytes; } } } diff --git a/thirdparty/libpng/pngrtran.c b/thirdparty/libpng/pngrtran.c index 9a8fad9f4a..238f5afe7e 100644 --- a/thirdparty/libpng/pngrtran.c +++ b/thirdparty/libpng/pngrtran.c @@ -21,7 +21,7 @@ #ifdef PNG_ARM_NEON_IMPLEMENTATION # if PNG_ARM_NEON_IMPLEMENTATION == 1 # define PNG_ARM_NEON_INTRINSICS_AVAILABLE -# if defined(_MSC_VER) && defined(_M_ARM64) +# if defined(_MSC_VER) && !defined(__clang__) && defined(_M_ARM64) # include <arm64_neon.h> # else # include <arm_neon.h> diff --git a/thirdparty/libpng/pngrutil.c b/thirdparty/libpng/pngrutil.c index ae66a48a83..ca060dd15f 100644 --- a/thirdparty/libpng/pngrutil.c +++ b/thirdparty/libpng/pngrutil.c @@ -1,7 +1,7 @@ /* pngrutil.c - utilities to read a PNG file * - * Copyright (c) 2018 Cosmin Truta + * Copyright (c) 2018-2022 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson * Copyright (c) 1996-1997 Andreas Dilger * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -302,7 +302,6 @@ png_read_buffer(png_structrp png_ptr, png_alloc_size_t new_size, int warn) if (buffer != NULL && new_size > png_ptr->read_buffer_size) { png_ptr->read_buffer = NULL; - png_ptr->read_buffer = NULL; png_ptr->read_buffer_size = 0; png_free(png_ptr, buffer); buffer = NULL; @@ -865,11 +864,6 @@ png_handle_IHDR(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) filter_type = buf[11]; interlace_type = buf[12]; -#ifdef PNG_READ_APNG_SUPPORTED - png_ptr->first_frame_width = width; - png_ptr->first_frame_height = height; -#endif - /* Set internal variables */ png_ptr->width = width; png_ptr->height = height; @@ -2081,21 +2075,22 @@ png_handle_eXIf(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_byte buf[1]; png_crc_read(png_ptr, buf, 1); info_ptr->eXIf_buf[i] = buf[0]; - if (i == 1 && buf[0] != 'M' && buf[0] != 'I' - && info_ptr->eXIf_buf[0] != buf[0]) + if (i == 1) { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "incorrect byte-order specifier"); - png_free(png_ptr, info_ptr->eXIf_buf); - info_ptr->eXIf_buf = NULL; - return; + if ((buf[0] != 'M' && buf[0] != 'I') || + (info_ptr->eXIf_buf[0] != buf[0])) + { + png_crc_finish(png_ptr, length - 2); + png_chunk_benign_error(png_ptr, "incorrect byte-order specifier"); + png_free(png_ptr, info_ptr->eXIf_buf); + info_ptr->eXIf_buf = NULL; + return; + } } } - if (png_crc_finish(png_ptr, 0) != 0) - return; - - png_set_eXIf_1(png_ptr, info_ptr, length, info_ptr->eXIf_buf); + if (png_crc_finish(png_ptr, 0) == 0) + png_set_eXIf_1(png_ptr, info_ptr, length, info_ptr->eXIf_buf); png_free(png_ptr, info_ptr->eXIf_buf); info_ptr->eXIf_buf = NULL; @@ -2131,8 +2126,9 @@ png_handle_hIST(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) num = length / 2 ; - if (num != (unsigned int) png_ptr->num_palette || - num > (unsigned int) PNG_MAX_PALETTE_LENGTH) + if (length != num * 2 || + num != (unsigned int)png_ptr->num_palette || + num > (unsigned int)PNG_MAX_PALETTE_LENGTH) { png_crc_finish(png_ptr, length); png_chunk_benign_error(png_ptr, "invalid"); @@ -2862,179 +2858,6 @@ png_handle_iTXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) } #endif -#ifdef PNG_READ_APNG_SUPPORTED -void /* PRIVATE */ -png_handle_acTL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_byte data[8]; - png_uint_32 num_frames; - png_uint_32 num_plays; - png_uint_32 didSet; - - png_debug(1, "in png_handle_acTL"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - { - png_error(png_ptr, "Missing IHDR before acTL"); - } - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_warning(png_ptr, "Invalid acTL after IDAT skipped"); - png_crc_finish(png_ptr, length); - return; - } - else if (png_ptr->mode & PNG_HAVE_acTL) - { - png_warning(png_ptr, "Duplicate acTL skipped"); - png_crc_finish(png_ptr, length); - return; - } - else if (length != 8) - { - png_warning(png_ptr, "acTL with invalid length skipped"); - png_crc_finish(png_ptr, length); - return; - } - - png_crc_read(png_ptr, data, 8); - png_crc_finish(png_ptr, 0); - - num_frames = png_get_uint_31(png_ptr, data); - num_plays = png_get_uint_31(png_ptr, data + 4); - - /* the set function will do error checking on num_frames */ - didSet = png_set_acTL(png_ptr, info_ptr, num_frames, num_plays); - if(didSet) - png_ptr->mode |= PNG_HAVE_acTL; -} - -void /* PRIVATE */ -png_handle_fcTL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_byte data[22]; - png_uint_32 width; - png_uint_32 height; - png_uint_32 x_offset; - png_uint_32 y_offset; - png_uint_16 delay_num; - png_uint_16 delay_den; - png_byte dispose_op; - png_byte blend_op; - - png_debug(1, "in png_handle_fcTL"); - - png_ensure_sequence_number(png_ptr, length); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - { - png_error(png_ptr, "Missing IHDR before fcTL"); - } - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - /* for any frames other then the first this message may be misleading, - * but correct. PNG_HAVE_IDAT is unset before the frame head is read - * i can't think of a better message */ - png_warning(png_ptr, "Invalid fcTL after IDAT skipped"); - png_crc_finish(png_ptr, length-4); - return; - } - else if (png_ptr->mode & PNG_HAVE_fcTL) - { - png_warning(png_ptr, "Duplicate fcTL within one frame skipped"); - png_crc_finish(png_ptr, length-4); - return; - } - else if (length != 26) - { - png_warning(png_ptr, "fcTL with invalid length skipped"); - png_crc_finish(png_ptr, length-4); - return; - } - - png_crc_read(png_ptr, data, 22); - png_crc_finish(png_ptr, 0); - - width = png_get_uint_31(png_ptr, data); - height = png_get_uint_31(png_ptr, data + 4); - x_offset = png_get_uint_31(png_ptr, data + 8); - y_offset = png_get_uint_31(png_ptr, data + 12); - delay_num = png_get_uint_16(data + 16); - delay_den = png_get_uint_16(data + 18); - dispose_op = data[20]; - blend_op = data[21]; - - if (png_ptr->num_frames_read == 0 && (x_offset != 0 || y_offset != 0)) - { - png_warning(png_ptr, "fcTL for the first frame must have zero offset"); - return; - } - - if (info_ptr != NULL) - { - if (png_ptr->num_frames_read == 0 && - (width != info_ptr->width || height != info_ptr->height)) - { - png_warning(png_ptr, "size in first frame's fcTL must match " - "the size in IHDR"); - return; - } - - /* The set function will do more error checking */ - png_set_next_frame_fcTL(png_ptr, info_ptr, width, height, - x_offset, y_offset, delay_num, delay_den, - dispose_op, blend_op); - - png_read_reinit(png_ptr, info_ptr); - - png_ptr->mode |= PNG_HAVE_fcTL; - } -} - -void /* PRIVATE */ -png_have_info(png_structp png_ptr, png_infop info_ptr) -{ - if((info_ptr->valid & PNG_INFO_acTL) && !(info_ptr->valid & PNG_INFO_fcTL)) - { - png_ptr->apng_flags |= PNG_FIRST_FRAME_HIDDEN; - info_ptr->num_frames++; - } -} - -void /* PRIVATE */ -png_handle_fdAT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_ensure_sequence_number(png_ptr, length); - - /* This function is only called from png_read_end(), png_read_info(), - * and png_push_read_chunk() which means that: - * - the user doesn't want to read this frame - * - or this is an out-of-place fdAT - * in either case it is safe to ignore the chunk with a warning */ - png_warning(png_ptr, "ignoring fdAT chunk"); - png_crc_finish(png_ptr, length - 4); - PNG_UNUSED(info_ptr) -} - -void /* PRIVATE */ -png_ensure_sequence_number(png_structp png_ptr, png_uint_32 length) -{ - png_byte data[4]; - png_uint_32 sequence_number; - - if (length < 4) - png_error(png_ptr, "invalid fcTL or fdAT chunk found"); - - png_crc_read(png_ptr, data, 4); - sequence_number = png_get_uint_31(png_ptr, data); - - if (sequence_number != png_ptr->next_seq_num) - png_error(png_ptr, "fcTL or fdAT chunk with out-of-order sequence " - "number found"); - - png_ptr->next_seq_num++; -} -#endif /* PNG_READ_APNG_SUPPORTED */ - #ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED /* Utility function for png_handle_unknown; set up png_ptr::unknown_chunk */ static int @@ -4343,38 +4166,7 @@ png_read_IDAT_data(png_structrp png_ptr, png_bytep output, { uInt avail_in; png_bytep buffer; -#ifdef PNG_READ_APNG_SUPPORTED - png_uint_32 bytes_to_skip = 0; - - while (png_ptr->idat_size == 0 || bytes_to_skip != 0) - { - png_crc_finish(png_ptr, bytes_to_skip); - bytes_to_skip = 0; - - png_ptr->idat_size = png_read_chunk_header(png_ptr); - if (png_ptr->num_frames_read == 0) - { - if (png_ptr->chunk_name != png_IDAT) - png_error(png_ptr, "Not enough image data"); - } - else - { - if (png_ptr->chunk_name == png_IEND) - png_error(png_ptr, "Not enough image data"); - if (png_ptr->chunk_name != png_fdAT) - { - png_warning(png_ptr, "Skipped (ignored) a chunk " - "between APNG chunks"); - bytes_to_skip = png_ptr->idat_size; - continue; - } - - png_ensure_sequence_number(png_ptr, png_ptr->idat_size); - png_ptr->idat_size -= 4; - } - } -#else while (png_ptr->idat_size == 0) { png_crc_finish(png_ptr, 0); @@ -4386,7 +4178,7 @@ png_read_IDAT_data(png_structrp png_ptr, png_bytep output, if (png_ptr->chunk_name != png_IDAT) png_error(png_ptr, "Not enough image data"); } -#endif /* PNG_READ_APNG_SUPPORTED */ + avail_in = png_ptr->IDAT_read_size; if (avail_in > png_ptr->idat_size) @@ -4449,9 +4241,6 @@ png_read_IDAT_data(png_structrp png_ptr, png_bytep output, png_ptr->mode |= PNG_AFTER_IDAT; png_ptr->flags |= PNG_FLAG_ZSTREAM_ENDED; -#ifdef PNG_READ_APNG_SUPPORTED - png_ptr->num_frames_read++; -#endif if (png_ptr->zstream.avail_in > 0 || png_ptr->idat_size > 0) png_chunk_benign_error(png_ptr, "Extra compressed data"); @@ -4833,14 +4622,13 @@ defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) */ { png_bytep temp = png_ptr->big_row_buf + 32; - int extra = (int)((temp - (png_bytep)0) & 0x0f); + size_t extra = (size_t)temp & 0x0f; png_ptr->row_buf = temp - extra - 1/*filter byte*/; temp = png_ptr->big_prev_row + 32; - extra = (int)((temp - (png_bytep)0) & 0x0f); + extra = (size_t)temp & 0x0f; png_ptr->prev_row = temp - extra - 1/*filter byte*/; } - #else /* Use 31 bytes of padding before and 17 bytes after row_buf. */ png_ptr->row_buf = png_ptr->big_row_buf + 31; @@ -4890,80 +4678,4 @@ defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) png_ptr->flags |= PNG_FLAG_ROW_INIT; } - -#ifdef PNG_READ_APNG_SUPPORTED -/* This function is to be called after the main IDAT set has been read and - * before a new IDAT is read. It resets some parts of png_ptr - * to make them usable by the read functions again */ -void /* PRIVATE */ -png_read_reset(png_structp png_ptr) -{ - png_ptr->mode &= ~PNG_HAVE_IDAT; - png_ptr->mode &= ~PNG_AFTER_IDAT; - png_ptr->row_number = 0; - png_ptr->pass = 0; -} - -void /* PRIVATE */ -png_read_reinit(png_structp png_ptr, png_infop info_ptr) -{ - png_ptr->width = info_ptr->next_frame_width; - png_ptr->height = info_ptr->next_frame_height; - png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth,png_ptr->width); - png_ptr->info_rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, - png_ptr->width); - if (png_ptr->prev_row) - memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1); -} - -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED -/* same as png_read_reset() but for the progressive reader */ -void /* PRIVATE */ -png_progressive_read_reset(png_structp png_ptr) -{ -#ifdef PNG_READ_INTERLACING_SUPPORTED - /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ - - /* Start of interlace block */ - const int png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; - - /* Offset to next interlace block */ - const int png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; - - /* Start of interlace block in the y direction */ - const int png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1}; - - /* Offset to next interlace block in the y direction */ - const int png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2}; - - if (png_ptr->interlaced) - { - if (!(png_ptr->transformations & PNG_INTERLACE)) - png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 - - png_pass_ystart[0]) / png_pass_yinc[0]; - else - png_ptr->num_rows = png_ptr->height; - - png_ptr->iwidth = (png_ptr->width + - png_pass_inc[png_ptr->pass] - 1 - - png_pass_start[png_ptr->pass]) / - png_pass_inc[png_ptr->pass]; - } - else -#endif /* PNG_READ_INTERLACING_SUPPORTED */ - { - png_ptr->num_rows = png_ptr->height; - png_ptr->iwidth = png_ptr->width; - } - png_ptr->flags &= ~PNG_FLAG_ZSTREAM_ENDED; - if (inflateReset(&(png_ptr->zstream)) != Z_OK) - png_error(png_ptr, "inflateReset failed"); - png_ptr->zstream.avail_in = 0; - png_ptr->zstream.next_in = 0; - png_ptr->zstream.next_out = png_ptr->row_buf; - png_ptr->zstream.avail_out = (uInt)PNG_ROWBYTES(png_ptr->pixel_depth, - png_ptr->iwidth) + 1; -} -#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ -#endif /* PNG_READ_APNG_SUPPORTED */ #endif /* READ */ diff --git a/thirdparty/libpng/pngset.c b/thirdparty/libpng/pngset.c index a281db58ae..8c372cf415 100644 --- a/thirdparty/libpng/pngset.c +++ b/thirdparty/libpng/pngset.c @@ -1,7 +1,7 @@ /* pngset.c - storage of image information into info struct * - * Copyright (c) 2018 Cosmin Truta + * Copyright (c) 2018-2022 Cosmin Truta * Copyright (c) 1998-2018 Glenn Randers-Pehrson * Copyright (c) 1996-1997 Andreas Dilger * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -288,11 +288,6 @@ png_set_IHDR(png_const_structrp png_ptr, png_inforp info_ptr, info_ptr->pixel_depth = (png_byte)(info_ptr->channels * info_ptr->bit_depth); info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, width); - -#ifdef PNG_APNG_SUPPORTED - /* for non-animated png. this may be overwritten from an acTL chunk later */ - info_ptr->num_frames = 1; -#endif } #ifdef PNG_oFFs_SUPPORTED @@ -1024,6 +1019,9 @@ png_set_tRNS(png_structrp png_ptr, png_inforp info_ptr, info_ptr->trans_alpha = png_voidcast(png_bytep, png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH)); memcpy(info_ptr->trans_alpha, trans_alpha, (size_t)num_trans); + + info_ptr->valid |= PNG_INFO_tRNS; + info_ptr->free_me |= PNG_FREE_TRNS; } png_ptr->trans_alpha = info_ptr->trans_alpha; } @@ -1163,147 +1161,6 @@ png_set_sPLT(png_const_structrp png_ptr, } #endif /* sPLT */ -#ifdef PNG_APNG_SUPPORTED -png_uint_32 PNGAPI -png_set_acTL(png_structp png_ptr, png_infop info_ptr, - png_uint_32 num_frames, png_uint_32 num_plays) -{ - png_debug1(1, "in %s storage function", "acTL"); - - if (png_ptr == NULL || info_ptr == NULL) - { - png_warning(png_ptr, - "Call to png_set_acTL() with NULL png_ptr " - "or info_ptr ignored"); - return (0); - } - if (num_frames == 0) - { - png_warning(png_ptr, - "Ignoring attempt to set acTL with num_frames zero"); - return (0); - } - if (num_frames > PNG_UINT_31_MAX) - { - png_warning(png_ptr, - "Ignoring attempt to set acTL with num_frames > 2^31-1"); - return (0); - } - if (num_plays > PNG_UINT_31_MAX) - { - png_warning(png_ptr, - "Ignoring attempt to set acTL with num_plays " - "> 2^31-1"); - return (0); - } - - info_ptr->num_frames = num_frames; - info_ptr->num_plays = num_plays; - - info_ptr->valid |= PNG_INFO_acTL; - - return (1); -} - -/* delay_num and delay_den can hold any 16-bit values including zero */ -png_uint_32 PNGAPI -png_set_next_frame_fcTL(png_structp png_ptr, png_infop info_ptr, - png_uint_32 width, png_uint_32 height, - png_uint_32 x_offset, png_uint_32 y_offset, - png_uint_16 delay_num, png_uint_16 delay_den, - png_byte dispose_op, png_byte blend_op) -{ - png_debug1(1, "in %s storage function", "fcTL"); - - if (png_ptr == NULL || info_ptr == NULL) - { - png_warning(png_ptr, - "Call to png_set_fcTL() with NULL png_ptr or info_ptr " - "ignored"); - return (0); - } - - png_ensure_fcTL_is_valid(png_ptr, width, height, x_offset, y_offset, - delay_num, delay_den, dispose_op, blend_op); - - if (blend_op == PNG_BLEND_OP_OVER) - { - if (!(png_ptr->color_type & PNG_COLOR_MASK_ALPHA) && - !(png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))) - { - png_warning(png_ptr, "PNG_BLEND_OP_OVER is meaningless " - "and wasteful for opaque images, ignored"); - blend_op = PNG_BLEND_OP_SOURCE; - } - } - - info_ptr->next_frame_width = width; - info_ptr->next_frame_height = height; - info_ptr->next_frame_x_offset = x_offset; - info_ptr->next_frame_y_offset = y_offset; - info_ptr->next_frame_delay_num = delay_num; - info_ptr->next_frame_delay_den = delay_den; - info_ptr->next_frame_dispose_op = dispose_op; - info_ptr->next_frame_blend_op = blend_op; - - info_ptr->valid |= PNG_INFO_fcTL; - - return (1); -} - -void /* PRIVATE */ -png_ensure_fcTL_is_valid(png_structp png_ptr, - png_uint_32 width, png_uint_32 height, - png_uint_32 x_offset, png_uint_32 y_offset, - png_uint_16 delay_num, png_uint_16 delay_den, - png_byte dispose_op, png_byte blend_op) -{ - if (width == 0 || width > PNG_UINT_31_MAX) - png_error(png_ptr, "invalid width in fcTL (> 2^31-1)"); - if (height == 0 || height > PNG_UINT_31_MAX) - png_error(png_ptr, "invalid height in fcTL (> 2^31-1)"); - if (x_offset > PNG_UINT_31_MAX) - png_error(png_ptr, "invalid x_offset in fcTL (> 2^31-1)"); - if (y_offset > PNG_UINT_31_MAX) - png_error(png_ptr, "invalid y_offset in fcTL (> 2^31-1)"); - if (width + x_offset > png_ptr->first_frame_width || - height + y_offset > png_ptr->first_frame_height) - png_error(png_ptr, "dimensions of a frame are greater than" - "the ones in IHDR"); - - if (dispose_op != PNG_DISPOSE_OP_NONE && - dispose_op != PNG_DISPOSE_OP_BACKGROUND && - dispose_op != PNG_DISPOSE_OP_PREVIOUS) - png_error(png_ptr, "invalid dispose_op in fcTL"); - - if (blend_op != PNG_BLEND_OP_SOURCE && - blend_op != PNG_BLEND_OP_OVER) - png_error(png_ptr, "invalid blend_op in fcTL"); - - PNG_UNUSED(delay_num) - PNG_UNUSED(delay_den) -} - -png_uint_32 PNGAPI -png_set_first_frame_is_hidden(png_structp png_ptr, png_infop info_ptr, - png_byte is_hidden) -{ - png_debug(1, "in png_first_frame_is_hidden()"); - - if (png_ptr == NULL) - return 0; - - if (is_hidden) - png_ptr->apng_flags |= PNG_FIRST_FRAME_HIDDEN; - else - png_ptr->apng_flags &= ~PNG_FIRST_FRAME_HIDDEN; - - PNG_UNUSED(info_ptr) - - return 1; -} -#endif /* PNG_APNG_SUPPORTED */ - #ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED static png_byte check_location(png_const_structrp png_ptr, int location) @@ -1472,7 +1329,7 @@ png_set_unknown_chunk_location(png_const_structrp png_ptr, png_inforp info_ptr, #ifdef PNG_MNG_FEATURES_SUPPORTED png_uint_32 PNGAPI -png_permit_mng_features (png_structrp png_ptr, png_uint_32 mng_features) +png_permit_mng_features(png_structrp png_ptr, png_uint_32 mng_features) { png_debug(1, "in png_permit_mng_features"); @@ -1779,7 +1636,7 @@ png_set_invalid(png_const_structrp png_ptr, png_inforp info_ptr, int mask) #ifdef PNG_SET_USER_LIMITS_SUPPORTED /* This function was added to libpng 1.2.6 */ void PNGAPI -png_set_user_limits (png_structrp png_ptr, png_uint_32 user_width_max, +png_set_user_limits(png_structrp png_ptr, png_uint_32 user_width_max, png_uint_32 user_height_max) { /* Images with dimensions larger than these limits will be @@ -1795,7 +1652,7 @@ png_set_user_limits (png_structrp png_ptr, png_uint_32 user_width_max, /* This function was added to libpng 1.4.0 */ void PNGAPI -png_set_chunk_cache_max (png_structrp png_ptr, png_uint_32 user_chunk_cache_max) +png_set_chunk_cache_max(png_structrp png_ptr, png_uint_32 user_chunk_cache_max) { if (png_ptr != NULL) png_ptr->user_chunk_cache_max = user_chunk_cache_max; @@ -1803,7 +1660,7 @@ png_set_chunk_cache_max (png_structrp png_ptr, png_uint_32 user_chunk_cache_max) /* This function was added to libpng 1.4.1 */ void PNGAPI -png_set_chunk_malloc_max (png_structrp png_ptr, +png_set_chunk_malloc_max(png_structrp png_ptr, png_alloc_size_t user_chunk_malloc_max) { if (png_ptr != NULL) diff --git a/thirdparty/libpng/pngstruct.h b/thirdparty/libpng/pngstruct.h index 2a2236f92e..e591d94d58 100644 --- a/thirdparty/libpng/pngstruct.h +++ b/thirdparty/libpng/pngstruct.h @@ -1,7 +1,7 @@ /* pngstruct.h - header file for PNG reference library * - * Copyright (c) 2018-2019 Cosmin Truta + * Copyright (c) 2018-2022 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson * Copyright (c) 1996-1997 Andreas Dilger * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -334,18 +334,8 @@ struct png_struct_def size_t current_buffer_size; /* amount of data now in current_buffer */ int process_mode; /* what push library is currently doing */ int cur_palette; /* current push library palette index */ - #endif /* PROGRESSIVE_READ */ -#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) -/* For the Borland special 64K segment handler */ - png_bytepp offset_table_ptr; - png_bytep offset_table; - png_uint_16 offset_table_number; - png_uint_16 offset_table_count; - png_uint_16 offset_table_count_free; -#endif - #ifdef PNG_READ_QUANTIZE_SUPPORTED png_bytep palette_lookup; /* lookup table for quantizing */ png_bytep quantize_index; /* index translation for palette files */ @@ -409,27 +399,6 @@ struct png_struct_def png_byte filter_type; #endif -#ifdef PNG_APNG_SUPPORTED - png_uint_32 apng_flags; - png_uint_32 next_seq_num; /* next fcTL/fdAT chunk sequence number */ - png_uint_32 first_frame_width; - png_uint_32 first_frame_height; - -#ifdef PNG_READ_APNG_SUPPORTED - png_uint_32 num_frames_read; /* incremented after all image data of */ - /* a frame is read */ -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED - png_progressive_frame_ptr frame_info_fn; /* frame info read callback */ - png_progressive_frame_ptr frame_end_fn; /* frame data read callback */ -#endif -#endif - -#ifdef PNG_WRITE_APNG_SUPPORTED - png_uint_32 num_frames_to_write; - png_uint_32 num_frames_written; -#endif -#endif /* PNG_APNG_SUPPORTED */ - /* New members added in libpng-1.2.0 */ /* New members added in libpng-1.0.2 but first enabled by default in 1.2.0 */ diff --git a/thirdparty/libpng/pngwrite.c b/thirdparty/libpng/pngwrite.c index 5e68032378..06c45d16ab 100644 --- a/thirdparty/libpng/pngwrite.c +++ b/thirdparty/libpng/pngwrite.c @@ -1,7 +1,7 @@ /* pngwrite.c - general routines to write a PNG file * - * Copyright (c) 2018-2019 Cosmin Truta + * Copyright (c) 2018-2022 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson * Copyright (c) 1996-1997 Andreas Dilger * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -128,10 +128,6 @@ png_write_info_before_PLTE(png_structrp png_ptr, png_const_inforp info_ptr) * the application continues writing the PNG. So check the 'invalid' * flag here too. */ -#ifdef PNG_WRITE_APNG_SUPPORTED - if (info_ptr->valid & PNG_INFO_acTL) - png_write_acTL(png_ptr, info_ptr->num_frames, info_ptr->num_plays); -#endif #ifdef PNG_GAMMA_SUPPORTED # ifdef PNG_WRITE_gAMA_SUPPORTED if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 && @@ -374,11 +370,6 @@ png_write_end(png_structrp png_ptr, png_inforp info_ptr) png_benign_error(png_ptr, "Wrote palette index exceeding num_palette"); #endif -#ifdef PNG_WRITE_APNG_SUPPORTED - if (png_ptr->num_frames_written != png_ptr->num_frames_to_write) - png_error(png_ptr, "Not enough frames written"); -#endif - /* See if user wants us to write information chunks */ if (info_ptr != NULL) { @@ -498,6 +489,16 @@ png_convert_from_time_t(png_timep ptime, time_t ttime) png_debug(1, "in png_convert_from_time_t"); tbuf = gmtime(&ttime); + if (tbuf == NULL) + { + /* TODO: add a safe function which takes a png_ptr argument and raises + * a png_error if the ttime argument is invalid and the call to gmtime + * fails as a consequence. + */ + memset(ptime, 0, sizeof(*ptime)); + return; + } + png_convert_from_struct_tm(ptime, tbuf); } #endif @@ -1470,43 +1471,6 @@ png_write_png(png_structrp png_ptr, png_inforp info_ptr, } #endif -#ifdef PNG_WRITE_APNG_SUPPORTED -void PNGAPI -png_write_frame_head(png_structp png_ptr, png_infop info_ptr, - png_bytepp row_pointers, png_uint_32 width, png_uint_32 height, - png_uint_32 x_offset, png_uint_32 y_offset, - png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op, - png_byte blend_op) -{ - png_debug(1, "in png_write_frame_head"); - - /* there is a chance this has been set after png_write_info was called, - * so it would be set but not written. is there a way to be sure? */ - if (!(info_ptr->valid & PNG_INFO_acTL)) - png_error(png_ptr, "png_write_frame_head(): acTL not set"); - - png_write_reset(png_ptr); - - png_write_reinit(png_ptr, info_ptr, width, height); - - if ( !(png_ptr->num_frames_written == 0 && - (png_ptr->apng_flags & PNG_FIRST_FRAME_HIDDEN) ) ) - png_write_fcTL(png_ptr, width, height, x_offset, y_offset, - delay_num, delay_den, dispose_op, blend_op); - - PNG_UNUSED(row_pointers) -} - -void PNGAPI -png_write_frame_tail(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_write_frame_tail"); - - png_ptr->num_frames_written++; - - PNG_UNUSED(info_ptr) -} -#endif /* PNG_WRITE_APNG_SUPPORTED */ #ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED /* Initialize the write structure - general purpose utility. */ diff --git a/thirdparty/libpng/pngwutil.c b/thirdparty/libpng/pngwutil.c index b4809cda6b..16345e4c0b 100644 --- a/thirdparty/libpng/pngwutil.c +++ b/thirdparty/libpng/pngwutil.c @@ -821,11 +821,6 @@ png_write_IHDR(png_structrp png_ptr, png_uint_32 width, png_uint_32 height, /* Write the chunk */ png_write_complete_chunk(png_ptr, png_IHDR, buf, 13); -#ifdef PNG_WRITE_APNG_SUPPORTED - png_ptr->first_frame_width = width; - png_ptr->first_frame_height = height; -#endif - if ((png_ptr->do_filter) == PNG_NO_FILTERS) { if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE || @@ -1007,17 +1002,8 @@ png_compress_IDAT(png_structrp png_ptr, png_const_bytep input, optimize_cmf(data, png_image_size(png_ptr)); #endif - if (size > 0) -#ifdef PNG_WRITE_APNG_SUPPORTED - { - if (png_ptr->num_frames_written == 0) -#endif - png_write_complete_chunk(png_ptr, png_IDAT, data, size); -#ifdef PNG_WRITE_APNG_SUPPORTED - else - png_write_fdAT(png_ptr, data, size); - } -#endif /* PNG_WRITE_APNG_SUPPORTED */ + if (size > 0) + png_write_complete_chunk(png_ptr, png_IDAT, data, size); png_ptr->mode |= PNG_HAVE_IDAT; png_ptr->zstream.next_out = data; @@ -1064,17 +1050,7 @@ png_compress_IDAT(png_structrp png_ptr, png_const_bytep input, #endif if (size > 0) -#ifdef PNG_WRITE_APNG_SUPPORTED - { - if (png_ptr->num_frames_written == 0) -#endif png_write_complete_chunk(png_ptr, png_IDAT, data, size); -#ifdef PNG_WRITE_APNG_SUPPORTED - else - png_write_fdAT(png_ptr, data, size); - } -#endif /* PNG_WRITE_APNG_SUPPORTED */ - png_ptr->zstream.avail_out = 0; png_ptr->zstream.next_out = NULL; png_ptr->mode |= PNG_HAVE_IDAT | PNG_AFTER_IDAT; @@ -1909,82 +1885,6 @@ png_write_tIME(png_structrp png_ptr, png_const_timep mod_time) } #endif -#ifdef PNG_WRITE_APNG_SUPPORTED -void /* PRIVATE */ -png_write_acTL(png_structp png_ptr, - png_uint_32 num_frames, png_uint_32 num_plays) -{ - png_byte buf[8]; - - png_debug(1, "in png_write_acTL"); - - png_ptr->num_frames_to_write = num_frames; - - if (png_ptr->apng_flags & PNG_FIRST_FRAME_HIDDEN) - num_frames--; - - png_save_uint_32(buf, num_frames); - png_save_uint_32(buf + 4, num_plays); - - png_write_complete_chunk(png_ptr, png_acTL, buf, (png_size_t)8); -} - -void /* PRIVATE */ -png_write_fcTL(png_structp png_ptr, png_uint_32 width, png_uint_32 height, - png_uint_32 x_offset, png_uint_32 y_offset, - png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op, - png_byte blend_op) -{ - png_byte buf[26]; - - png_debug(1, "in png_write_fcTL"); - - if (png_ptr->num_frames_written == 0 && (x_offset != 0 || y_offset != 0)) - png_error(png_ptr, "x and/or y offset for the first frame aren't 0"); - if (png_ptr->num_frames_written == 0 && - (width != png_ptr->first_frame_width || - height != png_ptr->first_frame_height)) - png_error(png_ptr, "width and/or height in the first frame's fcTL " - "don't match the ones in IHDR"); - - /* more error checking */ - png_ensure_fcTL_is_valid(png_ptr, width, height, x_offset, y_offset, - delay_num, delay_den, dispose_op, blend_op); - - png_save_uint_32(buf, png_ptr->next_seq_num); - png_save_uint_32(buf + 4, width); - png_save_uint_32(buf + 8, height); - png_save_uint_32(buf + 12, x_offset); - png_save_uint_32(buf + 16, y_offset); - png_save_uint_16(buf + 20, delay_num); - png_save_uint_16(buf + 22, delay_den); - buf[24] = dispose_op; - buf[25] = blend_op; - - png_write_complete_chunk(png_ptr, png_fcTL, buf, (png_size_t)26); - - png_ptr->next_seq_num++; -} - -void /* PRIVATE */ -png_write_fdAT(png_structp png_ptr, - png_const_bytep data, png_size_t length) -{ - png_byte buf[4]; - - png_write_chunk_header(png_ptr, png_fdAT, (png_uint_32)(4 + length)); - - png_save_uint_32(buf, png_ptr->next_seq_num); - png_write_chunk_data(png_ptr, buf, 4); - - png_write_chunk_data(png_ptr, data, length); - - png_write_chunk_end(png_ptr); - - png_ptr->next_seq_num++; -} -#endif /* PNG_WRITE_APNG_SUPPORTED */ - /* Initializes the row writing capability of libpng */ void /* PRIVATE */ png_write_start_row(png_structrp png_ptr) @@ -2878,39 +2778,4 @@ png_write_filtered_row(png_structrp png_ptr, png_bytep filtered_row, } #endif /* WRITE_FLUSH */ } - -#ifdef PNG_WRITE_APNG_SUPPORTED -void /* PRIVATE */ -png_write_reset(png_structp png_ptr) -{ - png_ptr->row_number = 0; - png_ptr->pass = 0; - png_ptr->mode &= ~PNG_HAVE_IDAT; -} - -void /* PRIVATE */ -png_write_reinit(png_structp png_ptr, png_infop info_ptr, - png_uint_32 width, png_uint_32 height) -{ - if (png_ptr->num_frames_written == 0 && - (width != png_ptr->first_frame_width || - height != png_ptr->first_frame_height)) - png_error(png_ptr, "width and/or height in the first frame's fcTL " - "don't match the ones in IHDR"); - if (width > png_ptr->first_frame_width || - height > png_ptr->first_frame_height) - png_error(png_ptr, "width and/or height for a frame greater than" - "the ones in IHDR"); - - png_set_IHDR(png_ptr, info_ptr, width, height, - info_ptr->bit_depth, info_ptr->color_type, - info_ptr->interlace_type, info_ptr->compression_type, - info_ptr->filter_type); - - png_ptr->width = width; - png_ptr->height = height; - png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, width); - png_ptr->usr_width = png_ptr->width; -} -#endif /* PNG_WRITE_APNG_SUPPORTED */ #endif /* WRITE */ diff --git a/thirdparty/minimp3/minimp3_ex.h b/thirdparty/minimp3/minimp3_ex.h index 2871705df3..2b207a25a7 100644 --- a/thirdparty/minimp3/minimp3_ex.h +++ b/thirdparty/minimp3/minimp3_ex.h @@ -377,7 +377,7 @@ int mp3dec_load_cb(mp3dec_t *dec, mp3dec_io_t *io, uint8_t *buf, size_t buf_size samples = hdr_frame_samples(hdr)*frame_info.channels; if (3 != frame_info.layer) break; - int ret = mp3dec_check_vbrtag(hdr, frame_size, &frames, &delay, &padding); + ret = mp3dec_check_vbrtag(hdr, frame_size, &frames, &delay, &padding); if (ret > 0) { padding *= frame_info.channels; @@ -529,7 +529,8 @@ int mp3dec_iterate_buf(const uint8_t *buf, size_t buf_size, MP3D_ITERATE_CB call if (callback) { - if ((ret = callback(user_data, hdr, frame_size, free_format_bytes, buf_size, hdr - orig_buf, &frame_info))) + ret = callback(user_data, hdr, frame_size, free_format_bytes, buf_size, hdr - orig_buf, &frame_info); + if (ret != 0) return ret; } buf += frame_size; @@ -562,7 +563,7 @@ int mp3dec_iterate_cb(mp3dec_io_t *io, uint8_t *buf, size_t buf_size, MP3D_ITERA readed += id3v2size; } else { - size_t readed = io->read(buf + MINIMP3_ID3_DETECT_SIZE, buf_size - MINIMP3_ID3_DETECT_SIZE, io->read_data); + readed = io->read(buf + MINIMP3_ID3_DETECT_SIZE, buf_size - MINIMP3_ID3_DETECT_SIZE, io->read_data); if (readed > (buf_size - MINIMP3_ID3_DETECT_SIZE)) return MP3D_E_IOERROR; filled += readed; @@ -590,7 +591,8 @@ int mp3dec_iterate_cb(mp3dec_io_t *io, uint8_t *buf, size_t buf_size, MP3D_ITERA readed += i; if (callback) { - if ((ret = callback(user_data, hdr, frame_size, free_format_bytes, filled - consumed, readed, &frame_info))) + ret = callback(user_data, hdr, frame_size, free_format_bytes, filled - consumed, readed, &frame_info); + if (ret != 0) return ret; } readed += frame_size; @@ -600,7 +602,7 @@ int mp3dec_iterate_cb(mp3dec_io_t *io, uint8_t *buf, size_t buf_size, MP3D_ITERA memmove(buf, buf + consumed, filled - consumed); filled -= consumed; consumed = 0; - size_t readed = io->read(buf + filled, buf_size - filled, io->read_data); + readed = io->read(buf + filled, buf_size - filled, io->read_data); if (readed > (buf_size - filled)) return MP3D_E_IOERROR; if (readed != (buf_size - filled)) diff --git a/thirdparty/minimp3/patches/msvc-arm-fix.patch b/thirdparty/minimp3/patches/msvc-arm-fix.patch new file mode 100644 index 0000000000..bca915aceb --- /dev/null +++ b/thirdparty/minimp3/patches/msvc-arm-fix.patch @@ -0,0 +1,43 @@ +diff --git a/thirdparty/minimp3/minimp3.h b/thirdparty/minimp3/minimp3.h +index 3220ae1a85..2a9975cc86 100644 +--- a/thirdparty/minimp3/minimp3.h ++++ b/thirdparty/minimp3/minimp3.h +@@ -1566,7 +1566,18 @@ static void mp3d_synth(float *xl, mp3d_sample_t *dstl, int nch, float *lins) + + #else /* MINIMP3_FLOAT_OUTPUT */ + ++// -- GODOT start -- ++#if defined(_MSC_VER) && (defined(_M_ARM64) || defined(_M_ARM64EC) || defined(_M_ARM)) ++ static f4 g_scale; ++ g_scale = vsetq_lane_f32(1.0f/32768.0f, g_scale, 0); ++ g_scale = vsetq_lane_f32(1.0f/32768.0f, g_scale, 1); ++ g_scale = vsetq_lane_f32(1.0f/32768.0f, g_scale, 2); ++ g_scale = vsetq_lane_f32(1.0f/32768.0f, g_scale, 3); ++#else + static const f4 g_scale = { 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f }; ++#endif ++// -- GODOT end -- ++ + a = VMUL(a, g_scale); + b = VMUL(b, g_scale); + #if HAVE_SSE +@@ -1813,7 +1824,19 @@ void mp3dec_f32_to_s16(const float *in, int16_t *out, int num_samples) + int aligned_count = num_samples & ~7; + for(; i < aligned_count; i += 8) + { ++ ++// -- GODOT start -- ++#if defined(_MSC_VER) && (defined(_M_ARM64) || defined(_M_ARM64EC) || defined(_M_ARM)) ++ static f4 g_scale; ++ g_scale = vsetq_lane_f32(32768.0f, g_scale, 0); ++ g_scale = vsetq_lane_f32(32768.0f, g_scale, 1); ++ g_scale = vsetq_lane_f32(32768.0f, g_scale, 2); ++ g_scale = vsetq_lane_f32(32768.0f, g_scale, 3); ++#else + static const f4 g_scale = { 32768.0f, 32768.0f, 32768.0f, 32768.0f }; ++#endif ++// -- GODOT end -- ++ + f4 a = VMUL(VLD(&in[i ]), g_scale); + f4 b = VMUL(VLD(&in[i+4]), g_scale); + #if HAVE_SSE diff --git a/thirdparty/minimp3/patches/msvc-warnings-fixes.patch b/thirdparty/minimp3/patches/msvc-warnings-fixes.patch new file mode 100644 index 0000000000..d186d6c6f7 --- /dev/null +++ b/thirdparty/minimp3/patches/msvc-warnings-fixes.patch @@ -0,0 +1,51 @@ +diff --git a/thirdparty/minimp3/minimp3_ex.h b/thirdparty/minimp3/minimp3_ex.h +index 2871705df3..2b207a25a7 100644 +--- a/thirdparty/minimp3/minimp3_ex.h ++++ b/thirdparty/minimp3/minimp3_ex.h +@@ -377,7 +377,7 @@ int mp3dec_load_cb(mp3dec_t *dec, mp3dec_io_t *io, uint8_t *buf, size_t buf_size + samples = hdr_frame_samples(hdr)*frame_info.channels; + if (3 != frame_info.layer) + break; +- int ret = mp3dec_check_vbrtag(hdr, frame_size, &frames, &delay, &padding); ++ ret = mp3dec_check_vbrtag(hdr, frame_size, &frames, &delay, &padding); + if (ret > 0) + { + padding *= frame_info.channels; +@@ -529,7 +529,8 @@ int mp3dec_iterate_buf(const uint8_t *buf, size_t buf_size, MP3D_ITERATE_CB call + + if (callback) + { +- if ((ret = callback(user_data, hdr, frame_size, free_format_bytes, buf_size, hdr - orig_buf, &frame_info))) ++ ret = callback(user_data, hdr, frame_size, free_format_bytes, buf_size, hdr - orig_buf, &frame_info); ++ if (ret != 0) + return ret; + } + buf += frame_size; +@@ -562,7 +563,7 @@ int mp3dec_iterate_cb(mp3dec_io_t *io, uint8_t *buf, size_t buf_size, MP3D_ITERA + readed += id3v2size; + } else + { +- size_t readed = io->read(buf + MINIMP3_ID3_DETECT_SIZE, buf_size - MINIMP3_ID3_DETECT_SIZE, io->read_data); ++ readed = io->read(buf + MINIMP3_ID3_DETECT_SIZE, buf_size - MINIMP3_ID3_DETECT_SIZE, io->read_data); + if (readed > (buf_size - MINIMP3_ID3_DETECT_SIZE)) + return MP3D_E_IOERROR; + filled += readed; +@@ -590,7 +591,8 @@ int mp3dec_iterate_cb(mp3dec_io_t *io, uint8_t *buf, size_t buf_size, MP3D_ITERA + readed += i; + if (callback) + { +- if ((ret = callback(user_data, hdr, frame_size, free_format_bytes, filled - consumed, readed, &frame_info))) ++ ret = callback(user_data, hdr, frame_size, free_format_bytes, filled - consumed, readed, &frame_info); ++ if (ret != 0) + return ret; + } + readed += frame_size; +@@ -600,7 +602,7 @@ int mp3dec_iterate_cb(mp3dec_io_t *io, uint8_t *buf, size_t buf_size, MP3D_ITERA + memmove(buf, buf + consumed, filled - consumed); + filled -= consumed; + consumed = 0; +- size_t readed = io->read(buf + filled, buf_size - filled, io->read_data); ++ readed = io->read(buf + filled, buf_size - filled, io->read_data); + if (readed > (buf_size - filled)) + return MP3D_E_IOERROR; + if (readed != (buf_size - filled)) diff --git a/thirdparty/openxr/include/openxr/openxr.h b/thirdparty/openxr/include/openxr/openxr.h index 6c6a52d27e..6f9b71aa68 100644 --- a/thirdparty/openxr/include/openxr/openxr.h +++ b/thirdparty/openxr/include/openxr/openxr.h @@ -2,7 +2,7 @@ #define OPENXR_H_ 1 /* -** Copyright (c) 2017-2022, The Khronos Group Inc. +** Copyright 2017-2022 The Khronos Group Inc. ** ** SPDX-License-Identifier: Apache-2.0 OR MIT */ @@ -25,7 +25,7 @@ extern "C" { ((((major) & 0xffffULL) << 48) | (((minor) & 0xffffULL) << 32) | ((patch) & 0xffffffffULL)) // OpenXR current version number. -#define XR_CURRENT_API_VERSION XR_MAKE_VERSION(1, 0, 23) +#define XR_CURRENT_API_VERSION XR_MAKE_VERSION(1, 0, 25) #define XR_VERSION_MAJOR(version) (uint16_t)(((uint64_t)(version) >> 48)& 0xffffULL) #define XR_VERSION_MINOR(version) (uint16_t)(((uint64_t)(version) >> 32) & 0xffffULL) @@ -401,6 +401,7 @@ typedef enum XrStructureType { XR_TYPE_COMPOSITION_LAYER_PASSTHROUGH_FB = 1000118003, XR_TYPE_GEOMETRY_INSTANCE_CREATE_INFO_FB = 1000118004, XR_TYPE_GEOMETRY_INSTANCE_TRANSFORM_FB = 1000118005, + XR_TYPE_SYSTEM_PASSTHROUGH_PROPERTIES2_FB = 1000118006, XR_TYPE_PASSTHROUGH_STYLE_FB = 1000118020, XR_TYPE_PASSTHROUGH_COLOR_MAP_MONO_TO_RGBA_FB = 1000118021, XR_TYPE_PASSTHROUGH_COLOR_MAP_MONO_TO_MONO_FB = 1000118022, @@ -439,6 +440,9 @@ typedef enum XrStructureType { XR_TYPE_SWAPCHAIN_STATE_SAMPLER_VULKAN_FB = 1000163000, XR_TYPE_COMPOSITION_LAYER_SPACE_WARP_INFO_FB = 1000171000, XR_TYPE_SYSTEM_SPACE_WARP_PROPERTIES_FB = 1000171001, + XR_TYPE_SEMANTIC_LABELS_FB = 1000175000, + XR_TYPE_ROOM_LAYOUT_FB = 1000175001, + XR_TYPE_BOUNDARY_2D_FB = 1000175002, XR_TYPE_DIGITAL_LENS_CONTROL_ALMALENCE = 1000196000, XR_TYPE_SPACE_CONTAINER_FB = 1000199000, XR_TYPE_PASSTHROUGH_KEYBOARD_HANDS_INTENSITY_FB = 1000203002, @@ -2603,7 +2607,7 @@ typedef struct XrHandJointsMotionRangeInfoEXT { XR_DEFINE_HANDLE(XrSceneMSFT) -#define XR_MSFT_scene_understanding_SPEC_VERSION 1 +#define XR_MSFT_scene_understanding_SPEC_VERSION 2 #define XR_MSFT_SCENE_UNDERSTANDING_EXTENSION_NAME "XR_MSFT_scene_understanding" typedef enum XrSceneComputeFeatureMSFT { @@ -2925,7 +2929,7 @@ XRAPI_ATTR XrResult XRAPI_CALL xrGetSceneMeshBuffersMSFT( #define XR_MSFT_scene_understanding_serialization 1 -#define XR_MSFT_scene_understanding_serialization_SPEC_VERSION 1 +#define XR_MSFT_scene_understanding_serialization_SPEC_VERSION 2 #define XR_MSFT_SCENE_UNDERSTANDING_SERIALIZATION_EXTENSION_NAME "XR_MSFT_scene_understanding_serialization" typedef struct XrSerializedSceneFragmentDataGetInfoMSFT { XrStructureType type; @@ -3166,7 +3170,7 @@ XRAPI_ATTR XrResult XRAPI_CALL xrGetFacialExpressionsHTC( #define XR_FB_color_space 1 -#define XR_FB_color_space_SPEC_VERSION 2 +#define XR_FB_color_space_SPEC_VERSION 3 #define XR_FB_COLOR_SPACE_EXTENSION_NAME "XR_FB_color_space" typedef enum XrColorSpaceFB { @@ -3206,7 +3210,7 @@ XRAPI_ATTR XrResult XRAPI_CALL xrSetColorSpaceFB( #define XR_FB_hand_tracking_mesh 1 -#define XR_FB_hand_tracking_mesh_SPEC_VERSION 2 +#define XR_FB_hand_tracking_mesh_SPEC_VERSION 3 #define XR_FB_HAND_TRACKING_MESH_EXTENSION_NAME "XR_FB_hand_tracking_mesh" typedef struct XrVector4sFB { int16_t x; @@ -3317,6 +3321,10 @@ XR_DEFINE_ATOM(XrAsyncRequestIdFB) typedef enum XrSpaceComponentTypeFB { XR_SPACE_COMPONENT_TYPE_LOCATABLE_FB = 0, XR_SPACE_COMPONENT_TYPE_STORABLE_FB = 1, + XR_SPACE_COMPONENT_TYPE_BOUNDED_2D_FB = 3, + XR_SPACE_COMPONENT_TYPE_BOUNDED_3D_FB = 4, + XR_SPACE_COMPONENT_TYPE_SEMANTIC_LABELS_FB = 5, + XR_SPACE_COMPONENT_TYPE_ROOM_LAYOUT_FB = 6, XR_SPACE_COMPONENT_TYPE_SPACE_CONTAINER_FB = 7, XR_SPACE_COMPONENT_TYPE_MAX_ENUM_FB = 0x7FFFFFFF } XrSpaceComponentTypeFB; @@ -3625,7 +3633,7 @@ XRAPI_ATTR XrResult XRAPI_CALL xrTriangleMeshEndVertexBufferUpdateFB( XR_DEFINE_HANDLE(XrPassthroughFB) XR_DEFINE_HANDLE(XrPassthroughLayerFB) XR_DEFINE_HANDLE(XrGeometryInstanceFB) -#define XR_FB_passthrough_SPEC_VERSION 2 +#define XR_FB_passthrough_SPEC_VERSION 3 #define XR_FB_PASSTHROUGH_EXTENSION_NAME "XR_FB_passthrough" #define XR_PASSTHROUGH_COLOR_MAP_MONO_SIZE_FB 256 @@ -3636,10 +3644,18 @@ typedef enum XrPassthroughLayerPurposeFB { XR_PASSTHROUGH_LAYER_PURPOSE_TRACKED_KEYBOARD_MASKED_HANDS_FB = 1000203002, XR_PASSTHROUGH_LAYER_PURPOSE_MAX_ENUM_FB = 0x7FFFFFFF } XrPassthroughLayerPurposeFB; +typedef XrFlags64 XrPassthroughCapabilityFlagsFB; + +// Flag bits for XrPassthroughCapabilityFlagsFB +static const XrPassthroughCapabilityFlagsFB XR_PASSTHROUGH_CAPABILITY_BIT_FB = 0x00000001; +static const XrPassthroughCapabilityFlagsFB XR_PASSTHROUGH_CAPABILITY_COLOR_BIT_FB = 0x00000002; +static const XrPassthroughCapabilityFlagsFB XR_PASSTHROUGH_CAPABILITY_LAYER_DEPTH_BIT_FB = 0x00000004; + typedef XrFlags64 XrPassthroughFlagsFB; // Flag bits for XrPassthroughFlagsFB static const XrPassthroughFlagsFB XR_PASSTHROUGH_IS_RUNNING_AT_CREATION_BIT_FB = 0x00000001; +static const XrPassthroughFlagsFB XR_PASSTHROUGH_LAYER_DEPTH_BIT_FB = 0x00000002; typedef XrFlags64 XrPassthroughStateChangedFlagsFB; @@ -3656,6 +3672,13 @@ typedef struct XrSystemPassthroughPropertiesFB { XrBool32 supportsPassthrough; } XrSystemPassthroughPropertiesFB; +// XrSystemPassthroughProperties2FB extends XrSystemProperties +typedef struct XrSystemPassthroughProperties2FB { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrPassthroughCapabilityFlagsFB capabilities; +} XrSystemPassthroughProperties2FB; + typedef struct XrPassthroughCreateInfoFB { XrStructureType type; const void* XR_MAY_ALIAS next; @@ -3801,7 +3824,7 @@ XRAPI_ATTR XrResult XRAPI_CALL xrGeometryInstanceSetTransformFB( #define XR_NULL_RENDER_MODEL_KEY_FB 0 XR_DEFINE_ATOM(XrRenderModelKeyFB) -#define XR_FB_render_model_SPEC_VERSION 2 +#define XR_FB_render_model_SPEC_VERSION 3 #define XR_FB_RENDER_MODEL_EXTENSION_NAME "XR_FB_render_model" #define XR_MAX_RENDER_MODEL_NAME_SIZE_FB 64 typedef XrFlags64 XrRenderModelFlagsFB; @@ -4007,6 +4030,11 @@ XRAPI_ATTR XrResult XRAPI_CALL xrSetViewOffsetVARJO( #endif /* !XR_NO_PROTOTYPES */ +#define XR_ML_ml2_controller_interaction 1 +#define XR_ML_ml2_controller_interaction_SPEC_VERSION 1 +#define XR_ML_ML2_CONTROLLER_INTERACTION_EXTENSION_NAME "XR_ML_ml2_controller_interaction" + + #define XR_MSFT_spatial_anchor_persistence 1 XR_DEFINE_HANDLE(XrSpatialAnchorStoreConnectionMSFT) #define XR_MAX_SPATIAL_ANCHOR_NAME_SIZE_MSFT 256 @@ -4303,6 +4331,93 @@ typedef struct XrSystemSpaceWarpPropertiesFB { +#define XR_FB_scene 1 +#define XR_FB_scene_SPEC_VERSION 1 +#define XR_FB_SCENE_EXTENSION_NAME "XR_FB_scene" +typedef struct XrExtent3DfFB { + float width; + float height; + float depth; +} XrExtent3DfFB; + +typedef struct XrOffset3DfFB { + float x; + float y; + float z; +} XrOffset3DfFB; + +typedef struct XrRect3DfFB { + XrOffset3DfFB offset; + XrExtent3DfFB extent; +} XrRect3DfFB; + +typedef struct XrSemanticLabelsFB { + XrStructureType type; + const void* XR_MAY_ALIAS next; + uint32_t bufferCapacityInput; + uint32_t bufferCountOutput; + char* buffer; +} XrSemanticLabelsFB; + +typedef struct XrRoomLayoutFB { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrUuidEXT floorUuid; + XrUuidEXT ceilingUuid; + uint32_t wallUuidCapacityInput; + uint32_t wallUuidCountOutput; + XrUuidEXT* wallUuids; +} XrRoomLayoutFB; + +typedef struct XrBoundary2DFB { + XrStructureType type; + const void* XR_MAY_ALIAS next; + uint32_t vertexCapacityInput; + uint32_t vertexCountOutput; + XrVector2f* vertices; +} XrBoundary2DFB; + +typedef XrResult (XRAPI_PTR *PFN_xrGetSpaceBoundingBox2DFB)(XrSession session, XrSpace space, XrRect2Df* boundingBox2DOutput); +typedef XrResult (XRAPI_PTR *PFN_xrGetSpaceBoundingBox3DFB)(XrSession session, XrSpace space, XrRect3DfFB* boundingBox3DOutput); +typedef XrResult (XRAPI_PTR *PFN_xrGetSpaceSemanticLabelsFB)(XrSession session, XrSpace space, XrSemanticLabelsFB* semanticLabelsOutput); +typedef XrResult (XRAPI_PTR *PFN_xrGetSpaceBoundary2DFB)(XrSession session, XrSpace space, XrBoundary2DFB* boundary2DOutput); +typedef XrResult (XRAPI_PTR *PFN_xrGetSpaceRoomLayoutFB)(XrSession session, XrSpace space, XrRoomLayoutFB* roomLayoutOutput); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrGetSpaceBoundingBox2DFB( + XrSession session, + XrSpace space, + XrRect2Df* boundingBox2DOutput); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetSpaceBoundingBox3DFB( + XrSession session, + XrSpace space, + XrRect3DfFB* boundingBox3DOutput); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetSpaceSemanticLabelsFB( + XrSession session, + XrSpace space, + XrSemanticLabelsFB* semanticLabelsOutput); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetSpaceBoundary2DFB( + XrSession session, + XrSpace space, + XrBoundary2DFB* boundary2DOutput); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetSpaceRoomLayoutFB( + XrSession session, + XrSpace space, + XrRoomLayoutFB* roomLayoutOutput); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ + + +#define XR_EXT_palm_pose 1 +#define XR_EXT_palm_pose_SPEC_VERSION 2 +#define XR_EXT_PALM_POSE_EXTENSION_NAME "XR_EXT_palm_pose" + + #define XR_ALMALENCE_digital_lens_control 1 #define XR_ALMALENCE_digital_lens_control_SPEC_VERSION 1 #define XR_ALMALENCE_DIGITAL_LENS_CONTROL_EXTENSION_NAME "XR_ALMALENCE_digital_lens_control" @@ -4329,13 +4444,13 @@ XRAPI_ATTR XrResult XRAPI_CALL xrSetDigitalLensControlALMALENCE( #define XR_FB_spatial_entity_container 1 -#define XR_FB_spatial_entity_container_SPEC_VERSION 1 +#define XR_FB_spatial_entity_container_SPEC_VERSION 2 #define XR_FB_SPATIAL_ENTITY_CONTAINER_EXTENSION_NAME "XR_FB_spatial_entity_container" typedef struct XrSpaceContainerFB { XrStructureType type; const void* XR_MAY_ALIAS next; uint32_t uuidCapacityInput; - uint32_t* uuidCountOutput; + uint32_t uuidCountOutput; XrUuidEXT* uuids; } XrSpaceContainerFB; diff --git a/thirdparty/openxr/include/openxr/openxr_platform.h b/thirdparty/openxr/include/openxr/openxr_platform.h index f0fbf6955a..b3aabb23c5 100644 --- a/thirdparty/openxr/include/openxr/openxr_platform.h +++ b/thirdparty/openxr/include/openxr/openxr_platform.h @@ -2,7 +2,7 @@ #define OPENXR_PLATFORM_H_ 1 /* -** Copyright (c) 2017-2022, The Khronos Group Inc. +** Copyright 2017-2022 The Khronos Group Inc. ** ** SPDX-License-Identifier: Apache-2.0 OR MIT */ diff --git a/thirdparty/openxr/include/openxr/openxr_reflection.h b/thirdparty/openxr/include/openxr/openxr_reflection.h index 163b54e4e4..ac6f452377 100644 --- a/thirdparty/openxr/include/openxr/openxr_reflection.h +++ b/thirdparty/openxr/include/openxr/openxr_reflection.h @@ -302,6 +302,7 @@ XR_ENUM_STR(XrResult); _(XR_TYPE_COMPOSITION_LAYER_PASSTHROUGH_FB, 1000118003) \ _(XR_TYPE_GEOMETRY_INSTANCE_CREATE_INFO_FB, 1000118004) \ _(XR_TYPE_GEOMETRY_INSTANCE_TRANSFORM_FB, 1000118005) \ + _(XR_TYPE_SYSTEM_PASSTHROUGH_PROPERTIES2_FB, 1000118006) \ _(XR_TYPE_PASSTHROUGH_STYLE_FB, 1000118020) \ _(XR_TYPE_PASSTHROUGH_COLOR_MAP_MONO_TO_RGBA_FB, 1000118021) \ _(XR_TYPE_PASSTHROUGH_COLOR_MAP_MONO_TO_MONO_FB, 1000118022) \ @@ -340,6 +341,9 @@ XR_ENUM_STR(XrResult); _(XR_TYPE_SWAPCHAIN_STATE_SAMPLER_VULKAN_FB, 1000163000) \ _(XR_TYPE_COMPOSITION_LAYER_SPACE_WARP_INFO_FB, 1000171000) \ _(XR_TYPE_SYSTEM_SPACE_WARP_PROPERTIES_FB, 1000171001) \ + _(XR_TYPE_SEMANTIC_LABELS_FB, 1000175000) \ + _(XR_TYPE_ROOM_LAYOUT_FB, 1000175001) \ + _(XR_TYPE_BOUNDARY_2D_FB, 1000175002) \ _(XR_TYPE_DIGITAL_LENS_CONTROL_ALMALENCE, 1000196000) \ _(XR_TYPE_SPACE_CONTAINER_FB, 1000199000) \ _(XR_TYPE_PASSTHROUGH_KEYBOARD_HANDS_INTENSITY_FB, 1000203002) \ @@ -660,6 +664,10 @@ XR_ENUM_STR(XrResult); #define XR_LIST_ENUM_XrSpaceComponentTypeFB(_) \ _(XR_SPACE_COMPONENT_TYPE_LOCATABLE_FB, 0) \ _(XR_SPACE_COMPONENT_TYPE_STORABLE_FB, 1) \ + _(XR_SPACE_COMPONENT_TYPE_BOUNDED_2D_FB, 3) \ + _(XR_SPACE_COMPONENT_TYPE_BOUNDED_3D_FB, 4) \ + _(XR_SPACE_COMPONENT_TYPE_SEMANTIC_LABELS_FB, 5) \ + _(XR_SPACE_COMPONENT_TYPE_ROOM_LAYOUT_FB, 6) \ _(XR_SPACE_COMPONENT_TYPE_SPACE_CONTAINER_FB, 7) \ _(XR_SPACE_COMPONENT_TYPE_MAX_ENUM_FB, 0x7FFFFFFF) @@ -847,8 +855,14 @@ XR_ENUM_STR(XrResult); #define XR_LIST_BITS_XrTriangleMeshFlagsFB(_) \ _(XR_TRIANGLE_MESH_MUTABLE_BIT_FB, 0x00000001) \ +#define XR_LIST_BITS_XrPassthroughCapabilityFlagsFB(_) \ + _(XR_PASSTHROUGH_CAPABILITY_BIT_FB, 0x00000001) \ + _(XR_PASSTHROUGH_CAPABILITY_COLOR_BIT_FB, 0x00000002) \ + _(XR_PASSTHROUGH_CAPABILITY_LAYER_DEPTH_BIT_FB, 0x00000004) \ + #define XR_LIST_BITS_XrPassthroughFlagsFB(_) \ _(XR_PASSTHROUGH_IS_RUNNING_AT_CREATION_BIT_FB, 0x00000001) \ + _(XR_PASSTHROUGH_LAYER_DEPTH_BIT_FB, 0x00000002) \ #define XR_LIST_BITS_XrPassthroughStateChangedFlagsFB(_) \ _(XR_PASSTHROUGH_STATE_CHANGED_REINIT_REQUIRED_BIT_FB, 0x00000001) \ @@ -2288,6 +2302,11 @@ XR_ENUM_STR(XrResult); _(next) \ _(supportsPassthrough) \ +#define XR_LIST_STRUCT_XrSystemPassthroughProperties2FB(_) \ + _(type) \ + _(next) \ + _(capabilities) \ + #define XR_LIST_STRUCT_XrPassthroughCreateInfoFB(_) \ _(type) \ _(next) \ @@ -2589,6 +2608,43 @@ XR_ENUM_STR(XrResult); _(recommendedMotionVectorImageRectWidth) \ _(recommendedMotionVectorImageRectHeight) \ +#define XR_LIST_STRUCT_XrExtent3DfFB(_) \ + _(width) \ + _(height) \ + _(depth) \ + +#define XR_LIST_STRUCT_XrOffset3DfFB(_) \ + _(x) \ + _(y) \ + _(z) \ + +#define XR_LIST_STRUCT_XrRect3DfFB(_) \ + _(offset) \ + _(extent) \ + +#define XR_LIST_STRUCT_XrSemanticLabelsFB(_) \ + _(type) \ + _(next) \ + _(bufferCapacityInput) \ + _(bufferCountOutput) \ + _(buffer) \ + +#define XR_LIST_STRUCT_XrRoomLayoutFB(_) \ + _(type) \ + _(next) \ + _(floorUuid) \ + _(ceilingUuid) \ + _(wallUuidCapacityInput) \ + _(wallUuidCountOutput) \ + _(wallUuids) \ + +#define XR_LIST_STRUCT_XrBoundary2DFB(_) \ + _(type) \ + _(next) \ + _(vertexCapacityInput) \ + _(vertexCountOutput) \ + _(vertices) \ + #define XR_LIST_STRUCT_XrDigitalLensControlALMALENCE(_) \ _(type) \ _(next) \ @@ -2785,6 +2841,7 @@ XR_ENUM_STR(XrResult); _(XrKeyboardTrackingQueryFB, XR_TYPE_KEYBOARD_TRACKING_QUERY_FB) \ _(XrTriangleMeshCreateInfoFB, XR_TYPE_TRIANGLE_MESH_CREATE_INFO_FB) \ _(XrSystemPassthroughPropertiesFB, XR_TYPE_SYSTEM_PASSTHROUGH_PROPERTIES_FB) \ + _(XrSystemPassthroughProperties2FB, XR_TYPE_SYSTEM_PASSTHROUGH_PROPERTIES2_FB) \ _(XrPassthroughCreateInfoFB, XR_TYPE_PASSTHROUGH_CREATE_INFO_FB) \ _(XrPassthroughLayerCreateInfoFB, XR_TYPE_PASSTHROUGH_LAYER_CREATE_INFO_FB) \ _(XrCompositionLayerPassthroughFB, XR_TYPE_COMPOSITION_LAYER_PASSTHROUGH_FB) \ @@ -2823,6 +2880,9 @@ XR_ENUM_STR(XrResult); _(XrEventDataSpaceEraseCompleteFB, XR_TYPE_EVENT_DATA_SPACE_ERASE_COMPLETE_FB) \ _(XrCompositionLayerSpaceWarpInfoFB, XR_TYPE_COMPOSITION_LAYER_SPACE_WARP_INFO_FB) \ _(XrSystemSpaceWarpPropertiesFB, XR_TYPE_SYSTEM_SPACE_WARP_PROPERTIES_FB) \ + _(XrSemanticLabelsFB, XR_TYPE_SEMANTIC_LABELS_FB) \ + _(XrRoomLayoutFB, XR_TYPE_ROOM_LAYOUT_FB) \ + _(XrBoundary2DFB, XR_TYPE_BOUNDARY_2D_FB) \ _(XrDigitalLensControlALMALENCE, XR_TYPE_DIGITAL_LENS_CONTROL_ALMALENCE) \ _(XrSpaceContainerFB, XR_TYPE_SPACE_CONTAINER_FB) \ _(XrPassthroughKeyboardHandsIntensityFB, XR_TYPE_PASSTHROUGH_KEYBOARD_HANDS_INTENSITY_FB) \ @@ -3071,6 +3131,7 @@ XR_ENUM_STR(XrResult); _(XR_VARJO_environment_depth_estimation, 124) \ _(XR_VARJO_marker_tracking, 125) \ _(XR_VARJO_view_offset, 126) \ + _(XR_ML_ml2_controller_interaction, 135) \ _(XR_MSFT_spatial_anchor_persistence, 143) \ _(XR_ULTRALEAP_hand_tracking_forearm, 150) \ _(XR_FB_spatial_entity_query, 157) \ @@ -3082,6 +3143,8 @@ XR_ENUM_STR(XrResult); _(XR_FB_swapchain_update_state_vulkan, 164) \ _(XR_KHR_swapchain_usage_input_attachment_bit, 166) \ _(XR_FB_space_warp, 172) \ + _(XR_FB_scene, 176) \ + _(XR_EXT_palm_pose, 177) \ _(XR_ALMALENCE_digital_lens_control, 197) \ _(XR_FB_spatial_entity_container, 200) \ _(XR_FB_passthrough_keyboard_hands, 204) \ diff --git a/thirdparty/openxr/src/common/unique_asset.h b/thirdparty/openxr/src/common/unique_asset.h new file mode 100644 index 0000000000..4929039a03 --- /dev/null +++ b/thirdparty/openxr/src/common/unique_asset.h @@ -0,0 +1,33 @@ +// Copyright (c) 2017-2022, The Khronos Group Inc. +// +// SPDX-License-Identifier: Apache-2.0 OR MIT +#pragma once + +#ifdef XR_USE_PLATFORM_ANDROID + +#include <memory> +#include <android/asset_manager.h> + +namespace deleters { +struct AAssetDeleter { + void operator()(AAsset* asset) const noexcept { + if (asset != nullptr) { + AAsset_close(asset); + } + } +}; + +struct AAssetDirDeleter { + void operator()(AAssetDir* dir) const noexcept { + if (dir != nullptr) { + AAssetDir_close(dir); + } + } +}; + +} // namespace deleters + +using UniqueAsset = std::unique_ptr<AAsset, deleters::AAssetDeleter>; +using UniqueAssetDir = std::unique_ptr<AAssetDir, deleters::AAssetDirDeleter>; + +#endif diff --git a/thirdparty/openxr/src/loader/android_utilities.cpp b/thirdparty/openxr/src/loader/android_utilities.cpp index 807a775820..59d9a99b74 100644 --- a/thirdparty/openxr/src/loader/android_utilities.cpp +++ b/thirdparty/openxr/src/loader/android_utilities.cpp @@ -299,7 +299,7 @@ int getActiveRuntimeVirtualManifest(wrap::android::content::Context const &conte auto hasFunctions = cursor.getInt(cursor.getColumnIndex(active_runtime::Columns::HAS_FUNCTIONS)) == 1; __android_log_print(ANDROID_LOG_INFO, TAG, "Got runtime: package: %s, so filename: %s, native lib dir: %s, has functions: %s", - packageName.c_str(), libDir.c_str(), filename.c_str(), (hasFunctions ? "yes" : "no")); + packageName.c_str(), filename.c_str(), libDir.c_str(), (hasFunctions ? "yes" : "no")); auto lib_path = libDir + "/" + filename; cursor.close(); diff --git a/thirdparty/openxr/src/loader/api_layer_interface.cpp b/thirdparty/openxr/src/loader/api_layer_interface.cpp index c3fd5bb7f1..b946e09402 100644 --- a/thirdparty/openxr/src/loader/api_layer_interface.cpp +++ b/thirdparty/openxr/src/loader/api_layer_interface.cpp @@ -53,7 +53,6 @@ XrResult ApiLayerInterface::GetApiLayerProperties(const std::string& openxr_comm uint32_t* outgoing_count, XrApiLayerProperties* api_layer_properties) { std::vector<std::unique_ptr<ApiLayerManifestFile>> manifest_files; uint32_t manifest_count = 0; - // Validate props struct before proceeding if (0 < incoming_count && nullptr != api_layer_properties) { for (uint32_t i = 0; i < incoming_count; i++) { diff --git a/thirdparty/openxr/src/loader/loader_core.cpp b/thirdparty/openxr/src/loader/loader_core.cpp index 375f1c93ba..a8bbfb4de2 100644 --- a/thirdparty/openxr/src/loader/loader_core.cpp +++ b/thirdparty/openxr/src/loader/loader_core.cpp @@ -711,9 +711,6 @@ XRLOADER_ABI_CATCH_FALLBACK XRAPI_ATTR XrResult XRAPI_CALL LoaderXrGetInstanceProcAddr(XrInstance instance, const char *name, PFN_xrVoidFunction *function) XRLOADER_ABI_TRY { - // Initialize the function to nullptr in case it does not get caught in a known case - *function = nullptr; - if (nullptr == function) { LoaderLogger::LogValidationErrorMessage("VUID-xrGetInstanceProcAddr-function-parameter", "xrGetInstanceProcAddr", "Invalid Function pointer"); @@ -726,6 +723,9 @@ XRAPI_ATTR XrResult XRAPI_CALL LoaderXrGetInstanceProcAddr(XrInstance instance, return XR_ERROR_VALIDATION_FAILURE; } + // Initialize the function to nullptr in case it does not get caught in a known case + *function = nullptr; + LoaderInstance *loader_instance = nullptr; if (instance == XR_NULL_HANDLE) { // Null instance is allowed for a few specific API entry points, otherwise return error diff --git a/thirdparty/openxr/src/loader/manifest_file.cpp b/thirdparty/openxr/src/loader/manifest_file.cpp index e4eab3949e..df99d51f8f 100644 --- a/thirdparty/openxr/src/loader/manifest_file.cpp +++ b/thirdparty/openxr/src/loader/manifest_file.cpp @@ -21,6 +21,7 @@ #include "loader_platform.hpp" #include "platform_utils.hpp" #include "loader_logger.hpp" +#include "unique_asset.h" #include <json/json.h> #include <openxr/openxr.h> @@ -50,6 +51,10 @@ #define SYSCONFDIR "/etc" #endif // !SYSCONFDIR +#ifdef XR_USE_PLATFORM_ANDROID +#include <android/asset_manager.h> +#endif + #ifdef XRLOADER_DISABLE_EXCEPTION_HANDLING #if JSON_USE_EXCEPTIONS #error \ @@ -656,17 +661,68 @@ ApiLayerManifestFile::ApiLayerManifestFile(ManifestFileType type, const std::str _description(description), _implementation_version(implementation_version) {} -void ApiLayerManifestFile::CreateIfValid(ManifestFileType type, const std::string &filename, - std::vector<std::unique_ptr<ApiLayerManifestFile>> &manifest_files) { - std::ifstream json_stream(filename, std::ifstream::in); +#ifdef XR_USE_PLATFORM_ANDROID +void ApiLayerManifestFile::AddManifestFilesAndroid(ManifestFileType type, + std::vector<std::unique_ptr<ApiLayerManifestFile>> &manifest_files) { + AAssetManager *assetManager = (AAssetManager *)Android_Get_Asset_Manager(); + std::vector<std::string> filenames; + { + std::string search_path = ""; + switch (type) { + case MANIFEST_TYPE_IMPLICIT_API_LAYER: + search_path = "openxr/1/api_layers/implicit.d/"; + break; + case MANIFEST_TYPE_EXPLICIT_API_LAYER: + search_path = "openxr/1/api_layers/explicit.d/"; + break; + default: + return; + } - std::ostringstream error_ss("ApiLayerManifestFile::CreateIfValid "); - if (!json_stream.is_open()) { - error_ss << "failed to open " << filename << ". Does it exist?"; - LoaderLogger::LogErrorMessage("", error_ss.str()); - return; + UniqueAssetDir dir{AAssetManager_openDir(assetManager, search_path.c_str())}; + if (!dir) { + return; + } + const std::string json = ".json"; + const char *fn = nullptr; + while ((fn = AAssetDir_getNextFileName(dir.get())) != nullptr) { + const std::string filename = search_path + fn; + if (filename.size() < json.size()) { + continue; + } + if (filename.compare(filename.size() - json.size(), json.size(), json) == 0) { + filenames.push_back(filename); + } + } } + for (const auto &filename : filenames) { + UniqueAsset asset{AAssetManager_open(assetManager, filename.c_str(), AASSET_MODE_BUFFER)}; + if (!asset) { + LoaderLogger::LogWarningMessage( + "", "ApiLayerManifestFile::AddManifestFilesAndroid unable to open asset " + filename + ", skipping"); + + continue; + } + size_t length = AAsset_getLength(asset.get()); + const char *buf = reinterpret_cast<const char *>(AAsset_getBuffer(asset.get())); + if (!buf) { + LoaderLogger::LogWarningMessage( + "", "ApiLayerManifestFile::AddManifestFilesAndroid unable to access asset" + filename + ", skipping"); + continue; + } + std::istringstream json_stream(std::string{buf, length}); + + CreateIfValid(ManifestFileType::MANIFEST_TYPE_EXPLICIT_API_LAYER, filename, json_stream, + &ApiLayerManifestFile::LocateLibraryInAssets, manifest_files); + } +} +#endif // XR_USE_PLATFORM_ANDROID + +void ApiLayerManifestFile::CreateIfValid(ManifestFileType type, const std::string &filename, std::istream &json_stream, + LibraryLocator locate_library, + std::vector<std::unique_ptr<ApiLayerManifestFile>> &manifest_files) { + std::ostringstream error_ss("ApiLayerManifestFile::CreateIfValid "); Json::CharReaderBuilder builder; std::string errors; Json::Value root_node = Json::nullValue; @@ -757,9 +813,7 @@ void ApiLayerManifestFile::CreateIfValid(ManifestFileType type, const std::strin } else { // Otherwise, treat the library path as a relative path based on the JSON file. std::string combined_path; - std::string file_parent; - if (!FileSysUtilsGetParentPath(filename, file_parent) || - !FileSysUtilsCombinePaths(file_parent, library_path, combined_path) || !FileSysUtilsPathExists(combined_path)) { + if (!locate_library(filename, library_path, combined_path)) { error_ss << filename << " library " << combined_path << " does not appear to exist"; LoaderLogger::LogErrorMessage("", error_ss.str()); return; @@ -781,6 +835,46 @@ void ApiLayerManifestFile::CreateIfValid(ManifestFileType type, const std::strin manifest_files.back()->ParseCommon(layer_root_node); } +void ApiLayerManifestFile::CreateIfValid(ManifestFileType type, const std::string &filename, + std::vector<std::unique_ptr<ApiLayerManifestFile>> &manifest_files) { + std::ifstream json_stream(filename, std::ifstream::in); + if (!json_stream.is_open()) { + std::ostringstream error_ss("ApiLayerManifestFile::CreateIfValid "); + error_ss << "failed to open " << filename << ". Does it exist?"; + LoaderLogger::LogErrorMessage("", error_ss.str()); + return; + } + CreateIfValid(type, filename, json_stream, &ApiLayerManifestFile::LocateLibraryRelativeToJson, manifest_files); +} + +bool ApiLayerManifestFile::LocateLibraryRelativeToJson( + const std::string &json_filename, const std::string &library_path, + std::string &out_combined_path) { // Otherwise, treat the library path as a relative path based on the JSON file. + std::string combined_path; + std::string file_parent; + if (!FileSysUtilsGetParentPath(json_filename, file_parent) || + !FileSysUtilsCombinePaths(file_parent, library_path, combined_path) || !FileSysUtilsPathExists(combined_path)) { + out_combined_path = combined_path; + return false; + } + out_combined_path = combined_path; + return true; +} + +#ifdef XR_USE_PLATFORM_ANDROID +bool ApiLayerManifestFile::LocateLibraryInAssets(const std::string & /* json_filename */, const std::string &library_path, + std::string &out_combined_path) { + std::string combined_path; + std::string file_parent = GetAndroidNativeLibraryDir(); + if (!FileSysUtilsCombinePaths(file_parent, library_path, combined_path) || !FileSysUtilsPathExists(combined_path)) { + out_combined_path = combined_path; + return false; + } + out_combined_path = combined_path; + return true; +} +#endif + void ApiLayerManifestFile::PopulateApiLayerProperties(XrApiLayerProperties &props) const { props.layerVersion = _implementation_version; props.specVersion = XR_MAKE_VERSION(_api_version.major, _api_version.minor, _api_version.patch); @@ -841,5 +935,9 @@ XrResult ApiLayerManifestFile::FindManifestFiles(ManifestFileType type, ApiLayerManifestFile::CreateIfValid(type, cur_file, manifest_files); } +#ifdef XR_USE_PLATFORM_ANDROID + ApiLayerManifestFile::AddManifestFilesAndroid(type, manifest_files); +#endif // XR_USE_PLATFORM_ANDROID + return XR_SUCCESS; } diff --git a/thirdparty/openxr/src/loader/manifest_file.hpp b/thirdparty/openxr/src/loader/manifest_file.hpp index 0d04886d84..de0aab65c2 100644 --- a/thirdparty/openxr/src/loader/manifest_file.hpp +++ b/thirdparty/openxr/src/loader/manifest_file.hpp @@ -14,6 +14,7 @@ #include <memory> #include <string> #include <vector> +#include <iosfwd> #include <unordered_map> namespace Json { @@ -79,6 +80,8 @@ class RuntimeManifestFile : public ManifestFile { std::vector<std::unique_ptr<RuntimeManifestFile>> &manifest_files); }; +using LibraryLocator = bool (*)(const std::string &json_filename, const std::string &library_path, std::string &out_combined_path); + // ApiLayerManifestFile class - // Responsible for finding and parsing API Layer-specific manifest files. class ApiLayerManifestFile : public ManifestFile { @@ -93,8 +96,19 @@ class ApiLayerManifestFile : public ManifestFile { ApiLayerManifestFile(ManifestFileType type, const std::string &filename, const std::string &layer_name, const std::string &description, const JsonVersion &api_version, const uint32_t &implementation_version, const std::string &library_path); + + static void CreateIfValid(ManifestFileType type, const std::string &filename, std::istream &json_stream, + LibraryLocator locate_library, std::vector<std::unique_ptr<ApiLayerManifestFile>> &manifest_files); static void CreateIfValid(ManifestFileType type, const std::string &filename, std::vector<std::unique_ptr<ApiLayerManifestFile>> &manifest_files); + /// @return false if we could not find the library. + static bool LocateLibraryRelativeToJson(const std::string &json_filename, const std::string &library_path, + std::string &out_combined_path); +#ifdef XR_USE_PLATFORM_ANDROID + static bool LocateLibraryInAssets(const std::string &json_filename, const std::string &library_path, + std::string &out_combined_path); + static void AddManifestFilesAndroid(ManifestFileType type, std::vector<std::unique_ptr<ApiLayerManifestFile>> &manifest_files); +#endif JsonVersion _api_version; std::string _layer_name; diff --git a/thirdparty/openxr/src/loader/runtime_interface.cpp b/thirdparty/openxr/src/loader/runtime_interface.cpp index 1a35ba013a..0f081ff9b2 100644 --- a/thirdparty/openxr/src/loader/runtime_interface.cpp +++ b/thirdparty/openxr/src/loader/runtime_interface.cpp @@ -27,6 +27,7 @@ #ifdef XR_USE_PLATFORM_ANDROID #include "android_utilities.h" +#include <android/asset_manager_jni.h> #include <json/value.h> #endif // XR_USE_PLATFORM_ANDROID @@ -50,6 +51,14 @@ class LoaderInitData { * Type alias for the platform-specific structure type. */ using StructType = XrLoaderInitInfoAndroidKHR; + /*! + * Native library path. + */ + std::string _native_library_path; + /*! + * Android asset manager. + */ + AAssetManager* _android_asset_manager; #endif /*! @@ -99,6 +108,30 @@ XrResult LoaderInitData::initialize(const XrLoaderInitInfoBaseHeaderKHR* info) { _data = *cast_info; jni::init((jni::JavaVM*)_data.applicationVM); _data.next = nullptr; + JNIEnv* Env; + ((jni::JavaVM*)(cast_info->applicationVM))->AttachCurrentThread(&Env, nullptr); + const jclass contextClass = Env->GetObjectClass((jobject)_data.applicationContext); + + const jmethodID getAssetsMethod = Env->GetMethodID(contextClass, "getAssets", "()Landroid/content/res/AssetManager;"); + const jobject AssetManagerObject = Env->CallObjectMethod((jobject)_data.applicationContext, getAssetsMethod); + _android_asset_manager = AAssetManager_fromJava(Env, AssetManagerObject); + + const jmethodID getApplicationContextMethod = + Env->GetMethodID(contextClass, "getApplicationContext", "()Landroid/content/Context;"); + const jobject contextObject = Env->CallObjectMethod((jobject)_data.applicationContext, getApplicationContextMethod); + const jmethodID getApplicationInfoMethod = + Env->GetMethodID(contextClass, "getApplicationInfo", "()Landroid/content/pm/ApplicationInfo;"); + const jobject applicationInfoObject = Env->CallObjectMethod(contextObject, getApplicationInfoMethod); + const jfieldID nativeLibraryDirField = + Env->GetFieldID(Env->GetObjectClass(applicationInfoObject), "nativeLibraryDir", "Ljava/lang/String;"); + const jobject nativeLibraryDirObject = Env->GetObjectField(applicationInfoObject, nativeLibraryDirField); + const jmethodID getBytesMethod = + Env->GetMethodID(Env->GetObjectClass(nativeLibraryDirObject), "getBytes", "(Ljava/lang/String;)[B"); + const auto bytesObject = + static_cast<jbyteArray>(Env->CallObjectMethod(nativeLibraryDirObject, getBytesMethod, Env->NewStringUTF("UTF-8"))); + const size_t length = Env->GetArrayLength(bytesObject); + const jbyte* const bytes = Env->GetByteArrayElements(bytesObject, nullptr); + _native_library_path = std::string(reinterpret_cast<const char*>(bytes), length); _initialized = true; return XR_SUCCESS; } @@ -109,6 +142,10 @@ XrResult InitializeLoader(const XrLoaderInitInfoBaseHeaderKHR* loaderInitInfo) { return LoaderInitData::instance().initialize(loaderInitInfo); } +std::string GetAndroidNativeLibraryDir() { return LoaderInitData::instance()._native_library_path; } + +void* Android_Get_Asset_Manager() { return LoaderInitData::instance()._android_asset_manager; } + #endif // XR_KHR_LOADER_INIT_SUPPORT #ifdef XR_USE_PLATFORM_ANDROID diff --git a/thirdparty/openxr/src/loader/runtime_interface.hpp b/thirdparty/openxr/src/loader/runtime_interface.hpp index 5f49b28abe..fa53ee03f2 100644 --- a/thirdparty/openxr/src/loader/runtime_interface.hpp +++ b/thirdparty/openxr/src/loader/runtime_interface.hpp @@ -31,6 +31,8 @@ class Value; //! Initialize loader, where required. XrResult InitializeLoader(const XrLoaderInitInfoBaseHeaderKHR* loaderInitInfo); XrResult GetPlatformRuntimeVirtualManifest(Json::Value& out_manifest); +std::string GetAndroidNativeLibraryDir(); +void* Android_Get_Asset_Manager(); #endif class RuntimeManifestFile; diff --git a/version.py b/version.py index f9aa1dd0f4..cfa1773b85 100644 --- a/version.py +++ b/version.py @@ -3,7 +3,7 @@ name = "Godot Engine" major = 4 minor = 0 patch = 0 -status = "alpha" +status = "beta" module_config = "" year = 2022 website = "https://godotengine.org" |